");
$value = SafeFilter($value);
$value=htmlspecialchars(trim($value), ENT_QUOTES);
$value = addslashes($value);
return trim($value);
}
}
//过滤XSS攻击
function SafeFilter($arr)
{
$ra=Array('/([\x00-\x08])/','/([\x0b-\x0c])/','/([\x0e-\x19])/');
$arr = preg_replace($ra,'',$arr);
return $arr;
}
function array_format(&$item, $key)
{
$item=trim($item);
$item = SafeFilter($item);
$item=htmlspecialchars($item, ENT_QUOTES);
$item = addslashes($item);
}
function unicodeEncode($str){
//split word
preg_match_all('/./u',$str,$matches);
$unicodeStr = "";
foreach($matches[0] as $m){
//拼接
$unicodeStr .= "".base_convert(bin2hex(iconv('UTF-8',"UCS-4",$m)),16,10);
}
return $unicodeStr;
}
function unicodeDecode($unicode_str){
$json = '{"str":"'.$unicode_str.'"}';
$arr = json_decode($json,true);
if(empty($arr)) return '';
return $arr['str'];
}
/**
格式化数组为pathinfo格式
**/
function array_pathInfo($url){
foreach($url as $k=>$v){
if($v!=''){
$url[$k] = $v;
}
}
//$url = http_build_query(array_filter($url));
$url = http_build_query($url);
$url = str_ireplace(array('&','='),'/',$url);
return $url;
}
/**
系统内置URL生成方法
@action string 支持两种格式生成 controllorName/actionName或actionName自动调用当前控制器
**/
function U($action=null,$field=null){
if(APP_URL=='/index.php'){
if(strpos($action,'/')!==FALSE){
//存在'/' 取消首字母大写限制
//$action = ucfirst($action);
$url = get_domain().'/'.$action;
}else if($action!=null){
$url = get_domain().'/'.APP_CONTROLLER.'/'.$action;
}else{
$url = get_domain().'/'.APP_CONTROLLER.'/'.APP_ACTION;
}
}else{
if(strpos($action,'/')!==FALSE){
//存在'/'
$action = ucfirst($action);
$url = get_domain().APP_URL.'/'.$action;
}else if($action!=null){
$url = get_domain().APP_URL.'/'.APP_CONTROLLER.'/'.$action;
}else{
$url = get_domain().APP_URL.'/'.APP_CONTROLLER.'/'.APP_ACTION;
}
}
if($field!=null){
if(is_array($field)){
$url.='/'.array_pathInfo($field);
}else{
$url.='/'.$field;
}
}
return $url.'.html';
}
/**
系统内部错误提示
@info string 文字描述
**/
function Error_msg($msg,$url=null){
//检测是否定义了错误处理--2019/2/24 by 留恋风
$controller = str_replace('/','\\',APP_HOME.'\\'.HOME_CONTROLLER.'\\ErrorController');
if (!class_exists($controller) || !method_exists($controller,'index')) {
$traces = debug_backtrace();
$bufferabove = ob_get_clean();
require_once(CORE_PATH.'/common/Error.php');
exit;
}else{
(new $controller('ErrorController', 'index'))->index($msg);
exit;
}
}
/**
自定义成功后跳转方法
@info string 提示信息
@url string 链接 default 空
@delay int 时间 default 2s
**/
function Success($info, $url=null){
if($url==null){
$url = get_domain().'/'.APP_CONTROLLER.'/'.APP_ACTION;
}
echo ' ';
exit;
}
/**
自定义失败后跳转方法
@info string 提示信息
**/
function Error($info, $url=null){
if($url==null){
echo ' ';
echo "";
exit;
}else{
echo ' ';
exit;
}
}
/**
返回json格式数组
**/
function JsonReturn($data){
echo json_encode($data,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
exit;
}
//获取IP
/*
function GetIP(){
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
$ip=htmlspecialchars($ip, ENT_QUOTES);
if(!get_magic_quotes_gpc())$ip = addslashes($ip);
return($ip);
}
*/
function GetIP(){
static $ip = '';
$ip = $_SERVER['REMOTE_ADDR'];
if(isset($_SERVER['HTTP_CDN_SRC_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CDN_SRC_IP'])) {
$ip = $_SERVER['HTTP_CDN_SRC_IP'];
} elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
foreach ($matches[0] AS $xip) {
if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
$ip = $xip;
break;
}
}
}
return $ip;
}
//获取域名
function get_domain(){
if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
{
$protocol = "https://";
}
elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
{
$protocol = "https://";
}
elseif ( ! empty($_SERVER['HTTP_FROM_HTTPS']) && strtolower($_SERVER['HTTP_FROM_HTTPS']) !== 'off')
{
$protocol = "https://";
}
elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')
{
$protocol = "https://";
}else if(!empty($_SERVER['HTTP_X_CLIENT_SCHEME']) && $_SERVER['HTTP_X_CLIENT_SCHEME']=='https'){
$protocol = "https://";
}else{
$protocol = "http://";
}
if(isset($_SERVER['SERVER_PORT'])) {
$port = ':' . $_SERVER['SERVER_PORT'];
if((':80' == $port && 'http://' == $protocol) || (':443' == $port && 'https://' == $protocol)) {
$port = '';
}
}else{
$port = '';
}
if(isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
$host = $_SERVER['HTTP_X_FORWARDED_HOST'].$port;
}else if (isset($_SERVER['HTTP_HOST'])) {
$host = $_SERVER['HTTP_HOST'];
}else if(isset($_SERVER['SERVER_NAME'])) {
$host = $_SERVER['SERVER_NAME'].$port;
}else if(isset($_SERVER['SERVER_ADDR'])) {
$host = $_SERVER['SERVER_ADDR'].$port;
}
return $protocol.$host;
}
//当前页面URL
function current_url(){
return get_domain().$_SERVER["REQUEST_URI"];
}
/**
自定义重定向跳转方法
*@param $url 目标地址
*@param $info 提示信息
*@param $sec 等待时间
*return void
**/
function Redirect($url,$info=null,$sec=3){
if(is_null($info)){
header("Location:$url");
}else{
//header("Refersh:$sec;URL=$url");
echo ' ';
echo $info;
}
die;
}
/**
设置Session过期时间
**/
function start_session($expire = 0) {
if ($expire == 0) {
//$expire = ini_get('session.gc_maxlifetime');
$expire = SessionTime;
} else {
ini_set('session.gc_maxlifetime', $expire);
}
$session_cache_dir = APP_PATH.'cache/tmp';
if(!file_exists($session_cache_dir)){
mkdir($session_cache_dir,0777,true);
}
ini_set('session.save_path',$session_cache_dir);
if (!isset($_COOKIE['PHPSESSID'])) {
session_set_cookie_params($expire);
session_start();
} else {
session_start();
setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() + $expire,'/',null,null,true);
}
}
/**
自定义添加事件日志
@param data 日志内容
@param dataname 日志名称
**/
function register_log($data=null,$dataname=null){
if($dataname==null){
Error_msg('日志名称不能为空!');
}
$st = array('m'=>APP_CONTROLLER,'a'=>APP_ACTION,'t'=>date('Y-m-d H:i:s',time()),'ip'=>GetIP(),'data'=>$data);
if(!is_dir(APP_PATH.'cache/log')){
mkdir(APP_PATH.'cache/log');
}
//读取日志文件
$logurl = APP_PATH.'cache/log/'.$dataname.'.php';
if(file_exists($logurl)){
$log = @fopen($logurl,"r");
$log_txt=@fread($log,filesize($logurl));
@fclose($log);
}else{
$log_txt = '';
}
if($log_txt!=''){
$log_txt = substr($log_txt,14);
$log_arr = json_decode($log_txt,true);
}
$log_arr[]=$st;
$log_txt = json_encode($log_arr,JSON_UNESCAPED_UNICODE);
$log_txt = ''.$log_txt;
$log_x=@fopen($logurl,"w");
@fwrite($log_x,$log_txt);
@fclose($log_x);
}
/**
输出日志事件列表
@param dataname 日志名称 默认空,输出主日志记录
**/
function show_log($dataname=null){
if($dataname!=null){
//主日志记录
$logurl = APP_PATH.'cache/log/'.$dataname.'.php';
if(!file_exists($logurl)){
return false;
}
// $log = @fopen($logurl,"r");
// $logdata=@fread($log,filesize($logurl));
// @fclose($log);
$logdata = file_get_contents($logurl);
$logdata = substr($logdata,14);
$logdata = json_decode($logdata,true);
//dump($logdata);
return $logdata;
}else{
Error_msg('请输入日志名称!');
}
}
/**
记录操作的模块--操作的方法(函数)--事件--操作人
记录报错
**/
function actionLog(){
if(APP_DEBUG === true){
//开启调试模式自动记录事件,可以手动关闭
if(!StopLog){
$st = array('m'=>APP_CONTROLLER,'a'=>APP_ACTION,'t'=>date('Y-m-d H:i:s',time()),'ip'=>GetIP(),'data'=>'');
//读取日志文件
$logurl = APP_PATH.'cache/log/memberAction.php';
if(file_exists($logurl)){
$log = @fopen($logurl,"r");
$log_txt=@fread($log,filesize($logurl));
@fclose($log);
}else{
$log_txt = '';
}
if($log_txt!=''){
$log_txt = substr($log_txt,14);
$log_arr = json_decode($log_txt,true);
}
$log_arr[]=$st;
$log_txt = json_encode($log_arr,JSON_UNESCAPED_UNICODE);
$log_txt = ''.$log_txt;
$log_x=@fopen($logurl,"w");
@fwrite($log_x,$log_txt);
@fclose($log_x);
}
}
}
/**
* 随机生成字符串
* @param int $length
* @return null|string
*/
function getRandChar($length = 8){
$str = null;
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol)-1;
for($i=0;$i<$length;$i++){
$str.=$strPol[rand(0,$max)]; //rand($min,$max)生成介于min和max两个数之间的一个随机整数
}
return $str;
}
/**
字符截断,中文算2个字符
**/
function newstr($string, $length, $dot="...") {
if(strlen($string) <= $length) {return $string;}
$string = str_replace(array('&', '"', '<', '>' ,' '), array('&','"','<','>',''), $string);
$strcut = '';$n = $tn = $noc = $noct = $nc = $tnc =0;
while($n < strlen($string)) {
$t = ord($string[$n]);
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
$tn = 1; $n++; $noct++;
} elseif(194 <= $t && $t <= 223) {
$tn = 2; $n += 2; $noct += 2;
} elseif(224 <= $t && $t <= 239) {
$tn = 3; $n += 3; $noct += 2;
} elseif(240 <= $t && $t <= 247) {
$tn = 4; $n += 4; $noct += 2;
} elseif(248 <= $t && $t <= 251) {
$tn = 5; $n += 5; $noct += 2;
} elseif($t == 252 || $t == 253) {
$tn = 6; $n += 6; $noct += 2;
} else {$n++;}
if($noct >= $length){if($noct==0)$noc=$noct;if($nc==0)$nc=$n;if($tnc==0)$tnc=$tn;}
}
if($noct<=$length){return str_replace(array('&','"','<','>'), array('&', '"', '<', '>'), $string);}
if($noc > $length) {$nc -= $tnc;}
$strcut = substr($string, 0, $nc);
$strcut = str_replace(array('&','"','<','>'), array('&', '"', '<', '>'), $strcut);
return $strcut.$dot;
}
//系统加密解密
function frencode($str)
{
$yuan = 'abA!c1dB#ef2@Cg$h%iD_3jkl^E:m}4n.o{&F*p)5q(G-r[sH]6tuIv7w+Jxy8z9K0';
$jia = 'zAy%0Bx+1C$wDv^Eu2-t3(F{sr&G4q_pH5*on6I)m:l7.Jk]j8K}ih@gf9#ed!cb[a';
$results = '';
if ( strlen($str) == 0) return false;
for($i = 0;$i\n" . htmlspecialchars(print_r($vars, true)) . "\n \n";
echo " {$content}";
return;
}
/**
本地缓存
@param str 设置索引
@param data 存储数据
@param timeout 设置过期时间,单位秒(s) 默认-1,永久存储
**/
function setCache($str,$data,$timeout=-1){
//设置
$rdata['frcache_time'] = $timeout;
$rdata['frcache_data'] = $data;
$str = get_domain().$str;
$s = md5(md5($str.'frphp'.$str));
$cache_file_data = Cache_Path.'/data/'.$s.'.php';
if(!file_exists(Cache_Path.'/data')){
mkdir (Cache_Path.'/data',0777,true);
}
//如果为null,则直接删除缓存
if(!isset($data)){
if(file_exists($cache_file_data)){
unlink($cache_file_data);
}
return true;
}
$res = json_encode($rdata,JSON_UNESCAPED_UNICODE);
$res = ''.$res;
$r = file_put_contents($cache_file_data,$res);
if($r){
return true;
}else{
Error_msg('数据缓存失败,'.Cache_Path.'/data文件夹的读写权限设置为777!');
}
}
function getCache($str=false){
if(!$str){
return false;
}
$str = get_domain().$str;
//获取
$s = md5(md5($str.'frphp'.$str));
$cache_file_data = Cache_Path.'/data/'.$s.'.php';
if(!file_exists($cache_file_data)){
return false;
}
$last_time = filemtime($cache_file_data);//创建文件时间
$res = file_get_contents($cache_file_data);
$res = substr($res,14);
$data = json_decode($res,true);
if(($data['frcache_time']+$last_time)=0){
unlink($cache_file_data);
return false;
}else{
return $data['frcache_data'];
}
}
//引入扩展文件
function extendFile($filepath){
if(strpos($filepath,'.')!==false){
require_once(CORE_PATH.'/extend/'.$filepath);
}else{
if(substr($filepath,1)=='/'){
$Extend = scandir(CORE_PATH.'/extend'.$filepath);
}else{
$Extend = scandir(CORE_PATH.'/extend/'.$filepath);
}
foreach($Extend as $v){
if(strpos($v,'.php')!==false){
require_once CORE_PATH.'/extend/'.$filepath.'/'.$v;
}
}
}
}
//多语言方法定义
function JZLANG($str=null){
if($str){
//读取当前语言包环境
if(isset($_SESSION['lang'])){
$_lang = $_SESSION['lang'];
}else{
$_lang = LANG;
}
$lang_common_file = APP_PATH.APP_HOME.'/lang/common.php';//公共语言包
$lang_current_file = APP_PATH.APP_HOME.'/lang/'.$_lang.'.php';//当前语言包
if(file_exists($lang_common_file)){
$common = include($lang_common_file);
}else{
$common = [];
}
if(file_exists($lang_current_file)){
$current = include($lang_current_file);
}else{
$current = [];
}
$lang = empty($common) ? $current : (empty($current) ? $common : array_merge($common,$current));
if(array_key_exists($str,$lang)){
return $lang[$str];
}else{
return $str;
}
}else{
return '';
}
}
================================================
FILE: frphp/db/DBholder.php
================================================
// +----------------------------------------------------------------------
// | Date:2018/03/15
// +----------------------------------------------------------------------
namespace frphp\db;
use PDO;
use PDOException;
use PDOStatement;
class DBholder{
private static $instance = false;
private $pdo;
private $Statement;
private $arrSql;
private function __construct(){
class_exists('PDO') or exit("not found PDO");
try{
$this->pdo = new PDO("mysql:host=".DB_HOST.";port=".DB_PORT.";dbname=".DB_NAME,DB_USER, DB_PASS);
}catch(PDOException $e){
//数据库无法链接,如果您是第一次使用,请先配置数据库!
exit(' 数据库无法链接,如果您是第一次使用,请先执行安装程序 极致CMS建站程序 jizhicms.com ');
}
ini_set("memory_limit","800M");
$this->pdo->exec("SET NAMES utf8mb4");
}
public static function getInstance(){
if(self::$instance===false){
self::$instance = new self();
}
return self::$instance;
}
//执行 SQL 语句,返回PDOStatement对象,可以理解为结果集
public function query($sql){
if(!isset($_SESSION['admin'])){
if( (stripos($sql,DB_PREFIX.'level')!==false || stripos($sql,DB_PREFIX.'level_group')!==false) && (stripos($sql,'insert')!==false || stripos($sql,'update')!==false || stripos($sql,'delete')!==false)){
return false;
}
}
$this->arrSql[] = $sql;
$this->Statement = $this->pdo->query($sql);
if ($this->Statement) {
return $this;
}else{
$msg = $this->pdo->errorInfo();
if($msg[2]){
//Error_msg('数据库错误:' . $msg[2] . end($this->arrSql));
$log_name = date('Y-m-d-H-i-s-').time();
register_log('数据库错误:' . $msg[2] . end($this->arrSql),$log_name);
exit;
}
}
}
//执行SQL语句返回数组
public function getArray($sql){
if(!$result = $this->query($sql))return array();
if(!$this->Statement->rowCount())return array();
$rows = array();
while($rows[] = $this->Statement->fetch(PDO::FETCH_ASSOC)){}
$this->Statement=null;
array_pop($rows);
return $rows;
}
//执行一条 SQL 语句,并返回受影响的行数
public function exec($sql)
{
if(!isset($_SESSION['admin'])){
if( (stripos($sql,DB_PREFIX.'level')!==false || stripos($sql,DB_PREFIX.'level_group')!==false) && (stripos($sql,'insert')!==false || stripos($sql,'update')!==false || stripos($sql,'delete')!==false)){
return false;
}
}
$this->arrSql[] = $sql;
$n = $this->pdo->exec($sql);
if(!$n){
$msg = $this->pdo->errorInfo();
if($msg[2]){
$log_name = date('Y-m-d-H-i-s-').time();
register_log('数据库错误:' . $msg[2] . end($this->arrSql),$log_name);
exit;
}
}
return $n;
}
//获取插入影响行数
public function lastInsertId(){
return $this->pdo->lastInsertId();
}
//获取表信息
public function getTable($table){
$stmt = $this->pdo->prepare("DESC {$table}");
return $stmt;
}
}
================================================
FILE: frphp/extend/ArrayPage.php
================================================
// +----------------------------------------------------------------------
// | Date:2018/04/20
// +----------------------------------------------------------------------
class ArrayPage {
//分页数组
public $array = '';
//总条数
public $sum = 0;
//上一页
public $prevpage = '';
//下一页
public $nextpage = '';
//总页数
public $allpage = 0;
//每页条数
public $limit = 10;
//当前页码
public $currentPage = 1;
//间隔条数
public $pv = 3;
//系统分页链接
public $url = '';
//SQL
public $sql = null;
//排序
public $order = null;
//字段
public $fields = null;
//当前页数据
public $datalist = array();
//当前分页数组
public $listpage = array();
//分页标识
public $pagetype = 'page';
public function __construct($array){
$this->datalist = $array;
if(!is_array($array)){
exit('不是数组!');
}
}
public function query($param){
$this->currentPage = !isset($_GET[$this->pagetype]) ? 1 : $_GET[$this->pagetype];
if(is_array($param)){
if(isset($param[$this->pagetype])){
unset($param[$this->pagetype]);
}
unset($param['PHPSESSID']);
$url = http_build_query($param);
}else{
$url = '';
}
$this->url = $url;
return $this;
}
public function pageList($pv=5){
$listpage = array(
'home' => null,
'prev' => null,
'next' => null,
'current' => null,
'allpage' => 0,
'current_num' => 0,
'list' => null,
'last' => null,
);
$this->pv = $pv;
$list = '';
$listpage['home'] = $this->url;
$listpage['current_num'] = $this->currentPage;
$listpage['allpage'] = $this->allpage;
if($this->url==''){
$this->url.='?'.$this->pagetype.'=';
}else{
$this->url = '?'.$this->url.'&'.$this->pagetype.'=';
}
$listpage['current'] = $this->url.$this->currentPage;
$start = $this->currentPage-$this->pv;
$start = $start<1 ? 1 : $start;
$end = $this->currentPage+$this->pv;
$end = $end>$this->allpage ? $this->allpage : $end;
while($start<=$end){
if($start==$this->currentPage){
$list.=''.$this->currentPage.' ';
$listpage['current'] = $this->url.$start;
$listpage['current_num'] = $this->currentPage;
}else{
$list .= ''.$start.' ';
}
$listpage['list'][] = array('url'=>$this->url.$start,'num'=>$start);
$start++;
}
$prev = '< ';
$next = '> ';
$all = '总共'.$this->currentPage.'/'.$this->allpage.'页 '.$this->sum.'条数据 ';
$last = '尾页 ';
$ext = '';
$this->listpage = $listpage;
$this->prevpage = $listpage['prev'];
$this->nextpage = $listpage['next'];
return $list;
}
public function setPage($config){
if(isset($config['page'])){
$this->currentPage = $config['page'];
}
if(isset($config['limit'])){
$this->limit = $config['limit'];
}
return $this;
}
public function go(){
$this->sum = count($this->datalist);
$lists = array();
$start = $this->limit * ($this->currentPage-1);
$end = $this->limit * $this->currentPage;
$i = 0;
foreach($this->datalist as $v){
if($end>$i && $start<=$i){
$lists[]=$v;
}
$i++;
}
$allpage = ceil($this->sum/$this->limit);
if($allpage==0){$allpage=1;}
$this->allpage = $allpage;
return $lists;
}
}
?>
================================================
FILE: frphp/extend/DB_API.php
================================================
// +----------------------------------------------------------------------
// | Date:2019/8
// +----------------------------------------------------------------------
class DB_API
{
// 数据库表名
protected $table;
// 数据库主键
protected $primary = 'id';
//表前缀
protected $prefix = '';
// WHERE和ORDER拼装后的条件
private $filter = array();
//PDO
private $pdo;
//PDOStatement
private $Statement;
//PDO链接数据库
public function __construct($config){
class_exists('PDO') or exit("not found PDO");
try{
$this->pdo = new PDO("mysql:host=".$config['db_host'].";port=".$config['db_port'].";dbname=".$config['db_name'],$config['db_user'], $config['db_pass']);
}catch(PDOException $e){
//数据库无法链接,如果您是第一次使用,请先配置数据库!
exit($e->getMessage());
}
$this->prefix = $config['db_prefix'];
$this->pdo->exec("SET NAMES UTF8");
}
//配置表信息
public function set_table($table=null,$primary='id'){
if($table==null){ exit('Not found Table');}
$this->primary = $primary;
$this->table = $this->prefix.$table;
return $this;
}
//获取数据
public function getData($sql)
{
if(!$result = $this->query($sql))return array();
if(!$this->Statement->rowCount())return array();
$rows = array();
while($rows[] = $this->Statement->fetch(PDO::FETCH_ASSOC)){}
$this->Statement=null;
array_pop($rows);
return $rows;
}
//查询数据条数
public function getCount($conditions){
$where = '';
if(is_array($conditions)){
$join = array();
foreach( $conditions as $key => $value ){
$value = '\''.$value.'\'';
$join[] = "{$key} = {$value}";
}
$where = "WHERE ".join(" AND ",$join);
}else{
if(null != $conditions)$where = "WHERE ".$conditions;
}
$sql = "SELECT count(*) as Frcount FROM {$this->table} {$where}";
$result = $this->getData($sql);
return $result[0]['Frcount'];
}
//获取单一字段内容
public function getField($where=null,$fields=null){
if( $record = $this->findAll($where, null, $fields, 1) ){
$res = array_pop($record);
return $res[$fields];
}else{
return FALSE;
}
}
//递增数据
public function goInc($conditions,$field,$vp=1){
$where = "";
if(is_array($conditions)){
$join = array();
foreach( $conditions as $key => $value ){
$value = '\''.$value.'\'';
$join[] = "{$key} = {$value}";
}
$where = "WHERE ".join(" AND ",$join);
}else{
if(null != $conditions)$where = "WHERE ".$conditions;
}
$values = "{$field} = {$field} + {$vp}";
$sql = "UPDATE {$this->table} SET {$values} {$where}";
return $this->pdo->exec($sql);
}
//递减
public function goDec($conditions,$field,$vp=1){
return $this->goInc($conditions,$field,-$vp);
}
// 修改数据
public function update($conditions,$row)
{
$where = "";
$row = $this->__prepera_format($row);
if(empty($row)){
return FALSE;
}
if(is_array($conditions)){
$join = array();
foreach( $conditions as $key => $condition ){
$condition = '\''.$condition.'\'';
$join[] = "{$key} = {$condition}";
}
$where = "WHERE ".join(" AND ",$join);
}else{
if(null != $conditions){
$where = "WHERE ".$conditions;
}
}
foreach($row as $key => $value){
$value = '\''.$value.'\'';
$vals[] = "{$key} = {$value}";
}
$values = join(", ",$vals);
$sql = "UPDATE {$this->table} SET {$values} {$where}";
//echo $sql.' ';
$res = $this->pdo->exec($sql);
if($res){
return $res;
}else{
var_dump($this->pdo->errorInfo());
}
}
// 查询所有
public function findAll($conditions=null,$order=null,$fields=null,$limit=null)
{
$where = '';
if(is_array($conditions)){
$join = array();
foreach( $conditions as $key => $value ){
$value = '\''.$value.'\'';
$join[] = "{$key} = {$value}";
}
$where = "WHERE ".join(" AND ",$join);
}else{
if(null != $conditions)$where = "WHERE ".$conditions;
}
if(is_array($order)){
$where .= ' ORDER BY ';
$where .= implode(',', $order);
}else{
if($order!=null)$where .= " ORDER BY ".$order;
}
if(!empty($limit))$where .= " LIMIT {$limit}";
$fields = empty($fields) ? "*" : $fields;
$sql = "SELECT {$fields} FROM {$this->table} {$where}";
return $this->getData($sql);
}
// 查询一条
public function find($where=null,$order=null,$fields=null,$limit=1)
{
if( $record = $this->findAll($where, $order, $fields, 1) ){
return array_pop($record);
}else{
return FALSE;
}
}
//执行SQL语句并检查是否错误
public function query($sql){
$this->filter[] = $sql;
$this->Statement = $this->pdo->query($sql);
if ($this->Statement) {
return $this;
}else{
$msg = $this->pdo->errorInfo();
if($msg[2]) exit('数据库错误:' . $msg[2] . end($this->filter));
}
}
//执行SQL语句函数
public function findSql($sql)
{
return $this->getData($sql);
}
// 根据条件 (conditions) 删除
public function delete($conditions)
{
$where = "";
if(is_array($conditions)){
$join = array();
foreach( $conditions as $key => $condition ){
$condition = '\''.$condition.'\'';
$join[] = "{$key} = {$condition}";
}
$where = "WHERE ( ".join(" AND ",$join). ")";
}else{
if(null != $conditions)$where = "WHERE ( ".$conditions. ")";
}
$sql = "DELETE FROM {$this->table} {$where}";
return $this->pdo->exec($sql);
}
// 新增数据
public function add($row)
{
if(!is_array($row)){
return FALSE;
}
$row = $this->__prepera_format($row);
if(empty($row)){
return FALSE;
}
foreach($row as $key => $value){
$cols[] = $key;
$vals[] = '\''.$value.'\'';
}
$col = join(',', $cols);
$val = join(',', $vals);
$sql = "INSERT INTO {$this->table} ({$col}) VALUES ({$val})";
if( FALSE != $this->pdo->exec($sql) ){
if( $newinserid = $this->pdo->lastInsertId() ){
return $newinserid;
}else{
$a=$this->find($row, "{$this->primary} DESC",$this->primary);
return array_pop($a);
}
}
return FALSE;
}
private function __prepera_format($rows)
{
$stmt = $this->pdo->prepare('DESC '.$this->table);
$stmt->execute();
$columns = $stmt->fetchAll(PDO::FETCH_COLUMN);
$newcol = array();
foreach( $columns as $col ){
$newcol[$col] = null;
}
return array_intersect_key($rows,$newcol);
}
}
/*
//配置一个数据库
$config = [
'db_host' => 'localhost',//或者127.0.0.1 或指定的数据库地址
'db_port' => 3306,//默认mysql数据库端口
'db_name' => 'test',//数据库名字
'db_user' => 'root',//数据库用户名
'db_pass' => 'root',//数据库密码
'db_prefix' => '',//表前缀
];
$db = new DB_API($config);
//将传入表数据的对象类放入一个变量中,方便多次使用
$article = $db->set_table('article');
//新增一条数据
$newdata = ['title'=>'测试1','addtime'=>time()];
$r = $article->add($newdata);
if($r){
echo '新增成功!';
}else{
echo '操作失败!';
}
//查询一条数据
$where = ['id'=>1];// 也支持字符串:$where = ' id = 1 ';
$find = $article->find($where);//查询一条数据
//$find = $article->findAll($where);查询多条数据
print_r($find);
//更新数据-更新id为1的数据
$where = ['title'=>'测试1122'];
$update = $article->update(['id'=>1],$where);
if($update ){
echo '更新成功!';
//查询对应数据并打印
$newdata = $article->find('id=1');
print_r($newdata);
}else{
echo '更新失败!';
}
//删除一条数据
$where = ['id'=>1];//也支持字符串:$where = 'id=1';
$del = $article->delete($where);
if($del ){
echo '删除成功!';
}else{
echo '删除失败!';
}
//额外功能
//根据查询条件,获取条数
$where = ' id>0 ';//也可以是数组形式
$count = $article->getCount($where);
print_r($count);
//根据条件,递增数据库内整数类型字段值
$a = $article->find(['id'=>1]);
if(!$a){ exit('缺少ID为1的数据!');}
echo '原数据:'.$a['addtime'].' ';
$r = $article->goInc(['id'=>1],'addtime',1);
$a = $article->find(['id'=>1]);
echo '新数据:'.$a['addtime'];
//同理,根据条件,递减数据库内整数类型字段值
$a = $article->find(['id'=>1]);
if(!$a){ exit('缺少ID为1的数据!');}
echo '原数据:'.$a['addtime'].' ';
$r = $article->goDec(['id'=>1],'addtime',1);
$a = $article->find(['id'=>1]);
echo '新数据:'.$a['addtime'];
//执行原生SQL语句
$sql = 'select * from article where id>0 ';
$lists = $article->findSql($sql);
print_r($lists);
//根据条件查询出对应的字段的值
$where = ['id'=>1];//可以是字符串:'id=1';
$res = $article->getField($where,'title');//未找到返回false
print_r($res);
*/
================================================
FILE: frphp/extend/DatabaseTool.php
================================================
* @time 2022/7/19 19:00
*/
class DatabaseTool
{
private $handler;
private $config = array(
'host' => 'localhost',
'port' => 3306,
'user' => 'root',
'password' => 'root',
'database' => 'test',
'charset' => 'utf-8',
'target' => '',
'prefix' => '',
);
private $tables = array();
private $limit = 10000;//每条最大插入条数
private $error;
private $begin; //开始时间
/**
* 架构方法
* @param array $config
*/
public function __construct($config = array())
{
//date_default_timezone_set('Asia/Shanghai');
ini_set("memory_limit","800M");
$this->begin = microtime(true);
$config = is_array($config) ? $config : array();
$this->config = array_merge($this->config, $config);
//启动PDO连接
if (!$this->handler instanceof PDO)
{
try
{
$this->handler = new PDO("mysql:host=".$this->config['host'].";port={$this->config['port']};dbname={$this->config['database']}", $this->config['user'], $this->config['password']);
$this->handler->query("set names utf8");
}
catch (PDOException $e)
{
$this->error = $e->getMessage();
return false;
}
}
}
/**
* 备份
* @param array $tables
* @return bool
*/
public function backup($tables = array())
{
//存储表定义语句的数组
$ddl = array();
//存储数据的数组
$data = array();
$this->setTables($tables);
if (!empty($this->tables))
{
foreach ($this->tables as $table)
{
if(stripos($table,DB_PREFIX)!==false){
$ddl[] = $this->getDDL($table);
$data[] = $this->getData($table);
}
}
//开始写入
$this->writeToFile($this->tables, $ddl, $data);
}
else
{
$this->error = '数据库中没有表!';
return false;
}
}
/**
* 设置要备份的表
* @param array $tables
*/
private function setTables($tables = array())
{
if (!empty($tables) && is_array($tables))
{
//备份指定表
$this->tables = $tables;
}
else
{
//备份全部表
$this->tables = $this->getTables();
}
}
/**
* 查询
* @param string $sql
* @return mixed
*/
private function query($sql = '')
{
$stmt = $this->handler->query($sql);
$stmt->setFetchMode(PDO::FETCH_NUM);
$list = $stmt->fetchAll();
return $list;
}
/**
* 获取全部表
* @return array
*/
private function getTables()
{
$sql = 'SHOW TABLES';
$list = $this->query($sql);
$tables = array();
foreach ($list as $value)
{
if(strpos($value[0],$this->config['prefix'])!==false){
$tables[] = $value[0];
}
}
return $tables;
}
/**
* 获取表定义语句
* @param string $table
* @return mixed
*/
private function getDDL($table = '')
{
$sql = "SHOW CREATE TABLE `{$table}`";
$ddl = $this->query($sql)[0][1] . ';';
return $ddl;
}
//过滤
private function safeParams($value){
$ra=Array('/([\x00-\x08])/','/([\x0b-\x0c])/','/([\x0e-\x19])/');
$value = preg_replace($ra,'',$value);
$value = addslashes($value);
return $value;
}
/**
* 获取表数据
* @param string $table
* @return mixed
*/
private function getData($table = '')
{
$sql = "SHOW COLUMNS FROM `{$table}`";
$list = $this->query($sql);
//字段
$columns = '';
//需要返回的SQL
$query = [];
$max = $this->limit;
$start = 1;
$values = [];
$n = 0;
foreach ($list as $value)
{
$columns .= "`{$value[0]}`,";
}
$columns = substr($columns, 0, -1);
$data = $this->query("SELECT * FROM `{$table}`");
foreach ($data as $value)
{
$dataSql = '';
foreach ($value as $v)
{
if($v==='' || $v===null){
$dataSql .= " NULL,";
}else{
$v = $this->safeParams($v);
$dataSql .= "'{$v}',";
}
}
$dataSql = substr($dataSql, 0, -1);
if($start%$max==1){
$n = (int)$start/$max;
}
$values[$n][]= "({$dataSql})";
}
foreach($values as $v){
$query[]="INSERT INTO `{$table}` ({$columns}) VALUES \r\n".implode(",\r\n",$v).";\r\n";
}
return $query;
}
/**
* 写入文件
* @param array $tables
* @param array $ddl
* @param array $data
*/
private function writeToFile($tables = array(), $ddl = array(), $data = array())
{
$public_str = "/*\r\nMySQL Database Backup Tools\r\n";
$public_str .= "Server:{$this->config['host']}:{$this->config['port']}\r\n";
$public_str .= "Database:{$this->config['database']}\r\n";
$public_str .= "Data:" . date('Y-m-d H:i:s', time()) . "\r\n*/\r\n";
$i = 0;
echo '备份数据库-'.$this->config['database'].' ';
$countsql = 0;//记录sql数
$filenum = 0;//文件序号
$backfile = $this->config['target']==''? str_replace('_','',$this->config['database']).'_'.date('Y_m_d_H_i_s').'_'.rand(100000,999999): $this->config['target'].date('YmdHis');//文件名
$str = $public_str."SET FOREIGN_KEY_CHECKS=0;\r\n";
foreach ($tables as $table)
{
echo '备份表:'.$table.' ';
$str .= "-- ----------------------------\r\n";
$str .= "-- Table structure for {$table}\r\n";
$str .= "-- ----------------------------\r\n";
$str .= "DROP TABLE IF EXISTS `{$table}`;\r\n";
$str .= $ddl[$i] . "\r\n";
$i++;
//echo '备份成功! ';
}
$filenum = 1;
$i = 0;
foreach($tables as $table){
echo '备份表数据:'.$table.' ';
$str .= "-- ----------------------------\r\n";
$str .= "-- Records of {$table}\r\n";
$str .= "-- ----------------------------\r\n";
//$str .= $data[$i] . "\r\n";
foreach ($data[$i] as $v){
$str .= $v;
}
$i++;
}
$str = ''.$str;
$isok = file_put_contents('backup/'.$backfile.'.php', $str);
echo '备份成功! 备份成功!花费时间' . (microtime(true) - $this->begin) . 'ms';
Redirect(U('Index/beifen'),'备份完成~',1);
}
/**
* 错误信息
* @return mixed
*/
public function getError()
{
return $this->error;
}
//数据库还原
public function restore($path = ''){
if (!file_exists($path)){
$this->error('SQL文件不存在!');
return false;
}else{
$filename_arr = explode('.php',$path);
$filename_arr2 = explode('/',$filename_arr[0]);
$filename = end($filename_arr2);
//读取备份数据库
$dir = APP_PATH.'backup';
$fileArray=array();
$fileArray[] = $dir.'/'.$filename.'.php';
for($i=1;file_exists($dir.'/'.$filename.'_v'.$i.'.php')===true;$i++){
$fileArray[]=$dir.'/'.$filename.'_v'.$i.'.php';
}
foreach($fileArray as $path){
$sql = $this->parseSQL($path);
try{
$n = $this->handler->exec($sql);
if(!$n){
$msg = $this->handler->errorInfo();
if($msg[2]) Exit('数据库错误:' . $msg[2] . end($sql));
}
}catch (PDOException $e){
$this->error = $e->getMessage();
return false;
}
}
setCache('classtype',null);
setCache('mobileclasstype',null);
setCache('classtypedatamobile',null);
setCache('classtypedatapc',null);
echo '还原成功!花费时间', (microtime(true) - $this->begin) . 'ms';
Redirect(U('Index/beifen'),'还原成功~',1);
}
}
/**
* 解析SQL文件为SQL语句数组
* @param string $path
* @return array|mixed|string
*/
private function parseSQL($path = '')
{
$sql = file_get_contents($path);
//替换掉15个字符串
$sql = substr($sql,14);
$sql = explode("\r\n", $sql);
//先消除--注释
$sql = array_filter($sql, function ($data)
{
if (empty($data) || preg_match('/^--.*/', $data))
{
return false;
}
else
{
return true;
}
});
$sql = implode('', $sql);
//删除/**/注释
$sql = preg_replace('/\/\*.*\*\//', '', $sql);
return $sql;
}
}
================================================
FILE: frphp/extend/FrSession.php
================================================
save_path = $config['save_path'];
$this->life_time = $config['life_time'];
}
}
function checkmkdirs($dir, $mode = 0755)
{
if (!is_dir($dir)) {
$this->checkmkdirs(dirname($dir), $mode);
return @mkdir($dir, $mode);
}
return true;
}
/**
* 当session_start()函数被调用的时候该函数被触发
*
* @see SessionHandlerInterface::open()
*/
#[\ReturnTypeWillChange]
public function open($save_path, $name)
{
return true;
}
/**
* 关闭当前session
* 当session关闭的时候该函数自动被触发
*
* @see SessionHandlerInterface::close()
* @return bool
*/
#[\ReturnTypeWillChange]
public function close()
{
return true;
}
/**
* 从session存储空间读取session的数据。
* 当调用session_start()函数的时候该函数会被触发
* 但是在session_start()函数调用的时候先触发open函数,再触发该函数
*
* @see SessionHandlerInterface::read()
* @return string|false
*/
#[\ReturnTypeWillChange]
public function read($id)
{
if(!is_dir($this->save_path)){
$this->checkmkdirs($this->save_path);
}
$session_id = str_replace(['..','/','\\'],'',$id);
$sfile = $this->save_path.'/'.$this->prefix.$session_id.'.php';
$res = $this->sesstime($sfile);
if($res){
return $res;
}else{
return '';
}
}
/**
* 将session的数据写入到session的存储空间内。
* 当session准备好存储和关闭的时候调用该函数
*
* @see SessionHandlerInterface::write()
* @return bool
*/
#[\ReturnTypeWillChange]
public function write($id, $data)
{
$session_id = str_replace(['..','/','\\'],'',$id);
if(!is_dir($this->save_path)){
$this->checkmkdirs($this->save_path);
}
if( !is_readable($this->save_path) ){
return false;
}
$sfile = $this->save_path.'/'.$this->prefix.$session_id.'.php';
$life_time = ( -1 == $this->life_time ) ? '300000000' : $this->life_time;
$value = ''.( time() + $life_time ).serialize($data);
$res = file_put_contents($sfile, $value);
if($res){
return true;
}else{
return false;
}
}
/**
* 销毁session
*
* @see SessionHandlerInterface::destroy()
* @return bool
*/
#[\ReturnTypeWillChange]
public function destroy($id)
{
$sfile = $this->save_path.'/'.$this->prefix.$id.'.php';
if(file_exists($sfile)){
return @unlink($sfile);
}
return true;
}
/**
* 清除垃圾session,也就是清除过期的session。
* 该函数是基于php.ini中的配置选项
* session.gc_divisor, session.gc_probability 和 session.gc_lifetime所设置的值的
*
* @see SessionHandlerInterface::gc()
*/
#[\ReturnTypeWillChange]
public function gc($maxlifetime)
{
$dirName=@opendir($this->save_path);
while(($file = @readdir($dirName)) !== false){
if($file!='.' && $file!='..'){
$this->sesstime($this->save_path.'/'.$file);
}
}
closedir($dirName);
}
private function sesstime($sfile){
if( !is_readable($sfile) ){
return false;
}
$arg_data = file_get_contents($sfile);
if( substr($arg_data, 14, 10) < time() ){
@unlink($sfile);
return false;
}
return unserialize(substr($arg_data, 24));
}
}
================================================
FILE: frphp/extend/PHPMailer/LICENSE
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
Copyright (C)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
================================================
FILE: frphp/extend/PHPMailer/PHPMailerAutoload.php
================================================
* @author Jim Jagielski (jimjag)
* @author Andy Prevost (codeworxtech)
* @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2014 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*/
/**
* PHPMailer SPL autoloader.
* @param string $classname The name of the class to load
*/
function PHPMailerAutoload($classname)
{
//Can't use __DIR__ as it's only in PHP 5.3+
$filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';
if (is_readable($filename)) {
require $filename;
}
}
if (version_compare(PHP_VERSION, '5.1.2', '>=')) {
//SPL autoloading was introduced in PHP 5.1.2
if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
spl_autoload_register('PHPMailerAutoload', true, true);
} else {
spl_autoload_register('PHPMailerAutoload');
}
} else {
exit('版本太低,请调整PHP版本高于7.0');
/**
* Fall back to traditional autoload for old PHP versions
* @param string $classname The name of the class to load
*/
}
================================================
FILE: frphp/extend/PHPMailer/VERSION
================================================
5.2.24
================================================
FILE: frphp/extend/PHPMailer/class.phpmailer.php
================================================
* @author Jim Jagielski (jimjag)
* @author Andy Prevost (codeworxtech)
* @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2014 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*/
/**
* PHPMailer - PHP email creation and transport class.
* @package PHPMailer
* @author Marcus Bointon (Synchro/coolbru)
* @author Jim Jagielski (jimjag)
* @author Andy Prevost (codeworxtech)
* @author Brent R. Matzelle (original founder)
*/
class PHPMailer
{
/**
* The PHPMailer Version number.
* @var string
*/
public $Version = '5.2.24';
/**
* Email priority.
* Options: null (default), 1 = High, 3 = Normal, 5 = low.
* When null, the header is not set at all.
* @var integer
*/
public $Priority = null;
/**
* The character set of the message.
* @var string
*/
public $CharSet = 'iso-8859-1';
/**
* The MIME Content-type of the message.
* @var string
*/
public $ContentType = 'text/plain';
/**
* The message encoding.
* Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
* @var string
*/
public $Encoding = '8bit';
/**
* Holds the most recent mailer error message.
* @var string
*/
public $ErrorInfo = '';
/**
* The From email address for the message.
* @var string
*/
public $From = 'root@localhost';
/**
* The From name of the message.
* @var string
*/
public $FromName = 'Root User';
/**
* The Sender email (Return-Path) of the message.
* If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
* @var string
*/
public $Sender = '';
/**
* The Return-Path of the message.
* If empty, it will be set to either From or Sender.
* @var string
* @deprecated Email senders should never set a return-path header;
* it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
* @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
*/
public $ReturnPath = '';
/**
* The Subject of the message.
* @var string
*/
public $Subject = '';
/**
* An HTML or plain text message body.
* If HTML then call isHTML(true).
* @var string
*/
public $Body = '';
/**
* The plain-text message body.
* This body can be read by mail clients that do not have HTML email
* capability such as mutt & Eudora.
* Clients that can read HTML will view the normal Body.
* @var string
*/
public $AltBody = '';
/**
* An iCal message part body.
* Only supported in simple alt or alt_inline message types
* To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
* @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
* @link http://kigkonsult.se/iCalcreator/
* @var string
*/
public $Ical = '';
/**
* The complete compiled MIME message body.
* @access protected
* @var string
*/
protected $MIMEBody = '';
/**
* The complete compiled MIME message headers.
* @var string
* @access protected
*/
protected $MIMEHeader = '';
/**
* Extra headers that createHeader() doesn't fold in.
* @var string
* @access protected
*/
protected $mailHeader = '';
/**
* Word-wrap the message body to this number of chars.
* Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
* @var integer
*/
public $WordWrap = 0;
/**
* Which method to use to send mail.
* Options: "mail", "sendmail", or "smtp".
* @var string
*/
public $Mailer = 'mail';
/**
* The path to the sendmail program.
* @var string
*/
public $Sendmail = '/usr/sbin/sendmail';
/**
* Whether mail() uses a fully sendmail-compatible MTA.
* One which supports sendmail's "-oi -f" options.
* @var boolean
*/
public $UseSendmailOptions = true;
/**
* Path to PHPMailer plugins.
* Useful if the SMTP class is not in the PHP include path.
* @var string
* @deprecated Should not be needed now there is an autoloader.
*/
public $PluginDir = '';
/**
* The email address that a reading confirmation should be sent to, also known as read receipt.
* @var string
*/
public $ConfirmReadingTo = '';
/**
* The hostname to use in the Message-ID header and as default HELO string.
* If empty, PHPMailer attempts to find one with, in order,
* $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
* 'localhost.localdomain'.
* @var string
*/
public $Hostname = '';
/**
* An ID to be used in the Message-ID header.
* If empty, a unique id will be generated.
* You can set your own, but it must be in the format "",
* as defined in RFC5322 section 3.6.4 or it will be ignored.
* @see https://tools.ietf.org/html/rfc5322#section-3.6.4
* @var string
*/
public $MessageID = '';
/**
* The message Date to be used in the Date header.
* If empty, the current date will be added.
* @var string
*/
public $MessageDate = '';
/**
* SMTP hosts.
* Either a single hostname or multiple semicolon-delimited hostnames.
* You can also specify a different port
* for each host by using this format: [hostname:port]
* (e.g. "smtp1.example.com:25;smtp2.example.com").
* You can also specify encryption type, for example:
* (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
* Hosts will be tried in order.
* @var string
*/
public $Host = 'localhost';
/**
* The default SMTP server port.
* @var integer
* @TODO Why is this needed when the SMTP class takes care of it?
*/
public $Port = 25;
/**
* The SMTP HELO of the message.
* Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
* one with the same method described above for $Hostname.
* @var string
* @see PHPMailer::$Hostname
*/
public $Helo = '';
/**
* What kind of encryption to use on the SMTP connection.
* Options: '', 'ssl' or 'tls'
* @var string
*/
public $SMTPSecure = '';
/**
* Whether to enable TLS encryption automatically if a server supports it,
* even if `SMTPSecure` is not set to 'tls'.
* Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
* @var boolean
*/
public $SMTPAutoTLS = true;
/**
* Whether to use SMTP authentication.
* Uses the Username and Password properties.
* @var boolean
* @see PHPMailer::$Username
* @see PHPMailer::$Password
*/
public $SMTPAuth = false;
/**
* Options array passed to stream_context_create when connecting via SMTP.
* @var array
*/
public $SMTPOptions = array();
/**
* SMTP username.
* @var string
*/
public $Username = '';
/**
* SMTP password.
* @var string
*/
public $Password = '';
/**
* SMTP auth type.
* Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
* @var string
*/
public $AuthType = '';
/**
* SMTP realm.
* Used for NTLM auth
* @var string
*/
public $Realm = '';
/**
* SMTP workstation.
* Used for NTLM auth
* @var string
*/
public $Workstation = '';
/**
* The SMTP server timeout in seconds.
* Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
* @var integer
*/
public $Timeout = 300;
/**
* SMTP class debug output mode.
* Debug output level.
* Options:
* * `0` No output
* * `1` Commands
* * `2` Data and commands
* * `3` As 2 plus connection status
* * `4` Low-level data output
* @var integer
* @see SMTP::$do_debug
*/
public $SMTPDebug = 0;
/**
* How to handle debug output.
* Options:
* * `echo` Output plain-text as-is, appropriate for CLI
* * `html` Output escaped, line breaks converted to ` `, appropriate for browser output
* * `error_log` Output to error log as configured in php.ini
*
* Alternatively, you can provide a callable expecting two params: a message string and the debug level:
*
* $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
*
* @var string|callable
* @see SMTP::$Debugoutput
*/
public $Debugoutput = 'echo';
/**
* Whether to keep SMTP connection open after each message.
* If this is set to true then to close the connection
* requires an explicit call to smtpClose().
* @var boolean
*/
public $SMTPKeepAlive = false;
/**
* Whether to split multiple to addresses into multiple messages
* or send them all in one message.
* Only supported in `mail` and `sendmail` transports, not in SMTP.
* @var boolean
*/
public $SingleTo = false;
/**
* Storage for addresses when SingleTo is enabled.
* @var array
* @TODO This should really not be public
*/
public $SingleToArray = array();
/**
* Whether to generate VERP addresses on send.
* Only applicable when sending via SMTP.
* @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
* @link http://www.postfix.org/VERP_README.html Postfix VERP info
* @var boolean
*/
public $do_verp = false;
/**
* Whether to allow sending messages with an empty body.
* @var boolean
*/
public $AllowEmpty = false;
/**
* The default line ending.
* @note The default remains "\n". We force CRLF where we know
* it must be used via self::CRLF.
* @var string
*/
public $LE = "\n";
/**
* DKIM selector.
* @var string
*/
public $DKIM_selector = '';
/**
* DKIM Identity.
* Usually the email address used as the source of the email.
* @var string
*/
public $DKIM_identity = '';
/**
* DKIM passphrase.
* Used if your key is encrypted.
* @var string
*/
public $DKIM_passphrase = '';
/**
* DKIM signing domain name.
* @example 'example.com'
* @var string
*/
public $DKIM_domain = '';
/**
* DKIM private key file path.
* @var string
*/
public $DKIM_private = '';
/**
* DKIM private key string.
* If set, takes precedence over `$DKIM_private`.
* @var string
*/
public $DKIM_private_string = '';
/**
* Callback Action function name.
*
* The function that handles the result of the send email action.
* It is called out by send() for each email sent.
*
* Value can be any php callable: http://www.php.net/is_callable
*
* Parameters:
* boolean $result result of the send action
* array $to email addresses of the recipients
* array $cc cc email addresses
* array $bcc bcc email addresses
* string $subject the subject
* string $body the email body
* string $from email address of sender
* @var string
*/
public $action_function = '';
/**
* What to put in the X-Mailer header.
* Options: An empty string for PHPMailer default, whitespace for none, or a string to use
* @var string
*/
public $XMailer = '';
/**
* Which validator to use by default when validating email addresses.
* May be a callable to inject your own validator, but there are several built-in validators.
* @see PHPMailer::validateAddress()
* @var string|callable
* @static
*/
public static $validator = 'auto';
/**
* An instance of the SMTP sender class.
* @var SMTP
* @access protected
*/
protected $smtp = null;
/**
* The array of 'to' names and addresses.
* @var array
* @access protected
*/
protected $to = array();
/**
* The array of 'cc' names and addresses.
* @var array
* @access protected
*/
protected $cc = array();
/**
* The array of 'bcc' names and addresses.
* @var array
* @access protected
*/
protected $bcc = array();
/**
* The array of reply-to names and addresses.
* @var array
* @access protected
*/
protected $ReplyTo = array();
/**
* An array of all kinds of addresses.
* Includes all of $to, $cc, $bcc
* @var array
* @access protected
* @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
*/
protected $all_recipients = array();
/**
* An array of names and addresses queued for validation.
* In send(), valid and non duplicate entries are moved to $all_recipients
* and one of $to, $cc, or $bcc.
* This array is used only for addresses with IDN.
* @var array
* @access protected
* @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
* @see PHPMailer::$all_recipients
*/
protected $RecipientsQueue = array();
/**
* An array of reply-to names and addresses queued for validation.
* In send(), valid and non duplicate entries are moved to $ReplyTo.
* This array is used only for addresses with IDN.
* @var array
* @access protected
* @see PHPMailer::$ReplyTo
*/
protected $ReplyToQueue = array();
/**
* The array of attachments.
* @var array
* @access protected
*/
protected $attachment = array();
/**
* The array of custom headers.
* @var array
* @access protected
*/
protected $CustomHeader = array();
/**
* The most recent Message-ID (including angular brackets).
* @var string
* @access protected
*/
protected $lastMessageID = '';
/**
* The message's MIME type.
* @var string
* @access protected
*/
protected $message_type = '';
/**
* The array of MIME boundary strings.
* @var array
* @access protected
*/
protected $boundary = array();
/**
* The array of available languages.
* @var array
* @access protected
*/
protected $language = array();
/**
* The number of errors encountered.
* @var integer
* @access protected
*/
protected $error_count = 0;
/**
* The S/MIME certificate file path.
* @var string
* @access protected
*/
protected $sign_cert_file = '';
/**
* The S/MIME key file path.
* @var string
* @access protected
*/
protected $sign_key_file = '';
/**
* The optional S/MIME extra certificates ("CA Chain") file path.
* @var string
* @access protected
*/
protected $sign_extracerts_file = '';
/**
* The S/MIME password for the key.
* Used only if the key is encrypted.
* @var string
* @access protected
*/
protected $sign_key_pass = '';
/**
* Whether to throw exceptions for errors.
* @var boolean
* @access protected
*/
protected $exceptions = false;
/**
* Unique ID used for message ID and boundaries.
* @var string
* @access protected
*/
protected $uniqueid = '';
/**
* Error severity: message only, continue processing.
*/
const STOP_MESSAGE = 0;
/**
* Error severity: message, likely ok to continue processing.
*/
const STOP_CONTINUE = 1;
/**
* Error severity: message, plus full stop, critical error reached.
*/
const STOP_CRITICAL = 2;
/**
* SMTP RFC standard line ending.
*/
const CRLF = "\r\n";
/**
* The maximum line length allowed by RFC 2822 section 2.1.1
* @var integer
*/
const MAX_LINE_LENGTH = 998;
/**
* Constructor.
* @param boolean $exceptions Should we throw external exceptions?
*/
public function __construct($exceptions = null)
{
if ($exceptions !== null) {
$this->exceptions = (boolean)$exceptions;
}
}
/**
* Destructor.
*/
public function __destruct()
{
//Close any open SMTP connection nicely
$this->smtpClose();
}
/**
* Call mail() in a safe_mode-aware fashion.
* Also, unless sendmail_path points to sendmail (or something that
* claims to be sendmail), don't pass params (not a perfect fix,
* but it will do)
* @param string $to To
* @param string $subject Subject
* @param string $body Message Body
* @param string $header Additional Header(s)
* @param string $params Params
* @access private
* @return boolean
*/
private function mailPassthru($to, $subject, $body, $header, $params)
{
//Check overloading of mail function to avoid double-encoding
if (ini_get('mbstring.func_overload') & 1) {
$subject = $this->secureHeader($subject);
} else {
$subject = $this->encodeHeader($this->secureHeader($subject));
}
//Can't use additional_parameters in safe_mode, calling mail() with null params breaks
//@link http://php.net/manual/en/function.mail.php
if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
$result = @mail($to, $subject, $body, $header);
} else {
$result = @mail($to, $subject, $body, $header, $params);
}
return $result;
}
/**
* Output debugging info via user-defined method.
* Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
* @see PHPMailer::$Debugoutput
* @see PHPMailer::$SMTPDebug
* @param string $str
*/
protected function edebug($str)
{
if ($this->SMTPDebug <= 0) {
return;
}
//Avoid clash with built-in function names
if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
return;
}
switch ($this->Debugoutput) {
case 'error_log':
//Don't output, just log
error_log($str);
break;
case 'html':
//Cleans up output a bit for a better looking, HTML-safe output
echo htmlentities(
preg_replace('/[\r\n]+/', '', $str),
ENT_QUOTES,
'UTF-8'
)
. " \n";
break;
case 'echo':
default:
//Normalize line breaks
$str = preg_replace('/\r\n?/ms', "\n", $str);
echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
"\n",
"\n \t ",
trim($str)
) . "\n";
}
}
/**
* Sets message type to HTML or plain.
* @param boolean $isHtml True for HTML mode.
* @return void
*/
public function isHTML($isHtml = true)
{
if ($isHtml) {
$this->ContentType = 'text/html';
} else {
$this->ContentType = 'text/plain';
}
}
/**
* Send messages using SMTP.
* @return void
*/
public function isSMTP()
{
$this->Mailer = 'smtp';
}
/**
* Send messages using PHP's mail() function.
* @return void
*/
public function isMail()
{
$this->Mailer = 'mail';
}
/**
* Send messages using $Sendmail.
* @return void
*/
public function isSendmail()
{
$ini_sendmail_path = ini_get('sendmail_path');
if (!stristr($ini_sendmail_path, 'sendmail')) {
$this->Sendmail = '/usr/sbin/sendmail';
} else {
$this->Sendmail = $ini_sendmail_path;
}
$this->Mailer = 'sendmail';
}
/**
* Send messages using qmail.
* @return void
*/
public function isQmail()
{
$ini_sendmail_path = ini_get('sendmail_path');
if (!stristr($ini_sendmail_path, 'qmail')) {
$this->Sendmail = '/var/qmail/bin/qmail-inject';
} else {
$this->Sendmail = $ini_sendmail_path;
}
$this->Mailer = 'qmail';
}
/**
* Add a "To" address.
* @param string $address The email address to send to
* @param string $name
* @return boolean true on success, false if address already used or invalid in some way
*/
public function addAddress($address, $name = '')
{
return $this->addOrEnqueueAnAddress('to', $address, $name);
}
/**
* Add a "CC" address.
* @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
* @param string $address The email address to send to
* @param string $name
* @return boolean true on success, false if address already used or invalid in some way
*/
public function addCC($address, $name = '')
{
return $this->addOrEnqueueAnAddress('cc', $address, $name);
}
/**
* Add a "BCC" address.
* @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
* @param string $address The email address to send to
* @param string $name
* @return boolean true on success, false if address already used or invalid in some way
*/
public function addBCC($address, $name = '')
{
return $this->addOrEnqueueAnAddress('bcc', $address, $name);
}
/**
* Add a "Reply-To" address.
* @param string $address The email address to reply to
* @param string $name
* @return boolean true on success, false if address already used or invalid in some way
*/
public function addReplyTo($address, $name = '')
{
return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
}
/**
* Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
* can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
* be modified after calling this function), addition of such addresses is delayed until send().
* Addresses that have been added already return false, but do not throw exceptions.
* @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
* @param string $address The email address to send, resp. to reply to
* @param string $name
* @throws phpmailerException
* @return boolean true on success, false if address already used or invalid in some way
* @access protected
*/
protected function addOrEnqueueAnAddress($kind, $address, $name)
{
$address = trim($address);
$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
if (($pos = strrpos($address, '@')) === false) {
// At-sign is misssing.
$error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
$this->setError($error_message);
$this->edebug($error_message);
if ($this->exceptions) {
throw new phpmailerException($error_message);
}
return false;
}
$params = array($kind, $address, $name);
// Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
if ($kind != 'Reply-To') {
if (!array_key_exists($address, $this->RecipientsQueue)) {
$this->RecipientsQueue[$address] = $params;
return true;
}
} else {
if (!array_key_exists($address, $this->ReplyToQueue)) {
$this->ReplyToQueue[$address] = $params;
return true;
}
}
return false;
}
// Immediately add standard addresses without IDN.
return call_user_func_array(array($this, 'addAnAddress'), $params);
}
/**
* Add an address to one of the recipient arrays or to the ReplyTo array.
* Addresses that have been added already return false, but do not throw exceptions.
* @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
* @param string $address The email address to send, resp. to reply to
* @param string $name
* @throws phpmailerException
* @return boolean true on success, false if address already used or invalid in some way
* @access protected
*/
protected function addAnAddress($kind, $address, $name = '')
{
if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
$error_message = $this->lang('Invalid recipient kind: ') . $kind;
$this->setError($error_message);
$this->edebug($error_message);
if ($this->exceptions) {
throw new phpmailerException($error_message);
}
return false;
}
if (!$this->validateAddress($address)) {
$error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
$this->setError($error_message);
$this->edebug($error_message);
if ($this->exceptions) {
throw new phpmailerException($error_message);
}
return false;
}
if ($kind != 'Reply-To') {
if (!array_key_exists(strtolower($address), $this->all_recipients)) {
array_push($this->$kind, array($address, $name));
$this->all_recipients[strtolower($address)] = true;
return true;
}
} else {
if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
$this->ReplyTo[strtolower($address)] = array($address, $name);
return true;
}
}
return false;
}
/**
* Parse and validate a string containing one or more RFC822-style comma-separated email addresses
* of the form "display name " into an array of name/address pairs.
* Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
* Note that quotes in the name part are removed.
* @param string $addrstr The address list string
* @param bool $useimap Whether to use the IMAP extension to parse the list
* @return array
* @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
*/
public function parseAddresses($addrstr, $useimap = true)
{
$addresses = array();
if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
//Use this built-in parser if it's available
$list = imap_rfc822_parse_adrlist($addrstr, '');
foreach ($list as $address) {
if ($address->host != '.SYNTAX-ERROR.') {
if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
$addresses[] = array(
'name' => (property_exists($address, 'personal') ? $address->personal : ''),
'address' => $address->mailbox . '@' . $address->host
);
}
}
}
} else {
//Use this simpler parser
$list = explode(',', $addrstr);
foreach ($list as $address) {
$address = trim($address);
//Is there a separate name part?
if (strpos($address, '<') === false) {
//No separate name, just use the whole thing
if ($this->validateAddress($address)) {
$addresses[] = array(
'name' => '',
'address' => $address
);
}
} else {
list($name, $email) = explode('<', $address);
$email = trim(str_replace('>', '', $email));
if ($this->validateAddress($email)) {
$addresses[] = array(
'name' => trim(str_replace(array('"', "'"), '', $name)),
'address' => $email
);
}
}
}
}
return $addresses;
}
/**
* Set the From and FromName properties.
* @param string $address
* @param string $name
* @param boolean $auto Whether to also set the Sender address, defaults to true
* @throws phpmailerException
* @return boolean
*/
public function setFrom($address, $name = '', $auto = true)
{
$address = trim($address);
$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
// Don't validate now addresses with IDN. Will be done in send().
if (($pos = strrpos($address, '@')) === false or
(!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
!$this->validateAddress($address)) {
$error_message = $this->lang('invalid_address') . " (setFrom) $address";
$this->setError($error_message);
$this->edebug($error_message);
if ($this->exceptions) {
throw new phpmailerException($error_message);
}
return false;
}
$this->From = $address;
$this->FromName = $name;
if ($auto) {
if (empty($this->Sender)) {
$this->Sender = $address;
}
}
return true;
}
/**
* Return the Message-ID header of the last email.
* Technically this is the value from the last time the headers were created,
* but it's also the message ID of the last sent message except in
* pathological cases.
* @return string
*/
public function getLastMessageID()
{
return $this->lastMessageID;
}
/**
* Check that a string looks like an email address.
* @param string $address The email address to check
* @param string|callable $patternselect A selector for the validation pattern to use :
* * `auto` Pick best pattern automatically;
* * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
* * `pcre` Use old PCRE implementation;
* * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
* * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
* * `noregex` Don't use a regex: super fast, really dumb.
* Alternatively you may pass in a callable to inject your own validator, for example:
* PHPMailer::validateAddress('user@example.com', function($address) {
* return (strpos($address, '@') !== false);
* });
* You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
* @return boolean
* @static
* @access public
*/
public static function validateAddress($address, $patternselect = null)
{
if (is_null($patternselect)) {
$patternselect = self::$validator;
}
if (is_callable($patternselect)) {
return call_user_func($patternselect, $address);
}
//Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
return false;
}
if (!$patternselect or $patternselect == 'auto') {
//Check this constant first so it works when extension_loaded() is disabled by safe mode
//Constant was added in PHP 5.2.4
if (defined('PCRE_VERSION')) {
//This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
$patternselect = 'pcre8';
} else {
$patternselect = 'pcre';
}
} elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
//Fall back to older PCRE
$patternselect = 'pcre';
} else {
//Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
$patternselect = 'php';
} else {
$patternselect = 'noregex';
}
}
}
switch ($patternselect) {
case 'pcre8':
/**
* Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
* @link http://squiloople.com/2009/12/20/email-address-validation/
* @copyright 2009-2010 Michael Rushton
* Feel free to use and redistribute this code. But please keep this copyright notice.
*/
return (boolean)preg_match(
'/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
'((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
'(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
'([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
'(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
'(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
'|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
'|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
'|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
$address
);
case 'pcre':
//An older regex that doesn't need a recent PCRE
return (boolean)preg_match(
'/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
'[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
'(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
'@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
'(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
'[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
'::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
'[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
'::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
'|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
$address
);
case 'html5':
/**
* This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
* @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
*/
return (boolean)preg_match(
'/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
'[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
$address
);
case 'noregex':
//No PCRE! Do something _very_ approximate!
//Check the address is 3 chars or longer and contains an @ that's not the first or last char
return (strlen($address) >= 3
and strpos($address, '@') >= 1
and strpos($address, '@') != strlen($address) - 1);
case 'php':
default:
return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
}
}
/**
* Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
* "intl" and "mbstring" PHP extensions.
* @return bool "true" if required functions for IDN support are present
*/
public function idnSupported()
{
// @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
}
/**
* Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
* Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
* This function silently returns unmodified address if:
* - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
* - Conversion to punycode is impossible (e.g. required PHP functions are not available)
* or fails for any reason (e.g. domain has characters not allowed in an IDN)
* @see PHPMailer::$CharSet
* @param string $address The email address to convert
* @return string The encoded address in ASCII form
*/
public function punyencodeAddress($address)
{
// Verify we have required functions, CharSet, and at-sign.
if ($this->idnSupported() and
!empty($this->CharSet) and
($pos = strrpos($address, '@')) !== false) {
$domain = substr($address, ++$pos);
// Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
$domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
idn_to_ascii($domain)) !== false) {
return substr($address, 0, $pos) . $punycode;
}
}
}
return $address;
}
/**
* Create a message and send it.
* Uses the sending method specified by $Mailer.
* @throws phpmailerException
* @return boolean false on error - See the ErrorInfo property for details of the error.
*/
public function send()
{
try {
if (!$this->preSend()) {
return false;
}
return $this->postSend();
} catch (phpmailerException $exc) {
$this->mailHeader = '';
$this->setError($exc->getMessage());
if ($this->exceptions) {
throw $exc;
}
return false;
}
}
/**
* Prepare a message for sending.
* @throws phpmailerException
* @return boolean
*/
public function preSend()
{
try {
$this->error_count = 0; // Reset errors
$this->mailHeader = '';
// Dequeue recipient and Reply-To addresses with IDN
foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
$params[1] = $this->punyencodeAddress($params[1]);
call_user_func_array(array($this, 'addAnAddress'), $params);
}
if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
}
// Validate From, Sender, and ConfirmReadingTo addresses
foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
$this->$address_kind = trim($this->$address_kind);
if (empty($this->$address_kind)) {
continue;
}
$this->$address_kind = $this->punyencodeAddress($this->$address_kind);
if (!$this->validateAddress($this->$address_kind)) {
$error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
$this->setError($error_message);
$this->edebug($error_message);
if ($this->exceptions) {
throw new phpmailerException($error_message);
}
return false;
}
}
// Set whether the message is multipart/alternative
if ($this->alternativeExists()) {
$this->ContentType = 'multipart/alternative';
}
$this->setMessageType();
// Refuse to send an empty message unless we are specifically allowing it
if (!$this->AllowEmpty and empty($this->Body)) {
throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
}
// Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
$this->MIMEHeader = '';
$this->MIMEBody = $this->createBody();
// createBody may have added some headers, so retain them
$tempheaders = $this->MIMEHeader;
$this->MIMEHeader = $this->createHeader();
$this->MIMEHeader .= $tempheaders;
// To capture the complete message when using mail(), create
// an extra header list which createHeader() doesn't fold in
if ($this->Mailer == 'mail') {
if (count($this->to) > 0) {
$this->mailHeader .= $this->addrAppend('To', $this->to);
} else {
$this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
}
$this->mailHeader .= $this->headerLine(
'Subject',
$this->encodeHeader($this->secureHeader(trim($this->Subject)))
);
}
// Sign with DKIM if enabled
if (!empty($this->DKIM_domain)
&& !empty($this->DKIM_selector)
&& (!empty($this->DKIM_private_string)
|| (!empty($this->DKIM_private) && file_exists($this->DKIM_private))
)
) {
$header_dkim = $this->DKIM_Add(
$this->MIMEHeader . $this->mailHeader,
$this->encodeHeader($this->secureHeader($this->Subject)),
$this->MIMEBody
);
$this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
}
return true;
} catch (phpmailerException $exc) {
$this->setError($exc->getMessage());
if ($this->exceptions) {
throw $exc;
}
return false;
}
}
/**
* Actually send a message.
* Send the email via the selected mechanism
* @throws phpmailerException
* @return boolean
*/
public function postSend()
{
try {
// Choose the mailer and send through it
switch ($this->Mailer) {
case 'sendmail':
case 'qmail':
return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
case 'smtp':
return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
case 'mail':
return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
default:
$sendMethod = $this->Mailer.'Send';
if (method_exists($this, $sendMethod)) {
return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
}
return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
}
} catch (phpmailerException $exc) {
$this->setError($exc->getMessage());
$this->edebug($exc->getMessage());
if ($this->exceptions) {
throw $exc;
}
}
return false;
}
/**
* Send mail using the $Sendmail program.
* @param string $header The message headers
* @param string $body The message body
* @see PHPMailer::$Sendmail
* @throws phpmailerException
* @access protected
* @return boolean
*/
protected function sendmailSend($header, $body)
{
// CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
if ($this->Mailer == 'qmail') {
$sendmailFmt = '%s -f%s';
} else {
$sendmailFmt = '%s -oi -f%s -t';
}
} else {
if ($this->Mailer == 'qmail') {
$sendmailFmt = '%s';
} else {
$sendmailFmt = '%s -oi -t';
}
}
// TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing.
$sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);
if ($this->SingleTo) {
foreach ($this->SingleToArray as $toAddr) {
if (!@$mail = popen($sendmail, 'w')) {
throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
}
fputs($mail, 'To: ' . $toAddr . "\n");
fputs($mail, $header);
fputs($mail, $body);
$result = pclose($mail);
$this->doCallback(
($result == 0),
array($toAddr),
$this->cc,
$this->bcc,
$this->Subject,
$body,
$this->From
);
if ($result != 0) {
throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
}
}
} else {
if (!@$mail = popen($sendmail, 'w')) {
throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
}
fputs($mail, $header);
fputs($mail, $body);
$result = pclose($mail);
$this->doCallback(
($result == 0),
$this->to,
$this->cc,
$this->bcc,
$this->Subject,
$body,
$this->From
);
if ($result != 0) {
throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
}
}
return true;
}
/**
* Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
*
* Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
* @param string $string The string to be validated
* @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
* @access protected
* @return boolean
*/
protected static function isShellSafe($string)
{
// Future-proof
if (escapeshellcmd($string) !== $string
or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
) {
return false;
}
$length = strlen($string);
for ($i = 0; $i < $length; $i++) {
$c = $string[$i];
// All other characters have a special meaning in at least one common shell, including = and +.
// Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
// Note that this does permit non-Latin alphanumeric characters based on the current locale.
if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
return false;
}
}
return true;
}
/**
* Send mail using the PHP mail() function.
* @param string $header The message headers
* @param string $body The message body
* @link http://www.php.net/manual/en/book.mail.php
* @throws phpmailerException
* @access protected
* @return boolean
*/
protected function mailSend($header, $body)
{
$toArr = array();
foreach ($this->to as $toaddr) {
$toArr[] = $this->addrFormat($toaddr);
}
$to = implode(', ', $toArr);
$params = null;
//This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
// CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
if (self::isShellSafe($this->Sender)) {
$params = sprintf('-f%s', $this->Sender);
}
}
if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
$old_from = ini_get('sendmail_from');
ini_set('sendmail_from', $this->Sender);
}
$result = false;
if ($this->SingleTo and count($toArr) > 1) {
foreach ($toArr as $toAddr) {
$result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
$this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
}
} else {
$result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
$this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
}
if (isset($old_from)) {
ini_set('sendmail_from', $old_from);
}
if (!$result) {
throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
}
return true;
}
/**
* Get an instance to use for SMTP operations.
* Override this function to load your own SMTP implementation
* @return SMTP
*/
public function getSMTPInstance()
{
if (!is_object($this->smtp)) {
$this->smtp = new SMTP;
}
return $this->smtp;
}
/**
* Send mail via SMTP.
* Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
* Uses the PHPMailerSMTP class by default.
* @see PHPMailer::getSMTPInstance() to use a different class.
* @param string $header The message headers
* @param string $body The message body
* @throws phpmailerException
* @uses SMTP
* @access protected
* @return boolean
*/
protected function smtpSend($header, $body)
{
$bad_rcpt = array();
if (!$this->smtpConnect($this->SMTPOptions)) {
throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
}
if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
$smtp_from = $this->Sender;
} else {
$smtp_from = $this->From;
}
if (!$this->smtp->mail($smtp_from)) {
$this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
}
// Attempt to send to all recipients
foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
foreach ($togroup as $to) {
if (!$this->smtp->recipient($to[0])) {
$error = $this->smtp->getError();
$bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
$isSent = false;
} else {
$isSent = true;
}
$this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
}
}
// Only send the DATA command if we have viable recipients
if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
}
if ($this->SMTPKeepAlive) {
$this->smtp->reset();
} else {
$this->smtp->quit();
$this->smtp->close();
}
//Create error message for any bad addresses
if (count($bad_rcpt) > 0) {
$errstr = '';
foreach ($bad_rcpt as $bad) {
$errstr .= $bad['to'] . ': ' . $bad['error'];
}
throw new phpmailerException(
$this->lang('recipients_failed') . $errstr,
self::STOP_CONTINUE
);
}
return true;
}
/**
* Initiate a connection to an SMTP server.
* Returns false if the operation failed.
* @param array $options An array of options compatible with stream_context_create()
* @uses SMTP
* @access public
* @throws phpmailerException
* @return boolean
*/
public function smtpConnect($options = null)
{
if (is_null($this->smtp)) {
$this->smtp = $this->getSMTPInstance();
}
//If no options are provided, use whatever is set in the instance
if (is_null($options)) {
$options = $this->SMTPOptions;
}
// Already connected?
if ($this->smtp->connected()) {
return true;
}
$this->smtp->setTimeout($this->Timeout);
$this->smtp->setDebugLevel($this->SMTPDebug);
$this->smtp->setDebugOutput($this->Debugoutput);
$this->smtp->setVerp($this->do_verp);
$hosts = explode(';', $this->Host);
$lastexception = null;
foreach ($hosts as $hostentry) {
$hostinfo = array();
if (!preg_match(
'/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
trim($hostentry),
$hostinfo
)) {
// Not a valid host entry
$this->edebug('Ignoring invalid host: ' . $hostentry);
continue;
}
// $hostinfo[2]: optional ssl or tls prefix
// $hostinfo[3]: the hostname
// $hostinfo[4]: optional port number
// The host string prefix can temporarily override the current setting for SMTPSecure
// If it's not specified, the default value is used
$prefix = '';
$secure = $this->SMTPSecure;
$tls = ($this->SMTPSecure == 'tls');
if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
$prefix = 'ssl://';
$tls = false; // Can't have SSL and TLS at the same time
$secure = 'ssl';
} elseif ($hostinfo[2] == 'tls') {
$tls = true;
// tls doesn't use a prefix
$secure = 'tls';
}
//Do we need the OpenSSL extension?
$sslext = defined('OPENSSL_ALGO_SHA1');
if ('tls' === $secure or 'ssl' === $secure) {
//Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
if (!$sslext) {
throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
}
}
$host = $hostinfo[3];
$port = $this->Port;
$tport = (integer)$hostinfo[4];
if ($tport > 0 and $tport < 65536) {
$port = $tport;
}
if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
try {
if ($this->Helo) {
$hello = $this->Helo;
} else {
$hello = $this->serverHostname();
}
$this->smtp->hello($hello);
//Automatically enable TLS encryption if:
// * it's not disabled
// * we have openssl extension
// * we are not already using SSL
// * the server offers STARTTLS
if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
$tls = true;
}
if ($tls) {
if (!$this->smtp->startTLS()) {
throw new phpmailerException($this->lang('connect_host'));
}
// We must resend EHLO after TLS negotiation
$this->smtp->hello($hello);
}
if ($this->SMTPAuth) {
if (!$this->smtp->authenticate(
$this->Username,
$this->Password,
$this->AuthType,
$this->Realm,
$this->Workstation
)
) {
throw new phpmailerException($this->lang('authenticate'));
}
}
return true;
} catch (phpmailerException $exc) {
$lastexception = $exc;
$this->edebug($exc->getMessage());
// We must have connected, but then failed TLS or Auth, so close connection nicely
$this->smtp->quit();
}
}
}
// If we get here, all connection attempts have failed, so close connection hard
$this->smtp->close();
// As we've caught all exceptions, just report whatever the last one was
if ($this->exceptions and !is_null($lastexception)) {
throw $lastexception;
}
return false;
}
/**
* Close the active SMTP session if one exists.
* @return void
*/
public function smtpClose()
{
if (is_a($this->smtp, 'SMTP')) {
if ($this->smtp->connected()) {
$this->smtp->quit();
$this->smtp->close();
}
}
}
/**
* Set the language for error messages.
* Returns false if it cannot load the language file.
* The default language is English.
* @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
* @param string $lang_path Path to the language file directory, with trailing separator (slash)
* @return boolean
* @access public
*/
public function setLanguage($langcode = 'en', $lang_path = '')
{
// Backwards compatibility for renamed language codes
$renamed_langcodes = array(
'br' => 'pt_br',
'cz' => 'cs',
'dk' => 'da',
'no' => 'nb',
'se' => 'sv',
'sr' => 'rs'
);
if (isset($renamed_langcodes[$langcode])) {
$langcode = $renamed_langcodes[$langcode];
}
// Define full set of translatable strings in English
$PHPMAILER_LANG = array(
'authenticate' => 'SMTP Error: Could not authenticate.',
'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
'data_not_accepted' => 'SMTP Error: data not accepted.',
'empty_message' => 'Message body empty',
'encoding' => 'Unknown encoding: ',
'execute' => 'Could not execute: ',
'file_access' => 'Could not access file: ',
'file_open' => 'File Error: Could not open file: ',
'from_failed' => 'The following From address failed: ',
'instantiate' => 'Could not instantiate mail function.',
'invalid_address' => 'Invalid address: ',
'mailer_not_supported' => ' mailer is not supported.',
'provide_address' => 'You must provide at least one recipient email address.',
'recipients_failed' => 'SMTP Error: The following recipients failed: ',
'signing' => 'Signing Error: ',
'smtp_connect_failed' => 'SMTP connect() failed.',
'smtp_error' => 'SMTP server error: ',
'variable_set' => 'Cannot set or reset variable: ',
'extension_missing' => 'Extension missing: '
);
if (empty($lang_path)) {
// Calculate an absolute path so it can work if CWD is not here
$lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
}
//Validate $langcode
if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
$langcode = 'en';
}
$foundlang = true;
$lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
// There is no English translation file
if ($langcode != 'en') {
// Make sure language file path is readable
if (!is_readable($lang_file)) {
$foundlang = false;
} else {
// Overwrite language-specific strings.
// This way we'll never have missing translation keys.
$foundlang = include $lang_file;
}
}
$this->language = $PHPMAILER_LANG;
return (boolean)$foundlang; // Returns false if language not found
}
/**
* Get the array of strings for the current language.
* @return array
*/
public function getTranslations()
{
return $this->language;
}
/**
* Create recipient headers.
* @access public
* @param string $type
* @param array $addr An array of recipient,
* where each recipient is a 2-element indexed array with element 0 containing an address
* and element 1 containing a name, like:
* array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
* @return string
*/
public function addrAppend($type, $addr)
{
$addresses = array();
foreach ($addr as $address) {
$addresses[] = $this->addrFormat($address);
}
return $type . ': ' . implode(', ', $addresses) . $this->LE;
}
/**
* Format an address for use in a message header.
* @access public
* @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
* like array('joe@example.com', 'Joe User')
* @return string
*/
public function addrFormat($addr)
{
if (empty($addr[1])) { // No name provided
return $this->secureHeader($addr[0]);
} else {
return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
$addr[0]
) . '>';
}
}
/**
* Word-wrap message.
* For use with mailers that do not automatically perform wrapping
* and for quoted-printable encoded messages.
* Original written by philippe.
* @param string $message The message to wrap
* @param integer $length The line length to wrap to
* @param boolean $qp_mode Whether to run in Quoted-Printable mode
* @access public
* @return string
*/
public function wrapText($message, $length, $qp_mode = false)
{
if ($qp_mode) {
$soft_break = sprintf(' =%s', $this->LE);
} else {
$soft_break = $this->LE;
}
// If utf-8 encoding is used, we will need to make sure we don't
// split multibyte characters when we wrap
$is_utf8 = (strtolower($this->CharSet) == 'utf-8');
$lelen = strlen($this->LE);
$crlflen = strlen(self::CRLF);
$message = $this->fixEOL($message);
//Remove a trailing line break
if (substr($message, -$lelen) == $this->LE) {
$message = substr($message, 0, -$lelen);
}
//Split message into lines
$lines = explode($this->LE, $message);
//Message will be rebuilt in here
$message = '';
foreach ($lines as $line) {
$words = explode(' ', $line);
$buf = '';
$firstword = true;
foreach ($words as $word) {
if ($qp_mode and (strlen($word) > $length)) {
$space_left = $length - strlen($buf) - $crlflen;
if (!$firstword) {
if ($space_left > 20) {
$len = $space_left;
if ($is_utf8) {
$len = $this->utf8CharBoundary($word, $len);
} elseif (substr($word, $len - 1, 1) == '=') {
$len--;
} elseif (substr($word, $len - 2, 1) == '=') {
$len -= 2;
}
$part = substr($word, 0, $len);
$word = substr($word, $len);
$buf .= ' ' . $part;
$message .= $buf . sprintf('=%s', self::CRLF);
} else {
$message .= $buf . $soft_break;
}
$buf = '';
}
while (strlen($word) > 0) {
if ($length <= 0) {
break;
}
$len = $length;
if ($is_utf8) {
$len = $this->utf8CharBoundary($word, $len);
} elseif (substr($word, $len - 1, 1) == '=') {
$len--;
} elseif (substr($word, $len - 2, 1) == '=') {
$len -= 2;
}
$part = substr($word, 0, $len);
$word = substr($word, $len);
if (strlen($word) > 0) {
$message .= $part . sprintf('=%s', self::CRLF);
} else {
$buf = $part;
}
}
} else {
$buf_o = $buf;
if (!$firstword) {
$buf .= ' ';
}
$buf .= $word;
if (strlen($buf) > $length and $buf_o != '') {
$message .= $buf_o . $soft_break;
$buf = $word;
}
}
$firstword = false;
}
$message .= $buf . self::CRLF;
}
return $message;
}
/**
* Find the last character boundary prior to $maxLength in a utf-8
* quoted-printable encoded string.
* Original written by Colin Brown.
* @access public
* @param string $encodedText utf-8 QP text
* @param integer $maxLength Find the last character boundary prior to this length
* @return integer
*/
public function utf8CharBoundary($encodedText, $maxLength)
{
$foundSplitPos = false;
$lookBack = 3;
while (!$foundSplitPos) {
$lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
$encodedCharPos = strpos($lastChunk, '=');
if (false !== $encodedCharPos) {
// Found start of encoded character byte within $lookBack block.
// Check the encoded byte value (the 2 chars after the '=')
$hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
$dec = hexdec($hex);
if ($dec < 128) {
// Single byte character.
// If the encoded char was found at pos 0, it will fit
// otherwise reduce maxLength to start of the encoded char
if ($encodedCharPos > 0) {
$maxLength = $maxLength - ($lookBack - $encodedCharPos);
}
$foundSplitPos = true;
} elseif ($dec >= 192) {
// First byte of a multi byte character
// Reduce maxLength to split at start of character
$maxLength = $maxLength - ($lookBack - $encodedCharPos);
$foundSplitPos = true;
} elseif ($dec < 192) {
// Middle byte of a multi byte character, look further back
$lookBack += 3;
}
} else {
// No encoded character found
$foundSplitPos = true;
}
}
return $maxLength;
}
/**
* Apply word wrapping to the message body.
* Wraps the message body to the number of chars set in the WordWrap property.
* You should only do this to plain-text bodies as wrapping HTML tags may break them.
* This is called automatically by createBody(), so you don't need to call it yourself.
* @access public
* @return void
*/
public function setWordWrap()
{
if ($this->WordWrap < 1) {
return;
}
switch ($this->message_type) {
case 'alt':
case 'alt_inline':
case 'alt_attach':
case 'alt_inline_attach':
$this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
break;
default:
$this->Body = $this->wrapText($this->Body, $this->WordWrap);
break;
}
}
/**
* Assemble message headers.
* @access public
* @return string The assembled headers
*/
public function createHeader()
{
$result = '';
$result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);
// To be created automatically by mail()
if ($this->SingleTo) {
if ($this->Mailer != 'mail') {
foreach ($this->to as $toaddr) {
$this->SingleToArray[] = $this->addrFormat($toaddr);
}
}
} else {
if (count($this->to) > 0) {
if ($this->Mailer != 'mail') {
$result .= $this->addrAppend('To', $this->to);
}
} elseif (count($this->cc) == 0) {
$result .= $this->headerLine('To', 'undisclosed-recipients:;');
}
}
$result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));
// sendmail and mail() extract Cc from the header before sending
if (count($this->cc) > 0) {
$result .= $this->addrAppend('Cc', $this->cc);
}
// sendmail and mail() extract Bcc from the header before sending
if ((
$this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
)
and count($this->bcc) > 0
) {
$result .= $this->addrAppend('Bcc', $this->bcc);
}
if (count($this->ReplyTo) > 0) {
$result .= $this->addrAppend('Reply-To', $this->ReplyTo);
}
// mail() sets the subject itself
if ($this->Mailer != 'mail') {
$result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
}
// Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
// https://tools.ietf.org/html/rfc5322#section-3.6.4
if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
$this->lastMessageID = $this->MessageID;
} else {
$this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
}
$result .= $this->headerLine('Message-ID', $this->lastMessageID);
if (!is_null($this->Priority)) {
$result .= $this->headerLine('X-Priority', $this->Priority);
}
if ($this->XMailer == '') {
$result .= $this->headerLine(
'X-Mailer',
'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
);
} else {
$myXmailer = trim($this->XMailer);
if ($myXmailer) {
$result .= $this->headerLine('X-Mailer', $myXmailer);
}
}
if ($this->ConfirmReadingTo != '') {
$result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
}
// Add custom headers
foreach ($this->CustomHeader as $header) {
$result .= $this->headerLine(
trim($header[0]),
$this->encodeHeader(trim($header[1]))
);
}
if (!$this->sign_key_file) {
$result .= $this->headerLine('MIME-Version', '1.0');
$result .= $this->getMailMIME();
}
return $result;
}
/**
* Get the message MIME type headers.
* @access public
* @return string
*/
public function getMailMIME()
{
$result = '';
$ismultipart = true;
switch ($this->message_type) {
case 'inline':
$result .= $this->headerLine('Content-Type', 'multipart/related;');
$result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
break;
case 'attach':
case 'inline_attach':
case 'alt_attach':
case 'alt_inline_attach':
$result .= $this->headerLine('Content-Type', 'multipart/mixed;');
$result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
break;
case 'alt':
case 'alt_inline':
$result .= $this->headerLine('Content-Type', 'multipart/alternative;');
$result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
break;
default:
// Catches case 'plain': and case '':
$result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
$ismultipart = false;
break;
}
// RFC1341 part 5 says 7bit is assumed if not specified
if ($this->Encoding != '7bit') {
// RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
if ($ismultipart) {
if ($this->Encoding == '8bit') {
$result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
}
// The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
} else {
$result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
}
}
if ($this->Mailer != 'mail') {
$result .= $this->LE;
}
return $result;
}
/**
* Returns the whole MIME message.
* Includes complete headers and body.
* Only valid post preSend().
* @see PHPMailer::preSend()
* @access public
* @return string
*/
public function getSentMIMEMessage()
{
return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
}
/**
* Create unique ID
* @return string
*/
protected function generateId() {
return md5(uniqid(time()));
}
/**
* Assemble the message body.
* Returns an empty string on failure.
* @access public
* @throws phpmailerException
* @return string The assembled message body
*/
public function createBody()
{
$body = '';
//Create unique IDs and preset boundaries
$this->uniqueid = $this->generateId();
$this->boundary[1] = 'b1_' . $this->uniqueid;
$this->boundary[2] = 'b2_' . $this->uniqueid;
$this->boundary[3] = 'b3_' . $this->uniqueid;
if ($this->sign_key_file) {
$body .= $this->getMailMIME() . $this->LE;
}
$this->setWordWrap();
$bodyEncoding = $this->Encoding;
$bodyCharSet = $this->CharSet;
//Can we do a 7-bit downgrade?
if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
$bodyEncoding = '7bit';
//All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
$bodyCharSet = 'us-ascii';
}
//If lines are too long, and we're not already using an encoding that will shorten them,
//change to quoted-printable transfer encoding for the body part only
if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
$bodyEncoding = 'quoted-printable';
}
$altBodyEncoding = $this->Encoding;
$altBodyCharSet = $this->CharSet;
//Can we do a 7-bit downgrade?
if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
$altBodyEncoding = '7bit';
//All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
$altBodyCharSet = 'us-ascii';
}
//If lines are too long, and we're not already using an encoding that will shorten them,
//change to quoted-printable transfer encoding for the alt body part only
if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
$altBodyEncoding = 'quoted-printable';
}
//Use this as a preamble in all multipart message types
$mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
switch ($this->message_type) {
case 'inline':
$body .= $mimepre;
$body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
$body .= $this->encodeString($this->Body, $bodyEncoding);
$body .= $this->LE . $this->LE;
$body .= $this->attachAll('inline', $this->boundary[1]);
break;
case 'attach':
$body .= $mimepre;
$body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
$body .= $this->encodeString($this->Body, $bodyEncoding);
$body .= $this->LE . $this->LE;
$body .= $this->attachAll('attachment', $this->boundary[1]);
break;
case 'inline_attach':
$body .= $mimepre;
$body .= $this->textLine('--' . $this->boundary[1]);
$body .= $this->headerLine('Content-Type', 'multipart/related;');
$body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
$body .= $this->LE;
$body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
$body .= $this->encodeString($this->Body, $bodyEncoding);
$body .= $this->LE . $this->LE;
$body .= $this->attachAll('inline', $this->boundary[2]);
$body .= $this->LE;
$body .= $this->attachAll('attachment', $this->boundary[1]);
break;
case 'alt':
$body .= $mimepre;
$body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
$body .= $this->encodeString($this->AltBody, $altBodyEncoding);
$body .= $this->LE . $this->LE;
$body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
$body .= $this->encodeString($this->Body, $bodyEncoding);
$body .= $this->LE . $this->LE;
if (!empty($this->Ical)) {
$body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
$body .= $this->encodeString($this->Ical, $this->Encoding);
$body .= $this->LE . $this->LE;
}
$body .= $this->endBoundary($this->boundary[1]);
break;
case 'alt_inline':
$body .= $mimepre;
$body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
$body .= $this->encodeString($this->AltBody, $altBodyEncoding);
$body .= $this->LE . $this->LE;
$body .= $this->textLine('--' . $this->boundary[1]);
$body .= $this->headerLine('Content-Type', 'multipart/related;');
$body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
$body .= $this->LE;
$body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
$body .= $this->encodeString($this->Body, $bodyEncoding);
$body .= $this->LE . $this->LE;
$body .= $this->attachAll('inline', $this->boundary[2]);
$body .= $this->LE;
$body .= $this->endBoundary($this->boundary[1]);
break;
case 'alt_attach':
$body .= $mimepre;
$body .= $this->textLine('--' . $this->boundary[1]);
$body .= $this->headerLine('Content-Type', 'multipart/alternative;');
$body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
$body .= $this->LE;
$body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
$body .= $this->encodeString($this->AltBody, $altBodyEncoding);
$body .= $this->LE . $this->LE;
$body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
$body .= $this->encodeString($this->Body, $bodyEncoding);
$body .= $this->LE . $this->LE;
$body .= $this->endBoundary($this->boundary[2]);
$body .= $this->LE;
$body .= $this->attachAll('attachment', $this->boundary[1]);
break;
case 'alt_inline_attach':
$body .= $mimepre;
$body .= $this->textLine('--' . $this->boundary[1]);
$body .= $this->headerLine('Content-Type', 'multipart/alternative;');
$body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
$body .= $this->LE;
$body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
$body .= $this->encodeString($this->AltBody, $altBodyEncoding);
$body .= $this->LE . $this->LE;
$body .= $this->textLine('--' . $this->boundary[2]);
$body .= $this->headerLine('Content-Type', 'multipart/related;');
$body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
$body .= $this->LE;
$body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
$body .= $this->encodeString($this->Body, $bodyEncoding);
$body .= $this->LE . $this->LE;
$body .= $this->attachAll('inline', $this->boundary[3]);
$body .= $this->LE;
$body .= $this->endBoundary($this->boundary[2]);
$body .= $this->LE;
$body .= $this->attachAll('attachment', $this->boundary[1]);
break;
default:
// Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
//Reset the `Encoding` property in case we changed it for line length reasons
$this->Encoding = $bodyEncoding;
$body .= $this->encodeString($this->Body, $this->Encoding);
break;
}
if ($this->isError()) {
$body = '';
} elseif ($this->sign_key_file) {
try {
if (!defined('PKCS7_TEXT')) {
throw new phpmailerException($this->lang('extension_missing') . 'openssl');
}
// @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
$file = tempnam(sys_get_temp_dir(), 'mail');
if (false === file_put_contents($file, $body)) {
throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
}
$signed = tempnam(sys_get_temp_dir(), 'signed');
//Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
if (empty($this->sign_extracerts_file)) {
$sign = @openssl_pkcs7_sign(
$file,
$signed,
'file://' . realpath($this->sign_cert_file),
array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
null
);
} else {
$sign = @openssl_pkcs7_sign(
$file,
$signed,
'file://' . realpath($this->sign_cert_file),
array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
null,
PKCS7_DETACHED,
$this->sign_extracerts_file
);
}
if ($sign) {
@unlink($file);
$body = file_get_contents($signed);
@unlink($signed);
//The message returned by openssl contains both headers and body, so need to split them up
$parts = explode("\n\n", $body, 2);
$this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
$body = $parts[1];
} else {
@unlink($file);
@unlink($signed);
throw new phpmailerException($this->lang('signing') . openssl_error_string());
}
} catch (phpmailerException $exc) {
$body = '';
if ($this->exceptions) {
throw $exc;
}
}
}
return $body;
}
/**
* Return the start of a message boundary.
* @access protected
* @param string $boundary
* @param string $charSet
* @param string $contentType
* @param string $encoding
* @return string
*/
protected function getBoundary($boundary, $charSet, $contentType, $encoding)
{
$result = '';
if ($charSet == '') {
$charSet = $this->CharSet;
}
if ($contentType == '') {
$contentType = $this->ContentType;
}
if ($encoding == '') {
$encoding = $this->Encoding;
}
$result .= $this->textLine('--' . $boundary);
$result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
$result .= $this->LE;
// RFC1341 part 5 says 7bit is assumed if not specified
if ($encoding != '7bit') {
$result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
}
$result .= $this->LE;
return $result;
}
/**
* Return the end of a message boundary.
* @access protected
* @param string $boundary
* @return string
*/
protected function endBoundary($boundary)
{
return $this->LE . '--' . $boundary . '--' . $this->LE;
}
/**
* Set the message type.
* PHPMailer only supports some preset message types, not arbitrary MIME structures.
* @access protected
* @return void
*/
protected function setMessageType()
{
$type = array();
if ($this->alternativeExists()) {
$type[] = 'alt';
}
if ($this->inlineImageExists()) {
$type[] = 'inline';
}
if ($this->attachmentExists()) {
$type[] = 'attach';
}
$this->message_type = implode('_', $type);
if ($this->message_type == '') {
//The 'plain' message_type refers to the message having a single body element, not that it is plain-text
$this->message_type = 'plain';
}
}
/**
* Format a header line.
* @access public
* @param string $name
* @param string $value
* @return string
*/
public function headerLine($name, $value)
{
return $name . ': ' . $value . $this->LE;
}
/**
* Return a formatted mail line.
* @access public
* @param string $value
* @return string
*/
public function textLine($value)
{
return $value . $this->LE;
}
/**
* Add an attachment from a path on the filesystem.
* Never use a user-supplied path to a file!
* Returns false if the file could not be found or read.
* @param string $path Path to the attachment.
* @param string $name Overrides the attachment name.
* @param string $encoding File encoding (see $Encoding).
* @param string $type File extension (MIME) type.
* @param string $disposition Disposition to use
* @throws phpmailerException
* @return boolean
*/
public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
{
try {
if (!@is_file($path)) {
throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
}
// If a MIME type is not specified, try to work it out from the file name
if ($type == '') {
$type = self::filenameToType($path);
}
$filename = basename($path);
if ($name == '') {
$name = $filename;
}
$this->attachment[] = array(
0 => $path,
1 => $filename,
2 => $name,
3 => $encoding,
4 => $type,
5 => false, // isStringAttachment
6 => $disposition,
7 => 0
);
} catch (phpmailerException $exc) {
$this->setError($exc->getMessage());
$this->edebug($exc->getMessage());
if ($this->exceptions) {
throw $exc;
}
return false;
}
return true;
}
/**
* Return the array of attachments.
* @return array
*/
public function getAttachments()
{
return $this->attachment;
}
/**
* Attach all file, string, and binary attachments to the message.
* Returns an empty string on failure.
* @access protected
* @param string $disposition_type
* @param string $boundary
* @return string
*/
protected function attachAll($disposition_type, $boundary)
{
// Return text of body
$mime = array();
$cidUniq = array();
$incl = array();
// Add all attachments
foreach ($this->attachment as $attachment) {
// Check if it is a valid disposition_filter
if ($attachment[6] == $disposition_type) {
// Check for string attachment
$string = '';
$path = '';
$bString = $attachment[5];
if ($bString) {
$string = $attachment[0];
} else {
$path = $attachment[0];
}
$inclhash = md5(serialize($attachment));
if (in_array($inclhash, $incl)) {
continue;
}
$incl[] = $inclhash;
$name = $attachment[2];
$encoding = $attachment[3];
$type = $attachment[4];
$disposition = $attachment[6];
$cid = $attachment[7];
if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
continue;
}
$cidUniq[$cid] = true;
$mime[] = sprintf('--%s%s', $boundary, $this->LE);
//Only include a filename property if we have one
if (!empty($name)) {
$mime[] = sprintf(
'Content-Type: %s; name="%s"%s',
$type,
$this->encodeHeader($this->secureHeader($name)),
$this->LE
);
} else {
$mime[] = sprintf(
'Content-Type: %s%s',
$type,
$this->LE
);
}
// RFC1341 part 5 says 7bit is assumed if not specified
if ($encoding != '7bit') {
$mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
}
if ($disposition == 'inline') {
$mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
}
// If a filename contains any of these chars, it should be quoted,
// but not otherwise: RFC2183 & RFC2045 5.1
// Fixes a warning in IETF's msglint MIME checker
// Allow for bypassing the Content-Disposition header totally
if (!(empty($disposition))) {
$encoded_name = $this->encodeHeader($this->secureHeader($name));
if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
$mime[] = sprintf(
'Content-Disposition: %s; filename="%s"%s',
$disposition,
$encoded_name,
$this->LE . $this->LE
);
} else {
if (!empty($encoded_name)) {
$mime[] = sprintf(
'Content-Disposition: %s; filename=%s%s',
$disposition,
$encoded_name,
$this->LE . $this->LE
);
} else {
$mime[] = sprintf(
'Content-Disposition: %s%s',
$disposition,
$this->LE . $this->LE
);
}
}
} else {
$mime[] = $this->LE;
}
// Encode as string attachment
if ($bString) {
$mime[] = $this->encodeString($string, $encoding);
if ($this->isError()) {
return '';
}
$mime[] = $this->LE . $this->LE;
} else {
$mime[] = $this->encodeFile($path, $encoding);
if ($this->isError()) {
return '';
}
$mime[] = $this->LE . $this->LE;
}
}
}
$mime[] = sprintf('--%s--%s', $boundary, $this->LE);
return implode('', $mime);
}
/**
* Encode a file attachment in requested format.
* Returns an empty string on failure.
* @param string $path The full path to the file
* @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
* @throws phpmailerException
* @access protected
* @return string
*/
protected function encodeFile($path, $encoding = 'base64')
{
try {
if (!is_readable($path)) {
throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
}
$magic_quotes = get_magic_quotes_runtime();
if ($magic_quotes) {
if (version_compare(PHP_VERSION, '5.3.0', '<')) {
set_magic_quotes_runtime(false);
} else {
//Doesn't exist in PHP 5.4, but we don't need to check because
//get_magic_quotes_runtime always returns false in 5.4+
//so it will never get here
ini_set('magic_quotes_runtime', false);
}
}
$file_buffer = file_get_contents($path);
$file_buffer = $this->encodeString($file_buffer, $encoding);
if ($magic_quotes) {
if (version_compare(PHP_VERSION, '5.3.0', '<')) {
set_magic_quotes_runtime($magic_quotes);
} else {
ini_set('magic_quotes_runtime', $magic_quotes);
}
}
return $file_buffer;
} catch (Exception $exc) {
$this->setError($exc->getMessage());
return '';
}
}
/**
* Encode a string in requested format.
* Returns an empty string on failure.
* @param string $str The text to encode
* @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
* @access public
* @return string
*/
public function encodeString($str, $encoding = 'base64')
{
$encoded = '';
switch (strtolower($encoding)) {
case 'base64':
$encoded = chunk_split(base64_encode($str), 76, $this->LE);
break;
case '7bit':
case '8bit':
$encoded = $this->fixEOL($str);
// Make sure it ends with a line break
if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
$encoded .= $this->LE;
}
break;
case 'binary':
$encoded = $str;
break;
case 'quoted-printable':
$encoded = $this->encodeQP($str);
break;
default:
$this->setError($this->lang('encoding') . $encoding);
break;
}
return $encoded;
}
/**
* Encode a header string optimally.
* Picks shortest of Q, B, quoted-printable or none.
* @access public
* @param string $str
* @param string $position
* @return string
*/
public function encodeHeader($str, $position = 'text')
{
$matchcount = 0;
switch (strtolower($position)) {
case 'phrase':
if (!preg_match('/[\200-\377]/', $str)) {
// Can't use addslashes as we don't know the value of magic_quotes_sybase
$encoded = addcslashes($str, "\0..\37\177\\\"");
if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
return ($encoded);
} else {
return ("\"$encoded\"");
}
}
$matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
break;
/** @noinspection PhpMissingBreakStatementInspection */
case 'comment':
$matchcount = preg_match_all('/[()"]/', $str, $matches);
// Intentional fall-through
case 'text':
default:
$matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
break;
}
//There are no chars that need encoding
if ($matchcount == 0) {
return ($str);
}
$maxlen = 75 - 7 - strlen($this->CharSet);
// Try to select the encoding which should produce the shortest output
if ($matchcount > strlen($str) / 3) {
// More than a third of the content will need encoding, so B encoding will be most efficient
$encoding = 'B';
if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
// Use a custom function which correctly encodes and wraps long
// multibyte strings without breaking lines within a character
$encoded = $this->base64EncodeWrapMB($str, "\n");
} else {
$encoded = base64_encode($str);
$maxlen -= $maxlen % 4;
$encoded = trim(chunk_split($encoded, $maxlen, "\n"));
}
} else {
$encoding = 'Q';
$encoded = $this->encodeQ($str, $position);
$encoded = $this->wrapText($encoded, $maxlen, true);
$encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
}
$encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
$encoded = trim(str_replace("\n", $this->LE, $encoded));
return $encoded;
}
/**
* Check if a string contains multi-byte characters.
* @access public
* @param string $str multi-byte text to wrap encode
* @return boolean
*/
public function hasMultiBytes($str)
{
if (function_exists('mb_strlen')) {
return (strlen($str) > mb_strlen($str, $this->CharSet));
} else { // Assume no multibytes (we can't handle without mbstring functions anyway)
return false;
}
}
/**
* Does a string contain any 8-bit chars (in any charset)?
* @param string $text
* @return boolean
*/
public function has8bitChars($text)
{
return (boolean)preg_match('/[\x80-\xFF]/', $text);
}
/**
* Encode and wrap long multibyte strings for mail headers
* without breaking lines within a character.
* Adapted from a function by paravoid
* @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
* @access public
* @param string $str multi-byte text to wrap encode
* @param string $linebreak string to use as linefeed/end-of-line
* @return string
*/
public function base64EncodeWrapMB($str, $linebreak = null)
{
$start = '=?' . $this->CharSet . '?B?';
$end = '?=';
$encoded = '';
if ($linebreak === null) {
$linebreak = $this->LE;
}
$mb_length = mb_strlen($str, $this->CharSet);
// Each line must have length <= 75, including $start and $end
$length = 75 - strlen($start) - strlen($end);
// Average multi-byte ratio
$ratio = $mb_length / strlen($str);
// Base64 has a 4:3 ratio
$avgLength = floor($length * $ratio * .75);
for ($i = 0; $i < $mb_length; $i += $offset) {
$lookBack = 0;
do {
$offset = $avgLength - $lookBack;
$chunk = mb_substr($str, $i, $offset, $this->CharSet);
$chunk = base64_encode($chunk);
$lookBack++;
} while (strlen($chunk) > $length);
$encoded .= $chunk . $linebreak;
}
// Chomp the last linefeed
$encoded = substr($encoded, 0, -strlen($linebreak));
return $encoded;
}
/**
* Encode a string in quoted-printable format.
* According to RFC2045 section 6.7.
* @access public
* @param string $string The text to encode
* @param integer $line_max Number of chars allowed on a line before wrapping
* @return string
* @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
*/
public function encodeQP($string, $line_max = 76)
{
// Use native function if it's available (>= PHP5.3)
if (function_exists('quoted_printable_encode')) {
return quoted_printable_encode($string);
}
// Fall back to a pure PHP implementation
$string = str_replace(
array('%20', '%0D%0A.', '%0D%0A', '%'),
array(' ', "\r\n=2E", "\r\n", '='),
rawurlencode($string)
);
return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
}
/**
* Backward compatibility wrapper for an old QP encoding function that was removed.
* @see PHPMailer::encodeQP()
* @access public
* @param string $string
* @param integer $line_max
* @param boolean $space_conv
* @return string
* @deprecated Use encodeQP instead.
*/
public function encodeQPphp(
$string,
$line_max = 76,
/** @noinspection PhpUnusedParameterInspection */ $space_conv = false
) {
return $this->encodeQP($string, $line_max);
}
/**
* Encode a string using Q encoding.
* @link http://tools.ietf.org/html/rfc2047
* @param string $str the text to encode
* @param string $position Where the text is going to be used, see the RFC for what that means
* @access public
* @return string
*/
public function encodeQ($str, $position = 'text')
{
// There should not be any EOL in the string
$pattern = '';
$encoded = str_replace(array("\r", "\n"), '', $str);
switch (strtolower($position)) {
case 'phrase':
// RFC 2047 section 5.3
$pattern = '^A-Za-z0-9!*+\/ -';
break;
/** @noinspection PhpMissingBreakStatementInspection */
case 'comment':
// RFC 2047 section 5.2
$pattern = '\(\)"';
// intentional fall-through
// for this reason we build the $pattern without including delimiters and []
case 'text':
default:
// RFC 2047 section 5.1
// Replace every high ascii, control, =, ? and _ characters
$pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
break;
}
$matches = array();
if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
// If the string contains an '=', make sure it's the first thing we replace
// so as to avoid double-encoding
$eqkey = array_search('=', $matches[0]);
if (false !== $eqkey) {
unset($matches[0][$eqkey]);
array_unshift($matches[0], '=');
}
foreach (array_unique($matches[0]) as $char) {
$encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
}
}
// Replace every spaces to _ (more readable than =20)
return str_replace(' ', '_', $encoded);
}
/**
* Add a string or binary attachment (non-filesystem).
* This method can be used to attach ascii or binary data,
* such as a BLOB record from a database.
* @param string $string String attachment data.
* @param string $filename Name of the attachment.
* @param string $encoding File encoding (see $Encoding).
* @param string $type File extension (MIME) type.
* @param string $disposition Disposition to use
* @return void
*/
public function addStringAttachment(
$string,
$filename,
$encoding = 'base64',
$type = '',
$disposition = 'attachment'
) {
// If a MIME type is not specified, try to work it out from the file name
if ($type == '') {
$type = self::filenameToType($filename);
}
// Append to $attachment array
$this->attachment[] = array(
0 => $string,
1 => $filename,
2 => basename($filename),
3 => $encoding,
4 => $type,
5 => true, // isStringAttachment
6 => $disposition,
7 => 0
);
}
/**
* Add an embedded (inline) attachment from a file.
* This can include images, sounds, and just about any other document type.
* These differ from 'regular' attachments in that they are intended to be
* displayed inline with the message, not just attached for download.
* This is used in HTML messages that embed the images
* the HTML refers to using the $cid value.
* Never use a user-supplied path to a file!
* @param string $path Path to the attachment.
* @param string $cid Content ID of the attachment; Use this to reference
* the content when using an embedded image in HTML.
* @param string $name Overrides the attachment name.
* @param string $encoding File encoding (see $Encoding).
* @param string $type File MIME type.
* @param string $disposition Disposition to use
* @return boolean True on successfully adding an attachment
*/
public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
{
if (!@is_file($path)) {
$this->setError($this->lang('file_access') . $path);
return false;
}
// If a MIME type is not specified, try to work it out from the file name
if ($type == '') {
$type = self::filenameToType($path);
}
$filename = basename($path);
if ($name == '') {
$name = $filename;
}
// Append to $attachment array
$this->attachment[] = array(
0 => $path,
1 => $filename,
2 => $name,
3 => $encoding,
4 => $type,
5 => false, // isStringAttachment
6 => $disposition,
7 => $cid
);
return true;
}
/**
* Add an embedded stringified attachment.
* This can include images, sounds, and just about any other document type.
* Be sure to set the $type to an image type for images:
* JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
* @param string $string The attachment binary data.
* @param string $cid Content ID of the attachment; Use this to reference
* the content when using an embedded image in HTML.
* @param string $name
* @param string $encoding File encoding (see $Encoding).
* @param string $type MIME type.
* @param string $disposition Disposition to use
* @return boolean True on successfully adding an attachment
*/
public function addStringEmbeddedImage(
$string,
$cid,
$name = '',
$encoding = 'base64',
$type = '',
$disposition = 'inline'
) {
// If a MIME type is not specified, try to work it out from the name
if ($type == '' and !empty($name)) {
$type = self::filenameToType($name);
}
// Append to $attachment array
$this->attachment[] = array(
0 => $string,
1 => $name,
2 => $name,
3 => $encoding,
4 => $type,
5 => true, // isStringAttachment
6 => $disposition,
7 => $cid
);
return true;
}
/**
* Check if an inline attachment is present.
* @access public
* @return boolean
*/
public function inlineImageExists()
{
foreach ($this->attachment as $attachment) {
if ($attachment[6] == 'inline') {
return true;
}
}
return false;
}
/**
* Check if an attachment (non-inline) is present.
* @return boolean
*/
public function attachmentExists()
{
foreach ($this->attachment as $attachment) {
if ($attachment[6] == 'attachment') {
return true;
}
}
return false;
}
/**
* Check if this message has an alternative body set.
* @return boolean
*/
public function alternativeExists()
{
return !empty($this->AltBody);
}
/**
* Clear queued addresses of given kind.
* @access protected
* @param string $kind 'to', 'cc', or 'bcc'
* @return void
*/
public function clearQueuedAddresses($kind)
{
$RecipientsQueue = $this->RecipientsQueue;
foreach ($RecipientsQueue as $address => $params) {
if ($params[0] == $kind) {
unset($this->RecipientsQueue[$address]);
}
}
}
/**
* Clear all To recipients.
* @return void
*/
public function clearAddresses()
{
foreach ($this->to as $to) {
unset($this->all_recipients[strtolower($to[0])]);
}
$this->to = array();
$this->clearQueuedAddresses('to');
}
/**
* Clear all CC recipients.
* @return void
*/
public function clearCCs()
{
foreach ($this->cc as $cc) {
unset($this->all_recipients[strtolower($cc[0])]);
}
$this->cc = array();
$this->clearQueuedAddresses('cc');
}
/**
* Clear all BCC recipients.
* @return void
*/
public function clearBCCs()
{
foreach ($this->bcc as $bcc) {
unset($this->all_recipients[strtolower($bcc[0])]);
}
$this->bcc = array();
$this->clearQueuedAddresses('bcc');
}
/**
* Clear all ReplyTo recipients.
* @return void
*/
public function clearReplyTos()
{
$this->ReplyTo = array();
$this->ReplyToQueue = array();
}
/**
* Clear all recipient types.
* @return void
*/
public function clearAllRecipients()
{
$this->to = array();
$this->cc = array();
$this->bcc = array();
$this->all_recipients = array();
$this->RecipientsQueue = array();
}
/**
* Clear all filesystem, string, and binary attachments.
* @return void
*/
public function clearAttachments()
{
$this->attachment = array();
}
/**
* Clear all custom headers.
* @return void
*/
public function clearCustomHeaders()
{
$this->CustomHeader = array();
}
/**
* Add an error message to the error container.
* @access protected
* @param string $msg
* @return void
*/
protected function setError($msg)
{
$this->error_count++;
if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
$lasterror = $this->smtp->getError();
if (!empty($lasterror['error'])) {
$msg .= $this->lang('smtp_error') . $lasterror['error'];
if (!empty($lasterror['detail'])) {
$msg .= ' Detail: '. $lasterror['detail'];
}
if (!empty($lasterror['smtp_code'])) {
$msg .= ' SMTP code: ' . $lasterror['smtp_code'];
}
if (!empty($lasterror['smtp_code_ex'])) {
$msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
}
}
}
$this->ErrorInfo = $msg;
}
/**
* Return an RFC 822 formatted date.
* @access public
* @return string
* @static
*/
public static function rfcDate()
{
// Set the time zone to whatever the default is to avoid 500 errors
// Will default to UTC if it's not set properly in php.ini
date_default_timezone_set(@date_default_timezone_get());
return date('D, j M Y H:i:s O');
}
/**
* Get the server hostname.
* Returns 'localhost.localdomain' if unknown.
* @access protected
* @return string
*/
protected function serverHostname()
{
$result = 'localhost.localdomain';
if (!empty($this->Hostname)) {
$result = $this->Hostname;
} elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
$result = $_SERVER['SERVER_NAME'];
} elseif (function_exists('gethostname') && gethostname() !== false) {
$result = gethostname();
} elseif (php_uname('n') !== false) {
$result = php_uname('n');
}
return $result;
}
/**
* Get an error message in the current language.
* @access protected
* @param string $key
* @return string
*/
protected function lang($key)
{
if (count($this->language) < 1) {
$this->setLanguage('en'); // set the default language
}
if (array_key_exists($key, $this->language)) {
if ($key == 'smtp_connect_failed') {
//Include a link to troubleshooting docs on SMTP connection failure
//this is by far the biggest cause of support questions
//but it's usually not PHPMailer's fault.
return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
}
return $this->language[$key];
} else {
//Return the key as a fallback
return $key;
}
}
/**
* Check if an error occurred.
* @access public
* @return boolean True if an error did occur.
*/
public function isError()
{
return ($this->error_count > 0);
}
/**
* Ensure consistent line endings in a string.
* Changes every end of line from CRLF, CR or LF to $this->LE.
* @access public
* @param string $str String to fixEOL
* @return string
*/
public function fixEOL($str)
{
// Normalise to \n
$nstr = str_replace(array("\r\n", "\r"), "\n", $str);
// Now convert LE as needed
if ($this->LE !== "\n") {
$nstr = str_replace("\n", $this->LE, $nstr);
}
return $nstr;
}
/**
* Add a custom header.
* $name value can be overloaded to contain
* both header name and value (name:value)
* @access public
* @param string $name Custom header name
* @param string $value Header value
* @return void
*/
public function addCustomHeader($name, $value = null)
{
if ($value === null) {
// Value passed in as name:value
$this->CustomHeader[] = explode(':', $name, 2);
} else {
$this->CustomHeader[] = array($name, $value);
}
}
/**
* Returns all custom headers.
* @return array
*/
public function getCustomHeaders()
{
return $this->CustomHeader;
}
/**
* Create a message body from an HTML string.
* Automatically inlines images and creates a plain-text version by converting the HTML,
* overwriting any existing values in Body and AltBody.
* Do not source $message content from user input!
* $basedir is prepended when handling relative URLs, e.g. and must not be empty
* will look for an image file in $basedir/images/a.png and convert it to inline.
* If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)
* If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.
* @access public
* @param string $message HTML message string
* @param string $basedir Absolute path to a base directory to prepend to relative paths to images
* @param boolean|callable $advanced Whether to use the internal HTML to text converter
* or your own custom converter @see PHPMailer::html2text()
* @return string $message The transformed message Body
*/
public function msgHTML($message, $basedir = '', $advanced = false)
{
preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
if (array_key_exists(2, $images)) {
if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
// Ensure $basedir has a trailing /
$basedir .= '/';
}
foreach ($images[2] as $imgindex => $url) {
// Convert data URIs into embedded images
if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
$data = substr($url, strpos($url, ','));
if ($match[2]) {
$data = base64_decode($data);
} else {
$data = rawurldecode($data);
}
$cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
$message = str_replace(
$images[0][$imgindex],
$images[1][$imgindex] . '="cid:' . $cid . '"',
$message
);
}
continue;
}
if (
// Only process relative URLs if a basedir is provided (i.e. no absolute local paths)
!empty($basedir)
// Ignore URLs containing parent dir traversal (..)
&& (strpos($url, '..') === false)
// Do not change urls that are already inline images
&& substr($url, 0, 4) !== 'cid:'
// Do not change absolute URLs, including anonymous protocol
&& !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
) {
$filename = basename($url);
$directory = dirname($url);
if ($directory == '.') {
$directory = '';
}
$cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
if (strlen($directory) > 1 && substr($directory, -1) != '/') {
$directory .= '/';
}
if ($this->addEmbeddedImage(
$basedir . $directory . $filename,
$cid,
$filename,
'base64',
self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
)
) {
$message = preg_replace(
'/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
$images[1][$imgindex] . '="cid:' . $cid . '"',
$message
);
}
}
}
}
$this->isHTML(true);
// Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
$this->Body = $this->normalizeBreaks($message);
$this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
if (!$this->alternativeExists()) {
$this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
self::CRLF . self::CRLF;
}
return $this->Body;
}
/**
* Convert an HTML string into plain text.
* This is used by msgHTML().
* Note - older versions of this function used a bundled advanced converter
* which was been removed for license reasons in #232.
* Example usage:
*
* // Use default conversion
* $plain = $mail->html2text($html);
* // Use your own custom converter
* $plain = $mail->html2text($html, function($html) {
* $converter = new MyHtml2text($html);
* return $converter->get_text();
* });
*
* @param string $html The HTML text to convert
* @param boolean|callable $advanced Any boolean value to use the internal converter,
* or provide your own callable for custom conversion.
* @return string
*/
public function html2text($html, $advanced = false)
{
if (is_callable($advanced)) {
return call_user_func($advanced, $html);
}
return html_entity_decode(
trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
ENT_QUOTES,
$this->CharSet
);
}
/**
* Get the MIME type for a file extension.
* @param string $ext File extension
* @access public
* @return string MIME type of file.
* @static
*/
public static function _mime_types($ext = '')
{
$mimes = array(
'xl' => 'application/excel',
'js' => 'application/javascript',
'hqx' => 'application/mac-binhex40',
'cpt' => 'application/mac-compactpro',
'bin' => 'application/macbinary',
'doc' => 'application/msword',
'word' => 'application/msword',
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
'class' => 'application/octet-stream',
'dll' => 'application/octet-stream',
'dms' => 'application/octet-stream',
'exe' => 'application/octet-stream',
'lha' => 'application/octet-stream',
'lzh' => 'application/octet-stream',
'psd' => 'application/octet-stream',
'sea' => 'application/octet-stream',
'so' => 'application/octet-stream',
'oda' => 'application/oda',
'pdf' => 'application/pdf',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'smi' => 'application/smil',
'smil' => 'application/smil',
'mif' => 'application/vnd.mif',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'wbxml' => 'application/vnd.wap.wbxml',
'wmlc' => 'application/vnd.wap.wmlc',
'dcr' => 'application/x-director',
'dir' => 'application/x-director',
'dxr' => 'application/x-director',
'dvi' => 'application/x-dvi',
'gtar' => 'application/x-gtar',
'php3' => 'application/x-httpd-php',
'php4' => 'application/x-httpd-php',
'php' => 'application/x-httpd-php',
'phtml' => 'application/x-httpd-php',
'phps' => 'application/x-httpd-php-source',
'swf' => 'application/x-shockwave-flash',
'sit' => 'application/x-stuffit',
'tar' => 'application/x-tar',
'tgz' => 'application/x-tar',
'xht' => 'application/xhtml+xml',
'xhtml' => 'application/xhtml+xml',
'zip' => 'application/zip',
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'mp2' => 'audio/mpeg',
'mp3' => 'audio/mpeg',
'mpga' => 'audio/mpeg',
'aif' => 'audio/x-aiff',
'aifc' => 'audio/x-aiff',
'aiff' => 'audio/x-aiff',
'ram' => 'audio/x-pn-realaudio',
'rm' => 'audio/x-pn-realaudio',
'rpm' => 'audio/x-pn-realaudio-plugin',
'ra' => 'audio/x-realaudio',
'wav' => 'audio/x-wav',
'bmp' => 'image/bmp',
'gif' => 'image/gif',
'jpeg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'jpg' => 'image/jpeg',
'png' => 'image/png',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'eml' => 'message/rfc822',
'css' => 'text/css',
'html' => 'text/html',
'htm' => 'text/html',
'shtml' => 'text/html',
'log' => 'text/plain',
'text' => 'text/plain',
'txt' => 'text/plain',
'rtx' => 'text/richtext',
'rtf' => 'text/rtf',
'vcf' => 'text/vcard',
'vcard' => 'text/vcard',
'xml' => 'text/xml',
'xsl' => 'text/xml',
'mpeg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mov' => 'video/quicktime',
'qt' => 'video/quicktime',
'rv' => 'video/vnd.rn-realvideo',
'avi' => 'video/x-msvideo',
'movie' => 'video/x-sgi-movie'
);
if (array_key_exists(strtolower($ext), $mimes)) {
return $mimes[strtolower($ext)];
}
return 'application/octet-stream';
}
/**
* Map a file name to a MIME type.
* Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
* @param string $filename A file name or full path, does not need to exist as a file
* @return string
* @static
*/
public static function filenameToType($filename)
{
// In case the path is a URL, strip any query string before getting extension
$qpos = strpos($filename, '?');
if (false !== $qpos) {
$filename = substr($filename, 0, $qpos);
}
$pathinfo = self::mb_pathinfo($filename);
return self::_mime_types($pathinfo['extension']);
}
/**
* Multi-byte-safe pathinfo replacement.
* Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
* Works similarly to the one in PHP >= 5.2.0
* @link http://www.php.net/manual/en/function.pathinfo.php#107461
* @param string $path A filename or path, does not need to exist as a file
* @param integer|string $options Either a PATHINFO_* constant,
* or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
* @return string|array
* @static
*/
public static function mb_pathinfo($path, $options = null)
{
$ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
$pathinfo = array();
if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
if (array_key_exists(1, $pathinfo)) {
$ret['dirname'] = $pathinfo[1];
}
if (array_key_exists(2, $pathinfo)) {
$ret['basename'] = $pathinfo[2];
}
if (array_key_exists(5, $pathinfo)) {
$ret['extension'] = $pathinfo[5];
}
if (array_key_exists(3, $pathinfo)) {
$ret['filename'] = $pathinfo[3];
}
}
switch ($options) {
case PATHINFO_DIRNAME:
case 'dirname':
return $ret['dirname'];
case PATHINFO_BASENAME:
case 'basename':
return $ret['basename'];
case PATHINFO_EXTENSION:
case 'extension':
return $ret['extension'];
case PATHINFO_FILENAME:
case 'filename':
return $ret['filename'];
default:
return $ret;
}
}
/**
* Set or reset instance properties.
* You should avoid this function - it's more verbose, less efficient, more error-prone and
* harder to debug than setting properties directly.
* Usage Example:
* `$mail->set('SMTPSecure', 'tls');`
* is the same as:
* `$mail->SMTPSecure = 'tls';`
* @access public
* @param string $name The property name to set
* @param mixed $value The value to set the property to
* @return boolean
* @TODO Should this not be using the __set() magic function?
*/
public function set($name, $value = '')
{
if (property_exists($this, $name)) {
$this->$name = $value;
return true;
} else {
$this->setError($this->lang('variable_set') . $name);
return false;
}
}
/**
* Strip newlines to prevent header injection.
* @access public
* @param string $str
* @return string
*/
public function secureHeader($str)
{
return trim(str_replace(array("\r", "\n"), '', $str));
}
/**
* Normalize line breaks in a string.
* Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
* Defaults to CRLF (for message bodies) and preserves consecutive breaks.
* @param string $text
* @param string $breaktype What kind of line break to use, defaults to CRLF
* @return string
* @access public
* @static
*/
public static function normalizeBreaks($text, $breaktype = "\r\n")
{
return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
}
/**
* Set the public and private key files and password for S/MIME signing.
* @access public
* @param string $cert_filename
* @param string $key_filename
* @param string $key_pass Password for private key
* @param string $extracerts_filename Optional path to chain certificate
*/
public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
{
$this->sign_cert_file = $cert_filename;
$this->sign_key_file = $key_filename;
$this->sign_key_pass = $key_pass;
$this->sign_extracerts_file = $extracerts_filename;
}
/**
* Quoted-Printable-encode a DKIM header.
* @access public
* @param string $txt
* @return string
*/
public function DKIM_QP($txt)
{
$line = '';
for ($i = 0; $i < strlen($txt); $i++) {
$ord = ord($txt[$i]);
if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
$line .= $txt[$i];
} else {
$line .= '=' . sprintf('%02X', $ord);
}
}
return $line;
}
/**
* Generate a DKIM signature.
* @access public
* @param string $signHeader
* @throws phpmailerException
* @return string The DKIM signature value
*/
public function DKIM_Sign($signHeader)
{
if (!defined('PKCS7_TEXT')) {
if ($this->exceptions) {
throw new phpmailerException($this->lang('extension_missing') . 'openssl');
}
return '';
}
$privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
if ('' != $this->DKIM_passphrase) {
$privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
} else {
$privKey = openssl_pkey_get_private($privKeyStr);
}
//Workaround for missing digest algorithms in old PHP & OpenSSL versions
//@link http://stackoverflow.com/a/11117338/333340
if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
openssl_pkey_free($privKey);
return base64_encode($signature);
}
} else {
$pinfo = openssl_pkey_get_details($privKey);
$hash = hash('sha256', $signHeader);
//'Magic' constant for SHA256 from RFC3447
//@link https://tools.ietf.org/html/rfc3447#page-43
$t = '3031300d060960864801650304020105000420' . $hash;
$pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
$eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);
if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
openssl_pkey_free($privKey);
return base64_encode($signature);
}
}
openssl_pkey_free($privKey);
return '';
}
/**
* Generate a DKIM canonicalization header.
* @access public
* @param string $signHeader Header
* @return string
*/
public function DKIM_HeaderC($signHeader)
{
$signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
$lines = explode("\r\n", $signHeader);
foreach ($lines as $key => $line) {
list($heading, $value) = explode(':', $line, 2);
$heading = strtolower($heading);
$value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
$lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
}
$signHeader = implode("\r\n", $lines);
return $signHeader;
}
/**
* Generate a DKIM canonicalization body.
* @access public
* @param string $body Message Body
* @return string
*/
public function DKIM_BodyC($body)
{
if ($body == '') {
return "\r\n";
}
// stabilize line endings
$body = str_replace("\r\n", "\n", $body);
$body = str_replace("\n", "\r\n", $body);
// END stabilize line endings
while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
$body = substr($body, 0, strlen($body) - 2);
}
return $body;
}
/**
* Create the DKIM header and body in a new message header.
* @access public
* @param string $headers_line Header lines
* @param string $subject Subject
* @param string $body Body
* @return string
*/
public function DKIM_Add($headers_line, $subject, $body)
{
$DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
$DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
$DKIMquery = 'dns/txt'; // Query method
$DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
$subject_header = "Subject: $subject";
$headers = explode($this->LE, $headers_line);
$from_header = '';
$to_header = '';
$date_header = '';
$current = '';
foreach ($headers as $header) {
if (strpos($header, 'From:') === 0) {
$from_header = $header;
$current = 'from_header';
} elseif (strpos($header, 'To:') === 0) {
$to_header = $header;
$current = 'to_header';
} elseif (strpos($header, 'Date:') === 0) {
$date_header = $header;
$current = 'date_header';
} else {
if (!empty($$current) && strpos($header, ' =?') === 0) {
$$current .= $header;
} else {
$current = '';
}
}
}
$from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
$to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
$date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
$subject = str_replace(
'|',
'=7C',
$this->DKIM_QP($subject_header)
); // Copied header fields (dkim-quoted-printable)
$body = $this->DKIM_BodyC($body);
$DKIMlen = strlen($body); // Length of body
$DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
if ('' == $this->DKIM_identity) {
$ident = '';
} else {
$ident = ' i=' . $this->DKIM_identity . ';';
}
$dkimhdrs = 'DKIM-Signature: v=1; a=' .
$DKIMsignatureType . '; q=' .
$DKIMquery . '; l=' .
$DKIMlen . '; s=' .
$this->DKIM_selector .
";\r\n" .
"\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
"\th=From:To:Date:Subject;\r\n" .
"\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
"\tz=$from\r\n" .
"\t|$to\r\n" .
"\t|$date\r\n" .
"\t|$subject;\r\n" .
"\tbh=" . $DKIMb64 . ";\r\n" .
"\tb=";
$toSign = $this->DKIM_HeaderC(
$from_header . "\r\n" .
$to_header . "\r\n" .
$date_header . "\r\n" .
$subject_header . "\r\n" .
$dkimhdrs
);
$signed = $this->DKIM_Sign($toSign);
return $dkimhdrs . $signed . "\r\n";
}
/**
* Detect if a string contains a line longer than the maximum line length allowed.
* @param string $str
* @return boolean
* @static
*/
public static function hasLineLongerThanMax($str)
{
//+2 to include CRLF line break for a 1000 total
return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
}
/**
* Allows for public read access to 'to' property.
* @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
* @access public
* @return array
*/
public function getToAddresses()
{
return $this->to;
}
/**
* Allows for public read access to 'cc' property.
* @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
* @access public
* @return array
*/
public function getCcAddresses()
{
return $this->cc;
}
/**
* Allows for public read access to 'bcc' property.
* @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
* @access public
* @return array
*/
public function getBccAddresses()
{
return $this->bcc;
}
/**
* Allows for public read access to 'ReplyTo' property.
* @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
* @access public
* @return array
*/
public function getReplyToAddresses()
{
return $this->ReplyTo;
}
/**
* Allows for public read access to 'all_recipients' property.
* @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
* @access public
* @return array
*/
public function getAllRecipientAddresses()
{
return $this->all_recipients;
}
/**
* Perform a callback.
* @param boolean $isSent
* @param array $to
* @param array $cc
* @param array $bcc
* @param string $subject
* @param string $body
* @param string $from
*/
protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
{
if (!empty($this->action_function) && is_callable($this->action_function)) {
$params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
call_user_func_array($this->action_function, $params);
}
}
}
/**
* PHPMailer exception handler
* @package PHPMailer
*/
class phpmailerException extends Exception
{
/**
* Prettify error message output
* @return string
*/
public function errorMessage()
{
$errorMsg = '' . htmlspecialchars($this->getMessage()) . " \n";
return $errorMsg;
}
}
================================================
FILE: frphp/extend/PHPMailer/class.phpmaileroauth.php
================================================
* @author Jim Jagielski (jimjag)
* @author Andy Prevost (codeworxtech)
* @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2014 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*/
/**
* PHPMailerOAuth - PHPMailer subclass adding OAuth support.
* @package PHPMailer
* @author @sherryl4george
* @author Marcus Bointon (@Synchro)
*/
class PHPMailerOAuth extends PHPMailer
{
/**
* The OAuth user's email address
* @var string
*/
public $oauthUserEmail = '';
/**
* The OAuth refresh token
* @var string
*/
public $oauthRefreshToken = '';
/**
* The OAuth client ID
* @var string
*/
public $oauthClientId = '';
/**
* The OAuth client secret
* @var string
*/
public $oauthClientSecret = '';
/**
* An instance of the PHPMailerOAuthGoogle class.
* @var PHPMailerOAuthGoogle
* @access protected
*/
protected $oauth = null;
/**
* Get a PHPMailerOAuthGoogle instance to use.
* @return PHPMailerOAuthGoogle
*/
public function getOAUTHInstance()
{
if (!is_object($this->oauth)) {
$this->oauth = new PHPMailerOAuthGoogle(
$this->oauthUserEmail,
$this->oauthClientSecret,
$this->oauthClientId,
$this->oauthRefreshToken
);
}
return $this->oauth;
}
/**
* Initiate a connection to an SMTP server.
* Overrides the original smtpConnect method to add support for OAuth.
* @param array $options An array of options compatible with stream_context_create()
* @uses SMTP
* @access public
* @return bool
* @throws phpmailerException
*/
public function smtpConnect($options = array())
{
if (is_null($this->smtp)) {
$this->smtp = $this->getSMTPInstance();
}
if (is_null($this->oauth)) {
$this->oauth = $this->getOAUTHInstance();
}
// Already connected?
if ($this->smtp->connected()) {
return true;
}
$this->smtp->setTimeout($this->Timeout);
$this->smtp->setDebugLevel($this->SMTPDebug);
$this->smtp->setDebugOutput($this->Debugoutput);
$this->smtp->setVerp($this->do_verp);
$hosts = explode(';', $this->Host);
$lastexception = null;
foreach ($hosts as $hostentry) {
$hostinfo = array();
if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {
// Not a valid host entry
continue;
}
// $hostinfo[2]: optional ssl or tls prefix
// $hostinfo[3]: the hostname
// $hostinfo[4]: optional port number
// The host string prefix can temporarily override the current setting for SMTPSecure
// If it's not specified, the default value is used
$prefix = '';
$secure = $this->SMTPSecure;
$tls = ($this->SMTPSecure == 'tls');
if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
$prefix = 'ssl://';
$tls = false; // Can't have SSL and TLS at the same time
$secure = 'ssl';
} elseif ($hostinfo[2] == 'tls') {
$tls = true;
// tls doesn't use a prefix
$secure = 'tls';
}
//Do we need the OpenSSL extension?
$sslext = defined('OPENSSL_ALGO_SHA1');
if ('tls' === $secure or 'ssl' === $secure) {
//Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
if (!$sslext) {
throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
}
}
$host = $hostinfo[3];
$port = $this->Port;
$tport = (integer)$hostinfo[4];
if ($tport > 0 and $tport < 65536) {
$port = $tport;
}
if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
try {
if ($this->Helo) {
$hello = $this->Helo;
} else {
$hello = $this->serverHostname();
}
$this->smtp->hello($hello);
//Automatically enable TLS encryption if:
// * it's not disabled
// * we have openssl extension
// * we are not already using SSL
// * the server offers STARTTLS
if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
$tls = true;
}
if ($tls) {
if (!$this->smtp->startTLS()) {
throw new phpmailerException($this->lang('connect_host'));
}
// We must resend HELO after tls negotiation
$this->smtp->hello($hello);
}
if ($this->SMTPAuth) {
if (!$this->smtp->authenticate(
$this->Username,
$this->Password,
$this->AuthType,
$this->Realm,
$this->Workstation,
$this->oauth
)
) {
throw new phpmailerException($this->lang('authenticate'));
}
}
return true;
} catch (phpmailerException $exc) {
$lastexception = $exc;
$this->edebug($exc->getMessage());
// We must have connected, but then failed TLS or Auth, so close connection nicely
$this->smtp->quit();
}
}
}
// If we get here, all connection attempts have failed, so close connection hard
$this->smtp->close();
// As we've caught all exceptions, just report whatever the last one was
if ($this->exceptions and !is_null($lastexception)) {
throw $lastexception;
}
return false;
}
}
================================================
FILE: frphp/extend/PHPMailer/class.phpmaileroauthgoogle.php
================================================
* @author Jim Jagielski (jimjag)
* @author Andy Prevost (codeworxtech)
* @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2014 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*/
/**
* PHPMailerOAuthGoogle - Wrapper for League OAuth2 Google provider.
* @package PHPMailer
* @author @sherryl4george
* @author Marcus Bointon (@Synchro)
* @link https://github.com/thephpleague/oauth2-client
*/
class PHPMailerOAuthGoogle
{
private $oauthUserEmail = '';
private $oauthRefreshToken = '';
private $oauthClientId = '';
private $oauthClientSecret = '';
/**
* @param string $UserEmail
* @param string $ClientSecret
* @param string $ClientId
* @param string $RefreshToken
*/
public function __construct(
$UserEmail,
$ClientSecret,
$ClientId,
$RefreshToken
) {
$this->oauthClientId = $ClientId;
$this->oauthClientSecret = $ClientSecret;
$this->oauthRefreshToken = $RefreshToken;
$this->oauthUserEmail = $UserEmail;
}
private function getProvider()
{
return new League\OAuth2\Client\Provider\Google([
'clientId' => $this->oauthClientId,
'clientSecret' => $this->oauthClientSecret
]);
}
private function getGrant()
{
return new \League\OAuth2\Client\Grant\RefreshToken();
}
private function getToken()
{
$provider = $this->getProvider();
$grant = $this->getGrant();
return $provider->getAccessToken($grant, ['refresh_token' => $this->oauthRefreshToken]);
}
public function getOauth64()
{
$token = $this->getToken();
return base64_encode("user=" . $this->oauthUserEmail . "\001auth=Bearer " . $token . "\001\001");
}
}
================================================
FILE: frphp/extend/PHPMailer/class.pop3.php
================================================
* @author Jim Jagielski (jimjag)
* @author Andy Prevost (codeworxtech)
* @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2014 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*/
/**
* PHPMailer POP-Before-SMTP Authentication Class.
* Specifically for PHPMailer to use for RFC1939 POP-before-SMTP authentication.
* Does not support APOP.
* @package PHPMailer
* @author Richard Davey (original author)
* @author Marcus Bointon (Synchro/coolbru)
* @author Jim Jagielski (jimjag)
* @author Andy Prevost (codeworxtech)
*/
class POP3
{
/**
* The POP3 PHPMailer Version number.
* @var string
* @access public
*/
public $Version = '5.2.24';
/**
* Default POP3 port number.
* @var integer
* @access public
*/
public $POP3_PORT = 110;
/**
* Default timeout in seconds.
* @var integer
* @access public
*/
public $POP3_TIMEOUT = 30;
/**
* POP3 Carriage Return + Line Feed.
* @var string
* @access public
* @deprecated Use the constant instead
*/
public $CRLF = "\r\n";
/**
* Debug display level.
* Options: 0 = no, 1+ = yes
* @var integer
* @access public
*/
public $do_debug = 0;
/**
* POP3 mail server hostname.
* @var string
* @access public
*/
public $host;
/**
* POP3 port number.
* @var integer
* @access public
*/
public $port;
/**
* POP3 Timeout Value in seconds.
* @var integer
* @access public
*/
public $tval;
/**
* POP3 username
* @var string
* @access public
*/
public $username;
/**
* POP3 password.
* @var string
* @access public
*/
public $password;
/**
* Resource handle for the POP3 connection socket.
* @var resource
* @access protected
*/
protected $pop_conn;
/**
* Are we connected?
* @var boolean
* @access protected
*/
protected $connected = false;
/**
* Error container.
* @var array
* @access protected
*/
protected $errors = array();
/**
* Line break constant
*/
const CRLF = "\r\n";
/**
* Simple static wrapper for all-in-one POP before SMTP
* @param $host
* @param integer|boolean $port The port number to connect to
* @param integer|boolean $timeout The timeout value
* @param string $username
* @param string $password
* @param integer $debug_level
* @return boolean
*/
public static function popBeforeSmtp(
$host,
$port = false,
$timeout = false,
$username = '',
$password = '',
$debug_level = 0
) {
$pop = new POP3;
return $pop->authorise($host, $port, $timeout, $username, $password, $debug_level);
}
/**
* Authenticate with a POP3 server.
* A connect, login, disconnect sequence
* appropriate for POP-before SMTP authorisation.
* @access public
* @param string $host The hostname to connect to
* @param integer|boolean $port The port number to connect to
* @param integer|boolean $timeout The timeout value
* @param string $username
* @param string $password
* @param integer $debug_level
* @return boolean
*/
public function authorise($host, $port = false, $timeout = false, $username = '', $password = '', $debug_level = 0)
{
$this->host = $host;
// If no port value provided, use default
if (false === $port) {
$this->port = $this->POP3_PORT;
} else {
$this->port = (integer)$port;
}
// If no timeout value provided, use default
if (false === $timeout) {
$this->tval = $this->POP3_TIMEOUT;
} else {
$this->tval = (integer)$timeout;
}
$this->do_debug = $debug_level;
$this->username = $username;
$this->password = $password;
// Reset the error log
$this->errors = array();
// connect
$result = $this->connect($this->host, $this->port, $this->tval);
if ($result) {
$login_result = $this->login($this->username, $this->password);
if ($login_result) {
$this->disconnect();
return true;
}
}
// We need to disconnect regardless of whether the login succeeded
$this->disconnect();
return false;
}
/**
* Connect to a POP3 server.
* @access public
* @param string $host
* @param integer|boolean $port
* @param integer $tval
* @return boolean
*/
public function connect($host, $port = false, $tval = 30)
{
// Are we already connected?
if ($this->connected) {
return true;
}
//On Windows this will raise a PHP Warning error if the hostname doesn't exist.
//Rather than suppress it with @fsockopen, capture it cleanly instead
set_error_handler(array($this, 'catchWarning'));
if (false === $port) {
$port = $this->POP3_PORT;
}
// connect to the POP3 server
$this->pop_conn = fsockopen(
$host, // POP3 Host
$port, // Port #
$errno, // Error Number
$errstr, // Error Message
$tval
); // Timeout (seconds)
// Restore the error handler
restore_error_handler();
// Did we connect?
if (false === $this->pop_conn) {
// It would appear not...
$this->setError(array(
'error' => "Failed to connect to server $host on port $port",
'errno' => $errno,
'errstr' => $errstr
));
return false;
}
// Increase the stream time-out
stream_set_timeout($this->pop_conn, $tval, 0);
// Get the POP3 server response
$pop3_response = $this->getResponse();
// Check for the +OK
if ($this->checkResponse($pop3_response)) {
// The connection is established and the POP3 server is talking
$this->connected = true;
return true;
}
return false;
}
/**
* Log in to the POP3 server.
* Does not support APOP (RFC 2828, 4949).
* @access public
* @param string $username
* @param string $password
* @return boolean
*/
public function login($username = '', $password = '')
{
if (!$this->connected) {
$this->setError('Not connected to POP3 server');
}
if (empty($username)) {
$username = $this->username;
}
if (empty($password)) {
$password = $this->password;
}
// Send the Username
$this->sendString("USER $username" . self::CRLF);
$pop3_response = $this->getResponse();
if ($this->checkResponse($pop3_response)) {
// Send the Password
$this->sendString("PASS $password" . self::CRLF);
$pop3_response = $this->getResponse();
if ($this->checkResponse($pop3_response)) {
return true;
}
}
return false;
}
/**
* Disconnect from the POP3 server.
* @access public
*/
public function disconnect()
{
$this->sendString('QUIT');
//The QUIT command may cause the daemon to exit, which will kill our connection
//So ignore errors here
try {
@fclose($this->pop_conn);
} catch (Exception $e) {
//Do nothing
};
}
/**
* Get a response from the POP3 server.
* $size is the maximum number of bytes to retrieve
* @param integer $size
* @return string
* @access protected
*/
protected function getResponse($size = 128)
{
$response = fgets($this->pop_conn, $size);
if ($this->do_debug >= 1) {
echo "Server -> Client: $response";
}
return $response;
}
/**
* Send raw data to the POP3 server.
* @param string $string
* @return integer
* @access protected
*/
protected function sendString($string)
{
if ($this->pop_conn) {
if ($this->do_debug >= 2) { //Show client messages when debug >= 2
echo "Client -> Server: $string";
}
return fwrite($this->pop_conn, $string, strlen($string));
}
return 0;
}
/**
* Checks the POP3 server response.
* Looks for for +OK or -ERR.
* @param string $string
* @return boolean
* @access protected
*/
protected function checkResponse($string)
{
if (substr($string, 0, 3) !== '+OK') {
$this->setError(array(
'error' => "Server reported an error: $string",
'errno' => 0,
'errstr' => ''
));
return false;
} else {
return true;
}
}
/**
* Add an error to the internal error store.
* Also display debug output if it's enabled.
* @param $error
* @access protected
*/
protected function setError($error)
{
$this->errors[] = $error;
if ($this->do_debug >= 1) {
echo '';
foreach ($this->errors as $error) {
print_r($error);
}
echo ' ';
}
}
/**
* Get an array of error messages, if any.
* @return array
*/
public function getErrors()
{
return $this->errors;
}
/**
* POP3 connection error handler.
* @param integer $errno
* @param string $errstr
* @param string $errfile
* @param integer $errline
* @access protected
*/
protected function catchWarning($errno, $errstr, $errfile, $errline)
{
$this->setError(array(
'error' => "Connecting to the POP3 server raised a PHP warning: ",
'errno' => $errno,
'errstr' => $errstr,
'errfile' => $errfile,
'errline' => $errline
));
}
}
================================================
FILE: frphp/extend/PHPMailer/class.smtp.php
================================================
* @author Jim Jagielski (jimjag)
* @author Andy Prevost (codeworxtech)
* @author Brent R. Matzelle (original founder)
* @copyright 2014 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*/
/**
* PHPMailer RFC821 SMTP email transport class.
* Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.
* @package PHPMailer
* @author Chris Ryan
* @author Marcus Bointon
*/
class SMTP
{
/**
* The PHPMailer SMTP version number.
* @var string
*/
const VERSION = '5.2.24';
/**
* SMTP line break constant.
* @var string
*/
const CRLF = "\r\n";
/**
* The SMTP port to use if one is not specified.
* @var integer
*/
const DEFAULT_SMTP_PORT = 25;
/**
* The maximum line length allowed by RFC 2822 section 2.1.1
* @var integer
*/
const MAX_LINE_LENGTH = 998;
/**
* Debug level for no output
*/
const DEBUG_OFF = 0;
/**
* Debug level to show client -> server messages
*/
const DEBUG_CLIENT = 1;
/**
* Debug level to show client -> server and server -> client messages
*/
const DEBUG_SERVER = 2;
/**
* Debug level to show connection status, client -> server and server -> client messages
*/
const DEBUG_CONNECTION = 3;
/**
* Debug level to show all messages
*/
const DEBUG_LOWLEVEL = 4;
/**
* The PHPMailer SMTP Version number.
* @var string
* @deprecated Use the `VERSION` constant instead
* @see SMTP::VERSION
*/
public $Version = '5.2.24';
/**
* SMTP server port number.
* @var integer
* @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead
* @see SMTP::DEFAULT_SMTP_PORT
*/
public $SMTP_PORT = 25;
/**
* SMTP reply line ending.
* @var string
* @deprecated Use the `CRLF` constant instead
* @see SMTP::CRLF
*/
public $CRLF = "\r\n";
/**
* Debug output level.
* Options:
* * self::DEBUG_OFF (`0`) No debug output, default
* * self::DEBUG_CLIENT (`1`) Client commands
* * self::DEBUG_SERVER (`2`) Client commands and server responses
* * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status
* * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages
* @var integer
*/
public $do_debug = self::DEBUG_OFF;
/**
* How to handle debug output.
* Options:
* * `echo` Output plain-text as-is, appropriate for CLI
* * `html` Output escaped, line breaks converted to ` `, appropriate for browser output
* * `error_log` Output to error log as configured in php.ini
*
* Alternatively, you can provide a callable expecting two params: a message string and the debug level:
*
* $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
*
* @var string|callable
*/
public $Debugoutput = 'echo';
/**
* Whether to use VERP.
* @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
* @link http://www.postfix.org/VERP_README.html Info on VERP
* @var boolean
*/
public $do_verp = false;
/**
* The timeout value for connection, in seconds.
* Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
* This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.
* @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2
* @var integer
*/
public $Timeout = 300;
/**
* How long to wait for commands to complete, in seconds.
* Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
* @var integer
*/
public $Timelimit = 300;
/**
* @var array Patterns to extract an SMTP transaction id from reply to a DATA command.
* The first capture group in each regex will be used as the ID.
*/
protected $smtp_transaction_id_patterns = array(
'exim' => '/[0-9]{3} OK id=(.*)/',
'sendmail' => '/[0-9]{3} 2.0.0 (.*) Message/',
'postfix' => '/[0-9]{3} 2.0.0 Ok: queued as (.*)/'
);
/**
* @var string The last transaction ID issued in response to a DATA command,
* if one was detected
*/
protected $last_smtp_transaction_id;
/**
* The socket for the server connection.
* @var resource
*/
protected $smtp_conn;
/**
* Error information, if any, for the last SMTP command.
* @var array
*/
protected $error = array(
'error' => '',
'detail' => '',
'smtp_code' => '',
'smtp_code_ex' => ''
);
/**
* The reply the server sent to us for HELO.
* If null, no HELO string has yet been received.
* @var string|null
*/
protected $helo_rply = null;
/**
* The set of SMTP extensions sent in reply to EHLO command.
* Indexes of the array are extension names.
* Value at index 'HELO' or 'EHLO' (according to command that was sent)
* represents the server name. In case of HELO it is the only element of the array.
* Other values can be boolean TRUE or an array containing extension options.
* If null, no HELO/EHLO string has yet been received.
* @var array|null
*/
protected $server_caps = null;
/**
* The most recent reply received from the server.
* @var string
*/
protected $last_reply = '';
/**
* Output debugging info via a user-selected method.
* @see SMTP::$Debugoutput
* @see SMTP::$do_debug
* @param string $str Debug string to output
* @param integer $level The debug level of this message; see DEBUG_* constants
* @return void
*/
protected function edebug($str, $level = 0)
{
if ($level > $this->do_debug) {
return;
}
//Avoid clash with built-in function names
if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
call_user_func($this->Debugoutput, $str, $level);
return;
}
switch ($this->Debugoutput) {
case 'error_log':
//Don't output, just log
error_log($str);
break;
case 'html':
//Cleans up output a bit for a better looking, HTML-safe output
echo gmdate('Y-m-d H:i:s') . ' ' . htmlentities(
preg_replace('/[\r\n]+/', '', $str),
ENT_QUOTES,
'UTF-8'
) . " \n";
break;
case 'echo':
default:
//Normalize line breaks
$str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
"\n",
"\n \t ",
trim($str)
) . "\n";
}
}
/**
* Connect to an SMTP server.
* @param string $host SMTP server IP or host name
* @param integer $port The port number to connect to
* @param integer $timeout How long to wait for the connection to open
* @param array $options An array of options for stream_context_create()
* @access public
* @return boolean
*/
public function connect($host, $port = null, $timeout = 30, $options = array())
{
static $streamok;
//This is enabled by default since 5.0.0 but some providers disable it
//Check this once and cache the result
if (is_null($streamok)) {
$streamok = function_exists('stream_socket_client');
}
// Clear errors to avoid confusion
$this->setError('');
// Make sure we are __not__ connected
if ($this->connected()) {
// Already connected, generate error
$this->setError('Already connected to a server');
return false;
}
if (empty($port)) {
$port = self::DEFAULT_SMTP_PORT;
}
// Connect to the SMTP server
$this->edebug(
"Connection: opening to $host:$port, timeout=$timeout, options=" .
var_export($options, true),
self::DEBUG_CONNECTION
);
$errno = 0;
$errstr = '';
if ($streamok) {
$socket_context = stream_context_create($options);
set_error_handler(array($this, 'errorHandler'));
$this->smtp_conn = stream_socket_client(
$host . ":" . $port,
$errno,
$errstr,
$timeout,
STREAM_CLIENT_CONNECT,
$socket_context
);
restore_error_handler();
} else {
//Fall back to fsockopen which should work in more places, but is missing some features
$this->edebug(
"Connection: stream_socket_client not available, falling back to fsockopen",
self::DEBUG_CONNECTION
);
set_error_handler(array($this, 'errorHandler'));
$this->smtp_conn = fsockopen(
$host,
$port,
$errno,
$errstr,
$timeout
);
restore_error_handler();
}
// Verify we connected properly
if (!is_resource($this->smtp_conn)) {
$this->setError(
'Failed to connect to server',
$errno,
$errstr
);
$this->edebug(
'SMTP ERROR: ' . $this->error['error']
. ": $errstr ($errno)",
self::DEBUG_CLIENT
);
return false;
}
$this->edebug('Connection: opened', self::DEBUG_CONNECTION);
// SMTP server can take longer to respond, give longer timeout for first read
// Windows does not have support for this timeout function
if (substr(PHP_OS, 0, 3) != 'WIN') {
$max = ini_get('max_execution_time');
// Don't bother if unlimited
if ($max != 0 && $timeout > $max) {
@set_time_limit($timeout);
}
stream_set_timeout($this->smtp_conn, $timeout, 0);
}
// Get any announcement
$announce = $this->get_lines();
$this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
return true;
}
/**
* Initiate a TLS (encrypted) session.
* @access public
* @return boolean
*/
public function startTLS()
{
if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
return false;
}
//Allow the best TLS version(s) we can
$crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;
//PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT
//so add them back in manually if we can
if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
$crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
$crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
}
// Begin encrypted connection
set_error_handler(array($this, 'errorHandler'));
$crypto_ok = stream_socket_enable_crypto(
$this->smtp_conn,
true,
$crypto_method
);
restore_error_handler();
return $crypto_ok;
}
/**
* Perform SMTP authentication.
* Must be run after hello().
* @see hello()
* @param string $username The user name
* @param string $password The password
* @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5, XOAUTH2)
* @param string $realm The auth realm for NTLM
* @param string $workstation The auth workstation for NTLM
* @param null|OAuth $OAuth An optional OAuth instance (@see PHPMailerOAuth)
* @return bool True if successfully authenticated.* @access public
*/
public function authenticate(
$username,
$password,
$authtype = null,
$realm = '',
$workstation = '',
$OAuth = null
) {
if (!$this->server_caps) {
$this->setError('Authentication is not allowed before HELO/EHLO');
return false;
}
if (array_key_exists('EHLO', $this->server_caps)) {
// SMTP extensions are available; try to find a proper authentication method
if (!array_key_exists('AUTH', $this->server_caps)) {
$this->setError('Authentication is not allowed at this stage');
// 'at this stage' means that auth may be allowed after the stage changes
// e.g. after STARTTLS
return false;
}
self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
self::edebug(
'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
self::DEBUG_LOWLEVEL
);
if (empty($authtype)) {
foreach (array('CRAM-MD5', 'LOGIN', 'PLAIN', 'NTLM', 'XOAUTH2') as $method) {
if (in_array($method, $this->server_caps['AUTH'])) {
$authtype = $method;
break;
}
}
if (empty($authtype)) {
$this->setError('No supported authentication methods found');
return false;
}
self::edebug('Auth method selected: ' . $authtype, self::DEBUG_LOWLEVEL);
}
if (!in_array($authtype, $this->server_caps['AUTH'])) {
$this->setError("The requested authentication method \"$authtype\" is not supported by the server");
return false;
}
} elseif (empty($authtype)) {
$authtype = 'LOGIN';
}
switch ($authtype) {
case 'PLAIN':
// Start authentication
if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
return false;
}
// Send encoded username and password
if (!$this->sendCommand(
'User & Password',
base64_encode("\0" . $username . "\0" . $password),
235
)
) {
return false;
}
break;
case 'LOGIN':
// Start authentication
if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
return false;
}
if (!$this->sendCommand("Username", base64_encode($username), 334)) {
return false;
}
if (!$this->sendCommand("Password", base64_encode($password), 235)) {
return false;
}
break;
case 'XOAUTH2':
//If the OAuth Instance is not set. Can be a case when PHPMailer is used
//instead of PHPMailerOAuth
if (is_null($OAuth)) {
return false;
}
$oauth = $OAuth->getOauth64();
// Start authentication
if (!$this->sendCommand('AUTH', 'AUTH XOAUTH2 ' . $oauth, 235)) {
return false;
}
break;
case 'NTLM':
/*
* ntlm_sasl_client.php
* Bundled with Permission
*
* How to telnet in windows:
* http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx
* PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication
*/
require_once 'extras/ntlm_sasl_client.php';
$temp = new stdClass;
$ntlm_client = new ntlm_sasl_client_class;
//Check that functions are available
if (!$ntlm_client->initialize($temp)) {
$this->setError($temp->error);
$this->edebug(
'You need to enable some modules in your php.ini file: '
. $this->error['error'],
self::DEBUG_CLIENT
);
return false;
}
//msg1
$msg1 = $ntlm_client->typeMsg1($realm, $workstation); //msg1
if (!$this->sendCommand(
'AUTH NTLM',
'AUTH NTLM ' . base64_encode($msg1),
334
)
) {
return false;
}
//Though 0 based, there is a white space after the 3 digit number
//msg2
$challenge = substr($this->last_reply, 3);
$challenge = base64_decode($challenge);
$ntlm_res = $ntlm_client->NTLMResponse(
substr($challenge, 24, 8),
$password
);
//msg3
$msg3 = $ntlm_client->typeMsg3(
$ntlm_res,
$username,
$realm,
$workstation
);
// send encoded username
return $this->sendCommand('Username', base64_encode($msg3), 235);
case 'CRAM-MD5':
// Start authentication
if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
return false;
}
// Get the challenge
$challenge = base64_decode(substr($this->last_reply, 4));
// Build the response
$response = $username . ' ' . $this->hmac($challenge, $password);
// send encoded credentials
return $this->sendCommand('Username', base64_encode($response), 235);
default:
$this->setError("Authentication method \"$authtype\" is not supported");
return false;
}
return true;
}
/**
* Calculate an MD5 HMAC hash.
* Works like hash_hmac('md5', $data, $key)
* in case that function is not available
* @param string $data The data to hash
* @param string $key The key to hash with
* @access protected
* @return string
*/
protected function hmac($data, $key)
{
if (function_exists('hash_hmac')) {
return hash_hmac('md5', $data, $key);
}
// The following borrowed from
// http://php.net/manual/en/function.mhash.php#27225
// RFC 2104 HMAC implementation for php.
// Creates an md5 HMAC.
// Eliminates the need to install mhash to compute a HMAC
// by Lance Rushing
$bytelen = 64; // byte length for md5
if (strlen($key) > $bytelen) {
$key = pack('H*', md5($key));
}
$key = str_pad($key, $bytelen, chr(0x00));
$ipad = str_pad('', $bytelen, chr(0x36));
$opad = str_pad('', $bytelen, chr(0x5c));
$k_ipad = $key ^ $ipad;
$k_opad = $key ^ $opad;
return md5($k_opad . pack('H*', md5($k_ipad . $data)));
}
/**
* Check connection state.
* @access public
* @return boolean True if connected.
*/
public function connected()
{
if (is_resource($this->smtp_conn)) {
$sock_status = stream_get_meta_data($this->smtp_conn);
if ($sock_status['eof']) {
// The socket is valid but we are not connected
$this->edebug(
'SMTP NOTICE: EOF caught while checking if connected',
self::DEBUG_CLIENT
);
$this->close();
return false;
}
return true; // everything looks good
}
return false;
}
/**
* Close the socket and clean up the state of the class.
* Don't use this function without first trying to use QUIT.
* @see quit()
* @access public
* @return void
*/
public function close()
{
$this->setError('');
$this->server_caps = null;
$this->helo_rply = null;
if (is_resource($this->smtp_conn)) {
// close the connection and cleanup
fclose($this->smtp_conn);
$this->smtp_conn = null; //Makes for cleaner serialization
$this->edebug('Connection: closed', self::DEBUG_CONNECTION);
}
}
/**
* Send an SMTP DATA command.
* Issues a data command and sends the msg_data to the server,
* finializing the mail transaction. $msg_data is the message
* that is to be send with the headers. Each header needs to be
* on a single line followed by a with the message headers
* and the message body being separated by and additional .
* Implements rfc 821: DATA
* @param string $msg_data Message data to send
* @access public
* @return boolean
*/
public function data($msg_data)
{
//This will use the standard timelimit
if (!$this->sendCommand('DATA', 'DATA', 354)) {
return false;
}
/* The server is ready to accept data!
* According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF)
* so we will break the data up into lines by \r and/or \n then if needed we will break each of those into
* smaller lines to fit within the limit.
* We will also look for lines that start with a '.' and prepend an additional '.'.
* NOTE: this does not count towards line-length limit.
*/
// Normalize line breaks before exploding
$lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data));
/* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
* of the first line (':' separated) does not contain a space then it _should_ be a header and we will
* process all lines before a blank line as headers.
*/
$field = substr($lines[0], 0, strpos($lines[0], ':'));
$in_headers = false;
if (!empty($field) && strpos($field, ' ') === false) {
$in_headers = true;
}
foreach ($lines as $line) {
$lines_out = array();
if ($in_headers and $line == '') {
$in_headers = false;
}
//Break this line up into several smaller lines if it's too long
//Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len),
while (isset($line[self::MAX_LINE_LENGTH])) {
//Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on
//so as to avoid breaking in the middle of a word
$pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');
//Deliberately matches both false and 0
if (!$pos) {
//No nice break found, add a hard break
$pos = self::MAX_LINE_LENGTH - 1;
$lines_out[] = substr($line, 0, $pos);
$line = substr($line, $pos);
} else {
//Break at the found point
$lines_out[] = substr($line, 0, $pos);
//Move along by the amount we dealt with
$line = substr($line, $pos + 1);
}
//If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1
if ($in_headers) {
$line = "\t" . $line;
}
}
$lines_out[] = $line;
//Send the lines to the server
foreach ($lines_out as $line_out) {
//RFC2821 section 4.5.2
if (!empty($line_out) and $line_out[0] == '.') {
$line_out = '.' . $line_out;
}
$this->client_send($line_out . self::CRLF);
}
}
//Message data has been sent, complete the command
//Increase timelimit for end of DATA command
$savetimelimit = $this->Timelimit;
$this->Timelimit = $this->Timelimit * 2;
$result = $this->sendCommand('DATA END', '.', 250);
$this->recordLastTransactionID();
//Restore timelimit
$this->Timelimit = $savetimelimit;
return $result;
}
/**
* Send an SMTP HELO or EHLO command.
* Used to identify the sending server to the receiving server.
* This makes sure that client and server are in a known state.
* Implements RFC 821: HELO
* and RFC 2821 EHLO.
* @param string $host The host name or IP to connect to
* @access public
* @return boolean
*/
public function hello($host = '')
{
//Try extended hello first (RFC 2821)
return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));
}
/**
* Send an SMTP HELO or EHLO command.
* Low-level implementation used by hello()
* @see hello()
* @param string $hello The HELO string
* @param string $host The hostname to say we are
* @access protected
* @return boolean
*/
protected function sendHello($hello, $host)
{
$noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);
$this->helo_rply = $this->last_reply;
if ($noerror) {
$this->parseHelloFields($hello);
} else {
$this->server_caps = null;
}
return $noerror;
}
/**
* Parse a reply to HELO/EHLO command to discover server extensions.
* In case of HELO, the only parameter that can be discovered is a server name.
* @access protected
* @param string $type - 'HELO' or 'EHLO'
*/
protected function parseHelloFields($type)
{
$this->server_caps = array();
$lines = explode("\n", $this->helo_rply);
foreach ($lines as $n => $s) {
//First 4 chars contain response code followed by - or space
$s = trim(substr($s, 4));
if (empty($s)) {
continue;
}
$fields = explode(' ', $s);
if (!empty($fields)) {
if (!$n) {
$name = $type;
$fields = $fields[0];
} else {
$name = array_shift($fields);
switch ($name) {
case 'SIZE':
$fields = ($fields ? $fields[0] : 0);
break;
case 'AUTH':
if (!is_array($fields)) {
$fields = array();
}
break;
default:
$fields = true;
}
}
$this->server_caps[$name] = $fields;
}
}
}
/**
* Send an SMTP MAIL command.
* Starts a mail transaction from the email address specified in
* $from. Returns true if successful or false otherwise. If True
* the mail transaction is started and then one or more recipient
* commands may be called followed by a data command.
* Implements rfc 821: MAIL FROM:
* @param string $from Source address of this message
* @access public
* @return boolean
*/
public function mail($from)
{
$useVerp = ($this->do_verp ? ' XVERP' : '');
return $this->sendCommand(
'MAIL FROM',
'MAIL FROM:<' . $from . '>' . $useVerp,
250
);
}
/**
* Send an SMTP QUIT command.
* Closes the socket if there is no error or the $close_on_error argument is true.
* Implements from rfc 821: QUIT
* @param boolean $close_on_error Should the connection close if an error occurs?
* @access public
* @return boolean
*/
public function quit($close_on_error = true)
{
$noerror = $this->sendCommand('QUIT', 'QUIT', 221);
$err = $this->error; //Save any error
if ($noerror or $close_on_error) {
$this->close();
$this->error = $err; //Restore any error from the quit command
}
return $noerror;
}
/**
* Send an SMTP RCPT command.
* Sets the TO argument to $toaddr.
* Returns true if the recipient was accepted false if it was rejected.
* Implements from rfc 821: RCPT TO:
* @param string $address The address the message is being sent to
* @access public
* @return boolean
*/
public function recipient($address)
{
return $this->sendCommand(
'RCPT TO',
'RCPT TO:<' . $address . '>',
array(250, 251)
);
}
/**
* Send an SMTP RSET command.
* Abort any transaction that is currently in progress.
* Implements rfc 821: RSET
* @access public
* @return boolean True on success.
*/
public function reset()
{
return $this->sendCommand('RSET', 'RSET', 250);
}
/**
* Send a command to an SMTP server and check its return code.
* @param string $command The command name - not sent to the server
* @param string $commandstring The actual command to send
* @param integer|array $expect One or more expected integer success codes
* @access protected
* @return boolean True on success.
*/
protected function sendCommand($command, $commandstring, $expect)
{
if (!$this->connected()) {
$this->setError("Called $command without being connected");
return false;
}
//Reject line breaks in all commands
if (strpos($commandstring, "\n") !== false or strpos($commandstring, "\r") !== false) {
$this->setError("Command '$command' contained line breaks");
return false;
}
$this->client_send($commandstring . self::CRLF);
$this->last_reply = $this->get_lines();
// Fetch SMTP code and possible error code explanation
$matches = array();
if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) {
$code = $matches[1];
$code_ex = (count($matches) > 2 ? $matches[2] : null);
// Cut off error code from each response line
$detail = preg_replace(
"/{$code}[ -]" .
($code_ex ? str_replace('.', '\\.', $code_ex) . ' ' : '') . "/m",
'',
$this->last_reply
);
} else {
// Fall back to simple parsing if regex fails
$code = substr($this->last_reply, 0, 3);
$code_ex = null;
$detail = substr($this->last_reply, 4);
}
$this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
if (!in_array($code, (array)$expect)) {
$this->setError(
"$command command failed",
$detail,
$code,
$code_ex
);
$this->edebug(
'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,
self::DEBUG_CLIENT
);
return false;
}
$this->setError('');
return true;
}
/**
* Send an SMTP SAML command.
* Starts a mail transaction from the email address specified in $from.
* Returns true if successful or false otherwise. If True
* the mail transaction is started and then one or more recipient
* commands may be called followed by a data command. This command
* will send the message to the users terminal if they are logged
* in and send them an email.
* Implements rfc 821: SAML FROM:
* @param string $from The address the message is from
* @access public
* @return boolean
*/
public function sendAndMail($from)
{
return $this->sendCommand('SAML', "SAML FROM:$from", 250);
}
/**
* Send an SMTP VRFY command.
* @param string $name The name to verify
* @access public
* @return boolean
*/
public function verify($name)
{
return $this->sendCommand('VRFY', "VRFY $name", array(250, 251));
}
/**
* Send an SMTP NOOP command.
* Used to keep keep-alives alive, doesn't actually do anything
* @access public
* @return boolean
*/
public function noop()
{
return $this->sendCommand('NOOP', 'NOOP', 250);
}
/**
* Send an SMTP TURN command.
* This is an optional command for SMTP that this class does not support.
* This method is here to make the RFC821 Definition complete for this class
* and _may_ be implemented in future
* Implements from rfc 821: TURN
* @access public
* @return boolean
*/
public function turn()
{
$this->setError('The SMTP TURN command is not implemented');
$this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);
return false;
}
/**
* Send raw data to the server.
* @param string $data The data to send
* @access public
* @return integer|boolean The number of bytes sent to the server or false on error
*/
public function client_send($data)
{
$this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT);
set_error_handler(array($this, 'errorHandler'));
$result = fwrite($this->smtp_conn, $data);
restore_error_handler();
return $result;
}
/**
* Get the latest error.
* @access public
* @return array
*/
public function getError()
{
return $this->error;
}
/**
* Get SMTP extensions available on the server
* @access public
* @return array|null
*/
public function getServerExtList()
{
return $this->server_caps;
}
/**
* A multipurpose method
* The method works in three ways, dependent on argument value and current state
* 1. HELO/EHLO was not sent - returns null and set up $this->error
* 2. HELO was sent
* $name = 'HELO': returns server name
* $name = 'EHLO': returns boolean false
* $name = any string: returns null and set up $this->error
* 3. EHLO was sent
* $name = 'HELO'|'EHLO': returns server name
* $name = any string: if extension $name exists, returns boolean True
* or its options. Otherwise returns boolean False
* In other words, one can use this method to detect 3 conditions:
* - null returned: handshake was not or we don't know about ext (refer to $this->error)
* - false returned: the requested feature exactly not exists
* - positive value returned: the requested feature exists
* @param string $name Name of SMTP extension or 'HELO'|'EHLO'
* @return mixed
*/
public function getServerExt($name)
{
if (!$this->server_caps) {
$this->setError('No HELO/EHLO was sent');
return null;
}
// the tight logic knot ;)
if (!array_key_exists($name, $this->server_caps)) {
if ($name == 'HELO') {
return $this->server_caps['EHLO'];
}
if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {
return false;
}
$this->setError('HELO handshake was used. Client knows nothing about server extensions');
return null;
}
return $this->server_caps[$name];
}
/**
* Get the last reply from the server.
* @access public
* @return string
*/
public function getLastReply()
{
return $this->last_reply;
}
/**
* Read the SMTP server's response.
* Either before eof or socket timeout occurs on the operation.
* With SMTP we can tell if we have more lines to read if the
* 4th character is '-' symbol. If it is a space then we don't
* need to read anything else.
* @access protected
* @return string
*/
protected function get_lines()
{
// If the connection is bad, give up straight away
if (!is_resource($this->smtp_conn)) {
return '';
}
$data = '';
$endtime = 0;
stream_set_timeout($this->smtp_conn, $this->Timeout);
if ($this->Timelimit > 0) {
$endtime = time() + $this->Timelimit;
}
while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
$str = @fgets($this->smtp_conn, 515);
$this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
$this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL);
$data .= $str;
// If response is only 3 chars (not valid, but RFC5321 S4.2 says it must be handled),
// or 4th character is a space, we are done reading, break the loop,
// string array access is a micro-optimisation over strlen
if (!isset($str[3]) or (isset($str[3]) and $str[3] == ' ')) {
break;
}
// Timed-out? Log and break
$info = stream_get_meta_data($this->smtp_conn);
if ($info['timed_out']) {
$this->edebug(
'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',
self::DEBUG_LOWLEVEL
);
break;
}
// Now check if reads took too long
if ($endtime and time() > $endtime) {
$this->edebug(
'SMTP -> get_lines(): timelimit reached (' .
$this->Timelimit . ' sec)',
self::DEBUG_LOWLEVEL
);
break;
}
}
return $data;
}
/**
* Enable or disable VERP address generation.
* @param boolean $enabled
*/
public function setVerp($enabled = false)
{
$this->do_verp = $enabled;
}
/**
* Get VERP address generation mode.
* @return boolean
*/
public function getVerp()
{
return $this->do_verp;
}
/**
* Set error messages and codes.
* @param string $message The error message
* @param string $detail Further detail on the error
* @param string $smtp_code An associated SMTP error code
* @param string $smtp_code_ex Extended SMTP code
*/
protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '')
{
$this->error = array(
'error' => $message,
'detail' => $detail,
'smtp_code' => $smtp_code,
'smtp_code_ex' => $smtp_code_ex
);
}
/**
* Set debug output method.
* @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it.
*/
public function setDebugOutput($method = 'echo')
{
$this->Debugoutput = $method;
}
/**
* Get debug output method.
* @return string
*/
public function getDebugOutput()
{
return $this->Debugoutput;
}
/**
* Set debug output level.
* @param integer $level
*/
public function setDebugLevel($level = 0)
{
$this->do_debug = $level;
}
/**
* Get debug output level.
* @return integer
*/
public function getDebugLevel()
{
return $this->do_debug;
}
/**
* Set SMTP timeout.
* @param integer $timeout
*/
public function setTimeout($timeout = 0)
{
$this->Timeout = $timeout;
}
/**
* Get SMTP timeout.
* @return integer
*/
public function getTimeout()
{
return $this->Timeout;
}
/**
* Reports an error number and string.
* @param integer $errno The error number returned by PHP.
* @param string $errmsg The error message returned by PHP.
* @param string $errfile The file the error occurred in
* @param integer $errline The line number the error occurred on
*/
protected function errorHandler($errno, $errmsg, $errfile = '', $errline = 0)
{
$notice = 'Connection failed.';
$this->setError(
$notice,
$errno,
$errmsg
);
$this->edebug(
$notice . ' Error #' . $errno . ': ' . $errmsg . " [$errfile line $errline]",
self::DEBUG_CONNECTION
);
}
/**
* Extract and return the ID of the last SMTP transaction based on
* a list of patterns provided in SMTP::$smtp_transaction_id_patterns.
* Relies on the host providing the ID in response to a DATA command.
* If no reply has been received yet, it will return null.
* If no pattern was matched, it will return false.
* @return bool|null|string
*/
protected function recordLastTransactionID()
{
$reply = $this->getLastReply();
if (empty($reply)) {
$this->last_smtp_transaction_id = null;
} else {
$this->last_smtp_transaction_id = false;
foreach ($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) {
if (preg_match($smtp_transaction_id_pattern, $reply, $matches)) {
$this->last_smtp_transaction_id = $matches[1];
}
}
}
return $this->last_smtp_transaction_id;
}
/**
* Get the queue/transaction ID of the last SMTP transaction
* If no reply has been received yet, it will return null.
* If no pattern was matched, it will return false.
* @return bool|null|string
* @see recordLastTransactionID()
*/
public function getLastTransactionID()
{
return $this->last_smtp_transaction_id;
}
}
================================================
FILE: frphp/extend/PHPMailer/extras/EasyPeasyICS.php
================================================
* @author Manuel Reinhard
*
* Built with inspiration from
* http://stackoverflow.com/questions/1463480/how-can-i-use-php-to-dynamically-publish-an-ical-file-to-be-read-by-google-calend/1464355#1464355
* History:
* 2010/12/17 - Manuel Reinhard - when it all started
* 2014 PHPMailer project becomes maintainer
*/
/**
* Class EasyPeasyICS.
* Simple ICS data generator
* @package phpmailer
* @subpackage easypeasyics
*/
class EasyPeasyICS
{
/**
* The name of the calendar
* @var string
*/
protected $calendarName;
/**
* The array of events to add to this calendar
* @var array
*/
protected $events = array();
/**
* Constructor
* @param string $calendarName
*/
public function __construct($calendarName = "")
{
$this->calendarName = $calendarName;
}
/**
* Add an event to this calendar.
* @param string $start The start date and time as a unix timestamp
* @param string $end The end date and time as a unix timestamp
* @param string $summary A summary or title for the event
* @param string $description A description of the event
* @param string $url A URL for the event
* @param string $uid A unique identifier for the event - generated automatically if not provided
* @return array An array of event details, including any generated UID
*/
public function addEvent($start, $end, $summary = '', $description = '', $url = '', $uid = '')
{
if (empty($uid)) {
$uid = md5(uniqid(mt_rand(), true)) . '@EasyPeasyICS';
}
$event = array(
'start' => gmdate('Ymd', $start) . 'T' . gmdate('His', $start) . 'Z',
'end' => gmdate('Ymd', $end) . 'T' . gmdate('His', $end) . 'Z',
'summary' => $summary,
'description' => $description,
'url' => $url,
'uid' => $uid
);
$this->events[] = $event;
return $event;
}
/**
* @return array Get the array of events.
*/
public function getEvents()
{
return $this->events;
}
/**
* Clear all events.
*/
public function clearEvents()
{
$this->events = array();
}
/**
* Get the name of the calendar.
* @return string
*/
public function getName()
{
return $this->calendarName;
}
/**
* Set the name of the calendar.
* @param $name
*/
public function setName($name)
{
$this->calendarName = $name;
}
/**
* Render and optionally output a vcal string.
* @param bool $output Whether to output the calendar data directly (the default).
* @return string The complete rendered vlal
*/
public function render($output = true)
{
//Add header
$ics = 'BEGIN:VCALENDAR
METHOD:PUBLISH
VERSION:2.0
X-WR-CALNAME:' . $this->calendarName . '
PRODID:-//hacksw/handcal//NONSGML v1.0//EN';
//Add events
foreach ($this->events as $event) {
$ics .= '
BEGIN:VEVENT
UID:' . $event['uid'] . '
DTSTAMP:' . gmdate('Ymd') . 'T' . gmdate('His') . 'Z
DTSTART:' . $event['start'] . '
DTEND:' . $event['end'] . '
SUMMARY:' . str_replace("\n", "\\n", $event['summary']) . '
DESCRIPTION:' . str_replace("\n", "\\n", $event['description']) . '
URL;VALUE=URI:' . $event['url'] . '
END:VEVENT';
}
//Add footer
$ics .= '
END:VCALENDAR';
if ($output) {
//Output
$filename = $this->calendarName;
//Filename needs quoting if it contains spaces
if (strpos($filename, ' ') !== false) {
$filename = '"'.$filename.'"';
}
header('Content-type: text/calendar; charset=utf-8');
header('Content-Disposition: inline; filename=' . $filename . '.ics');
echo $ics;
}
return $ics;
}
}
================================================
FILE: frphp/extend/PHPMailer/extras/README.md
================================================
# PHPMailer Extras
These classes provide optional additional functions to PHPMailer.
These are not loaded by the PHPMailer autoloader, so in some cases you may need to `require` them yourself before using them.
## EasyPeasyICS
This class was originally written by Manuel Reinhard and provides a simple means of generating ICS/vCal files that are used in sending calendar events. PHPMailer does not use it directly, but you can use it to generate content appropriate for placing in the `Ical` property of PHPMailer. The PHPMailer project is now its official home as Manuel has given permission for that and is no longer maintaining it himself.
## htmlfilter
This class by Konstantin Riabitsev and Jim Jagielski implements HTML filtering to remove potentially malicious tags, such as `";
return $sHtml;
}
public function generateSign($params, $signType = "RSA") {
return $this->sign($this->getSignContent($params), $signType);
}
protected function sign($data, $signType = "RSA") {
$priKey=$this->rsaPrivateKey;
$res = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($priKey, 64, "\n", true) .
"\n-----END RSA PRIVATE KEY-----";
($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');
if ("RSA2" == $signType) {
openssl_sign($data, $sign, $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持
} else {
openssl_sign($data, $sign, $res);
}
$sign = base64_encode($sign);
return $sign;
}
/**
* 校验$value是否非空
* if not set ,return true;
* if is null , return true;
**/
protected function checkEmpty($value) {
if (!isset($value))
return true;
if ($value === null)
return true;
if (trim($value) === "")
return true;
return false;
}
public function getSignContent($params) {
ksort($params);
$stringToBeSigned = "";
$i = 0;
foreach ($params as $k => $v) {
if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
// 转换成目标字符集
$v = $this->characet($v, $this->charset);
if ($i == 0) {
$stringToBeSigned .= "$k" . "=" . "$v";
} else {
$stringToBeSigned .= "&" . "$k" . "=" . "$v";
}
$i++;
}
}
unset ($k, $v);
return $stringToBeSigned;
}
/**
* 转换字符集编码
* @param $data
* @param $targetCharset
* @return string
*/
function characet($data, $targetCharset) {
if (!empty($data)) {
$fileType = $this->charset;
if (strcasecmp($fileType, $targetCharset) != 0) {
$data = mb_convert_encoding($data, $targetCharset, $fileType);
//$data = iconv($fileType, $targetCharset.'//IGNORE', $data);
}
}
return $data;
}
}
================================================
FILE: frphp/extend/pay/alipay/AlipayServiceCheck.php
================================================
charset = 'utf8';
$this->alipayPublicKey=$alipayPublicKey;
}
/**
* 验证签名
**/
public function rsaCheck($params) {
$sign = $params['sign'];
$signType = $params['sign_type'];
unset($params['sign_type']);
unset($params['sign']);
if(array_key_exists('s',$params)){
unset($params['s']);
}
return $this->verify($this->getSignContent($params), $sign, $signType);
}
function verify($data, $sign, $signType = 'RSA') {
$pubKey= $this->alipayPublicKey;
$res = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($pubKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');
//调用openssl内置方法验签,返回bool值
if ("RSA2" == $signType) {
$result = (bool)openssl_verify($data, base64_decode($sign), $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256);
} else {
$result = (bool)openssl_verify($data, base64_decode($sign), $res);
}
// if(!$this->checkEmpty($this->alipayPublicKey)) {
// //释放资源
// openssl_free_key($res);
// }
return $result;
}
/**
* 校验$value是否非空
* if not set ,return true;
* if is null , return true;
**/
protected function checkEmpty($value) {
if (!isset($value))
return true;
if ($value === null)
return true;
if (trim($value) === "")
return true;
return false;
}
public function getSignContent($params) {
ksort($params);
$stringToBeSigned = "";
$i = 0;
foreach ($params as $k => $v) {
if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
// 转换成目标字符集
$v = $this->characet($v, $this->charset);
if ($i == 0) {
$stringToBeSigned .= "$k" . "=" . "$v";
} else {
$stringToBeSigned .= "&" . "$k" . "=" . "$v";
}
$i++;
}
}
unset ($k, $v);
return $stringToBeSigned;
}
/**
* 转换字符集编码
* @param $data
* @param $targetCharset
* @return string
*/
function characet($data, $targetCharset) {
if (!empty($data)) {
$fileType = $this->charset;
if (strcasecmp($fileType, $targetCharset) != 0) {
$data = mb_convert_encoding($data, $targetCharset, $fileType);
//$data = iconv($fileType, $targetCharset.'//IGNORE', $data);
}
}
return $data;
}
}
================================================
FILE: frphp/extend/pay/wechat/WxpayCheckOrder.php
================================================
mchid = $mchid;
$this->appid = $appid;
$this->apiKey = $key;
}
public function setReturnUrl($returnUrl)
{
$this->returnUrl = $returnUrl;
}
public function orderquery($outTradeNo)
{
$config = array(
'mch_id' => $this->mchid,
'appid' => $this->appid,
'key' => $this->apiKey,
);
//$orderName = iconv('GBK','UTF-8',$orderName);
$unified = array(
'appid' => $config['appid'],
'mch_id' => $config['mch_id'],
'out_trade_no' => $outTradeNo,
'nonce_str' => self::createNonceStr(),
);
$unified['sign'] = self::getSign($unified, $config['key']);
$responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/orderquery', self::arrayToXml($unified));
$queryResult = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($queryResult === false) {
die('parse xml error');
}
if ($queryResult->return_code != 'SUCCESS') {
die($queryResult->return_msg);
}
$trade_state = $queryResult->trade_state;
$data['code'] = $trade_state=='SUCCESS' ? 0 : 1;
$data['data'] = $trade_state;
$data['msg'] = $this->getTradeSTate($trade_state);
$data['time'] = date('Y-m-d H:i:s');
return $data;exit();
}
public function getTradeSTate($str)
{
switch ($str){
case 'SUCCESS';
return '支付成功';
case 'REFUND';
return '转入退款';
case 'NOTPAY';
return '未支付';
case 'CLOSED';
return '已关闭';
case 'REVOKED';
return '已撤销(刷卡支付)';
case 'USERPAYING';
return '用户支付中';
case 'PAYERROR';
return '支付失败';
}
}
/**
* curl get
*
* @param string $url
* @param array $options
* @return mixed
*/
public static function curlGet($url = '', $options = array())
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
public static function curlPost($url = '', $postData = '', $options = array())
{
if (is_array($postData)) {
$postData = http_build_query($postData);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
public static function createNonceStr($length = 16)
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
public static function arrayToXml($arr)
{
$xml = "";
foreach ($arr as $key => $val) {
if (is_numeric($val)) {
$xml .= "<" . $key . ">" . $val . "" . $key . ">";
} else
$xml .= "<" . $key . ">" . $key . ">";
}
$xml .= " ";
return $xml;
}
/**
* 获取签名
*/
public static function getSign($params, $key)
{
ksort($params, SORT_STRING);
$unSignParaString = self::formatQueryParaMap($params, false);
$signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
return $signStr;
}
protected static function formatQueryParaMap($paraMap, $urlEncode = false)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if (null != $v && "null" != $v) {
if ($urlEncode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
}
================================================
FILE: frphp/extend/pay/wechat/WxpayH5Service.php
================================================
mchid = $mchid;
$this->appid = $appid;
$this->apiKey = $key;
}
public function setTotalFee($totalFee)
{
$this->totalFee = $totalFee;
}
public function setOutTradeNo($outTradeNo)
{
$this->outTradeNo = $outTradeNo;
}
public function setOrderName($orderName)
{
$this->orderName = $orderName;
}
public function setWapUrl($wapUrl)
{
$this->wapUrl = $wapUrl;
}
public function setWapName($wapName)
{
$this->wapName = $wapName;
}
public function setNotifyUrl($notifyUrl)
{
$this->notifyUrl = $notifyUrl;
}
public function setReturnUrl($returnUrl)
{
$this->returnUrl = $returnUrl;
}
public function setIp($webip)
{
$this->webip = $webip;
}
/**
* 发起订单
* @return array
*/
public function createJsBizPackage()
{
$config = array(
'mch_id' => $this->mchid,
'appid' => $this->appid,
'key' => $this->apiKey,
);
$scene_info = array(
'h5_info' =>array(
'type'=>'Wap',
'wap_url'=>$this->wapUrl,
'wap_name'=>$this->wapName,
)
);
$unified = array(
'appid' => $config['appid'],
'attach' => 'pay', //商家数据包,原样返回,如果填写中文,请注意转换为utf-8
'body' => $this->orderName,
'mch_id' => $config['mch_id'],
'nonce_str' => self::createNonceStr(),
'notify_url' => $this->notifyUrl,
'out_trade_no' => $this->outTradeNo,
'spbill_create_ip' => $this->webip,
'total_fee' => $this->totalFee * 100, //单位 转为分
'trade_type' => 'MWEB',
'scene_info'=>json_encode($scene_info)
);
$unified['sign'] = self::getSign($unified, $config['key']);
$responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified));
$unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($unifiedOrder->return_code != 'SUCCESS') {
die($unifiedOrder->return_msg);
}
if($unifiedOrder->mweb_url){
return $unifiedOrder->mweb_url.'&redirect_url='.urlencode($this->returnUrl);
}
exit('error');
}
public static function curlPost($url = '', $postData = '', $options = array())
{
if (is_array($postData)) {
$postData = http_build_query($postData);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
public static function createNonceStr($length = 16)
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
public static function arrayToXml($arr)
{
$xml = "";
foreach ($arr as $key => $val) {
if (is_numeric($val)) {
$xml .= "<" . $key . ">" . $val . "" . $key . ">";
} else
$xml .= "<" . $key . ">" . $key . ">";
}
$xml .= " ";
return $xml;
}
/**
* 获取签名
*/
public static function getSign($params, $key)
{
ksort($params, SORT_STRING);
$unSignParaString = self::formatQueryParaMap($params, false);
$signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
return $signStr;
}
protected static function formatQueryParaMap($paraMap, $urlEncode = false)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if (null != $v && "null" != $v) {
if ($urlEncode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
}
================================================
FILE: frphp/extend/pay/wechat/WxpayScan.php
================================================
mchid = $mchid;
$this->appid = $appid;
$this->apiKey = $key;
}
/**
* 发起订单
* @param float $totalFee 收款总费用 单位元
* @param string $outTradeNo 唯一的订单号
* @param string $orderName 订单名称
* @param string $notifyUrl 支付结果通知url 不要有问号
* @param string $timestamp 订单发起时间
* @return array
*/
public function createJsBizPackage($totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp)
{
$config = array(
'mch_id' => $this->mchid,
'appid' => $this->appid,
'key' => $this->apiKey,
);
//$orderName = iconv('GBK','UTF-8',$orderName);
$unified = array(
'appid' => $config['appid'],
'attach' => 'pay', //商家数据包,原样返回,如果填写中文,请注意转换为utf-8
'body' => $orderName,
'mch_id' => $config['mch_id'],
'nonce_str' => self::createNonceStr(),
'notify_url' => $notifyUrl,
'out_trade_no' => $outTradeNo,
'spbill_create_ip' => '127.0.0.1',
'total_fee' => $totalFee * 100, //单位 转为分
'trade_type' => 'NATIVE',
);
$unified['sign'] = self::getSign($unified, $config['key']);
$responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified));
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($unifiedOrder === false) {
die('parse xml error');
}
if ($unifiedOrder->return_code != 'SUCCESS') {
die($unifiedOrder->return_msg);
}
if ($unifiedOrder->result_code != 'SUCCESS') {
die($unifiedOrder->err_code);
}
$codeUrl = (array)($unifiedOrder->code_url);
if(!$codeUrl[0]) exit('get code_url error');
$arr = array(
"appId" => $config['appid'],
"timeStamp" => $timestamp,
"nonceStr" => self::createNonceStr(),
"package" => "prepay_id=" . $unifiedOrder->prepay_id,
"signType" => 'MD5',
"code_url" => $codeUrl[0],
);
$arr['paySign'] = self::getSign($arr, $config['key']);
return $arr;
}
public function notify()
{
$config = array(
'mch_id' => $this->mchid,
'appid' => $this->appid,
'key' => $this->apiKey,
);
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($postObj === false) {
die('parse xml error');
}
if ($postObj->return_code != 'SUCCESS') {
die($postObj->return_msg);
}
if ($postObj->result_code != 'SUCCESS') {
die($postObj->err_code);
}
$arr = (array)$postObj;
unset($arr['sign']);
if (self::getSign($arr, $config['key']) == $postObj->sign) {
echo ' ';
return $postObj;
}
}
/**
* curl get
*
* @param string $url
* @param array $options
* @return mixed
*/
public static function curlGet($url = '', $options = array())
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
public static function curlPost($url = '', $postData = '', $options = array())
{
if (is_array($postData)) {
$postData = http_build_query($postData);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
public static function createNonceStr($length = 16)
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
public static function arrayToXml($arr)
{
$xml = "";
foreach ($arr as $key => $val) {
if (is_numeric($val)) {
$xml .= "<" . $key . ">" . $val . "" . $key . ">";
} else
$xml .= "<" . $key . ">" . $key . ">";
}
$xml .= " ";
return $xml;
}
/**
* 获取签名
*/
public static function getSign($params, $key)
{
ksort($params, SORT_STRING);
$unSignParaString = self::formatQueryParaMap($params, false);
$signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
return $signStr;
}
protected static function formatQueryParaMap($paraMap, $urlEncode = false)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if (null != $v && "null" != $v) {
if ($urlEncode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
}
================================================
FILE: frphp/extend/pay/wechat/WxpayService.php
================================================
mchid = $mchid; //https://pay.weixin.qq.com 产品中心-开发配置-商户号
$this->appid = $appid; //微信支付申请对应的公众号的APPID
$this->appKey = $appKey; //微信支付申请对应的公众号的APP Key
$this->apiKey = $key; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥
}
/**
* 通过跳转获取用户的openid,跳转流程如下:
* 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
* 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code
* @return 用户的openid
*/
public function GetOpenid()
{
//通过code获得openid
if (!isset($_GET['code'])){
//触发微信返回code码
$scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://';
$uri = $_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING'];
if($_SERVER['REQUEST_URI']) $uri = $_SERVER['REQUEST_URI'];
$baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].$uri);
$url = $this->__CreateOauthUrlForCode($baseUrl);
Header("Location: $url");
exit();
} else {
//获取code码,以获取openid
$code = $_GET['code'];
$openid = $this->getOpenidFromMp($code);
return $openid;
}
}
/**
* 通过code从工作平台获取openid机器access_token
* @param string $code 微信跳转回来带上的code
* @return openid
*/
public function GetOpenidFromMp($code)
{
$url = $this->__CreateOauthUrlForOpenid($code);
$res = self::curlGet($url);
//取出openid
$data = json_decode($res,true);
$this->data = $data;
$openid = $data['openid'];
return $openid;
}
/**
* 构造获取open和access_toke的url地址
* @param string $code,微信跳转带回的code
* @return 请求的url
*/
private function __CreateOauthUrlForOpenid($code)
{
$urlObj["appid"] = $this->appid;
$urlObj["secret"] = $this->appKey;
$urlObj["code"] = $code;
$urlObj["grant_type"] = "authorization_code";
$bizString = $this->ToUrlParams($urlObj);
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
}
/**
* 构造获取code的url连接
* @param string $redirectUrl 微信服务器回跳的url,需要url编码
* @return 返回构造好的url
*/
private function __CreateOauthUrlForCode($redirectUrl)
{
$urlObj["appid"] = $this->appid;
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
$urlObj["scope"] = "snsapi_base";
$urlObj["state"] = "STATE"."#wechat_redirect";
$bizString = $this->ToUrlParams($urlObj);
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
}
/**
* 拼接签名字符串
* @param array $urlObj
* @return 返回已经拼接好的字符串
*/
private function ToUrlParams($urlObj)
{
$buff = "";
foreach ($urlObj as $k => $v)
{
if($k != "sign") $buff .= $k . "=" . $v . "&";
}
$buff = trim($buff, "&");
return $buff;
}
/**
* 统一下单
* @param string $openid 调用【网页授权获取用户信息】接口获取到用户在该公众号下的Openid
* @param float $totalFee 收款总费用 单位元
* @param string $outTradeNo 唯一的订单号
* @param string $orderName 订单名称
* @param string $notifyUrl 支付结果通知url 不要有问号
* @param string $timestamp 支付时间
* @return string
*/
public function createJsBizPackage($openid, $totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp)
{
$config = array(
'mch_id' => $this->mchid,
'appid' => $this->appid,
'key' => $this->apiKey,
);
//$orderName = iconv('GBK','UTF-8',$orderName);
$unified = array(
'appid' => $config['appid'],
'attach' => 'pay', //商家数据包,原样返回,如果填写中文,请注意转换为utf-8
'body' => $orderName,
'mch_id' => $config['mch_id'],
'nonce_str' => self::createNonceStr(),
'notify_url' => $notifyUrl,
'openid' => $openid, //rade_type=JSAPI,此参数必传
'out_trade_no' => $outTradeNo,
'spbill_create_ip' => '127.0.0.1',
'total_fee' => $totalFee * 100, //单位 转为分
'trade_type' => 'JSAPI',
);
$unified['sign'] = self::getSign($unified, $config['key']);
$responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified));
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($unifiedOrder === false) {
die('parse xml error');
}
if ($unifiedOrder->return_code != 'SUCCESS') {
die($unifiedOrder->return_msg);
}
if ($unifiedOrder->result_code != 'SUCCESS') {
die($unifiedOrder->err_code);
}
$arr = array(
"appId" => $config['appid'],
"timeStamp" => "$timestamp", //这里是字符串的时间戳,不是int,所以需加引号
"nonceStr" => self::createNonceStr(),
"package" => "prepay_id=" . $unifiedOrder->prepay_id,
"signType" => 'MD5',
);
$arr['paySign'] = self::getSign($arr, $config['key']);
return $arr;
}
public static function curlGet($url = '', $options = array())
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
public static function curlPost($url = '', $postData = '', $options = array())
{
if (is_array($postData)) {
$postData = http_build_query($postData);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
public static function createNonceStr($length = 16)
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
public static function arrayToXml($arr)
{
$xml = "";
foreach ($arr as $key => $val) {
if (is_numeric($val)) {
$xml .= "<" . $key . ">" . $val . "" . $key . ">";
} else
$xml .= "<" . $key . ">" . $key . ">";
}
$xml .= " ";
return $xml;
}
public static function getSign($params, $key)
{
ksort($params, SORT_STRING);
$unSignParaString = self::formatQueryParaMap($params, false);
$signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
return $signStr;
}
protected static function formatQueryParaMap($paraMap, $urlEncode = false)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if (null != $v && "null" != $v) {
if ($urlEncode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
}
================================================
FILE: frphp/extend/pay/wechat/WxpayServiceCheck.php
================================================
mchid = $mchid;
$this->appid = $appid;
$this->apiKey = $key;
}
public function notify()
{
$config = array(
'mch_id' => $this->mchid,
'appid' => $this->appid,
'key' => $this->apiKey,
);
$postStr = file_get_contents('php://input');
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($postObj === false) {
die('parse xml error');
}
if ($postObj->return_code != 'SUCCESS') {
die($postObj->return_msg);
}
if ($postObj->result_code != 'SUCCESS') {
die($postObj->err_code);
}
$arr = (array)$postObj;
unset($arr['sign']);
if (self::getSign($arr, $config['key']) == $postObj->sign) {
echo ' ';
return $arr;
}
}
/**
* 获取签名
*/
public static function getSign($params, $key)
{
ksort($params, SORT_STRING);
$unSignParaString = self::formatQueryParaMap($params, false);
$signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
return $signStr;
}
protected static function formatQueryParaMap($paraMap, $urlEncode = false)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if (null != $v && "null" != $v) {
if ($urlEncode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
}
================================================
FILE: frphp/extend/phpqrcode/phpqrcode.php
================================================
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* Version: 1.1.4
* Build: 2010100721
*/
//---- qrconst.php -----------------------------
/*
* PHP QR Code encoder
*
* Common constants
*
* Based on libqrencode C library distributed under LGPL 2.1
* Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
*
* PHP QR Code is distributed under LGPL 3
* Copyright (C) 2010 Dominik Dzienia
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
// Encoding modes
define('QR_MODE_NUL', -1);
define('QR_MODE_NUM', 0);
define('QR_MODE_AN', 1);
define('QR_MODE_8', 2);
define('QR_MODE_KANJI', 3);
define('QR_MODE_STRUCTURE', 4);
// Levels of error correction.
define('QR_ECLEVEL_L', 0);
define('QR_ECLEVEL_M', 1);
define('QR_ECLEVEL_Q', 2);
define('QR_ECLEVEL_H', 3);
// Supported output formats
define('QR_FORMAT_TEXT', 0);
define('QR_FORMAT_PNG', 1);
class qrstr {
public static function set(&$srctab, $x, $y, $repl, $replLen = false) {
$srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
}
}
//---- merged_config.php -----------------------------
/*
* PHP QR Code encoder
*
* Config file, tuned-up for merged verion
*/
define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there
define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true
define('QR_LOG_DIR', false); // default error logs dir
define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false
define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images
//---- qrtools.php -----------------------------
/*
* PHP QR Code encoder
*
* Toolset, handy and debug utilites.
*
* PHP QR Code is distributed under LGPL 3
* Copyright (C) 2010 Dominik Dzienia
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
class QRtools {
//----------------------------------------------------------------------
public static function binarize($frame)
{
$len = count($frame);
foreach ($frame as &$frameLine) {
for($i=0; $i<$len; $i++) {
$frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
}
}
return $frame;
}
//----------------------------------------------------------------------
public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')
{
$barcode_array = array();
if (!is_array($mode))
$mode = explode(',', $mode);
$eccLevel = 'L';
if (count($mode) > 1) {
$eccLevel = $mode[1];
}
$qrTab = QRcode::text($code, false, $eccLevel);
$size = count($qrTab);
$barcode_array['num_rows'] = $size;
$barcode_array['num_cols'] = $size;
$barcode_array['bcode'] = array();
foreach ($qrTab as $line) {
$arrAdd = array();
foreach(str_split($line) as $char)
$arrAdd[] = ($char=='1')?1:0;
$barcode_array['bcode'][] = $arrAdd;
}
return $barcode_array;
}
//----------------------------------------------------------------------
public static function clearCache()
{
self::$frames = array();
}
//----------------------------------------------------------------------
public static function buildCache()
{
QRtools::markTime('before_build_cache');
$mask = new QRmask();
for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {
$frame = QRspec::newFrame($a);
if (QR_IMAGE) {
$fileName = QR_CACHE_DIR.'frame_'.$a.'.png';
QRimage::png(self::binarize($frame), $fileName, 1, 0);
}
$width = count($frame);
$bitMask = array_fill(0, $width, array_fill(0, $width, 0));
for ($maskNo=0; $maskNo<8; $maskNo++)
$mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);
}
QRtools::markTime('after_build_cache');
}
//----------------------------------------------------------------------
public static function log($outfile, $err)
{
if (QR_LOG_DIR !== false) {
if ($err != '') {
if ($outfile !== false) {
file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
} else {
file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
}
}
}
}
//----------------------------------------------------------------------
public static function dumpMask($frame)
{
$width = count($frame);
for($y=0;$y<$width;$y++) {
for($x=0;$x<$width;$x++) {
echo ord($frame[$y][$x]).',';
}
}
}
//----------------------------------------------------------------------
public static function markTime($markerId)
{
list($usec, $sec) = explode(" ", microtime());
$time = ((float)$usec + (float)$sec);
if (!isset($GLOBALS['qr_time_bench']))
$GLOBALS['qr_time_bench'] = array();
$GLOBALS['qr_time_bench'][$markerId] = $time;
}
//----------------------------------------------------------------------
public static function timeBenchmark()
{
self::markTime('finish');
$lastTime = 0;
$startTime = 0;
$p = 0;
echo '
BENCHMARK
';
foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {
if ($p > 0) {
echo 'till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s ';
} else {
$startTime = $thisTime;
}
$p++;
$lastTime = $thisTime;
}
echo '
TOTAL: '.number_format($lastTime-$startTime, 6).'s
';
}
}
//##########################################################################
QRtools::markTime('start');
//---- qrspec.php -----------------------------
/*
* PHP QR Code encoder
*
* QR Code specifications
*
* Based on libqrencode C library distributed under LGPL 2.1
* Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
*
* PHP QR Code is distributed under LGPL 3
* Copyright (C) 2010 Dominik Dzienia
*
* The following data / specifications are taken from
* "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
* or
* "Automatic identification and data capture techniques --
* QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
define('QRSPEC_VERSION_MAX', 40);
define('QRSPEC_WIDTH_MAX', 177);
define('QRCAP_WIDTH', 0);
define('QRCAP_WORDS', 1);
define('QRCAP_REMINDER', 2);
define('QRCAP_EC', 3);
class QRspec {
public static $capacity = array(
array( 0, 0, 0, array( 0, 0, 0, 0)),
array( 21, 26, 0, array( 7, 10, 13, 17)), // 1
array( 25, 44, 7, array( 10, 16, 22, 28)),
array( 29, 70, 7, array( 15, 26, 36, 44)),
array( 33, 100, 7, array( 20, 36, 52, 64)),
array( 37, 134, 7, array( 26, 48, 72, 88)), // 5
array( 41, 172, 7, array( 36, 64, 96, 112)),
array( 45, 196, 0, array( 40, 72, 108, 130)),
array( 49, 242, 0, array( 48, 88, 132, 156)),
array( 53, 292, 0, array( 60, 110, 160, 192)),
array( 57, 346, 0, array( 72, 130, 192, 224)), //10
array( 61, 404, 0, array( 80, 150, 224, 264)),
array( 65, 466, 0, array( 96, 176, 260, 308)),
array( 69, 532, 0, array( 104, 198, 288, 352)),
array( 73, 581, 3, array( 120, 216, 320, 384)),
array( 77, 655, 3, array( 132, 240, 360, 432)), //15
array( 81, 733, 3, array( 144, 280, 408, 480)),
array( 85, 815, 3, array( 168, 308, 448, 532)),
array( 89, 901, 3, array( 180, 338, 504, 588)),
array( 93, 991, 3, array( 196, 364, 546, 650)),
array( 97, 1085, 3, array( 224, 416, 600, 700)), //20
array(101, 1156, 4, array( 224, 442, 644, 750)),
array(105, 1258, 4, array( 252, 476, 690, 816)),
array(109, 1364, 4, array( 270, 504, 750, 900)),
array(113, 1474, 4, array( 300, 560, 810, 960)),
array(117, 1588, 4, array( 312, 588, 870, 1050)), //25
array(121, 1706, 4, array( 336, 644, 952, 1110)),
array(125, 1828, 4, array( 360, 700, 1020, 1200)),
array(129, 1921, 3, array( 390, 728, 1050, 1260)),
array(133, 2051, 3, array( 420, 784, 1140, 1350)),
array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30
array(141, 2323, 3, array( 480, 868, 1290, 1530)),
array(145, 2465, 3, array( 510, 924, 1350, 1620)),
array(149, 2611, 3, array( 540, 980, 1440, 1710)),
array(153, 2761, 3, array( 570, 1036, 1530, 1800)),
array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35
array(161, 3034, 0, array( 600, 1120, 1680, 1980)),
array(165, 3196, 0, array( 630, 1204, 1770, 2100)),
array(169, 3362, 0, array( 660, 1260, 1860, 2220)),
array(173, 3532, 0, array( 720, 1316, 1950, 2310)),
array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40
);
//----------------------------------------------------------------------
public static function getDataLength($version, $level)
{
return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];
}
//----------------------------------------------------------------------
public static function getECCLength($version, $level)
{
return self::$capacity[$version][QRCAP_EC][$level];
}
//----------------------------------------------------------------------
public static function getWidth($version)
{
return self::$capacity[$version][QRCAP_WIDTH];
}
//----------------------------------------------------------------------
public static function getRemainder($version)
{
return self::$capacity[$version][QRCAP_REMINDER];
}
//----------------------------------------------------------------------
public static function getMinimumVersion($size, $level)
{
for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {
$words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];
if($words >= $size)
return $i;
}
return -1;
}
//######################################################################
public static $lengthTableBits = array(
array(10, 12, 14),
array( 9, 11, 13),
array( 8, 16, 16),
array( 8, 10, 12)
);
//----------------------------------------------------------------------
public static function lengthIndicator($mode, $version)
{
if ($mode == QR_MODE_STRUCTURE)
return 0;
if ($version <= 9) {
$l = 0;
} else if ($version <= 26) {
$l = 1;
} else {
$l = 2;
}
return self::$lengthTableBits[$mode][$l];
}
//----------------------------------------------------------------------
public static function maximumWords($mode, $version)
{
if($mode == QR_MODE_STRUCTURE)
return 3;
if($version <= 9) {
$l = 0;
} else if($version <= 26) {
$l = 1;
} else {
$l = 2;
}
$bits = self::$lengthTableBits[$mode][$l];
$words = (1 << $bits) - 1;
if($mode == QR_MODE_KANJI) {
$words *= 2; // the number of bytes is required
}
return $words;
}
// Error correction code -----------------------------------------------
// Table of the error correction code (Reed-Solomon block)
// See Table 12-16 (pp.30-36), JIS X0510:2004.
public static $eccTable = array(
array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)),
array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1
array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)),
array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)),
array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)),
array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5
array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)),
array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)),
array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)),
array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)),
array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10
array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)),
array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)),
array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)),
array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)),
array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15
array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)),
array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)),
array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)),
array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)),
array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20
array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)),
array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)),
array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)),
array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)),
array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25
array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)),
array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)),
array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)),
array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)),
array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30
array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)),
array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)),
array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)),
array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)),
array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35
array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)),
array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)),
array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)),
array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)),
array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40
);
//----------------------------------------------------------------------
// CACHEABLE!!!
public static function getEccSpec($version, $level, array &$spec)
{
if (count($spec) < 5) {
$spec = array(0,0,0,0,0);
}
$b1 = self::$eccTable[$version][$level][0];
$b2 = self::$eccTable[$version][$level][1];
$data = self::getDataLength($version, $level);
$ecc = self::getECCLength($version, $level);
if($b2 == 0) {
$spec[0] = $b1;
$spec[1] = (int)($data / $b1);
$spec[2] = (int)($ecc / $b1);
$spec[3] = 0;
$spec[4] = 0;
} else {
$spec[0] = $b1;
$spec[1] = (int)($data / ($b1 + $b2));
$spec[2] = (int)($ecc / ($b1 + $b2));
$spec[3] = $b2;
$spec[4] = $spec[1] + 1;
}
}
// Alignment pattern ---------------------------------------------------
// Positions of alignment patterns.
// This array includes only the second and the third position of the
// alignment patterns. Rest of them can be calculated from the distance
// between them.
// See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
public static $alignmentPattern = array(
array( 0, 0),
array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15
array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20
array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25
array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30
array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35
array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40
);
/** --------------------------------------------------------------------
* Put an alignment marker.
* @param frame
* @param width
* @param ox,oy center coordinate of the pattern
*/
public static function putAlignmentMarker(array &$frame, $ox, $oy)
{
$finder = array(
"\xa1\xa1\xa1\xa1\xa1",
"\xa1\xa0\xa0\xa0\xa1",
"\xa1\xa0\xa1\xa0\xa1",
"\xa1\xa0\xa0\xa0\xa1",
"\xa1\xa1\xa1\xa1\xa1"
);
$yStart = $oy-2;
$xStart = $ox-2;
for($y=0; $y<5; $y++) {
QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);
}
}
//----------------------------------------------------------------------
public static function putAlignmentPattern($version, &$frame, $width)
{
if($version < 2)
return;
$d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];
if($d < 0) {
$w = 2;
} else {
$w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2);
}
if($w * $w - 3 == 1) {
$x = self::$alignmentPattern[$version][0];
$y = self::$alignmentPattern[$version][0];
self::putAlignmentMarker($frame, $x, $y);
return;
}
$cx = self::$alignmentPattern[$version][0];
for($x=1; $x<$w - 1; $x++) {
self::putAlignmentMarker($frame, 6, $cx);
self::putAlignmentMarker($frame, $cx, 6);
$cx += $d;
}
$cy = self::$alignmentPattern[$version][0];
for($y=0; $y<$w-1; $y++) {
$cx = self::$alignmentPattern[$version][0];
for($x=0; $x<$w-1; $x++) {
self::putAlignmentMarker($frame, $cx, $cy);
$cx += $d;
}
$cy += $d;
}
}
// Version information pattern -----------------------------------------
// Version information pattern (BCH coded).
// See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
// size: [QRSPEC_VERSION_MAX - 6]
public static $versionPattern = array(
0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
0x27541, 0x28c69
);
//----------------------------------------------------------------------
public static function getVersionPattern($version)
{
if($version < 7 || $version > QRSPEC_VERSION_MAX)
return 0;
return self::$versionPattern[$version -7];
}
// Format information --------------------------------------------------
// See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib)
public static $formatInfo = array(
array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),
array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),
array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),
array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)
);
public static function getFormatInfo($mask, $level)
{
if($mask < 0 || $mask > 7)
return 0;
if($level < 0 || $level > 3)
return 0;
return self::$formatInfo[$level][$mask];
}
// Frame ---------------------------------------------------------------
// Cache of initial frames.
public static $frames = array();
/** --------------------------------------------------------------------
* Put a finder pattern.
* @param frame
* @param width
* @param ox,oy upper-left coordinate of the pattern
*/
public static function putFinderPattern(&$frame, $ox, $oy)
{
$finder = array(
"\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
"\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
"\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
"\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
);
for($y=0; $y<7; $y++) {
QRstr::set($frame, $ox, $oy+$y, $finder[$y]);
}
}
//----------------------------------------------------------------------
public static function createFrame($version)
{
$width = self::$capacity[$version][QRCAP_WIDTH];
$frameLine = str_repeat ("\0", $width);
$frame = array_fill(0, $width, $frameLine);
// Finder pattern
self::putFinderPattern($frame, 0, 0);
self::putFinderPattern($frame, $width - 7, 0);
self::putFinderPattern($frame, 0, $width - 7);
// Separator
$yOffset = $width - 7;
for($y=0; $y<7; $y++) {
$frame[$y][7] = "\xc0";
$frame[$y][$width - 8] = "\xc0";
$frame[$yOffset][7] = "\xc0";
$yOffset++;
}
$setPattern = str_repeat("\xc0", 8);
QRstr::set($frame, 0, 7, $setPattern);
QRstr::set($frame, $width-8, 7, $setPattern);
QRstr::set($frame, 0, $width - 8, $setPattern);
// Format info
$setPattern = str_repeat("\x84", 9);
QRstr::set($frame, 0, 8, $setPattern);
QRstr::set($frame, $width - 8, 8, $setPattern, 8);
$yOffset = $width - 8;
for($y=0; $y<8; $y++,$yOffset++) {
$frame[$y][8] = "\x84";
$frame[$yOffset][8] = "\x84";
}
// Timing pattern
for($i=1; $i<$width-15; $i++) {
$frame[6][7+$i] = chr(0x90 | ($i & 1));
$frame[7+$i][6] = chr(0x90 | ($i & 1));
}
// Alignment pattern
self::putAlignmentPattern($version, $frame, $width);
// Version information
if($version >= 7) {
$vinf = self::getVersionPattern($version);
$v = $vinf;
for($x=0; $x<6; $x++) {
for($y=0; $y<3; $y++) {
$frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
$v = $v >> 1;
}
}
$v = $vinf;
for($y=0; $y<6; $y++) {
for($x=0; $x<3; $x++) {
$frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
$v = $v >> 1;
}
}
}
// and a little bit...
$frame[$width - 8][8] = "\x81";
return $frame;
}
//----------------------------------------------------------------------
public static function debug($frame, $binary_mode = false)
{
if ($binary_mode) {
foreach ($frame as &$frameLine) {
$frameLine = join(' ', explode('0', $frameLine));
$frameLine = join('██', explode('1', $frameLine));
}
?>
';
echo join(" ", $frame);
echo ' ';
} else {
foreach ($frame as &$frameLine) {
$frameLine = join(' ', explode("\xc0", $frameLine));
$frameLine = join('▒ ', explode("\xc1", $frameLine));
$frameLine = join(' ', explode("\xa0", $frameLine));
$frameLine = join('▒ ', explode("\xa1", $frameLine));
$frameLine = join('◇ ', explode("\x84", $frameLine)); //format 0
$frameLine = join('◆ ', explode("\x85", $frameLine)); //format 1
$frameLine = join('☢ ', explode("\x81", $frameLine)); //special bit
$frameLine = join(' ', explode("\x90", $frameLine)); //clock 0
$frameLine = join('◷ ', explode("\x91", $frameLine)); //clock 1
$frameLine = join(' ', explode("\x88", $frameLine)); //version
$frameLine = join('▒ ', explode("\x89", $frameLine)); //version
$frameLine = join('♦', explode("\x01", $frameLine));
$frameLine = join('⋅', explode("\0", $frameLine));
}
?>
";
echo join(" ", $frame);
echo " ";
}
}
//----------------------------------------------------------------------
public static function serial($frame)
{
return gzcompress(join("\n", $frame), 9);
}
//----------------------------------------------------------------------
public static function unserial($code)
{
return explode("\n", gzuncompress($code));
}
//----------------------------------------------------------------------
public static function newFrame($version)
{
if($version < 1 || $version > QRSPEC_VERSION_MAX)
return null;
if(!isset(self::$frames[$version])) {
$fileName = QR_CACHE_DIR.'frame_'.$version.'.dat';
if (QR_CACHEABLE) {
if (file_exists($fileName)) {
self::$frames[$version] = self::unserial(file_get_contents($fileName));
} else {
self::$frames[$version] = self::createFrame($version);
file_put_contents($fileName, self::serial(self::$frames[$version]));
}
} else {
self::$frames[$version] = self::createFrame($version);
}
}
if(is_null(self::$frames[$version]))
return null;
return self::$frames[$version];
}
//----------------------------------------------------------------------
public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; }
public static function rsBlockNum1($spec) { return $spec[0]; }
public static function rsDataCodes1($spec) { return $spec[1]; }
public static function rsEccCodes1($spec) { return $spec[2]; }
public static function rsBlockNum2($spec) { return $spec[3]; }
public static function rsDataCodes2($spec) { return $spec[4]; }
public static function rsEccCodes2($spec) { return $spec[2]; }
public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); }
public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; }
}
//---- qrimage.php -----------------------------
/*
* PHP QR Code encoder
*
* Image output of code using GD2
*
* PHP QR Code is distributed under LGPL 3
* Copyright (C) 2010 Dominik Dzienia
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
define('QR_IMAGE', true);
class QRimage {
//----------------------------------------------------------------------
public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE)
{
$image = self::image($frame, $pixelPerPoint, $outerFrame);
if ($filename === false) {
Header("Content-type: image/png");
ImagePng($image);
} else {
if($saveandprint===TRUE){
ImagePng($image, $filename);
header("Content-type: image/png");
ImagePng($image);
}else{
ImagePng($image, $filename);
}
}
ImageDestroy($image);
}
//----------------------------------------------------------------------
public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85)
{
$image = self::image($frame, $pixelPerPoint, $outerFrame);
if ($filename === false) {
Header("Content-type: image/jpeg");
ImageJpeg($image, null, $q);
} else {
ImageJpeg($image, $filename, $q);
}
ImageDestroy($image);
}
//----------------------------------------------------------------------
private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4)
{
$h = count($frame);
$w = strlen($frame[0]);
$imgW = $w + 2*$outerFrame;
$imgH = $h + 2*$outerFrame;
$base_image =ImageCreate($imgW, $imgH);
$col[0] = ImageColorAllocate($base_image,255,255,255);
$col[1] = ImageColorAllocate($base_image,0,0,0);
imagefill($base_image, 0, 0, $col[0]);
for($y=0; $y<$h; $y++) {
for($x=0; $x<$w; $x++) {
if ($frame[$y][$x] == '1') {
ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]);
}
}
}
$target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);
ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
ImageDestroy($base_image);
return $target_image;
}
}
//---- qrinput.php -----------------------------
/*
* PHP QR Code encoder
*
* Input encoding class
*
* Based on libqrencode C library distributed under LGPL 2.1
* Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
*
* PHP QR Code is distributed under LGPL 3
* Copyright (C) 2010 Dominik Dzienia
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
define('STRUCTURE_HEADER_BITS', 20);
define('MAX_STRUCTURED_SYMBOLS', 16);
class QRinputItem {
public $mode;
public $size;
public $data;
public $bstream;
public function __construct($mode, $size, $data, $bstream = null)
{
$setData = array_slice($data, 0, $size);
if (count($setData) < $size) {
$setData = array_merge($setData, array_fill(0,$size-count($setData),0));
}
if(!QRinput::check($mode, $size, $setData)) {
throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData));
return null;
}
$this->mode = $mode;
$this->size = $size;
$this->data = $setData;
$this->bstream = $bstream;
}
//----------------------------------------------------------------------
public function encodeModeNum($version)
{
try {
$words = (int)($this->size / 3);
$bs = new QRbitstream();
$val = 0x1;
$bs->appendNum(4, $val);
$bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size);
for($i=0; $i<$words; $i++) {
$val = (ord($this->data[$i*3 ]) - ord('0')) * 100;
$val += (ord($this->data[$i*3+1]) - ord('0')) * 10;
$val += (ord($this->data[$i*3+2]) - ord('0'));
$bs->appendNum(10, $val);
}
if($this->size - $words * 3 == 1) {
$val = ord($this->data[$words*3]) - ord('0');
$bs->appendNum(4, $val);
} else if($this->size - $words * 3 == 2) {
$val = (ord($this->data[$words*3 ]) - ord('0')) * 10;
$val += (ord($this->data[$words*3+1]) - ord('0'));
$bs->appendNum(7, $val);
}
$this->bstream = $bs;
return 0;
} catch (Exception $e) {
return -1;
}
}
//----------------------------------------------------------------------
public function encodeModeAn($version)
{
try {
$words = (int)($this->size / 2);
$bs = new QRbitstream();
$bs->appendNum(4, 0x02);
$bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size);
for($i=0; $i<$words; $i++) {
$val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45;
$val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1]));
$bs->appendNum(11, $val);
}
if($this->size & 1) {
$val = QRinput::lookAnTable(ord($this->data[$words * 2]));
$bs->appendNum(6, $val);
}
$this->bstream = $bs;
return 0;
} catch (Exception $e) {
return -1;
}
}
//----------------------------------------------------------------------
public function encodeMode8($version)
{
try {
$bs = new QRbitstream();
$bs->appendNum(4, 0x4);
$bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size);
for($i=0; $i<$this->size; $i++) {
$bs->appendNum(8, ord($this->data[$i]));
}
$this->bstream = $bs;
return 0;
} catch (Exception $e) {
return -1;
}
}
//----------------------------------------------------------------------
public function encodeModeKanji($version)
{
try {
$bs = new QRbitrtream();
$bs->appendNum(4, 0x8);
$bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2));
for($i=0; $i<$this->size; $i+=2) {
$val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]);
if($val <= 0x9ffc) {
$val -= 0x8140;
} else {
$val -= 0xc140;
}
$h = ($val >> 8) * 0xc0;
$val = ($val & 0xff) + $h;
$bs->appendNum(13, $val);
}
$this->bstream = $bs;
return 0;
} catch (Exception $e) {
return -1;
}
}
//----------------------------------------------------------------------
public function encodeModeStructure()
{
try {
$bs = new QRbitstream();
$bs->appendNum(4, 0x03);
$bs->appendNum(4, ord($this->data[1]) - 1);
$bs->appendNum(4, ord($this->data[0]) - 1);
$bs->appendNum(8, ord($this->data[2]));
$this->bstream = $bs;
return 0;
} catch (Exception $e) {
return -1;
}
}
//----------------------------------------------------------------------
public function estimateBitStreamSizeOfEntry($version)
{
$bits = 0;
if($version == 0)
$version = 1;
switch($this->mode) {
case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break;
case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break;
case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break;
case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break;
case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS;
default:
return 0;
}
$l = QRspec::lengthIndicator($this->mode, $version);
$m = 1 << $l;
$num = (int)(($this->size + $m - 1) / $m);
$bits += $num * (4 + $l);
return $bits;
}
//----------------------------------------------------------------------
public function encodeBitStream($version)
{
try {
unset($this->bstream);
$words = QRspec::maximumWords($this->mode, $version);
if($this->size > $words) {
$st1 = new QRinputItem($this->mode, $words, $this->data);
$st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words));
$st1->encodeBitStream($version);
$st2->encodeBitStream($version);
$this->bstream = new QRbitstream();
$this->bstream->append($st1->bstream);
$this->bstream->append($st2->bstream);
unset($st1);
unset($st2);
} else {
$ret = 0;
switch($this->mode) {
case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break;
case QR_MODE_AN: $ret = $this->encodeModeAn($version); break;
case QR_MODE_8: $ret = $this->encodeMode8($version); break;
case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break;
case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break;
default:
break;
}
if($ret < 0)
return -1;
}
return $this->bstream->size();
} catch (Exception $e) {
return -1;
}
}
};
//##########################################################################
class QRinput {
public $items;
private $version;
private $level;
//----------------------------------------------------------------------
public function __construct($version = 0, $level = QR_ECLEVEL_L)
{
if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) {
throw new Exception('Invalid version no');
return NULL;
}
$this->version = $version;
$this->level = $level;
}
//----------------------------------------------------------------------
public function getVersion()
{
return $this->version;
}
//----------------------------------------------------------------------
public function setVersion($version)
{
if($version < 0 || $version > QRSPEC_VERSION_MAX) {
throw new Exception('Invalid version no');
return -1;
}
$this->version = $version;
return 0;
}
//----------------------------------------------------------------------
public function getErrorCorrectionLevel()
{
return $this->level;
}
//----------------------------------------------------------------------
public function setErrorCorrectionLevel($level)
{
if($level > QR_ECLEVEL_H) {
throw new Exception('Invalid ECLEVEL');
return -1;
}
$this->level = $level;
return 0;
}
//----------------------------------------------------------------------
public function appendEntry(QRinputItem $entry)
{
$this->items[] = $entry;
}
//----------------------------------------------------------------------
public function append($mode, $size, $data)
{
try {
$entry = new QRinputItem($mode, $size, $data);
$this->items[] = $entry;
return 0;
} catch (Exception $e) {
return -1;
}
}
//----------------------------------------------------------------------
public function insertStructuredAppendHeader($size, $index, $parity)
{
if( $size > MAX_STRUCTURED_SYMBOLS ) {
throw new Exception('insertStructuredAppendHeader wrong size');
}
if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) {
throw new Exception('insertStructuredAppendHeader wrong index');
}
$buf = array($size, $index, $parity);
try {
$entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);
array_unshift($this->items, $entry);
return 0;
} catch (Exception $e) {
return -1;
}
}
//----------------------------------------------------------------------
public function calcParity()
{
$parity = 0;
foreach($this->items as $item) {
if($item->mode != QR_MODE_STRUCTURE) {
for($i=$item->size-1; $i>=0; $i--) {
$parity ^= $item->data[$i];
}
}
}
return $parity;
}
//----------------------------------------------------------------------
public static function checkModeNum($size, $data)
{
for($i=0; $i<$size; $i++) {
if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){
return false;
}
}
return true;
}
//----------------------------------------------------------------------
public static function estimateBitsModeNum($size)
{
$w = (int)$size / 3;
$bits = $w * 10;
switch($size - $w * 3) {
case 1:
$bits += 4;
break;
case 2:
$bits += 7;
break;
default:
break;
}
return $bits;
}
//----------------------------------------------------------------------
public static $anTable = array(
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1,
-1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
);
//----------------------------------------------------------------------
public static function lookAnTable($c)
{
return (($c > 127)?-1:self::$anTable[$c]);
}
//----------------------------------------------------------------------
public static function checkModeAn($size, $data)
{
for($i=0; $i<$size; $i++) {
if (self::lookAnTable(ord($data[$i])) == -1) {
return false;
}
}
return true;
}
//----------------------------------------------------------------------
public static function estimateBitsModeAn($size)
{
$w = (int)($size / 2);
$bits = $w * 11;
if($size & 1) {
$bits += 6;
}
return $bits;
}
//----------------------------------------------------------------------
public static function estimateBitsMode8($size)
{
return $size * 8;
}
//----------------------------------------------------------------------
public function estimateBitsModeKanji($size)
{
return (int)(($size / 2) * 13);
}
//----------------------------------------------------------------------
public static function checkModeKanji($size, $data)
{
if($size & 1)
return false;
for($i=0; $i<$size; $i+=2) {
$val = (ord($data[$i]) << 8) | ord($data[$i+1]);
if( $val < 0x8140
|| ($val > 0x9ffc && $val < 0xe040)
|| $val > 0xebbf) {
return false;
}
}
return true;
}
/***********************************************************************
* Validation
**********************************************************************/
public static function check($mode, $size, $data)
{
if($size <= 0)
return false;
switch($mode) {
case QR_MODE_NUM: return self::checkModeNum($size, $data); break;
case QR_MODE_AN: return self::checkModeAn($size, $data); break;
case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break;
case QR_MODE_8: return true; break;
case QR_MODE_STRUCTURE: return true; break;
default:
break;
}
return false;
}
//----------------------------------------------------------------------
public function estimateBitStreamSize($version)
{
$bits = 0;
foreach($this->items as $item) {
$bits += $item->estimateBitStreamSizeOfEntry($version);
}
return $bits;
}
//----------------------------------------------------------------------
public function estimateVersion()
{
$version = 0;
$prev = 0;
do {
$prev = $version;
$bits = $this->estimateBitStreamSize($prev);
$version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
if ($version < 0) {
return -1;
}
} while ($version > $prev);
return $version;
}
//----------------------------------------------------------------------
public static function lengthOfCode($mode, $version, $bits)
{
$payload = $bits - 4 - QRspec::lengthIndicator($mode, $version);
switch($mode) {
case QR_MODE_NUM:
$chunks = (int)($payload / 10);
$remain = $payload - $chunks * 10;
$size = $chunks * 3;
if($remain >= 7) {
$size += 2;
} else if($remain >= 4) {
$size += 1;
}
break;
case QR_MODE_AN:
$chunks = (int)($payload / 11);
$remain = $payload - $chunks * 11;
$size = $chunks * 2;
if($remain >= 6)
$size++;
break;
case QR_MODE_8:
$size = (int)($payload / 8);
break;
case QR_MODE_KANJI:
$size = (int)(($payload / 13) * 2);
break;
case QR_MODE_STRUCTURE:
$size = (int)($payload / 8);
break;
default:
$size = 0;
break;
}
$maxsize = QRspec::maximumWords($mode, $version);
if($size < 0) $size = 0;
if($size > $maxsize) $size = $maxsize;
return $size;
}
//----------------------------------------------------------------------
public function createBitStream()
{
$total = 0;
foreach($this->items as $item) {
$bits = $item->encodeBitStream($this->version);
if($bits < 0)
return -1;
$total += $bits;
}
return $total;
}
//----------------------------------------------------------------------
public function convertData()
{
$ver = $this->estimateVersion();
if($ver > $this->getVersion()) {
$this->setVersion($ver);
}
for(;;) {
$bits = $this->createBitStream();
if($bits < 0)
return -1;
$ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
if($ver < 0) {
throw new Exception('WRONG VERSION');
return -1;
} else if($ver > $this->getVersion()) {
$this->setVersion($ver);
} else {
break;
}
}
return 0;
}
//----------------------------------------------------------------------
public function appendPaddingBit(&$bstream)
{
$bits = $bstream->size();
$maxwords = QRspec::getDataLength($this->version, $this->level);
$maxbits = $maxwords * 8;
if ($maxbits == $bits) {
return 0;
}
if ($maxbits - $bits < 5) {
return $bstream->appendNum($maxbits - $bits, 0);
}
$bits += 4;
$words = (int)(($bits + 7) / 8);
$padding = new QRbitstream();
$ret = $padding->appendNum($words * 8 - $bits + 4, 0);
if($ret < 0)
return $ret;
$padlen = $maxwords - $words;
if($padlen > 0) {
$padbuf = array();
for($i=0; $i<$padlen; $i++) {
$padbuf[$i] = ($i&1)?0x11:0xec;
}
$ret = $padding->appendBytes($padlen, $padbuf);
if($ret < 0)
return $ret;
}
$ret = $bstream->append($padding);
return $ret;
}
//----------------------------------------------------------------------
public function mergeBitStream()
{
if($this->convertData() < 0) {
return null;
}
$bstream = new QRbitstream();
foreach($this->items as $item) {
$ret = $bstream->append($item->bstream);
if($ret < 0) {
return null;
}
}
return $bstream;
}
//----------------------------------------------------------------------
public function getBitStream()
{
$bstream = $this->mergeBitStream();
if($bstream == null) {
return null;
}
$ret = $this->appendPaddingBit($bstream);
if($ret < 0) {
return null;
}
return $bstream;
}
//----------------------------------------------------------------------
public function getByteStream()
{
$bstream = $this->getBitStream();
if($bstream == null) {
return null;
}
return $bstream->toByte();
}
}
//---- qrbitstream.php -----------------------------
/*
* PHP QR Code encoder
*
* Bitstream class
*
* Based on libqrencode C library distributed under LGPL 2.1
* Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
*
* PHP QR Code is distributed under LGPL 3
* Copyright (C) 2010 Dominik Dzienia
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
class QRbitstream {
public $data = array();
//----------------------------------------------------------------------
public function size()
{
return count($this->data);
}
//----------------------------------------------------------------------
public function allocate($setLength)
{
$this->data = array_fill(0, $setLength, 0);
return 0;
}
//----------------------------------------------------------------------
public static function newFromNum($bits, $num)
{
$bstream = new QRbitstream();
$bstream->allocate($bits);
$mask = 1 << ($bits - 1);
for($i=0; $i<$bits; $i++) {
if($num & $mask) {
$bstream->data[$i] = 1;
} else {
$bstream->data[$i] = 0;
}
$mask = $mask >> 1;
}
return $bstream;
}
//----------------------------------------------------------------------
public static function newFromBytes($size, $data)
{
$bstream = new QRbitstream();
$bstream->allocate($size * 8);
$p=0;
for($i=0; $i<$size; $i++) {
$mask = 0x80;
for($j=0; $j<8; $j++) {
if($data[$i] & $mask) {
$bstream->data[$p] = 1;
} else {
$bstream->data[$p] = 0;
}
$p++;
$mask = $mask >> 1;
}
}
return $bstream;
}
//----------------------------------------------------------------------
public function append(QRbitstream $arg)
{
if (is_null($arg)) {
return -1;
}
if($arg->size() == 0) {
return 0;
}
if($this->size() == 0) {
$this->data = $arg->data;
return 0;
}
$this->data = array_values(array_merge($this->data, $arg->data));
return 0;
}
//----------------------------------------------------------------------
public function appendNum($bits, $num)
{
if ($bits == 0)
return 0;
$b = QRbitstream::newFromNum($bits, $num);
if(is_null($b))
return -1;
$ret = $this->append($b);
unset($b);
return $ret;
}
//----------------------------------------------------------------------
public function appendBytes($size, $data)
{
if ($size == 0)
return 0;
$b = QRbitstream::newFromBytes($size, $data);
if(is_null($b))
return -1;
$ret = $this->append($b);
unset($b);
return $ret;
}
//----------------------------------------------------------------------
public function toByte()
{
$size = $this->size();
if($size == 0) {
return array();
}
$data = array_fill(0, (int)(($size + 7) / 8), 0);
$bytes = (int)($size / 8);
$p = 0;
for($i=0; $i<$bytes; $i++) {
$v = 0;
for($j=0; $j<8; $j++) {
$v = $v << 1;
$v |= $this->data[$p];
$p++;
}
$data[$i] = $v;
}
if($size & 7) {
$v = 0;
for($j=0; $j<($size & 7); $j++) {
$v = $v << 1;
$v |= $this->data[$p];
$p++;
}
$data[$bytes] = $v;
}
return $data;
}
}
//---- qrsplit.php -----------------------------
/*
* PHP QR Code encoder
*
* Input splitting classes
*
* Based on libqrencode C library distributed under LGPL 2.1
* Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
*
* PHP QR Code is distributed under LGPL 3
* Copyright (C) 2010 Dominik Dzienia
*
* The following data / specifications are taken from
* "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
* or
* "Automatic identification and data capture techniques --
* QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
class QRsplit {
public $dataStr = '';
public $input;
public $modeHint;
//----------------------------------------------------------------------
public function __construct($dataStr, $input, $modeHint)
{
$this->dataStr = $dataStr;
$this->input = $input;
$this->modeHint = $modeHint;
}
//----------------------------------------------------------------------
public static function isdigitat($str, $pos)
{
if ($pos >= strlen($str))
return false;
return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
}
//----------------------------------------------------------------------
public static function isalnumat($str, $pos)
{
if ($pos >= strlen($str))
return false;
return (QRinput::lookAnTable(ord($str[$pos])) >= 0);
}
//----------------------------------------------------------------------
public function identifyMode($pos)
{
if ($pos >= strlen($this->dataStr))
return QR_MODE_NUL;
$c = $this->dataStr[$pos];
if(self::isdigitat($this->dataStr, $pos)) {
return QR_MODE_NUM;
} else if(self::isalnumat($this->dataStr, $pos)) {
return QR_MODE_AN;
} else if($this->modeHint == QR_MODE_KANJI) {
if ($pos+1 < strlen($this->dataStr))
{
$d = $this->dataStr[$pos+1];
$word = (ord($c) << 8) | ord($d);
if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) {
return QR_MODE_KANJI;
}
}
}
return QR_MODE_8;
}
//----------------------------------------------------------------------
public function eatNum()
{
$ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
$p = 0;
while(self::isdigitat($this->dataStr, $p)) {
$p++;
}
$run = $p;
$mode = $this->identifyMode($p);
if($mode == QR_MODE_8) {
$dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ QRinput::estimateBitsMode8(1) // + 4 + l8
- QRinput::estimateBitsMode8($run + 1); // - 4 - l8
if($dif > 0) {
return $this->eat8();
}
}
if($mode == QR_MODE_AN) {
$dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ QRinput::estimateBitsModeAn(1) // + 4 + la
- QRinput::estimateBitsModeAn($run + 1);// - 4 - la
if($dif > 0) {
return $this->eatAn();
}
}
$ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr));
if($ret < 0)
return -1;
return $run;
}
//----------------------------------------------------------------------
public function eatAn()
{
$la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
$ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
$p = 0;
while(self::isalnumat($this->dataStr, $p)) {
if(self::isdigitat($this->dataStr, $p)) {
$q = $p;
while(self::isdigitat($this->dataStr, $q)) {
$q++;
}
$dif = QRinput::estimateBitsModeAn($p) // + 4 + la
+ QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
- QRinput::estimateBitsModeAn($q); // - 4 - la
if($dif < 0) {
break;
} else {
$p = $q;
}
} else {
$p++;
}
}
$run = $p;
if(!self::isalnumat($this->dataStr, $p)) {
$dif = QRinput::estimateBitsModeAn($run) + 4 + $la
+ QRinput::estimateBitsMode8(1) // + 4 + l8
- QRinput::estimateBitsMode8($run + 1); // - 4 - l8
if($dif > 0) {
return $this->eat8();
}
}
$ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr));
if($ret < 0)
return -1;
return $run;
}
//----------------------------------------------------------------------
public function eatKanji()
{
$p = 0;
while($this->identifyMode($p) == QR_MODE_KANJI) {
$p += 2;
}
$ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr));
if($ret < 0)
return -1;
return $run;
}
//----------------------------------------------------------------------
public function eat8()
{
$la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
$ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
$p = 1;
$dataStrLen = strlen($this->dataStr);
while($p < $dataStrLen) {
$mode = $this->identifyMode($p);
if($mode == QR_MODE_KANJI) {
break;
}
if($mode == QR_MODE_NUM) {
$q = $p;
while(self::isdigitat($this->dataStr, $q)) {
$q++;
}
$dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
- QRinput::estimateBitsMode8($q); // - 4 - l8
if($dif < 0) {
break;
} else {
$p = $q;
}
} else if($mode == QR_MODE_AN) {
$q = $p;
while(self::isalnumat($this->dataStr, $q)) {
$q++;
}
$dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ QRinput::estimateBitsModeAn($q - $p) + 4 + $la
- QRinput::estimateBitsMode8($q); // - 4 - l8
if($dif < 0) {
break;
} else {
$p = $q;
}
} else {
$p++;
}
}
$run = $p;
$ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr));
if($ret < 0)
return -1;
return $run;
}
//----------------------------------------------------------------------
public function splitString()
{
while (strlen($this->dataStr) > 0)
{
if($this->dataStr == '')
return 0;
$mode = $this->identifyMode(0);
switch ($mode) {
case QR_MODE_NUM: $length = $this->eatNum(); break;
case QR_MODE_AN: $length = $this->eatAn(); break;
case QR_MODE_KANJI:
if ($hint == QR_MODE_KANJI)
$length = $this->eatKanji();
else $length = $this->eat8();
break;
default: $length = $this->eat8(); break;
}
if($length == 0) return 0;
if($length < 0) return -1;
$this->dataStr = substr($this->dataStr, $length);
}
}
//----------------------------------------------------------------------
public function toUpper()
{
$stringLen = strlen($this->dataStr);
$p = 0;
while ($p<$stringLen) {
$mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint);
if($mode == QR_MODE_KANJI) {
$p += 2;
} else {
if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) {
$this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
}
$p++;
}
}
return $this->dataStr;
}
//----------------------------------------------------------------------
public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true)
{
if(is_null($string) || $string == '\0' || $string == '') {
throw new Exception('empty string!!!');
}
$split = new QRsplit($string, $input, $modeHint);
if(!$casesensitive)
$split->toUpper();
return $split->splitString();
}
}
//---- qrrscode.php -----------------------------
/*
* PHP QR Code encoder
*
* Reed-Solomon error correction support
*
* Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
* (libfec is released under the GNU Lesser General Public License.)
*
* Based on libqrencode C library distributed under LGPL 2.1
* Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
*
* PHP QR Code is distributed under LGPL 3
* Copyright (C) 2010 Dominik Dzienia
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
class QRrsItem {
public $mm; // Bits per symbol
public $nn; // Symbols per block (= (1<= $this->nn) {
$x -= $this->nn;
$x = ($x >> $this->mm) + ($x & $this->nn);
}
return $x;
}
//----------------------------------------------------------------------
public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
{
// Common code for intializing a Reed-Solomon control block (char or int symbols)
// Copyright 2004 Phil Karn, KA9Q
// May be used under the terms of the GNU Lesser General Public License (LGPL)
$rs = null;
// Check parameter ranges
if($symsize < 0 || $symsize > 8) return $rs;
if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs;
if($prim <= 0 || $prim >= (1<<$symsize)) return $rs;
if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values!
if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding
$rs = new QRrsItem();
$rs->mm = $symsize;
$rs->nn = (1<<$symsize)-1;
$rs->pad = $pad;
$rs->alpha_to = array_fill(0, $rs->nn+1, 0);
$rs->index_of = array_fill(0, $rs->nn+1, 0);
// PHP style macro replacement ;)
$NN =& $rs->nn;
$A0 =& $NN;
// Generate Galois field lookup tables
$rs->index_of[0] = $A0; // log(zero) = -inf
$rs->alpha_to[$A0] = 0; // alpha**-inf = 0
$sr = 1;
for($i=0; $i<$rs->nn; $i++) {
$rs->index_of[$sr] = $i;
$rs->alpha_to[$i] = $sr;
$sr <<= 1;
if($sr & (1<<$symsize)) {
$sr ^= $gfpoly;
}
$sr &= $rs->nn;
}
if($sr != 1){
// field generator polynomial is not primitive!
$rs = NULL;
return $rs;
}
/* Form RS code generator polynomial from its roots */
$rs->genpoly = array_fill(0, $nroots+1, 0);
$rs->fcr = $fcr;
$rs->prim = $prim;
$rs->nroots = $nroots;
$rs->gfpoly = $gfpoly;
/* Find prim-th root of 1, used in decoding */
for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn)
; // intentional empty-body loop!
$rs->iprim = (int)($iprim / $prim);
$rs->genpoly[0] = 1;
for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
$rs->genpoly[$i+1] = 1;
// Multiply rs->genpoly[] by @**(root + x)
for ($j = $i; $j > 0; $j--) {
if ($rs->genpoly[$j] != 0) {
$rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)];
} else {
$rs->genpoly[$j] = $rs->genpoly[$j-1];
}
}
// rs->genpoly[0] can never be zero
$rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)];
}
// convert rs->genpoly[] to index form for quicker encoding
for ($i = 0; $i <= $nroots; $i++)
$rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]];
return $rs;
}
//----------------------------------------------------------------------
public function encode_rs_char($data, &$parity)
{
$MM =& $this->mm;
$NN =& $this->nn;
$ALPHA_TO =& $this->alpha_to;
$INDEX_OF =& $this->index_of;
$GENPOLY =& $this->genpoly;
$NROOTS =& $this->nroots;
$FCR =& $this->fcr;
$PRIM =& $this->prim;
$IPRIM =& $this->iprim;
$PAD =& $this->pad;
$A0 =& $NN;
$parity = array_fill(0, $NROOTS, 0);
for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) {
$feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
if($feedback != $A0) {
// feedback term is non-zero
// This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
// always be for the polynomials constructed by init_rs()
$feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback);
for($j=1;$j<$NROOTS;$j++) {
$parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])];
}
}
// Shift
array_shift($parity);
if($feedback != $A0) {
array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]);
} else {
array_push($parity, 0);
}
}
}
}
//##########################################################################
class QRrs {
public static $items = array();
//----------------------------------------------------------------------
public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
{
foreach(self::$items as $rs) {
if($rs->pad != $pad) continue;
if($rs->nroots != $nroots) continue;
if($rs->mm != $symsize) continue;
if($rs->gfpoly != $gfpoly) continue;
if($rs->fcr != $fcr) continue;
if($rs->prim != $prim) continue;
return $rs;
}
$rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
array_unshift(self::$items, $rs);
return $rs;
}
}
//---- qrmask.php -----------------------------
/*
* PHP QR Code encoder
*
* Masking
*
* Based on libqrencode C library distributed under LGPL 2.1
* Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
*
* PHP QR Code is distributed under LGPL 3
* Copyright (C) 2010 Dominik Dzienia
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
define('N1', 3);
define('N2', 3);
define('N3', 40);
define('N4', 10);
class QRmask {
public $runLength = array();
//----------------------------------------------------------------------
public function __construct()
{
$this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
}
//----------------------------------------------------------------------
public function writeFormatInformation($width, &$frame, $mask, $level)
{
$blacks = 0;
$format = QRspec::getFormatInfo($mask, $level);
for($i=0; $i<8; $i++) {
if($format & 1) {
$blacks += 2;
$v = 0x85;
} else {
$v = 0x84;
}
$frame[8][$width - 1 - $i] = chr($v);
if($i < 6) {
$frame[$i][8] = chr($v);
} else {
$frame[$i + 1][8] = chr($v);
}
$format = $format >> 1;
}
for($i=0; $i<7; $i++) {
if($format & 1) {
$blacks += 2;
$v = 0x85;
} else {
$v = 0x84;
}
$frame[$width - 7 + $i][8] = chr($v);
if($i == 0) {
$frame[8][7] = chr($v);
} else {
$frame[8][6 - $i] = chr($v);
}
$format = $format >> 1;
}
return $blacks;
}
//----------------------------------------------------------------------
public function mask0($x, $y) { return ($x+$y)&1; }
public function mask1($x, $y) { return ($y&1); }
public function mask2($x, $y) { return ($x%3); }
public function mask3($x, $y) { return ($x+$y)%3; }
public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; }
public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; }
public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; }
public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; }
//----------------------------------------------------------------------
private function generateMaskNo($maskNo, $width, $frame)
{
$bitMask = array_fill(0, $width, array_fill(0, $width, 0));
for($y=0; $y<$width; $y++) {
for($x=0; $x<$width; $x++) {
if(ord($frame[$y][$x]) & 0x80) {
$bitMask[$y][$x] = 0;
} else {
$maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
$bitMask[$y][$x] = ($maskFunc == 0)?1:0;
}
}
}
return $bitMask;
}
//----------------------------------------------------------------------
public static function serial($bitFrame)
{
$codeArr = array();
foreach ($bitFrame as $line)
$codeArr[] = join('', $line);
return gzcompress(join("\n", $codeArr), 9);
}
//----------------------------------------------------------------------
public static function unserial($code)
{
$codeArr = array();
$codeLines = explode("\n", gzuncompress($code));
foreach ($codeLines as $line)
$codeArr[] = str_split($line);
return $codeArr;
}
//----------------------------------------------------------------------
public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false)
{
$b = 0;
$bitMask = array();
$fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat';
if (QR_CACHEABLE) {
if (file_exists($fileName)) {
$bitMask = self::unserial(file_get_contents($fileName));
} else {
$bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo))
mkdir(QR_CACHE_DIR.'mask_'.$maskNo);
file_put_contents($fileName, self::serial($bitMask));
}
} else {
$bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
}
if ($maskGenOnly)
return;
$d = $s;
for($y=0; $y<$width; $y++) {
for($x=0; $x<$width; $x++) {
if($bitMask[$y][$x] == 1) {
$d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);
}
$b += (int)(ord($d[$y][$x]) & 1);
}
}
return $b;
}
//----------------------------------------------------------------------
public function makeMask($width, $frame, $maskNo, $level)
{
$masked = array_fill(0, $width, str_repeat("\0", $width));
$this->makeMaskNo($maskNo, $width, $frame, $masked);
$this->writeFormatInformation($width, $masked, $maskNo, $level);
return $masked;
}
//----------------------------------------------------------------------
public function calcN1N3($length)
{
$demerit = 0;
for($i=0; $i<$length; $i++) {
if($this->runLength[$i] >= 5) {
$demerit += (N1 + ($this->runLength[$i] - 5));
}
if($i & 1) {
if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) {
$fact = (int)($this->runLength[$i] / 3);
if(($this->runLength[$i-2] == $fact) &&
($this->runLength[$i-1] == $fact) &&
($this->runLength[$i+1] == $fact) &&
($this->runLength[$i+2] == $fact)) {
if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) {
$demerit += N3;
} else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) {
$demerit += N3;
}
}
}
}
}
return $demerit;
}
//----------------------------------------------------------------------
public function evaluateSymbol($width, $frame)
{
$head = 0;
$demerit = 0;
for($y=0; $y<$width; $y++) {
$head = 0;
$this->runLength[0] = 1;
$frameY = $frame[$y];
if ($y>0)
$frameYM = $frame[$y-1];
for($x=0; $x<$width; $x++) {
if(($x > 0) && ($y > 0)) {
$b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
$w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
if(($b22 | ($w22 ^ 1))&1) {
$demerit += N2;
}
}
if(($x == 0) && (ord($frameY[$x]) & 1)) {
$this->runLength[0] = -1;
$head = 1;
$this->runLength[$head] = 1;
} else if($x > 0) {
if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
$head++;
$this->runLength[$head] = 1;
} else {
$this->runLength[$head]++;
}
}
}
$demerit += $this->calcN1N3($head+1);
}
for($x=0; $x<$width; $x++) {
$head = 0;
$this->runLength[0] = 1;
for($y=0; $y<$width; $y++) {
if($y == 0 && (ord($frame[$y][$x]) & 1)) {
$this->runLength[0] = -1;
$head = 1;
$this->runLength[$head] = 1;
} else if($y > 0) {
if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
$head++;
$this->runLength[$head] = 1;
} else {
$this->runLength[$head]++;
}
}
}
$demerit += $this->calcN1N3($head+1);
}
return $demerit;
}
//----------------------------------------------------------------------
public function mask($width, $frame, $level)
{
$minDemerit = PHP_INT_MAX;
$bestMaskNum = 0;
$bestMask = array();
$checked_masks = array(0,1,2,3,4,5,6,7);
if (QR_FIND_FROM_RANDOM !== false) {
$howManuOut = 8-(QR_FIND_FROM_RANDOM % 9);
for ($i = 0; $i < $howManuOut; $i++) {
$remPos = rand (0, count($checked_masks)-1);
unset($checked_masks[$remPos]);
$checked_masks = array_values($checked_masks);
}
}
$bestMask = $frame;
foreach($checked_masks as $i) {
$mask = array_fill(0, $width, str_repeat("\0", $width));
$demerit = 0;
$blacks = 0;
$blacks = $this->makeMaskNo($i, $width, $frame, $mask);
$blacks += $this->writeFormatInformation($width, $mask, $i, $level);
$blacks = (int)(100 * $blacks / ($width * $width));
$demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
$demerit += $this->evaluateSymbol($width, $mask);
if($demerit < $minDemerit) {
$minDemerit = $demerit;
$bestMask = $mask;
$bestMaskNum = $i;
}
}
return $bestMask;
}
//----------------------------------------------------------------------
}
//---- qrencode.php -----------------------------
/*
* PHP QR Code encoder
*
* Main encoder classes.
*
* Based on libqrencode C library distributed under LGPL 2.1
* Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
*
* PHP QR Code is distributed under LGPL 3
* Copyright (C) 2010 Dominik Dzienia
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
class QRrsblock {
public $dataLength;
public $data = array();
public $eccLength;
public $ecc = array();
public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs)
{
$rs->encode_rs_char($data, $ecc);
$this->dataLength = $dl;
$this->data = $data;
$this->eccLength = $el;
$this->ecc = $ecc;
}
};
//##########################################################################
class QRrawcode {
public $version;
public $datacode = array();
public $ecccode = array();
public $blocks;
public $rsblocks = array(); //of RSblock
public $count;
public $dataLength;
public $eccLength;
public $b1;
//----------------------------------------------------------------------
public function __construct(QRinput $input)
{
$spec = array(0,0,0,0,0);
$this->datacode = $input->getByteStream();
if(is_null($this->datacode)) {
throw new Exception('null imput string');
}
QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec);
$this->version = $input->getVersion();
$this->b1 = QRspec::rsBlockNum1($spec);
$this->dataLength = QRspec::rsDataLength($spec);
$this->eccLength = QRspec::rsEccLength($spec);
$this->ecccode = array_fill(0, $this->eccLength, 0);
$this->blocks = QRspec::rsBlockNum($spec);
$ret = $this->init($spec);
if($ret < 0) {
throw new Exception('block alloc error');
return null;
}
$this->count = 0;
}
//----------------------------------------------------------------------
public function init(array $spec)
{
$dl = QRspec::rsDataCodes1($spec);
$el = QRspec::rsEccCodes1($spec);
$rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
$blockNo = 0;
$dataPos = 0;
$eccPos = 0;
for($i=0; $iecccode,$eccPos);
$this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
$this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
$dataPos += $dl;
$eccPos += $el;
$blockNo++;
}
if(QRspec::rsBlockNum2($spec) == 0)
return 0;
$dl = QRspec::rsDataCodes2($spec);
$el = QRspec::rsEccCodes2($spec);
$rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
if($rs == NULL) return -1;
for($i=0; $iecccode,$eccPos);
$this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
$this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
$dataPos += $dl;
$eccPos += $el;
$blockNo++;
}
return 0;
}
//----------------------------------------------------------------------
public function getCode()
{
$ret;
if($this->count < $this->dataLength) {
$row = $this->count % $this->blocks;
$col = $this->count / $this->blocks;
if($col >= $this->rsblocks[0]->dataLength) {
$row += $this->b1;
}
$ret = $this->rsblocks[$row]->data[$col];
} else if($this->count < $this->dataLength + $this->eccLength) {
$row = ($this->count - $this->dataLength) % $this->blocks;
$col = ($this->count - $this->dataLength) / $this->blocks;
$ret = $this->rsblocks[$row]->ecc[$col];
} else {
return 0;
}
$this->count++;
return $ret;
}
}
//##########################################################################
class QRcode {
public $version;
public $width;
public $data;
//----------------------------------------------------------------------
public function encodeMask(QRinput $input, $mask)
{
if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) {
throw new Exception('wrong version');
}
if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {
throw new Exception('wrong level');
}
$raw = new QRrawcode($input);
QRtools::markTime('after_raw');
$version = $raw->version;
$width = QRspec::getWidth($version);
$frame = QRspec::newFrame($version);
$filler = new FrameFiller($width, $frame);
if(is_null($filler)) {
return NULL;
}
// inteleaved data and ecc codes
for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) {
$code = $raw->getCode();
$bit = 0x80;
for($j=0; $j<8; $j++) {
$addr = $filler->next();
$filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
$bit = $bit >> 1;
}
}
QRtools::markTime('after_filler');
unset($raw);
// remainder bits
$j = QRspec::getRemainder($version);
for($i=0; $i<$j; $i++) {
$addr = $filler->next();
$filler->setFrameAt($addr, 0x02);
}
$frame = $filler->frame;
unset($filler);
// masking
$maskObj = new QRmask();
if($mask < 0) {
if (QR_FIND_BEST_MASK) {
$masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());
} else {
$masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());
}
} else {
$masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());
}
if($masked == NULL) {
return NULL;
}
QRtools::markTime('after_mask');
$this->version = $version;
$this->width = $width;
$this->data = $masked;
return $this;
}
//----------------------------------------------------------------------
public function encodeInput(QRinput $input)
{
return $this->encodeMask($input, -1);
}
//----------------------------------------------------------------------
public function encodeString8bit($string, $version, $level)
{
if(string == NULL) {
throw new Exception('empty string!');
return NULL;
}
$input = new QRinput($version, $level);
if($input == NULL) return NULL;
$ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string));
if($ret < 0) {
unset($input);
return NULL;
}
return $this->encodeInput($input);
}
//----------------------------------------------------------------------
public function encodeString($string, $version, $level, $hint, $casesensitive)
{
if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {
throw new Exception('bad hint');
return NULL;
}
$input = new QRinput($version, $level);
if($input == NULL) return NULL;
$ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive);
if($ret < 0) {
return NULL;
}
return $this->encodeInput($input);
}
//----------------------------------------------------------------------
public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
{
$enc = QRencode::factory($level, $size, $margin);
return $enc->encodePNG($text, $outfile, $saveandprint=false);
}
//----------------------------------------------------------------------
public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
{
$enc = QRencode::factory($level, $size, $margin);
return $enc->encode($text, $outfile);
}
//----------------------------------------------------------------------
public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
{
$enc = QRencode::factory($level, $size, $margin);
return $enc->encodeRAW($text, $outfile);
}
}
//##########################################################################
class FrameFiller {
public $width;
public $frame;
public $x;
public $y;
public $dir;
public $bit;
//----------------------------------------------------------------------
public function __construct($width, &$frame)
{
$this->width = $width;
$this->frame = $frame;
$this->x = $width - 1;
$this->y = $width - 1;
$this->dir = -1;
$this->bit = -1;
}
//----------------------------------------------------------------------
public function setFrameAt($at, $val)
{
$this->frame[$at['y']][$at['x']] = chr($val);
}
//----------------------------------------------------------------------
public function getFrameAt($at)
{
return ord($this->frame[$at['y']][$at['x']]);
}
//----------------------------------------------------------------------
public function next()
{
do {
if($this->bit == -1) {
$this->bit = 0;
return array('x'=>$this->x, 'y'=>$this->y);
}
$x = $this->x;
$y = $this->y;
$w = $this->width;
if($this->bit == 0) {
$x--;
$this->bit++;
} else {
$x++;
$y += $this->dir;
$this->bit--;
}
if($this->dir < 0) {
if($y < 0) {
$y = 0;
$x -= 2;
$this->dir = 1;
if($x == 6) {
$x--;
$y = 9;
}
}
} else {
if($y == $w) {
$y = $w - 1;
$x -= 2;
$this->dir = -1;
if($x == 6) {
$x--;
$y -= 8;
}
}
}
if($x < 0 || $y < 0) return null;
$this->x = $x;
$this->y = $y;
} while(ord($this->frame[$y][$x]) & 0x80);
return array('x'=>$x, 'y'=>$y);
}
} ;
//##########################################################################
class QRencode {
public $casesensitive = true;
public $eightbit = false;
public $version = 0;
public $size = 3;
public $margin = 4;
public $structured = 0; // not supported yet
public $level = QR_ECLEVEL_L;
public $hint = QR_MODE_8;
//----------------------------------------------------------------------
public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4)
{
$enc = new QRencode();
$enc->size = $size;
$enc->margin = $margin;
switch ($level.'') {
case '0':
case '1':
case '2':
case '3':
$enc->level = $level;
break;
case 'l':
case 'L':
$enc->level = QR_ECLEVEL_L;
break;
case 'm':
case 'M':
$enc->level = QR_ECLEVEL_M;
break;
case 'q':
case 'Q':
$enc->level = QR_ECLEVEL_Q;
break;
case 'h':
case 'H':
$enc->level = QR_ECLEVEL_H;
break;
}
return $enc;
}
//----------------------------------------------------------------------
public function encodeRAW($intext, $outfile = false)
{
$code = new QRcode();
if($this->eightbit) {
$code->encodeString8bit($intext, $this->version, $this->level);
} else {
$code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
}
return $code->data;
}
//----------------------------------------------------------------------
public function encode($intext, $outfile = false)
{
$code = new QRcode();
if($this->eightbit) {
$code->encodeString8bit($intext, $this->version, $this->level);
} else {
$code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
}
QRtools::markTime('after_encode');
if ($outfile!== false) {
file_put_contents($outfile, join("\n", QRtools::binarize($code->data)));
} else {
return QRtools::binarize($code->data);
}
}
//----------------------------------------------------------------------
public function encodePNG($intext, $outfile = false,$saveandprint=false)
{
try {
ob_start();
$tab = $this->encode($intext);
$err = ob_get_contents();
ob_end_clean();
if ($err != '')
QRtools::log($outfile, $err);
$maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin));
QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint);
} catch (Exception $e) {
QRtools::log($outfile, $e->getMessage());
}
}
}
================================================
FILE: frphp/extend/pinyin.php
================================================
// +----------------------------------------------------------------------
// | Date:2018/02
// +----------------------------------------------------------------------
namespace frphp;
// 框架根目录
defined('CORE_PATH') or define('CORE_PATH', __DIR__);
// 内核版本信息
const FrPHP_VERSION = '2.1';
/**
* FrPHP框架核心
*/
class frphp
{
// 配置内容
protected $config = [];
public function __construct($config)
{
$this->config = $config;
//引入系统配置
//定义全局常量
$MyConfig = require(CORE_PATH.'/common/Config.php');
defined('APP_DEBUG') or define('APP_DEBUG', isset($config['APP_DEBUG']) ? $config['APP_DEBUG'] : $MyConfig['APP_DEBUG']);
defined('Tpl_style') or define('Tpl_style', isset($config['Tpl_style']) ? $config['Tpl_style'] : $MyConfig['Tpl_style']);
defined('Tpl_common') or define('Tpl_common', isset($config['Tpl_common']) ? $config['Tpl_common'] : $MyConfig['Tpl_common']);
defined('Tpl_template') or define('Tpl_template', isset($config['Tpl_template']) ? $config['Tpl_template'] : $MyConfig['Tpl_template']);
defined('APP_HOME') or define('APP_HOME', isset($config['APP_HOME']) ? $config['APP_HOME'] : $MyConfig['APP_HOME']);
defined('HOME_MODEL') or define('HOME_MODEL', isset($config['HOME_MODEL']) ? $config['HOME_MODEL'] : $MyConfig['HOME_MODEL']);
defined('HOME_CONTROLLER') or define('HOME_CONTROLLER', isset($config['HOME_CONTROLLER']) ? $config['HOME_CONTROLLER'] : $MyConfig['HOME_CONTROLLER']);
defined('HOME_VIEW') or define('HOME_VIEW', isset($config['HOME_VIEW']) ? $config['HOME_VIEW'] : $MyConfig['HOME_VIEW']);
defined('File_TXT') or define('File_TXT', isset($config['File_TXT']) ? $config['File_TXT'] : $MyConfig['File_TXT']);
defined('SessionTime') or define('SessionTime', isset($config['SessionTime']) ? $config['SessionTime'] : $MyConfig['SessionTime']);
defined('StopLog') or define('StopLog', isset($config['StopLog']) ? $config['StopLog'] : $MyConfig['StopLog']);
defined('DefaultController') or define('DefaultController', isset($config['DefaultController']) ? $config['DefaultController'] : $MyConfig['DefaultController']);
defined('DefaultAction') or define('DefaultAction', isset($config['DefaultAction']) ? $config['DefaultAction'] : $MyConfig['DefaultAction']);
defined('open_url_route') or define('open_url_route', isset($config['open_url_route']) ? $config['open_url_route'] : $MyConfig['open_url_route']);
defined('open_redis_session') or define('open_redis_session', isset($config['open_redis_session']) ? $config['open_redis_session'] : $MyConfig['open_redis_session']);
defined('Cache_Path') or define('Cache_Path', isset($config['Cache_Path']) ? $config['Cache_Path'] : $MyConfig['Cache_Path']);
defined('Session_Path') or define('Session_Path', isset($config['Session_Path']) ? $config['Session_Path'] : $MyConfig['Session_Path']);
defined('APP_LANG') or define('APP_LANG', isset($config['APP_LANG']) ? $config['APP_LANG'] : $MyConfig['APP_LANG']);
defined('APP_LANG_REQUREST') or define('APP_LANG_REQUREST', isset($config['APP_LANG_REQUREST']) ? $config['APP_LANG_REQUREST'] : $MyConfig['APP_LANG_REQUREST']);
defined('ROOT') or define('ROOT', isset($config['ROOT']) ? $config['ROOT'] : $MyConfig['ROOT']);
defined('File_TXT_HIDE') or define('File_TXT_HIDE', isset($config['File_TXT_HIDE']) ? $config['File_TXT_HIDE'] : $MyConfig['File_TXT_HIDE']);
defined('CLASS_HIDE_SLASH') or define('CLASS_HIDE_SLASH', isset($config['CLASS_HIDE_SLASH']) ? $config['CLASS_HIDE_SLASH'] : $MyConfig['CLASS_HIDE_SLASH']);
//引入系统函数
require(CORE_PATH.'/common/Functions.php');
//引入项目函数
$ext_fun = APP_PATH.'conf/Functions.php';
if(file_exists($ext_fun)){
require($ext_fun);
}
//引入扩展函数
$Extend = scandir(CORE_PATH.'/extend');
//var_dump($Extend);
foreach($Extend as $v){
if(strpos($v,'.php')!==false){
include CORE_PATH.'/extend/'.$v;
}
}
//检查缓存文件是否存在
if(!is_dir(Cache_Path)){
mkdir(Cache_Path);
}
if(!is_dir(Cache_Path.'/tmp')){
mkdir(Cache_Path.'/tmp');
}
//设置时区
@date_default_timezone_set('PRC');
}
// 运行程序
public function run()
{
spl_autoload_register(array($this, 'loadClass'));
$this->setDbConfig();
$this->setReporting();
$this->removeMagicQuotes();
//$this->unregisterGlobals();
$this->route();
}
// 路由处理
public function route()
{
//读取系统配置
$webconfig = getCache('webconfig');
if( !isset($webconfig['closesession']) || (isset($webconfig['closesession']) && $webconfig['closesession']==0) || APP_HOME=='app/admin'){
//检查是否开启redis_session ---2019/09/05 留恋风
if(open_redis_session || (isset($webconfig['openredis']) && $webconfig['openredis'])){
$session = new \SessionRedis($this->config['redis']);
session_set_save_handler($session,true);
if (!isset($_COOKIE['PHPSESSID'])) {
session_set_cookie_params($this->config['redis']['EXPIRE']);
if(!session_id()){ session_start();}
} else {
if(!session_id()){ session_start();}
setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() + $this->config['redis']['EXPIRE'],'/',"","",true);
}
//全局Redis
$redis = new \Redis();
$redis->connect($this->config['redis']['HOST'],$this->config['redis']['PORT']);
if($this->config['redis']['AUTH']){
$redis->auth($this->config['redis']['AUTH']);
}
$GLOBALS['Redis'] = $redis;
if(!$GLOBALS['Redis']){
exit('请检查Redis配置是否正确!');
}
}else{
//开启SESSION,并设置600s缓存时间
start_session(SessionTime);
$session = new \FrSession(array('save_path'=>Session_Path,'life_time'=>SessionTime));
session_set_save_handler($session,true);
if (!isset($_COOKIE['PHPSESSID'])) {
session_set_cookie_params(SessionTime);
if(!session_id()){ session_start();}
} else {
if(!session_id()){ session_start();}
setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() + SessionTime,'/',"","",true);
}
}
}
if(isset($_SERVER['argv']) && !isset($_SERVER['REQUEST_URI'])){
$url = urldecode($_SERVER['argv'][1]);
}else{
$url = urldecode($_SERVER['REQUEST_URI']);
}
//读取系统配置
$webconfig = getCache('webconfig');
if(!$webconfig){
$wcf = M('sysconfig')->findAll();
$webconfig = array();
foreach($wcf as $k=>$v){
if($v['field']=='web_js' || $v['field']=='ueditor_config'){
$v['data'] = html_decode($v['data']);
}
$webconfig[$v['field']] = $v['data'];
}
setCache('webconfig',$webconfig);
}
if($webconfig){
if($webconfig['iswap']==1){
$webconfig['mobile_html'] = $webconfig['mobile_html']=='' ? '/' : $webconfig['mobile_html'];
$url = str_replace('/'.$webconfig['mobile_html'].'/','/',$url);
}
$url = str_replace('/'.$webconfig['pc_html'].'/','/',$url);
}
//引入自定义路由
$route_ok = false;
$method = '';
if(open_url_route){
$open_url_route = include (APP_PATH.'conf/route.php');
$urls = '';
foreach($open_url_route as $k=>$v){
if($v!='' && $v[0]!='' && $v[1]!=''){
$route_ok = preg_match_all($v[0],$url,$matches);
$urls = $v[1];
$method = strtoupper($v[2]);
if($route_ok){
break;
}
}
}
if($route_ok){
//print_r($matches);
foreach($matches as $k=>$v){
$urls = str_replace('$'.$k,$v[0],$urls);
}
$url = $urls;
}
$position = strpos($url,'?');
if($position!==false){
$param = substr($url,$position+1);
parse_str($param,$_GET);
}
}else{
$open_url_route = [];
}
//去除二级目录
$url = str_replace(ROOT,'/',$url);
$url = format_param($url,6);
define('REQUEST_URI',$url);
$controllerName = DefaultController;
$actionName = DefaultAction;
$param = array();
$tpl = get_template();
define('TEMPLATE',$tpl);
// 清除?之后的内容
$position = strpos($url, '?');
$url = $position === false ? $url : substr($url, 0, $position);
//删除入口文件字符串
if(stripos($url,'.php')!==false){
//获取入口文件
$ds = stripos($url,'.php');
if(stripos($url,ADMIN_MODEL)!==false){
define('APP_URL',substr($url,0,($ds+4)).'/'.ADMIN_MODEL);
$url = str_replace(ADMIN_MODEL,'',$url);
}else{
define('APP_URL',substr($url,0,($ds+4)));
}
$url = substr(strstr($url,'.php'),4);
}else{
define('APP_URL','/index.php');
}
//去除最后的.html后缀
if(stripos($url,'.html')!==false){
$url = str_ireplace('.html','',$url);
}
// 删除前后的“/”
$url = trim($url, '/');
if ($url){
// 使用“/”分割字符串,并保存在数组中
$urlArray = explode('/', $url);
// 删除空的数组元素
//$urlArray = array_filter($urlArray);
foreach($urlArray as $k=>$v){
if($v!=''){
$urlArray[$k] = $v;
}
}
// 获取控制器名
$controllerName = ucfirst($urlArray[0]);
// 获取动作名
array_shift($urlArray);
$actionName = $urlArray ? $urlArray[0] : $actionName;
// 获取URL参数
array_shift($urlArray);
$param = $urlArray ? $urlArray : array();
}
// 判断插件中是否存在控制器和操作--2019/2/15 by 留恋风
$app_home = str_replace('/','\\',APP_HOME);
$controller = $app_home.'\\plugins\\'. $controllerName . 'Controller';
if (!class_exists($controller) || !method_exists($controller, $actionName)) {
// 不存在插件,则进入系统默认控制器
// 判断控制器和操作是否存在
$controller = $app_home.'\\'.HOME_CONTROLLER.'\\'. $controllerName . 'Controller';
if (!class_exists($controller)) {
$controllerName = 'Home';
$controller = $app_home.'\\'.HOME_CONTROLLER.'\\HomeController';
}
//规定前台数据统一到jizhi里面处理
if(APP_URL=='/index.php'){
if (!method_exists($controller, $actionName)) {
$actionName = 'jizhi';
//Error_msg('方法不存在!');
}
}else{
if (!method_exists($controller, $actionName)) {
Error_msg('方法不存在!');
}
}
if($controllerName=='Home' && $actionName=='jizhi'){
if(method_exists($app_home.'\\plugins\\HomeController', 'jizhi')){
$controller = $app_home.'\\plugins\\HomeController';
$actionName = 'jizhi';
}
}
}
//定义全局控制器及方法常量
define('APP_CONTROLLER',$controllerName);
define('APP_ACTION',$actionName);
if(open_url_route && $route_ok){
switch($method){
case 'GET':
$param = (count($this->stringGet($param))>0) ? array_merge($this->stringGet($param),$_GET) : $_GET;
break;
case 'POST':
$param = $_POST;
break;
default:
//Error_msg('路由配置错误!传输方式未填写或者不正确!请检查Conf/route.php');
$_GET = (count($this->stringGet($param))>0) ? array_merge($this->stringGet($param),$_GET) : $_GET;
$param = (count($_GET)>0) ? array_merge($_GET,$_REQUEST) : $_REQUEST;
break;
}
}else{
$_GET = (count($this->stringGet($param))>0) ? array_merge($this->stringGet($param),$_GET) : $_GET;
$param = (count($_GET)>0) ? array_merge($_GET,$_REQUEST) : $_REQUEST;
}
//读Hook数据缓存
$hookconfig = getCache('hook');
if(!$hookconfig){
//Hook插件注册--缓存整个插件表数据
$hookconfig = M('hook')->findAll(array('isopen'=>1),'orders desc');
setCache('hook',$hookconfig);
}
if($hookconfig){
foreach($hookconfig as $v){
if("app\\".$v['module']==$app_home && $v['controller']==APP_CONTROLLER && (strpos(','.$v['action'].',',','.APP_ACTION.',')!==false || $v['all_action']==1)){
$newhook_controller = '\\app\\'.$v['module'].'\\plugins\\'.$v['hook_controller'].'Controller';
if(class_exists($newhook_controller)){
$newhook = new $newhook_controller($param);
$hook_action = $v['hook_action'];
$newhook->$hook_action($param);
$newhook = null;
}
}
}
}
$dispatch = new $controller($param);
$dispatch->$actionName($param);
}
//将链接参数转为GET传值
public function stringGet($urlarray){
$data = array();
foreach($urlarray as $k=>$v){
if(($k+1)%2==1){
if(!isset($urlarray[$k+1])){$urlarray[$k+1]=null;}
$data[$v] = $urlarray[$k+1];
}
}
return $data;
}
// 检测开发环境
public function setReporting()
{
ini_set("session.cookie_httponly", 1);
if (APP_DEBUG === true) {
//error_reporting(E_ALL);
error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING & ~E_DEPRECATED);
ini_set('display_errors','On');
} else {
error_reporting(0);
ini_set('display_errors','Off');
ini_set('log_errors', 'On');
}
}
// 删除敏感字符
public function stripSlashesDeep($value)
{
$value = is_array($value) ? array_map(array($this, 'stripSlashesDeep'), $value) : stripslashes($value);
return $value;
}
// 检测敏感字符并删除
public function removeMagicQuotes()
{
$_GET = isset($_GET) ? $this->stripSlashesDeep($_GET ) : '';
$_POST = isset($_POST) ? $this->stripSlashesDeep($_POST ) : '';
$_COOKIE = isset($_COOKIE) ? $this->stripSlashesDeep($_COOKIE) : '';
$_SESSION = isset($_SESSION) ? $this->stripSlashesDeep($_SESSION) : '';
}
// 检测自定义全局变量并移除。因为 register_globals 已经弃用,如果
// 已经弃用的 register_globals 指令被设置为 on,那么局部变量也将
// 在脚本的全局作用域中可用。 例如, $_POST['foo'] 也将以 $foo 的
// 形式存在,这样写是不好的实现,会影响代码中的其他变量。 相关信息,
// 参考: http://php.net/manual/zh/faq.using.php#faq.register-globals
public function unregisterGlobals()
{
if (ini_get('register_globals')) {
$array = array('_SESSION', '_POST', '_GET', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES');
foreach ($array as $value) {
foreach ($GLOBALS[$value] as $key => $var) {
if ($var === $GLOBALS[$key]) {
unset($GLOBALS[$key]);
}
}
}
}
}
// 配置数据库信息
public function setDbConfig()
{
if ($this->config['db']) {
define('DB_HOST', $this->config['db']['host']);
define('DB_NAME', $this->config['db']['dbname']);
define('DB_PREFIX', $this->config['db']['prefix']);
define('DB_USER', $this->config['db']['username']);
define('DB_PASS', $this->config['db']['password']);
define('DB_PORT', $this->config['db']['port']);
if(DB_HOST=='' || DB_NAME=='' || DB_USER=='' || DB_PASS==''){
exit(' 数据库无法链接,如果您是第一次使用,请先执行安装程序 极致CMS建站程序 jizhicms.com ');
}
}
}
// 自动加载类
public function loadClass($className)
{
$classMap = $this->classMap();
if (isset($classMap[$className])) {
// 包含内核文件
$file = $classMap[$className];
} elseif (strpos($className, '\\') !== false) {
// 包含应用(application目录)文件
$file = APP_PATH . str_replace('\\', '/', $className) . '.php';
if (!is_file($file)) {
return;
}
} else {
return;
}
include $file;
// 这里可以加入判断,如果名为$className的类、接口或者性状不存在,则在调试模式下抛出错误
}
// 内核文件命名空间映射关系
protected function classMap()
{
return [
'frphp\lib\Controller' => CORE_PATH . '/lib/Controller.php',
'frphp\lib\Model' => CORE_PATH . '/lib/Model.php',
'frphp\lib\View' => CORE_PATH . '/lib/View.php',
'frphp\db\DBholder' => CORE_PATH . '/db/DBholder.php',
];
}
}
// 加载配置文件
$config = require(APP_PATH . 'conf/config.php');
$url = urldecode($_SERVER['REQUEST_URI']);
defined('ADMIN_MODEL') or define('ADMIN_MODEL', 'admins');
//判断是否后台入口
if(strpos($url,'/index.php/'.ADMIN_MODEL)!==false || (defined('APP_HOME') && APP_HOME=='app/admin')){
//后台
//定义项目目录
defined('APP_HOME') or define('APP_HOME', 'app/admin');
//定义项目模板文件目录
defined('HOME_VIEW') or define('HOME_VIEW', 't');
defined('Tpl_template') or define('Tpl_template', 'tpl');
//定义项目控制器文件目录
defined('HOME_CONTROLLER') or define('HOME_CONTROLLER', 'c');
//定义项目模型文件目录
defined('HOME_MODEL') or define('HOME_MODEL', 'm');
//定义项目默认方法
defined('DefaultController') or define('DefaultController', 'Index');
defined('DefaultAction') or define('DefaultAction', 'index');
//定义静态文件路径
defined('Tpl_style') or define('Tpl_style', '/app/admin/t/tpl');
}else{
//前台
//定义项目目录
defined('APP_HOME') or define('APP_HOME', 'app/home');
//定义模板文件夹
defined('TPL_PATH') or define('TPL_PATH', 'static');
//定义项目模板文件目录
defined('HOME_VIEW') or define('HOME_VIEW', '');
//定义项目模板公共文件目录
defined('Tpl_common') or define('Tpl_common', '');
//定义项目控制器文件目录
defined('HOME_CONTROLLER') or define('HOME_CONTROLLER', 'c');
//定义项目模型文件目录
defined('HOME_MODEL') or define('HOME_MODEL', 'm');
//定义模板文件后缀
defined('File_TXT') or define('File_TXT', '.php');
//定义项目默认方法
defined('DefaultAction') or define('DefaultAction', 'jizhi');
//定义静态文件路径
defined('Tpl_style') or define('Tpl_style', '/static/');
}
header_remove('X-Powered-By');
//实例化核心类
(new frphp($config))->run();
================================================
FILE: frphp/lib/Controller.php
================================================
// +----------------------------------------------------------------------
// | Date:2018/02
// +----------------------------------------------------------------------
namespace frphp\lib;
/**
* 控制器基类
*/
class Controller
{
protected $_controller;
protected $_action;
protected $_view;
protected $_data;
// 构造函数,初始化属性,并实例化对应模型
public function __construct($param=null)
{
$this->_controller = APP_CONTROLLER;
$this->_action = APP_ACTION;
$this->_data = $param;
//对语言包获取优先处理
if(!empty($_REQUEST) && isset($_REQUEST[APP_LANG_REQUREST])){
$_SESSION['lang'] = $_REQUEST[APP_LANG_REQUREST];
define('LANG',$_SESSION['lang']);
}else if(isset($_SESSION['lang'])){
define('LANG',$_SESSION['lang']);
}else{
define('LANG',APP_LANG);
}
$this->_view = new View(APP_CONTROLLER, APP_ACTION);
$this->_init();
}
// 自动调用方法
public function _init(){
}
// 分配变量
public function __set($name, $value)
{
$this->$name = $value;
$this->_view->assign($name, $value);
}
public function assign($name, $value)
{
$this->_view->assign($name, $value);
}
// 渲染视图
public function display($name=null)
{
$this->_view->render($name);
}
// 获取URL参数值
public function frparam($str=null, $int=0,$default = FALSE, $method = null){
$data = $this->_data;
if($str===null) return $data;
if(!array_key_exists($str,$data)){
return ($default===FALSE)?false:$default;
}
if($method===null){
$value = $data[$str];
}else{
$method = strtolower($method);
switch($method){
case 'get':
$value = $_GET[$str];
break;
case 'post':
$value = $_POST[$str];
break;
case 'cookie':
$value = $_COOKIE[$str];
break;
}
}
return format_param($value,$int,$default);
}
}
================================================
FILE: frphp/lib/Model.php
================================================
// +----------------------------------------------------------------------
// | Date:2018/03/15
// +----------------------------------------------------------------------
namespace frphp\lib;
use frphp\db\DBholder;
use PDO;
class Model {
protected $model;
protected static $table;
protected $primary = 'id';
private $db;
private static $instance=false;//不支持单例模式
public function __construct(){
$this->db = DBholder::getInstance();
}
public static function getInstance($table = null,$prefix = 1){
if(self::$instance===false){
self::$instance = new self($table);
}
if($table!=null){
self::$table = $table;
}
if($prefix){
self::$table = DB_PREFIX.strtolower(self::$table);
}else{
self::$table = self::$table;
}
return self::$instance;
}
//查询数据条数
public function getCount($conditions=null){
$where = '';
if(is_array($conditions)){
$conditions = $this->__prepera_format($conditions);
$join = array();
foreach( $conditions as $key => $value ){
if(is_array($value)){
$va = '\''.$value[1].'\'';
$join[] = "{$key} ".$value[0]." {$va}";
}else{
$value = '\''.$value.'\'';
$join[] = "{$key} = {$value}";
}
}
if(count($join)){
$where = "WHERE ".join(" AND ",$join);
}
}else{
if(null != $conditions) $where = "WHERE ".$conditions;
}
$table = self::$table;
$sql = "SELECT count(*) as Frcount FROM {$table} {$where}";
$result = $this->db->getArray($sql);
return $result[0]['Frcount'];
}
//递增数据
public function goInc($conditions,$field,$vp=1){
$where = "";
if(is_array($conditions)){
$conditions = $this->__prepera_format($conditions);
$join = array();
foreach( $conditions as $key => $value ){
if(is_array($value)){
$va = '\''.$value[1].'\'';
$join[] = "{$key} ".$value[0]." {$va}";
}else{
$value = '\''.$value.'\'';
$join[] = "{$key} = {$value}";
}
}
if(count($join)){
$where = "WHERE ".join(" AND ",$join);
}
}else{
if(null != $conditions)$where = "WHERE ".$conditions;
}
$values = "{$field} = {$field} + {$vp}";
$table = self::$table;
$sql = "UPDATE {$table} SET {$values} {$where}";
return $this->runSql($sql);
}
//递减
public function goDec($conditions,$field,$vp=1){
return $this->goInc($conditions,$field,-$vp);
}
// 修改数据
public function update($conditions=null,$row=null)
{
$where = "";
$row = $this->__prepera_format($row);
if(empty($row))return FALSE;
if(is_array($conditions)){
$conditions = $this->__prepera_format($conditions);
$join = array();
foreach( $conditions as $key => $value ){
if(is_array($value)){
$va = '\''.$value[1].'\'';
$join[] = "{$key} ".$value[0]." {$va}";
}else{
$value = '\''.$value.'\'';
$join[] = "{$key} = {$value}";
}
}
if(count($join)){
$where = "WHERE ".join(" AND ",$join);
}
}else{
if(null != $conditions)$where = "WHERE ".$conditions;
}
foreach($row as $key => $value){
if($value!==null){
$value = '\''.$value.'\'';
$vals[] = "{$key} = {$value}";
}else{
$vals[] = "{$key} = null";
}
}
$values = join(", ",$vals);
$table = self::$table;
$sql = "UPDATE {$table} SET {$values} {$where}";
return $this->runSql($sql);
}
public function updateMuti($conditions=null,$rows=null){
if(count($conditions)!=count($rows)){
throw new Exception('数组不匹配');
return false;
}
$whereArr = [];
foreach($conditions as $condition){
if(is_array($condition)){
$condition = $this->__prepera_format($condition);
$join = array();
foreach( $condition as $key => $value ){
if(is_array($value)){
$va = '\''.$value[1].'\'';
$join[] = "{$key} ".$value[0]." {$va}";
}else{
$value = '\''.$value.'\'';
$join[] = "{$key} = {$value}";
}
}
if(count($join)){
$where = "WHERE ".join(" AND ",$join);
}
}else{
if(null != $condition)$where = "WHERE ".$condition;
}
$whereArr[] = $where;
}
$valuesArr = [];
foreach($rows as $row){
$row = $this->__prepera_format($row);
if(!empty($row)){
foreach($row as $key => $value){
if($value!==null){
$value = '\''.$value.'\'';
$vals[] = "{$key} = {$value}";
}else{
$vals[] = "{$key} = null";
}
}
$values = join(", ",$vals);
$valuesArr[]=$values;
}
}
if(count($whereArr)!=count($valuesArr)){
throw new Exception('数组不匹配');
return false;
}
$sqlArr=[];
$table = self::$table;
foreach($whereArr as $k=>$where){
$sqlArr[] = "UPDATE {$table} SET {$valuesArr[$k]} {$where};";
}
$sql=implode('',$sqlArr);
return $this->runSql($sql);
}
// 查询所有
public function findAll($conditions=null,$order=null,$fields=null,$limit=null)
{
$where = '';
if(is_array($conditions)){
$conditions = $this->__prepera_format($conditions);
$join = array();
foreach( $conditions as $key => $value ){
if(is_array($value)){
$va = '\''.$value[1].'\'';
$join[] = "{$key} ".$value[0]." {$va}";
}else{
$value = '\''.$value.'\'';
$join[] = "{$key} = {$value}";
}
}
if(count($join)){
$where = "WHERE ".join(" AND ",$join);
}
}else{
if(null != $conditions)$where = "WHERE ".$conditions;
}
if(is_array($order)){
$where .= ' ORDER BY ';
$where .= implode(',', $order);
}else{
if($order!=null)$where .= " ORDER BY ".$order;
}
if(!empty($limit)){
if(strpos($limit,',')===false){
$limit = ($limit<=0) ? 1 : $limit;
}
$where .= " LIMIT {$limit}";
}
$fields = empty($fields) ? "*" : $fields;
$table = self::$table;
$sql = "SELECT {$fields} FROM {$table} {$where}";
return $this->db->getArray($sql);
}
//分页查询
public function findPage($conditions=null,$order=null,$fields=null,$limit=null)
{
$where = '';
if(is_array($conditions)){
$conditions = $this->__prepera_format($conditions);
$join = array();
foreach( $conditions as $key => $value ){
if(is_array($value)){
$va = '\''.$value[1].'\'';
$join[] = "{$key} ".$value[0]." {$va}";
}else{
$value = '\''.$value.'\'';
$join[] = "{$key} = {$value}";
}
}
if(count($join)){
$where = "WHERE ".join(" AND ",$join);
}
}else{
if(null != $conditions)$where = "WHERE ".$conditions;
}
if(is_array($order)){
$where .= ' ORDER BY ';
$where .= implode(',', $order);
}else{
if($order!=null)$where .= " ORDER BY ".$order;
}
if(!empty($limit)){
if(strpos($limit,',')===false){
$limit = ($limit<=0) ? 1 : $limit;
}
$where .= " LIMIT {$limit}";
}
$fields = empty($fields) ? "*" : $fields;
$table = self::$table;
$sql = "SELECT SQL_CALC_FOUND_ROWS {$fields} FROM {$table} {$where}";
$data = $this->db->getArray($sql);
$sql = 'SELECT FOUND_ROWS()';
$result = $this->db->getArray($sql);
return ['lists'=>$data,'sum'=>$result[0]['FOUND_ROWS()']];
}
// 查询一条
public function find($where=null,$order=null,$fields=null,$limit=1)
{
if( $record = $this->findAll($where, $order, $fields, 1) ){
return array_pop($record);
}else{
return FALSE;
}
}
//获取单一字段内容
public function getField($where=null,$fields=null,$orders=null){
if( $record = $this->findAll($where, $orders, $fields, 1) ){
$res = array_pop($record);
return $res[$fields];
}else{
return FALSE;
}
}
//执行 SQL 语句,返回PDOStatement对象,可以理解为结果集
public function query($sql){
return $this->db->query();
}
//执行SQL语句返回影响行数
public function runSql($sql)
{
return $this->db->exec($sql);
}
//执行SQL语句函数
public function findSql($sql)
{
return $this->db->getArray($sql);
}
//执行SQL获取分页
public function findSqlPage($sql,$orderlimit=''){
$sql = "select SQL_CALC_FOUND_ROWS * from (".$sql.") a ".$orderlimit;
$data = $this->db->getArray($sql);
$sql = 'SELECT FOUND_ROWS()';
$result = $this->db->getArray($sql);
return ['lists'=>$data,'sum'=>$result[0]['FOUND_ROWS()']];
}
// 根据条件 (conditions) 删除
public function delete($conditions)
{
$where = "";
if(is_array($conditions)){
$conditions = $this->__prepera_format($conditions);
$join = array();
foreach( $conditions as $key => $value ){
if(is_array($value)){
$va = '\''.$value[1].'\'';
$join[] = "{$key} ".$value[0]." {$va}";
}else{
$value = '\''.$value.'\'';
$join[] = "{$key} = {$value}";
}
}
if(count($join)){
$where = "WHERE ".join(" AND ",$join);
}
}else{
if(null != $conditions)$where = "WHERE ( ".$conditions. ")";
}
$table = self::$table;
$sql = "DELETE FROM {$table} {$where}";
return $this->runSql($sql);
}
// 新增数据
public function add($row)
{
if(!is_array($row))return FALSE;
$row = $this->__prepera_format($row);
if(empty($row))return FALSE;
foreach($row as $key => $value){
if($value!==null){
$cols[] = $key;
$vals[] = '\''.$value.'\'';
}
}
$col = join(',', $cols);
$val = join(',', $vals);
$table = self::$table;
$sql = "INSERT INTO {$table} ({$col}) VALUES ({$val})";
if( FALSE != $this->runSql($sql) ){
if( $newinserid = $this->db->lastInsertId() ){
return $newinserid;
}else{
$a=$this->find($row, "{$this->primary} DESC",$this->primary);
return array_pop($a);
}
}
return FALSE;
}
//预处理SQL
private function __prepera_format($rows)
{
$table = self::$table;
$stmt = $this->db->getTable($table);
$stmt->execute();
$columns = $stmt->fetchAll(PDO::FETCH_CLASS);
$newcol = array();
foreach ($columns as $key => $value) {
$field = strtolower($value->Field);
if(stripos($value->Type,'int')!==false || stripos($value->Type,'decimal')!==false){
if(isset($rows[$field])){
if($rows[$field]!=='' && $rows[$field]!==false){
$newcol[$field] = $rows[$field];
}else{
$newcol[$field] = 0;
}
}
}else{
if(isset($rows[$field])){
if($rows[$field]!=='' && $rows[$field]!==false ){
$newcol[$field] = $rows[$field];
}else{
$newcol[$field] = null;
}
}
}
}
return $newcol;
//return array_intersect_key($rows,$newcol);
}
public function __destruct()
{
$this->db = null;
}
}
================================================
FILE: frphp/lib/View.php
================================================
// +----------------------------------------------------------------------
// | Date:2018/02
// +----------------------------------------------------------------------
namespace frphp\lib;
use frphp\extend\Page;
/**
* 视图基类
*/
class View
{
protected $variables = array();
protected $_controller;
protected $_action;
protected $_cachefile;
function __construct($controller, $action)
{
$this->_controller = strtolower($controller);
$this->_action = strtolower($action);
}
// 分配变量
public function assign($name, $value)
{
//$this->variables[$name] = $value;
$GLOBALS[$name] = $value;
}
// 渲染显示
public function render($name=null)
{
if(defined('TPL_PATH')){
$path = TPL_PATH;
}else{
$path = APP_HOME;
}
if($name){
if(strpos($name,'@')!==false){
$controllerLayout = str_replace('@','',$name);
}else{
$controllerLayout = HOME_VIEW ? $path.'/'.HOME_VIEW.'/'.Tpl_template.'/' . $name : $path.'/'.Tpl_template.'/' . $name;
$controllerLayout = (stripos($controllerLayout,File_TXT)!==false || stripos($controllerLayout,'.html')!==false ) ? $controllerLayout : $controllerLayout.File_TXT;
}
}else{
$controllerLayout = HOME_VIEW ? $path .'/'.HOME_VIEW.'/'.Tpl_template.'/' . strtolower($this->_controller) . '/' . $this->_action : $path .'/'.Tpl_template.'/' . strtolower($this->_controller) . '/' . $this->_action;
}
//去除可能没有的Tpl_template
$controllerLayout = str_ireplace(['//','\\'],'/',$controllerLayout);
//判断视图文件是否存在
if (file_exists($controllerLayout)) {
$this->template($controllerLayout);
} else {
//兼容自定义扩展和.html模板
$controllerLayout = str_replace(File_TXT,'.html',$controllerLayout);
if (file_exists($controllerLayout)) {
$this->template($controllerLayout);
}else{
$f = strpos($name,File_TXT)!==false ? $name : $name.File_TXT;
Error_msg('无法找到视图文件,页面模板:'.$f);
}
}
}
//模板解析
public function template($controllerLayout){
//extract($this->variables);//分配变量到模板中
extract($GLOBALS);//分配变量到模板中
//对路径文件换为缓存目录 '/'换为'-'
//$layout = str_ireplace(array("//","/"),'_',$controllerLayout);
//$cache_file = str_ireplace('.html','.php',APP_PATH.'/cache/'.$layout);
$cache_file = Cache_Path.'/'.md5($controllerLayout).'.php';
$this->_cachefile = $cache_file;//传入系统中
$now_time = time();
if(file_exists($cache_file)){
$last_time = filemtime($cache_file);
}else{
$last_time = 0;
}
$cache_time = webConf('cache_time') ? webConf('cache_time') : 0;
$isclear = 0;
if((($now_time - $last_time)/60)>$cache_time){
$isclear = 1;
}
if(APP_DEBUG===true){
$fp_tp=@fopen($controllerLayout,"r");
$fp_txt=@fread($fp_tp,filesize($controllerLayout));
@fclose($fp_tp);
$fp_txt=$this->template_html($fp_txt);
$fp_txt = "".$fp_txt;
$fpt_tpl=@fopen($cache_file,"w");
@fwrite($fpt_tpl,$fp_txt);
@fclose($fpt_tpl);
}else if(is_readable($cache_file)!==true || $isclear){
$fp_tp=@fopen($controllerLayout,"r");
$fp_txt=@fread($fp_tp,filesize($controllerLayout));
@fclose($fp_tp);
$fp_txt=$this->template_html($fp_txt);
$fp_txt = "".$fp_txt;
$fpt_tpl=@fopen($cache_file,"w");
@fwrite($fpt_tpl,$fp_txt);
@fclose($fpt_tpl);
}
if(is_readable($cache_file)!==true){
Error_msg('无法找到模板缓存,请刷新后重试,或者检查cache缓存文件夹权限');
}
include $cache_file;
}
//模板分解替换
public function template_html($content){
//include标签
preg_match_all('/\{include=\"(.*?)\"\}/si',$content,$i);
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,$this->template_html_include($i[1][$k]),$content);
}
//loop标签
preg_match_all('/\{loop (.*?)\}/si',$content,$i);
$this->check_template_err(substr_count($content, '{/loop}'),count($i[0]),'loop');
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,$this->template_html_loop($i[1][$k]),$content);
}
$content=str_ireplace('{/loop}','',$content);
//foreach循环
preg_match_all('/\{foreach(.*?)\}/si',$content,$i);
$this->check_template_err(substr_count($content, '{/foreach}'),count($i[0]),'foreach');
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,$this->template_html_foreach($i[1][$k]),$content);
}
$content=str_ireplace('{/foreach}','',$content);
//screen标签
preg_match_all('/\{screen (.*?)\}/si',$content,$i);
$this->check_template_err(substr_count($content, '{/screen}'),count($i[0]),'screen');
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,$this->template_html_screen($i[1][$k]),$content);
}
$content=str_ireplace('{/screen}','',$content);
//for循环
preg_match_all('/\{for(.*?)\}/si',$content,$i);
$this->check_template_err(substr_count($content, '{/for}'),count($i[0]),'for');
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,'',$content);
}
$content=str_ireplace('{/for}','',$content);
//if判断
preg_match_all('/\{if(.*?)\}/si',$content,$i);
$this->check_template_err(substr_count($content, '{/if}'),count($i[0]),'if');
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,'',$content);
}
$content=str_ireplace('{else}','',$content);
//else if判断
preg_match_all('/\{else if(.*?)\}/si',$content,$i);
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,'',$content);
}
$content=str_ireplace('{/if}','',$content);
//PHP函数解析
preg_match_all('/\{fun (.*?)\}/si',$content,$i);
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,'',$content);
}
//PHP常量解析
preg_match_all('/\{__(.*?)__}/si',$content,$i);
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,'',$content);
}
//PHP标签解析
preg_match_all('/\{php(.*?)\/}/si',$content,$i);
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,'',$content);
}
//PHP变量解析
preg_match_all('/\{\$(.*?)\}/si',$content,$i);
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,'',$content);
}
//标签原样输出
preg_match_all('/\{!--(.*?)\--}/si',$content,$i);
foreach($i[0] as $k=>$v){
$content=str_ireplace($v,'{'.$i[1][$k].'}',$content);
}
return $content;
}
//引入公共模板
public function template_html_include($filename){
if(strpos($filename,'.')!==false){
$prefix = '';
}else{
$prefix = File_TXT;
}
if(defined('TPL_PATH')){
$path = TPL_PATH;
}else{
$path = APP_HOME;
}
if(APP_URL=='/index.php'){
$includefile = str_replace('//','/',APP_PATH . $path .'/'.HOME_VIEW.'/'.TEMPLATE.'/'.$filename. $prefix);
$file = TEMPLATE.'/'.$filename. $prefix;
}else{
$includefile = str_replace('//','/',APP_PATH . $path .'/'.HOME_VIEW.'/'.Tpl_template.'/'. Tpl_common .'/'.$filename. $prefix);
$file = Tpl_common .'/'.$filename. $prefix;
}
if(!is_file($includefile)){
//兼容自定义扩展和.html模板
$includefile = str_replace(File_TXT,'.html',$includefile);
if (!is_file($includefile)) {
Error_msg($file.'不存在!');
}
}
$content = file_get_contents($includefile);
$content = $this->template_html($content);
return $content;
}
//检查模板标签是否错误!
public function check_template_err($a,$b,$msg){
if($a!=$b) Error_msg($this->_cachefile.'模板中存在不完整'.$msg.'标签,请检查是否遗漏{'.$msg.'}开始或结束符');
}
//筛选
/**
输出参数:筛选列表all(item),链接url,升降序(id,orders,addtime)
{screen molds="article" orderby="orders desc" tid="1|2" fields='pingpai,yanse' as="v"}
**/
public function template_html_screen($f){
preg_match_all('/.*?(\s*.*?=.*?[\"|\'].*?[\"|\']\s).*?/si',' '.$f.' ',$aa);
$a=array();
foreach($aa[1] as $v){
$t=explode('=',trim(str_replace(array('"',"'"),'',$v)));
$a=array_merge($a,array(trim($t[0]) => trim($t[1])));
}
if(strpos($a['molds'],'$')!==FALSE){
$a['molds']='\'".'.$a['molds'].'."\'';
}else{
$a['molds'] = " '".$a['molds']."' ";
}
$molds=$a['molds'];
if(isset($a['fields'])){$fields="'".$a['fields']."'";}else{$fields='null';}
if($a['as']!=''){$as=$a['as'];}else{$as='v';}
if(isset($a['orderby'])){
$order="'".$a['orderby']."'";
}else{$order="' id desc '";}
$tids = '1=1';
if(isset($a['tid'])){
$arr_tid = array();
if(strpos($a['tid'],'|')!==false){
foreach(explode('|',$a['tid']) as $v){
$arr_tid[]=" (tids like '%,".$v.",%') ";
}
$tids = ' ( '. implode('or',$arr_tid).' ) ';
}else if(strpos($a['tid'],'$')!==false){
$tids = " tids like '%,".trim($a['tid'],"'").",%' ";
}else{
$tids = " tids like '%,".$a['tid'].",%' ";
}
}
$where = '1=1';
if(isset($a['fields'])){
if(strpos($a['fields'],',')!==false){
$a['fields'] = str_replace(',',"','",$a['fields']);
}
$where = " field in ('".$a['fields']."') ";
}
$sql=' fieldtype in(7,8,12) and isshow=1 and field!=\'isshow\' and molds='.$molds.' and '.$tids.' and '.$where;
$txt="findAll(\$w,\$order,\$fields);";
$txt.='$n=0;foreach($'.$as.'_data as $'.$as.'_key=> $'.$as.'){
$n++;
$vs=array();
$fieldvalue = explode(",",$'.$as.'["body"]);
//$rooturl = get_domain()."/screen/index/molds/".$'.$as.'["molds"]."/tid/".$type["id"];
$rooturl = get_domain()."/screen-".$'.$as.'["molds"]."-".$type["id"];
foreach($fieldvalue as $kk=>$vv){
$d=explode("=",$vv);
$vs[$kk] = array("key"=>$d[1],"value"=>$d[0],"url"=>$rooturl."-".$'.$as.'["field"]."-".$d[1].change_parse_url($filters,$'.$as.'["field"]));
}
$'.$as.'["list"] = $vs;
$'.$as.'["url"] = $rooturl."-".$'.$as.'["field"]."-0";
?>';
return $txt;
}
//foreach全局标签
/**
$content=str_ireplace($v,'',$content);
*/
private function template_html_foreach($f){
$ff = explode(' as ',$f);
if(strpos($ff[1],'=>')!==false){
$fff = explode('=>',$ff[1]);
$fff[1] = trim($fff[1]);
return '';
}else{
$ff[1] = trim($ff[1]);
return '';
}
}
//loop全局标签
private function template_html_loop($f){
preg_match_all('/.*?(\s*.*?=.*?[\"|\'].*?[\"|\']\s).*?/si',' '.$f.' ',$aa);
$a=array();foreach($aa[1] as $v){$t=explode('=',trim(str_replace(array('"'),"'",$v)));$a=array_merge($a,array(trim($t[0]) => trim($t[1])));}
if(isset($a['table'])){
if(strpos($a['table'],'$')!==FALSE){$a['table']=trim($a['table'],"'");}
$db=$a['table'];
}else{
if(!isset($a['tid'])){ exit('缺少table参数!');}
if(strpos($a['tid'],'$')!==false){
$db = ' $classtypedata['.trim($a['tid'],"'").']["molds"] ';
}else{
if(strpos($a['tid'],',')!==false){
$tids = explode(',',$a['tid']);
$db = ' $classtypedata['.trim($tids[0],"'").']["molds"] ';
}else{
$db = ' $classtypedata['.trim($a['tid'],"'").']["molds"] ';
}
}
}
if(isset($a['limit'])){
if(strpos($a['limit'],'$')!==false){
$limit=trim($a['limit'],"'");
}else{
$limit=$a['limit'];
}
}else{$limit='null';}
if(isset($a['notempty'])){$notempty=trim($a['notempty'],"'");}else{$notempty=false;}
if(isset($a['empty'])){$empty=trim($a['empty'],"'");}else{$empty=false;}
if(isset($a['fields'])){
if(strpos($a['fields'],'$')!==false){
$fields=trim($a['fields'],"'");
}else{
$fields=$a['fields'];
}
}else{$fields='null';}
if(isset($a['isall'])){$isall=trim($a['isall'],"'");}else{$isall=false;}
if(isset($a['as'])){$as=$a['as'];}else{$as='v';}
if(isset($a['day'])){$day=$a['day'];}else{$day=false;}
if(isset($a['jzpage'])){$jzpage=trim($a['jzpage'],"'");}else{$jzpage='page';}
if(isset($a['sql'])){$sql=trim($a['sql'],"'");}else{$sql='';}
if(isset($a['jzcache'])){$jzcache=trim($a['jzcache'],"'");}else{$jzcache=false;}
if(isset($a['jzcachetime'])){$jzcachetime= 60 * trim($a['jzcachetime'],"'");}else{$jzcachetime=30*60;}
if(isset($a['orderby'])){
$order=$a['orderby'];
if(strpos($a['orderby'],'$')!==FALSE){$order=trim($a['orderby'],"'");}
//$order=' '.str_replace('|',' ',$order).' ';
}else{$order="' id desc '";}
if(isset($a['like'])){
// like='title|学习,keywords|学习' => title like '%学习%' and keywords like '%学习%';
$lk = array();
if(strpos($a['like'],',')!==false){
$like = explode(',',trim($a['like'],"'"));
foreach($like as $v){
$s = explode('|',$v);
if(strpos($s[1],'$')!==false){
$lk[] = " ".$s[0]." like \'%'.".trim($s[1]).".'%\' ";
}else{
$lk[]= " ".$s[0]." like \'%".trim($s[1])."%\' ";
}
}
$lk = " and ( ". implode(" or ",$lk)." )";
}else{
if(strpos($a['like'],'$')!==false){
$like = explode('|',trim($a['like'],"'"));
$lk = " and ".$like[0]." like \'%'.".trim($like[1]).".'%\' ";
}else{
$like = explode('|',trim($a['like'],"'"));
$lk = " and ".$like[0]." like \'%".trim($like[1])."%\' ";
}
}
}else{ $lk='';}
if(isset($a['notlike'])){
$not = array();
if(strpos($a['notlike'],',')!==false){
$like = explode(',',trim($a['notlike'],"'"));
foreach($like as $v){
$s = explode('|',$v);
if(strpos($s[1],'$')!==false){
$not[] = " ".$s[0]." not like \'%'.".trim($s[1]).".'%\' or ".$s[0]." is null ";
}else{
$not[]= " ".$s[0]." not like \'%".trim($s[1])."%\' or ".$s[0]." is null ";
}
}
$notlike = " and ( ". implode(" or ",$not)." )";
}else{
if(strpos($a['notlike'],'$')!==false){
$like = explode('|',trim($a['notlike'],"'"));
$notlike = " and (".$like[0]." not like \'%'.".trim($like[1]).".'%\' or ".$like[0]." is null) ";
}else{
$like = explode('|',trim($a['notlike'],"'"));
$notlike = " and (".$like[0]." not like \'%".trim($like[1])."%\' or ".$like[0]." is null) ";
}
}
}else{
$notlike = '';
}
//不在某个参数范围内
$notin_sql = '';
if(isset($a['notin'])){
if(strpos($a['notin'],'|')!==false){
$notin = explode('|',trim($a['notin'],"'"));
if(strpos($notin[1],'$')!==false){
$notin_sql = ' and '.$notin[0].' not in(\'.'.$notin[1].'.\') ';
}else{
$notin_sql = ' and '.$notin[0].' not in('.$notin[1].') ';
}
}
}
//在某个参数范围内
$in_sql = '';
if(isset($a['in'])){
if(strpos($a['in'],'|')!==false){
$in = explode('|',trim($a['in'],"'"));
if(strpos($in[1],'$')!==false){
$in_sql = ' and '.$in[0].' in(\'.'.$in[1].'.\') ';
}else{
$in_sql = ' and '.$in[0].' in('.$in[1].') ';
}
}
}
if($sql){
$sql = " and ('.".$sql.".' ) ";
}
if(isset($a['notjz'])){
$jz = 0;
}else{
$jz = 1;
}
unset($a['table']);unset($a['orderby']);unset($a['limit']);unset($a['as']);unset($a['like']);unset($a['notlike']);unset($a['fields']);unset($a['isall']);unset($a['notin']);unset($a['notempty']);unset($a['empty']);unset($a['day']);unset($a['in']);unset($a['sql']);unset($a['jzpage']);unset($a['jzcache']);unset($a['jzcachetime']);unset($a['notjz']);
$w = ' 1=1 ';
$fu = '';
$ispage=false;
if($jzpage!='page'){
if(stripos($jzpage,'$')!==false){
$jzpage = "'.$jzpage.'";
}
$pagenum = "\$pagenum = (int)\$_REQUEST['".$jzpage."'] ? (int)\$_REQUEST['".$jzpage."'] : 1; ";
}else{
$pagenum = "\$pagenum = isset(\$frpage) ? \$frpage : (int)\$_REQUEST['page'];";
}
foreach($a as $k=>$v){
if(strpos($v,'$')===FALSE){
//$v = str_ireplace("'",'',$v);
$v = trim($v,"'");
}
if($k=='ispage'){
$ispage=true;
}else if($k=='tid'){
$classtypedata = classTypeData();
if(strpos($a['tid'],',')!==false){
if($isall){
$a['tid'] = trim($a['tid'],"'");
$tids=explode(',',$a['tid']);
$ss = [];
$fu = " \$fu = [];\$f = [];";
foreach($tids as $s){
if($classtypedata[$s]){
$ss[] = ' tid in(\'.implode(",",$classtypedata['.$s.']["children"]["ids"]).\') ';
$fu .= " \$fu = array_merge(\$fu,\$classtypedata[".$s."][\"children\"][\"ids\"]);";
}
}
$fu .= "foreach(\$fu as \$fv){
\$f[] = 'tids like \'%,'.\$fv.',%\'';
}";
if(count($ss)){
$w.=' and ('.implode(' or ',$ss).' or \'.implode(\' or \',$f).\' )';
}
}else{
$w.=' and tid in('.trim($a['tid'],"'").') ';
}
}else{
if(strpos($a['tid'],'$')!==false){
if($isall){
$fu = " \$f = []; \$fu = \$classtypedata[".trim($v,"'")."]['children']['ids'];";
$fu .= "foreach(\$fu as \$fv){
\$f[] = 'tids like \'%,'.\$fv.',%\' ';
}";
$w.= ' and ( tid in(\'.implode(",",$classtypedata['.trim($v,"'").']["children"]["ids"]).\') or \'.implode(\' or \',$f).\' ) ';
}else{
$w.="and tid='.".trim($v,"'").".' ";
}
}else{
if($isall){
$fu = " \$f = []; \$fu = \$classtypedata[".trim($v,"'")."]['children']['ids'];";
$fu .= "foreach(\$fu as \$fv){
\$f[] = 'tids like \'%,'.\$fv.',%\' ';
}";
if($classtypedata[$v]) {
$w .= ' and (tid in(\'.implode(",",$classtypedata[' . trim($v, "'") . ']["children"]["ids"]).\') or \'.implode(\' or \',$f).\') ';
}
}else{
$w.="and tid=".$v." ";
}
}
}
}else if($k=='jzattr'){
if(strpos($v,',')!==false){
$s = explode(',',$v);
$s_sql = [];
foreach($s as $ss){
$s_sql[]=" jzattr like \'%,".$ss.",%\' ";
}
$w.=" and ( ".implode('or',$s_sql)." ) ";
}else{
$w.=" and jzattr like \'%,".$v.",%\'";
}
}else{
if(strpos($v,'$')!==FALSE){
$w.="and ".$k."=\''.".trim($v,"'").".'\' ";
}else{
$w.="and ".$k."=\'".$v."\' ";
}
}
}
if($notempty){
//多个字段
if(strpos($notempty,'|')!==false){
$notempty = explode('|',$notempty);
foreach($notempty as $v){
$w.=' (and trim('.$v.') !="" && trim('.$v.') is not null) ';
}
}else{
$w.=' and (trim('.$notempty.') !="" && trim('.$notempty.') is not null) ';
}
}
if($empty){
//多个字段
if(strpos($empty,'|')!==false){
$empty = explode('|',$empty);
foreach($empty as $v){
$w.=' and (trim('.$v.') ="" or trim('.$v.') is null) ';
}
}else{
$w.=' and (trim('.$empty.') ="" or trim('.$empty.') is null) ';
}
}
if($day){
$day =str_replace("'",'',$day);
if(strpos($day,'$')!==false){
$day = trim($day,"'");
$w.=" and DATE_SUB(CURDATE(), INTERVAL '".".$day."."' DAY) <= date(FROM_UNIXTIME(addtime))";
}else{
$w.=" and DATE_SUB(CURDATE(), INTERVAL ".$day." DAY) <= date(FROM_UNIXTIME(addtime))";
}
}
if(webconf('schedule_table')){
if(webConf('schedule_table')){
$tables = explode('|',webConf('schedule_table'));
if(in_array(trim($db,"'"),$tables)){
$w.= ' and addtime<='.time().' ';
}
}
}
$w .= $notin_sql;
$w .= $in_sql;
$w .= $sql;
$w.= $lk;
$w.= $notlike;
$as = trim($as,"'");
$txt="typeurl = 'tpl';
\$".$as."_page->paged = '".$jzpage."';
\$".$as."_data = \$".$as."_page->where(\$".$as."_w)->fields(\$".$as."_fields)->orderby(\$".$as."_order)->limit(\$".$as."_limit)->page(\$pagenum)->go();
\$".$as."_pages = \$".$as."_page->pageList(3,'?".$jzpage."=');
\$".$as."_sum = \$".$as."_page->sum;
\$".$as."_listpage = \$".$as."_page->listpage;
\$".$as."_prevpage = \$".$as."_page->prevpage;
\$".$as."_nextpage = \$".$as."_page->nextpage;
\$".$as."_allpage = \$".$as."_page->allpage;";
}else{
if($jzcache){
$txt .= "
\$cachestr = md5(\$".$as."_table.\$".$as."_w.\$".$as."_order.\$".$as."_fields.\$".$as."_limit);
$".$as."_data = getCache(\$cachestr);
if($".$as."_data!==false){
$".$as."_data = M(\$".$as."_table,\$".$as."_prefix)->findAll(\$".$as."_w,\$".$as."_order,\$".$as."_fields,\$".$as."_limit);
setCache(\$cachestr,$".$as."_data,$jzcachetime);
}";
}else{
$txt .= "
$".$as."_data = M(\$".$as."_table,\$".$as."_prefix)->findAll(\$".$as."_w,\$".$as."_order,\$".$as."_fields,\$".$as."_limit);";
}
}
$txt.='$'.$as.'_n=0;foreach($'.$as.'_data as $'.$as.'_key=> $'.$as.'){
$'.$as.'_n++;
if(!array_key_exists(\'url\',$'.$as.')){
if($'.$as.'_table==\'classtype\'){
$'.$as.'[\'url\'] = $classtypedata[$'.$as.'[\'id\']][\'url\'];
}else if($'.$as.'_table==\'message\'){
$'.$as.'[\'url\'] = U(\'message/details\',[\'id\'=>$'.$as.'[\'id\']]);
}else if($'.$as.'_table==\'tags\'){
$'.$as.'[\'url\'] = U(\'tags/index\',[\'id\'=>$'.$as.'[\'id\']]);
}else{
$'.$as.'[\'url\'] = gourl($'.$as.',$'.$as.'[\'htmlurl\']);
}
}
?>';
return $txt;
}
}
================================================
FILE: index.php
================================================
// +----------------------------------------------------------------------
// | Date:2022/04/11
// +----------------------------------------------------------------------
// 应用目录为当前目录
define('APP_PATH', __DIR__ . '/');
define('ADMIN_MODEL','admins');
// 加载框架文件
require(APP_PATH . 'frphp/fr.php');
// 就这么简单~
================================================
FILE: install/db.php
================================================
/*
MySQL Database Backup Tools
Server:127.0.0.1:3306
Database:db
Data:2022-01-26 13:46:31
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for jz_article
-- ----------------------------
DROP TABLE IF EXISTS `jz_article`;
CREATE TABLE `jz_article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '文章标题',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目',
`molds` varchar(50) DEFAULT 'article' COMMENT '模型标识',
`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',
`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',
`description` text COMMENT '简介',
`seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID:0前台发布',
`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',
`body` mediumtext COMMENT '文章内容',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',
`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击次数',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否审核:1审核0未审2退回',
`comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',
`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否',
`istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否',
`tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员:0后台发布',
`target` varchar(255) DEFAULT NULL COMMENT '外链',
`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',
`jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性:1置顶2热点3推荐',
`tids` varchar(255) DEFAULT NULL COMMENT '副栏目',
`zan` int(11) DEFAULT '0' COMMENT '点赞数',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='文章表';
-- ----------------------------
-- Table structure for jz_attr
-- ----------------------------
DROP TABLE IF EXISTS `jz_attr`;
CREATE TABLE `jz_attr` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'attr' COMMENT '模型标识',
`name` varchar(50) DEFAULT NULL COMMENT '属性名',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='推荐属性';
-- ----------------------------
-- Table structure for jz_buylog
-- ----------------------------
DROP TABLE IF EXISTS `jz_buylog`;
CREATE TABLE `jz_buylog` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`aid` int(11) DEFAULT '0' COMMENT '内容ID',
`userid` int(11) DEFAULT '0' COMMENT '会员ID',
`orderno` varchar(255) DEFAULT NULL COMMENT '订单号',
`type` tinyint(1) DEFAULT '1' COMMENT '交易类型:1购买商品0兑换金币',
`buytype` varchar(20) DEFAULT NULL COMMENT '支付类型',
`msg` varchar(255) DEFAULT NULL COMMENT '记录',
`molds` varchar(255) DEFAULT NULL COMMENT '模型标识',
`amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总计',
`money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金额',
`addtime` int(11) DEFAULT '0' COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='购买记录表';
-- ----------------------------
-- Table structure for jz_cachedata
-- ----------------------------
DROP TABLE IF EXISTS `jz_cachedata`;
CREATE TABLE `jz_cachedata` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`field` varchar(50) DEFAULT NULL COMMENT '字段',
`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`isall` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否输出所有:1是0否',
`sqls` varchar(500) DEFAULT NULL COMMENT 'SQL',
`orders` varchar(255) DEFAULT NULL COMMENT '排序',
`limits` int(11) NOT NULL DEFAULT '10' COMMENT '输出条数',
`times` int(11) NOT NULL DEFAULT '0' COMMENT '更新周期',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='数据缓存表';
-- ----------------------------
-- Table structure for jz_chain
-- ----------------------------
DROP TABLE IF EXISTS `jz_chain`;
CREATE TABLE `jz_chain` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL COMMENT '内链词',
`newtitle` varchar(100) DEFAULT NULL COMMENT '替换词',
`url` varchar(255) DEFAULT NULL COMMENT '链接',
`num` int(11) NOT NULL DEFAULT '-1' COMMENT '替换次数',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='内链';
-- ----------------------------
-- Table structure for jz_classtype
-- ----------------------------
DROP TABLE IF EXISTS `jz_classtype`;
CREATE TABLE `jz_classtype` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`classname` varchar(50) DEFAULT NULL COMMENT '栏目名',
`seo_classname` varchar(50) DEFAULT NULL COMMENT 'SEO栏目名',
`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',
`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',
`description` text COMMENT '描述',
`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',
`body` text COMMENT '内容',
`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',
`orderstype` int(4) NOT NULL DEFAULT '0' COMMENT '排序类型:1时间倒序2ID正序3点击量倒序4ID正序5时间正序6点击量正序',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
`iscover` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否覆盖下级',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '上级栏目ID',
`gid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目权限:0不限制',
`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',
`lists_html` varchar(50) DEFAULT NULL COMMENT '栏目页模板',
`details_html` varchar(50) DEFAULT NULL COMMENT '详情页模板',
`lists_num` int(4) DEFAULT '0' COMMENT '列表数量',
`comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',
`gourl` varchar(255) DEFAULT NULL COMMENT '栏目外链',
`ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许会员发布',
`isclose` tinyint(1) NOT NULL DEFAULT '0' COMMENT '关闭栏目',
`gids` varchar(255) DEFAULT NULL COMMENT '允许访问角色',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='栏目表';
-- ----------------------------
-- Table structure for jz_collect
-- ----------------------------
DROP TABLE IF EXISTS `jz_collect`;
CREATE TABLE `jz_collect` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`description` varchar(500) DEFAULT NULL COMMENT '简介',
`tid` int(11) DEFAULT NULL COMMENT '所属栏目',
`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',
`w` varchar(10) NOT NULL DEFAULT '0' COMMENT '宽',
`h` varchar(10) NOT NULL DEFAULT '0' COMMENT '高',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0隐藏',
`url` varchar(255) DEFAULT NULL COMMENT '链接',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图';
-- ----------------------------
-- Table structure for jz_collect_type
-- ----------------------------
DROP TABLE IF EXISTS `jz_collect_type`;
CREATE TABLE `jz_collect_type` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '分类名',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图分类';
-- ----------------------------
-- Table structure for jz_comment
-- ----------------------------
DROP TABLE IF EXISTS `jz_comment`;
CREATE TABLE `jz_comment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'comment' COMMENT '模型标识',
`tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目tid',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章id',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '回复帖子id',
`zid` int(11) NOT NULL DEFAULT '0' COMMENT '主回复帖子:同一层楼内回复,规定主回复id',
`body` text COMMENT '评论内容',
`reply` text COMMENT '回复内容',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员:0表示游客',
`likes` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0隐藏2被删除',
`isread` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已读:1已读0未读',
PRIMARY KEY (`id`),
KEY `tid` (`tid`),
KEY `aid` (`aid`),
KEY `pid` (`pid`),
KEY `zid` (`zid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='评论表';
-- ----------------------------
-- Table structure for jz_ctype
-- ----------------------------
DROP TABLE IF EXISTS `jz_ctype`;
CREATE TABLE `jz_ctype` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(50) DEFAULT NULL COMMENT '配置栏名称',
`action` varchar(255) DEFAULT NULL COMMENT '配置标识,用于权限控制',
`sys` tinyint(1) DEFAULT 0 COMMENT '系统配置,1是0否',
`isopen` tinyint(1) DEFAULT 1 COMMENT '是否启用,1启用0关闭',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统设置栏目名';
-- ----------------------------
-- Table structure for jz_customurl
-- ----------------------------
DROP TABLE IF EXISTS `jz_customurl`;
CREATE TABLE `jz_customurl` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',
`url` varchar(255) DEFAULT NULL COMMENT '自定义URL',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='自定义链接表';
-- ----------------------------
-- Table structure for jz_fields
-- ----------------------------
DROP TABLE IF EXISTS `jz_fields`;
CREATE TABLE `jz_fields` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`field` varchar(50) DEFAULT NULL COMMENT '字段标识',
`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',
`fieldname` varchar(100) DEFAULT NULL COMMENT '字段名称',
`tips` varchar(100) DEFAULT NULL COMMENT '填写提示',
`fieldtype` tinyint(2) NOT NULL DEFAULT '1' COMMENT '输入类型',
`tids` text COMMENT '绑定栏目',
`fieldlong` varchar(50) DEFAULT NULL COMMENT '字段长度',
`body` text COMMENT '字段配置',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '表单排序',
`ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否必填:1是0否',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台是否显示:1显示0隐藏',
`isadmin` tinyint(1) NOT NULL DEFAULT '1' COMMENT '后台是否显示:1显示0隐藏',
`issearch` tinyint(1) NOT NULL DEFAULT '0' COMMENT '搜索显示:1显示0隐藏',
`islist` tinyint(1) NOT NULL DEFAULT '0' COMMENT '列表显示:1显示0隐藏',
`format` varchar(50) DEFAULT NULL COMMENT '格式化',
`vdata` varchar(50) DEFAULT NULL COMMENT '默认值',
`isajax` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'AJAX显示:1显示0隐藏',
`listorders` int(4) NOT NULL DEFAULT '0' COMMENT '列表排序',
`isext` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否扩展信息',
`width` varchar(50) DEFAULT NULL COMMENT '列表中显示宽度',
`ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台表单录入',
`ldfield` varchar(255) DEFAULT NULL COMMENT '关联字段',
`linkfield` varchar(255) DEFAULT NULL COMMENT '连接字段',
`remote` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否远程数据',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Table structure for jz_hook
-- ----------------------------
DROP TABLE IF EXISTS `jz_hook`;
CREATE TABLE `jz_hook` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`module` varchar(50) DEFAULT NULL COMMENT '模块,Home/A',
`namespace` varchar(100) DEFAULT NULL COMMENT '控制器命名空间',
`controller` varchar(50) DEFAULT NULL COMMENT '控制器',
`action` varchar(255) DEFAULT NULL COMMENT '执行函数:可同时注册多个方法,逗号拼接',
`hook_namespace` varchar(100) DEFAULT NULL COMMENT '钩子控制器所在的命名空间',
`hook_controller` varchar(50) DEFAULT NULL COMMENT '钩子控制器',
`hook_action` varchar(50) DEFAULT NULL COMMENT '钩子执行方法',
`all_action` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否全局控制器',
`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序:越大越靠前执行',
`isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否关闭:1开启0关闭',
`plugins_name` varchar(50) DEFAULT NULL COMMENT '关联插件名',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件钩子';
-- ----------------------------
-- Table structure for jz_layout
-- ----------------------------
DROP TABLE IF EXISTS `jz_layout`;
CREATE TABLE `jz_layout` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(200) DEFAULT NULL COMMENT '桌面名称',
`top_layout` text COMMENT '顶部菜单',
`left_layout` text COMMENT '左侧菜单',
`gid` int(11) DEFAULT NULL COMMENT '所属角色',
`ext` varchar(255) DEFAULT NULL COMMENT '备注',
`sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统配置:1是0否',
`isdefault` tinyint(1) NOT NULL DEFAULT '0' COMMENT '默认配置:1是0否',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='桌面设置';
-- ----------------------------
-- Table structure for jz_level
-- ----------------------------
DROP TABLE IF EXISTS `jz_level`;
CREATE TABLE `jz_level` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'level' COMMENT '模型标识',
`name` varchar(20) DEFAULT NULL COMMENT '管理员名称',
`pass` varchar(100) DEFAULT NULL COMMENT '密码',
`tel` varchar(20) DEFAULT NULL COMMENT '电话号码',
`gid` int(4) NOT NULL DEFAULT '2' COMMENT '所属角色',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
`regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间',
`logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0冻结',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='管理员表';
-- ----------------------------
-- Table structure for jz_level_group
-- ----------------------------
DROP TABLE IF EXISTS `jz_level_group`;
CREATE TABLE `jz_level_group` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'level_group' COMMENT '模型标识',
`name` varchar(50) DEFAULT NULL COMMENT '角色名称',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
`isadmin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '超管:1是0否',
`ischeck` tinyint(1) NOT NULL DEFAULT '0' COMMENT '发布审核:1需要审核0不需要',
`classcontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否配置栏目权限:1是0否',
`paction` text COMMENT '权限列表',
`tids` text COMMENT '拥有栏目权限',
`isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0冻结',
`description` varchar(500) DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
-- ----------------------------
-- Table structure for jz_likes
-- ----------------------------
DROP TABLE IF EXISTS `jz_likes`;
CREATE TABLE `jz_likes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `tid` (`tid`,`aid`,`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='点赞表';
-- ----------------------------
-- Table structure for jz_link_type
-- ----------------------------
DROP TABLE IF EXISTS `jz_link_type`;
CREATE TABLE `jz_link_type` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '友链分类名',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接分类表';
-- ----------------------------
-- Table structure for jz_links
-- ----------------------------
DROP TABLE IF EXISTS `jz_links`;
CREATE TABLE `jz_links` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '友链名称',
`molds` varchar(50) DEFAULT 'links' COMMENT '模型标识',
`url` varchar(255) DEFAULT NULL COMMENT '链接',
`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID',
`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',
`target` varchar(255) DEFAULT NULL COMMENT '外链',
`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接表';
-- ----------------------------
-- Table structure for jz_member
-- ----------------------------
DROP TABLE IF EXISTS `jz_member`;
CREATE TABLE `jz_member` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'member' COMMENT '模型标识',
`username` varchar(50) DEFAULT NULL COMMENT '用户昵称',
`openid` varchar(255) DEFAULT NULL COMMENT '微信OPENID',
`pass` varchar(255) DEFAULT NULL COMMENT '密码',
`token` varchar(255) DEFAULT NULL COMMENT 'Token',
`sex` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性别:1男2女0未知',
`gid` int(11) NOT NULL DEFAULT '1' COMMENT '会员分组ID',
`litpic` varchar(255) DEFAULT NULL COMMENT '头像',
`tel` varchar(50) DEFAULT NULL COMMENT '手机号码',
`jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分数',
`likes` text COMMENT '喜欢点赞(已废弃)',
`collection` text COMMENT '收藏(已废弃)',
`money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金币',
`email` varchar(255) DEFAULT NULL COMMENT '邮箱',
`address` varchar(255) DEFAULT NULL COMMENT '地址',
`province` varchar(50) DEFAULT NULL COMMENT '省份',
`city` varchar(50) DEFAULT NULL COMMENT '城市',
`regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间',
`hassendtime` int(11) NOT NULL DEFAULT '0' COMMENT '发送验证码时间',
`logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0封禁',
`signature` varchar(255) DEFAULT NULL COMMENT '个性签名',
`birthday` varchar(25) DEFAULT NULL COMMENT '生日:2020-01-01',
`follow` text COMMENT '关注列表',
`fans` int(11) NOT NULL DEFAULT '0' COMMENT '粉丝数',
`ismsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收消息提醒',
`iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收评论消息提醒',
`iscollect` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收收藏消息提醒',
`islikes` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收点赞消息提醒',
`isat` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收@消息提醒',
`isrechange` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收交易消息提醒',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '推荐用户ID',
`uploadsize` int(11) NOT NULL DEFAULT '50' COMMENT '上传大小限制',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员表';
-- ----------------------------
-- Table structure for jz_member_group
-- ----------------------------
DROP TABLE IF EXISTS `jz_member_group`;
CREATE TABLE `jz_member_group` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '分组名',
`molds` varchar(50) DEFAULT 'member_group' COMMENT '模型标识',
`description` varchar(255) DEFAULT NULL COMMENT '分组简介',
`paction` text COMMENT '权限',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '分组上级',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
`isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许登录',
`iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许评论',
`ischeckmsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否需要审核评论',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣价:现金折扣或者百分比折扣',
`discount_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '折扣类型:0无折扣1现金折扣,1百分比折扣',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员分组';
-- ----------------------------
-- Table structure for jz_menu
-- ----------------------------
DROP TABLE IF EXISTS `jz_menu`;
CREATE TABLE `jz_menu` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL COMMENT '导航名称',
`nav` text COMMENT '导航配置',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0不显示',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='导航表';
-- ----------------------------
-- Table structure for jz_message
-- ----------------------------
DROP TABLE IF EXISTS `jz_message`;
CREATE TABLE `jz_message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`molds` varchar(50) DEFAULT 'message' COMMENT '模型标识',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员',
`tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章ID',
`user` varchar(255) DEFAULT NULL COMMENT '用户名',
`ip` varchar(255) DEFAULT NULL COMMENT 'IP',
`body` text COMMENT '留言内容',
`reply` text COMMENT '回复内容',
`tel` varchar(50) DEFAULT NULL COMMENT '电话',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',
`email` varchar(255) DEFAULT NULL COMMENT '邮箱',
`isshow` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否审核:1审核0未审',
`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',
`tids` varchar(255) DEFAULT NULL COMMENT '副栏目',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='留言表';
-- ----------------------------
-- Table structure for jz_molds
-- ----------------------------
DROP TABLE IF EXISTS `jz_molds`;
CREATE TABLE `jz_molds` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '模型名称',
`biaoshi` varchar(50) DEFAULT NULL COMMENT '模型标识',
`sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统:1是0否',
`isopen` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启:1开启0关闭',
`iscontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启权限:1开启权限0不开启',
`ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '栏目必选:1是0否',
`isclasstype` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示栏目',
`isshowclass` tinyint(1) DEFAULT '1' COMMENT '栏目绑定:1显示0隐藏',
`list_html` varchar(50) DEFAULT 'list.html' COMMENT '默认列表模板',
`details_html` varchar(50) DEFAULT 'details.html' COMMENT '默认详情模板',
`orders` int(11) NOT NULL DEFAULT '100' COMMENT '排序',
`ispreview` tinyint(1) DEFAULT '1' COMMENT '是否可以预览',
`ishome` tinyint(1) DEFAULT '0' COMMENT '前台发布',
PRIMARY KEY (`id`),
KEY `biaoshi` (`biaoshi`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='模型表';
-- ----------------------------
-- Table structure for jz_orders
-- ----------------------------
DROP TABLE IF EXISTS `jz_orders`;
CREATE TABLE `jz_orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`orderno` varchar(255) DEFAULT NULL COMMENT '订单号',
`molds` varchar(50) DEFAULT 'orders' COMMENT '模型标识',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '下单会员',
`paytype` varchar(20) DEFAULT NULL COMMENT '支付方式',
`ptype` tinyint(1) DEFAULT '1' COMMENT '交易类型:1商品购买2充值金额3充值积分',
`tel` varchar(50) DEFAULT NULL COMMENT '电话',
`username` varchar(50) DEFAULT NULL COMMENT '用户名',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`price` varchar(200) DEFAULT NULL COMMENT '价格',
`jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分',
`qianbao` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '钱包',
`body` text COMMENT '购买内容',
`receive_username` varchar(50) DEFAULT NULL COMMENT '收件人',
`receive_tel` varchar(20) DEFAULT NULL COMMENT '收件电话',
`receive_email` varchar(50) DEFAULT NULL COMMENT '收件邮箱',
`receive_address` varchar(255) DEFAULT NULL COMMENT '收件地址',
`ispay` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否支付:1支付0未支付',
`paytime` int(11) NOT NULL DEFAULT '0' COMMENT '支付时间',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '下单时间',
`send_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '订单状态:1提交订单,2已支付,3超时,4已提交订单,5已发货,6已废弃失效,0删除订单',
`discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣',
`yunfei` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '运费',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
-- ----------------------------
-- Table structure for jz_page
-- ----------------------------
DROP TABLE IF EXISTS `jz_page`;
CREATE TABLE `jz_page` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`molds` varchar(50) DEFAULT 'page' COMMENT '模型标识',
`htmlurl` varchar(50) DEFAULT NULL COMMENT '链接',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',
`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏',
`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`tids` varchar(255) NOT NULL COMMENT '副栏目',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='单页模型';
-- ----------------------------
-- Table structure for jz_pictures
-- ----------------------------
DROP TABLE IF EXISTS `jz_pictures`;
CREATE TABLE `jz_pictures` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',
`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',
`path` varchar(20) DEFAULT 'Admin' COMMENT '板块:Admin后台Home前台',
`filetype` varchar(20) DEFAULT NULL COMMENT '类型',
`size` varchar(50) DEFAULT NULL COMMENT '大小',
`litpic` varchar(255) DEFAULT NULL COMMENT '链接',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID/发布会员ID',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='图片集';
-- ----------------------------
-- Table structure for jz_pingjia
-- ----------------------------
DROP TABLE IF EXISTS `jz_pingjia`;
CREATE TABLE `jz_pingjia` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`tid` int(11) DEFAULT '0' COMMENT '所属栏目',
`tids` varchar(255) DEFAULT NULL COMMENT '副栏目',
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',
`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',
`description` varchar(500) DEFAULT NULL COMMENT '简介',
`body` text COMMENT '内容',
`molds` varchar(50) DEFAULT 'pingjia' COMMENT '模型标识',
`userid` int(11) DEFAULT '0' COMMENT '发布管理员',
`orders` int(11) DEFAULT '0' COMMENT '排序',
`member_id` int(11) DEFAULT '0' COMMENT '前台用户',
`comment_num` int(11) DEFAULT '0' COMMENT '评论数',
`htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接',
`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示',
`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否',
`istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否',
`target` varchar(255) DEFAULT NULL COMMENT '外链',
`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义URL',
`jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性',
`hits` int(11) DEFAULT '0' COMMENT '点击量',
`zan` int(11) DEFAULT '0' COMMENT '点赞数',
`tags` varchar(255) DEFAULT NULL COMMENT 'TAG',
`addtime` int(11) DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`zhiye` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Table structure for jz_plugins
-- ----------------------------
DROP TABLE IF EXISTS `jz_plugins`;
CREATE TABLE `jz_plugins` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '插件名称',
`filepath` varchar(50) DEFAULT NULL COMMENT '插件文件名',
`description` varchar(255) DEFAULT NULL COMMENT '简介',
`version` decimal(3,1) NOT NULL DEFAULT '0.0' COMMENT '版本',
`author` varchar(50) DEFAULT NULL COMMENT '作者',
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`module` varchar(20) NOT NULL DEFAULT 'Home' COMMENT '模块',
`isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启:1开启0关闭',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`config` text COMMENT '配置',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件表';
-- ----------------------------
-- Table structure for jz_power
-- ----------------------------
DROP TABLE IF EXISTS `jz_power`;
CREATE TABLE `jz_power` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`action` varchar(50) DEFAULT NULL COMMENT '函数名',
`name` varchar(50) DEFAULT NULL COMMENT '权限名',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限ID',
`isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开放',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户权限表';
-- ----------------------------
-- Table structure for jz_product
-- ----------------------------
DROP TABLE IF EXISTS `jz_product`;
CREATE TABLE `jz_product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'product' COMMENT '模型标识',
`title` varchar(255) DEFAULT NULL COMMENT '商品名称',
`seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目',
`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',
`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',
`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',
`description` varchar(255) DEFAULT NULL COMMENT '简介',
`litpic` varchar(255) DEFAULT NULL COMMENT '首图',
`stock_num` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
`price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格',
`pictures` text COMMENT '图集',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0不显示',
`comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',
`body` mediumtext COMMENT '详情',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '录入管理员ID',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否',
`istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否',
`tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员',
`target` varchar(255) DEFAULT NULL COMMENT '外链',
`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',
`jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性:1置顶2热点3推荐',
`tids` varchar(255) DEFAULT NULL,
`zan` int(11) DEFAULT '0',
`lx` varchar(2) DEFAULT NULL,
`color` varchar(2) DEFAULT NULL,
`hy` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
-- ----------------------------
-- Table structure for jz_recycle
-- ----------------------------
DROP TABLE IF EXISTS `jz_recycle`;
CREATE TABLE `jz_recycle` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '标记',
`molds` varchar(50) DEFAULT NULL COMMENT '回收模型标志',
`data` mediumtext COMMENT '回收数据',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '关联删除',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='回收站';
-- ----------------------------
-- Table structure for jz_ruler
-- ----------------------------
DROP TABLE IF EXISTS `jz_ruler`;
CREATE TABLE `jz_ruler` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '权限名称',
`fc` varchar(50) DEFAULT NULL COMMENT '函数',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限',
`isdesktop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否桌面配置显示(已废弃)',
`sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '系统:1是0否',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色权限表';
-- ----------------------------
-- Table structure for jz_shouchang
-- ----------------------------
DROP TABLE IF EXISTS `jz_shouchang`;
CREATE TABLE `jz_shouchang` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户收藏表';
-- ----------------------------
-- Table structure for jz_sysconfig
-- ----------------------------
DROP TABLE IF EXISTS `jz_sysconfig`;
CREATE TABLE `jz_sysconfig` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`field` varchar(50) DEFAULT NULL COMMENT '配置字段',
`title` varchar(255) DEFAULT NULL COMMENT '配置名称',
`tip` varchar(255) DEFAULT NULL COMMENT '字段填写提示',
`type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '参数类型:1图片2单行文本3多行文本4编辑器5文件上传6下拉开启关闭选项7下拉是否选项8栏目选项9代码',
`data` text COMMENT '配置内容',
`typeid` tinyint(1) NOT NULL DEFAULT '0' COMMENT '配置栏ID',
`config` text COMMENT '单选多选配置信息',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`sys` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否系统字段',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统配置';
-- ----------------------------
-- Table structure for jz_tags
-- ----------------------------
DROP TABLE IF EXISTS `jz_tags`;
CREATE TABLE `jz_tags` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`tid` int(11) DEFAULT '0' COMMENT '栏目ID',
`tids` varchar(500) DEFAULT NULL COMMENT '相关栏目',
`orders` int(11) DEFAULT '0' COMMENT '排序',
`comment_num` int(11) DEFAULT '0' COMMENT '评论数',
`molds` varchar(50) DEFAULT 'tags' COMMENT '模型标识',
`htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接',
`keywords` varchar(50) DEFAULT NULL COMMENT '关键词',
`newname` varchar(50) DEFAULT NULL COMMENT '替换词(已废弃)',
`num` int(4) DEFAULT '-1' COMMENT '替换次数:-1不限制',
`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示隐藏',
`target` varchar(50) DEFAULT '_blank' COMMENT '外链',
`number` int(11) DEFAULT '0' COMMENT '数量',
`member_id` int(11) DEFAULT '0' COMMENT '发布会员',
`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',
`tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',
`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否',
`istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='TAGS表';
-- ----------------------------
-- Table structure for jz_task
-- ----------------------------
DROP TABLE IF EXISTS `jz_task`;
CREATE TABLE `jz_task` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`tid` int(11) DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) DEFAULT '0' COMMENT '文章ID',
`userid` int(11) DEFAULT '0' COMMENT '发布会员',
`puserid` int(11) DEFAULT '0' COMMENT '对象会员',
`molds` varchar(50) DEFAULT NULL COMMENT '模块标识',
`type` varchar(50) DEFAULT NULL COMMENT '消息类型',
`body` varchar(255) DEFAULT NULL COMMENT '内容',
`url` varchar(255) DEFAULT NULL COMMENT '链接',
`isread` tinyint(1) DEFAULT '0' COMMENT '是否已读:1已读0未读',
`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏',
`readtime` int(11) DEFAULT '0' COMMENT '阅读时间',
`addtime` int(11) DEFAULT '0' COMMENT '发布时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员消息表';
-- ----------------------------
-- Records of jz_article
-- ----------------------------
-- ----------------------------
-- Records of jz_attr
-- ----------------------------
INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('1','置顶','1');
INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('2','热点','1');
INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('3','推荐','1');
-- ----------------------------
-- Records of jz_buylog
-- ----------------------------
-- ----------------------------
-- Records of jz_cachedata
-- ----------------------------
-- ----------------------------
-- Records of jz_chain
-- ----------------------------
-- ----------------------------
-- Records of jz_classtype
-- ----------------------------
-- ----------------------------
-- Records of jz_collect
-- ----------------------------
-- ----------------------------
-- Records of jz_collect_type
-- ----------------------------
-- ----------------------------
-- Records of jz_comment
-- ----------------------------
-- ----------------------------
-- Records of jz_ctype
-- ----------------------------
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('1','基本设置','base',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('2','高级设置','high-level',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('3','搜索配置','searchconfig',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('4','邮件订单','email-order',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('5','支付配置','payconfig',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('6','公众号配置','wechatbind',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('7','积分配置','jifenset',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('8','图片水印','imagewatermark',1,1);
-- ----------------------------
-- Records of jz_customurl
-- ----------------------------
-- ----------------------------
-- Records of jz_fields
-- ----------------------------
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('1','url','links','链接地址', NULL,'1',',0,','255', NULL,'0','1','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('2','title','links','链接名称', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('3','email','message','联系邮箱', NULL,'1', NULL,'255', NULL,'0','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('4','keywords','tags','关键词','尽量简短,但不能重复','1', NULL,'50', NULL,'0','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('5','newname','tags','替换词','尽量简短,但不能重复,20字以内,可不填。【已废弃】','1', NULL,'50', NULL,'0','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('7','num','tags','替换次数','一篇文章内替换的次数,默认-1,全部替换【已废弃】','4', NULL,'4', NULL,'0','0','1','0','0','0', NULL,'-1','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('8','target','tags','打开方式', NULL,'7', NULL,'50','新窗口=_blank,本窗口=_self','0','0','1','0','0','0', NULL,'_blank','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('9','number','tags','标签数','无需填写,程序自动处理','4', NULL,'11', NULL,'0','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('10','member_id','article','用户','前台会员,无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('11','member_id','product','用户','前台会员,无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('12','member_id','links','发布用户','前台会员,无需填写','13', NULL,'11','3,username','0','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('13','target','links','外链URL','默认为空,系统访问内容则直接跳转到此链接','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('14','ownurl','links','自定义URL','默认为空,自定义URL','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('15','ownurl','tags','自定义URL','默认为空,自定义URL','1', NULL,'255', NULL,'0','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('16','addtime','links','添加时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('17','addtime','tags','添加时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('43','molds','product','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('19','title','article','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0','250','1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('20','tid','article','所属栏目', NULL,'17', NULL,'13', NULL,'1','1','1','1','1','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('21','molds','article','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('22','htmlurl','article','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','1', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('23','keywords','article','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('24','description','article','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('25','seo_title','article','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('26','userid','article','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('27','litpic','article','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('28','body','article','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('29','addtime','article','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('30','orders','article','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('31','hits','article','点击量', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('32','isshow','article','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','1','1', NULL,'1','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('33','comment_num','article','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','1', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('34','istop','article','是否置顶:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('35','ishot','article','是否头条:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('36','istuijian','article','是否推荐:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('37','tags','article','Tags', NULL,'19',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('38','target','article','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('39','ownurl','article','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('40','jzattr','article','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','0','0','150','0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('41','tids','article','副栏目', NULL,'18', NULL,'255', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('42','zan','article','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('44','title','product','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','100','0','300','1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('45','seo_title','product','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('46','tid','product','所属栏目', NULL,'17', NULL,'11', NULL,'1','0','1','1','1','1', NULL,'0','1','100','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('47','hits','product','点击量', NULL,'4',',0,10,','11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('48','htmlurl','product','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('49','keywords','product','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('50','description','product','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('51','litpic','product','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','100','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('52','stock_num','product','库存', NULL,'1', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('53','price','product','价格', NULL,'1', NULL,'10,2', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('54','pictures','product','图集', NULL,'6',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,', NULL, NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('55','isshow','product','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','0','1', NULL,'1','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('56','comment_num','product','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('57','body','product','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('58','userid','product','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('59','orders','product','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','100','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('60','addtime','product','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('61','istop','product','是否置顶:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('62','ishot','product','是否头条:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('63','istuijian','product','是否推荐:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('64','tags','product','Tags', NULL,'19', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('65','target','product','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('66','ownurl','product','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('67','jzattr','product','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','100','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('68','tids','product','副栏目', NULL,'18', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('69','zan','product','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('70','isshow','tags','是否显示', NULL,'7', NULL,'1','显示=1,隐藏=0,退回=2','0','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('71','lx','product','类型', NULL,'7',',1,6,7,','2','响应式=1,PC=2,手机=3,PC+手机=4,小程序=5','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('72','color','product','颜色', NULL,'7',',1,6,7,','2','红色=1,橙色=2,黄色=3,绿色=4,蓝色=5,紫色=6,粉色=7','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('73','hy','product','行业', NULL,'8',',1,6,7,','500','金融/证券=1,IT科技/软件=2,教育/培训=3,珠宝/工艺品=4,五金/机电=5,婚庆/摄影/美容=6,旅游/餐饮/美食=7,房产/汽车/运输=8,休闲/文化=9,医疗/生物/化工=10,儿童/游乐园=11,动物/宠物=12,鲜花/礼物=13,运动/俱乐部=14,生态/农业=15,建筑/装饰=16,广告/网站/设计=17,个人/导航/博客=18','2','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('74','title','pingjia','用户名','默认为空','1',',0,10,','255', NULL,'100','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('75','tid','pingjia','所属栏目','选择栏目','17',',10,','11', NULL,'100','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('76','tids','pingjia','副栏目','绑定后可以在当前模型的其他栏目中显示','18', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('77','keywords','pingjia','关键词','每个词用英文逗号(,)拼接','1', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('78','tags','pingjia','TAG','每个词用英文逗号(,)拼接','19', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('79','litpic','pingjia','头像','可留空','5',',0,10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('80','description','pingjia','简述','可留空','2',',0,10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('81','body','pingjia','内容','可留空','3',',10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('82','member_id','pingjia','发布会员','前台发布会员ID记录','13', NULL,'11','3,username','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('83','userid','pingjia','管理员','后台发布管理员ID记录','13', NULL,'11','11,name','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('84','target','pingjia','外链URL','默认为空,系统访问内容则直接跳转到此链接','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('85','ownurl','pingjia','自定义URL','默认为空,自定义URL','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('86','hits','pingjia','点击量','系统自动添加','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('87','comment_num','pingjia','评论数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('88','zan','pingjia','点赞数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('89','addtime','pingjia','添加时间','选择时间','11',NULL,'11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('90','jzattr','pingjia','推荐属性','1置顶2热点3推荐','16', NULL,'50','14,name','100','0','1','0','0','0', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('91','isshow','pingjia','是否显示','显示隐藏','7',',10,','1','显示=1,隐藏=0,退回=2','100','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('92','zhiye','pingjia','职业', NULL,'1',',10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('93','orders','pingjia','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (94, 'username', 'member', '用户昵称', NULL, 1, ',0,', '255', NULL, 2, 1, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (95, 'openid', 'member', '微信OPENID', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (96, 'sex', 'member', '性别', NULL, 12, ',0,', '2', '男=1,女=2,未知=0', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (97, 'gid', 'member', '会员分组', NULL, 13, ',0,', '11', '6,name', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (98, 'litpic', 'member', '会员头像', NULL, 5, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (99, 'tel', 'member', '电话号码', NULL, 1, ',0,', '12', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (100, 'jifen', 'member', '积分', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (101, 'money', 'member', '金币', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (102, 'email', 'member', '邮箱', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (103, 'province', 'member', '省份', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (104, 'city', 'member', '城市', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (105, 'address', 'member', '详细地址', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (106, 'regtime', 'member', '注册时间', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (107, 'logintime', 'member', '最近登录', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (108, 'signature', 'member', '个性签名', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (109, 'birthday', 'member', '生日', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (110, 'pid', 'member', '推荐人', NULL, 13, ',0,', '11', '3,username', 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (111, 'isshow', 'member', '状态', '封禁后不能登录', 7, ',0,', '2', '正常=1,封禁=0', 2, 0, 1, 1, 1, 1, NULL, '1', 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (112, 'title', 'message', '标题', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (113, 'user', 'message', '用户昵称', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 0, 1, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (114, 'tid', 'message', '相关栏目', NULL, 13, ',4,', '11', '2,classname', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (115, 'tel', 'message', '联系电话', NULL, 1, ',4,', '20', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (116, 'ip', 'message', '留言IP', NULL, 1, ',4,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (117, 'body', 'message', '留言内容', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (118, 'isshow', 'message', '是否审核', NULL, 7, ',4,', '1', '未审核=0,已审核=1', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (119, 'addtime', 'message', '提交时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (120, 'reply', 'message', '回复留言', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (121, 'uploadsize', 'member', '上传限制', '单位M,上传总文件大小限制,超过此大小不允许上传', 4, ',0,', '11', NULL, 2, 0, 0, 1, 0, 0, NULL, '0', 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('122','updatetime','article','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('123','updatetime','product','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('124','updatetime','pingjia','更新时间','选择时间','11',NULL,'11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (125, 'updatetime', 'message', '更新时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('126','updatetime','links','更新时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('127','updatetime','tags','更新时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1');
-- ----------------------------
-- Records of jz_hook
-- ----------------------------
-- ----------------------------
-- Records of jz_layout
-- ----------------------------
INSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('1','系统默认','[]','[{"name":"内容管理","icon":"","nav":[{"key":"16948","title":"内容列表","value":"9","icon":""},{"key":"12349","title":"商品列表","value":"105","icon":""},{"key":"19748","title":"推荐属性","value":"202","icon":""}]},{"name":"栏目管理","icon":"","nav":[{"key":"10518","title":"栏目列表","value":"42","icon":""}]},{"name":"互动管理","icon":"","nav":[{"key":"11832","title":"留言列表","value":"22","icon":""},{"key":"11262","title":"评论列表","value":"16","icon":""}]},{"name":"SEO设置","icon":"","nav":[{"key":"16628","title":"TAG列表","value":"147","icon":""},{"key":"16214","title":"友情链接","value":"95","icon":""},{"key":"16254","title":"网站地图","value":"153","icon":""},{"key":"16917","title":"内链列表","value":"210","icon":""}]},{"name":"用户管理","icon":"","nav":[{"key":"11957","title":"会员列表","value":"2","icon":""},{"key":"15086","title":"会员分组","value":"118","icon":""},{"key":"10618","title":"会员权限","value":"123","icon":""},{"key":"17578","title":"管理员列表","value":"54","icon":""},{"key":"19552","title":"角色管理","value":"49","icon":""},{"key":"10895","title":"权限列表","value":"66","icon":""},{"key":"12582","title":"订单列表","value":"129","icon":""},{"key":"17076","title":"充值列表","value":"177","icon":""}]},{"name":"系统设置","icon":"","nav":[{"key":"11314","title":"网站设置","value":"40","icon":""},{"key":"10572","title":"桌面设置","value":"70","icon":""},{"key":"18242","title":"导航设置","value":"190","icon":""},{"key":"13002","title":"轮播图","value":"83","icon":""},{"key":"15936","title":"轮播图分类","value":"89","icon":""},{"key":"19847","title":"清理缓存","value":"114","icon":""},{"key":"12739","title":"模板列表","value":"223","icon":""},{"key":"127391","title":"配置栏目","value":"240","icon":""}]},{"name":"扩展管理","icon":"","nav":[{"key":"11957","title":"插件列表","value":"76","icon":""},{"key":"13870","title":"图库管理","value":"116","icon":""},{"key":"12472","title":"模型列表","value":"61","icon":""},{"key":"15551","title":"数据库备份","value":"35","icon":""},{"key":"16311","title":"碎片化","value":"194","icon":""},{"key":"18982","title":"公众号菜单","value":"141","icon":""},{"key":"14568","title":"公众号素材","value":"142","icon":""},{"key":"13219","title":"模板制作","value":"143","icon":""},{"key":"17893","title":"生成静态文件","value":"154","icon":""},{"key":"16926","title":"登录日志","value":"115","icon":""}]},{"name":"回收站","icon":"","nav":[{"key":"17056","title":"回收站","value":"217","icon":""}]},{"name":"评价管理","icon":"","nav":[{"key":"16835","title":"用户评价","value":"227","icon":""}]}]','0','CMS默认配置,不可删除!','1','1');
INSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('2','旧版桌面','[]','[{"name":"网站管理","icon":"","nav":["42","9","95","83","147","22"]},{"name":"商品管理","icon":"","nav":["105","129","2","118","123","16","177"]},{"name":"扩展管理","icon":"","nav":["76","116","141","142","143","194","35","61","154","153"]},{"name":"系统设置","icon":"","nav":["40","54","49","190","70","115","114","66"]}]','0','旧版本配置','0','0');
-- ----------------------------
-- Records of jz_level
-- ----------------------------
INSERT INTO `jz_level` (`id`,`name`,`pass`,`tel`,`gid`,`email`,`regtime`,`logintime`,`status`) VALUES ('1','admin','0acdd3e4a8a2a1f8aa3ac518313dab9d','13600136000','1','123456@qq.com','1635997469','1643156842','1');
-- ----------------------------
-- Records of jz_level_group
-- ----------------------------
INSERT INTO `jz_level_group` (`id`,`name`,`isadmin`,`ischeck`,`classcontrol`,`paction`,`tids`,`isagree`,`description`) VALUES ('1','超级管理员','1','0','0',',Fields,', NULL,'1', NULL);
-- ----------------------------
-- Records of jz_likes
-- ----------------------------
-- ----------------------------
-- Records of jz_link_type
-- ----------------------------
-- ----------------------------
-- Records of jz_links
-- ----------------------------
-- ----------------------------
-- Records of jz_member
-- ----------------------------
-- ----------------------------
-- Records of jz_member_group
-- ----------------------------
INSERT INTO `jz_member_group` (`id`,`name`,`description`,`paction`,`pid`,`isagree`,`iscomment`,`ischeckmsg`,`addtime`,`orders`,`discount`,`discount_type`) VALUES ('1','注册会员','前台会员分组,最低等级分组',',Message,Comment,User,Order,Home,Common,Uploads,','0','1','1','1','0','0','0.00','0');
-- ----------------------------
-- Records of jz_menu
-- ----------------------------
-- ----------------------------
-- Records of jz_message
-- ----------------------------
-- ----------------------------
-- Records of jz_molds
-- ----------------------------
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('1','内容','article','1','1','1','1','1','1','article-list.html','article-details.html','100','0','1');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('2','栏目','classtype','1','1','1','1','1','1','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('3','会员','member','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('4','订单','orders','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('5','商品','product','1','1','1','1','1','1','list.html','details.html','100','0','1');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('6','会员分组','member_group','1','1','0','0','1','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('7','评论','comment','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('8','留言','message','1','1','0','0','1','1','message.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('9','轮播图','collect','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('10','友情链接','links','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('11','管理员','level','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('12','TAG','tags','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('13','单页','page','1','1','1','1','1','1','page.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('14','推荐属性','attr','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('15','用户评价','pingjia','0','1','0','1','1','1','lists.html','details.html','100','0','0');
-- ----------------------------
-- Records of jz_orders
-- ----------------------------
-- ----------------------------
-- Records of jz_page
-- ----------------------------
-- ----------------------------
-- Records of jz_pictures
-- ----------------------------
-- ----------------------------
-- Records of jz_pingjia
-- ----------------------------
-- ----------------------------
-- Records of jz_plugins
-- ----------------------------
-- ----------------------------
-- Records of jz_power
-- ----------------------------
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('1','Common','公共权限','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('2','Home','前台网站','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('3','User','个人中心','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('4','Login','会员登录','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('5','Message','站内留言','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('6','Comment','会员评论','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('7','Screen','网站筛选','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('8','Order','会员下单','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('9','Mypay','网站支付','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('10','Jzpay','极致支付','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('11','Tags','TAG标签','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('12','Wechat','微信模块','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('13','Common/vercode','验证码生成','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('14','Common/checklogin','检查是否登录','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('15','Common/multiuploads','多附件上传','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('16','Common/uploads','单附件上传','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('17','Common/qrcode','二维码生成','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('18','Common/get_fields','获取扩展信息','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('19','Common/jizhi','链接错误提示','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('20','Common/error','报错提示','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('21','Home/index','网站首页','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('22','Home/jizhi','网站内容','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('23','Home/auto_url','自定义链接','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('24','Home/jizhi_details','详情内容','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('25','Home/search','网站搜索','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('26','Home/searchAll','网站多模块搜索','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('27','Home/start_cache','开启网站缓存','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('28','Home/end_cache','输出缓存','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('29','User/checklogin','检查是否登录','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('30','User/index','个人中心首页','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('31','User/userinfo','会员资料','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('32','User/orders','订单记录','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('33','User/orderdetails','订单详情','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('34','User/payment','订单支付','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('35','User/orderdel','删除订单','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('36','User/changeimg','上传头像','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('37','User/comment','评论列表','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('38','User/commentdel','删除评论','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('39','User/likesAction','点赞文章','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('40','User/likes','点赞列表','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('41','User/likesdel','取消点赞','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('42','User/collectAction','收藏文章','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('43','User/collect','收藏列表','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('44','User/collectdel','删除收藏','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('45','User/cart','购物车','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('46','User/addcart','添加购物车','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('47','User/delcart','删除购物车','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('48','User/posts','发布管理','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('49','User/release','会员发布','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('50','User/del','删除发布','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('51','User/uploads','会员上传附件','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('52','User/jizhi','404提示','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('53','User/follow','关注用户','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('54','User/nofollow','取消关注','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('55','User/fans','粉丝列表','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('56','User/notify','消息提醒','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('57','User/notifyto','查看消息','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('58','User/notifydel','删除消息','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('59','User/active','公共主页','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('60','User/setmsg','消息提醒设置','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('61','User/getclass','获取栏目列表','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('62','User/wallet','用户钱包','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('63','User/buy','会员充值','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('64','User/buylist','充值列表','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('65','User/buydetails','交易详情','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('66','Login/index','登录首页','4','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('67','Login/register','注册页面','4','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('68','Login/forget','忘记密码','4','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('69','Login/nologin','未登录页面','4','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('70','Login/loginout','退出登录','4','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('71','Message/index','发送留言','5','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('72','Comment/index','发表评论','6','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('73','Screen/index','筛选列表','7','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('74','Order/create','创建订单','8','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('75','Order/pay','订单支付','8','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('76','Tags/index','TAG标签列表','11','1');
-- ----------------------------
-- Records of jz_product
-- ----------------------------
-- ----------------------------
-- Records of jz_recycle
-- ----------------------------
-- ----------------------------
-- Records of jz_ruler
-- ----------------------------
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('1','会员管理','Member','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('2','会员列表','Member/index','1','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('3','添加会员','Member/memberadd','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('4','修改会员','Member/memberedit','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('5','删除会员','Member/member_del','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('6','批量删除','Member/deleteAll','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('7','修改状态','Member/change_status','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('8','内容管理','Article','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('9','内容列表','Article/articlelist','8','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('10','添加内容','Article/addarticle','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('11','修改内容','Article/editarticle','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('12','删除内容','Article/deletearticle','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('13','批量删除','Article/deleteAll','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('14','复制内容','Article/copyarticle','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('15','评论管理','Comment','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('16','评论列表','Comment/commentlist','15','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('17','添加评论','Comment/addcomment','15','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('18','修改评论','Comment/editcomment','15','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('19','删除评论','Comment/deletecomment','15','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('20','批量删除','Comment/deleteAll','15','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('21','留言管理','Message','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('22','留言列表','Message/messagelist','21','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('23','修改留言','Message/editmessage','21','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('24','删除留言','Message/deletemessage','21','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('25','批量删除','Message/deleteAll','21','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('26','字段管理','Fields','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('27','字段列表','Fields/index','26','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('28','新增字段','Fields/addFields','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('29','修改字段','Fields/editFields','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('30','删除字段','Fields/deleteFields','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('31','获取字段','Fields/get_fields','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('32','基本功能','Index','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('33','系统界面','Index/index','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('34','后台首页','Index/welcome','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('35','数据库备份','Index/beifen','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('36','数据库备份','Index/backup','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('37','数据库还原','Index/huanyuan','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('38','数据库删除','Index/shanchu','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('39','系统功能','Sys','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('40','网站设置','Sys/index','39','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('41','栏目管理','Classtype','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('42','栏目列表','Classtype/index','41','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('43','新增栏目','Classtype/addclass','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('44','修改栏目','Classtype/editclass','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('45','删除栏目','Classtype/deleteclass','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('46','修改排序','Classtype/editClassOrders','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('47','栏目隐藏','Classtype/change_status','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('48','管理员管理','Admin','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('49','角色管理','Admin/group','48','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('50','新增角色','Admin/groupadd','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('51','修改角色','Admin/groupedit','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('52','删除角色','Admin/group_del','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('53','角色状态','Admin/change_group_status','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('54','管理员列表','Admin/adminlist','48','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('55','新增管理员','Admin/adminadd','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('56','修改管理员','Admin/adminedit','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('57','管理员状态','Admin/change_status','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('58','删除管理员','Admin/admindelete','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('59','个人信息','Index/details','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('60','模型管理','Molds','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('61','模型列表','Molds/index','60','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('62','新增模型','Molds/addMolds','60','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('63','修改模型','Molds/editMolds','60','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('64','删除模型','Molds/deleteMolds','60','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('65','权限管理','Rulers','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('66','权限列表','Rulers/index','65','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('67','新增权限','Rulers/addrulers','65','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('68','修改权限','Rulers/editrulers','65','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('69','删除权限','Rulers/deleterulers','65','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('70','桌面设置','Index/desktop','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('71','新增桌面','Index/desktop_add','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('72','修改桌面','Index/desktop_edit','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('73','删除桌面','Index/desktop_del','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('74','图标库','Index/unicode','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('75','插件管理','Plugins','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('76','插件列表','Plugins/index','75','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('77','模块扩展','Extmolds','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('82','轮播图','Collect','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('83','轮播图','Collect/index','82','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('84','新增轮播图','Collect/addcollect','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('85','修改轮播图','Collect/editcollect','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('86','删除轮播图','Collect/deletecollect','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('87','复制轮播图','Collect/copycollect','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('88','批量删除轮播图','Collect/deleteAll','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('89','轮播图分类','Collect/collectType','82','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('90','新增轮播图分类','Collect/collectTypeAdd','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('91','修改轮播图分类','Collect/collectTypeEdit','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('92','删除轮播图分类','Collect/collectTypeDelete','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('93','批量复制','Article/copyAll','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('94','批量修改栏目','Article/changeType','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('95','友情链接','Links/index','189','1','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('96','新增友链','Links/addlinks','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('97','修改友链','Links/editlinks','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('98','复制友链','Links/copylinks','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('99','删除友链','Links/deletelinks','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('100','批量删除友链','Links/deleteAll','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('101','通用模块','Common','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('102','上传文件','Common/uploads','101','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('103','更新cookie','Index/update_session_maxlifetime','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('104','商品管理','Product','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('105','商品列表','Product/productlist','104','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('106','新增商品','Product/addproduct','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('107','修改商品','Product/editproduct','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('108','删除商品','Product/deleteproduct','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('109','复制商品','Product/copyproduct','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('110','批量删除','Product/deleteAll','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('111','批量复制','Product/copyAll','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('112','修改栏目','Product/changeType','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('113','修改排序','Product/editProductOrders','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('114','清理缓存','Index/cleanCache','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('115','登录日志','Sys/loginlog','39','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('116','图库管理','Sys/pictures','39','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('117','修改排序','Extmolds/editOrders','77','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('118','会员分组','Member/membergroup','1','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('119','新增分组','Member/groupadd','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('120','修改分组','Member/groupedit','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('121','更改分组状态','Member/change_group_status','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('122','删除分组','Member/group_del','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('123','会员权限','Member/power','1','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('124','添加权限','Member/addrulers','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('125','修改权限','Member/editrulers','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('126','删除权限','Member/deleterulers','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('127','修改分组排序','Member/editOrders','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('128','订单管理','Order','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('129','订单列表','Order/index','128','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('130','订单详情','Order/details','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('131','批量删除','Order/deleteAll','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('132','上传支付证书','Sys/uploadcert','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('133','更改状态','Plugins/change_status','75','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('134','安装卸载','Plugins/action_do','75','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('223','模板列表','Template/index','222','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('222','模板管理','Template','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('137','删除图库图片','Sys/deletePic','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('138','批量删除图库','Sys/deletePicAll','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('139','安装说明','Plugins/desc','75','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('140','微信公众号','Wechat','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('141','公众号菜单','Wechat/wxcaidan','140','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('142','公众号素材','Wechat/sucai','140','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('143','模板制作','Index/showlabel','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('144','获取首字母拼音','Classtype/get_pinyin','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('145','批量新增栏目','Classtype/addmany','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('146','自定义配置删除','Sys/custom_del','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('147','TAG列表','Extmolds/index/molds/tags','77','1','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('148','新增TAG','Extmolds/addmolds/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('149','修改TAG','Extmolds/editmolds/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('150','复制TAG','Extmolds/copymolds/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('151','删除TAG','Extmolds/deletemolds/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('152','批量删除TAG','Extmolds/deleteAll/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('153','网站地图','Index/sitemap','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('154','生成静态文件','Index/tohtml','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('155','更新栏目HTML','Index/html_classtype','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('156','更新模块HTML','Index/html_molds','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('157','批量修改推荐属性','Article/changeAttribute','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('158','批量修改推荐属性','Product/changeAttribute','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('159','批量修改友链栏目','Links/changeType','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('160','批量修改TAG栏目','Extmolds/changeType/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('161','批量复制友链','Links/copyAll','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('162','批量复制TAG','Extmolds/copyAll/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('163','批量修改友链排序','Links/editOrders','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('164','批量修改TAG排序','Extmolds/editOrders/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('165','删除订单','Order/deleteorder','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('166','批量删除','Admin/deleteAll','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('167','高级设置','Sys/ctype/type/high-level','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('168','邮箱订单','Sys/ctype/type/email-order','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('169','支付配置','Sys/ctype/type/payconfig','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('170','公众号配置','Sys/ctype/type/wechatbind','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('171','批量审核','Article/checkAll','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('172','批量审核','Product/checkAll','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('173','批量审核','Message/checkAll','21','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('174','批量审核','Comment/checkAll','15','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('175','批量审核友链','Links/checkAll','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('176','批量审核TAG','Extmolds/checkAll/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('177','充值列表','Order/czlist','128','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('178','手动充值','Order/chongzhi','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('179','删除记录','Order/delbuylog','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('180','批量删除记录','Order/delAllbuylog','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('181','积分配置','Sys/ctype/type/jifenset','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('182','插件更新','Plugins/update','75','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('183','获取栏目模板','Classtype/get_html','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('184','批量修改栏目','Classtype/changeClass','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('185','友链分类','Links/linktype','189','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('186','新增友链分类','Links/linktypeadd','189','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('187','修改友链分类','Links/linktypeedit','189','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('188','删除友链分类','Links/linktypedelete','189','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('189','友情链接','Links','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('190','导航设置','Index/menu','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('191','新增导航','Index/addmenu','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('192','修改导航','Index/editmenu','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('193','删除导航','Index/delmenu','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('194','碎片化','Sys/datacache','39','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('195','新增碎片','Sys/addcache','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('196','修改碎片','Sys/editcache','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('197','删除碎片','Sys/delcache','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('198','预览SQL','Sys/viewcache','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('199','搜索配置','Sys/ctype/type/searchconfig','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('200','修改字段属性','Fields/editFieldsValue','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('201','推荐属性','Jzattr','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('202','推荐属性','Jzattr/index','201','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('203','新增推荐属性','Jzattr/addAttr','201','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('204','修改推荐属性','Jzattr/editAttr','201','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('205','删除推荐属性','Jzattr/delAttr','201','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('206','修改状态','Jzattr/changeStatus','201','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('207','列表设置','Fields/fieldsList','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('208','获取列表字段','Fields/fieldsList','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('209','内链模块','Jzchain','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('210','内链列表','Jzchain/index','209','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('211','新增内链','Jzchain/addchain','209','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('212','修改内链','Jzchain/editchain','209','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('213','删除内链','Jzchain/delchain','209','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('214','批量删除','Jzchain/delAll','209','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('215','修改状态','Jzchain/changeStatus','209','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('216','回收站','Recycle','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('217','回收站','Recycle/index','216','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('218','恢复数据','Recycle/restore','216','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('219','删除数据','Recycle/del','216','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('220','批量删除','Recycle/delAll','216','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('221','批量恢复','Recycle/restoreAll','216','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('224','安装卸载','Template/actionDo','222','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('225','安装说明','Template/desc','222','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('226','模板更新','Template/update','222','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('227','用户评价列表','Extmolds/index/molds/pingjia','77','1','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('228','新增用户评价','Extmolds/addmolds/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('229','修改用户评价','Extmolds/editmolds/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('230','复制用户评价','Extmolds/copymolds/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('231','删除用户评价','Extmolds/deletemolds/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('232','批量删除用户评价','Extmolds/deleteAll/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('233','批量修改用户评价栏目','Extmolds/changeType/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('234','批量复制用户评价','Extmolds/copyAll/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('235','批量修改用户评价列表','Extmolds/editOrders/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('236','批量审核用户评价','Extmolds/checkAll/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('237','重构字段','Molds/restrucFields','60','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('238','基本配置','Sys/ctype/type/base','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('239','批量修改评价推荐属性','Extmolds/changeAttribute/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('240','配置栏目','Sys/systype','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('241','设置配置状态','Sys/systypestatus','39',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('242','修改配置分组','Sys/editctype','39',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('243','新增配置分组','Sys/addctype','39',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('244','全局配置','Sys/ctype','39',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('245','修改配置字段','Sys/setfield','39',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('246','绑定模块数据获取','Fields/getSelect','26',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('247','编辑器上传','Uploads','0',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('248','上传功能','Uploads/index','247',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('249','获取子栏目','Classtype/getchildren','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('250','获取联动数据','Fields/getliandong','26','0','1');
-- ----------------------------
-- Records of jz_shouchang
-- ----------------------------
-- ----------------------------
-- Records of jz_sysconfig
-- ----------------------------
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('1','web_version','系统版号','版本号是系统自带,请勿改动','0','2.5.6','0', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('2','web_name','网站SEO名称','控制在25个字、50个字节以内','2','极致CMS建站系统','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('3','web_keyword','网站SEO关键词','5个左右,8汉字以内,用英文逗号隔开','2','极致建站,cms,开源cms,免费cms,cms系统,phpcms,免费企业建站,建站系统,企业cms,jizhicms,极致cms,建站cms,建站系统,极致博客,极致blog,内容管理系统','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('4','web_desc','网站SEO描述','控制在80个汉字,160个字符以内','3','极致CMS是开源免费的PHPCMS网站内容管理系统,无商业授权,简单易用,提供丰富的插件,帮您实现零基础搭建不同类型网站(企业站,门户站,个人博客站等),是您建站的好帮手。极速建站,就选极致CMS。','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('5','web_js','统计代码','将百度统计、cnzz等平台的流量统计JS代码放到这里','8', NULL,'1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('6','web_copyright','底部版权','如:© 2016 xxx版权','2','@2020-2099','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('7','web_beian','备案号','如:京ICP备00000000号','2','冀ICP备88888号','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('8','web_tel','网站电话','网站联系电话','2','0666-8888888','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('9','web_tel_400','400电话','400电话','2','400-0000-000','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('10','web_qq','网站QQ','网站QQ','2','12345678','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('11','web_email','网站邮箱','网站邮箱','2','123456@qq.com','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('12','web_address','公司地址','公司地址','2','河北省廊坊市广阳区xxx大厦xx楼001号','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('13','pc_template','PC网站模板','将模板名称填写到此处','2','cms','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('14','wap_template','WAP网站模板','开启了手机端,这个设置才会生效,否则调用电脑端模板','2','cms','2',NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('15','weixin_template','微信网站模板','开启了手机端,这个设置才会生效,否则调用电脑端模板。由于微信内有一些特殊的js,所以可以在这里单独设置微信模板','2','cms','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('16','iswap','是否开启手机端','如果不开启手机端,则默认调用电脑端模板','6','1','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('17','isopenhomeupload','是否开启前台上传','关闭后,前台无法上传文件。如果网站没有使用会员,建议关闭前台上传。','6','1','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('18','isopenhomepower','是否开启前台权限','开启后前台用户权限可以在后台控制','6','0','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('19','cache_time','缓存时间','单位:分钟,留空或0则不设置缓存。如果生成静态文件,静态文件清空后才生效。','2','0','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('20','fileSize','限制上传文件大小','0代表不限,单位kb','2','0','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('21','fileType','允许上传文件类型','请用|分割,如:pdf|jpg|png','2','pdf|jpg|jpeg|png|zip|rar|gzip|doc|docx|xlsx','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('22','ueditor_config','后台编辑器导航条配置', "后台UEditor编辑器导航条配置",'3','"fullscreen", "source","undo", "redo","bold", "italic", "underline", "fontborder", "strikethrough", "super", "removeformat", "formatmatch", "autotypeset", "blockquote", "pasteplain","forecolor", "backcolor", "insertorderedlist", "insertunorderedlist", "selectall", "cleardoc","rowspacingtop", "rowspacingbottom", "lineheight","customstyle", "paragraph", "fontfamily", "fontsize","directionalityltr", "directionalityrtl", "indent","justifyleft", "justifycenter", "justifyright", "justifyjustify","touppercase", "tolowercase","link", "unlink", "anchor", "imagenone", "imageleft", "imageright", "imagecenter","simpleupload", "insertimage", "emotion", "scrawl", "insertvideo", "music", "attachment", "map", "gmap", "insertframe", "insertcode", "webapp", "pagebreak","template", "background","horizontal", "date", "time", "spechars", "snapscreen", "wordimage","inserttable", "deletetable", "insertparagraphbeforetable", "insertrow", "deleterow", "insertcol", "deletecol", "mergecells", "mergeright", "mergedown", "splittocells", "splittorows", "splittocols", "charts","print", "preview", "searchreplace", "help", "drafts"','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('23','search_table','允许前台搜索的表','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如:article|product','2','article|product','3', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('24','imagequlity','上传图片压缩比例','100%则不压缩,如果PNG是透明图,压缩后背景变黑色。格式如:80','6','75','2','不压缩使用原图=100,95%=95,90%=90,85%=85,80%=80,75%=75,70%=70,65%=65,60%=60,55%=55,50%=50','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('25','ispngcompress','PNG是否压缩','PNG压缩后容易变成背景黑色,关闭后,不会压缩。','6','0','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('26','email_server','邮件服务器','smtp.163.com,smtp.qq.com','2','smtp.163.com','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('27','email_port','邮件收发端口','163、126邮件端口(465),QQ邮件端口(587)','2','465','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('28','shou_email','收件人Email地址', NULL,'2', NULL,'4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('29','send_email','发件人Email地址','指邮件服务器发件邮箱','2', NULL,'4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('30','send_pass','发件人Email秘钥','这个秘钥不是登录密码','2', NULL,'4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('31','send_name','发件人昵称','发件邮箱会带一个昵称','2','极致建站系统','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('32','tj_msg','客户订单通知','购买商品的时候会发送的一条邮件信息','3','尊敬的{xxx},我们已经收到您的订单!请留意您的电子邮件以获得最新消息,谢谢您!','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('33','send_msg','订单出货通知','发货的时候发送给客户的通知','3','尊敬的{xxx},我们已确认了您的订单,请于3日内汇款,逾期恕不保留,不便请见谅。汇款完成后,烦请告知客服人员您的交易账号后五位,即完成下单手续,谢谢您。','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('34','yunfei','订单运费','购物下单时会加上这个运费','2','0.00','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('35','paytype','在线支付','0关闭支付,1自主平台支付','6','0','5','关闭=0,开启=1','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('40','alipay_partner','支付宝APPID','账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('41','alipay_key','支付宝key','MD5密钥,安全检验码,由数字和字母组成的32位字符串','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('42','alipay_private_key','支付宝私钥', NULL,'3', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('43','alipay_public_key','支付宝公钥', NULL,'3', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('44','wx_mchid','微信商户mchid','支付相关','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('45','wx_key','微信商户key','支付相关','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('46','wx_appid','微信公众号appid','支付相关','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('47','wx_appsecret','微信公众号appsecret','支付相关','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('48','wx_client_cert','微信apiclient_cert','支付相关','5', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('49','wx_client_key','微信apiclient_key','支付相关','5', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('50','wx_login_appid','公众号appid','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('51','wx_login_appsecret','公众号appsecret','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('52','wx_login_token','公众号token','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('53','huanying','公众号关注欢迎语','公众号关注时发送的第一句推送','3','欢迎关注公众号~','6', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('54','wx_token','公众号token','支付相关','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('55','web_logo','网站LOGO', NULL,'1','/static/cms/static/images/logo.png','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('56','admintpl','后台模板风格','内页弹窗:点击新增/修改等操作,页面是一个弹出层,更美观。内嵌页面:点击新增/修改等操作,页面直接进入新页面,不会弹出层。','6','default','2','内页弹窗=default,内嵌页面=tpl','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('59','domain','网站SEO网址','一般不填,全局网址,最后不带/,如:http://www.xxx.com','2', NULL,'1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('61','overtime','订单超时','按小时计算,超过该小时订单过期,仅限于开启支付后,0代表不限制','2','4','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('62','islevelurl','开启层级URL','默认关闭层级URL,开启后URL会按照父类层级展现','6','0','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('63','iscachepage','缓存完整页面','前台完整页面缓存,结合缓存时间,可以提高访问速度','6','1','0','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('64','isautohtml','自动生成静态','前台访问网站页面,将自动生成静态HTML,下次访问直接进入静态HTML页面','0','0','0','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('65','pc_html','PC静态文件目录','电脑端静态HTML存放目录,默认根目录[ / ]','2','/','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('66','mobile_html','WAP静态文件目录','手机端静态HTML存放目录,默认[ m ],PC和WAP静态目录不能相同,否则文件会混乱','2','m','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('67','autocheckmessage','是否留言自动审核','开启后,留言自动审核(显示)','6','0','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('68','autocheckcomment','是否评论自动审核','开启后评论自动审核(显示)','6','1','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('69','mingan','网站敏感词过滤','将敏感词放到里面,用“,”分隔,用{xxx}代替通配内容','3', NULL,'1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('70','iswatermark','是否开启水印','开启水印后水印图片优先,如果没有图片则使用水印文字','6','0','8','开启=1,关闭=0','100','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('71','watermark_file','水印图片','水印图片在250px以内','1', NULL,'8', NULL,'99','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('72','watermark_t','水印位置','参考键盘九宫格1-9','2','9','8', NULL,'98','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('73','watermark_tm','水印透明度','透明度越大,越难看清楚水印','6','0','8','不显示=0,10%=10,20%=20,30%=30,40%=40,50%=50,60%=60,70%=70,80%=80,90%=90','97','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('74','money_exchange','钱包兑换率','站内钱包与RMB的兑换率,即1元=多少金币','2','1','5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('75','jifen_exchange','积分兑换率','站内积分与RMB的兑换率,即1元=多少积分','2','100','5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('76','isopenjifen','积分支付','开启积分支付后,商品可以用积分支付','6','1','5','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('77','isopenqianbao','钱包支付','开启钱包支付后,商品可以用钱包支付','6','1','5','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('78','isopenweixin','微信支付','开启微信支付后,商品可以用微信支付','6','1','5','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('79','isopenzfb','支付宝支付','开启支付宝支付后,商品可以用支付宝支付','6','1','5','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('80','login_award','每次登录奖励','每天登录奖励积分数,最小为0,每天登录只奖励一次','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('81','login_award_open','登录奖励','开启登录奖励后,登录后就会获得积分奖励','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('82','release_award_open','发布奖励','开启后,发布内容会奖励积分','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('83','release_award','每次发布奖励','每次发布内容奖励积分数','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('84','release_max_award','每天发布最高奖励','每天奖励不超过积分上限,设置0则无上限','2','0','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('85','collect_award_open','收藏奖励','开启后,发布内容被收藏会奖励积分','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('86','collect_award','每次收藏奖励','每次发布内容被收藏奖励积分数','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('87','collect_max_award','每天收藏最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('88','likes_award_open','点赞奖励','开启后,发布内容被点赞会奖励积分','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('89','likes_award','每次点赞奖励','每次发布内容被点赞奖励积分数','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('90','likes_max_award','每天点赞最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('91','comment_award_open','评论奖励','开启后,发布内容被评论会奖励积分','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('92','comment_award','每次评论奖励','每次发布内容被评论奖励积分数','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('93','comment_max_award','每天评论最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('94','follow_award_open','关注奖励','开启后,用户被粉丝关注会奖励积分','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('95','follow_award','每次关注奖励','每次被关注奖励积分数','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('96','follow_max_award','每天关注最高奖励','每天关注奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('97','isopenemail','发送邮件','是否开启邮件发送','6','1','4','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('98','closeweb','关闭网站','关闭网站后,前台无法访问,后台可以进入','6','0','1','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('99','closetip','关站提示', NULL,'3','抱歉!该站点已经被管理员停止运行,请联系管理员了解详情!','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('100','admin_save_path','后台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('101','home_save_path','前台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('102','isajax','是否开启前台AJAX','开启后AJAX,前台可以通过栏目链接+ajax=1获取JSON数据','6','0','2', '开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('104','invite_award_open','是否开启邀请奖励','开启邀请后则会奖励','6','0','7', '开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('105','invite_type','邀请奖励类型', NULL,'6','jifen','7', '积分=jifen,金币=money','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('106','invite_award','邀请奖励数量', NULL,'2','0','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('107','web_phone','网站手机', NULL,'2','0','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('108','web_weixin','站长微信', NULL,'1', NULL,'1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('110','isregister','前台用户注册','关闭前台注册后,前台无法进入注册页面','6','1','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('111','onlyinvite','仅邀请码注册','开启后,必须通过邀请链接才能注册!','6','0','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('112','release_table','允许前台发布模块','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割','2','article|product','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('113','search_words','前台搜索的字段','可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割','2','title','3', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('114','closehomevercode','前台验证码','关闭后,登录注册不需要验证码','6','0','2','关闭=1,开启=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('115','closeadminvercode','后台验证码','关闭后,后台管理员登录不需要验证码','6','0','2','关闭=1,开启=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('116','tag_table','TAG包含模型','在tag列表上查询的相关模型,多个模型标识可用|分割,如:article|product','2','article|product','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('118','isopendmf','支付宝当面付', NULL,'6','1','5','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('119','search_words_muti','前台多模块搜索的字段','多个模块直接必须都有相同的字段,否则会报错','3','title','3', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('120','search_table_muti','多模块允许搜索的表','防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如:article|product','2','article|product','3', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('121','search_fields_muti','允许查询显示的字段','多模块搜索允许查询显示的字段','3','id,tid,litpic,title,tags,keywords,molds,htmlurl,description,addtime,userid,member_id,hits,ownurl,target','3', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('122','ueditor_user_config','前台编辑器设置','前台的编辑器功能菜单设置','3','"undo", "redo", "|","paragraph","bold","forecolor","fontfamily","fontsize", "italic", "blockquote", "insertparagraph", "justifyleft", "justifycenter", "justifyright","justifyjustify","|","indent", "insertorderedlist", "insertunorderedlist","|", "insertimage", "inserttable", "deletetable", "insertparagraphbeforetable", "insertrow", "deleterow", "insertcol", "deletecol","mergecells", "mergeright", "mergedown", "splittocells", "splittorows", "splittocols", "|","drafts", "|","fullscreen"','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('123','article_config','内容配置', NULL,'3','{"seotitle":1,"litpic":1,"description":1,"tags":1,"filter":"title,keywords,body"}','0', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('124','product_config','商品配置', NULL,'3','{"seotitle":1,"litpic":1,"description":1,"tags":1,"filter":"title,keywords,body"}','0', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('125','isdebug','PHP调试','测试环境,开启调试,提示错误,实时更新模板。正式上线,请关闭调试,打开页面更快。','6','1','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('126','plugins_config','插件配置', NULL,'2','http://api.jizhicms.cn/plugins.php','0', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('127','template_config','插件配置', NULL,'2','http://api.jizhicms.cn/template.php','0', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('128','closesession','前台SESSION','关闭前台SESSION后,前台会员模块无法使用,但是可以减少session缓存文件。纯内容网站可以关闭,使用会员支付等必须开启','6','0','2','关闭=1,开启=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('129','messageyzm','留言验证码','开启后,前台留言需要填写验证码','6','1','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('130','homerelease','前台发布审核','开启后需要后台审核,关闭则不需要','6','1','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('131','hideclasspath','栏目隐藏.html','开启后栏目链接将没有.html后缀','6','0','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('132','classtypemaxlevel','栏目全局递归','默认开启,栏目超过20个,请关闭此选项,有一定程度提升访问速度!','6','0','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('133','hidetitleonliy','字段重复检测', '将【模块标识-检测字段】填写进去,用|进行分割,将会进行标题重复检测。如:article-title|product-title','2','article-title|product-title','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('134','onlyuserupload','会员上传限制','开启后,仅会员才可以上传!受会员上传大小限制!','6','1','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('135','cachefilenum','缓存文件数','0表示不限制,最大不超过500','2','100','0',null,0,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('136','watermark_word','水印文字','只有没有水印图片的时候才生效','2','这个是水印文字','8',null,96,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('137','watermark_font','水印字体','默认Alibaba-PuHuiTi-Bold.ttf,存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,95,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('138','watermark_size','水印大小','默认24','2','24','8',null,94,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('139','watermark_h','水印行高','默认34','2','34','8',null,93,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('140','watermark_rgb','水印颜色','默认白色:#FFFFFF','2','#FFFFFF','8',null,92,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('141','watermark_x','水印微调X','相对水印位置再进行X轴微调,默认0','2','0','8',null,91,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('142','watermark_y','水印微调Y','相对水印位置再进行Y轴微调,默认0','2','10','8',null,90,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('143','text_waterlitpic','缩略图标题水印','文章缩略图进行水印文章标题,开启后生效','6','0','8','开启=1,关闭=0',89,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('144','text_litpic','默认缩略图','当文章没有缩略图的时候生效','1',null,'8',null,88,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('145','text_molds','支持模型','填写模型标识,如:article,product','2','article,product','8',null,87,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('146','text_num','每行文字数','默认10个字','2','10','8',null,86,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('147','text_size','文字大小','默认24','2','24','8',null,85,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('148','text_h','文字行高','默认34','2','34','8',null,84,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('149','text_rgb','文字颜色','默认白色:#FFFFFF','2','#FFFFFF','8',null,83,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('150','text_font','文字字体','默认Alibaba-PuHuiTi-Bold.ttf,存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,82,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('151','text_wz','水印位置','九宫格1-9,默认5中间','2','5','8',null,81,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('152','text_x','微调X','相对于水印位置再进行X轴微调,默认0','2','0','8',null,80,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('153','text_y','微调Y','相对于水印位置再进行Y轴微调,默认0','2','0','8',null,79,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('154','islocal','是否开启图片本地化','图片本地化可以将内容的外网图片保存到服务器','6','1','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('155','openredis','是否开启Redis','开启Redis后可以使用token登录前台账户,但必须服务器安装了Redis,在config里面需要配置redis信息','6','0','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('156','sitemap_config','sitemap配置','用于sitemap生成','3','a:3:{s:9:"page_size";i:10000;s:7:"tagsurl";s:19:"/tags/index?id={id}";s:8:"filetype";s:3:"xml";}','0','','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('157','schedule_table','定时发布表','带有addtime发布时间字段的表才可以使用定时发布功能,用|分隔','3','article|product','2','','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('158','upload_file_name','上传文件重命名','上传文件后是否重命名,默认开启重命名,关闭后上传文件名不会变','6','1','2','开启=1,关闭=0','1','1');
-- ----------------------------
-- Records of jz_tags
-- ----------------------------
-- ----------------------------
-- Records of jz_task
-- ----------------------------
================================================
FILE: install/index.php
================================================
// +----------------------------------------------------------------------
// | Date:2018/05
// +----------------------------------------------------------------------
//安装程序
//error_reporting(0);
//检查是否已安装
if(file_exists('install.lock')){
exit('很抱歉,程序已安装,如需重新安装请删除install/install.lock');
}
//状态
$errmsg=0;
//相关方法
function check_disable(){
$string=ini_get("disable_functions");
if(strpos($string,'opendir')!==false){
$GLOBALS['errmsg']=1;
return '关闭中! ';
}else{
return '开启';
}
}
function check_chinese(){
if(preg_match('/[\x{4e00}-\x{9fa5}]/u', $_SERVER['DOCUMENT_ROOT'])>0){
$GLOBALS['errmsg']=1;
return '网站路径中不能含有中文! ';
}else{
return $_SERVER['DOCUMENT_ROOT'];
}
}
function check_version(){
if (PHP_VERSION < 5.6) {
$GLOBALS['errmsg']=1;
return ''.PHP_VERSION.'不满足 ';
}else if(PHP_VERSION > 7.5){
$GLOBALS['errmsg']=1;
return ''.PHP_VERSION.'不满足 ';
}else{
return PHP_VERSION;
}
}
//检查目录是否可写入
function new_is_writeable($file) {
if (is_dir($file)){
$dir = $file;
if ($fp = @fopen("$dir/test.txt", 'w')) {
@fclose($fp);
@unlink("$dir/test.txt");
$writeable = 1;
} else {
$writeable = 0;
$GLOBALS['errmsg']=1;
}
} else {
if ($fp = @fopen($file, 'a+')) {
@fclose($fp);
$writeable = 1;
} else {
$writeable = 0;
$GLOBALS['errmsg']=1;
}
}
return $writeable;
}
//获取后台文件名
function get_admin_url(){
$data = file_get_contents("../index.php");
if(stripos($data,'ADMIN_MODEL')!==false){
$r = preg_match("/define\('ADMIN_MODEL',[\'|\"](.*?)[\'|\"]\)/",$data,$matches);
if($r){
$admins = $matches[1];
}else{
$admins = 'admins';
}
}else{
$admins = 'admins';
}
return 'index.php/'.$admins;
}
//获取域名
function GetIP(){
static $ip = '';
$ip = $_SERVER['REMOTE_ADDR'];
if(isset($_SERVER['HTTP_CDN_SRC_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CDN_SRC_IP'])) {
$ip = $_SERVER['HTTP_CDN_SRC_IP'];
} elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
foreach ($matches[0] AS $xip) {
if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
$ip = $xip;
break;
}
}
}
return $ip;
}
//获取域名
function get_domain(){
if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
{
$protocol = "https://";
}
elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
{
$protocol = "https://";
}
elseif ( ! empty($_SERVER['HTTP_FROM_HTTPS']) && strtolower($_SERVER['HTTP_FROM_HTTPS']) !== 'off')
{
$protocol = "https://";
}
elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')
{
$protocol = "https://";
}else if(!empty($_SERVER['HTTP_X_CLIENT_SCHEME']) && $_SERVER['HTTP_X_CLIENT_SCHEME']=='https'){
$protocol = "https://";
}else{
$protocol = "http://";
}
if(isset($_SERVER['SERVER_PORT'])) {
$port = ':' . $_SERVER['SERVER_PORT'];
if((':80' == $port && 'http://' == $protocol) || (':443' == $port && 'https://' == $protocol)) {
$port = '';
}
}else{
$port = '';
}
if(isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
$host = $_SERVER['HTTP_X_FORWARDED_HOST'].$port;
}else if (isset($_SERVER['HTTP_HOST'])) {
$host = $_SERVER['HTTP_HOST'].$port;
}else if(isset($_SERVER['SERVER_NAME'])) {
$host = $_SERVER['SERVER_NAME'].$port;
}else if(isset($_SERVER['SERVER_ADDR'])) {
$host = $_SERVER['SERVER_ADDR'].$port;
}
return $protocol.$host;
}
/**
* 解析SQL文件为SQL语句数组
* @param string $path
* @return array|mixed|string
*/
function parseSQL($path = '')
{
$sql = file_get_contents($path);
//替换掉15个字符串
$sql = substr($sql,14);
$sql = explode("\r\n", $sql);
//先消除--注释
$sql = array_filter($sql, function ($data)
{
if (empty($data) || preg_match('/^--.*/', $data))
{
return false;
}
else
{
return true;
}
});
$sql = implode('', $sql);
//删除/**/注释
$sql = preg_replace('/\/\*.*\*\//', '', $sql);
return $sql;
}
//检查是否有模板v1.9.x版本新增
function checktemplate(){
$dir = '../static';
$fileArray=array();
if (false != ($handle = opendir ( $dir ))) {
while ( false !== ($file = readdir ( $handle )) ) {
//去掉"“.”、“..”以及带“.xxx”后缀的文件
if ($file != "." && $file != ".." && strpos($file,'.')===false && file_exists($dir.'/'.$file.'/info.php') && is_dir($dir.'/'.$file.'/backup')) {
$fileArray[]=$file;
}
}
//关闭句柄
closedir ( $handle );
}
$dblist = [];
foreach($fileArray as $v){
$dir = '../static/'.$v.'/backup';
if (false != ($handle = opendir ( $dir ))) {
$i=0;
while ( false !== ($file = readdir ( $handle )) ) {
//去掉"“.”、“..”以及带“.xxx”后缀的文件
if ($file != "." && $file != ".."&& (strpos($file,".php")!==false) && (strpos($file,'_v')===false)) {
$dblist[$i]=$file;
$i++;
}
}
//关闭句柄
closedir ( $handle );
}
}
return $dblist;
}
//检查安装进度
$act = isset($_GET['act'])?$_GET['act']:'';
switch($act){
case 'step1':
$tpl = include('tpl/step1.jizhi');
break;
case 'step2':
//检测是否有备份数据库
//读取备份数据库
$dir = '../backup';
$fileArray=array();
if (false != ($handle = opendir ( $dir ))) {
$i=0;
while ( false !== ($file = readdir ( $handle )) ) {
//去掉"“.”、“..”以及带“.xxx”后缀的文件
if ($file != "." && $file != ".."&& (strpos($file,".php")!==false) && (strpos($file,'_v')===false)) {
$fileArray[$i]=$file;
$i++;
}
}
//关闭句柄
closedir ( $handle );
}
$dblists = $fileArray;
$dblists2 = checktemplate();
if(count($dblists2)){
$dblists = array_merge($dblists,$dblists2);
}
$admin_url = get_admin_url();
$tpl = include('tpl/step2.jizhi');
break;
case 'step3':
try{
$pdo = new PDO("mysql:host=".$_POST['host'].";port=".$_POST['port'].";dbname=".$_POST['name'],$_POST['user'], $_POST['password']);
//更新db.config.php
$config['db']['host'] = $_POST['host'];
$config['db']['dbname'] = $_POST['name'];
$config['db']['username'] = $_POST['user'];
$config['db']['password'] = $_POST['password'];
$config['db']['prefix'] = $_POST['prefix'];
$config['db']['port'] = $_POST['port'];
$config['redis'] = array(
'SAVE_HANDLE' => 'Redis',
'HOST' => '127.0.0.1',
'PORT' => 6379,
'AUTH' => null,
'TIMEOUT' => 0,
'RESERVED' => null,
'RETRY_INTERVAL' => 100,
'RECONNECT' => false,
'EXPIRE'=>1800
);
$config['APP_DEBUG'] = true;
$ress = file_put_contents('../conf/config.php', '');
}catch(PDOException $e){
echo ' ';
}
$db = $_POST['go_backup']==1 ? $_POST['backup_db'] : '';
$admin_url = get_admin_url();
//传入管理员信息
$admin_name = $_POST['admin_name'];
$admin_pass = $_POST['admin_pass'];
$tpl = include('tpl/step3.jizhi');
break;
case 'step4':
$tpl = include('tpl/step4.jizhi');
break;
case 'step5':
$admin_url = get_domain().'/'.get_admin_url();
//生成安装锁定文件
$res = file_put_contents('install.lock','');
$tpl = include('tpl/step5.jizhi');
break;
case 'install_testdb':
$start= ((int)$_POST['start']==0)?1:$_POST['start'];
$to=((int)$_POST['to']==0)?1:$_POST['to'];
$config = include('../conf/config.php');
$db = new PDO("mysql:host=".$config['db']['host'].";port=".$config['db']['port'].";dbname=".$config['db']['dbname'],$config['db']['username'], $config['db']['password']);
$sql = file_get_contents('test.php');
$sql = str_replace('jz_',$config['db']['prefix'],$sql);
$count=100;
$sql = substr($sql,14);
$sql.="UPDATE `jz_level` SET `name`='".$_POST['admin_name']."',`pass`='".md5(md5($_POST['admin_pass']).'YF')."' , `regtime` = '".time()."' , `logintime` = ".time()." WHERE id=1";
$db->query("set names utf8mb4");
$db->exec($sql);
echo json_encode(array('count'=>$count,"start"=>0,"to"=>$count));
exit;
break;
case 'go_install':
$start= ((int)$_POST['start']==0)?1:$_POST['start'];
$to=((int)$_POST['to']==0)?1:$_POST['to'];
$config = include('../conf/config.php');
if($_GET['db']==''){
$sql = file_get_contents('db.php');
$sql.="UPDATE `jz_level` SET `name`='".$_POST['admin_name']."',`pass`='".md5(md5($_POST['admin_pass']).'YF')."' , `regtime` = '".time()."' , `logintime` = ".time()." WHERE id=1";
$sql = substr($sql,14);
$sql = str_replace('jz_',$config['db']['prefix'],$sql);
$count=100;
$db = new PDO("mysql:host=".$config['db']['host'].";port=".$config['db']['port'].";dbname=".$config['db']['dbname'],$config['db']['username'], $config['db']['password']);
$db->query("set names utf8mb4");
$r = $db->exec($sql);
echo json_encode(array('count'=>$count,"start"=>0,"to"=>$count,'code'=>0));
exit;
}else{
$db = new PDO("mysql:host=".$config['db']['host'].";port=".$config['db']['port'].";dbname=".$config['db']['dbname'],$config['db']['username'], $config['db']['password']);
$db->query("set names utf8mb4");
//$sql = file_get_contents('../backup/'.$_GET['db']);
$path = $_GET['db'];
$filename_arr = explode('.php',$path);
$filename = $filename_arr[0];
//读取备份数据库
$dir = '../backup';
$fileArray=array();
$fileArray[] = $dir.'/'.$filename.'.php';
for($i=1;file_exists($dir.'/'.$filename.'_v'.$i.'.php')===true;$i++){
$fileArray[]=$dir.'/'.$filename.'_v'.$i.'.php';
}
foreach($fileArray as $path){
$sql = parseSQL($path);
try{
$n = $db->exec($sql);
if(!$n){
$msg = $db->errorInfo();
if($msg[2]){
echo json_encode(array('code'=>1,'msg'=>'数据库错误:' . $msg[2] . end($sql)));exit;
}
}
}catch (PDOException $e){
echo json_encode(array('code'=>1,'msg'=>$e->getMessage()));
exit;
}
}
if($_POST['admin_pass']!='' && $_POST['admin_name']!=''){
$sql="UPDATE `jz_level` SET `name`='".$_POST['admin_name']."',`pass`='".md5(md5($_POST['admin_pass']).'YF')."' , `regtime` = '".time()."' , `logintime` = ".time()." WHERE id=1";
$sql = str_replace('jz_',$config['db']['prefix'],$sql);
$db->exec($sql);
}
echo json_encode(array('count'=>100,"start"=>0,"to"=>100,'code'=>0));
exit;
}
break;
case 'testdb':
try{
//$_opts_values = array(PDO::ATTR_PERSISTENT=>true,PDO::ATTR_ERRMODE=>2,PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8');
//$db = new PDO("mysql:host=".$_POST['host'].";port=".$_POST['port'].";dbname=".$_POST['name'],$_POST['user'], $_POST['password'],$_opts_values);
$db = new PDO("mysql:host=".$_POST['host'].";port=".$_POST['port'],$_POST['user'], $_POST['password']);
$newtable = "CREATE DATABASE IF NOT EXISTS `" . $_POST['name'] . "` DEFAULT CHARACTER SET utf8mb4;";
if($db->exec($newtable)){
$db->query("set names utf8mb4");
echo json_encode(['code'=>0,'msg'=>'success']);
exit;
}else{
echo json_encode(['code'=>1,'msg'=>'您没有创建数据库权限,请手动填写数据库!']);
exit;
}
}catch(PDOException $e){
echo json_encode(['code'=>1,'msg'=>'数据库连接失败,请检查数据库配置!']);
exit;
}
break;
default:
$tpl = include('tpl/index.jizhi');
break;
}
================================================
FILE: install/test.php
================================================
/*
MySQL Database Backup Tools
Server:127.0.0.1:3306
Database:www.19x.mm
Data:2022-01-26 13:48:01
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for jz_article
-- ----------------------------
DROP TABLE IF EXISTS `jz_article`;
CREATE TABLE `jz_article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '文章标题',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目',
`molds` varchar(50) DEFAULT 'article' COMMENT '模型标识',
`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',
`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',
`description` text COMMENT '简介',
`seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID:0前台发布',
`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',
`body` mediumtext COMMENT '文章内容',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',
`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击次数',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否审核:1审核0未审2退回',
`comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',
`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否',
`istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否',
`tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员:0后台发布',
`target` varchar(255) DEFAULT NULL COMMENT '外链',
`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',
`jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性:1置顶2热点3推荐',
`tids` varchar(255) DEFAULT NULL COMMENT '副栏目',
`zan` int(11) DEFAULT '0' COMMENT '点赞数',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='文章表';
-- ----------------------------
-- Table structure for jz_attr
-- ----------------------------
DROP TABLE IF EXISTS `jz_attr`;
CREATE TABLE `jz_attr` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'attr' COMMENT '模型标识',
`name` varchar(50) DEFAULT NULL COMMENT '属性名',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='推荐属性';
-- ----------------------------
-- Table structure for jz_buylog
-- ----------------------------
DROP TABLE IF EXISTS `jz_buylog`;
CREATE TABLE `jz_buylog` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`aid` int(11) DEFAULT '0' COMMENT '内容ID',
`userid` int(11) DEFAULT '0' COMMENT '会员ID',
`orderno` varchar(255) DEFAULT NULL COMMENT '订单号',
`type` tinyint(1) DEFAULT '1' COMMENT '交易类型:1购买商品0兑换金币',
`buytype` varchar(20) DEFAULT NULL COMMENT '支付类型',
`msg` varchar(255) DEFAULT NULL COMMENT '记录',
`molds` varchar(255) DEFAULT NULL COMMENT '模型标识',
`amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总计',
`money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金额',
`addtime` int(11) DEFAULT '0' COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='购买记录表';
-- ----------------------------
-- Table structure for jz_cachedata
-- ----------------------------
DROP TABLE IF EXISTS `jz_cachedata`;
CREATE TABLE `jz_cachedata` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`field` varchar(50) DEFAULT NULL COMMENT '字段',
`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`isall` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否输出所有:1是0否',
`sqls` varchar(500) DEFAULT NULL COMMENT 'SQL',
`orders` varchar(255) DEFAULT NULL COMMENT '排序',
`limits` int(11) NOT NULL DEFAULT '10' COMMENT '输出条数',
`times` int(11) NOT NULL DEFAULT '0' COMMENT '更新周期',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='数据缓存表';
-- ----------------------------
-- Table structure for jz_chain
-- ----------------------------
DROP TABLE IF EXISTS `jz_chain`;
CREATE TABLE `jz_chain` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL COMMENT '内链词',
`newtitle` varchar(100) DEFAULT NULL COMMENT '替换词',
`url` varchar(255) DEFAULT NULL COMMENT '链接',
`num` int(11) NOT NULL DEFAULT '-1' COMMENT '替换次数',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='内链';
-- ----------------------------
-- Table structure for jz_classtype
-- ----------------------------
DROP TABLE IF EXISTS `jz_classtype`;
CREATE TABLE `jz_classtype` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`classname` varchar(50) DEFAULT NULL COMMENT '栏目名',
`seo_classname` varchar(50) DEFAULT NULL COMMENT 'SEO栏目名',
`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',
`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',
`description` text COMMENT '描述',
`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',
`body` text COMMENT '内容',
`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',
`orderstype` int(4) NOT NULL DEFAULT '0' COMMENT '排序类型:1时间倒序2ID正序3点击量倒序4ID正序5时间正序6点击量正序',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
`iscover` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否覆盖下级',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '上级栏目ID',
`gid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目权限:0不限制',
`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',
`lists_html` varchar(50) DEFAULT NULL COMMENT '栏目页模板',
`details_html` varchar(50) DEFAULT NULL COMMENT '详情页模板',
`lists_num` int(4) DEFAULT '0' COMMENT '列表数量',
`comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',
`gourl` varchar(255) DEFAULT NULL COMMENT '栏目外链',
`ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许会员发布',
`isclose` tinyint(1) NOT NULL DEFAULT '0' COMMENT '关闭栏目',
`gids` varchar(255) DEFAULT NULL COMMENT '允许访问角色',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='栏目表';
-- ----------------------------
-- Table structure for jz_collect
-- ----------------------------
DROP TABLE IF EXISTS `jz_collect`;
CREATE TABLE `jz_collect` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`description` varchar(500) DEFAULT NULL COMMENT '简介',
`tid` int(11) DEFAULT NULL COMMENT '所属栏目',
`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',
`w` varchar(10) NOT NULL DEFAULT '0' COMMENT '宽',
`h` varchar(10) NOT NULL DEFAULT '0' COMMENT '高',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0隐藏',
`url` varchar(255) DEFAULT NULL COMMENT '链接',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图';
-- ----------------------------
-- Table structure for jz_collect_type
-- ----------------------------
DROP TABLE IF EXISTS `jz_collect_type`;
CREATE TABLE `jz_collect_type` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '分类名',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图分类';
-- ----------------------------
-- Table structure for jz_comment
-- ----------------------------
DROP TABLE IF EXISTS `jz_comment`;
CREATE TABLE `jz_comment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'comment' COMMENT '模型标识',
`tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目tid',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章id',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '回复帖子id',
`zid` int(11) NOT NULL DEFAULT '0' COMMENT '主回复帖子:同一层楼内回复,规定主回复id',
`body` text COMMENT '评论内容',
`reply` text COMMENT '回复内容',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员:0表示游客',
`likes` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0隐藏2被删除',
`isread` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已读:1已读0未读',
PRIMARY KEY (`id`),
KEY `tid` (`tid`),
KEY `aid` (`aid`),
KEY `pid` (`pid`),
KEY `zid` (`zid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='评论表';
-- ----------------------------
-- Table structure for jz_ctype
-- ----------------------------
DROP TABLE IF EXISTS `jz_ctype`;
CREATE TABLE `jz_ctype` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(50) DEFAULT NULL COMMENT '配置栏名称',
`action` varchar(255) DEFAULT NULL COMMENT '配置标识,用于权限控制',
`sys` tinyint(1) DEFAULT 0 COMMENT '系统配置,1是0否',
`isopen` tinyint(1) DEFAULT 1 COMMENT '是否启用,1启用0关闭',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统设置栏目名';
-- ----------------------------
-- Table structure for jz_customurl
-- ----------------------------
DROP TABLE IF EXISTS `jz_customurl`;
CREATE TABLE `jz_customurl` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',
`url` varchar(255) DEFAULT NULL COMMENT '自定义URL',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='自定义链接表';
-- ----------------------------
-- Table structure for jz_fields
-- ----------------------------
DROP TABLE IF EXISTS `jz_fields`;
CREATE TABLE `jz_fields` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`field` varchar(50) DEFAULT NULL COMMENT '字段标识',
`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',
`fieldname` varchar(100) DEFAULT NULL COMMENT '字段名称',
`tips` varchar(100) DEFAULT NULL COMMENT '填写提示',
`fieldtype` tinyint(2) NOT NULL DEFAULT '1' COMMENT '输入类型',
`tids` text COMMENT '绑定栏目',
`fieldlong` varchar(50) DEFAULT NULL COMMENT '字段长度',
`body` text COMMENT '字段配置',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '表单排序',
`ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否必填:1是0否',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台是否显示:1显示0隐藏',
`isadmin` tinyint(1) NOT NULL DEFAULT '1' COMMENT '后台是否显示:1显示0隐藏',
`issearch` tinyint(1) NOT NULL DEFAULT '0' COMMENT '搜索显示:1显示0隐藏',
`islist` tinyint(1) NOT NULL DEFAULT '0' COMMENT '列表显示:1显示0隐藏',
`format` varchar(50) DEFAULT NULL COMMENT '格式化',
`vdata` varchar(50) DEFAULT NULL COMMENT '默认值',
`isajax` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'AJAX显示:1显示0隐藏',
`listorders` int(4) NOT NULL DEFAULT '0' COMMENT '列表排序',
`isext` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否扩展信息',
`width` varchar(50) DEFAULT NULL COMMENT '列表中显示宽度',
`ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台表单录入',
`ldfield` varchar(255) DEFAULT NULL COMMENT '关联字段',
`linkfield` varchar(255) DEFAULT NULL COMMENT '连接字段',
`remote` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否远程数据',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Table structure for jz_hook
-- ----------------------------
DROP TABLE IF EXISTS `jz_hook`;
CREATE TABLE `jz_hook` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`module` varchar(50) DEFAULT NULL COMMENT '模块,Home/A',
`namespace` varchar(100) DEFAULT NULL COMMENT '控制器命名空间',
`controller` varchar(50) DEFAULT NULL COMMENT '控制器',
`action` varchar(255) DEFAULT NULL COMMENT '执行函数:可同时注册多个方法,逗号拼接',
`hook_namespace` varchar(100) DEFAULT NULL COMMENT '钩子控制器所在的命名空间',
`hook_controller` varchar(50) DEFAULT NULL COMMENT '钩子控制器',
`hook_action` varchar(50) DEFAULT NULL COMMENT '钩子执行方法',
`all_action` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否全局控制器',
`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序:越大越靠前执行',
`isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否关闭:1开启0关闭',
`plugins_name` varchar(50) DEFAULT NULL COMMENT '关联插件名',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件钩子';
-- ----------------------------
-- Table structure for jz_layout
-- ----------------------------
DROP TABLE IF EXISTS `jz_layout`;
CREATE TABLE `jz_layout` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(200) DEFAULT NULL COMMENT '桌面名称',
`top_layout` text COMMENT '顶部菜单',
`left_layout` text COMMENT '左侧菜单',
`gid` int(11) DEFAULT NULL COMMENT '所属角色',
`ext` varchar(255) DEFAULT NULL COMMENT '备注',
`sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统配置:1是0否',
`isdefault` tinyint(1) NOT NULL DEFAULT '0' COMMENT '默认配置:1是0否',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='桌面设置';
-- ----------------------------
-- Table structure for jz_level
-- ----------------------------
DROP TABLE IF EXISTS `jz_level`;
CREATE TABLE `jz_level` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'level' COMMENT '模型标识',
`name` varchar(20) DEFAULT NULL COMMENT '管理员名称',
`pass` varchar(100) DEFAULT NULL COMMENT '密码',
`tel` varchar(20) DEFAULT NULL COMMENT '电话号码',
`gid` int(4) NOT NULL DEFAULT '2' COMMENT '所属角色',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
`regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间',
`logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0冻结',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='管理员表';
-- ----------------------------
-- Table structure for jz_level_group
-- ----------------------------
DROP TABLE IF EXISTS `jz_level_group`;
CREATE TABLE `jz_level_group` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'level_group' COMMENT '模型标识',
`name` varchar(50) DEFAULT NULL COMMENT '角色名称',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
`isadmin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '超管:1是0否',
`ischeck` tinyint(1) NOT NULL DEFAULT '0' COMMENT '发布审核:1需要审核0不需要',
`classcontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否配置栏目权限:1是0否',
`paction` text COMMENT '权限列表',
`tids` text COMMENT '拥有栏目权限',
`isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0冻结',
`description` varchar(500) DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
-- ----------------------------
-- Table structure for jz_likes
-- ----------------------------
DROP TABLE IF EXISTS `jz_likes`;
CREATE TABLE `jz_likes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `tid` (`tid`,`aid`,`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='点赞表';
-- ----------------------------
-- Table structure for jz_link_type
-- ----------------------------
DROP TABLE IF EXISTS `jz_link_type`;
CREATE TABLE `jz_link_type` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '友链分类名',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接分类表';
-- ----------------------------
-- Table structure for jz_links
-- ----------------------------
DROP TABLE IF EXISTS `jz_links`;
CREATE TABLE `jz_links` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '友链名称',
`molds` varchar(50) DEFAULT 'links' COMMENT '模型标识',
`url` varchar(255) DEFAULT NULL COMMENT '链接',
`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID',
`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',
`target` varchar(255) DEFAULT NULL COMMENT '外链',
`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接表';
-- ----------------------------
-- Table structure for jz_member
-- ----------------------------
DROP TABLE IF EXISTS `jz_member`;
CREATE TABLE `jz_member` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'member' COMMENT '模型标识',
`username` varchar(50) DEFAULT NULL COMMENT '用户昵称',
`openid` varchar(255) DEFAULT NULL COMMENT '微信OPENID',
`pass` varchar(255) DEFAULT NULL COMMENT '密码',
`token` varchar(255) DEFAULT NULL COMMENT 'Token',
`sex` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性别:1男2女0未知',
`gid` int(11) NOT NULL DEFAULT '1' COMMENT '会员分组ID',
`litpic` varchar(255) DEFAULT NULL COMMENT '头像',
`tel` varchar(50) DEFAULT NULL COMMENT '手机号码',
`jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分数',
`likes` text COMMENT '喜欢点赞(已废弃)',
`collection` text COMMENT '收藏(已废弃)',
`money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金币',
`email` varchar(255) DEFAULT NULL COMMENT '邮箱',
`address` varchar(255) DEFAULT NULL COMMENT '地址',
`province` varchar(50) DEFAULT NULL COMMENT '省份',
`city` varchar(50) DEFAULT NULL COMMENT '城市',
`regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间',
`hassendtime` int(11) NOT NULL DEFAULT '0' COMMENT '发送验证码时间',
`logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0封禁',
`signature` varchar(255) DEFAULT NULL COMMENT '个性签名',
`birthday` varchar(25) DEFAULT NULL COMMENT '生日:2020-01-01',
`follow` text COMMENT '关注列表',
`fans` int(11) NOT NULL DEFAULT '0' COMMENT '粉丝数',
`ismsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收消息提醒',
`iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收评论消息提醒',
`iscollect` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收收藏消息提醒',
`islikes` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收点赞消息提醒',
`isat` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收@消息提醒',
`isrechange` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收交易消息提醒',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '推荐用户ID',
`uploadsize` int(11) NOT NULL DEFAULT '50' COMMENT '上传大小限制',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员表';
-- ----------------------------
-- Table structure for jz_member_group
-- ----------------------------
DROP TABLE IF EXISTS `jz_member_group`;
CREATE TABLE `jz_member_group` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '分组名',
`molds` varchar(50) DEFAULT 'member_group' COMMENT '模型标识',
`description` varchar(255) DEFAULT NULL COMMENT '分组简介',
`paction` text COMMENT '权限',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '分组上级',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',
`isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许登录',
`iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许评论',
`ischeckmsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否需要审核评论',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣价:现金折扣或者百分比折扣',
`discount_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '折扣类型:0无折扣1现金折扣,1百分比折扣',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员分组';
-- ----------------------------
-- Table structure for jz_menu
-- ----------------------------
DROP TABLE IF EXISTS `jz_menu`;
CREATE TABLE `jz_menu` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL COMMENT '导航名称',
`nav` text COMMENT '导航配置',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0不显示',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='导航表';
-- ----------------------------
-- Table structure for jz_message
-- ----------------------------
DROP TABLE IF EXISTS `jz_message`;
CREATE TABLE `jz_message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`molds` varchar(50) DEFAULT 'message' COMMENT '模型标识',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员',
`tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章ID',
`user` varchar(255) DEFAULT NULL COMMENT '用户名',
`ip` varchar(255) DEFAULT NULL COMMENT 'IP',
`body` text COMMENT '留言内容',
`reply` text COMMENT '回复内容',
`tel` varchar(50) DEFAULT NULL COMMENT '电话',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',
`email` varchar(255) DEFAULT NULL COMMENT '邮箱',
`isshow` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否审核:1审核0未审',
`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',
`tids` varchar(255) DEFAULT NULL COMMENT '副栏目',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='留言表';
-- ----------------------------
-- Table structure for jz_molds
-- ----------------------------
DROP TABLE IF EXISTS `jz_molds`;
CREATE TABLE `jz_molds` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '模型名称',
`biaoshi` varchar(50) DEFAULT NULL COMMENT '模型标识',
`sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统:1是0否',
`isopen` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启:1开启0关闭',
`iscontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启权限:1开启权限0不开启',
`ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '栏目必选:1是0否',
`isclasstype` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示栏目',
`isshowclass` tinyint(1) DEFAULT '1' COMMENT '栏目绑定:1显示0隐藏',
`list_html` varchar(50) DEFAULT 'list.html' COMMENT '默认列表模板',
`details_html` varchar(50) DEFAULT 'details.html' COMMENT '默认详情模板',
`orders` int(11) NOT NULL DEFAULT '100' COMMENT '排序',
`ispreview` tinyint(1) DEFAULT '1' COMMENT '是否可以预览',
`ishome` tinyint(1) DEFAULT '0' COMMENT '前台发布',
PRIMARY KEY (`id`),
KEY `biaoshi` (`biaoshi`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='模型表';
-- ----------------------------
-- Table structure for jz_orders
-- ----------------------------
DROP TABLE IF EXISTS `jz_orders`;
CREATE TABLE `jz_orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`orderno` varchar(255) DEFAULT NULL COMMENT '订单号',
`molds` varchar(50) DEFAULT 'orders' COMMENT '模型标识',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '下单会员',
`paytype` varchar(20) DEFAULT NULL COMMENT '支付方式',
`ptype` tinyint(1) DEFAULT '1' COMMENT '交易类型:1商品购买2充值金额3充值积分',
`tel` varchar(50) DEFAULT NULL COMMENT '电话',
`username` varchar(50) DEFAULT NULL COMMENT '用户名',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`price` varchar(200) DEFAULT NULL COMMENT '价格',
`jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分',
`qianbao` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '钱包',
`body` text COMMENT '购买内容',
`receive_username` varchar(50) DEFAULT NULL COMMENT '收件人',
`receive_tel` varchar(20) DEFAULT NULL COMMENT '收件电话',
`receive_email` varchar(50) DEFAULT NULL COMMENT '收件邮箱',
`receive_address` varchar(255) DEFAULT NULL COMMENT '收件地址',
`ispay` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否支付:1支付0未支付',
`paytime` int(11) NOT NULL DEFAULT '0' COMMENT '支付时间',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '下单时间',
`send_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '订单状态:1提交订单,2已支付,3超时,4已提交订单,5已发货,6已废弃失效,0删除订单',
`discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣',
`yunfei` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '运费',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
-- ----------------------------
-- Table structure for jz_page
-- ----------------------------
DROP TABLE IF EXISTS `jz_page`;
CREATE TABLE `jz_page` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`molds` varchar(50) DEFAULT 'page' COMMENT '模型标识',
`htmlurl` varchar(50) DEFAULT NULL COMMENT '链接',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',
`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏',
`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`tids` varchar(255) NOT NULL COMMENT '副栏目',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='单页模型';
-- ----------------------------
-- Table structure for jz_pictures
-- ----------------------------
DROP TABLE IF EXISTS `jz_pictures`;
CREATE TABLE `jz_pictures` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',
`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',
`path` varchar(20) DEFAULT 'Admin' COMMENT '板块:Admin后台Home前台',
`filetype` varchar(20) DEFAULT NULL COMMENT '类型',
`size` varchar(50) DEFAULT NULL COMMENT '大小',
`litpic` varchar(255) DEFAULT NULL COMMENT '链接',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID/发布会员ID',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='图片集';
-- ----------------------------
-- Table structure for jz_pingjia
-- ----------------------------
DROP TABLE IF EXISTS `jz_pingjia`;
CREATE TABLE `jz_pingjia` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`tid` int(11) DEFAULT '0' COMMENT '所属栏目',
`tids` varchar(255) DEFAULT NULL COMMENT '副栏目',
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',
`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',
`description` varchar(500) DEFAULT NULL COMMENT '简介',
`body` text COMMENT '内容',
`molds` varchar(50) DEFAULT 'pingjia' COMMENT '模型标识',
`userid` int(11) DEFAULT '0' COMMENT '发布管理员',
`orders` int(11) DEFAULT '0' COMMENT '排序',
`member_id` int(11) DEFAULT '0' COMMENT '前台用户',
`comment_num` int(11) DEFAULT '0' COMMENT '评论数',
`htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接',
`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示',
`target` varchar(255) DEFAULT NULL COMMENT '外链',
`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义URL',
`jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性',
`hits` int(11) DEFAULT '0' COMMENT '点击量',
`zan` int(11) DEFAULT '0' COMMENT '点赞数',
`tags` varchar(255) DEFAULT NULL COMMENT 'TAG',
`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否',
`istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否',
`addtime` int(11) DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`zhiye` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Table structure for jz_plugins
-- ----------------------------
DROP TABLE IF EXISTS `jz_plugins`;
CREATE TABLE `jz_plugins` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '插件名称',
`filepath` varchar(50) DEFAULT NULL COMMENT '插件文件名',
`description` varchar(255) DEFAULT NULL COMMENT '简介',
`version` decimal(3,1) NOT NULL DEFAULT '0.0' COMMENT '版本',
`author` varchar(50) DEFAULT NULL COMMENT '作者',
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`module` varchar(20) NOT NULL DEFAULT 'Home' COMMENT '模块',
`isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启:1开启0关闭',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`config` text COMMENT '配置',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件表';
-- ----------------------------
-- Table structure for jz_power
-- ----------------------------
DROP TABLE IF EXISTS `jz_power`;
CREATE TABLE `jz_power` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`action` varchar(50) DEFAULT NULL COMMENT '函数名',
`name` varchar(50) DEFAULT NULL COMMENT '权限名',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限ID',
`isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开放',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户权限表';
-- ----------------------------
-- Table structure for jz_product
-- ----------------------------
DROP TABLE IF EXISTS `jz_product`;
CREATE TABLE `jz_product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`molds` varchar(50) DEFAULT 'product' COMMENT '模型标识',
`title` varchar(255) DEFAULT NULL COMMENT '商品名称',
`seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题',
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目',
`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',
`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',
`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',
`description` varchar(255) DEFAULT NULL COMMENT '简介',
`litpic` varchar(255) DEFAULT NULL COMMENT '首图',
`stock_num` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
`price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格',
`pictures` text COMMENT '图集',
`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0不显示',
`comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',
`body` mediumtext COMMENT '详情',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '录入管理员ID',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`istop` varchar(2) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`ishot` varchar(2) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否',
`istuijian` varchar(2) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否',
`tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',
`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员',
`target` varchar(255) DEFAULT NULL COMMENT '外链',
`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',
`jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性:1置顶2热点3推荐',
`tids` varchar(255) DEFAULT NULL,
`zan` int(11) DEFAULT '0',
`lx` varchar(2) DEFAULT NULL,
`color` varchar(2) DEFAULT NULL,
`hy` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
-- ----------------------------
-- Table structure for jz_recycle
-- ----------------------------
DROP TABLE IF EXISTS `jz_recycle`;
CREATE TABLE `jz_recycle` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '标记',
`molds` varchar(50) DEFAULT NULL COMMENT '回收模型标志',
`data` mediumtext COMMENT '回收数据',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '关联删除',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='回收站';
-- ----------------------------
-- Table structure for jz_ruler
-- ----------------------------
DROP TABLE IF EXISTS `jz_ruler`;
CREATE TABLE `jz_ruler` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL COMMENT '权限名称',
`fc` varchar(50) DEFAULT NULL COMMENT '函数',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限',
`isdesktop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否桌面配置显示(已废弃)',
`sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '系统:1是0否',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色权限表';
-- ----------------------------
-- Table structure for jz_shouchang
-- ----------------------------
DROP TABLE IF EXISTS `jz_shouchang`;
CREATE TABLE `jz_shouchang` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',
`userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户收藏表';
-- ----------------------------
-- Table structure for jz_sysconfig
-- ----------------------------
DROP TABLE IF EXISTS `jz_sysconfig`;
CREATE TABLE `jz_sysconfig` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`field` varchar(50) DEFAULT NULL COMMENT '配置字段',
`title` varchar(255) DEFAULT NULL COMMENT '配置名称',
`tip` varchar(255) DEFAULT NULL COMMENT '字段填写提示',
`type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '参数类型:1图片2单行文本3多行文本4编辑器5文件上传6下拉开启关闭选项7下拉是否选项8栏目选项9代码',
`data` text COMMENT '配置内容',
`typeid` tinyint(1) NOT NULL DEFAULT '0' COMMENT '配置栏ID',
`config` text COMMENT '单选多选配置信息',
`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`sys` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否系统字段',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统配置';
-- ----------------------------
-- Table structure for jz_tags
-- ----------------------------
DROP TABLE IF EXISTS `jz_tags`;
CREATE TABLE `jz_tags` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`tid` int(11) DEFAULT '0' COMMENT '栏目ID',
`tids` varchar(500) DEFAULT NULL COMMENT '相关栏目',
`orders` int(11) DEFAULT '0' COMMENT '排序',
`comment_num` int(11) DEFAULT '0' COMMENT '评论数',
`molds` varchar(50) DEFAULT 'tags' COMMENT '模型标识',
`htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接',
`keywords` varchar(50) DEFAULT NULL COMMENT '关键词',
`newname` varchar(50) DEFAULT NULL COMMENT '替换词(已废弃)',
`num` int(4) DEFAULT '-1' COMMENT '替换次数:-1不限制',
`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示隐藏',
`target` varchar(50) DEFAULT '_blank' COMMENT '外链',
`number` int(11) DEFAULT '0' COMMENT '数量',
`member_id` int(11) DEFAULT '0' COMMENT '发布会员',
`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',
`tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',
`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否',
`ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否',
`istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否',
`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',
`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='TAGS表';
-- ----------------------------
-- Table structure for jz_task
-- ----------------------------
DROP TABLE IF EXISTS `jz_task`;
CREATE TABLE `jz_task` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`tid` int(11) DEFAULT '0' COMMENT '栏目ID',
`aid` int(11) DEFAULT '0' COMMENT '文章ID',
`userid` int(11) DEFAULT '0' COMMENT '发布会员',
`puserid` int(11) DEFAULT '0' COMMENT '对象会员',
`molds` varchar(50) DEFAULT NULL COMMENT '模块标识',
`type` varchar(50) DEFAULT NULL COMMENT '消息类型',
`body` varchar(255) DEFAULT NULL COMMENT '内容',
`url` varchar(255) DEFAULT NULL COMMENT '链接',
`isread` tinyint(1) DEFAULT '0' COMMENT '是否已读:1已读0未读',
`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏',
`readtime` int(11) DEFAULT '0' COMMENT '阅读时间',
`addtime` int(11) DEFAULT '0' COMMENT '发布时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员消息表';
-- ----------------------------
-- Records of jz_article
-- ----------------------------
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('1','如何有效的提高网站权重?','8', NULL,'znxw', NULL,'想要在搜索引擎的排名更靠前、提高整站的流量、提高用户对网站的信任度,所以提高网站的权重是相当重要。如何才能够快速的提高自己网站的权重,或者说哪些东西是决定网站权重的重要因素。','如何有效的提高网站权重?','1','/static/upload/2022/01/20/202201202461.jpg','如何有效的提高网站的权重?想要在搜索引擎的排名更靠前、提高整站的流量、提高用户对网站的信任度,所以提高网站的权重是相当重要。如何才能够快速的提高自己网站的权重,或者说哪些东西是决定网站权重的重要因素,网站合理的内链结构布局。
目前来讲,外链的地位已不再像之前那样是SEO优化的核心,外链为皇的时代早就过去了,如今更为重要的就是网站内容,而内链就好比一张蜘蛛网一样,起着连接和传递网站系统化内容的作用。所以,内链设置必须注重合理、呼应,避免重复、堆积,这样更利于搜索引擎的抓取和收录。
从目前掌握的情况而言,很多人都喜欢给首页做一个超链接,做回链是需要掌握一个度的,一般情况下,一个独立页面做上1-2个内链就可以了,导航以及面包屑导航就是最好的内链,因此,在做内链的时候千万别滥用,否则会被百度惩罚,认为你的网站是为了做排名而做排名,不具备用户搜索的参考价值。优化建议:做好具有引导性的内链,大量的回链犹如“七伤拳”,用得好利于排名,用不好则属于自残,在这里,建议广大的SEO千万不要在底部或者文章中做太多的内链,要做符合用户搜索的内容。
好的域名及稳定的服务器和打开速度。
对于优化而言,好的域名主要是指域名中包含关键词或者企业名称,最好简短易记。其次,就是老域名和新域名的区分,当然老域名更利于优化。域名只是影响优化的一小部分,而网站服务器的稳定性和打开速度却是极为重要的一部分。数据调查显示,通常一个打开速度较慢的站点会减少60%的流量,而且网站一旦出现服务器异常,打不开,可能就会造成对搜索引擎的不友好现象,收录成为困难。
有规律的产生日常更新维护。
如今的搜索引擎更注重高质量的原创内容,而高质量的标准取决于可读性、稀缺性、价值性三个方面。所以,大家在更新网站内容的时候要把握好这几点,高质量的原创内容一直是网站用户和搜索引擎喜欢的,当然这里说的原创也并非原创,很多朋友都能理解这块,比如某个网站发布一篇类似文章,但由于对方排版不清晰该插入图片或视频的地方未进行操作密密麻麻的文章给人的一种感觉都不是很友好,此时我们又需要这篇文章怎么办,解决对方未完成的细节问题再发布,搜索引擎依然会认为你的文章比你抄袭的文章更有价值意思。
美观、有逻辑性的排版布局。
因为现在的网民审美及网站功能各方面的要求提高,美观似乎已成为每个网站的基本要求,因为只有满足了用户的浏览及感官体验,才能达到所谓的用户体验和粘度。但是美观并不代表就一定有酷炫的功能和风格,因为JS、FLASH等特效方式的渲染力虽大于图片,但是搜索引擎是抓不到,对搜索引擎来说是不友好的。所以,在保证美观、逻辑性的排版布局的同时,JS等特殊效果尽量少用。但目前从泽民了解的情况而言JS百度也是可以抓取的。
有些朋友每天更新文章,但排版乱七八糟,字体忽大忽小,要么就是文字过多,一张图片也没有,密密麻麻的文字,或者是文字小得可怜,正常情况下,14px-16px的字体是最适合用户阅读的,建议大家在为网站更新文章的时候,最好用图文并茂的模式,排版干净整洁,赢得客户的第一印象,搜索引擎也会根据页面的整洁度给予好的评分。
合理利用优化标签。
你是否合理的运用了这些标签?很多人不会用,也有很多人会用但使用过度了,标签是优化常用的一个标签,在单页面优化中,它的存在也是对页面优化起到了很大的促进作用,在最能突出页面内容的地方加上 会让搜索引擎优先抓取,然后在一层一层往下面抓取,会让搜索引擎更好的了解该页面的核心内容,但一个页面只能有一对 ,至于 可以使用多次,但要使用合理。
三大标签TDK的正确写。
我想这个时候肯定有人会问我为什么把标题写法最主要的一点写在最后,正因为重要我才写到最好,判断一个合格的SEO人员首先是看你写的标题是否完美,常见的标题写法就是把公司做的产品词全部写在标题上,这是百分之80SEO人员的通病,百度在之前对标题的写法做出的回应具体如下:
网站首页title的写法:网站标题 ?或者 ?网站标题_服务词或者产品词;
网站频道页title的写法:频道名称_网站名称;
网站文章页title的写法:文章标题_频道名称_网站名称;
这种写法符合重要的内容放在title前面,权重从左到右依次递减的规则。
这里在补充一点,在写标题的时候一定要考虑到百度的分词算法,很多人都不知道,分词的规则:a,在百度搜索一个三个以三个以下汉字的关键词,百度不会对关键词进行分割,百度显示的是所有匹配完整关键词的搜索结果;b,在百度搜索四个汉字以上的关键词,百度会对关键词进行分割,百度会显示完整关键词和组合关键词的搜索结果;分词后组合的方式有非常多种,对我们SEO来说,最有价值的还是分词的正向最大匹配法以及逆向匹配法。说白一点,就是title在分词后,可以正向和反向的组合不同的关键词。
优质的内外链接:我们的内链如果做得好话,让我们更加容易的找到自己想要的资料,让网民更好的阅读我们的文章,这样网民停留在我们网页的时间也变久了,对于权重的提升很有帮助优质是外链要从友情链接做起,不求多但求精,质量重于数量,多寻找一些高质量的友情链接,不仅能提升网站权重,还能辅助相关的关键字提升。
','1642639144','0','10','1','0','0','0','0','SEO','0', NULL, NULL, NULL, NULL,'0');
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('2','SEO优化细节问题','8', NULL,'znxw', NULL,'我们可以发现,现在很多企业站都在做SEO优化,让自己的网站能让更多的人搜索到,但是当我们在优化的过程中,有时会由于一些操作而带来一些影响,有些细节问题大家一定要注意,我们一起来了解一下。','SEO优化细节问题','1','/static/upload/2022/01/20/202201206807.jpg','1.H1、H2、H3标签的使用,这个对于一个seo人员来说也是需要了解的基本功能。它可以加重对关键词的描述,通俗一点说就是能够更好的集中网站的权重。
2.META标签是HTML标记头部区的一个关键标签,提供文档字符集、使用语言、作者等基本信息,以及对关键词和网页等级的设定等,最大的作用是能够做搜索引擎优化(SEO)。
3.title标签能够让搜索引擎在栏目上显示你提交的文字,也就是咱们经常说到的标题前缀。
4.处理图片Alt、title标签以及为页面添加元标记meta 网站经常都会更新图片,因此为图片增加alt是非常重要的,这样能够更好的让搜索引擎识别你网站上的图片。
5.大家都知道人的搜索习惯是通过关键词、标题、描述来进行搜索,因此定位好你每个页面的标题、关键词、描述也是必不可少的一环。同时还需要注意的是个别关键词的密度问题。
6.网站地图专业名字也叫做sitemap 这个可以通过一些专业的工具去生成,然后提交给搜索引擎,使得搜索引擎对你的网站更加友好。
7.404页面设置、301重定向这两个主要在于提高网站体验度这方面,当你的网站出现死链,或者访问不了的情况那么就需要用到404跳转页面了。
8.Robot.txt如果你没有接触过seo行业看起来一定很陌生,Robot.txt所起的作用是至关重要的,他能让搜索引擎更好的识别你的网站哪些内容是该抓取收录的,哪些内容是不能抓取收录的。
网站首页被K的原因
在外链方面应当循序渐进.并且有规律的增长,如果突然之间失去了一些外链的话,就会造成网站降权或者被K,所以说要其有广泛性,不要在一个网站上拴住。当然做的外链在权重高的网站那是肯定的好了,但要注重质量,自己把握的住就好。
使用了一些作弊手段,这也会导致你的站点被降权或K站。如果你没有做这些,也许是竟争对手用这些手段在陷害你的站,这得注意下,经常查查外链情况,如果有垃圾外链过来的话,就用百度外链工具屏蔽掉吧。
服务器影响:如果使用的空间同IP中有大量博彩类网站,或者有网站被降权或被K,都有可能影响到同iP下你的网站,这个影响的程度我也说不好,这点可注意一下。服务器的不稳定因素也是排名提不上去或被降权的原因之一,服务器的不稳定,造成搜索无法正常访问,故而做出惩罚。
关键词密度问题:并且要注意不要堆砌关键词,关键词的密度应当<8%,这个可以使用工具查询的到,其实这个关键词的密度,大家就仁者见仁智者见智了。
网站内容问题:多写意些高质量的相关原创文章,增加搜索引擎的友好度,伪原创和转载的那肯定是不行的,尤其是新网站就更不能进行文章采集。同时要注重网站内部链优化,还要就是不要在网站不稳定期间更换模板,不然蜘蛛又需要重新抓取,影响不好。如果是新站的话,文章当中还不要放太多的链接,尤其是链接到首页的。
','1642640121','0','1','1','0','0','0','0','SEO','0', NULL, NULL, NULL, NULL,'0');
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('3','如何正确选择关键词技巧?','8', NULL,'znxw', NULL,'一个要做SEO优化的网站,如果在之前不能够选择好适当的关键词的话,那么对网站的优化会造成很大的影响,因此就会一步走错,满盘皆输的窘境。结合网站本身从用户的角度出发选择优化词网站调整完毕以后主要的流量以及权...','如何正确选择关键词技巧?','1','/static/upload/2022/01/20/202201209692.jpg','一个要做SEO优化的网站,如果在之前不能够选择好适当的关键词的话,那么对网站的优化会造成很大的影响,因此就会一步走错,满盘皆输的窘境。结合网站本身从用户的角度出发选择优化词网站调整完毕以后主要的流量以及权重的来源便是用户,那么我们应该怎么去让用户精准的查询到网站呢?这就要我们去站到用户的角度去考虑网站产品本身需要拓展的关键词了,精准的抓住用户的需求是企业网站有价值体现的最要表现。
合理的选择优化关键词
合理选择优化关键词,主要针对于中小型企业网站来说,我们不能一味的去选择指数高、搜索量大的词,前期尽量去选择一些优化关键词的长尾关键词,通过不断的提升网站的基础从而提升选择关键词的优化难度。确定关键词方向,从百度下拉框中选择精准关键词我们在确定好客户网站关键词方针以后,将关键词输入到百度搜索框中,自动弹出下拉框,下拉框中的词就是我们日常用户搜索量比较大的词。
根据客户网站内容进行关键词扩展
我们在为客户的网站选择关键词的时候,要根据客户网站主要做的产品、服务内容来选定大的方针,在利用一些关键词扩展工具选择一些比较多的关键词,在从中筛选出有价值的关键词。企业在进行网站关键词优化的时候,应该注重一些网络优化的细节问题,不同的网站,其优化方式有很大的不同,对于一些优化细节的问题是不容忽视的。同时要做好网站优化数据的统计与分析,这将才能够更好的做好网站优化效果。
企业在进行网络推广的时候,大部分企业网站的排名都不尽人意,同时网站优化的效果差,周期长,这是现今大多数企业的通病,长期如此的话,企业也就逐渐丧失了继续优化下去的信心。
做网站推广的过程中,需要注重很多相关的细节,就好比网站锚文本建设,合理的运用网站锚文本,对搜索引擎进行引导,这样也就能够促进蜘蛛的更快更精准的抓取网站内容,从而提高长尾关键词的排名、增加网站的权重。但是做网站锚文本也不是随意增加的,网站页面的相关内容能够通过锚文本,精准地指向相关网站页面的内容,可以说是锚文本对网站页面所做的内容评价。
锚文本在内外链的用处
内部链接内部链接的作用是提高网站的网页和网页之间增加粘度,提高用户的体验度。文章包含其他文章的关键词,那都可以做锚文本链接。一定要注意锚文本链接的多样化,不要都是指向首页的锚文本链接,这样对你的网站也是没有好处的。(内部链接的规则)
外部链接外链现如今越来越不好做,个人签名和网页的网址链接现在都被百度算作了垃圾外链。锚文本链接是权重最高的链接,但是一定不要优化过度了,否则会过犹不及。
锚文本怎么做?
锚文本运用的地方很广,我们要把它做到:网站导航、栏目、分类目录、次导航、外部链接、友情链接、文章内的锚文本。文章内锚文本频率:站内锚文本我们提倡是控制在1%频率就好;锚文本链接放置位置:我们一般在一篇文章第一次出现这个关键词时就做成锚文本;锚文本链接数量:一篇文章如果出现多次相同的关键词,我们只做一个就好。做网站锚文本建设其实难度并不大,关键是要掌握锚文本建设的方法,合理的运用,这样才能够个网站优化效果带来很大的助益。如果为了加快网站排名的提升,随意增加锚文本数量,同时链接的相关性也比较差,自然搜索引擎就会以为存在作弊行为,就会给予相应的惩罚。
','1642640201','0','5','1','0','0','0','0','SEO','0', NULL, NULL, NULL,',9,','0');
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('4','友链交换方法及友链交换平台有哪些?','9', NULL,'xyxw', NULL,'一些SEO经常咨询怎么换友链,我相信许多新手也会有这些问题。今天我分享友情链接交换的方法是什么,友情链接交换的平台是什么?','友链交换方法及友链交换平台有哪些?','1','/static/upload/2022/01/20/202201201293.jpg','一些SEO经常咨询怎么换友链,我相信许多新手也会有这些问题。今天我分享友情链接交换的方法是什么,友情链接交换的平台是什么?
友情链接交换的方法是什么?
方法1。对于QQ群来说,更换朋友是很常见的,但与彼此的站长交流非常有效和快捷。
您可以去QQ群找到自己,并与合适的网站交流。或者把你想交流的网站和一些基本信息链接起来。
方法2。好友链平台本身可以在互联网上找到好友链平台,查看其他站长发布的信息,如果觉得合适的话可以更换。
方法3。在自己的网站上添加一个网站,看看彼此的网站上添加了哪些朋友链接。可以直接去网站找站长交流,有些网站有在线客服,遇到好的客服你很幸运,点低吗?让我们换一个。如果你有客户服务,就可以了。你们中的一些人会留下网站管理员的联系信息,并有申请朋友链接的功能。推荐阅读(深圳搜索引擎优化培训)
方法4。注册更多的网站和论坛,为发布好友链找到一个特殊的目录区域,并把自己
编辑后的网站好友链接信息应该随时发布。建议一些网站不能留下链接,所以不要留下它们,避免删除它们,并留下您的网站名称。关键词相关性,我们应该对这个频道感到满意,哈哈。留下你的微信
一些QQ论坛仍然可以使用。百度贴吧是一部精彩的作品。让我们说点别的。
方法5。购买好友链具有选择自由、重量大、流量大的优点。缺点:花钱多、长期提款多、流动性和风险不稳定。
什么是友好的友情链接交换平台?
滴滴友情链接网
专为站长和SEOer交流和交易友好链接而开发的友好链接平台欢迎站长使用犀牛云链接。它拥有丰富的资源和交易,帮助您节省链交换时间和提高工作效率。
云链接链接交换平台
','1642640580','0','3','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('5','什么是网站子域名对优化排名优缺点有哪些','8', NULL,'znxw', NULL,'对于刚刚接触到网站建设优化的网站管理员搜索引擎优化人员来说,他们可能不熟悉子域子目录,有些人可能没有听说过。今天将告诉你什么是子域子目录,优化排名的优缺点是什么?希望能够帮助那些新手站长搜索引擎优化人...','dasdsadsa','1','/static/upload/2022/01/19/202201192968.jpg','对于刚刚接触到网站建设优化的网站管理员搜索引擎优化人员来说,他们可能不熟悉子域子目录,有些人可能没有听说过。今天将告诉你什么是子域子目录,优化排名的优缺点是什么?
希望能够帮助那些新手站长搜索引擎优化人员!
什么是子域?
子域名称(或子域;中文:子域)是域名系统级别中属于更高级别域的域。例如,mail.example.com和calendar.example.com是example.com的两个子域,而example.com是顶级域的子域。请访问。
子域名:它是顶级域名的下一级(一级域名或父域名)。域名作为一个整体包括两个。或者包括一个”和一个“/”。
什么是子目录?
子目录:父目录中的目录。子目录也可以有子目录,子目录是无限的。推荐阅读(为什么不去网站关键词排名)
我们说简单地理解它是在我们网站的根目录下建立的任何文件夹(我们公司用户网站的根目录是wwwroot,如果一个文件夹是在wwwroot下建立为abc,那么abc就是一个子目录,也就是说,这个子目录的名称是abc)。子目录技术可以将任何附加域放在这些任意建立的子目录下。
子域有什么优点?
1.使用过网站的人非常清楚,如果域名包含关键词,优化他们的网站是非常有帮助的。当列表出现时,如果你想提高你的瓶颈,你需要搜索引擎所需的权重。当然,这对小站长来说更难。如果我们使用子域,您的列表将翻倍。
2.他的体重比目录重很多倍。经过仔细优化后,您的权重比子目录更容易获得排名。可以分成很多很多分类页面,也可以单独转移到服务器上,目录无法实现。
3.如果大量的二级域名组成一个子域站组,这将大大有助于提升主域名的权重。
4.该网站规模很大,获得了更多的选票。你也可以挂更多的友情链接。强大的品牌建设。推荐关注点(搜索引擎优化开始)
子域有什么缺点?
1.他最大的重量是他不能继承头版的重量,就像一个新网站一样。如果你的主域优化得很好,你可以考虑打开另一个网站。
2.工作量将会增加,这与主站的内容不协调。内容差异很大,不相关。
3.不要滥用子域。搜索引擎很容易将他们视为作弊。最好不要启用没有很多内容的子域。
子目录有什么优点?
子目录的优点是它们可以继承主域的权重。子目录。内容的质量会影响你网站的整体得分。为了更快的操作,只需要一个后台。
子目录的缺点是什么?
缺点是收集压力大,搜索次数少。子目录不利于良好的友谊链接。
然而,如何使用它取决于您的应用程序对象。如果你想创建一个子域,首先要注意你的网站是否适合这样做。如果你是一个大网站,比如58、Ganji、腾讯、网易、新浪,你自然会选择子域,因为你的规模已经达到了一定的水平,这些网站的信息和资源是巨大而广泛的。使用单个子域名制作一个领域和行业的内容没有问题,也不需要坚持使用单个关键词,而是要考虑用户的习惯。
如果您是一个中小型网站,此时不建议使用子域。我建议使用子目录更合适,因为子域相当于全新的网站,短期内不会给你带来高搜索引擎优化性能。此外,您自己的中小型网站的内容数据相对较少,不足以支持子域的数量。此外,子域增加了维护成本和工作量。如果你没有足够的诗句来管理,你的体重会导致水平的现象。
','1642641743','0','5','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('9','极致CMS不使用伪静态可以吗?','5', NULL,'faq', NULL,'不可以!极致CMS必须使用伪静态。因为在自定义链接上面做了一定的处理,所以必须使用伪静态。','极致CMS不使用伪静态可以吗?','1', NULL,'不可以!极致CMS必须使用伪静态。因为在自定义链接上面做了一定的处理,所以必须使用伪静态。
','1642943414','0','0','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('10','极致CMS框架是ThinkPHP吗?','5', NULL,'faq', NULL,'不是!是自主研发的FrPHP框架,仓库地址:https://gitee.com/Cherry_toto/FrPHP 也是免费使用的一个简单框架,只不过伪静态配置跟thinkphp一样。','极致CMS框架是ThinkPHP吗?','1', NULL,'不是!是自主研发的FrPHP框架,仓库地址:https://gitee.com/Cherry_toto/FrPHP
也是免费使用的一个简单框架,只不过伪静态配置跟thinkphp一样。
','1642943502','0','58','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('11','平台靠什么盈利?是否会一直维护下去?','5', NULL,'faq', NULL,'目前平台是不盈利运营的,当然,说不盈利只不过是指不从极致CMS系统授权方面,而官方有应用市场(https://app.jizhicms.cn),还有极致云(https://idc.jizhicms.com/)平台,虽然两个平台没什么收入,但也算盈利的一...','平台靠什么盈利?是否会一直维护下去?','1', NULL,'目前平台是不盈利运营的,当然,说不盈利只不过是指不从极致CMS系统授权方面,而官方有应用市场(https://app.jizhicms.cn ),还有极致云(https://idc.jizhicms.com/)平台,虽然两个平台没什么收入,但也算盈利的一部分。我只不过不希望从授权上盈利,我觉得开源免费就应该完全免费,让大家都能安心的用系统。
只要不是特殊原因,我们都会一直维护下去。后续我们也会开发更多的产品,给大家使用。
','1642943612','0','11','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('7','新手零基础学SEO难吗?','9', NULL,'xyxw', NULL,'许多初学者学习搜索引擎优化大多是新手,新手学习搜索引擎优化更担心的问题是零基本搜索引擎优化难,零基本搜索引擎优化要学多久?今天,我想和你谈谈这个饥饿的问题。我希望我能帮助你!','新手零基础学SEO难吗?','1','/static/upload/2022/01/19/202201198505.jpg','许多初学者学习搜索引擎优化大多是新手,新手学习搜索引擎优化更担心的问题是零基本搜索引擎优化难,零基本搜索引擎优化要学多久?今天,我想和你谈谈这个饥饿的问题。我希望我能帮助你!
零基础研究的搜索引擎优化困难吗?
零基础的定义:零基础意味着搜索引擎优化一无所知。你经常浏览网页吗?你知道搜索引擎的投标位置和共同位置吗?你了解搜索引擎优化的基本定义和功能吗?或者你知道程序,但不知道搜索引擎优化?回答完这些问题后,我们可以定位自己,并确定我们是否真的从零开始。
搜索引擎优化对零基础研究来说困难吗?事实上,这是一个错误的命题。大多数人认为搜索引擎优化很难学,因为学习搜索引擎优化的过程并不难,但大多数人仍然可以做得很好。认为搜索引擎优化不难学,已经在学搜索引擎优化,并且对搜索引擎优化有着深刻的理解,能够正确操作。
零基础搜索引擎优化研究需要多长时间?
准备加入搜索引擎优化专业的人,会考虑搜索引擎优化学习多长时间的实际问题,实际上学习搜索引擎优化多长时间是一个错误的命题。学习是无止境的,搜索引擎优化是一个持续的学习过程,几乎没有终点。再说,什么是“会议”?有几个层次。搜索引擎优化的基本学习时间大约是两个月,这两个月的每一天都需要固定的时间来学习和记忆。
成为搜索引擎优化专家需要多长时间?
答案是不确定的。没有必要花很多时间成为搜索引擎优化行业的大玩家。除了必要的时间投入,大量的独立思考,大量的实际网站优化,大量的参考优化技术和个人知识库的存储都是必要的。
搜索引擎优化学习的基本内容是什么?
1.关键词:分析、挖掘、密度分析、布局、查询和排名、长尾关键词排名
2.站内优化:站内优化细节、网址优化、伪静态和动态、死链接查询和解决方案、链内优化、网站地图制作、301重定向设置、robots.txt、404错误页面设置、图片优化技术、网站内容策略。
3.站外优化:站外优化策略、友谊链接交换、网站提交门户、站外软文章推广和高质量的站外链架设。
','1642645778','0','87','1','0','0','0','0','SEO','0', NULL, NULL,',3,', NULL,'0');
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('8','极致CMS免费吗?','5', NULL,'faq', NULL,'极致CMS完全免费,不收取系统的授权费,且免费商用!但是,有的模板如果有标记授权或者付费的,另当别论,因为有的模板二开过,有些文件在系统内,可能整站出售。','极致CMS免费吗?','1', NULL,'极致CMS完全免费,不收取系统的授权费,且免费商用!
但是,有的模板如果有标记授权或者付费的,另当别论,因为有的模板二开过,有些文件在系统内,可能整站出售。
','1642943290','0','32','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('6','网站死链接应该如何处理','8', NULL,'znxw', NULL,'网站死链接应该如何处理?当你的网站有了死链接之后,你觉得这些链接对网站的影响不是很大,那么就可以删除这些链接,但是在删除的过程中一定要注意不能扩大化删除链接,即删除链接不要太多,将死链接删除即可。而遇...','网站死链接应该如何处理','1','/static/upload/2022/01/19/202201199543.jpg','网站死链接应该如何处理?当你的网站有了死链接之后,你觉得这些链接对网站的影响不是很大,那么就可以删除这些链接,但是在删除的过程中一定要注意不能扩大化删除链接,即删除链接不要太多,将死链接删除即可。而遇到一些栏目链接的时候一定不要将之删除了,那样会造成网站栏目的缺乏,站在用户体验的角度上来讲无法对用户构成利好,可能用户这次进入了你的网站,下次看到你的网站就会直接关闭,不能够形成用户二次访问率。
转化页面,当你检查到网站的页面不存在的时候就可以设置转化页面进行转化,不过这个过程比较复杂,如果网站的死链接过多,那么对站长的技术与耐心也是一个挑战。
利用屏蔽方法,所谓的屏蔽方法就是通过robots.txt文档将死链接屏蔽掉,让搜索引擎蜘蛛不能发现这些链接的存在,从搜索引擎的角度来讲这个方法是有效的,它逃避了搜索引擎的处罚。但是这个方法却不能够长期的使用,因为这样会造成整个网站垃圾信息过多,还不如通过404引导页面进行引导点击,这种效果对用户与搜索引擎都友好。
错误链接处理方法:
当网站打不开的时候先不要着急,看看是否是你输入错误。最好的解决方法就是细心。由此导弹总结以下两点希望各位站长注意:总体来说死链接和错误链接都是一样的,都是打不开的页面。工作中多多细心尽量减少死链接页面,因为死链接越多对你的优化和用户体验越不利。减少客户操作失误造成的错误链接,最好的办法就是用一个简单易记,方便输入的域名。域名中最好不要带符号等。
首先要明确自己建站的目的是什么?
网站类型非常之多,每一种类型其建站的目的都是不一致的,我们以企业网站为例子,企业网站无疑就是品牌产品宣传的主要阵地,主要需要面度的是定向客户因为行业不一致导致用户细分也是有差异的,在比如一个个人站长资讯类站点挂百度或者谷歌广告,当然流量为王,越多的访问量才能增加广告被点击的几率可见两者的目的有着质的区别,这一点大家一定要弄清楚。
网站上线之前的栏目策划是必须的。
我们知道,一个裸站是没有任何价值和意义的,网站新上线我们首先要进行外包装,比如LOGO,网站导航的设置,网站界面美工的优化,然后针对自己站点的用户需求和关键词的竞争度分析,仔细做好网站栏目的添加,这些细节全部设置好之后,我们就要针对网站内容进行关键词的布局,合理的规划首页布局尽可能的囊括所有SEO优化细节。
网站上线之后第一时间提交各大搜索引擎。
作为一个站长,网站建设并不是我们的最终目的,我们的核心是关注网站的权重和排名,seo优化的思维是贯穿在整个网站建设的过程中的,网站上线之后一个非常重要的细节就是尽快提交至各大搜索引擎,提交之前我们要注意一个细节要点,就是尽可能的为网站更新2篇到三篇文章,文章一定要注意质量,新站上线一定要为用户和搜索引擎留下良好的第一印象才对,这个时候我们就可以登陆各大搜索引擎的提交入口了,接下来的工作我就不用在赘述了吧!内容、外链、关键词分析布局,坚持就这样把这些基础工作做精做细吧!
','1642644634','0','88','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');
INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('12','网站SEO优化需要原创内容吗?','9','article','xyxw','seo', NULL,'网站SEO优化需要原创内容吗?','0','/static/upload/2022/01/26/202201267840.jpg','随着互联网发展的日渐成熟,越来越多人选择做百度自然排名SEO,那么,有很多人就疑惑了,网站SEO优化需要原创内容吗?答案是肯定的,原因如下:
1、百度蜘蛛更喜欢原创文章
原创文章很重要,特别是对于新站来说,因为百度蜘蛛对于抄袭的文章会厌恶,如果百度蜘蛛在爬取你的网站的时候,发现你的网站的内容是以前网上发布过的,那么收录你的网站的文章的可能性就会变得极低,百度蜘蛛不收录,你的网站被客户搜索到的几率也就会大大降低,当客户都没办法搜索到你的网站的时候,网站建设也就没有意义可言了。所以企业网站SEO优化的时候,一定要坚持写原创文章,而且需要持续性的更新,这虽然是一个漫长的过程,但是却非常重要。
原创的内容,不仅受百度蜘蛛喜爱,也更受客户欢迎。如果客户在浏览你的网站的时候,发现你网站的内容是网上没有过的,比较新颖的,也会特别关注你的网站,浏览的时间也就会更长,交易的可能性也就越高。当客户都喜欢网站的内容的时候,搜索引擎也会了解到这一点,在爬取的时候也会收录更多的内容。所以,坚持原创内容的更新,是一个良性循环、一举两得的事情。
网站质量
2、内容原创很重要,价值更重要
原创文章对于企业网站SEO优化是很重要,但是原创文章就一定可以吗?答案也是否定的,在做内容的时候,我们也不能因为原创而原创。很多站长为了原创,利用一些伪原创工具制造文章更新,这么做文章的原创度是提高了,但是内容却没有任何价值可言,没有价值的内容,不仅百度蜘蛛不会喜欢,用户更不会喜欢,长此以往,百度蜘蛛也就不会再来爬取你的站点了,收录只会越来越少。所以,站长在做企业网站的时候,万不能为了原创而丢了质量,要坚持带给客户原创,坚持文章内容的可读性,坚持具有价值的内容,牺牲网站内容质量去迎合百度蜘蛛是非常愚蠢的行为。
3、伪原创是否可行?
在某种意义上来说,伪原创也是可行的,转载也可以。但是一定要注意比例,原创文章为主,伪原创转载类文章为辅。如果伪原创或者转载的内容是质量高的,对用户非常有价值的,那么你的文章哪怕不是原创,百度蜘蛛也会很喜欢,会收录。当然,哪怕是伪原创或者转载的内容,也需要注意跟网站的相关性,不能随意转载。
原创内容确实很重要,但是也需要掌握原创的方法,注重营销型网站内容的内容建设,重视内容的可读性,不能为了迎合百度蜘蛛忽略了用户,搜索引擎是根本,用户体验是未来发展的方向,二者不是独立的,需要相辅相成。
以上就是《网站SEO优化需要原创内容吗?》的全部内容,仅供站长朋友们互动交流学习,SEO优化是一个需要坚持的过程,希望大家一起共同进步。
','1643161498','0','9','0','0','0','0','0', NULL,'1', NULL, NULL, NULL, NULL,'0');
-- ----------------------------
-- Records of jz_attr
-- ----------------------------
INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('1','置顶','1');
INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('2','热点','1');
INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('3','推荐','1');
-- ----------------------------
-- Records of jz_buylog
-- ----------------------------
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('1','0','1','No20220123161635','3','jifen','登录奖励', NULL,'1.00','1.00','1642925795');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('2','9','0','No20220123220149','3','jifen','点赞奖励','product','1.00','1.00','1642946509');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('3','9','0','No20220123220206','3','jifen','取消点赞','product','-1.00','-1.00','1642946526');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('4','9','0','No20220123220209','3','jifen','点赞奖励','product','1.00','1.00','1642946529');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('5','9','0','No20220123220358','3','jifen','取消点赞','product','-1.00','-1.00','1642946638');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('6','10','0','No20220123220410','3','jifen','点赞奖励','product','1.00','1.00','1642946650');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('7','9','0','No20220123220413','3','jifen','点赞奖励','product','1.00','1.00','1642946653');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('8','8','0','No20220123220415','3','jifen','点赞奖励','product','1.00','1.00','1642946655');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('9','9','0','No20220123220441','3','jifen','收藏奖励','product','1.00','1.00','1642946681');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('10','9','0','No20220123220450','3','jifen','取消收藏','product','-1.00','-1.00','1642946690');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('11','9','0','No20220123220450','3','jifen','取消收藏','product','-1.00','-1.00','1642946690');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('12','9','0','No20220123220655','3','jifen','收藏奖励','product','1.00','1.00','1642946815');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('13','10','0','No20220123220726','3','jifen','收藏奖励','product','1.00','1.00','1642946846');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('14','7','0','No20220123220730','3','jifen','收藏奖励','product','1.00','1.00','1642946850');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('15','10','0','No20220123221918','3','jifen','取消收藏','product','-1.00','-1.00','1642947558');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('16','10','0','No20220123221918','3','jifen','取消收藏','product','-1.00','-1.00','1642947558');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('17','10','0','No20220123221923','3','jifen','收藏奖励','product','1.00','1.00','1642947563');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('18','9','0','No20220123224512','3','jifen','取消收藏','product','-1.00','-1.00','1642949112');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('19','9','0','No20220123224512','3','jifen','取消收藏','product','-1.00','-1.00','1642949112');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('20','10','0','No20220123224623','3','jifen','取消点赞','product','-1.00','-1.00','1642949183');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('21','0','1','No20220125083513','3','jifen','登录奖励', NULL,'1.00','1.00','1643070913');
INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('22','0','1','No20220126083805','3','jifen','登录奖励', NULL,'1.00','1.00','1643157485');
-- ----------------------------
-- Records of jz_cachedata
-- ----------------------------
-- ----------------------------
-- Records of jz_chain
-- ----------------------------
-- ----------------------------
-- Records of jz_classtype
-- ----------------------------
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('1','公司产品','公司产品','product', NULL, NULL, NULL, NULL,'0','1','1','1','0','0','product','list','details','9','0', NULL,'1','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('2','公司新闻','公司新闻','article', NULL, NULL, NULL, NULL,'0','1','1','1','0','0','news','article-list','article-details','10','0', NULL,'1','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('3','关于我们','关于我们','page', NULL, NULL, NULL,'极致CMS是一款免费开源的建站系统。具备基础的CMS模型,可以使用它进行发布更新,进行内容管理。
而除此之外,它还有会员模块,支付模块,积分模块,不仅拥有丰富的插件,还可以自由扩展。
简单的模板标签,使你能够更快更便捷的建站。强大的拓展性,让它能够胜任市场上绝大多数的功能开发。
具备良好的SEO优化,更容易被浏览器抓取收录。毫秒级响应,百万数据承载,对大数据处理有非常丰富的经验。
','0','1','1','0','0','0','about-us','about-us','article-details','10','0', NULL,'1','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('4','联系我们','联系我们','message','/static/cms/static/images/jizhicms.jpg', NULL, NULL, NULL,'0','1','1','0','0','0','contact','contact-us', NULL,'10','0', NULL,'1','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('5','常见问题','常见问题','article', NULL, NULL, NULL, NULL,'0','1','1','0','0','0','faq','faq','article-details','10','0', NULL,'0','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('6','免费模板','免费模板','product', NULL, NULL, NULL, NULL,'0','1','1','0','1','0','free','list','details','9','0', NULL,'1','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('7','商业模板','商业模板','product', NULL, NULL, NULL, NULL,'0','1','1','0','1','0','business','list','details','9','0', NULL,'1','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('8','站内新闻','站内新闻','article', NULL, NULL, NULL, NULL,'0','1','1','0','2','0','znxw','article-list','article-details','10','0', NULL,'1','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('9','行业新闻','行业新闻','article', NULL, NULL, NULL, NULL,'0','1','1','0','2','0','xyxw','article-list','article-details','10','0', NULL,'1','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('10','用户评价','用户评价','pingjia', NULL, NULL, NULL, NULL,'0','1','0','0','0','0','yhpj','lists','details','10','0', NULL,'1','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('11','技术支持','技术支持','page', NULL, NULL, NULL, NULL,'0','1','1','0','3','0','support','page','details','10','0','https://www.jizhicms.cn','1','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('12','隐私协议','隐私协议','page', NULL, NULL, NULL,'极致CMS遵循 MIT协议!
除此外,极致CMS不允许做违纪违法的事情,如果有参与,一律自行负责,与极致CMS无关!
','0','1','1','0','3','0','privacy-agreement','page','details','10','0', NULL,'1','0', NULL);
INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('13','广告合作','广告合作','page', NULL, NULL, NULL,'极致CMS由开发者 留恋风(如沐春)[ 25841047041@qq.com ] 独立开发完成!
Gitee :https://gitee.com/Cherry_toto/jizhicms
Github :https://github.com/Cherry-toto/jizhicms
邮箱 :2581047041@qq.com
QQ :2581047041
微信 :TF-2581047041
极致CMS源码不会携带任何广告,如果有广告合作的朋友,暂时不会在系统上加,十分抱歉!
可以通过邮箱或者QQ联系(由于提问的人数过多,建议发送邮件咨询,QQ已加爆! ),另外主要在QQ交流群内解答问题,如果你有问题,可以到QQ群里来提问。
如果有其他项目合作的朋友,随时可以添加QQ微信联系我!
','0','1','1','0','3','0','cooperation','page','details','10','0', NULL,'1','0', NULL);
-- ----------------------------
-- Records of jz_collect
-- ----------------------------
-- ----------------------------
-- Records of jz_collect_type
-- ----------------------------
-- ----------------------------
-- Records of jz_comment
-- ----------------------------
INSERT INTO `jz_comment` (`id`,`tid`,`aid`,`pid`,`zid`,`body`,`reply`,`addtime`,`userid`,`likes`,`isshow`,`isread`) VALUES ('1','8','6','0','0','很不错!', NULL,'1642931294','1','0','1','0');
INSERT INTO `jz_comment` (`id`,`tid`,`aid`,`pid`,`zid`,`body`,`reply`,`addtime`,`userid`,`likes`,`isshow`,`isread`) VALUES ('2','8','6','1','0',' @iPHfa6 干得漂亮!', NULL,'1642932172','1','0','1','0');
INSERT INTO `jz_comment` (`id`,`tid`,`aid`,`pid`,`zid`,`body`,`reply`,`addtime`,`userid`,`likes`,`isshow`,`isread`) VALUES ('3','6','10','0','0','很不错哦!', NULL,'1643167629','1','0','1','0');
-- ----------------------------
-- Records of jz_ctype
-- ----------------------------
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('1','基本设置','base',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('2','高级设置','high-level',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('3','搜索配置','searchconfig',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('4','邮件订单','email-order',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('5','支付配置','payconfig',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('6','公众号配置','wechatbind',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('7','积分配置','jifenset',1,1);
INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('8','图片水印','imagewatermark',1,1);
-- ----------------------------
-- Records of jz_customurl
-- ----------------------------
-- ----------------------------
-- Records of jz_fields
-- ----------------------------
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('1','url','links','链接地址', NULL,'1',',0,','255', NULL,'0','1','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('2','title','links','链接名称', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('3','email','message','联系邮箱', NULL,'1', NULL,'255', NULL,'0','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('4','keywords','tags','关键词','尽量简短,但不能重复','1', NULL,'50', NULL,'0','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('5','newname','tags','替换词','尽量简短,但不能重复,20字以内,可不填。【已废弃】','1', NULL,'50', NULL,'0','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('7','num','tags','替换次数','一篇文章内替换的次数,默认-1,全部替换【已废弃】','4', NULL,'4', NULL,'0','0','1','0','0','0', NULL,'-1','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('8','target','tags','打开方式', NULL,'7', NULL,'50','新窗口=_blank,本窗口=_self','0','0','1','0','0','0', NULL,'_blank','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('9','number','tags','标签数','无需填写,程序自动处理','4', NULL,'11', NULL,'0','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('10','member_id','article','用户','前台会员,无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('11','member_id','product','用户','前台会员,无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('12','member_id','links','发布用户','前台会员,无需填写','13', NULL,'11','3,username','0','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('13','target','links','外链URL','默认为空,系统访问内容则直接跳转到此链接','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('14','ownurl','links','自定义URL','默认为空,自定义URL','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('15','ownurl','tags','自定义URL','默认为空,自定义URL','1', NULL,'255', NULL,'0','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('16','addtime','links','添加时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('17','addtime','tags','添加时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('43','molds','product','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('19','title','article','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0','250','1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('20','tid','article','所属栏目', NULL,'17', NULL,'13', NULL,'1','1','1','1','1','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('21','molds','article','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('22','htmlurl','article','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','1', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('23','keywords','article','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('24','description','article','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('25','seo_title','article','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('26','userid','article','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('27','litpic','article','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('28','body','article','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('29','addtime','article','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('30','orders','article','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('31','hits','article','点击量', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('32','isshow','article','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','1','1', NULL,'1','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('33','comment_num','article','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','1', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('34','istop','article','是否置顶:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('35','ishot','article','是否头条:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('36','istuijian','article','是否推荐:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('37','tags','article','Tags', NULL,'19',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('38','target','article','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('39','ownurl','article','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('40','jzattr','article','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','0','0','150','0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('41','tids','article','副栏目', NULL,'18', NULL,'255', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('42','zan','article','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('44','title','product','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','100','0','300','1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('45','seo_title','product','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('46','tid','product','所属栏目', NULL,'17', NULL,'11', NULL,'1','0','1','1','1','1', NULL,'0','1','100','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('47','hits','product','点击量', NULL,'4',',0,10,','11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('48','htmlurl','product','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('49','keywords','product','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('50','description','product','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('51','litpic','product','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','100','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('52','stock_num','product','库存', NULL,'1', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('53','price','product','价格', NULL,'1', NULL,'10,2', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('54','pictures','product','图集', NULL,'6',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,', NULL, NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('55','isshow','product','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','0','1', NULL,'1','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('56','comment_num','product','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('57','body','product','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('58','userid','product','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('59','orders','product','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','100','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('60','addtime','product','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('61','istop','product','是否置顶:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('62','ishot','product','是否头条:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('63','istuijian','product','是否推荐:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('64','tags','product','Tags', NULL,'19', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('65','target','product','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('66','ownurl','product','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('67','jzattr','product','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','100','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('68','tids','product','副栏目', NULL,'18', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('69','zan','product','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('70','isshow','tags','是否显示', NULL,'7', NULL,'1','显示=1,隐藏=0,退回=2','0','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('71','lx','product','类型', NULL,'7',',1,6,7,','2','响应式=1,PC=2,手机=3,PC+手机=4,小程序=5','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('72','color','product','颜色', NULL,'7',',1,6,7,','2','红色=1,橙色=2,黄色=3,绿色=4,蓝色=5,紫色=6,粉色=7','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('73','hy','product','行业', NULL,'8',',1,6,7,','500','金融/证券=1,IT科技/软件=2,教育/培训=3,珠宝/工艺品=4,五金/机电=5,婚庆/摄影/美容=6,旅游/餐饮/美食=7,房产/汽车/运输=8,休闲/文化=9,医疗/生物/化工=10,儿童/游乐园=11,动物/宠物=12,鲜花/礼物=13,运动/俱乐部=14,生态/农业=15,建筑/装饰=16,广告/网站/设计=17,个人/导航/博客=18','2','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('74','title','pingjia','用户名','默认为空','1',',0,10,','255', NULL,'100','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('75','tid','pingjia','所属栏目','选择栏目','17',',10,','11', NULL,'100','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('76','tids','pingjia','副栏目','绑定后可以在当前模型的其他栏目中显示','18', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('77','keywords','pingjia','关键词','每个词用英文逗号(,)拼接','1', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('78','tags','pingjia','TAG','每个词用英文逗号(,)拼接','19', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('79','litpic','pingjia','头像','可留空','5',',0,10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('80','description','pingjia','简述','可留空','2',',0,10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('81','body','pingjia','内容','可留空','3',',10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('82','member_id','pingjia','发布会员','前台发布会员ID记录','13', NULL,'11','3,username','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('83','userid','pingjia','管理员','后台发布管理员ID记录','13', NULL,'11','11,name','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('84','target','pingjia','外链URL','默认为空,系统访问内容则直接跳转到此链接','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('85','ownurl','pingjia','自定义URL','默认为空,自定义URL','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('86','hits','pingjia','点击量','系统自动添加','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('87','comment_num','pingjia','评论数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('88','zan','pingjia','点赞数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('89','addtime','pingjia','添加时间','选择时间','11',',10,','11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('90','jzattr','pingjia','推荐属性','1置顶2热点3推荐','16', NULL,'50','14,name','100','0','1','0','0','0', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('91','isshow','pingjia','是否显示','显示隐藏','7',',10,','1','显示=1,隐藏=0,退回=2','100','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('92','zhiye','pingjia','职业', NULL,'1',',10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('93','orders','pingjia','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (94, 'username', 'member', '用户昵称', NULL, 1, ',0,', '255', NULL, 2, 1, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (95, 'openid', 'member', '微信OPENID', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (96, 'sex', 'member', '性别', NULL, 12, ',0,', '2', '男=1,女=2,未知=0', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (97, 'gid', 'member', '会员分组', NULL, 13, ',0,', '11', '6,name', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (98, 'litpic', 'member', '会员头像', NULL, 5, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (99, 'tel', 'member', '电话号码', NULL, 1, ',0,', '12', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (100, 'jifen', 'member', '积分', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (101, 'money', 'member', '金币', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (102, 'email', 'member', '邮箱', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (103, 'province', 'member', '省份', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (104, 'city', 'member', '城市', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (105, 'address', 'member', '详细地址', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (106, 'regtime', 'member', '注册时间', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (107, 'logintime', 'member', '最近登录', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (108, 'signature', 'member', '个性签名', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (109, 'birthday', 'member', '生日', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (110, 'pid', 'member', '推荐人', NULL, 13, ',0,', '11', '3,username', 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (111, 'isshow', 'member', '状态', '封禁后不能登录', 7, ',0,', '2', '正常=1,封禁=0', 2, 0, 1, 1, 1, 1, NULL, '1', 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (112, 'title', 'message', '标题', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (113, 'user', 'message', '用户昵称', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 0, 1, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (114, 'tid', 'message', '相关栏目', NULL, 13, ',4,', '11', '2,classname', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (115, 'tel', 'message', '联系电话', NULL, 1, ',4,', '20', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (116, 'ip', 'message', '留言IP', NULL, 1, ',4,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (117, 'body', 'message', '留言内容', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (118, 'isshow', 'message', '是否审核', NULL, 7, ',4,', '1', '未审核=0,已审核=1', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (119, 'addtime', 'message', '提交时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (120, 'reply', 'message', '回复留言', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (121, 'uploadsize', 'member', '上传限制', '单位M,上传总文件大小限制,超过此大小不允许上传', 4, ',0,', '11', NULL, 2, 0, 0, 1, 0, 0, NULL, '0', 1, 0, 0, NULL, 0);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('122','updatetime','article','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('123','updatetime','product','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('124','updatetime','pingjia','更新时间','选择时间','11',NULL,'11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (125, 'updatetime', 'message', '更新时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('126','updatetime','links','更新时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0');
INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('127','updatetime','tags','更新时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1');
-- ----------------------------
-- Records of jz_hook
-- ----------------------------
-- ----------------------------
-- Records of jz_layout
-- ----------------------------
INSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('1','系统默认','[]','[{"name":"内容管理","icon":"","nav":[{"key":"16948","title":"内容列表","value":"9","icon":""},{"key":"12349","title":"商品列表","value":"105","icon":""},{"key":"19748","title":"推荐属性","value":"202","icon":""}]},{"name":"栏目管理","icon":"","nav":[{"key":"10518","title":"栏目列表","value":"42","icon":""}]},{"name":"互动管理","icon":"","nav":[{"key":"11832","title":"留言列表","value":"22","icon":""},{"key":"11262","title":"评论列表","value":"16","icon":""}]},{"name":"SEO设置","icon":"","nav":[{"key":"16628","title":"TAG列表","value":"147","icon":""},{"key":"16214","title":"友情链接","value":"95","icon":""},{"key":"16254","title":"网站地图","value":"153","icon":""},{"key":"16917","title":"内链列表","value":"210","icon":""}]},{"name":"用户管理","icon":"","nav":[{"key":"11957","title":"会员列表","value":"2","icon":""},{"key":"15086","title":"会员分组","value":"118","icon":""},{"key":"10618","title":"会员权限","value":"123","icon":""},{"key":"17578","title":"管理员列表","value":"54","icon":""},{"key":"19552","title":"角色管理","value":"49","icon":""},{"key":"10895","title":"权限列表","value":"66","icon":""},{"key":"12582","title":"订单列表","value":"129","icon":""},{"key":"17076","title":"充值列表","value":"177","icon":""}]},{"name":"系统设置","icon":"","nav":[{"key":"11314","title":"网站设置","value":"40","icon":""},{"key":"10572","title":"桌面设置","value":"70","icon":""},{"key":"18242","title":"导航设置","value":"190","icon":""},{"key":"13002","title":"轮播图","value":"83","icon":""},{"key":"15936","title":"轮播图分类","value":"89","icon":""},{"key":"19847","title":"清理缓存","value":"114","icon":""},{"key":"12739","title":"模板列表","value":"223","icon":""},{"key":"127391","title":"配置栏目","value":"240","icon":""}]},{"name":"扩展管理","icon":"","nav":[{"key":"11957","title":"插件列表","value":"76","icon":""},{"key":"13870","title":"图库管理","value":"116","icon":""},{"key":"12472","title":"模型列表","value":"61","icon":""},{"key":"15551","title":"数据库备份","value":"35","icon":""},{"key":"16311","title":"碎片化","value":"194","icon":""},{"key":"18982","title":"公众号菜单","value":"141","icon":""},{"key":"14568","title":"公众号素材","value":"142","icon":""},{"key":"13219","title":"模板制作","value":"143","icon":""},{"key":"17893","title":"生成静态文件","value":"154","icon":""},{"key":"16926","title":"登录日志","value":"115","icon":""}]},{"name":"回收站","icon":"","nav":[{"key":"17056","title":"回收站","value":"217","icon":""}]},{"name":"评价管理","icon":"","nav":[{"key":"16835","title":"用户评价","value":"227","icon":""}]}]','0','CMS默认配置,不可删除!','1','1');
INSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('2','旧版桌面','[]','[{"name":"网站管理","icon":"","nav":["42","9","95","83","147","22"]},{"name":"商品管理","icon":"","nav":["105","129","2","118","123","16","177"]},{"name":"扩展管理","icon":"","nav":["76","116","141","142","143","194","35","61","154","153"]},{"name":"系统设置","icon":"","nav":["40","54","49","190","70","115","114","66"]}]','0','旧版本配置','0','0');
-- ----------------------------
-- Records of jz_level
-- ----------------------------
INSERT INTO `jz_level` (`id`,`name`,`pass`,`tel`,`gid`,`email`,`regtime`,`logintime`,`status`) VALUES ('1','admin','0acdd3e4a8a2a1f8aa3ac518313dab9d','13600136000','1','123456@qq.com','1635997469','1643156842','1');
-- ----------------------------
-- Records of jz_level_group
-- ----------------------------
INSERT INTO `jz_level_group` (`id`,`name`,`isadmin`,`ischeck`,`classcontrol`,`paction`,`tids`,`isagree`,`description`) VALUES ('1','超级管理员','1','0','0',',Fields,', NULL,'1', NULL);
-- ----------------------------
-- Records of jz_likes
-- ----------------------------
INSERT INTO `jz_likes` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('4','6','9','1','1642946653');
INSERT INTO `jz_likes` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('5','7','8','1','1642946655');
-- ----------------------------
-- Records of jz_link_type
-- ----------------------------
INSERT INTO `jz_link_type` (`id`,`name`,`addtime`) VALUES ('1','首页','1642818560');
-- ----------------------------
-- Records of jz_links
-- ----------------------------
INSERT INTO `jz_links` (`id`,`title`,`molds`,`url`,`isshow`,`tid`,`userid`,`htmlurl`,`orders`,`member_id`,`target`,`ownurl`,`addtime`) VALUES ('1','极致CMS','links','https://www.jizhicms.cn','1','1','1', NULL,'0','0', NULL, NULL,'0');
INSERT INTO `jz_links` (`id`,`title`,`molds`,`url`,`isshow`,`tid`,`userid`,`htmlurl`,`orders`,`member_id`,`target`,`ownurl`,`addtime`) VALUES ('2','极致应用市场','links','https://app.jizhicms.cn','1','1','1', NULL,'0','0', NULL, NULL,'0');
-- ----------------------------
-- Records of jz_member
-- ----------------------------
INSERT INTO `jz_member` (`id`,`username`,`openid`,`pass`,`token`,`sex`,`gid`,`litpic`,`tel`,`jifen`,`likes`,`collection`,`money`,`email`,`address`,`province`,`city`,`regtime`,`logintime`,`isshow`,`signature`,`birthday`,`follow`,`fans`,`ismsg`,`iscomment`,`iscollect`,`islikes`,`isat`,`isrechange`,`pid`) VALUES ('1','极致用户', NULL,'1321321321312', NULL,'0','1','/static/upload/user/head_1.jpeg','13600136000','3.00', NULL, NULL,'0.00', NULL, NULL, NULL, NULL,'1642925638','1643157485','1', NULL, NULL, NULL,'0','1','1','1','1','1','1','0');
-- ----------------------------
-- Records of jz_member_group
-- ----------------------------
INSERT INTO `jz_member_group` (`id`,`name`,`description`,`paction`,`pid`,`isagree`,`iscomment`,`ischeckmsg`,`addtime`,`orders`,`discount`,`discount_type`) VALUES ('1','注册会员','前台会员分组,最低等级分组',',Message,Comment,User,Order,Home,Common,Uploads,','0','1','1','1','0','0','0.00','0');
-- ----------------------------
-- Records of jz_menu
-- ----------------------------
-- ----------------------------
-- Records of jz_message
-- ----------------------------
INSERT INTO `jz_message` (`id`,`title`,`userid`,`tid`,`aid`,`user`,`ip`,`body`,`tel`,`addtime`,`orders`,`email`,`isshow`,`istop`,`hits`,`tids`) VALUES ('1','联系我们','0','0','0','测试客户','127.0.0.1','这是一条测试留言
','13600136000','1643100950','0','123456@qq.com','0','0','0', NULL);
INSERT INTO `jz_message` (`id`,`title`,`userid`,`tid`,`aid`,`user`,`ip`,`body`,`tel`,`addtime`,`orders`,`email`,`isshow`,`istop`,`hits`,`tids`) VALUES ('2','联系我们','0','0','0','测试123','127.0.0.1','这是一条测试留言
','13600136000','1643102345','0','2311232131@qq.com','0','0','0', NULL);
-- ----------------------------
-- Records of jz_molds
-- ----------------------------
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('1','内容','article','1','1','1','1','1','1','article-list.html','article-details.html','100','0','1');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('2','栏目','classtype','1','1','1','1','1','1','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('3','会员','member','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('4','订单','orders','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('5','商品','product','1','1','1','1','1','1','list.html','details.html','100','0','1');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('6','会员分组','member_group','1','1','0','0','1','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('7','评论','comment','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('8','留言','message','1','1','0','0','1','1','message.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('9','轮播图','collect','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('10','友情链接','links','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('11','管理员','level','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('12','TAG','tags','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('13','单页','page','1','1','1','1','1','1','page.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('14','推荐属性','attr','1','1','0','0','0','0','list.html','details.html','100','1','0');
INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('15','用户评价','pingjia','0','1','0','1','1','1','lists.html','details.html','100','0','0');
-- ----------------------------
-- Records of jz_orders
-- ----------------------------
INSERT INTO `jz_orders` (`id`,`orderno`,`userid`,`paytype`,`ptype`,`tel`,`username`,`tid`,`price`,`jifen`,`qianbao`,`body`,`receive_username`,`receive_tel`,`receive_email`,`receive_address`,`ispay`,`paytime`,`addtime`,`send_time`,`isshow`,`discount`,`yunfei`) VALUES ('1','No20220125084425','1', NULL,'1','13600136000','iPHfa6','0','0.01','1.00','0.01','||7-6-1-0.01||', NULL, NULL, NULL, NULL,'0','0','1643071465','0','1','0.00','0.00');
INSERT INTO `jz_orders` (`id`,`orderno`,`userid`,`paytype`,`ptype`,`tel`,`username`,`tid`,`price`,`jifen`,`qianbao`,`body`,`receive_username`,`receive_tel`,`receive_email`,`receive_address`,`ispay`,`paytime`,`addtime`,`send_time`,`isshow`,`discount`,`yunfei`) VALUES ('2','No20220125151109','1', NULL,'1','13600136000','iPHfa6','0','0.02','2.00','0.02','||7-7-2-0.01||', NULL, NULL, NULL, NULL,'0','0','1643094669','0','1','0.00','0.00');
-- ----------------------------
-- Records of jz_page
-- ----------------------------
-- ----------------------------
-- Records of jz_pictures
-- ----------------------------
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('1','1','0','product','Admin','jpg','14.24','/static/upload/2022/01/19/202201199543.jpg','1642592754','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('2','1','0','product','Admin','jpg','17.91','/static/upload/2022/01/19/202201194641.jpg','1642593917','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('3','1','0','product','Admin','jpg','12.47','/static/upload/2022/01/19/202201198505.jpg','1642594016','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('4','1','0','product','Admin','jpg','10.41','/static/upload/2022/01/19/202201192886.jpg','1642594063','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('5','1','0','product','Admin','jpg','11.62','/static/upload/2022/01/19/202201192968.jpg','1642594125','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('6','8','0','article','Admin','png','79.87','/static/upload/2022/01/20/202201202799.png','1642639629','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('7','8','0','article','Admin','jpg','9.66','/static/upload/2022/01/20/202201202461.jpg','1642639668','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('8','0','0', NULL,'Admin','jpeg','122.31','/static/upload/image/20220120/1642640161966799.jpeg','1642640161','0');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('9','8','0','article','Admin','jpg','13.05','/static/upload/2022/01/20/202201206807.jpg','1642640183','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('10','8','0','article','Admin','jpg','17.91','/static/upload/2022/01/20/202201209692.jpg','1642640284','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('11','9','0','article','Admin','jpg','11.62','/static/upload/2022/01/20/202201201293.jpg','1642640663','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('12','10','0','pingjia','Admin','jpeg','22.38','/static/upload/2022/01/20/202201207970.jpeg','1642678774','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('13','10','0','pingjia','Admin','jpeg','34.07','/static/upload/2022/01/20/202201202736.jpeg','1642678847','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('14','10','0','pingjia','Admin','jpeg','25.34','/static/upload/2022/01/20/202201207507.jpeg','1642679235','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('15','10','0','pingjia','Admin','jpeg','19.63','/static/upload/2022/01/20/202201209411.jpeg','1642679469','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('16','10','0','pingjia','Admin','jpeg','25.94','/static/upload/2022/01/20/202201201541.jpeg','1642679928','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('17','10','0','pingjia','Admin','jpeg','18.82','/static/upload/2022/01/20/202201205173.jpeg','1642680404','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('18','10','0','pingjia','Admin','jpeg','16.53','/static/upload/2022/01/22/202201226081.jpeg','1642817000','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('19','6','0','product','Admin','jpg','11.43','/static/upload/2022/01/24/202201248147.jpg','1643024022','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('20','6','0','product','Admin','jpg','11.04','/static/upload/2022/01/24/202201248943.jpg','1643024022','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('21','6','0','product','Admin','jpg','17.91','/static/upload/2022/01/24/202201244087.jpg','1643024023','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('22','6','0','product','Admin','jpg','14.24','/static/upload/2022/01/24/202201247813.jpg','1643024023','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('23','9','0','article','Home','jpg','16.44','/static/upload/2022/01/26/202201267840.jpg','1643161485','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('24','6','0','product','Home','jpg','41.2','/static/upload/2022/01/26/202201263577.jpg','1643161953','1');
INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('27','0','0','member','Home','jpeg','30.93','/static/upload/user/head_1.jpeg','1643163524','1');
-- ----------------------------
-- Records of jz_pingjia
-- ----------------------------
INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('1','10', NULL,'杜*小','/static/upload/2022/01/20/202201207970.jpeg', NULL,'简单、方便,还免费!','相比于其他的cms,极致CMS就特别简洁,后台进去没有什么多余的广告信息,清爽简洁!
','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642678180','个人博主');
INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('2','10', NULL,'慕*文','/static/upload/2022/01/20/202201202736.jpeg', NULL,'功能强大,免费开源,搞钱神器!','找了很多网上的“免费”CMS,除了免费给你看,其他很多都要付费,后台各种广告,随便找个插件都要钱!而且还不能去版权,必须挂到主页底下,自从看到极致CMS后我再也不用担心了,出了功能强大之外,免费开源,想改哪里就改哪里,主页还不用挂版权,真的是业界良心!
','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642678780','自由职业');
INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('3','10', NULL,'王*鑫','/static/upload/2022/01/20/202201207507.jpeg', NULL,'开源免费!这个CMS是真的开源免费!','不说别人,就开源免费而言,就甩其他同类CMS几条街!什么是开源?有的CMS还加密一些文件。极致CMS不仅免费,而且各个地方都可以自由定义,真的做到了自主自由!群主还经常在群里热心回答,帮助我很多,非常感谢!
','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642679206','互联网小白');
INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('4','10', NULL,'张小姐','/static/upload/2022/01/20/202201209411.jpeg', NULL,'群主热心,挺不错的cms!','刚接触cms时,群主远程手把手帮我安装,虽然我很笨,但是群里好多热心人帮我,帮我解决了一个大难题!
','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642679458','网站运营');
INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('5','10', NULL,'程*安','/static/upload/2022/01/20/202201201541.jpeg', NULL,'好用,方便,简单。越用越是觉得这个CMS的强大!非常棒!','之前朋友推荐给我的这个CMS,当时还是觉得小众,感觉所有的cms都一个样。后面因为要做个站,就选用这个cms,不得不说一开始确实一脸懵逼,特别是他的逻辑跟织梦这些有区别,但是想法却很新颖。后面陆陆续续做了几个站,看了群主的视频教程,对cms也比较了解了,现在随便一个功能型的站,我都能用极致做出来!
','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642679894','SEO');
INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('7','10', NULL,'吴*强','/static/upload/2022/01/22/202201226081.jpeg', NULL,'开源免费,容易搞钱!','没有用极致CMS之前,都觉得网上的CMS基本上是简单的功能,要功能就得付费,而且对于不懂程序的人而言,那是相当难,自从用了极致之后,你会觉得每一天都在成长,能力越来越强,可以用它来做任何系统!
','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642816961','个人站长');
INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('6','10', NULL,'梁*宽','/static/upload/2022/01/20/202201205173.jpeg', NULL,'群主好人,免费开源,还经常回答问题!','个人觉得cms对新手有一定难度,不过当你真正做了几个站之后,你就会发现这个CMS是真的强大,每当我觉得做不出来功能的时候,群里一问,里面就有群友出一些解决方案,而且自己能完成!对于互联网小白而言,这个是不可思议的,因为我没学过编程,但完成了一个其他CMS需要花很多钱二开的功能!那一刻,很自豪!
','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642680280','博客小新人');
-- ----------------------------
-- Records of jz_plugins
-- ----------------------------
-- ----------------------------
-- Records of jz_power
-- ----------------------------
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('1','Common','公共权限','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('2','Home','前台网站','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('3','User','个人中心','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('4','Login','会员登录','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('5','Message','站内留言','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('6','Comment','会员评论','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('7','Screen','网站筛选','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('8','Order','会员下单','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('9','Mypay','网站支付','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('10','Jzpay','极致支付','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('11','Tags','TAG标签','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('12','Wechat','微信模块','0','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('13','Common/vercode','验证码生成','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('14','Common/checklogin','检查是否登录','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('15','Common/multiuploads','多附件上传','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('16','Common/uploads','单附件上传','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('17','Common/qrcode','二维码生成','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('18','Common/get_fields','获取扩展信息','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('19','Common/jizhi','链接错误提示','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('20','Common/error','报错提示','1','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('21','Home/index','网站首页','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('22','Home/jizhi','网站内容','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('23','Home/auto_url','自定义链接','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('24','Home/jizhi_details','详情内容','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('25','Home/search','网站搜索','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('26','Home/searchAll','网站多模块搜索','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('27','Home/start_cache','开启网站缓存','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('28','Home/end_cache','输出缓存','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('29','User/checklogin','检查是否登录','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('30','User/index','个人中心首页','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('31','User/userinfo','会员资料','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('32','User/orders','订单记录','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('33','User/orderdetails','订单详情','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('34','User/payment','订单支付','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('35','User/orderdel','删除订单','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('36','User/changeimg','上传头像','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('37','User/comment','评论列表','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('38','User/commentdel','删除评论','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('39','User/likesAction','点赞文章','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('40','User/likes','点赞列表','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('41','User/likesdel','取消点赞','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('42','User/collectAction','收藏文章','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('43','User/collect','收藏列表','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('44','User/collectdel','删除收藏','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('45','User/cart','购物车','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('46','User/addcart','添加购物车','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('47','User/delcart','删除购物车','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('48','User/posts','发布管理','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('49','User/release','会员发布','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('50','User/del','删除发布','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('51','User/uploads','会员上传附件','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('52','User/jizhi','404提示','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('53','User/follow','关注用户','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('54','User/nofollow','取消关注','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('55','User/fans','粉丝列表','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('56','User/notify','消息提醒','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('57','User/notifyto','查看消息','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('58','User/notifydel','删除消息','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('59','User/active','公共主页','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('60','User/setmsg','消息提醒设置','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('61','User/getclass','获取栏目列表','2','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('62','User/wallet','用户钱包','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('63','User/buy','会员充值','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('64','User/buylist','充值列表','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('65','User/buydetails','交易详情','3','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('66','Login/index','登录首页','4','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('67','Login/register','注册页面','4','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('68','Login/forget','忘记密码','4','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('69','Login/nologin','未登录页面','4','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('70','Login/loginout','退出登录','4','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('71','Message/index','发送留言','5','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('72','Comment/index','发表评论','6','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('73','Screen/index','筛选列表','7','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('74','Order/create','创建订单','8','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('75','Order/pay','订单支付','8','1');
INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('76','Tags/index','TAG标签列表','11','1');
-- ----------------------------
-- Records of jz_product
-- ----------------------------
INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('1','product','PC端橙色IT科技教育培训网站模板','PC端橙色IT科技教育培训网站模板','6','1','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201194641.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','响应式网站模板源码
自适应,同一个后台,数据即时同步,简单适用!附带测试数据!
友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!
后台:域名/admin.php
账号:admin
密码:admin
使用教程:xxxxx
模板特点
1:手工书写DIV+CSS、代码精简无冗余。
2:自适应结构,全球先进技术,高端视觉体验。
3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。
4:附带测试数据、安装教程、入门教程、安全及备份教程。
5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。
语言程序:PHP + SQLite
前端规范:html+css+jQuery
设备支持:PC端+手机端
浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器
最佳分辨率:1920px+1440px
程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境
','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',2,', NULL,'0','2','2',',2,3,');
INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('2','product','响应式红色软件公司网站模板','响应式红色软件公司网站模板','6','0','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201199543.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','响应式网站模板源码
自适应,同一个后台,数据即时同步,简单适用!附带测试数据!
友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!
后台:域名/admin.php
账号:admin
密码:admin
使用教程:xxxxx
模板特点
1:手工书写DIV+CSS、代码精简无冗余。
2:自适应结构,全球先进技术,高端视觉体验。
3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。
4:附带测试数据、安装教程、入门教程、安全及备份教程。
5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。
语言程序:PHP + SQLite
前端规范:html+css+jQuery
设备支持:PC端+手机端
浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器
最佳分辨率:1920px+1440px
程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境
','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','1','1',',1,2,');
INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('3','product','手机端黄色五金机电网站模板','手机端黄色五金机电网站模板','6','0','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201198505.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','响应式网站模板源码
自适应,同一个后台,数据即时同步,简单适用!附带测试数据!
友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!
后台:域名/admin.php
账号:admin
密码:admin
使用教程:xxxxx
模板特点
1:手工书写DIV+CSS、代码精简无冗余。
2:自适应结构,全球先进技术,高端视觉体验。
3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。
4:附带测试数据、安装教程、入门教程、安全及备份教程。
5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。
语言程序:PHP + SQLite
前端规范:html+css+jQuery
设备支持:PC端+手机端
浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器
最佳分辨率:1920px+1440px
程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境
','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',3,', NULL,'0','3','3',',4,5,6,7,');
INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('4','product','PC+手机绿色医疗生物化工网站模板','PC+手机绿色医疗生物化工网站模板','6','0','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201192886.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','响应式网站模板源码
自适应,同一个后台,数据即时同步,简单适用!附带测试数据!
友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!
后台:域名/admin.php
账号:admin
密码:admin
使用教程:xxxxx
模板特点
1:手工书写DIV+CSS、代码精简无冗余。
2:自适应结构,全球先进技术,高端视觉体验。
3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。
4:附带测试数据、安装教程、入门教程、安全及备份教程。
5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。
语言程序:PHP + SQLite
前端规范:html+css+jQuery
设备支持:PC端+手机端
浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器
最佳分辨率:1920px+1440px
程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境
','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','4','4',',10,11,12,');
INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('5','product','蓝色小程序鲜花礼物广告设计网站模板','蓝色小程序鲜花礼物广告设计网站模板','7','0','business', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201192968.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','响应式网站模板源码
自适应,同一个后台,数据即时同步,简单适用!附带测试数据!
友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!
后台:域名/admin.php
账号:admin
密码:admin
使用教程:xxxxx
模板特点
1:手工书写DIV+CSS、代码精简无冗余。
2:自适应结构,全球先进技术,高端视觉体验。
3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。
4:附带测试数据、安装教程、入门教程、安全及备份教程。
5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。
语言程序:PHP + SQLite
前端规范:html+css+jQuery
设备支持:PC端+手机端
浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器
最佳分辨率:1920px+1440px
程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境
','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',2,', NULL,'0','5','5',',2,13,14,15,16,17,');
INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('6','product','PC端橙色IT科技教育培训网站模板','PC端橙色IT科技教育培训网站模板','7','2','business', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201194641.jpg','99','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','响应式网站模板源码
自适应,同一个后台,数据即时同步,简单适用!附带测试数据!
友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!
后台:域名/admin.php
账号:admin
密码:admin
使用教程:xxxxx
模板特点
1:手工书写DIV+CSS、代码精简无冗余。
2:自适应结构,全球先进技术,高端视觉体验。
3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。
4:附带测试数据、安装教程、入门教程、安全及备份教程。
5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。
语言程序:PHP + SQLite
前端规范:html+css+jQuery
设备支持:PC端+手机端
浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器
最佳分辨率:1920px+1440px
程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境
','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',3,', NULL,'0','2','2',',2,3,');
INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('7','product','响应式红色软件公司网站模板','响应式红色软件公司网站模板','7','0','business', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201199543.jpg','98','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','响应式网站模板源码
自适应,同一个后台,数据即时同步,简单适用!附带测试数据!
友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!
后台:域名/admin.php
账号:admin
密码:admin
使用教程:xxxxx
模板特点
1:手工书写DIV+CSS、代码精简无冗余。
2:自适应结构,全球先进技术,高端视觉体验。
3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。
4:附带测试数据、安装教程、入门教程、安全及备份教程。
5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。
语言程序:PHP + SQLite
前端规范:html+css+jQuery
设备支持:PC端+手机端
浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器
最佳分辨率:1920px+1440px
程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境
','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',2,2,', NULL,'0','1','1',',1,2,');
INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('8','product','手机端黄色五金机电网站模板','手机端黄色五金机电网站模板','7','1','business', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201198505.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','响应式网站模板源码
自适应,同一个后台,数据即时同步,简单适用!附带测试数据!
友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!
后台:域名/admin.php
账号:admin
密码:admin
使用教程:xxxxx
模板特点
1:手工书写DIV+CSS、代码精简无冗余。
2:自适应结构,全球先进技术,高端视觉体验。
3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。
4:附带测试数据、安装教程、入门教程、安全及备份教程。
5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。
语言程序:PHP + SQLite
前端规范:html+css+jQuery
设备支持:PC端+手机端
浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器
最佳分辨率:1920px+1440px
程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境
','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',3,', NULL,'0','3','3',',4,5,6,7,');
INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('9','product','PC+手机绿色医疗生物化工网站模板','PC+手机绿色医疗生物化工网站模板','6','0','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201192886.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','响应式网站模板源码
自适应,同一个后台,数据即时同步,简单适用!附带测试数据!
友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!
后台:域名/admin.php
账号:admin
密码:admin
使用教程:xxxxx
模板特点
1:手工书写DIV+CSS、代码精简无冗余。
2:自适应结构,全球先进技术,高端视觉体验。
3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。
4:附带测试数据、安装教程、入门教程、安全及备份教程。
5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。
语言程序:PHP + SQLite
前端规范:html+css+jQuery
设备支持:PC端+手机端
浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器
最佳分辨率:1920px+1440px
程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境
','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','4','4',',10,11,12,');
INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('10','product','蓝色小程序鲜花礼物广告设计网站模板','蓝色小程序鲜花礼物广告设计网站模板','6','0','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201192968.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','响应式网站模板源码
自适应,同一个后台,数据即时同步,简单适用!附带测试数据!
友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!
后台:域名/admin.php
账号:admin
密码:admin
使用教程:xxxxx
模板特点
1:手工书写DIV+CSS、代码精简无冗余。
2:自适应结构,全球先进技术,高端视觉体验。
3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。
4:附带测试数据、安装教程、入门教程、安全及备份教程。
5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。
语言程序:PHP + SQLite
前端规范:html+css+jQuery
设备支持:PC端+手机端
浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器
最佳分辨率:1920px+1440px
程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境
','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','5','5',',2,13,14,15,16,17,');
INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('11','product','响应式蓝色软件博客模板','响应式蓝色软件博客模板','6','3','free', NULL,'免费响应式蓝色软件博客模板','/static/upload/2022/01/26/202201263577.jpg','10','0.00', NULL,'1','0','1、安装教程:极致CMS网站安装教程
2、网站安全设置教程:极致CMS网站安全设置教程
3、非模板BUG修改另付费
4、模板BUG修改请直接联系站长,验证信息请填写您的订单号
5、不解答有关任何免费模板的问题(解答付费)
6、后台已配置好,不要乱点,整出些妖蛾子,浪费彼此时间
7、缩略图请按照源码示例进行制作,要不然又说图片变形什么的
','0','0','1643162020','0','0','0', NULL,'1', NULL, NULL, NULL, NULL,'0','1','5',',2,18,');
-- ----------------------------
-- Records of jz_recycle
-- ----------------------------
-- ----------------------------
-- Records of jz_ruler
-- ----------------------------
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('1','会员管理','Member','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('2','会员列表','Member/index','1','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('3','添加会员','Member/memberadd','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('4','修改会员','Member/memberedit','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('5','删除会员','Member/member_del','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('6','批量删除','Member/deleteAll','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('7','修改状态','Member/change_status','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('8','内容管理','Article','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('9','内容列表','Article/articlelist','8','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('10','添加内容','Article/addarticle','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('11','修改内容','Article/editarticle','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('12','删除内容','Article/deletearticle','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('13','批量删除','Article/deleteAll','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('14','复制内容','Article/copyarticle','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('15','评论管理','Comment','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('16','评论列表','Comment/commentlist','15','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('17','添加评论','Comment/addcomment','15','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('18','修改评论','Comment/editcomment','15','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('19','删除评论','Comment/deletecomment','15','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('20','批量删除','Comment/deleteAll','15','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('21','留言管理','Message','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('22','留言列表','Message/messagelist','21','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('23','修改留言','Message/editmessage','21','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('24','删除留言','Message/deletemessage','21','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('25','批量删除','Message/deleteAll','21','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('26','字段管理','Fields','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('27','字段列表','Fields/index','26','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('28','新增字段','Fields/addFields','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('29','修改字段','Fields/editFields','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('30','删除字段','Fields/deleteFields','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('31','获取字段','Fields/get_fields','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('32','基本功能','Index','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('33','系统界面','Index/index','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('34','后台首页','Index/welcome','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('35','数据库备份','Index/beifen','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('36','数据库备份','Index/backup','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('37','数据库还原','Index/huanyuan','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('38','数据库删除','Index/shanchu','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('39','系统功能','Sys','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('40','网站设置','Sys/index','39','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('41','栏目管理','Classtype','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('42','栏目列表','Classtype/index','41','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('43','新增栏目','Classtype/addclass','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('44','修改栏目','Classtype/editclass','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('45','删除栏目','Classtype/deleteclass','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('46','修改排序','Classtype/editClassOrders','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('47','栏目隐藏','Classtype/change_status','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('48','管理员管理','Admin','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('49','角色管理','Admin/group','48','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('50','新增角色','Admin/groupadd','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('51','修改角色','Admin/groupedit','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('52','删除角色','Admin/group_del','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('53','角色状态','Admin/change_group_status','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('54','管理员列表','Admin/adminlist','48','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('55','新增管理员','Admin/adminadd','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('56','修改管理员','Admin/adminedit','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('57','管理员状态','Admin/change_status','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('58','删除管理员','Admin/admindelete','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('59','个人信息','Index/details','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('60','模型管理','Molds','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('61','模型列表','Molds/index','60','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('62','新增模型','Molds/addMolds','60','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('63','修改模型','Molds/editMolds','60','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('64','删除模型','Molds/deleteMolds','60','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('65','权限管理','Rulers','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('66','权限列表','Rulers/index','65','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('67','新增权限','Rulers/addrulers','65','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('68','修改权限','Rulers/editrulers','65','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('69','删除权限','Rulers/deleterulers','65','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('70','桌面设置','Index/desktop','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('71','新增桌面','Index/desktop_add','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('72','修改桌面','Index/desktop_edit','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('73','删除桌面','Index/desktop_del','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('74','图标库','Index/unicode','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('75','插件管理','Plugins','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('76','插件列表','Plugins/index','75','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('77','模块扩展','Extmolds','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('82','轮播图','Collect','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('83','轮播图','Collect/index','82','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('84','新增轮播图','Collect/addcollect','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('85','修改轮播图','Collect/editcollect','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('86','删除轮播图','Collect/deletecollect','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('87','复制轮播图','Collect/copycollect','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('88','批量删除轮播图','Collect/deleteAll','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('89','轮播图分类','Collect/collectType','82','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('90','新增轮播图分类','Collect/collectTypeAdd','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('91','修改轮播图分类','Collect/collectTypeEdit','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('92','删除轮播图分类','Collect/collectTypeDelete','82','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('93','批量复制','Article/copyAll','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('94','批量修改栏目','Article/changeType','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('95','友情链接','Links/index','189','1','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('96','新增友链','Links/addlinks','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('97','修改友链','Links/editlinks','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('98','复制友链','Links/copylinks','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('99','删除友链','Links/deletelinks','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('100','批量删除友链','Links/deleteAll','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('101','通用模块','Common','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('102','上传文件','Common/uploads','101','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('103','更新cookie','Index/update_session_maxlifetime','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('104','商品管理','Product','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('105','商品列表','Product/productlist','104','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('106','新增商品','Product/addproduct','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('107','修改商品','Product/editproduct','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('108','删除商品','Product/deleteproduct','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('109','复制商品','Product/copyproduct','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('110','批量删除','Product/deleteAll','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('111','批量复制','Product/copyAll','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('112','修改栏目','Product/changeType','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('113','修改排序','Product/editProductOrders','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('114','清理缓存','Index/cleanCache','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('115','登录日志','Sys/loginlog','39','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('116','图库管理','Sys/pictures','39','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('117','修改排序','Extmolds/editOrders','77','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('118','会员分组','Member/membergroup','1','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('119','新增分组','Member/groupadd','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('120','修改分组','Member/groupedit','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('121','更改分组状态','Member/change_group_status','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('122','删除分组','Member/group_del','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('123','会员权限','Member/power','1','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('124','添加权限','Member/addrulers','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('125','修改权限','Member/editrulers','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('126','删除权限','Member/deleterulers','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('127','修改分组排序','Member/editOrders','1','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('128','订单管理','Order','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('129','订单列表','Order/index','128','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('130','订单详情','Order/details','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('131','批量删除','Order/deleteAll','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('132','上传支付证书','Sys/uploadcert','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('133','更改状态','Plugins/change_status','75','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('134','安装卸载','Plugins/action_do','75','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('223','模板列表','Template/index','222','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('222','模板管理','Template','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('137','删除图库图片','Sys/deletePic','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('138','批量删除图库','Sys/deletePicAll','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('139','安装说明','Plugins/desc','75','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('140','微信公众号','Wechat','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('141','公众号菜单','Wechat/wxcaidan','140','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('142','公众号素材','Wechat/sucai','140','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('143','模板制作','Index/showlabel','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('144','获取首字母拼音','Classtype/get_pinyin','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('145','批量新增栏目','Classtype/addmany','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('146','自定义配置删除','Sys/custom_del','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('147','TAG列表','Extmolds/index/molds/tags','77','1','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('148','新增TAG','Extmolds/addmolds/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('149','修改TAG','Extmolds/editmolds/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('150','复制TAG','Extmolds/copymolds/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('151','删除TAG','Extmolds/deletemolds/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('152','批量删除TAG','Extmolds/deleteAll/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('153','网站地图','Index/sitemap','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('154','生成静态文件','Index/tohtml','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('155','更新栏目HTML','Index/html_classtype','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('156','更新模块HTML','Index/html_molds','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('157','批量修改推荐属性','Article/changeAttribute','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('158','批量修改推荐属性','Product/changeAttribute','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('159','批量修改友链栏目','Links/changeType','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('160','批量修改TAG栏目','Extmolds/changeType/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('161','批量复制友链','Links/copyAll','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('162','批量复制TAG','Extmolds/copyAll/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('163','批量修改友链排序','Links/editOrders','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('164','批量修改TAG排序','Extmolds/editOrders/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('165','删除订单','Order/deleteorder','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('166','批量删除','Admin/deleteAll','48','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('167','高级设置','Sys/ctype/type/high-level','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('168','邮箱订单','Sys/ctype/type/email-order','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('169','支付配置','Sys/ctype/type/payconfig','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('170','公众号配置','Sys/ctype/type/wechatbind','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('171','批量审核','Article/checkAll','8','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('172','批量审核','Product/checkAll','104','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('173','批量审核','Message/checkAll','21','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('174','批量审核','Comment/checkAll','15','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('175','批量审核友链','Links/checkAll','189','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('176','批量审核TAG','Extmolds/checkAll/molds/tags','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('177','充值列表','Order/czlist','128','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('178','手动充值','Order/chongzhi','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('179','删除记录','Order/delbuylog','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('180','批量删除记录','Order/delAllbuylog','128','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('181','积分配置','Sys/ctype/type/jifenset','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('182','插件更新','Plugins/update','75','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('183','获取栏目模板','Classtype/get_html','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('184','批量修改栏目','Classtype/changeClass','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('185','友链分类','Links/linktype','189','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('186','新增友链分类','Links/linktypeadd','189','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('187','修改友链分类','Links/linktypeedit','189','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('188','删除友链分类','Links/linktypedelete','189','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('189','友情链接','Links','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('190','导航设置','Index/menu','32','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('191','新增导航','Index/addmenu','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('192','修改导航','Index/editmenu','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('193','删除导航','Index/delmenu','32','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('194','碎片化','Sys/datacache','39','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('195','新增碎片','Sys/addcache','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('196','修改碎片','Sys/editcache','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('197','删除碎片','Sys/delcache','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('198','预览SQL','Sys/viewcache','39','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('199','搜索配置','Sys/ctype/type/searchconfig','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('200','修改字段属性','Fields/editFieldsValue','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('201','推荐属性','Jzattr','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('202','推荐属性','Jzattr/index','201','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('203','新增推荐属性','Jzattr/addAttr','201','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('204','修改推荐属性','Jzattr/editAttr','201','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('205','删除推荐属性','Jzattr/delAttr','201','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('206','修改状态','Jzattr/changeStatus','201','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('207','列表设置','Fields/fieldsList','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('208','获取列表字段','Fields/fieldsList','26','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('209','内链模块','Jzchain','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('210','内链列表','Jzchain/index','209','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('211','新增内链','Jzchain/addchain','209','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('212','修改内链','Jzchain/editchain','209','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('213','删除内链','Jzchain/delchain','209','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('214','批量删除','Jzchain/delAll','209','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('215','修改状态','Jzchain/changeStatus','209','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('216','回收站','Recycle','0','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('217','回收站','Recycle/index','216','1','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('218','恢复数据','Recycle/restore','216','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('219','删除数据','Recycle/del','216','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('220','批量删除','Recycle/delAll','216','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('221','批量恢复','Recycle/restoreAll','216','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('224','安装卸载','Template/actionDo','222','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('225','安装说明','Template/desc','222','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('226','模板更新','Template/update','222','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('227','用户评价列表','Extmolds/index/molds/pingjia','77','1','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('228','新增用户评价','Extmolds/addmolds/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('229','修改用户评价','Extmolds/editmolds/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('230','复制用户评价','Extmolds/copymolds/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('231','删除用户评价','Extmolds/deletemolds/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('232','批量删除用户评价','Extmolds/deleteAll/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('233','批量修改用户评价栏目','Extmolds/changeType/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('234','批量复制用户评价','Extmolds/copyAll/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('235','批量修改用户评价列表','Extmolds/editOrders/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('236','批量审核用户评价','Extmolds/checkAll/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('237','重构字段','Molds/restrucFields','60','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('238','基本配置','Sys/ctype/type/base','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('239','批量修改评价推荐属性','Extmolds/changeAttribute/molds/pingjia','77','0','0');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('240','配置栏目','Sys/systype','39',1,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('241','设置配置状态','Sys/systypestatus','39',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('242','修改配置分组','Sys/editctype','39',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('243','新增配置分组','Sys/addctype','39',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('244','全局配置','Sys/ctype','39',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('245','修改配置字段','Sys/setfield','39',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('246','绑定模块数据获取','Fields/getSelect','26',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('247','编辑器上传','Uploads','0',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('248','上传功能','Uploads/index','247',0,'1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('249','获取子栏目','Classtype/getchildren','41','0','1');
INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('250','获取联动数据','Fields/getliandong','26','0','1');
-- ----------------------------
-- Records of jz_shouchang
-- ----------------------------
INSERT INTO `jz_shouchang` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('5','6','10','1','1642947563');
INSERT INTO `jz_shouchang` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('4','7','7','1','1642946850');
-- ----------------------------
-- Records of jz_sysconfig
-- ----------------------------
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('1','web_version','系统版号','版本号是系统自带,请勿改动','0','2.5.6','0', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('2','web_name','网站SEO名称','控制在25个字、50个字节以内','2','极致CMS建站系统','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('3','web_keyword','网站SEO关键词','5个左右,8汉字以内,用英文逗号隔开','2','极致建站,cms,开源cms,免费cms,cms系统,phpcms,免费企业建站,建站系统,企业cms,jizhicms,极致cms,建站cms,建站系统,极致博客,极致blog,内容管理系统','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('4','web_desc','网站SEO描述','控制在80个汉字,160个字符以内','3','极致CMS是开源免费的PHPCMS网站内容管理系统,无商业授权,简单易用,提供丰富的插件,帮您实现零基础搭建不同类型网站(企业站,门户站,个人博客站等),是您建站的好帮手。极速建站,就选极致CMS。','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('5','web_js','统计代码','将百度统计、cnzz等平台的流量统计JS代码放到这里','8', NULL,'1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('6','web_copyright','底部版权','如:© 2016 xxx版权','2','@2020-2099','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('7','web_beian','备案号','如:京ICP备00000000号','2','冀ICP备88888号','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('8','web_tel','网站电话','网站联系电话','2','0666-8888888','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('9','web_tel_400','400电话','400电话','2','400-0000-000','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('10','web_qq','网站QQ','网站QQ','2','12345678','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('11','web_email','网站邮箱','网站邮箱','2','123456@qq.com','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('12','web_address','公司地址','公司地址','2','河北省廊坊市广阳区xxx大厦xx楼001号','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('13','pc_template','PC网站模板','将模板名称填写到此处','2','cms','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('14','wap_template','WAP网站模板','开启了手机端,这个设置才会生效,否则调用电脑端模板','2','1','2',NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('15','weixin_template','微信网站模板','开启了手机端,这个设置才会生效,否则调用电脑端模板。由于微信内有一些特殊的js,所以可以在这里单独设置微信模板','2','cms','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('16','iswap','是否开启手机端','如果不开启手机端,则默认调用电脑端模板','6','1','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('17','isopenhomeupload','是否开启前台上传','关闭后,前台无法上传文件。如果网站没有使用会员,建议关闭前台上传。','6','1','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('18','isopenhomepower','是否开启前台权限','开启后前台用户权限可以在后台控制','6','0','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('19','cache_time','缓存时间','单位:分钟,留空或0则不设置缓存。如果生成静态文件,静态文件清空后才生效。','2','0','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('20','fileSize','限制上传文件大小','0代表不限,单位kb','2','0','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('21','fileType','允许上传文件类型','请用|分割,如:pdf|jpg|png','2','pdf|jpg|jpeg|png|zip|rar|gzip|doc|docx|xlsx','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('22','ueditor_config','后台编辑器导航条配置', "后台UEditor编辑器导航条配置",'3','"fullscreen", "source","undo", "redo","bold", "italic", "underline", "fontborder", "strikethrough", "super", "removeformat", "formatmatch", "autotypeset", "blockquote", "pasteplain","forecolor", "backcolor", "insertorderedlist", "insertunorderedlist", "selectall", "cleardoc","rowspacingtop", "rowspacingbottom", "lineheight","customstyle", "paragraph", "fontfamily", "fontsize","directionalityltr", "directionalityrtl", "indent","justifyleft", "justifycenter", "justifyright", "justifyjustify","touppercase", "tolowercase","link", "unlink", "anchor", "imagenone", "imageleft", "imageright", "imagecenter","simpleupload", "insertimage", "emotion", "scrawl", "insertvideo", "music", "attachment", "map", "gmap", "insertframe", "insertcode", "webapp", "pagebreak","template", "background","horizontal", "date", "time", "spechars", "snapscreen", "wordimage","inserttable", "deletetable", "insertparagraphbeforetable", "insertrow", "deleterow", "insertcol", "deletecol", "mergecells", "mergeright", "mergedown", "splittocells", "splittorows", "splittocols", "charts","print", "preview", "searchreplace", "help", "drafts"','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('23','search_table','允许前台搜索的表','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如:article|product','2','article|product','3', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('24','imagequlity','上传图片压缩比例','100%则不压缩,如果PNG是透明图,压缩后背景变黑色。格式如:80','6','75','2','不压缩使用原图=100,95%=95,90%=90,85%=85,80%=80,75%=75,70%=70,65%=65,60%=60,55%=55,50%=50','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('25','ispngcompress','PNG是否压缩','PNG压缩后容易变成背景黑色,关闭后,不会压缩。','6','0','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('26','email_server','邮件服务器','smtp.163.com,smtp.qq.com','2','smtp.163.com','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('27','email_port','邮件收发端口','163、126邮件端口(465),QQ邮件端口(587)','2','465','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('28','shou_email','收件人Email地址', NULL,'2', NULL,'4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('29','send_email','发件人Email地址','指邮件服务器发件邮箱','2', NULL,'4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('30','send_pass','发件人Email秘钥','这个秘钥不是登录密码','2', NULL,'4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('31','send_name','发件人昵称','发件邮箱会带一个昵称','2','极致建站系统','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('32','tj_msg','客户订单通知','购买商品的时候会发送的一条邮件信息','3','尊敬的{xxx},我们已经收到您的订单!请留意您的电子邮件以获得最新消息,谢谢您!','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('33','send_msg','订单出货通知','发货的时候发送给客户的通知','3','尊敬的{xxx},我们已确认了您的订单,请于3日内汇款,逾期恕不保留,不便请见谅。汇款完成后,烦请告知客服人员您的交易账号后五位,即完成下单手续,谢谢您。','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('34','yunfei','订单运费','购物下单时会加上这个运费','2','0.00','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('35','paytype','在线支付','0关闭支付,1自主平台支付','6','0','5','关闭=0,开启=1','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('40','alipay_partner','支付宝APPID','账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('41','alipay_key','支付宝key','MD5密钥,安全检验码,由数字和字母组成的32位字符串','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('42','alipay_private_key','支付宝私钥', NULL,'3', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('43','alipay_public_key','支付宝公钥', NULL,'3', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('44','wx_mchid','微信商户mchid','支付相关','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('45','wx_key','微信商户key','支付相关','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('46','wx_appid','微信公众号appid','支付相关','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('47','wx_appsecret','微信公众号appsecret','支付相关','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('48','wx_client_cert','微信apiclient_cert','支付相关','5', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('49','wx_client_key','微信apiclient_key','支付相关','5', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('50','wx_login_appid','公众号appid','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('51','wx_login_appsecret','公众号appsecret','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('52','wx_login_token','公众号token','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('53','huanying','公众号关注欢迎语','公众号关注时发送的第一句推送','3','欢迎关注公众号~','6', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('54','wx_token','公众号token','支付相关','2', NULL,'5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('55','web_logo','网站LOGO', NULL,'1','/static/cms/static/images/logo.png','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('56','admintpl','后台模板风格','内页弹窗:点击新增/修改等操作,页面是一个弹出层,更美观。内嵌页面:点击新增/修改等操作,页面直接进入新页面,不会弹出层。','6','default','2','内页弹窗=default,内嵌页面=tpl','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('59','domain','网站SEO网址','一般不填,全局网址,最后不带/,如:http://www.xxx.com','2', NULL,'1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('61','overtime','订单超时','按小时计算,超过该小时订单过期,仅限于开启支付后,0代表不限制','2','4','4', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('62','islevelurl','开启层级URL','默认关闭层级URL,开启后URL会按照父类层级展现','6','0','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('63','iscachepage','缓存完整页面','前台完整页面缓存,结合缓存时间,可以提高访问速度','6','1','0','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('64','isautohtml','自动生成静态','前台访问网站页面,将自动生成静态HTML,下次访问直接进入静态HTML页面','0','0','0','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('65','pc_html','PC静态文件目录','电脑端静态HTML存放目录,默认根目录[ / ]','2','/','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('66','mobile_html','WAP静态文件目录','手机端静态HTML存放目录,默认[ m ],PC和WAP静态目录不能相同,否则文件会混乱','2','m','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('67','autocheckmessage','是否留言自动审核','开启后,留言自动审核(显示)','6','0','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('68','autocheckcomment','是否评论自动审核','开启后评论自动审核(显示)','6','1','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('69','mingan','网站敏感词过滤','将敏感词放到里面,用“,”分隔,用{xxx}代替通配内容','3', NULL,'1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('70','iswatermark','是否开启水印','开启水印后水印图片优先,如果没有图片则使用水印文字','6','0','8','开启=1,关闭=0','100','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('71','watermark_file','水印图片','水印图片在250px以内','1', NULL,'8', NULL,'99','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('72','watermark_t','水印位置','参考键盘九宫格1-9','2','9','8', NULL,'98','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('73','watermark_tm','水印透明度','透明度越大,越难看清楚水印','6','0','8','不显示=0,10%=10,20%=20,30%=30,40%=40,50%=50,60%=60,70%=70,80%=80,90%=90','97','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('74','money_exchange','钱包兑换率','站内钱包与RMB的兑换率,即1元=多少金币','2','1','5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('75','jifen_exchange','积分兑换率','站内积分与RMB的兑换率,即1元=多少积分','2','100','5', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('76','isopenjifen','积分支付','开启积分支付后,商品可以用积分支付','6','1','5','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('77','isopenqianbao','钱包支付','开启钱包支付后,商品可以用钱包支付','6','1','5','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('78','isopenweixin','微信支付','开启微信支付后,商品可以用微信支付','6','1','5','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('79','isopenzfb','支付宝支付','开启支付宝支付后,商品可以用支付宝支付','6','1','5','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('80','login_award','每次登录奖励','每天登录奖励积分数,最小为0,每天登录只奖励一次','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('81','login_award_open','登录奖励','开启登录奖励后,登录后就会获得积分奖励','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('82','release_award_open','发布奖励','开启后,发布内容会奖励积分','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('83','release_award','每次发布奖励','每次发布内容奖励积分数','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('84','release_max_award','每天发布最高奖励','每天奖励不超过积分上限,设置0则无上限','2','0','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('85','collect_award_open','收藏奖励','开启后,发布内容被收藏会奖励积分','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('86','collect_award','每次收藏奖励','每次发布内容被收藏奖励积分数','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('87','collect_max_award','每天收藏最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('88','likes_award_open','点赞奖励','开启后,发布内容被点赞会奖励积分','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('89','likes_award','每次点赞奖励','每次发布内容被点赞奖励积分数','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('90','likes_max_award','每天点赞最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('91','comment_award_open','评论奖励','开启后,发布内容被评论会奖励积分','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('92','comment_award','每次评论奖励','每次发布内容被评论奖励积分数','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('93','comment_max_award','每天评论最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('94','follow_award_open','关注奖励','开启后,用户被粉丝关注会奖励积分','6','1','7','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('95','follow_award','每次关注奖励','每次被关注奖励积分数','2','1','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('96','follow_max_award','每天关注最高奖励','每天关注奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('97','isopenemail','发送邮件','是否开启邮件发送','6','1','4','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('98','closeweb','关闭网站','关闭网站后,前台无法访问,后台可以进入','6','0','1','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('99','closetip','关站提示', NULL,'3','抱歉!该站点已经被管理员停止运行,请联系管理员了解详情!','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('100','admin_save_path','后台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('101','home_save_path','前台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('102','isajax','是否开启前台AJAX','开启后AJAX,前台可以通过栏目链接+ajax=1获取JSON数据','6','0','2', '开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('104','invite_award_open','是否开启邀请奖励','开启邀请后则会奖励','6','0','7', '开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('105','invite_type','邀请奖励类型', NULL,'6','jifen','7', '积分=jifen,金币=money','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('106','invite_award','邀请奖励数量', NULL,'0','0','0', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('107','web_phone','网站手机', NULL,'2','0','1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('108','web_weixin','站长微信', NULL,'1', NULL,'1', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('110','isregister','前台用户注册','关闭前台注册后,前台无法进入注册页面','6','1','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('111','onlyinvite','仅邀请码注册','开启后,必须通过邀请链接才能注册!','6','0','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('112','release_table','允许前台发布模块','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割','2','article|product','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('113','search_words','前台搜索的字段','可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割','2','title','3', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('114','closehomevercode','前台验证码','关闭后,登录注册不需要验证码','6','0','2','关闭=1,开启=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('115','closeadminvercode','后台验证码','关闭后,后台管理员登录不需要验证码','6','0','2','关闭=1,开启=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('116','tag_table','TAG包含模型','在tag列表上查询的相关模型,多个模型标识可用|分割,如:article|product','2','article|product','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('118','isopendmf','支付宝当面付', NULL,'6','1','5','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('119','search_words_muti','前台多模块搜索的字段','多个模块直接必须都有相同的字段,否则会报错','3','title','3', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('120','search_table_muti','多模块允许搜索的表','防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如:article|product','2','article|product','3', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('121','search_fields_muti','允许查询显示的字段','多模块搜索允许查询显示的字段','3','id,tid,litpic,title,tags,keywords,molds,htmlurl,description,addtime,userid,member_id,hits,ownurl,target','3', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('122','ueditor_user_config','前台编辑器设置','前台的编辑器功能菜单设置','3','"undo", "redo", "|","paragraph","bold","forecolor","fontfamily","fontsize", "italic", "blockquote", "insertparagraph", "justifyleft", "justifycenter", "justifyright","justifyjustify","|","indent", "insertorderedlist", "insertunorderedlist","|", "insertimage", "inserttable", "deletetable", "insertparagraphbeforetable", "insertrow", "deleterow", "insertcol", "deletecol","mergecells", "mergeright", "mergedown", "splittocells", "splittorows", "splittocols", "|","drafts", "|","fullscreen"','2', NULL,'1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('123','article_config','内容配置', NULL,'3','{"seotitle":1,"litpic":1,"description":1,"tags":1,"filter":"title,keywords,body"}','0', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('124','product_config','商品配置', NULL,'3','{"seotitle":1,"litpic":1,"description":1,"tags":1,"filter":"title,keywords,body"}','0', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('125','isdebug','PHP调试','测试环境,开启调试,提示错误,实时更新模板。正式上线,请关闭调试,打开页面更快。','6','1','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('126','plugins_config','插件配置', NULL,'2','http://api.jizhicms.cn/plugins.php','0', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('127','template_config','插件配置', NULL,'2','http://api.jizhicms.cn/template.php','0', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('128','closesession','前台SESSION','关闭前台SESSION后,前台会员模块无法使用,但是可以减少session缓存文件。纯内容网站可以关闭,使用会员支付等必须开启','6','0','2','关闭=1,开启=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('129','messageyzm','留言验证码','开启后,前台留言需要填写验证码','6','1','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('130','homerelease','前台发布审核','开启后需要后台审核,关闭则不需要','6','1','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('131','hideclasspath','栏目隐藏.html','开启后栏目链接将没有.html后缀','6','0','2','开启=1,关闭=0','0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('132','classtypemaxlevel','栏目全局递归','默认开启,栏目超过20个,请关闭此选项,有一定程度提升访问速度!','6','0','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('133','hidetitleonliy','字段重复检测', '将【模块标识-检测字段】填写进去,用|进行分割,将会进行标题重复检测。如:article-title|product-title','2','article-title|product-title','2', NULL,'0','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('134','onlyuserupload','会员上传限制','开启后,仅会员才可以上传!受会员上传大小限制!','6','1','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('135','cachefilenum','缓存文件数','0表示不限制,最大不超过500','2','100','0',null,0,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('136','watermark_word','水印文字','只有没有水印图片的时候才生效','2','这个是水印文字','8',null,96,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('137','watermark_font','水印字体','默认Alibaba-PuHuiTi-Bold.ttf,存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,95,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('138','watermark_size','水印大小','默认24','2','24','8',null,94,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('139','watermark_h','水印行高','默认34','2','34','8',null,93,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('140','watermark_rgb','水印颜色','默认白色:#FFFFFF','2','#FFFFFF','8',null,92,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('141','watermark_x','水印微调X','相对水印位置再进行X轴微调,默认0','2','0','8',null,91,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('142','watermark_y','水印微调Y','相对水印位置再进行Y轴微调,默认0','2','10','8',null,90,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('143','text_waterlitpic','缩略图标题水印','文章缩略图进行水印文章标题,开启后生效','6','0','8','开启=1,关闭=0',89,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('144','text_litpic','默认缩略图','当文章没有缩略图的时候生效','1',null,'8',null,88,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('145','text_molds','支持模型','填写模型标识,如:article,product','2','article,product','8',null,87,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('146','text_num','每行文字数','默认10个字','2','10','8',null,86,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('147','text_size','文字大小','默认24','2','24','8',null,85,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('148','text_h','文字行高','默认34','2','34','8',null,84,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('149','text_rgb','文字颜色','默认白色:#FFFFFF','2','#FFFFFF','8',null,83,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('150','text_font','文字字体','默认Alibaba-PuHuiTi-Bold.ttf,存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,82,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('151','text_wz','水印位置','九宫格1-9,默认5中间','2','5','8',null,81,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('152','text_x','微调X','相对于水印位置再进行X轴微调,默认0','2','0','8',null,80,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('153','text_y','微调Y','相对于水印位置再进行Y轴微调,默认0','2','0','8',null,79,'1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('154','islocal','是否开启图片本地化','图片本地化可以将内容的外网图片保存到服务器','6','1','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('155','openredis','是否开启Redis','开启Redis后可以使用token登录前台账户,但必须服务器安装了Redis,在config里面需要配置redis信息','6','0','2','开启=1,关闭=0','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('156','sitemap_config','sitemap配置','用于sitemap生成','3','a:3:{s:9:"page_size";i:10000;s:7:"tagsurl";s:19:"/tags/index?id={id}";s:8:"filetype";s:3:"xml";}','0','','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('157','schedule_table','定时发布表','带有addtime发布时间字段的表才可以使用定时发布功能,用|分隔','3','article|product','2','','1','1');
INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('158','upload_file_name','上传文件重命名','上传文件后是否重命名,默认开启重命名,关闭后上传文件名不会变','6','1','2','开启=1,关闭=0','1','1');
-- ----------------------------
-- Records of jz_tags
-- ----------------------------
INSERT INTO `jz_tags` (`id`,`tid`,`orders`,`comment_num`,`molds`,`htmlurl`,`keywords`,`newname`,`num`,`isshow`,`target`,`number`,`member_id`,`ownurl`,`tags`,`addtime`) VALUES ('1','0','0','0','tags', NULL,'SEO', NULL,'-1','1','_blank','4','0', NULL, NULL,'0');
-- ----------------------------
-- Records of jz_task
-- ----------------------------
INSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('1','8','2','1','1','article','reply',' @iPHfa6 干得漂亮!','http://www.19x.mm/znxw.html','1','1','0','1642932172');
INSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('5','6','9','0','1','product','likes','PC+手机绿色医疗生物化工网站模板','http://www.19x.mm/free/9.html','0','1','0','1642946653');
INSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('6','7','8','0','1','product','likes','手机端黄色五金机电网站模板','http://www.19x.mm/business/8.html','0','1','0','1642946655');
INSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('11','6','10','0','1','product','collect','蓝色小程序鲜花礼物广告设计网站模板','http://www.19x.mm/free/10.html','0','1','0','1642947563');
INSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('10','7','7','0','1','product','collect','响应式红色软件公司网站模板','http://www.19x.mm/business/7.html','0','1','0','1642946850');
================================================
FILE: install/tpl/css/ui.progress-bar.css
================================================
@-webkit-keyframes animate-stripes { from {
background-position:0 0
}
to { background-position: 44px 0 }
}
.ui-progress-bar {
position: relative;
height: 35px;
padding-right: 2px;
background-color: #abb2bc;
border-radius: 35px;
-moz-border-radius: 35px;
-webkit-border-radius: 35px;
background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #b6bcc6), color-stop(1, #9da5b0));
background: -moz-linear-gradient(#9da5b0 0, #b6bcc6 100%);
-webkit-box-shadow: inset 0 1px 2px 0 rgba(0,0,0,0.5), 0px 1px 0 0 #FFF;
-moz-box-shadow: inset 0 1px 2px 0 rgba(0,0,0,0.5), 0px 1px 0 0 #FFF;
box-shadow: inset 0 1px 2px 0 rgba(0,0,0,0.5), 0px 1px 0 0 #FFF
}
.ui-progress {
position: relative;
display: block;
overflow: hidden;
height: 33px;
-moz-border-radius: 35px;
-webkit-border-radius: 35px;
border-radius: 35px;
background-color: #74d04c;
-webkit-box-shadow: inset 0 1px 0 0 #dbf383, inset 0 -1px 1px #58c43a;
-moz-box-shadow: inset 0 1px 0 0 #dbf383, inset 0 -1px 1px #58c43a;
box-shadow: inset 0 1px 0 0 #dbf383, inset 0 -1px 1px #58c43a;
border: 1px solid #4c8932;
-webkit-background-size: 30px 30px;
-moz-background-size: 30px 30px;
background-size: 30px 30px;
background-image: -webkit-gradient(linear, left top, right bottom, color-stop(.25, rgba(255, 255, 255, .15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255, 255, 255, .15)), color-stop(.75, rgba(255, 255, 255, .15)), color-stop(.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -ms-linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-webkit-animation: animate-stripes 1s linear infinite;
-moz-animation: animate-stripes 1s linear infinite;
}
.ui-progress span.ui-label {
font-size: 1.2em;
position: absolute;
right: 0;
line-height: 33px;
padding-right: 12px;
color: rgba(0,0,0,0.6);
text-shadow: rgba(255,255,255,0.45) 0 1px 0;
white-space: nowrap
}
================================================
FILE: install/tpl/footer.tpl
================================================
================================================
FILE: install/tpl/header.tpl
================================================
极致建站系统安装向导
================================================
FILE: install/tpl/index.jizhi
================================================
================================================
FILE: install/tpl/js/common.js
================================================
function TrBgChange(AreaId,OddClass,EvenClass){
var trs=document.getElementById(AreaId).getElementsByTagName("tr");
for(var i=1;i
'+(e?n.title[0]:n.title)+"":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e=''+n.btn[0]+" ",2===t&&(e=''+n.btn[1]+" "+e),''+e+"
"):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content=''+(n.content||"")+"
"),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"
':"")+'",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;odiv{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
================================================
FILE: install/tpl/layer/theme/default/layer.css
================================================
.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
================================================
FILE: install/tpl/step1.jizhi
================================================
运行环境需求
1.要求PHP5.6以上,建议使用7.0以上版本,本系统已支持PHP7.2,支持Windows和Linux主机
2.安装环境建议Linux服务器,当然Windows也是可以安装的,云服务器建议安装宝塔面板【查看 】
3.无论是Windows还是Linux建议安装Apache、mysql、phpMyAdmin配件
4.本系统目前仅支持mysql数据库,且数据库字符集必须是UTF-8或utf8_general_ci
安装环境
环境
当前
要求
PHP
5.6 ~ 7.4
路径
无中文字符
权限
opendir
目录权限
目录
当前
所需
安装目录/install/
可写
配置文件/conf/config.php
可写
缓存文件/cache/
可写
资源文件夹/static/
可写
备份文件夹/backup/
可写
不符合要求,不能安装!';
}else{
echo ' 开始安装 > > >';
}
?>
================================================
FILE: install/tpl/step2.jizhi
================================================
================================================
FILE: install/tpl/step3.jizhi
================================================
安装进度安装过程中请不要做其他操作,安装时间大约需要1分钟。
================================================
FILE: install/tpl/step4.jizhi
================================================
================================================
FILE: install/tpl/step5.jizhi
================================================
恭喜您,极致CMS的安装已经完成,网站上线要删除install文件夹
================================================
FILE: readme.txt
================================================
极致CMS 2.5.4 release
更新时间:2024-12-16
更新内容如下:
1. 修复添加购物车错误问题
2. 优化后台字段添加列表
3. 优化上传文件重命名问题,支持开启关闭重命名
4. 优化redis配置错误导致打不开问题
5. 留言支持cookie存储,前台关闭session也可以提交表单
6. 新增模板标签支持非系统表数据输出(筛选标签不支持)
7. 新增定时发布功能,需要系统配置填写允许开启的模型表
8. 开放CommonController控制器,让系统更加自由
9. 安全加固加密前后台登录
极致CMS 2.5.3 release
更新时间:2024-09-17
更新内容如下:
1. 增加更新字段updatetime
2. 增加检查点赞和收藏的功能
3. 优化生成sitemap
4. 增加英文语言包
极致CMS 2.5.2 release
更新时间:2024-08-25
更新内容如下:
1. 优化字段绑定和图库列表
2. 图片本地可以配置里面控制
3. 增加APP和Vue项目支持
4. 修复https导致无法生成静态页面的问题
5. 更换编辑器
极致CMS 2.5.1 release
更新时间:2024-02-26
更新内容如下:
1. 优化字段排序问题
2. 优化栏目缓存
3. 优化数据库备份
4. 优化自定义字段
5. 更换编辑器
6. 修复水印功能
7. 增加图片本地化处理
极致CMS 2.5.0 release
更新时间:2023-10-03
更新内容如下:
1. 解决并发问题
2. 优化系统配置排序
3. 区分前后台上传功能
极致CMS 2.4.9 release
更新时间:2023-08-25
更新内容如下:
1. 优化上传文件安全
2. 优化图片水印文字水印
3. 增加缩略图标题水印
极致CMS 2.4.8 release
更新时间:2023-03-20
更新内容如下:
1. 优化系统配置
2. 优化批量生成栏目
3. 修复sitemap格式
极致CMS 2.4.7 release
更新时间:2023-02-25
更新内容如下:
1. 优化上传文件后缀
2. 修复字段类型问题
3. 可完全自定义系统函数[conf/Functions.php],写到 FunctionsExt.php 里面即可
极致CMS 2.4.6 release
更新时间:2023-02-23
更新内容如下:
1. 优化系统安全
2. 字段增加绑定栏目类型
极致CMS 2.4.5 release
更新时间:2023-02-18
更新内容如下:
1. 百度编辑器安全问题
2. 优化系统缓存
极致CMS 2.4.4 release
更新时间:2023-01-04
更新内容如下:
1. 优化生成xml网站地图功能
2. 升级文件上传功能
3. 优化备份数据库
极致CMS 2.4.3 release
更新时间:2022-11-19
更新内容如下:
1. 优化生成xml网站地图功能
2. 修复友情链接查询报错
3. 优化用户体验
极致CMS 2.4.2 release
更新时间:2022-11-13
更新内容如下:
1. 修复前台会员多图出错问题
2. 修复新增字段报错
3. 修复layui图片不能选择icon、webp的bug
4. 加强数据安全措施
极致CMS 2.4.1 release
更新时间:2022-10-23
更新内容如下:
1. 优化自定义字段功能
2. 优化标题重复检测功能
3. 修复碎片化时间过期不失效问题
4. 修复评论中加评论不显示问题
极致CMS 2.4.0 release
更新时间:2022-09-29
更新内容如下:
1. 优化部分系统配置
2. 优化代码结构,去除无用配置
极致CMS 2.3.9 release
更新时间:2022-09-25
更新内容如下:
1. 优化后台留言详情模板
2. 优化前台ajax显示字段
3. 修复后台留言回复字段不显示问题
4. 优化新增栏目时的字段绑定
5. 优化前台表单字段显示
极致CMS 2.3.8 release
更新时间:2022-08-30
更新内容如下:
1. 取消自定义模块标题重复检测
2. 优化后台模板列表样式
3. 修复前台用户头像上传问题
4. 优化前台会员注册
极致CMS 2.3.7 release
更新时间:2022-08-24
更新内容如下:
1. 修复公共页数据问题
2. 增加列表推荐属性筛选功能
极致CMS 2.3.6 release
更新时间:2022-08-18
更新内容如下:
1. 修复公共主页数据错误
2. 修复后台获取内容第一张图片失效问题
3. 优化模板列表
极致CMS 2.3.5 release
更新时间:2022-08-10
更新内容如下:
1. 加固数据安全
2. 修复公共主页数据错误
极致CMS 2.3.4 release
更新时间:2022-08-04
更新内容如下:
1. 删除多余代码
2. 优化微信扫码登录
3. 优化模型发布时间
4. 安全加固
极致CMS 2.3.3 release
更新时间:2022-07-28
更新内容如下:
1. 优化前台会员收藏和点赞删除的内容
2. 优化支付宝H5支付
3. 优化自定义字段创建默认小写字母
4. 优化后台列表按钮用户体验
极致CMS 2.3.2 release
更新时间:2022-07-20
更新内容如下:
1. 修复商品取消属性不成功的问题
2. 优化配置项
3. 优化数据库备份类
4. 修复后台评论安全问题
5. 修复模板嵌套不解析问题
极致CMS 2.3.1 release
更新时间:2022-07-13
更新内容如下:
1. 修复系统配置自定义编辑器出错
2. 修改回收站存储格式为序列化存储
3. 优化手机号正则验证
4. 检查标题重复
极致CMS 2.3.0 release
更新时间:2022-07-05
更新内容如下:
1. 修复会员中心会员信息字段重复问题
2. 优化系统配置功能,允许配置到菜单
3. 新增配置栏目功能
4. 去除关于javascript的过滤
极致CMS 2.2.9 release
更新时间:2022-06-30
更新内容如下:
1. 修复内容模型切换栏目无法更新字段的问题
2. 优化会员模块和留言模块
3. tags前台增加hits字段
4. 会员中心更换jquery版本
5. 优化模型创建时间字段
6. 去掉前台PHP版本标识
7. 前台禁止操作管理员相关表
极致CMS 2.2.8 release
更新时间:2022-06-16
更新内容如下:
1. 优化代码,去除多余代码
2. 修复安装时后台地址错误问题
3. 导航模块增加图片
4. 优化后台管理员角色权限
极致CMS 2.2.7 release
更新时间:2022-06-02
更新内容如下:
1. 优化网站地图生成页面
2. 增加评论安全
极致CMS 2.2.6 release
更新时间:2022-05-27
更新内容如下:
1. 优化自定义URL
2. 解决筛选异常报错
极致CMS 2.2.5 release
更新时间:2022-05-19
更新内容如下:
1. 修复百度编辑器无法保存微信图片问题
2. 修复个别字段类型修改错误问题
3. 优化后台入口地址报错问题
极致CMS 2.2.4 release
更新时间:2022-05-12
更新内容如下:
1. 后台留言权限修复
2. tags代码优化
3. 搜索模板优化
4. 修复二级评论时间问题
5. 优化分页
极致CMS 2.2.3 release
更新时间:2022-05-04
更新内容如下:
1. 增加自定义模块批量修改推荐属性
2. 增加删除评论时减少评论统计数
3. 发布一个免费小程序
极致CMS 2.2.2 release
更新时间:2022-04-28
更新内容如下:
1. 修复收藏点赞功能问题
2. 修复个人中心收藏点赞计算错误问题
3. 优化layui表格修改时HTML转译的问题
极致CMS 2.2.1 release
更新时间:2022-04-21
更新内容如下:
1. 修复前台购买记录分页错误
2. 修复后台回收站列表无法设置每页条数
3. 新增tags能够记录相关栏目,可以根据栏目输出tags
4. 新增回收站删除标记
极致CMS 2.2.0 release
更新时间:2022-04-14
更新内容如下:
1. 修复模板评论上一页下一页无法翻页问题
2. 修复收藏删除功能
3. 优化自定义字段样式
4. 新增单入口功能,同时兼容多入口
5. 做单入口功能兼容
> 单入口:进入前后台都通过`index.php`,也可以通过自定义入口文件进行指定,默认后台地址:`/index.php/admins` 在 `index.php` 里面可以修改 `admins` 后台模块标识
极致CMS 2.1.4 release
更新时间:2022-04-08
更新内容如下:
1. 修复后台会员列表时间查询没有效果
2. 修复前台收藏列表的删除链接错误
3. 优化后台模型新增修改预览效果显示问题
4. 增加栏目全局递归的控制,优化加载速度
极致CMS 2.1.3 release
更新时间:2022-03-31
更新内容如下:
1. 前台发布模型限制
2. 修复后台测试扩展类
3. 美化支付页面
4. 修复首页loop分页第一页链接错误问题
5. 优化多选绑定
6. loop增加notlike查询
7. 优化后台模板列表
8. 优化会员分组模板及扩展字段显示
9. 优化后台插件列表操作提示
极致CMS 2.1.2 release
更新时间:2022-03-24
更新内容如下:
1. 优化点赞功能
2. 优化后台模板缓存数据
3. 修复前台多选绑定不显示
4. 修改扩展模型字段列表排序
5. 修复后台商品列表审批错乱
极致CMS 2.1.1 release
更新时间:2022-03-17
更新内容如下:
1. 优化分页功能
2. 优化网站地图
3. 优化错误提示
4. 优化关联字段显示
5. 修复后台模型是否显示预览功能
极致CMS 2.1.0 release
更新时间:2022-03-10
更新内容如下:
1. 修复自定义模型自定义模板无法找到的问题
2. 修复系统配置web_js无法显示问题
3. 优化安装细节
4. 修复单页模型自定义模板无法找到问题
5. 优化搜索模板兼容问题
6. 优化后台管理员模板
7. 修复自定义字段小数创建不了问题
8. 修复后台友情链接模板
极致CMS 2.0.9 release
更新时间:2022-03-03
更新内容如下:
1. 修复管理员栏目权限问题
2. 修复模板变量换成全局变量
3. 修复article表molds默认值为article
4. 修复用户公共页
5. 兼容PHP5.6版本
6. 修复编辑器不能下载远程图片的问题
7. 修复模型列表排序
8. 优化缩略图代码
9. 优化手机号验证代码
极致CMS 2.0.8 release
更新时间:2022-02-24
更新内容如下:
1. 修复新增模型推荐属性类型问题
2. 修复留言验证码后台设置无效问题
3. 修复后台栏目角色权限设置无效问题
4. 优化前台控制器代码
5. 优化日志记录问题
6. 修复模板部分不显示问题
7. 修复扩展文件未引入问题,兼容多种情况
8. 去除栏目.html模板名过滤问题,兼容.html和自定义后缀
9. 修复后台评论修改提交报错问题
极致CMS 2.0.7 release
更新时间:2022-02-17
更新内容如下:
1、修复tags显示问题
2、优化系统配置点击复制功能
3、修复前台用户发布问题
4、修复推荐属性输出问题
5、修复桌面设置问题
6、修复插件列表显示问题
极致CMS 2.0 release
更新时间:2022-02-01
更新内容如下:
1.优化后端模板
2.增加后台安装模板模块
3.所有字段列表可以控制显示
4.多模块搜素可以指定字段
5.增加副栏目功能
6.自定义模型前台发布可以后台控制
7.文章/商品模型获取缩略图、tags和简介截取字段内容功能界面可以控制
8.网站地图生成,取消前台生成sitemap,只后台生成
9.前端编辑器设置
10.回收站
11.栏目权限控制
12.支持定义搜索不同模型不同结果页(全局搜索除外)
13.模块列表设置排序,字段管理设置是否显示
14.收藏点赞重构,增加两个表likes和shouchang
15.编辑器相对路径图片
16.缓存时间设置问题进行了优化
17.【已修复】自定义链接更改栏目的时候没有同步更改数据
18.用户头像固定格式存储,覆盖方式
19.置顶推荐热点等功能可以创建,增加了attr推荐属性表,原来的ishot,istuijian,istop字段已废弃,但是前台loop参数依旧可用
20.内链用新表,不要放到tags里面,增加了chain表
21.前台自定义模型发布内容有问题。自定义模型可以后台设置
22.栏目权限问题,可以选择多个
23.栏目排序已修复
24.评论点赞数类型换成int
25.【已修复】内容评论字符串小图标问题
26.【已修复】微信H5支付问题
27.安装进度条优化,完成后将进度条隐藏
28.系统配置增加了自定义配置栏问题
29.桌面设置重新处理,可以单独设置菜单的名称
30.增加了后台模板自定义配置的文件格式,可以自动调用自定义模板
31.增加了插件接口及模板接口自定义,可自由接入不同的供应商插件和模板接口
32.更换了layui框架版本v2.6.8,将后台的layui转移到了static/common/layui下面
33.调整系统目录结构
极致CMS Beta1.9.5
更新时间:2021-04-26
更新内容如下:
修复:后台管理安全问题
修复:开启httponly
修复:数据库备份大小计算不准确
修复:后台错误返回页叠加问题
修复:json数据返回中文乱码问题
修复:前台邀请注册无效及增加积分出错问题
修复:loop缓存设置失效问题
极致CMS Beta1.9.4
更新时间:2021-03-09
更新内容如下:
修复:静态HTML生成问题
修复:导航缓存问题
修复:管理员列表分页数无法设置
优化:session缓存时间
优化:404页面返回404状态
优化:模块中设置栏目不是必选,字段可以在全局栏目使用
优化:栏目模板可以手动填写
优化:图集多附件字段默认text类型
新增:后台角色可以设置发布审核
极致CMS Beta1.9.3
更新时间:2021-01-10
更新内容如下:
修复:后台订单计算错误问题
修复:面包屑导航错误
修复:立即支付积分钱包计算
修复:碎片化时间计算错误
修复:系统设置个别配置设置错误
修复:其他管理员会员分组无法看见
修复:微信支付提交模板错误
修复:字段列表全部显示错误
修复:多图字段左右排序错误
修复:静态HTML生成时分页链接错误
优化:插件安装及列表
优化:字段列表去除分页,过滤栏目
优化:自定义导航太多而溢出问题
优化:自定义图片截取
优化:入口文件错误提示
优化:删除大量重复代码
优化:栏目数据缓存
优化:后台可预览未审核的内容
优化:普通管理员不能查看超级管理员登录记录
优化:栏目缓存
新增:对模板助手插件内置函数支持
新增:可以设置js更新点击量
新增:可自定义设置后台主页模板
新增:支持PHP8
新增:分页可以使用$currentpage输出当前页码
极致CMS Beta1.9.2
更新时间:2020-12-02
更新内容如下:
修复:多模块搜索缺少litpic字段
修复:sqlite后台管理员无法编辑修改
修复:生成静态无法清理文件夹
修复:取消关注失败,计算关注数不对
修复:个人中心头像无法修改
优化:栏目支持动态更改排序规则,分页不会出错
优化:支持自定义模板存放目录
优化:栏目列表按权限输出
优化:后台导航增加删除按钮
新增:留言支持列表,支持查看详情
极致CMS Beta1.9.1
更新时间:2020-11-18
更新内容如下:
修复:后台自定义模块tags无法修改的问题
修复:桌面设置-新增的时候缺少栏目
修复:自定义链接修改问题
修复:后台验证码隐藏
修复:自定义栏目URL无法生产静态HTML
修复:关键词tags,中文逗号替换
优化:自定义模块时间参数默认显示
优化:新增模块想办法增加几个默认字段
优化:loop自定义分页标识jzpage需要更改
优化:检测插件安全目录
优化:前台个人主页支持ID传输 如:/user/active/uid/[会员ID]
新增:自定义字段增加动态多行输入
极致CMS Beta1.9
更新时间:2020-10-24
更新内容如下:
修复:友情链接权限
修复:积分金币充值问题
修复:面包屑导航错误
修复:自定义路由错误
修复:loop notempty查询问题
修复:后台插件数据保存不能获取数据
修复:购物车折扣错误
修复:百度编辑器无法自动下载图片
修复:百度编辑器多图上传bug
修复:生成静态HTML时出错
修复:后台无法下载插件问题
修复:前台图集问题
修复:后台录入英文不过滤空格
优化:图形验证码
优化:系统后台界面美化
优化:百度编辑器图片按时间排序
优化:系统配置加载太慢的问题
优化:后台模板多余内容
优化:前台搜索查询
优化:前台tag查询
优化:模板标签大小写不敏感问题
优化:自定义模块栏目未选显示所有字段
优化:分页页码输出
优化:系统菜单功能文字
优化:自定义路由?后面的参数加进来
优化:后台搜索
新增:图集可以进行排序
新增:大数据碎片化
新增:导航设置
新增:系统配置增加单选开关及栏目选项
新增:自定义缩略图功能
新增:前台点击量可以JS处理
新增:前台可以不登录点赞
新增:支付宝当面付功能
新增:网站可以跳过购物车直接购买
新增:前台搜索相关字段可以后台控制
新增:自定义模块可以添加TAG
新增:前后台验证码可以关闭
新增:桌面设置可以设置指定栏目到菜单
极致CMS Beta1.8.1
更新时间:2020-07-30
更新内容如下:
1、修复:前台自定义时间字段显示问题
2、修复:编辑器视频无法编辑
3、修复:批量删除时自定义URL未删除
4、修复:多附件字段只能上传图片
5、修复:前台注册后登录还跳到注册页面
6、修复:系统配置release_table模板写错参数
7、修复:支付宝支付回调检测错误
8、修复:友情链接分类删除出错
9、修复:tags表缺少member_id字段
10、修复:系统配置统计代码过滤问题
11、优化:友情链接权限分配
12、优化:过滤参数规则
13、优化:新增字段默认排序改为2
14、优化:留言自定义字段根据栏目区分
15、优化:订单内容可以修改自定义字段内容
16、优化:更改系统数组分页逻辑
17、新增:栏目可以设置关闭,关闭后前台不会显示也不能打开
极致CMS Beta1.8
更新时间:2020-06-30
更新内容如下:
1、修复:系统模板目录变更问题
2、修复:删除前台支付多余代码
3、修复:缓存域名唯一性
4、修复:数据库恢复在Linux存在报错
5、修复:自定义URL后面加参数报404错误
6、修复:文章字数限制错误提示
7、修复:官方模块默认模板
8、修复:官方模板个人中心自定义图片字段无法上传的问题
9、修复:官方自定义字段前台图片上传问题
10、修复:微信支付宝支付存在的bug
11、修复:修复分页列表数为0时报错问题
12、修复:sqlite版本字段修改失败的问题
13、修复:后台新增管理员字段报错
14、修复:多处存在XSS漏洞
15、优化:后台列表第一页与最后一页显示问题
16、优化:后台订单总金额显示异常
17、优化:数据库报错直接写入文件,不再显示页面
18、优化:点赞收藏积分奖励
19、优化:后台商品默认库存
20、优化:API数据插件增加发布和更新
21、新增:栏目SEO标题
22、新增:前台发布模块限制
23、新增:根目录robots
24、新增:QQ登录插件加入邮箱验证
25、新增:栏目列表增加发布快捷键
26、新增:前台模板标签loop增加分页标识
27、新增:独立友情链接模块,并增加友情链接分类
极致CMS Beta1.7.1
更新时间:2020-05-25
更新内容如下:
1、修复:开启层级URL后,自定内容URL报404
2、修复:检查默认字段是否存在
3、修复:栏目列表,新增下级栏目,无法关联上级
4、修复:后台列表修改退回选项
5、修复:前台发布数据库报错
6、修复:foreach计数时{foreach $list as $v} $v与}不能隔开
7、修复:后台栏目修改时,单页无法自动读取模板
8、修复:管理员回复评论后台编辑框丢失
9、修复:管理员回复不能通知前台用户
10、修复:后台栏目新增字段,新增栏目时不能直接显示字段
11、修复:新增自定义配置后,前台{$webconf}不能立即调用
12、修复:留言/评论数限制问题
13、修复:微信登录注册bug
14、修复:系统支付功能
15、修复:Screen标签View.php里面变量参数bug
16、修复:后台商品列表无法筛选子栏目
17、修复:前台发布提交相关问题
18、修复:验证码兼容大小写
19、修复:时间字段筛选不准确
20、优化:新增时间插件会无法选择时间
21、优化:后台子管理员创建角色可以选择角色
22、优化:去除安装时的修改后台文件名
23、优化:自定义模块编辑内容的时候栏目被编辑器挡住
24、优化:后台首页换一个列表
25、优化:系统兼容php7.4
26、优化:前台注册随机用户名,取消手机号作为用户名
27、新增:栏目修改也增加提示是否取消
28、新增:后台插件列表插件所属平台、插件搜索功能
29、新增:新增字段能列表更改排序
30、新增:前台邀请注册送奖励
31、新增:前台注册可以后台关闭
32、新增:前台注册仅限通过邀请链接进入注册
33、新增:其他平台支付接入点
34、新增:系统配置-增加手机号码、微信二维码
35、新增:系统模板目录可更改
36、新增:管理员模块按照分组输出扩展字段
37、新增:栏目增加关闭及批量处理功能
38、新增:分离编辑器,可扩展自定义编辑器
39、新增:图集/多附件增加文字描述
40、新增:桌面设置增加复制功能
41、新增:默认模板里增加tags相关页面
42、新增:loop增加sql参数,参考帮助文档了解使用
极致CMS Beta1.7
更新时间:2020-04-28
更新内容如下:
1、修复:后台订单支付状态修改无效
2、修复:前台不显示充值钱包记录
3、修复:商品库存下单不减少
4、修复:评论后台管理员无法回复
5、修复:ArrayPage修复next下一页链接
6、修复:自定义模块列表分页不受控制
7、修复:人性化时间显示问题
8、修复:新建栏目字段绑定会失效
9、修复:前台上传的图片没有记录文件后缀
10、修复:个人中心发布内容扩展信息无法记录
11、修复:去掉富文本截屏插件
12、修复:后台充值分页错误
13、修复:核心文件中配置读取有错误
14、修复:后台用户删除没有写返回
15、修复:后台评论栏目显示不全
16、修复:前台message ajax提交返回code=1为success
17、修复:顶部导航点击菜单不能新增tab
18、修复:后台列表分页数量设置无效
19、修复:新增模块列表未固定右侧编辑菜单
20、优化:插件模块
21、优化:系统配置模板可以下拉选择
22、优化:系统模块不允许修改模块标识
22、优化:批量新增栏目更改形式
23、优化:友情链接、TAG可以不受栏目权限限制
24、优化:错误信息提示隐藏路径问题
25、优化:更改系统文件上传处理
26、优化:统一配置输出,原$customconf依旧可以使用
27、优化:前台栏目发布检测分类授权
28、优化:商品表增加molds字段
29、优化:后台提交按钮部分页面浮动
30、优化:后台内容修改取消自动跳转
31、优化:sqlite版本链接数据库换用sqlite3
32、优化:文章商品简介过多提示修改
33、优化:静态HTML生成
34、优化:后台从内容获取简介优化去除空格
35、优化:后台编辑器转为static/common/user/uedit
36、优化:自动生成静态html
37、优化:系统生成缓存的方法
38、新增:关闭网站功能,关闭页面模板static/common/close.html
39、新增:自定义配置增加编辑器
40、新增:模块增加默认模板
41、新增:可控制栏目绑定模块
42、新增:可控制栏目是否受权限限制
43、新增:可控制栏目是否在该模块显示
44、新增:可控制栏目是否必选
45、新增:foreach标签加计数器
46、新增:可控制栏目是否在该模块显示
47、新增:上传文件目录更改,富文本编辑器上传需手动更改
48、新增:loop模板标签增加in字段,可范围内查询,支持变量
49、新增:增加ajax数据获取的安全性,后台可关闭
50、新增:增加字段安全性,可针对新增字段进行设置前台ajax获取权限
51、新增:文章/商品/自定义模块详情页均可自定义URL
52、新增:文章/商品/自定义模块详情页均可添加外链
53、新增:前台敏感词提示
54、新增:sitemap动态生成
55、新增:增加rss订阅,访问:http://域名/home/rss
56、新增:栏目列表页排序增加多种形式
57、新增:栏目列表页排序前台可提交对应的形式参数(orders:1~7)值进行动态设置
58、新增:新增模块增加多个默认字段[addtime:新增时间 hits:点击数 istop:是否置顶 target:外链 ownurl:自定义URL]
59、新增:默认字段不允许删除,可进行隐藏
60、新增:管理员角色组模块加上是否受栏目权限控制
61、新增:管理员列表加上所属角色组
62、新增:搜索页面数量控制,只需要提交参数时加上limit参数即可设置列表数
63、新增:栏目URL后缀.html可以去掉[系统设置-高级设置]
极致CMS Beta1.6.7
更新时间:2020-03-26
更新内容如下:
1、修复:内容页下一篇上一篇问题
2、修复:后台评论修改返回json
3、修复:前台提交的内容审核时报错
4、修复:前台发布退回改为未审核
5、修复:前台用户信息提醒页面
6、修复:本地自定义插件后台未引入
7、修复:后台创建用户分组时报错(sqlite)
8、修复:解决服务器多文件部署上传图片根目录问题
9、优化:引入模板文件报错提示
10、优化:后台个人信息修改页面
11、优化:前台登录返回登录的地方
12、优化:前台订单删除增加安全过滤
13、优化:前台评论删除增加安全过滤
14、优化:个人中心页面
15、优化:优化分页
16、优化:更改系统报错等级
17、优化:安装指引
18、优化:栏目模板选择
19、新增:后台LOGO系统配置项
极致CMS Beta1.6.6
更新时间:2020-03-07
更新内容如下:
1、修复扩展字段小数类型bug
2、修改模板缓存文件名为32位字符串
3、兼容links模块中url存在而导致链接覆盖的问题
4、修复前台留言无法获取扩展字段问题
5、修复前台ArrayPage数组分页类分页错误
6、实现后台插件列表在线下载安装插件
7、增加前台后台录入内容安全过滤
*8、sqlite版本修复内容样式无法保存的bug(实际上保存了,显示的时候有问题)
极致CMS Beta1.6.5
更新时间:2020-02-15
更新内容如下:
1、修复M函数传递表名问题
2、修复新增字段前台显示必选字段未验证问题
3、新增后台栏目权限设置,可以给管理员分组设置允许访问的栏目
极致CMS Beta1.6.4
更新时间:2020-01-02
更新内容如下:
1、修复手机模式下,后台首页提示报错
2、修复插件文件夹存在zip压缩包报错
3、修复后台定时器,保持后台session持续
4、修复后台留言详情页,提交时ip被修改的错误
5、修复后台模板风格-原始-关闭阴影点击触发关闭窗口
6、修复数据库新增内容的时候,不能录入空而导致无法新增的bug
7、更改hook方式,防止数据库反斜杠丢失带来错误
8、取消U方法首字母大写转换,按原字母大小写
9、截取字符串的时候,将 空格过滤
10、增加动态访问链接实现
11、修复empty和notempty不处理null的问题
12、修复loop中like查询,并增强like查询,支持格式:like='字段|关键词',like='字段1|关键词1,字段2|关键词2',like='字段1|变量1',like='字段1|变量1,字段2|变量2',like='字段1|关键词1,字段2|变量'
13、loop可以使用limit从第几条开始输出,如:limit="1,10",输出10条,从第2条开始输出,需要注意一点,limit="开始数,输出条数",数据库是从0开始计数的,也就是从第一条输出是这样的:limit="0,10"
14、修复开启层级URL后,栏目修改父类时,子栏目URL不更改
15、修改模板错误提示,去除绝对模板路径,只显示相对模板路径
16、loop标签新增一个day参数,按天调用数据,如:最近1天、3天、7天这种调用,可以{loop xxx day="1" as="$v"}【该方法由群友分享,昵称:MingTian】
17、修复栏目新增字段绑定bug,栏目页面没有新增字段显示问题
18、修复插件模块Home/plugins/HomeController->jizhi无效的bug
19、备份数据库列表不再显示副本
20、修复数据库导入副本顺序错误问题
21、修复tags分页及系统Page分页类优化
22、数组分页类增加自定义分页输出
23、多模块搜索和tags标签增加pagelist分页数组参数,可自定义输出分页
24、后台增加$classtypedata全局栏目
25、loop循环支持省略table参数,但必须同时要填写tid数值,tid可以写多个,但以第一个数值的栏目绑定模块为主。支持:{loop tid="2" isshow="1" as="v"}、{loop tid="2,3,4" isshow="1" as="v"}(table默认为栏目id=2的模块)、{loop tid="$tid" isshow="1" as="v"}(如果$tid为一个栏目ID数值)
26、修改清除静态文件按钮的颜色
27、修改网站上传大小限制,后台设定的大小单位为MB
28、修改上传文件功能,修改pictures表字段
30、增强缓存文件安全性
31、新增上传图片水印功能
32、增强系统安全
33、修复loop标签字符串变量传递报错问题
34、丰富完善个人中心模块(特别感谢:舒彬琪1651978720 提供的个人中心模板)
35、增加二级目录可执行功能
极致CMS Beta1.6.3
更新时间:2019-11-25
更新内容如下:
1、调试模式开关增加到后台系统配置
2、留言审核及评论审核权限增加到后台系统配置
3、文章/商品/留言/评论/自定义 五个模块增加批量审核功能
4、文章/商品/留言/评论/自定义 五个模块列表增加自适应屏幕界面美化(导出功能也美化下)
5、文章模块增加敏感词检测(标题,SEO标题,关键词,内容,简介),敏感词增加到系统配置
6、文章/商品 模块增加快速修改标题功能
7、自定义字段(select)增加输入检索功能,美化用户体验
8、修复支付页面提交缺少提交数据的HTML模板demo页
9、优化后台首页
10、修复管理员后台点击分组报错问题
11、修复数据库导出可能出现乱码bug
12、去除前台推荐属性置顶的全局置顶
13、美化后台界面
14、优化后台图片管理删除不存在的文件导致报错问题
15、增加统计点赞(jz_zan)收藏(jz_collect)的函数
极致CMS Beta1.6.2
更新时间:2019-11-13
更新内容如下:
1、修复栏目跳转链接修改时为空的bug
2、更改推荐属性字段类型为varchar
3、修复get_domain有时候ssl无法判断的bug
4、修复层级分类栏目的小bug
5、修改字段的时候,关联栏目数值未赋值的bug
6、修改插件的用户权限审核,多处文件修改
7、自动更新静态时,首页报错的bug
8、修复后台无法创建管理员账户的bug
9、修复手机模式栏目URL出错的bug
10、增强数据库数据承受能力及更新静态HTML时导致内存溢出的bug
11、修复数据库备份太多数据出错的bug
12、修复安装程序时出现数据库乱码的bug
13、修复安装时候填入账号密码无效的bug
14、修复session存储文件夹不存在导致的错误
15、FrPHP框架默认配置删除多余字符
16、新增tags详情输出
17、新增用户中心发布文章模块
18、新增安装cms时,可以自动创建数据库
19、修复拉栏目缓存问题
20、去除文章模块和商品模块的全局置顶
21、修复新增后台桌面时设置不生效的bug
22、修改关联字段格式化数据显示
极致CMS Beta1.6.1
更新时间:2019-10-19
更新内容如下:
1、去除多余InnoDB,有时候会导致数据库导入出错
2、修复留言json返回状态码code错误
3、修复ajax登录可能出现Notice:Undefined index:return_url错误
4、修改插件列表提示语
5、修改网站多域名绑定模板插件中模板显示不全问题,更改为手动填写
6、修复loop循环classtype表嵌套其他表循环时URL出错
7、增强TAG标签功能。
* 文章模块和商品模块发布时可以填写tags标签
* 前台具有标签聚合功能,标签聚合页tags.html,标签详情页tags-details.html,存放路径跟模板中主页index.html同级
* 标签控制器Home/TagsController.php
* 标签列表跟栏目列表页一样,数据数组是$lists,默认每页数据是100条,可以在控制器中手动修改,建议tags.html中{fun dump($pages)}了解分页结构,也可以在扩展类FrPHP/Extend/ArrayPage.php中修改你想要的分页结构
8、修复自定义页面有时候无法正确读取的问题
9、美化自定义图集字段模板界面
极致CMS Beta1.6
更新时间:2019-10-10
更新内容如下:
1、修改后台列表为数据表格
2、加强生成静态文件功能,可以分别生成手机端和电脑端静态文件,可以自动生成静态文件
3、新增插件-系统API接口,实现API数据查询
4、新增插件-独立静态网站,生成独立静态网站,更加安全可靠!
5、美化后台界面,搜索栏可折叠
6、加强后台管理员权限分配功能
7、新增文章/商品模块置顶、推荐、热点三个内容属性
8、新增URL层级格式,新增栏目的时候自动添加层级,修改的时候会显示所有层级URL
9、新增扩展字段内容显示权限控制,可以在基础信息下显示扩展信息
10、新增缓存页面功能控制,可关闭以保证空间容量
11、修改前台缓存页面格式,增加安全性
12、修复新增桌面时前端js效果错误
13、新增自定义单页,将单页文件放置在模板内的page文件夹内,文件名即为访问链接
14、新增系统配置中高级配置、邮箱订单、支付配置、公众号绑定等权限设置
15、添加Blog桌面配置、基础建站桌面配置供大家参考
极致CMS Beta1.5.2
更新时间:2019-09-28
更新内容如下:
1、修复筛选字段bug
2、添加上传文件后缀限制
3、新增推荐属性功能
4、修复产品新增的时候,弹出窗口点击确认会跳转到错误页面的bug
5、修复栏目新增字段不受绑定栏目控制的bug
6、增加栏目外链功能
7、美化前台上传图片样式,修复多图上传删除按钮失效bug
8、增加js方法帮助删除自定义上传图片
9、美化自定义上传图片样式
10、删除栏目的时候没有判断子栏目是否存在
11、修复由于开启缓存导致ajax=1不返回json数据
12、修复批量添加栏目的时候没有限制隐藏模块,修复新增字段fieldtype=12时筛选未起作用
13、修复screen筛选链接出错问题
14、修复由于github打包存在空文件不打包而导致程序执行错误问题
15、修复缓存获取的时候文件找不到
16、解决install检测出不符合安装的条件还能继续安装,新增栏目、轮播图分类列表notice错误,系统设置扩展字段不能上传图片bug
17、修复轮播图不能修改扩展字段内容bug
18、新增系统配置网站SEO网址,便于SEO优化
19、修复修改详情时导致用户权限消失,优化功能
极致CMS Beta1.5
更新内容如下:
1、修复修改字段时无法更改字段内容bug
2、修改loop循环的时候page分页链接去除.html后缀
3、修复前台获取自定义字段有的字段没有被获取到
4、修复loop循环中$type['id']时报错
5、修复个人中心订单及评论数错误显示
6、新增字段增加关联模块类型,并修复新增字段时提示偶然错误bug[FieldsController.php]
7、修复安装时出现缓存文件夹不存在和数据库未创建而直接连接数据库导致的错误
8、美化textarea及修复新增字段bug
9、修复新增字段编辑器类型不显示bug
10、修复登录的时候如果没有HTTP_REFERER提示的Notice
11、修复后台新增用户没有用户分组选项
12、修复修改详情时导致用户权限消失,优化功能
13、修复详情页上一页下一页输出问题
14、配置文件新增domain网站SEO网址
15、安装数据库添加v1.5版本及相关sql
极致CMS Beta1.4
更新内容如下:
1、格式化时间显示
2、新增前台留言模块增加验证码插件
3、新增后台模板编辑插件
4、自定义文章/产品详情url
5、自定义模块新增isshow默认字段,判断是否显示内容,修复前台不显示内容也显示的bug
6、支付模块修复bug
极致CMS Dev1.3
更新功能如下:
1.修改A/t/tpl/welcome.html里的系统版本
2.修改GetIP方法更换,以兼容7.1和7.2有时报错问题
3.新增配置文件信息数据库sysconfig,存储配置,去除Conf/webconf.php和Conf/custom.php
4.新增字段,默认值填写
5.后台模板部分美化
6.栏目增加模板文件默认值
7.插件功能升级,增加hook表作为插件注册事件
8.批量创建栏目
9.loop加notempty,empty筛选
10.栏目loop的url问题
11.修复栏目当前位置$positions出现输出多个栏目问题
12.修复扩展模块分页出错问题
13.修复后台标签错误输出
14.修复前台评论接收自定义字段参数内容
15.数据备份存储加安全代码
16.数据存储加安全代码
17.修复系统控制器访问404页面错误处理
18.修改配置文件Config/db.config.php为Config/config.php,可以更灵活,多配置
19.自定义字段增加radio选项类
20.多语言功能(通用型)
21.域名绑定模板功能
22.重写session存储及增加redis存储session[备用]
23.支付功能完善 (已完善支付宝支付)
24.安装步骤优化
25.增强文件安全
26.自动内链
27.静态文件生成
28.网站地图生成
29.数据库表中默认值,注册用户的时候出现字段缺少默认值的情况
30.新增字段时,已存在的表内字段提示已有字段
极致CMS Dev1.2
更新时间:2019-08-24
1.删除可疑文件 FrPHP/Extend/wechat.php
2.修复插件列表不显示新增插件问题【手动修复,复制新系统里面的A/c/PluginsController.php覆盖一下】
极致CMS Dev1.1
更新时间:2019-08-23 23:45
1.修复目录中空数据库包db.sql存在gbk编码问题
================================================
FILE: robots.txt
================================================
User-agent: *
Disallow:
Disallow: /app/
Disallow: /backup/
Disallow: /cache/
Disallow: /frphp/
Disallow: /install/
Disallow: /conf/
================================================
FILE: static/cms/404.html
================================================
404找不到页面
{include="style"}
{include="header"}
This Page is Not Found.
很抱歉,找不到此页。
{include="footer"}
{include="js"}
================================================
FILE: static/cms/article/article-details.html
================================================
{$jz['seo_title']}-{$webconf['web_name']}
{include="style"}
{include="header"}
{if(checkCollect($type['id'],$jz['id']))}
{else}
{/if}
{if(checkLikes($type['id'],$jz['id']))}
{else}
{/if}
{$jz['title']}
{$jz['body']}
{loop table="article" notempty="litpic" isshow="1" tid="$jz['tid']" isall="1" orderby="rand()" limit="4" as="v"}
{if(checkCollect($type['id'],$v['id']))}
{else}
{/if}
{if(checkLikes($type['id'],$v['id']))}
{else}
{/if}
{/loop}
{include="comment"}
{if($jz['member_id'])}
{php
$user = memberInfo($jz['member_id']);
/}
{$user['signature']}
{if($user['email'])}
{/if}
{/if}
{include="latestpost"}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/article/article-list.html
================================================
{$type['seo_classname']}-{$webconf['web_name']}
{include="style"}
{include="header"}
{if($lists)}
{foreach $lists as $v}
{/foreach}
{else}
This Page is Not Found.
很抱歉,没有找到你要的信息。
{/if}
{include="searchform"}
{include="latestpost"}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/article/faq.html
================================================
{$type['seo_classname']}-{$webconf['web_name']}
{include="style"}
{include="header"}
一些问题和回答,
请看这里.
{loop table="article" tid="$type['id']" isshow="1" orderby="orders desc,id asc" as="v"}
{/loop}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/backup/.gitkeep
================================================
================================================
FILE: static/cms/comment.html
================================================
================================================
FILE: static/cms/faq.html
================================================
Bunzo - Blog Bootstrap 5 HTML Template
Some Question
And Answer,
Look’s here.
Lorem Ipsum is simply dummy text of printing and typesetting
industry. Lorem psum has been the dustry standard dummy text
since the printer into electronic.
Lorem Ipsum is simply dummy text offer printing and typeseting
industry since the printer into electronic.
Lorem Ipsum is simply dummy text of printing and typesetting
industry. Lorem psum has been the dustry standard dummy text
since the printer into electronic.
Lorem Ipsum is simply dummy text offer printing and typeseting
industry since the printer into electronic.
Lorem Ipsum is simply dummy text of printing and typesetting
industry. Lorem psum has been the dustry standard dummy text
since the printer into electronic.
Lorem Ipsum is simply dummy text offer printing and typeseting
industry since the printer into electronic.
Lorem Ipsum is simply dummy text of printing and typesetting
industry. Lorem psum has been the dustry standard dummy text
since the printer into electronic.
Lorem Ipsum is simply dummy text offer printing and typeseting
industry since the printer into electronic.
Lorem Ipsum is simply dummy text of printing and typesetting industry. Lorem psum has been the dustry standard dummy text since the printer into electronic.
Lorem Ipsum is simply dummy text offer printing and typeseting industry since the printer into electronic.
Lorem Ipsum is simply dummy text of printing and typesetting industry. Lorem psum has been the dustry standard dummy text since the printer into electronic.
Lorem Ipsum is simply dummy text offer printing and typeseting industry since the printer into electronic.
================================================
FILE: static/cms/footer.html
================================================
================================================
FILE: static/cms/func/functions.php
================================================
================================================
FILE: static/cms/index.html
================================================
{$webconf['web_name']}
{include="style"}
{include="header"}
{loop table="product" notempty="litpic" orderby="orders desc" isshow="1" jzattr="1,2,3" limit="6" as="v"}
{/loop}
{loop table="article" notempty="litpic" orderby="addtime desc" isshow="1" limit="6" as="v"}
{fun newstr($v['description'],80)}
{/loop}
{loop table="pingjia" orderby="orders desc" isshow="1" as="v"}
{$v['title']}
{$v['zhiye']}
{$v['description']}
{$v['body']}
{/loop}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/info.php
================================================
'官方默认模板',//模板名称
'desc'=>'此模板拥有极致CMS所有功能,仅供参考和学习!',//模板介绍
'author'=>'留恋风2581047041@qq.com',//作者介绍,这里可以把自己的联系方式带上去,方便用户沟通
'version'=>'1.0',//模板版本,默认1.0为最低版本
'web'=>'https://www.jizhicms.cn',
'thumbnail'=>'/static/cms/thumbnail.png',
'update_time'=>'2022-01-20',//更新时间,格式:Y-m-d
];
================================================
FILE: static/cms/install/TemplateController.php
================================================
// +----------------------------------------------------------------------
// | Date:2022/01
// +----------------------------------------------------------------------
use frphp\lib\Controller;
use frphp\extend\Page;
class TemplateController extends Controller {
private $backupPath = '';
//自动执行
public function _init(){
/**
继承系统默认配置
**/
//检查当前账户是否合乎操作
if(!isset($_SESSION['admin']) || $_SESSION['admin']['id']==0){
Redirect(U('Login/index'));
}
$webconf = webConf();
$this->webconf = $webconf;
$classtypedata = classTypeData();
$this->classtypedata = getclasstypedata($classtypedata,0);
//当前模板目录
$this->tpl = '@'.dirname(__FILE__);
//数据库备份目录
$this->backupPath = __DIR__ .'/backup';
//引入当前模板的配置文件
$this->templateconfig = include_once('../info.php');
/**
在下面添加自定义操作
**/
}
//执行SQL语句在此处处理,或者移动文件也可以在此处理
public function install(){
//将一个文件覆盖另一个文件的方法
/*将当前模板目录的a.html复制到abc模板下面的index.html
$dir = APP_PATH.'static/default';
copy($dir."/a.html",APP_PATH.'static/abc/index.html');
*/
//插入一条SQL
/*
$sql.="INSERT INTO `".DB_PREFIX."sysconfig` (`field`,`title`,`tip`,`type`,`data`) VALUES ('closeweb','关闭网站', NULL,'0','0');";
M()->runSql($sql);
*/
return true;
}
//批量转移覆盖文件--子目录不会覆盖
//从一个目录$from转移到另一个目录$to
//最好在这个目录中创建一个back文件夹,转移覆盖文件前会先备份原文件以防文件丢失
//eg: $from = APP_PATH.'static/backup' 转移到 $to = APP_PATH.'static/abc'
//备份文件在 APP_PATH.'static/backup/back'中
private function removeFile($from,$to){
//移动后台插件控制器
$sourcefile = $from;
$target = $to;
if(is_dir($sourcefile) && is_dir($target)){
if (false != ($handle = opendir ( $sourcefile ))) {
while ( false !== ($file = readdir ( $handle )) ) {
//去掉"“.”、“..”以及带“.xxx”后缀的文件
if ($file != "." && $file != ".." && !is_dir($sourcefile.'/'.$file) ) {
$fs = $sourcefile.'/'.$file;
$ft = $target.'/'.$file;
//备份源文件以防更新覆盖
if(!is_dir($sourcefile.'/back')){
mkdir($sourcefile.'/back',0777);
}
copy($ft, $sourcefile.'/back/'.$file);
$r = $this->file2dir($fs,$ft);
if(!$r){
JsonReturn(array('code'=>1,'msg'=>'文件转移失败!sourcefile:'.$fs.' targetfile:'.$ft));
}
}
}
//关闭句柄
closedir ( $handle );
}
}
}
//复制文件并转移与removeFile结合使用
private function file2dir($sourcefile, $filename){
if( !file_exists($sourcefile)){
return false;
}
return copy($sourcefile, $filename);
}
// 原目录复制到的目录,子目录也会转移
function recurse_copy($src,$dst) {
$dir = opendir($src);
@mkdir($dst);
while(false !== ( $file = readdir($dir)) ) {
if (( $file != '.' ) && ( $file != '..' )) {
if ( is_dir($src . '/' . $file) ) {
$this->recurse_copy($src . '/' . $file,$dst . '/' . $file);
}
else {
copy($src . '/' . $file,$dst . '/' . $file);
}
}
}
closedir($dir);
}
//返回表字段
//$table不需要带表前缀
//返回字段数组 eg:['id','title','body',[...]]
private function getTableFields($table){
if(defined('DB_TYPE') && DB_TYPE=='sqlite'){
$sql = "pragma table_info(".DB_PREFIX.$table.")";
$list = M()->findSql($sql);
$fields = [];
foreach($list as $v){
$fields[]=$v['name'];
}
}else{
$sql = 'SHOW COLUMNS FROM '.DB_PREFIX.$table;
$list = M()->findSql($sql);
$isgo = true;
$fields = [];
foreach($list as $v){
$fields[]=$v['Field'];
}
}
return $fields;
}
//返回数据库表数组
//eg:['article','product',[...]]
private function getTableData(){
if(defined('DB_TYPE') && DB_TYPE=='sqlite'){
$sql = "select name from sqlite_master where type='table' order by name";
}else{
$sql = "SHOW TABLES";
}
$tables = M()->findSql($sql);
$ttable = array();
foreach($tables as $value){
foreach($value as $vv){
$ttable[] = $vv;
}
}
return $ttable;
}
//备份数据库
private function toBackup(){
$pconfig = array(
'host' =>DB_HOST,
'port' =>DB_PORT,
'user' =>DB_USER,
'password' =>DB_PASS,
'database' =>DB_NAME
);
$this->config = array_merge($this->config, $pconfig);
$this->handler = new \PDO("mysql:host=".$this->config['host'].";port={$this->config['port']};dbname={$this->config['database']}", $this->config['user'], $this->config['password']);
$this->handler->query("set names utf8");
$this->backup();
}
/**
* 备份当前数据库
* @param array $tables
* @return bool
*/
private function backup($tables = array())
{
//存储表定义语句的数组
$ddl = array();
//存储数据的数组
$data = array();
$this->setTables($tables);
if (!empty($this->tables))
{
foreach ($this->tables as $table)
{
$ddl[] = $this->getDDL($table);
$data[] = $this->getData($table);
}
//开始写入
$this->writeToFile($this->tables, $ddl, $data);
}
else
{
$this->error = '数据库中没有表!';
return false;
}
}
/**
* 设置要备份的表
* @param array $tables
*/
private function setTables($tables = array())
{
if (!empty($tables) && is_array($tables))
{
//备份指定表
$this->tables = $tables;
}
else
{
//备份全部表
$this->tables = $this->getTables();
}
}
/**
* 查询
* @param string $sql
* @return mixed
*/
private function query($sql = '')
{
$stmt = $this->handler->query($sql);
$stmt->setFetchMode(\PDO::FETCH_NUM);
$list = $stmt->fetchAll();
return $list;
}
/**
* 获取全部表
* @return array
*/
private function getTables()
{
$sql = 'SHOW TABLES';
$list = $this->query($sql);
$tables = array();
foreach ($list as $value)
{
$tables[] = $value[0];
}
return $tables;
}
/**
* 获取表定义语句
* @param string $table
* @return mixed
*/
private function getDDL($table = '')
{
$sql = "SHOW CREATE TABLE `{$table}`";
$ddl = $this->query($sql)[0][1] . ';';
return $ddl;
}
/**
* 获取表数据
* @param string $table
* @return mixed
*/
private function getData($table = '')
{
$sql = "SHOW COLUMNS FROM `{$table}`";
$list = $this->query($sql);
//字段
$columns = '';
//需要返回的SQL
$query = [];
foreach ($list as $value)
{
$columns .= "`{$value[0]}`,";
}
$columns = substr($columns, 0, -1);
$data = $this->query("SELECT * FROM `{$table}`");
foreach ($data as $value)
{
$dataSql = '';
foreach ($value as $v)
{
if($v==='' || $v===null){
$dataSql .= " NULL,";
}else{
$dataSql .= "'{$v}',";
}
}
$dataSql = substr($dataSql, 0, -1);
$query[]= "INSERT INTO `{$table}` ({$columns}) VALUES ({$dataSql});\r\n";
}
return $query;
}
/**
* 写入文件
* @param array $tables
* @param array $ddl
* @param array $data
*/
private function writeToFile($tables = array(), $ddl = array(), $data = array())
{
$public_str = "/*\r\nMySQL Database Backup Tools\r\n";
$public_str .= "Server:{$this->config['host']}:{$this->config['port']}\r\n";
$public_str .= "Database:{$this->config['database']}\r\n";
$public_str .= "Data:" . date('Y-m-d H:i:s', time()) . "\r\n*/\r\n";
$i = 0;
//echo '备份数据库-'.$this->config['database'].'
';
$countsql = 0;//记录sql数
$filenum = 0;//文件序号
$backfile = $this->config['target']==''? $this->config['database'].'_'.date('Y_m_d_H_i_s').'_'.rand(100000,999999): $this->config['target'].date('YmdHis');//文件名
$str = $public_str."SET FOREIGN_KEY_CHECKS=0;\r\n";
foreach ($tables as $table)
{
// echo '备份表:'.$table.'
';
$str .= "-- ----------------------------\r\n";
$str .= "-- Table structure for {$table}\r\n";
$str .= "-- ----------------------------\r\n";
$str .= "DROP TABLE IF EXISTS `{$table}`;\r\n";
$str .= $ddl[$i] . "\r\n";
$i++;
//echo '备份成功!
';
}
//优先备份表结构
$str = ''.$str;
$isok = file_put_contents('backup/'.$backfile.'.php', $str);
if(!$isok){
exit('[ backup/'.$backfile.'.php ] 写入文件失败!');
}
$str = $public_str;
$filenum = 1;
$i = 0;
foreach($tables as $table){
//echo '备份表数据:'.$table.'
';
$str .= "-- ----------------------------\r\n";
$str .= "-- Records of {$table}\r\n";
$str .= "-- ----------------------------\r\n";
//$str .= $data[$i] . "\r\n";
foreach ($data[$i] as $v){
$str .= $v;
$countsql++;
if($countsql%($this->limit)==0){
$str = ''.$str;
if($filenum==0){
$isok = file_put_contents($this->backupPath.'/'.$backfile.'.php', $str);
if(!$isok){
JsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'.php ] 写入文件失败!']);
}
$filenum++;
}else{
$isok = file_put_contents($this->backupPath.'/'.$backfile.'_v'.$filenum.'.php', $str);
if(!$isok){
JsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'_v'.$filenum.'.php ] 写入文件失败!']);
}
$filenum++;
}
$str = $public_str;
}
}
$i++;
}
if($str!='' && $str != $public_str){
$str = ''.$str;
if($filenum==0){
$isok = file_put_contents($this->backupPath.'/'.$backfile.'.php', $str);
if(!$isok){
JsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'.php ] 写入文件失败!']);
}
}else{
$isok = file_put_contents($this->backupPath.'/'.$backfile.'_v'.$filenum.'.php', $str);
if(!$isok){
JsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'_v'.$filenum.'.php ] 写入文件失败!']);
}
}
}
}
}
================================================
FILE: static/cms/js.html
================================================
================================================
FILE: static/cms/latestpost.html
================================================
{loop table="article" notempty="litpic" jzcache="1" notempty="litpic" jzcachetime="60" orderby="addtime desc" isshow="1" limit="15" as="v"}
{php
//分3组
$n = $v_n%3;
$newlist[$n][]=$v;
/}
{/loop}
{foreach $newlist as $v}
{foreach $v as $s}
{/foreach}
{/foreach}
================================================
FILE: static/cms/message/contact-us.html
================================================
{$type['seo_classname']}-{$webconf['web_name']}
{include="style"}
{include="header"}
{if($type['litpic'])}
{/if}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/page/about-us.html
================================================
{$type['seo_classname']}-{$webconf['web_name']}
{include="style"}
{include="header"}
{loop table="pingjia" orderby="orders desc" isshow="1" as="v"}
{$v['title']}
{$v['zhiye']}
{$v['description']}
{$v['body']}
{/loop}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/page/page.html
================================================
{$type['seo_classname']}-{$webconf['web_name']}
{include="style"}
{include="header"}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/paytpl/alipay_in_weixin.html
================================================
支付提示
================================================
FILE: static/cms/paytpl/dmf.html
================================================
温馨提示
================================================
FILE: static/cms/paytpl/overpay.html
================================================
温馨提示
订单{$order['orderno']}支付成功!
页面将在 3 秒后自动跳转
返回首页
{if($order['ptype']!=1)}
返回钱包
{else}
立即跳转
{/if}
================================================
FILE: static/cms/paytpl/pay_form.html
================================================
支付
订单信息
================================================
FILE: static/cms/paytpl/wechat_h5_pay.html
================================================
温馨提示
================================================
FILE: static/cms/paytpl/wechat_pay.html
================================================
温馨提示
================================================
FILE: static/cms/paytpl/wechat_scan.html
================================================
温馨提示
================================================
FILE: static/cms/product/details.html
================================================
{$jz['seo_title']}-{$webconf['web_name']}
{include="style"}
{include="header"}
{if($jz['pictures'])}
{php $pictures = explode('||',$jz['pictures'])/}
{foreach $pictures as $v}
{php $pic = explode('|',$v);/}
{/foreach}
{else}
{/if}
{$jz['title']}
{if($jz['tags'])}
{foreach explode(',',$jz['tags']) as $v}
{if($v)}{$v} {/if}
{/foreach}
{/if}
参数 值
{foreach jz_show_fields($jz,'color,lx,hy') as $v}
{$v['title']} {$v['data']}
{/foreach}
库存:{$jz['stock_num']} 件
加入购物车
{$jz['description']}
{$jz['body']}
{loop table="product" notempty="litpic" tid="$jz['tid']" isshow="1" isall="1" orderby="rand()" limit="3" as="v"}
{/loop}
{include="comment"}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/product/list.html
================================================
{$type['seo_classname']}-{$webconf['web_name']}
{include="style"}
{include="header"}
{screen molds="product" orderby="orders desc" as="s"}
{/screen}
{if($lists)}
{foreach $lists as $v}
{if(checkCollect($v['tid'],$v['id']))}
{else}
{/if}
{if(checkLikes($v['tid'],$v['id']))}
{else}
{/if}
{/foreach}
{else}
This Page is Not Found.
很抱歉,没有找到你要的信息。
{/if}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/search.html
================================================
搜索 “{$word}” -{$webconf['web_name']}
{include="style"}
{include="header"}
搜索 “{$word}” 结果如下:
{if($lists)}
{foreach $lists as $v}
{if(checkCollect($v['tid'],$v['id']))}
{else}
{/if}
{if(checkLikes($v['tid'],$v['id']))}
{else}
{/if}
{/foreach}
{else}
This Page is Not Found.
很抱歉,没有找到你要的信息。
{/if}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/searchall.html
================================================
搜索 “{$word}” -{$webconf['web_name']}
{include="style"}
{include="header"}
搜索 “{$word}” 结果如下:
{if($lists)}
{foreach $lists as $v}
{if(checkCollect($v['tid'],$v['id']))}
{else}
{/if}
{if(checkLikes($v['tid'],$v['id']))}
{else}
{/if}
{/foreach}
{else}
This Page is Not Found.
很抱歉,没有找到你要的信息。
{/if}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/searchform.html
================================================
================================================
FILE: static/cms/static/css/aos.css
================================================
[data-aos][data-aos][data-aos-duration="50"],body[data-aos-duration="50"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay="50"],body[data-aos-delay="50"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="50"].aos-animate,body[data-aos-delay="50"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration="100"],body[data-aos-duration="100"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay="100"],body[data-aos-delay="100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="100"].aos-animate,body[data-aos-delay="100"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration="150"],body[data-aos-duration="150"] [data-aos]{transition-duration:.15s}[data-aos][data-aos][data-aos-delay="150"],body[data-aos-delay="150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="150"].aos-animate,body[data-aos-delay="150"] [data-aos].aos-animate{transition-delay:.15s}[data-aos][data-aos][data-aos-duration="200"],body[data-aos-duration="200"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay="200"],body[data-aos-delay="200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="200"].aos-animate,body[data-aos-delay="200"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration="250"],body[data-aos-duration="250"] [data-aos]{transition-duration:.25s}[data-aos][data-aos][data-aos-delay="250"],body[data-aos-delay="250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="250"].aos-animate,body[data-aos-delay="250"] [data-aos].aos-animate{transition-delay:.25s}[data-aos][data-aos][data-aos-duration="300"],body[data-aos-duration="300"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay="300"],body[data-aos-delay="300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="300"].aos-animate,body[data-aos-delay="300"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration="350"],body[data-aos-duration="350"] [data-aos]{transition-duration:.35s}[data-aos][data-aos][data-aos-delay="350"],body[data-aos-delay="350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="350"].aos-animate,body[data-aos-delay="350"] [data-aos].aos-animate{transition-delay:.35s}[data-aos][data-aos][data-aos-duration="400"],body[data-aos-duration="400"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay="400"],body[data-aos-delay="400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="400"].aos-animate,body[data-aos-delay="400"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration="450"],body[data-aos-duration="450"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay="450"],body[data-aos-delay="450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="450"].aos-animate,body[data-aos-delay="450"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration="500"],body[data-aos-duration="500"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay="500"],body[data-aos-delay="500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="500"].aos-animate,body[data-aos-delay="500"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration="550"],body[data-aos-duration="550"] [data-aos]{transition-duration:.55s}[data-aos][data-aos][data-aos-delay="550"],body[data-aos-delay="550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="550"].aos-animate,body[data-aos-delay="550"] [data-aos].aos-animate{transition-delay:.55s}[data-aos][data-aos][data-aos-duration="600"],body[data-aos-duration="600"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay="600"],body[data-aos-delay="600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="600"].aos-animate,body[data-aos-delay="600"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration="650"],body[data-aos-duration="650"] [data-aos]{transition-duration:.65s}[data-aos][data-aos][data-aos-delay="650"],body[data-aos-delay="650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="650"].aos-animate,body[data-aos-delay="650"] [data-aos].aos-animate{transition-delay:.65s}[data-aos][data-aos][data-aos-duration="700"],body[data-aos-duration="700"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay="700"],body[data-aos-delay="700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="700"].aos-animate,body[data-aos-delay="700"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration="750"],body[data-aos-duration="750"] [data-aos]{transition-duration:.75s}[data-aos][data-aos][data-aos-delay="750"],body[data-aos-delay="750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="750"].aos-animate,body[data-aos-delay="750"] [data-aos].aos-animate{transition-delay:.75s}[data-aos][data-aos][data-aos-duration="800"],body[data-aos-duration="800"] [data-aos]{transition-duration:.8s}[data-aos][data-aos][data-aos-delay="800"],body[data-aos-delay="800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="800"].aos-animate,body[data-aos-delay="800"] [data-aos].aos-animate{transition-delay:.8s}[data-aos][data-aos][data-aos-duration="850"],body[data-aos-duration="850"] [data-aos]{transition-duration:.85s}[data-aos][data-aos][data-aos-delay="850"],body[data-aos-delay="850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="850"].aos-animate,body[data-aos-delay="850"] [data-aos].aos-animate{transition-delay:.85s}[data-aos][data-aos][data-aos-duration="900"],body[data-aos-duration="900"] [data-aos]{transition-duration:.9s}[data-aos][data-aos][data-aos-delay="900"],body[data-aos-delay="900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="900"].aos-animate,body[data-aos-delay="900"] [data-aos].aos-animate{transition-delay:.9s}[data-aos][data-aos][data-aos-duration="950"],body[data-aos-duration="950"] [data-aos]{transition-duration:.95s}[data-aos][data-aos][data-aos-delay="950"],body[data-aos-delay="950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="950"].aos-animate,body[data-aos-delay="950"] [data-aos].aos-animate{transition-delay:.95s}[data-aos][data-aos][data-aos-duration="1000"],body[data-aos-duration="1000"] [data-aos]{transition-duration:1s}[data-aos][data-aos][data-aos-delay="1000"],body[data-aos-delay="1000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1000"].aos-animate,body[data-aos-delay="1000"] [data-aos].aos-animate{transition-delay:1s}[data-aos][data-aos][data-aos-duration="1050"],body[data-aos-duration="1050"] [data-aos]{transition-duration:1.05s}[data-aos][data-aos][data-aos-delay="1050"],body[data-aos-delay="1050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1050"].aos-animate,body[data-aos-delay="1050"] [data-aos].aos-animate{transition-delay:1.05s}[data-aos][data-aos][data-aos-duration="1100"],body[data-aos-duration="1100"] [data-aos]{transition-duration:1.1s}[data-aos][data-aos][data-aos-delay="1100"],body[data-aos-delay="1100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1100"].aos-animate,body[data-aos-delay="1100"] [data-aos].aos-animate{transition-delay:1.1s}[data-aos][data-aos][data-aos-duration="1150"],body[data-aos-duration="1150"] [data-aos]{transition-duration:1.15s}[data-aos][data-aos][data-aos-delay="1150"],body[data-aos-delay="1150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1150"].aos-animate,body[data-aos-delay="1150"] [data-aos].aos-animate{transition-delay:1.15s}[data-aos][data-aos][data-aos-duration="1200"],body[data-aos-duration="1200"] [data-aos]{transition-duration:1.2s}[data-aos][data-aos][data-aos-delay="1200"],body[data-aos-delay="1200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1200"].aos-animate,body[data-aos-delay="1200"] [data-aos].aos-animate{transition-delay:1.2s}[data-aos][data-aos][data-aos-duration="1250"],body[data-aos-duration="1250"] [data-aos]{transition-duration:1.25s}[data-aos][data-aos][data-aos-delay="1250"],body[data-aos-delay="1250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1250"].aos-animate,body[data-aos-delay="1250"] [data-aos].aos-animate{transition-delay:1.25s}[data-aos][data-aos][data-aos-duration="1300"],body[data-aos-duration="1300"] [data-aos]{transition-duration:1.3s}[data-aos][data-aos][data-aos-delay="1300"],body[data-aos-delay="1300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1300"].aos-animate,body[data-aos-delay="1300"] [data-aos].aos-animate{transition-delay:1.3s}[data-aos][data-aos][data-aos-duration="1350"],body[data-aos-duration="1350"] [data-aos]{transition-duration:1.35s}[data-aos][data-aos][data-aos-delay="1350"],body[data-aos-delay="1350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1350"].aos-animate,body[data-aos-delay="1350"] [data-aos].aos-animate{transition-delay:1.35s}[data-aos][data-aos][data-aos-duration="1400"],body[data-aos-duration="1400"] [data-aos]{transition-duration:1.4s}[data-aos][data-aos][data-aos-delay="1400"],body[data-aos-delay="1400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1400"].aos-animate,body[data-aos-delay="1400"] [data-aos].aos-animate{transition-delay:1.4s}[data-aos][data-aos][data-aos-duration="1450"],body[data-aos-duration="1450"] [data-aos]{transition-duration:1.45s}[data-aos][data-aos][data-aos-delay="1450"],body[data-aos-delay="1450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1450"].aos-animate,body[data-aos-delay="1450"] [data-aos].aos-animate{transition-delay:1.45s}[data-aos][data-aos][data-aos-duration="1500"],body[data-aos-duration="1500"] [data-aos]{transition-duration:1.5s}[data-aos][data-aos][data-aos-delay="1500"],body[data-aos-delay="1500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1500"].aos-animate,body[data-aos-delay="1500"] [data-aos].aos-animate{transition-delay:1.5s}[data-aos][data-aos][data-aos-duration="1550"],body[data-aos-duration="1550"] [data-aos]{transition-duration:1.55s}[data-aos][data-aos][data-aos-delay="1550"],body[data-aos-delay="1550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1550"].aos-animate,body[data-aos-delay="1550"] [data-aos].aos-animate{transition-delay:1.55s}[data-aos][data-aos][data-aos-duration="1600"],body[data-aos-duration="1600"] [data-aos]{transition-duration:1.6s}[data-aos][data-aos][data-aos-delay="1600"],body[data-aos-delay="1600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1600"].aos-animate,body[data-aos-delay="1600"] [data-aos].aos-animate{transition-delay:1.6s}[data-aos][data-aos][data-aos-duration="1650"],body[data-aos-duration="1650"] [data-aos]{transition-duration:1.65s}[data-aos][data-aos][data-aos-delay="1650"],body[data-aos-delay="1650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1650"].aos-animate,body[data-aos-delay="1650"] [data-aos].aos-animate{transition-delay:1.65s}[data-aos][data-aos][data-aos-duration="1700"],body[data-aos-duration="1700"] [data-aos]{transition-duration:1.7s}[data-aos][data-aos][data-aos-delay="1700"],body[data-aos-delay="1700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1700"].aos-animate,body[data-aos-delay="1700"] [data-aos].aos-animate{transition-delay:1.7s}[data-aos][data-aos][data-aos-duration="1750"],body[data-aos-duration="1750"] [data-aos]{transition-duration:1.75s}[data-aos][data-aos][data-aos-delay="1750"],body[data-aos-delay="1750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1750"].aos-animate,body[data-aos-delay="1750"] [data-aos].aos-animate{transition-delay:1.75s}[data-aos][data-aos][data-aos-duration="1800"],body[data-aos-duration="1800"] [data-aos]{transition-duration:1.8s}[data-aos][data-aos][data-aos-delay="1800"],body[data-aos-delay="1800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1800"].aos-animate,body[data-aos-delay="1800"] [data-aos].aos-animate{transition-delay:1.8s}[data-aos][data-aos][data-aos-duration="1850"],body[data-aos-duration="1850"] [data-aos]{transition-duration:1.85s}[data-aos][data-aos][data-aos-delay="1850"],body[data-aos-delay="1850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1850"].aos-animate,body[data-aos-delay="1850"] [data-aos].aos-animate{transition-delay:1.85s}[data-aos][data-aos][data-aos-duration="1900"],body[data-aos-duration="1900"] [data-aos]{transition-duration:1.9s}[data-aos][data-aos][data-aos-delay="1900"],body[data-aos-delay="1900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1900"].aos-animate,body[data-aos-delay="1900"] [data-aos].aos-animate{transition-delay:1.9s}[data-aos][data-aos][data-aos-duration="1950"],body[data-aos-duration="1950"] [data-aos]{transition-duration:1.95s}[data-aos][data-aos][data-aos-delay="1950"],body[data-aos-delay="1950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1950"].aos-animate,body[data-aos-delay="1950"] [data-aos].aos-animate{transition-delay:1.95s}[data-aos][data-aos][data-aos-duration="2000"],body[data-aos-duration="2000"] [data-aos]{transition-duration:2s}[data-aos][data-aos][data-aos-delay="2000"],body[data-aos-delay="2000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2000"].aos-animate,body[data-aos-delay="2000"] [data-aos].aos-animate{transition-delay:2s}[data-aos][data-aos][data-aos-duration="2050"],body[data-aos-duration="2050"] [data-aos]{transition-duration:2.05s}[data-aos][data-aos][data-aos-delay="2050"],body[data-aos-delay="2050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2050"].aos-animate,body[data-aos-delay="2050"] [data-aos].aos-animate{transition-delay:2.05s}[data-aos][data-aos][data-aos-duration="2100"],body[data-aos-duration="2100"] [data-aos]{transition-duration:2.1s}[data-aos][data-aos][data-aos-delay="2100"],body[data-aos-delay="2100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2100"].aos-animate,body[data-aos-delay="2100"] [data-aos].aos-animate{transition-delay:2.1s}[data-aos][data-aos][data-aos-duration="2150"],body[data-aos-duration="2150"] [data-aos]{transition-duration:2.15s}[data-aos][data-aos][data-aos-delay="2150"],body[data-aos-delay="2150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2150"].aos-animate,body[data-aos-delay="2150"] [data-aos].aos-animate{transition-delay:2.15s}[data-aos][data-aos][data-aos-duration="2200"],body[data-aos-duration="2200"] [data-aos]{transition-duration:2.2s}[data-aos][data-aos][data-aos-delay="2200"],body[data-aos-delay="2200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2200"].aos-animate,body[data-aos-delay="2200"] [data-aos].aos-animate{transition-delay:2.2s}[data-aos][data-aos][data-aos-duration="2250"],body[data-aos-duration="2250"] [data-aos]{transition-duration:2.25s}[data-aos][data-aos][data-aos-delay="2250"],body[data-aos-delay="2250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2250"].aos-animate,body[data-aos-delay="2250"] [data-aos].aos-animate{transition-delay:2.25s}[data-aos][data-aos][data-aos-duration="2300"],body[data-aos-duration="2300"] [data-aos]{transition-duration:2.3s}[data-aos][data-aos][data-aos-delay="2300"],body[data-aos-delay="2300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2300"].aos-animate,body[data-aos-delay="2300"] [data-aos].aos-animate{transition-delay:2.3s}[data-aos][data-aos][data-aos-duration="2350"],body[data-aos-duration="2350"] [data-aos]{transition-duration:2.35s}[data-aos][data-aos][data-aos-delay="2350"],body[data-aos-delay="2350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2350"].aos-animate,body[data-aos-delay="2350"] [data-aos].aos-animate{transition-delay:2.35s}[data-aos][data-aos][data-aos-duration="2400"],body[data-aos-duration="2400"] [data-aos]{transition-duration:2.4s}[data-aos][data-aos][data-aos-delay="2400"],body[data-aos-delay="2400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2400"].aos-animate,body[data-aos-delay="2400"] [data-aos].aos-animate{transition-delay:2.4s}[data-aos][data-aos][data-aos-duration="2450"],body[data-aos-duration="2450"] [data-aos]{transition-duration:2.45s}[data-aos][data-aos][data-aos-delay="2450"],body[data-aos-delay="2450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2450"].aos-animate,body[data-aos-delay="2450"] [data-aos].aos-animate{transition-delay:2.45s}[data-aos][data-aos][data-aos-duration="2500"],body[data-aos-duration="2500"] [data-aos]{transition-duration:2.5s}[data-aos][data-aos][data-aos-delay="2500"],body[data-aos-delay="2500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2500"].aos-animate,body[data-aos-delay="2500"] [data-aos].aos-animate{transition-delay:2.5s}[data-aos][data-aos][data-aos-duration="2550"],body[data-aos-duration="2550"] [data-aos]{transition-duration:2.55s}[data-aos][data-aos][data-aos-delay="2550"],body[data-aos-delay="2550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2550"].aos-animate,body[data-aos-delay="2550"] [data-aos].aos-animate{transition-delay:2.55s}[data-aos][data-aos][data-aos-duration="2600"],body[data-aos-duration="2600"] [data-aos]{transition-duration:2.6s}[data-aos][data-aos][data-aos-delay="2600"],body[data-aos-delay="2600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2600"].aos-animate,body[data-aos-delay="2600"] [data-aos].aos-animate{transition-delay:2.6s}[data-aos][data-aos][data-aos-duration="2650"],body[data-aos-duration="2650"] [data-aos]{transition-duration:2.65s}[data-aos][data-aos][data-aos-delay="2650"],body[data-aos-delay="2650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2650"].aos-animate,body[data-aos-delay="2650"] [data-aos].aos-animate{transition-delay:2.65s}[data-aos][data-aos][data-aos-duration="2700"],body[data-aos-duration="2700"] [data-aos]{transition-duration:2.7s}[data-aos][data-aos][data-aos-delay="2700"],body[data-aos-delay="2700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2700"].aos-animate,body[data-aos-delay="2700"] [data-aos].aos-animate{transition-delay:2.7s}[data-aos][data-aos][data-aos-duration="2750"],body[data-aos-duration="2750"] [data-aos]{transition-duration:2.75s}[data-aos][data-aos][data-aos-delay="2750"],body[data-aos-delay="2750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2750"].aos-animate,body[data-aos-delay="2750"] [data-aos].aos-animate{transition-delay:2.75s}[data-aos][data-aos][data-aos-duration="2800"],body[data-aos-duration="2800"] [data-aos]{transition-duration:2.8s}[data-aos][data-aos][data-aos-delay="2800"],body[data-aos-delay="2800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2800"].aos-animate,body[data-aos-delay="2800"] [data-aos].aos-animate{transition-delay:2.8s}[data-aos][data-aos][data-aos-duration="2850"],body[data-aos-duration="2850"] [data-aos]{transition-duration:2.85s}[data-aos][data-aos][data-aos-delay="2850"],body[data-aos-delay="2850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2850"].aos-animate,body[data-aos-delay="2850"] [data-aos].aos-animate{transition-delay:2.85s}[data-aos][data-aos][data-aos-duration="2900"],body[data-aos-duration="2900"] [data-aos]{transition-duration:2.9s}[data-aos][data-aos][data-aos-delay="2900"],body[data-aos-delay="2900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2900"].aos-animate,body[data-aos-delay="2900"] [data-aos].aos-animate{transition-delay:2.9s}[data-aos][data-aos][data-aos-duration="2950"],body[data-aos-duration="2950"] [data-aos]{transition-duration:2.95s}[data-aos][data-aos][data-aos-delay="2950"],body[data-aos-delay="2950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2950"].aos-animate,body[data-aos-delay="2950"] [data-aos].aos-animate{transition-delay:2.95s}[data-aos][data-aos][data-aos-duration="3000"],body[data-aos-duration="3000"] [data-aos]{transition-duration:3s}[data-aos][data-aos][data-aos-delay="3000"],body[data-aos-delay="3000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="3000"].aos-animate,body[data-aos-delay="3000"] [data-aos].aos-animate{transition-delay:3s}[data-aos][data-aos][data-aos-easing=linear],body[data-aos-easing=linear] [data-aos]{transition-timing-function:cubic-bezier(.25,.25,.75,.75)}[data-aos][data-aos][data-aos-easing=ease],body[data-aos-easing=ease] [data-aos]{transition-timing-function:ease}[data-aos][data-aos][data-aos-easing=ease-in],body[data-aos-easing=ease-in] [data-aos]{transition-timing-function:ease-in}[data-aos][data-aos][data-aos-easing=ease-out],body[data-aos-easing=ease-out] [data-aos]{transition-timing-function:ease-out}[data-aos][data-aos][data-aos-easing=ease-in-out],body[data-aos-easing=ease-in-out] [data-aos]{transition-timing-function:ease-in-out}[data-aos][data-aos][data-aos-easing=ease-in-back],body[data-aos-easing=ease-in-back] [data-aos]{transition-timing-function:cubic-bezier(.6,-.28,.735,.045)}[data-aos][data-aos][data-aos-easing=ease-out-back],body[data-aos-easing=ease-out-back] [data-aos]{transition-timing-function:cubic-bezier(.175,.885,.32,1.275)}[data-aos][data-aos][data-aos-easing=ease-in-out-back],body[data-aos-easing=ease-in-out-back] [data-aos]{transition-timing-function:cubic-bezier(.68,-.55,.265,1.55)}[data-aos][data-aos][data-aos-easing=ease-in-sine],body[data-aos-easing=ease-in-sine] [data-aos]{transition-timing-function:cubic-bezier(.47,0,.745,.715)}[data-aos][data-aos][data-aos-easing=ease-out-sine],body[data-aos-easing=ease-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.39,.575,.565,1)}[data-aos][data-aos][data-aos-easing=ease-in-out-sine],body[data-aos-easing=ease-in-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.445,.05,.55,.95)}[data-aos][data-aos][data-aos-easing=ease-in-quad],body[data-aos-easing=ease-in-quad] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quad],body[data-aos-easing=ease-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quad],body[data-aos-easing=ease-in-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-cubic],body[data-aos-easing=ease-in-cubic] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-cubic],body[data-aos-easing=ease-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-cubic],body[data-aos-easing=ease-in-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-quart],body[data-aos-easing=ease-in-quart] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quart],body[data-aos-easing=ease-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quart],body[data-aos-easing=ease-in-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos^=fade][data-aos^=fade]{opacity:0;transition-property:opacity,transform}[data-aos^=fade][data-aos^=fade].aos-animate{opacity:1;transform:translateZ(0)}[data-aos=fade-up]{transform:translate3d(0,100px,0)}[data-aos=fade-down]{transform:translate3d(0,-100px,0)}[data-aos=fade-right]{transform:translate3d(-100px,0,0)}[data-aos=fade-left]{transform:translate3d(100px,0,0)}[data-aos=fade-up-right]{transform:translate3d(-100px,100px,0)}[data-aos=fade-up-left]{transform:translate3d(100px,100px,0)}[data-aos=fade-down-right]{transform:translate3d(-100px,-100px,0)}[data-aos=fade-down-left]{transform:translate3d(100px,-100px,0)}[data-aos^=zoom][data-aos^=zoom]{opacity:0;transition-property:opacity,transform}[data-aos^=zoom][data-aos^=zoom].aos-animate{opacity:1;transform:translateZ(0) scale(1)}[data-aos=zoom-in]{transform:scale(.6)}[data-aos=zoom-in-up]{transform:translate3d(0,100px,0) scale(.6)}[data-aos=zoom-in-down]{transform:translate3d(0,-100px,0) scale(.6)}[data-aos=zoom-in-right]{transform:translate3d(-100px,0,0) scale(.6)}[data-aos=zoom-in-left]{transform:translate3d(100px,0,0) scale(.6)}[data-aos=zoom-out]{transform:scale(1.2)}[data-aos=zoom-out-up]{transform:translate3d(0,100px,0) scale(1.2)}[data-aos=zoom-out-down]{transform:translate3d(0,-100px,0) scale(1.2)}[data-aos=zoom-out-right]{transform:translate3d(-100px,0,0) scale(1.2)}[data-aos=zoom-out-left]{transform:translate3d(100px,0,0) scale(1.2)}[data-aos^=slide][data-aos^=slide]{transition-property:transform}[data-aos^=slide][data-aos^=slide].aos-animate{transform:translateZ(0)}[data-aos=slide-up]{transform:translate3d(0,100%,0)}[data-aos=slide-down]{transform:translate3d(0,-100%,0)}[data-aos=slide-right]{transform:translate3d(-100%,0,0)}[data-aos=slide-left]{transform:translate3d(100%,0,0)}[data-aos^=flip][data-aos^=flip]{backface-visibility:hidden;transition-property:transform}[data-aos=flip-left]{transform:perspective(2500px) rotateY(-100deg)}[data-aos=flip-left].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-right]{transform:perspective(2500px) rotateY(100deg)}[data-aos=flip-right].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-up]{transform:perspective(2500px) rotateX(-100deg)}[data-aos=flip-up].aos-animate{transform:perspective(2500px) rotateX(0)}[data-aos=flip-down]{transform:perspective(2500px) rotateX(100deg)}[data-aos=flip-down].aos-animate{transform:perspective(2500px) rotateX(0)}
================================================
FILE: static/cms/static/css/gordita-fonts.css
================================================
@font-face{font-family:'Gordita';font-style:normal;font-weight:300;src:local('Gordita'),url('../fonts/gordita-light.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:300;src:local('Gordita-light-italic'),url('../fonts/gordita-light-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:400;src:local('Gordita-thin'),url('../fonts/gordita-thin.woff') format('woff')}@font-face{font-family:'Gordita Thin';font-style:italic;font-weight:400;src:local('Gordita Thin Italic'),url('../fonts/gordita-thin-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:500;src:local('Gordita-regular'),url('../fonts/gordita-regular.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:500;src:local('Gordita Regular Italic'),url('../fonts/gordita-regular-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:600;src:local('Gordita-medium'),url('../fonts/gordita-medium.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:600;src:local('Gordita-medium-italic'),url('../fonts/gordita-medium-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:700;src:local('Gorditabold'),url('../fonts/gordita-bold.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:700;src:local('Gordita-bold-italic'),url('../fonts/gordita-bold-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:800;src:local('Gordita-black'),url('../fonts/gordita-black.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:800;src:local('Gordita-black-italic'),url('../fonts/gordita-black-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:900;src:local('Gordita-ultra'),url('../fonts/gordita-ultra.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:900;src:local('Gordita-ultra-italic'),url('../fonts/gordita-ultra-italic.woff') format('woff')}
================================================
FILE: static/cms/static/css/style.css
================================================
@charset "UTF-8";*,*::after,*::before{-webkit-box-sizing:border-box;box-sizing:border-box}html,body{height:100%}body{line-height:1.74;font-size:15px;font-style:normal;font-weight:500;visibility:visible;font-family:"Gordita";color:#333;position:relative;background-color:#fff}body.no-overflow{overflow:hidden}h1,h2,h3,h4,h5,h6{color:#000;font-family:"Gordita";font-weight:600;margin-top:0;margin-bottom:0;line-height:1.41}h1{font-size:56px}@media only screen and (min-width:992px) and (max-width:1199px){h1{font-size:46px}}@media only screen and (min-width:768px) and (max-width:991px){h1{font-size:40px}}@media only screen and (max-width:767px){h1{font-size:34px}}h2{font-size:38px}@media only screen and (min-width:992px) and (max-width:1199px){h2{font-size:32px}}@media only screen and (min-width:768px) and (max-width:991px){h2{font-size:30px}}@media only screen and (max-width:767px){h2{font-size:26px}}h3{font-size:24px}@media only screen and (min-width:992px) and (max-width:1199px){h3{font-size:22px}}@media only screen and (min-width:768px) and (max-width:991px){h3{font-size:20px}}@media only screen and (max-width:767px){h3{font-size:20px}}h4{font-size:20px}@media only screen and (min-width:992px) and (max-width:1199px){h4{font-size:18px}}@media only screen and (min-width:768px) and (max-width:991px){h4{font-size:18px}}@media only screen and (max-width:767px){h4{font-size:18px}}h5{font-size:18px}@media only screen and (max-width:767px){h5{font-size:16px}}h6{font-size:16px}p:last-child{margin-bottom:0}a,button{color:inherit;display:inline-block;line-height:inherit;text-decoration:none;cursor:pointer}a,button,img,input{-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}*:focus{outline:none!important}a:focus{color:inherit;outline:0;text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}a:hover{text-decoration:none;color:#ffc4a0}.theme-color-two a:hover{color:#ffc4a0}.theme-color-three a:hover{color:#a50eff}.theme-color-four a:hover{color:#5974ff}.theme-color-five a:hover{color:#5138ee}.theme-color-six a:hover{color:#5138ee}button,input[type="submit"]{cursor:pointer}ul{list-style:outside none none;margin:0;padding:0}.form-messege.success,.form-messege-2.success{color:green}.form-messege.error,.form-messege-2.error{color:red}.mark,mark{padding:0;background-color:transparent}.font-weight--bold{font-weight:800}.font-weight--reguler{font-weight:500}.font-weight--normal{font-weight:400}.font-weight--light{font-weight:300}.text-color-primary{color:#ffc4a0}.text-color-secondary{color:#f9c322}.text-black{color:#000!important}.bg-gray{background-color:#edf0f8}.bg-gray-1{background-color:#fafafa}.bg-gray-2{background-color:#f8f8f8}.bg-gradient{background:-webkit-linear-gradient(top,#FFF 0,#F5F5F5 100%)}select{padding:3px 20px;height:56px;max-width:100%;width:100%;outline:0;border:1px solid #f8f8f8;border-radius:5px;background:#f8f8f8 url("../images/selector-icon.png") no-repeat center right 20px;background-color:#f8f8f8;-moz-appearance:none;-webkit-appearance:none}select:focus{background:#f8f8f8 url("../images/selector-icon.png") no-repeat center right 20px!important}.fixed-bg{background-size:cover;background-repeat:no-repeat;background-attachment:fixed}.text-black{color:#333}.box-shadow-top{-webkit-box-shadow:0 10px 15px rgba(0,0,0,0.05);box-shadow:0 10px 15px rgba(0,0,0,0.05)}.border{border:1px solid #ededed!important}.border-top{border-top:1px solid #ededed!important}.border-right{border-right:1px solid #ededed!important}.border-bottom{border-bottom:1px solid #ededed!important}.border-left{border-left:1px solid #ededed!important}.border-top-dash{border-top:1px dashed #ddd!important}.border-bottom-dash{border-bottom:1px dashed #ddd!important}.border-top-thick{border-top:2px solid #ededed!important}.border-bottom-thick{border-bottom:2px solid #ededed!important}.border-top-drak{border-top:1px solid rgba(255,255,255,0.2)!important}.border-bottom-drak{border-bottom:1px solid rgba(255,255,255,0.2)!important}img{max-width:100%}.img-width{width:100%}::-moz-selection{color:#fff;background-color:#ffc4a0}::selection{color:#fff;background-color:#ffc4a0}form input:focus::-webkit-input-placeholder{color:transparent}form input:focus:-moz-placeholder{color:transparent}form input:focus::-moz-placeholder{color:transparent}form input:focus:-ms-input-placeholder{color:transparent}form input,form textarea{font-weight:500}form input::-webkit-input-placeholder,form textarea::-webkit-input-placeholder{-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input::-moz-placeholder,form textarea::-moz-placeholder{-moz-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input:-ms-input-placeholder,form textarea:-ms-input-placeholder{-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input::-ms-input-placeholder,form textarea::-ms-input-placeholder{-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input::placeholder,form textarea::placeholder{-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}input[type="text"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="password"]:focus,input[type="search"]:focus,input[type="number"]:focus,input[type="tel"]:focus,input[type="range"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="color"]:focus,textarea:focus,select:focus,select:focus,textarea:focus{color:#ffc4a0;border-color:#ffc4a0}input[type="checkbox"]{position:relative;background:0;border-width:0;-webkit-box-shadow:none;box-shadow:none;margin:0 10px 0 3px;cursor:pointer}.navigation-button{height:40px;width:40px;text-align:center;line-height:38px;background-color:#f4f4f4;font-size:24px;border-radius:50000px;display:inline-block;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-button:hover{background-color:#ffc4a0;color:#fff}.navigation-button:last-child{margin-left:10px}.scroll-top{position:fixed;right:30px;bottom:-60px;z-index:999;-webkit-box-shadow:0 30px 50px rgba(0,0,0,0.03);box-shadow:0 30px 50px rgba(0,0,0,0.03);display:block;padding:0;width:60px;height:60px;border-radius:50%;text-align:center;font-size:25px;line-height:60px;cursor:pointer;opacity:0;visibility:hidden;background-color:#ffc4a0;background-size:200% auto;background-position:left center;color:#fff;-webkit-transition:all .5s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .5s cubic-bezier(0.645,0.045,0.355,1);transition:all .5s cubic-bezier(0.645,0.045,0.355,1);overflow:hidden}@media only screen and (max-width:479px){.scroll-top{width:50px;height:50px;line-height:50px;font-size:20px}}.scroll-top.show{visibility:visible;opacity:1;bottom:60px}.scroll-top i{position:absolute;top:50%;left:50%;color:#fff;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.scroll-top .arrow-top{-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.scroll-top .arrow-bottom{-webkit-transform:translate(-50%,80px);-ms-transform:translate(-50%,80px);transform:translate(-50%,80px)}.scroll-top:hover{background-position:right center}.scroll-top:hover .arrow-top{-webkit-transform:translate(-50%,-80px);-ms-transform:translate(-50%,-80px);transform:translate(-50%,-80px)}.scroll-top:hover .arrow-bottom{-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.section-space--pt_150{padding-top:150px}@media only screen and (min-width:992px) and (max-width:1199px){.section-space--pt_150{padding-top:100px}}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_150{padding-top:80px}}@media only screen and (max-width:767px){.section-space--pt_150{padding-top:60px}}.section-space--ptb_120{padding-top:120px;padding-bottom:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_120{padding-top:80px;padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--ptb_120{padding-top:60px;padding-bottom:60px}}.section-space--pt_120{padding-top:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_120{padding-top:80px}}@media only screen and (max-width:767px){.section-space--pt_120{padding-top:60px}}.section-space--pb_120{padding-bottom:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_120{padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--pb_120{padding-bottom:60px}}.section-space--ptb_100{padding-top:100px;padding-bottom:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_100{padding-top:80px;padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--ptb_100{padding-top:60px;padding-bottom:60px}}.section-space--pt_100{padding-top:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_100{padding-top:80px}}@media only screen and (max-width:767px){.section-space--pt_100{padding-top:60px}}.section-space--pb_100{padding-bottom:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_100{padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--pb_100{padding-bottom:60px}}.section-space--ptb_90{padding-top:90px;padding-bottom:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_90{padding-top:60px;padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--ptb_90{padding-top:40px;padding-bottom:40px}}.section-space--pt_90{padding-top:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_90{padding-top:60px}}@media only screen and (max-width:767px){.section-space--pt_90{padding-top:40px}}.section-space--pb_90{padding-bottom:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_90{padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--pb_90{padding-bottom:40px}}.section-space--ptb_80{padding-top:80px;padding-bottom:80px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_80{padding-top:60px;padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--ptb_80{padding-top:40px;padding-bottom:40px}}.section-space--pt_80{padding-top:80px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_80{padding-top:60px}}@media only screen and (max-width:767px){.section-space--pt_80{padding-top:40px}}.section-space--pb_80{padding-bottom:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_80{padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--pb_80{padding-bottom:40px}}.section-space--ptb_70{padding-top:70px;padding-bottom:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_70{padding-top:40px;padding-bottom:40px}}@media only screen and (max-width:767px){.section-space--ptb_70{padding-top:30px;padding-bottom:30px}}.section-space--pt_70{padding-top:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_70{padding-top:40px}}@media only screen and (max-width:767px){.section-space--pt_70{padding-top:30px}}.section-space--pb_70{padding-bottom:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_70{padding-bottom:40px}}@media only screen and (max-width:767px){.section-space--pb_70{padding-bottom:30px}}.section-space--ptb_60{padding-top:60px;padding-bottom:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_60{padding-top:60px;padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--ptb_60{padding-top:60px;padding-bottom:60px}}.section-space--pt_60{padding-top:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_60{padding-top:60px}}@media only screen and (max-width:767px){.section-space--pt_60{padding-top:60px}}.section-space--pb_60{padding-bottom:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_60{padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--pb_60{padding-bottom:60px}}.section-space--pt_40{padding-top:40px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_40{padding-top:30px}}@media only screen and (max-width:767px){.section-space--pt_40{padding-top:30px}}.section-space--pb_40{padding-bottom:40px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_40{padding-bottom:30px}}@media only screen and (max-width:767px){.section-space--pb_40{padding-bottom:30px}}.section-space--ptb_30{padding-top:30px;padding-bottom:30px}.section-space--pt_30{padding-top:30px}.section-space--pb_30{padding-bottom:30px}.section-space--mt_15{margin-top:15px}.section-space--mt_20{margin-top:20px}.section-space--mt_30{margin-top:30px}.section-space--mt_40{margin-top:40px}.section-space--mt_50{margin-top:50px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_50{margin-top:40px}}@media only screen and (max-width:767px){.section-space--mt_50{margin-top:30px}}.section-space--mt_60{margin-top:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_60{margin-top:50px}}@media only screen and (max-width:767px){.section-space--mt_60{margin-top:30px}}.section-space--mt_70{margin-top:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_70{margin-top:50px}}@media only screen and (max-width:767px){.section-space--mt_70{margin-top:30px}}.section-space--mt_80{margin-top:80px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_80{margin-top:50px}}@media only screen and (max-width:767px){.section-space--mt_80{margin-top:30px}}.section-space--mt_100{margin-top:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_100{margin-top:80px}}@media only screen and (max-width:767px){.section-space--mt_100{margin-top:60px}}.section-space--mt_120{margin-top:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_120{margin-top:80px}}@media only screen and (max-width:767px){.section-space--mt_120{margin-top:60px}}.section-space--mb_15{margin-bottom:15px}.section-space--mb_20{margin-bottom:20px}.section-space--mb_30{margin-bottom:30px}.section-space--mb_40{margin-bottom:40px}@media only screen and (max-width:767px){.section-space--mb_40{margin-bottom:30px}}.section-space--mb_50{margin-bottom:50px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_50{margin-bottom:40px}}@media only screen and (max-width:767px){.section-space--mb_50{margin-bottom:30px}}.section-space--mb_60{margin-bottom:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_60{margin-bottom:50px}}@media only screen and (max-width:767px){.section-space--mb_60{margin-bottom:30px}}.section-space--mb_100{margin-bottom:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_100{margin-bottom:80px}}@media only screen and (max-width:767px){.section-space--mb_100{margin-bottom:60px}}.section-space--mb_120{margin-bottom:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_120{margin-bottom:80px}}@media only screen and (max-width:767px){.section-space--mb_120{margin-bottom:60px}}.mb-10{margin-bottom:10px}.mb-15{margin-bottom:15px}.mb-20{margin-bottom:20px}.mb-25{margin-bottom:25px}.mb-30{margin-bottom:30px}.mb-40{margin-bottom:40px}.mt-10{margin-top:10px}.mt-15{margin-top:15px}.mt-20{margin-top:20px}.mt-25{margin-top:25px}.mt-30{margin-top:30px}.mt-40{margin-top:40px}@media only screen and (max-width:767px){.small-mt__0{margin-top:0}.small-mt__10{margin-top:10px}.small-mt__20{margin-top:20px}.small-mt__30{margin-top:30px}.small-mt__40{margin-top:40px}.small-mt__50{margin-top:50px}.small-mt__60{margin-top:60px}.small-mb__30{margin-bottom:30px}.small-mb__40{margin-bottom:40px}.small-mb__50{margin-bottom:50px}.small-mb__60{margin-bottom:60px}}@media only screen and (min-width:768px) and (max-width:991px){.tablet-mt__0{margin-top:0}.tablet-mt__30{margin-top:30px}.tablet-mt__40{margin-top:40px}.tablet-mt__50{margin-top:50px}.tablet-mt__60{margin-top:60px}.tablet-mb__30{margin-bottom:30px}.tablet-mb__40{margin-bottom:40px}.tablet-mb__50{margin-bottom:50px}.tablet-mb__60{margin-bottom:60px}}@media(min-width:1200px){.container{max-width:1200px}}.container-custom-xl{max-width:1540px;width:100%}@media only screen and (min-width:1200px) and (max-width:1499px){.container-custom-xl{max-width:100%}}@media only screen and (min-width:992px) and (max-width:1199px){.container-custom-xl{max-width:100%;width:100%}}.container-custom-150{padding-right:115px;padding-left:115px}@media only screen and (min-width:1200px) and (max-width:1499px){.container-custom-150{padding-right:50px;padding-left:50px}}@media only screen and (min-width:992px) and (max-width:1199px){.container-custom-150{padding-right:15px;padding-left:15px}}@media only screen and (min-width:768px) and (max-width:991px){.container-custom-150{padding-right:15px;padding-left:15px}}@media only screen and (max-width:767px){.container-custom-150{padding-right:15px;padding-left:15px}}.row--35{margin-left:-35px;margin-right:-35px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--35{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--35{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--35{margin-left:-15px;margin-right:-15px}}@media only screen and (max-width:767px){.row--35{margin-left:-15px!important;margin-right:-15px!important}}.row--35>[class*="col"],.row--35>[class*="col-"]{padding-left:35px;padding-right:35px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--35>[class*="col"],.row--35>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--35>[class*="col"],.row--35>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--35>[class*="col"],.row--35>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}@media only screen and (max-width:767px){.row--35>[class*="col"],.row--35>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}.row--30{margin-left:-30px;margin-right:-30px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--30{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--30{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--30{margin-left:-15px;margin-right:-15px}}@media only screen and (max-width:767px){.row--30{margin-left:-12px!important;margin-right:-12px!important}}.row--30>[class*="col"],.row--30>[class*="col-"]{padding-left:30px;padding-right:30px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--30>[class*="col"],.row--30>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--30>[class*="col"],.row--30>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--30>[class*="col"],.row--30>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}@media only screen and (max-width:767px){.row--30>[class*="col"],.row--30>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}.row--17{margin-left:-17px;margin-right:-17px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--17{margin-left:-17px;margin-right:-17px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--17{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--17{margin-left:-15px;margin-right:-15px}}@media only screen and (max-width:767px){.row--17{margin-left:-15px!important;margin-right:-15px!important}}.row--17>[class*="col"],.row--17>[class*="col-"]{padding-left:17px;padding-right:17px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--17>[class*="col"],.row--17>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--17>[class*="col"],.row--17>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--17>[class*="col"],.row--17>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}@media only screen and (max-width:767px){.row--17>[class*="col"],.row--17>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}.row--10{margin-left:-10px;margin-right:-10px}@media only screen and (min-width:992px) and (max-width:1199px){.row--10{margin-left:-10px;margin-right:-10px}}@media only screen and (min-width:768px) and (max-width:991px){.row--10{margin-left:-10px;margin-right:-10px}}@media only screen and (max-width:767px){.row--10{margin-left:-10px!important;margin-right:-10px!important}}.row--10>[class*="col"],.row--10>[class*="col-"]{padding-left:10px;padding-right:10px}@media only screen and (min-width:992px) and (max-width:1199px){.row--10>[class*="col"],.row--10>[class*="col-"]{padding-left:10px;padding-right:10px}}@media only screen and (min-width:768px) and (max-width:991px){.row--10>[class*="col"],.row--10>[class*="col-"]{padding-left:10px!important;padding-right:10px!important}}@media only screen and (max-width:767px){.row--10>[class*="col"],.row--10>[class*="col-"]{padding-left:10px!important;padding-right:10px!important}}.section-title-two{position:relative;margin-bottom:40px}.section-title-two::after{background-color:#e3e3e3;content:"";left:0;top:50%;position:absolute;height:1px;width:100%}.section-title-two h2{color:#0f034a;background:#fff;display:inline-block;position:relative;z-index:1}.section-title-two h2::after{background-color:#fff;content:"";right:-50px;left:auto;top:50%;position:absolute;height:90%;width:50px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.section-title-two h2::before{background-color:#fff;content:"";left:-50px;right:auto;top:50%;position:absolute;height:90%;width:50px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.section-title-three .title{color:#0f034a}.sub-title-four{color:#5974ff}.breadcrumb-area{background-color:#fafafa;padding:80px 0}.breadcrumb-list{padding:10px 20px;background-color:#ffebdf;display:inline-block;border-radius:15px}.breadcrumb-list li{display:inline-block}.breadcrumb-item+.breadcrumb-item{padding-left:1.5rem;position:relative}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.1rem;color:#222;content:'';height:6px;width:6px;background:#222;border-radius:5000px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);position:absolute;left:8px}.btn{height:50px;line-height:48px;padding:0 30px;font-weight:500;border-radius:15px}.btn:hover{background-color:#ffc4a0}.btn i{margin-left:10px;font-size:22px}.btn-primary{background:#ffc4a0;font-weight:500;border-radius:10px;color:#fff;border:0}.btn-primary:focus{outline:none!important}.btn-primary:hover,.btn-primary:focus{background:#d4966f;color:#fff;-webkit-box-shadow:none;box-shadow:none}.btn-primary i{margin-left:10px;font-size:22px}.btn-bg-2{background-color:#ff7d6b;color:#fff}.btn-bg-3{background-color:#a50eff;color:#fff}.btn-bg-4{background-color:#5974ff;color:#fff}.btn-bg-5{background-color:#fed74b;color:#000}.btn-bg-5-primary{background-color:#5138ee;color:#fff}.btn-bg-5-primary:hover{color:#222}.btn-bg-6{background-color:#5138ee;color:#fff}.btn-bg-white{background-color:#fff;color:#0f034a}.btn-primary-three{padding:0 30px;background:#f4eaff;font-weight:600;border-radius:10px;color:#0f034a;border:0}.btn-primary-three:focus{outline:none!important}.btn-primary-three:hover,.btn-primary-three:focus{background:#a50eff;color:#fff!important;-webkit-box-shadow:none;box-shadow:none}.btn-primary-three i{margin-left:15px;font-size:22px}.btn-primary-four{padding:0 30px;background:#edf0f8;font-weight:600;border-radius:10px;color:#081131;border:0}@media only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px){.btn-primary-four{padding:0 20px}}.btn-primary-four:focus{outline:none!important}.btn-primary-four:hover,.btn-primary-four:focus{background:#5974ff;color:#fff!important;-webkit-box-shadow:none;box-shadow:none}.btn-primary-four i{margin-left:15px;font-size:22px}.btn-outline-2{border:2px solid #ddd;border-radius:10px;color:#fff;padding-bottom:2px;color:#ff7d6b}.btn-outline-2:hover{color:#fff;border:2px solid #ff7d6b;background-color:#ff7d6b}.btn-large{padding:0 30px;height:60px;line-height:60px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px){.btn-large{padding:0 20px}}.btn-medium{height:50px;line-height:50px;padding:0 20px}.woocommerce{background-color:#fff1dc;color:#d59a46;border-radius:15px}.woocommerce:hover{background-color:#d59a46;color:#fff}.wordpress{background-color:#e0f9f6;color:#3ac8bd;border-radius:15px}.wordpress:hover{background-color:#3ac8bd;color:#fff}.magento{background-color:#fbefef;color:#b36262;border-radius:15px}.magento:hover{background-color:#b36262;color:#fff}.laravel{background-color:#9c8bda;color:#fff;border-radius:15px}.laravel:hover{background-color:#9c8bda;color:#fff}.ux-design{background-color:#e8f7e0;color:#8cad78;border-radius:15px}.ux-design:hover{background-color:#8cad78;color:#fff}.online-tutorial{background-color:#e3f0ff;color:#7f9cbf;border-radius:15px}.online-tutorial:hover{background-color:#7f9cbf;color:#fff}.marketing{background-color:#fdf0e8;color:#c49076;border-radius:15px}.marketing:hover{background-color:#c49076;color:#fff}.javaScript{background-color:#ffe7da;color:#fe8e4b;border-radius:15px}.javaScript:hover{background-color:#fe8e4b;color:#fff}.lifestyle{background-color:#e1fae3;color:#1f9a39;border-radius:15px}.lifestyle:hover{background-color:#1f9a39;color:#fff}.fashion{background-color:#ffebdf;border-radius:15px}.fashion:hover{color:#fff;background-color:#f3d6c5}.health{background-color:#dcf1ff;border-radius:15px}.travel{background-color:#ffe6af;border-radius:15px}.business{background-color:#e1f3ff;border-radius:15px}.food{background-color:#f9e7a0;border-radius:15px}.lifesytle{background-color:#ffebde;border-radius:15px}.tech{background-color:#ffebdf;border-radius:15px}.tech:hover{color:#222}.marketing{background-color:#fce7e7;border-radius:15px;color:#222}.marketing:hover{color:#222}.doctor{background-color:#e6f9ed;border-radius:15px;color:#222}.doctor:hover{color:#222}.health{background-color:#eaf6fd;border-radius:15px;color:#222}.health:hover{color:#222}.single-testimonial-item,.single-testimonial-item-two{padding:30px 35px 60px;background-color:#fff;border-radius:15px;position:relative;margin-top:40px}.single-testimonial-item::after,.single-testimonial-item-two::after{position:absolute;right:35px;bottom:20px;content:'';background:url("../images/quote.png");background-repeat:no-repeat;height:40px;width:52px}.single-testimonial-item-two::after{background:url("../images/quote-2.png");background-repeat:no-repeat}.single-testimonial-item-two .testimonial-author-info p{color:#ffc4a0}.testimonial-post-author{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding-bottom:30px;border-bottom:1px solid #ddd;margin-bottom:30px}.testimonial-author-image{width:70px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-right:20px}.testimonial-author-image img{border-radius:50%;}.testimonial-author-info p{margin-top:10px;color:#5974ff;font-size:11px}.testimonial-post-content .testimonial-post-title{margin-bottom:25px;line-height:1.6}.testimonial-post-content p{font-size:14px;line-height:2}.testimonial-slider-navigation,.testimonial-slider-navigation-two{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:50px}.testimonial-slider-navigation .navigation-button,.testimonial-slider-navigation-two .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #5974ff;text-align:center;font-size:25px;border-radius:10px;color:#5974ff;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;background-color:transparent;margin:10px}.testimonial-slider-navigation .navigation-button:hover,.testimonial-slider-navigation-two .navigation-button:hover{border:2px solid #5974ff;background-color:#5974ff;color:#fff}.testimonial-slider-navigation-two .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #ffc4a0;text-align:center;font-size:25px;border-radius:500000px;color:#fff;background-color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;margin:10px}.testimonial-slider-navigation-two .navigation-button:hover{border:2px solid #222;background-color:#222;color:#fff}.single-popup-wrap{position:relative}.single-popup-wrap img{width:100%}.video-link{-webkit-transition:all .3s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .3s cubic-bezier(0.645,0.045,0.355,1);transition:all .3s cubic-bezier(0.645,0.045,0.355,1);display:block}.video-link .ht-popup-video.video-overlay{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:rgba(8,106,216,0.8)}.video-link .ht-popup-video.video-button{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.video-link .ht-popup-video.video-button .video-mark{position:absolute;top:50%;left:50%;-webkit-transform:translateY(-50%,-50%);-ms-transform:translateY(-50%,-50%);transform:translateY(-50%,-50%);pointer-events:none}.video-link .ht-popup-video.video-button .video-mark .wave-pulse{width:1px;height:0;margin:0 auto}.video-link .ht-popup-video.video-button .video-mark .wave-pulse::after,.video-link .ht-popup-video.video-button .video-mark .wave-pulse::before{opacity:0;content:'';display:block;position:absolute;width:200px;height:200px;top:50%;left:50%;border-radius:50%;border:3px solid #ffc4a0;-webkit-animation:zoomBig 3.25s linear infinite;animation:zoomBig 3.25s linear infinite;-webkit-animation-delay:0s;animation-delay:0s}.video-link .ht-popup-video.video-button .video-mark .wave-pulse::before{-webkit-animation-delay:.75s;animation-delay:.75s}.video-link .ht-popup-video .video-button{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.video-link .ht-popup-video .video-button__one{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.video-link .ht-popup-video .video-button__one .video-play{width:72px;height:72px;background:transparent;border:6px solid #fff;border-radius:50%;-webkit-transition:all 1s cubic-bezier(0,0,0.2,1)!important;-o-transition:all 1s cubic-bezier(0,0,0.2,1)!important;transition:all 1s cubic-bezier(0,0,0.2,1)!important}.video-link .ht-popup-video .video-button__one .video-play-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);line-height:1;margin-left:1px}.video-link .ht-popup-video .video-button__one .video-play-icon::before{content:'';position:absolute;top:0;left:0;width:0;height:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-top:11px solid transparent;border-bottom:11px solid transparent;border-left:17px solid #fff}.video-link .ht-popup-video .video-button__two{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.video-link .ht-popup-video .video-button__two .video-play{width:78px;height:78px;background:#ffc4a0;border:3px solid #fff;-webkit-box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);border-radius:50%;-webkit-transition:all 1s cubic-bezier(0,0,0.2,1)!important;-o-transition:all 1s cubic-bezier(0,0,0.2,1)!important;transition:all 1s cubic-bezier(0,0,0.2,1)!important;-webkit-box-shadow:0 20px 30px rgba(0,0,0,0.07);box-shadow:0 20px 30px rgba(0,0,0,0.07)}.video-link .ht-popup-video .video-button__two .video-play-sm{width:58px;height:58px;background:#ffc4a0;border:3px solid #fff;-webkit-box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);border-radius:50%;-webkit-transition:all 1s cubic-bezier(0,0,0.2,1)!important;-o-transition:all 1s cubic-bezier(0,0,0.2,1)!important;transition:all 1s cubic-bezier(0,0,0.2,1)!important;-webkit-box-shadow:0 20px 30px rgba(0,0,0,0.07);box-shadow:0 20px 30px rgba(0,0,0,0.07)}.video-link .ht-popup-video .video-button__two .video-play-sm .video-play-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);line-height:1;margin-left:1px}.video-link .ht-popup-video .video-button__two .video-play-sm .video-play-icon::before{content:'';position:absolute;top:0;left:0;width:0;height:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-top:9px solid transparent;border-bottom:9px solid transparent;border-left:12px solid #fff;border-top-width:8px;border-bottom-width:9px;border-left-width:15px;border-left-color:#fff}.video-link .ht-popup-video .video-button__two .video-play-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);line-height:1;margin-left:1px}.video-link .ht-popup-video .video-button__two .video-play-icon::before{content:'';position:absolute;top:0;left:0;width:0;height:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-top:11px solid transparent;border-bottom:11px solid transparent;border-left:17px solid #fff;border-top-width:12px;border-bottom-width:12px;border-left-width:19px;border-left-color:#fff}.video-link:hover .video-play,.video-link:hover .video-play-sm{-webkit-transform:scale3d(1.15,1.15,1.15);transform:scale3d(1.15,1.15,1.15)}@-webkit-keyframes zoomBig{0%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:1;border-width:3px}40%{opacity:.5;border-width:2px}65%{border-width:1px}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:0;border-width:1px}}@keyframes zoomBig{0%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:1;border-width:3px}40%{opacity:.5;border-width:2px}65%{border-width:1px}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:0;border-width:1px}}@keyframes zoomBig{0%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:1;border-width:3px}40%{opacity:.5;border-width:2px}65%{border-width:1px}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:0;border-width:1px}}.header-sticky.is-sticky{position:fixed;top:0;left:0;width:100%;-webkit-animation:.95s ease-in-out 0s normal none 1 running fadeInDown;animation:.95s ease-in-out 0s normal none 1 running fadeInDown;z-index:999;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-webkit-box-shadow:0 8px 20px 0 rgba(0,0,0,0.1);box-shadow:0 8px 20px 0 rgba(0,0,0,0.1);background-color:#fff}.position--absolute{position: absolute;width:100%;z-index:5}.mobile-menu-right{margin-right:0;float:right}.header-top-area{background-color:#22262a;padding-bottom:10px}.header-top-menu-list{margin-top:10px}.header-top-menu-list li{display:inline-block;padding-right:20px;margin-right:15px;position:relative}.header-top-menu-list li::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#ffc4a0;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.header-top-menu-list li a{color:#fff}.header-top-menu-list li a:hover{color:#ffc4a0}.header-top-menu-list li:last-child{padding-right:0;margin-right:0}.header-top-menu-list li:last-child::after{display:none}@media only screen and (max-width:575px){.header-top-menu-list{text-align:center}}.header-top-contact-info{margin-top:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.header-top-single-contact-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#fff;margin:0 30px}.header-top-single-contact-item:first-child{margin-left:0}.header-top-single-contact-item:last-child{margin-right:0}.header-top-single-contact-item .text-size-small{font-size:12px}@media only screen and (max-width:575px){.header-top-single-contact-item{margin:0 5px;font-size:13px}}.header-top-contact-icon{margin-right:15px}@media only screen and (max-width:575px){.header-top-contact-icon{margin-right:5px}}.header-top-right-side{margin-top:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;color:#ffc4a0}.header-top-right-side p{margin-bottom:0}.header-top-right-side .wayder-icon{margin:0 10px}@media only screen and (max-width:575px){.header-top-right-side{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}}.header-mid-area{margin-top:20px;border-bottom:1px solid #f3f3f3;padding-bottom:20px}.header-mid-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-action-item{height:45px;min-width:45px;background:#f4f4f4;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:20px;border-radius:5px}.single-action-item:hover{background:#ffc4a0}.single-action-item:first-child{margin-left:0}@media only screen and (min-width:992px) and (max-width:1199px){.single-action-item{height:40px;min-width:40px;margin-left:12px}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.single-action-item{height:40px;min-width:40px;margin-left:7px}}.header-add-banner{position:relative}.header-add-banner a{display:block}.header-add-text{font-size:15px;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);left:50px;display:inline-block}.header-add-text span{display:block;font-size:18px;text-align:left;margin-top:3px;font-weight:bold}.social-share-area li{display:inline-block;margin-right:15px}.social-share-area li:last-child{margin-right:0}.social-share-area li a{height:45px;width:45px;line-height:45px;text-align:center;background-color:#ddd;border-radius:5px}.social-share-area li a:hover{background-color:#ffc4a0;color:#fff}@media only screen and (max-width:767px){.social-share-area li{margin-right:10px}}@media only screen and (max-width:575px){.social-share-area li{margin-right:6px}}.social-share-area.social-share-border-outline li a{background-color:transparent;border-radius:15px;border:1px solid #fff;color:#fff}.social-share-area.social-share-border-outline li a:hover{background:#fff;color:#222}.social-share-area.social-share-normal a{height:auto;width:auto;line-height:auto;padding:0;border:0;background-color:transparent}.social-share-area.social-share-normal a:hover{background-color:transparent;color:#5138ee}.new-notification{height:6px;width:6px;border-radius:100%;background-color:#ff7d6b;position:absolute;right:0}.header-two{border-bottom:1px solid rgba(255,255,255,0.15)}.header-two .header-bottom-area{height:80px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex; background: #252c63;}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.header-two .header-bottom-area{height:auto}}.header-two-right-side{margin:15px 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.header-two-right-side .single-action-item{position:relative;border-radius:10px;border:2px solid rgba(255,255,255,0.5);background-color:transparent}.header-two-right-side .single-action-item::after,.header-two-right-side .single-action-item::before{height:2px;width:6px;background-color:#fff;content:'';position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);opacity:0;visibility:hidden;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.header-two-right-side .single-action-item::after{bottom:-2px}.header-two-right-side .single-action-item::before{top:-2px}.header-two-right-side .single-action-item:hover::after,.header-two-right-side .single-action-item:hover::before{opacity:1;visibility:visible}.header-two-right-side .new-notification{height:6px;width:6px;border-radius:100%;background-color:#ff7d6b;position:absolute;right:6px;top:4px}.header-three .header-bottom-area{height:110px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.header-three .header-bottom-area{height:auto}}.header-three-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:25px 0}.header-three-right-side .sign-up-action-button{font-size:16px;font-weight:500;margin-left:20px;color:#fff;background-color:#0f034a;white-space:nowrap;line-height:46px;border-radius:20px}.header-three-right-side .sign-up-action-button:hover{background-color:#a50eff;color:#fff}@media only screen and (max-width:575px){.header-three-right-side .sign-up-action-button{padding:0 10px;font-size:13px}}.header-three-right-side .single-action-item{background-color:#efe1ff;border-radius:20px;position:relative}.header-three-right-side .single-action-item .new-notification{height:6px;width:6px;border-radius:100%;background-color:#ff7d6b;position:absolute;right:8px;top:6px}.header-three-right-side .single-action-item .btn-medium{padding:0 26px}.header-style-center{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.header-four{border-bottom:1px solid rgba(255,255,255,0.3)}.header-four-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:25px 0;white-space:nowrap}.header-four-right-side .sign-up-action-button{font-size:15px;font-weight:500;margin-left:20px;color:#fff;background-color:transparent;border:2px solid #fff;height:66px;line-height:64px;padding:0 20px}.header-four-right-side .sign-up-action-button:hover{background-color:#5974ff;color:#fff;border:2px solid #5974ff}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-four-right-side .sign-up-action-button{padding:0 10px;font-size:13px;height:46px;line-height:44px}}.header-four-right-side .single-action-item{background-color:transparent;border:2px solid #fff;border-radius:15px;position:relative;height:64px;line-height:64px;padding:0 20px}.header-four-right-side .single-action-item .new-notification{height:6px;width:6px;border-radius:100%;background-color:#d83d40;position:absolute;right:10px;top:8px}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-four-right-side .single-action-item{height:46px;line-height:44px;padding:0 15px}}.header-five .header-top{background:url("../images/header-top.jpg");background-repeat:no-repeat;background-size:cover;padding:15px 0}.header-five .time-offer{color:#fff;font-weight:18px}.header-five .time-offer .offer-text{color:#ff7d6b;margin-right:15px}.header-five .time-offer .get-offer-btn{padding:6px 16px;background-color:#fed74b;color:#000;border-radius:10px;font-weight:600}.header-five .time-offer .get-offer-btn:hover{background-color:#ff7d6b}.header-five .social-share-area{text-align:right}@media only screen and (max-width:767px){.header-five .social-share-area{text-align:center;margin-top:20px}}@media only screen and (min-width:768px) and (max-width:991px){.header-five .social-share-area li{margin-right:6px}}.header-five-left-side-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.header-five-left-side-box .ml-3{margin-left:60px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.header-five-left-side-box .ml-3{margin-left:0}}.header-five-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:25px 0}.header-five-right-side .sign-up-action-button{font-size:16px;font-weight:600;margin-left:30px;border-radius:10px}.header-five-right-side .sign-up-action-button:hover{background-color:#ff7d6b}@media only screen and (min-width:992px) and (max-width:1199px){.header-five-right-side .sign-up-action-button{margin-left:20px}}@media only screen and (max-width:575px){.header-five-right-side .sign-up-action-button{margin-left:0;padding:0 15px;font-size:13px}}.header-five-right-side .log-in-action-btn{font-weight:600}.header-six .header-top{padding:10px 0;border-bottom:1px solid #e8e8e8}.header-six .time-offer{color:#000;font-weight:18px}.header-six .time-offer .get-offer-btn{padding:6px 16px;background-color:#fed74b;color:#000;border-radius:10px;font-weight:600;margin-left:20px}.header-six .time-offer .get-offer-btn:hover{background-color:#ff7d6b}.header-six .social-share-area{text-align:right}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-six .social-share-area{text-align:center}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-six .header-bottom-area{margin-top:20px}}.mobile-navigation-icon{width:24px;height:25px;position:relative;cursor:pointer;display:inline-block;margin-right:0;margin-left:15px}.mobile-navigation-icon:hover i{background-color:#ffc4a0}.mobile-navigation-icon:hover i:before{width:80%;background-color:#ffc4a0}.mobile-navigation-icon:hover i:after{background-color:#ffc4a0;width:60%}.mobile-navigation-icon i{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);width:100%;height:2px;background-color:#333;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-navigation-icon i:before{position:absolute;bottom:8px;left:0;width:100%;height:2px;background-color:#333;content:"";-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-navigation-icon i:after{position:absolute;bottom:-8px;left:0;width:100%;height:2px;background-color:#333;content:"";-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-navigation-icon.icon-white i{background-color:#fff}.mobile-navigation-icon.icon-white i:before{background-color:#fff}.mobile-navigation-icon.icon-white i:after{background-color:#fff}.mobile-navigation-icon.icon-white:hover i{background-color:#ffc4a0}.mobile-navigation-icon.icon-white:hover i:before{width:80%;background-color:#ffc4a0}.mobile-navigation-icon.icon-white:hover i:after{background-color:#ffc4a0;width:60%}@media only screen and (min-width:992px) and (max-width:1199px){.mobile-navigation-icon.white-md-icon i{background-color:#fff}.mobile-navigation-icon.white-md-icon i:before{background-color:#fff}.mobile-navigation-icon.white-md-icon i:after{background-color:#fff}.mobile-navigation-icon.white-md-icon:hover i{background-color:#ffc4a0}.mobile-navigation-icon.white-md-icon:hover i:before{width:80%;background-color:#ffc4a0}.mobile-navigation-icon.white-md-icon:hover i:after{background-color:#ffc4a0;width:60%}}.mobile-menu-overlay,.page-oppen-off-sidebar{position:fixed;left:0;top:0;width:100%;height:100%;background-color:#000;overflow:auto;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);z-index:9999;background:rgba(0,0,0,0.7);visibility:hidden;opacity:0}.mobile-menu-overlay__inner,.page-oppen-off-sidebar__inner{-webkit-transform:translateX(120%);-ms-transform:translateX(120%);transform:translateX(120%);width:400px;height:100%;float:right;cursor:default;background:#ffc4a0;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);overflow-y:auto}@media only screen and (max-width:479px){.mobile-menu-overlay__inner,.page-oppen-off-sidebar__inner{width:300px}}.mobile-menu-overlay.active,.page-oppen-off-sidebar.active{visibility:visible;opacity:1}.mobile-menu-overlay.active .mobile-menu-overlay__inner,.page-oppen-off-sidebar.active .mobile-menu-overlay__inner{-webkit-transform:translateX(0%);-ms-transform:translateX(0%);transform:translateX(0%)}.mobile-menu-overlay__header,.page-oppen-off-sidebar__header{background-color:#fff;padding:15px 0}.mobile-menu-overlay__header .mobile-navigation-close-icon,.page-oppen-off-sidebar__header .mobile-navigation-close-icon{position:relative;cursor:pointer;height:40px;width:40px;line-height:40px;display:inline-block;margin-right:auto}.mobile-menu-overlay__header .mobile-navigation-close-icon:before,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:before{position:absolute;top:23px;left:8px;content:'';width:24px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__header .mobile-navigation-close-icon:after,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:after{position:absolute;top:23px;left:8px;content:'';width:24px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__header .mobile-navigation-close-icon:hover,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:hover{color:#ffc4a0}.mobile-menu-overlay__header .mobile-navigation-close-icon:hover:before,.mobile-menu-overlay__header .mobile-navigation-close-icon:hover:after,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:hover:before,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:hover:after{-webkit-transform:none;-ms-transform:none;transform:none}.mobile-menu-overlay__body,.page-oppen-off-sidebar__body{padding:20px 40px 100px}.mobile-menu-overlay__body .offcanvas-navigation>ul>li,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li{border-bottom:1px solid rgba(255,255,255,0.15)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li>a,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li>a{display:block;color:#000;padding-top:18px;padding-bottom:18px;font-size:16px;font-weight:500;line-height:1.5;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li>a:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li>a:hover{color:#000}.mobile-menu-overlay__body .offcanvas-navigation>ul>li:last-child,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li:last-child{border-bottom:0}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children{position:relative}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children.active .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children.active .menu-expand:before{content:'\eaa1'}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .menu-expand,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .menu-expand{position:absolute;right:0;top:12px;width:40px;height:40px;background:rgba(255,255,255,0.1);color:#000;text-align:center;line-height:40px;cursor:pointer;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .menu-expand:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .menu-expand:hover{background:rgba(255,255,255,0.2)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .menu-expand:before{content:'\ea99';font-size:18px;font-family:IcoFont}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu{padding:12px 0 14px 10px;border-top:1px solid rgba(255,255,255,0.15)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li{border-bottom:1px solid rgba(255,255,255,0.15)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li a,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li a{display:block;font-size:15px;color:rgba(0,0,0,0.7);font-weight:500;line-height:1.5;padding:10px 0}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li a:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li a:hover{color:#000}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li:last-child,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li:last-child{border-bottom:0}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children{position:relative}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children.active .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children.active .menu-expand:before{content:"\ea99"}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand{position:absolute;right:0;top:6px;width:30px;height:30px;background:rgba(255,255,255,0.1);color:#000;text-align:center;line-height:30px;cursor:pointer;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:hover{background:rgba(255,255,255,0.2)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:before{content:'\ea99';font-size:16px;font-family:IcoFont;font-weight:500}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children{position:relative}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children.active .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children.active .menu-expand:before{content:"\f106"}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children .menu-expand:before{content:'\f107';font-size:16px;font-family:IcoFont;font-weight:500}.search-overlay{position:fixed;left:0;top:0;width:100%;height:100%;background-color:#000;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);z-index:9999;visibility:hidden;opacity:0;overflow:hidden;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__inner{width:100%;height:100%;cursor:default;background:#fff;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);overflow-y:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.search-overlay.active{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1}.search-overlay__header{background-color:#fff;padding:15px 0}.search-overlay__header .mobile-navigation-close-icon{position:relative;cursor:pointer;height:48px;width:48px;line-height:48px;display:inline-block}.search-overlay__header .mobile-navigation-close-icon:before{position:absolute;top:28px;left:0;content:'';width:42px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__header .mobile-navigation-close-icon:after{position:absolute;top:28px;left:0;content:'';width:42px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__header .mobile-navigation-close-icon:hover{color:#ffc4a0}.search-overlay__header .mobile-navigation-close-icon:hover:before,.search-overlay__header .mobile-navigation-close-icon:hover:after{-webkit-transform:none;-ms-transform:none;transform:none}.search-overlay__body{width:100%;margin:0 auto;margin-bottom:75px}.search-overlay__form{position:relative;max-width:1200px;padding:0 15px;width:100%;margin:auto}.search-overlay__form input{background-color:transparent;border:0;border-bottom:2px solid #ffc4a0;border-radius:0;padding:15px 50px 15px 0;width:100%;color:#fff;font-size:42px;height:60px;color:#ffc4a0}@media only screen and (max-width:767px){.search-overlay__form input{font-size:30px;height:60px}}.search-overlay__form input::-webkit-input-placeholder{color:#ffc4a0;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input::-moz-placeholder{color:#ffc4a0;-moz-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input:-ms-input-placeholder{color:#ffc4a0;-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input::-ms-input-placeholder{color:#ffc4a0;-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input::placeholder{color:#ffc4a0;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input[type="text"]:focus{color:#ffc4a0;border-color:#ffc4a0}@media only screen and (min-width:768px) and (max-width:991px){.navigation-menu{display:none}}@media only screen and (max-width:767px){.navigation-menu{display:none}}.navigation-menu>ul>li{margin:0 25px;position:relative;text-align:left;display:inline-block}@media only screen and (min-width:1500px) and (max-width:1599px){.navigation-menu>ul>li{margin:0 22px}}@media only screen and (min-width:1200px) and (max-width:1499px){.navigation-menu>ul>li{margin:0 15px}}@media only screen and (min-width:992px) and (max-width:1199px){.navigation-menu>ul>li{margin:0 12px}}.navigation-menu>ul>li:last-child{margin-right:0}.navigation-menu>ul>li:first-child{margin-left:0}.navigation-menu>ul>li>a{display:block;color:#000;padding:30px 2px;position:relative;font-size:16px;font-weight:500;line-height:1.18;-webkit-transition:all .0s ease-in-out;-o-transition:all .0s ease-in-out;transition:all .0s ease-in-out}.navigation-menu>ul>li>a span{-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu>ul>li.has-children>a{position:relative}.navigation-menu>ul>li.has-children>a:after{position:static;margin-left:5px;font-family:IcoFont;content:'\ea99';font-size:14px;vertical-align:middle;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu>ul>li.has-children--multilevel-submenu{position:relative}.navigation-menu>ul>li.has-children:hover .megamenu{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1}.navigation-menu>ul>li.has-children:hover .megamenu--home-variation__item{visibility:visible;opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}.navigation-menu>ul>li.has-children:hover>.submenu{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1}.navigation-menu>ul>li:hover>a:after,.navigation-menu>ul>li.active>a:after{color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu>ul>li:hover>a span,.navigation-menu>ul>li.active>a span{color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu-white>ul>li>a{color:#fff}.navigation-menu-white>ul>li>a:before{content:'';width:0;height:3px;bottom:0;position:absolute;left:0;background-color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.theme-color-two .navigation-menu>ul>li:hover>a:after,.theme-color-two .navigation-menu>ul>li.active>a:after{color:#ff7d6b}.theme-color-two .navigation-menu>ul>li:hover>a span,.theme-color-two .navigation-menu>ul>li.active>a span{color:#ff7d6b}.theme-color-two .submenu{border-bottom:3px solid #ff7d6b}.theme-color-two .submenu>li.active>a{color:#ff7d6b}.theme-color-two .submenu>li a>span:after{background-color:#ff7d6b}.theme-color-two .submenu>li>a:hover{color:#ff7d6b}.theme-color-two .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-two .megamenu--mega>li>ul>li>a:hover{color:#ff7d6b}.theme-color-two .megamenu--mega>li>ul>li.active>a{color:#ff7d6b}.theme-color-three .navigation-menu>ul>li a{color:#250c83}.theme-color-three .navigation-menu>ul>li:hover>a:after,.theme-color-three .navigation-menu>ul>li.active>a:after{color:#a50eff}.theme-color-three .navigation-menu>ul>li:hover>a span,.theme-color-three .navigation-menu>ul>li.active>a span{color:#a50eff}.theme-color-three .submenu{border-bottom:3px solid #a50eff}.theme-color-three .submenu>li.active>a{color:#a50eff}.theme-color-three .submenu>li a>span:after{background-color:#a50eff}.theme-color-three .submenu>li>a:hover{color:#a50eff}.theme-color-three .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-three .megamenu--mega>li>ul>li>a:hover{color:#a50eff}.theme-color-three .megamenu--mega>li>ul>li.active>a{color:#a50eff}.theme-color-four .navigation-menu>ul>li:hover>a:after,.theme-color-four .navigation-menu>ul>li.active>a:after{color:#5974ff}.theme-color-four .navigation-menu>ul>li:hover>a span,.theme-color-four .navigation-menu>ul>li.active>a span{color:#5974ff}.theme-color-four .submenu{border-bottom:3px solid #5974ff}.theme-color-four .submenu>li.active>a{color:#5974ff}.theme-color-four .submenu>li a>span:after{background-color:#5974ff}.theme-color-four .submenu>li>a:hover{color:#5974ff}.theme-color-four .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-four .megamenu--mega>li>ul>li>a:hover{color:#5974ff}.theme-color-four .megamenu--mega>li>ul>li.active>a{color:#5974ff}.theme-color-five .navigation-menu>ul>li:hover>a:after,.theme-color-five .navigation-menu>ul>li.active>a:after{color:#5138ee}.theme-color-five .navigation-menu>ul>li:hover>a span,.theme-color-five .navigation-menu>ul>li.active>a span{color:#5138ee}.theme-color-five .submenu{border-bottom:3px solid #5138ee}.theme-color-five .submenu>li.active>a{color:#5138ee}.theme-color-five .submenu>li a>span:after{background-color:#5138ee}.theme-color-five .submenu>li>a:hover{color:#5138ee}.theme-color-five .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-five .megamenu--mega>li>ul>li>a:hover{color:#5138ee}.theme-color-five .megamenu--mega>li>ul>li.active>a{color:#5138ee}.theme-color-six .navigation-menu>ul>li:hover>a:after,.theme-color-six .navigation-menu>ul>li.active>a:after{color:#5138ee}.theme-color-six .navigation-menu>ul>li:hover>a span,.theme-color-six .navigation-menu>ul>li.active>a span{color:#5138ee}.theme-color-six .submenu{border-bottom:3px solid #5138ee}.theme-color-six .submenu>li.active>a{color:#5138ee}.theme-color-six .submenu>li a>span:after{background-color:#5138ee}.theme-color-six .submenu>li>a:hover{color:#5138ee}.theme-color-six .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-six .megamenu--mega>li>ul>li>a:hover{color:#5138ee}.theme-color-six .megamenu--mega>li>ul>li.active>a{color:#5138ee}.submenu{position:absolute;top:100%;left:-20px;-webkit-box-shadow:0 2px 29px rgba(0,0,0,0.05);box-shadow:0 2px 29px rgba(0,0,0,0.05);border-bottom:3px solid #ffc4a0;background-color:#fff;-webkit-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-webkit-transition-delay:.2s;-o-transition-delay:.2s;transition-delay:.2s;-webkit-transition-duration:.4s;-o-transition-duration:.4s;transition-duration:.4s;visibility:hidden;opacity:0;min-width:200px;padding:15px 0;z-index:9}.submenu>li{position:relative}.submenu>li>a{display:block;padding:5px 20px;color:#000;font-weight:500;-webkit-transition:0s;-o-transition:0s;transition:0s}.submenu>li>a>span{position:relative}.submenu>li>a>span:after{content:'';width:0;height:1px;bottom:0;position:absolute;left:auto;right:0;z-index:-1;background-color:#ffc4a0;-webkit-transition:.3s;-o-transition:.3s;transition:.3s}.submenu>li>a:hover{color:#ffc4a0}.submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.submenu>li:hover>.submenu{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1;z-index:9}.submenu>li.active>a{color:#ffc4a0}.submenu>li.has-children>a{position:relative;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.submenu>li.has-children>a:after{position:absolute;right:20px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-family:IcoFont;content:'\f105';font-size:14px;vertical-align:middle;color:#ababab}.submenu>li.has-children>a:hover:after{color:#ffc4a0}.submenu>li.has-children.active>a{color:#ffc4a0}.submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu.left{right:100%;left:auto}.submenu .submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu .submenu.left{right:100%;left:auto}.submenu .submenu .submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu .submenu .submenu.left{right:100%;left:auto}.submenu .submenu .submenu .submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu .submenu .submenu .submenu.left{right:100%;left:auto}.megamenu{position:absolute;top:100%;left:0;-webkit-box-shadow:0 2px 29px rgba(0,0,0,0.05);box-shadow:0 2px 29px rgba(0,0,0,0.05);border-bottom:3px solid #ffc4a0;background-color:#fff;-webkit-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-webkit-transition-delay:.2s;-o-transition-delay:.2s;transition-delay:.2s;-webkit-transition-duration:.4s;-o-transition-duration:.4s;transition-duration:.4s;visibility:hidden;opacity:0;z-index:9}.megamenu--mega{min-width:980px;width:100%;padding:35px 20px 30px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}@media only screen and (min-width:1200px) and (max-width:1499px){.megamenu--mega{padding-left:50px;padding-right:50px}}@media only screen and (min-width:1200px) and (max-width:1499px){.megamenu--mega{min-width:700px}}.megamenu--mega>li{-webkit-flex-basis:22%;-ms-flex-preferred-size:22%;flex-basis:22%;padding-left:15px;padding-right:15px}.megamenu--mega>li .page-list-title{font-size:14px;margin-bottom:20px;color:#000}.megamenu--mega>li>ul>li>a{padding:10px 0;color:#ababab;line-height:1.2;-webkit-transition:.1s;-o-transition:.1s;transition:.1s}.megamenu--mega>li>ul>li>a:hover{color:#ffc4a0}.megamenu--mega>li>ul>li>a:hover span:after{width:100%;left:0;right:auto}.megamenu--mega>li>ul>li>a>span{position:relative}.megamenu--mega>li>ul>li>a>span:after{content:'';width:0;height:1px;bottom:0;position:absolute;left:auto;right:0;z-index:-1;background-color:#ffc4a0;-webkit-transition:.3s;-o-transition:.3s;transition:.3s}.megamenu--mega>li>ul>li.active>a{color:#ffc4a0}.footer-one .footer-top-area{background-color:#22262a;padding:60px 0 90px}.footer-one .footer-top-area p{color:#fff}.footer-one .footer-bottom-area{background:#2d3135}.footer-one .footer-bottom-area p{color:#fff}.footer-widget{margin-top:30px;max-width:280px;margin-left: 40px;}@media only screen and (max-width:767px){.footer-widget{max-width:100%}}.footer-logo{margin-bottom:20px}.footer-socail-share{margin-top:30px}.footer-socail-share li{display:inline-block;margin-right:15px}.footer-socail-share li:last-child{margin-right:0}@media only screen and (min-width:992px) and (max-width:1199px){.footer-socail-share li{margin-right:5px}}.footer-socail-share li a{height:45px;width:45px;line-height:45px;text-align:center;background-color:#2d3135;border-radius:5px;color:#fff}.footer-socail-share li a:hover{background-color:#ffc4a0;color:#fff}.footer-widget-title{margin-bottom:30px}.footer-widget-title .title{color:#fff}.footer-subscribe-center{margin-right:0;margin-left:auto;margin-right:auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-subscribe-center{margin-left:0}}.footer-subscribe-area{margin-right:0;margin-left:auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-subscribe-area{margin-left:0}}.footer-subscribe-wrap .single-input{margin-bottom:15px}.footer-subscribe-wrap .single-input input{width:100%;max-width:300px;border:1px solid #2d3135;border-radius:10px;font-weight:500;padding:15px 15px;background-color:#2d3135;color:#ffc4a0}.footer-subscribe-wrap .single-input ::-webkit-input-placeholder{color:#fff}.footer-subscribe-wrap .single-input :-ms-input-placeholder{color:#fff}.footer-subscribe-wrap .single-input ::-moz-placeholder{color:#fff}.footer-subscribe-wrap .single-input ::-ms-input-placeholder{color:#fff}.footer-subscribe-wrap .single-input ::placeholder{color:#fff}.footer-menu-widget{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:-10px;margin-left:-5px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.single-footer-menu{width:33.3333%;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-left:5px;padding-right:10px;margin-top:30px}@media only screen and (max-width:575px){.single-footer-menu{width:50%}}.single-footer-menu:last-child{padding-left:50px}@media only screen and (min-width:1200px) and (max-width:1499px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.single-footer-menu:last-child{padding-left:5px}}.footer-widget-menu-list li{margin-bottom:10px}.footer-widget-menu-list li:last-child{margin-bottom:0}.footer-widget-menu-list li a{color:#fff}.footer-bottom-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.footer-bottom-inner .copy-right-text a{color:#ffc4a0}.footer-bottom-inner .button-right-box{margin:10px 0}@media only screen and (max-width:767px){.footer-bottom-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.footer-bottom-inner p{margin-top:20px}}.footer-bottom-area .copy-right-center{text-align:center}.footer-bottom-area .copy-right-text a{color:#ffc4a0}.footer-two .footer-top-area{background-color:#252c63;padding:90px 0 110px}.footer-two .footer-top-area p{color:#fff}@media only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px){.footer-two .footer-top-area{padding:60px 0 90px}}@media only screen and (max-width:767px){.footer-two .footer-top-area{padding:30px 0 60px}}.footer-two .footer-bottom-area{background:#252c63}.footer-two .footer-bottom-area p{color:#fff}.footer-two .footer-bottom-area a{color:#ff7d6b}.footer-two .footer-socail-share li a{background-color:#3b4179}.footer-two .footer-socail-share li a:hover{background-color:#ff7d6b;color:#fff}@media only screen and (max-width:575px){.footer-two .single-footer-menu{width:100%}}.footer-two .footer-subscribe-wrap .single-input input{border:1px solid #353872;background-color:#353872}.footer-two .footer-bottom-area{border-top:1px solid rgba(255,255,255,0.2);padding:20px 0}.footer-three .footer-top-area{background-color:#200b70}.footer-three .footer-widget-top{padding:45px 0 25px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.footer-three .footer-widget-top .footer-logo{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}@media only screen and (min-width:768px) and (max-width:991px){.footer-three .footer-widget-top .footer-logo{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}}.footer-three .footer-widget-top .info-text-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2;margin-bottom:20px}@media only screen and (min-width:768px) and (max-width:991px){.footer-three .footer-widget-top .info-text-box{width:100%;-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}}.footer-three .footer-widget-top .info-text-box .sub-title{font-size:12px;color:#ff7d6b;margin-bottom:10px}.footer-three .footer-widget-top .info-text-box .title{color:#fff;font-size:32px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-three .footer-widget-top .info-text-box .title{font-size:22px}}.footer-three .footer-widget-top .button-right-box{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.footer-three .footer-widget-top .button-right-box .btn-primary{background-color:#218b00;color:#fff}@media only screen and (min-width:768px) and (max-width:991px){.footer-three .footer-widget-top .button-right-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.footer-three .footer-mid-area{background-color:#250c83;padding:70px 0 100px}.footer-three .footer-mid-area .footer-subscribe-wrap .single-input input{border:1px solid #453095;background-color:transparent;border-radius:15px}.footer-three .footer-mid-area .button-box .btn-primary{border-radius:15px}.footer-three .footer-socail-share li a{background-color:#3b4179}.footer-three .footer-socail-share li a:hover{background-color:#a50eff;color:#fff}.footer-three .footer-bottom-area{padding:20px 0;border-top:1px solid #3b2590;background-color:#250c83}.footer-three .footer-bottom-area p{color:#fff}.footer-three .footer-bottom-area a{color:#ff7d6b}.footer-four .footer-top-area{background-color:#5974ff}.footer-four .footer-widget-top{padding:45px 0 25px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.footer-four .footer-widget-top .info-text-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2;margin-bottom:20px}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-widget-top .info-text-box{width:100%;-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}}.footer-four .footer-widget-top .info-text-box .sub-title{font-size:12px;color:#fff;margin-bottom:10px}.footer-four .footer-widget-top .info-text-box .title{color:#fff;font-size:32px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-four .footer-widget-top .info-text-box .title{font-size:22px}}.footer-four .footer-widget-top .button-right-box{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-widget-top .button-right-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.footer-four .footer-widget-top .button-right-box a{color:#222}.footer-four .footer-item-space{padding:100px 0}@media only screen and (min-width:992px) and (max-width:1199px){.footer-four .footer-item-space{padding:80px 0}}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-item-space{padding:30px 0}}@media only screen and (max-width:767px){.footer-four .footer-item-space{padding:20px 0}}.footer-four .footer-widget p{color:#fff}.footer-four .footer-mid-area{background-color:#081131}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-mid-area{padding:50px 0}}@media only screen and (max-width:767px){.footer-four .footer-mid-area{padding:40px 0}}.footer-four .footer-mid-area .footer-widget{margin-top:0}.footer-four .footer-mid-area .footer-border{position:relative}.footer-four .footer-mid-area .footer-border::before{position:absolute;content:'';left:-70px;top:0;height:100%;width:1px;background-color:#171f3d}.footer-four .footer-mid-area .footer-border:last-child::after{position:absolute;content:'';right:-70px;top:0;height:100%;width:1px;background-color:#171f3d}@media only screen and (min-width:1200px) and (max-width:1499px){.footer-four .footer-mid-area .footer-border::before{left:-10px}.footer-four .footer-mid-area .footer-border:last-child::after{right:-10px}}@media only screen and (min-width:992px) and (max-width:1199px){.footer-four .footer-mid-area .footer-border::before{display:none}.footer-four .footer-mid-area .footer-border:last-child::after{display:none;right:0}}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-mid-area .footer-border:last-child::after{display:none}}@media only screen and (max-width:767px){.footer-four .footer-mid-area .footer-border::before{display:none}.footer-four .footer-mid-area .footer-border:last-child::after{display:none}}.footer-four .footer-socail-share li a{background-color:transparent;border:2px solid #fff;border-radius:15px;line-height:38px}.footer-four .footer-socail-share li a:hover{border:2px solid #5974ff;background-color:#5974ff;color:#fff}.footer-four .footer-bottom-area{padding:20px 0;background-color:#081131}.footer-four .footer-bottom-area p{color:#fff}.footer-four .footer-bottom-area a{color:#5974ff}.footer-five .footer-top-area{padding:70px 0 100px;background-color:#5138ee;background-image:url("../images/footer-bg-five.jpg");background-size:cover}@media only screen and (max-width:767px){.footer-five .footer-top-area{padding:30px 0 60px}}.footer-five .footer-subscribe-wrap .single-input input{border:2px solid #fff;padding:15px 30px;background-color:transparent;border-radius:15px}.footer-five .footer-dec-text{color:#fff}.footer-five .footer-socail-share li a{background-color:transparent;border:1px solid #fff}.footer-five .footer-socail-share li a:hover{border:1px solid #fff;background-color:#fff;color:#5138ee}.footer-five .footer-bottom-area{background-color:#462fd7;padding:25px 50px 5px}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:1200px) and (max-width:1499px){.footer-five .footer-bottom-area{padding:25px 0 5px}}.footer-five .copy-right-text{color:#fff}.footer-five .copy-right-text a{color:#fed74b}.footer-bottom-menu-list li{display:inline-block;padding-right:20px;margin-right:20px;position:relative}.footer-bottom-menu-list li::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#ffc4a0;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.footer-bottom-menu-list li a{color:#fff}.footer-bottom-menu-list li a:hover{color:#ffc4a0}.footer-bottom-menu-list li:last-child{padding-right:0;margin-right:0}.footer-bottom-menu-list li:last-child::after{display:none}.scroll-button-buttom .text{color:#fff;margin-right:10px}.scroll-button-buttom .right-side-scroll-up{height:50px;width:50px;line-height:50px;color:#222;background-color:#fed74b;border-radius:10px;text-align:center;font-size:20px}.footer-six .footer-top-area{background-color:#081b3c;padding:80px 0 80px}.footer-six .footer-top-area .footer-newsletter-subscribe{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.footer-six .footer-top-area .footer-newsletter-subscribe .section-title{max-width:500px}.footer-six .footer-top-area .footer-newsletter-subscribe .section-title .title{color:#fff}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-six .footer-top-area .footer-newsletter-subscribe{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.footer-six .footer-top-area .footer-newsletter-subscribe .section-title{max-width:100%;margin-bottom:30px}}.footer-six .footer-top-area .newsletter-input-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;width:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.footer-six .footer-top-area .newsletter-input-box .newsletter-input{max-width:450px;width:100%;border:2px solid #ddd;border-radius:10px;margin-right:20px;padding:5px 30px;font-weight:500;height:60px;background-color:transparent}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::-webkit-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::-moz-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input:-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::placeholder{color:#fff}@media only screen and (min-width:992px) and (max-width:1199px){.footer-six .footer-top-area .newsletter-input-box .newsletter-input{max-width:300px}}@media only screen and (max-width:767px){.footer-six .footer-top-area .newsletter-input-box .newsletter-input{max-width:100%;margin-bottom:20px}}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::-webkit-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::-moz-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input :-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::placeholder{color:#fff}@media only screen and (max-width:767px){.footer-six .footer-top-area .newsletter-input-box{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.footer-six .footer-mid-area{background-color:#0a1e43;padding:90px 0 120px}.footer-six .footer-mid-area .dec-text{color:#fff}.footer-six .footer-socail-share li a{background-color:#5974ff}.footer-six .footer-socail-share li a:hover{background-color:#5974ff;color:#fff}.footer-six .footer-bottom-area{background:#0a1e43;border-top:1px solid #1d3052;padding:20px 0}.footer-six .footer-bottom-area p{color:#fff}.footer-six .footer-bottom-area a{color:#fff}.footer-six .footer-bottom-area .right-side-scroll-up{background-color:#5974ff}@media only screen and (max-width:767px){.footer-six .footer-bottom-area{text-align:center}.footer-six .footer-bottom-area .scroll-button-buttom{margin-top:10px}}.hero-area{background-color:#f7f7f7;padding:80px 0}.hero-inner-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:-15px;margin-left:-15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.hero-inner-area{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.hero-category-area{max-width:290px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px){.hero-category-area{width:35%}}@media only screen and (max-width:767px){.hero-category-area{width:35%}}@media only screen and (max-width:575px){.hero-category-area{width:100%;max-width:100%}}.single-hero-category-item{display:block;margin-bottom:28px;position:relative}.single-hero-category-item:last-child{margin-bottom:0}.single-hero-category-item img{border-radius:15px;width:100%}.single-hero-category-item::after{position:absolute;height:100%;width:100%;content:"";left:0;top:0;background-color:rgba(0,0,0,0.7);border-radius:15px;opacity:0;visibility:hidden;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.single-hero-category-item:hover::after{opacity:1;visibility:visible}.single-hero-category-item:hover .hero-category-inner-box{opacity:1;visibility:visible}.hero-category-inner-box{position:absolute;opacity:0;visibility:hidden;left:0;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:100%;padding:10px 30px;color:#fff;z-index:1;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}@media only screen and (min-width:992px) and (max-width:1199px){.hero-category-inner-box{padding:5px 10px}}@media only screen and (max-width:767px){.hero-category-inner-box{padding:5px 10px}}@media only screen and (max-width:575px){.hero-category-inner-box{padding:10px 30px}}.hero-category-inner-box .title{color:#fff}.hero-category-inner-box .icon{font-size:28px;height:40px;width:40px;background-color:#ffc4a0;line-height:40px;text-align:center;border-radius:50000px}.hero-banner-area{padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px){.hero-banner-area{width:64%}}@media only screen and (max-width:767px){.hero-banner-area{width:64%}}@media only screen and (max-width:575px){.hero-banner-area{margin-top:45px;width:100%;max-width:100%}}.hero-banner-area a{display:block}.hero-banner-area a img{border-radius:15px;width:100%}.hero-blog-post{max-width:375px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px),only screen and (max-width:575px){.hero-blog-post{max-width:100%;width:100%;margin-top:45px}}.single-hero-blog-post{margin-top:45px}.single-hero-blog-post:first-child{margin-top:0}@media only screen and (min-width:992px) and (max-width:1199px){.single-hero-blog-post{margin-top:25px}}.hero-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-blog-post-top{margin-bottom:10px}}.hero-blog-post-category{margin-right:25px}.hero-blog-post-category a{min-width:100px;background:#ffebdf;text-align:center;padding:6px 5px;border-radius:10px}.hero-blog-post-author{color:#9b9ea1}.hero-blog-post-author a{color:#000}.hero-blog-post-title{margin-bottom:20px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-blog-post-title{margin-bottom:10px}}.hero-blog-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.post-meta-left-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.post-meta-left-side span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.post-meta-left-side span a:hover{color:#ffc4a0}.post-meta-left-side span:last-child{padding-right:0;margin-right:0}.post-meta-left-side span:last-child::after{display:none}.post-meta-right-side a{margin-left:10px}.hero-area-two-wrapper{position:relative}.hero-area-two-wrapper .hero-two-banner-text{position:absolute;bottom:0;text-align:center;width:100%}.hero-area-two{background:url("../images/home-2-hero-bg.jpg");background-repeat:no-repeat;background-size:cover;height:850px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#091d40}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-two{height:750px}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.hero-area-two{height:auto;padding:150px 0 100px}}.hero-area-overly{position:relative}.hero-area-overly::before{content:'';background-color:rgba(15,0,84,0.7);height:100%;width:100%;position:absolute;left:0;top:0}.hero-area--two-innter{position:relative}.hero-area--two-innter .sub-title{color:#ff7d6b;text-transform:uppercase;letter-spacing:1px}.hero-area--two-innter .hero-title{color:#fff;font-size:95px;font-weight:bold}.hero-area--two-innter .hero-title-small{font-size:60px;color:#fff;font-weight:bold}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area--two-innter .hero-title{font-size:75px}.hero-area--two-innter .hero-title-small{font-size:40px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area--two-innter .hero-title{font-size:65px}.hero-area--two-innter .hero-title-small{font-size:30px}}@media only screen and (max-width:767px){.hero-area--two-innter .hero-title{font-size:45px}.hero-area--two-innter .hero-title-small{font-size:20px}}@media only screen and (max-width:575px){.hero-area--two-innter .hero-title{font-size:45px}.hero-area--two-innter .hero-title-small{font-size:20px}}.hero-two-tag{max-width:750px;margin:60px auto 0}.hero-two-tag a{margin:10px;padding:0 35px;height:50px;line-height:46px;border:2px solid #fff}.hero-two-tag a:hover{color:#fff}@media only screen and (min-width:992px) and (max-width:1199px){.hero-two-tag{margin:40px auto 0}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.hero-two-tag{margin:30px auto 0}}@media only screen and (max-width:575px){.hero-two-tag a{margin:5px}}.hero-area-three{background:url("../images/home-3-hero-bg.jpg");background-repeat:no-repeat;background-size:cover;height:830px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:relative;background-color:#091d40}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.hero-area-three{height:600px}}.hero-area-three-post .title{color:#fff;font-size:45px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-three-post .title{font-size:36px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-three-post .title{font-size:30px}}@media only screen and (max-width:767px){.hero-area-three-post .title{font-size:28px}}.hero-area-three-post .dec{color:#fff;max-width:470px;font-size:18px}.hero-area-three-post-author{color:#9b9ea1;margin-bottom:15px;font-weight:600;font-size:18px}.hero-area-three-post-author a{color:#fff}.hero-area-three-post-meta{margin-top:25px}.hero-area-three-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:17px;color:#fff}.hero-area-three-post-meta>span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#fff;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.hero-area-three-post-meta>span:last-child{padding-right:0;margin-right:0}.hero-area-three-post-meta>span:last-child::after{display:none}.hero-three-box{margin-right:-60px;margin-left:60px}@media only screen and (min-width:1200px) and (max-width:1499px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.hero-three-box{margin-right:0;margin-left:0}}.hero-three-inner-image{margin-bottom:20px;border-radius:20px;border:1px solid #ddd;padding:15px}.hero-three-inner-image img{border-radius:20px}.hero-swiper-pagination{position:absolute;bottom:40px;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.hero-swiper-pagination .swiper-pagination-bullet{height:16px;width:16px;border-radius:100%;background-color:#8b61b7;margin:5px}.hero-swiper-pagination .swiper-pagination-bullet.swiper-pagination-bullet-active{background-color:#fff}.hero-three-category{text-align:center}.hero-three-category a{margin:15px;min-width:200px;text-align:center;height:66px;line-height:66px;border-radius:15px;background:#f4eaff}.hero-three-category a:hover{background:#a50eff}@media only screen and (min-width:992px) and (max-width:1199px){.hero-three-category a{min-width:140px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-three-category a{min-width:auto;margin:10px 2px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-three-category a{min-width:auto;margin:10px 2px}}@media only screen and (max-width:767px){.hero-three-category a{min-width:auto;margin:10px 2px}}.hero-three-category .category-step-2{width:90%;margin:auto}.hero-area-four{background:url("../images/home-4-hero-bg.jpg");background-repeat:no-repeat;background-size:cover;background-color:#091d40;height:820px;padding-top:150px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-four{height:700px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-four{height:650px}}@media only screen and (max-width:767px){.hero-area-four{height:600px}}@media only screen and (max-width:575px){.hero-area-four{height:600px}}@media only screen and (max-width:479px){.hero-area-four{height:700px}}.hero-four-image{margin-top:-380px;z-index:1;position:relative;text-align:center}@media only screen and (min-width:992px) and (max-width:1199px){.hero-four-image{margin-top:-220px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-four-image{margin-top:-220px}}@media only screen and (max-width:767px){.hero-four-image{margin-top:-200px}}@media only screen and (max-width:575px){.hero-four-image{margin-top:-150px}}@media only screen and (max-width:479px){.hero-four-image{margin-top:-150px}}.hero-four-inner-image{padding:15px;border:2px solid #edf0f8;max-width:770px;border-radius:15px;margin:auto}.hero-four-inner-image img{border-radius:15px}.hero-area-four-post{margin-bottom:40px}.hero-area-four-post .title{color:#fff;font-size:52px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-four-post .title{font-size:46px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-four-post .title{font-size:30px}}@media only screen and (max-width:767px){.hero-area-four-post .title{font-size:28px}}.hero-area-four-post .dec{color:#fff}.hero-area-three-post-author{color:#9b9ea1;margin-bottom:10px;font-weight:600}.hero-area-three-post-author a{color:#fff}.hero-area-four-post-meta{margin-top:20px}.hero-area-four-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:13px;color:#5974ff}.hero-area-four-post-meta>span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#5974ff;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.hero-area-four-post-meta>span a{color:#fff}.hero-area-four-post-meta>span.time{color:#fff}.hero-area-four-post-meta>span:last-child{padding-right:0;margin-right:0}.hero-area-four-post-meta>span:last-child::after{display:none}.slider-four-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:1px solid #e7e5ed;text-align:center;font-size:25px;border-radius:10px;color:#fff;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;position:absolute;background-color:transparent;left:100px;right:auto}.slider-four-slider-navigation .navigation-button.slider-four-button-prev{right:100px;left:auto}.slider-four-slider-navigation .navigation-button:hover{border:1px solid #363449;background-color:#363449}.hero-four-category{border-top:1px solid #edf0f8;border-bottom:1px solid #edf0f8;padding:15px 0}.hero-four-category .category-step-1{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;margin-left:-15px;margin-right:-15px}@media only screen and (max-width:767px){.hero-four-category .category-step-1{-webkit-box-pack:start;-webkit-justify-content:start;-ms-flex-pack:start;justify-content:start}}.hero-four-category a{margin:15px;min-width:200px;text-align:center;border-radius:15px}.hero-four-category a:hover{color:#fff}@media only screen and (min-width:992px) and (max-width:1199px){.hero-four-category a{min-width:140px;margin:10px 2px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-four-category a{min-width:auto;margin:10px 2px}}@media only screen and (max-width:767px){.hero-four-category a{min-width:auto;margin:10px 10px;padding:0 18px}}.hero-four-category .category-step-2{width:90%;margin:auto}.hero-area-five{padding:120px 0}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-five{padding:100px 0}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-five{padding:80px 0}}@media only screen and (max-width:767px){.hero-area-five{padding:60px 0}}.hero-five-text .sub-title{color:#ff7d6b;text-transform:uppercase;margin-bottom:30px}.hero-five-text .title{display:block;font-size:60px;font-weight:700}.hero-five-text .title .hero-five-title{font-size:90px;display:inline-block;position:relative;line-height:1}.hero-five-text .title .hero-five-title::after{position:absolute;content:"";left:0;bottom:2px;height:25px;width:100%;background-color:#fed74b;z-index:-1}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-text .title .hero-five-title{font-size:80px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-five-text .title .hero-five-title{font-size:40px}.hero-five-text .title .hero-five-title::after{height:20px}}@media only screen and (max-width:767px){.hero-five-text .title .hero-five-title{font-size:34px}.hero-five-text .title .hero-five-title::after{height:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-text .title{font-size:46px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-five-text .title{font-size:40px}}@media only screen and (max-width:767px){.hero-five-text .title{font-size:34px}}@media only screen and (max-width:575px){.hero-five-text .title{font-size:30px}}.hero-five-text .hero-text-dec{margin-top:10px;margin-bottom:30px;font-size:20px;font-weight:600;max-width:540px}.hero-five-text .button-box .btn-bg-5{background-color:#5138ee;color:#fff}.hero-five-text .button-box .btn-bg-5:hover{color:#fff}.hero-five-category{margin-right:-30px}.hero-five-category a{margin-right:25px;margin-top:25px}.hero-five-category a:hover{color:#fff}@media only screen and (min-width:1200px) and (max-width:1499px){.hero-five-category a{margin-right:20px}}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-category a{margin-right:15px}}@media only screen and (max-width:767px){.hero-five-category a{margin-right:5px}}@media only screen and (min-width:1200px) and (max-width:1499px){.hero-five-category{margin-right:0}}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-category{margin-right:0}}@media only screen and (max-width:767px){.hero-five-category{margin-right:0}}.hero-six-area{padding:60px 0 100px}.hero-slide-six-image{display:block}@media only screen and (min-width:768px) and (max-width:991px){.hero-slide-six-image img{width:100%}}.hero-slide-post-content{margin-top:20px;margin-bottom:10px;margin-left:40px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-slide-post-content{margin-left:0}}@media only screen and (min-width:768px) and (max-width:991px){.hero-slide-post-content{margin-left:0}}@media only screen and (max-width:767px){.hero-slide-post-content{margin-left:0}}.hero-slide-post-author{color:#9b9ea1}.hero-slide-post-author a{color:#091d40}@media only screen and (max-width:479px){.hero-slide-post-author{font-size:12px}}.hero-slide-post-title{margin-bottom:25px;font-size:32px;font-weight:800;color:#0f034a}@media only screen and (min-width:992px) and (max-width:1199px){.hero-slide-post-title{font-size:30px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-slide-post-title{font-size:22px;margin-bottom:10px}}@media only screen and (max-width:767px){.hero-slide-post-title{font-size:22px}}.hero-slide-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}@media only screen and (max-width:479px){.hero-slide-post-meta{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.hero-slide-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:600}.hero-slide-post-meta span::after{position:absolute;content:"";right:-5px;top:50%;height:4px;width:4px;background:#091d40;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.hero-slide-post-meta span a:hover{color:#5974ff}.hero-slide-post-meta span:last-child{padding-right:0;margin-right:0}.hero-slide-post-meta span:last-child::after{display:none}.hero-read-more-button a{border-bottom:1px solid #ddd;display:inline-block;font-weight:600;color:#0f034a}.hero-read-more-button a i{font-size:18px;margin-left:10px}.slider-six-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #e6e8ec;text-align:center;font-size:25px;border-radius:10px;color:#333;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;left:100px;right:auto;position:absolute;top:50%;z-index:1;background-color:transparent}.slider-six-slider-navigation .navigation-button.slider-six-button-prev{right:100px;left:auto}.slider-six-slider-navigation .navigation-button:hover{border:1px solid #5138ee;background-color:#5138ee;color:#fff}@media only screen and (min-width:1200px) and (max-width:1499px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.slider-six-slider-navigation .navigation-button{left:20px}.slider-six-slider-navigation .navigation-button.slider-six-button-prev{right:20px}}.trending-article-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:-15px;margin-left:-15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.trending-article-row{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.trending-article-left-side{max-width:515px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.trending-article-left-side{max-width:100%}}.trending-article-right-side{max-width:675px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.trending-article-right-side{margin-top:30px}}.trending-single-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:35px}.trending-single-item:first-child{margin-top:0}@media only screen and (max-width:767px){.trending-single-item{margin-top:20px}}.trending-single-item .trending-post-thum{max-width:160px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (max-width:479px){.trending-single-item .trending-post-thum{max-width:100px}}.trending-single-item .trending-post-thum img{height:100%;vertical-align:middle;-o-object-fit:cover;object-fit:cover;border-radius:10px}.trending-single-item .trending-post-content{margin-left:30px}@media only screen and (max-width:479px){.trending-single-item .trending-post-content{margin-left:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.trending-single-item .trending-post-content{margin-left:15px}}.trending-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px}@media only screen and (max-width:479px){.trending-blog-post-top{margin-bottom:10px}}.trending-blog-post-category{margin-right:25px}.trending-blog-post-category a{min-width:100px;text-align:center;padding:4px 5px;border-radius:10px;color:#fff;background: #ffc107;}@media only screen and (max-width:479px){.trending-blog-post-category{margin-right:15px}.trending-blog-post-category a{min-width:40px;font-size:12px;padding:2px 5px}}.trending-blog-post-author{color:#9b9ea1}.trending-blog-post-author a{color:#000}@media only screen and (max-width:479px){.trending-blog-post-author{font-size:12px}}.trending-blog-post-title{margin-bottom:15px}.trending-blog-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.trending-meta-left-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.trending-meta-left-side span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.trending-meta-left-side span a:hover{color:#ffc4a0}.trending-meta-left-side span:last-child{padding-right:0;margin-right:0}.trending-meta-left-side span:last-child::after{display:none}.post-meta-right-side a{margin-left:10px}.large-banner-trending-article{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-banner-trending-article .trending-single-item{margin-top:45px}.large-banner-trending-article .trending-single-item:first-child{margin-top:15px}@media only screen and (min-width:992px) and (max-width:1199px){.large-banner-trending-article .trending-single-item{margin-top:25px}.large-banner-trending-article .trending-single-item:first-child{margin-top:5px}}@media only screen and (max-width:479px){.large-banner-trending-article .trending-single-item{margin-top:15px}}.trending-large-post-thum{max-width:315px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (max-width:767px){.trending-large-post-thum{max-width:160px}}@media only screen and (max-width:479px){.trending-large-post-thum{max-width:100px}}.trending-large-post-thum img{height:100%;vertical-align:middle;-o-object-fit:cover;object-fit:cover;border-radius:10px}.trending-tody-content{margin-top:20px;margin-bottom:10px;margin-left:40px}@media only screen and (min-width:992px) and (max-width:1199px){.trending-tody-content{margin-left:0}}@media only screen and (min-width:768px) and (max-width:991px){.trending-tody-content{margin-left:0}}@media only screen and (max-width:767px){.trending-tody-content{margin-left:0}}.trending-tody-post-author{color:#9b9ea1;margin-bottom:10px;font-size:18px}.trending-tody-post-author a{color:#5974ff}@media only screen and (max-width:479px){.trending-tody-post-author{font-size:12px}}.trending-tody-post-title{margin-bottom:20px;font-size:52px}@media only screen and (min-width:1200px) and (max-width:1499px){.trending-tody-post-title{font-size:42px}}@media only screen and (min-width:992px) and (max-width:1199px){.trending-tody-post-title{font-size:36px}}@media only screen and (min-width:768px) and (max-width:991px){.trending-tody-post-title{font-size:26px;margin-bottom:10px}}@media only screen and (max-width:767px){.trending-tody-post-title{font-size:26px}}.trending-tody-content .dec{font-size:18px}.trending-tody-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;font-size:17px}.trending-tody-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:600}.trending-tody-post-meta span::after{position:absolute;content:"";right:-5px;top:50%;height:4px;width:4px;background:#5974ff;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.trending-tody-post-meta span a:hover{color:#5974ff}.trending-tody-post-meta span:last-child{padding-right:0;margin-right:0}.trending-tody-post-meta span:last-child::after{display:none}.trending-tody-swiper-pagination{margin-top:80px;text-align:center}.trending-tody-swiper-pagination .swiper-pagination-bullet{height:12px;width:12px;border-radius:5000px;background-color:#0f034a;margin:10px}.trending-tody-swiper-pagination .swiper-pagination-bullet.swiper-pagination-bullet-active{background-color:#5974ff;border-radius:5000px}@media only screen and (max-width:767px){.trending-tody-swiper-pagination{margin-top:40px}}.trending-tody-two-box{background-color:#fff;padding:43px 40px;border-radius:15px;-webkit-transition:.3s ease-in-out;-o-transition:.3s ease-in-out;transition:.3s ease-in-out}.trending-tody-two-box .trending-tody-two-post-title{font-size:18px}.trending-tody-two-box:hover{background-color:#5138ee}.trending-tody-two-box:hover .trending-tody-two-post-author{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-author a{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-title{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-meta{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-meta span::after{background:#fff}.trending-tody-two-post-author{color:#9b9ea1;margin-bottom:12px;font-weight:500;-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}.trending-tody-two-post-author a{color:#0f034a;-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}@media only screen and (max-width:479px){.trending-tody-two-post-author{font-size:12px}}.trending-tody-two-post-title{color:#0f034a}.trending-tody-two-post-title a{-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}.trending-tody-two-post-title a:hover{color:#fff}.trending-tody-two-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:20px;color:#7e7e7e}.trending-tody-two-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:500}.trending-tody-two-post-meta span::after{position:absolute;content:"";right:-5px;top:50%;height:4px;width:4px;background:#0f034a;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.trending-tody-two-post-meta span a{-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}.trending-tody-two-post-meta span a:hover{color:#5974ff}.trending-tody-two-post-meta span:last-child{padding-right:0;margin-right:0}.trending-tody-two-post-meta span:last-child::after{display:none}.trending-tody-two-slider-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.trending-tody-two-slider-navigation .navigation-button{color:#0f034a;font-size:24px;height:20px;line-height:20px;background-color:transparent;border-radius:0}.trending-tody-two-slider-navigation .navigation-button.trending-tody-button-prev{margin-left:20px;padding-left:20px;border-left:1px solid #dadada}.from-following-hader-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:20px 0;border-top:1px solid #f3f3f3;border-bottom:1px solid #f3f3f3;margin-bottom:40px}@media only screen and (max-width:575px){.from-following-hader-area{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.from-following-hader-area .section-title{margin-bottom:20px}}.from-following-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:-0.5rem}.from-following-left-side{max-width:873px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}@media only screen and (min-width:992px) and (max-width:1199px){.from-following-left-side{max-width:650px}}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.from-following-left-side{min-width:100%;max-width:100%}}.from-following-right-side{max-width:335px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.following-post-thum{display:block}.following-post-thum img{border-radius:15px}.single-following-post{margin-bottom:40px}.following-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px;margin-top:25px}@media only screen and (max-width:479px){.following-blog-post-top{margin-bottom:10px}}.following-blog-post-category{margin-right:25px}.following-blog-post-category a{min-width:100px;background:#ffebdf;text-align:center;padding:4px 5px;border-radius:10px}@media only screen and (max-width:479px){.following-blog-post-category{margin-right:15px}.following-blog-post-category a{min-width:40px;font-size:12px;padding:2px 5px}}.following-blog-post-author{color:#9b9ea1}.following-blog-post-author a{color:#000}@media only screen and (max-width:479px){.following-blog-post-author{font-size:12px}}.following-blog-post-title{margin-bottom:15px}.following-blog-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.following-meta-left-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.following-meta-left-side span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.following-meta-left-side span a:hover{color:#ffc4a0}.following-meta-left-side span:last-child{padding-right:0;margin-right:0}.following-meta-left-side span:last-child::after{display:none}.following-author-area{border:1px solid #f3f3f3;border-radius:10px;text-align:center;padding:30px 15px}.following-author-area .author-image{border:1px solid #f3f3f3;display:inline-block;border-radius:50000px;width:150px;height:150px;padding:11px;margin-bottom:25px}.following-author-area .author-image img{border-radius:50%;}.following-author-area .author-title{margin-bottom:20px}.following-author-area .author-details p{margin-bottom:20px}.following-author-area .author-post-share{margin-bottom:30px}.following-add-banner{margin-top:40px}.trending-topic-section-title{max-width:232px;padding:0 15px}@media only screen and (min-width:992px) and (max-width:1199px){.trending-topic-section-title{max-width:200px}}@media only screen and (min-width:768px) and (max-width:991px){.trending-topic-section-title{max-width:100%}}@media only screen and (max-width:767px){.trending-topic-section-title{max-width:100%}}.trending-topic-item-wrap{max-width:968px}@media only screen and (min-width:992px) and (max-width:1199px){.trending-topic-item-wrap{max-width:758px}}@media only screen and (min-width:768px) and (max-width:991px){.trending-topic-item-wrap{max-width:100%}}@media only screen and (max-width:767px){.trending-topic-item-wrap{max-width:100%}}.single-trending-topic-item{text-align:center}.single-trending-topic-item a{display:block;min-width:120px;max-width:100%;position:relative}.single-trending-topic-item a img{border-radius:15px;width:100%}.single-trending-topic-item a .title{position:absolute;bottom:20px;text-align:center;width:100%;color:#fff}.trending-topic-navigation{margin-bottom:20px}.trending-topic-navigation .navigation-button{background-color:#313438;color:#fff}.trending-topic-navigation .navigation-button:hover{background-color:#ffc4a0}.newsletter-subscribe-inner{background-color:#fff;padding:70px;border-radius:10px;position:relative;overflow:hidden}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-subscribe-inner{padding:70px 50px}}@media only screen and (max-width:767px){.newsletter-subscribe-inner{padding:60px 30px}}@media only screen and (max-width:575px){.newsletter-subscribe-inner{padding:60px 20px}}.newsletter-input-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;z-index:1;position:relative}.newsletter-input-box .newsletter-input{max-width:450px;width:100%;border:1px solid #ddd;border-radius:10px;margin-right:20px;padding:5px 15px;font-weight:500;height:60px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.newsletter-input-box .newsletter-input{max-width:300px}}@media only screen and (max-width:767px){.newsletter-input-box .newsletter-input{max-width:100%;margin-bottom:20px}}@media only screen and (max-width:767px){.newsletter-input-box{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.newsletter-inner-image .newsletter-image-01{position:absolute;bottom:0;left:18%;z-index:0}.newsletter-inner-image .newsletter-image-02{position:absolute;bottom:0;right:34px;z-index:0}.related-newsletter-box{background:url("../images/home-two-newsletter-bg.jpg");border-radius:10px;background-size:cover;background-position:center}.related-newsletter-inner-box{max-width:730px;margin:auto;text-align:center;padding:80px 15px}.related-newsletter-inner-box .title{color:#fff;font-size:44px;font-weight:bold}.related-newsletter-inner-box .title .normal-width{font-weight:500}@media only screen and (min-width:768px) and (max-width:991px){.related-newsletter-inner-box .title{font-size:30px}}@media only screen and (max-width:767px){.related-newsletter-inner-box .title{font-size:30px}}.related-newsletter-three-box{background:url("../images/home-three-newsletter-bg.jpg");border-radius:10px;background-size:cover;background-position:center;position:relative}.related-newsletter-three-inner-box{max-width:894px;text-align:left;padding:80px 100px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.related-newsletter-three-inner-box{padding:60px 40px}}@media only screen and (max-width:575px){.related-newsletter-three-inner-box{padding:60px 40px 100px}}.related-newsletter-three-inner-box .title{color:#fff;font-weight:bold;font-size:44px}.related-newsletter-three-inner-box .title .normal-width{font-weight:500}@media only screen and (min-width:768px) and (max-width:991px){.related-newsletter-three-inner-box .title{font-size:30px}}@media only screen and (max-width:767px){.related-newsletter-three-inner-box .title{font-size:30px}}.subscribe-today-update{position:absolute;bottom:60px;right:70px;width:250px}.subscribe-today-update .today-update-text{font-size:28px;color:#fff;font-weight:400}.subscribe-today-update .today-update-text span{font-weight:600}@media only screen and (min-width:768px) and (max-width:991px){.subscribe-today-update{right:40px}.subscribe-today-update .today-update-text{font-size:22px}}@media only screen and (max-width:767px){.subscribe-today-update{right:20px}.subscribe-today-update .today-update-text{font-size:18px}}@media only screen and (max-width:575px){.subscribe-today-update{left:45px;bottom:30px;width:150px}.subscribe-today-update .today-update-text{font-size:18px}}.newsletter-four-box{background:url("../images/home-four-newsletter-bg.jpg");border-radius:10px;background-size:cover;background-position:center;background-color:#fff;padding:70px;border-radius:15px;position:relative;overflow:hidden}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-four-box{padding:70px 50px}}@media only screen and (max-width:767px){.newsletter-four-box{padding:60px 30px}}@media only screen and (max-width:575px){.newsletter-four-box{padding:60px 20px}}.newsletter-four-box .title{color:#fff;font-weight:500;margin-bottom:10px;font-size:44px}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-four-box .title{font-size:36px}}@media only screen and (max-width:767px){.newsletter-four-box .title{font-size:30px}}.newsletter-four-box p{color:#fff;font-size:25px}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-four-box p{font-size:20px}}@media only screen and (max-width:767px){.newsletter-four-box p{font-size:18px}}.newsletter-four-box .newsletter-input-box{margin-top:30px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.newsletter-four-box .newsletter-input-box .newsletter-input{background:transparent;border:1px solid #fff;color:#fff;border-radius:15px;padding:0 30px}.newsletter-four-box .newsletter-input-box .newsletter-input::-webkit-input-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input:-ms-input-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input::-moz-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input::-ms-input-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input::placeholder{color:#fff}.newsletter-inner-image .newsletter-image-01{position:absolute;bottom:0;left:18%;z-index:0}.newsletter-inner-image .newsletter-image-02{position:absolute;bottom:0;right:34px;z-index:0}.featured-video-col-8{max-width:847px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:1200px) and (max-width:1499px){.featured-video-col-8{max-width:846px;width:100%}}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.featured-video-col-8{max-width:100%}}.latest-post-col-4{max-width:363px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:1200px) and (max-width:1499px){.latest-post-col-4{max-width:360px;width:100%}}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.latest-post-col-4{max-width:100%}}.featured-video-haader{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:575px){.featured-video-haader{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}}.featured-video-list .featured-video-list-item{padding-right:40px;margin-right:25px;position:relative}@media only screen and (max-width:767px){.featured-video-list .featured-video-list-item{padding-right:25px;margin-right:8px}}@media only screen and (max-width:575px){.featured-video-list .featured-video-list-item{margin-top:20px}}.featured-video-list .featured-video-list-item::after{position:absolute;right:0;top:50%;content:'\eab8';font-family:IcoFont;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.featured-video-list .featured-video-list-item .featured-video-link{font-weight:600}.featured-video-list .featured-video-list-item .featured-video-link.active{color:#ffc4a0}.featured-video-list .featured-video-list-item:last-child{padding-right:0;margin-right:0}.featured-video-list .featured-video-list-item:last-child::after{display:none}.single-featured-video-item{margin-bottom:30px}.featured-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px;margin-top:25px}@media only screen and (max-width:479px){.featured-blog-post-top{margin-bottom:10px}}.featured-blog-post-top .post-meta-right-side{margin-left:30px}@media only screen and (max-width:767px){.featured-blog-post-top .read-time{display:none}}.latest-post-inner-wrap{padding:30px 24px;background:#fafafa;border-radius:10px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.latest-post-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.latest-post-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.latest-post-slider-navigation .navigation-button{background-color:#222;color:#fff}.latest-post-slider-navigation .navigation-button:hover{background-color:#ffc4a0}.single-latest-post{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:20px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.single-latest-post{width:50%;padding-right:15px}}.latest-post-thum{-webkit-flex-basis:0 0 auto;-ms-flex-preferred-size:0 0 auto;flex-basis:0 0 auto;min-width:84px}.latest-post-thum a img{border-radius:10px;height: 66px;}.latest-post-content{margin-left:20px}.latest-post-content .title{margin-top:0;font-size:15px}.latest-post-content .latest-post-meta{font-size:12px;margin-top:10px}.latest-post-content .latest-post-meta span{position:relative;padding-right:6px;margin-right:6px}.latest-post-content .latest-post-meta span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.latest-post-content .latest-post-meta span a:hover{color:#ffc4a0}.latest-post-content .latest-post-meta span:last-child{padding-right:0;margin-right:0}.latest-post-content .latest-post-meta span:last-child::after{display:none}.stay-in-touch-area{margin-top:30px;padding:30px 24px;background:#fafafa;border-radius:10px;text-align:center}.stay-in-touch-box{margin-top:30px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.single-touch-col{width:33.333%;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-left:5px;padding-right:5px}.single-touch{background-color:#ebebeb;width:100%;margin-bottom:10px;text-align:center;border-radius:10px;padding:14px 10px}.single-touch.facebook .touch-socail-icon{background:#4867AA}.single-touch.twitter .touch-socail-icon{background:#1DA1F2}.single-touch.behance .touch-socail-icon{background:#1869FF}.single-touch.youtube .touch-socail-icon{background:#FE0000}.single-touch.dribbble .touch-socail-icon{background:#EA4C8A}.single-touch.linkedin .touch-socail-icon{background:#007BB6}.single-touch p{color:#000;font-size:12px}.single-touch:hover.facebook{background:#4867AA}.single-touch:hover.facebook .touch-socail-icon{color:#4867AA;background:#fff}.single-touch:hover.twitter{background:#1DA1F2}.single-touch:hover.twitter .touch-socail-icon{color:#1DA1F2;background:#fff}.single-touch:hover.behance{background:#1869FF}.single-touch:hover.behance .touch-socail-icon{color:#1869FF;background:#fff}.single-touch:hover.youtube{background:#FE0000}.single-touch:hover.youtube .touch-socail-icon{color:#FE0000;background:#fff}.single-touch:hover.dribbble{background:#EA4C8A}.single-touch:hover.dribbble .touch-socail-icon{color:#EA4C8A;background:#fff}.single-touch:hover.linkedin{background:#007BB6}.single-touch:hover.linkedin .touch-socail-icon{color:#007BB6;background:#fff}.single-touch:hover p{color:#fff}.touch-socail-icon{height:40px;width:40px;text-align:center;line-height:40px;margin:auto;margin-bottom:5px;border-radius:100%;color:#fff}.recent-reading-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:15px 0;border-top:1px solid #f3f3f3;border-bottom:1px solid #f3f3f3}@media only screen and (max-width:575px){.recent-reading-header{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:self-end;-webkit-align-items:self-end;-ms-flex-align:self-end;align-items:self-end}}.recent-reading-header .recent-article-date{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.recent-reading-header .recent-article-date .date-button{margin-left:15px;height:48px;width:48px;line-height:48px;text-align:center;background-color:#f8f7fc;border-radius:10px}.single-recent-reading-post{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:40px}.recent-reading-post-thum{width:120px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.recent-reading-post-author{color:#9b9ea1;margin-bottom:10px}.recent-reading-post-author a{color:#000}.recent-reading-post-content{margin-left:25px}@media only screen and (max-width:575px){.recent-reading-post-content{margin-left:10px}}.recent-reading-post-meta{font-size:12px;margin-top:10px}.recent-reading-post-meta span{position:relative;padding-right:10px;margin-right:10px}.recent-reading-post-meta span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.recent-reading-post-meta span a:hover{color:#ffc4a0}.recent-reading-post-meta span:last-child{padding-right:0;margin-right:0}.recent-reading-post-meta span:last-child::after{display:none}.archive-search-box{position:relative;margin-top:20px}.archive-search-box .search-input{width:100%;background-color:#f8f7fc;border-radius:10px;position:relative;border:0;font-weight:500;padding:16px 40px 16px 30px}.archive-search-box .search-button{position:absolute;top:50%;right:0;background-color:transparent;color:#5974ff;padding:10px 15px;border:0;font-size:20px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.archive-post-inner-wrap{border-radius:10px;max-width:300px;margin-left:auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.archive-post-inner-wrap{max-width:100%;margin-top:60px}}.single-archive-post{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:20px}.archive-post-thum{-webkit-flex-basis:0 0 auto;-ms-flex-preferred-size:0 0 auto;flex-basis:0 0 auto;min-width:84px}.archive-post-thum a img{border-radius:10px}.archive-post-content{margin-left:20px}.archive-post-content .title{margin-top:0;font-size:15px}.archive-post-content .archive-post-meta{font-size:12px;margin-top:10px}.archive-post-content .archive-post-meta span{position:relative;padding-right:6px;margin-right:6px}.archive-post-content .archive-post-meta span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.archive-post-content .archive-post-meta span a:hover{color:#ffc4a0}.archive-post-content .archive-post-meta span:last-child{padding-right:0;margin-right:0}.archive-post-content .archive-post-meta span:last-child::after{display:none}.follow-us-box{margin-top:20px}.single-follow-col{margin-bottom:15px}.single-follow{background-color:#f8f7fc;padding:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;border-radius:15px;padding:17px 20px}.single-follow i{margin-right:5px}.single-follow .socail-title{font-weight:600}.single-follow:hover{background-color:#5974ff;color:#fff}.single-follow:hover .follow-share-onover .follow-title{opacity:0;visibility:hidden}.single-follow:hover .follow-share-onover .follow-hover{opacity:1;visibility:visible;color:#fff}.single-follow:hover .follow-socail-icon{color:#fff}.follow-share-onover{position:relative}.follow-share-onover p{margin-bottom:0;position:absolute;right:0;-webkit-transition:all .3s ease-in;-o-transition:all .3s ease-in;transition:all .3s ease-in;color:#000}.follow-share-onover .follow-title{opacity:1;visibility:visible}.follow-share-onover .follow-hover{opacity:0;visibility:hidden}.bottom-add-banner-box{position:relative}.bottom-add-banner-boxa{display:block}@media only screen and (max-width:767px){.bottom-add-banner-box img{height:100px;-o-object-fit:cover;object-fit:cover;border-radius:10px}}.bottom-add-text{font-size:25px;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);left:50px;display:inline-block}.bottom-add-text span{display:block;font-size:32px;text-align:left;margin-top:3px}@media only screen and (max-width:767px){.bottom-add-text{font-size:16px}.bottom-add-text span{font-size:18px}}.single-most-populer-item{margin-top:40px}.most-populer-thum{display:block}.most-populer-thum img{border-radius:10px;width:100%}.most-populer-content{margin-top:25px}.most-populer-content .title{color:#0f034a;margin-top:10px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.most-populer-content .most-populer-post-meta{margin-top:10px}.most-populer-content .most-populer-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:13px;color:#0f034a}.most-populer-content .most-populer-post-meta>span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.most-populer-content .most-populer-post-meta>span:last-child{padding-right:0;margin-right:0}.most-populer-content .most-populer-post-meta>span:last-child::after{display:none}.most-populer-post-author{color:#9b9ea1;font-weight:600}.most-populer-post-author a{color:#0f034a}.most-popular-slider-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.most-popular-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:1px solid #e7e5ed;text-align:center;font-size:25px;border-radius:10px;color:#0f034a;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.most-popular-slider-navigation .navigation-button.popular-swiper-button-next{margin-left:10px}.most-popular-slider-navigation .navigation-button:hover{border:1px solid #ff7d6b;background-color:#ff7d6b;color:#fff}.special-banner-blog-post .single-special-banner-post{border-bottom:1px solid #e3e3e3;padding-bottom:30px}.special-banner-blog-post .single-special-banner-post:last-child{border-bottom:0}.recent-article-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.recent-article-header .recent-article-date{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.recent-article-header .recent-article-date .date-button{margin-left:15px;height:48px;width:48px;line-height:48px;text-align:center;background-color:#f4f4f4;border-radius:10px}@media only screen and (max-width:575px){.recent-article-header{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.recent-article-header .recent-article-date{margin-top:10px}}.section-border-bottom{border-bottom:1px solid #e3e3e3;padding-bottom:30px}.recent-article-header-two{padding-top:60px;margin-top:60px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:767px){.recent-article-header-two{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.recent-article-header-two .input-search-box{position:relative;width:340px}.recent-article-header-two .input-search-box .input{border:1px solid #ddd;border-radius:15px;position:relative;height:60px;padding:15px 50px 15px 30px;font-weight:500;width:100%}.recent-article-header-two .input-search-box .submit-button{position:absolute;right:15px;height:60px;background:transparent;border:0}@media only screen and (max-width:767px){.recent-article-header-two .input-search-box{width:300px;margin-top:30px}}.single-recent-article-item{margin-top:45px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}@media only screen and (max-width:575px){.single-recent-article-item{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.recent-article-thum{display:block;max-width:360px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px){.recent-article-thum{max-width:300px}}@media only screen and (min-width:768px) and (max-width:991px){.recent-article-thum{max-width:300px}}@media only screen and (max-width:767px){.recent-article-thum{max-width:200px}}@media only screen and (max-width:575px){.recent-article-thum{max-width:100%}}.recent-article-thum img{border-radius:10px;width:100%;height:100%;vertical-align:middle;-o-object-fit:cover;object-fit:cover}.recent-article-content{margin-left:35px;margin-top:15px}@media only screen and (max-width:575px){.recent-article-content{margin-left:0;margin-top:30px}}.recent-article-content .title{color:#0f034a;margin-top:10px}.recent-article-content .recent-article-post-meta{margin-top:10px}.recent-article-content .recent-article-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:13px;color:#0f034a}.recent-article-content .recent-article-post-meta>span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.recent-article-content .recent-article-post-meta>span:last-child{padding-right:0;margin-right:0}.recent-article-content .recent-article-post-meta>span:last-child::after{display:none}.recent-article-post-author{color:#9b9ea1;font-weight:600}.recent-article-post-author a{color:#0f034a}.recent-post-right-area{padding-left:26px}.trusted-partners-box{padding:80px 100px;background-color:#f4eaff;border-radius:15px}.trusted-partners-box .trusted-partners-slider-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (min-width:992px) and (max-width:1199px){.trusted-partners-box{padding:60px 80px}}@media only screen and (min-width:768px) and (max-width:991px){.trusted-partners-box{padding:60px 40px}}@media only screen and (max-width:767px){.trusted-partners-box{padding:60px 30px}}.trusted-partners-area{padding:60px 0}.partners-swiper-pagination{margin-top:40px;text-align:center}.partners-swiper-pagination .swiper-pagination-bullet{height:14px;width:14px;border-radius:100%;background-color:#8b61b7;margin:8px}.partners-swiper-pagination .swiper-pagination-bullet.swiper-pagination-bullet-active{background-color:#0f034a;border-radius:100%}.single-platform-box{background-color:#fafafa;padding:40px;border-radius:10px;margin-top:30px}@media only screen and (max-width:575px){.single-platform-box{padding:40px 20px}}.platform-icon{background-color:#ffc4a0;display:inline-block;height:90px;width:90px;line-height:90px;text-align:center;border-radius:10px;margin-bottom:20px}.platform-content .title{margin-bottom:20px}.platform-d-flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}@media only screen and (max-width:767px){.platform-d-flex{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.platform-content-box{max-width:300px;padding-right:20px}@media only screen and (min-width:992px) and (max-width:1199px){.platform-content-box{max-width:250px}}@media only screen and (max-width:767px){.platform-content-box{max-width:100%;margin-bottom:30px}}.plateform-image-box{margin-left:30px}@media only screen and (max-width:767px){.plateform-image-box{margin-left:0}}.bunzo-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-top:1px solid #ddd;border-bottom:1px solid #ddd}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.bunzo-row{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;border-bottom:0}}.bunzo-col-6{width:50%;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;border-left:1px solid #ddd;height:100%}.bunzo-col-6:first-child{border-left:none}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.bunzo-col-6{width:100%;border-right:0;border-bottom:1px solid #ddd}}.bunzo-history-title{font-size:62px;font-weight:300;margin-right:30px;margin-top:30px;margin-bottom:30px}.bunzo-history-title .f-w-bold{font-weight:600}@media only screen and (min-width:992px) and (max-width:1199px){.bunzo-history-title{font-size:42px}}@media only screen and (min-width:768px) and (max-width:991px){.bunzo-history-title{font-size:42px}}@media only screen and (max-width:767px){.bunzo-history-title{font-size:22px}}.single-history-item{border-bottom:1px solid #ddd;padding:60px 0 60px 90px}.single-history-item:last-child{border-bottom:0}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.single-history-item{padding:30px 30px 30px 30px;border-right:1px solid #ddd}}.plateforem-image{position:relative}.plateforem-image .platform-box-button{position:absolute;width:100%;bottom:30px;text-align:center;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.single-team-area{position:relative;overflow:hidden;margin-top:40px}.single-team-area .team-thum img{width:100%}.single-team-area:hover .team-content{opacity:1;visibility:visible}.single-team-area:hover .team-share-top{margin-top:20px}.single-team-area:hover .team-member-info{margin-bottom:20px}.team-content{opacity:0;visibility:hidden;position:absolute;height:100%;width:100%;top:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;text-align:center;border-radius:10px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;background:-webkit-linear-gradient(bottom,rgba(0,0,0,0.9) 0,rgba(253,195,158,0.9) 100%)}.team-share-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:0;-webkit-transition:all .4s ease-in-out;-o-transition:all .4s ease-in-out;transition:all .4s ease-in-out}.shate-action-button{margin-left:20px;height:40px;width:40px;line-height:40px;background-color:#fff;border-radius:10px;text-align:center;font-weight:600}.shate-action-button:hover{background-color:#222;color:#fff}.team-social-share{text-align:right;margin-right:20px}.team-social-share li{display:inline-block;margin:0 3px}.team-social-share li a{height:40px;width:40px;line-height:40px;background-color:#fff;border-radius:10px;text-align:center}.team-social-share li a:hover{background-color:#222;color:#fff}.team-member-info{margin-bottom:0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.team-member-info .name-title{color:#fff}.team-member-info .desination{color:#ffc4a0}.blog-details-col-8{max-width:847px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px){.blog-details-col-8{max-width:603px}}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.blog-details-col-8{max-width:100%}}.blog-details-col-4{max-width:363px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px){.blog-details-col-4{max-width:363px}}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.blog-details-col-4{max-width:100%}}@media only screen and (min-width:992px) and (max-width:1199px){.blog-details-col-4 .single-latest-post{width:100%;padding-right:0}}.blog-details-meta-box{margin-top:20px;margin-bottom:5px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.blog-details-meta-box .post-meta-left-side,.blog-details-meta-box .post-mid-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.blog-details-meta-box .post-mid-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.blog-details-meta-box .post-mid-side span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.blog-details-meta-box .post-mid-side span a:hover{color:#ffc4a0}.blog-details-meta-box .post-mid-side span:last-child{padding-right:0;margin-right:0}.blog-details-meta-box .post-mid-side span:last-child::after{display:none}@media only screen and (max-width:767px){.blog-details-meta-box{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.blockquote-box{background-color:#fafafa;padding:60px 60px;text-align:center;position:relative;margin-top:30px}.blockquote-box::before{color:#ffc4a0;font-size:106px;position:absolute;content:"“";height:auto;width:105px;line-height:100px;top:30px;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.blockquote-box .blockquote-text{font-size:20px;font-weight:600;margin-top:30px}@media only screen and (max-width:767px){.blockquote-box{padding:60px 30px}.blockquote-box .blockquote-text{font-size:16px}}.blog-details-tag-and-share-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:30px}@media only screen and (max-width:767px){.blog-details-tag-and-share-area{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.blog-details-tag-and-share-area .social-share-area{margin-top:30px}}.related-post-thum img{width:100%}.comment-form-area{margin-top:30px}.comment-form-area .single-input{margin-bottom:20px}.comment-form-area .single-input input,.comment-form-area .single-input textarea{border:1px solid #efefef;border-radius:5px;width:100%;padding:15px 30px;background-color:#fafafa}.comment-form-area .single-input textarea{height:280px}.blog-details-two-header{max-width:800px;text-align:center;margin:auto;margin-top:40px}.blog-details-two-post-title{margin-bottom:25px;font-size:32px;font-weight:bold;color:#0f034a}.blog-details-two-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:20px}@media only screen and (max-width:479px){.blog-details-two-post-meta{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.blog-details-two-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:600}.blog-details-two-post-meta span::after{position:absolute;content:"";right:-5px;top:50%;height:4px;width:4px;background:#091d40;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.blog-details-two-post-meta span a:hover{color:#5974ff}.blog-details-two-post-meta span:last-child{padding-right:0;margin-right:0}.blog-details-two-post-meta span:last-child::after{display:none}.blog-details-two-post-author{color:#9b9ea1}.blog-details-two-post-author a{color:#091d40}@media only screen and (max-width:479px){.blog-details-two-post-author{font-size:12px}}.blog-details-two-tags a{margin-left:10px;margin-right:10px;margin-top:20px;height:40px;border-radius:10px;line-height:40px}.blog-details-two-post-text .title{color:#0a1e43}.table-content-list .table-content-item{position:relative;padding:20px;padding-left:50px;background-color:transparent;border-radius:15px;border:1px solid #eee;margin-bottom:10px;font-weight:600;color:#5138ee;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.table-content-list .table-content-item:hover{background-color:#eeee}.table-content-list .table-content-item::before{content:'\ea98';position:absolute;left:20px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-family:IcoFont;color:#0a1e43}.blockquote-box-two{margin-top:40px;margin-bottom:40px;background-color:#5138ee;padding:80px 60px;text-align:center}.blockquote-box-two h4{font-size:44px;color:#fff;font-weight:500}.blockquote-box-two h4 .bold{font-weight:600}@media only screen and (min-width:768px) and (max-width:991px){.blockquote-box-two{padding:60px 30px}.blockquote-box-two h4{font-size:30px}}@media only screen and (max-width:767px){.blockquote-box-two{padding:60px 30px}.blockquote-box-two h4{font-size:26px}}.blog-post-author{color:#9b9ea1;margin-left:15px}.blog-post-author a{color:#000}.blog-details-two-share-area{margin-top:40px;border-top:1px solid #ddd;border-bottom:1px solid #ddd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:15px 50px}@media only screen and (max-width:767px){.blog-details-two-share-area{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:15px 10px}.blog-details-two-share-area .share-title{margin-bottom:20px}}.related-post-two-slider-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.related-post-two-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #e0dfe6;text-align:center;background-color:transparent;font-size:25px;border-radius:10px;color:#0f034a;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.related-post-two-slider-navigation .navigation-button.popular-swiper-button-next{margin-left:10px}.related-post-two-slider-navigation .navigation-button:hover{border:1px solid #5138ee;background-color:#5138ee;color:#fff}.comment-list-wrapper{margin-bottom:60px}.comment-list-wrapper .widget-title{color:#0a1e43}.comment-list{margin:0;padding:0}.comment-list .comment-2,.comment-list .comment-reply-wrap{border:1px solid #eee;padding:30px;border-radius:10px}.comment-list .comment-author-info{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.comment-list .comment{list-style-type:none;padding:10px 0}.comment-list .comment:last-child{padding-bottom:0}.comment-list .comment-author img{border-radius:50px;width:120px}.comment-list .comment-content{position:relative;overflow:hidden;margin-left:20px;width:100%}.comment-list .meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:767px){.comment-list .meta{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}}.comment-list .meta .fn{font-size:22px;text-transform:uppercase;color:#0a1e43;display:block;margin-bottom:0}@media only screen and (max-width:767px){.comment-list .meta .fn{font-size:18px}}.comment-list .meta .comment-datetime{position:relative;display:inline-block;font-size:14px;color:#ababab;margin-top:10px}.comment-list .meta .separator{padding:0 10px}.comment-list .meta .time{color:#5138ee}.comment-list .comment-author.vcard{padding:8px;border:1px solid #dfeee5;border-radius:100%}.comment-list .comment-actions a{margin-right:20px;font-weight:500;color:#333}.comment-list .comment-actions a:hover{color:#5138ee}.comment-list .comment-reply-link{background-color:#f8f8f8;height:45px;line-height:45px;color:#5138ee;font-weight:600;border-radius:10px;padding:0 20px}.comment-list .comment-reply-link i{margin-right:10px}@media only screen and (max-width:767px){.comment-list .comment-reply-link{margin-top:5px}}.comment-list .children{margin:20px 0 20px 100px;padding:0}@media only screen and (max-width:767px){.comment-list .children{margin:40px 0 20px 30px}}.comment-list .children li+li{margin-top:0}.comment-list .comment-text{margin-top:15px}.comment-submit-btn .ht-btn{padding:0 54px}.messonry-button{border-bottom:1px solid #eee;padding-bottom:20px;padding-top:20px;border-top:1px solid #eee}.messonry-button button{background-color:transparent;border:0;font-weight:600;padding-left:35px;margin-left:30px;position:relative}.messonry-button button.is-checked{color:#ffc4a0}.messonry-button button::before{color:#222;content:'';height:6px;width:6px;background:#222;border-radius:5000px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);position:absolute;left:0}.messonry-button button:first-child{padding-left:0;margin-left:0}.messonry-button button:first-child::before{display:none}.author-blog-post-content .post-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.author-blog-post-content .post-right-side span{position:relative;padding-right:15px;margin-right:15px;font-size:13px}.author-blog-post-content .post-right-side span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.author-blog-post-content .post-right-side span a:hover{color:#ffc4a0}.author-blog-post-content .post-right-side span:last-child{padding-right:0;margin-right:0}.author-blog-post-content .post-right-side span:last-child::after{display:none}@media only screen and (max-width:767px){.author-blog-post-content{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.author-blog-post-wrap{margin-bottom:30px}.author-post-bottom-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-top:1px solid #eee;border-bottom:1px solid #eee;margin-top:20px}.author-blog-thum{display:block}.author-blog-thum img{width:100%}.author-post-action-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 20px;margin:20px 0}@media only screen and (max-width:575px){.author-post-action-box{padding:0}}.author-post-action-box .author-action{margin-right:10px;margin-left:10px}.faq-box-wrap{margin-top:100px;margin-bottom:100px;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.faq-section-title{margin-top:30px}.faq-section-title .title{font-size:62px;font-weight:400;margin-top:100px;margin-right:30px}.faq-section-title .title .bold-text{font-weight:600;display:block}@media only screen and (min-width:992px) and (max-width:1199px){.faq-section-title .title{font-size:52px;margin-top:50px}}@media only screen and (min-width:768px) and (max-width:991px){.faq-section-title .title{font-size:48px;margin-top:50px}}@media only screen and (max-width:767px){.faq-section-title .title{font-size:42px;margin-top:50px}}@media only screen and (max-width:575px){.faq-section-title .title{font-size:32px;margin-top:50px}}.faq-content-wrap{border-left:1px solid #ddd}.faq-qustion{background:transparent;border:0;font-weight:600;padding:40px 0 40px 40px;font-size:20px}@media only screen and (max-width:575px){.faq-qustion{font-size:14px;padding:20px 0 20px 10px}}.faq-qustion::after{display:none}.faq-qustion:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.faq-qustion .number-of-accordion{min-height:46px;min-width:46px;text-align:center;line-height:46px;background-color:#f4f4f4;border-radius:10px;margin-right:20px;font-size:15px}.faq-qustion:not(.collapsed){background-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#000}.faq-qustion:not(.collapsed) .number-of-accordion{background-color:#ffc4a0;color:#fff}.accordion-item{border-top:0;border-left:none;border-right:0;border-bottom:2px solid #ddd}.accordion-item:last-child{border-bottom:0}.faq-ans{padding:0 0 40px 100px}@media only screen and (max-width:575px){.faq-ans{padding:0 0 20px 10px}}.office-img{margin-top:30px;padding:30px;background:#f7f7f7;border-radius:15px;position:relative}.office-img img{border-radius:15px}.office-img .office-title{position:absolute;bottom:60px;text-align:center;left:50%;display:inline-block;background-color:#333;border-radius:15px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);color:#fff;padding:10px 40px;border:4px solid rgba(255,255,255,0.8)}.single-office-info{margin-top:30px;padding:40px 55px;border:1px solid #ddd;border-radius:15px;background-color:transparent}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.single-office-info{padding:30px 25px}}.single-office-info .single-contact-info{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}.single-office-info .single-contact-info:last-child{margin-bottom:0}.single-office-info .single-contact-info .icon{min-height:45px;min-width:45px;line-height:45px;border-radius:10px;margin-right:20px;text-align:center;background-color:#f4f4f4}.single-office-info-wrap:hover .office-title{background-color:#ffc4a0;color:#222}.single-office-info-wrap:hover .single-office-info{border-color:#ffc4a0}.contact-from .section-title .title{font-size:40px}@media large-mobile{.contact-from .section-title .title{font-size:30px}}.single-input-box{margin-bottom:20px}.single-input-box input,.single-input-box textarea{border:1px solid #efefef;width:100%;padding:10px 30px;border-radius:10px;background-color:#fafafa}.single-input-box textarea{height:200px}.single-input-box:hover input,.single-input-box:hover textarea{background-color:transparent}.contact-us-map iframe{height:664px;width:100%;border-radius:15px}.error-404-area{padding:100px 0;position:relative}@media only screen and (min-width:768px) and (max-width:991px){.error-404-area{padding:80px 0}}@media only screen and (max-width:767px){.error-404-area{padding:60px 0}}.error-text{text-align:center;max-width:600px;margin:auto;margin-top:50px}.error-text h5{color:#ffc4a0;margin-bottom:20px}.error-area-shap{position:absolute;bottom:0;left:100px}@media only screen and (min-width:768px) and (max-width:991px){.error-area-shap{left:40px}}@media only screen and (max-width:767px){.error-area-shap{display:none}}.share-thinking-title{background-color:#f5f5f5;padding:40px;border-radius:15px}.share-thinking-title .title{font-size:28px}.title-write{background-color:#f5f5f5;padding:20px;border-radius:15px;margin-top:30px}.write-content-box{border:1px solid #f5f5f5;padding:20px;border-radius:15px;margin-top:30px}.post-write-tag a{position:relative;padding-right:10px}.post-write-tag a::after{content:","}.post-write-tag a:last-child::after{content:""}.post-write-trams{padding:0 20px}.single-trams{margin-bottom:20px}.single-trams .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px}.single-trams .title .form-check-label{margin-left:10px;font-weight:600;font-size:18px}.form-check-input:checked{background-color:#ffc4a0;border-color:#ffc4a0}.form-check-input:focus{border-color:transparent;outline:0;-webkit-box-shadow:none;box-shadow:none}.conditon-buttom-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:50px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.conditon-buttom-wrap{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.conditon-note{color:#8e8f91;max-width:600px}@media only screen and (min-width:992px) and (max-width:1199px){.conditon-note{max-width:500px}}.conditon-note .title{font-weight:600;color:#000}.login-content form>input{width:100%;background-color:#fff;padding:1px 20px;color:#000;line-height:47px;border:0;border-radius:10px;margin-bottom:25px;border:1px solid #ddd}.remember-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.remember-wrap p{margin-bottom:0}.remember-forget-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}
/**商品**/
#baguetteBox-overlay{display:none;opacity:0;position:fixed;overflow:hidden;top:0;left:0;width:100%;height:100%;z-index:1000000;background-color:#222;background-color:rgba(0,0,0,.8);transition:opacity .5s ease}#baguetteBox-overlay.visible{opacity:1}#baguetteBox-overlay .full-image{display:inline-block;position:relative;width:100%;height:100%;text-align:center}#baguetteBox-overlay .full-image figure{display:inline;margin:0;height:100%}#baguetteBox-overlay .full-image img{display:inline-block;width:auto;height:auto;max-height:100%;max-width:100%;vertical-align:middle;box-shadow:0 0 8px rgba(0,0,0,.6)}#baguetteBox-overlay .full-image figcaption{display:block;position:absolute;bottom:0;width:100%;text-align:center;line-height:1.8;white-space:normal;color:#ccc;background-color:#000;background-color:rgba(0,0,0,.6);font-family:sans-serif}#baguetteBox-overlay .full-image:before{content:"";display:inline-block;height:50%;width:1px;margin-right:-1px}#baguetteBox-slider{position:absolute;left:0;top:0;height:100%;width:100%;white-space:nowrap;transition:left .4s ease,-webkit-transform .4s ease;transition:left .4s ease,transform .4s ease;transition:left .4s ease,transform .4s ease,-webkit-transform .4s ease}#baguetteBox-slider.bounce-from-right{-webkit-animation:d .4s ease-out;animation:d .4s ease-out}#baguetteBox-slider.bounce-from-left{-webkit-animation:e .4s ease-out;animation:e .4s ease-out}@-webkit-keyframes d{0%,to{margin-left:0}50%{margin-left:-30px}}@keyframes d{0%,to{margin-left:0}50%{margin-left:-30px}}@-webkit-keyframes e{0%,to{margin-left:0}50%{margin-left:30px}}@keyframes e{0%,to{margin-left:0}50%{margin-left:30px}}.baguetteBox-button#next-button,.baguetteBox-button#previous-button{top:50%;top:calc(50% - 30px);width:44px;height:60px}.baguetteBox-button{position:absolute;cursor:pointer;outline:0;padding:0;margin:0;border:0;border-radius:15%;background-color:#323232;background-color:rgba(50,50,50,.5);color:#ddd;font:1.6em sans-serif;transition:background-color .4s ease}.baguetteBox-button:focus,.baguetteBox-button:hover{background-color:rgba(50,50,50,.9)}.baguetteBox-button#next-button{right:2%}.baguetteBox-button#previous-button{left:2%}.baguetteBox-button#close-button{top:20px;right:2%;right:calc(2% + 6px);width:30px;height:30px}.baguetteBox-button svg{position:absolute;left:0;top:0}.baguetteBox-spinner{width:40px;height:40px;display:inline-block;position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-20px}.baguetteBox-double-bounce1,.baguetteBox-double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#fff;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:f 2s infinite ease-in-out;animation:f 2s infinite ease-in-out}.baguetteBox-double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes f{0%,to{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes f{0%,to{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}body,html{height:100%;width:100%}.sp-loading{text-align:center;max-width:270px;padding:15px;font-size:12px;color:#888}.sp-loading,.sp-wrap{border:5px solid #eee;border-radius:3px}.sp-wrap{display:none;line-height:0;font-size:0;background:#eee;position:relative;margin:0 25px 15px 0;float:left;}.sp-thumbs{text-align:left;display:inline-block}.sp-thumbs img{min-height:50px;min-width:50px;max-width:50px}.sp-thumbs a:link,.sp-thumbs a:visited{width:50px;height:50px;overflow:hidden;opacity:.3;display:inline-block;background-size:cover;background-position:50%;transition:all .2s ease-out}.sp-thumbs a:hover{opacity:1}.sp-current,.sp-thumbs a:active{opacity:1!important;position:relative}.sp-large{position:relative;overflow:hidden;top:0;left:0}.sp-large a img{max-width:100%;height:auto}.sp-large a{display:block}.sp-zoom{position:absolute;left:-50%;top:-50%;cursor:zoom-in;display:none}.sp-lightbox{position:fixed;top:0;left:0;height:100%;width:100%;background:#000;background:rgba(0,0,0,.9);z-index:1031;display:none;cursor:pointer}.sp-lightbox img{position:absolute;margin:auto;top:0;bottom:0;left:0;right:0;max-width:90%;max-height:90%;border:2px solid #fff}#sp-next,#sp-prev{position:absolute;top:50%;margin-top:-25px;z-index:501;color:#fff;padding:14px;text-decoration:none;background:#000;border-radius:25px;border:2px solid #fff;width:50px;height:50px;box-sizing:border-box;transition:.2s}#sp-prev{left:10px}#sp-prev:before{content:"";border:7px solid transparent;border-right:15px solid #fff;position:absolute;top:16px;left:7px}#sp-next{right:10px}#sp-next:before{content:"";border:7px solid transparent;border-left:15px solid #fff;position:absolute;top:16px;left:18px}#sp-next:hover,#sp-prev:hover{background:#444}@media screen and (max-width:400px){.sp-wrap{margin:0 0 15px}#sp-next,#sp-prev{top:auto;margin-top:0;bottom:25px}}.btn i{margin-right:5px}.clean-block.dark{background-color:#f6f6f6}.clean-block.blue{background-color:#007bff;color:#fff}.clean-block.blue input{border:none}.clean-block .block-heading{padding-top:50px;margin-bottom:40px;text-align:center}.clean-block .block-heading p{text-align:center;max-width:420px;margin:auto;opacity:.7}.clean-block.dark .block-heading p{opacity:.8}.clean-block .block-heading h1,.clean-block .block-heading h2,.clean-block .block-heading h3{margin-bottom:1.2rem}.clean-block .block-content,.clean-block .content{box-shadow:0 2px 10px rgba(0,0,0,.075);background-color:#fff}.clean-block .block-content{padding:40px}.clean-block.clean-hero{position:relative;text-align:center;background-size:cover;background-repeat:no-repeat;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding-bottom:0}.clean-block.clean-hero:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background-color:currentColor;z-index:1}.clean-block.clean-hero .text{max-width:640px;color:#fff;z-index:2;padding:40px 15px;text-shadow:1px 1px 1px rgba(0,0,0,.15)}.clean-block.clean-hero h2{margin-bottom:30px}.clean-block.clean-hero p{font-size:18px;margin-bottom:30px}.feature-box{padding:15px 20px 15px 70px}.feature-box .icon{font-size:30px;position:absolute;left:15px;top:15px;width:30px;text-align:center;color:#3b99e0}.feature-box h4{font-weight:600;font-size:1.2rem}.feature-box p{font-size:.9em;opacity:.8}.clean-block.slider{margin-left:auto;margin-right:auto}.clean-card{box-shadow:0 2px 10px rgba(0,0,0,.075);border-radius:3px;margin-bottom:40px;border:1px solid #eaeaea}.clean-card .image{border-radius:3px 3px 0 0;overflow:hidden}.clean-card .info{padding:30px}.clean-card h4{font-weight:600;font-size:1em}.clean-card p{opacity:.8;font-size:.85em;margin-bottom:.9em}.clean-card .icons a{font-size:16px;color:#3b99e0;opacity:.75;height:2em;line-height:2;text-align:center;padding:.6em .4em}.clean-card .icons a:hover{opacity:1;text-decoration:none}.clean-block.clean-info{padding-left:20px;padding-right:20px;text-align:center}.clean-block.clean-info h3{margin-top:.8em;margin-bottom:.6em}.clean-block.clean-services .card{margin-bottom:30px;text-align:center}.clean-block.clean-services .card h4{font-weight:600;font-size:1em;margin-bottom:.8em}.clean-block.clean-services .card p{font-size:.9em;opacity:.8}.clean-block.clean-services .card button{margin-bottom:25px;padding:6px 20px}.clean-block.clean-faq .faq-item{margin-bottom:20px}.clean-block.clean-faq .faq-item .question{font-weight:600;font-size:1em;line-height:1.5}.clean-block.clean-faq .faq-item:not(:first-child) .question{margin-top:1.8em}.clean-block.clean-faq .faq-item .answer{font-size:1em;color:#7f7d7d;margin-top:20px}.clean-block.clean-form form{border-top:2px solid #5ea4f3;background-color:#fff;max-width:500px;margin:auto;padding:40px;box-shadow:0 2px 10px rgba(0,0,0,.075)}.clean-block.clean-block.clean-gallery .item{margin-bottom:20px}.clean-block.clean-gallery .item .image{box-shadow:0 2px 10px rgba(0,0,0,.075)}.clean-block.clean-gallery .lightbox img{transition:.2s ease-in-out}.clean-block.clean-gallery .lightbox img:hover{-webkit-transform:scale(1.05);transform:scale(1.05)}.clean-block.clean-gallery img{border-radius:4px}.baguetteBox-button{background-color:transparent!important}.clean-pricing-item .heading{text-align:center;padding-bottom:10px;border-bottom:1px solid rgba(0,0,0,.1)}.clean-pricing-item{background-color:#fff;box-shadow:0 2px 10px rgba(0,0,0,.075);border-top:2px solid #5ea4f3;padding:30px;overflow:hidden;position:relative}.clean-block.clean-pricing .col-md-5:not(:last-child) .item{margin-bottom:30px}.clean-pricing-item button{font-weight:600}.clean-pricing-item .ribbon{width:160px;height:32px;font-size:12px;text-align:center;color:#fff;font-weight:700;box-shadow:0 2px 3px hsla(0,0%,53%,.25);background:#4dbe3b;-webkit-transform:rotate(45deg);transform:rotate(45deg);position:absolute;right:-42px;top:20px;padding-top:7px}.clean-pricing-item p{text-align:center;margin-top:20px;opacity:.7}.clean-pricing-item .features .feature{font-weight:600}.clean-pricing-item .features h4{text-align:center;font-size:18px;padding:5px}.clean-pricing-item .price h4{margin:15px 0;font-size:45px;text-align:center;color:#2288f9}.clean-pricing-item .buy-now button{text-align:center;margin:auto;font-weight:600;padding:9px 0}.clean-block.payment-form form{border-top:2px solid #5ea4f3;box-shadow:0 2px 10px rgba(0,0,0,.075);background-color:#fff;padding:0;max-width:600px;margin:auto}.clean-block.payment-form .title{font-size:1em;border-bottom:1px solid rgba(0,0,0,.1);margin-bottom:.8em;font-weight:600;padding-bottom:8px}.clean-block.payment-form .products{background-color:#f7fbff;padding:25px}.clean-block.payment-form .products .item{margin-bottom:1em}.clean-block.payment-form .products .item-name{font-weight:600;font-size:.9em}.clean-block.payment-form .products .item-description{font-size:.8em;opacity:.6}.clean-block.payment-form .products .item p{margin-bottom:.2em}.clean-block.payment-form .products .price{float:right;font-weight:600;font-size:.9em}.clean-block.payment-form .products .total{border-top:1px solid rgba(0,0,0,.1);margin-top:10px;padding-top:19px;font-weight:600;line-height:1}.clean-block.payment-form .card-details{padding:25px 25px 15px}.clean-block.payment-form .card-details label{font-size:12px;font-weight:600;margin-bottom:15px;color:#79818a;text-transform:uppercase}.clean-block.payment-form .card-details button{margin-top:.6em;padding:12px 0;font-weight:600}.clean-block.payment-form .date-separator{margin-left:10px;margin-right:10px;margin-top:5px}.clean-block.clean-catalog .filters{padding-left:40px;padding-top:10px}.clean-block.clean-catalog .filter-collapse .filter-caret{float:right;font-size:12px;line-height:26px}.clean-block.clean-catalog .filter-collapse{display:block;padding:10px;border:1px solid #ccc;margin:30px;border-radius:0;text-align:left}.clean-block.clean-catalog .filters h3{font-size:1em;font-weight:600;margin-bottom:.8em}.clean-block.clean-catalog .filters .heading{font-size:20px;font-weight:700;padding-bottom:20px}.clean-block.clean-catalog .filters .filter-item{margin-bottom:40px}.clean-block.clean-catalog .filters label{word-wrap:break-word;max-width:100%}.clean-block.clean-catalog .products{padding:0}.clean-block.clean-catalog .products .row:first-of-type{border-top:none;border-left:none;margin-bottom:20px}.clean-product-item{padding:20px;border-right:none;border-bottom:1px solid #e8e6e6;height:100%}.clean-product-item .image{margin-bottom:20px}.clean-product-item .image img{max-width:220px;max-height:180px}.clean-product-item .product-name{margin-bottom:20px;text-align:center}.clean-product-item .product-name a{color:#585858;font-size:1.1em}.clean-product-item .product-name a:hover{text-decoration:none;color:#8f8c8c}.clean-product-item .about{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.clean-product-item .price{text-align:right;padding-right:10px}.clean-product-item .price h3{font-size:1.2em;font-weight:600;color:#32303c;margin:0}.clean-product-item .rating{color:#fec000}.clean-product-item .rating img{width:14px;margin-right:2px}.clean-product-item .add .icon{padding-right:10px}.clean-block.clean-catalog .products .pages{width:50%;margin:55px auto 0}.clean-block.clean-catalog .pagination{-ms-flex-pack:center;justify-content:center}.clean-block.clean-cart .items{padding:36px}.clean-block.clean-cart .items .product{padding-top:20px;padding-bottom:40px}.clean-block.clean-cart .items .product .product-image{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:15px;border:2px solid #f0f0f0}.clean-block.clean-cart .items .product{padding-top:0}.clean-block.clean-cart .items .product .product-info{padding-top:1em;padding-bottom:1em}.clean-block.clean-cart .items .product .product-name{font-weight:600;font-size:1.3em}.clean-block.clean-cart .items .product .product-info .product-specs{font-size:.8rem;font-weight:600;margin-top:15px}.clean-block.clean-cart .items .product .product-info .product-specs .value{font-weight:400}.clean-block.clean-cart .items .product .quantity .quantity-input{width:68px}.clean-block.clean-cart .items .product .quantity label{font-size:.9em}.clean-block.clean-cart .items .product .price{font-weight:700;font-size:22px;text-align:right}.clean-block.clean-cart .summary{background-color:#f7fbff;height:100%;padding:30px}.clean-block.clean-cart .summary h3{text-align:center;font-size:1.25em;font-weight:600;padding-top:16px;padding-bottom:28px;text-transform:uppercase;letter-spacing:2px;color:#1d4f88}.clean-block.clean-cart .summary h4{padding-bottom:18px;margin-bottom:0;background:#fff;padding-left:20px;padding-right:20px}.clean-block.clean-cart .summary h4:first-of-type{border-top:1px solid #86b4e8;padding-top:18px}.clean-block.clean-cart .summary h4:last-of-type{color:#617ef3;border-bottom:1px solid #e6edf5}.clean-block.clean-cart .summary .text{font-size:.65em;font-weight:600}.clean-block.clean-cart .summary .price{font-size:.6em;float:right;margin-top:10px}.clean-block.clean-cart .summary button{margin-top:20px;font-weight:600;font-size:1em;padding:10px 0}.clean-block.clean-product .block-content{padding:20px}.clean-block.clean-product .product-info{margin-bottom:50px}.clean-block.clean-product .gallery{padding:20px;background-color:#f6f6f6}.clean-block.clean-product .sp-wrap{background:transparent;border:none;float:none;width:100%}.clean-block.clean-product .sp-thumbs{margin-top:15px}.clean-block.clean-product .sp-thumbs a:link{margin-right:10px}.clean-block.clean-product .product-info .info .price{padding:20px 0}.clean-block.clean-product .product-info .info .price h3{font-size:1.5em;font-weight:700}.clean-block.clean-product .product-info .info .rating{color:#fec000;padding-bottom:20px;border-bottom:1px solid rgba(0,0,0,.1)}.clean-block.clean-product .product-info .info button{padding:10px 20px;margin-bottom:30px}.clean-block.clean-product .product-info .info button .fa{margin-right:10px}.clean-block.clean-product .product-info .info .summary{border-top:1px solid rgba(0,0,0,.1);padding-top:30px}.clean-block.clean-product .product-info .info .summary p{font-size:.9em}.clean-block.clean-product .product-info .description{max-width:720px;margin:0 auto}.clean-block.clean-product .product-info .description p{margin-bottom:50px}.clean-block.clean-product .product-info .description h4{margin-top:60px;margin-bottom:20px}.clean-block.clean-product .tab-content .description{padding-top:60px}.clean-block.clean-product .tab-content .description .right{text-align:left}.clean-block.clean-product .tab-content .reviews,.clean-block.clean-product .tab-content .specifications{padding-top:30px}.clean-block.clean-product .product-info .specifications .stat{font-weight:700}.clean-block.clean-product .product-info .reviews .review-item{margin-bottom:30px;padding:20px;border:1px solid #ded7d7}.clean-block.clean-product .product-info .reviews .review-item h4{font-size:1.2em;font-weight:600}.clean-block.clean-product .product-info .reviews .review-item span{font-size:.9em}.clean-block.clean-product .product-info .reviews .review-item p{margin-top:12px;font-size:.9em}.clean-block.clean-product .clean-related-items .items{margin-top:30px}.clean-related-item{border:1px solid #eaeaea;padding-top:20px;padding-bottom:20px}.clean-related-item .related-name{text-align:center;margin-top:16px}.clean-related-item .related-name a{font-size:1em;color:#212529}.clean-related-item .related-name a:hover{text-decoration:none;color:#999ea4}.clean-block.clean-product .reviews .review-item .rating,.clean-related-item .related-name .rating{color:#fec000;margin-bottom:10px}.clean-block.clean-product .product-info .info .rating img,.clean-block.clean-product .reviews .review-item .rating img,.clean-related-item .related-name .rating img{width:18px;margin-right:2px}.clean-related-item .related-name h4{font-size:1.3em;font-weight:600;color:#007bff}.clean-blog-post{padding-bottom:70px}.clean-blog-post h3{font-size:1.3em;font-weight:600;padding-top:17px}.clean-blog-post p{font-size:.95em}.clean-blog-post .info{padding:5px 0 12px;font-size:.9em}.clean-blog-post .info span:not(:last-child){margin-right:7px}.clean-blog-post .info a{color:inherit}.clean-block.clean-post{padding-top:100px}.clean-block.clean-post .block-content{padding:0}.clean-block.clean-post .post-image{background-size:cover;background-repeat:no-repeat;width:100%;height:300px}.clean-block.clean-post .post-body{padding:70px 50px;font-size:.9em}.clean-block.clean-post .post-body h3{font-weight:600}.clean-block.clean-post .post-body p{margin-bottom:30px}.clean-block.clean-post .post-body .post-info{padding:20px 0}.clean-block.clean-post .post-body .post-info span{color:#007bff}.clean-block.clean-post .post-body .post-info span:not(:last-child){margin-right:40px}.clean-block.clean-post .post-body h4{font-weight:600;padding-top:20px;padding-bottom:20px}.clean-testimonial-item{border:1px solid #eaeaea;box-shadow:0 2px 10px rgba(0,0,0,.075);margin-bottom:30px;background-color:#fff;color:#212529;text-align:left}.clean-testimonial-item .card-body{padding:40px}.clean-testimonial-item h3{font-size:1.1em;font-weight:600}.clean-testimonial-item p{font-size:.9em}.clean-testimonial-item h4{font-size:.9em;color:#3b99e0}.clean-block.add-on{padding:50px 0;text-align:center;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:column;flex-direction:column}.clean-block.add-on.call-to-action h3{margin-right:0;margin-bottom:20px}.clean-block.add-on.call-to-action button{border-radius:20px}.clean-block.add-on.newsletter-sign-up h2{padding-right:20px}.clean-block.add-on.newsletter-sign-up input{max-width:85%;margin-bottom:18px;margin-top:10px}.clean-block.add-on.newsletter-sign-up button{border-radius:20px}.clean-block.add-on.newsletter-sign-up .input-group{max-width:300px}.clean-block.add-on.social-icons .icons i{line-height:45px}.clean-block.add-on.social-icons .icons a{font-size:24px;margin-right:4px;color:#6aacf3;border:1px solid;opacity:.75;border-radius:50%;width:45px;height:45px;display:inline-block;text-align:center}.clean-block.add-on.social-icons .icons a:hover{opacity:1;text-decoration:none}.clean-block.add-on.social-icons.blue .icons a{color:#fff;opacity:1}.clean-block.add-on.social-icons.blue .icons a:hover{opacity:.8;text-decoration:none}.clean-block.add-on.sponsors a img{max-width:170px;-webkit-filter:grayscale(.8);filter:grayscale(.8)}.clean-block.add-on.sponsors a:not(:last-child) img{margin-bottom:20px}@media (max-width:767.98px){.clean-block.clean-services .row div:last-child .card{margin-bottom:0}}@media (min-width:576px){.clean-block .block-heading{padding-top:80px}.clean-block.clean-hero{min-height:680px}.clean-block.clean-hero .text{padding:0}.clean-block.clean-block.clean-gallery .item{margin-bottom:40px}.clean-block.payment-form .title{font-size:1.2em}.clean-block.payment-form .products{padding:40px}.clean-block.payment-form .products .item-name,.clean-block.payment-form .products .price{font-size:1em}.clean-block.payment-form .card-details{padding:40px 40px 30px}.clean-block.payment-form .card-details button{margin-top:2em}}@media (min-width:768px){.clean-block.clean-info.right>.container>.row{-ms-flex-direction:row-reverse;flex-direction:row-reverse}.clean-block.clean-info{padding-left:0;padding-right:0;text-align:inherit}.clean-block.clean-info h3{margin-top:0}.clean-block.clean-cart .items .product{padding:0;text-align:left}.clean-block.clean-cart .items .product:not(:last-child){padding-top:0;padding-bottom:25px}.clean-block.clean-cart .items .product .price{font-weight:700;font-size:22px}.clean-block.clean-cart .items .product .quantity{text-align:center}.clean-block.clean-cart .items .product .quantity .quantity-input{margin:auto;padding-left:15px;padding-right:5px}.clean-block.clean-cart .items .product .product-name{font-size:1em}.clean-block.clean-cart .items .product .product-info{padding:0 15px 0 1.5em}.clean-block.clean-post .post-image{height:400px}.clean-block.clean-blog-list .block-content{padding:80px}.clean-blog-post{padding-bottom:70px}.clean-block.add-on{-ms-flex-direction:row;flex-direction:row}.clean-block.add-on.call-to-action h3,.clean-block.add-on.sponsors a:not(:last-child) img{margin-right:20px;margin-bottom:0}.clean-block.add-on.newsletter-sign-up h2{margin-bottom:0}.clean-block.add-on.newsletter-sign-up input{max-width:200px;margin-bottom:0;margin-top:0;margin-right:10px}.clean-block.clean-catalog .filters{padding-top:30px}.clean-block.clean-catalog .products{padding:30px 30px 30px 0}.clean-block.clean-catalog .products .clean-product-item .product-name{text-align:left}.clean-block.clean-catalog .products .row:first-of-type{border-top:1px solid #e8e6e6;border-left:1px solid #e8e6e6}.clean-block.clean-catalog .products .clean-product-item{border-right:1px solid #e8e6e6}.clean-block.clean-product .block-content{padding:40px}.clean-block.clean-product .tab-content .description .right{text-align:right}}@media (min-width:992px){.clean-card{margin-bottom:0}.clean-blog-post h3{padding-top:0}.clean-block.clean-post .post-image{height:500px}.clean-block.clean-post .post-body{padding:70px 150px}.clean-block.clean-testimonials .item{margin-bottom:0}.clean-block.clean-post .post-body{padding:70px 100px}.clean-block.clean-post .post-body h4{padding-top:50px}}.clean-navbar .navbar-nav .nav-link{font-weight:600;font-size:.8rem;text-transform:uppercase}.clean-navbar.fixed-bottom,.clean-navbar.fixed-top{box-shadow:0 0 15px rgba(0,0,0,.1)}.clean-navbar .navbar-nav .nav-item{padding-right:2rem}.clean-navbar .navbar-nav:last-child .item:last-child,.clean-navbar .navbar-nav:last-child .item:last-child a{padding-right:0}.clean-navbar .logo{font-size:1.5rem}.clean-navbar.fixed-top+.page{padding-top:62px}@media (min-width:576px){.navbar{padding-top:1.2rem;padding-bottom:1.2rem}.clean-navbar.fixed-top+.page{padding-top:5rem}}.header-standard .navbar-nav .item{padding-left:20px;font-size:20px}.header-standard{background-image:url(../../assets/img/header-standard/image1.jpg);background-size:cover;background-repeat:no-repeat}.header-standard .hero{padding-top:200px;padding-bottom:200px;text-align:center}.header-standard .hero .heading{font-size:50px}.header-standard .hero .info{margin:30px auto;font-size:20px;margin-top:30px}.page-footer{background-color:#fff;padding-top:30px;text-align:center}.page-footer.dark{background-color:#2b2f31}.page-footer .footer-copyright{background-color:#fff;padding-top:3px;padding-bottom:3px;text-align:center;margin-top:50px;border:1px solid #ededed}.page-footer.dark .footer-copyright{background-color:#222425;border-color:#222425}.page-footer .footer-copyright p{margin:10px;color:#7d8288}.page-footer.dark .footer-copyright p{color:#ccc}.page-footer ul{list-style-type:none;padding-left:0;line-height:1.7}.page-footer h5{font-size:18px;font-weight:700;margin-top:30px}.page-footer.dark h5{color:#fff}.page-footer a{color:#53595f;text-decoration:none}.page-footer.dark a{color:#d2d1d1}.page-footer a:focus,.page-footer a:hover{text-decoration:none;color:#1d2125}.page-footer.dark a:focus,.page-footer.dark a:hover{color:#fff}@media (min-width:576px){.page-footer{text-align:left}}@media (min-width:768px){.page-footer ul li{position:relative;padding-left:10px}.page-footer ul li:after,.page-footer ul li:before{content:"";position:absolute;left:0;width:2px;height:6px;border-radius:2px;background-color:#007bff;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.page-footer ul li:before{top:9px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.page-footer ul li:after{top:13px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}
ul.qq-group li,ul.qq-group li a {
color: #fff;padding:5px 0;
}
.prevpage.btn,.nextpage.btn{
text-align:left;
margin-top:5px;
}
.comment-page-bar{
text-align:right;
}
.comment-page{
padding: 5px 10px;
border: 1px solid #ccc;
border-radius: 5px;
margin-right: 10px;
cursor:pointer;
}
.tags a {
margin: 5px;
display: inline-block;
}
.faq-ans p {
line-height: 30px;
}
.product-price {
font-weight: 800;
color: #f00 !important;
font-size: 18px;
}
ul.filter-bar {
border: 1px solid #ccc;
border-radius: 5px;
padding: 15px;
margin-bottom: 40px;
}
.filter-s label {
color: #ffb701;
font-size: 15px;
font-weight: 600;
margin-right: 15px;
}
.filter-bar li {
padding: 5px 0;
}
.filter-s a {
padding: 5px 10px;
}
.filter-s a.is-checked {
background: #ffb806;
color: #fff;
}
.blog-details-thum img{
width:100%;
}
.info .price {
margin: 10px 0;
font-size: 20px;
font-weight: 600;
color: #f00;
clear:both;
}
.feature {
margin: 10px 0;
}
.summary {
margin: 20px 0;
line-height: 25px;
}
.buy-bar button.buy {
color: #fff;
background: #dc3545;
}
.buy-bar p{
display:block;
margin-bottom:15px;
font-weight:600;
}
.nsbar{
float: right;
}
.nsbar a {
margin: 0 5px;
}
.contact a {
width: 200px !important;
}
.jz-body p {
line-height: 40px;
}
.jz-body{
padding: 50px 0;
text-align: center;
font-size: 20px;
}
.so{
width: 80%;
height: 30px;
border: 1px solid #ccc;
border-radius: 3px;
}
form.search{
margin: 15px 0;
}
================================================
FILE: static/cms/static/js/ajax.mail.js
================================================
/*====================================
Ajax Mail js
======================================*/
$(function() {
// Get the form.
var form = $('#contact-form');
// Get the messages div.
var formMessages = $('.form-messege');
// Set up an event listener for the contact form.
$(form).submit(function(e) {
// Stop the browser from submitting the form.
e.preventDefault();
// Serialize the form data.
var formData = $(form).serialize();
// Submit the form using AJAX.
$.ajax({
type: 'POST',
url: $(form).attr('action'),
data: formData
})
.done(function(response) {
// Make sure that the formMessages div has the 'success' class.
$(formMessages).removeClass('error');
$(formMessages).addClass('success');
// Set the message text.
$(formMessages).text(response);
// Clear the form.
$('#contact-form input,#contact-form textarea').val('');
})
.fail(function(data) {
// Make sure that the formMessages div has the 'error' class.
$(formMessages).removeClass('success');
$(formMessages).addClass('error');
// Set the message text.
if (data.responseText !== '') {
$(formMessages).text(data.responseText);
} else {
$(formMessages).text('Oops! An error occured and your message could not be sent.');
}
});
});
});
================================================
FILE: static/cms/static/js/aos.js
================================================
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.AOS=t():e.AOS=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="dist/",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t
0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,x),(0,b.default)(w,x.once),w},O=function(){w=(0,h.default)(),j()},_=function(){w.forEach(function(e,t){e.node.removeAttribute("data-aos"),e.node.removeAttribute("data-aos-easing"),e.node.removeAttribute("data-aos-duration"),e.node.removeAttribute("data-aos-delay")})},S=function(e){return e===!0||"mobile"===e&&p.default.mobile()||"phone"===e&&p.default.phone()||"tablet"===e&&p.default.tablet()||"function"==typeof e&&e()===!0},z=function(e){x=i(x,e),w=(0,h.default)();var t=document.all&&!window.atob;return S(x.disable)||t?_():(document.querySelector("body").setAttribute("data-aos-easing",x.easing),document.querySelector("body").setAttribute("data-aos-duration",x.duration),document.querySelector("body").setAttribute("data-aos-delay",x.delay),"DOMContentLoaded"===x.startEvent&&["complete","interactive"].indexOf(document.readyState)>-1?j(!0):"load"===x.startEvent?window.addEventListener(x.startEvent,function(){j(!0)}):document.addEventListener(x.startEvent,function(){j(!0)}),window.addEventListener("resize",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener("orientationchange",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener("scroll",(0,u.default)(function(){(0,b.default)(w,x.once)},x.throttleDelay)),x.disableMutationObserver||(0,d.default)("[data-aos]",O),w)};e.exports={init:z,refresh:j,refreshHard:O}},function(e,t){},,,,,function(e,t){(function(t){"use strict";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(s,t),_?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=O();return c(e)?d(e):void(h=setTimeout(s,a(e)))}function d(e){return h=void 0,z&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),o(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,k=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(f);return t=u(t)||0,i(n)&&(_=!!n.leading,S="maxWait"in n,y=S?x(u(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if("function"!=typeof e)throw new TypeError(f);return i(o)&&(r="leading"in o?!!o.leading:r,a="trailing"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t="undefined"==typeof e?"undefined":c(e);return!!e&&("object"==t||"function"==t)}function r(e){return!!e&&"object"==("undefined"==typeof e?"undefined":c(e))}function a(e){return"symbol"==("undefined"==typeof e?"undefined":c(e))||r(e)&&k.call(e)==d}function u(e){if("number"==typeof e)return e;if(a(e))return s;if(i(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?s:+e}var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f="Expected a function",s=NaN,d="[object Symbol]",l=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y="object"==("undefined"==typeof t?"undefined":c(t))&&t&&t.Object===Object&&t,g="object"==("undefined"==typeof self?"undefined":c(self))&&self&&self.Object===Object&&self,h=y||g||Function("return this")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){"use strict";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(s,t),_?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function f(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=j();return f(e)?d(e):void(h=setTimeout(s,u(e)))}function d(e){return h=void 0,z&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=f(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),i(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,O=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(_=!!n.leading,S="maxWait"in n,y=S?k(a(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e){var t="undefined"==typeof e?"undefined":u(e);return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==("undefined"==typeof e?"undefined":u(e))}function r(e){return"symbol"==("undefined"==typeof e?"undefined":u(e))||i(e)&&w.call(e)==s}function a(e){if("number"==typeof e)return e;if(r(e))return f;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?f:+e}var u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c="Expected a function",f=NaN,s="[object Symbol]",d=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v="object"==("undefined"==typeof t?"undefined":u(t))&&t&&t.Object===Object&&t,y="object"==("undefined"==typeof self?"undefined":u(self))&&self&&self.Object===Object&&self,g=v||y||Function("return this")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){"use strict";function n(e,t){var n=window.document,r=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,a=new r(o);i=t,a.observe(n.documentElement,{childList:!0,subtree:!0,removedNodes:!0})}function o(e){e&&e.forEach(function(e){var t=Array.prototype.slice.call(e.addedNodes),n=Array.prototype.slice.call(e.removedNodes),o=t.concat(n).filter(function(e){return e.hasAttribute&&e.hasAttribute("data-aos")}).length;o&&i()})}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){};t.default=n},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(){return navigator.userAgent||navigator.vendor||window.opera||""}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;ne.position?e.node.classList.add("aos-animate"):"undefined"!=typeof o&&("false"===o||!n&&"true"!==o)&&e.node.classList.remove("aos-animate")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add("aos-init"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute("data-aos-offset"),anchor:e.getAttribute("data-aos-anchor"),anchorPlacement:e.getAttribute("data-aos-anchor-placement")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case"top-bottom":break;case"center-bottom":n+=e.offsetHeight/2;break;case"bottom-bottom":n+=e.offsetHeight;break;case"top-center":n+=i/2;break;case"bottom-center":n+=i/2+e.offsetHeight;break;case"center-center":n+=i/2+e.offsetHeight/2;break;case"top-top":n+=i;break;case"bottom-top":n+=e.offsetHeight+i;break;case"center-top":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-("BODY"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-("BODY"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){return e=e||document.querySelectorAll("[data-aos]"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])});
================================================
FILE: static/cms/static/js/main.js
================================================
(function(a) {
var m = a(window);
var j = m.width();
var l = a(".header-sticky");
var c = a("html");
var b = a("body");
var m = a(window);
var j = m.width();
var l = a(".header-sticky");
var c = a("html");
var b = a("body");
m.on("scroll", function() {
var o = m.scrollTop();
var n = l.height();
if (j >= 320) {
if (o < n) {
l.removeClass("is-sticky")
} else {
l.addClass("is-sticky")
}
}
});
function k() {
var o = a("#scroll-top"),
n = 0,
p = a(window);
p.on("scroll", function() {
var q = a(this).scrollTop();
if (q > n) {
o.removeClass("show")
} else {
if (p.scrollTop() > 200) {
o.addClass("show")
} else {
o.removeClass("show")
}
}
n = q
});
o.on("click", function(q) {
a("html, body").animate({
scrollTop: 0
}, 600);
q.preventDefault()
})
}
k();
if (a(".has-children--multilevel-submenu").find(".submenu").length) {
var h = a(".has-children--multilevel-submenu").find(".submenu");
h.each(function() {
var r = a(this).offset();
var q = r.left;
var s = a(this).width();
var n = m.height();
var o = m.width() - 10;
var p = (q + s <= o);
if (!p) {
a(this).addClass("left")
}
})
}
a("#mobile-menu-trigger").on("click", function() {
a("#mobile-menu-overlay").addClass("active");
b.addClass("no-overflow")
});
a("#mobile-menu-close-trigger").on("click", function() {
a("#mobile-menu-overlay").removeClass("active");
b.removeClass("no-overflow")
});
a(".offcanvas-navigation--onepage ul li a").on("click", function() {
a("#mobile-menu-overlay").removeClass("active");
b.removeClass("no-overflow")
});
b.on("click", function(o) {
var n = o.target;
if (!a(n).is(".mobile-menu-overlay__inner") && !a(n).parents().is(".mobile-menu-overlay__inner") && !a(n).is("#mobile-menu-trigger") && !a(n).is("#mobile-menu-trigger i")) {
a("#mobile-menu-overlay").removeClass("active");
b.removeClass("no-overflow")
}
});
var g = window.location.pathname;
var f = g.substr(g.lastIndexOf("/") + 1);
var i = window.location.hash.substr(1);
if ((f == "" || f == "/" || f == "admin") && i == "") {} else {
a(".navigation-menu li").each(function() {
a(this).removeClass("active")
});
if (i != "") {
a(".navigation-menu li a[href*='" + i + "']").parents("li").addClass("active")
} else {
a(".navigation-menu li a[href*='" + f + "']").parents("li").addClass("active")
}
}
a(".openmenu-trigger").on("click", function(n) {
n.preventDefault();
a(".open-menuberger-wrapper").addClass("is-visiable")
});
a(".page-close").on("click", function(n) {
n.preventDefault();
a(".open-menuberger-wrapper").removeClass("is-visiable")
});
a("#open-off-sidebar-trigger").on("click", function() {
a("#page-oppen-off-sidebar-overlay").addClass("active");
b.addClass("no-overflow")
});
a("#menu-close-trigger").on("click", function() {
a("#page-oppen-off-sidebar-overlay").removeClass("active");
b.removeClass("no-overflow")
});
a("#search-overlay-trigger").on("click", function() {
a("#search-overlay").addClass("active");
b.addClass("no-overflow")
});
a("#search-close-trigger").on("click", function() {
a("#search-overlay").removeClass("active");
b.removeClass("no-overflow")
});
a("#hidden-icon-trigger").on("click", function() {
a("#hidden-icon-wrapper").toggleClass("active")
});
a(".share-icon").on("click", function(n) {
n.preventDefault();
a(".entry-post-share").toggleClass("opened")
});
b.on("click", function() {
a(".entry-post-share").removeClass("opened")
});
a(".entry-post-share").on("click", function(n) {
n.stopPropagation()
});
var d = a(".offcanvas-navigation"),
e = d.find(".sub-menu");
e.parent().prepend(' ');
e.slideUp();
d.on("click", "li a, li .menu-expand", function(o) {
var n = a(this);
if ((n.parent().attr("class").match(/\b(menu-item-has-children|has-children|has-sub-menu)\b/)) && (n.attr("href") === "#" || n.hasClass("menu-expand"))) {
o.preventDefault();
if (n.siblings("ul:visible").length) {
n.parent("li").removeClass("active");
n.siblings("ul").slideUp()
} else {
n.parent("li").addClass("active");
n.closest("li").siblings("li").removeClass("active").find("li").removeClass("active");
n.closest("li").siblings("li").find("ul:visible").slideUp();
n.siblings("ul").slideDown()
}
}
});
a(document).ready(function() {
var n = new Swiper(".most-popular-slider-active", {
slidesPerView: 3,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 30,
navigation: {
nextEl: ".popular-swiper-button-next",
prevEl: ".popular-swiper-button-prev",
},
pagination: {
el: ".swiper-pagination-t0",
type: "bullets",
clickable: true
},
breakpoints: {
1499: {
slidesPerView: 3
},
991: {
slidesPerView: 3
},
767: {
slidesPerView: 2
},
575: {
slidesPerView: 2
},
0: {
slidesPerView: 1
}
}
});
var n = new Swiper(".hero-slider-three-active", {
slidesPerView: 1,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 0,
navigation: {
nextEl: ".slider-three-swiper-button-next",
prevEl: ".slider-three-swiper-button-prev",
},
pagination: {
el: ".hero-swiper-pagination",
type: "bullets",
clickable: true
}
});
var n = new Swiper(".hero-slider-four-active", {
slidesPerView: 1,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 0,
navigation: {
nextEl: ".slider-four-button-next",
prevEl: ".slider-four-button-prev",
},
pagination: {
el: ".hero-swiper-pagination",
type: "bullets",
clickable: true
}
});
var n = new Swiper(".trending-slider-active", {
slidesPerView: 1,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 0,
navigation: {
nextEl: ".trending-button-next",
prevEl: ".trending-button-prev",
},
pagination: {
el: ".trending-swiper-pagination",
type: "bullets",
clickable: true
}
});
var n = new Swiper(".following-slider-active", {
slidesPerView: 1,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 0,
navigation: {
nextEl: ".following-button-next",
prevEl: ".following-button-prev",
},
pagination: {
el: ".following-swiper-pagination",
type: "bullets",
clickable: true
}
});
var n = new Swiper(".trending-topic-slider-active", {
slidesPerView: 5,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 25,
navigation: {
nextEl: ".trending-topic-button-next",
prevEl: ".trending-topic-button-prev",
},
pagination: {
el: ".hero-swiper-pagination",
type: "bullets",
clickable: true
},
breakpoints: {
1499: {
slidesPerView: 5
},
991: {
slidesPerView: 4
},
767: {
slidesPerView: 4
},
575: {
slidesPerView: 3,
spaceBetween: 10
},
0: {
slidesPerView: 2,
spaceBetween: 10,
}
}
});
var n = new Swiper(".latest-post-slider-active", {
slidesPerView: 1,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 0,
navigation: {
nextEl: ".latest-post-button-next",
prevEl: ".latest-post-button-prev",
},
pagination: {
el: ".swiper-pagination",
type: "bullets",
clickable: true
}
});
var n = new Swiper(".recent-reading-slider-active", {
slidesPerView: 3,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 30,
navigation: {
nextEl: ".recent-reading-button-next",
prevEl: ".recent-reading-button-prev",
},
pagination: {
el: ".swiper-pagination",
type: "bullets",
clickable: true
},
breakpoints: {
1499: {
slidesPerView: 3
},
991: {
slidesPerView: 2
},
767: {
slidesPerView: 1
},
575: {
slidesPerView: 1
},
0: {
slidesPerView: 1
}
}
});
var n = new Swiper(".trusted-partners-slider-active", {
slidesPerView: 4,
slidesPerGroup: 2,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 30,
navigation: {
nextEl: ".partners-swiper-button-next",
prevEl: ".partners-swiper-button-prev",
},
pagination: {
el: ".partners-swiper-pagination",
type: "bullets",
clickable: true
},
breakpoints: {
1499: {
slidesPerView: 4
},
991: {
slidesPerView: 4
},
767: {
slidesPerView: 2
},
575: {
slidesPerView: 2
},
0: {
slidesPerView: 2
}
}
});
var n = new Swiper(".testimonial-slider-active", {
slidesPerView: 3,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 30,
navigation: {
nextEl: ".testimonial-button-next",
prevEl: ".testimonial-button-prev",
},
pagination: {
el: ".partners-swiper-pagination",
type: "bullets",
clickable: true
},
breakpoints: {
1499: {
slidesPerView: 3
},
991: {
slidesPerView: 3
},
767: {
slidesPerView: 2
},
575: {
slidesPerView: 1
},
0: {
slidesPerView: 1
}
}
});
var n = new Swiper(".trending-tody-slider-active", {
slidesPerView: 1,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 30,
navigation: {
nextEl: ".testimonial-button-next",
prevEl: ".testimonial-button-prev",
},
pagination: {
el: ".trending-tody-swiper-pagination",
type: "bullets",
clickable: true
}
});
var n = new Swiper(".hero-six-slider-active", {
slidesPerView: 1,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 30,
navigation: {
nextEl: ".slider-six-button-next",
prevEl: ".slider-six-button-prev",
},
pagination: {
el: ".hero-six-swiper-pagination",
type: "bullets",
clickable: true
}
});
var n = new Swiper(".trending-tody-slider-two-active", {
slidesPerView: 3,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 30,
navigation: {
nextEl: ".trending-tody-button-next",
prevEl: ".trending-tody-button-prev",
},
pagination: {
el: ".trending-tody-swiper-pagination",
type: "bullets",
clickable: true
},
breakpoints: {
1499: {
slidesPerView: 3
},
991: {
slidesPerView: 3
},
767: {
slidesPerView: 2
},
575: {
slidesPerView: 1
},
0: {
slidesPerView: 1
}
}
});
var n = new Swiper(".related-post-slider-active", {
slidesPerView: 2,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 30,
navigation: {
nextEl: ".related-post-button-next",
prevEl: ".related-post-button-prev",
},
pagination: {
el: ".related-post-swiper-pagination",
type: "bullets",
clickable: true
},
breakpoints: {
1499: {
slidesPerView: 2
},
991: {
slidesPerView: 2
},
767: {
slidesPerView: 2
},
575: {
slidesPerView: 1
},
0: {
slidesPerView: 1
}
}
});
var n = new Swiper(".related-post-two-slider-active", {
slidesPerView: 3,
slidesPerGroup: 1,
centeredSlides: false,
loop: true,
speed: 1000,
spaceBetween: 30,
navigation: {
nextEl: ".related-post-button-next",
prevEl: ".related-post-button-prev",
},
pagination: {
el: ".related-post-swiper-pagination",
type: "bullets",
clickable: true
},
breakpoints: {
1499: {
slidesPerView: 3
},
991: {
slidesPerView: 3
},
767: {
slidesPerView: 2
},
575: {
slidesPerView: 1
},
0: {
slidesPerView: 1
}
}
})
});
a(".popup-images").lightGallery();
a(".video-popup").lightGallery();
// AOS.init({
// offset: 80,
// duration: 1000,
// once: true,
// easing: "ease",
// });
wow = new WOW({
animateClass: 'animated',
offset: 200
});
wow.init();
a(".projects-masonary-wrapper,.masonry-activation").imagesLoaded(function() {
a(".messonry-button").on("click", "button", function() {
var o = a(this).attr("data-filter");
a(this).siblings(".is-checked").removeClass("is-checked");
a(this).addClass("is-checked");
n.isotope({
filter: o
})
});
var n = a(".masonry-wrap").masonry({
itemSelector: ".masonary-item",
percentPosition: true,
transitionDuration: "0.7s",
columnWidth: ".masonary-sizer"
});
var n = a(".mesonry-list").isotope({
percentPosition: true,
transitionDuration: "0.7s",
layoutMode: "masonry",
})
})
})(jQuery);
================================================
FILE: static/cms/style.html
================================================
================================================
FILE: static/cms/tags-details.html
================================================
搜索 “{$tagname}” -{$webconf['web_name']}
{include="style"}
{include="header"}
搜索 “{$tagname}” 结果如下:
{if($lists)}
{foreach $lists as $v}
{if(checkCollect($v['tid'],$v['id']))}
{else}
{/if}
{if(checkLikes($v['tid'],$v['id']))}
{else}
{/if}
{/foreach}
{else}
This Page is Not Found.
很抱歉,没有找到你要的信息。
{/if}
{include="footer"}
{include="js"}
================================================
FILE: static/cms/user/article-add.html
================================================
发布内容 - 个人中心
{include="user/style"}
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
{if($data)}
{/if}
{if(!$data)}
选择专栏:
{loop table="molds" ishome="1" isopen="1" orderby="id asc" as="v"}
{$v['name']}
{/loop}
{else}
所属专栏:
{$moldsdata['name']}
{/if}
选择分类:
{include="user/footer"}
================================================
FILE: static/cms/user/article.html
================================================
{include="user/style"}
我的发布 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
{loop table="molds" ishome="1" isopen="1" orderby="id asc" as="v"}
{$v['name']}投稿
{/loop}
{if($listpage['list'])}
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/buy-list.html
================================================
{include="user/style"}
购买记录 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
{if($listpage1['list'])}
{/if}
{if($listpage['list'])}
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/buy-view.html
================================================
{include="user/style"}
购买 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
{if($data['type']!=2)}+{else}-{/if}{$data['amount']}
交易成功
充值方式 {$data['msg']}
创建时间 {fun date('Y-m-d H:i:s',$data['addtime'])}
订单号 {$data['orderno']}
{include="user/footer"}
================================================
FILE: static/cms/user/buy.html
================================================
{include="user/style"}
钱包与积分 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/footer"}
================================================
FILE: static/cms/user/cart.html
================================================
{include="user/style"}
我的购物车 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
购物车
{if($carts)}
{foreach $carts as $v}
{if($v['info'])}
单价
¥{$v['info']['price']}
删除
{else}
{/if}
{/foreach}
总计
总金额 0.00
折扣 0.00
邮费 0.00
总计 0.00
立即支付
{else}
暂无商品~
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/collect.html
================================================
{include="user/style"}
我的收藏-个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
{if($listpage['list'])}
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/comment.html
================================================
{include="user/style"}
我的评论-个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
{if($lists)}
{foreach $lists as $v}
{/foreach}
{else}
暂无评论~
{/if}
{if($listpage['list'])}
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/fans.html
================================================
{include="user/style"}
我的粉丝 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
{if($lists)}
{foreach $lists as $v}
{if(isfollow($member['id'],$v['id']))}
{/if}
{$v['username']}
{if($v['signature'])}{$v['signature']}{else}他很懒,什么都没有留下~{/if}
{if(isfollow($member['id'],$v['id']))}
取消关注
{else}
关注
{/if}
{/foreach}
{else}
暂无粉丝~
{/if}
{if($listpage['list'])}
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/follow.html
================================================
{include="user/style"}
我的关注 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
{if($lists)}
{foreach $lists as $v}
{if(isfollow($v['id'],$member['id']))}
{/if}
{$v['username']}
{if($v['signature'])}{$v['signature']}{else}他很懒,什么都没有留下~{/if}
取消关注
{/foreach}
{else}
暂无关注~
{/if}
{if($listpage['list'])}
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/footer.html
================================================
================================================
FILE: static/cms/user/forget.html
================================================
{include="user/style"}
个人中心-未登录
{include="user/footer"}
================================================
FILE: static/cms/user/index.html
================================================
{include="user/style"}
个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
个人中心
用户名: {$member['username']}
个性签名: {if($member['signature'])}{$member['signature']}{else}他很懒,什么都没有留下~{/if}
手机号码: {$member['tel']}
电子邮箱: {$member['email']}
生日: {if($member['birthday'])}{$member['birthday']}{else}-{/if}
性别: {if($member['sex']==1)}男{else if($member['sex']==2)}女{else}未知{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/left_nav.html
================================================
{if($member['signature'])}{$member['signature']}{else}他很懒,什么都没有留下~{/if}
================================================
FILE: static/cms/user/likes.html
================================================
{include="user/style"}
我的点赞-个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
{if($listpage['list'])}
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/login.html
================================================
{include="user/style"}
个人中心-未登录
{include="user/footer"}
================================================
FILE: static/cms/user/nologin.html
================================================
个人中心-未登录
{include="user/footer"}
================================================
FILE: static/cms/user/notify.html
================================================
{include="user/style"}
消息中心 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
{if($lists)}
{foreach $lists as $v}
{if($v['type']=='comment' || $v['type']=='reply')}
时间:{$v['date']} {if(!$v['isread'])}未读 {else}已读 {/if}
{if($v['puserid'])}{fun memberInfo($v['puserid'],'username')}{else}管理员{/if} 回复了: {fun newstr(htmldecode($v['body']),30)}
【{$classtypedata[$v['tid']]['classname']}】 删除 回复
{else if($v['type']=='likes')}
{else if($v['type']=='collect')}
{else if($v['type']=='at')}
时间:{$v['date']} {if(!$v['isread'])}未读 {else}已读 {/if}
{fun memberInfo($v['puserid'],'username')} @了您: {fun newstr($v['body'],30)}
【{$classtypedata[$v['tid']]['classname']}】 删除 回复
{else}
时间:{$v['date']} {if(!$v['isread'])}未读 {else}已读 {/if}
交易提醒: {$v['body']}
{/if}
{/foreach}
{else}
暂无消息~
{/if}
{if($listpage['list'])}
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/order.html
================================================
{include="user/style"}
我的订单 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
{foreach $lists as $v}
下单时间:{$v['date']}
{if($v['isshow']==1)}
待支付
{else if($v['isshow']==2)}
交易成功
{else if($v['isshow']==3)}
已超时
{else if($v['isshow']==4)}
待发货
{else if($v['isshow']==5)}
已发货
{else}
已废弃
{/if}
订单号:{$v['orderno']}
交易类型:{$v['paytype']}
¥{$v['price']} 删除 查看详情
{/foreach}
{if($listpage['list'])}
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/orderdetails.html
================================================
{include="user/style"}
我的订单 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
订单详情
{if($carts)}
{foreach $carts as $v}
{if($v['info'])}
{else}
{/if}
{/foreach}
总计
总金额 ¥{$order['price']-$order['discount']+$order['yunfei']}
折扣 -¥{$order['discount']}
邮费 +¥{$order['yunfei']}
总计 ¥{$order['price']}
{if($order['isshow']==1)}
继续支付
{else if($order['isshow']==2)}
已支付
{else if($order['isshow']==3)}
订单已过期
{else if($order['isshow']==4)}
待发货
{else if($order['isshow']==5)}
已发货
{else if($order['isshow']==6)}
已失效
{else if($order['isshow']==0)}
订单已过期
{/if}
{else}
暂无商品~
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/password.html
================================================
个人中心-已登录
================================================
FILE: static/cms/user/payment.html
================================================
{include="user/style"}
支付订单 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
订单详情
{if($carts)}
总计
总金额 ¥{$order['price']+$order['discount']-$order['yunfei']}
折扣 -¥{$order['discount']}
邮费 +¥{$order['yunfei']}
总计 ¥{$order['price']}
{if($webconf['paytype']!=0)}
支付方式
{if($webconf['isopenzfb'])}
支付宝(需付:{$order['price']})
支付宝当面付(需付:{$order['price']})
{/if}
{if($webconf['isopenweixin'])}
微信(需付:{$order['price']})
{/if}
{if($webconf['isopenqianbao'])}
钱包(需付:{$qianbao} 余额:{$member['money']})
{/if}
{if($webconf['isopenjifen'])}
积分(需付:{$jifen} 余额:{$member['jifen']})
{/if}
{/if}
立即支付
{else}
暂无商品~
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/people.html
================================================
{include="user/style"}
{$user['username']}的公共主页
{include="user/top"}
{if($user['signature'])}{$user['signature']}{else}他很懒,什么都没有留下~{/if}
{if($islogin)}
{if(isfollow($member['id'],$user['id']))}
已关注
{else}
关注
{/if}
{else}
关注
{/if}
{if($listpage['list'])}
{/if}
{include="user/footer"}
================================================
FILE: static/cms/user/prople.html
================================================
个人中心-已登录
发表了文章 1天前
大胖墩这两天去景德镇出差,参加一个会议,主办方带着他们参观了当地的瓷器城,我几乎是跟着他游览了个遍。 弹古筝的少女,梳着小辫子吹笛子的少年,清澈的人工湖和绒绒的让人想躺上去打滚的绿草地,全都一一拍下来给大胖墩这两天去景德镇出差,参加一个会议,主办方带着他们参观了当地的瓷器城,我几乎是跟着他游览了个遍。 弹古筝的少女,梳着小辫子吹笛子的少年,清澈的人工湖和绒绒的让人想躺上去打滚的绿草地,全都一一拍下来给
发表了文章 10天前
大胖墩这两天去景德镇出差,参加一个会议,主办方带着他们参观了当地的瓷器城,我几乎是跟着他游览了个遍。 弹古筝的少女,梳着小辫子吹笛子的少年,清澈的人工湖和绒绒的让人想躺上去打滚的绿草地,全都一一拍下来给大胖墩这两天去景德镇出差,参加一个会议,主办方带着他们参观了当地的瓷器城,我几乎是跟着他游览了个遍。 弹古筝的少女,梳着小辫子吹笛子的少年,清澈的人工湖和绒绒的让人想躺上去打滚的绿草地,全都一一拍下来给
================================================
FILE: static/cms/user/register.html
================================================
{include="user/style"}
个人中心-未登录
{include="user/footer"}
================================================
FILE: static/cms/user/reset_password.html
================================================
{include="user/style"}
个人中心-未登录
{include="user/footer"}
================================================
FILE: static/cms/user/setmsg.html
================================================
{include="user/style"}
资料与账号 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/footer"}
================================================
FILE: static/cms/user/style.html
================================================
================================================
FILE: static/cms/user/tips.html
================================================
欢迎注册本站会员,注册会员后您将享受专属会员服务!包括但不限于专属文章浏览权限,会员投稿权限,在线购物权限,下载会员可见附件等实用功能,欢迎注册体验!
================================================
FILE: static/cms/user/top.html
================================================
================================================
FILE: static/cms/user/userinfo.html
================================================
{include="user/style"}
资料与账号 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/footer"}
================================================
FILE: static/cms/user/wallet.html
================================================
{include="user/style"}
我的钱包 - 个人中心
{include="user/top"}
{include="user/left_nav"}
{include="user/tips"}
总资产(单位:元)
¥{$user['money']} 钱包充值
累计充值:¥{$cz_money}
积分
{$user['jifen']} 积分充值
累计获取:{$cz_jifen}
FAQ
Q: 如何获取积分?
A: 1、每日登录奖励{$webconf['login_award']}积分
2、发布文章奖励{$webconf['release_award_open']}积分{if($webconf['release_max_award'])},每日上限{$webconf['release_max_award']}分{/if}
3、收藏文章奖励{$webconf['collect_award']}积分{if($webconf['collect_max_award'])},每日上限{$webconf['collect_max_award']}分{/if}
4、点赞文章奖励{$webconf['likes_award']}积分{if($webconf['likes_max_award'])},每日上限{$webconf['likes_max_award']}分{/if}
5、评论文章奖励{$webconf['comment_award']}积分{if($webconf['comment_max_award'])},每日上限{$webconf['comment_max_award']}分{/if}
6、被关注奖励{$webconf['follow_award']}积分{if($webconf['follow_max_award'])},每日上限{$webconf['follow_max_award']}分{/if}
Q: 积分有什么用处?
A: 1、通过积分到积分商城进行购物
{include="user/footer"}
================================================
FILE: static/common/clipboard.js
================================================
/*!
* clipboard.js v2.0.6
* https://clipboardjs.com/
*
* Licensed MIT © Zeno Rocha
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["ClipboardJS"] = factory();
else
root["ClipboardJS"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 6);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
function select(element) {
var selectedText;
if (element.nodeName === 'SELECT') {
element.focus();
selectedText = element.value;
}
else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
var isReadOnly = element.hasAttribute('readonly');
if (!isReadOnly) {
element.setAttribute('readonly', '');
}
element.select();
element.setSelectionRange(0, element.value.length);
if (!isReadOnly) {
element.removeAttribute('readonly');
}
selectedText = element.value;
}
else {
if (element.hasAttribute('contenteditable')) {
element.focus();
}
var selection = window.getSelection();
var range = document.createRange();
range.selectNodeContents(element);
selection.removeAllRanges();
selection.addRange(range);
selectedText = selection.toString();
}
return selectedText;
}
module.exports = select;
/***/ }),
/* 1 */
/***/ (function(module, exports) {
function E () {
// Keep this empty so it's easier to inherit from
// (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
}
E.prototype = {
on: function (name, callback, ctx) {
var e = this.e || (this.e = {});
(e[name] || (e[name] = [])).push({
fn: callback,
ctx: ctx
});
return this;
},
once: function (name, callback, ctx) {
var self = this;
function listener () {
self.off(name, listener);
callback.apply(ctx, arguments);
};
listener._ = callback
return this.on(name, listener, ctx);
},
emit: function (name) {
var data = [].slice.call(arguments, 1);
var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
var i = 0;
var len = evtArr.length;
for (i; i < len; i++) {
evtArr[i].fn.apply(evtArr[i].ctx, data);
}
return this;
},
off: function (name, callback) {
var e = this.e || (this.e = {});
var evts = e[name];
var liveEvents = [];
if (evts && callback) {
for (var i = 0, len = evts.length; i < len; i++) {
if (evts[i].fn !== callback && evts[i].fn._ !== callback)
liveEvents.push(evts[i]);
}
}
// Remove event from queue to prevent memory leak
// Suggested by https://github.com/lazd
// Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
(liveEvents.length)
? e[name] = liveEvents
: delete e[name];
return this;
}
};
module.exports = E;
module.exports.TinyEmitter = E;
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
var is = __webpack_require__(3);
var delegate = __webpack_require__(4);
/**
* Validates all params and calls the right
* listener function based on its target type.
*
* @param {String|HTMLElement|HTMLCollection|NodeList} target
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listen(target, type, callback) {
if (!target && !type && !callback) {
throw new Error('Missing required arguments');
}
if (!is.string(type)) {
throw new TypeError('Second argument must be a String');
}
if (!is.fn(callback)) {
throw new TypeError('Third argument must be a Function');
}
if (is.node(target)) {
return listenNode(target, type, callback);
}
else if (is.nodeList(target)) {
return listenNodeList(target, type, callback);
}
else if (is.string(target)) {
return listenSelector(target, type, callback);
}
else {
throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
}
}
/**
* Adds an event listener to a HTML element
* and returns a remove listener function.
*
* @param {HTMLElement} node
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listenNode(node, type, callback) {
node.addEventListener(type, callback);
return {
destroy: function() {
node.removeEventListener(type, callback);
}
}
}
/**
* Add an event listener to a list of HTML elements
* and returns a remove listener function.
*
* @param {NodeList|HTMLCollection} nodeList
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listenNodeList(nodeList, type, callback) {
Array.prototype.forEach.call(nodeList, function(node) {
node.addEventListener(type, callback);
});
return {
destroy: function() {
Array.prototype.forEach.call(nodeList, function(node) {
node.removeEventListener(type, callback);
});
}
}
}
/**
* Add an event listener to a selector
* and returns a remove listener function.
*
* @param {String} selector
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listenSelector(selector, type, callback) {
return delegate(document.body, selector, type, callback);
}
module.exports = listen;
/***/ }),
/* 3 */
/***/ (function(module, exports) {
/**
* Check if argument is a HTML element.
*
* @param {Object} value
* @return {Boolean}
*/
exports.node = function(value) {
return value !== undefined
&& value instanceof HTMLElement
&& value.nodeType === 1;
};
/**
* Check if argument is a list of HTML elements.
*
* @param {Object} value
* @return {Boolean}
*/
exports.nodeList = function(value) {
var type = Object.prototype.toString.call(value);
return value !== undefined
&& (type === '[object NodeList]' || type === '[object HTMLCollection]')
&& ('length' in value)
&& (value.length === 0 || exports.node(value[0]));
};
/**
* Check if argument is a string.
*
* @param {Object} value
* @return {Boolean}
*/
exports.string = function(value) {
return typeof value === 'string'
|| value instanceof String;
};
/**
* Check if argument is a function.
*
* @param {Object} value
* @return {Boolean}
*/
exports.fn = function(value) {
var type = Object.prototype.toString.call(value);
return type === '[object Function]';
};
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
var closest = __webpack_require__(5);
/**
* Delegates event to a selector.
*
* @param {Element} element
* @param {String} selector
* @param {String} type
* @param {Function} callback
* @param {Boolean} useCapture
* @return {Object}
*/
function _delegate(element, selector, type, callback, useCapture) {
var listenerFn = listener.apply(this, arguments);
element.addEventListener(type, listenerFn, useCapture);
return {
destroy: function() {
element.removeEventListener(type, listenerFn, useCapture);
}
}
}
/**
* Delegates event to a selector.
*
* @param {Element|String|Array} [elements]
* @param {String} selector
* @param {String} type
* @param {Function} callback
* @param {Boolean} useCapture
* @return {Object}
*/
function delegate(elements, selector, type, callback, useCapture) {
// Handle the regular Element usage
if (typeof elements.addEventListener === 'function') {
return _delegate.apply(null, arguments);
}
// Handle Element-less usage, it defaults to global delegation
if (typeof type === 'function') {
// Use `document` as the first parameter, then apply arguments
// This is a short way to .unshift `arguments` without running into deoptimizations
return _delegate.bind(null, document).apply(null, arguments);
}
// Handle Selector-based usage
if (typeof elements === 'string') {
elements = document.querySelectorAll(elements);
}
// Handle Array-like based usage
return Array.prototype.map.call(elements, function (element) {
return _delegate(element, selector, type, callback, useCapture);
});
}
/**
* Finds closest match and invokes callback.
*
* @param {Element} element
* @param {String} selector
* @param {String} type
* @param {Function} callback
* @return {Function}
*/
function listener(element, selector, type, callback) {
return function(e) {
e.delegateTarget = closest(e.target, selector);
if (e.delegateTarget) {
callback.call(element, e);
}
}
}
module.exports = delegate;
/***/ }),
/* 5 */
/***/ (function(module, exports) {
var DOCUMENT_NODE_TYPE = 9;
/**
* A polyfill for Element.matches()
*/
if (typeof Element !== 'undefined' && !Element.prototype.matches) {
var proto = Element.prototype;
proto.matches = proto.matchesSelector ||
proto.mozMatchesSelector ||
proto.msMatchesSelector ||
proto.oMatchesSelector ||
proto.webkitMatchesSelector;
}
/**
* Finds the closest parent that matches a selector.
*
* @param {Element} element
* @param {String} selector
* @return {Function}
*/
function closest (element, selector) {
while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
if (typeof element.matches === 'function' &&
element.matches(selector)) {
return element;
}
element = element.parentNode;
}
}
module.exports = closest;
/***/ }),
/* 6 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
// EXTERNAL MODULE: ./node_modules/select/src/select.js
var src_select = __webpack_require__(0);
var select_default = /*#__PURE__*/__webpack_require__.n(src_select);
// CONCATENATED MODULE: ./src/clipboard-action.js
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Inner class which performs selection from either `text` or `target`
* properties and then executes copy or cut operations.
*/
var clipboard_action_ClipboardAction = function () {
/**
* @param {Object} options
*/
function ClipboardAction(options) {
_classCallCheck(this, ClipboardAction);
this.resolveOptions(options);
this.initSelection();
}
/**
* Defines base properties passed from constructor.
* @param {Object} options
*/
_createClass(ClipboardAction, [{
key: 'resolveOptions',
value: function resolveOptions() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.action = options.action;
this.container = options.container;
this.emitter = options.emitter;
this.target = options.target;
this.text = options.text;
this.trigger = options.trigger;
this.selectedText = '';
}
/**
* Decides which selection strategy is going to be applied based
* on the existence of `text` and `target` properties.
*/
}, {
key: 'initSelection',
value: function initSelection() {
if (this.text) {
this.selectFake();
} else if (this.target) {
this.selectTarget();
}
}
/**
* Creates a fake textarea element, sets its value from `text` property,
* and makes a selection on it.
*/
}, {
key: 'selectFake',
value: function selectFake() {
var _this = this;
var isRTL = document.documentElement.getAttribute('dir') == 'rtl';
this.removeFake();
this.fakeHandlerCallback = function () {
return _this.removeFake();
};
this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true;
this.fakeElem = document.createElement('textarea');
// Prevent zooming on iOS
this.fakeElem.style.fontSize = '12pt';
// Reset box model
this.fakeElem.style.border = '0';
this.fakeElem.style.padding = '0';
this.fakeElem.style.margin = '0';
// Move element out of screen horizontally
this.fakeElem.style.position = 'absolute';
this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';
// Move element to the same position vertically
var yPosition = window.pageYOffset || document.documentElement.scrollTop;
this.fakeElem.style.top = yPosition + 'px';
this.fakeElem.setAttribute('readonly', '');
this.fakeElem.value = this.text;
this.container.appendChild(this.fakeElem);
this.selectedText = select_default()(this.fakeElem);
this.copyText();
}
/**
* Only removes the fake element after another click event, that way
* a user can hit `Ctrl+C` to copy because selection still exists.
*/
}, {
key: 'removeFake',
value: function removeFake() {
if (this.fakeHandler) {
this.container.removeEventListener('click', this.fakeHandlerCallback);
this.fakeHandler = null;
this.fakeHandlerCallback = null;
}
if (this.fakeElem) {
this.container.removeChild(this.fakeElem);
this.fakeElem = null;
}
}
/**
* Selects the content from element passed on `target` property.
*/
}, {
key: 'selectTarget',
value: function selectTarget() {
this.selectedText = select_default()(this.target);
this.copyText();
}
/**
* Executes the copy operation based on the current selection.
*/
}, {
key: 'copyText',
value: function copyText() {
var succeeded = void 0;
try {
succeeded = document.execCommand(this.action);
} catch (err) {
succeeded = false;
}
this.handleResult(succeeded);
}
/**
* Fires an event based on the copy operation result.
* @param {Boolean} succeeded
*/
}, {
key: 'handleResult',
value: function handleResult(succeeded) {
this.emitter.emit(succeeded ? 'success' : 'error', {
action: this.action,
text: this.selectedText,
trigger: this.trigger,
clearSelection: this.clearSelection.bind(this)
});
}
/**
* Moves focus away from `target` and back to the trigger, removes current selection.
*/
}, {
key: 'clearSelection',
value: function clearSelection() {
if (this.trigger) {
this.trigger.focus();
}
document.activeElement.blur();
window.getSelection().removeAllRanges();
}
/**
* Sets the `action` to be performed which can be either 'copy' or 'cut'.
* @param {String} action
*/
}, {
key: 'destroy',
/**
* Destroy lifecycle.
*/
value: function destroy() {
this.removeFake();
}
}, {
key: 'action',
set: function set() {
var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';
this._action = action;
if (this._action !== 'copy' && this._action !== 'cut') {
throw new Error('Invalid "action" value, use either "copy" or "cut"');
}
}
/**
* Gets the `action` property.
* @return {String}
*/
,
get: function get() {
return this._action;
}
/**
* Sets the `target` property using an element
* that will be have its content copied.
* @param {Element} target
*/
}, {
key: 'target',
set: function set(target) {
if (target !== undefined) {
if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {
if (this.action === 'copy' && target.hasAttribute('disabled')) {
throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
}
if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {
throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
}
this._target = target;
} else {
throw new Error('Invalid "target" value, use a valid Element');
}
}
}
/**
* Gets the `target` property.
* @return {String|HTMLElement}
*/
,
get: function get() {
return this._target;
}
}]);
return ClipboardAction;
}();
/* harmony default export */ var clipboard_action = (clipboard_action_ClipboardAction);
// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js
var tiny_emitter = __webpack_require__(1);
var tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);
// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js
var listen = __webpack_require__(2);
var listen_default = /*#__PURE__*/__webpack_require__.n(listen);
// CONCATENATED MODULE: ./src/clipboard.js
var clipboard_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var clipboard_createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* Base class which takes one or more elements, adds event listeners to them,
* and instantiates a new `ClipboardAction` on each click.
*/
var clipboard_Clipboard = function (_Emitter) {
_inherits(Clipboard, _Emitter);
/**
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
* @param {Object} options
*/
function Clipboard(trigger, options) {
clipboard_classCallCheck(this, Clipboard);
var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this));
_this.resolveOptions(options);
_this.listenClick(trigger);
return _this;
}
/**
* Defines if attributes would be resolved using internal setter functions
* or custom functions that were passed in the constructor.
* @param {Object} options
*/
clipboard_createClass(Clipboard, [{
key: 'resolveOptions',
value: function resolveOptions() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.action = typeof options.action === 'function' ? options.action : this.defaultAction;
this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;
this.text = typeof options.text === 'function' ? options.text : this.defaultText;
this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;
}
/**
* Adds a click event listener to the passed trigger.
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
*/
}, {
key: 'listenClick',
value: function listenClick(trigger) {
var _this2 = this;
this.listener = listen_default()(trigger, 'click', function (e) {
return _this2.onClick(e);
});
}
/**
* Defines a new `ClipboardAction` on each click event.
* @param {Event} e
*/
}, {
key: 'onClick',
value: function onClick(e) {
var trigger = e.delegateTarget || e.currentTarget;
if (this.clipboardAction) {
this.clipboardAction = null;
}
this.clipboardAction = new clipboard_action({
action: this.action(trigger),
target: this.target(trigger),
text: this.text(trigger),
container: this.container,
trigger: trigger,
emitter: this
});
}
/**
* Default `action` lookup function.
* @param {Element} trigger
*/
}, {
key: 'defaultAction',
value: function defaultAction(trigger) {
return getAttributeValue('action', trigger);
}
/**
* Default `target` lookup function.
* @param {Element} trigger
*/
}, {
key: 'defaultTarget',
value: function defaultTarget(trigger) {
var selector = getAttributeValue('target', trigger);
if (selector) {
return document.querySelector(selector);
}
}
/**
* Returns the support of the given action, or all actions if no action is
* given.
* @param {String} [action]
*/
}, {
key: 'defaultText',
/**
* Default `text` lookup function.
* @param {Element} trigger
*/
value: function defaultText(trigger) {
return getAttributeValue('text', trigger);
}
/**
* Destroy lifecycle.
*/
}, {
key: 'destroy',
value: function destroy() {
this.listener.destroy();
if (this.clipboardAction) {
this.clipboardAction.destroy();
this.clipboardAction = null;
}
}
}], [{
key: 'isSupported',
value: function isSupported() {
var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];
var actions = typeof action === 'string' ? [action] : action;
var support = !!document.queryCommandSupported;
actions.forEach(function (action) {
support = support && !!document.queryCommandSupported(action);
});
return support;
}
}]);
return Clipboard;
}(tiny_emitter_default.a);
/**
* Helper function to retrieve attribute value.
* @param {String} suffix
* @param {Element} element
*/
function getAttributeValue(suffix, element) {
var attribute = 'data-clipboard-' + suffix;
if (!element.hasAttribute(attribute)) {
return;
}
return element.getAttribute(attribute);
}
/* harmony default export */ var clipboard = __webpack_exports__["default"] = (clipboard_Clipboard);
/***/ })
/******/ ])["default"];
});
================================================
FILE: static/common/close.html
================================================
抱歉,站点已暂停
{if($webconf['closetip'])}{$webconf['closetip']}{else}抱歉!该站点已经被管理员停止运行,请联系管理员了解详情!{/if}
================================================
FILE: static/common/layui/css/layui.css
================================================
.layui-inline,img{display:inline-block;vertical-align:middle}h1,h2,h3,h4,h5,h6{font-weight:400}a,body{color:#333}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-edge,hr{height:0;overflow:hidden}.layui-layout-body,.layui-side,.layui-side-scroll{overflow-x:hidden}.layui-edge,.layui-elip,hr{overflow:hidden}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:1.6;color:rgba(0,0,0,.85);font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{line-height:0;margin:10px 0;padding:0;border:none!important;border-bottom:1px solid #eee!important;clear:both;background:0 0}a{text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-btn,.layui-btn-group,.layui-edge{display:inline-block}.layui-edge{width:0;border-width:6px;border-style:dashed;border-color:transparent}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{text-overflow:ellipsis;white-space:nowrap}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=256);src:url(../font/iconfont.eot?v=256#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=256) format('woff2'),url(../font/iconfont.woff?v=256) format('woff'),url(../font/iconfont.ttf?v=256) format('truetype'),url(../font/iconfont.svg?v=256#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-key:before{content:"\e683"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-ios:before{content:"\e680"}.layui-icon-at:before{content:"\e687"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-addition:before{content:"\e624"}.layui-icon-home:before{content:"\e68e"}.layui-icon-time:before{content:"\e68d"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-logout:before{content:"\e682"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-android:before{content:"\e684"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-service:before{content:"\e626"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-print:before{content:"\e66d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-export:before{content:"\e67d"}.layui-icon-rss:before{content:"\e808"}.layui-icon-slider:before{content:"\e714"}.layui-icon-email:before{content:"\e618"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-light:before{content:"\e748"}.layui-icon-gift:before{content:"\e627"}.layui-icon-mute:before{content:"\e685"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-music:before{content:"\e690"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px}.layui-side-scroll{position:relative;width:220px;height:100%}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;z-index:900;width:auto;box-sizing:border-box}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#FAFAFA}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:"";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.6;border-left:5px solid #5FB878;border-radius:0 2px 2px 0;background-color:#FAFAFA}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#FAFAFA;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card-body,.layui-card-header,.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-panel,.layui-textarea{position:relative}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-form-select dl,.layui-panel{box-shadow:1px 1px 4px rgb(0 0 0 / 8%)}.layui-card:last-child{margin-bottom:0}.layui-card-header{height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body{padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{border-width:1px;border-style:solid;border-radius:2px;background-color:#fff;color:#666}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-border,.layui-border-black,.layui-border-blue,.layui-border-cyan,.layui-border-green,.layui-border-orange,.layui-border-red{border-width:1px;border-style:solid}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#FAFAFA!important;color:#666!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{color:#666!important}.layui-border-red{border-color:#FF5722!important;color:#FF5722!important}.layui-border-orange{border-color:#FFB800!important;color:#FFB800!important}.layui-border-green{border-color:#009688!important;color:#009688!important}.layui-border-cyan{border-color:#2F4056!important;color:#2F4056!important}.layui-border-blue{border-color:#1E9FFF!important;color:#1E9FFF!important}.layui-border-black{border-color:#393D49!important;color:#393D49!important}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.6;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-text p{margin:10px 0}.layui-text p:first-child{margin-top:0}.layui-font-12{font-size:12px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-red{color:#FF5722!important}.layui-font-orange{color:#FFB800!important}.layui-font-green{color:#009688!important}.layui-font-cyan{color:#2F4056!important}.layui-font-blue{color:#01AAED!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\9;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#666}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-checked{background-color:#5FB878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#FBFBFB!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#eee!important}.layui-input:focus,.layui-textarea:focus{border-color:#d2d2d2!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#F6F6F6;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878!important;background-color:#5FB878;color:#fff}.layui-checkbox-disabled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2!important}.layui-checkbox-disabled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disabled,.layui-checkbox-disabled i{border-color:#eee!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disabled span{background-color:#eee!important}.layui-checkbox-disabled em{color:#d2d2d2!important}.layui-checkbox-disabled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover *,.layui-form-radioed,.layui-form-radioed>i{color:#5FB878}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled *{color:#c2c2c2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FAFAFA;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #eee}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#eee;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#FAFAFA}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-table td[data-edit=text]{cursor:text}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-menu li,.layui-menu-body-title a:hover,.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#F6F6F6}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0 0 0 1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-colorpicker-alpha-slider,.layui-colorpicker-side-slider,.layui-menu,.layui-menu *,.layui-nav{box-sizing:border-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0 0 0 1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#666}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#666;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff}.layui-menu li,.layui-menu-body-title a{padding:5px 15px}.layui-menu li{position:relative;margin:1px 0;width:calc(100% + 1px);line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer}.layui-menu li:hover{background-color:#F6F6F6}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group .layui-menu-body-title,.layui-menu-item-parent .layui-menu-body-title{padding-right:25px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default;text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:rgba(0,0,0,1)}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-breadcrumb,.layui-tree-btnGroup{visibility:hidden}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#F6F6F6!important;color:#5FB878}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#5FB878}.layui-menu .layui-menu-item-checked:after{position:absolute;right:0;top:0;bottom:0;border-right:3px solid #5FB878;content:""}.layui-menu-body-title{position:relative;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title>.layui-icon{position:absolute;right:0;top:0;font-size:14px}.layui-menu-body-title>.layui-icon-right{right:-1px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:"";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#5FB878}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:66666666;margin:5px 0;min-width:100px}.layui-dropdown:before{content:"";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:"";position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#666;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#F6F6F6;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#F6F6F6;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child{display:block;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-breadcrumb{font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:"";width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#FAFAFA}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:"";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-transfer-active,.layui-transfer-box{display:inline-block;vertical-align:middle}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#666}.layui-transfer-active{margin:0 15px}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5FB878;border-color:#5FB878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#FBFBFB;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#F6F6F6;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#FFF;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:66666666;width:280px;margin:5px 0;padding:7px;background:#FFF;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#FFF,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #FFF;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#666}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#FFF;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#FFF;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:66666666;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#FFF;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:"";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-iconClick,.layui-tree-main{display:inline-block;vertical-align:middle}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:"";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:"";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#666}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:"";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-btnGroup,.layui-tree-editInput{position:relative;vertical-align:middle;display:inline-block}.layui-tree-spread>.layui-tree-entry>.layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#666}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}
================================================
FILE: static/common/layui/css/modules/code.css
================================================
html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view .layui-code-ol li:first-child{padding-top:10px}.layui-code-view .layui-code-ol li:last-child{padding-bottom:10px}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none}
================================================
FILE: static/common/layui/css/modules/laydate/default/laydate.css
================================================
.laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;animation-name:laydate-downbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #C9C9C9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-footer span:hover{color:#5FB878}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#666}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#B5FFF8}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eee;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}
================================================
FILE: static/common/layui/css/modules/layer/default/layer.css
================================================
.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:50px;line-height:50px;border-bottom:1px solid #F0F0F0;font-size:14px;color:#333;overflow:hidden;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:17px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:300px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:300px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgnext,.layui-layer-imgprev{position:fixed;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:30px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:30px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:40px;line-height:40px;background-color:#000\9;filter:Alpha(opacity=60);background-color:rgba(2,0,0,.35);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
================================================
FILE: static/common/layui/layui.js
================================================
;function strhtml(str){var s="";if(!str){return''}str=htmlstr(str);if(str.length==0)return"";s=str.replace(/&/g,"&");s=s.replace(//g,">");s=s.replace(/ /g," ");s=s.replace(/\'/g,"'");s=s.replace(/\"/g,'"');return s}function htmlstr(str){var s="";if(!str){return''}if(str.length==0)return"";s=str.replace(/&/g,"&");s=s.replace(/</g,"<");s=s.replace(/>/g,">");s=s.replace(/ /g," ");s=s.replace(/'/g,"\'");s=s.replace(/"/g,"\"");return s}!function(t){"use strict";var e=t.document,n={modules:{},status:{},timeout:10,event:{}},r=function(){this.v="2.6.8"},o=t.LAYUI_GLOBAL||{},a=function(){var t=e.currentScript?e.currentScript.src:function(){for(var t,n=e.scripts,r=n.length-1,o=r;o>0;o--)if("interactive"===n[o].readyState){t=n[o].src;break}return t||n[r].src}();return n.dir=o.dir||t.substring(0,t.lastIndexOf("/")+1)}(),i=function(e,n){n=n||"log",t.console&&console[n]&&console[n]("layui error hint: "+e)},u="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),l=n.builtin={lay:"lay",layer:"layer",laydate:"laydate",laypage:"laypage",laytpl:"laytpl",layedit:"layedit",form:"form",upload:"upload",dropdown:"dropdown",transfer:"transfer",tree:"tree",table:"table",element:"element",rate:"rate",colorpicker:"colorpicker",slider:"slider",carousel:"carousel",flow:"flow",util:"util",code:"code",jquery:"jquery",all:"all","layui.all":"layui.all"};r.prototype.cache=n,r.prototype.define=function(t,e){var r=this,o="function"==typeof t,a=function(){var t=function(t,e){layui[t]=e,n.status[t]=!0};return"function"==typeof e&&e(function(r,o){t(r,o),n.callback[r]=function(){e(t)}}),this};return o&&(e=t,t=[]),r.use(t,a,null,"define"),r},r.prototype.use=function(r,o,c,s){function p(t,e){var r="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===t.type||r.test((t.currentTarget||t.srcElement).readyState))&&(n.modules[h]=e,v.removeChild(b),function o(){return++m>1e3*n.timeout/4?i(h+" is not a valid module","error"):void(n.status[h]?f():setTimeout(o,4))}())}function f(){c.push(layui[h]),r.length>1?y.use(r.slice(1),o,c,s):"function"==typeof o&&function(){return layui.jquery&&"function"==typeof layui.jquery&&"define"!==s?layui.jquery(function(){o.apply(layui,c)}):void o.apply(layui,c)}()}var y=this,d=n.dir=n.dir?n.dir:a,v=e.getElementsByTagName("head")[0];r=function(){return"string"==typeof r?[r]:"function"==typeof r?(o=r,["all"]):r}(),t.jQuery&&jQuery.fn.on&&(y.each(r,function(t,e){"jquery"===e&&r.splice(t,1)}),layui.jquery=layui.$=jQuery);var h=r[0],m=0;if(c=c||[],n.host=n.host||(d.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===r.length||layui["layui.all"]&&l[h])return f(),y;var g=(l[h]?d+"modules/":/^\{\/\}/.test(y.modules[h])?"":n.base||"")+(y.modules[h]||h)+".js";if(g=g.replace(/^\{\/\}/,""),!n.modules[h]&&layui[h]&&(n.modules[h]=g),n.modules[h])!function S(){return++m>1e3*n.timeout/4?i(h+" is not a valid module","error"):void("string"==typeof n.modules[h]&&n.status[h]?f():setTimeout(S,4))}();else{var b=e.createElement("script");b.async=!0,b.charset="utf-8",b.src=g+function(){var t=n.version===!0?n.v||(new Date).getTime():n.version||"";return t?"?v="+t:""}(),v.appendChild(b),!b.attachEvent||b.attachEvent.toString&&b.attachEvent.toString().indexOf("[native code")<0||u?b.addEventListener("load",function(t){p(t,g)},!1):b.attachEvent("onreadystatechange",function(t){p(t,g)}),n.modules[h]=g}return y},r.prototype.getStyle=function(e,n){var r=e.currentStyle?e.currentStyle:t.getComputedStyle(e,null);return r[r.getPropertyValue?"getPropertyValue":"getAttribute"](n)},r.prototype.link=function(t,r,o){var a=this,u=e.getElementsByTagName("head")[0],l=e.createElement("link");"string"==typeof r&&(o=r);var c=(o||t).replace(/\.|\//g,""),s=l.id="layuicss-"+c,p="creating",f=0;return l.rel="stylesheet",l.href=t+(n.debug?"?v="+(new Date).getTime():""),l.media="all",e.getElementById(s)||u.appendChild(l),"function"!=typeof r?a:(function y(o){var u=100,l=e.getElementById(s);return++f>1e3*n.timeout/u?i(t+" timeout"):void(1989===parseInt(a.getStyle(l,"width"))?(o===p&&l.removeAttribute("lay-status"),l.getAttribute("lay-status")===p?setTimeout(y,u):r()):(l.setAttribute("lay-status",p),setTimeout(function(){y(p)},u)))}(),a)},r.prototype.addcss=function(t,e,r){return layui.link(n.dir+"css/"+t,e,r)},n.callback={},r.prototype.factory=function(t){if(layui[t])return"function"==typeof n.callback[t]?n.callback[t]:null},r.prototype.img=function(t,e,n){var r=new Image;return r.src=t,r.complete?e(r):(r.onload=function(){r.onload=null,"function"==typeof e&&e(r)},void(r.onerror=function(t){r.onerror=null,"function"==typeof n&&n(t)}))},r.prototype.config=function(t){t=t||{};for(var e in t)n[e]=t[e];return this},r.prototype.modules=function(){var t={};for(var e in l)t[e]=l[e];return t}(),r.prototype.extend=function(t){var e=this;t=t||{};for(var n in t)e[n]||e.modules[n]?i(n+" Module already exists","error"):e.modules[n]=t[n];return e},r.prototype.router=function(t){var e=this,t=t||location.hash,n={path:[],search:{},hash:(t.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(t)?(t=t.replace(/^#\//,""),n.href="/"+t,t=t.replace(/([^#])(#.*$)/,"$1").split("/")||[],e.each(t,function(t,e){/^\w+=/.test(e)?function(){e=e.split("="),n.search[e[0]]=e[1]}():n.path.push(e)}),n):n},r.prototype.url=function(t){var e=this,n={pathname:function(){var e=t?function(){var e=(t.match(/\.[^.]+?\/.+/)||[])[0]||"";return e.replace(/^[^\/]+/,"").replace(/\?.+/,"")}():location.pathname;return e.replace(/^\//,"").split("/")}(),search:function(){var n={},r=(t?function(){var e=(t.match(/\?.+/)||[])[0]||"";return e.replace(/\#.+/,"")}():location.search).replace(/^\?+/,"").split("&");return e.each(r,function(t,e){var r=e.indexOf("="),o=function(){return r<0?e.substr(0,e.length):0!==r&&e.substr(0,r)}();o&&(n[o]=r>0?e.substr(r+1):null)}),n}(),hash:e.router(function(){return t?(t.match(/#.+/)||[])[0]||"/":location.hash}())};return n},r.prototype.data=function(e,n,r){if(e=e||"layui",r=r||localStorage,t.JSON&&t.JSON.parse){if(null===n)return delete r[e];n="object"==typeof n?n:{key:n};try{var o=JSON.parse(r[e])}catch(a){var o={}}return"value"in n&&(o[n.key]=n.value),n.remove&&delete o[n.key],r[e]=JSON.stringify(o),n.key?o[n.key]:o}},r.prototype.sessionData=function(t,e){return this.data(t,e,sessionStorage)},r.prototype.device=function(e){var n=navigator.userAgent.toLowerCase(),r=function(t){var e=new RegExp(t+"/([^\\s\\_\\-]+)");return t=(n.match(e)||[])[1],t||!1},o={os:function(){return/windows/.test(n)?"windows":/linux/.test(n)?"linux":/iphone|ipod|ipad|ios/.test(n)?"ios":/mac/.test(n)?"mac":void 0}(),ie:function(){return!!(t.ActiveXObject||"ActiveXObject"in t)&&((n.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:r("micromessenger")};return e&&!o[e]&&(o[e]=r(e)),o.android=/android/.test(n),o.ios="ios"===o.os,o.mobile=!(!o.android&&!o.ios),o},r.prototype.hint=function(){return{error:i}},r.prototype._typeof=function(t){return null===t?String(t):"object"==typeof t||"function"==typeof t?function(){var e=Object.prototype.toString.call(t).match(/\s(.+)\]$/)||[],n="Function|Array|Date|RegExp|Object|Error|Symbol";return e=e[1]||"Object",new RegExp("\\b("+n+")\\b").test(e)?e.toLowerCase():"object"}():typeof t},r.prototype._isArray=function(e){var n,r=this,o=r._typeof(e);return!(!e||"object"!=typeof e||e===t)&&(n="length"in e&&e.length,"array"===o||0===n||"number"==typeof n&&n>0&&n-1 in e)},r.prototype.each=function(t,e){var n,r=this,o=function(t,n){return e.call(n[t],t,n[t])};if("function"!=typeof e)return r;if(t=t||[],r._isArray(t))for(n=0;no?1:r(t.innerHeight||n.documentElement.clientHeight)},r.position=function(e,o,i){if(o){i=i||{},e!==n&&e!==r("body")[0]||(i.clickType="right");var c="right"===i.clickType?function(){var e=i.e||t.event||{};return{left:e.clientX,top:e.clientY,right:e.clientX,bottom:e.clientY}}():e.getBoundingClientRect(),u=o.offsetWidth,a=o.offsetHeight,f=function(t){return t=t?"scrollLeft":"scrollTop",n.body[t]|n.documentElement[t]},s=function(t){return n.documentElement[t?"clientWidth":"clientHeight"]},l=5,h=c.left,p=c.bottom;"center"===i.align?h-=(u-e.offsetWidth)/2:"right"===i.align&&(h=h-u+e.offsetWidth),h+u+l>s("width")&&(h=s("width")-u-l),hs()&&(c.top>a+l?p=c.top-a-2*l:"right"===i.clickType&&(p=s()-a-2*l,p<0&&(p=0)));var y=i.position;if(y&&(o.style.position=y),o.style.left=h+("fixed"===y?0:f(1))+"px",o.style.top=p+("fixed"===y?0:f())+"px",!r.hasScrollbar()){var d=o.getBoundingClientRect();!i.SYSTEM_RELOAD&&d.bottom+l>s()&&(i.SYSTEM_RELOAD=!0,setTimeout(function(){r.position(e,o,i)},50))}}},r.options=function(t,e){var n=r(t),o=e||"lay-options";try{return new Function("return "+(n.attr(o)||"{}"))()}catch(i){return hint.error("parseerror\uff1a"+i,"error"),{}}},r.isTopElem=function(t){var e=[n,r("body")[0]],o=!1;return r.each(e,function(e,n){if(n===t)return o=!0}),o},o.addStr=function(t,e){return t=t.replace(/\s+/," "),e=e.replace(/\s+/," ").split(" "),r.each(e,function(e,n){new RegExp("\\b"+n+"\\b").test(t)||(t=t+" "+n)}),t.replace(/^\s|\s$/,"")},o.removeStr=function(t,e){return t=t.replace(/\s+/," "),e=e.replace(/\s+/," ").split(" "),r.each(e,function(e,n){var r=new RegExp("\\b"+n+"\\b");r.test(t)&&(t=t.replace(r,""))}),t.replace(/\s+/," ").replace(/^\s|\s$/,"")},o.prototype.find=function(t){var e=this,n=0,o=[],i="object"==typeof t;return this.each(function(r,c){for(var u=i?c.contains(t):c.querySelectorAll(t||null);n0)return n[0].style[t]}():n.each(function(n,i){"object"==typeof t?r.each(t,function(t,e){i.style[t]=o(e)}):i.style[t]=o(e)})},o.prototype.width=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].offsetWidth}():e.each(function(n,r){e.css("width",t)})},o.prototype.height=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].offsetHeight}():e.each(function(n,r){e.css("height",t)})},o.prototype.attr=function(t,e){var n=this;return void 0===e?function(){if(n.length>0)return n[0].getAttribute(t)}():n.each(function(n,r){r.setAttribute(t,e)})},o.prototype.removeAttr=function(t){return this.each(function(e,n){n.removeAttribute(t)})},o.prototype.html=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].innerHTML}():this.each(function(e,n){n.innerHTML=t})},o.prototype.val=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].value}():this.each(function(e,n){n.value=t})},o.prototype.append=function(t){return this.each(function(e,n){"object"==typeof t?n.appendChild(t):n.innerHTML=n.innerHTML+t})},o.prototype.remove=function(t){return this.each(function(e,n){t?n.removeChild(t):n.parentNode.removeChild(n)})},o.prototype.on=function(t,e){return this.each(function(n,r){r.attachEvent?r.attachEvent("on"+t,function(t){t.target=t.srcElement,e.call(r,t)}):r.addEventListener(t,e,!1)})},o.prototype.off=function(t,e){return this.each(function(n,r){r.detachEvent?r.detachEvent("on"+t,e):r.removeEventListener(t,e,!1)})},t.lay=r,t.layui&&layui.define&&layui.define(function(t){t(e,r)})}(window,window.document);layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error: ";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\(.)/g,"$1")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\(.)/g,"$1")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+" ":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+" ");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('… ');r<=u;r++)r===a.curr?e.push('"+r+" "):e.push(''+r+" ");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+" ")),e.join("")}(),next:function(){return a.next?''+a.next+" ":""}(),count:'\u5171 '+a.count+" \u6761 ",limit:function(){var e=[''];return layui.each(a.limits,function(t,n){e.push('"+n+" \u6761/\u9875 ")}),e.join("")+" "}(),refresh:['',' '," "].join(""),skip:function(){return['到第',' ','页确定 '," "].join("")}()};return['',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
"].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)});!function(e,t){"use strict";var a=e.layui&&layui.define,n={getPath:e.lay&&lay.getPath?lay.getPath:"",link:function(t,a,n){l.path&&e.lay&&lay.layui&&lay.layui.link(l.path+t,a,n)}},i=e.LAYUI_GLOBAL||{},l={v:"5.3.1",config:{},index:e.laydate&&e.laydate.v?1e5:0,path:i.laydate_dir||n.getPath,set:function(e){var t=this;return t.config=lay.extend({},t.config,e),t},ready:function(e){var t="laydate",i="",r=(a?"modules/laydate/":"theme/")+"default/laydate.css?v="+l.v+i;return a?layui.addcss(r,e,t):n.link(r,e,t),this}},r=function(){var e=this,t=e.config,a=t.id;return r.that[a]=e,{hint:function(t){e.hint.call(e,t)},config:e.config}},o="laydate",s=".layui-laydate",y="layui-this",d="laydate-disabled",m=[100,2e5],c="layui-laydate-static",u="layui-laydate-list",h="layui-laydate-hint",f="layui-laydate-footer",p=".laydate-btns-confirm",g="laydate-time-text",v="laydate-btns-time",T="layui-laydate-preview",D=function(e){var t=this;t.index=++l.index,t.config=lay.extend({},t.config,l.config,e),e=t.config,e.id="id"in e?e.id:t.index,l.ready(function(){t.init()})},w="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s";r.formatArr=function(e){return(e||"").match(new RegExp(w+"|.","g"))||[]},D.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},D.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"click",show:!1,showBottom:!0,isPreview:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},D.prototype.lang=function(){var e=this,t=e.config,a={cn:{weeks:["\u65e5","\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d"],time:["\u65f6","\u5206","\u79d2"],timeTips:"\u9009\u62e9\u65f6\u95f4",startTime:"\u5f00\u59cb\u65f6\u95f4",endTime:"\u7ed3\u675f\u65f6\u95f4",dateTips:"\u8fd4\u56de\u65e5\u671f",month:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],tools:{confirm:"\u786e\u5b9a",clear:"\u6e05\u7a7a",now:"\u73b0\u5728"},timeout:"\u7ed3\u675f\u65f6\u95f4\u4e0d\u80fd\u65e9\u4e8e\u5f00\u59cb\u65f6\u95f4 \u8bf7\u91cd\u65b0\u9009\u62e9",invalidDate:"\u4e0d\u5728\u6709\u6548\u65e5\u671f\u6216\u65f6\u95f4\u8303\u56f4\u5185",formatError:["\u65e5\u671f\u683c\u5f0f\u4e0d\u5408\u6cd5 \u5fc5\u987b\u9075\u5faa\u4e0b\u8ff0\u683c\u5f0f\uff1a "," \u5df2\u4e3a\u4f60\u91cd\u7f6e"],preview:"\u5f53\u524d\u9009\u4e2d\u7684\u7ed3\u679c"},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"},timeout:"End time cannot be less than start Time Please re-select",invalidDate:"Invalid date",formatError:["The date format error Must be followed\uff1a "," It has been reset"],preview:"The selected result"}};return a[t.lang]||a.cn},D.prototype.init=function(){var t=this,a=t.config,n="static"===a.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};a.elem=lay(a.elem),a.eventElem=lay(a.eventElem),a.elem[0]&&(t.rangeStr=a.range?"string"==typeof a.range?a.range:"-":"","array"===layui._typeof(a.range)&&(t.rangeElem=[lay(a.range[0]),lay(a.range[1])]),i[a.type]||(e.console&&console.error&&console.error("laydate type error:'"+a.type+"' is not supported"),a.type="date"),a.format===i.date&&(a.format=i[a.type]||i.date),t.format=r.formatArr(a.format),t.EXP_IF="",t.EXP_SPLIT="",lay.each(t.format,function(e,a){var n=new RegExp(w).test(a)?"\\d{"+function(){return new RegExp(w).test(t.format[0===e?e+1:e-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;t.EXP_IF=t.EXP_IF+n,t.EXP_SPLIT=t.EXP_SPLIT+"("+n+")"}),t.EXP_IF_ONE=new RegExp("^"+t.EXP_IF+"$"),t.EXP_IF=new RegExp("^"+(a.range?t.EXP_IF+"\\s\\"+t.rangeStr+"\\s"+t.EXP_IF:t.EXP_IF)+"$"),t.EXP_SPLIT=new RegExp("^"+t.EXP_SPLIT+"$",""),t.isInput(a.elem[0])||"focus"===a.trigger&&(a.trigger="click"),a.elem.attr("lay-key")||(a.elem.attr("lay-key",t.index),a.eventElem.attr("lay-key",t.index)),a.mark=lay.extend({},a.calendar&&"cn"===a.lang?{"0-1-1":"\u5143\u65e6","0-2-14":"\u60c5\u4eba","0-3-8":"\u5987\u5973","0-3-12":"\u690d\u6811","0-4-1":"\u611a\u4eba","0-5-1":"\u52b3\u52a8","0-5-4":"\u9752\u5e74","0-6-1":"\u513f\u7ae5","0-9-10":"\u6559\u5e08","0-9-18":"\u56fd\u803b","0-10-1":"\u56fd\u5e86","0-12-25":"\u5723\u8bde"}:{},a.mark),lay.each(["min","max"],function(e,t){var n=[],i=[];if("number"==typeof a[t]){var l=a[t],r=(new Date).getTime(),o=864e5,s=new Date(l?l0)return!0;var t=lay.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=lay.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=lay.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=lay.elem("div",{"class":"laydate-set-ym"}),t=lay.elem("span"),a=lay.elem("span");return e.appendChild(t),e.appendChild(a),e}(),function(){var e=lay.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=lay.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],l=lay.elem("div",{"class":"layui-laydate-content"}),r=lay.elem("table"),m=lay.elem("thead"),c=lay.elem("tr");lay.each(i,function(e,a){t.appendChild(a)}),m.appendChild(c),lay.each(new Array(6),function(e){var t=r.insertRow(0);lay.each(new Array(7),function(a){if(0===e){var i=lay.elem("th");i.innerHTML=n.weeks[a],c.appendChild(i)}t.insertCell(a)})}),r.insertBefore(m,r.children[0]),l.appendChild(r),o[e]=lay.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),o[e].appendChild(t),o[e].appendChild(l),s.push(i),y.push(l),d.push(r)}),lay(m).html(function(){var e=[],t=[];return"datetime"===a.type&&e.push(''+n.timeTips+" "),(a.range||"datetime"!==a.type)&&e.push(' '),lay.each(a.btns,function(e,l){var r=n.tools[l]||"btn";a.range&&"now"===l||(i&&"clear"===l&&(r="cn"===a.lang?"\u91cd\u7f6e":"Reset"),t.push(''+r+" "))}),e.push('"),e.join("")}()),lay.each(o,function(e,t){r.appendChild(t)}),a.showBottom&&r.appendChild(m),/^#/.test(a.theme)){var u=lay.elem("style"),h=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,a.theme);"styleSheet"in u?(u.setAttribute("type","text/css"),u.styleSheet.cssText=h):u.innerHTML=h,lay(r).addClass("laydate-theme-molv"),r.appendChild(u)}l.thisId=a.id,e.remove(D.thisElemDate),i?a.elem.append(r):(t.body.appendChild(r),e.position()),e.checkDate().calendar(null,0,"init"),e.changeEvent(),D.thisElemDate=e.elemID,"function"==typeof a.ready&&a.ready(lay.extend({},a.dateTime,{month:a.dateTime.month+1})),e.preview()},D.prototype.remove=function(e){var t=this,a=(t.config,lay("#"+(e||t.elemID)));return a[0]?(a.hasClass(c)||t.checkDate(function(){a.remove()}),t):t},D.prototype.position=function(){var e=this,t=e.config;return lay.position(e.bindElem||t.elem[0],e.elem,{position:t.position}),e},D.prototype.hint=function(e){var t=this,a=(t.config,lay.elem("div",{"class":h}));t.elem&&(a.innerHTML=e||"",lay(t.elem).find("."+h).remove(),t.elem.appendChild(a),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){lay(t.elem).find("."+h).remove()},3e3))},D.prototype.getAsYM=function(e,t,a){return a?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},D.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},D.prototype.checkDate=function(e){var t,a,n=this,i=(new Date,n.config),r=n.lang(),o=i.dateTime=i.dateTime||n.systemDate(),s=n.bindElem||i.elem[0],y=(n.isInput(s)?"val":"html",function(){if(n.rangeElem){var e=[n.rangeElem[0].val(),n.rangeElem[1].val()];if(e[0]&&e[1])return e.join(" "+n.rangeStr+" ")}return n.isInput(s)?s.value:"static"===i.position?"":lay(s).attr("lay-date")}()),d=function(e){e.year>m[1]&&(e.year=m[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=l.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},c=function(e,t,l){var r=["startTime","endTime"];t=(t.match(n.EXP_SPLIT)||[]).slice(1),l=l||0,i.range&&(n[r[l]]=n[r[l]]||{}),lay.each(n.format,function(o,s){var y=parseFloat(t[o]);t[o].lengthh(i.max)||h(o)h(i.max))&&(n.endDate=lay.extend({},i.max)),e&&e(),n},D.prototype.mark=function(e,t){var a,n=this,i=n.config;return lay.each(i.mark,function(e,n){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(a=n||t[2])}),a&&e.html(''+a+" "),n},D.prototype.limit=function(e,t,a,n){var i,l=this,r=l.config,o={},s=r[a>41?"endDate":"dateTime"],y=lay.extend({},s,t||{});return lay.each({now:y,min:r.min,max:r.max},function(e,t){o[e]=l.newDate(lay.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return lay.each(n,function(a,n){e[n]=t[n]}),e}())).getTime()}),i=o.nowo.max,e&&e[i?"addClass":"removeClass"](d),i},D.prototype.thisDateTime=function(e){var t=this,a=t.config;return e?t.endDate:a.dateTime},D.prototype.calendar=function(e,t,a){var n,i,r,o=this,s=o.config,t=t?1:0,d=e||o.thisDateTime(t),c=new Date,u=o.lang(),h="date"!==s.type&&"datetime"!==s.type,f=lay(o.table[t]).find("td"),g=lay(o.elemHeader[t][2]).find("span");return d.yearm[1]&&(d.year=m[1],o.hint(u.invalidDate)),o.firstDate||(o.firstDate=lay.extend({},d)),c.setFullYear(d.year,d.month,1),n=c.getDay(),i=l.getEndDate(d.month||12,d.year),r=l.getEndDate(d.month+1,d.year),lay.each(f,function(e,t){var a=[d.year,d.month],l=0;t=lay(t),t.removeAttr("class"),e=n&&e=a.firstDate.year&&(l.month=n.max.month,l.date=n.max.date),a.limit(lay(i),l,t),M++}),lay(m[f?0:1]).attr("lay-ym",M-8+"-"+D[1]).html(E+T+" - "+(M-1+T))}else if("month"===e)lay.each(new Array(12),function(e){var i=lay.elem("li",{"lay-ym":e}),r={year:D[0],month:e};e+1==D[1]&&lay(i).addClass(y),i.innerHTML=l.month[e]+(f?"\u6708":""),o.appendChild(i),D[0]=a.firstDate.year&&(r.date=n.max.date),a.limit(lay(i),r,t)}),lay(m[f?0:1]).attr("lay-ym",D[0]+"-"+D[1]).html(D[0]+T);else if("time"===e){var C=function(){lay(o).find("ol").each(function(e,n){lay(n).find("li").each(function(n,i){a.limit(lay(i),[{hours:n},{hours:a[x].hours,minutes:n},{hours:a[x].hours,minutes:a[x].minutes,seconds:n}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),n.range||a.limit(lay(a.footer).find(p),a[x],0,["hours","minutes","seconds"])};n.range?a[x]||(a[x]="startTime"===x?i:a.endDate):a[x]=i,lay.each([24,60,60],function(e,t){var n=lay.elem("li"),i=[""+l.time[e]+"
"];lay.each(new Array(t),function(t){i.push(""+lay.digit(t,2)+" ")}),n.innerHTML=i.join("")+" ",o.appendChild(n)}),C()}if(h&&c.removeChild(h),c.appendChild(o),"year"===e||"month"===e)lay(a.elemMain[t]).addClass("laydate-ym-show"),lay(o).find("li").on("click",function(){var l=0|lay(this).attr("lay-ym");if(!lay(this).hasClass(d)){0===t?(i[e]=l,a.limit(lay(a.footer).find(p),null,0)):a.endDate[e]=l;var s="year"===n.type||"month"===n.type;s?(lay(o).find("."+y).removeClass(y),lay(this).addClass(y),"month"===n.type&&"year"===e&&(a.listYM[t][0]=l,r&&((t?a.endDate:i).year=l),a.list("month",t))):(a.checkDate("limit").calendar(null,t),a.closeList()),a.setBtnStatus(),n.range||("month"===n.type&&"month"===e||"year"===n.type&&"year"===e)&&a.setValue(a.parse()).remove().done(),a.done(null,"change"),lay(a.footer).find("."+v).removeClass(d)}});else{var I=lay.elem("span",{"class":g}),k=function(){lay(o).find("ol").each(function(e){var t=this,n=lay(t).find("li");t.scrollTop=30*(a[x][w[e]]-2),t.scrollTop<=0&&n.each(function(e,a){if(!lay(this).hasClass(d))return t.scrollTop=30*(e-2),!0})})},b=lay(s[2]).find("."+g);k(),I.innerHTML=n.range?[l.startTime,l.endTime][t]:l.timeTips,lay(a.elemMain[t]).addClass("laydate-time-show"),b[0]&&b.remove(),s[2].appendChild(I),lay(o).find("ol").each(function(e){var t=this;lay(t).find("li").on("click",function(){var l=0|this.innerHTML;lay(this).hasClass(d)||(n.range?a[x][w[e]]=l:i[w[e]]=l,lay(t).find("."+y).removeClass(y),lay(this).addClass(y),C(),k(),(a.endDate||"time"===n.type)&&a.done(null,"change"),a.setBtnStatus())})})}return a},D.prototype.listYM=[],D.prototype.closeList=function(){var e=this;e.config;lay.each(e.elemCont,function(t,a){lay(this).find("."+u).remove(),lay(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),lay(e.elem).find("."+g).remove()},D.prototype.setBtnStatus=function(e,t,a){var n,i=this,l=i.config,r=i.lang(),o=lay(i.footer).find(p);l.range&&"time"!==l.type&&(t=t||l.dateTime,a=a||i.endDate,n=i.newDate(t).getTime()>i.newDate(a).getTime(),i.limit(null,t)||i.limit(null,a)?o.addClass(d):o[n?"addClass":"removeClass"](d),e&&n&&i.hint("string"==typeof e?r.timeout.replace(/\u65e5\u671f/g,e):r.timeout))},D.prototype.parse=function(e,t){var a=this,n=a.config,i=t||("end"==e?lay.extend({},a.endDate,a.endTime):n.range?lay.extend({},n.dateTime,a.startTime):n.dateTime),r=l.parse(i,a.format,1);return n.range&&void 0===e?r+" "+a.rangeStr+" "+a.parse("end"):r},D.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},D.prototype.setValue=function(e){var t=this,a=t.config,n=t.bindElem||a.elem[0];return"static"===a.position?t:(e=e||"",t.isInput(n)?lay(n).val(e):t.rangeElem?(t.rangeElem[0].val(e?t.parse("start"):""),t.rangeElem[1].val(e?t.parse("end"):"")):(0===lay(n).find("*").length&&lay(n).html(e),lay(n).attr("lay-date",e)),t)},D.prototype.preview=function(){var e=this,t=e.config;if(t.isPreview){var a=lay(e.elem).find("."+T),n=t.range?e.endDate?e.parse():"":e.parse();a.html(n).css({color:"#5FB878"}),setTimeout(function(){a.css({color:"#666"})},300)}},D.prototype.done=function(e,t){var a=this,n=a.config,i=lay.extend({},lay.extend(n.dateTime,a.startTime)),l=lay.extend({},lay.extend(a.endDate,a.endTime));return lay.each([i,l],function(e,t){"month"in t&&lay.extend(t,{month:t.month+1})}),a.preview(),e=e||[a.parse(),i,l],"function"==typeof n[t||"done"]&&n[t||"done"].apply(n,e),a},D.prototype.choose=function(e,t){var a=this,n=a.config,i=a.thisDateTime(t),l=(lay(a.elem).find("td"),e.attr("lay-ymd").split("-"));l={year:0|l[0],month:(0|l[1])-1,date:0|l[2]},e.hasClass(d)||(lay.extend(i,l),n.range?(lay.each(["startTime","endTime"],function(e,t){a[t]=a[t]||{hours:0,minutes:0,seconds:0}}),a.calendar(null,t).done(null,"change")):"static"===n.position?a.calendar().done().done(null,"change"):"date"===n.type?a.setValue(a.parse()).remove().done():"datetime"===n.type&&a.calendar().done(null,"change"))},D.prototype.tool=function(e,t){var a=this,n=a.config,i=a.lang(),l=n.dateTime,r="static"===n.position,o={datetime:function(){lay(e).hasClass(d)||(a.list("time",0),n.range&&a.list("time",1),lay(e).attr("lay-type","date").html(a.lang().dateTips))},date:function(){a.closeList(),lay(e).attr("lay-type","datetime").html(a.lang().timeTips)},clear:function(){r&&(lay.extend(l,a.firstDate),a.calendar()),n.range&&(delete n.dateTime,delete a.endDate,delete a.startTime,delete a.endTime),a.setValue("").remove(),a.done(["",{},{}])},now:function(){var e=new Date;lay.extend(l,a.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),a.setValue(a.parse()).remove(),r&&a.calendar(),a.done()},confirm:function(){if(n.range){if(lay(e).hasClass(d))return a.hint("time"===n.type?i.timeout.replace(/\u65e5\u671f/g,"\u65f6\u95f4"):i.timeout)}else if(lay(e).hasClass(d))return a.hint(i.invalidDate);a.done(),a.setValue(a.parse()).remove()}};o[t]&&o[t]()},D.prototype.change=function(e){var t=this,a=t.config,n=t.thisDateTime(e),i=a.range&&("year"===a.type||"month"===a.type),l=t.elemCont[e||0],r=t.listYM[e],o=function(o){var s=lay(l).find(".laydate-year-list")[0],y=lay(l).find(".laydate-month-list")[0];return s&&(r[0]=o?r[0]-15:r[0]+15,t.list("year",e)),y&&(o?r[0]--:r[0]++,t.list("month",e)),(s||y)&&(lay.extend(n,{year:r[0]}),i&&(n.year=r[0]),a.range||t.done(null,"change"),a.range||t.limit(lay(t.footer).find(p),{year:r[0]})),t.setBtnStatus(),s||y};return{prevYear:function(){o("sub")||(n.year--,t.checkDate("limit").calendar(null,e),t.done(null,"change"))},prevMonth:function(){var a=t.getAsYM(n.year,n.month,"sub");lay.extend(n,{year:a[0],month:a[1]}),t.checkDate("limit").calendar(null,e),t.done(null,"change")},nextMonth:function(){var a=t.getAsYM(n.year,n.month);lay.extend(n,{year:a[0],month:a[1]}),t.checkDate("limit").calendar(null,e),t.done(null,"change")},nextYear:function(){o()||(n.year++,t.checkDate("limit").calendar(null,e),t.done(null,"change"))}}},D.prototype.changeEvent=function(){var e=this;e.config;lay(e.elem).on("click",function(e){lay.stope(e)}).on("mousedown",function(e){lay.stope(e)}),lay.each(e.elemHeader,function(t,a){lay(a[0]).on("click",function(a){e.change(t).prevYear()}),lay(a[1]).on("click",function(a){e.change(t).prevMonth()}),lay(a[2]).find("span").on("click",function(a){var n=lay(this),i=n.attr("lay-ym"),l=n.attr("lay-type");i&&(i=i.split("-"),e.listYM[t]=[0|i[0],0|i[1]],e.list(l,t),lay(e.footer).find("."+v).addClass(d))}),lay(a[3]).on("click",function(a){e.change(t).nextMonth()}),lay(a[4]).on("click",function(a){e.change(t).nextYear()})}),lay.each(e.table,function(t,a){var n=lay(a).find("td");n.on("click",function(){e.choose(lay(this),t)})}),lay(e.footer).find("span").on("click",function(){var t=lay(this).attr("lay-type");e.tool(this,t)})},D.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())},D.prototype.events=function(){var e=this,t=e.config,a=function(a,n){a.on(t.trigger,function(){n&&(e.bindElem=this),e.render()})};t.elem[0]&&!t.elem[0].eventHandler&&(a(t.elem,"bind"),a(t.eventElem),t.elem[0].eventHandler=!0)},r.that={},r.getThis=function(e){var t=r.that[e];return!t&&a&&layui.hint().error(e?o+" instance with ID '"+e+"' not found":"ID argument required"),t},n.run=function(a){a(t).on("mousedown",function(e){if(l.thisId){var t=r.getThis(l.thisId);if(t){var n=t.config;e.target!==n.elem[0]&&e.target!==n.eventElem[0]&&e.target!==a(n.closeStop)[0]&&t.remove()}}}).on("keydown",function(e){if(l.thisId){var t=r.getThis(l.thisId);t&&13===e.keyCode&&a("#"+t.elemID)[0]&&t.elemID===D.thisElemDate&&(e.preventDefault(),a(t.footer).find(p)[0].click())}}),a(e).on("resize",function(){if(l.thisId){var e=r.getThis(l.thisId);if(e)return!(!e.elem||!a(s)[0])&&void e.position()}})},l.render=function(e){var t=new D(e);return r.call(t)},l.parse=function(e,t,a){return e=e||{},"string"==typeof t&&(t=r.formatArr(t)),t=(t||[]).concat(),lay.each(t,function(n,i){/yyyy|y/.test(i)?t[n]=lay.digit(e.year,i.length):/MM|M/.test(i)?t[n]=lay.digit(e.month+(a||0),i.length):/dd|d/.test(i)?t[n]=lay.digit(e.date,i.length):/HH|H/.test(i)?t[n]=lay.digit(e.hours,i.length):/mm|m/.test(i)?t[n]=lay.digit(e.minutes,i.length):/ss|s/.test(i)&&(t[n]=lay.digit(e.seconds,i.length))}),t.join("")},l.getEndDate=function(e,t){var a=new Date;return a.setFullYear(t||a.getFullYear(),e||a.getMonth()+1,1),new Date(a.getTime()-864e5).getDate()},a?(l.ready(),layui.define("lay",function(e){l.path=layui.cache.dir,n.run(lay),e(o,l)})):"function"==typeof define&&define.amd?define(function(){return n.run(lay),l}):function(){l.ready(),n.run(e.lay),e.laydate=l}()}(window,window.document);!function(e,t){"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(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}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}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(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)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c ")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,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(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===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]||t.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]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(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(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML=" ","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML=" ",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length a ",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="x ",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""," "],legend:[1,""," "],area:[1,""," "],param:[1,""," "],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:fe.htmlSerialize?[0,"",""]:[1,"X","
"]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s ]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/';
break;
case 'product_zdy':
return '
';
break;
default:
return '';
break;
}
}
================================================
FILE: static/common/user/css/font_1546140_sw4m5ivcrg9.css
================================================
@font-face {font-family: "iconfont";
src: url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.eot?t=1575558014483'); /* IE9 */
src: url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.eot?t=1575558014483#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAG88AAsAAAAAuvwAAG7oAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCQagqCzQyCgGABNgIkA4NEC4FkAAQgBYRtB4oVGyGTF1SvOcbdDsBx0afHHVE1K41E2AtOisn+//+aIMcYjWkHaJX/gqzWovet8gSWWk9cEe3d8R2q0F/Igf7m39NaR4xhMOCId0jG1pzsUHFhYYQnZmimpF1cprBN3DnWp7/sUIbAjI2tPXYqvkvpwIA2jkowBFQob7oCmQgd8n23O/qVSZWD6z0q979gl+kR7FJe5JCkaJrwD4zD3kCwkyVDpW35xH8O+Q51vq+zgE6y0I4TfnGRePy8dpj+unVbCgLomc4n6F/mvk6/ckdIuOvDxLBAvkym//b8/dpUjZFtJUaimcYDzzX/RfJoggPe8xNaBQCmSDbw3gUAz///ffpz98kwUwBT7PrYlmfjggTwmxW02gDFO/H8hufn1vv/L5PIFdELKlbA6I1IiRqhwgBhiIqkDBOQPkXCAgurETPPs9A+o7AuLNr8fOD/UW0WfOE7EplhIpDAoBEkIepkk+rusGdZUftO7qlq1V3r8r3z+d6pNSPFBzOSvSBIckCB5S/CvwPMqyBUCJXJB5p3fzO/ZHPaGgItB2g5tMCSfQT//6uufx149Qhu3WcfW0rIFNlyYsqdSyDQb2du6SqUWwKhTGvrDYN/pF/p9xSXEHgzdqfVIWV6seVXQJ17hJLjDBZV1QjggTjcc+t8iXT3REtljInRHuc5FBZx598c//yrmq7g8Qp1TpFSZU+nd8+tD0tK3zxsWcb/PyAJHyApflLSCYB0R1CyI5DKhYBc+CGdS+XJ6X2qfcMHdQ5AuQBUCimlAKliKpUqe3PGTG5Thi0ZlkmXqdRly7Csgf9Zo+IV62HnBB+oVm0zyRiMuTyoH1OflMx8QhzM9238GGMYcxWl1e3Gdi1QKSk3oKD2/xkGCJaWohm0r9XNKDBx2QBnIxobQFHqYIqoAVUXkrdxcjB0CRXu1SVwwv/e4EcrmEEM8Yj4q/pOyTD5J7+q1bXod9JRHeZGwNY7ghFCNDBGjJrSqWGDUV6K5hUj+zXj4CfI5c/Y8lmjXpMWbXoMGDFmwrxVm7btO3bq3pOXy3Ql97Km7fa76svV5Gur3+ov0DXQHRlOy9Kz4o2By14lgW1kn+r1n8RDGEdWRiEixbDTWIpjSzouiYkDLEWukqVwkilHPhNrN9R0dMk80WeTxYuFcwoFxctTZcCgydjE1MzcQltIp5UoZz12to5ObszGPbx9/Qy9/Om4K5AyzG/AxZVbKYWvJO5ZUzIyVykuVTHBWQFs3JVVIm2GQ5og/iZhkIJTawRMKrqchwCDMAgCRwgGK0QIBEMoCIHQEAlhIAbCgh0iHBgiwoMvRIA4iAi2iEgl0BUZkAhRIAmiggkiGkRBdLBExAAHiAmuEAuSITakQEbgBBlDJmQCOZAp5ENmZcSqOcAakQUUQZZQBllBDWQNtRAHTBFxoQ7iQT3EBx9IAFmQDXhBtmCByA4yIHsohBzKoOoIiIecIA9yhirIBRogV3CD3KAJEkIzJIIWSAytkATaIHdohzygA/KEasgLIiBv6IR8oAvyhWjID5whf+iBAqAPCoReKAgGISkMQTIYg+TgCSlgHFLCBBQM01AIzEKhMAepoBEKgykoPHP5q0YAXKBIcIeioABSQwIUB8NQAoRCSTAAzYIRKB1GoWwIhPKgFMoHc0QF0A8VgTEiHVRAFWVcVOcB7KFKMEJUBd5QTZk+V5cAYqGlkAqthGKoDQwQ7YZ0aB8EQFfABtFfUI4fnpCLH1FQgh9LIBs/lsIMfnSBH348hTT8dIEg/CKO8Hd/I4sHJgEs4MUXwGiBlA0KR8QJo97DoTHANGkyaBiyQumMYhxKHBPAJAuBWeQBYG5IHCOKUiAohUaIoFTmXBEaIosO53dAz8DgJMXQwYhSMCWzUiOuocxEC8wFiUy3T0QNZi4gICSiROvYB+3IAxMyM42Lan+PkdoVuiB37IOygXnpEGsc4FvbdxCYVw6Gbn+Bg+v0E++l1V6DsLPMIbDoMn7wq/8+UGQIWFU6H++dhLnVy6lZcl8mfTAmGUAJY/De+FAM+k6BBSIbSnCnJwIXGLG9kPI91CbtjLqDuUrJqLhHfFs9BK8yhjewOM7VAVfk5jKFBFRYc9Jj32oIoSRsceFSloYxlAW3wRDjYbZRWklmdTCNxeI3uN2kGG2CyINOtiIw52ZHtl11rb+MRpjWnO9rTeNQuvoWeg+616dP79XSQg8LYcFRBRHn6KGitDEewZUpFvgjB/GY80atK6dYVMt/vtxA7SZM9KGN0zJai7i20cNq/8Rv2mI1ggpnmyrezCrCWKbUkSPDdIrSSHCgQTKTqzkCn85yY40AExAYeztuSkmUC6vuTCCsDgyttIUAKIWK3EgBvBiwb8/RFaLBjiARHBQx5eiddifdTGxlweWzM1Wb3P6Oy2EWlwY3SbMK5AzWimUSL+5T1sEBMnAhzhC3Os1PCmK3X+duHF8Krb1vd+Un4Rx6b73Q6ErnB3MpXET37Mz5vgWYVAcTSBnxGgy4KKoY+z+2nFPOaJyXsZmivNEpa/iiv6EUHtPNXGa7W9hkmf2ID6+vt/vNUEOWrZIateWZXPJo60V0flnHQ55ET7xaT6EKydws1EkUxq2uhx3TdPN2fW0w53F1PNWF2bD07Wq5GSvAcl+Ha9di9HG73b1r3KzdcTOMXOx3EXE2Tjwr1bFKULDCxgXrQPuW87t2MahfKdLapZzXdP7QvuPsq57P+1VDmHs5o7Za8Gt5r7qY39+664atWZjLBbN51Q477u9bt92DjSUraMxCP7BJ4U2Pg5er5nK+ZPsUBk7TccyY3gaL7WLRgb4e89CqW1ZAMOJqHtoN2w4UeUMy3+24bmjEjL4GC61CgZivwTozX8vnuz2fKd4mkUgW4+KFr6zy19nlb53KN/sMHWkGMDWsm9la19Byy853GqvWvxbXTLM5iPvUiBE6ouBM2O+KXujPEyUAPGmGrMNVHwNfdPgxXcdANeGwqJ0x7uMc+D0/PRzYVnX7l1aT5YmIQXIDMg7TbtQzMwy13shMmDJaLSAdHZpC2mnq3MowgviiJInoB+qrr94yVFZfHAzumgfvDBoxKfRR1dFSFkm90eCx3Xjj6oO7d012+36P9a7na4YQNahWBUwQn40sdRhTnkodoWZBCH3VbzdzD4nqYrtPxBCq3eyySb92//33q7dtm5oikCC4gGvA3DqjthytFDZq+ZV0zV5vNtfi1WMPxBpeisUN4fy4JiWvm3+2XqQSvuOzaJreDKa0HOoLlTuFmQaVt2+p3aSnbpNKCHbdcCtTEUlz1ZiPb8lOkeoYV7OAQ3o08ILSSgGUQMJkXCskIeNEWURuRYIxuFEV5tnJIkVUDpXVvIEHUojdjkVggaLaL9SJAaGQzHQNWsuRSHIzzkAuGRGmQqPYRqQpUOkA84woGRKWMFNQECFECX+MSEqB3C2JGggrOGGcvLO94cP7BwhsOIRXWe+noaBdR7AZZNMLyxP/Ul7Z8d3ltal/raw+gXTs36QInH3ZihF1kuMpBLF2CA/Kz2CY2ZoQJHCkyEOd9iLH21ifQ11ng18Pk2CgXsQpRPvxwDRZL/9vOUfcMLRQQQasjoe3pA3MfC8d2GYBQnkL07yNNRVnVJNe+SY3aKCIrU9g4x1/9dv84td29FYYXkFUEZ0opFzAukhQtPRNCBJ1/t5cOXhmLd1/auXSLKXCAKUvBKyuzZkH55LSSXNxZdKozRZMM9L5ms1BhcyoOzRNv/J1RF8XC9O3znAkgMh4c2a1Mi0j2CfaOKPasEtUDZDriZeCheIe1YSSI31AxbysG7g1ByFAE23ipr1N14MDlIM6jW5u8b0dmyhAM8mMqHe37CwAeD9iXCL9E/0W2TJx3QBifBN915LBHaq/nm1bKEPPB1+AtdtY3s7lnu+LlagKaRZNaNKHkiTjWSKpanmw4/vpdG/CoLTUnYzytfsmHjbCdfdBWmjl/xYPXjt81WxVJzC8nfnbJNjoHh0adXwzC1AvRs3CtVFTCVjSeF6qpmC18lOb5WSzWmP3R+AwwrK2nxx9a2QLXyW8kU25GU+sbVXtTCqs7HaqrocQQQRSwxDvhwIEMQQBbaACvRZchU5+tcSHgnFVhBUfpqPpzZINpoxwdrrcnxlsKw5BsE9FXzX3i0H5q+zW0ZEhPWdKAvKaH1p+vGu8r8eBwM42B3/SeXKG6fIydgE8ml2zdwdjBZBj075oS97IbYbNYYPlGaq00/Dk9yUTOtZ2DfIG59tsm3RbP0ac2eEiQAfLTnqgZ3ZX+Ik/wcbITRiT+W/MFrP7jRxsEQ5C8gDOJHN7byhVcN1gG7enyPct3IobaebA7bHtLNJRCytXK9sjuTCMJpKNz2W5GCHaMibh13lUGekYYBSWujk8d4M0frNR7oFZC8qQkbP0G2b6TPPSy7cQRiKXobAOPkT6SdfgaQUA9FQ6ICCaYQ+h+8b28ezXs9XBwlb291amkZqG0zeHrTGSYH3v8+7jqfnTpq0VKooIUTwUS6MCAfd2Af+LXTMBkvnS6KRUVCUzG8ZSVPilWRd2LO9aBLO7S8U2RXCYUor9GdXvo9KmYIUWh6Pf7jF5ZnZuFyTrubrTYhKtqdmFak6EQHX/SINfv5Qc18Am1pRP0z7oUMvYwZgBfS5hOy9Nl9fGw8yLJkBUY0tcad54I5stdNjxdhZA0tolJqRZf9+prmJ2mRNzS+6jzRYDY3voqvIqy+MoLvtlPsRMzAhs5lBTBgPUD2PixQclGiLnkEadwByoTUqRyrpN2gLxtkWKrgl7qJUoJGTObFusLG/UngUKsJCMFAYFs9nLGbUZ6lBCKCqbcEERsH9aKxkCTcUfTkNujxA2Xgth0WSMzOZ8g9qFsbIu2eCkOW2+x2DeOWOyHn7qDEX1tYkMFrSoy4wc7xP91EM1+pFhWs8PF6bQx/oLlu0Uc05hYdp2i5ZTzOcCt0Bux3NOfr5glU4dJFfPebThFPK2awUzYaR8aLUyvJitpH2FYHj3B7xA/buOL+6l4TPRsCc5GBK26PLac0n3NlnUYJK1W/dHQcO6+oa49LsCwOKa274A7juBUsvd0GVz+dl8hfCsvThrzf3ZZTwPk1KA40prtDwrfEhya5gmzrihsylEl4WTDnr+z+yjHBhVPx9Eh3vWo3PW7GOuRpwNY1Acy3Uru/nHfRH3vZhKkyD0reCQy+c8+NfhtmPZEOTq2T9PsJjyCF6cu47tT5vLY0feSTIPvTfg/IgVPVWKJCOkufp6liLAaavQQkv4DJ+aws3glZZ0ynyKbquBZ4peXgRUs4iX8/MYfY4YwrSBtIz9NAeCPX44wDAxb+EJBh5v9+s8RDQ+6ChcFLEvosrfri/977XyX67O///GXvyCJDppU1SrghHZ8tx//mj/658D//+7629/jRP7SxQ029KnRYER+wefWRcNuR6ju7a9Mf6cBKKrU401E8OFYcO2MqsfEn36yDMeMOsrRmk3gMCdRD76yLBBWserQ+RL7zyUDgdj+jjbWjl/aqXYvpKpz16q1lfnOh9L6StlZZumadUA5cT2mTRNpkmxT43rWV1GSUNYQwQvV9zQzvu2eCDb0KyyERM1dv5zn+a1KcWP6Yb/jbyy8JkVvZ1d/tKpvgNUxTqV1ebCwleHf13g2kfNnVfm45kD/aT0J/+p4KQfeOFYutaNeoXvNgeE9CuoWZeE65qj9KPozOYrM/1PArS0POqcLVDmtrmxUW9yzmRhnQkLq4F6wFvEIGW0WOp+FJaoxkuJ5lqz9D7rjTQioP2JO7f0GhNs2MQ4kGeLnXTjkAmMEd8LTJlCT0O6ZyycSlpr+XJrrLP6A4KFUzGD+CjEl0T7gsy80Ke1S0f94dC/W5b9+oUM4YV3iZdivjLihXIqFypyPnBKrEGeLFrz1qT545pvXsofqd13K52r1tH6m87ZeoNXdI8dkVU4K9pYSUesP1OB+Cz0j+mWZ0cknh0iK/t81LznltyUURpbSAz1j/SekQzihntKrNJtF+3wdMVuMeg0LMnPX5r1bt2xAncyDLzu0C+DMQjpLlzcfPsQF/Be7uYuhQ/K7Zlr+xQOxs6zTbA0f44x9Fdzc7Hl1vJh3hMQcq9XGNiBwqJdkCys5g5tgtfEz3dnFc5pfOQXfk+wJ9UcDHLTjifehmVGuTBf0eWyHrPZUYbDn074k69G3dkh1O5MXdgeXl0rfyuOYIi8eWJMytaPI01ZnCTrmwxCfwT/RZo7j5tjMvVKFjZqQy1Gs/y+CWEGNxtkuNCGyqOzdfnb5odxKtCyl8cunR+D1VECJk3NrcuXd8lXqNu96NJrtBik4tt884p9LJBLFwbuQlh8kN7P+8frvfOL4B3JL96r1Niw7cOaijPqKfTr2XJAYeOGxZXPXDpm1OcKqGRMWPONjYWRqn4LHcU5vbEDiouF23JEsB0t1nn5zgbbDoTjdAwxhI8PwwtZmHuvPvL/ok165O2ncctiXEGzvo0Jk1o58BZlnuy7+cltXbKKojGMAdVlBcLDlEWbWJKTpVs/5iRzjb7aJtQeDp5IVMzDDbTeME3FpBEYvE94jO9OqwbeRiYjUUFtpS1chCFqWvnjoNkc+9ukVT7QIExns36k1uLZ3ofrwxF4SSbg+aFS+EIYvOGHwYgxw5rK37VLS81NerW+HZ5pUqXLHDZLNGmaYru/RPTsQ9llALr0lU/AILVY60Yfj4frhbTFWvnDNbEqjcj/Y7OBaoHd7p2PFru3kjv9pfjC4O5xUzz/ZK1aFbzFezTtZ5gRzRS/Q/v9JQwyjmi7XidkUDC9p1heymXy2ef8EyMmxKAWsRTp/E1SJXe+5/3jpuzo+jStLRundhAD6AOap1nd9V9uyd4DSKtB8FBj0hnRjUEM0UT4gh+EQeB5/tT4gZFgIvTHPF98QKdujIczW7K2Q5qgXKXLHS2+E74ukiKrdJL2B2yj6nXpgVp/UMj2PD3YOKZNbSKbdF9m4KFsNS2yD5UO+WFqL6/P4XjyyAYRsJlMuSawYAfR2qXPKd3Nu+80RAYUjEWmL5nzop1RpOqoEtgHQlArMsiY4sSNY+Kgwk1BUQa2xExeQ9vsIFeVFr9nRLGn/GR7vJ0t0EqiMBn6hEg1j78NMn08yg3xdsULMQ4fcEGyfCXMl722cUbFA/pqjl41uIhqd/uZNBp1z6BVLclKp5HopfVdJV3/ip99uZCUGxm43633jI5897lMKu3TNoGkk0oDRLmNPGBe6Q5oSc5UNpnRPUM5mRSO3FOpMxZ38EI42meWS91rE9XFXI/XHgleJjfG6QcZOT/cHEXqatkuc3UHM97IlnA6GaPGF/P+SOrUZ1Op5uP/65TmscJ6ViXbk7VRpQA9nJ/kpri5Dif+TzDjlHzJeYwY8lTqDilkhl/rMTHUZGaosfmmAJBv69dA8h2DNrdIxmQTVJ+oDpfzFgYituVyTchIoNpqKRRdIJNVarYlF/XoHkubovPHJ2NUqhljlWpj3Iib/plSkJes1AxDadeVW9jjyi3UA55uEQKxvEtILQEsdH+dGDOGkmjGvIyKBLgwdtspFttezSmt6U75j5rlI/hdmAoIQyRsO63Hz99vWQk4nsUIxGdSFVqNCib3ZBnJzU5PSJr8YGKSfJ9rrrCYIHqRYUsBpR15xm1XxzgzNTvjD4Evw6UJKHc0vzkW/X9ElcxbxYQ8DlU+Nz1V5jstRa5YuSFO55adIfLWWN8u+bH+Iaun7odUmv823hbqDdS0A29N1D4KU5HqsrzL745tjYYGD3ChuVuQiFZZrwHE8h5x0c5JELJQjZi2i0px/hrXrwdsNQUnp2Bbsvdep5tkC3H44Ofv/NbVW78GkXWMNy1ZSzP9mXZxxjmDzXul7tKJam7R4DkQhcPG8rLGZC/fmIH13bjnzM42713KXXz4fIv90vfx7a2Z/9T9bOwjb2QXM3ejx65Xrtao5UH8482eL7OG2lALgzD0/XMUjEtb6Hq5S3Av2aOuWEpzzWpf813Tip3w8En6h+kd7GdOqBQGZ/fql/lQax5e/XLhxySX5+gvfm6Xh1EPBPjQP2B7QL3arYoIOCJPdIF6CxPV89O+PG8ArzQtUzfUdxnz7+/VF6ygfpWHeCz1i0H7TQzq/UoAW6GMOUR4BWVZBoCPEKNciy/WeibuOX69mA0aS0+xHmsnjh68tvRFFc59tjSknZqfPiQT8Ylr+csji9eYqTQfw5WwZMqIPVzN1BI5aO6Q0HHzpbcUVO/F3z7cXt20PqOVlp0NMGQDm96iPjhco843qidg+490N3d8FLJs9Ks8jL+gp35TR+h3En0m1J4mQns7yEaj9eheUaLDDY/7+EzFEO2pUZfWZ/2NQetDZa3a9Bxfal5CkfL7oaozHhQfkJ5fQ/P3z3AYTC8zwVq9WrTYbSZtYyluDDrU7UBtf4NMeEWqfI8avvnXR42jdTy6fA4TsVPK/KfBuJTcNa+i+AyIxW6Cf/kMPTX1O47lu+J//aavnyl3Y1GnVsJizfRzUhCFfRwLAAteAde7YC3m6kGazXzFW4CUFF687I7PtauTn2Rc1jnXHTZiR4AG93CAZkkdX8+6vlITK8OaUlHRq6+31J+J6rvxz+WiLyWsjpL5/OTR17MhqQNZadLQ+MtGrke0sU6ufzP0n6X0K+sv5WtfZ/GikUOo4byn6grkz+vJuLg+Nw56zFzM42aJ+dIbc0fIssrAbDPWW2zSU+QKQVLmuOIbhQGMDIKV1Z0bRMAFgwptNNxxLY+dUZ/KPlF8UJ6po7p3EL2Njk3/uefC746uH0okm97sf0ndT5UJQ4IHkVH+kq38wmi5sS24N5zOZLMYpuBrezAjBpJNUYVCRNJcHR3GAq2ClCbT/FNaLBXlVcNRaMEFDdrzr8h3Kam3m1Dq7hp+oyHeBVxCMlN9PLm6wiQ3VYP/6yXZ7kZsBaFvB496Kedr4yNKEENSO1Ts5WmAx8p1lqJayaOVwsD+rGt2lyCXgiThLUyhQA/xmJMd52TAx0KlfT+lZ8SbHFzV5riR/JW1TwiCGZdHJHiBFIL5MuWhPlkBZjrsz53g9YjnDfomgZXBjo2QDKZPyRp0LlkbbfucQRv3JtZFY02nAkasRKpF7EqaiUJyLmU59y+Ml/TdVCF2bRxixiq/FzGznwozGYkjBvv06nia/jLbsT4sHPhA3FihsFFuO7fUFL0iYcSDI6hxlNwqhKPO680rRYl53Knq4xfuci/WysG52WbXKDByTsIeBkz/SNZYrUCa5TOD+AWI6GrRcF0z8fKUtpZ2Uup0JEhkQGuRmZgNuCZQ1evtCkrQMFqqmvioz6B8vzO4w0L/5AMdpCjpJ+kjG9RXouVkNV47YkB59dDAHjWyxz7ZL5Xv843Nm5ziltJ2i2PUN1HUKYLZagxe9UMPNPnhwZPCYR33oAAhZUtmiVEdVKAPyrWtw0hqjfUZJSJWCxjvFKSRtvNj2qyIy3UgU5VJzYQFswviGg3lK01P0HxvhzhVtkqMXCelkYkR0pynmsjfckf3Tjo8jU2Nfy7lkE6SN2yttiuYEPyScZvHryCIXQxvbmfXfuTFnDMQhs8VJxhEtinMDCOuJJDg0qaMS2pIAai5Nk3BfAlGxGl6ojaj+lbM03aEqNImVtIQedYym+WGrTQzWQSUGlDD5B7rziavQqIoB4NSYQg7jj+g0ARiFeNZohSltpjZUCFm0uAWjctIFIHoQCtuQpKyMwlN8+u1Og1S6Buc1hut2jOiACwtar0/qcyltVeNOlNoC/IrkNSYyev97lEUtTpxu2k5r0x1rBJhErVW2mlUfIiSOl75jcj/9xBalj+aysF7QzuRok3bG0tcP3DTlULn2+H6x7H6orOhsWS64Qkq0jhZgCkf+lxz9vy1X2y/Rh8vrISlr7zfQl1ckigVM2kTjc0AJgd8LlBbHXLl/GHrI+lxPKA02y8Lkh/UCvaJo+LjLMB8hV36CgaPeFZ9mptIHTE2ORpJqRPZ0ehRKLOc8GipCsafxJif7NjTuIz97brM+/vfQ//9s+Pyqf/q369wl054XAqcUfrP6ld6/EktoSQUT/441yqvydRn/Dnx3nDk9mVCMM2jv0ec4Xo/jL27YE4eufzy8MS8OiZqcFg08YSq82O6w440P/jptcfXPvy28taQ5z9uDLoXQ3/+jRufhE8uqNvslFyEeXEHT6sGryiFbVdr3mA2W2g5QkDVOnvhC/k5/qg+ca5I4AxXN7BegGjecUSV1aznCIGGnpT6nXt9krWEQrxyc/x10pYCvGeFHfdJ6Uz7ih0Gc0s2KT5wQ4FHv1+/v6Tk+flLTvfEiK2Nd6wgVBZyjXog20lkllfLiRrzPV5ruaYr471ocNTeES3TNF0lqSYOZfsJFNFb3UWjQ/JtSZGl/p1XisXwJ3/b0PVsbH2slIco23ZRFK9++uWHj167R+k3m2S301qtsY1Kz58XmapRpyHKfLUGn5w2Q/NjA+zKF94PFuLCAEKEjjK5G5SqcWCwUsnq3vqtmcaOCQtuxke9rHYdNWoQMJ/fEM6n05VMQQtnNjY1m5bPjCn3BsClL8K8XW/wD2WtqL76AcnI4YQsEJ/nrePCGOQf8T9QU/mu6gVLtaDuIVGDtMeOia4BRFVfTAr9w7wbdWyXHGsRLUjpG5AZ3yaHC4NsuTxxPlctiS40k08+eo2Qcdxarrehu5yrXjSi5Ne21TH9TiHy+o1VD5oh+0kXIIeq1N6qkMO5+ClISCTnTDHmrZ0D6qrxN98PQ5hUS/FKptCKjQbd2C5/nrXN/keJWrArzlUyd1KOasMzH4l0i8zniAsNhJTjY99QJgJwCGVmfeyMi5FRmzr5vhpFWzTch7Eiu8PcZMSFeuyqEl86kyeoQyWhiJRC0Ilh0ccMZoo9x16PpRqQhEGjkU30lZ8mynRjcAt4EwT7RnPJ3uYMyVfVqJL7GYsu5gC6H3nfuQ7WX8dtgtOMJ16DrsJibcttzIsO17L6hBJNypXisfYE13UQbSWErVvreQrroiYojPH1Q4WYEAlUEidBvKg9CsquOQEQABtscNHbJaGOalPUk9DHg855yukOWhSoFGfoZkbFVUrgd9xMwSR//11dCpLciVo3rCuBVHGG2VNtNk2sWEqDzYWUTY9eDQTJpUyo7+qP40d0aTKiNCY3wye5GzTXLzfDVC0mpWlLY2YY3BomildeSj+6ajw4BBkIMlqbW6/UMxigx0zG10ukHNYJeUZpQooim5kW4ve2zAv+nADJzMVxv7I+LPgK9wXhfPyNFz1Z8K2hP5t+e2Q5ydfx0WvxzbVPF7798NXoWgUV3izSnIpp1/MIrUnKEnZ6vis7HQ/+zvvw1CJhrgSNVHa4cMc521yUsiduX/7C45e5wqNKJ+SmBbGfobaiFWtNpHLL0sls1G4vOO6aZC4RyhX9l2cAGPm0nZ33lOPBlLWp7NwoWO2tzhDAAisqrkb1MWom2oNneeG+oILFFi5qENaSKH2FcdlMiVYgTHxJ26xlAtdXvVw3Lh13vGq8spSciIkkuPdWsAK/Q3NfDhXvvLOUXFYZT0abXiwUXPNuIwWuMODJWOEud1XTSBVUjjQLo6TPcRGZCBbAlBxJ8cqiI6icKHSR3W0Ymy1SjalisjEZfrYt2Q6bca+Veqx5NlWqKsUZBh607m4MFSWkXnaeiboPh1hsAODL9bjEi4/WPJkf+8Wbx0ho/0cmaMaYoZuTGh7aZ6aA4UMMPJAJzyNAQgd8EcAbSA7Wj36FHZG0Ryhua7SUZgXJy1qyXHRdNQJHGJ1CoC/E8NDEa9Fl/39lXxF3SJv6SKiFSVdsbxSJTSJK43Ne2aDuHFuwZGjgN7rQAPUebvpQt9ml9XfRbmsWVTIPrXdyRlswwOTSegE8YsgOvhy+1yNoVEUSgsHSFxW2hc8sD6rGtWR01cRsnL41osPi4E6xTTwdcU+myZFCHxO4t/NO5q4MEZwqAOmdImLSNUCim9o/Yi0e+vN7HxvP+jG8MA6yP3/pA5EXQzBxpIJtKkHHqDmBdoPffS/0ebhOJz8e9OhO3ws29gVr4/Rrdeu9gWBnmKCX8VMJO0qHpostRCvp2sLp9eLVMXZECca+ITvGUH1AfRMz+M44uzxK4vvZ0JiLu6g225idh/goS85V70ay0Wmx0VHYDASy3pRuiWc6JlmFkwL+yfXA1T0mFwE+n6xPS36svSlu8MHt6d5iqbcFlSS7l1bN+0sDt9OSWwxQQpFoBQkXZCUK4zUKS9atmRt9ymS9Whe+Q2mpNJhS8D2rvptv9S1kvynns7HSZ95PoXiiPPwFwXOfwJufRhPPyt635ZfS+pFJjBQqPUQpTdnPxVufHehjQgX2JkuPYFYr38vVjPahxETLR9jQkBRg+uI+GKPSobxvq00aZMlVQBdWzFNUyc37dFOke3n3hpiTd6uiDZVRMSBHWfFIKL6+KnpNNJY22fG8oLPajs67VjT74rL2lfkCXyqhCgLO8zC3aRbLbU5LyLt2AX4xedQ9zJkuDfzZQAA27IZ1MrTfC84zcHXqqKgz94iHoRWqxLjXYm58hKpj2GlJgEP2Drm4pxLanmQSCq4FXZIIact5ePYRh80G/mtRDSwu2SEV8+i7llPFTc5fJxt753LI5hK0lfn0kcXg2jvAMzEvuBr+Gpdy3V04sDUvCYEo7CQWppmrWi484qD7SJK1k3yLblgOA2ktFmI1V4WUtbRlS6EACIe2NSrAywQ9BOMIENaGJdXryw4PvYeeGdHJm5SbLRyXfKFz+/5lQ7s23KtF0nw41UR/dr6ZFE9ULkuzyjfLD+b0uBISIlFN3Cm6xxtFxnyC6KM0Vo1XYb55Ao6ynqhi1kgYZ3zax1nRxmkliu6wIipdn+wxHgy9OwATEMRkb5eb+Z7QDCYNj1puptJtFwQTY75mr4qKqvebIGrbVQzZ7laZ/LrTG2Uphb1R9gaRLuPh7XTOl623wnAgu27qy3QQY/Dl7+bEmMSDR7lnO1wbdcLZYWvcv3oHdv2MGE+YjMAP+QGeFDeSUq7JVYiOZRNw6MRYMTSsyVHE9L53gCEeQCDacGhjlUAEBC4Vss+g/XpO63qo+cL4xj1rT4ASoA51NsJRAGIR257iAQxmrNhOePfrUDdusoj3d6Z4wx7PvvPb+U/zTZebQsVexlnopl1obS/3ee+XTDBmOOcnJTNyF4c9HHIlGHBvlwAHgKJ90oK3+tNjpt3cw2EIuZwAzd+lehzYhnJOM+oQCPp+QTCnl1XKTufIj5BcQd85RyGecrSRZebijnhN0/enV7b0krMozGbenxLnx/KEwr6lyMAJDs/xPGIlv4kdhpd4/lSRsafZWeQME8DGST+Fr7JkoNkIcAGeW5PTxg8ubKt9OIHPA+AHyJ6FeZoFyJ/A45DyKSTHYBZNhC87IUUW/mblfAIDZJgSAO085hv4uLngApr98BKj86xi5HKAj5KyxCtbFZHFmdVWMePbOLI7wWFfCQRc+tHihABAPsW5ncu288Zaubx37zQ+fc60C4owTc/p/m42zX6a35LPM1qfzBu5iXOaX5i6uU1zuLT50kNDdm//yu85nkAfjz8p4HcOJOAo+qxDHQUJrgp3tovZzBMzV7bWp31vhFp1Wxpd5pn5suZuucwB9gFAKQH6DP1OTH/N6oUdkhmoFNA9zxz7KcTiHuzPKAy42VXbli9vmQZl8bZ+TBSixknJzk/2piUDHQMpXN36TvOU5nMpMy0AxwGkcoYZALt8DjZBcbs+B2g3ku+cIrY0FWMGdQCNtYNg0EP7aGjDQzTkIQCWGQB4rIDFj0D7degQQlzTZudyU49OHJGssMAMQOI+J+FI4WXrIfushFMu7Cw4C2HCHHA5C7RkgBV6xD2N1Dpr8K9QC540LRq6L7AKHscj5zAv42HNPM4ZuPwcnMKX4LWZ33Gchye5Z+ACh2dY5bvmKB7Bk9xYkOc/nLP8BDvOj6HPf8SBW0fHcBI9DueggmfhNTyKf+chBvgEg5CjygN1pAM8xT3ispd+FYBz3ngeAj7nwDqNZ4kdGngOnvRiP8MWeGhaOM+QPZVWvC8o+wwJnGdgCp7Fw/wfKFt8Gp/kBoHuf4ELewFgo/N34j51UjmQUPgfdt180sAzBvVs4AT/0jURckODDkt8c+cnQ9sDC7vu7QLN1377MQ0mbG/Rvhm261p9jmSXJ0fl1/Gh3I9eKkHp+Rl/BgsmDJcl24A/5Vl3Xi4bJdcAD0J+Ynqkb9MKlGaGFDzUqFCZsThBgwt7TArwBJN5l8t2LBVzLVkoBeqCZL4UfjUmwEHQST4SxOeH50t7FGrWKtyeG8/O37Q1t2MtjYA/AvkVHcIw+SIOClek1M7JRHqa2JfJUvyPWsaMARJDMsltzSSUkJMEzFA1+F79E3awoFLQdL69D0tUCQhA3cAZnmoe7pLVZIEJaOalMfFIwx6KNutYSAxpQ8ZAVFkUsha3xxllGZREoPCrglDv5tlOyxZ3dWpYoB8UC9pCb7jItTVn8RjDNFvnac8K0zUuzhEoa49DFbZCG7lQpI62Jd2pY4K444FiUxJUS8B4ncOBQWnZbAuA41QepQiK1E8TVFAQu2Rbag/cjquzBjsk0CCUTrOQE1yianV+pVDrIAYCYq0ofUQ7kRUkgGCRQS45uUOBJMYxiVsVUS1si4THEZFQHD6kJFi+wqnmTywX0CQUEPqFdLN+v8cH4aOxUi1rFWOap5Lk5EEVSLMgRbqhw+ePpzzG1HNPReHJUt1PjwoCV6nYX6EAhX9S6ItXU5q8aTmfEIfpRA1CFMpTCi2utYKiwlgJpM6ngIi3JCcld5n0XCsxdYqWIlmibSkCySgZ3krU2wBInbO0Sua3QL3yPLgV0II86tnhY54Ffs0NdWMr1Kpq9Ap/FoYJ2DcfaRWqJTaYuj1n3aJFCz2FIXp1C2r5XZvg4bCWaxeDVoGPHu5qEPvmCkEav7J/e3Eza9g+D/buLVukAIdJTMs/e7wbXv43IWGKdpENfPiS2xI4lZlqUDl99v0Y3lUOtQHcwPGz/5yBAyLHuRxa+KxzCP97gpgJG6Zl61PskH1AoBpwU/QQYfNM2DrhB3131GnIPjmxPf7H9zDcYxyYIESk/FUdo1i79IqInh9DUpa7YAr6f5j4dw9hwgRgUsfRMTRk3Wve9fUh1KVnbaU7/ab11OvmLxdupoa6P9F5Z+1U0kMPbPvP/DpV/9hvyF6xrzqEqrDGeGMsFCp6wXp7xZDfYz31mrnUYe05WqhyZ5a37pNATGeI3oWvzK9R9dN+O22l+6pVdIVF/Z1ozSoWN2hN1+Suvu+ZqkIp1KI032NhiXeNCkzEEr6JqfaONu1Kmk8cRowO9c6436BZk2/aIXYX0oWFRgOxnfe8M1Qod40o3fdKasEdk3wHvjskQIyKXieGHUv1VmAUiJdX2v298QNaow5my7EQKCMDajHkAIyFFktC2dMfqNQP0+T6IOjJ/b6+SyeewEMzSqtiWFP6psF0HwX6eHG4ND1fz+DKQUoyJIcAG/wTwUKlHrGGtK8Xge5hb0f7djNinQReY4+h03jlceFVQv3/xgWIPjZsibDgu1EBKkYbF1YlLXhYiFTFhi8R6h8VMEGVFyyXczi1a8Fn9kOXlJcgLDveSrcWKirBE1sPMbS8fPpCuparpR8kteJLQdHctclWbLCZ8Wyu4XTfmT7D3GeM/SDgcp3cUxRqFu/myA7nGhlPytD/hHopmnGyConPTscw8zsEXi6LTE+4l9Dhq9f0bKvBZBVYB9h//xW+OJ9hfLfsRU2Ys18QNy5VRKKtvl8+CMpM3FPtFEq71MIF9lSqbRE3K0Vm5wFA+4UY0/uvcx87b/33BDXbXBHlPWfysEnmpGPF0V+a/zebWbzaCcLBi3vWyYmi99dTPPH45MfkhwNqb+Eg01ZTSAzq/lWpGCKliLt1Gw/3Y6B/FD45UVcHxJDpQudt2y7lAA4iP476+RPV4vEDYrSoISF+Q8hffyGIQ54bQiUAUlj8y7gQbbv7tr/HRRlcPThYjWB7qa24JfDuPXAzFG4lt2rX5TssUVKXkpWXypyl2F5KL7ZEEMNLXw4SQXxya6RAE5l+UpNgn90PMkB2wZoUWxFCSMFE5oDAMzgl+L0PeLyYjzZBr7d1h65QVpF/Qw1QT7+sdvoz7GWzUWpii95VyQZAzkZ35ZO6jAHA/DFhfMJaEMsC1Ls6PjP4HzC3NAfEYib6wQKpBrviEwDX/8CWM3lAtzosCaRiuUmxUCoKlQwDWirIwVJWgj8fboHjAeipA8QeMDD497w4sBoHgLUp6JHqS40WTgC0DIBwUH818PPce7RL0D3oEo1H6jvjy/b9viJHpMjzZS+2f+Rg+S/QL4n19LxDoZJvB285YO6q8bRoU9FZB0AEyqrF/t7W/8DxgStFJfXLuuR8KcvvbIviMuX4YNsfvzGya7uvGT1wnjJCGV1Gm6EvqVHql/MDIHxyj7qkGxMZVF9fnhgXiH/A4QAfcoGTl1TlQwnmlHByt5Wahy5E89QWvN3HEQ6sPts+lsNWYE0cm5gYI1qDrQCIp+VlpBmSqRvjZeMfiTgfSTc943/Xxj02h1a1ctI4rUPmj+OEn8Zvygyu9BfyQehbWw3cwOJqP+EH5Bd2Rhf/G/4oLBN+hH8nZM2ALPlV2yNTLoy1tgZb2k41Ot2D9H7Qsq7b2de9QFnNquYZhC2SFsXIZHZKtCAMCskPSRa4ohur4/QSg7SFYWAZJNXuvs7ddRZSIiIpnNt6nH089Ipqtp5nYJuDPm71ZBHOgviQbIwpooXZ/MnVcVXuwDzD8wq9R7hFepLMx81NiOoV2aFhXpiwEPUnpUJ3WQWCri6WewlDzOJdHVnhHLbxpBT9j1eoohInK+d773QKM/+LwChnk+jxF/JX+1RLN22rYWcXWLl4vyH51V6Sh85nv1iqOoujSBM6Zef7SlLt5Aq71AKBPZVqWwhAtH3tsXW182g7F2N6727OY/81l2JHM0W6d9qNLfYlux3LLDIZbtSM+AoE1TEI7rYNxxLx5XZMAav07YdvTCf8tql2W8f7U6Y9PxymDROrvfVz7X50f/12cfa9/rhA76X/xBGZVx3fO1TDmWYNCYDDBw5ban0um/EjwnTjnk6Pjrim70VmXslqbhSnSs+J4saAJCp33uelZGxus+TdD8JPzVU8nY4aul3fz0ZDz1ht11i+eiiN4ZgcE3H6nojkqpNZp4gjSu1H47s4lHB1vWmgarb9EvE15uGM0Gt64W9UgWBZLo5ckywZerEkxZJtmbqERQ7xY/sFk1OsQzghzBA/XbCDrYMlnGCO82xJ9f6F2xz/1UtY1tes8w4tu39l6gPFILRmWnuxvOyYtiMP05wcH7QNeP9ohfa/PpRt4ZecbteaZBS7wWfPs5PhAdms+LsnthKWD8azPPDopA2rkZUPoq9p02sJ2P6waAp+XnvuowwL7nwQpuxEVx/CeztHfZVhz/nXHb+TmpZWeMb79nX2hvepBmLXqj7+vG99BRJEK8I7X3R+Fc8xDZZy/b31zztfvzb03bZWGR0fraAZwka9B8JCwxSN8WGS8PWGzgQfbb7KF1yg4F93f9SoXK/srE6xGDIsOixGkY5OV0aHRytXB6dMpcoZipiEoKmG/V53PV9/d/3zVc89PjQqu5Sf+/IN+93o946OUwgUcTHefWEz/vJ0Sxu/idbO2SuZ6Aos8BKL491AaGZmCFR3zVuUxFiZLQy5fHiRklcXAmVmglC3eGHIyuwkRqr7AHLjBRkwcvxqAp7ksZ0v6QO3urwerl0Lej6kZ06PCa1cKE9OlgMZmGtBcrYc2OeDQBYf9ed+k2att1jNVdEtXfPJQmCohgugvMbWXKxx9OLcBFAELV0GF5KIUfi8EigGiq/IPDP0T80I8IPGmxpZffZ9rMbsrwS7ftDz2ASvzOYET36L5mHuYt0FioT/EiJjoDnWgXj1nKcxLpfmWJUy5cS5AU09eGWgwRKNTHPo2GX1aowMh0UY4aFi/vzURZ/alxBJ8WD/oefDbwiUMaWCi8DB+Ivg8LiSFyJk0ETTODrGL+5/KkR1YjAgepaxJZd/WiLGCFz81zSPuOGvECYm3ZW/Nu+/g+SdkYn395H5RIUk99DqSkczq36PXPyaHS9eCrC5APh/qkMifpy4gruAmzmORKGilsd53DXc/8cvdKVDi+qgrAQcS4cyiuqMmJ0xGkuLwjt5ysJyHcCXDrqP5B7p7jmSc6Sn+3Du4Xx3Md7b21uZY6d+AZ5zdxux0YUKjOjB7Lm6JhO468zpTiSgxPbFi1Jb/y7k9GmkizVhyClT0G9hEN35BdLhhthQV4r+xYusbDtgHZdFUD80+klkXkJRMOhT0Hzd2eygJZLkGgourzi49iFYgr7nzHuKNv4AwXoMZiHEEFXDYvQCBELs+o+jZv5hBxNM5RdqAvW7AJwGJ1Bxv9zd1+Cvc4HsBEHXsgOcYOAqoM6uDuASZprlNmiJAq5PRU48dhv9Iw7i2jJU2GSc2VLICvMF787N+ksVYZ+UNb5zKWYXxoORNQEAzTCGDfG5jePgtv/8pYR6CJRjw5YC5XbwlgIA5TxUbT89Zh8GTjFxneDG73WLISgbAwB92DmMsCb0LljUBB3gh4Dlx8E3FxaZRm5jwzyq9HwdI5/mT8tn6C4GELYTe8f9x3uJmm2BAXDRckMerIWXLYO0Ad87AKnbtr0OXgxvH0OaQNRS1/rm5nrX4Flp6TCkTQn08q+oWr/JLD/VhFqw/kn5M3gDtTLVxS6gPGHvq6uu9V1d9a4hERH9jMpwE2v9+uvlN8dFdG2Ya6jLvKr12JOud9AcDrrFOwfEaFFDXn3nAopMRiFecIhRWkPavWQv8vkzgrjXIUZpDTFXsQ31998oxG0OwdNoA3gV9MquMitthH+Ia5l37Hh2gNY/0co1G1pZycqEGSnNJWnASW1htvagc8xaaau8B0qmWdYnX+zjlqMZDio00mid8toirnwfpxxNucdV3PVd0bJCfdxQ46B/HHNMv2PhXZ9bhuev2BnlIXtihUx4W4SpXpFMiaQy/Sn0+aXfdY13x0NNfe75hpjsvGtfZrshEUTci5Ab2ZbW1jrctZcZcTLUizwiYyNbInMjb/vF+mV+FzFj/Bc0uxkOurUWGvRRB6MKDBH8fJSvRrMP4iCwZWKwsW3pN3r59i0fAjsmfLfn6VMaOO58q/6r/k3Uveg3+oFv7YckovLqEZtDXBO/k6NnPDVMFJg4VEuP85a41aATiXmJVHSVNV/tvcWircXs1P/IXnTX14a10FrwtQnTgdr7K6xmPgXDx1ASVOQsHp+oyqAY8Y0oGQ7ci04xvZaakdLnu6nPfH58QnTYZ6H0XZKRo7mGAWQ8JdUBeMUes+HkkmQmcvNI16tZERpwgZdTLoljM5+w+ufrOZgEDtxloHDtEnxe4sTD+rvN88dQv36hWjzmEKOFyWX0oOXogbg8OqEk9U+r+0nKidEDB3Nu1DLBUvC2Amt21mFXPPGqCfdfXG+PKgAMuMCrvSde4dlfp/Tt1ni6q/GL6SLKTzNtCEaydAvBy5vQ4haHKBC8C7D+3vyiMGHERHolIx3AvNnMbuN2gOwHGzdSf04GdqCAXKsdiGWceofLT8n537+Wm7fFrJpLqTTd2o7RUWA6NdLaPXMM/TvkMnGg1nJzZt1LDnk+NbPvfCg+fO7j0wqHtacGy80+xqxsuCzDyGmqDj9lTcJKu3zb043V1IHa+EOJmxxmJ/euFUiIl5ViZesD+QjVG/hMnqjgkGaTn5ExzayIZu6Ch4k4G9JPPEdIR85Yzj0dI4RQJgXsULtOWihN1VJ/h/yBTPeb9L3IWUA0q0O++Svf+r8NWBQpM+ff4d2WGRfG+/qV0ssCQoOy/EP4tzScWZiyp7Y68gfTj6YzOKvkyixGFD2ajglm8OYtSJl9jAN4Tu4W+NiLFb4VvNbWqc7VI2s7O7dp5Zcuyb7P68865HYoCzvbmHUMuMNRXQPiiyQt456z1bnN742N328+Z+V8j0HSXhQPdJm7E19kEZiH6fRDLELWC6L7z1W/1UzM53xaivE1evz5wWsggi0jWhFTaPlf1Ez17ykjWTjIrhs8H0+/RjnJ4Ay6E15krXtOcB/k2GYB608TWRPxNtu3KxSVXpeRtNMi2bFu0sXqu0Q5Tmncfm2yg3wKC0HYU+SOyWsdxkqcgpSDN4YYYYiKrMIeZ/8mkCfQr9093qAnyITf7OPYY6awk64bvOMkzZJevYpeAsJdg0G9qfqAf2SqsqLR2qBFtJ2bNu+UFs2ZW1Qf3tm6f5BXvSAz/DF79Tef7gVm3N6z7gdGCs+a8wzLox0DbicogjVu8UplqEbssYVZ0+vVwu9fg3c6fRkPDDcK+vEl6vh4EO8ZkrklVC47ExJxWF24G8bccth01rHv24Tr6yJ9oOOvqbxYGn/afS95qKdnSJqycFHy3qxhdyH2px1sbzkwJCxalB7mcTUDbAkxcdXQiENdCUtu3TfIn1+jDoteb/RKoc+8+VjLMM4ydSCm8Rq6NzfzaLKtLoVn3Ll13QFNfJrM6WvwwnuqvTybKYhhy9c96Z6/Ke7YgBLbOnr6vWWEuarK5nmsGSuQvpOQcpgTfcOfXGaZpLcmkxOMZMnipCnHUlR8/rnS6dr9lX2U8Nao+iX1MSyjBI0OG2GwV7N+pVvN69Z2czFOazaK2/elf5NHVbqUlhTBskFbMBgt/CTgwnfjVd73TrUOFqpVs7cVPxSLGu7cez29DzplmWGTYyQwoMLsOflY0+qEazc8CwsLCm9qJ3s2eQGv8gchkccTSsFdFIeDMvHuAcEXPRFm2+zw/fu79yrVyHpQxvnthy6rvwcP44mG9eO7/nOXW+kW7eHHohVvLfYzAxeLAFjfq+mHrX8YHaQ1cRrAjLk5B8QTIhQ9oZM6fQVS6Gj8/oEc774lN8C12Ja9fMYoFFRD1lC1oJBh/5fJR+HH6d9u00DEmU03+aD/pDftMMG6i6Cj4x9Hz73JwbhVfuzwdPRs2K1iXeTfz/fOrOxygzz+MQMSzUwOPH906JbZc2wInp/dFBaOrsCpI8d9x3tjuApYGsqLWTR7wbZpisX96cdvSVaPKqMGYqDYeSXvcWNUlMCxMYBSIRc/TqUmkVVHj65CNLMA6ykz2JIRkxmdRg+vHUD0kxjrAbFu5vxmXZ2xcvwJXn8s9Z15fpCTcq3MLNw7LTRt5dsi14xlVS+zLSMeOKpPNK8wWl1RHt9t62Y0/zwozUUSn1SMwgmmgCQWIrQAX2JZ9sIT8n/QJIFCEknof07IFzxH9WGTipfPCdLeIjx/OakAP8mEQWgd7u+zVmtgMs2cRkGzTFbsudXiliuV33EpEc++lFVhVc6rOUquYlSNdertsqHmWmw2kl21IoucBQ0StFBLC6xNMHGZnXSl/lVY0MKeYeulUhH19Wtq0bcLepJZeNEpHRVQbxcWjd6e2784JuIHow/AS3P3g9e34upzN9pwhMX9G4bv8H4a5XfxIjFBD8y2MPwC14sQ81fJeiHL++w+2gKuDjw2/U6LanfP307eHhxcWFgO7x0Pwkfa7AoLecq9eIHDdeHXeEing+K/AvYbxEOlakt5c/OkJy9ynpPndv1t+7sw9xbwmbZkfVh38SOrm/WvTc1T5k9MYlafWotZ+i4r14GA9nXjvTRcuZhm3qkRj5ObV89+qn4BH7tv8/YIm3EskY3n3J8CkYVMl96ndk/7XO2t+kZUr+UxiBnQ90Q4GGjX00/6LI8HW/y+jfOJnLqz2NKMnIYRObICx01Zu5yHXd1+MwpMaqOo0adDCexDWQXs5dcdpMZWAYndqXUQ/4ARABGdvfuD9vcuIvAGnRWVXLynUgolopsXe9sbFhO7FPJU4rnNCtc2sfmB+21IQaqHz2xBca6213eWpwCq2z0nVwB/D0rC8wZNu/w7LesETUwJ7AlAAkBoWpe/xf4w1Jl57Qe8SwYSDLiK56LYpesyWLfdj8ziN06DBVYt+CGThoSglqL6iBQHM6cxykpvtZRlcLzm+kYakTi9ZtrXov1RDyzMgSnpo/FHkgkqk9eMnIE6LnIW2KBsaAjeeEBggds0C6DTwEaBUwLHjfg0aUCodkffiYXjIpeDupNggpVEaiGDAcoHMv8iTpbNgiFCsRSJCJgrBbWeWMTJiVS5sa8aDgGNQv8iIIPzWwza9ZGQNh9qMXJBFKD8Aqyoku7DCIAhTxhOGKFxXMnADJBfeXO1BlPDmDsEQygEBeWXQ9GYhWBgIxsAFLlSDtykzYlXXtyCFpOeLTwIeH2qi6gs83nmP6uh8WBjQ3rA06/qiEpZ/tnqN4pAICBMtQWmpATip5hTeKdLTvgHG/fQ24LL37Zi3i4NLmvn/XBlBA3Im1nedu3maF/99t0Uf2rJ0g+8S7tYWHjh/Gud523ARVeHwRn7E9GB9Bj/hLTfgThtRs8kPCYde5r59CD9ZDiZT+Fb8S1ZiXuKT56ZeVY87lU+JUNJWx7Peo0/Gr0y+aXuyfpg/Ar9cbPfqkerGjxJVHKJ15jOkOZQpmvIa6qEOPPlTJxDpgFnBX8w3yMoaAUdLIZX/AHPAwqX3K7Yyukbfm95b50+3biru5xzIQU874//jQG4JxclYrvkcr+4CPPoQ+P5zfauOFMLEpCPW8PsjJIDMamx4mKb08MK+NTXYKM1jTsVgHpaah6G5yrAbIds6Kjpny2vVkum3NtTVjoFO8kl2kZ5HUMXK7MTat5trMog4LHM12v+e9F3duzmmq97GbYdK9P8zh43q2892fXudkpSfG2M79mMh9WqlZdPpF/PXgPt3w8xGAnu/8NsmT/cpqlXsZL/tAIJiZ7lIT5pnnnJXjl1/2/cyCxxl0vtFKwIDyhNYiMQQCtpdBwCpXNovHS/c3eglfl5bwT/IE80HNl/yYBzggfXc2nnwKECOEdEMkXUuJ1bGz5DppZiZ5qxn0RHg88hNtw5ybSzi5igDt8EKRPN1tGkLCuaF1BUC6E67zjd0OdSO+Y12ND3F3OW0XiWDpz7cscUdt/m5QX6/YBPeMcoJAr1Oly/yvFGSg0051kZ2NEOvRLuo63cvw+2c5AVbqHiY/eGOmsEFTnwDXhxJAuTsOR0uaZveTu4G+byGtg6KpVnr2XZnJeDjXfrzuyVQRVHtkC0CS68cuW9UARNwKJp8+wOCwSvPkthkFxh9eWy7yx8uM95ZFvnP7Y3CC0ez2YrpThIptPZB6Vvf4wG/gGtIp8NrHqJ8woWkHBuviHBke6rSBMGUkzQQXEOWYH/iWHRQ//ulGJz5OX/VjjlDZd7z5pH76Gy8CZv+1Yt9xCu+/oMs9d8MKtucJwpNzqhcrGPTD2IxKbuX6dY1ii773wWxlhspIl2CgDr0u6YXFGsdd6lQ3zatTmL0SV1Xw/1OARZg9AJub7e16zK/U4k6h771tHyo2W3lpFeC2PTOqJaHyE1OaBpQGUh3T5dgMvMjluSvGABldhcbSOR1jZE4soyW1ObZDKRrOGpOhsXVb8qyNNOv4RIiXaqCTmfvcp/r/7XIZQ52XdW/5TAc+tWO0ydoF0cUvokORj3B3X53/4W8rDC0twYtWfiPK1njDo3vyI/VxNT6FRR6KSOqcivyP+zRmvUm6eTz2us9MnjdJeXbqBGtSiXryKAhcsY1QK9oEVgoJfFd30IiA/40BFnGxW7Z84xjbAuqG7OHmcDo0XQIjAIDMx7jPC3t0zk1UwDOsgmPW+KFrprvGbJQor4oDi4iXlQtYkd2JQoQJoYicXju+ghF9Kz0m15xm2JxsrRcFgyT86aJ7d0IOZKaOjdMsOcf76gmhgvDmj20bLztx4go4xWZZx96xgxX/48e5ekWt4d8vZGktGqYExRfuHHc89eyJsYMsvAgPrV34D3xHBCRgdQuMyPTy/aA1PeP3kyZQWvnx+f7jJf2ZGYcUTzcRfjYrcmpK1NE9J9kT75SNpTylid0ShuzBiBmHiAXrRnEbp+UX7pKFy5Ym0RUoSsXANVjeaXTr692J13M6QbfF7viM21Iz0+AY//JuAabDQzR0SAExcZCmWlI6EPaAYbA030EQqNzhxfMR6TCUI/ujAMtgbGFSQ0K2N4A986wppvM6B2xXyEptGu6hXAr5gaBqPhMOswJpoZ1kULY6KZYdZhMBoOW0MNg3ccaYCD+LnEcH5z1Cka/B3DTc194D4A5w9qjpOyBh4ZgRfANYNrxpBCAKLnK35RJJRsQRI/vqEhgZ9kkxWk52Tg7Ri41/nmnrEd/uUV/h2xZL4nbeoQRWwpocwjK7EUU2j96UVLzWOH+mYVFfDL8fiyCmtR8eOxWUX94/704sSABNDuvSdGOhuoZetpVe8+IIs2baxFEji4WvhQ9W7I79rx/s1Lr5LsPsB5zc0vtoDVIZz3IWVnO8irZ/5qeWRzreWX7fuWazaPWt4PQwxLvTCktxSQ9T2tJ+/imE/txdrtdqzZHrt3rvl/5ITnrnYsM/N/mW3m61wTzqioLic9Ccxeo2xm8Ql7qZGlvwL4ltvx1NU1MVyN2CoEysiEQsks4+sgzq9d1X8R0QsOP2Tq7ZqlMKYOr93OR/pUvh0gFrXz1bsdSDq+ftfXvxQ5eAheAS8fcNUsQw4cQpYjK6i2rtjKqGa8KtGG4pF6mv7oNPsxxsMKCsvKVkFWcWoNf8FCXizA11Ho5Hoyz5KHqMRkwomENQH3NnPCBYnY/c6xbkka730j33z2K900XYmhHrUFuY3u7doNtDmei0MTNV3BbhvD54OakY2x3m5JzrHY/YJETnhVWaS12hpIdTYM3s9mHXmCrHCLzaqrg7evEsfFJ914eoeHV6lKz9UmhBLnii037liBjWeiNkSF3gkJzegu+LiuFSMPlUuDQ42wyhCpWhFc9pv5OCmmhGVLPjFBtjC3gBJpeJARS2YTIBbEBJ3TRUIOie87foKbrJhRGlGoroIIQ/xOJRRC++7jk2VFlbHKgDm3Ueo0IJnm4hpCTQHGpLM4lhTwQ2r8wXg5CxH639Js/CB2kMC1El7jgjGAjby41yk8Cx4lJ4ShUHCWc1phhOYIi7nbUyk8SqYcpnXL596BzJBLdxjYtJ63cCFvGfH9YDxcpoPiCY8iI8/mpRuiZj0aXI3WAJVVf6BaWjIXjSa0NKobQTykK4PjgSo8fCYrUZJddGl1BxwNFGbt0fTntbXRwLQaiDUNSllVG/pr3cTMbIZ8wSl+tijhAvkLjowP/qv0kaLcfovyH/zEZ8KpVSM9k4ZBKkhPWhspGm8t/h9lumfeMTAHKig4KA3FN9trDWdOx0hdF3D721vw6/Cqa7s4Aav8ZqRL6khN18gvwMOS0UF3s/5E++y5CpHQb+5uPgZmRPNbxDVuqyBo9GC+rzWgYz1Orf3mEvNRuSJkyzGjdCtYg5yzh3ecFziOidvvKMVt7PEE0phFQpSblqMVPmDducD66wIbzCw+e3re01rcCzrx26XEHYY3gjcNzra+EelIqf+t8uNr1mR5gWen9i6/kQwgzJ9XsveUZtXlbOyfEPgV3d7l4JqiqurbN5lMudtPGRbGw4t//SogmY3rw8IO1/53OOH1a4MRzdjwvx09mLzBFpAcruIe6NifjZ+96+npMgrWxmo2rKtIIyLL5hJIX7KXXdOcNX5r/urxX0vZoUAeAjRZcEKIZykExDrPaKFSBppA54RFecLjLlITqetxND+aI8xRtEgb8euhnD1L6SFeZl3uJF0hTLGmCFfm4LtSAH3sB6lL7Pq1Uk+w56FDKpMkGPQZdLfca+E+4TeZzxLBTZvHQ9ZVTmBtcORKsomNcWlqIu1WLgAtkeS7x3i3X359PrRkCZQH5YPzx4BBOB/O2yL01sx1K2iEeRlB/wuorxXOUQ0DAmvg+2QLn3/IHOPMbpoy/4i/gv/Q9tAMhSbkFXzWAZ2YH7+sLq4m4A9+Am8eP56/PsuTDEzqdtCRqcgMK6BUwKqsHBXM45fQZdZEEgrnPh0HvIez10NJMdw4EznKLNluPfsC25x9XkqVHkSZow7psMXEw+zDRMzex82izO2hmL/Uj4f6h3oz1loyKpEupfzlIVW8Olcb7kg8wjpCdCT4bveA/T7qIIf4VEKFYbQsnBKHliea5ESgrKM8JtnyQ8XSt46XnB+gWBdBuC6Ktyg3syDT2v1E18FUsyTu/0ZeRvj4C684KDn99T0aAvHecbjH3/MSuL930ulamCfkwWYSmgxN+6RiQTRjvhQrzA/joKBMNCagmJfAM2id4CxnGgwt613CUfCreuYLlF5CLOrGKaGt+KYJDYlRTDgUnIVG4VGQkQeSww213wUxYCPLd3heMMfxPYxKDsRd4HK3X9b0kDo8AeIn4g3vZHq8E+sBcrj/8VNIIIXPPcC0furObcAzy7T0wJvRgcIivD14VgIs/uIwYw5UCAPDNAwPDQGQ7g3y7pUtN1IgqOX9APz5aliNWXraF/6Yhdm9mFpwKCWD0u9UrVkn8Vg8vVCjhylMufvsYrLT/X/G+KlhFEvJGj1oCqHIHkVcxBtFQSSIGk3JUmh1K6jcXBSFoiapvdoyKbACwWAo0c0Ws9Genug5G9mpBBS+bYen4RPQBI0rdYfAwj84p2SMhkvW979II4aLo2ZnzrSd3lwgLWMo2ourDad9hZYq9vAQux2QYAVIiu/oSRrrQXUybNi71wAnGN8baRwK15xOhj49Ga5nEh3fTUo70vPI6AJiAYF1UC5zJ59dYb7oL4u/FpmvOFuQsuLIzPa5h+Z1W3zVgo/L/Xibq05yNS30X69tFu9/7o4hyV+2+/07DseJ2dhoPk93da/V2bIF2d2F7a6S1SORu+su7CSt1hSY47FUGpXNoGCqydUkQji4Hs9TPtPj6doKRL7ccw1fSxxMGSQS79XV3TOF/1W9hBFLuWWL0oy6doXlyoFmshnxA/uD0Xv2ezmWgQ82AddLNWRhGZhWah91diqbzqoqUPChEhR4T7+2JCwbkkkhIJMBmlRGo0ulosfOxhnmxEF5O4ztxQYwCsYasAGYVnvOYbKGso+HEoqZtoD8ARX8DMN7b8LiCTqqLudoHP7IQaMQ/OZnsgmHGReZFxmH0wxG+AwmDheBah3xbmXlXaKBAV1bdw1F6GAbdeBXzsiIyxSrATZo82ZpBNjNm7DSvKHXl9wreVOCfN5lSRX/gSDOZUqslTyQ5LtDZPfQSi7L893h9HKuXqCXV7Faoaw6RQUbL1A6FCgM7gXyFoVcq2hx14ubPaH/xgsYSq6WyRAWaFHNcNfncxVMprjMSvqUDG+JCIK8bjCctu4vmvXUsLD7zNF/tmjOtpmz8UyN3/ZhtN2PfWfDvrszI7vNXtJ7wxbLmiSxYbWyxnFab7FdwdWXuBXUv1bWvSq48gq3knp78eJXEmm+8VgZjOgOYUVc7KGoWd0YVsjxlB3LfxNO3k4OT5vkBQxiU1S75gV2NTl530K0Ud3zzJOe7bu3YO312jcWC072VvfvDuoTd/AXiG4rHW+qFwgcRCtSwAsRy/dIerbjwLZQR1uG2pxbvRS6XAAZAhuvCNIO72sV93ft2iv8xqCP2+mdy/7aNt4WgRqw9VxuE46YDywFdncGuj7GQ/YP2h7Y5p6zJ7C/h+WcfWAnr3SI0w50OtzBl5OI+FzgOXldj99CH8PrTXimkaZ004sMfLx4Jnr8GH0LXs8KPPKMFWlB2y626fGRrGdHAp/nY7fQt+AgaUKCFEowBSA95UkISE90MI021ciFSTKhmebesENIYHreQ+JFj7CC9bFHLWyU9e64MRxCGhkeR3Rj7MNTln5weIQ4R4Mfw12fdyJdx409S5bgDuGTyknnXR4eFl7urTuE+4lvzDzREz+GtyW7kW1xh3GebkQwdyH9XcJD3sOE9/yp/Cu8K/kPDBD9XW6+rH3He6e9LOzkd5t+mx7ZjbFTTO52MrtLUp9xsmHgTf9irPp/wEU9qqBYDivxjBZWGiP1uH0MxsJXxrcIq6pyFyuAl3iDOvIqWhMaF3IViY6IigE3IzRe7r3yXg9RjAa+MVCNwd8z6TK7NWTmPjTkEy+9bzYEhO869A6LLVJSLBY7nL/K5obSz/OVNVKcTW52dq4NTlqjnP+5JC+1hHwsR5IrzOPejFKro25y84S5kpxj5JJnNRazZlnU8OV7neFtK/77UmO5kBrHi6NOej0Opv1B9bD2oP4B3KnIY4l14gACF4GaeZdvLvggsKsWoI7+/Hm04bvuesKvKO5J99fUbjbCw4KpbQl/DN4+Iuvf8gfXjqt4uSHia+cmofHG2+0Wbry4o/UdaZCGd1kQRzHfXebQPUamkyeJDHMwuwkZAEs+6dHQsbmLCnlWhOT38Cy7mHBbGVRFFEGP9yd7BXcGtKg8y8cadkSaRPNx483WVfWJZVxBlmGvvBfOzl+X5PxvsGsiCHb7N9kpfxDO6TngHDGn3Nq2I29DdkANnBu4KafDllo2yynigFzwZKHX/bA/vtQ4qizjtHsOwEk5LbEWJINvL0ljeX8O4cQDe2K1z725lp+2khWlB7NVjlGU5w3FiEbf2RUo0s0pShXMLs6wlD6XLIlCtjx/vgUROQDeUe7NTQP3ck9PGMAoGgwBKAow7USHaDCvjPVbxtgEoHlKM0yj9yEQbVrhoWm4wxiAYF6GdwxHBOFpcQ8z3RkTHYjXoACcADrNt/QQlgpSVE/a3R5DE6CIEB7ChT+MAA1ue2L+oUZMUnTBctNPX4OXFvTKDoQuTXj+yRRSpM1SsARKTF1nzEjgJ4do+YM8j+6IzU0ZlNb61Weyh1lsR/Hp/eS2DUUsbNdns/GKm8WTT4bPDIWbx44sSUORydvI1GGUAqaJe0fchXaJAliP7jkM6I06T4ZQ0qPpjEcALVZ+IApAUDrv7EkYYpxcQpTAMMR7AYdE7wNTTINbjGC60wSd7LN5TNlPmFccZjDWH8/ROUUuU4DMFQTfDKB0Eufe6F8mp2aZxtljPRjzzpPwDTADRhlhdLtQ4rqmci+Yfj3SpwbFdpQ7r8arKh9JPX+o3eMJ3gQ0kuPogaqJ9BlvxsI5MFoqhjFtsgoaHe5g+zfTPWGUKsuUKlse4j7U4ugOZeSWZnAAbatzHR03lhhifXH8yTjlKoUMSNeuXiMBlOFadNZ8DAUMr6PZK4YNZpLTy6yGKqQXLSb8SaeM65ZbnlY6LZlkhgxRgW/73/lxLK0KnqLXzq7A676LalZwJvWRJj5e84iaGTxL5XLfqyA8PD+/t/pTvY9Qav21fex7lQ8kwx9alIQsReZO/s5MZRZB2TLINNtqzjerNJcQtppJ4izZl5wS020S4TIhAQU2nj8Zf2KfkR+IE/ueD7h1b1bgjUVR207vJu5yC3FKuiz3qee5AE+XPDxIzwd4BHoJ3/gG60Yf7VZie5E52JCRR605weE/P7U1DnYcXOHlZLp8y8PwkLL+q7vi/+1FFRt7rn/YmpOQ+utdV8N4+4EVXkSz5XcW/q6NNsYtCihU2cfS55qU0isYZ2rlmdJZJiX0WFRsNbys7j+nL9LaKGP8wsDqGi/PKDEpYTxdg4oLuVBz/maIUxRy+3alWaE8PMPnT4Gy56Xw1wvq9JlK0yJ5WKbPGRvlSdx3eCeZrf7kFjRsNZzNUVspHeX7dW5KZFb3g5Dymi3mgu0PABv8Y1nParshfPI1wVZv+f/f24/m+gflBqwjJa2yGbt6Vjv51XLX2szdVl9y/AdGBvAuqZ1JHqfdziR7BGq3bLmQ55ZXlvzq0Ct83P+HXvvoel/1seT/bU/t+9/ntmxl7H25n8hpmcex+rDqC/45xuwjA5U/OB2nsvc0COPEsz+/Iib85NakFsouxreNB+Um/Ku1PFqw46ZlRDaj8N3U8DY1kNe9RLrPnu1uETkgRoounWPm83V81AmToQhTO4pXkxevlDqL6ufIz+c7l3jN9+LlUtVUs+Jgr2BPbYhXCKeT3kCvE+JgvWvKjbFGQ1AhfZJut8mL6uVN86ZOpaO2Zra2prZ2Znb2vWuNpCPdHAHjK53xJ8Od08phoLgymIBwDVyMcAkHIcAynvFawpRRYvKXLsAdpt+4m+mH4lrwY4wb9BJjSyb2BRJE/S9n6cnVlGqyPpF2iDRjPGPyAhBz/7ixiXHQoA2rz64Xeh8jYqIRy5RmRrtlStfytTx2fpqM+JD90EiBeEBAdIYmJVo8rr/FpXJPao4TcVS8GdV0HHFmNCDZ9frIK6VrIi6vjqh5aD2ap67iFEqSCTi9tn1JiN7oYecJnC2e7EzG2+J6dk1yfFCYk8w0AqDIcQEAxUh+tGuTQ7n9kqHMZ+x1PIJPjl+3N+Qaa3vzZp2uZgGN7eSzWFu3uo1yWw/DF0H2dAIngZZNS+DGGyRAOY2Rj3/aqTL6YRFjmQw0Jj/M1eYuwHz+/GwdPZh2BVdQd7leiwd9G/DBJqGoclR+GwVT9TftaWDo+ZL8yNiYpE1prCpNPFrFVjHLjarNQocsebPpaZQEb9Z5S9OJz27HzKbW2LD2CNYrjT3XvuiS+rw3kiG0zyFvCwd0gsJ6kcAYVdBBwXb5BWXEOgdFXY91o/TOorX+3EKzSDThpzPyb25sCk0uKylJS1mcAea/wkESuoQmAaHxppAEJDXQPbOjqB8/UD1/5MfPowhgPFFHAOrojx9HUZox1NMnyBj606djqIJ7qgJkdNyBajwjsMpFEWLX3h5iq3TWZgYOgh8BR5GfP7Xw3YKWgom8oLQUiYUiOXuJxHtZ6pIcb3HaMk+Id1xheNzf3AVm7Ql4H9cD2z33eB8PcL5FrN5zrJD9W6of2XJuaIn0I0r/YHdlGwiws4/ZQ/90YkWpdFvCy6ez2s4uWoX6KCc3GrhfEKOj661Z7hnC9NT2jRpRpJAuo9Ms1ilzbZQwF2YfEcIC2EjtOlBOZhuJ1sSNZnSpbYP1hGxEJrSCjVgnTv2k5cY4fIYopcuq68nPFkHAi16H3epCk2JdVUQDUfW0bvrGBfWFSSmt7ilRZVARXbE0qctW9VbnncVVK1La5Ji7sU/H4Wqdt5bFCoODEcQzQv5fV+B1XXjTKHxuYRgrkt5h03hzrNQ1sBgM1RBc6sCNCkVuV6ju2YJGcBNlzSBf20CZpAIjCaeeqyqeqqoHV1EWRMYlDTvGOfS6pOZWLbisk2UcFzcVO47nQ2vLOdnHxIxjlP8bkduLjJVF2atsllmfJwof3wKyP310OisVM4TrUlydqiY+tu56+9DyVp3L8VcbaJNHdIUs2m/KN73648esFou6G1bcVB1pktHZcHoD4wRRF85znvBrHEez540cgehtaHRl1MXupe5b6pPqMbla9qb3trXdCeff2622hTtRaERiPtvFJH1+q7Q3jEO+9JbTIZ9z3CzK6C+GyunZPnVuEwnB/tawg+PZqUvKjKoc1TrbJ44iXb1w37azNyY3BQd6Af+yErlD/ZdBTbKBb4t2wpT9tbhAx86TvzzxvwbVZJQQI/33RvqLM86u5oX09tsYv1aGUGX7SOyrb0BV/7XqNivybNNffXX/1hHj/+38d9PyrosQiPPrG0H+LXAw9mLkH6bapZuYoNCxHkHsIFqxEN1g+tnOiLfgoLfDHXQWkw9DIbLsRlvLUktW1J6lkqigBI+Nf4fUGzVvFp7qVJAEFXb/BsGVWnyADCWU/bXDuGmvj/Eq2WT9ov2F+b8rGN9lp4Hk+pueWnexGNxzbdS1j6ikYu0R8kT/BPmI8Y6wU2W7toURZygcpRLWsyXGq+0aBjo6age8Go0l7EpEHuzx5HEheYZMwdYUxkQtTRGmNA2IBo0l436sUTbL+s9B9sD6nBZ/vBbv35yzvjS9frKxLiXG8OfflGUMuVIoz1iUjGXkf/ZGLU1OmBLXdnQIa+eQZ0hS0gx541KtL60sqnR9TnPXFCYozPCxb20nuSz2qNTV+WM4q9+hj+WSxRqzH2OFs8fmhLP4JGtUQrEYmxmrzf4gvyIsk1NN2fB2DmJnmMyArGHibC9ZY0361P5h8gD56YH01nahaasg+FZsXCu+N9m0NyXlucp2JVcXcPokgfjTkafTxmp5pY4kAoZ+c68Lr3SFyvZbYlKfqcRkfmwcKgmAokVQU9u5SqdqKpSZV9wjsNsiO5UmgO1MKW6R2dpSls0WJwP8NVVXCC9fBhclcFxI5GUFWGFJ+Xp2lToiLExvNMPWq1Qx4Xr2Y2mL0B9exeYKuOg4UUCilhfLgkNQvoErzHltswd55isCfVHBIUiconjFwdr/ag9dORRkzhv8VzoXdOgHQR39QW4Fw82VUcG0sn7T8ccE3YxO/oPh6gZIMiMxSQ5jYrE6Ql15mzoHlTUi1GTHltXu8K/QgXu6n1zB9pASDgIo3RaR8legxIgIC3OMeATcMtW6K5bBIcdKrv/nNa9xgqRWmJefGFSLOET1uarC91efv/SzCLPzDIKjUEHePJhpz4mwqxAnqa4n/TgjZXJPn9ososPoMi6eEyvE7eRi8YM3jsO7P/x7GL0X+foecxDe8/G/Q8/pCP427TnxnQ6R04TRQxN0bnISz64iAkGlybhMuH6ISZxAAFLOQIwVGFBRJyeJ9z7hMew5NG+pMcLxprkhBKT/LSMWg725AI3GE0OcPu4mPExcSb2OQnl6mYVFvHx+9X1h1ZHXLdWo5wyEsIi68p9bz+EaL1PP8ZvuhsANJ95O2KJEunxmm/C7d5THTiobfrHAJyUSwSFusEI1Yu/vlLMm/c1GOFleTwtld94Jytu/3XYeW2cw4AGvUGMb66n5CWdXB0u0Ie684K+9MJvz96iEtAAF8xcgHOjUDuaF81JE+NqWg3yNhERCJA+BvswX7kIhZ2m0pzRXgqgvhrtoPWMWDAEEYe6nD9JP7+TEcnO5p2likYgr5vyHFqIyRRche7yNqSBeIHmsQSny6cbbRTASwlJOFXppV9DHUYfPWilc1ZRlVfjKjVhFsKR4gEa/SD8VgmGLcdZV0Wy1ycXJtV89hS9sypNvCYcFFafsrz1b/QW1OVYtxpzZFJg/VSi8A/UvQxsHB+NYKKVEV8HGhJzqflqhCbhwTDylyDYnpTQKivJMJyeTEkzaqM+Uir+9XqKEF6Uo7Ve/p2XlMG1EV7bQwz7YKqTQtBNXEV+cxoUtkk1ZaBYqMurpF4UyiMvswVUDMV+xG2sEx/lBp/4rKQxRWnl7LCzTYep45SI0I1bE0XOammTS8jQv7abNhuL0yxYwN604vgLX5NCuC5GWi7OrEXst7FS8xi98ctoqkicuNmzexJd8f7v6XTBlC//TZy1KSoDKJ+eB7Kwyacldku3IR1A0WxQvW4DisItE2aWiawdiUSxTpn/MScwIDS4ve4pGSXXCiaGbaF90GZZGuOGS07UUxX95cEUNh0+wRWj8c718gBLRacJThIuiG0O2q+q/fMmIEBbW/fS36a56e0Qqc3jYIUASBGj6swPFTpdMHNIWockoyXiE1qHHhwPt5HDSNgh4GIe1kFTURJLl8DgNOIU3pQET6Pbmy56n4JmtKJaHjvMkccZLRjAqOO2QE0e5mtDo1mbWXlgQTBDnjthtJRxuNcoq8xRxhCMH11MU1kOv4xww8mHiF9d20k2nETLY88/jiIe+7bUEuH7pzVCv8NWVBAUm66yVXdW2hGVEzJU/s+CM1mBkcqQcKOzLUj3zDkNx2/4yRj7bhvBsMul2sIvtjB3ul8BO1I6zF00b24mkWG+xjmf8kFlxxkMgmMY4LvYILszKquPGRu5Hi9UX0bBQ4+cpVNNsHt7MwR1F5z1BeLSeX54vymQQDS1xUP/5VPHULtbGVQoh7sL4R6jke1LM6kBYGgFgIVbiK93ajNCBqkT8v7U4oRhiwYNXOJ841NU87ErkyGOu/xNOzlfEo4H/dyTynPmLDmM1jH2W4p3nxIHTHM4sPgIQmkgsworaRTShHedoI8KZni8K5x4ooDGhA+OcBs6SL2IbbvAPmENDEOjXdxpHBqNCISQ75ey9gECGt/+/bp0ameCY9+acKtkUHPfvpnlVhGVqquKFvd1GpzuKlWGkD0nKNBttaPJ7lgIVCnOPXSmvmBnTpiT5NIapUNVib9mOpagVo8TlZt++oJJ+kCXv6f2LomA8GebeHuI82Js0kEXaV90SccpBadPlAc0u2yiza0xasMi++dB5mprGjMv1z7W9xuRz48UVIevaQttzQx3xTXwCF8jBMW8JI3heUkWJPFbJPP/mcu/kucddPJ9jjAhykmHIMxUWi97erwj1SLHNneXJQ6RIcYJM5ZFK2ZfMZamlPnYZ9RFwfcXzEheKM8pDjcoeVWZxf6ilssuiWV6IgMuDrVfQQ9bGBRUYvzwunvtDzpC6rNy92yP2JE0KXffIedtZsGCWZ8hNGi9e6Q/N9wyGODKkCZ1ok1vARSO0Q3SElc+JiKSxgC2k7e5SYESrd9PMK/JRE7SuhQwlF84e5ckT40yVaAwj6s4+kfTUbppZRQGcjRoZZYg8o+3rdo7wGze0+6OhfUR12EkB025uzsgNd/HyGgThcJqvAx7aHas5EtikNOFL/o4uiwoMB4XADg4oQfIVxqBGkqSic+gMk0WxHfz/9e4YEmkVeh+pKZRmaj+rN2EBVojzKiqCvUyCgFpW/ybfA036U4W1qX8fbJODE2XbJM3Ka0Nool5zHkVDq3iLy+bqrnuZuH7CZHNQXGVely1J0/9LdNOK6oQ1EGeVp6flckyZAovHnLBgB5mu9MoT56SIcuXcWKmN/uw/cxyduDKmbc7xHdtGhiziJzPsk/gNNvWhdWxEhMJmPRPy+DklVn+fBmiIJ9y7V8w6zYz0tdOxyuJ+xGMJlH3Ncgx3Xj0Khk2ilagsVGMPLHCg0/ttY9/l2PR5xJGIov9e01Bg7nIbxfVY9+/AOyc7dzh11qbU4dxZqambij8B9N5KGUKboymKi/uH28BvOLWlmbGE+rpCOc8xwmiLy2ihIdJZL01c4aJuj1mRqHaJaY9+W9sYBb7PyZkh6arwuxbl1hVbeqpoleQref5aGzmr264zrXo8TMT/3jFPKEQQTVI+D8UVsoYYQh5Kk0Bn0+KUCEwwgYtnifj/tzdxhAgcm6jlITz104I5RikEn/raadY2d1SIRLAWuF/FRTOH6MK5jiYeghD4cDF6IVvEI9TrgXtEzARJVo0ZaI2SBjM5ce5CotP++Fvm0fkqRFwGU5ZgsYfpHB4iS4ARBjc2mMZuTHuTx0OY9zlGCo6NiQrmCxnwIJvGhRB+SFUCHMtgvZE3O4mZzHc8LCJk5XocigftMIK5MIqXpFWiNFzWPcV/SyvNb8X2Ura9d2fAMwaNaAeDEUXuUm2+/4EQQ7E0sBjFhNeRFIS45CcgGjr7jbj7fZSSe/PuAdls/QJOT5A02mO5emGtalzr9/2sd87piAK/rgTm05nLsVmekl1s7DxFXDxNwZTdocUv3vUr5eWCT1mJwFhwtDQt0tk0KM19TpK42vB373x47PnPFo7j5hO12KIRQ6Bh+ALroJdpltecVImly4tAWt1CC+D/ojnRPvSMXfASUeIZUVLVDr6dCDdGaBCGRkefOQNsUyl0CpHMM0+dKPQdAzIyfZBHyTJ6ImuCa86gmCGLMhbV8+SqPyiMnb/2x+I4Y9+rMYX2ccEx6lFpTHBcXQIu277afjjRrCfKMjGGv+D4ixwyg1JO5pGNDOmj1+gUbiJXTNBJTp/+CRLKSfBi6tLlE1wK4vQkPh6SWvd5n3yKi7fuDiCp4zTwH4LucDaFRj20HHivbwGFergPvwOx+pEFZ84sEI6xAGtUOM9cZ/ZF9DzS3y2emfl8B8wgGIcOqGebqHd8qNKMeUOTGmsm3AQtIgWA6CIzAOpjtpBHlTMO8ZU9vb4muUkyU9tFOyawrAyREe2owsWaGscSgygwdNMerk8/aevh7b7LDuzkOfTZe7iVy5YSmh6YrHPGsIdycHinIkQ5cLV6hramCqmrDIaEZLmUm01qR/RDm1AVAh/aEgD+rC+OO1wPnBFQ2a2Opkmyjl033kQ787vVhoqsjF7V56qMvll/tc7AyBzA0OU6mbyUlq9oI8Zs6MhqU2+3R5hLyBttopj5v416T0mUw1yAb6lk5yGSG4ZGrZtiTBJWRf1gV8BAnRjjsQn80MoNWWUxzsgKY3HQSD2tnHecn+uBAUGVXbaJDFV+oNJOGOkzvlJOuFXOucjXRXK3djhYzj7nJC8AiE7XHeCXLmUzol1gaio5MbQ/G4VrFwyvusopuzh2GThZX8t/OwK/hhX8HKrDB60Vop0hcpm8NnTLUQLxKX31H94RUjJCPj4kM0ctH0JhKMp/+GHS9XBZO6mGD7lxKXK10jTeoLZpsksbTNSmoZ31YsjxCZOylCfvVmachhkykIp0ZmYo5cuhztQFWRXaiZK5kI8NHT7ax1uEog14umnObNcjS5xUIQCYa7VuFTqT6v9NYRSIxe2TXcQnZ2o3x7IcwIBOBwD8I5KbEAyt9v+X/nh7hOD50crY3RHEZ4OZ2rutU90eJFbvc1sBQV9pOBkyr/0Yb/O7++365F9kJSqugpr5elMZOgy8ymTik9eUH/KrER3u68dvyBhE5Bl3eM4GjPBaoAwLSRJYZj1W0qpGXH4cl9oDm+BX6OE5Zs8IbYSHQ7BMriH8j485+rDaMy6NUYpVSdg625C0ONuIMiaM9x0824R18mxTypWzLR1Qdt9WskViEFtAiLQVnQ2C67Mb3i9MZfueMcO+92dznX+i4MmBs43XATOgtTt4PrPSgHrCJq+3nIyw1eSUTa//DV0MeiAjo3v6hcNIwjmUz8fHX5FxMOEzzk5Nk83tIG1+jTwwBMm7QW5optLzyu7lfLY7HZRG2oesNKCesMnrLb0yGWH7zqdM+P1/QxeDHhS3enDlXziM9JnnUD43SLzK3OhWQ6HH2amJKDZnxiBtnrlSBUNSkbyTN7qhmUrfwehezmQl21Qu3Wfaqx2Zte824+YLNoqAAgMOAiQo0L9NHQ4QHHhoIcSUS/22xPJk+BLQX8r5Yrlab3a2467de/bu23/g4KHDR44eO37i5KnTZ86eO3/h4qXLV64WiqVy5XukLPVG8+X/DXe6vf5gOBpPprP5Yrni7G++iwH/G3VRU2NoQCwOD3HjTqCFETp6hifGw91T6qp59/GwGp2m7D60rPTWp8U3s92xSgfvu3iCXdmc3LTIb5WhAMPa6V+th38Sp7etrU5G0xum2k2AvrR1cC1+pNsOy4SAk2WRRdJJ43nZgeIRlrD7MCU6Lf0CUNlo2aRw90Y5PDb5mG7DpaxTFCoRRh643QXQzZBmOWmhHIetUUF26Rqni4aqMqMhyUjVQ60xYU+tlPFitd3TYdPqOqaKAigDRh/x1Jy61q4ZjolA10xMZYmn8SQazU55kVFnQyn+ivP0qvmNXNoBnABpJp0OfAFEuGZAl7hEz+7pLuySYEd81P0ZJfSFCy0TSp0jk6B9vCHwwd2TT3ZQm1MkH09DQjbq1/ByWZ7uBtICcsVjWG4fSbPx0cF8xVdZ2VNgk6BXGTwfSKn2sJYJFVvzq5ufZN57JxVmhl1kFJerwRqvZHc7+EZ2jeZG1kCF2Vw0odUnKDPKhm+llzLSIOxOy1KDYyFmOROkSQhopve15TS1yL4L/L5bzYldHik1p2X0ZHihavYeOrO//jFk9e5x9NhXaMKFnxMX6d9YtqEdUSaMDPj2ehe7eRVA2BkH3CDg8Vyt6dMcX3ncCbvjpWT4YlOndHMwnQabjqzmq5XbHOLKHX38uNKhSmiQPS3rcZBrMYFsSK01n61Rk8MbtqoIAAAA') format('woff2'),
url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.woff?t=1575558014483') format('woff'),
url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.ttf?t=1575558014483') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.svg?t=1575558014483#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.iconshezhi:before {
content: "\e690";
}
.iconguanzhu:before {
content: "\e608";
}
.iconxiugai:before {
content: "\e675";
}
.iconxiaoxi:before {
content: "\e669";
}
.iconhome:before {
content: "\e60f";
}
.iconvip:before {
content: "\e620";
}
.iconguanzhu1:before {
content: "\e60c";
}
.iconhuxiangguanzhu:before {
content: "\e665";
}
.iconjifen:before {
content: "\e626";
}
.iconvip1:before {
content: "\e611";
}
.iconleft_bar_out:before {
content: "\e602";
}
.iconmima:before {
content: "\e61b";
}
.iconzhuye:before {
content: "\e6ce";
}
.iconshezhi1:before {
content: "\e60b";
}
.iconhuiyuan-copy:before {
content: "\e607";
}
.iconwallet:before {
content: "\e674";
}
.iconshenhe:before {
content: "\e612";
}
.icontuxing1:before {
content: "\e601";
}
.iconnaozhong:before {
content: "\e616";
}
.icontougaoqingqiu:before {
content: "\e63b";
}
.iconguanzhu2:before {
content: "\e64b";
}
.iconzijinzhanghu:before {
content: "\e613";
}
.iconyanjing:before {
content: "\e62e";
}
.iconguanzhu3:before {
content: "\e64c";
}
.iconjifen1:before {
content: "\e61a";
}
.iconmima1:before {
content: "\e642";
}
.icondaishenhe:before {
content: "\e625";
}
.iconzijin:before {
content: "\e676";
}
.iconrenzheng:before {
content: "\e623";
}
.iconxxxxxx-:before {
content: "\e609";
}
.iconjifen2:before {
content: "\e795";
}
.iconshangcheng:before {
content: "\e90b";
}
.iconbianji:before {
content: "\e6b6";
}
.iconjifen3:before {
content: "\e661";
}
.iconchongzhi:before {
content: "\e82d";
}
.iconyifabu:before {
content: "\e603";
}
.iconbianji1:before {
content: "\e604";
}
.iconzhengque:before {
content: "\e655";
}
.icondianzan11:before {
content: "\e600";
}
.icontougao:before {
content: "\e629";
}
.iconcuowu:before {
content: "\e637";
}
.iconshoucang2:before {
content: "\e605";
}
.iconmima2:before {
content: "\e610";
}
.icontougao-morenx:before {
content: "\e63a";
}
.iconjifen4:before {
content: "\e606";
}
.iconhuxiangguanzhu1:before {
content: "\e686";
}
.icondianzan:before {
content: "\e60a";
}
.iconxiugai1:before {
content: "\e62a";
}
.iconzijin1:before {
content: "\e650";
}
.icongouwuchekong:before {
content: "\e60d";
}
.iconlipin:before {
content: "\e60e";
}
.iconshoucang:before {
content: "\e614";
}
.iconicon-:before {
content: "\e615";
}
.iconhuxiangguanzhu2:before {
content: "\e68a";
}
.iconyanjing1:before {
content: "\e7e2";
}
.iconzhengque1:before {
content: "\e6b3";
}
.iconrizhi:before {
content: "\e627";
}
.iconshoucang1:before {
content: "\e617";
}
.iconyituihui:before {
content: "\e624";
}
.iconshangyibu:before {
content: "\e786";
}
.iconhuiyuan:before {
content: "\e618";
}
.iconziliao1:before {
content: "\e736";
}
.iconxiaoxi1:before {
content: "\e62b";
}
.iconshanchu:before {
content: "\e619";
}
.iconhuxiangguanzhu3:before {
content: "\e64d";
}
.iconxinxi:before {
content: "\e628";
}
.icongouwuche1:before {
content: "\e61c";
}
.iconnaozhong1:before {
content: "\e68e";
}
.icontuichu:before {
content: "\e74d";
}
.iconziliao2:before {
content: "\e664";
}
.iconshanchu-copy-copy:before {
content: "\e61d";
}
.iconyanjing-guan:before {
content: "\e6d7";
}
.iconxiaoxi2:before {
content: "\e670";
}
.iconxiaoxi3:before {
content: "\e67a";
}
.iconmima3:before {
content: "\e62c";
}
.icontuichu1:before {
content: "\e636";
}
.icondingdanguanli-:before {
content: "\e61e";
}
.iconyiwancheng:before {
content: "\e61f";
}
.icontuichu2:before {
content: "\e621";
}
.iconziliao3:before {
content: "\e622";
}
.iconwuneirong:before {
content: "\e62d";
}
.iconweidenglu:before {
content: "\e648";
}
.iconweidenglu1:before {
content: "\e62f";
}
.iconcollect:before {
content: "\e630";
}
.iconbingliziliao:before {
content: "\e631";
}
.icongouwucheman:before {
content: "\e632";
}
.iconfensi:before {
content: "\e633";
}
.iconchaoshi:before {
content: "\e634";
}
.icontuichu3:before {
content: "\e635";
}
.iconzu:before {
content: "\e638";
}
.icondenglu:before {
content: "\e639";
}
.iconkaifazheshequicon-:before {
content: "\e673";
}
.iconmima4:before {
content: "\e63c";
}
.icondingdan:before {
content: "\e63e";
}
.icondaishenhe2:before {
content: "\e63d";
}
.iconwuneirong1:before {
content: "\e667";
}
.iconziliao4:before {
content: "\e657";
}
.iconshangcheng1:before {
content: "\e63f";
}
.iconfensi1:before {
content: "\e640";
}
.icontougaoshibai:before {
content: "\e653";
}
.icontougaochenggong:before {
content: "\e65c";
}
.iconhuiyuan-:before {
content: "\e65d";
}
.iconshezhi2:before {
content: "\e641";
}
.icondaishenhe1:before {
content: "\e643";
}
.iconwodetougao:before {
content: "\e644";
}
.iconyanjing2:before {
content: "\eb76";
}
.iconyishanchukehu:before {
content: "\e649";
}
.iconzhenggaotougao:before {
content: "\e645";
}
.iconyituihui1:before {
content: "\e78a";
}
.iconyifabu1:before {
content: "\e646";
}
.icondaibandengdaishenhe:before {
content: "\e647";
}
.iconbianji2:before {
content: "\e64a";
}
================================================
FILE: static/common/user/css/reset.css
================================================
/* reset.css */
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul,li{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}
a{text-decoration: none;}
/* reset.css */
================================================
FILE: static/common/user/css/user.css
================================================
/*
* @Author: shu binqi
* @Date: 2019-12-04 22:22:03
* @Last Modified by: shu binqi
* @Last Modified time: 2019-12-07 18:30:09
*/
/* 主题色 #007bff */
/* ---------- 会员公用样式 ---------- */
body {
background: #f1f1f1;
}
* {
box-sizing: border-box;
font-family: "\5FAE\8F6F\96C5\9ED1", Arial, Helvetica, sans-serif !important;
}
.container {
max-width: 1200px;
margin: 0 auto;
}
.hidden-md {
display: none;
}
.hidden-sm {
display: block;
}
img {
display: block;
max-width: 100%;
}
.fl {
float: left;
}
.fr {
float: right;
}
h4.head-title {
color: #242424;
font-size: 16px;
font-weight: 700;
text-align: center;
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid #f1f1f1;
}
.clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
.clearfix { zoom: 1; }
/* ---------- 会员公用样式 ---------- */
/* ---------- 会员公共头部 ---------- */
header {
height: 55px;
background: #fff;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
margin-bottom: 20px;
}
header .brand {
height: 55px;
float: left;
}
header .brand a.logo {
line-height: 55px;
display: block;
color: #242424;
font-size: 14px;
}
header .brand a.logo:hover {
color: #007bff;
}
header .user-center {
float: right;
}
/* ----- 未登录状态导航 ----- */
header .unlogin li {
float: left;
height: 55px;
position: relative;
}
header .unlogin li:first-child:after {
content: "";
width: 1px;
height: 15px;
position: absolute;
top: 20px;
right: -1px;
background: #ccc;
}
header .unlogin li a {
color: #242424;
font-size: 14px;
display: block;
line-height: 55px;
padding: 0 15px;
margin-left: 5px;
}
header .unlogin li a:hover {
color: #007bff;
}
/* ----- 未登录状态导航 ----- */
/* ----- 登录状态导航 ----- */
header .user-login > li {
float: left;
height: 55px;
position: relative;
margin-left: 10px;
}
header .user-login > li > a {
color: #242424;
display: block;
width: 55px;
line-height: 35px;
height: 55px;
padding: 10px 0;
position: relative;
text-align: center;
}
header .user-login li i {
font-size: 28px;
}
header .user-login li span {
font-size: 12px;
color: #fff;
height: 20px;
line-height: 20px;
border-radius: 10px;
padding: 0 6px;
background: #f4523b;
position: absolute;
right: 8px;
top: 10px;
}
header .user-login > li:hover > a {
background: #242424;
color: #007bff;
}
header .user-login li img {
height: 100%;
margin: 0 auto;
}
header .user-login .user-icon:hover .user-menu {
display: block;
}
header .user-login li .user-menu {
display: none;
position: absolute;
top: 55px;
right: 0;
background: #fff;
width: 160px;
border-radius: 0 0 5px 5px;
overflow: hidden;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.15);
z-index: 99;
}
.user-menu li a {
color: #242424;
display: block;
width: 100%;
line-height: 35px;
padding: 5px 0;
position: relative;
text-align: center;
}
.user-menu li.bt1 {
border-top: 1px solid #e1e1e1;
}
.user-menu li:hover a {
background: #007bff;
color: #fff;
}
/* ----- 登录状态导航 ----- */
/* ---------- 会员公共头部 ----------*/
/* ---------- 会员公共内容 ----------*/
.page {
min-height: 660px;
}
/* ---------- 会员左侧内容 ---------- */
.user-left {
width: 220px;
margin-bottom: 20px;
float: left;
}
.user-left .user-card {
background: #fff;
border-radius: 5px;
overflow: hidden;
margin-bottom: 10px;
padding: 30px 0;
}
.user-left .user-card .img-box {
width: 100%;
margin-bottom: 15px;
}
.user-left .user-card .img-box img {
width: 80px;
margin: 0 auto;
}
.user-left .user-card .username-info {
text-align: center;
margin-bottom: 5px;
}
.user-left .user-card .username-info a {
color: #242424;
font-size: 18px;
line-height: 24px;
font-weight: 700;
}
.user-left .user-card .username-info a:hover {
color: #007bff;
}
.user-left .user-card .autograph-info {
text-align: center;
color: #808080;
font-size: 12px;
line-height: 18px;
margin-bottom: 20px;
}
.user-left .user-card .btn-area {
padding: 0 20px;
}
.user-left .user-card .btn-area .btn-default {
display: block;
height: 40px;
line-height: 38px;
text-align: center;
width: 100%;
font-size: 14px;
border-radius: 5px;
}
.user-left .user-card .btn-area .btn-release {
color: #fff;
background: #007bff;
border: 1px solid #007bff;
}
.user-left .user-card .btn-area .btn-sign-out {
color: #666;
border: 1px solid #ccc;
}
.user-left .user-card .btn-area .btn-release:hover {
background: #005bbd;
border: 1px solid #005bbd;
}
.user-left .user-card .btn-area .btn-sign-out:hover {
color: #333;
border: 1px solid #333;
}
.user-left .user-list {
background: #fff;
border-radius: 5px;
overflow: hidden;
padding: 10px 0;
}
.user-left .user-list li {
text-align: center;
margin-bottom: 1px;
}
.user-left .user-list li:hover a,
.user-left .user-list li.active a {
color: #fff;
background: #007bff;
}
.user-left .user-list li a {
display: block;
color: #242424;
font-size: 14px;
height: 45px;
line-height: 45px;
}
.user-list a.bt1 {
border-top: 1px solid #e1e1e1;
}
/* ---------- 会员左侧内容 ---------- */
/* ---------- 会员右侧内容 ---------- */
.user-right {
padding-left: 240px;
}
.user-right .user-tips {
height: auto;
background: #fff;
border-radius: 5px;
padding: 8px 15px;
margin-bottom: 10px;
}
.user-right .user-tips p {
line-height: 24px;
color: #808080;
font-size: 14px;
}
.user-content {
background: #fff;
border-radius: 5px;
padding: 15px;
margin-bottom: 10px;
}
.user-data h2,
.user-content h2 {
color: #242424;
font-size: 20px;
line-height: 30px;
font-weight: 700;
padding: 0 10px 5px 15px;
border-bottom: 1px solid #e1e1e1;
margin-bottom: 20px;
position: relative;
}
.user-data h2:after,
.user-content h2:after {
content: "";
width: 2px;
height: 26px;
background: #007bff;
position: absolute;
left: 0;
top: 3px;
}
.user-content .login-tips p {
text-align: center;
}
.user-content .login-tips i {
color: #999;
font-size: 200px;
display: block;
line-height: 300px;
text-align: center;
}
.user-content .user-tab {
display: flex;
flex-wrap: wrap;
}
.user-content .user-tab .num {
width: 25%;
padding: 20px 0;
}
.user-tab .num a {
color: #242424;
}
.user-tab .num a:hover {
color: #007bff;
}
.user-tab .num h4 {
font-size: 20px;
line-height: 30px;
font-weight: 700;
text-align: center;
}
.user-tab .num p {
font-size: 14px;
line-height: 20px;
text-align: center;
}
/* ---------- 会员右侧内容 ---------- */
.user-data {
background: #fff;
border-radius: 5px;
padding: 20px 15px;
margin-bottom: 10px;
}
.user-data p {
border-bottom: 1px solid #f1f1f1;
margin-bottom: 10px;
padding-bottom: 10px;
display: flex;
}
.user-data p span {
line-height: 30px;
font-size: 14px;
}
.user-data p span:first-child {
min-width: 86px;
text-align: right;
}
/* ---------- 会员右侧内容 ---------- */
/* ---------- 会员公共底部 ---------- */
footer {
padding: 30px 0;
background: #fff;
}
.copyright {
line-height: 30px;
}
.copyright p {
font-size: 12px;
line-height: 30px;
text-align: center;
color: #2c2c2c;
}
.copyright p span {
margin: 0 5px;
}
.copyright p a {
color: #2c2c2c;
}
.copyright p a:hover {
color: #007bff;
}
/* ---------- 会员公共底部 ---------- */
/* ---------- 会员修改信息 ---------- */
.user-form .form-control {
min-height: 36px;
margin-bottom: 10px;
display: flex;
}
.user-form .form-control > span {
display: inline-block;
color: #242424;
font-size: 14px;
text-align: right;
line-height: 36px;
min-width: 100px;
}
.user-form .form-control label {
color: #242424;
font-size: 14px;
text-align: right;
line-height: 36px;
min-width: 100px;
padding-right: 10px;
}
.user-form .form-control > input,.user-form .form-control > select {
width: 300px;
color: #666;
font-size: 14px;
line-height: 36px;
padding: 0 10px;
border: 1px solid #e1e1e1;
border-radius: 2px;
}
.user-form .form-control > input[type='submit'] {
color: #666;
font-size: 14px;
line-height: 36px;
padding: 0 26px;
background: #e1e1e1;
border: 1px solid #e1e1e1;
border-radius: 2px;
cursor: pointer;
}
.user-form .form-control > input[type='submit']:hover {
color: #fff;
background: #007bff;
border: 1px solid #007bff;
}
.user-form .form-control > textarea {
width: 100%;
height: 120px;
line-height: 24px;
padding: 5px 10px;
border: 1px solid #e1e1e1;
border-radius: 2px;
resize: none;
}
.user-form .check-box {
line-height: 36px;
}
.user-form .check-box input[type='checkbox'],
.user-form .check-box input[type='radio'] {
transform: translateY(5px);
margin-right: 10px;
}
/* ----- 密码查看 ----- */
.form-password {
width: 300px;
position: relative;
}
.form-password input {
width: 300px;
color: #666;
font-size: 14px;
line-height: 36px;
padding: 0 10px;
border: 1px solid #e1e1e1;
}
.form-password i {
position: absolute;
color: #333;
width: 30px;
height: 36px;
line-height: 36px;
text-align: center;
right: 0;
top: 0;
cursor: pointer;
}
.form-password i.iconyanjing-guan {
display: none;
}
.form-password i.iconyanjing {
display: block;
}
/* ---------- 会员修改信息 表单 ---------- */
/* ----- input单选,多选,开关 ----- */
@supports (-webkit-appearance: none) or (-moz-appearance: none) {
input[type='checkbox'],
input[type='radio'] {
--active: #007bff;
--active-inner: #fff;
--input-border: #CDD9ED;
--input-border-hover: #23C4F8;
--background: #fff;
--disabled: #F5F9FF;
--disabled-inner: #E4ECFA;
--shadow-inner: rgba(18, 22, 33, .1);
height: 21px;
outline: none;
position: relative;
-webkit-appearance: none;
-moz-appearance: none;
margin: 0;
padding: 0;
box-shadow: none;
cursor: pointer;
height: 21px;
border: 1px solid var(--input-border);
background: var(--background);
transition: background .3s ease, border-color .3s ease;
}
input[type='checkbox']:after,
input[type='radio']:after {
content: '';
display: block;
left: 0;
top: 0;
position: absolute;
transition: opacity .2s ease, -webkit-transform .3s ease, -webkit-filter .3s ease;
transition: transform .3s ease, opacity .2s ease, filter .3s ease;
transition: transform .3s ease, opacity .2s ease, filter .3s ease, -webkit-transform .3s ease, -webkit-filter .3s ease;
}
input[type='checkbox']:checked,
input[type='radio']:checked {
background: var(--active);
border-color: var(--active);
}
input[type='checkbox']:checked:after,
input[type='radio']:checked:after {
-webkit-filter: drop-shadow(0 1px 2px var(--shadow-inner));
filter: drop-shadow(0 1px 2px var(--shadow-inner));
transition: opacity 0.3s ease, -webkit-filter 0.3s ease, -webkit-transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2);
transition: opacity 0.3s ease, filter 0.3s ease, transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2);
transition: opacity 0.3s ease, filter 0.3s ease, transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2), -webkit-filter 0.3s ease, -webkit-transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2);
}
input[type='checkbox']:disabled,
input[type='radio']:disabled {
cursor: not-allowed;
opacity: .9;
background: var(--disabled);
}
input[type='checkbox']:disabled:checked,
input[type='radio']:disabled:checked {
background: var(--disabled-inner);
border-color: var(--input-border);
}
input[type='checkbox']:hover:not(:checked):not(:disabled),
input[type='radio']:hover:not(:checked):not(:disabled) {
border-color: var(--input-border-hover);
}
input[type='checkbox']:not(.switch),
input[type='radio']:not(.switch) {
width: 21px;
}
input[type='checkbox']:not(.switch):after,
input[type='radio']:not(.switch):after {
opacity: 0;
}
input[type='checkbox']:not(.switch):checked:after,
input[type='radio']:not(.switch):checked:after {
opacity: 1;
}
input[type='checkbox']:not(.switch) {
border-radius: 6px;
}
input[type='checkbox']:not(.switch):after {
width: 5px;
height: 9px;
border: 2px solid var(--active-inner);
border-top: 0;
border-left: 0;
left: 6px;
top: 2px;
-webkit-transform: rotate(20deg);
transform: rotate(20deg);
}
input[type='checkbox']:not(.switch):checked:after {
-webkit-transform: rotate(43deg);
transform: rotate(43deg);
}
input[type='checkbox'].switch {
width: 38px;
border-radius: 11px;
}
input[type='checkbox'].switch:after {
left: 2px;
top: 2px;
border-radius: 50%;
width: 15px;
height: 15px;
background: var(--input-border);
}
input[type='checkbox'].switch:checked:after {
background: var(--active-inner);
-webkit-transform: translateX(17px);
transform: translateX(17px);
}
input[type='checkbox'].switch:disabled:not(:checked):after {
opacity: .6;
}
input[type='radio'] {
border-radius: 50%;
}
input[type='radio']:after {
width: 19px;
height: 19px;
border-radius: 50%;
background: var(--active-inner);
opacity: 0;
-webkit-transform: scale(0.7);
transform: scale(0.7);
}
input[type='radio']:checked:after {
background: var(--active-inner);
-webkit-transform: scale(0.5);
transform: scale(0.5);
}
}
/* ----- input单选,多选,开关 ----- */
/* ----- 列表页通用tab ----- */
.common-tab {
display: flex;
flex-wrap: wrap;
margin-bottom: 10px;
background: #fff;
border-radius: 5px;
padding: 0 15px;
}
.common-tab h2 {
width: 100%;
}
.common-tab h2 a {
display: inline-block;
color: #242424;
font-size: 16px;
font-weight: 700;
line-height: 46px;
height: 46px;
margin-right: 15px;
padding: 0 10px;
}
.common-tab h2 a.active {
color: #007bff;
border-bottom: 3px solid #007bff;
}
.common-tab h2 a.btn-info {
height: 36px;
line-height: 36px;
font-size: 14px;
color: #fff;
text-align: center;
background: #007bff;
font-weight: 400;
margin-right: 0;
padding: 0 20px;
border-radius: 3px;
}
.common-tab h2 a.btn-info:hover {
background: #005bbd;
}
.common-tab h2 .btn-release {
float: right;
margin-top: 5px;
}
/* ----- 列表页通用tab ----- */
/* ---------- 关注列表 ---------- */
.follow-list1 {
display: flex;
flex-wrap: wrap;
margin-bottom: 10px;
margin: 0 -5px;
}
.follow-list1 li {
width: 25%;
padding: 0 5px;
margin-bottom: 10px;
}
.follow-list1 li .follow-list-item {
background: #fff;
border-radius: 5px;
padding: 20px;
position: relative;
}
.follow-list-item .img-box {
margin-bottom: 15px;
}
/* ----- 互相关注 ----- */
.each-other {
color: #007bff;
font-size: 12px;
height: 24px;
line-height: 22px;
position: absolute;
right: 10px;
top: 10px;
padding: 0 8px;
border-radius: 20px;
border: 1px solid #007bff;
}
/* ----- 互相关注 ----- */
.follow-list-item img {
width: 80px;
margin: 0 auto;
border-radius: 50%;
overflow: hidden;
}
.follow-list-item h4 {
color: #242424;
font-size: 18px;
font-weight: 700;
line-height: 30px;
text-align: center;
}
.follow-list-item p {
color: #808080;
font-size: 12px;
line-height: 30px;
text-align: center;
margin-bottom: 10px;
}
.follow-list-item a {
display: block;
width: 100%;
height: 40px;
line-height: 38px;
text-align: center;
border: 1px solid #e1e1e1;
color: #666;
font-size: 14px;
border-radius: 5px;
}
.follow-list-item a:hover {
color: #fff;
background: #007bff;
border: 1px solid #007bff;
}
/* ---------- 关注列表 ---------- */
/* ---------- table表格列表 ---------- */
.release-table {
background: #fff;
border-radius: 5px;
padding: 15px;
}
table {
width: 100%;
margin-bottom: 10px;
white-space: nowrap;
}
/* ----- 表格滚动条 ----- */
.table-scroll {
width:100%;
overflow-x:auto;
overflow-y: hidden;
}
.table-scroll::-webkit-scrollbar {
width: 10px;
height: 6px;
}
.table-scroll::-webkit-scrollbar-thumb {
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: #535353;
}
.table-scroll::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: #e1e1e1;
}
/* ----- 表格滚动条 ----- */
tr {
border: 1px solid #f1f1f1;
}
tr td,
tr th {
padding: 12px 15px;
font-size: 14px;
text-align: center;
}
tr th {
font-weight: 700;
}
table span.btn-table {
display: inline-block;
font-size: 12px;
line-height: 22px;
height: 24px;
text-align: center;
padding: 0 6px;
border-radius: 2px;
}
table a.title {
color: #242424;
font-size: 14px;
font-weight: 700;
}
table a.title:hover {
color: #0069d9;
}
/* ----------- table表格列表 ---------- */
/* ----- 按钮集合 ----- */
a.btn-check {
display: inline-block;
font-size: 12px;
text-align: center;
padding: 6px 8px;
border-radius: 2px;
color: #fff;
background: #138496;
border: 1px solid #138496;
margin-right: 5px;
}
a.btn-add {
display: inline-block;
font-size: 12px;
text-align: center;
padding: 6px 8px;
border-radius: 2px;
color: #fff;
background: #0069d9;
border: 1px solid #0069d9;
margin-right: 5px;
}
a.btn-edit {
display: inline-block;
font-size: 12px;
text-align: center;
padding: 6px 8px;
border-radius: 2px;
color: #fff;
background: #218838;
border: 1px solid #218838;
margin-right: 5px;
}
a.btn-delete {
display: inline-block;
font-size: 12px;
text-align: center;
padding: 6px 8px;
border-radius: 2px;
color: #fff;
background: #c82333;
border: 1px solid #c82333;
}
.btn-light {
color: #212529;
background-color: #f8f9fa;
border: 1px solid #f8f9fa;
}
.btn-light:hover {
color: #212529;
background-color: #e2e6ea;
border: 1px solid #e2e6ea;
}
.btn-lg {
display: inline-block;
font-size: 12px;
line-height: 28px;
height: 30px;
text-align: center;
padding: 0 10px;
border-radius: 3px;
}
.btn-sm,
.btn-table {
display: inline-block;
font-size: 12px;
line-height: 22px;
height: 24px;
text-align: center;
padding: 0 6px;
border-radius: 2px;
}
.btn-success {
color: #218838;
border: 1px solid #218838;
transition: all .5s;
}
.btn-danger {
color: #c82333;
border: 1px solid #c82333;
transition: all .5s;
}
.btn-info {
color: #0069d9;
border: 1px solid #0069d9;
transition: all .5s;
}
.btn-warning {
color: #ffc107;
border: 1px solid #ffc107;
transition: all .5s;
}
.btn-primary {
color: #138496;
border: 1px solid #138496;
transition: all .5s;
}
/* ----- 按钮集合 ----- */
/* ----- 分页通用 ----- */
.pagebar-common {
background: #fff;
border-radius: 5px;
padding: 5px 10px;
margin-top: 10px;
}
.pagebar-common .pagination {
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.pagebar-common .pagination li {
margin: 0 4px;
}
.pagebar-common .pagination li a {
display: block;
font-size: 12px;
line-height: 30px;
padding: 0 8px;
color: #808080;
background: #f1f1f1;
border-radius: 3px;
}
.pagebar-common .pagination li:hover a,
.pagebar-common .pagination li.active a {
color: #fff;
background: #0069d9;
}
/* ----- 分页通用 ----- */
/* ----------- 交易记录 ---------- */
.shop-record-list {
background: #fff;
border-radius: 5px;
}
.release-table {
margin-bottom: 10px;
}
.shop-record-list li {
margin-bottom: 0;
}
.shop-record-list .record-item {
padding: 15px;
background: #fff;
border-radius: 5px;
transition: all .5s;
border-bottom: 1px solid #f1f1f1;
}
.shop-record-list .record-item:hover {
background: #f1f1f1;
}
.record-item p {
color: #242424;
font-size: 14px;
line-height: 30px;
margin-bottom: 5px;
}
.record-item p a {
color: #242424;
font-size: 14px;
line-height: 30px;
margin-bottom: 5px;
}
.record-item p a:hover {
color: #007bff;
}
.record-item p span {
margin-top: 3px;
}
.record-item h4 {
font-size: 18px;
font-weight: 700;
line-height: 30px;
}
.record-item h4 a.change,
.record-item h4 a.btn-more {
display: inline-block;
height: 30px;
line-height: 28px;
color: #fff;
font-size: 14px;
font-weight: 400;
border-radius: 3px;
padding: 0 12px;
transition: all .5s;
}
.record-item h4 a.change {
background: #c82333;
border: 1px solid #c82333;
margin-right: 5px;
}
.record-item h4 a.btn-more {
background: #007bff;
border: 1px solid #007bff;
}
.record-item h4 a.btn-more:hover {
background: #005bbd;
border: 1px solid #005bbd;
}
.record-item h4 a.change:hover {
background: #6d040f;
border: 1px solid #6d040f;
}
.text-info {
color: #007bff;
}
/* ----------- 交易记录 ---------- */
/* ----------- 订单详情 ---------- */
.order-details {
background: #fff;
border-radius: 5px;
padding: 15px;
margin-bottom: 10px;
}
.display-flex-order {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: flex-end;
}
.order-left {
flex: 1;
margin-right: 15px;
}
.order-list {
width: 100%;
}
.order-list li {
margin-bottom: 15px;
border-bottom: 1px solid #e1e1e1;
padding-bottom: 15px;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
}
.order-list li:last-child {
margin-bottom: 0;
border-bottom: 0;
padding-bottom: 0;
}
.order-item {
display: flex;
flex-wrap: wrap;
}
.order-item .img-box {
height: 120px;
max-width: 160px;
margin-right: 15px;
overflow: hidden;
}
.order-item .img-box img {
min-width: 100%;
height: 100%;
}
.order-item h4 {
font-size: 14px;
font-weight: 700;
line-height: 30px;
}
.order-item h4 a {
color: #242424;
}
.order-item h4 a:hover {
color: #007bff;
}
.order-item p {
color: #808080;
font-size: 12px;
line-height: 30px;
}
.order-item-right {
display: flex;
}
.order-number,
.order-money {
width: 150px;
}
.order-number p {
color: #666;
font-size: 12px;
line-height: 20px;
text-align: center;
}
.order-money p {
color: #666;
font-size: 12px;
line-height: 20px;
text-align: center;
}
.price {
color: #007bff;
font-weight: 700;
}
.order-right {
margin-top: 15px;
}
.order-right button {
display: block;
height: 36px;
line-height: 34px;
color: #fff;
font-size: 14px;
font-weight: 400;
background: #007bff;
border: 1px solid #007bff;
border-radius: 3px;
padding: 0 36px;
transition: all .5s;
margin-top: 10px;
margin: 10px auto 0 auto;
cursor: pointer;
}
.order-right .summary {
width: 250px;
background: #f7fbff;
padding: 15px;
}
.summary h3 {
color: #242424;
font-size: 14px;
font-weight: 700;
line-height: 30px;
text-align: center;
}
.summary h4 {
color: #808080;
font-size: 14px;
line-height: 28px;
}
.summary h4 span:last-child {
font-weight: 700;
}
/* ---------- 订单详情 ---------- */
.order-left .information {
width: 100%;
background: #f7fbff;
padding: 15px;
}
.information label{
display: block;
}
.information input {
width: 240px;
height: 40px;
line-height: 40px;
}
.information h3 {
color: #242424;
font-size: 14px;
font-weight: 700;
line-height: 30px;
text-align: center;
}
.information h4 {
color: #808080;
font-size: 14px;
line-height: 28px;
}
.information h4 span:last-child {
font-weight: 700;
}
.payment a{
display: inline-block;
width: 45%;
}
/* ---------- 我的钱包主页 ---------- */
.wallet {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
background: #fff;
border-radius: 5px;
padding: 15px;
margin-bottom: 10px;
}
.wallet-right {
padding-left: 15px;
border-left: 1px solid #f1f1f1;
}
.wallet-right h4 {
color: #242424;
font-size: 14px;
font-weight: 700;
line-height: 30px;
}
.wallet-right p {
color: #808080;
font-size: 12px;
line-height: 20px;
}
.wallet-right p span {
color: #242424;
display: inline-block;
font-weight: 700;
min-width: 20px;
}
.wallet-left {
flex: 1;
padding-right: 15px;
}
.wallet-rmb {
width: 100%;
padding: 18px 15px 15px;
color: #fff;
background-image: linear-gradient(to right,#4b85f0, #4650ef);
border-radius: 5px;
margin-bottom: 10px;
}
.wallet-rmb p,
.wallet-jifen p {
font-size: 12px;
}
.mb10 {
margin-bottom: 10px;
}
.wallet-rmb h4,
.wallet-jifen h4 {
font-size: 24px;
line-height: 36px;
margin-bottom: 10px;
}
.wallet-rmb h4 a,
.wallet-jifen h4 a {
color: #fff;
float: right;
font-size: 14px;
line-height: 36px;
}
.wallet-rmb h4 i,
.wallet-jifen h4 i {
font-size: 14px;
}
.wallet-jifen {
width: 100%;
padding: 18px 15px 15px;
color: #fff;
background-image: linear-gradient(to right,#fb7205, #eb3f33);
border-radius: 5px;
}
/* ---------- 我的钱包主页 ---------- */
/* ---------- 响应式调节 ---------- */
@media screen and (max-width:768px) {
.container {
width: 100%;
padding: 0 10px;
}
.hidden-sm {
display: none;
}
.hidden-md {
display: block;
}
.user-right {
padding-left: 0;
}
.user-form .form-control > span,
.user-form .form-control > label {
min-width: 80px;
}
.form-password input {
width: 100%;
}
.follow-list1 {
margin: 0 -5px;
}
.follow-list1 li {
width: 50%;
padding: 0 5px;
}
.order-right {
width: 100%;
}
.order-right .summary {
width: 100% !important;
}
.order-list .order-item .img-box {
height: 60px;
}
.order-item-right {
margin-top: 10px;
}
.wallet .wallet-left {
padding-right: 0;
}
.wallet .wallet-right {
width: 100%;
margin-top: 10px;
padding-left: 0;
border-left: 0;
}
}
.order-title {
width: 190px;
}
================================================
FILE: static/common/user/js/jquery.min-1.10.2.js
================================================
/*!
* jQuery JavaScript Library v3.5.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2020-04-10T15:07Z
*/
( function( global, factory ) {
"use strict";
if ( typeof module === "object" && typeof module.exports === "object" ) {
// For CommonJS and CommonJS-like environments where a proper `window`
// is present, execute the factory and get jQuery.
// For environments that do not have a `window` with a `document`
// (such as Node.js), expose a factory as module.exports.
// This accentuates the need for the creation of a real `window`.
// e.g. var jQuery = require("jquery")(window);
// See ticket #14549 for more info.
module.exports = global.document ?
factory( global, true ) :
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
};
} else {
factory( global );
}
// Pass this if window is not defined yet
} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
// enough that all such attempts are guarded in a try block.
"use strict";
var arr = [];
var getProto = Object.getPrototypeOf;
var slice = arr.slice;
var flat = arr.flat ? function( array ) {
return arr.flat.call( array );
} : function( array ) {
return arr.concat.apply( [], array );
};
var push = arr.push;
var indexOf = arr.indexOf;
var class2type = {};
var toString = class2type.toString;
var hasOwn = class2type.hasOwnProperty;
var fnToString = hasOwn.toString;
var ObjectFunctionString = fnToString.call( Object );
var support = {};
var isFunction = function isFunction( obj ) {
// Support: Chrome <=57, Firefox <=52
// In some browsers, typeof returns "function" for HTML elements
// (i.e., `typeof document.createElement( "object" ) === "function"`).
// We don't want to classify *any* DOM node as a function.
return typeof obj === "function" && typeof obj.nodeType !== "number";
};
var isWindow = function isWindow( obj ) {
return obj != null && obj === obj.window;
};
var document = window.document;
var preservedScriptAttributes = {
type: true,
src: true,
nonce: true,
noModule: true
};
function DOMEval( code, node, doc ) {
doc = doc || document;
var i, val,
script = doc.createElement( "script" );
script.text = code;
if ( node ) {
for ( i in preservedScriptAttributes ) {
// Support: Firefox 64+, Edge 18+
// Some browsers don't support the "nonce" property on scripts.
// On the other hand, just using `getAttribute` is not enough as
// the `nonce` attribute is reset to an empty string whenever it
// becomes browsing-context connected.
// See https://github.com/whatwg/html/issues/2369
// See https://html.spec.whatwg.org/#nonce-attributes
// The `node.getAttribute` check was added for the sake of
// `jQuery.globalEval` so that it can fake a nonce-containing node
// via an object.
val = node[ i ] || node.getAttribute && node.getAttribute( i );
if ( val ) {
script.setAttribute( i, val );
}
}
}
doc.head.appendChild( script ).parentNode.removeChild( script );
}
function toType( obj ) {
if ( obj == null ) {
return obj + "";
}
// Support: Android <=2.3 only (functionish RegExp)
return typeof obj === "object" || typeof obj === "function" ?
class2type[ toString.call( obj ) ] || "object" :
typeof obj;
}
/* global Symbol */
// Defining this global in .eslintrc.json would create a danger of using the global
// unguarded in another place, it seems safer to define global only for this module
var
version = "3.5.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
// Need init if jQuery is called (just allow error to be thrown if not included)
return new jQuery.fn.init( selector, context );
};
jQuery.fn = jQuery.prototype = {
// The current version of jQuery being used
jquery: version,
constructor: jQuery,
// The default length of a jQuery object is 0
length: 0,
toArray: function() {
return slice.call( this );
},
// Get the Nth element in the matched element set OR
// Get the whole matched element set as a clean array
get: function( num ) {
// Return all the elements in a clean array
if ( num == null ) {
return slice.call( this );
}
// Return just the one element from the set
return num < 0 ? this[ num + this.length ] : this[ num ];
},
// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function( elems ) {
// Build a new jQuery matched element set
var ret = jQuery.merge( this.constructor(), elems );
// Add the old object onto the stack (as a reference)
ret.prevObject = this;
// Return the newly-formed element set
return ret;
},
// Execute a callback for every element in the matched set.
each: function( callback ) {
return jQuery.each( this, callback );
},
map: function( callback ) {
return this.pushStack( jQuery.map( this, function( elem, i ) {
return callback.call( elem, i, elem );
} ) );
},
slice: function() {
return this.pushStack( slice.apply( this, arguments ) );
},
first: function() {
return this.eq( 0 );
},
last: function() {
return this.eq( -1 );
},
even: function() {
return this.pushStack( jQuery.grep( this, function( _elem, i ) {
return ( i + 1 ) % 2;
} ) );
},
odd: function() {
return this.pushStack( jQuery.grep( this, function( _elem, i ) {
return i % 2;
} ) );
},
eq: function( i ) {
var len = this.length,
j = +i + ( i < 0 ? len : 0 );
return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
},
end: function() {
return this.prevObject || this.constructor();
},
// For internal use only.
// Behaves like an Array's method, not like a jQuery method.
push: push,
sort: arr.sort,
splice: arr.splice
};
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[ 0 ] || {},
i = 1,
length = arguments.length,
deep = false;
// Handle a deep copy situation
if ( typeof target === "boolean" ) {
deep = target;
// Skip the boolean and the target
target = arguments[ i ] || {};
i++;
}
// Handle case when target is a string or something (possible in deep copy)
if ( typeof target !== "object" && !isFunction( target ) ) {
target = {};
}
// Extend jQuery itself if only one argument is passed
if ( i === length ) {
target = this;
i--;
}
for ( ; i < length; i++ ) {
// Only deal with non-null/undefined values
if ( ( options = arguments[ i ] ) != null ) {
// Extend the base object
for ( name in options ) {
copy = options[ name ];
// Prevent Object.prototype pollution
// Prevent never-ending loop
if ( name === "__proto__" || target === copy ) {
continue;
}
// Recurse if we're merging plain objects or arrays
if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
( copyIsArray = Array.isArray( copy ) ) ) ) {
src = target[ name ];
// Ensure proper type for the source value
if ( copyIsArray && !Array.isArray( src ) ) {
clone = [];
} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
clone = {};
} else {
clone = src;
}
copyIsArray = false;
// Never move original objects, clone them
target[ name ] = jQuery.extend( deep, clone, copy );
// Don't bring in undefined values
} else if ( copy !== undefined ) {
target[ name ] = copy;
}
}
}
}
// Return the modified object
return target;
};
jQuery.extend( {
// Unique for each copy of jQuery on the page
expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
// Assume jQuery is ready without the ready module
isReady: true,
error: function( msg ) {
throw new Error( msg );
},
noop: function() {},
isPlainObject: function( obj ) {
var proto, Ctor;
// Detect obvious negatives
// Use toString instead of jQuery.type to catch host objects
if ( !obj || toString.call( obj ) !== "[object Object]" ) {
return false;
}
proto = getProto( obj );
// Objects with no prototype (e.g., `Object.create( null )`) are plain
if ( !proto ) {
return true;
}
// Objects with prototype are plain iff they were constructed by a global Object function
Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
},
isEmptyObject: function( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
},
// Evaluates a script in a provided context; falls back to the global one
// if not specified.
globalEval: function( code, options, doc ) {
DOMEval( code, { nonce: options && options.nonce }, doc );
},
each: function( obj, callback ) {
var length, i = 0;
if ( isArrayLike( obj ) ) {
length = obj.length;
for ( ; i < length; i++ ) {
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
break;
}
}
} else {
for ( i in obj ) {
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
break;
}
}
}
return obj;
},
// results is for internal usage only
makeArray: function( arr, results ) {
var ret = results || [];
if ( arr != null ) {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
[ arr ] : arr
);
} else {
push.call( ret, arr );
}
}
return ret;
},
inArray: function( elem, arr, i ) {
return arr == null ? -1 : indexOf.call( arr, elem, i );
},
// Support: Android <=4.0 only, PhantomJS 1 only
// push.apply(_, arraylike) throws on ancient WebKit
merge: function( first, second ) {
var len = +second.length,
j = 0,
i = first.length;
for ( ; j < len; j++ ) {
first[ i++ ] = second[ j ];
}
first.length = i;
return first;
},
grep: function( elems, callback, invert ) {
var callbackInverse,
matches = [],
i = 0,
length = elems.length,
callbackExpect = !invert;
// Go through the array, only saving the items
// that pass the validator function
for ( ; i < length; i++ ) {
callbackInverse = !callback( elems[ i ], i );
if ( callbackInverse !== callbackExpect ) {
matches.push( elems[ i ] );
}
}
return matches;
},
// arg is for internal usage only
map: function( elems, callback, arg ) {
var length, value,
i = 0,
ret = [];
// Go through the array, translating each of the items to their new values
if ( isArrayLike( elems ) ) {
length = elems.length;
for ( ; i < length; i++ ) {
value = callback( elems[ i ], i, arg );
if ( value != null ) {
ret.push( value );
}
}
// Go through every key on the object,
} else {
for ( i in elems ) {
value = callback( elems[ i ], i, arg );
if ( value != null ) {
ret.push( value );
}
}
}
// Flatten any nested arrays
return flat( ret );
},
// A global GUID counter for objects
guid: 1,
// jQuery.support is not used in Core but other projects attach their
// properties to it so it needs to exist.
support: support
} );
if ( typeof Symbol === "function" ) {
jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
}
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
function( _i, name ) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
} );
function isArrayLike( obj ) {
// Support: real iOS 8.2 only (not reproducible in simulator)
// `in` check used to prevent JIT error (gh-2145)
// hasOwn isn't used here due to false negatives
// regarding Nodelist length in IE
var length = !!obj && "length" in obj && obj.length,
type = toType( obj );
if ( isFunction( obj ) || isWindow( obj ) ) {
return false;
}
return type === "array" || length === 0 ||
typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}
var Sizzle =
/*!
* Sizzle CSS Selector Engine v2.3.5
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2020-03-14
*/
( function( window ) {
var i,
support,
Expr,
getText,
isXML,
tokenize,
compile,
select,
outermostContext,
sortInput,
hasDuplicate,
// Local document vars
setDocument,
document,
docElem,
documentIsHTML,
rbuggyQSA,
rbuggyMatches,
matches,
contains,
// Instance-specific data
expando = "sizzle" + 1 * new Date(),
preferredDoc = window.document,
dirruns = 0,
done = 0,
classCache = createCache(),
tokenCache = createCache(),
compilerCache = createCache(),
nonnativeSelectorCache = createCache(),
sortOrder = function( a, b ) {
if ( a === b ) {
hasDuplicate = true;
}
return 0;
},
// Instance methods
hasOwn = ( {} ).hasOwnProperty,
arr = [],
pop = arr.pop,
pushNative = arr.push,
push = arr.push,
slice = arr.slice,
// Use a stripped-down indexOf as it's faster than native
// https://jsperf.com/thor-indexof-vs-for/5
indexOf = function( list, elem ) {
var i = 0,
len = list.length;
for ( ; i < len; i++ ) {
if ( list[ i ] === elem ) {
return i;
}
}
return -1;
},
booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
"ismap|loop|multiple|open|readonly|required|scoped",
// Regular expressions
// http://www.w3.org/TR/css3-selectors/#whitespace
whitespace = "[\\x20\\t\\r\\n\\f]",
// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
// Operator (capture 2)
"*([*^$|!~]?=)" + whitespace +
// "Attribute values must be CSS identifiers [capture 5]
// or strings [capture 3 or capture 4]"
"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
whitespace + "*\\]",
pseudos = ":(" + identifier + ")(?:\\((" +
// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
// 1. quoted (capture 3; capture 4 or capture 5)
"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
// 2. simple (capture 6)
"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
// 3. anything else (capture 2)
".*" +
")\\)|)",
// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
rwhitespace = new RegExp( whitespace + "+", "g" ),
rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
whitespace + "+$", "g" ),
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
"*" ),
rdescend = new RegExp( whitespace + "|>" ),
rpseudo = new RegExp( pseudos ),
ridentifier = new RegExp( "^" + identifier + "$" ),
matchExpr = {
"ID": new RegExp( "^#(" + identifier + ")" ),
"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
"TAG": new RegExp( "^(" + identifier + "|[*])" ),
"ATTR": new RegExp( "^" + attributes ),
"PSEUDO": new RegExp( "^" + pseudos ),
"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
// For use in libraries implementing .is()
// We use this for POS matching in `select`
"needsContext": new RegExp( "^" + whitespace +
"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
},
rhtml = /HTML$/i,
rinputs = /^(?:input|select|textarea|button)$/i,
rheader = /^h\d$/i,
rnative = /^[^{]+\{\s*\[native \w/,
// Easily-parseable/retrievable ID or TAG or CLASS selectors
rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
rsibling = /[+~]/,
// CSS escapes
// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
funescape = function( escape, nonHex ) {
var high = "0x" + escape.slice( 1 ) - 0x10000;
return nonHex ?
// Strip the backslash prefix from a non-hex escape sequence
nonHex :
// Replace a hexadecimal escape sequence with the encoded Unicode code point
// Support: IE <=11+
// For values outside the Basic Multilingual Plane (BMP), manually construct a
// surrogate pair
high < 0 ?
String.fromCharCode( high + 0x10000 ) :
String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
},
// CSS string/identifier serialization
// https://drafts.csswg.org/cssom/#common-serializing-idioms
rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
fcssescape = function( ch, asCodePoint ) {
if ( asCodePoint ) {
// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
if ( ch === "\0" ) {
return "\uFFFD";
}
// Control characters and (dependent upon position) numbers get escaped as code points
return ch.slice( 0, -1 ) + "\\" +
ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
}
// Other potentially-special ASCII characters get backslash-escaped
return "\\" + ch;
},
// Used for iframes
// See setDocument()
// Removing the function wrapper causes a "Permission Denied"
// error in IE
unloadHandler = function() {
setDocument();
},
inDisabledFieldset = addCombinator(
function( elem ) {
return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
},
{ dir: "parentNode", next: "legend" }
);
// Optimize for push.apply( _, NodeList )
try {
push.apply(
( arr = slice.call( preferredDoc.childNodes ) ),
preferredDoc.childNodes
);
// Support: Android<4.0
// Detect silently failing push.apply
// eslint-disable-next-line no-unused-expressions
arr[ preferredDoc.childNodes.length ].nodeType;
} catch ( e ) {
push = { apply: arr.length ?
// Leverage slice if possible
function( target, els ) {
pushNative.apply( target, slice.call( els ) );
} :
// Support: IE<9
// Otherwise append directly
function( target, els ) {
var j = target.length,
i = 0;
// Can't trust NodeList.length
while ( ( target[ j++ ] = els[ i++ ] ) ) {}
target.length = j - 1;
}
};
}
function Sizzle( selector, context, results, seed ) {
var m, i, elem, nid, match, groups, newSelector,
newContext = context && context.ownerDocument,
// nodeType defaults to 9, since context defaults to document
nodeType = context ? context.nodeType : 9;
results = results || [];
// Return early from calls with invalid selector or context
if ( typeof selector !== "string" || !selector ||
nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
return results;
}
// Try to shortcut find operations (as opposed to filters) in HTML documents
if ( !seed ) {
setDocument( context );
context = context || document;
if ( documentIsHTML ) {
// If the selector is sufficiently simple, try using a "get*By*" DOM method
// (excepting DocumentFragment context, where the methods don't exist)
if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
// ID selector
if ( ( m = match[ 1 ] ) ) {
// Document context
if ( nodeType === 9 ) {
if ( ( elem = context.getElementById( m ) ) ) {
// Support: IE, Opera, Webkit
// TODO: identify versions
// getElementById can match elements by name instead of ID
if ( elem.id === m ) {
results.push( elem );
return results;
}
} else {
return results;
}
// Element context
} else {
// Support: IE, Opera, Webkit
// TODO: identify versions
// getElementById can match elements by name instead of ID
if ( newContext && ( elem = newContext.getElementById( m ) ) &&
contains( context, elem ) &&
elem.id === m ) {
results.push( elem );
return results;
}
}
// Type selector
} else if ( match[ 2 ] ) {
push.apply( results, context.getElementsByTagName( selector ) );
return results;
// Class selector
} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
context.getElementsByClassName ) {
push.apply( results, context.getElementsByClassName( m ) );
return results;
}
}
// Take advantage of querySelectorAll
if ( support.qsa &&
!nonnativeSelectorCache[ selector + " " ] &&
( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
// Support: IE 8 only
// Exclude object elements
( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
newSelector = selector;
newContext = context;
// qSA considers elements outside a scoping root when evaluating child or
// descendant combinators, which is not what we want.
// In such cases, we work around the behavior by prefixing every selector in the
// list with an ID selector referencing the scope context.
// The technique has to be used as well when a leading combinator is used
// as such selectors are not recognized by querySelectorAll.
// Thanks to Andrew Dupont for this technique.
if ( nodeType === 1 &&
( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
// Expand context for sibling selectors
newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
context;
// We can use :scope instead of the ID hack if the browser
// supports it & if we're not changing the context.
if ( newContext !== context || !support.scope ) {
// Capture the context ID, setting it first if necessary
if ( ( nid = context.getAttribute( "id" ) ) ) {
nid = nid.replace( rcssescape, fcssescape );
} else {
context.setAttribute( "id", ( nid = expando ) );
}
}
// Prefix every selector in the list
groups = tokenize( selector );
i = groups.length;
while ( i-- ) {
groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
toSelector( groups[ i ] );
}
newSelector = groups.join( "," );
}
try {
push.apply( results,
newContext.querySelectorAll( newSelector )
);
return results;
} catch ( qsaError ) {
nonnativeSelectorCache( selector, true );
} finally {
if ( nid === expando ) {
context.removeAttribute( "id" );
}
}
}
}
}
// All others
return select( selector.replace( rtrim, "$1" ), context, results, seed );
}
/**
* Create key-value caches of limited size
* @returns {function(string, object)} Returns the Object data after storing it on itself with
* property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
* deleting the oldest entry
*/
function createCache() {
var keys = [];
function cache( key, value ) {
// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
if ( keys.push( key + " " ) > Expr.cacheLength ) {
// Only keep the most recent entries
delete cache[ keys.shift() ];
}
return ( cache[ key + " " ] = value );
}
return cache;
}
/**
* Mark a function for special use by Sizzle
* @param {Function} fn The function to mark
*/
function markFunction( fn ) {
fn[ expando ] = true;
return fn;
}
/**
* Support testing using an element
* @param {Function} fn Passed the created element and returns a boolean result
*/
function assert( fn ) {
var el = document.createElement( "fieldset" );
try {
return !!fn( el );
} catch ( e ) {
return false;
} finally {
// Remove from its parent by default
if ( el.parentNode ) {
el.parentNode.removeChild( el );
}
// release memory in IE
el = null;
}
}
/**
* Adds the same handler for all of the specified attrs
* @param {String} attrs Pipe-separated list of attributes
* @param {Function} handler The method that will be applied
*/
function addHandle( attrs, handler ) {
var arr = attrs.split( "|" ),
i = arr.length;
while ( i-- ) {
Expr.attrHandle[ arr[ i ] ] = handler;
}
}
/**
* Checks document order of two siblings
* @param {Element} a
* @param {Element} b
* @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
*/
function siblingCheck( a, b ) {
var cur = b && a,
diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
a.sourceIndex - b.sourceIndex;
// Use IE sourceIndex if available on both nodes
if ( diff ) {
return diff;
}
// Check if b follows a
if ( cur ) {
while ( ( cur = cur.nextSibling ) ) {
if ( cur === b ) {
return -1;
}
}
}
return a ? 1 : -1;
}
/**
* Returns a function to use in pseudos for input types
* @param {String} type
*/
function createInputPseudo( type ) {
return function( elem ) {
var name = elem.nodeName.toLowerCase();
return name === "input" && elem.type === type;
};
}
/**
* Returns a function to use in pseudos for buttons
* @param {String} type
*/
function createButtonPseudo( type ) {
return function( elem ) {
var name = elem.nodeName.toLowerCase();
return ( name === "input" || name === "button" ) && elem.type === type;
};
}
/**
* Returns a function to use in pseudos for :enabled/:disabled
* @param {Boolean} disabled true for :disabled; false for :enabled
*/
function createDisabledPseudo( disabled ) {
// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
return function( elem ) {
// Only certain elements can match :enabled or :disabled
// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
if ( "form" in elem ) {
// Check for inherited disabledness on relevant non-disabled elements:
// * listed form-associated elements in a disabled fieldset
// https://html.spec.whatwg.org/multipage/forms.html#category-listed
// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
// * option elements in a disabled optgroup
// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
// All such elements have a "form" property.
if ( elem.parentNode && elem.disabled === false ) {
// Option elements defer to a parent optgroup if present
if ( "label" in elem ) {
if ( "label" in elem.parentNode ) {
return elem.parentNode.disabled === disabled;
} else {
return elem.disabled === disabled;
}
}
// Support: IE 6 - 11
// Use the isDisabled shortcut property to check for disabled fieldset ancestors
return elem.isDisabled === disabled ||
// Where there is no isDisabled, check manually
/* jshint -W018 */
elem.isDisabled !== !disabled &&
inDisabledFieldset( elem ) === disabled;
}
return elem.disabled === disabled;
// Try to winnow out elements that can't be disabled before trusting the disabled property.
// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
// even exist on them, let alone have a boolean value.
} else if ( "label" in elem ) {
return elem.disabled === disabled;
}
// Remaining elements are neither :enabled nor :disabled
return false;
};
}
/**
* Returns a function to use in pseudos for positionals
* @param {Function} fn
*/
function createPositionalPseudo( fn ) {
return markFunction( function( argument ) {
argument = +argument;
return markFunction( function( seed, matches ) {
var j,
matchIndexes = fn( [], seed.length, argument ),
i = matchIndexes.length;
// Match elements found at the specified indexes
while ( i-- ) {
if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
seed[ j ] = !( matches[ j ] = seed[ j ] );
}
}
} );
} );
}
/**
* Checks a node for validity as a Sizzle context
* @param {Element|Object=} context
* @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
*/
function testContext( context ) {
return context && typeof context.getElementsByTagName !== "undefined" && context;
}
// Expose support vars for convenience
support = Sizzle.support = {};
/**
* Detects XML nodes
* @param {Element|Object} elem An element or a document
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
var namespace = elem.namespaceURI,
docElem = ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
// https://bugs.jquery.com/ticket/4833
return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
};
/**
* Sets document-related variables once based on the current document
* @param {Element|Object} [doc] An element or document object to use to set the document
* @returns {Object} Returns the current document
*/
setDocument = Sizzle.setDocument = function( node ) {
var hasCompare, subWindow,
doc = node ? node.ownerDocument || node : preferredDoc;
// Return early if doc is invalid or already selected
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
return document;
}
// Update global variables
document = doc;
docElem = document.documentElement;
documentIsHTML = !isXML( document );
// Support: IE 9 - 11+, Edge 12 - 18+
// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( preferredDoc != document &&
( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
// Support: IE 11, Edge
if ( subWindow.addEventListener ) {
subWindow.addEventListener( "unload", unloadHandler, false );
// Support: IE 9 - 10 only
} else if ( subWindow.attachEvent ) {
subWindow.attachEvent( "onunload", unloadHandler );
}
}
// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
// Safari 4 - 5 only, Opera <=11.6 - 12.x only
// IE/Edge & older browsers don't support the :scope pseudo-class.
// Support: Safari 6.0 only
// Safari 6.0 supports :scope but it's an alias of :root there.
support.scope = assert( function( el ) {
docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
return typeof el.querySelectorAll !== "undefined" &&
!el.querySelectorAll( ":scope fieldset div" ).length;
} );
/* Attributes
---------------------------------------------------------------------- */
// Support: IE<8
// Verify that getAttribute really returns attributes and not properties
// (excepting IE8 booleans)
support.attributes = assert( function( el ) {
el.className = "i";
return !el.getAttribute( "className" );
} );
/* getElement(s)By*
---------------------------------------------------------------------- */
// Check if getElementsByTagName("*") returns only elements
support.getElementsByTagName = assert( function( el ) {
el.appendChild( document.createComment( "" ) );
return !el.getElementsByTagName( "*" ).length;
} );
// Support: IE<9
support.getElementsByClassName = rnative.test( document.getElementsByClassName );
// Support: IE<10
// Check if getElementById returns elements by name
// The broken getElementById methods don't pick up programmatically-set names,
// so use a roundabout getElementsByName test
support.getById = assert( function( el ) {
docElem.appendChild( el ).id = expando;
return !document.getElementsByName || !document.getElementsByName( expando ).length;
} );
// ID filter and find
if ( support.getById ) {
Expr.filter[ "ID" ] = function( id ) {
var attrId = id.replace( runescape, funescape );
return function( elem ) {
return elem.getAttribute( "id" ) === attrId;
};
};
Expr.find[ "ID" ] = function( id, context ) {
if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
var elem = context.getElementById( id );
return elem ? [ elem ] : [];
}
};
} else {
Expr.filter[ "ID" ] = function( id ) {
var attrId = id.replace( runescape, funescape );
return function( elem ) {
var node = typeof elem.getAttributeNode !== "undefined" &&
elem.getAttributeNode( "id" );
return node && node.value === attrId;
};
};
// Support: IE 6 - 7 only
// getElementById is not reliable as a find shortcut
Expr.find[ "ID" ] = function( id, context ) {
if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
var node, i, elems,
elem = context.getElementById( id );
if ( elem ) {
// Verify the id attribute
node = elem.getAttributeNode( "id" );
if ( node && node.value === id ) {
return [ elem ];
}
// Fall back on getElementsByName
elems = context.getElementsByName( id );
i = 0;
while ( ( elem = elems[ i++ ] ) ) {
node = elem.getAttributeNode( "id" );
if ( node && node.value === id ) {
return [ elem ];
}
}
}
return [];
}
};
}
// Tag
Expr.find[ "TAG" ] = support.getElementsByTagName ?
function( tag, context ) {
if ( typeof context.getElementsByTagName !== "undefined" ) {
return context.getElementsByTagName( tag );
// DocumentFragment nodes don't have gEBTN
} else if ( support.qsa ) {
return context.querySelectorAll( tag );
}
} :
function( tag, context ) {
var elem,
tmp = [],
i = 0,
// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
results = context.getElementsByTagName( tag );
// Filter out possible comments
if ( tag === "*" ) {
while ( ( elem = results[ i++ ] ) ) {
if ( elem.nodeType === 1 ) {
tmp.push( elem );
}
}
return tmp;
}
return results;
};
// Class
Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
return context.getElementsByClassName( className );
}
};
/* QSA/matchesSelector
---------------------------------------------------------------------- */
// QSA and matchesSelector support
// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
rbuggyMatches = [];
// qSa(:focus) reports false when true (Chrome 21)
// We allow this because of a bug in IE8/9 that throws an error
// whenever `document.activeElement` is accessed on an iframe
// So, we allow :focus to pass through QSA all the time to avoid the IE error
// See https://bugs.jquery.com/ticket/13378
rbuggyQSA = [];
if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
// Build QSA regex
// Regex strategy adopted from Diego Perini
assert( function( el ) {
var input;
// Select is set to empty string on purpose
// This is to test IE's treatment of not explicitly
// setting a boolean content attribute,
// since its presence should be enough
// https://bugs.jquery.com/ticket/12359
docElem.appendChild( el ).innerHTML = " " +
"" +
" ";
// Support: IE8, Opera 11-12.16
// Nothing should be selected when empty strings follow ^= or $= or *=
// The test attribute must be unknown in Opera but "safe" for WinRT
// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
}
// Support: IE8
// Boolean attributes and "value" are not treated correctly
if ( !el.querySelectorAll( "[selected]" ).length ) {
rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
}
// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
rbuggyQSA.push( "~=" );
}
// Support: IE 11+, Edge 15 - 18+
// IE 11/Edge don't find elements on a `[name='']` query in some cases.
// Adding a temporary attribute to the document before the selection works
// around the issue.
// Interestingly, IE 10 & older don't seem to have the issue.
input = document.createElement( "input" );
input.setAttribute( "name", "" );
el.appendChild( input );
if ( !el.querySelectorAll( "[name='']" ).length ) {
rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
whitespace + "*(?:''|\"\")" );
}
// Webkit/Opera - :checked should return selected option elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
// IE8 throws error here and will not see later tests
if ( !el.querySelectorAll( ":checked" ).length ) {
rbuggyQSA.push( ":checked" );
}
// Support: Safari 8+, iOS 8+
// https://bugs.webkit.org/show_bug.cgi?id=136851
// In-page `selector#id sibling-combinator selector` fails
if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
rbuggyQSA.push( ".#.+[+~]" );
}
// Support: Firefox <=3.6 - 5 only
// Old Firefox doesn't throw on a badly-escaped identifier.
el.querySelectorAll( "\\\f" );
rbuggyQSA.push( "[\\r\\n\\f]" );
} );
assert( function( el ) {
el.innerHTML = " " +
" ";
// Support: Windows 8 Native Apps
// The type and name attributes are restricted during .innerHTML assignment
var input = document.createElement( "input" );
input.setAttribute( "type", "hidden" );
el.appendChild( input ).setAttribute( "name", "D" );
// Support: IE8
// Enforce case-sensitivity of name attribute
if ( el.querySelectorAll( "[name=d]" ).length ) {
rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
}
// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
// IE8 throws error here and will not see later tests
if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
rbuggyQSA.push( ":enabled", ":disabled" );
}
// Support: IE9-11+
// IE's :disabled selector does not pick up the children of disabled fieldsets
docElem.appendChild( el ).disabled = true;
if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
rbuggyQSA.push( ":enabled", ":disabled" );
}
// Support: Opera 10 - 11 only
// Opera 10-11 does not throw on post-comma invalid pseudos
el.querySelectorAll( "*,:x" );
rbuggyQSA.push( ",.*:" );
} );
}
if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
docElem.webkitMatchesSelector ||
docElem.mozMatchesSelector ||
docElem.oMatchesSelector ||
docElem.msMatchesSelector ) ) ) ) {
assert( function( el ) {
// Check to see if it's possible to do matchesSelector
// on a disconnected node (IE 9)
support.disconnectedMatch = matches.call( el, "*" );
// This should fail with an exception
// Gecko does not error, returns false instead
matches.call( el, "[s!='']:x" );
rbuggyMatches.push( "!=", pseudos );
} );
}
rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
/* Contains
---------------------------------------------------------------------- */
hasCompare = rnative.test( docElem.compareDocumentPosition );
// Element contains another
// Purposefully self-exclusive
// As in, an element does not contain itself
contains = hasCompare || rnative.test( docElem.contains ) ?
function( a, b ) {
var adown = a.nodeType === 9 ? a.documentElement : a,
bup = b && b.parentNode;
return a === bup || !!( bup && bup.nodeType === 1 && (
adown.contains ?
adown.contains( bup ) :
a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
) );
} :
function( a, b ) {
if ( b ) {
while ( ( b = b.parentNode ) ) {
if ( b === a ) {
return true;
}
}
}
return false;
};
/* Sorting
---------------------------------------------------------------------- */
// Document order sorting
sortOrder = hasCompare ?
function( a, b ) {
// Flag for duplicate removal
if ( a === b ) {
hasDuplicate = true;
return 0;
}
// Sort on method existence if only one input has compareDocumentPosition
var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
if ( compare ) {
return compare;
}
// Calculate position if both inputs belong to the same document
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
a.compareDocumentPosition( b ) :
// Otherwise we know they are disconnected
1;
// Disconnected nodes
if ( compare & 1 ||
( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
// Choose the first element that is related to our preferred document
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( a == document || a.ownerDocument == preferredDoc &&
contains( preferredDoc, a ) ) {
return -1;
}
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( b == document || b.ownerDocument == preferredDoc &&
contains( preferredDoc, b ) ) {
return 1;
}
// Maintain original order
return sortInput ?
( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
0;
}
return compare & 4 ? -1 : 1;
} :
function( a, b ) {
// Exit early if the nodes are identical
if ( a === b ) {
hasDuplicate = true;
return 0;
}
var cur,
i = 0,
aup = a.parentNode,
bup = b.parentNode,
ap = [ a ],
bp = [ b ];
// Parentless nodes are either documents or disconnected
if ( !aup || !bup ) {
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
/* eslint-disable eqeqeq */
return a == document ? -1 :
b == document ? 1 :
/* eslint-enable eqeqeq */
aup ? -1 :
bup ? 1 :
sortInput ?
( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
0;
// If the nodes are siblings, we can do a quick check
} else if ( aup === bup ) {
return siblingCheck( a, b );
}
// Otherwise we need full lists of their ancestors for comparison
cur = a;
while ( ( cur = cur.parentNode ) ) {
ap.unshift( cur );
}
cur = b;
while ( ( cur = cur.parentNode ) ) {
bp.unshift( cur );
}
// Walk down the tree looking for a discrepancy
while ( ap[ i ] === bp[ i ] ) {
i++;
}
return i ?
// Do a sibling check if the nodes have a common ancestor
siblingCheck( ap[ i ], bp[ i ] ) :
// Otherwise nodes in our document sort first
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
/* eslint-disable eqeqeq */
ap[ i ] == preferredDoc ? -1 :
bp[ i ] == preferredDoc ? 1 :
/* eslint-enable eqeqeq */
0;
};
return document;
};
Sizzle.matches = function( expr, elements ) {
return Sizzle( expr, null, null, elements );
};
Sizzle.matchesSelector = function( elem, expr ) {
setDocument( elem );
if ( support.matchesSelector && documentIsHTML &&
!nonnativeSelectorCache[ expr + " " ] &&
( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
try {
var ret = matches.call( elem, expr );
// IE 9's matchesSelector returns false on disconnected nodes
if ( ret || support.disconnectedMatch ||
// As well, disconnected nodes are said to be in a document
// fragment in IE 9
elem.document && elem.document.nodeType !== 11 ) {
return ret;
}
} catch ( e ) {
nonnativeSelectorCache( expr, true );
}
}
return Sizzle( expr, document, null, [ elem ] ).length > 0;
};
Sizzle.contains = function( context, elem ) {
// Set document vars if needed
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( ( context.ownerDocument || context ) != document ) {
setDocument( context );
}
return contains( context, elem );
};
Sizzle.attr = function( elem, name ) {
// Set document vars if needed
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( ( elem.ownerDocument || elem ) != document ) {
setDocument( elem );
}
var fn = Expr.attrHandle[ name.toLowerCase() ],
// Don't get fooled by Object.prototype properties (jQuery #13807)
val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
fn( elem, name, !documentIsHTML ) :
undefined;
return val !== undefined ?
val :
support.attributes || !documentIsHTML ?
elem.getAttribute( name ) :
( val = elem.getAttributeNode( name ) ) && val.specified ?
val.value :
null;
};
Sizzle.escape = function( sel ) {
return ( sel + "" ).replace( rcssescape, fcssescape );
};
Sizzle.error = function( msg ) {
throw new Error( "Syntax error, unrecognized expression: " + msg );
};
/**
* Document sorting and removing duplicates
* @param {ArrayLike} results
*/
Sizzle.uniqueSort = function( results ) {
var elem,
duplicates = [],
j = 0,
i = 0;
// Unless we *know* we can detect duplicates, assume their presence
hasDuplicate = !support.detectDuplicates;
sortInput = !support.sortStable && results.slice( 0 );
results.sort( sortOrder );
if ( hasDuplicate ) {
while ( ( elem = results[ i++ ] ) ) {
if ( elem === results[ i ] ) {
j = duplicates.push( i );
}
}
while ( j-- ) {
results.splice( duplicates[ j ], 1 );
}
}
// Clear input after sorting to release objects
// See https://github.com/jquery/sizzle/pull/225
sortInput = null;
return results;
};
/**
* Utility function for retrieving the text value of an array of DOM nodes
* @param {Array|Element} elem
*/
getText = Sizzle.getText = function( elem ) {
var node,
ret = "",
i = 0,
nodeType = elem.nodeType;
if ( !nodeType ) {
// If no nodeType, this is expected to be an array
while ( ( node = elem[ i++ ] ) ) {
// Do not traverse comment nodes
ret += getText( node );
}
} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
// Use textContent for elements
// innerText usage removed for consistency of new lines (jQuery #11153)
if ( typeof elem.textContent === "string" ) {
return elem.textContent;
} else {
// Traverse its children
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
ret += getText( elem );
}
}
} else if ( nodeType === 3 || nodeType === 4 ) {
return elem.nodeValue;
}
// Do not include comment or processing instruction nodes
return ret;
};
Expr = Sizzle.selectors = {
// Can be adjusted by the user
cacheLength: 50,
createPseudo: markFunction,
match: matchExpr,
attrHandle: {},
find: {},
relative: {
">": { dir: "parentNode", first: true },
" ": { dir: "parentNode" },
"+": { dir: "previousSibling", first: true },
"~": { dir: "previousSibling" }
},
preFilter: {
"ATTR": function( match ) {
match[ 1 ] = match[ 1 ].replace( runescape, funescape );
// Move the given value to match[3] whether quoted or unquoted
match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
match[ 5 ] || "" ).replace( runescape, funescape );
if ( match[ 2 ] === "~=" ) {
match[ 3 ] = " " + match[ 3 ] + " ";
}
return match.slice( 0, 4 );
},
"CHILD": function( match ) {
/* matches from matchExpr["CHILD"]
1 type (only|nth|...)
2 what (child|of-type)
3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
4 xn-component of xn+y argument ([+-]?\d*n|)
5 sign of xn-component
6 x of xn-component
7 sign of y-component
8 y of y-component
*/
match[ 1 ] = match[ 1 ].toLowerCase();
if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
// nth-* requires argument
if ( !match[ 3 ] ) {
Sizzle.error( match[ 0 ] );
}
// numeric x and y parameters for Expr.filter.CHILD
// remember that false/true cast respectively to 0/1
match[ 4 ] = +( match[ 4 ] ?
match[ 5 ] + ( match[ 6 ] || 1 ) :
2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
// other types prohibit arguments
} else if ( match[ 3 ] ) {
Sizzle.error( match[ 0 ] );
}
return match;
},
"PSEUDO": function( match ) {
var excess,
unquoted = !match[ 6 ] && match[ 2 ];
if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
return null;
}
// Accept quoted arguments as-is
if ( match[ 3 ] ) {
match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
// Strip excess characters from unquoted arguments
} else if ( unquoted && rpseudo.test( unquoted ) &&
// Get excess from tokenize (recursively)
( excess = tokenize( unquoted, true ) ) &&
// advance to the next closing parenthesis
( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
// excess is a negative index
match[ 0 ] = match[ 0 ].slice( 0, excess );
match[ 2 ] = unquoted.slice( 0, excess );
}
// Return only captures needed by the pseudo filter method (type and argument)
return match.slice( 0, 3 );
}
},
filter: {
"TAG": function( nodeNameSelector ) {
var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
return nodeNameSelector === "*" ?
function() {
return true;
} :
function( elem ) {
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
};
},
"CLASS": function( className ) {
var pattern = classCache[ className + " " ];
return pattern ||
( pattern = new RegExp( "(^|" + whitespace +
")" + className + "(" + whitespace + "|$)" ) ) && classCache(
className, function( elem ) {
return pattern.test(
typeof elem.className === "string" && elem.className ||
typeof elem.getAttribute !== "undefined" &&
elem.getAttribute( "class" ) ||
""
);
} );
},
"ATTR": function( name, operator, check ) {
return function( elem ) {
var result = Sizzle.attr( elem, name );
if ( result == null ) {
return operator === "!=";
}
if ( !operator ) {
return true;
}
result += "";
/* eslint-disable max-len */
return operator === "=" ? result === check :
operator === "!=" ? result !== check :
operator === "^=" ? check && result.indexOf( check ) === 0 :
operator === "*=" ? check && result.indexOf( check ) > -1 :
operator === "$=" ? check && result.slice( -check.length ) === check :
operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
false;
/* eslint-enable max-len */
};
},
"CHILD": function( type, what, _argument, first, last ) {
var simple = type.slice( 0, 3 ) !== "nth",
forward = type.slice( -4 ) !== "last",
ofType = what === "of-type";
return first === 1 && last === 0 ?
// Shortcut for :nth-*(n)
function( elem ) {
return !!elem.parentNode;
} :
function( elem, _context, xml ) {
var cache, uniqueCache, outerCache, node, nodeIndex, start,
dir = simple !== forward ? "nextSibling" : "previousSibling",
parent = elem.parentNode,
name = ofType && elem.nodeName.toLowerCase(),
useCache = !xml && !ofType,
diff = false;
if ( parent ) {
// :(first|last|only)-(child|of-type)
if ( simple ) {
while ( dir ) {
node = elem;
while ( ( node = node[ dir ] ) ) {
if ( ofType ?
node.nodeName.toLowerCase() === name :
node.nodeType === 1 ) {
return false;
}
}
// Reverse direction for :only-* (if we haven't yet done so)
start = dir = type === "only" && !start && "nextSibling";
}
return true;
}
start = [ forward ? parent.firstChild : parent.lastChild ];
// non-xml :nth-child(...) stores cache data on `parent`
if ( forward && useCache ) {
// Seek `elem` from a previously-cached index
// ...in a gzip-friendly way
node = parent;
outerCache = node[ expando ] || ( node[ expando ] = {} );
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ node.uniqueID ] ||
( outerCache[ node.uniqueID ] = {} );
cache = uniqueCache[ type ] || [];
nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
diff = nodeIndex && cache[ 2 ];
node = nodeIndex && parent.childNodes[ nodeIndex ];
while ( ( node = ++nodeIndex && node && node[ dir ] ||
// Fallback to seeking `elem` from the start
( diff = nodeIndex = 0 ) || start.pop() ) ) {
// When found, cache indexes on `parent` and break
if ( node.nodeType === 1 && ++diff && node === elem ) {
uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
break;
}
}
} else {
// Use previously-cached element index if available
if ( useCache ) {
// ...in a gzip-friendly way
node = elem;
outerCache = node[ expando ] || ( node[ expando ] = {} );
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ node.uniqueID ] ||
( outerCache[ node.uniqueID ] = {} );
cache = uniqueCache[ type ] || [];
nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
diff = nodeIndex;
}
// xml :nth-child(...)
// or :nth-last-child(...) or :nth(-last)?-of-type(...)
if ( diff === false ) {
// Use the same loop as above to seek `elem` from the start
while ( ( node = ++nodeIndex && node && node[ dir ] ||
( diff = nodeIndex = 0 ) || start.pop() ) ) {
if ( ( ofType ?
node.nodeName.toLowerCase() === name :
node.nodeType === 1 ) &&
++diff ) {
// Cache the index of each encountered element
if ( useCache ) {
outerCache = node[ expando ] ||
( node[ expando ] = {} );
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ node.uniqueID ] ||
( outerCache[ node.uniqueID ] = {} );
uniqueCache[ type ] = [ dirruns, diff ];
}
if ( node === elem ) {
break;
}
}
}
}
}
// Incorporate the offset, then check against cycle size
diff -= last;
return diff === first || ( diff % first === 0 && diff / first >= 0 );
}
};
},
"PSEUDO": function( pseudo, argument ) {
// pseudo-class names are case-insensitive
// http://www.w3.org/TR/selectors/#pseudo-classes
// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
// Remember that setFilters inherits from pseudos
var args,
fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
Sizzle.error( "unsupported pseudo: " + pseudo );
// The user may use createPseudo to indicate that
// arguments are needed to create the filter function
// just as Sizzle does
if ( fn[ expando ] ) {
return fn( argument );
}
// But maintain support for old signatures
if ( fn.length > 1 ) {
args = [ pseudo, pseudo, "", argument ];
return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
markFunction( function( seed, matches ) {
var idx,
matched = fn( seed, argument ),
i = matched.length;
while ( i-- ) {
idx = indexOf( seed, matched[ i ] );
seed[ idx ] = !( matches[ idx ] = matched[ i ] );
}
} ) :
function( elem ) {
return fn( elem, 0, args );
};
}
return fn;
}
},
pseudos: {
// Potentially complex pseudos
"not": markFunction( function( selector ) {
// Trim the selector passed to compile
// to avoid treating leading and trailing
// spaces as combinators
var input = [],
results = [],
matcher = compile( selector.replace( rtrim, "$1" ) );
return matcher[ expando ] ?
markFunction( function( seed, matches, _context, xml ) {
var elem,
unmatched = matcher( seed, null, xml, [] ),
i = seed.length;
// Match elements unmatched by `matcher`
while ( i-- ) {
if ( ( elem = unmatched[ i ] ) ) {
seed[ i ] = !( matches[ i ] = elem );
}
}
} ) :
function( elem, _context, xml ) {
input[ 0 ] = elem;
matcher( input, null, xml, results );
// Don't keep the element (issue #299)
input[ 0 ] = null;
return !results.pop();
};
} ),
"has": markFunction( function( selector ) {
return function( elem ) {
return Sizzle( selector, elem ).length > 0;
};
} ),
"contains": markFunction( function( text ) {
text = text.replace( runescape, funescape );
return function( elem ) {
return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
};
} ),
// "Whether an element is represented by a :lang() selector
// is based solely on the element's language value
// being equal to the identifier C,
// or beginning with the identifier C immediately followed by "-".
// The matching of C against the element's language value is performed case-insensitively.
// The identifier C does not have to be a valid language name."
// http://www.w3.org/TR/selectors/#lang-pseudo
"lang": markFunction( function( lang ) {
// lang value must be a valid identifier
if ( !ridentifier.test( lang || "" ) ) {
Sizzle.error( "unsupported lang: " + lang );
}
lang = lang.replace( runescape, funescape ).toLowerCase();
return function( elem ) {
var elemLang;
do {
if ( ( elemLang = documentIsHTML ?
elem.lang :
elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
elemLang = elemLang.toLowerCase();
return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
}
} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
return false;
};
} ),
// Miscellaneous
"target": function( elem ) {
var hash = window.location && window.location.hash;
return hash && hash.slice( 1 ) === elem.id;
},
"root": function( elem ) {
return elem === docElem;
},
"focus": function( elem ) {
return elem === document.activeElement &&
( !document.hasFocus || document.hasFocus() ) &&
!!( elem.type || elem.href || ~elem.tabIndex );
},
// Boolean properties
"enabled": createDisabledPseudo( false ),
"disabled": createDisabledPseudo( true ),
"checked": function( elem ) {
// In CSS3, :checked should return both checked and selected elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
var nodeName = elem.nodeName.toLowerCase();
return ( nodeName === "input" && !!elem.checked ) ||
( nodeName === "option" && !!elem.selected );
},
"selected": function( elem ) {
// Accessing this property makes selected-by-default
// options in Safari work properly
if ( elem.parentNode ) {
// eslint-disable-next-line no-unused-expressions
elem.parentNode.selectedIndex;
}
return elem.selected === true;
},
// Contents
"empty": function( elem ) {
// http://www.w3.org/TR/selectors/#empty-pseudo
// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
// but not by others (comment: 8; processing instruction: 7; etc.)
// nodeType < 6 works because attributes (2) do not appear as children
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
if ( elem.nodeType < 6 ) {
return false;
}
}
return true;
},
"parent": function( elem ) {
return !Expr.pseudos[ "empty" ]( elem );
},
// Element/input types
"header": function( elem ) {
return rheader.test( elem.nodeName );
},
"input": function( elem ) {
return rinputs.test( elem.nodeName );
},
"button": function( elem ) {
var name = elem.nodeName.toLowerCase();
return name === "input" && elem.type === "button" || name === "button";
},
"text": function( elem ) {
var attr;
return elem.nodeName.toLowerCase() === "input" &&
elem.type === "text" &&
// Support: IE<8
// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
( ( attr = elem.getAttribute( "type" ) ) == null ||
attr.toLowerCase() === "text" );
},
// Position-in-collection
"first": createPositionalPseudo( function() {
return [ 0 ];
} ),
"last": createPositionalPseudo( function( _matchIndexes, length ) {
return [ length - 1 ];
} ),
"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
return [ argument < 0 ? argument + length : argument ];
} ),
"even": createPositionalPseudo( function( matchIndexes, length ) {
var i = 0;
for ( ; i < length; i += 2 ) {
matchIndexes.push( i );
}
return matchIndexes;
} ),
"odd": createPositionalPseudo( function( matchIndexes, length ) {
var i = 1;
for ( ; i < length; i += 2 ) {
matchIndexes.push( i );
}
return matchIndexes;
} ),
"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
var i = argument < 0 ?
argument + length :
argument > length ?
length :
argument;
for ( ; --i >= 0; ) {
matchIndexes.push( i );
}
return matchIndexes;
} ),
"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
var i = argument < 0 ? argument + length : argument;
for ( ; ++i < length; ) {
matchIndexes.push( i );
}
return matchIndexes;
} )
}
};
Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
// Add button/input type pseudos
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
Expr.pseudos[ i ] = createInputPseudo( i );
}
for ( i in { submit: true, reset: true } ) {
Expr.pseudos[ i ] = createButtonPseudo( i );
}
// Easy API for creating new setFilters
function setFilters() {}
setFilters.prototype = Expr.filters = Expr.pseudos;
Expr.setFilters = new setFilters();
tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
var matched, match, tokens, type,
soFar, groups, preFilters,
cached = tokenCache[ selector + " " ];
if ( cached ) {
return parseOnly ? 0 : cached.slice( 0 );
}
soFar = selector;
groups = [];
preFilters = Expr.preFilter;
while ( soFar ) {
// Comma and first run
if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
if ( match ) {
// Don't consume trailing commas as valid
soFar = soFar.slice( match[ 0 ].length ) || soFar;
}
groups.push( ( tokens = [] ) );
}
matched = false;
// Combinators
if ( ( match = rcombinators.exec( soFar ) ) ) {
matched = match.shift();
tokens.push( {
value: matched,
// Cast descendant combinators to space
type: match[ 0 ].replace( rtrim, " " )
} );
soFar = soFar.slice( matched.length );
}
// Filters
for ( type in Expr.filter ) {
if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
( match = preFilters[ type ]( match ) ) ) ) {
matched = match.shift();
tokens.push( {
value: matched,
type: type,
matches: match
} );
soFar = soFar.slice( matched.length );
}
}
if ( !matched ) {
break;
}
}
// Return the length of the invalid excess
// if we're just parsing
// Otherwise, throw an error or return tokens
return parseOnly ?
soFar.length :
soFar ?
Sizzle.error( selector ) :
// Cache the tokens
tokenCache( selector, groups ).slice( 0 );
};
function toSelector( tokens ) {
var i = 0,
len = tokens.length,
selector = "";
for ( ; i < len; i++ ) {
selector += tokens[ i ].value;
}
return selector;
}
function addCombinator( matcher, combinator, base ) {
var dir = combinator.dir,
skip = combinator.next,
key = skip || dir,
checkNonElements = base && key === "parentNode",
doneName = done++;
return combinator.first ?
// Check against closest ancestor/preceding element
function( elem, context, xml ) {
while ( ( elem = elem[ dir ] ) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
return matcher( elem, context, xml );
}
}
return false;
} :
// Check against all ancestor/preceding elements
function( elem, context, xml ) {
var oldCache, uniqueCache, outerCache,
newCache = [ dirruns, doneName ];
// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
if ( xml ) {
while ( ( elem = elem[ dir ] ) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
if ( matcher( elem, context, xml ) ) {
return true;
}
}
}
} else {
while ( ( elem = elem[ dir ] ) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
outerCache = elem[ expando ] || ( elem[ expando ] = {} );
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ elem.uniqueID ] ||
( outerCache[ elem.uniqueID ] = {} );
if ( skip && skip === elem.nodeName.toLowerCase() ) {
elem = elem[ dir ] || elem;
} else if ( ( oldCache = uniqueCache[ key ] ) &&
oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
// Assign to newCache so results back-propagate to previous elements
return ( newCache[ 2 ] = oldCache[ 2 ] );
} else {
// Reuse newcache so results back-propagate to previous elements
uniqueCache[ key ] = newCache;
// A match means we're done; a fail means we have to keep checking
if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
return true;
}
}
}
}
}
return false;
};
}
function elementMatcher( matchers ) {
return matchers.length > 1 ?
function( elem, context, xml ) {
var i = matchers.length;
while ( i-- ) {
if ( !matchers[ i ]( elem, context, xml ) ) {
return false;
}
}
return true;
} :
matchers[ 0 ];
}
function multipleContexts( selector, contexts, results ) {
var i = 0,
len = contexts.length;
for ( ; i < len; i++ ) {
Sizzle( selector, contexts[ i ], results );
}
return results;
}
function condense( unmatched, map, filter, context, xml ) {
var elem,
newUnmatched = [],
i = 0,
len = unmatched.length,
mapped = map != null;
for ( ; i < len; i++ ) {
if ( ( elem = unmatched[ i ] ) ) {
if ( !filter || filter( elem, context, xml ) ) {
newUnmatched.push( elem );
if ( mapped ) {
map.push( i );
}
}
}
}
return newUnmatched;
}
function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
if ( postFilter && !postFilter[ expando ] ) {
postFilter = setMatcher( postFilter );
}
if ( postFinder && !postFinder[ expando ] ) {
postFinder = setMatcher( postFinder, postSelector );
}
return markFunction( function( seed, results, context, xml ) {
var temp, i, elem,
preMap = [],
postMap = [],
preexisting = results.length,
// Get initial elements from seed or context
elems = seed || multipleContexts(
selector || "*",
context.nodeType ? [ context ] : context,
[]
),
// Prefilter to get matcher input, preserving a map for seed-results synchronization
matcherIn = preFilter && ( seed || !selector ) ?
condense( elems, preMap, preFilter, context, xml ) :
elems,
matcherOut = matcher ?
// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
// ...intermediate processing is necessary
[] :
// ...otherwise use results directly
results :
matcherIn;
// Find primary matches
if ( matcher ) {
matcher( matcherIn, matcherOut, context, xml );
}
// Apply postFilter
if ( postFilter ) {
temp = condense( matcherOut, postMap );
postFilter( temp, [], context, xml );
// Un-match failing elements by moving them back to matcherIn
i = temp.length;
while ( i-- ) {
if ( ( elem = temp[ i ] ) ) {
matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
}
}
}
if ( seed ) {
if ( postFinder || preFilter ) {
if ( postFinder ) {
// Get the final matcherOut by condensing this intermediate into postFinder contexts
temp = [];
i = matcherOut.length;
while ( i-- ) {
if ( ( elem = matcherOut[ i ] ) ) {
// Restore matcherIn since elem is not yet a final match
temp.push( ( matcherIn[ i ] = elem ) );
}
}
postFinder( null, ( matcherOut = [] ), temp, xml );
}
// Move matched elements from seed to results to keep them synchronized
i = matcherOut.length;
while ( i-- ) {
if ( ( elem = matcherOut[ i ] ) &&
( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
seed[ temp ] = !( results[ temp ] = elem );
}
}
}
// Add elements to results, through postFinder if defined
} else {
matcherOut = condense(
matcherOut === results ?
matcherOut.splice( preexisting, matcherOut.length ) :
matcherOut
);
if ( postFinder ) {
postFinder( null, results, matcherOut, xml );
} else {
push.apply( results, matcherOut );
}
}
} );
}
function matcherFromTokens( tokens ) {
var checkContext, matcher, j,
len = tokens.length,
leadingRelative = Expr.relative[ tokens[ 0 ].type ],
implicitRelative = leadingRelative || Expr.relative[ " " ],
i = leadingRelative ? 1 : 0,
// The foundational matcher ensures that elements are reachable from top-level context(s)
matchContext = addCombinator( function( elem ) {
return elem === checkContext;
}, implicitRelative, true ),
matchAnyContext = addCombinator( function( elem ) {
return indexOf( checkContext, elem ) > -1;
}, implicitRelative, true ),
matchers = [ function( elem, context, xml ) {
var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
( checkContext = context ).nodeType ?
matchContext( elem, context, xml ) :
matchAnyContext( elem, context, xml ) );
// Avoid hanging onto element (issue #299)
checkContext = null;
return ret;
} ];
for ( ; i < len; i++ ) {
if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
} else {
matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
// Return special upon seeing a positional matcher
if ( matcher[ expando ] ) {
// Find the next relative operator (if any) for proper handling
j = ++i;
for ( ; j < len; j++ ) {
if ( Expr.relative[ tokens[ j ].type ] ) {
break;
}
}
return setMatcher(
i > 1 && elementMatcher( matchers ),
i > 1 && toSelector(
// If the preceding token was a descendant combinator, insert an implicit any-element `*`
tokens
.slice( 0, i - 1 )
.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
).replace( rtrim, "$1" ),
matcher,
i < j && matcherFromTokens( tokens.slice( i, j ) ),
j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
j < len && toSelector( tokens )
);
}
matchers.push( matcher );
}
}
return elementMatcher( matchers );
}
function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
var bySet = setMatchers.length > 0,
byElement = elementMatchers.length > 0,
superMatcher = function( seed, context, xml, results, outermost ) {
var elem, j, matcher,
matchedCount = 0,
i = "0",
unmatched = seed && [],
setMatched = [],
contextBackup = outermostContext,
// We must always have either seed elements or outermost context
elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
// Use integer dirruns iff this is the outermost matcher
dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
len = elems.length;
if ( outermost ) {
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
outermostContext = context == document || context || outermost;
}
// Add elements passing elementMatchers directly to results
// Support: IE<9, Safari
// Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id
for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
if ( byElement && elem ) {
j = 0;
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( !context && elem.ownerDocument != document ) {
setDocument( elem );
xml = !documentIsHTML;
}
while ( ( matcher = elementMatchers[ j++ ] ) ) {
if ( matcher( elem, context || document, xml ) ) {
results.push( elem );
break;
}
}
if ( outermost ) {
dirruns = dirrunsUnique;
}
}
// Track unmatched elements for set filters
if ( bySet ) {
// They will have gone through all possible matchers
if ( ( elem = !matcher && elem ) ) {
matchedCount--;
}
// Lengthen the array for every element, matched or not
if ( seed ) {
unmatched.push( elem );
}
}
}
// `i` is now the count of elements visited above, and adding it to `matchedCount`
// makes the latter nonnegative.
matchedCount += i;
// Apply set filters to unmatched elements
// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
// no element matchers and no seed.
// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
// case, which will result in a "00" `matchedCount` that differs from `i` but is also
// numerically zero.
if ( bySet && i !== matchedCount ) {
j = 0;
while ( ( matcher = setMatchers[ j++ ] ) ) {
matcher( unmatched, setMatched, context, xml );
}
if ( seed ) {
// Reintegrate element matches to eliminate the need for sorting
if ( matchedCount > 0 ) {
while ( i-- ) {
if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
setMatched[ i ] = pop.call( results );
}
}
}
// Discard index placeholder values to get only actual matches
setMatched = condense( setMatched );
}
// Add matches to results
push.apply( results, setMatched );
// Seedless set matches succeeding multiple successful matchers stipulate sorting
if ( outermost && !seed && setMatched.length > 0 &&
( matchedCount + setMatchers.length ) > 1 ) {
Sizzle.uniqueSort( results );
}
}
// Override manipulation of globals by nested matchers
if ( outermost ) {
dirruns = dirrunsUnique;
outermostContext = contextBackup;
}
return unmatched;
};
return bySet ?
markFunction( superMatcher ) :
superMatcher;
}
compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
var i,
setMatchers = [],
elementMatchers = [],
cached = compilerCache[ selector + " " ];
if ( !cached ) {
// Generate a function of recursive functions that can be used to check each element
if ( !match ) {
match = tokenize( selector );
}
i = match.length;
while ( i-- ) {
cached = matcherFromTokens( match[ i ] );
if ( cached[ expando ] ) {
setMatchers.push( cached );
} else {
elementMatchers.push( cached );
}
}
// Cache the compiled function
cached = compilerCache(
selector,
matcherFromGroupMatchers( elementMatchers, setMatchers )
);
// Save selector and tokenization
cached.selector = selector;
}
return cached;
};
/**
* A low-level selection function that works with Sizzle's compiled
* selector functions
* @param {String|Function} selector A selector or a pre-compiled
* selector function built with Sizzle.compile
* @param {Element} context
* @param {Array} [results]
* @param {Array} [seed] A set of elements to match against
*/
select = Sizzle.select = function( selector, context, results, seed ) {
var i, tokens, token, type, find,
compiled = typeof selector === "function" && selector,
match = !seed && tokenize( ( selector = compiled.selector || selector ) );
results = results || [];
// Try to minimize operations if there is only one selector in the list and no seed
// (the latter of which guarantees us context)
if ( match.length === 1 ) {
// Reduce context if the leading compound selector is an ID
tokens = match[ 0 ] = match[ 0 ].slice( 0 );
if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
.replace( runescape, funescape ), context ) || [] )[ 0 ];
if ( !context ) {
return results;
// Precompiled matchers will still verify ancestry, so step up a level
} else if ( compiled ) {
context = context.parentNode;
}
selector = selector.slice( tokens.shift().value.length );
}
// Fetch a seed set for right-to-left matching
i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
while ( i-- ) {
token = tokens[ i ];
// Abort if we hit a combinator
if ( Expr.relative[ ( type = token.type ) ] ) {
break;
}
if ( ( find = Expr.find[ type ] ) ) {
// Search, expanding context for leading sibling combinators
if ( ( seed = find(
token.matches[ 0 ].replace( runescape, funescape ),
rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
context
) ) ) {
// If seed is empty or no tokens remain, we can return early
tokens.splice( i, 1 );
selector = seed.length && toSelector( tokens );
if ( !selector ) {
push.apply( results, seed );
return results;
}
break;
}
}
}
}
// Compile and execute a filtering function if one is not provided
// Provide `match` to avoid retokenization if we modified the selector above
( compiled || compile( selector, match ) )(
seed,
context,
!documentIsHTML,
results,
!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
);
return results;
};
// One-time assignments
// Sort stability
support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
// Support: Chrome 14-35+
// Always assume duplicates if they aren't passed to the comparison function
support.detectDuplicates = !!hasDuplicate;
// Initialize against the default document
setDocument();
// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
// Detached nodes confoundingly follow *each other*
support.sortDetached = assert( function( el ) {
// Should return 1, but returns 4 (following)
return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
} );
// Support: IE<8
// Prevent attribute/property "interpolation"
// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
if ( !assert( function( el ) {
el.innerHTML = " ";
return el.firstChild.getAttribute( "href" ) === "#";
} ) ) {
addHandle( "type|href|height|width", function( elem, name, isXML ) {
if ( !isXML ) {
return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
}
} );
}
// Support: IE<9
// Use defaultValue in place of getAttribute("value")
if ( !support.attributes || !assert( function( el ) {
el.innerHTML = " ";
el.firstChild.setAttribute( "value", "" );
return el.firstChild.getAttribute( "value" ) === "";
} ) ) {
addHandle( "value", function( elem, _name, isXML ) {
if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
return elem.defaultValue;
}
} );
}
// Support: IE<9
// Use getAttributeNode to fetch booleans when getAttribute lies
if ( !assert( function( el ) {
return el.getAttribute( "disabled" ) == null;
} ) ) {
addHandle( booleans, function( elem, name, isXML ) {
var val;
if ( !isXML ) {
return elem[ name ] === true ? name.toLowerCase() :
( val = elem.getAttributeNode( name ) ) && val.specified ?
val.value :
null;
}
} );
}
return Sizzle;
} )( window );
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
// Deprecated
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
jQuery.escapeSelector = Sizzle.escape;
var dir = function( elem, dir, until ) {
var matched = [],
truncate = until !== undefined;
while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
if ( elem.nodeType === 1 ) {
if ( truncate && jQuery( elem ).is( until ) ) {
break;
}
matched.push( elem );
}
}
return matched;
};
var siblings = function( n, elem ) {
var matched = [];
for ( ; n; n = n.nextSibling ) {
if ( n.nodeType === 1 && n !== elem ) {
matched.push( n );
}
}
return matched;
};
var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
};
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
// Implement the identical functionality for filter and not
function winnow( elements, qualifier, not ) {
if ( isFunction( qualifier ) ) {
return jQuery.grep( elements, function( elem, i ) {
return !!qualifier.call( elem, i, elem ) !== not;
} );
}
// Single element
if ( qualifier.nodeType ) {
return jQuery.grep( elements, function( elem ) {
return ( elem === qualifier ) !== not;
} );
}
// Arraylike of elements (jQuery, arguments, Array)
if ( typeof qualifier !== "string" ) {
return jQuery.grep( elements, function( elem ) {
return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
} );
}
// Filtered directly for both simple and complex selectors
return jQuery.filter( qualifier, elements, not );
}
jQuery.filter = function( expr, elems, not ) {
var elem = elems[ 0 ];
if ( not ) {
expr = ":not(" + expr + ")";
}
if ( elems.length === 1 && elem.nodeType === 1 ) {
return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
}
return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
return elem.nodeType === 1;
} ) );
};
jQuery.fn.extend( {
find: function( selector ) {
var i, ret,
len = this.length,
self = this;
if ( typeof selector !== "string" ) {
return this.pushStack( jQuery( selector ).filter( function() {
for ( i = 0; i < len; i++ ) {
if ( jQuery.contains( self[ i ], this ) ) {
return true;
}
}
} ) );
}
ret = this.pushStack( [] );
for ( i = 0; i < len; i++ ) {
jQuery.find( selector, self[ i ], ret );
}
return len > 1 ? jQuery.uniqueSort( ret ) : ret;
},
filter: function( selector ) {
return this.pushStack( winnow( this, selector || [], false ) );
},
not: function( selector ) {
return this.pushStack( winnow( this, selector || [], true ) );
},
is: function( selector ) {
return !!winnow(
this,
// If this is a positional/relative selector, check membership in the returned set
// so $("p:first").is("p:last") won't return true for a doc with two "p".
typeof selector === "string" && rneedsContext.test( selector ) ?
jQuery( selector ) :
selector || [],
false
).length;
}
} );
// Initialize a jQuery object
// A central reference to the root jQuery(document)
var rootjQuery,
// A simple way to check for HTML strings
// Prioritize #id over to avoid XSS via location.hash (#9521)
// Strict HTML recognition (#11290: must start with <)
// Shortcut simple #id case for speed
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
init = jQuery.fn.init = function( selector, context, root ) {
var match, elem;
// HANDLE: $(""), $(null), $(undefined), $(false)
if ( !selector ) {
return this;
}
// Method init() accepts an alternate rootjQuery
// so migrate can support jQuery.sub (gh-2101)
root = root || rootjQuery;
// Handle HTML strings
if ( typeof selector === "string" ) {
if ( selector[ 0 ] === "<" &&
selector[ selector.length - 1 ] === ">" &&
selector.length >= 3 ) {
// Assume that strings that start and end with <> are HTML and skip the regex check
match = [ null, selector, null ];
} else {
match = rquickExpr.exec( selector );
}
// Match html or make sure no context is specified for #id
if ( match && ( match[ 1 ] || !context ) ) {
// HANDLE: $(html) -> $(array)
if ( match[ 1 ] ) {
context = context instanceof jQuery ? context[ 0 ] : context;
// Option to run scripts is true for back-compat
// Intentionally let the error be thrown if parseHTML is not present
jQuery.merge( this, jQuery.parseHTML(
match[ 1 ],
context && context.nodeType ? context.ownerDocument || context : document,
true
) );
// HANDLE: $(html, props)
if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
for ( match in context ) {
// Properties of context are called as methods if possible
if ( isFunction( this[ match ] ) ) {
this[ match ]( context[ match ] );
// ...and otherwise set as attributes
} else {
this.attr( match, context[ match ] );
}
}
}
return this;
// HANDLE: $(#id)
} else {
elem = document.getElementById( match[ 2 ] );
if ( elem ) {
// Inject the element directly into the jQuery object
this[ 0 ] = elem;
this.length = 1;
}
return this;
}
// HANDLE: $(expr, $(...))
} else if ( !context || context.jquery ) {
return ( context || root ).find( selector );
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
} else {
return this.constructor( context ).find( selector );
}
// HANDLE: $(DOMElement)
} else if ( selector.nodeType ) {
this[ 0 ] = selector;
this.length = 1;
return this;
// HANDLE: $(function)
// Shortcut for document ready
} else if ( isFunction( selector ) ) {
return root.ready !== undefined ?
root.ready( selector ) :
// Execute immediately if ready is not present
selector( jQuery );
}
return jQuery.makeArray( selector, this );
};
// Give the init function the jQuery prototype for later instantiation
init.prototype = jQuery.fn;
// Initialize central reference
rootjQuery = jQuery( document );
var rparentsprev = /^(?:parents|prev(?:Until|All))/,
// Methods guaranteed to produce a unique set when starting from a unique set
guaranteedUnique = {
children: true,
contents: true,
next: true,
prev: true
};
jQuery.fn.extend( {
has: function( target ) {
var targets = jQuery( target, this ),
l = targets.length;
return this.filter( function() {
var i = 0;
for ( ; i < l; i++ ) {
if ( jQuery.contains( this, targets[ i ] ) ) {
return true;
}
}
} );
},
closest: function( selectors, context ) {
var cur,
i = 0,
l = this.length,
matched = [],
targets = typeof selectors !== "string" && jQuery( selectors );
// Positional selectors never match, since there's no _selection_ context
if ( !rneedsContext.test( selectors ) ) {
for ( ; i < l; i++ ) {
for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
// Always skip document fragments
if ( cur.nodeType < 11 && ( targets ?
targets.index( cur ) > -1 :
// Don't pass non-elements to Sizzle
cur.nodeType === 1 &&
jQuery.find.matchesSelector( cur, selectors ) ) ) {
matched.push( cur );
break;
}
}
}
}
return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
},
// Determine the position of an element within the set
index: function( elem ) {
// No argument, return index in parent
if ( !elem ) {
return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
}
// Index in selector
if ( typeof elem === "string" ) {
return indexOf.call( jQuery( elem ), this[ 0 ] );
}
// Locate the position of the desired element
return indexOf.call( this,
// If it receives a jQuery object, the first element is used
elem.jquery ? elem[ 0 ] : elem
);
},
add: function( selector, context ) {
return this.pushStack(
jQuery.uniqueSort(
jQuery.merge( this.get(), jQuery( selector, context ) )
)
);
},
addBack: function( selector ) {
return this.add( selector == null ?
this.prevObject : this.prevObject.filter( selector )
);
}
} );
function sibling( cur, dir ) {
while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
return cur;
}
jQuery.each( {
parent: function( elem ) {
var parent = elem.parentNode;
return parent && parent.nodeType !== 11 ? parent : null;
},
parents: function( elem ) {
return dir( elem, "parentNode" );
},
parentsUntil: function( elem, _i, until ) {
return dir( elem, "parentNode", until );
},
next: function( elem ) {
return sibling( elem, "nextSibling" );
},
prev: function( elem ) {
return sibling( elem, "previousSibling" );
},
nextAll: function( elem ) {
return dir( elem, "nextSibling" );
},
prevAll: function( elem ) {
return dir( elem, "previousSibling" );
},
nextUntil: function( elem, _i, until ) {
return dir( elem, "nextSibling", until );
},
prevUntil: function( elem, _i, until ) {
return dir( elem, "previousSibling", until );
},
siblings: function( elem ) {
return siblings( ( elem.parentNode || {} ).firstChild, elem );
},
children: function( elem ) {
return siblings( elem.firstChild );
},
contents: function( elem ) {
if ( elem.contentDocument != null &&
// Support: IE 11+
// elements with no `data` attribute has an object
// `contentDocument` with a `null` prototype.
getProto( elem.contentDocument ) ) {
return elem.contentDocument;
}
// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
// Treat the template element as a regular one in browsers that
// don't support it.
if ( nodeName( elem, "template" ) ) {
elem = elem.content || elem;
}
return jQuery.merge( [], elem.childNodes );
}
}, function( name, fn ) {
jQuery.fn[ name ] = function( until, selector ) {
var matched = jQuery.map( this, fn, until );
if ( name.slice( -5 ) !== "Until" ) {
selector = until;
}
if ( selector && typeof selector === "string" ) {
matched = jQuery.filter( selector, matched );
}
if ( this.length > 1 ) {
// Remove duplicates
if ( !guaranteedUnique[ name ] ) {
jQuery.uniqueSort( matched );
}
// Reverse order for parents* and prev-derivatives
if ( rparentsprev.test( name ) ) {
matched.reverse();
}
}
return this.pushStack( matched );
};
} );
var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
// Convert String-formatted options into Object-formatted ones
function createOptions( options ) {
var object = {};
jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
object[ flag ] = true;
} );
return object;
}
/*
* Create a callback list using the following parameters:
*
* options: an optional list of space-separated options that will change how
* the callback list behaves or a more traditional option object
*
* By default a callback list will act like an event callback list and can be
* "fired" multiple times.
*
* Possible options:
*
* once: will ensure the callback list can only be fired once (like a Deferred)
*
* memory: will keep track of previous values and will call any callback added
* after the list has been fired right away with the latest "memorized"
* values (like a Deferred)
*
* unique: will ensure a callback can only be added once (no duplicate in the list)
*
* stopOnFalse: interrupt callings when a callback returns false
*
*/
jQuery.Callbacks = function( options ) {
// Convert options from String-formatted to Object-formatted if needed
// (we check in cache first)
options = typeof options === "string" ?
createOptions( options ) :
jQuery.extend( {}, options );
var // Flag to know if list is currently firing
firing,
// Last fire value for non-forgettable lists
memory,
// Flag to know if list was already fired
fired,
// Flag to prevent firing
locked,
// Actual callback list
list = [],
// Queue of execution data for repeatable lists
queue = [],
// Index of currently firing callback (modified by add/remove as needed)
firingIndex = -1,
// Fire callbacks
fire = function() {
// Enforce single-firing
locked = locked || options.once;
// Execute callbacks for all pending executions,
// respecting firingIndex overrides and runtime changes
fired = firing = true;
for ( ; queue.length; firingIndex = -1 ) {
memory = queue.shift();
while ( ++firingIndex < list.length ) {
// Run callback and check for early termination
if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
options.stopOnFalse ) {
// Jump to end and forget the data so .add doesn't re-fire
firingIndex = list.length;
memory = false;
}
}
}
// Forget the data if we're done with it
if ( !options.memory ) {
memory = false;
}
firing = false;
// Clean up if we're done firing for good
if ( locked ) {
// Keep an empty list if we have data for future add calls
if ( memory ) {
list = [];
// Otherwise, this object is spent
} else {
list = "";
}
}
},
// Actual Callbacks object
self = {
// Add a callback or a collection of callbacks to the list
add: function() {
if ( list ) {
// If we have memory from a past run, we should fire after adding
if ( memory && !firing ) {
firingIndex = list.length - 1;
queue.push( memory );
}
( function add( args ) {
jQuery.each( args, function( _, arg ) {
if ( isFunction( arg ) ) {
if ( !options.unique || !self.has( arg ) ) {
list.push( arg );
}
} else if ( arg && arg.length && toType( arg ) !== "string" ) {
// Inspect recursively
add( arg );
}
} );
} )( arguments );
if ( memory && !firing ) {
fire();
}
}
return this;
},
// Remove a callback from the list
remove: function() {
jQuery.each( arguments, function( _, arg ) {
var index;
while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
list.splice( index, 1 );
// Handle firing indexes
if ( index <= firingIndex ) {
firingIndex--;
}
}
} );
return this;
},
// Check if a given callback is in the list.
// If no argument is given, return whether or not list has callbacks attached.
has: function( fn ) {
return fn ?
jQuery.inArray( fn, list ) > -1 :
list.length > 0;
},
// Remove all callbacks from the list
empty: function() {
if ( list ) {
list = [];
}
return this;
},
// Disable .fire and .add
// Abort any current/pending executions
// Clear all callbacks and values
disable: function() {
locked = queue = [];
list = memory = "";
return this;
},
disabled: function() {
return !list;
},
// Disable .fire
// Also disable .add unless we have memory (since it would have no effect)
// Abort any pending executions
lock: function() {
locked = queue = [];
if ( !memory && !firing ) {
list = memory = "";
}
return this;
},
locked: function() {
return !!locked;
},
// Call all callbacks with the given context and arguments
fireWith: function( context, args ) {
if ( !locked ) {
args = args || [];
args = [ context, args.slice ? args.slice() : args ];
queue.push( args );
if ( !firing ) {
fire();
}
}
return this;
},
// Call all the callbacks with the given arguments
fire: function() {
self.fireWith( this, arguments );
return this;
},
// To know if the callbacks have already been called at least once
fired: function() {
return !!fired;
}
};
return self;
};
function Identity( v ) {
return v;
}
function Thrower( ex ) {
throw ex;
}
function adoptValue( value, resolve, reject, noValue ) {
var method;
try {
// Check for promise aspect first to privilege synchronous behavior
if ( value && isFunction( ( method = value.promise ) ) ) {
method.call( value ).done( resolve ).fail( reject );
// Other thenables
} else if ( value && isFunction( ( method = value.then ) ) ) {
method.call( value, resolve, reject );
// Other non-thenables
} else {
// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
// * false: [ value ].slice( 0 ) => resolve( value )
// * true: [ value ].slice( 1 ) => resolve()
resolve.apply( undefined, [ value ].slice( noValue ) );
}
// For Promises/A+, convert exceptions into rejections
// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
// Deferred#then to conditionally suppress rejection.
} catch ( value ) {
// Support: Android 4.0 only
// Strict mode functions invoked without .call/.apply get global-object context
reject.apply( undefined, [ value ] );
}
}
jQuery.extend( {
Deferred: function( func ) {
var tuples = [
// action, add listener, callbacks,
// ... .then handlers, argument index, [final state]
[ "notify", "progress", jQuery.Callbacks( "memory" ),
jQuery.Callbacks( "memory" ), 2 ],
[ "resolve", "done", jQuery.Callbacks( "once memory" ),
jQuery.Callbacks( "once memory" ), 0, "resolved" ],
[ "reject", "fail", jQuery.Callbacks( "once memory" ),
jQuery.Callbacks( "once memory" ), 1, "rejected" ]
],
state = "pending",
promise = {
state: function() {
return state;
},
always: function() {
deferred.done( arguments ).fail( arguments );
return this;
},
"catch": function( fn ) {
return promise.then( null, fn );
},
// Keep pipe for back-compat
pipe: function( /* fnDone, fnFail, fnProgress */ ) {
var fns = arguments;
return jQuery.Deferred( function( newDefer ) {
jQuery.each( tuples, function( _i, tuple ) {
// Map tuples (progress, done, fail) to arguments (done, fail, progress)
var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
// deferred.progress(function() { bind to newDefer or newDefer.notify })
// deferred.done(function() { bind to newDefer or newDefer.resolve })
// deferred.fail(function() { bind to newDefer or newDefer.reject })
deferred[ tuple[ 1 ] ]( function() {
var returned = fn && fn.apply( this, arguments );
if ( returned && isFunction( returned.promise ) ) {
returned.promise()
.progress( newDefer.notify )
.done( newDefer.resolve )
.fail( newDefer.reject );
} else {
newDefer[ tuple[ 0 ] + "With" ](
this,
fn ? [ returned ] : arguments
);
}
} );
} );
fns = null;
} ).promise();
},
then: function( onFulfilled, onRejected, onProgress ) {
var maxDepth = 0;
function resolve( depth, deferred, handler, special ) {
return function() {
var that = this,
args = arguments,
mightThrow = function() {
var returned, then;
// Support: Promises/A+ section 2.3.3.3.3
// https://promisesaplus.com/#point-59
// Ignore double-resolution attempts
if ( depth < maxDepth ) {
return;
}
returned = handler.apply( that, args );
// Support: Promises/A+ section 2.3.1
// https://promisesaplus.com/#point-48
if ( returned === deferred.promise() ) {
throw new TypeError( "Thenable self-resolution" );
}
// Support: Promises/A+ sections 2.3.3.1, 3.5
// https://promisesaplus.com/#point-54
// https://promisesaplus.com/#point-75
// Retrieve `then` only once
then = returned &&
// Support: Promises/A+ section 2.3.4
// https://promisesaplus.com/#point-64
// Only check objects and functions for thenability
( typeof returned === "object" ||
typeof returned === "function" ) &&
returned.then;
// Handle a returned thenable
if ( isFunction( then ) ) {
// Special processors (notify) just wait for resolution
if ( special ) {
then.call(
returned,
resolve( maxDepth, deferred, Identity, special ),
resolve( maxDepth, deferred, Thrower, special )
);
// Normal processors (resolve) also hook into progress
} else {
// ...and disregard older resolution values
maxDepth++;
then.call(
returned,
resolve( maxDepth, deferred, Identity, special ),
resolve( maxDepth, deferred, Thrower, special ),
resolve( maxDepth, deferred, Identity,
deferred.notifyWith )
);
}
// Handle all other returned values
} else {
// Only substitute handlers pass on context
// and multiple values (non-spec behavior)
if ( handler !== Identity ) {
that = undefined;
args = [ returned ];
}
// Process the value(s)
// Default process is resolve
( special || deferred.resolveWith )( that, args );
}
},
// Only normal processors (resolve) catch and reject exceptions
process = special ?
mightThrow :
function() {
try {
mightThrow();
} catch ( e ) {
if ( jQuery.Deferred.exceptionHook ) {
jQuery.Deferred.exceptionHook( e,
process.stackTrace );
}
// Support: Promises/A+ section 2.3.3.3.4.1
// https://promisesaplus.com/#point-61
// Ignore post-resolution exceptions
if ( depth + 1 >= maxDepth ) {
// Only substitute handlers pass on context
// and multiple values (non-spec behavior)
if ( handler !== Thrower ) {
that = undefined;
args = [ e ];
}
deferred.rejectWith( that, args );
}
}
};
// Support: Promises/A+ section 2.3.3.3.1
// https://promisesaplus.com/#point-57
// Re-resolve promises immediately to dodge false rejection from
// subsequent errors
if ( depth ) {
process();
} else {
// Call an optional hook to record the stack, in case of exception
// since it's otherwise lost when execution goes async
if ( jQuery.Deferred.getStackHook ) {
process.stackTrace = jQuery.Deferred.getStackHook();
}
window.setTimeout( process );
}
};
}
return jQuery.Deferred( function( newDefer ) {
// progress_handlers.add( ... )
tuples[ 0 ][ 3 ].add(
resolve(
0,
newDefer,
isFunction( onProgress ) ?
onProgress :
Identity,
newDefer.notifyWith
)
);
// fulfilled_handlers.add( ... )
tuples[ 1 ][ 3 ].add(
resolve(
0,
newDefer,
isFunction( onFulfilled ) ?
onFulfilled :
Identity
)
);
// rejected_handlers.add( ... )
tuples[ 2 ][ 3 ].add(
resolve(
0,
newDefer,
isFunction( onRejected ) ?
onRejected :
Thrower
)
);
} ).promise();
},
// Get a promise for this deferred
// If obj is provided, the promise aspect is added to the object
promise: function( obj ) {
return obj != null ? jQuery.extend( obj, promise ) : promise;
}
},
deferred = {};
// Add list-specific methods
jQuery.each( tuples, function( i, tuple ) {
var list = tuple[ 2 ],
stateString = tuple[ 5 ];
// promise.progress = list.add
// promise.done = list.add
// promise.fail = list.add
promise[ tuple[ 1 ] ] = list.add;
// Handle state
if ( stateString ) {
list.add(
function() {
// state = "resolved" (i.e., fulfilled)
// state = "rejected"
state = stateString;
},
// rejected_callbacks.disable
// fulfilled_callbacks.disable
tuples[ 3 - i ][ 2 ].disable,
// rejected_handlers.disable
// fulfilled_handlers.disable
tuples[ 3 - i ][ 3 ].disable,
// progress_callbacks.lock
tuples[ 0 ][ 2 ].lock,
// progress_handlers.lock
tuples[ 0 ][ 3 ].lock
);
}
// progress_handlers.fire
// fulfilled_handlers.fire
// rejected_handlers.fire
list.add( tuple[ 3 ].fire );
// deferred.notify = function() { deferred.notifyWith(...) }
// deferred.resolve = function() { deferred.resolveWith(...) }
// deferred.reject = function() { deferred.rejectWith(...) }
deferred[ tuple[ 0 ] ] = function() {
deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
return this;
};
// deferred.notifyWith = list.fireWith
// deferred.resolveWith = list.fireWith
// deferred.rejectWith = list.fireWith
deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
} );
// Make the deferred a promise
promise.promise( deferred );
// Call given func if any
if ( func ) {
func.call( deferred, deferred );
}
// All done!
return deferred;
},
// Deferred helper
when: function( singleValue ) {
var
// count of uncompleted subordinates
remaining = arguments.length,
// count of unprocessed arguments
i = remaining,
// subordinate fulfillment data
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
// the master Deferred
master = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
return function( value ) {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
master.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
if ( master.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
return master.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
}
return master.promise();
}
} );
// These usually indicate a programmer mistake during development,
// warn about them ASAP rather than swallowing them by default.
var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
jQuery.Deferred.exceptionHook = function( error, stack ) {
// Support: IE 8 - 9 only
// Console exists when dev tools are open, which can happen at any time
if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
}
};
jQuery.readyException = function( error ) {
window.setTimeout( function() {
throw error;
} );
};
// The deferred used on DOM ready
var readyList = jQuery.Deferred();
jQuery.fn.ready = function( fn ) {
readyList
.then( fn )
// Wrap jQuery.readyException in a function so that the lookup
// happens at the time of error handling instead of callback
// registration.
.catch( function( error ) {
jQuery.readyException( error );
} );
return this;
};
jQuery.extend( {
// Is the DOM ready to be used? Set to true once it occurs.
isReady: false,
// A counter to track how many items to wait for before
// the ready event fires. See #6781
readyWait: 1,
// Handle when the DOM is ready
ready: function( wait ) {
// Abort if there are pending holds or we're already ready
if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
return;
}
// Remember that the DOM is ready
jQuery.isReady = true;
// If a normal DOM Ready event fired, decrement, and wait if need be
if ( wait !== true && --jQuery.readyWait > 0 ) {
return;
}
// If there are functions bound, to execute
readyList.resolveWith( document, [ jQuery ] );
}
} );
jQuery.ready.then = readyList.then;
// The ready event handler and self cleanup method
function completed() {
document.removeEventListener( "DOMContentLoaded", completed );
window.removeEventListener( "load", completed );
jQuery.ready();
}
// Catch cases where $(document).ready() is called
// after the browser event has already occurred.
// Support: IE <=9 - 10 only
// Older IE sometimes signals "interactive" too soon
if ( document.readyState === "complete" ||
( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
window.setTimeout( jQuery.ready );
} else {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", completed );
// A fallback to window.onload, that will always work
window.addEventListener( "load", completed );
}
// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it's a function
var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
var i = 0,
len = elems.length,
bulk = key == null;
// Sets many values
if ( toType( key ) === "object" ) {
chainable = true;
for ( i in key ) {
access( elems, fn, i, key[ i ], true, emptyGet, raw );
}
// Sets one value
} else if ( value !== undefined ) {
chainable = true;
if ( !isFunction( value ) ) {
raw = true;
}
if ( bulk ) {
// Bulk operations run against the entire set
if ( raw ) {
fn.call( elems, value );
fn = null;
// ...except when executing function values
} else {
bulk = fn;
fn = function( elem, _key, value ) {
return bulk.call( jQuery( elem ), value );
};
}
}
if ( fn ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
value :
value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
}
if ( chainable ) {
return elems;
}
// Gets
if ( bulk ) {
return fn.call( elems );
}
return len ? fn( elems[ 0 ], key ) : emptyGet;
};
// Matches dashed string for camelizing
var rmsPrefix = /^-ms-/,
rdashAlpha = /-([a-z])/g;
// Used by camelCase as callback to replace()
function fcamelCase( _all, letter ) {
return letter.toUpperCase();
}
// Convert dashed to camelCase; used by the css and data modules
// Support: IE <=9 - 11, Edge 12 - 15
// Microsoft forgot to hump their vendor prefix (#9572)
function camelCase( string ) {
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
}
var acceptData = function( owner ) {
// Accepts only:
// - Node
// - Node.ELEMENT_NODE
// - Node.DOCUMENT_NODE
// - Object
// - Any
return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
};
function Data() {
this.expando = jQuery.expando + Data.uid++;
}
Data.uid = 1;
Data.prototype = {
cache: function( owner ) {
// Check if the owner object already has a cache
var value = owner[ this.expando ];
// If not, create one
if ( !value ) {
value = Object.create( null );
// We can accept data for non-element nodes in modern browsers,
// but we should not, see #8335.
// Always return an empty object.
if ( acceptData( owner ) ) {
// If it is a node unlikely to be stringify-ed or looped over
// use plain assignment
if ( owner.nodeType ) {
owner[ this.expando ] = value;
// Otherwise secure it in a non-enumerable property
// configurable must be true to allow the property to be
// deleted when data is removed
} else {
Object.defineProperty( owner, this.expando, {
value: value,
configurable: true
} );
}
}
}
return value;
},
set: function( owner, data, value ) {
var prop,
cache = this.cache( owner );
// Handle: [ owner, key, value ] args
// Always use camelCase key (gh-2257)
if ( typeof data === "string" ) {
cache[ camelCase( data ) ] = value;
// Handle: [ owner, { properties } ] args
} else {
// Copy the properties one-by-one to the cache object
for ( prop in data ) {
cache[ camelCase( prop ) ] = data[ prop ];
}
}
return cache;
},
get: function( owner, key ) {
return key === undefined ?
this.cache( owner ) :
// Always use camelCase key (gh-2257)
owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
},
access: function( owner, key, value ) {
// In cases where either:
//
// 1. No key was specified
// 2. A string key was specified, but no value provided
//
// Take the "read" path and allow the get method to determine
// which value to return, respectively either:
//
// 1. The entire cache object
// 2. The data stored at the key
//
if ( key === undefined ||
( ( key && typeof key === "string" ) && value === undefined ) ) {
return this.get( owner, key );
}
// When the key is not a string, or both a key and value
// are specified, set or extend (existing objects) with either:
//
// 1. An object of properties
// 2. A key and value
//
this.set( owner, key, value );
// Since the "set" path can have two possible entry points
// return the expected data based on which path was taken[*]
return value !== undefined ? value : key;
},
remove: function( owner, key ) {
var i,
cache = owner[ this.expando ];
if ( cache === undefined ) {
return;
}
if ( key !== undefined ) {
// Support array or space separated string of keys
if ( Array.isArray( key ) ) {
// If key is an array of keys...
// We always set camelCase keys, so remove that.
key = key.map( camelCase );
} else {
key = camelCase( key );
// If a key with the spaces exists, use it.
// Otherwise, create an array by matching non-whitespace
key = key in cache ?
[ key ] :
( key.match( rnothtmlwhite ) || [] );
}
i = key.length;
while ( i-- ) {
delete cache[ key[ i ] ];
}
}
// Remove the expando if there's no more data
if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
// Support: Chrome <=35 - 45
// Webkit & Blink performance suffers when deleting properties
// from DOM nodes, so set to undefined instead
// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
if ( owner.nodeType ) {
owner[ this.expando ] = undefined;
} else {
delete owner[ this.expando ];
}
}
},
hasData: function( owner ) {
var cache = owner[ this.expando ];
return cache !== undefined && !jQuery.isEmptyObject( cache );
}
};
var dataPriv = new Data();
var dataUser = new Data();
// Implementation Summary
//
// 1. Enforce API surface and semantic compatibility with 1.9.x branch
// 2. Improve the module's maintainability by reducing the storage
// paths to a single mechanism.
// 3. Use the same single mechanism to support "private" and "user" data.
// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
// 5. Avoid exposing implementation details on user objects (eg. expando properties)
// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
rmultiDash = /[A-Z]/g;
function getData( data ) {
if ( data === "true" ) {
return true;
}
if ( data === "false" ) {
return false;
}
if ( data === "null" ) {
return null;
}
// Only convert to a number if it doesn't change the string
if ( data === +data + "" ) {
return +data;
}
if ( rbrace.test( data ) ) {
return JSON.parse( data );
}
return data;
}
function dataAttr( elem, key, data ) {
var name;
// If nothing was found internally, try to fetch any
// data from the HTML5 data-* attribute
if ( data === undefined && elem.nodeType === 1 ) {
name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
data = elem.getAttribute( name );
if ( typeof data === "string" ) {
try {
data = getData( data );
} catch ( e ) {}
// Make sure we set the data so it isn't changed later
dataUser.set( elem, key, data );
} else {
data = undefined;
}
}
return data;
}
jQuery.extend( {
hasData: function( elem ) {
return dataUser.hasData( elem ) || dataPriv.hasData( elem );
},
data: function( elem, name, data ) {
return dataUser.access( elem, name, data );
},
removeData: function( elem, name ) {
dataUser.remove( elem, name );
},
// TODO: Now that all calls to _data and _removeData have been replaced
// with direct calls to dataPriv methods, these can be deprecated.
_data: function( elem, name, data ) {
return dataPriv.access( elem, name, data );
},
_removeData: function( elem, name ) {
dataPriv.remove( elem, name );
}
} );
jQuery.fn.extend( {
data: function( key, value ) {
var i, name, data,
elem = this[ 0 ],
attrs = elem && elem.attributes;
// Gets all values
if ( key === undefined ) {
if ( this.length ) {
data = dataUser.get( elem );
if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
i = attrs.length;
while ( i-- ) {
// Support: IE 11 only
// The attrs elements can be null (#14894)
if ( attrs[ i ] ) {
name = attrs[ i ].name;
if ( name.indexOf( "data-" ) === 0 ) {
name = camelCase( name.slice( 5 ) );
dataAttr( elem, name, data[ name ] );
}
}
}
dataPriv.set( elem, "hasDataAttrs", true );
}
}
return data;
}
// Sets multiple values
if ( typeof key === "object" ) {
return this.each( function() {
dataUser.set( this, key );
} );
}
return access( this, function( value ) {
var data;
// The calling jQuery object (element matches) is not empty
// (and therefore has an element appears at this[ 0 ]) and the
// `value` parameter was not undefined. An empty jQuery object
// will result in `undefined` for elem = this[ 0 ] which will
// throw an exception if an attempt to read a data cache is made.
if ( elem && value === undefined ) {
// Attempt to get data from the cache
// The key will always be camelCased in Data
data = dataUser.get( elem, key );
if ( data !== undefined ) {
return data;
}
// Attempt to "discover" the data in
// HTML5 custom data-* attrs
data = dataAttr( elem, key );
if ( data !== undefined ) {
return data;
}
// We tried really hard, but the data doesn't exist.
return;
}
// Set the data...
this.each( function() {
// We always store the camelCased key
dataUser.set( this, key, value );
} );
}, null, value, arguments.length > 1, null, true );
},
removeData: function( key ) {
return this.each( function() {
dataUser.remove( this, key );
} );
}
} );
jQuery.extend( {
queue: function( elem, type, data ) {
var queue;
if ( elem ) {
type = ( type || "fx" ) + "queue";
queue = dataPriv.get( elem, type );
// Speed up dequeue by getting out quickly if this is just a lookup
if ( data ) {
if ( !queue || Array.isArray( data ) ) {
queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
} else {
queue.push( data );
}
}
return queue || [];
}
},
dequeue: function( elem, type ) {
type = type || "fx";
var queue = jQuery.queue( elem, type ),
startLength = queue.length,
fn = queue.shift(),
hooks = jQuery._queueHooks( elem, type ),
next = function() {
jQuery.dequeue( elem, type );
};
// If the fx queue is dequeued, always remove the progress sentinel
if ( fn === "inprogress" ) {
fn = queue.shift();
startLength--;
}
if ( fn ) {
// Add a progress sentinel to prevent the fx queue from being
// automatically dequeued
if ( type === "fx" ) {
queue.unshift( "inprogress" );
}
// Clear up the last queue stop function
delete hooks.stop;
fn.call( elem, next, hooks );
}
if ( !startLength && hooks ) {
hooks.empty.fire();
}
},
// Not public - generate a queueHooks object, or return the current one
_queueHooks: function( elem, type ) {
var key = type + "queueHooks";
return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
empty: jQuery.Callbacks( "once memory" ).add( function() {
dataPriv.remove( elem, [ type + "queue", key ] );
} )
} );
}
} );
jQuery.fn.extend( {
queue: function( type, data ) {
var setter = 2;
if ( typeof type !== "string" ) {
data = type;
type = "fx";
setter--;
}
if ( arguments.length < setter ) {
return jQuery.queue( this[ 0 ], type );
}
return data === undefined ?
this :
this.each( function() {
var queue = jQuery.queue( this, type, data );
// Ensure a hooks for this queue
jQuery._queueHooks( this, type );
if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
jQuery.dequeue( this, type );
}
} );
},
dequeue: function( type ) {
return this.each( function() {
jQuery.dequeue( this, type );
} );
},
clearQueue: function( type ) {
return this.queue( type || "fx", [] );
},
// Get a promise resolved when queues of a certain type
// are emptied (fx is the type by default)
promise: function( type, obj ) {
var tmp,
count = 1,
defer = jQuery.Deferred(),
elements = this,
i = this.length,
resolve = function() {
if ( !( --count ) ) {
defer.resolveWith( elements, [ elements ] );
}
};
if ( typeof type !== "string" ) {
obj = type;
type = undefined;
}
type = type || "fx";
while ( i-- ) {
tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
if ( tmp && tmp.empty ) {
count++;
tmp.empty.add( resolve );
}
}
resolve();
return defer.promise( obj );
}
} );
var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
var documentElement = document.documentElement;
var isAttached = function( elem ) {
return jQuery.contains( elem.ownerDocument, elem );
},
composed = { composed: true };
// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
// Check attachment across shadow DOM boundaries when possible (gh-3504)
// Support: iOS 10.0-10.2 only
// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
// leading to errors. We need to check for `getRootNode`.
if ( documentElement.getRootNode ) {
isAttached = function( elem ) {
return jQuery.contains( elem.ownerDocument, elem ) ||
elem.getRootNode( composed ) === elem.ownerDocument;
};
}
var isHiddenWithinTree = function( elem, el ) {
// isHiddenWithinTree might be called from jQuery#filter function;
// in that case, element will be second argument
elem = el || elem;
// Inline style trumps all
return elem.style.display === "none" ||
elem.style.display === "" &&
// Otherwise, check computed style
// Support: Firefox <=43 - 45
// Disconnected elements can have computed display: none, so first confirm that elem is
// in the document.
isAttached( elem ) &&
jQuery.css( elem, "display" ) === "none";
};
function adjustCSS( elem, prop, valueParts, tween ) {
var adjusted, scale,
maxIterations = 20,
currentValue = tween ?
function() {
return tween.cur();
} :
function() {
return jQuery.css( elem, prop, "" );
},
initial = currentValue(),
unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
// Starting value computation is required for potential unit mismatches
initialInUnit = elem.nodeType &&
( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
rcssNum.exec( jQuery.css( elem, prop ) );
if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
// Support: Firefox <=54
// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
initial = initial / 2;
// Trust units reported by jQuery.css
unit = unit || initialInUnit[ 3 ];
// Iteratively approximate from a nonzero starting point
initialInUnit = +initial || 1;
while ( maxIterations-- ) {
// Evaluate and update our best guess (doubling guesses that zero out).
// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
jQuery.style( elem, prop, initialInUnit + unit );
if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
maxIterations = 0;
}
initialInUnit = initialInUnit / scale;
}
initialInUnit = initialInUnit * 2;
jQuery.style( elem, prop, initialInUnit + unit );
// Make sure we update the tween properties later on
valueParts = valueParts || [];
}
if ( valueParts ) {
initialInUnit = +initialInUnit || +initial || 0;
// Apply relative offset (+=/-=) if specified
adjusted = valueParts[ 1 ] ?
initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+valueParts[ 2 ];
if ( tween ) {
tween.unit = unit;
tween.start = initialInUnit;
tween.end = adjusted;
}
}
return adjusted;
}
var defaultDisplayMap = {};
function getDefaultDisplay( elem ) {
var temp,
doc = elem.ownerDocument,
nodeName = elem.nodeName,
display = defaultDisplayMap[ nodeName ];
if ( display ) {
return display;
}
temp = doc.body.appendChild( doc.createElement( nodeName ) );
display = jQuery.css( temp, "display" );
temp.parentNode.removeChild( temp );
if ( display === "none" ) {
display = "block";
}
defaultDisplayMap[ nodeName ] = display;
return display;
}
function showHide( elements, show ) {
var display, elem,
values = [],
index = 0,
length = elements.length;
// Determine new display value for elements that need to change
for ( ; index < length; index++ ) {
elem = elements[ index ];
if ( !elem.style ) {
continue;
}
display = elem.style.display;
if ( show ) {
// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
// check is required in this first loop unless we have a nonempty display value (either
// inline or about-to-be-restored)
if ( display === "none" ) {
values[ index ] = dataPriv.get( elem, "display" ) || null;
if ( !values[ index ] ) {
elem.style.display = "";
}
}
if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
values[ index ] = getDefaultDisplay( elem );
}
} else {
if ( display !== "none" ) {
values[ index ] = "none";
// Remember what we're overwriting
dataPriv.set( elem, "display", display );
}
}
}
// Set the display of the elements in a second loop to avoid constant reflow
for ( index = 0; index < length; index++ ) {
if ( values[ index ] != null ) {
elements[ index ].style.display = values[ index ];
}
}
return elements;
}
jQuery.fn.extend( {
show: function() {
return showHide( this, true );
},
hide: function() {
return showHide( this );
},
toggle: function( state ) {
if ( typeof state === "boolean" ) {
return state ? this.show() : this.hide();
}
return this.each( function() {
if ( isHiddenWithinTree( this ) ) {
jQuery( this ).show();
} else {
jQuery( this ).hide();
}
} );
}
} );
var rcheckableType = ( /^(?:checkbox|radio)$/i );
var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
( function() {
var fragment = document.createDocumentFragment(),
div = fragment.appendChild( document.createElement( "div" ) ),
input = document.createElement( "input" );
// Support: Android 4.0 - 4.3 only
// Check state lost if the name is set (#11217)
// Support: Windows Web Apps (WWA)
// `name` and `type` must use .setAttribute for WWA (#14901)
input.setAttribute( "type", "radio" );
input.setAttribute( "checked", "checked" );
input.setAttribute( "name", "t" );
div.appendChild( input );
// Support: Android <=4.1 only
// Older WebKit doesn't clone checked state correctly in fragments
support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
// Support: IE <=11 only
// Make sure textarea (and checkbox) defaultValue is properly cloned
div.innerHTML = "x ";
support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
// Support: IE <=9 only
// IE <=9 replaces tags with their contents when inserted outside of
// the select element.
div.innerHTML = " ";
support.option = !!div.lastChild;
} )();
// We have to close these tags to support XHTML (#13200)
var wrapMap = {
// XHTML parsers do not magically insert elements in the
// same way that tag soup parsers do. So we cannot shorten
// this by omitting or other required elements.
thead: [ 1, "" ],
col: [ 2, "" ],
tr: [ 2, "" ],
td: [ 3, "" ],
_default: [ 0, "", "" ]
};
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;
// Support: IE <=9 only
if ( !support.option ) {
wrapMap.optgroup = wrapMap.option = [ 1, "", " " ];
}
function getAll( context, tag ) {
// Support: IE <=9 - 11 only
// Use typeof to avoid zero-argument method invocation on host objects (#15151)
var ret;
if ( typeof context.getElementsByTagName !== "undefined" ) {
ret = context.getElementsByTagName( tag || "*" );
} else if ( typeof context.querySelectorAll !== "undefined" ) {
ret = context.querySelectorAll( tag || "*" );
} else {
ret = [];
}
if ( tag === undefined || tag && nodeName( context, tag ) ) {
return jQuery.merge( [ context ], ret );
}
return ret;
}
// Mark scripts as having already been evaluated
function setGlobalEval( elems, refElements ) {
var i = 0,
l = elems.length;
for ( ; i < l; i++ ) {
dataPriv.set(
elems[ i ],
"globalEval",
!refElements || dataPriv.get( refElements[ i ], "globalEval" )
);
}
}
var rhtml = /<|?\w+;/;
function buildFragment( elems, context, scripts, selection, ignored ) {
var elem, tmp, tag, wrap, attached, j,
fragment = context.createDocumentFragment(),
nodes = [],
i = 0,
l = elems.length;
for ( ; i < l; i++ ) {
elem = elems[ i ];
if ( elem || elem === 0 ) {
// Add nodes directly
if ( toType( elem ) === "object" ) {
// Support: Android <=4.0 only, PhantomJS 1 only
// push.apply(_, arraylike) throws on ancient WebKit
jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
// Convert non-html into a text node
} else if ( !rhtml.test( elem ) ) {
nodes.push( context.createTextNode( elem ) );
// Convert html into DOM nodes
} else {
tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
// Deserialize a standard representation
tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
wrap = wrapMap[ tag ] || wrapMap._default;
tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
// Descend through wrappers to the right content
j = wrap[ 0 ];
while ( j-- ) {
tmp = tmp.lastChild;
}
// Support: Android <=4.0 only, PhantomJS 1 only
// push.apply(_, arraylike) throws on ancient WebKit
jQuery.merge( nodes, tmp.childNodes );
// Remember the top-level container
tmp = fragment.firstChild;
// Ensure the created nodes are orphaned (#12392)
tmp.textContent = "";
}
}
}
// Remove wrapper from fragment
fragment.textContent = "";
i = 0;
while ( ( elem = nodes[ i++ ] ) ) {
// Skip elements already in the context collection (trac-4087)
if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
if ( ignored ) {
ignored.push( elem );
}
continue;
}
attached = isAttached( elem );
// Append to fragment
tmp = getAll( fragment.appendChild( elem ), "script" );
// Preserve script evaluation history
if ( attached ) {
setGlobalEval( tmp );
}
// Capture executables
if ( scripts ) {
j = 0;
while ( ( elem = tmp[ j++ ] ) ) {
if ( rscriptType.test( elem.type || "" ) ) {
scripts.push( elem );
}
}
}
}
return fragment;
}
var
rkeyEvent = /^key/,
rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
}
function returnFalse() {
return false;
}
// Support: IE <=9 - 11+
// focus() and blur() are asynchronous, except when they are no-op.
// So expect focus to be synchronous when the element is already active,
// and blur to be synchronous when the element is not already active.
// (focus and blur are always synchronous in other supported browsers,
// this just defines when we can count on it).
function expectSync( elem, type ) {
return ( elem === safeActiveElement() ) === ( type === "focus" );
}
// Support: IE <=9 only
// Accessing document.activeElement can throw unexpectedly
// https://bugs.jquery.com/ticket/13393
function safeActiveElement() {
try {
return document.activeElement;
} catch ( err ) { }
}
function on( elem, types, selector, data, fn, one ) {
var origFn, type;
// Types can be a map of types/handlers
if ( typeof types === "object" ) {
// ( types-Object, selector, data )
if ( typeof selector !== "string" ) {
// ( types-Object, data )
data = data || selector;
selector = undefined;
}
for ( type in types ) {
on( elem, type, selector, data, types[ type ], one );
}
return elem;
}
if ( data == null && fn == null ) {
// ( types, fn )
fn = selector;
data = selector = undefined;
} else if ( fn == null ) {
if ( typeof selector === "string" ) {
// ( types, selector, fn )
fn = data;
data = undefined;
} else {
// ( types, data, fn )
fn = data;
data = selector;
selector = undefined;
}
}
if ( fn === false ) {
fn = returnFalse;
} else if ( !fn ) {
return elem;
}
if ( one === 1 ) {
origFn = fn;
fn = function( event ) {
// Can use an empty set, since event contains the info
jQuery().off( event );
return origFn.apply( this, arguments );
};
// Use same guid so caller can remove using origFn
fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
}
return elem.each( function() {
jQuery.event.add( this, types, fn, data, selector );
} );
}
/*
* Helper functions for managing events -- not part of the public interface.
* Props to Dean Edwards' addEvent library for many of the ideas.
*/
jQuery.event = {
global: {},
add: function( elem, types, handler, data, selector ) {
var handleObjIn, eventHandle, tmp,
events, t, handleObj,
special, handlers, type, namespaces, origType,
elemData = dataPriv.get( elem );
// Only attach events to objects that accept data
if ( !acceptData( elem ) ) {
return;
}
// Caller can pass in an object of custom data in lieu of the handler
if ( handler.handler ) {
handleObjIn = handler;
handler = handleObjIn.handler;
selector = handleObjIn.selector;
}
// Ensure that invalid selectors throw exceptions at attach time
// Evaluate against documentElement in case elem is a non-element node (e.g., document)
if ( selector ) {
jQuery.find.matchesSelector( documentElement, selector );
}
// Make sure that the handler has a unique ID, used to find/remove it later
if ( !handler.guid ) {
handler.guid = jQuery.guid++;
}
// Init the element's event structure and main handler, if this is the first
if ( !( events = elemData.events ) ) {
events = elemData.events = Object.create( null );
}
if ( !( eventHandle = elemData.handle ) ) {
eventHandle = elemData.handle = function( e ) {
// Discard the second event of a jQuery.event.trigger() and
// when an event is called after a page has unloaded
return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
jQuery.event.dispatch.apply( elem, arguments ) : undefined;
};
}
// Handle multiple events separated by a space
types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
t = types.length;
while ( t-- ) {
tmp = rtypenamespace.exec( types[ t ] ) || [];
type = origType = tmp[ 1 ];
namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
// There *must* be a type, no attaching namespace-only handlers
if ( !type ) {
continue;
}
// If event changes its type, use the special event handlers for the changed type
special = jQuery.event.special[ type ] || {};
// If selector defined, determine special event api type, otherwise given type
type = ( selector ? special.delegateType : special.bindType ) || type;
// Update special based on newly reset type
special = jQuery.event.special[ type ] || {};
// handleObj is passed to all event handlers
handleObj = jQuery.extend( {
type: type,
origType: origType,
data: data,
handler: handler,
guid: handler.guid,
selector: selector,
needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
namespace: namespaces.join( "." )
}, handleObjIn );
// Init the event handler queue if we're the first
if ( !( handlers = events[ type ] ) ) {
handlers = events[ type ] = [];
handlers.delegateCount = 0;
// Only use addEventListener if the special events handler returns false
if ( !special.setup ||
special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
if ( elem.addEventListener ) {
elem.addEventListener( type, eventHandle );
}
}
}
if ( special.add ) {
special.add.call( elem, handleObj );
if ( !handleObj.handler.guid ) {
handleObj.handler.guid = handler.guid;
}
}
// Add to the element's handler list, delegates in front
if ( selector ) {
handlers.splice( handlers.delegateCount++, 0, handleObj );
} else {
handlers.push( handleObj );
}
// Keep track of which events have ever been used, for event optimization
jQuery.event.global[ type ] = true;
}
},
// Detach an event or set of events from an element
remove: function( elem, types, handler, selector, mappedTypes ) {
var j, origCount, tmp,
events, t, handleObj,
special, handlers, type, namespaces, origType,
elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
if ( !elemData || !( events = elemData.events ) ) {
return;
}
// Once for each type.namespace in types; type may be omitted
types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
t = types.length;
while ( t-- ) {
tmp = rtypenamespace.exec( types[ t ] ) || [];
type = origType = tmp[ 1 ];
namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
// Unbind all events (on this namespace, if provided) for the element
if ( !type ) {
for ( type in events ) {
jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
}
continue;
}
special = jQuery.event.special[ type ] || {};
type = ( selector ? special.delegateType : special.bindType ) || type;
handlers = events[ type ] || [];
tmp = tmp[ 2 ] &&
new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
// Remove matching events
origCount = j = handlers.length;
while ( j-- ) {
handleObj = handlers[ j ];
if ( ( mappedTypes || origType === handleObj.origType ) &&
( !handler || handler.guid === handleObj.guid ) &&
( !tmp || tmp.test( handleObj.namespace ) ) &&
( !selector || selector === handleObj.selector ||
selector === "**" && handleObj.selector ) ) {
handlers.splice( j, 1 );
if ( handleObj.selector ) {
handlers.delegateCount--;
}
if ( special.remove ) {
special.remove.call( elem, handleObj );
}
}
}
// Remove generic event handler if we removed something and no more handlers exist
// (avoids potential for endless recursion during removal of special event handlers)
if ( origCount && !handlers.length ) {
if ( !special.teardown ||
special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
jQuery.removeEvent( elem, type, elemData.handle );
}
delete events[ type ];
}
}
// Remove data and the expando if it's no longer used
if ( jQuery.isEmptyObject( events ) ) {
dataPriv.remove( elem, "handle events" );
}
},
dispatch: function( nativeEvent ) {
var i, j, ret, matched, handleObj, handlerQueue,
args = new Array( arguments.length ),
// Make a writable jQuery.Event from the native event object
event = jQuery.event.fix( nativeEvent ),
handlers = (
dataPriv.get( this, "events" ) || Object.create( null )
)[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
args[ 0 ] = event;
for ( i = 1; i < arguments.length; i++ ) {
args[ i ] = arguments[ i ];
}
event.delegateTarget = this;
// Call the preDispatch hook for the mapped type, and let it bail if desired
if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
return;
}
// Determine handlers
handlerQueue = jQuery.event.handlers.call( this, event, handlers );
// Run delegates first; they may want to stop propagation beneath us
i = 0;
while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
event.currentTarget = matched.elem;
j = 0;
while ( ( handleObj = matched.handlers[ j++ ] ) &&
!event.isImmediatePropagationStopped() ) {
// If the event is namespaced, then each handler is only invoked if it is
// specially universal or its namespaces are a superset of the event's.
if ( !event.rnamespace || handleObj.namespace === false ||
event.rnamespace.test( handleObj.namespace ) ) {
event.handleObj = handleObj;
event.data = handleObj.data;
ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
handleObj.handler ).apply( matched.elem, args );
if ( ret !== undefined ) {
if ( ( event.result = ret ) === false ) {
event.preventDefault();
event.stopPropagation();
}
}
}
}
}
// Call the postDispatch hook for the mapped type
if ( special.postDispatch ) {
special.postDispatch.call( this, event );
}
return event.result;
},
handlers: function( event, handlers ) {
var i, handleObj, sel, matchedHandlers, matchedSelectors,
handlerQueue = [],
delegateCount = handlers.delegateCount,
cur = event.target;
// Find delegate handlers
if ( delegateCount &&
// Support: IE <=9
// Black-hole SVG instance trees (trac-13180)
cur.nodeType &&
// Support: Firefox <=42
// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
// Support: IE 11 only
// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
!( event.type === "click" && event.button >= 1 ) ) {
for ( ; cur !== this; cur = cur.parentNode || this ) {
// Don't check non-elements (#13208)
// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
matchedHandlers = [];
matchedSelectors = {};
for ( i = 0; i < delegateCount; i++ ) {
handleObj = handlers[ i ];
// Don't conflict with Object.prototype properties (#13203)
sel = handleObj.selector + " ";
if ( matchedSelectors[ sel ] === undefined ) {
matchedSelectors[ sel ] = handleObj.needsContext ?
jQuery( sel, this ).index( cur ) > -1 :
jQuery.find( sel, this, null, [ cur ] ).length;
}
if ( matchedSelectors[ sel ] ) {
matchedHandlers.push( handleObj );
}
}
if ( matchedHandlers.length ) {
handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
}
}
}
}
// Add the remaining (directly-bound) handlers
cur = this;
if ( delegateCount < handlers.length ) {
handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
}
return handlerQueue;
},
addProp: function( name, hook ) {
Object.defineProperty( jQuery.Event.prototype, name, {
enumerable: true,
configurable: true,
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
return this.originalEvent[ name ];
}
},
set: function( value ) {
Object.defineProperty( this, name, {
enumerable: true,
configurable: true,
writable: true,
value: value
} );
}
} );
},
fix: function( originalEvent ) {
return originalEvent[ jQuery.expando ] ?
originalEvent :
new jQuery.Event( originalEvent );
},
special: {
load: {
// Prevent triggered image.load events from bubbling to window.load
noBubble: true
},
click: {
// Utilize native event to ensure correct state for checkable inputs
setup: function( data ) {
// For mutual compressibility with _default, replace `this` access with a local var.
// `|| data` is dead code meant only to preserve the variable through minification.
var el = this || data;
// Claim the first handler
if ( rcheckableType.test( el.type ) &&
el.click && nodeName( el, "input" ) ) {
// dataPriv.set( el, "click", ... )
leverageNative( el, "click", returnTrue );
}
// Return false to allow normal processing in the caller
return false;
},
trigger: function( data ) {
// For mutual compressibility with _default, replace `this` access with a local var.
// `|| data` is dead code meant only to preserve the variable through minification.
var el = this || data;
// Force setup before triggering a click
if ( rcheckableType.test( el.type ) &&
el.click && nodeName( el, "input" ) ) {
leverageNative( el, "click" );
}
// Return non-false to allow normal event-path propagation
return true;
},
// For cross-browser consistency, suppress native .click() on links
// Also prevent it if we're currently inside a leveraged native-event stack
_default: function( event ) {
var target = event.target;
return rcheckableType.test( target.type ) &&
target.click && nodeName( target, "input" ) &&
dataPriv.get( target, "click" ) ||
nodeName( target, "a" );
}
},
beforeunload: {
postDispatch: function( event ) {
// Support: Firefox 20+
// Firefox doesn't alert if the returnValue field is not set.
if ( event.result !== undefined && event.originalEvent ) {
event.originalEvent.returnValue = event.result;
}
}
}
}
};
// Ensure the presence of an event listener that handles manually-triggered
// synthetic events by interrupting progress until reinvoked in response to
// *native* events that it fires directly, ensuring that state changes have
// already occurred before other listeners are invoked.
function leverageNative( el, type, expectSync ) {
// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
if ( !expectSync ) {
if ( dataPriv.get( el, type ) === undefined ) {
jQuery.event.add( el, type, returnTrue );
}
return;
}
// Register the controller as a special universal handler for all event namespaces
dataPriv.set( el, type, false );
jQuery.event.add( el, type, {
namespace: false,
handler: function( event ) {
var notAsync, result,
saved = dataPriv.get( this, type );
if ( ( event.isTrigger & 1 ) && this[ type ] ) {
// Interrupt processing of the outer synthetic .trigger()ed event
// Saved data should be false in such cases, but might be a leftover capture object
// from an async native handler (gh-4350)
if ( !saved.length ) {
// Store arguments for use when handling the inner native event
// There will always be at least one argument (an event object), so this array
// will not be confused with a leftover capture object.
saved = slice.call( arguments );
dataPriv.set( this, type, saved );
// Trigger the native event and capture its result
// Support: IE <=9 - 11+
// focus() and blur() are asynchronous
notAsync = expectSync( this, type );
this[ type ]();
result = dataPriv.get( this, type );
if ( saved !== result || notAsync ) {
dataPriv.set( this, type, false );
} else {
result = {};
}
if ( saved !== result ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
return result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
// (focus or blur), assume that the surrogate already propagated from triggering the
// native event and prevent that from happening again here.
// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
// bubbling surrogate propagates *after* the non-bubbling base), but that seems
// less bad than duplication.
} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
event.stopPropagation();
}
// If this is a native event triggered above, everything is now in order
// Fire an inner synthetic event with the original arguments
} else if ( saved.length ) {
// ...and capture the result
dataPriv.set( this, type, {
value: jQuery.event.trigger(
// Support: IE <=9 - 11+
// Extend with the prototype to reset the above stopImmediatePropagation()
jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
saved.slice( 1 ),
this
)
} );
// Abort handling of the native event
event.stopImmediatePropagation();
}
}
} );
}
jQuery.removeEvent = function( elem, type, handle ) {
// This "if" is needed for plain objects
if ( elem.removeEventListener ) {
elem.removeEventListener( type, handle );
}
};
jQuery.Event = function( src, props ) {
// Allow instantiation without the 'new' keyword
if ( !( this instanceof jQuery.Event ) ) {
return new jQuery.Event( src, props );
}
// Event object
if ( src && src.type ) {
this.originalEvent = src;
this.type = src.type;
// Events bubbling up the document may have been marked as prevented
// by a handler lower down the tree; reflect the correct value.
this.isDefaultPrevented = src.defaultPrevented ||
src.defaultPrevented === undefined &&
// Support: Android <=2.3 only
src.returnValue === false ?
returnTrue :
returnFalse;
// Create target properties
// Support: Safari <=6 - 7 only
// Target should not be a text node (#504, #13143)
this.target = ( src.target && src.target.nodeType === 3 ) ?
src.target.parentNode :
src.target;
this.currentTarget = src.currentTarget;
this.relatedTarget = src.relatedTarget;
// Event type
} else {
this.type = src;
}
// Put explicitly provided properties onto the event object
if ( props ) {
jQuery.extend( this, props );
}
// Create a timestamp if incoming event doesn't have one
this.timeStamp = src && src.timeStamp || Date.now();
// Mark it as fixed
this[ jQuery.expando ] = true;
};
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
jQuery.Event.prototype = {
constructor: jQuery.Event,
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse,
isSimulated: false,
preventDefault: function() {
var e = this.originalEvent;
this.isDefaultPrevented = returnTrue;
if ( e && !this.isSimulated ) {
e.preventDefault();
}
},
stopPropagation: function() {
var e = this.originalEvent;
this.isPropagationStopped = returnTrue;
if ( e && !this.isSimulated ) {
e.stopPropagation();
}
},
stopImmediatePropagation: function() {
var e = this.originalEvent;
this.isImmediatePropagationStopped = returnTrue;
if ( e && !this.isSimulated ) {
e.stopImmediatePropagation();
}
this.stopPropagation();
}
};
// Includes all common event props including KeyEvent and MouseEvent specific props
jQuery.each( {
altKey: true,
bubbles: true,
cancelable: true,
changedTouches: true,
ctrlKey: true,
detail: true,
eventPhase: true,
metaKey: true,
pageX: true,
pageY: true,
shiftKey: true,
view: true,
"char": true,
code: true,
charCode: true,
key: true,
keyCode: true,
button: true,
buttons: true,
clientX: true,
clientY: true,
offsetX: true,
offsetY: true,
pointerId: true,
pointerType: true,
screenX: true,
screenY: true,
targetTouches: true,
toElement: true,
touches: true,
which: function( event ) {
var button = event.button;
// Add which for key events
if ( event.which == null && rkeyEvent.test( event.type ) ) {
return event.charCode != null ? event.charCode : event.keyCode;
}
// Add which for click: 1 === left; 2 === middle; 3 === right
if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
if ( button & 1 ) {
return 1;
}
if ( button & 2 ) {
return 3;
}
if ( button & 4 ) {
return 2;
}
return 0;
}
return event.which;
}
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
jQuery.event.special[ type ] = {
// Utilize native event if possible so blur/focus sequence is correct
setup: function() {
// Claim the first handler
// dataPriv.set( this, "focus", ... )
// dataPriv.set( this, "blur", ... )
leverageNative( this, type, expectSync );
// Return false to allow normal processing in the caller
return false;
},
trigger: function() {
// Force setup before trigger
leverageNative( this, type );
// Return non-false to allow normal event-path propagation
return true;
},
delegateType: delegateType
};
} );
// Create mouseenter/leave events using mouseover/out and event-time checks
// so that event delegation works in jQuery.
// Do the same for pointerenter/pointerleave and pointerover/pointerout
//
// Support: Safari 7 only
// Safari sends mouseenter too often; see:
// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
// for the description of the bug (it existed in older Chrome versions as well).
jQuery.each( {
mouseenter: "mouseover",
mouseleave: "mouseout",
pointerenter: "pointerover",
pointerleave: "pointerout"
}, function( orig, fix ) {
jQuery.event.special[ orig ] = {
delegateType: fix,
bindType: fix,
handle: function( event ) {
var ret,
target = this,
related = event.relatedTarget,
handleObj = event.handleObj;
// For mouseenter/leave call the handler if related is outside the target.
// NB: No relatedTarget if the mouse left/entered the browser window
if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
event.type = handleObj.origType;
ret = handleObj.handler.apply( this, arguments );
event.type = fix;
}
return ret;
}
};
} );
jQuery.fn.extend( {
on: function( types, selector, data, fn ) {
return on( this, types, selector, data, fn );
},
one: function( types, selector, data, fn ) {
return on( this, types, selector, data, fn, 1 );
},
off: function( types, selector, fn ) {
var handleObj, type;
if ( types && types.preventDefault && types.handleObj ) {
// ( event ) dispatched jQuery.Event
handleObj = types.handleObj;
jQuery( types.delegateTarget ).off(
handleObj.namespace ?
handleObj.origType + "." + handleObj.namespace :
handleObj.origType,
handleObj.selector,
handleObj.handler
);
return this;
}
if ( typeof types === "object" ) {
// ( types-object [, selector] )
for ( type in types ) {
this.off( type, selector, types[ type ] );
}
return this;
}
if ( selector === false || typeof selector === "function" ) {
// ( types [, fn] )
fn = selector;
selector = undefined;
}
if ( fn === false ) {
fn = returnFalse;
}
return this.each( function() {
jQuery.event.remove( this, types, fn, selector );
} );
}
} );
var
// Support: IE <=10 - 11, Edge 12 - 13 only
// In IE/Edge using regex groups here causes severe slowdowns.
// See https://connect.microsoft.com/IE/feedback/details/1736512/
rnoInnerhtml = /
================================================
FILE: static/common/user/uedit/dialogs/attachment/attachment.css
================================================
@charset "utf-8";
/* dialog样式 */
.wrapper {
zoom: 1;
width: 630px;
*width: 626px;
height: 380px;
margin: 0 auto;
padding: 10px;
position: relative;
font-family: sans-serif;
}
/*tab样式框大小*/
.tabhead {
float:left;
}
.tabbody {
width: 100%;
height: 346px;
position: relative;
clear: both;
}
.tabbody .panel {
position: absolute;
width: 0;
height: 0;
background: #fff;
overflow: hidden;
display: none;
}
.tabbody .panel.focus {
width: 100%;
height: 346px;
display: block;
}
/* 上传附件 */
.tabbody #upload.panel {
width: 0;
height: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
background: #fff;
display: block;
}
.tabbody #upload.panel.focus {
width: 100%;
height: 346px;
display: block;
clip: auto;
}
#upload .queueList {
margin: 0;
width: 100%;
height: 100%;
position: absolute;
overflow: hidden;
}
#upload p {
margin: 0;
}
.element-invisible {
width: 0 !important;
height: 0 !important;
border: 0;
padding: 0;
margin: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
}
#upload .placeholder {
margin: 10px;
border: 2px dashed #e6e6e6;
*border: 0px dashed #e6e6e6;
height: 172px;
padding-top: 150px;
text-align: center;
background: url(./images/image.png) center 70px no-repeat;
color: #cccccc;
font-size: 18px;
position: relative;
top:0;
*top: 10px;
}
#upload .placeholder .webuploader-pick {
font-size: 18px;
background: #00b7ee;
border-radius: 3px;
line-height: 44px;
padding: 0 30px;
*width: 120px;
color: #fff;
display: inline-block;
margin: 0 auto 20px auto;
cursor: pointer;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
#upload .placeholder .webuploader-pick-hover {
background: #00a2d4;
}
#filePickerContainer {
text-align: center;
}
#upload .placeholder .flashTip {
color: #666666;
font-size: 12px;
position: absolute;
width: 100%;
text-align: center;
bottom: 20px;
}
#upload .placeholder .flashTip a {
color: #0785d1;
text-decoration: none;
}
#upload .placeholder .flashTip a:hover {
text-decoration: underline;
}
#upload .placeholder.webuploader-dnd-over {
border-color: #999999;
}
#upload .filelist {
list-style: none;
margin: 0;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
position: relative;
height: 300px;
}
#upload .filelist:after {
content: '';
display: block;
width: 0;
height: 0;
overflow: hidden;
clear: both;
}
#upload .filelist li {
width: 113px;
height: 113px;
background: url(./images/bg.png);
text-align: center;
margin: 9px 0 0 9px;
*margin: 6px 0 0 6px;
position: relative;
display: block;
float: left;
overflow: hidden;
font-size: 12px;
}
#upload .filelist li p.log {
position: relative;
top: -45px;
}
#upload .filelist li p.title {
position: absolute;
top: 0;
left: 0;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
top: 5px;
text-indent: 5px;
text-align: left;
}
#upload .filelist li p.progress {
position: absolute;
width: 100%;
bottom: 0;
left: 0;
height: 8px;
overflow: hidden;
z-index: 50;
margin: 0;
border-radius: 0;
background: none;
-webkit-box-shadow: 0 0 0;
}
#upload .filelist li p.progress span {
display: none;
overflow: hidden;
width: 0;
height: 100%;
background: #1483d8 url(./images/progress.png) repeat-x;
-webit-transition: width 200ms linear;
-moz-transition: width 200ms linear;
-o-transition: width 200ms linear;
-ms-transition: width 200ms linear;
transition: width 200ms linear;
-webkit-animation: progressmove 2s linear infinite;
-moz-animation: progressmove 2s linear infinite;
-o-animation: progressmove 2s linear infinite;
-ms-animation: progressmove 2s linear infinite;
animation: progressmove 2s linear infinite;
-webkit-transform: translateZ(0);
}
@-webkit-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@-moz-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
#upload .filelist li p.imgWrap {
position: relative;
z-index: 2;
line-height: 113px;
vertical-align: middle;
overflow: hidden;
width: 113px;
height: 113px;
-webkit-transform-origin: 50% 50%;
-moz-transform-origin: 50% 50%;
-o-transform-origin: 50% 50%;
-ms-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webit-transition: 200ms ease-out;
-moz-transition: 200ms ease-out;
-o-transition: 200ms ease-out;
-ms-transition: 200ms ease-out;
transition: 200ms ease-out;
}
#upload .filelist li p.imgWrap.notimage {
margin-top: 0;
width: 111px;
height: 111px;
border: 1px #eeeeee solid;
}
#upload .filelist li p.imgWrap.notimage i.file-preview {
margin-top: 15px;
}
#upload .filelist li img {
width: 100%;
}
#upload .filelist li p.error {
background: #f43838;
color: #fff;
position: absolute;
bottom: 0;
left: 0;
height: 28px;
line-height: 28px;
width: 100%;
z-index: 100;
display:none;
}
#upload .filelist li .success {
display: block;
position: absolute;
left: 0;
bottom: 0;
height: 40px;
width: 100%;
z-index: 200;
background: url(./images/success.png) no-repeat right bottom;
background-image: url(./images/success.gif) \9;
}
#upload .filelist li.filePickerBlock {
width: 113px;
height: 113px;
background: url(./images/image.png) no-repeat center 12px;
border: 1px solid #eeeeee;
border-radius: 0;
}
#upload .filelist li.filePickerBlock div.webuploader-pick {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
opacity: 0;
background: none;
font-size: 0;
}
#upload .filelist div.file-panel {
position: absolute;
height: 0;
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
background: rgba(0, 0, 0, 0.5);
width: 100%;
top: 0;
left: 0;
overflow: hidden;
z-index: 300;
}
#upload .filelist div.file-panel span {
width: 24px;
height: 24px;
display: inline;
float: right;
text-indent: -9999px;
overflow: hidden;
background: url(./images/icons.png) no-repeat;
background: url(./images/icons.gif) no-repeat \9;
margin: 5px 1px 1px;
cursor: pointer;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .filelist div.file-panel span.rotateLeft {
display:none;
background-position: 0 -24px;
}
#upload .filelist div.file-panel span.rotateLeft:hover {
background-position: 0 0;
}
#upload .filelist div.file-panel span.rotateRight {
display:none;
background-position: -24px -24px;
}
#upload .filelist div.file-panel span.rotateRight:hover {
background-position: -24px 0;
}
#upload .filelist div.file-panel span.cancel {
background-position: -48px -24px;
}
#upload .filelist div.file-panel span.cancel:hover {
background-position: -48px 0;
}
#upload .statusBar {
height: 45px;
border-bottom: 1px solid #dadada;
margin: 0 10px;
padding: 0;
line-height: 45px;
vertical-align: middle;
position: relative;
}
#upload .statusBar .progress {
border: 1px solid #1483d8;
width: 198px;
background: #fff;
height: 18px;
position: absolute;
top: 12px;
display: none;
text-align: center;
line-height: 18px;
color: #6dbfff;
margin: 0 10px 0 0;
}
#upload .statusBar .progress span.percentage {
width: 0;
height: 100%;
left: 0;
top: 0;
background: #1483d8;
position: absolute;
}
#upload .statusBar .progress span.text {
position: relative;
z-index: 10;
}
#upload .statusBar .info {
display: inline-block;
font-size: 14px;
color: #666666;
}
#upload .statusBar .btns {
position: absolute;
top: 7px;
right: 0;
line-height: 30px;
}
#filePickerBtn {
display: inline-block;
float: left;
}
#upload .statusBar .btns .webuploader-pick,
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-uploading,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #ffffff;
border: 1px solid #cfcfcf;
color: #565656;
padding: 0 18px;
display: inline-block;
border-radius: 3px;
margin-left: 10px;
cursor: pointer;
font-size: 14px;
float: left;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .statusBar .btns .webuploader-pick-hover,
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-uploading:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #f0f0f0;
}
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-paused{
background: #00b7ee;
color: #fff;
border-color: transparent;
}
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover{
background: #00a2d4;
}
#upload .statusBar .btns .uploadBtn.disabled {
pointer-events: none;
filter:alpha(opacity=60);
-moz-opacity:0.6;
-khtml-opacity: 0.6;
opacity: 0.6;
}
/* 图片管理样式 */
#online {
width: 100%;
height: 336px;
padding: 10px 0 0 0;
}
#online #fileList{
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
position: relative;
}
#online ul {
display: block;
list-style: none;
margin: 0;
padding: 0;
}
#online li {
float: left;
display: block;
list-style: none;
padding: 0;
width: 113px;
height: 113px;
margin: 0 0 9px 9px;
*margin: 0 0 6px 6px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
position: relative;
}
#online li.clearFloat {
float: none;
clear: both;
display: block;
width:0;
height:0;
margin: 0;
padding: 0;
}
#online li img {
cursor: pointer;
}
#online li div.file-wrapper {
cursor: pointer;
position: absolute;
display: block;
width: 111px;
height: 111px;
border: 1px solid #eee;
background: url("./images/bg.png") repeat;
}
#online li div span.file-title{
display: block;
padding: 0 3px;
margin: 3px 0 0 0;
font-size: 12px;
height: 13px;
color: #555555;
text-align: center;
width: 107px;
white-space: nowrap;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
}
#online li .icon {
cursor: pointer;
width: 113px;
height: 113px;
position: absolute;
top: 0;
left: 0;
z-index: 2;
border: 0;
background-repeat: no-repeat;
}
#online li .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
}
#online li.selected .icon {
background-image: url(images/success.png);
background-image: url(images/success.gif) \9;
background-position: 75px 75px;
}
#online li.selected .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
}
/* 在线文件的文件预览图标 */
i.file-preview {
display: block;
margin: 10px auto;
width: 70px;
height: 70px;
background-image: url("./images/file-icons.png");
background-image: url("./images/file-icons.gif") \9;
background-position: -140px center;
background-repeat: no-repeat;
}
i.file-preview.file-type-dir{
background-position: 0 center;
}
i.file-preview.file-type-file{
background-position: -140px center;
}
i.file-preview.file-type-filelist{
background-position: -210px center;
}
i.file-preview.file-type-zip,
i.file-preview.file-type-rar,
i.file-preview.file-type-7z,
i.file-preview.file-type-tar,
i.file-preview.file-type-gz,
i.file-preview.file-type-bz2{
background-position: -280px center;
}
i.file-preview.file-type-xls,
i.file-preview.file-type-xlsx{
background-position: -350px center;
}
i.file-preview.file-type-doc,
i.file-preview.file-type-docx{
background-position: -420px center;
}
i.file-preview.file-type-ppt,
i.file-preview.file-type-pptx{
background-position: -490px center;
}
i.file-preview.file-type-vsd{
background-position: -560px center;
}
i.file-preview.file-type-pdf{
background-position: -630px center;
}
i.file-preview.file-type-txt,
i.file-preview.file-type-md,
i.file-preview.file-type-json,
i.file-preview.file-type-htm,
i.file-preview.file-type-xml,
i.file-preview.file-type-html,
i.file-preview.file-type-js,
i.file-preview.file-type-css,
i.file-preview.file-type-php,
i.file-preview.file-type-jsp,
i.file-preview.file-type-asp{
background-position: -700px center;
}
i.file-preview.file-type-apk{
background-position: -770px center;
}
i.file-preview.file-type-exe{
background-position: -840px center;
}
i.file-preview.file-type-ipa{
background-position: -910px center;
}
i.file-preview.file-type-mp4,
i.file-preview.file-type-swf,
i.file-preview.file-type-mkv,
i.file-preview.file-type-avi,
i.file-preview.file-type-flv,
i.file-preview.file-type-mov,
i.file-preview.file-type-mpg,
i.file-preview.file-type-mpeg,
i.file-preview.file-type-ogv,
i.file-preview.file-type-webm,
i.file-preview.file-type-rm,
i.file-preview.file-type-rmvb{
background-position: -980px center;
}
i.file-preview.file-type-ogg,
i.file-preview.file-type-wav,
i.file-preview.file-type-wmv,
i.file-preview.file-type-mid,
i.file-preview.file-type-mp3{
background-position: -1050px center;
}
i.file-preview.file-type-jpg,
i.file-preview.file-type-jpeg,
i.file-preview.file-type-gif,
i.file-preview.file-type-bmp,
i.file-preview.file-type-png,
i.file-preview.file-type-psd{
background-position: -140px center;
}
================================================
FILE: static/common/user/uedit/dialogs/attachment/attachment.html
================================================
ueditor图片对话框
================================================
FILE: static/common/user/uedit/dialogs/attachment/attachment.js
================================================
/**
* User: Jinqn
* Date: 14-04-08
* Time: 下午16:34
* 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片
*/
(function () {
var uploadFile,
onlineFile;
window.onload = function () {
initTabs();
initButtons();
};
/* 初始化tab标签 */
function initTabs() {
var tabs = $G('tabhead').children;
for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) {
var target = e.target || e.srcElement;
setTabFocus(target.getAttribute('data-content-id'));
});
}
setTabFocus('upload');
}
/* 初始化tabbody */
function setTabFocus(id) {
if(!id) return;
var i, bodyId, tabs = $G('tabhead').children;
for (i = 0; i < tabs.length; i++) {
bodyId = tabs[i].getAttribute('data-content-id')
if (bodyId == id) {
domUtils.addClass(tabs[i], 'focus');
domUtils.addClass($G(bodyId), 'focus');
} else {
domUtils.removeClasses(tabs[i], 'focus');
domUtils.removeClasses($G(bodyId), 'focus');
}
}
switch (id) {
case 'upload':
uploadFile = uploadFile || new UploadFile('queueList');
break;
case 'online':
onlineFile = onlineFile || new OnlineFile('fileList');
break;
}
}
/* 初始化onok事件 */
function initButtons() {
dialog.onok = function () {
var list = [], id, tabs = $G('tabhead').children;
for (var i = 0; i < tabs.length; i++) {
if (domUtils.hasClass(tabs[i], 'focus')) {
id = tabs[i].getAttribute('data-content-id');
break;
}
}
switch (id) {
case 'upload':
list = uploadFile.getInsertList();
var count = uploadFile.getQueueCount();
if (count) {
$('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ' ');
return false;
}
break;
case 'online':
list = onlineFile.getInsertList();
break;
}
editor.execCommand('insertfile', list);
};
}
/* 上传附件 */
function UploadFile(target) {
this.$wrap = target.constructor == String ? $('#' + target) : $(target);
this.init();
}
UploadFile.prototype = {
init: function () {
this.fileList = [];
this.initContainer();
this.initUploader();
},
initContainer: function () {
this.$queue = this.$wrap.find('.filelist');
},
/* 初始化容器 */
initUploader: function () {
var _this = this,
$ = jQuery, // just in case. Make sure it's not an other libaray.
$wrap = _this.$wrap,
// 图片容器
$queue = $wrap.find('.filelist'),
// 状态栏,包括进度和控制按钮
$statusBar = $wrap.find('.statusBar'),
// 文件总体选择信息。
$info = $statusBar.find('.info'),
// 上传按钮
$upload = $wrap.find('.uploadBtn'),
// 上传按钮
$filePickerBtn = $wrap.find('.filePickerBtn'),
// 上传按钮
$filePickerBlock = $wrap.find('.filePickerBlock'),
// 没选择文件之前的内容。
$placeHolder = $wrap.find('.placeholder'),
// 总体进度条
$progress = $statusBar.find('.progress').hide(),
// 添加的文件数量
fileCount = 0,
// 添加的文件总大小
fileSize = 0,
// 优化retina, 在retina下这个值是2
ratio = window.devicePixelRatio || 1,
// 缩略图大小
thumbnailWidth = 113 * ratio,
thumbnailHeight = 113 * ratio,
// 可能有pedding, ready, uploading, confirm, done.
state = '',
// 所有文件的进度信息,key为file id
percentages = {},
supportTransition = (function () {
var s = document.createElement('p').style,
r = 'transition' in s ||
'WebkitTransition' in s ||
'MozTransition' in s ||
'msTransition' in s ||
'OTransition' in s;
s = null;
return r;
})(),
// WebUploader实例
uploader,
actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')),
fileMaxSize = editor.getOpt('fileMaxSize'),
acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');;
if (!WebUploader.Uploader.support()) {
$('#filePickerReady').after($('').html(lang.errorNotSupport)).hide();
return;
} else if (!editor.getOpt('fileActionName')) {
$('#filePickerReady').after($('
').html(lang.errorLoadConfig)).hide();
return;
}
uploader = _this.uploader = WebUploader.create({
pick: {
id: '#filePickerReady',
label: lang.uploadSelectFile
},
swf: '../../third-party/webuploader/Uploader.swf',
server: actionUrl,
fileVal: editor.getOpt('fileFieldName'),
duplicate: true,
fileSingleSizeLimit: fileMaxSize,
compress: false
});
uploader.addButton({
id: '#filePickerBlock'
});
uploader.addButton({
id: '#filePickerBtn',
label: lang.uploadAddFile
});
setState('pedding');
// 当有文件添加进来时执行,负责view的创建
function addFile(file) {
var $li = $('
' +
'' + file.name + '
' +
'
' +
'
' +
' '),
$btns = $('
' +
'' + lang.uploadDelete + ' ' +
'' + lang.uploadTurnRight + ' ' +
'' + lang.uploadTurnLeft + '
').appendTo($li),
$prgress = $li.find('p.progress span'),
$wrap = $li.find('p.imgWrap'),
$info = $('
').hide().appendTo($li),
showError = function (code) {
switch (code) {
case 'exceed_size':
text = lang.errorExceedSize;
break;
case 'interrupt':
text = lang.errorInterrupt;
break;
case 'http':
text = lang.errorHttp;
break;
case 'not_allow_type':
text = lang.errorFileType;
break;
default:
text = lang.errorUploadRetry;
break;
}
$info.text(text).show();
};
if (file.getStatus() === 'invalid') {
showError(file.statusText);
} else {
$wrap.text(lang.uploadPreview);
if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) {
$wrap.empty().addClass('notimage').append('
' +
'
' + file.name + ' ');
} else {
if (browser.ie && browser.version <= 7) {
$wrap.text(lang.uploadNoPreview);
} else {
uploader.makeThumb(file, function (error, src) {
if (error || !src) {
$wrap.text(lang.uploadNoPreview);
} else {
var $img = $('
');
$wrap.empty().append($img);
$img.on('error', function () {
$wrap.text(lang.uploadNoPreview);
});
}
}, thumbnailWidth, thumbnailHeight);
}
}
percentages[ file.id ] = [ file.size, 0 ];
file.rotation = 0;
/* 检查文件格式 */
if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
showError('not_allow_type');
uploader.removeFile(file);
}
}
file.on('statuschange', function (cur, prev) {
if (prev === 'progress') {
$prgress.hide().width(0);
} else if (prev === 'queued') {
$li.off('mouseenter mouseleave');
$btns.remove();
}
// 成功
if (cur === 'error' || cur === 'invalid') {
showError(file.statusText);
percentages[ file.id ][ 1 ] = 1;
} else if (cur === 'interrupt') {
showError('interrupt');
} else if (cur === 'queued') {
percentages[ file.id ][ 1 ] = 0;
} else if (cur === 'progress') {
$info.hide();
$prgress.css('display', 'block');
} else if (cur === 'complete') {
}
$li.removeClass('state-' + prev).addClass('state-' + cur);
});
$li.on('mouseenter', function () {
$btns.stop().animate({height: 30});
});
$li.on('mouseleave', function () {
$btns.stop().animate({height: 0});
});
$btns.on('click', 'span', function () {
var index = $(this).index(),
deg;
switch (index) {
case 0:
uploader.removeFile(file);
return;
case 1:
file.rotation += 90;
break;
case 2:
file.rotation -= 90;
break;
}
if (supportTransition) {
deg = 'rotate(' + file.rotation + 'deg)';
$wrap.css({
'-webkit-transform': deg,
'-mos-transform': deg,
'-o-transform': deg,
'transform': deg
});
} else {
$wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
}
});
$li.insertBefore($filePickerBlock);
}
// 负责view的销毁
function removeFile(file) {
var $li = $('#' + file.id);
delete percentages[ file.id ];
updateTotalProgress();
$li.off().find('.file-panel').off().end().remove();
}
function updateTotalProgress() {
var loaded = 0,
total = 0,
spans = $progress.children(),
percent;
$.each(percentages, function (k, v) {
total += v[ 0 ];
loaded += v[ 0 ] * v[ 1 ];
});
percent = total ? loaded / total : 0;
spans.eq(0).text(Math.round(percent * 100) + '%');
spans.eq(1).css('width', Math.round(percent * 100) + '%');
updateStatus();
}
function setState(val, files) {
if (val != state) {
var stats = uploader.getStats();
$upload.removeClass('state-' + state);
$upload.addClass('state-' + val);
switch (val) {
/* 未选择文件 */
case 'pedding':
$queue.addClass('element-invisible');
$statusBar.addClass('element-invisible');
$placeHolder.removeClass('element-invisible');
$progress.hide(); $info.hide();
uploader.refresh();
break;
/* 可以开始上传 */
case 'ready':
$placeHolder.addClass('element-invisible');
$queue.removeClass('element-invisible');
$statusBar.removeClass('element-invisible');
$progress.hide(); $info.show();
$upload.text(lang.uploadStart);
uploader.refresh();
break;
/* 上传中 */
case 'uploading':
$progress.show(); $info.hide();
$upload.text(lang.uploadPause);
break;
/* 暂停上传 */
case 'paused':
$progress.show(); $info.hide();
$upload.text(lang.uploadContinue);
break;
case 'confirm':
$progress.show(); $info.hide();
$upload.text(lang.uploadStart);
stats = uploader.getStats();
if (stats.successNum && !stats.uploadFailNum) {
setState('finish');
return;
}
break;
case 'finish':
$progress.hide(); $info.show();
if (stats.uploadFailNum) {
$upload.text(lang.uploadRetry);
} else {
$upload.text(lang.uploadStart);
}
break;
}
state = val;
updateStatus();
}
if (!_this.getQueueCount()) {
$upload.addClass('disabled')
} else {
$upload.removeClass('disabled')
}
}
function updateStatus() {
var text = '', stats;
if (state === 'ready') {
text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
} else if (state === 'confirm') {
stats = uploader.getStats();
if (stats.uploadFailNum) {
text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
}
} else {
stats = uploader.getStats();
text = lang.updateStatusFinish.replace('_', fileCount).
replace('_KB', WebUploader.formatSize(fileSize)).
replace('_', stats.successNum);
if (stats.uploadFailNum) {
text += lang.updateStatusError.replace('_', stats.uploadFailNum);
}
}
$info.html(text);
}
uploader.on('fileQueued', function (file) {
fileCount++;
fileSize += file.size;
if (fileCount === 1) {
$placeHolder.addClass('element-invisible');
$statusBar.show();
}
addFile(file);
});
uploader.on('fileDequeued', function (file) {
fileCount--;
fileSize -= file.size;
removeFile(file);
updateTotalProgress();
});
uploader.on('filesQueued', function (file) {
if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
setState('ready');
}
updateTotalProgress();
});
uploader.on('all', function (type, files) {
switch (type) {
case 'uploadFinished':
setState('confirm', files);
break;
case 'startUpload':
/* 添加额外的GET参数 */
var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params);
uploader.option('server', url);
setState('uploading', files);
break;
case 'stopUpload':
setState('paused', files);
break;
}
});
uploader.on('uploadBeforeSend', function (file, data, header) {
//这里可以通过data对象添加POST参数
header['X_Requested_With'] = 'XMLHttpRequest';
});
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress span');
$percent.css('width', percentage * 100 + '%');
percentages[ file.id ][ 1 ] = percentage;
updateTotalProgress();
});
uploader.on('uploadSuccess', function (file, ret) {
var $file = $('#' + file.id);
try {
var responseText = (ret._raw || ret),
json = utils.str2json(responseText);
if (json.state == 'SUCCESS') {
_this.fileList[$file.index()] = json;
$file.append('
');
} else {
$file.find('.error').text(json.state).show();
}
} catch (e) {
$file.find('.error').text(lang.errorServerUpload).show();
}
});
uploader.on('uploadError', function (file, code) {
});
uploader.on('error', function (code, file) {
if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
addFile(file);
}
});
uploader.on('uploadComplete', function (file, ret) {
});
$upload.on('click', function () {
if ($(this).hasClass('disabled')) {
return false;
}
if (state === 'ready') {
uploader.upload();
} else if (state === 'paused') {
uploader.upload();
} else if (state === 'uploading') {
uploader.stop();
}
});
$upload.addClass('state-' + state);
updateTotalProgress();
},
getQueueCount: function () {
var file, i, status, readyFile = 0, files = this.uploader.getFiles();
for (i = 0; file = files[i++]; ) {
status = file.getStatus();
if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
}
return readyFile;
},
getInsertList: function () {
var i, link, data, list = [],
prefix = editor.getOpt('fileUrlPrefix');
for (i = 0; i < this.fileList.length; i++) {
data = this.fileList[i];
link = data.url;
list.push({
title: data.original || link.substr(link.lastIndexOf('/') + 1),
url: prefix + link
});
}
return list;
}
};
/* 在线附件 */
function OnlineFile(target) {
this.container = utils.isString(target) ? document.getElementById(target) : target;
this.init();
}
OnlineFile.prototype = {
init: function () {
this.initContainer();
this.initEvents();
this.initData();
},
/* 初始化容器 */
initContainer: function () {
this.container.innerHTML = '';
this.list = document.createElement('ul');
this.clearFloat = document.createElement('li');
domUtils.addClass(this.list, 'list');
domUtils.addClass(this.clearFloat, 'clearFloat');
this.list.appendChild(this.clearFloat);
this.container.appendChild(this.list);
},
/* 初始化滚动事件,滚动到地步自动拉取数据 */
initEvents: function () {
var _this = this;
/* 滚动拉取图片 */
domUtils.on($G('fileList'), 'scroll', function(e){
var panel = this;
if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
_this.getFileData();
}
});
/* 选中图片 */
domUtils.on(this.list, 'click', function (e) {
var target = e.target || e.srcElement,
li = target.parentNode;
if (li.tagName.toLowerCase() == 'li') {
if (domUtils.hasClass(li, 'selected')) {
domUtils.removeClasses(li, 'selected');
} else {
domUtils.addClass(li, 'selected');
}
}
});
},
/* 初始化第一次的数据 */
initData: function () {
/* 拉取数据需要使用的值 */
this.state = 0;
this.listSize = editor.getOpt('fileManagerListSize');
this.listIndex = 0;
this.listEnd = false;
/* 第一次拉取数据 */
this.getFileData();
},
/* 向后台拉取图片列表数据 */
getFileData: function () {
var _this = this;
if(!_this.listEnd && !this.isLoadingData) {
this.isLoadingData = true;
ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), {
timeout: 100000,
data: utils.extend({
start: this.listIndex,
size: this.listSize
}, editor.queryCommandValue('serverparam')),
method: 'get',
onsuccess: function (r) {
try {
var json = eval('(' + r.responseText + ')');
if (json.state == 'SUCCESS') {
_this.pushData(json.list);
_this.listIndex = parseInt(json.start) + parseInt(json.list.length);
if(_this.listIndex >= json.total) {
_this.listEnd = true;
}
_this.isLoadingData = false;
}
} catch (e) {
if(r.responseText.indexOf('ue_separate_ue') != -1) {
var list = r.responseText.split(r.responseText);
_this.pushData(list);
_this.listIndex = parseInt(list.length);
_this.listEnd = true;
_this.isLoadingData = false;
}
}
},
onerror: function () {
_this.isLoadingData = false;
}
});
}
},
/* 添加图片到列表界面上 */
pushData: function (list) {
var i, item, img, filetype, preview, icon, _this = this,
urlPrefix = editor.getOpt('fileManagerUrlPrefix');
for (i = 0; i < list.length; i++) {
if(list[i] && list[i].url) {
item = document.createElement('li');
icon = document.createElement('span');
filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1);
if ( "png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1 ) {
preview = document.createElement('img');
domUtils.on(preview, 'load', (function(image){
return function(){
_this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
};
})(preview));
preview.width = 113;
preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
} else {
var ic = document.createElement('i'),
textSpan = document.createElement('span');
textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1);
preview = document.createElement('div');
preview.appendChild(ic);
preview.appendChild(textSpan);
domUtils.addClass(preview, 'file-wrapper');
domUtils.addClass(textSpan, 'file-title');
domUtils.addClass(ic, 'file-type-' + filetype);
domUtils.addClass(ic, 'file-preview');
}
domUtils.addClass(icon, 'icon');
item.setAttribute('data-url', urlPrefix + list[i].url);
if (list[i].original) {
item.setAttribute('data-title', list[i].original);
}
item.appendChild(preview);
item.appendChild(icon);
this.list.insertBefore(item, this.clearFloat);
}
}
},
/* 改变图片大小 */
scale: function (img, w, h, type) {
var ow = img.width,
oh = img.height;
if (type == 'justify') {
if (ow >= oh) {
img.width = w;
img.height = h * oh / ow;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w * ow / oh;
img.height = h;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
} else {
if (ow >= oh) {
img.width = w * ow / oh;
img.height = h;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w;
img.height = h * oh / ow;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
}
},
getInsertList: function () {
var i, lis = this.list.children, list = [];
for (i = 0; i < lis.length; i++) {
if (domUtils.hasClass(lis[i], 'selected')) {
var url = lis[i].getAttribute('data-url');
var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1);
list.push({
title: title,
url: url
});
}
}
return list;
}
};
})();
================================================
FILE: static/common/user/uedit/dialogs/background/background.css
================================================
.wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative}
.tabbody{height:225px;}
.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;}
.tabbody .focus { display: block;}
body{font-size: 12px;color: #888;overflow: hidden;}
input,label{vertical-align:middle}
.clear{clear: both;}
.pl{padding-left: 18px;padding-left: 23px\9;}
#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;}
#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;}
#imageList img {cursor: pointer;border: 2px solid white;}
.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;}
.content div{margin: 10px 0 10px 5px;}
.content .iptradio{margin: 0px 5px 5px 0px;}
.txt{width:280px;}
.wrapcolor{height: 19px;}
div.color{float: left;margin: 0;}
#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;}
div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;}
#custom input{height: 15px;min-height: 15px;width:20px;}
#repeatType{width:100px;}
/* 图片管理样式 */
#imgManager {
width: 100%;
height: 225px;
}
#imgManager #imageList{
width: 100%;
overflow-x: hidden;
overflow-y: auto;
}
#imgManager ul {
display: block;
list-style: none;
margin: 0;
padding: 0;
}
#imgManager li {
float: left;
display: block;
list-style: none;
padding: 0;
width: 113px;
height: 113px;
margin: 9px 0 0 19px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
position: relative;
}
#imgManager li.clearFloat {
float: none;
clear: both;
display: block;
width:0;
height:0;
margin: 0;
padding: 0;
}
#imgManager li img {
cursor: pointer;
}
#imgManager li .icon {
cursor: pointer;
width: 113px;
height: 113px;
position: absolute;
top: 0;
left: 0;
z-index: 2;
border: 0;
background-repeat: no-repeat;
}
#imgManager li .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
}
#imgManager li.selected .icon {
background-image: url(images/success.png);
background-position: 75px 75px;
}
#imgManager li.selected .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
}
================================================
FILE: static/common/user/uedit/dialogs/background/background.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/background/background.js
================================================
(function () {
var onlineImage,
backupStyle = editor.queryCommandValue('background');
window.onload = function () {
initTabs();
initColorSelector();
};
/* 初始化tab标签 */
function initTabs(){
var tabs = $G('tabHeads').children;
for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) {
var target = e.target || e.srcElement;
for (var j = 0; j < tabs.length; j++) {
if(tabs[j] == target){
tabs[j].className = "focus";
var contentId = tabs[j].getAttribute('data-content-id');
$G(contentId).style.display = "block";
if(contentId == 'imgManager') {
initImagePanel();
}
}else {
tabs[j].className = "";
$G(tabs[j].getAttribute('data-content-id')).style.display = "none";
}
}
});
}
}
/* 初始化颜色设置 */
function initColorSelector () {
var obj = editor.queryCommandValue('background');
if (obj) {
var color = obj['background-color'],
repeat = obj['background-repeat'] || 'repeat',
image = obj['background-image'] || '',
position = obj['background-position'] || 'center center',
pos = position.split(' '),
x = parseInt(pos[0]) || 0,
y = parseInt(pos[1]) || 0;
if(repeat == 'no-repeat' && (x || y)) repeat = 'self';
image = image.match(/url[\s]*\(([^\)]*)\)/);
image = image ? image[1]:'';
updateFormState('colored', color, image, repeat, x, y);
} else {
updateFormState();
}
var updateHandler = function () {
updateFormState();
updateBackground();
}
domUtils.on($G('nocolorRadio'), 'click', updateBackground);
domUtils.on($G('coloredRadio'), 'click', updateHandler);
domUtils.on($G('url'), 'keyup', function(){
if($G('url').value && $G('alignment').style.display == "none") {
utils.each($G('repeatType').children, function(item){
item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false);
});
}
updateHandler();
});
domUtils.on($G('repeatType'), 'change', updateHandler);
domUtils.on($G('x'), 'keyup', updateBackground);
domUtils.on($G('y'), 'keyup', updateBackground);
initColorPicker();
}
/* 初始化颜色选择器 */
function initColorPicker() {
var me = editor,
cp = $G("colorPicker");
/* 生成颜色选择器ui对象 */
var popup = new UE.ui.Popup({
content: new UE.ui.ColorPicker({
noColorText: me.getLang("clearColor"),
editor: me,
onpickcolor: function (t, color) {
updateFormState('colored', color);
updateBackground();
UE.ui.Popup.postHide();
},
onpicknocolor: function (t, color) {
updateFormState('colored', 'transparent');
updateBackground();
UE.ui.Popup.postHide();
}
}),
editor: me,
onhide: function () {
}
});
/* 设置颜色选择器 */
domUtils.on(cp, "click", function () {
popup.showAnchor(this);
});
domUtils.on(document, 'mousedown', function (evt) {
var el = evt.target || evt.srcElement;
UE.ui.Popup.postHide(el);
});
domUtils.on(window, 'scroll', function () {
UE.ui.Popup.postHide();
});
}
/* 初始化在线图片列表 */
function initImagePanel() {
onlineImage = onlineImage || new OnlineImage('imageList');
}
/* 更新背景色设置面板 */
function updateFormState (radio, color, url, align, x, y) {
var nocolorRadio = $G('nocolorRadio'),
coloredRadio = $G('coloredRadio');
if(radio) {
nocolorRadio.checked = (radio == 'colored' ? false:'checked');
coloredRadio.checked = (radio == 'colored' ? 'checked':false);
}
if(color) {
domUtils.setStyle($G("colorPicker"), "background-color", color);
}
if(url && /^\//.test(url)) {
var a = document.createElement('a');
a.href = url;
browser.ie && (a.href = a.href);
url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash);
}
if(url || url === '') {
$G('url').value = url;
}
if(align) {
utils.each($G('repeatType').children, function(item){
item.selected = (align == item.getAttribute('value') ? 'selected':false);
});
}
if(x || y) {
$G('x').value = parseInt(x) || 0;
$G('y').value = parseInt(y) || 0;
}
$G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none';
$G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none';
}
/* 更新背景颜色 */
function updateBackground () {
if ($G('coloredRadio').checked) {
var color = domUtils.getStyle($G("colorPicker"), "background-color"),
bgimg = $G("url").value,
align = $G("repeatType").value,
backgroundObj = {
"background-repeat": "no-repeat",
"background-position": "center center"
};
if (color) backgroundObj["background-color"] = color;
if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')';
if (align == 'self') {
backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px";
} else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') {
backgroundObj["background-repeat"] = align;
}
editor.execCommand('background', backgroundObj);
} else {
editor.execCommand('background', null);
}
}
/* 在线图片 */
function OnlineImage(target) {
this.container = utils.isString(target) ? document.getElementById(target) : target;
this.init();
}
OnlineImage.prototype = {
init: function () {
this.reset();
this.initEvents();
},
/* 初始化容器 */
initContainer: function () {
this.container.innerHTML = '';
this.list = document.createElement('ul');
this.clearFloat = document.createElement('li');
domUtils.addClass(this.list, 'list');
domUtils.addClass(this.clearFloat, 'clearFloat');
this.list.id = 'imageListUl';
this.list.appendChild(this.clearFloat);
this.container.appendChild(this.list);
},
/* 初始化滚动事件,滚动到地步自动拉取数据 */
initEvents: function () {
var _this = this;
/* 滚动拉取图片 */
domUtils.on($G('imageList'), 'scroll', function(e){
var panel = this;
if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
_this.getImageData();
}
});
/* 选中图片 */
domUtils.on(this.container, 'click', function (e) {
var target = e.target || e.srcElement,
li = target.parentNode,
nodes = $G('imageListUl').childNodes;
if (li.tagName.toLowerCase() == 'li') {
updateFormState('nocolor', null, '');
for (var i = 0, node; node = nodes[i++];) {
if (node == li && !domUtils.hasClass(node, 'selected')) {
domUtils.addClass(node, 'selected');
updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat');
} else {
domUtils.removeClasses(node, 'selected');
}
}
updateBackground();
}
});
},
/* 初始化第一次的数据 */
initData: function () {
/* 拉取数据需要使用的值 */
this.state = 0;
this.listSize = editor.getOpt('imageManagerListSize');
this.listIndex = 0;
this.listEnd = false;
/* 第一次拉取数据 */
this.getImageData();
},
/* 重置界面 */
reset: function() {
this.initContainer();
this.initData();
},
/* 向后台拉取图片列表数据 */
getImageData: function () {
var _this = this;
if(!_this.listEnd && !this.isLoadingData) {
this.isLoadingData = true;
var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),
isJsonp = utils.isCrossDomainUrl(url);
ajax.request(url, {
'timeout': 100000,
'dataType': isJsonp ? 'jsonp':'',
'data': utils.extend({
start: this.listIndex,
size: this.listSize
}, editor.queryCommandValue('serverparam')),
'method': 'get',
'onsuccess': function (r) {
try {
var json = isJsonp ? r:eval('(' + r.responseText + ')');
if (json.state == 'SUCCESS') {
_this.pushData(json.list);
_this.listIndex = parseInt(json.start) + parseInt(json.list.length);
if(_this.listIndex >= json.total) {
_this.listEnd = true;
}
_this.isLoadingData = false;
}
} catch (e) {
if(r.responseText.indexOf('ue_separate_ue') != -1) {
var list = r.responseText.split(r.responseText);
_this.pushData(list);
_this.listIndex = parseInt(list.length);
_this.listEnd = true;
_this.isLoadingData = false;
}
}
},
'onerror': function () {
_this.isLoadingData = false;
}
});
}
},
/* 添加图片到列表界面上 */
pushData: function (list) {
var i, item, img, icon, _this = this,
urlPrefix = editor.getOpt('imageManagerUrlPrefix');
for (i = 0; i < list.length; i++) {
if(list[i] && list[i].url) {
item = document.createElement('li');
img = document.createElement('img');
icon = document.createElement('span');
domUtils.on(img, 'load', (function(image){
return function(){
_this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
}
})(img));
img.width = 113;
img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
img.setAttribute('_src', urlPrefix + list[i].url);
domUtils.addClass(icon, 'icon');
item.appendChild(img);
item.appendChild(icon);
this.list.insertBefore(item, this.clearFloat);
}
}
},
/* 改变图片大小 */
scale: function (img, w, h, type) {
var ow = img.width,
oh = img.height;
if (type == 'justify') {
if (ow >= oh) {
img.width = w;
img.height = h * oh / ow;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w * ow / oh;
img.height = h;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
} else {
if (ow >= oh) {
img.width = w * ow / oh;
img.height = h;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w;
img.height = h * oh / ow;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
}
},
getInsertList: function () {
var i, lis = this.list.children, list = [], align = getAlign();
for (i = 0; i < lis.length; i++) {
if (domUtils.hasClass(lis[i], 'selected')) {
var img = lis[i].firstChild,
src = img.getAttribute('_src');
list.push({
src: src,
_src: src,
floatStyle: align
});
}
}
return list;
}
};
dialog.onok = function () {
updateBackground();
editor.fireEvent('saveScene');
};
dialog.oncancel = function () {
editor.execCommand('background', backupStyle);
};
})();
================================================
FILE: static/common/user/uedit/dialogs/charts/chart.config.js
================================================
/*
* 图表配置文件
* */
//不同类型的配置
var typeConfig = [
{
chart: {
type: 'line'
},
plotOptions: {
line: {
dataLabels: {
enabled: false
},
enableMouseTracking: true
}
}
}, {
chart: {
type: 'line'
},
plotOptions: {
line: {
dataLabels: {
enabled: true
},
enableMouseTracking: false
}
}
}, {
chart: {
type: 'area'
}
}, {
chart: {
type: 'bar'
}
}, {
chart: {
type: 'column'
}
}, {
chart: {
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: true,
color: '#000000',
connectorColor: '#000000',
formatter: function() {
return '
'+ this.point.name +' : '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %';
}
}
}
}
}
];
================================================
FILE: static/common/user/uedit/dialogs/charts/charts.css
================================================
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow-x: hidden;
}
.main {
width: 100%;
overflow: hidden;
}
.table-view {
height: 100%;
float: left;
margin: 20px;
width: 40%;
}
.table-view .table-container {
width: 100%;
margin-bottom: 50px;
overflow: scroll;
}
.table-view th {
padding: 5px 10px;
background-color: #F7F7F7;
}
.table-view td {
width: 50px;
text-align: center;
padding:0;
}
.table-container input {
width: 40px;
padding: 5px;
border: none;
outline: none;
}
.table-view caption {
font-size: 18px;
text-align: left;
}
.charts-view {
/*margin-left: 49%!important;*/
width: 50%;
margin-left: 49%;
height: 400px;
}
.charts-container {
border-left: 1px solid #c3c3c3;
}
.charts-format fieldset {
padding-left: 20px;
margin-bottom: 50px;
}
.charts-format legend {
padding-left: 10px;
padding-right: 10px;
}
.format-item-container {
padding: 20px;
}
.format-item-container label {
display: block;
margin: 10px 0;
}
.charts-format .data-item {
border: 1px solid black;
outline: none;
padding: 2px 3px;
}
/* 图表类型 */
.charts-type {
margin-top: 50px;
height: 300px;
}
.scroll-view {
border: 1px solid #c3c3c3;
border-left: none;
border-right: none;
overflow: hidden;
}
.scroll-container {
margin: 20px;
width: 100%;
overflow: hidden;
}
.scroll-bed {
width: 10000px;
_margin-top: 20px;
-webkit-transition: margin-left .5s ease;
-moz-transition: margin-left .5s ease;
transition: margin-left .5s ease;
}
.view-box {
display: inline-block;
*display: inline;
*zoom: 1;
margin-right: 20px;
border: 2px solid white;
line-height: 0;
overflow: hidden;
cursor: pointer;
}
.view-box img {
border: 1px solid #cecece;
}
.view-box.selected {
border-color: #7274A7;
}
.button-container {
margin-bottom: 20px;
text-align: center;
}
.button-container a {
display: inline-block;
width: 100px;
height: 25px;
line-height: 25px;
border: 1px solid #c2ccd1;
margin-right: 30px;
text-decoration: none;
color: black;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
}
.button-container a:HOVER {
background: #fcfcfc;
}
.button-container a:ACTIVE {
border-top-color: #c2ccd1;
box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1);
}
.edui-charts-not-data {
height: 100px;
line-height: 100px;
text-align: center;
}
================================================
FILE: static/common/user/uedit/dialogs/charts/charts.html
================================================
chart
================================================
FILE: static/common/user/uedit/dialogs/charts/charts.js
================================================
/*
* 图片转换对话框脚本
**/
var tableData = [],
//编辑器页面table
editorTable = null,
chartsConfig = window.typeConfig,
resizeTimer = null,
//初始默认图表类型
currentChartType = 0;
window.onload = function () {
editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true);
//未找到表格, 显示错误页面
if ( !editorTable ) {
document.body.innerHTML = "
未找到数据
";
return;
}
//初始化图表类型选择
initChartsTypeView();
renderTable( editorTable );
initEvent();
initUserConfig( editorTable.getAttribute( "data-chart" ) );
$( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" );
updateViewType( currentChartType );
dialog.addListener( "resize", function () {
if ( resizeTimer != null ) {
window.clearTimeout( resizeTimer );
}
resizeTimer = window.setTimeout( function () {
resizeTimer = null;
renderCharts();
}, 500 );
} );
};
function initChartsTypeView () {
var contents = [];
for ( var i = 0, len = chartsConfig.length; i
' );
}
$( "#scrollBed" ).html( contents.join( "" ) );
}
//渲染table, 以便用户修改数据
function renderTable ( table ) {
var tableHtml = [];
//构造数据
for ( var i = 0, row; row = table.rows[ i ]; i++ ) {
tableData[ i ] = [];
tableHtml[ i ] = [];
for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
var value = getCellValue( cell );
if ( i > 0 && j > 0 ) {
value = +value;
}
if ( i === 0 || j === 0 ) {
tableHtml[ i ].push( '
'+ value +' ' );
} else {
tableHtml[ i ].push( '
' );
}
tableData[ i ][ j ] = value;
}
tableHtml[ i ] = tableHtml[ i ].join( "" );
}
//draw 表格
$( "#tableContainer" ).html( '
'+ tableHtml.join( " " ) +'
' );
}
/*
* 根据表格已有的图表属性初始化当前图表属性
*/
function initUserConfig ( config ) {
var parsedConfig = {};
if ( !config ) {
return;
}
config = config.split( ";" );
$.each( config, function ( index, item ) {
item = item.split( ":" );
parsedConfig[ item[ 0 ] ] = item[ 1 ];
} );
setUserConfig( parsedConfig );
}
function initEvent () {
var cacheValue = null,
//图表类型数
typeViewCount = chartsConfig.length- 1,
$chartsTypeViewBox = $( '#scrollBed .view-box' );
$( ".charts-format" ).delegate( ".format-ctrl", "change", function () {
renderCharts();
} )
$( ".table-view" ).delegate( ".data-item", "focus", function () {
cacheValue = this.value;
} ).delegate( ".data-item", "blur", function () {
if ( this.value !== cacheValue ) {
renderCharts();
}
cacheValue = null;
} );
$( "#buttonContainer" ).delegate( "a", "click", function (e) {
e.preventDefault();
if ( this.getAttribute( "data-title" ) === 'prev' ) {
if ( currentChartType > 0 ) {
currentChartType--;
updateViewType( currentChartType );
}
} else {
if ( currentChartType < typeViewCount ) {
currentChartType++;
updateViewType( currentChartType );
}
}
} );
//图表类型变化
$( '#scrollBed' ).delegate( ".view-box", "click", function (e) {
var index = $( this ).attr( "data-chart-type" );
$chartsTypeViewBox.removeClass( "selected" );
$( $chartsTypeViewBox[ index ] ).addClass( "selected" );
currentChartType = index | 0;
//饼图, 禁用部分配置
if ( currentChartType === chartsConfig.length - 1 ) {
disableNotPieConfig();
//启用完整配置
} else {
enableNotPieConfig();
}
renderCharts();
} );
}
function renderCharts () {
var data = collectData();
$('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], {
credits: {
enabled: false
},
exporting: {
enabled: false
},
title: {
text: data.title,
x: -20 //center
},
subtitle: {
text: data.subTitle,
x: -20
},
xAxis: {
title: {
text: data.xTitle
},
categories: data.categories
},
yAxis: {
title: {
text: data.yTitle
},
plotLines: [{
value: 0,
width: 1,
color: '#808080'
}]
},
tooltip: {
enabled: true,
valueSuffix: data.suffix
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle',
borderWidth: 1
},
series: data.series
} ));
}
function updateViewType ( index ) {
$( "#scrollBed" ).css( 'marginLeft', -index*324+'px' );
}
function collectData () {
var form = document.forms[ 'data-form' ],
data = null;
if ( currentChartType !== chartsConfig.length - 1 ) {
data = getSeriesAndCategories();
$.extend( data, getUserConfig() );
//饼图数据格式
} else {
data = getSeriesForPieChart();
data.title = form[ 'title' ].value;
data.suffix = form[ 'unit' ].value;
}
return data;
}
/**
* 获取用户配置信息
*/
function getUserConfig () {
var form = document.forms[ 'data-form' ],
info = {
title: form[ 'title' ].value,
subTitle: form[ 'sub-title' ].value,
xTitle: form[ 'x-title' ].value,
yTitle: form[ 'y-title' ].value,
suffix: form[ 'unit' ].value,
//数据对齐方式
tableDataFormat: getTableDataFormat (),
//饼图提示文字
tip: $( "#tipInput" ).val()
};
return info;
}
function setUserConfig ( config ) {
var form = document.forms[ 'data-form' ];
config.title && ( form[ 'title' ].value = config.title );
config.subTitle && ( form[ 'sub-title' ].value = config.subTitle );
config.xTitle && ( form[ 'x-title' ].value = config.xTitle );
config.yTitle && ( form[ 'y-title' ].value = config.yTitle );
config.suffix && ( form[ 'unit' ].value = config.suffix );
config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true );
config.tip && ( form[ 'tip' ].value = config.tip );
currentChartType = config.chartType || 0;
}
function getSeriesAndCategories () {
var form = document.forms[ 'data-form' ],
series = [],
categories = [],
tmp = [],
tableData = getTableData();
//反转数据
if ( getTableDataFormat() === "-1" ) {
for ( var i = 0, len = tableData.length; i < len; i++ ) {
for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) {
if ( !tmp[ j ] ) {
tmp[ j ] = [];
}
tmp[ j ][ i ] = tableData[ i ][ j ];
}
}
tableData = tmp;
}
categories = tableData[0].slice( 1 );
for ( var i = 1, data; data = tableData[ i ]; i++ ) {
series.push( {
name: data[ 0 ],
data: data.slice( 1 )
} );
}
return {
series: series,
categories: categories
};
}
/*
* 获取数据源数据对齐方式
*/
function getTableDataFormat () {
var form = document.forms[ 'data-form' ],
items = form['charts-format'];
return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value;
}
/*
* 禁用非饼图类型的配置项
*/
function disableNotPieConfig() {
updateConfigItem( 'disable' );
}
/*
* 启用非饼图类型的配置项
*/
function enableNotPieConfig() {
updateConfigItem( 'enable' );
}
function updateConfigItem ( value ) {
var table = $( "#showTable" )[ 0 ],
isDisable = value === 'disable' ? true : false;
//table中的input处理
for ( var i = 2 , row; row = table.rows[ i ]; i++ ) {
for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
$( "input", cell ).attr( "disabled", isDisable );
}
}
//其他项处理
$( "input.not-pie-item" ).attr( "disabled", isDisable );
$( "#tipInput" ).attr( "disabled", !isDisable )
}
/*
* 获取饼图数据
* 饼图的数据只取第一行的
**/
function getSeriesForPieChart () {
var series = {
type: 'pie',
name: $("#tipInput").val(),
data: []
},
tableData = getTableData();
for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) {
var title = tableData[ 0 ][ j ],
val = tableData[ 1 ][ j ];
series.data.push( [ title, val ] );
}
return {
series: [ series ]
};
}
function getTableData () {
var table = document.getElementById( "showTable" ),
xCount = table.rows[0].cells.length - 1,
values = getTableInputValue();
for ( var i = 0, value; value = values[ i ]; i++ ) {
tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ];
}
return tableData;
}
function getTableInputValue () {
var table = document.getElementById( "showTable" ),
inputs = table.getElementsByTagName( "input" ),
values = [];
for ( var i = 0, input; input = inputs[ i ]; i++ ) {
values.push( input.value | 0 );
}
return values;
}
function getCellValue ( cell ) {
var value = utils.trim( ( cell.innerText || cell.textContent || '' ) );
return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' );
}
//dialog确认事件
dialog.onok = function () {
//收集信息
var form = document.forms[ 'data-form' ],
info = getUserConfig();
//添加图表类型
info.chartType = currentChartType;
//同步表格数据到编辑器
syncTableData();
//执行图表命令
editor.execCommand( 'charts', info );
};
/*
* 同步图表编辑视图的表格数据到编辑器里的原始表格
*/
function syncTableData () {
var tableData = getTableData();
for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) {
for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
cell.innerHTML = tableData[ i ] [ j ];
}
}
}
================================================
FILE: static/common/user/uedit/dialogs/emotion/emotion.css
================================================
.jd img{
background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.pp img{
background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:25px;height:25px;display:block;
}
.ldw img{
background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.tsj img{
background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.cat img{
background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.bb img{
background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.youa img{
background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.smileytable td {height: 37px;}
#tabPanel{margin-left:5px;overflow: hidden;}
#tabContent {float:left;background:#FFFFFF;}
#tabContent div{display: none;width:480px;overflow:hidden;}
#tabIconReview.show{left:17px;display:block;}
.menuFocus{background:#ACCD3C;}
.menuDefault{background:#FFFFFF;}
#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;}
img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;}
.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;}
.tabbody table{width: 100%;}
.tabbody td{border:1px solid #BAC498;}
.tabbody td span{display: block;zoom:1;padding:0 4px;}
================================================
FILE: static/common/user/uedit/dialogs/emotion/emotion.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/emotion/emotion.js
================================================
window.onload = function () {
editor.setOpt({
emotionLocalization:false
});
emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/";
emotion.SmileyBox = createTabList( emotion.tabNum );
emotion.tabExist = createArr( emotion.tabNum );
initImgName();
initEvtHandler( "tabHeads" );
};
function initImgName() {
for ( var pro in emotion.SmilmgName ) {
var tempName = emotion.SmilmgName[pro],
tempBox = emotion.SmileyBox[pro],
tempStr = "";
if ( tempBox.length ) return;
for ( var i = 1; i <= tempName[1]; i++ ) {
tempStr = tempName[0];
if ( i < 10 ) tempStr = tempStr + '0';
tempStr = tempStr + i + '.gif';
tempBox.push( tempStr );
}
}
}
function initEvtHandler( conId ) {
var tabHeads = $G( conId );
for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) {
var tabObj = tabHeads.childNodes[i];
if ( tabObj.nodeType == 1 ) {
domUtils.on( tabObj, "click", (function ( index ) {
return function () {
switchTab( index );
};
})( j ) );
j++;
}
}
switchTab( 0 );
$G( "tabIconReview" ).style.display = 'none';
}
function InsertSmiley( url, evt ) {
var obj = {
src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url
};
obj._src = obj.src;
editor.execCommand( 'insertimage', obj );
if ( !evt.ctrlKey ) {
dialog.popup.hide();
}
}
function switchTab( index ) {
autoHeight( index );
if ( emotion.tabExist[index] == 0 ) {
emotion.tabExist[index] = 1;
createTab( 'tab' + index );
}
//获取呈现元素句柄数组
var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ),
tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ),
i = 0, L = tabHeads.length;
//隐藏所有呈现元素
for ( ; i < L; i++ ) {
tabHeads[i].className = "";
tabBodys[i].style.display = "none";
}
//显示对应呈现元素
tabHeads[index].className = "focus";
tabBodys[index].style.display = "block";
}
function autoHeight( index ) {
var iframe = dialog.getDom( "iframe" ),
parent = iframe.parentNode.parentNode;
switch ( index ) {
case 0:
iframe.style.height = "380px";
parent.style.height = "392px";
break;
case 1:
iframe.style.height = "220px";
parent.style.height = "232px";
break;
case 2:
iframe.style.height = "260px";
parent.style.height = "272px";
break;
case 3:
iframe.style.height = "300px";
parent.style.height = "312px";
break;
case 4:
iframe.style.height = "140px";
parent.style.height = "152px";
break;
case 5:
iframe.style.height = "260px";
parent.style.height = "272px";
break;
case 6:
iframe.style.height = "230px";
parent.style.height = "242px";
break;
default:
}
}
function createTab( tabName ) {
var faceVersion = "?v=1.1", //版本号
tab = $G( tabName ), //获取将要生成的Div句柄
imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径
positionLine = 11 / 2, //中间数
iWidth = iHeight = 35, //图片长宽
iColWidth = 3, //表格剩余空间的显示比例
tableCss = emotion.imageCss[tabName],
cssOffset = emotion.imageCssOffset[tabName],
textHTML = ['
'],
i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,
sUrl, realUrl, posflag, offset, infor;
for ( ; i < imgNum; ) {
textHTML.push( '' );
for ( var j = 0; j < imgColNum; j++, i++ ) {
faceImage = emotion.SmileyBox[tabName][i];
if ( faceImage ) {
sUrl = imagePath + faceImage + faceVersion;
realUrl = imagePath + faceImage;
posflag = j < positionLine ? 0 : 1;
offset = cssOffset * i * (-1) - 1;
infor = emotion.SmileyInfor[tabName][i];
textHTML.push( '' );
textHTML.push( '' );
textHTML.push( ' ' );
textHTML.push( ' ' );
} else {
textHTML.push( ' ' );
}
textHTML.push( ' ' );
}
textHTML.push( ' ' );
}
textHTML.push( '
' );
textHTML = textHTML.join( "" );
tab.innerHTML = textHTML;
}
function over( td, srcPath, posFlag ) {
td.style.backgroundColor = "#ACCD3C";
$G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")";
if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show";
$G( "tabIconReview" ).style.display = 'block';
}
function out( td ) {
td.style.backgroundColor = "transparent";
var tabIconRevew = $G( "tabIconReview" );
tabIconRevew.className = "";
tabIconRevew.style.display = 'none';
}
function createTabList( tabNum ) {
var obj = {};
for ( var i = 0; i < tabNum; i++ ) {
obj["tab" + i] = [];
}
return obj;
}
function createArr( tabNum ) {
var arr = [];
for ( var i = 0; i < tabNum; i++ ) {
arr[i] = 0;
}
return arr;
}
================================================
FILE: static/common/user/uedit/dialogs/gmap/gmap.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/help/help.css
================================================
.wrapper{width: 370px;margin: 10px auto;zoom: 1;}
.tabbody{height: 360px;}
.tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;}
.tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;}
.tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;}
.tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;}
.tabbody table thead{font-weight: bold;line-height: 25px;}
================================================
FILE: static/common/user/uedit/dialogs/help/help.html
================================================
帮助
ctrl+b
ctrl+c
ctrl+x
ctrl+v
ctrl+y
ctrl+z
ctrl+i
ctrl+u
ctrl+a
shift+enter
alt+z
================================================
FILE: static/common/user/uedit/dialogs/help/help.js
================================================
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-9-26
* Time: 下午1:06
* To change this template use File | Settings | File Templates.
*/
/**
* tab点击处理事件
* @param tabHeads
* @param tabBodys
* @param obj
*/
function clickHandler( tabHeads,tabBodys,obj ) {
//head样式更改
for ( var k = 0, len = tabHeads.length; k < len; k++ ) {
tabHeads[k].className = "";
}
obj.className = "focus";
//body显隐
var tabSrc = obj.getAttribute( "tabSrc" );
for ( var j = 0, length = tabBodys.length; j < length; j++ ) {
var body = tabBodys[j],
id = body.getAttribute( "id" );
body.onclick = function(){
this.style.zoom = 1;
};
if ( id != tabSrc ) {
body.style.zIndex = 1;
} else {
body.style.zIndex = 200;
}
}
}
/**
* TAB切换
* @param tabParentId tab的父节点ID或者对象本身
*/
function switchTab( tabParentId ) {
var tabElements = $G( tabParentId ).children,
tabHeads = tabElements[0].children,
tabBodys = tabElements[1].children;
for ( var i = 0, length = tabHeads.length; i < length; i++ ) {
var head = tabHeads[i];
if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head );
head.onclick = function () {
clickHandler(tabHeads,tabBodys,this);
}
}
}
switchTab("helptab");
document.getElementById('version').innerHTML = parent.UE.version;
================================================
FILE: static/common/user/uedit/dialogs/image/image.css
================================================
@charset "utf-8";
/* dialog样式 */
.wrapper {
zoom: 1;
width: 630px;
*width: 626px;
height: 380px;
margin: 0 auto;
padding: 10px;
position: relative;
font-family: sans-serif;
}
/*tab样式框大小*/
.tabhead {
float:left;
}
.tabbody {
width: 100%;
height: 346px;
position: relative;
clear: both;
}
.tabbody .panel {
position: absolute;
width: 0;
height: 0;
background: #fff;
overflow: hidden;
display: none;
}
.tabbody .panel.focus {
width: 100%;
height: 346px;
display: block;
}
/* 图片对齐方式 */
.alignBar{
float:right;
margin-top: 5px;
position: relative;
}
.alignBar .algnLabel{
float:left;
height: 20px;
line-height: 20px;
}
.alignBar #alignIcon{
zoom:1;
_display: inline;
display: inline-block;
position: relative;
}
.alignBar #alignIcon span{
float: left;
cursor: pointer;
display: block;
width: 19px;
height: 17px;
margin-right: 3px;
margin-left: 3px;
background-image: url(./images/alignicon.jpg);
}
.alignBar #alignIcon .none-align{
background-position: 0 -18px;
}
.alignBar #alignIcon .left-align{
background-position: -20px -18px;
}
.alignBar #alignIcon .right-align{
background-position: -40px -18px;
}
.alignBar #alignIcon .center-align{
background-position: -60px -18px;
}
.alignBar #alignIcon .none-align.focus{
background-position: 0 0;
}
.alignBar #alignIcon .left-align.focus{
background-position: -20px 0;
}
.alignBar #alignIcon .right-align.focus{
background-position: -40px 0;
}
.alignBar #alignIcon .center-align.focus{
background-position: -60px 0;
}
/* 远程图片样式 */
#remote {
z-index: 200;
}
#remote .top{
width: 100%;
margin-top: 25px;
}
#remote .left{
display: block;
float: left;
width: 300px;
height:10px;
}
#remote .right{
display: block;
float: right;
width: 300px;
height:10px;
}
#remote .row{
margin-left: 20px;
clear: both;
height: 40px;
}
#remote .row label{
text-align: center;
width: 50px;
zoom:1;
_display: inline;
display:inline-block;
vertical-align: middle;
}
#remote .row label.algnLabel{
float: left;
}
#remote input.text{
width: 150px;
padding: 3px 6px;
font-size: 14px;
line-height: 1.42857143;
color: #555;
background-color: #fff;
background-image: none;
border: 1px solid #ccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
#remote input.text:focus {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
}
#remote #url{
width: 500px;
margin-bottom: 2px;
}
#remote #width,
#remote #height{
width: 20px;
margin-left: 2px;
margin-right: 2px;
}
#remote #border,
#remote #vhSpace,
#remote #title{
width: 180px;
margin-right: 5px;
}
#remote #lock{
}
#remote #lockicon{
zoom: 1;
_display:inline;
display: inline-block;
width: 20px;
height: 20px;
background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat;
vertical-align: middle;
}
#remote #preview{
clear: both;
width: 260px;
height: 240px;
z-index: 9999;
margin-top: 10px;
background-color: #eee;
overflow: hidden;
}
/* 上传图片 */
.tabbody #upload.panel {
width: 0;
height: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
background: #fff;
display: block;
}
.tabbody #upload.panel.focus {
width: 100%;
height: 346px;
display: block;
clip: auto;
}
#upload .queueList {
margin: 0;
width: 100%;
height: 100%;
position: absolute;
overflow: hidden;
}
#upload p {
margin: 0;
}
.element-invisible {
width: 0 !important;
height: 0 !important;
border: 0;
padding: 0;
margin: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
}
#upload .placeholder {
margin: 10px;
border: 2px dashed #e6e6e6;
*border: 0px dashed #e6e6e6;
height: 172px;
padding-top: 150px;
text-align: center;
background: url(./images/image.png) center 70px no-repeat;
color: #cccccc;
font-size: 18px;
position: relative;
top:0;
*top: 10px;
}
#upload .placeholder .webuploader-pick {
font-size: 18px;
background: #00b7ee;
border-radius: 3px;
line-height: 44px;
padding: 0 30px;
*width: 120px;
color: #fff;
display: inline-block;
margin: 0 auto 20px auto;
cursor: pointer;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
#upload .placeholder .webuploader-pick-hover {
background: #00a2d4;
}
#filePickerContainer {
text-align: center;
}
#upload .placeholder .flashTip {
color: #666666;
font-size: 12px;
position: absolute;
width: 100%;
text-align: center;
bottom: 20px;
}
#upload .placeholder .flashTip a {
color: #0785d1;
text-decoration: none;
}
#upload .placeholder .flashTip a:hover {
text-decoration: underline;
}
#upload .placeholder.webuploader-dnd-over {
border-color: #999999;
}
#upload .filelist {
list-style: none;
margin: 0;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
position: relative;
height: 300px;
}
#upload .filelist:after {
content: '';
display: block;
width: 0;
height: 0;
overflow: hidden;
clear: both;
position: relative;
}
#upload .filelist li {
width: 113px;
height: 113px;
background: url(./images/bg.png);
text-align: center;
margin: 9px 0 0 9px;
*margin: 6px 0 0 6px;
position: relative;
display: block;
float: left;
overflow: hidden;
font-size: 12px;
}
#upload .filelist li p.log {
position: relative;
top: -45px;
}
#upload .filelist li p.title {
position: absolute;
top: 0;
left: 0;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
top: 5px;
text-indent: 5px;
text-align: left;
}
#upload .filelist li p.progress {
position: absolute;
width: 100%;
bottom: 0;
left: 0;
height: 8px;
overflow: hidden;
z-index: 50;
margin: 0;
border-radius: 0;
background: none;
-webkit-box-shadow: 0 0 0;
}
#upload .filelist li p.progress span {
display: none;
overflow: hidden;
width: 0;
height: 100%;
background: #1483d8 url(./images/progress.png) repeat-x;
-webit-transition: width 200ms linear;
-moz-transition: width 200ms linear;
-o-transition: width 200ms linear;
-ms-transition: width 200ms linear;
transition: width 200ms linear;
-webkit-animation: progressmove 2s linear infinite;
-moz-animation: progressmove 2s linear infinite;
-o-animation: progressmove 2s linear infinite;
-ms-animation: progressmove 2s linear infinite;
animation: progressmove 2s linear infinite;
-webkit-transform: translateZ(0);
}
@-webkit-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@-moz-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
#upload .filelist li p.imgWrap {
position: relative;
z-index: 2;
line-height: 113px;
vertical-align: middle;
overflow: hidden;
width: 113px;
height: 113px;
-webkit-transform-origin: 50% 50%;
-moz-transform-origin: 50% 50%;
-o-transform-origin: 50% 50%;
-ms-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webit-transition: 200ms ease-out;
-moz-transition: 200ms ease-out;
-o-transition: 200ms ease-out;
-ms-transition: 200ms ease-out;
transition: 200ms ease-out;
}
#upload .filelist li img {
width: 100%;
}
#upload .filelist li p.error {
background: #f43838;
color: #fff;
position: absolute;
bottom: 0;
left: 0;
height: 28px;
line-height: 28px;
width: 100%;
z-index: 100;
display:none;
}
#upload .filelist li .success {
display: block;
position: absolute;
left: 0;
bottom: 0;
height: 40px;
width: 100%;
z-index: 200;
background: url(./images/success.png) no-repeat right bottom;
background: url(./images/success.gif) no-repeat right bottom \9;
}
#upload .filelist li.filePickerBlock {
width: 113px;
height: 113px;
background: url(./images/image.png) no-repeat center 12px;
border: 1px solid #eeeeee;
border-radius: 0;
}
#upload .filelist li.filePickerBlock div.webuploader-pick {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
opacity: 0;
background: none;
font-size: 0;
}
#upload .filelist div.file-panel {
position: absolute;
height: 0;
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
background: rgba(0, 0, 0, 0.5);
width: 100%;
top: 0;
left: 0;
overflow: hidden;
z-index: 300;
}
#upload .filelist div.file-panel span {
width: 24px;
height: 24px;
display: inline;
float: right;
text-indent: -9999px;
overflow: hidden;
background: url(./images/icons.png) no-repeat;
background: url(./images/icons.gif) no-repeat \9;
margin: 5px 1px 1px;
cursor: pointer;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .filelist div.file-panel span.rotateLeft {
display:none;
background-position: 0 -24px;
}
#upload .filelist div.file-panel span.rotateLeft:hover {
background-position: 0 0;
}
#upload .filelist div.file-panel span.rotateRight {
display:none;
background-position: -24px -24px;
}
#upload .filelist div.file-panel span.rotateRight:hover {
background-position: -24px 0;
}
#upload .filelist div.file-panel span.cancel {
background-position: -48px -24px;
}
#upload .filelist div.file-panel span.cancel:hover {
background-position: -48px 0;
}
#upload .statusBar {
height: 45px;
border-bottom: 1px solid #dadada;
margin: 0 10px;
padding: 0;
line-height: 45px;
vertical-align: middle;
position: relative;
}
#upload .statusBar .progress {
border: 1px solid #1483d8;
width: 198px;
background: #fff;
height: 18px;
position: absolute;
top: 12px;
display: none;
text-align: center;
line-height: 18px;
color: #6dbfff;
margin: 0 10px 0 0;
}
#upload .statusBar .progress span.percentage {
width: 0;
height: 100%;
left: 0;
top: 0;
background: #1483d8;
position: absolute;
}
#upload .statusBar .progress span.text {
position: relative;
z-index: 10;
}
#upload .statusBar .info {
display: inline-block;
font-size: 14px;
color: #666666;
}
#upload .statusBar .btns {
position: absolute;
top: 7px;
right: 0;
line-height: 30px;
}
#filePickerBtn {
display: inline-block;
float: left;
}
#upload .statusBar .btns .webuploader-pick,
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-uploading,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #ffffff;
border: 1px solid #cfcfcf;
color: #565656;
padding: 0 18px;
display: inline-block;
border-radius: 3px;
margin-left: 10px;
cursor: pointer;
font-size: 14px;
float: left;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .statusBar .btns .webuploader-pick-hover,
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-uploading:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #f0f0f0;
}
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-paused{
background: #00b7ee;
color: #fff;
border-color: transparent;
}
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover{
background: #00a2d4;
}
#upload .statusBar .btns .uploadBtn.disabled {
pointer-events: none;
filter:alpha(opacity=60);
-moz-opacity:0.6;
-khtml-opacity: 0.6;
opacity: 0.6;
}
/* 图片管理样式 */
#online {
width: 100%;
height: 336px;
padding: 10px 0 0 0;
}
#online #imageList{
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
position: relative;
}
#online ul {
display: block;
list-style: none;
margin: 0;
padding: 0;
}
#online li {
float: left;
display: block;
list-style: none;
padding: 0;
width: 113px;
height: 113px;
margin: 0 0 9px 9px;
*margin: 0 0 6px 6px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
position: relative;
}
#online li.clearFloat {
float: none;
clear: both;
display: block;
width:0;
height:0;
margin: 0;
padding: 0;
}
#online li img {
cursor: pointer;
}
#online li .icon {
cursor: pointer;
width: 113px;
height: 113px;
position: absolute;
top: 0;
left: 0;
z-index: 2;
border: 0;
background-repeat: no-repeat;
}
#online li .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
}
#online li.selected .icon {
background-image: url(images/success.png);
background-image: url(images/success.gif)\9;
background-position: 75px 75px;
}
#online li.selected .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
}
/* 图片搜索样式 */
#search .searchBar {
width: 100%;
height: 30px;
margin: 10px 0 5px 0;
padding: 0;
}
#search input.text{
width: 150px;
padding: 3px 6px;
font-size: 14px;
line-height: 1.42857143;
color: #555;
background-color: #fff;
background-image: none;
border: 1px solid #ccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
#search input.text:focus {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
}
#search input.searchTxt {
margin-left:5px;
padding-left: 5px;
background: #FFF;
width: 300px;
*width: 260px;
height: 21px;
line-height: 21px;
float: left;
dislay: block;
}
#search .searchType {
width: 65px;
height: 28px;
padding:0;
line-height: 28px;
border: 1px solid #d7d7d7;
border-radius: 0;
vertical-align: top;
margin-left: 5px;
float: left;
dislay: block;
}
#search #searchBtn,
#search #searchReset {
display: inline-block;
margin-bottom: 0;
margin-right: 5px;
padding: 4px 10px;
font-weight: 400;
text-align: center;
vertical-align: middle;
cursor: pointer;
background-image: none;
border: 1px solid transparent;
white-space: nowrap;
font-size: 14px;
border-radius: 4px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
vertical-align: top;
float: right;
}
#search #searchBtn {
color: white;
border-color: #285e8e;
background-color: #3b97d7;
}
#search #searchReset {
color: #333;
border-color: #ccc;
background-color: #fff;
}
#search #searchBtn:hover {
background-color: #3276b1;
}
#search #searchReset:hover {
background-color: #eee;
}
#search .msg {
margin-left: 5px;
}
#search .searchList{
width: 100%;
height: 300px;
overflow: hidden;
clear: both;
}
#search .searchList ul{
margin:0;
padding:0;
list-style:none;
clear: both;
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
zoom: 1;
position: relative;
}
#search .searchList li {
list-style:none;
float: left;
display: block;
width: 115px;
margin: 5px 10px 5px 20px;
*margin: 5px 10px 5px 15px;
padding:0;
font-size: 12px;
box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
position: relative;
vertical-align: top;
text-align: center;
overflow: hidden;
cursor: pointer;
filter: alpha(Opacity=100);
-moz-opacity: 1;
opacity: 1;
border: 2px solid #eee;
}
#search .searchList li.selected {
filter: alpha(Opacity=40);
-moz-opacity: 0.4;
opacity: 0.4;
border: 2px solid #00a0e9;
}
#search .searchList li p {
background-color: #eee;
margin: 0;
padding: 0;
position: relative;
width:100%;
height:115px;
overflow: hidden;
}
#search .searchList li p img {
cursor: pointer;
border: 0;
}
#search .searchList li a {
color: #999;
border-top: 1px solid #F2F2F2;
background: #FAFAFA;
text-align: center;
display: block;
padding: 0 5px;
width: 105px;
height:32px;
line-height:32px;
white-space:nowrap;
text-overflow:ellipsis;
text-decoration: none;
overflow: hidden;
word-break: break-all;
}
#search .searchList a:hover {
text-decoration: underline;
color: #333;
}
#search .searchList .clearFloat{
clear: both;
}
================================================
FILE: static/common/user/uedit/dialogs/image/image.html
================================================
ueditor图片对话框
================================================
FILE: static/common/user/uedit/dialogs/image/image.js
================================================
/**
* User: Jinqn
* Date: 14-04-08
* Time: 下午16:34
* 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片
*/
(function () {
var remoteImage,
uploadImage,
onlineImage,
searchImage;
window.onload = function () {
initTabs();
initAlign();
initButtons();
};
/* 初始化tab标签 */
function initTabs() {
var tabs = $G('tabhead').children;
for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) {
var target = e.target || e.srcElement;
setTabFocus(target.getAttribute('data-content-id'));
});
}
var img = editor.selection.getRange().getClosedNode();
if (img && img.tagName && img.tagName.toLowerCase() == 'img') {
setTabFocus('remote');
} else {
setTabFocus('upload');
}
}
/* 初始化tabbody */
function setTabFocus(id) {
if(!id) return;
var i, bodyId, tabs = $G('tabhead').children;
for (i = 0; i < tabs.length; i++) {
bodyId = tabs[i].getAttribute('data-content-id');
if (bodyId == id) {
domUtils.addClass(tabs[i], 'focus');
domUtils.addClass($G(bodyId), 'focus');
} else {
domUtils.removeClasses(tabs[i], 'focus');
domUtils.removeClasses($G(bodyId), 'focus');
}
}
switch (id) {
case 'remote':
remoteImage = remoteImage || new RemoteImage();
break;
case 'upload':
setAlign(editor.getOpt('imageInsertAlign'));
uploadImage = uploadImage || new UploadImage('queueList');
break;
case 'online':
setAlign(editor.getOpt('imageManagerInsertAlign'));
onlineImage = onlineImage || new OnlineImage('imageList');
onlineImage.reset();
break;
case 'search':
setAlign(editor.getOpt('imageManagerInsertAlign'));
searchImage = searchImage || new SearchImage();
break;
}
}
/* 初始化onok事件 */
function initButtons() {
dialog.onok = function () {
var remote = false, list = [], id, tabs = $G('tabhead').children;
for (var i = 0; i < tabs.length; i++) {
if (domUtils.hasClass(tabs[i], 'focus')) {
id = tabs[i].getAttribute('data-content-id');
break;
}
}
switch (id) {
case 'remote':
list = remoteImage.getInsertList();
break;
case 'upload':
list = uploadImage.getInsertList();
var count = uploadImage.getQueueCount();
if (count) {
$('.info', '#queueList').html('
' + '还有2个未上传文件'.replace(/[\d]/, count) + ' ');
return false;
}
break;
case 'online':
list = onlineImage.getInsertList();
break;
case 'search':
list = searchImage.getInsertList();
remote = true;
break;
}
if(list) {
editor.execCommand('insertimage', list);
remote && editor.fireEvent("catchRemoteImage");
}
};
}
/* 初始化对其方式的点击事件 */
function initAlign(){
/* 点击align图标 */
domUtils.on($G("alignIcon"), 'click', function(e){
var target = e.target || e.srcElement;
if(target.className && target.className.indexOf('-align') != -1) {
setAlign(target.getAttribute('data-align'));
}
});
}
/* 设置对齐方式 */
function setAlign(align){
align = align || 'none';
var aligns = $G("alignIcon").children;
for(i = 0; i < aligns.length; i++){
if(aligns[i].getAttribute('data-align') == align) {
domUtils.addClass(aligns[i], 'focus');
$G("align").value = aligns[i].getAttribute('data-align');
} else {
domUtils.removeClasses(aligns[i], 'focus');
}
}
}
/* 获取对齐方式 */
function getAlign(){
var align = $G("align").value || 'none';
return align == 'none' ? '':align;
}
/* 在线图片 */
function RemoteImage(target) {
this.container = utils.isString(target) ? document.getElementById(target) : target;
this.init();
}
RemoteImage.prototype = {
init: function () {
this.initContainer();
this.initEvents();
},
initContainer: function () {
this.dom = {
'url': $G('url'),
'width': $G('width'),
'height': $G('height'),
'border': $G('border'),
'vhSpace': $G('vhSpace'),
'title': $G('title'),
'align': $G('align')
};
var img = editor.selection.getRange().getClosedNode();
if (img) {
this.setImage(img);
}
},
initEvents: function () {
var _this = this,
locker = $G('lock');
/* 改变url */
domUtils.on($G("url"), 'keyup', updatePreview);
domUtils.on($G("border"), 'keyup', updatePreview);
domUtils.on($G("title"), 'keyup', updatePreview);
domUtils.on($G("width"), 'keyup', function(){
updatePreview();
if(locker.checked) {
var proportion =locker.getAttribute('data-proportion');
$G('height').value = Math.round(this.value / proportion);
} else {
_this.updateLocker();
}
});
domUtils.on($G("height"), 'keyup', function(){
updatePreview();
if(locker.checked) {
var proportion =locker.getAttribute('data-proportion');
$G('width').value = Math.round(this.value * proportion);
} else {
_this.updateLocker();
}
});
domUtils.on($G("lock"), 'change', function(){
var proportion = parseInt($G("width").value) /parseInt($G("height").value);
locker.setAttribute('data-proportion', proportion);
});
function updatePreview(){
_this.setPreview();
}
},
updateLocker: function(){
var width = $G('width').value,
height = $G('height').value,
locker = $G('lock');
if(width && height && width == parseInt(width) && height == parseInt(height)) {
locker.disabled = false;
locker.title = '';
} else {
locker.checked = false;
locker.disabled = 'disabled';
locker.title = lang.remoteLockError;
}
},
setImage: function(img){
/* 不是正常的图片 */
if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return;
var wordImgFlag = img.getAttribute("word_img"),
src = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&", "&")),
align = editor.queryCommandValue("imageFloat");
/* 防止onchange事件循环调用 */
if (src !== $G("url").value) $G("url").value = src;
if(src) {
/* 设置表单内容 */
$G("width").value = img.width || '';
$G("height").value = img.height || '';
$G("border").value = img.getAttribute("border") || '0';
$G("vhSpace").value = img.getAttribute("vspace") || '0';
$G("title").value = img.title || img.alt || '';
setAlign(align);
this.setPreview();
this.updateLocker();
}
},
getData: function(){
var data = {};
for(var k in this.dom){
data[k] = this.dom[k].value;
}
return data;
},
setPreview: function(){
var url = $G('url').value,
ow = parseInt($G('width').value, 10) || 0,
oh = parseInt($G('height').value, 10) || 0,
border = parseInt($G('border').value, 10) || 0,
title = $G('title').value,
preview = $G('preview'),
width,
height;
url = utils.unhtmlForUrl(url);
title = utils.unhtml(title);
width = ((!ow || !oh) ? preview.offsetWidth:Math.min(ow, preview.offsetWidth));
width = width+(border*2) > preview.offsetWidth ? width:(preview.offsetWidth - (border*2));
height = (!ow || !oh) ? '':width*oh/ow;
if(url) {
preview.innerHTML = '
';
}
},
getInsertList: function () {
var data = this.getData();
if(data['url']) {
return [{
src: data['url'],
_src: data['url'],
width: data['width'] || '',
height: data['height'] || '',
border: data['border'] || '',
floatStyle: data['align'] || '',
vspace: data['vhSpace'] || '',
title: data['title'] || '',
alt: data['title'] || '',
style: "width:" + data['width'] + "px;height:" + data['height'] + "px;"
}];
} else {
return [];
}
}
};
/* 上传图片 */
function UploadImage(target) {
this.$wrap = target.constructor == String ? $('#' + target) : $(target);
this.init();
}
UploadImage.prototype = {
init: function () {
this.imageList = [];
this.initContainer();
this.initUploader();
},
initContainer: function () {
this.$queue = this.$wrap.find('.filelist');
},
/* 初始化容器 */
initUploader: function () {
var _this = this,
$ = jQuery, // just in case. Make sure it's not an other libaray.
$wrap = _this.$wrap,
// 图片容器
$queue = $wrap.find('.filelist'),
// 状态栏,包括进度和控制按钮
$statusBar = $wrap.find('.statusBar'),
// 文件总体选择信息。
$info = $statusBar.find('.info'),
// 上传按钮
$upload = $wrap.find('.uploadBtn'),
// 上传按钮
$filePickerBtn = $wrap.find('.filePickerBtn'),
// 上传按钮
$filePickerBlock = $wrap.find('.filePickerBlock'),
// 没选择文件之前的内容。
$placeHolder = $wrap.find('.placeholder'),
// 总体进度条
$progress = $statusBar.find('.progress').hide(),
// 添加的文件数量
fileCount = 0,
// 添加的文件总大小
fileSize = 0,
// 优化retina, 在retina下这个值是2
ratio = window.devicePixelRatio || 1,
// 缩略图大小
thumbnailWidth = 113 * ratio,
thumbnailHeight = 113 * ratio,
// 可能有pedding, ready, uploading, confirm, done.
state = '',
// 所有文件的进度信息,key为file id
percentages = {},
supportTransition = (function () {
var s = document.createElement('p').style,
r = 'transition' in s ||
'WebkitTransition' in s ||
'MozTransition' in s ||
'msTransition' in s ||
'OTransition' in s;
s = null;
return r;
})(),
// WebUploader实例
uploader,
actionUrl = editor.getActionUrl(editor.getOpt('imageActionName')),
acceptExtensions = (editor.getOpt('imageAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''),
imageMaxSize = editor.getOpt('imageMaxSize'),
imageCompressBorder = editor.getOpt('imageCompressBorder');
if (!WebUploader.Uploader.support()) {
$('#filePickerReady').after($('
').html(lang.errorNotSupport)).hide();
return;
} else if (!editor.getOpt('imageActionName')) {
$('#filePickerReady').after($('
').html(lang.errorLoadConfig)).hide();
return;
}
uploader = _this.uploader = WebUploader.create({
pick: {
id: '#filePickerReady',
label: lang.uploadSelectFile
},
accept: {
title: 'Images',
extensions: acceptExtensions,
mimeTypes: 'image/*'
},
swf: '../../third-party/webuploader/Uploader.swf',
server: actionUrl,
fileVal: editor.getOpt('imageFieldName'),
duplicate: true,
fileSingleSizeLimit: imageMaxSize, // 默认 2 M
compress: editor.getOpt('imageCompressEnable') ? {
width: imageCompressBorder,
height: imageCompressBorder,
// 图片质量,只有type为`image/jpeg`的时候才有效。
quality: 90,
// 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
allowMagnify: false,
// 是否允许裁剪。
crop: false,
// 是否保留头部meta信息。
preserveHeaders: true
}:false
});
uploader.addButton({
id: '#filePickerBlock'
});
uploader.addButton({
id: '#filePickerBtn',
label: lang.uploadAddFile
});
setState('pedding');
// 当有文件添加进来时执行,负责view的创建
function addFile(file) {
var $li = $('
' +
'' + file.name + '
' +
'
' +
'
' +
' '),
$btns = $('
' +
'' + lang.uploadDelete + ' ' +
'' + lang.uploadTurnRight + ' ' +
'' + lang.uploadTurnLeft + '
').appendTo($li),
$prgress = $li.find('p.progress span'),
$wrap = $li.find('p.imgWrap'),
$info = $('
').hide().appendTo($li),
showError = function (code) {
switch (code) {
case 'exceed_size':
text = lang.errorExceedSize;
break;
case 'interrupt':
text = lang.errorInterrupt;
break;
case 'http':
text = lang.errorHttp;
break;
case 'not_allow_type':
text = lang.errorFileType;
break;
default:
text = lang.errorUploadRetry;
break;
}
$info.text(text).show();
};
if (file.getStatus() === 'invalid') {
showError(file.statusText);
} else {
$wrap.text(lang.uploadPreview);
if (browser.ie && browser.version <= 7) {
$wrap.text(lang.uploadNoPreview);
} else {
uploader.makeThumb(file, function (error, src) {
if (error || !src) {
$wrap.text(lang.uploadNoPreview);
} else {
var $img = $('
');
$wrap.empty().append($img);
$img.on('error', function () {
$wrap.text(lang.uploadNoPreview);
});
}
}, thumbnailWidth, thumbnailHeight);
}
percentages[ file.id ] = [ file.size, 0 ];
file.rotation = 0;
/* 检查文件格式 */
if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
showError('not_allow_type');
uploader.removeFile(file);
}
}
file.on('statuschange', function (cur, prev) {
if (prev === 'progress') {
$prgress.hide().width(0);
} else if (prev === 'queued') {
$li.off('mouseenter mouseleave');
$btns.remove();
}
// 成功
if (cur === 'error' || cur === 'invalid') {
showError(file.statusText);
percentages[ file.id ][ 1 ] = 1;
} else if (cur === 'interrupt') {
showError('interrupt');
} else if (cur === 'queued') {
percentages[ file.id ][ 1 ] = 0;
} else if (cur === 'progress') {
$info.hide();
$prgress.css('display', 'block');
} else if (cur === 'complete') {
}
$li.removeClass('state-' + prev).addClass('state-' + cur);
});
$li.on('mouseenter', function () {
$btns.stop().animate({height: 30});
});
$li.on('mouseleave', function () {
$btns.stop().animate({height: 0});
});
$btns.on('click', 'span', function () {
var index = $(this).index(),
deg;
switch (index) {
case 0:
uploader.removeFile(file);
return;
case 1:
file.rotation += 90;
break;
case 2:
file.rotation -= 90;
break;
}
if (supportTransition) {
deg = 'rotate(' + file.rotation + 'deg)';
$wrap.css({
'-webkit-transform': deg,
'-mos-transform': deg,
'-o-transform': deg,
'transform': deg
});
} else {
$wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
}
});
$li.insertBefore($filePickerBlock);
}
// 负责view的销毁
function removeFile(file) {
var $li = $('#' + file.id);
delete percentages[ file.id ];
updateTotalProgress();
$li.off().find('.file-panel').off().end().remove();
}
function updateTotalProgress() {
var loaded = 0,
total = 0,
spans = $progress.children(),
percent;
$.each(percentages, function (k, v) {
total += v[ 0 ];
loaded += v[ 0 ] * v[ 1 ];
});
percent = total ? loaded / total : 0;
spans.eq(0).text(Math.round(percent * 100) + '%');
spans.eq(1).css('width', Math.round(percent * 100) + '%');
updateStatus();
}
function setState(val, files) {
if (val != state) {
var stats = uploader.getStats();
$upload.removeClass('state-' + state);
$upload.addClass('state-' + val);
switch (val) {
/* 未选择文件 */
case 'pedding':
$queue.addClass('element-invisible');
$statusBar.addClass('element-invisible');
$placeHolder.removeClass('element-invisible');
$progress.hide(); $info.hide();
uploader.refresh();
break;
/* 可以开始上传 */
case 'ready':
$placeHolder.addClass('element-invisible');
$queue.removeClass('element-invisible');
$statusBar.removeClass('element-invisible');
$progress.hide(); $info.show();
$upload.text(lang.uploadStart);
uploader.refresh();
break;
/* 上传中 */
case 'uploading':
$progress.show(); $info.hide();
$upload.text(lang.uploadPause);
break;
/* 暂停上传 */
case 'paused':
$progress.show(); $info.hide();
$upload.text(lang.uploadContinue);
break;
case 'confirm':
$progress.show(); $info.hide();
$upload.text(lang.uploadStart);
stats = uploader.getStats();
if (stats.successNum && !stats.uploadFailNum) {
setState('finish');
return;
}
break;
case 'finish':
$progress.hide(); $info.show();
if (stats.uploadFailNum) {
$upload.text(lang.uploadRetry);
} else {
$upload.text(lang.uploadStart);
}
break;
}
state = val;
updateStatus();
}
if (!_this.getQueueCount()) {
$upload.addClass('disabled')
} else {
$upload.removeClass('disabled')
}
}
function updateStatus() {
var text = '', stats;
if (state === 'ready') {
text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
} else if (state === 'confirm') {
stats = uploader.getStats();
if (stats.uploadFailNum) {
text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
}
} else {
stats = uploader.getStats();
text = lang.updateStatusFinish.replace('_', fileCount).
replace('_KB', WebUploader.formatSize(fileSize)).
replace('_', stats.successNum);
if (stats.uploadFailNum) {
text += lang.updateStatusError.replace('_', stats.uploadFailNum);
}
}
$info.html(text);
}
uploader.on('fileQueued', function (file) {
fileCount++;
fileSize += file.size;
if (fileCount === 1) {
$placeHolder.addClass('element-invisible');
$statusBar.show();
}
addFile(file);
});
uploader.on('fileDequeued', function (file) {
fileCount--;
fileSize -= file.size;
removeFile(file);
updateTotalProgress();
});
uploader.on('filesQueued', function (file) {
if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
setState('ready');
}
updateTotalProgress();
});
uploader.on('all', function (type, files) {
switch (type) {
case 'uploadFinished':
setState('confirm', files);
break;
case 'startUpload':
/* 添加额外的GET参数 */
var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params);
uploader.option('server', url);
setState('uploading', files);
break;
case 'stopUpload':
setState('paused', files);
break;
}
});
uploader.on('uploadBeforeSend', function (file, data, header) {
//这里可以通过data对象添加POST参数
header['X_Requested_With'] = 'XMLHttpRequest';
});
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress span');
$percent.css('width', percentage * 100 + '%');
percentages[ file.id ][ 1 ] = percentage;
updateTotalProgress();
});
uploader.on('uploadSuccess', function (file, ret) {
var $file = $('#' + file.id);
try {
var responseText = (ret._raw || ret),
json = utils.str2json(responseText);
if (json.state == 'SUCCESS') {
_this.imageList[$file.index()] = json;
$file.append('
');
} else {
$file.find('.error').text(json.state).show();
}
} catch (e) {
$file.find('.error').text(lang.errorServerUpload).show();
}
});
uploader.on('uploadError', function (file, code) {
});
uploader.on('error', function (code, file) {
if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
addFile(file);
}
});
uploader.on('uploadComplete', function (file, ret) {
});
$upload.on('click', function () {
if ($(this).hasClass('disabled')) {
return false;
}
if (state === 'ready') {
uploader.upload();
} else if (state === 'paused') {
uploader.upload();
} else if (state === 'uploading') {
uploader.stop();
}
});
$upload.addClass('state-' + state);
updateTotalProgress();
},
getQueueCount: function () {
var file, i, status, readyFile = 0, files = this.uploader.getFiles();
for (i = 0; file = files[i++]; ) {
status = file.getStatus();
if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
}
return readyFile;
},
destroy: function () {
this.$wrap.remove();
},
getInsertList: function () {
var i, data, list = [],
align = getAlign(),
prefix = editor.getOpt('imageUrlPrefix');
for (i = 0; i < this.imageList.length; i++) {
data = this.imageList[i];
list.push({
src: prefix + data.url,
_src: prefix + data.url,
title: data.title,
alt: data.original,
floatStyle: align
});
}
return list;
}
};
/* 在线图片 */
function OnlineImage(target) {
this.container = utils.isString(target) ? document.getElementById(target) : target;
this.init();
}
OnlineImage.prototype = {
init: function () {
this.reset();
this.initEvents();
},
/* 初始化容器 */
initContainer: function () {
this.container.innerHTML = '';
this.list = document.createElement('ul');
this.clearFloat = document.createElement('li');
domUtils.addClass(this.list, 'list');
domUtils.addClass(this.clearFloat, 'clearFloat');
this.list.appendChild(this.clearFloat);
this.container.appendChild(this.list);
},
/* 初始化滚动事件,滚动到地步自动拉取数据 */
initEvents: function () {
var _this = this;
/* 滚动拉取图片 */
domUtils.on($G('imageList'), 'scroll', function(e){
var panel = this;
if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
_this.getImageData();
}
});
/* 选中图片 */
domUtils.on(this.container, 'click', function (e) {
var target = e.target || e.srcElement,
li = target.parentNode;
if (li.tagName.toLowerCase() == 'li') {
if (domUtils.hasClass(li, 'selected')) {
domUtils.removeClasses(li, 'selected');
} else {
domUtils.addClass(li, 'selected');
}
}
});
},
/* 初始化第一次的数据 */
initData: function () {
/* 拉取数据需要使用的值 */
this.state = 0;
this.listSize = editor.getOpt('imageManagerListSize');
this.listIndex = 0;
this.listEnd = false;
/* 第一次拉取数据 */
this.getImageData();
},
/* 重置界面 */
reset: function() {
this.initContainer();
this.initData();
},
/* 向后台拉取图片列表数据 */
getImageData: function () {
var _this = this;
if(!_this.listEnd && !this.isLoadingData) {
this.isLoadingData = true;
var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),
isJsonp = utils.isCrossDomainUrl(url);
ajax.request(url, {
'timeout': 100000,
'dataType': isJsonp ? 'jsonp':'',
'data': utils.extend({
start: this.listIndex,
size: this.listSize
}, editor.queryCommandValue('serverparam')),
'method': 'get',
'onsuccess': function (r) {
try {
var json = isJsonp ? r:eval('(' + r.responseText + ')');
if (json.state == 'SUCCESS') {
_this.pushData(json.list);
_this.listIndex = parseInt(json.start) + parseInt(json.list.length);
if(_this.listIndex >= json.total) {
_this.listEnd = true;
}
_this.isLoadingData = false;
}
} catch (e) {
if(r.responseText.indexOf('ue_separate_ue') != -1) {
var list = r.responseText.split(r.responseText);
_this.pushData(list);
_this.listIndex = parseInt(list.length);
_this.listEnd = true;
_this.isLoadingData = false;
}
}
},
'onerror': function () {
_this.isLoadingData = false;
}
});
}
},
/* 添加图片到列表界面上 */
pushData: function (list) {
var i, item, img, icon, _this = this,
urlPrefix = editor.getOpt('imageManagerUrlPrefix');
for (i = 0; i < list.length; i++) {
if(list[i] && list[i].url) {
item = document.createElement('li');
img = document.createElement('img');
icon = document.createElement('span');
domUtils.on(img, 'load', (function(image){
return function(){
_this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
}
})(img));
img.width = 113;
img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
img.setAttribute('_src', urlPrefix + list[i].url);
domUtils.addClass(icon, 'icon');
item.appendChild(img);
item.appendChild(icon);
this.list.insertBefore(item, this.clearFloat);
}
}
},
/* 改变图片大小 */
scale: function (img, w, h, type) {
var ow = img.width,
oh = img.height;
if (type == 'justify') {
if (ow >= oh) {
img.width = w;
img.height = h * oh / ow;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w * ow / oh;
img.height = h;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
} else {
if (ow >= oh) {
img.width = w * ow / oh;
img.height = h;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w;
img.height = h * oh / ow;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
}
},
getInsertList: function () {
var i, lis = this.list.children, list = [], align = getAlign();
for (i = 0; i < lis.length; i++) {
if (domUtils.hasClass(lis[i], 'selected')) {
var img = lis[i].firstChild,
src = img.getAttribute('_src');
list.push({
src: src,
_src: src,
alt: src.substr(src.lastIndexOf('/') + 1),
floatStyle: align
});
}
}
return list;
}
};
/*搜索图片 */
function SearchImage() {
this.init();
}
SearchImage.prototype = {
init: function () {
this.initEvents();
},
initEvents: function(){
var _this = this;
/* 点击搜索按钮 */
domUtils.on($G('searchBtn'), 'click', function(){
var key = $G('searchTxt').value;
if(key && key != lang.searchRemind) {
_this.getImageData();
}
});
/* 点击清除妞 */
domUtils.on($G('searchReset'), 'click', function(){
$G('searchTxt').value = lang.searchRemind;
$G('searchListUl').innerHTML = '';
$G('searchType').selectedIndex = 0;
});
/* 搜索框聚焦 */
domUtils.on($G('searchTxt'), 'focus', function(){
var key = $G('searchTxt').value;
if(key && key == lang.searchRemind) {
$G('searchTxt').value = '';
}
});
/* 搜索框回车键搜索 */
domUtils.on($G('searchTxt'), 'keydown', function(e){
var keyCode = e.keyCode || e.which;
if (keyCode == 13) {
$G('searchBtn').click();
}
});
/* 选中图片 */
domUtils.on($G('searchList'), 'click', function(e){
var target = e.target || e.srcElement,
li = target.parentNode.parentNode;
if (li.tagName.toLowerCase() == 'li') {
if (domUtils.hasClass(li, 'selected')) {
domUtils.removeClasses(li, 'selected');
} else {
domUtils.addClass(li, 'selected');
}
}
});
},
encodeToGb2312:function (str){
if(!str) return '';
var strOut = "",
z = 'D2BBB6A18140C6DF814181428143CDF2D5C9C8FDC9CFCFC2D8A2B2BBD3EB8144D8A4B3F38145D7A8C7D2D8A7CAC08146C7F0B1FBD2B5B4D4B6ABCBBFD8A9814781488149B6AA814AC1BDD1CF814BC9A5D8AD814CB8F6D1BEE3DCD6D0814D814EB7E1814FB4AE8150C1D98151D8BC8152CDE8B5A4CEAAD6F78153C0F6BED9D8AF815481558156C4CB8157BEC38158D8B1C3B4D2E58159D6AECEDAD5A7BAF5B7A6C0D6815AC6B9C5D2C7C7815BB9D4815CB3CBD2D2815D815ED8BFBEC5C6F2D2B2CFB0CFE7815F816081618162CAE981638164D8C081658166816781688169816AC2F2C2D2816BC8E9816C816D816E816F817081718172817381748175C7AC8176817781788179817A817B817CC1CB817DD3E8D5F9817ECAC2B6FED8A1D3DABFF78180D4C6BBA5D8C1CEE5BEAE81818182D8A88183D1C7D0A9818481858186D8BDD9EFCDF6BFBA8187BDBBBAA5D2E0B2FABAE0C4B68188CFEDBEA9CDA4C1C18189818A818BC7D7D9F1818CD9F4818D818E818F8190C8CBD8E9819181928193D2DACAB2C8CAD8ECD8EAD8C6BDF6C6CDB3F08194D8EBBDF1BDE98195C8D4B4D381968197C2D88198B2D6D7D0CACBCBFBD5CCB8B6CFC98199819A819BD9DAD8F0C7AA819CD8EE819DB4FAC1EED2D4819E819FD8ED81A0D2C7D8EFC3C781A181A281A3D1F681A4D6D9D8F281A5D8F5BCFEBCDB81A681A781A8C8CE81A9B7DD81AAB7C281ABC6F381AC81AD81AE81AF81B081B181B2D8F8D2C181B381B4CEE9BCBFB7FCB7A5D0DD81B581B681B781B881B9D6DAD3C5BBEFBBE1D8F181BA81BBC9A1CEB0B4AB81BCD8F381BDC9CBD8F6C2D7D8F781BE81BFCEB1D8F981C081C181C2B2AEB9C081C3D9A381C4B0E981C5C1E681C6C9EC81C7CBC581C8CBC6D9A481C981CA81CB81CC81CDB5E881CE81CFB5AB81D081D181D281D381D481D5CEBBB5CDD7A1D7F4D3D381D6CCE581D7BACE81D8D9A2D9DCD3E0D8FDB7F0D7F7D8FED8FAD9A1C4E381D981DAD3B6D8F4D9DD81DBD8FB81DCC5E581DD81DEC0D081DF81E0D1F0B0DB81E181E2BCD1D9A681E3D9A581E481E581E681E7D9ACD9AE81E8D9ABCAB981E981EA81EBD9A9D6B681EC81ED81EEB3DED9A881EFC0FD81F0CACC81F1D9AA81F2D9A781F381F4D9B081F581F6B6B181F781F881F9B9A981FAD2C081FB81FCCFC081FD81FEC2C28240BDC4D5ECB2E0C7C8BFEBD9AD8241D9AF8242CEEABAEE82438244824582468247C7D682488249824A824B824C824D824E824F8250B1E3825182528253B4D9B6EDD9B48254825582568257BFA182588259825AD9DEC7CEC0FED9B8825B825C825D825E825FCBD7B7FD8260D9B58261D9B7B1A3D3E1D9B98262D0C58263D9B682648265D9B18266D9B2C1A9D9B382678268BCF3D0DEB8A98269BEE3826AD9BD826B826C826D826ED9BA826FB0B3827082718272D9C28273827482758276827782788279827A827B827C827D827E8280D9C4B1B68281D9BF82828283B5B98284BEF3828582868287CCC8BAF2D2D08288D9C38289828ABDE8828BB3AB828C828D828ED9C5BEEB828FD9C6D9BBC4DF8290D9BED9C1D9C0829182928293829482958296829782988299829A829BD5AE829CD6B5829DC7E3829E829F82A082A1D9C882A282A382A4BCD9D9CA82A582A682A7D9BC82A8D9CBC6AB82A982AA82AB82AC82ADD9C982AE82AF82B082B1D7F682B2CDA382B382B482B582B682B782B882B982BABDA182BB82BC82BD82BE82BF82C0D9CC82C182C282C382C482C582C682C782C882C9C5BCCDB582CA82CB82CCD9CD82CD82CED9C7B3A5BFFE82CF82D082D182D2B8B582D382D4C0FC82D582D682D782D8B0F882D982DA82DB82DC82DD82DE82DF82E082E182E282E382E482E582E682E782E882E982EA82EB82EC82EDB4F682EED9CE82EFD9CFB4A2D9D082F082F1B4DF82F282F382F482F582F6B0C182F782F882F982FA82FB82FC82FDD9D1C9B582FE8340834183428343834483458346834783488349834A834B834C834D834E834F83508351CFF1835283538354835583568357D9D283588359835AC1C5835B835C835D835E835F836083618362836383648365D9D6C9AE8366836783688369D9D5D9D4D9D7836A836B836C836DCBDB836EBDA9836F8370837183728373C6A7837483758376837783788379837A837B837C837DD9D3D9D8837E83808381D9D9838283838384838583868387C8E583888389838A838B838C838D838E838F839083918392839383948395C0DC8396839783988399839A839B839C839D839E839F83A083A183A283A383A483A583A683A783A883A983AA83AB83AC83AD83AE83AF83B083B183B2B6F9D8A3D4CA83B3D4AAD0D6B3E4D5D783B4CFC8B9E283B5BFCB83B6C3E283B783B883B9B6D283BA83BBCDC3D9EED9F083BC83BD83BEB5B383BFB6B583C083C183C283C383C4BEA483C583C6C8EB83C783C8C8AB83C983CAB0CBB9ABC1F9D9E283CBC0BCB9B283CCB9D8D0CBB1F8C6E4BEDFB5E4D7C883CDD1F8BCE6CADE83CE83CFBCBDD9E6D8E783D083D1C4DA83D283D3B8D4C8BD83D483D5B2E1D4D983D683D783D883D9C3B083DA83DBC3E1DAA2C8DF83DCD0B483DDBEFCC5A983DE83DF83E0B9DA83E1DAA383E2D4A9DAA483E383E483E583E683E7D9FBB6AC83E883E9B7EBB1F9D9FCB3E5BEF683EABFF6D2B1C0E483EB83EC83EDB6B3D9FED9FD83EE83EFBEBB83F083F183F2C6E083F3D7BCDAA183F4C1B983F5B5F2C1E883F683F7BCF583F8B4D583F983FA83FB83FC83FD83FE844084418442C1DD8443C4FD84448445BCB8B7B284468447B7EF84488449844A844B844C844DD9EC844EC6BE844FBFADBBCB84508451B5CA8452DBC9D0D78453CDB9B0BCB3F6BBF7DBCABAAF8454D4E4B5B6B5F3D8D6C8D084558456B7D6C7D0D8D78457BFAF84588459DBBBD8D8845A845BD0CCBBAE845C845D845EEBBEC1D0C1F5D4F2B8D5B4B4845FB3F584608461C9BE846284638464C5D0846584668467C5D9C0FB8468B1F08469D8D9B9CE846AB5BD846B846CD8DA846D846ED6C6CBA2C8AFC9B2B4CCBFCC846FB9F48470D8DBD8DCB6E7BCC1CCEA847184728473847484758476CFF78477D8DDC7B084788479B9D0BDA3847A847BCCDE847CC6CA847D847E848084818482D8E08483D8DE84848485D8DF848684878488B0FE8489BEE7848ACAA3BCF4848B848C848D848EB8B1848F8490B8EE849184928493849484958496849784988499849AD8E2849BBDCB849CD8E4D8E3849D849E849F84A084A1C5FC84A284A384A484A584A684A784A8D8E584A984AAD8E684AB84AC84AD84AE84AF84B084B1C1A684B2C8B0B0ECB9A6BCD3CEF1DBBDC1D384B384B484B584B6B6AFD6FAC5ACBDD9DBBEDBBF84B784B884B9C0F8BEA2C0CD84BA84BB84BC84BD84BE84BF84C084C184C284C3DBC0CAC684C484C584C6B2AA84C784C884C9D3C284CAC3E384CBD1AB84CC84CD84CE84CFDBC284D0C0D584D184D284D3DBC384D4BFB184D584D684D784D884D984DAC4BC84DB84DC84DD84DEC7DA84DF84E084E184E284E384E484E584E684E784E884E9DBC484EA84EB84EC84ED84EE84EF84F084F1D9E8C9D784F284F384F4B9B4CEF0D4C884F584F684F784F8B0FCB4D284F9D0D984FA84FB84FC84FDD9E984FEDECBD9EB8540854185428543D8B0BBAFB1B18544B3D7D8CE85458546D4D185478548BDB3BFEF8549CFBB854A854BD8D0854C854D854EB7CB854F85508551D8D185528553855485558556855785588559855A855BC6A5C7F8D2BD855C855DD8D2C4E4855ECAAE855FC7A78560D8A68561C9FDCEE7BBDCB0EB856285638564BBAAD0AD8565B1B0D7E4D7BF8566B5A5C2F4C4CF85678568B2A98569B2B7856AB1E5DFB2D5BCBFA8C2ACD8D5C2B1856BD8D4CED4856CDAE0856DCEC0856E856FD8B4C3AED3A1CEA38570BCB4C8B4C2D18571BEEDD0B68572DAE18573857485758576C7E485778578B3A78579B6F2CCFCC0FA857A857BC0F7857CD1B9D1E1D8C7857D857E85808581858285838584B2DE85858586C0E58587BAF185888589D8C8858AD4AD858B858CCFE1D8C9858DD8CACFC3858EB3F8BEC7858F859085918592D8CB8593859485958596859785988599DBCC859A859B859C859DC8A5859E859F85A0CFD885A1C8FEB2CE85A285A385A485A585A6D3D6B2E6BCB0D3D1CBABB7B485A785A885A9B7A285AA85ABCAE585ACC8A1CADCB1E4D0F085ADC5D185AE85AF85B0DBC5B5FE85B185B2BFDAB9C5BEE4C1ED85B3DFB6DFB5D6BBBDD0D5D9B0C8B6A3BFC9CCA8DFB3CAB7D3D285B4D8CFD2B6BAC5CBBECCBE85B5DFB7B5F0DFB485B685B785B8D3F585B9B3D4B8F785BADFBA85BBBACFBCAAB5F585BCCDACC3FBBAF3C0F4CDC2CFF2DFB8CFC585BDC2C0DFB9C2F085BE85BF85C0BEFD85C1C1DFCDCCD2F7B7CDDFC185C2DFC485C385C4B7F1B0C9B6D6B7D485C5BAACCCFDBFD4CBB1C6F485C6D6A8DFC585C7CEE2B3B385C885C9CEFCB4B585CACEC7BAF085CBCEE185CCD1BD85CD85CEDFC085CF85D0B4F485D1B3CA85D2B8E6DFBB85D385D485D585D6C4C585D7DFBCDFBDDFBEC5BBDFBFDFC2D4B1DFC385D8C7BACED885D985DA85DB85DC85DDC4D885DEDFCA85DFDFCF85E0D6DC85E185E285E385E485E585E685E785E8DFC9DFDACEB685E9BAC7DFCEDFC8C5DE85EA85EBC9EBBAF4C3FC85EC85EDBED785EEDFC685EFDFCD85F0C5D885F185F285F385F4D5A6BACD85F5BECCD3BDB8C085F6D6E485F7DFC7B9BEBFA785F885F9C1FCDFCBDFCC85FADFD085FB85FC85FD85FE8640DFDBDFE58641DFD7DFD6D7C9DFE3DFE4E5EBD2A7DFD28642BFA98643D4DB8644BFC8DFD4864586468647CFCC86488649DFDD864AD1CA864BDFDEB0A7C6B7DFD3864CBAE5864DB6DFCDDBB9FED4D5864E864FDFDFCFECB0A5DFE7DFD1D1C6DFD5DFD8DFD9DFDC8650BBA98651DFE0DFE18652DFE2DFE6DFE8D3B486538654865586568657B8E7C5B6DFEAC9DAC1A8C4C486588659BFDECFF8865A865B865CD5DCDFEE865D865E865F866086618662B2B88663BADFDFEC8664DBC18665D1E48666866786688669CBF4B4BD866AB0A6866B866C866D866E866FDFF1CCC6DFF286708671DFED867286738674867586768677DFE986788679867A867BDFEB867CDFEFDFF0BBBD867D867EDFF386808681DFF48682BBA38683CADBCEA8E0A7B3AA8684E0A6868586868687E0A186888689868A868BDFFE868CCDD9DFFC868DDFFA868EBFD0D7C4868FC9CC86908691DFF8B0A186928693869486958696DFFD869786988699869ADFFBE0A2869B869C869D869E869FE0A886A086A186A286A3B7C886A486A5C6A1C9B6C0B2DFF586A686A7C5BE86A8D8C4DFF9C4F686A986AA86AB86AC86AD86AEE0A3E0A4E0A5D0A586AF86B0E0B4CCE486B1E0B186B2BFA6E0AFCEB9E0ABC9C686B386B4C0AEE0AEBAEDBAB0E0A986B586B686B7DFF686B8E0B386B986BAE0B886BB86BC86BDB4ADE0B986BE86BFCFB2BAC886C0E0B086C186C286C386C486C586C686C7D0FA86C886C986CA86CB86CC86CD86CE86CF86D0E0AC86D1D4FB86D2DFF786D3C5E786D4E0AD86D5D3F786D6E0B6E0B786D786D886D986DA86DBE0C4D0E186DC86DD86DEE0BC86DF86E0E0C9E0CA86E186E286E3E0BEE0AAC9A4E0C186E4E0B286E586E686E786E886E9CAC8E0C386EAE0B586EBCECB86ECCBC3E0CDE0C6E0C286EDE0CB86EEE0BAE0BFE0C086EF86F0E0C586F186F2E0C7E0C886F3E0CC86F4E0BB86F586F686F786F886F9CBD4E0D586FAE0D6E0D286FB86FC86FD86FE87408741E0D0BCCE87428743E0D18744B8C2D8C587458746874787488749874A874B874CD0EA874D874EC2EF874F8750E0CFE0BD875187528753E0D4E0D387548755E0D78756875787588759E0DCE0D8875A875B875CD6F6B3B0875DD7EC875ECBBB875F8760E0DA8761CEFB876287638764BAD987658766876787688769876A876B876C876D876E876F8770E0E1E0DDD2AD87718772877387748775E0E287768777E0DBE0D9E0DF87788779E0E0877A877B877C877D877EE0DE8780E0E4878187828783C6F7D8ACD4EBE0E6CAC98784878587868787E0E587888789878A878BB8C1878C878D878E878FE0E7E0E887908791879287938794879587968797E0E9E0E387988799879A879B879C879D879EBABFCCE7879F87A087A1E0EA87A287A387A487A587A687A787A887A987AA87AB87AC87AD87AE87AF87B0CFF987B187B287B387B487B587B687B787B887B987BA87BBE0EB87BC87BD87BE87BF87C087C187C2C8C287C387C487C587C6BDC087C787C887C987CA87CB87CC87CD87CE87CF87D087D187D287D3C4D287D487D587D687D787D887D987DA87DB87DCE0EC87DD87DEE0ED87DF87E0C7F4CBC487E1E0EEBBD8D8B6D2F2E0EFCDC587E2B6DA87E387E487E587E687E787E8E0F187E9D4B087EA87EBC0A7B4D187EC87EDCEA7E0F087EE87EF87F0E0F2B9CC87F187F2B9FACDBCE0F387F387F487F5C6D4E0F487F6D4B287F7C8A6E0F6E0F587F887F987FA87FB87FC87FD87FE8840884188428843884488458846884788488849E0F7884A884BCDC1884C884D884ECAA5884F885088518852D4DADBD7DBD98853DBD8B9E7DBDCDBDDB5D888548855DBDA8856885788588859885ADBDBB3A1DBDF885B885CBBF8885DD6B7885EDBE0885F886088618862BEF988638864B7BB8865DBD0CCAEBFB2BBB5D7F8BFD38866886788688869886ABFE9886B886CBCE1CCB3DBDEB0D3CEEBB7D8D7B9C6C2886D886EC0A4886FCCB98870DBE7DBE1C6BADBE38871DBE88872C5F7887388748875DBEA88768877DBE9BFC088788879887ADBE6DBE5887B887C887D887E8880B4B9C0ACC2A2DBE2DBE48881888288838884D0CDDBED88858886888788888889C0DDDBF2888A888B888C888D888E888F8890B6E28891889288938894DBF3DBD2B9B8D4ABDBEC8895BFD1DBF08896DBD18897B5E68898DBEBBFE58899889A889BDBEE889CDBF1889D889E889FDBF988A088A188A288A388A488A588A688A788A8B9A1B0A388A988AA88AB88AC88AD88AE88AFC2F188B088B1B3C7DBEF88B288B3DBF888B4C6D2DBF488B588B6DBF5DBF7DBF688B788B8DBFE88B9D3F2B2BA88BA88BB88BCDBFD88BD88BE88BF88C088C188C288C388C4DCA488C5DBFB88C688C788C888C9DBFA88CA88CB88CCDBFCC5E0BBF988CD88CEDCA388CF88D0DCA588D1CCC388D288D388D4B6D1DDC088D588D688D7DCA188D8DCA288D988DA88DBC7B588DC88DD88DEB6E988DF88E088E1DCA788E288E388E488E5DCA688E6DCA9B1A488E788E8B5CC88E988EA88EB88EC88EDBFB088EE88EF88F088F188F2D1DF88F388F488F588F6B6C288F788F888F988FA88FB88FC88FD88FE894089418942894389448945DCA88946894789488949894A894B894CCBFAEBF3894D894E894FCBDC89508951CBFE895289538954CCC189558956895789588959C8FB895A895B895C895D895E895FDCAA89608961896289638964CCEEDCAB89658966896789688969896A896B896C896D896E896F897089718972897389748975DBD38976DCAFDCAC8977BEB38978CAFB8979897A897BDCAD897C897D897E89808981898289838984C9CAC4B989858986898789888989C7BDDCAE898A898B898CD4F6D0E6898D898E898F89908991899289938994C4ABB6D589958996899789988999899A899B899C899D899E899F89A089A189A289A389A489A589A6DBD489A789A889A989AAB1DA89AB89AC89ADDBD589AE89AF89B089B189B289B389B489B589B689B789B8DBD689B989BA89BBBABE89BC89BD89BE89BF89C089C189C289C389C489C589C689C789C889C9C8C089CA89CB89CC89CD89CE89CFCABFC8C989D0D7B389D1C9F989D289D3BFC789D489D5BAF889D689D7D2BC89D889D989DA89DB89DC89DD89DE89DFE2BA89E0B4A689E189E2B1B889E389E489E589E689E7B8B489E8CFC489E989EA89EB89ECD9E7CFA6CDE289ED89EED9EDB6E089EFD2B989F089F1B9BB89F289F389F489F5E2B9E2B789F6B4F389F7CCECCCABB7F289F8D8B2D1EBBABB89F9CAA789FA89FBCDB789FC89FDD2C4BFE4BCD0B6E189FEDEC58A408A418A428A43DEC6DBBC8A44D1D98A458A46C6E6C4CEB7EE8A47B7DC8A488A49BFFCD7E08A4AC6F58A4B8A4CB1BCDEC8BDB1CCD7DECA8A4DDEC98A4E8A4F8A508A518A52B5EC8A53C9DD8A548A55B0C28A568A578A588A598A5A8A5B8A5C8A5D8A5E8A5F8A608A618A62C5AEC5AB8A63C4CC8A64BCE9CBFD8A658A668A67BAC38A688A698A6AE5F9C8E7E5FACDFD8A6BD7B1B8BEC2E88A6CC8D18A6D8A6EE5FB8A6F8A708A718A72B6CABCCB8A738A74D1FDE6A18A75C3EE8A768A778A788A79E6A48A7A8A7B8A7C8A7DE5FEE6A5CDD78A7E8A80B7C1E5FCE5FDE6A38A818A82C4DDE6A88A838A84E6A78A858A868A878A888A898A8AC3C38A8BC6DE8A8C8A8DE6AA8A8E8A8F8A908A918A928A938A94C4B78A958A968A97E6A2CABC8A988A998A9A8A9BBDE3B9C3E6A6D0D5CEAF8A9C8A9DE6A9E6B08A9ED2A68A9FBDAAE6AD8AA08AA18AA28AA38AA4E6AF8AA5C0D18AA68AA7D2CC8AA88AA98AAABCA78AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB38AB48AB58AB6E6B18AB7D2F68AB88AB98ABAD7CB8ABBCDFE8ABCCDDEC2A6E6ABE6ACBDBFE6AEE6B38ABD8ABEE6B28ABF8AC08AC18AC2E6B68AC3E6B88AC48AC58AC68AC7C4EF8AC88AC98ACAC4C88ACB8ACCBEEAC9EF8ACD8ACEE6B78ACFB6F08AD08AD18AD2C3E48AD38AD48AD58AD68AD78AD88AD9D3E9E6B48ADAE6B58ADBC8A28ADC8ADD8ADE8ADF8AE0E6BD8AE18AE28AE3E6B98AE48AE58AE68AE78AE8C6C58AE98AEACDF1E6BB8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF38AF4E6BC8AF58AF68AF78AF8BBE98AF98AFA8AFB8AFC8AFD8AFE8B40E6BE8B418B428B438B44E6BA8B458B46C0B78B478B488B498B4A8B4B8B4C8B4D8B4E8B4FD3A4E6BFC9F4E6C38B508B51E6C48B528B538B548B55D0F68B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B658B668B67C3BD8B688B698B6A8B6B8B6C8B6D8B6EC3C4E6C28B6F8B708B718B728B738B748B758B768B778B788B798B7A8B7B8B7CE6C18B7D8B7E8B808B818B828B838B84E6C7CFB18B85EBF48B868B87E6CA8B888B898B8A8B8B8B8CE6C58B8D8B8EBCDEC9A98B8F8B908B918B928B938B94BCB58B958B96CFD38B978B988B998B9A8B9BE6C88B9CE6C98B9DE6CE8B9EE6D08B9F8BA08BA1E6D18BA28BA38BA4E6CBB5D58BA5E6CC8BA68BA7E6CF8BA88BA9C4DB8BAAE6C68BAB8BAC8BAD8BAE8BAFE6CD8BB08BB18BB28BB38BB48BB58BB68BB78BB88BB98BBA8BBB8BBC8BBD8BBE8BBF8BC08BC18BC28BC38BC48BC58BC6E6D28BC78BC88BC98BCA8BCB8BCC8BCD8BCE8BCF8BD08BD18BD2E6D4E6D38BD38BD48BD58BD68BD78BD88BD98BDA8BDB8BDC8BDD8BDE8BDF8BE08BE18BE28BE38BE48BE58BE68BE78BE88BE98BEA8BEB8BECE6D58BEDD9F88BEE8BEFE6D68BF08BF18BF28BF38BF48BF58BF68BF7E6D78BF88BF98BFA8BFB8BFC8BFD8BFE8C408C418C428C438C448C458C468C47D7D3E6DD8C48E6DEBFD7D4D08C49D7D6B4E6CBEFE6DAD8C3D7CED0A28C4AC3CF8C4B8C4CE6DFBCBEB9C2E6DBD1A78C4D8C4EBAA2C2CF8C4FD8AB8C508C518C52CAEBE5EE8C53E6DC8C54B7F58C558C568C578C58C8E68C598C5AC4F58C5B8C5CE5B2C4FE8C5DCBFCE5B3D5AC8C5ED3EECAD8B0B28C5FCBCECDEA8C608C61BAEA8C628C638C64E5B58C65E5B48C66D7DAB9D9D6E6B6A8CDF0D2CBB1A6CAB58C67B3E8C9F3BFCDD0FBCAD2E5B6BBC28C688C698C6ACFDCB9AC8C6B8C6C8C6D8C6ED4D78C6F8C70BAA6D1E7CFFCBCD28C71E5B7C8DD8C728C738C74BFEDB1F6CBDE8C758C76BCC58C77BCC4D2FAC3DCBFDC8C788C798C7A8C7BB8BB8C7C8C7D8C7EC3C28C80BAAED4A28C818C828C838C848C858C868C878C888C89C7DEC4AFB2EC8C8AB9D18C8B8C8CE5BBC1C88C8D8C8ED5AF8C8F8C908C918C928C93E5BC8C94E5BE8C958C968C978C988C998C9A8C9BB4E7B6D4CBC2D1B0B5BC8C9C8C9DCAD98C9EB7E28C9F8CA0C9E48CA1BDAB8CA28CA3CEBED7F08CA48CA58CA68CA7D0A18CA8C9D98CA98CAAB6FBE6D8BCE28CABB3BE8CACC9D08CADE6D9B3A28CAE8CAF8CB08CB1DECC8CB2D3C8DECD8CB3D2A28CB48CB58CB68CB7DECE8CB88CB98CBA8CBBBECD8CBC8CBDDECF8CBE8CBF8CC0CAACD2FCB3DFE5EAC4E1BEA1CEB2C4F2BED6C6A8B2E38CC18CC2BED38CC38CC4C7FCCCEBBDECCEDD8CC58CC6CABAC6C1E5ECD0BC8CC78CC88CC9D5B98CCA8CCB8CCCE5ED8CCD8CCE8CCF8CD0CAF48CD1CDC0C2C58CD2E5EF8CD3C2C4E5F08CD48CD58CD68CD78CD88CD98CDAE5F8CDCD8CDBC9BD8CDC8CDD8CDE8CDF8CE08CE18CE2D2D9E1A88CE38CE48CE58CE6D3EC8CE7CBEAC6F18CE88CE98CEA8CEB8CECE1AC8CED8CEE8CEFE1A7E1A98CF08CF1E1AAE1AF8CF28CF3B2ED8CF4E1ABB8DAE1ADE1AEE1B0B5BAE1B18CF58CF68CF78CF88CF9E1B3E1B88CFA8CFB8CFC8CFD8CFED1D28D40E1B6E1B5C1EB8D418D428D43E1B78D44D4C08D45E1B28D46E1BAB0B68D478D488D498D4AE1B48D4BBFF98D4CE1B98D4D8D4EE1BB8D4F8D508D518D528D538D54E1BE8D558D568D578D588D598D5AE1BC8D5B8D5C8D5D8D5E8D5F8D60D6C58D618D628D638D648D658D668D67CFBF8D688D69E1BDE1BFC2CD8D6AB6EB8D6BD3F88D6C8D6DC7CD8D6E8D6FB7E58D708D718D728D738D748D758D768D778D788D79BEFE8D7A8D7B8D7C8D7D8D7E8D80E1C0E1C18D818D82E1C7B3E78D838D848D858D868D878D88C6E98D898D8A8D8B8D8C8D8DB4DE8D8ED1C28D8F8D908D918D92E1C88D938D94E1C68D958D968D978D988D99E1C58D9AE1C3E1C28D9BB1C08D9C8D9D8D9ED5B8E1C48D9F8DA08DA18DA28DA3E1CB8DA48DA58DA68DA78DA88DA98DAA8DABE1CCE1CA8DAC8DAD8DAE8DAF8DB08DB18DB28DB3EFFA8DB48DB5E1D3E1D2C7B68DB68DB78DB88DB98DBA8DBB8DBC8DBD8DBE8DBF8DC0E1C98DC18DC2E1CE8DC3E1D08DC48DC58DC68DC78DC88DC98DCA8DCB8DCC8DCD8DCEE1D48DCFE1D1E1CD8DD08DD1E1CF8DD28DD38DD48DD5E1D58DD68DD78DD88DD98DDA8DDB8DDC8DDD8DDE8DDF8DE08DE18DE2E1D68DE38DE48DE58DE68DE78DE88DE98DEA8DEB8DEC8DED8DEE8DEF8DF08DF18DF28DF38DF48DF58DF68DF78DF8E1D78DF98DFA8DFBE1D88DFC8DFD8DFE8E408E418E428E438E448E458E468E478E488E498E4A8E4B8E4C8E4D8E4E8E4F8E508E518E528E538E548E55E1DA8E568E578E588E598E5A8E5B8E5C8E5D8E5E8E5F8E608E618E62E1DB8E638E648E658E668E678E688E69CEA18E6A8E6B8E6C8E6D8E6E8E6F8E708E718E728E738E748E758E76E7DD8E77B4A8D6DD8E788E79D1B2B3B28E7A8E7BB9A4D7F3C7C9BEDEB9AE8E7CCED78E7D8E7EB2EEDBCF8E80BCBAD2D1CBC8B0CD8E818E82CFEF8E838E848E858E868E87D9E3BDED8E888E89B1D2CAD0B2BC8E8ACBA7B7AB8E8BCAA68E8C8E8D8E8ECFA38E8F8E90E0F8D5CAE0FB8E918E92E0FAC5C1CCFB8E93C1B1E0F9D6E3B2AFD6C4B5DB8E948E958E968E978E988E998E9A8E9BB4F8D6A18E9C8E9D8E9E8E9F8EA0CFAFB0EF8EA18EA2E0FC8EA38EA48EA58EA68EA7E1A1B3A38EA88EA9E0FDE0FEC3B18EAA8EAB8EAC8EADC3DD8EAEE1A2B7F98EAF8EB08EB18EB28EB38EB4BBCF8EB58EB68EB78EB88EB98EBA8EBBE1A3C4BB8EBC8EBD8EBE8EBF8EC0E1A48EC18EC2E1A58EC38EC4E1A6B4B18EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECE8ECF8ED08ED18ED28ED3B8C9C6BDC4EA8ED4B2A28ED5D0D28ED6E7DBBBC3D3D7D3C48ED7B9E3E2CF8ED88ED98EDAD7AF8EDBC7ECB1D38EDC8EDDB4B2E2D18EDE8EDF8EE0D0F2C2AEE2D08EE1BFE2D3A6B5D7E2D2B5EA8EE2C3EDB8FD8EE3B8AE8EE4C5D3B7CFE2D48EE58EE68EE78EE8E2D3B6C8D7F98EE98EEA8EEB8EEC8EEDCDA58EEE8EEF8EF08EF18EF2E2D88EF3E2D6CAFCBFB5D3B9E2D58EF48EF58EF68EF7E2D78EF88EF98EFA8EFB8EFC8EFD8EFE8F408F418F42C1AEC0C88F438F448F458F468F478F48E2DBE2DAC0AA8F498F4AC1CE8F4B8F4C8F4D8F4EE2DC8F4F8F508F518F528F538F548F558F568F578F588F598F5AE2DD8F5BE2DE8F5C8F5D8F5E8F5F8F608F618F628F638F64DBC88F65D1D3CDA28F668F67BDA88F688F698F6ADEC3D8A5BFAADBCDD2ECC6FAC5AA8F6B8F6C8F6DDEC48F6EB1D7DFAE8F6F8F708F71CABD8F72DFB18F73B9AD8F74D2FD8F75B8A5BAEB8F768F77B3DA8F788F798F7AB5DCD5C58F7B8F7C8F7D8F7EC3D6CFD2BBA18F80E5F3E5F28F818F82E5F48F83CDE48F84C8F58F858F868F878F888F898F8A8F8BB5AFC7BF8F8CE5F68F8D8F8E8F8FECB08F908F918F928F938F948F958F968F978F988F998F9A8F9B8F9C8F9D8F9EE5E68F9FB9E9B5B18FA0C2BCE5E8E5E7E5E98FA18FA28FA38FA4D2CD8FA58FA68FA7E1EAD0CE8FA8CDAE8FA9D1E58FAA8FABB2CAB1EB8FACB1F2C5ED8FAD8FAED5C3D3B08FAFE1DC8FB08FB18FB2E1DD8FB3D2DB8FB4B3B9B1CB8FB58FB68FB7CDF9D5F7E1DE8FB8BEB6B4FD8FB9E1DFBADCE1E0BBB2C2C9E1E18FBA8FBB8FBCD0EC8FBDCDBD8FBE8FBFE1E28FC0B5C3C5C7E1E38FC18FC2E1E48FC38FC48FC58FC6D3F98FC78FC88FC98FCA8FCB8FCCE1E58FCDD1AD8FCE8FCFE1E6CEA28FD08FD18FD28FD38FD48FD5E1E78FD6B5C28FD78FD88FD98FDAE1E8BBD58FDB8FDC8FDD8FDE8FDFD0C4E2E0B1D8D2E48FE08FE1E2E18FE28FE3BCC9C8CC8FE4E2E3ECFEECFDDFAF8FE58FE68FE7E2E2D6BECDFCC3A68FE88FE98FEAE3C38FEB8FECD6D2E2E78FED8FEEE2E88FEF8FF0D3C78FF18FF2E2ECBFEC8FF3E2EDE2E58FF48FF5B3C08FF68FF78FF8C4EE8FF98FFAE2EE8FFB8FFCD0C38FFDBAF6E2E9B7DEBBB3CCACCBCBE2E4E2E6E2EAE2EB8FFE90409041E2F790429043E2F4D4F5E2F390449045C5AD9046D5FAC5C2B2C090479048E2EF9049E2F2C1AFCBBC904A904BB5A1E2F9904C904D904EBCB1E2F1D0D4D4B9E2F5B9D6E2F6904F90509051C7D390529053905490559056E2F0905790589059905A905BD7DCEDA1905C905DE2F8905EEDA5E2FECAD1905F906090619062906390649065C1B59066BBD090679068BFD69069BAE3906A906BCBA1906C906D906EEDA6EDA3906F9070EDA29071907290739074BBD6EDA7D0F490759076EDA4BADEB6F7E3A1B6B2CCF1B9A79077CFA2C7A190789079BFD2907A907BB6F1907CE2FAE2FBE2FDE2FCC4D5E3A2907DD3C1907E90809081E3A7C7C49082908390849085CFA490869087E3A9BAB790889089908A908BE3A8908CBBDA908DE3A3908E908F9090E3A4E3AA9091E3A69092CEF2D3C690939094BBBC90959096D4C39097C4FA90989099EDA8D0FCE3A5909AC3F5909BE3ADB1AF909CE3B2909D909E909FBCC290A090A1E3ACB5BF90A290A390A490A590A690A790A890A9C7E9E3B090AA90AB90ACBEAACDEF90AD90AE90AF90B090B1BBF390B290B390B4CCE890B590B6E3AF90B7E3B190B8CFA7E3AE90B9CEA9BBDD90BA90BB90BC90BD90BEB5EBBEE5B2D2B3CD90BFB1B9E3ABB2D1B5ACB9DFB6E890C090C1CFEBE3B790C2BBCC90C390C4C8C7D0CA90C590C690C790C890C9E3B8B3EE90CA90CB90CC90CDEDA990CED3FAD3E490CF90D090D1EDAAE3B9D2E290D290D390D490D590D6E3B590D790D890D990DAD3DE90DB90DC90DD90DEB8D0E3B390DF90E0E3B6B7DF90E1E3B4C0A290E290E390E4E3BA90E590E690E790E890E990EA90EB90EC90ED90EE90EF90F090F190F290F390F490F590F690F7D4B890F890F990FA90FB90FC90FD90FE9140B4C89141E3BB9142BBC59143C9F791449145C9E5914691479148C4BD9149914A914B914C914D914E914FEDAB9150915191529153C2FD9154915591569157BBDBBFAE91589159915A915B915C915D915ECEBF915F916091619162E3BC9163BFB6916491659166916791689169916A916B916C916D916E916F9170917191729173917491759176B1EF91779178D4F79179917A917B917C917DE3BE917E9180918191829183918491859186EDAD918791889189918A918B918C918D918E918FE3BFBAA9EDAC91909191E3BD91929193919491959196919791989199919A919BE3C0919C919D919E919F91A091A1BAB691A291A391A4B6AE91A591A691A791A891A9D0B891AAB0C3EDAE91AB91AC91AD91AE91AFEDAFC0C191B0E3C191B191B291B391B491B591B691B791B891B991BA91BB91BC91BD91BE91BF91C091C1C5B391C291C391C491C591C691C791C891C991CA91CB91CC91CD91CE91CFE3C291D091D191D291D391D491D591D691D791D8DCB291D991DA91DB91DC91DD91DEEDB091DFB8EA91E0CEECEAA7D0E7CAF9C8D6CFB7B3C9CED2BDE491E191E2E3DEBBF2EAA8D5BD91E3C6DDEAA991E491E591E6EAAA91E7EAACEAAB91E8EAAEEAAD91E991EA91EB91ECBDD891EDEAAF91EEC2BE91EF91F091F191F2B4C1B4F791F391F4BBA791F591F691F791F891F9ECE6ECE5B7BFCBF9B1E291FAECE791FB91FC91FDC9C8ECE8ECE991FECAD6DED0B2C5D4FA92409241C6CBB0C7B4F2C8D3924292439244CDD092459246BFB8924792489249924A924B924C924DBFDB924E924FC7A4D6B49250C0A9DED1C9A8D1EFC5A4B0E7B3B6C8C592519252B0E292539254B7F692559256C5FA92579258B6F39259D5D2B3D0BCBC925A925B925CB3AD925D925E925F9260BEF1B0D1926192629263926492659266D2D6CAE3D7A59267CDB6B6B6BFB9D5DB9268B8A7C5D79269926A926BDED2BFD9C2D5C7C0926CBBA4B1A8926D926EC5EA926F9270C5FBCCA79271927292739274B1A7927592769277B5D692789279927AC4A8927BDED3D1BAB3E9927CC3F2927D927EB7F79280D6F4B5A3B2F0C4B4C4E9C0ADDED49281B0E8C5C4C1E09282B9D59283BEDCCDD8B0CE9284CDCFDED6BED0D7BEDED5D5D0B0DD92859286C4E292879288C2A3BCF09289D3B5C0B9C5A1B2A6D4F1928A928BC0A8CAC3DED7D5FC928CB9B0928DC8ADCBA9928EDED9BFBD928F929092919292C6B4D7A7CAB0C4C39293B3D6B9D29294929592969297D6B8EAFCB0B492989299929A929BBFE6929C929DCCF4929E929F92A092A1CDDA92A292A392A4D6BFC2CE92A5CECECCA2D0AEC4D3B5B2DED8D5F5BCB7BBD392A692A7B0A492A8C5B2B4EC92A992AA92ABD5F192AC92ADEAFD92AE92AF92B092B192B292B3DEDACDA692B492B5CDEC92B692B792B892B9CEE6DEDC92BACDB1C0A692BB92BCD7BD92BDDEDBB0C6BAB4C9D3C4F3BEE892BE92BF92C092C1B2B692C292C392C492C592C692C792C892C9C0CCCBF092CABCF1BBBBB5B792CB92CC92CDC5F592CEDEE692CF92D092D1DEE3BEDD92D292D3DEDF92D492D592D692D7B4B7BDDD92D892D9DEE0C4ED92DA92DB92DC92DDCFC692DEB5E092DF92E092E192E2B6DECADAB5F4DEE592E3D5C692E4DEE1CCCDC6FE92E5C5C592E692E792E8D2B492E9BEF292EA92EB92EC92ED92EE92EF92F0C2D392F1CCBDB3B892F2BDD392F3BFD8CDC6D1DAB4EB92F4DEE4DEDDDEE792F5EAFE92F692F7C2B0DEE292F892F9D6C0B5A792FAB2F492FBDEE892FCDEF292FD92FE934093419342DEED9343DEF193449345C8E0934693479348D7E1DEEFC3E8CCE19349B2E5934A934B934CD2BE934D934E934F9350935193529353DEEE9354DEEBCED59355B4A79356935793589359935ABFABBEBE935B935CBDD2935D935E935F9360DEE99361D4AE9362DEDE9363DEEA9364936593669367C0BF9368DEECB2F3B8E9C2A79369936ABDC1936B936C936D936E936FDEF5DEF893709371B2ABB4A493729373B4EAC9A6937493759376937793789379DEF6CBD1937AB8E3937BDEF7DEFA937C937D937E9380DEF9938193829383CCC29384B0E1B4EE93859386938793889389938AE5BA938B938C938D938E938FD0AF93909391B2EB9392EBA19393DEF493949395C9E3DEF3B0DAD2A1B1F79396CCAF939793989399939A939B939C939DDEF0939ECBA4939F93A093A1D5AA93A293A393A493A593A6DEFB93A793A893A993AA93AB93AC93AD93AEB4DD93AFC4A693B093B193B2DEFD93B393B493B593B693B793B893B993BA93BB93BCC3FEC4A1DFA193BD93BE93BF93C093C193C293C3C1CC93C4DEFCBEEF93C5C6B293C693C793C893C993CA93CB93CC93CD93CEB3C5C8F693CF93D0CBBADEFE93D193D2DFA493D393D493D593D6D7B293D793D893D993DA93DBB3B793DC93DD93DE93DFC1C393E093E1C7CBB2A5B4E993E2D7AB93E393E493E593E6C4EC93E7DFA2DFA393E8DFA593E9BAB393EA93EB93ECDFA693EDC0DE93EE93EFC9C393F093F193F293F393F493F593F6B2D9C7E693F7DFA793F8C7DC93F993FA93FB93FCDFA8EBA293FD93FE944094419442CBD3944394449445DFAA9446DFA99447B2C194489449944A944B944C944D944E944F9450945194529453945494559456945794589459945A945B945C945D945E945F9460C5CA94619462946394649465946694679468DFAB9469946A946B946C946D946E946F9470D4DC94719472947394749475C8C19476947794789479947A947B947C947D947E948094819482DFAC94839484948594869487BEF094889489DFADD6A7948A948B948C948DEAB7EBB6CAD5948ED8FCB8C4948FB9A594909491B7C5D5FE94929493949494959496B9CA94979498D0A7F4CD9499949AB5D0949B949CC3F4949DBEC8949E949F94A0EBB7B0BD94A194A2BDCC94A3C1B294A4B1D6B3A894A594A694A7B8D2C9A294A894A9B6D894AA94AB94AC94ADEBB8BEB494AE94AF94B0CAFD94B1C7C394B2D5FB94B394B4B7F394B594B694B794B894B994BA94BB94BC94BD94BE94BF94C094C194C294C3CEC494C494C594C6D5ABB1F394C794C894C9ECB3B0DF94CAECB594CB94CC94CDB6B794CEC1CF94CFF5FAD0B194D094D1D5E594D2CED394D394D4BDEFB3E294D5B8AB94D6D5B694D7EDBD94D8B6CF94D9CBB9D0C294DA94DB94DC94DD94DE94DF94E094E1B7BD94E294E3ECB6CAA994E494E594E6C5D494E7ECB9ECB8C2C3ECB794E894E994EA94EBD0FDECBA94ECECBBD7E594ED94EEECBC94EF94F094F1ECBDC6EC94F294F394F494F594F694F794F894F9CEDE94FABCC894FB94FCC8D5B5A9BEC9D6BCD4E794FD94FED1AED0F1EAB8EAB9EABABAB59540954195429543CAB1BFF595449545CDFA9546954795489549954AEAC0954BB0BAEABE954C954DC0A5954E954F9550EABB9551B2FD9552C3F7BBE8955395549555D2D7CEF4EABF955695579558EABC9559955A955BEAC3955CD0C7D3B3955D955E955F9560B4BA9561C3C1D7F29562956395649565D5D19566CAC79567EAC595689569EAC4EAC7EAC6956A956B956C956D956ED6E7956FCFD495709571EACB9572BBCE9573957495759576957795789579BDFAC9CE957A957BEACC957C957DC9B9CFFEEACAD4CEEACDEACF957E9580CDED9581958295839584EAC99585EACE95869587CEEE9588BBDE9589B3BF958A958B958C958D958EC6D5BEB0CEFA958F95909591C7E79592BEA7EAD095939594D6C7959595969597C1C095989599959AD4DD959BEAD1959C959DCFBE959E959F95A095A1EAD295A295A395A495A5CAEE95A695A795A895A9C5AFB0B595AA95AB95AC95AD95AEEAD495AF95B095B195B295B395B495B595B695B7EAD3F4DF95B895B995BA95BB95BCC4BA95BD95BE95BF95C095C1B1A995C295C395C495C5E5DF95C695C795C895C9EAD595CA95CB95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB95DC95DD95DE95DF95E095E195E295E3CAEF95E4EAD6EAD7C6D895E595E695E795E895E995EA95EB95ECEAD895ED95EEEAD995EF95F095F195F295F395F4D4BB95F5C7FAD2B7B8FC95F695F7EAC295F8B2DC95F995FAC2FC95FBD4F8CCE6D7EE95FC95FD95FE9640964196429643D4C2D3D0EBC3C5F39644B7FE96459646EBD4964796489649CBB7EBDE964AC0CA964B964C964DCDFB964EB3AF964FC6DA965096519652965396549655EBFC9656C4BE9657CEB4C4A9B1BED4FD9658CAF59659D6EC965A965BC6D3B6E4965C965D965E965FBBFA96609661D0E096629663C9B19664D4D3C8A896659666B8CB9667E8BEC9BC96689669E8BB966AC0EED0D3B2C4B4E5966BE8BC966C966DD5C8966E966F967096719672B6C59673E8BDCAF8B8DCCCF5967496759676C0B496779678D1EEE8BFE8C29679967ABABC967BB1ADBDDC967CEABDE8C3967DE8C6967EE8CB9680968196829683E8CC9684CBC9B0E59685BCAB96869687B9B996889689E8C1968ACDF7968BE8CA968C968D968E968FCEF69690969196929693D5ED9694C1D6E8C49695C3B69696B9FBD6A6E8C8969796989699CAE0D4E6969AE8C0969BE8C5E8C7969CC7B9B7E3969DE8C9969EBFDDE8D2969F96A0E8D796A1E8D5BCDCBCCFE8DB96A296A396A496A596A696A796A896A9E8DE96AAE8DAB1FA96AB96AC96AD96AE96AF96B096B196B296B396B4B0D8C4B3B8CCC6E2C8BEC8E196B596B696B7E8CFE8D4E8D696B8B9F1E8D8D7F596B9C4FB96BAE8DC96BB96BCB2E996BD96BE96BFE8D196C096C1BCED96C296C3BFC2E8CDD6F996C4C1F8B2F196C596C696C796C896C996CA96CB96CCE8DF96CDCAC1E8D996CE96CF96D096D1D5A496D2B1EAD5BBE8CEE8D0B6B0E8D396D3E8DDC0B896D4CAF796D5CBA896D696D7C6DCC0F596D896D996DA96DB96DCE8E996DD96DE96DFD0A396E096E196E296E396E496E596E6E8F2D6EA96E796E896E996EA96EB96EC96EDE8E0E8E196EE96EF96F0D1F9BACBB8F996F196F2B8F1D4D4E8EF96F3E8EEE8ECB9F0CCD2E8E6CEA6BFF296F4B0B8E8F1E8F096F5D7C096F6E8E496F7CDA9C9A396F8BBB8BDDBE8EA96F996FA96FB96FC96FD96FE9740974197429743E8E2E8E3E8E5B5B5E8E7C7C5E8EBE8EDBDB0D7AE9744E8F897459746974797489749974A974B974CE8F5974DCDB0E8F6974E974F9750975197529753975497559756C1BA9757E8E89758C3B7B0F09759975A975B975C975D975E975F9760E8F4976197629763E8F7976497659766B9A3976797689769976A976B976C976D976E976F9770C9D2977197729773C3CECEE0C0E69774977597769777CBF39778CCDDD0B59779977ACAE1977BE8F3977C977D977E9780978197829783978497859786BCEC9787E8F997889789978A978B978C978DC3DE978EC6E5978FB9F79790979197929793B0F497949795D7D897969797BCAC9798C5EF9799979A979B979C979DCCC4979E979FE9A697A097A197A297A397A497A597A697A797A897A9C9AD97AAE9A2C0E297AB97AC97ADBFC397AE97AF97B0E8FEB9D797B1E8FB97B297B397B497B5E9A497B697B797B8D2CE97B997BA97BB97BC97BDE9A397BED6B2D7B597BFE9A797C0BDB797C197C297C397C497C597C697C797C897C997CA97CB97CCE8FCE8FD97CD97CE97CFE9A197D097D197D297D397D497D597D697D7CDD697D897D9D2AC97DA97DB97DCE9B297DD97DE97DF97E0E9A997E197E297E3B4AA97E4B4BB97E597E6E9AB97E797E897E997EA97EB97EC97ED97EE97EF97F097F197F297F397F497F597F697F7D0A897F897F9E9A597FA97FBB3FE97FC97FDE9ACC0E397FEE9AA98409841E9B998429843E9B89844984598469847E9AE98489849E8FA984A984BE9A8984C984D984E984F9850BFACE9B1E9BA98519852C2A5985398549855E9AF9856B8C59857E9AD9858D3DCE9B4E9B5E9B79859985A985BE9C7985C985D985E985F98609861C0C6E9C598629863E9B098649865E9BBB0F19866986798689869986A986B986C986D986E986FE9BCD5A598709871E9BE9872E9BF987398749875E9C198769877C1F198789879C8B6987A987B987CE9BD987D987E988098819882E9C29883988498859886988798889889988AE9C3988BE9B3988CE9B6988DBBB1988E988F9890E9C0989198929893989498959896BCF7989798989899E9C4E9C6989A989B989C989D989E989F98A098A198A298A398A498A5E9CA98A698A798A898A9E9CE98AA98AB98AC98AD98AE98AF98B098B198B298B3B2DB98B4E9C898B598B698B798B898B998BA98BB98BC98BD98BEB7AE98BF98C098C198C298C398C498C598C698C798C898C998CAE9CBE9CC98CB98CC98CD98CE98CF98D0D5C198D1C4A398D298D398D498D598D698D7E9D898D8BAE198D998DA98DB98DCE9C998DDD3A398DE98DF98E0E9D498E198E298E398E498E598E698E7E9D7E9D098E898E998EA98EB98ECE9CF98ED98EEC7C198EF98F098F198F298F398F498F598F6E9D298F798F898F998FA98FB98FC98FDE9D9B3C898FEE9D399409941994299439944CFF0994599469947E9CD99489949994A994B994C994D994E994F995099519952B3F79953995499559956995799589959E9D6995A995BE9DA995C995D995ECCB4995F99609961CFAD99629963996499659966996799689969996AE9D5996BE9DCE9DB996C996D996E996F9970E9DE99719972997399749975997699779978E9D19979997A997B997C997D997E99809981E9DD9982E9DFC3CA9983998499859986998799889989998A998B998C998D998E998F9990999199929993999499959996999799989999999A999B999C999D999E999F99A099A199A299A399A499A599A699A799A899A999AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B999BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C999CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D899D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E899E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F5C7B7B4CEBBB6D0C0ECA399F699F7C5B799F899F999FA99FB99FC99FD99FE9A409A419A42D3FB9A439A449A459A46ECA49A47ECA5C6DB9A489A499A4ABFEE9A4B9A4C9A4D9A4EECA69A4F9A50ECA7D0AA9A51C7B89A529A53B8E89A549A559A569A579A589A599A5A9A5B9A5C9A5D9A5E9A5FECA89A609A619A629A639A649A659A669A67D6B9D5FDB4CBB2BDCEE4C6E79A689A69CDE19A6A9A6B9A6C9A6D9A6E9A6F9A709A719A729A739A749A759A769A77B4F59A78CBC0BCDF9A799A7A9A7B9A7CE9E2E9E3D1EAE9E59A7DB4F9E9E49A7ED1B3CAE2B2D09A80E9E89A819A829A839A84E9E6E9E79A859A86D6B39A879A889A89E9E9E9EA9A8A9A8B9A8C9A8D9A8EE9EB9A8F9A909A919A929A939A949A959A96E9EC9A979A989A999A9A9A9B9A9C9A9D9A9EECAFC5B9B6CE9A9FD2F39AA09AA19AA29AA39AA49AA59AA6B5EE9AA7BBD9ECB19AA89AA9D2E39AAA9AAB9AAC9AAD9AAECEE39AAFC4B89AB0C3BF9AB19AB2B6BED8B9B1C8B1CFB1D1C5FE9AB3B1D09AB4C3AB9AB59AB69AB79AB89AB9D5B19ABA9ABB9ABC9ABD9ABE9ABF9AC09AC1EBA4BAC19AC29AC39AC4CCBA9AC59AC69AC7EBA59AC8EBA79AC99ACA9ACBEBA89ACC9ACD9ACEEBA69ACF9AD09AD19AD29AD39AD49AD5EBA9EBABEBAA9AD69AD79AD89AD99ADAEBAC9ADBCACFD8B5C3F19ADCC3A5C6F8EBADC4CA9ADDEBAEEBAFEBB0B7D59ADE9ADF9AE0B7FA9AE1EBB1C7E29AE2EBB39AE3BAA4D1F5B0B1EBB2EBB49AE49AE59AE6B5AAC2C8C7E89AE7EBB59AE8CBAEE3DF9AE99AEAD3C09AEB9AEC9AED9AEED9DB9AEF9AF0CDA1D6ADC7F39AF19AF29AF3D9E0BBE39AF4BABAE3E29AF59AF69AF79AF89AF9CFAB9AFA9AFB9AFCE3E0C9C79AFDBAB99AFE9B409B41D1B4E3E1C8EAB9AFBDADB3D8CEDB9B429B43CCC09B449B459B46E3E8E3E9CDF49B479B489B499B4A9B4BCCAD9B4CBCB39B4DE3EA9B4EE3EB9B4F9B50D0DA9B519B529B53C6FBB7DA9B549B55C7DFD2CACED69B56E3E4E3EC9B57C9F2B3C19B589B59E3E79B5A9B5BC6E3E3E59B5C9B5DEDB3E3E69B5E9B5F9B609B61C9B39B62C5E69B639B649B65B9B59B66C3BB9B67E3E3C5BDC1A4C2D9B2D79B68E3EDBBA6C4AD9B69E3F0BEDA9B6A9B6BE3FBE3F5BAD39B6C9B6D9B6E9B6FB7D0D3CD9B70D6CED5D3B9C1D5B4D1D89B719B729B739B74D0B9C7F69B759B769B77C8AAB2B49B78C3DA9B799B7A9B7BE3EE9B7C9B7DE3FCE3EFB7A8E3F7E3F49B7E9B809B81B7BA9B829B83C5A29B84E3F6C5DDB2A8C6FC9B85C4E09B869B87D7A29B88C0E1E3F99B899B8AE3FAE3FDCCA9E3F39B8BD3BE9B8CB1C3EDB4E3F1E3F29B8DE3F8D0BAC6C3D4F3E3FE9B8E9B8FBDE09B909B91E4A79B929B93E4A69B949B959B96D1F3E4A39B97E4A99B989B999B9AC8F79B9B9B9C9B9D9B9ECFB49B9FE4A8E4AEC2E59BA09BA1B6B49BA29BA39BA49BA59BA69BA7BDF29BA8E4A29BA99BAABAE9E4AA9BAB9BACE4AC9BAD9BAEB6FDD6DEE4B29BAFE4AD9BB09BB19BB2E4A19BB3BBEECDDDC7A2C5C99BB49BB5C1F79BB6E4A49BB7C7B3BDACBDBDE4A59BB8D7C7B2E29BB9E4ABBCC3E4AF9BBABBEBE4B0C5A8E4B19BBB9BBC9BBD9BBED5E3BFA39BBFE4BA9BC0E4B79BC1E4BB9BC29BC3E4BD9BC49BC5C6D69BC69BC7BAC6C0CB9BC89BC99BCAB8A1E4B49BCB9BCC9BCD9BCED4A19BCF9BD0BAA3BDFE9BD19BD29BD3E4BC9BD49BD59BD69BD79BD8CDBF9BD99BDAC4F99BDB9BDCCFFBC9E69BDD9BDED3BF9BDFCFD19BE09BE1E4B39BE2E4B8E4B9CCE99BE39BE49BE59BE69BE7CCCE9BE8C0D4E4B5C1B0E4B6CED09BE9BBC1B5D39BEAC8F3BDA7D5C7C9ACB8A2E4CA9BEB9BECE4CCD1C49BED9BEED2BA9BEF9BF0BAAD9BF19BF2BAD49BF39BF49BF59BF69BF79BF8E4C3B5ED9BF99BFA9BFBD7CDE4C0CFFDE4BF9BFC9BFD9BFEC1DCCCCA9C409C419C429C43CAE79C449C459C469C47C4D79C48CCD4E4C89C499C4A9C4BE4C7E4C19C4CE4C4B5AD9C4D9C4ED3D99C4FE4C69C509C519C529C53D2F9B4E39C54BBB49C559C56C9EE9C57B4BE9C589C599C5ABBEC9C5BD1CD9C5CCCEDEDB59C5D9C5E9C5F9C609C619C629C639C64C7E59C659C669C679C68D4A89C69E4CBD7D5E4C29C6ABDA5E4C59C6B9C6CD3E69C6DE4C9C9F89C6E9C6FE4BE9C709C71D3E59C729C73C7FEB6C99C74D4FCB2B3E4D79C759C769C77CEC29C78E4CD9C79CEBC9C7AB8DB9C7B9C7CE4D69C7DBFCA9C7E9C809C81D3CE9C82C3EC9C839C849C859C869C879C889C899C8AC5C8E4D89C8B9C8C9C8D9C8E9C8F9C909C919C92CDC4E4CF9C939C949C959C96E4D4E4D59C97BAFE9C98CFE69C999C9AD5BF9C9B9C9C9C9DE4D29C9E9C9F9CA09CA19CA29CA39CA49CA59CA69CA79CA8E4D09CA99CAAE4CE9CAB9CAC9CAD9CAE9CAF9CB09CB19CB29CB39CB49CB59CB69CB79CB89CB9CDE5CAAA9CBA9CBB9CBCC0A39CBDBDA6E4D39CBE9CBFB8C89CC09CC19CC29CC39CC4E4E7D4B49CC59CC69CC79CC89CC99CCA9CCBE4DB9CCC9CCD9CCEC1EF9CCF9CD0E4E99CD19CD2D2E79CD39CD4E4DF9CD5E4E09CD69CD7CFAA9CD89CD99CDA9CDBCBDD9CDCE4DAE4D19CDDE4E59CDEC8DCE4E39CDF9CE0C4E7E4E29CE1E4E19CE29CE39CE4B3FCE4E89CE59CE69CE79CE8B5E19CE99CEA9CEBD7CC9CEC9CED9CEEE4E69CEFBBAC9CF0D7D2CCCFEBF89CF1E4E49CF29CF3B9F69CF49CF59CF6D6CDE4D9E4DCC2FAE4DE9CF7C2CBC0C4C2D09CF8B1F5CCB29CF99CFA9CFB9CFC9CFD9CFE9D409D419D429D43B5CE9D449D459D469D47E4EF9D489D499D4A9D4B9D4C9D4D9D4E9D4FC6AF9D509D519D52C6E19D539D54E4F59D559D569D579D589D59C2A99D5A9D5B9D5CC0ECD1DDE4EE9D5D9D5E9D5F9D609D619D629D639D649D659D66C4AE9D679D689D69E4ED9D6A9D6B9D6C9D6DE4F6E4F4C2FE9D6EE4DD9D6FE4F09D70CAFE9D71D5C49D729D73E4F19D749D759D769D779D789D799D7AD1FA9D7B9D7C9D7D9D7E9D809D819D82E4EBE4EC9D839D849D85E4F29D86CEAB9D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D90C5CB9D919D929D93C7B19D94C2BA9D959D969D97E4EA9D989D999D9AC1CA9D9B9D9C9D9D9D9E9D9F9DA0CCB6B3B19DA19DA29DA3E4FB9DA4E4F39DA59DA69DA7E4FA9DA8E4FD9DA9E4FC9DAA9DAB9DAC9DAD9DAE9DAF9DB0B3CE9DB19DB29DB3B3BAE4F79DB49DB5E4F9E4F8C5EC9DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2C0BD9DC39DC49DC59DC6D4E89DC79DC89DC99DCA9DCBE5A29DCC9DCD9DCE9DCF9DD09DD19DD29DD39DD49DD59DD6B0C49DD79DD8E5A49DD99DDAE5A39DDB9DDC9DDD9DDE9DDF9DE0BCA49DE1E5A59DE29DE39DE49DE59DE69DE7E5A19DE89DE99DEA9DEB9DEC9DED9DEEE4FEB1F49DEF9DF09DF19DF29DF39DF49DF59DF69DF79DF89DF9E5A89DFAE5A9E5A69DFB9DFC9DFD9DFE9E409E419E429E439E449E459E469E47E5A7E5AA9E489E499E4A9E4B9E4C9E4D9E4E9E4F9E509E519E529E539E549E559E569E579E589E599E5A9E5B9E5C9E5D9E5E9E5F9E609E619E629E639E649E659E669E679E68C6D99E699E6A9E6B9E6C9E6D9E6E9E6F9E70E5ABE5AD9E719E729E739E749E759E769E77E5AC9E789E799E7A9E7B9E7C9E7D9E7E9E809E819E829E839E849E859E869E879E889E89E5AF9E8A9E8B9E8CE5AE9E8D9E8E9E8F9E909E919E929E939E949E959E969E979E989E999E9A9E9B9E9C9E9D9E9EB9E09E9F9EA0E5B09EA19EA29EA39EA49EA59EA69EA79EA89EA99EAA9EAB9EAC9EAD9EAEE5B19EAF9EB09EB19EB29EB39EB49EB59EB69EB79EB89EB99EBABBF0ECE1C3F09EBBB5C6BBD29EBC9EBD9EBE9EBFC1E9D4EE9EC0BEC49EC19EC29EC3D7C69EC4D4D6B2D3ECBE9EC59EC69EC79EC8EAC19EC99ECA9ECBC2AFB4B69ECC9ECD9ECED1D79ECF9ED09ED1B3B49ED2C8B2BFBBECC09ED39ED4D6CB9ED59ED6ECBFECC19ED79ED89ED99EDA9EDB9EDC9EDD9EDE9EDF9EE09EE19EE29EE3ECC5BEE6CCBFC5DABEBC9EE4ECC69EE5B1FE9EE69EE79EE8ECC4D5A8B5E39EE9ECC2C1B6B3E39EEA9EEBECC3CBB8C0C3CCFE9EEC9EED9EEE9EEFC1D29EF0ECC89EF19EF29EF39EF49EF59EF69EF79EF89EF99EFA9EFB9EFC9EFDBAE6C0D39EFED6F29F409F419F42D1CC9F439F449F459F46BFBE9F47B7B3C9D5ECC7BBE29F48CCCCBDFDC8C89F49CFA99F4A9F4B9F4C9F4D9F4E9F4F9F50CDE99F51C5EB9F529F539F54B7E99F559F569F579F589F599F5A9F5B9F5C9F5D9F5E9F5FD1C9BAB89F609F619F629F639F64ECC99F659F66ECCA9F67BBC0ECCB9F68ECE2B1BAB7D99F699F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F73BDB99F749F759F769F779F789F799F7A9F7BECCCD1E6ECCD9F7C9F7D9F7E9F80C8BB9F819F829F839F849F859F869F879F889F899F8A9F8B9F8C9F8D9F8EECD19F8F9F909F919F92ECD39F93BBCD9F94BCE59F959F969F979F989F999F9A9F9B9F9C9F9D9F9E9F9F9FA09FA1ECCF9FA2C9B79FA39FA49FA59FA69FA7C3BA9FA8ECE3D5D5ECD09FA99FAA9FAB9FAC9FADD6F39FAE9FAF9FB0ECD2ECCE9FB19FB29FB39FB4ECD49FB5ECD59FB69FB7C9BF9FB89FB99FBA9FBB9FBC9FBDCFA89FBE9FBF9FC09FC19FC2D0DC9FC39FC49FC59FC6D1AC9FC79FC89FC99FCAC8DB9FCB9FCC9FCDECD6CEF59FCE9FCF9FD09FD19FD2CAECECDA9FD39FD49FD59FD69FD79FD89FD9ECD99FDA9FDB9FDCB0BE9FDD9FDE9FDF9FE09FE19FE2ECD79FE3ECD89FE49FE59FE6ECE49FE79FE89FE99FEA9FEB9FEC9FED9FEE9FEFC8BC9FF09FF19FF29FF39FF49FF59FF69FF79FF89FF9C1C79FFA9FFB9FFC9FFD9FFEECDCD1E0A040A041A042A043A044A045A046A047A048A049ECDBA04AA04BA04CA04DD4EFA04EECDDA04FA050A051A052A053A054DBC6A055A056A057A058A059A05AA05BA05CA05DA05EECDEA05FA060A061A062A063A064A065A066A067A068A069A06AB1ACA06BA06CA06DA06EA06FA070A071A072A073A074A075A076A077A078A079A07AA07BA07CA07DA07EA080A081ECDFA082A083A084A085A086A087A088A089A08AA08BECE0A08CD7A6A08DC5C0A08EA08FA090EBBCB0AEA091A092A093BEF4B8B8D2AFB0D6B5F9A094D8B3A095CBACA096E3DDA097A098A099A09AA09BA09CA09DC6ACB0E6A09EA09FA0A0C5C6EBB9A0A1A0A2A0A3A0A4EBBAA0A5A0A6A0A7EBBBA0A8A0A9D1C0A0AAC5A3A0ABEAF2A0ACC4B2A0ADC4B5C0CEA0AEA0AFA0B0EAF3C4C1A0B1CEEFA0B2A0B3A0B4A0B5EAF0EAF4A0B6A0B7C9FCA0B8A0B9C7A3A0BAA0BBA0BCCCD8CEFEA0BDA0BEA0BFEAF5EAF6CFACC0E7A0C0A0C1EAF7A0C2A0C3A0C4A0C5A0C6B6BFEAF8A0C7EAF9A0C8EAFAA0C9A0CAEAFBA0CBA0CCA0CDA0CEA0CFA0D0A0D1A0D2A0D3A0D4A0D5A0D6EAF1A0D7A0D8A0D9A0DAA0DBA0DCA0DDA0DEA0DFA0E0A0E1A0E2C8AEE1EBA0E3B7B8E1ECA0E4A0E5A0E6E1EDA0E7D7B4E1EEE1EFD3CCA0E8A0E9A0EAA0EBA0ECA0EDA0EEE1F1BFF1E1F0B5D2A0EFA0F0A0F1B1B7A0F2A0F3A0F4A0F5E1F3E1F2A0F6BAFCA0F7E1F4A0F8A0F9A0FAA0FBB9B7A0FCBED1A0FDA0FEAA40AA41C4FCAA42BADDBDC6AA43AA44AA45AA46AA47AA48E1F5E1F7AA49AA4AB6C0CFC1CAA8E1F6D5F8D3FCE1F8E1FCE1F9AA4BAA4CE1FAC0EAAA4DE1FEE2A1C0C7AA4EAA4FAA50AA51E1FBAA52E1FDAA53AA54AA55AA56AA57AA58E2A5AA59AA5AAA5BC1D4AA5CAA5DAA5EAA5FE2A3AA60E2A8B2FEE2A2AA61AA62AA63C3CDB2C2E2A7E2A6AA64AA65E2A4E2A9AA66AA67E2ABAA68AA69AA6AD0C9D6EDC3A8E2ACAA6BCFD7AA6CAA6DE2AEAA6EAA6FBAEFAA70AA71E9E0E2ADE2AAAA72AA73AA74AA75BBABD4B3AA76AA77AA78AA79AA7AAA7BAA7CAA7DAA7EAA80AA81AA82AA83E2B0AA84AA85E2AFAA86E9E1AA87AA88AA89AA8AE2B1AA8BAA8CAA8DAA8EAA8FAA90AA91AA92E2B2AA93AA94AA95AA96AA97AA98AA99AA9AAA9BAA9CAA9DE2B3CCA1AA9EE2B4AA9FAAA0AB40AB41AB42AB43AB44AB45AB46AB47AB48AB49AB4AAB4BE2B5AB4CAB4DAB4EAB4FAB50D0FEAB51AB52C2CAAB53D3F1AB54CDF5AB55AB56E7E0AB57AB58E7E1AB59AB5AAB5BAB5CBEC1AB5DAB5EAB5FAB60C2EAAB61AB62AB63E7E4AB64AB65E7E3AB66AB67AB68AB69AB6AAB6BCDE6AB6CC3B5AB6DAB6EE7E2BBB7CFD6AB6FC1E1E7E9AB70AB71AB72E7E8AB73AB74E7F4B2A3AB75AB76AB77AB78E7EAAB79E7E6AB7AAB7BAB7CAB7DAB7EE7ECE7EBC9BAAB80AB81D5E4AB82E7E5B7A9E7E7AB83AB84AB85AB86AB87AB88AB89E7EEAB8AAB8BAB8CAB8DE7F3AB8ED6E9AB8FAB90AB91AB92E7EDAB93E7F2AB94E7F1AB95AB96AB97B0E0AB98AB99AB9AAB9BE7F5AB9CAB9DAB9EAB9FABA0AC40AC41AC42AC43AC44AC45AC46AC47AC48AC49AC4AC7F2AC4BC0C5C0EDAC4CAC4DC1F0E7F0AC4EAC4FAC50AC51E7F6CBF6AC52AC53AC54AC55AC56AC57AC58AC59AC5AE8A2E8A1AC5BAC5CAC5DAC5EAC5FAC60D7C1AC61AC62E7FAE7F9AC63E7FBAC64E7F7AC65E7FEAC66E7FDAC67E7FCAC68AC69C1D5C7D9C5FDC5C3AC6AAC6BAC6CAC6DAC6EC7EDAC6FAC70AC71AC72E8A3AC73AC74AC75AC76AC77AC78AC79AC7AAC7BAC7CAC7DAC7EAC80AC81AC82AC83AC84AC85AC86E8A6AC87E8A5AC88E8A7BAF7E7F8E8A4AC89C8F0C9AAAC8AAC8BAC8CAC8DAC8EAC8FAC90AC91AC92AC93AC94AC95AC96E8A9AC97AC98B9E5AC99AC9AAC9BAC9CAC9DD1FEE8A8AC9EAC9FACA0AD40AD41AD42E8AAAD43E8ADE8AEAD44C1A7AD45AD46AD47E8AFAD48AD49AD4AE8B0AD4BAD4CE8ACAD4DE8B4AD4EAD4FAD50AD51AD52AD53AD54AD55AD56AD57AD58E8ABAD59E8B1AD5AAD5BAD5CAD5DAD5EAD5FAD60AD61E8B5E8B2E8B3AD62AD63AD64AD65AD66AD67AD68AD69AD6AAD6BAD6CAD6DAD6EAD6FAD70AD71E8B7AD72AD73AD74AD75AD76AD77AD78AD79AD7AAD7BAD7CAD7DAD7EAD80AD81AD82AD83AD84AD85AD86AD87AD88AD89E8B6AD8AAD8BAD8CAD8DAD8EAD8FAD90AD91AD92B9CFAD93F0ACAD94F0ADAD95C6B0B0EAC8BFAD96CDDFAD97AD98AD99AD9AAD9BAD9CAD9DCECDEAB1AD9EAD9FADA0AE40EAB2AE41C6BFB4C9AE42AE43AE44AE45AE46AE47AE48EAB3AE49AE4AAE4BAE4CD5E7AE4DAE4EAE4FAE50AE51AE52AE53AE54DDF9AE55EAB4AE56EAB5AE57EAB6AE58AE59AE5AAE5BB8CADFB0C9F5AE5CCCF0AE5DAE5EC9FAAE5FAE60AE61AE62AE63C9FBAE64AE65D3C3CBA6AE66B8A6F0AEB1C2AE67E5B8CCEFD3C9BCD7C9EAAE68B5E7AE69C4D0B5E9AE6AEEAEBBADAE6BAE6CE7DEAE6DEEAFAE6EAE6FAE70AE71B3A9AE72AE73EEB2AE74AE75EEB1BDE7AE76EEB0CEB7AE77AE78AE79AE7AC5CFAE7BAE7CAE7DAE7EC1F4DBCEEEB3D0F3AE80AE81AE82AE83AE84AE85AE86AE87C2D4C6E8AE88AE89AE8AB7ACAE8BAE8CAE8DAE8EAE8FAE90AE91EEB4AE92B3EBAE93AE94AE95BBFBEEB5AE96AE97AE98AE99AE9AE7DCAE9BAE9CAE9DEEB6AE9EAE9FBDAEAEA0AF40AF41AF42F1E2AF43AF44AF45CAE8AF46D2C9F0DAAF47F0DBAF48F0DCC1C6AF49B8EDBECEAF4AAF4BF0DEAF4CC5B1F0DDD1F1AF4DF0E0B0CCBDEAAF4EAF4FAF50AF51AF52D2DFF0DFAF53B4AFB7E8F0E6F0E5C6A3F0E1F0E2B4C3AF54AF55F0E3D5EEAF56AF57CCDBBED2BCB2AF58AF59AF5AF0E8F0E7F0E4B2A1AF5BD6A2D3B8BEB7C8ACAF5CAF5DF0EAAF5EAF5FAF60AF61D1F7AF62D6CCBADBF0E9AF63B6BBAF64AF65CDB4AF66AF67C6A6AF68AF69AF6AC1A1F0EBF0EEAF6BF0EDF0F0F0ECAF6CBBBEF0EFAF6DAF6EAF6FAF70CCB5F0F2AF71AF72B3D5AF73AF74AF75AF76B1D4AF77AF78F0F3AF79AF7AF0F4F0F6B4E1AF7BF0F1AF7CF0F7AF7DAF7EAF80AF81F0FAAF82F0F8AF83AF84AF85F0F5AF86AF87AF88AF89F0FDAF8AF0F9F0FCF0FEAF8BF1A1AF8CAF8DAF8ECEC1F1A4AF8FF1A3AF90C1F6F0FBCADDAF91AF92B4F1B1F1CCB1AF93F1A6AF94AF95F1A7AF96AF97F1ACD5CEF1A9AF98AF99C8B3AF9AAF9BAF9CF1A2AF9DF1ABF1A8F1A5AF9EAF9FF1AAAFA0B040B041B042B043B044B045B046B0A9F1ADB047B048B049B04AB04BB04CF1AFB04DF1B1B04EB04FB050B051B052F1B0B053F1AEB054B055B056B057D1A2B058B059B05AB05BB05CB05DB05EF1B2B05FB060B061F1B3B062B063B064B065B066B067B068B069B9EFB06AB06BB5C7B06CB0D7B0D9B06DB06EB06FD4EDB070B5C4B071BDD4BBCAF0A7B072B073B8DEB074B075F0A8B076B077B0A8B078F0A9B079B07ACDEEB07BB07CF0AAB07DB07EB080B081B082B083B084B085B086B087F0ABB088B089B08AB08BB08CB08DB08EB08FB090C6A4B091B092D6E5F1E4B093F1E5B094B095B096B097B098B099B09AB09BB09CB09DC3F3B09EB09FD3DBB0A0B140D6D1C5E8B141D3AFB142D2E6B143B144EEC1B0BBD5B5D1CEBCE0BAD0B145BFF8B146B8C7B5C1C5CCB147B148CAA2B149B14AB14BC3CBB14CB14DB14EB14FB150EEC2B151B152B153B154B155B156B157B158C4BFB6A2B159EDECC3A4B15AD6B1B15BB15CB15DCFE0EDEFB15EB15FC5CEB160B6DCB161B162CAA1B163B164EDEDB165B166EDF0EDF1C3BCB167BFB4B168EDEEB169B16AB16BB16CB16DB16EB16FB170B171B172B173EDF4EDF2B174B175B176B177D5E6C3DFB178EDF3B179B17AB17BEDF6B17CD5A3D1A3B17DB17EB180EDF5B181C3D0B182B183B184B185B186EDF7BFF4BEECEDF8B187CCF7B188D1DBB189B18AB18BD7C5D5F6B18CEDFCB18DB18EB18FEDFBB190B191B192B193B194B195B196B197EDF9EDFAB198B199B19AB19BB19CB19DB19EB19FEDFDBEA6B1A0B240B241B242B243CBAFEEA1B6BDB244EEA2C4C0B245EDFEB246B247BDDEB2C7B248B249B24AB24BB24CB24DB24EB24FB250B251B252B253B6C3B254B255B256EEA5D8BAEEA3EEA6B257B258B259C3E9B3F2B25AB25BB25CB25DB25EB25FEEA7EEA4CFB9B260B261EEA8C2F7B262B263B264B265B266B267B268B269B26AB26BB26CB26DEEA9EEAAB26EDEABB26FB270C6B3B271C7C6B272D6F5B5C9B273CBB2B274B275B276EEABB277B278CDABB279EEACB27AB27BB27CB27DB27ED5B0B280EEADB281F6C4B282B283B284B285B286B287B288B289B28AB28BB28CB28DB28EDBC7B28FB290B291B292B293B294B295B296B297B4A3B298B299B29AC3ACF1E6B29BB29CB29DB29EB29FCAB8D2D3B2A0D6AAB340EFF2B341BED8B342BDC3EFF3B6CCB0ABB343B344B345B346CAAFB347B348EDB6B349EDB7B34AB34BB34CB34DCEF9B7AFBFF3EDB8C2EBC9B0B34EB34FB350B351B352B353EDB9B354B355C6F6BFB3B356B357B358EDBCC5F8B359D1D0B35AD7A9EDBAEDBBB35BD1E2B35CEDBFEDC0B35DEDC4B35EB35FB360EDC8B361EDC6EDCED5E8B362EDC9B363B364EDC7EDBEB365B366C5E9B367B368B369C6C6B36AB36BC9E9D4D2EDC1EDC2EDC3EDC5B36CC0F9B36DB4A1B36EB36FB370B371B9E8B372EDD0B373B374B375B376EDD1B377EDCAB378EDCFB379CEF8B37AB37BCBB6EDCCEDCDB37CB37DB37EB380B381CFF5B382B383B384B385B386B387B388B389B38AB38BB38CB38DEDD2C1F2D3B2EDCBC8B7B38EB38FB390B391B392B393B394B395BCEFB396B397B398B399C5F0B39AB39BB39CB39DB39EB39FB3A0B440B441B442EDD6B443B5EFB444B445C2B5B0ADCBE9B446B447B1AEB448EDD4B449B44AB44BCDEBB5E2B44CEDD5EDD3EDD7B44DB44EB5FAB44FEDD8B450EDD9B451EDDCB452B1CCB453B454B455B456B457B458B459B45AC5F6BCEEEDDACCBCB2EAB45BB45CB45DB45EEDDBB45FB460B461B462C4EBB463B464B4C5B465B466B467B0F5B468B469B46AEDDFC0DAB4E8B46BB46CB46DB46EC5CDB46FB470B471EDDDBFC4B472B473B474EDDEB475B476B477B478B479B47AB47BB47CB47DB47EB480B481B482B483C4A5B484B485B486EDE0B487B488B489B48AB48BEDE1B48CEDE3B48DB48EC1D7B48FB490BBC7B491B492B493B494B495B496BDB8B497B498B499EDE2B49AB49BB49CB49DB49EB49FB4A0B540B541B542B543B544B545EDE4B546B547B548B549B54AB54BB54CB54DB54EB54FEDE6B550B551B552B553B554EDE5B555B556B557B558B559B55AB55BB55CB55DB55EB55FB560B561B562B563EDE7B564B565B566B567B568CABEECEAC0F1B569C9E7B56AECEBC6EEB56BB56CB56DB56EECECB56FC6EDECEDB570B571B572B573B574B575B576B577B578ECF0B579B57AD7E6ECF3B57BB57CECF1ECEEECEFD7A3C9F1CBEEECF4B57DECF2B57EB580CFE9B581ECF6C6B1B582B583B584B585BCC0B586ECF5B587B588B589B58AB58BB58CB58DB5BBBBF6B58EECF7B58FB590B591B592B593D9F7BDFBB594B595C2BBECF8B596B597B598B599ECF9B59AB59BB59CB59DB8A3B59EB59FB5A0B640B641B642B643B644B645B646ECFAB647B648B649B64AB64BB64CB64DB64EB64FB650B651B652ECFBB653B654B655B656B657B658B659B65AB65BB65CB65DECFCB65EB65FB660B661B662D3EDD8AEC0EBB663C7DDBACCB664D0E3CBBDB665CDBAB666B667B8D1B668B669B1FCB66AC7EFB66BD6D6B66CB66DB66EBFC6C3EBB66FB670EFF5B671B672C3D8B673B674B675B676B677B678D7E2B679B67AB67BEFF7B3D3B67CC7D8D1EDB67DD6C8B67EEFF8B680EFF6B681BBFDB3C6B682B683B684B685B686B687B688BDD5B689B68AD2C6B68BBBE0B68CB68DCFA1B68EEFFCEFFBB68FB690EFF9B691B692B693B694B3CCB695C9D4CBB0B696B697B698B699B69AEFFEB69BB69CB0DEB69DB69ED6C9B69FB6A0B740EFFDB741B3EDB742B743F6D5B744B745B746B747B748B749B74AB74BB74CB74DB74EB74FB750B751B752CEC8B753B754B755F0A2B756F0A1B757B5BEBCDABBFCB758B8E5B759B75AB75BB75CB75DB75EC4C2B75FB760B761B762B763B764B765B766B767B768F0A3B769B76AB76BB76CB76DCBEBB76EB76FB770B771B772B773B774B775B776B777B778B779B77AB77BB77CB77DB77EB780B781B782B783B784B785B786F0A6B787B788B789D1A8B78ABEBFC7EEF1B6F1B7BFD5B78BB78CB78DB78EB4A9F1B8CDBBB78FC7D4D5ADB790F1B9B791F1BAB792B793B794B795C7CFB796B797B798D2A4D6CFB799B79AF1BBBDD1B4B0BEBDB79BB79CB79DB4DCCED1B79EBFDFF1BDB79FB7A0B840B841BFFAF1BCB842F1BFB843B844B845F1BEF1C0B846B847B848B849B84AF1C1B84BB84CB84DB84EB84FB850B851B852B853B854B855C1FEB856B857B858B859B85AB85BB85CB85DB85EB85FB860C1A2B861B862B863B864B865B866B867B868B869B86ACAFAB86BB86CD5BEB86DB86EB86FB870BEBABEB9D5C2B871B872BFA2B873CDAFF1B5B874B875B876B877B878B879BDDFB87AB6CBB87BB87CB87DB87EB880B881B882B883B884D6F1F3C3B885B886F3C4B887B8CDB888B889B88AF3C6F3C7B88BB0CAB88CF3C5B88DF3C9CBF1B88EB88FB890F3CBB891D0A6B892B893B1CAF3C8B894B895B896F3CFB897B5D1B898B899F3D7B89AF3D2B89BB89CB89DF3D4F3D3B7FBB89EB1BFB89FF3CEF3CAB5DAB8A0F3D0B940B941F3D1B942F3D5B943B944B945B946F3CDB947BCE3B948C1FDB949F3D6B94AB94BB94CB94DB94EB94FF3DAB950F3CCB951B5C8B952BDEEF3DCB953B954B7A4BFF0D6FECDB2B955B4F0B956B2DFB957F3D8B958F3D9C9B8B959F3DDB95AB95BF3DEB95CF3E1B95DB95EB95FB960B961B962B963B964B965B966B967F3DFB968B969F3E3F3E2B96AB96BF3DBB96CBFEAB96DB3EFB96EF3E0B96FB970C7A9B971BCF2B972B973B974B975F3EBB976B977B978B979B97AB97BB97CB9BFB97DB97EF3E4B980B981B982B2ADBBFEB983CBE3B984B985B986B987F3EDF3E9B988B989B98AB9DCF3EEB98BB98CB98DF3E5F3E6F3EAC2E1F3ECF3EFF3E8BCFDB98EB98FB990CFE4B991B992F3F0B993B994B995F3E7B996B997B998B999B99AB99BB99CB99DF3F2B99EB99FB9A0BA40D7ADC6AABA41BA42BA43BA44F3F3BA45BA46BA47BA48F3F1BA49C2A8BA4ABA4BBA4CBA4DBA4EB8DDF3F5BA4FBA50F3F4BA51BA52BA53B4DBBA54BA55BA56F3F6F3F7BA57BA58BA59F3F8BA5ABA5BBA5CC0BABA5DBA5EC0E9BA5FBA60BA61BA62BA63C5F1BA64BA65BA66BA67F3FBBA68F3FABA69BA6ABA6BBA6CBA6DBA6EBA6FBA70B4D8BA71BA72BA73F3FEF3F9BA74BA75F3FCBA76BA77BA78BA79BA7ABA7BF3FDBA7CBA7DBA7EBA80BA81BA82BA83BA84F4A1BA85BA86BA87BA88BA89BA8AF4A3BBC9BA8BBA8CF4A2BA8DBA8EBA8FBA90BA91BA92BA93BA94BA95BA96BA97BA98BA99F4A4BA9ABA9BBA9CBA9DBA9EBA9FB2BEF4A6F4A5BAA0BB40BB41BB42BB43BB44BB45BB46BB47BB48BB49BCAEBB4ABB4BBB4CBB4DBB4EBB4FBB50BB51BB52BB53BB54BB55BB56BB57BB58BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB61BB62BB63BB64BB65BB66BB67BB68BB69BB6ABB6BBB6CBB6DBB6EC3D7D9E1BB6FBB70BB71BB72BB73BB74C0E0F4CCD7D1BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB80B7DBBB81BB82BB83BB84BB85BB86BB87F4CEC1A3BB88BB89C6C9BB8AB4D6D5B3BB8BBB8CBB8DF4D0F4CFF4D1CBDABB8EBB8FF4D2BB90D4C1D6E0BB91BB92BB93BB94B7E0BB95BB96BB97C1B8BB98BB99C1BBF4D3BEACBB9ABB9BBB9CBB9DBB9EB4E2BB9FBBA0F4D4F4D5BEABBC40BC41F4D6BC42BC43BC44F4DBBC45F4D7F4DABC46BAFDBC47F4D8F4D9BC48BC49BC4ABC4BBC4CBC4DBC4EB8E2CCC7F4DCBC4FB2DABC50BC51C3D3BC52BC53D4E3BFB7BC54BC55BC56BC57BC58BC59BC5AF4DDBC5BBC5CBC5DBC5EBC5FBC60C5B4BC61BC62BC63BC64BC65BC66BC67BC68F4E9BC69BC6ACFB5BC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78CEC9BC79BC7ABC7BBC7CBC7DBC7EBC80BC81BC82BC83BC84BC85BC86BC87BC88BC89BC8ABC8BBC8CBC8DBC8ECBD8BC8FCBF7BC90BC91BC92BC93BDF4BC94BC95BC96D7CFBC97BC98BC99C0DBBC9ABC9BBC9CBC9DBC9EBC9FBCA0BD40BD41BD42BD43BD44BD45BD46BD47BD48BD49BD4ABD4BBD4CBD4DBD4EBD4FBD50BD51BD52BD53BD54BD55BD56BD57BD58BD59BD5ABD5BBD5CBD5DBD5EBD5FBD60BD61BD62BD63BD64BD65BD66BD67BD68BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71BD72BD73BD74BD75BD76D0F5BD77BD78BD79BD7ABD7BBD7CBD7DBD7EF4EABD80BD81BD82BD83BD84BD85BD86BD87BD88BD89BD8ABD8BBD8CBD8DBD8EBD8FBD90BD91BD92BD93BD94BD95BD96BD97BD98BD99BD9ABD9BBD9CBD9DBD9EBD9FBDA0BE40BE41BE42BE43BE44BE45BE46BE47BE48BE49BE4ABE4BBE4CF4EBBE4DBE4EBE4FBE50BE51BE52BE53F4ECBE54BE55BE56BE57BE58BE59BE5ABE5BBE5CBE5DBE5EBE5FBE60BE61BE62BE63BE64BE65BE66BE67BE68BE69BE6ABE6BBE6CBE6DBE6EBE6FBE70BE71BE72BE73BE74BE75BE76BE77BE78BE79BE7ABE7BBE7CBE7DBE7EBE80BE81BE82BE83BE84BE85BE86BE87BE88BE89BE8ABE8BBE8CBE8DBE8EBE8FBE90BE91BE92BE93BE94BE95BE96BE97BE98BE99BE9ABE9BBE9CBE9DBE9EBE9FBEA0BF40BF41BF42BF43BF44BF45BF46BF47BF48BF49BF4ABF4BBF4CBF4DBF4EBF4FBF50BF51BF52BF53BF54BF55BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF80F7E3BF81BF82BF83BF84BF85B7B1BF86BF87BF88BF89BF8AF4EDBF8BBF8CBF8DBF8EBF8FBF90BF91BF92BF93BF94BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9DBF9EBF9FBFA0C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04EC04FC050C051C052C053C054C055C056C057C058C059C05AC05BC05CC05DC05EC05FC060C061C062C063D7EBC064C065C066C067C068C069C06AC06BC06CC06DC06EC06FC070C071C072C073C074C075C076C077C078C079C07AC07BF4EEC07CC07DC07EE6F9BEC0E6FABAECE6FBCFCBE6FCD4BCBCB6E6FDE6FEBCCDC8D2CEB3E7A1C080B4BFE7A2C9B4B8D9C4C9C081D7DDC2DAB7D7D6BDCEC6B7C4C082C083C5A6E7A3CFDFE7A4E7A5E7A6C1B7D7E9C9F0CFB8D6AFD6D5E7A7B0EDE7A8E7A9C9DCD2EFBEADE7AAB0F3C8DEBDE1E7ABC8C6C084E7ACBBE6B8F8D1A4E7ADC2E7BEF8BDCACDB3E7AEE7AFBEEED0E5C085CBE7CCD0BCCCE7B0BCA8D0F7E7B1C086D0F8E7B2E7B3B4C2E7B4E7B5C9FECEACC3E0E7B7B1C1B3F1C087E7B8E7B9D7DBD5C0E7BAC2CCD7BAE7BBE7BCE7BDBCEAC3E5C0C2E7BEE7BFBCA9C088E7C0E7C1E7B6B6D0E7C2C089E7C3E7C4BBBAB5DEC2C6B1E0E7C5D4B5E7C6B8BFE7C8E7C7B7ECC08AE7C9B2F8E7CAE7CBE7CCE7CDE7CEE7CFE7D0D3A7CBF5E7D1E7D2E7D3E7D4C9C9E7D5E7D6E7D7E7D8E7D9BDC9E7DAF3BEC08BB8D7C08CC8B1C08DC08EC08FC090C091C092C093F3BFC094F3C0F3C1C095C096C097C098C099C09AC09BC09CC09DC09EB9DECDF8C09FC0A0D8E8BAB1C140C2DEEEB7C141B7A3C142C143C144C145EEB9C146EEB8B0D5C147C148C149C14AC14BEEBBD5D6D7EFC14CC14DC14ED6C3C14FC150EEBDCAF0C151EEBCC152C153C154C155EEBEC156C157C158C159EEC0C15AC15BEEBFC15CC15DC15EC15FC160C161C162C163D1F2C164C7BCC165C3C0C166C167C168C169C16AB8E1C16BC16CC16DC16EC16FC1E7C170C171F4C6D0DFF4C7C172CFDBC173C174C8BAC175C176F4C8C177C178C179C17AC17BC17CC17DF4C9F4CAC17EF4CBC180C181C182C183C184D9FAB8FEC185C186E5F1D3F0C187F4E0C188CECCC189C18AC18BB3E1C18CC18DC18EC18FF1B4C190D2EEC191F4E1C192C193C194C195C196CFE8F4E2C197C198C7CCC199C19AC19BC19CC19DC19EB5D4B4E4F4E4C19FC1A0C240F4E3F4E5C241C242F4E6C243C244C245C246F4E7C247BAB2B0BFC248F4E8C249C24AC24BC24CC24DC24EC24FB7ADD2EDC250C251C252D2ABC0CFC253BFBCEBA3D5DFEAC8C254C255C256C257F1F3B6F8CBA3C258C259C4CDC25AF1E7C25BF1E8B8FBF1E9BAC4D4C5B0D2C25CC25DF1EAC25EC25FC260F1EBC261F1ECC262C263F1EDF1EEF1EFF1F1F1F0C5D5C264C265C266C267C268C269F1F2C26AB6FAC26BF1F4D2AEDEC7CBCAC26CC26DB3DCC26EB5A2C26FB9A2C270C271C4F4F1F5C272C273F1F6C274C275C276C1C4C1FBD6B0F1F7C277C278C279C27AF1F8C27BC1AAC27CC27DC27EC6B8C280BEDBC281C282C283C284C285C286C287C288C289C28AC28BC28CC28DC28EF1F9B4CFC28FC290C291C292C293C294F1FAC295C296C297C298C299C29AC29BC29CC29DC29EC29FC2A0C340EDB2EDB1C341C342CBE0D2DEC343CBC1D5D8C344C8E2C345C0DFBCA1C346C347C348C349C34AC34BEBC1C34CC34DD0A4C34ED6E2C34FB6C7B8D8EBC0B8CEC350EBBFB3A6B9C9D6ABC351B7F4B7CAC352C353C354BCE7B7BEEBC6C355EBC7B0B9BFCFC356EBC5D3FDC357EBC8C358C359EBC9C35AC35BB7CEC35CEBC2EBC4C9F6D6D7D5CDD0B2EBCFCEB8EBD0C35DB5A8C35EC35FC360C361C362B1B3EBD2CCA5C363C364C365C366C367C368C369C5D6EBD3C36AEBD1C5DFEBCECAA4EBD5B0FBC36BC36CBAFAC36DC36ED8B7F1E3C36FEBCAEBCBEBCCEBCDEBD6E6C0EBD9C370BFE8D2C8EBD7EBDCB8ECEBD8C371BDBAC372D0D8C373B0B7C374EBDDC4DCC375C376C377C378D6ACC379C37AC37BB4E0C37CC37DC2F6BCB9C37EC380EBDAEBDBD4E0C6EAC4D4EBDFC5A7D9F5C381B2B1C382EBE4C383BDC5C384C385C386EBE2C387C388C389C38AC38BC38CC38DC38EC38FC390C391C392C393EBE3C394C395B8ACC396CDD1EBE5C397C398C399EBE1C39AC1B3C39BC39CC39DC39EC39FC6A2C3A0C440C441C442C443C444C445CCF3C446EBE6C447C0B0D2B8EBE7C448C449C44AB8AFB8ADC44BEBE8C7BBCDF3C44CC44DC44EEBEAEBEBC44FC450C451C452C453EBEDC454C455C456C457D0C8C458EBF2C459EBEEC45AC45BC45CEBF1C8F9C45DD1FCEBECC45EC45FEBE9C460C461C462C463B8B9CFD9C4E5EBEFEBF0CCDACDC8B0F2C464EBF6C465C466C467C468C469EBF5C46AB2B2C46BC46CC46DC46EB8E0C46FEBF7C470C471C472C473C474C475B1ECC476C477CCC5C4A4CFA5C478C479C47AC47BC47CEBF9C47DC47EECA2C480C5F2C481EBFAC482C483C484C485C486C487C488C489C9C5C48AC48BC48CC48DC48EC48FE2DFEBFEC490C491C492C493CDCEECA1B1DBD3B7C494C495D2DCC496C497C498EBFDC499EBFBC49AC49BC49CC49DC49EC49FC4A0C540C541C542C543C544C545C546C547C548C549C54AC54BC54CC54DC54EB3BCC54FC550C551EAB0C552C553D7D4C554F4ABB3F4C555C556C557C558C559D6C1D6C2C55AC55BC55CC55DC55EC55FD5E9BECAC560F4A7C561D2A8F4A8F4A9C562F4AABECBD3DFC563C564C565C566C567C9E0C9E1C568C569F3C2C56ACAE6C56BCCF2C56CC56DC56EC56FC570C571E2B6CBB4C572CEE8D6DBC573F4ADF4AEF4AFC574C575C576C577F4B2C578BABDF4B3B0E3F4B0C579F4B1BDA2B2D5C57AF4B6F4B7B6E6B2B0CFCFF4B4B4ACC57BF4B5C57CC57DF4B8C57EC580C581C582C583F4B9C584C585CDA7C586F4BAC587F4BBC588C589C58AF4BCC58BC58CC58DC58EC58FC590C591C592CBD2C593F4BDC594C595C596C597F4BEC598C599C59AC59BC59CC59DC59EC59FF4BFC5A0C640C641C642C643F4DEC1BCBCE8C644C9ABD1DEE5F5C645C646C647C648DCB3D2D5C649C64ADCB4B0ACDCB5C64BC64CBDDAC64DDCB9C64EC64FC650D8C2C651DCB7D3F3C652C9D6DCBADCB6C653DCBBC3A2C654C655C656C657DCBCDCC5DCBDC658C659CEDFD6A5C65ADCCFC65BDCCDC65CC65DDCD2BDE6C2ABC65EDCB8DCCBDCCEDCBEB7D2B0C5DCC7D0BEDCC1BBA8C65FB7BCDCCCC660C661DCC6DCBFC7DBC662C663C664D1BFDCC0C665C666DCCAC667C668DCD0C669C66ACEADDCC2C66BDCC3DCC8DCC9B2D4DCD1CBD5C66CD4B7DCDBDCDFCCA6DCE6C66DC3E7DCDCC66EC66FBFC1DCD9C670B0FAB9B6DCE5DCD3C671DCC4DCD6C8F4BFE0C672C673C674C675C9BBC676C677C678B1BDC679D3A2C67AC67BDCDAC67CC67DDCD5C67EC6BBC680DCDEC681C682C683C684C685D7C2C3AFB7B6C7D1C3A9DCE2DCD8DCEBDCD4C686C687DCDDC688BEA5DCD7C689DCE0C68AC68BDCE3DCE4C68CDCF8C68DC68EDCE1DDA2DCE7C68FC690C691C692C693C694C695C696C697C698BCEBB4C4C699C69AC3A3B2E7DCFAC69BDCF2C69CDCEFC69DDCFCDCEED2F0B2E8C69EC8D7C8E3DCFBC69FDCEDC6A0C740C741DCF7C742C743DCF5C744C745BEA3DCF4C746B2DDC747C748C749C74AC74BDCF3BCF6DCE8BBC4C74CC0F3C74DC74EC74FC750C751BCD4DCE9DCEAC752DCF1DCF6DCF9B5B4C753C8D9BBE7DCFEDCFDD3ABDDA1DDA3DDA5D2F1DDA4DDA6DDA7D2A9C754C755C756C757C758C759C75ABAC9DDA9C75BC75CDDB6DDB1DDB4C75DC75EC75FC760C761C762C763DDB0C6CEC764C765C0F2C766C767C768C769C9AFC76AC76BC76CDCECDDAEC76DC76EC76FC770DDB7C771C772DCF0DDAFC773DDB8C774DDACC775C776C777C778C779C77AC77BDDB9DDB3DDADC4AAC77CC77DC77EC780DDA8C0B3C1ABDDAADDABC781DDB2BBF1DDB5D3A8DDBAC782DDBBC3A7C783C784DDD2DDBCC785C786C787DDD1C788B9BDC789C78ABED5C78BBEFAC78CC78DBACAC78EC78FC790C791DDCAC792DDC5C793DDBFC794C795C796B2CBDDC3C797DDCBB2A4DDD5C798C799C79ADDBEC79BC79CC79DC6D0DDD0C79EC79FC7A0C840C841DDD4C1E2B7C6C842C843C844C845C846DDCEDDCFC847C848C849DDC4C84AC84BC84CDDBDC84DDDCDCCD1C84EDDC9C84FC850C851C852DDC2C3C8C6BCCEAEDDCCC853DDC8C854C855C856C857C858C859DDC1C85AC85BC85CDDC6C2DCC85DC85EC85FC860C861C862D3A9D3AADDD3CFF4C8F8C863C864C865C866C867C868C869C86ADDE6C86BC86CC86DC86EC86FC870DDC7C871C872C873DDE0C2E4C874C875C876C877C878C879C87AC87BDDE1C87CC87DC87EC880C881C882C883C884C885C886DDD7C887C888C889C88AC88BD6F8C88CDDD9DDD8B8F0DDD6C88DC88EC88FC890C6CFC891B6ADC892C893C894C895C896DDE2C897BAF9D4E1DDE7C898C899C89AB4D0C89BDDDAC89CBFFBDDE3C89DDDDFC89EDDDDC89FC8A0C940C941C942C943C944B5D9C945C946C947C948DDDBDDDCDDDEC949BDAFDDE4C94ADDE5C94BC94CC94DC94EC94FC950C951C952DDF5C953C3C9C954C955CBE2C956C957C958C959DDF2C95AC95BC95CC95DC95EC95FC960C961C962C963C964C965C966D8E1C967C968C6D1C969DDF4C96AC96BC96CD5F4DDF3DDF0C96DC96EDDECC96FDDEFC970DDE8C971C972D0EEC973C974C975C976C8D8DDEEC977C978DDE9C979C97ADDEACBF2C97BDDEDC97CC97DB1CDC97EC980C981C982C983C984C0B6C985BCBBDDF1C986C987DDF7C988DDF6DDEBC989C98AC98BC98CC98DC5EEC98EC98FC990DDFBC991C992C993C994C995C996C997C998C999C99AC99BDEA4C99CC99DDEA3C99EC99FC9A0CA40CA41CA42CA43CA44CA45CA46CA47CA48DDF8CA49CA4ACA4BCA4CC3EFCA4DC2FBCA4ECA4FCA50D5E1CA51CA52CEB5CA53CA54CA55CA56DDFDCA57B2CCCA58CA59CA5ACA5BCA5CCA5DCA5ECA5FCA60C4E8CADFCA61CA62CA63CA64CA65CA66CA67CA68CA69CA6AC7BEDDFADDFCDDFEDEA2B0AAB1CECA6BCA6CCA6DCA6ECA6FDEACCA70CA71CA72CA73DEA6BDB6C8EFCA74CA75CA76CA77CA78CA79CA7ACA7BCA7CCA7DCA7EDEA1CA80CA81DEA5CA82CA83CA84CA85DEA9CA86CA87CA88CA89CA8ADEA8CA8BCA8CCA8DDEA7CA8ECA8FCA90CA91CA92CA93CA94CA95CA96DEADCA97D4CCCA98CA99CA9ACA9BDEB3DEAADEAECA9CCA9DC0D9CA9ECA9FCAA0CB40CB41B1A1DEB6CB42DEB1CB43CB44CB45CB46CB47CB48CB49DEB2CB4ACB4BCB4CCB4DCB4ECB4FCB50CB51CB52CB53CB54D1A6DEB5CB55CB56CB57CB58CB59CB5ACB5BDEAFCB5CCB5DCB5EDEB0CB5FD0BDCB60CB61CB62DEB4CAEDDEB9CB63CB64CB65CB66CB67CB68DEB8CB69DEB7CB6ACB6BCB6CCB6DCB6ECB6FCB70DEBBCB71CB72CB73CB74CB75CB76CB77BDE5CB78CB79CB7ACB7BCB7CB2D8C3EACB7DCB7EDEBACB80C5BACB81CB82CB83CB84CB85CB86DEBCCB87CB88CB89CB8ACB8BCB8CCB8DCCD9CB8ECB8FCB90CB91B7AACB92CB93CB94CB95CB96CB97CB98CB99CB9ACB9BCB9CCB9DCB9ECB9FCBA0CC40CC41D4E5CC42CC43CC44DEBDCC45CC46CC47CC48CC49DEBFCC4ACC4BCC4CCC4DCC4ECC4FCC50CC51CC52CC53CC54C4A2CC55CC56CC57CC58DEC1CC59CC5ACC5BCC5CCC5DCC5ECC5FCC60CC61CC62CC63CC64CC65CC66CC67CC68DEBECC69DEC0CC6ACC6BCC6CCC6DCC6ECC6FCC70CC71CC72CC73CC74CC75CC76CC77D5BACC78CC79CC7ADEC2CC7BCC7CCC7DCC7ECC80CC81CC82CC83CC84CC85CC86CC87CC88CC89CC8ACC8BF2AEBBA2C2B2C5B0C2C7CC8CCC8DF2AFCC8ECC8FCC90CC91CC92D0E9CC93CC94CC95D3DDCC96CC97CC98EBBDCC99CC9ACC9BCC9CCC9DCC9ECC9FCCA0B3E6F2B0CD40F2B1CD41CD42CAADCD43CD44CD45CD46CD47CD48CD49BAE7F2B3F2B5F2B4CBE4CFBAF2B2CAB4D2CFC2ECCD4ACD4BCD4CCD4DCD4ECD4FCD50CEC3F2B8B0F6F2B7CD51CD52CD53CD54CD55F2BECD56B2CFCD57CD58CD59CD5ACD5BCD5CD1C1F2BACD5DCD5ECD5FCD60CD61F2BCD4E9CD62CD63F2BBF2B6F2BFF2BDCD64F2B9CD65CD66F2C7F2C4F2C6CD67CD68F2CAF2C2F2C0CD69CD6ACD6BF2C5CD6CCD6DCD6ECD6FCD70D6FBCD71CD72CD73F2C1CD74C7F9C9DFCD75F2C8B9C6B5B0CD76CD77F2C3F2C9F2D0F2D6CD78CD79BBD7CD7ACD7BCD7CF2D5CDDCCD7DD6EBCD7ECD80F2D2F2D4CD81CD82CD83CD84B8F2CD85CD86CD87CD88F2CBCD89CD8ACD8BF2CEC2F9CD8CD5DDF2CCF2CDF2CFF2D3CD8DCD8ECD8FF2D9D3BCCD90CD91CD92CD93B6EACD94CAF1CD95B7E4F2D7CD96CD97CD98F2D8F2DAF2DDF2DBCD99CD9AF2DCCD9BCD9CCD9DCD9ED1D1F2D1CD9FCDC9CDA0CECFD6A9CE40F2E3CE41C3DBCE42F2E0CE43CE44C0AFF2ECF2DECE45F2E1CE46CE47CE48F2E8CE49CE4ACE4BCE4CF2E2CE4DCE4EF2E7CE4FCE50F2E6CE51CE52F2E9CE53CE54CE55F2DFCE56CE57F2E4F2EACE58CE59CE5ACE5BCE5CCE5DCE5ED3ACF2E5B2F5CE5FCE60F2F2CE61D0ABCE62CE63CE64CE65F2F5CE66CE67CE68BBC8CE69F2F9CE6ACE6BCE6CCE6DCE6ECE6FF2F0CE70CE71F2F6F2F8F2FACE72CE73CE74CE75CE76CE77CE78CE79F2F3CE7AF2F1CE7BCE7CCE7DBAFBCE7EB5FBCE80CE81CE82CE83F2EFF2F7F2EDF2EECE84CE85CE86F2EBF3A6CE87F3A3CE88CE89F3A2CE8ACE8BF2F4CE8CC8DACE8DCE8ECE8FCE90CE91F2FBCE92CE93CE94F3A5CE95CE96CE97CE98CE99CE9ACE9BC3F8CE9CCE9DCE9ECE9FCEA0CF40CF41CF42F2FDCF43CF44F3A7F3A9F3A4CF45F2FCCF46CF47CF48F3ABCF49F3AACF4ACF4BCF4CCF4DC2DDCF4ECF4FF3AECF50CF51F3B0CF52CF53CF54CF55CF56F3A1CF57CF58CF59F3B1F3ACCF5ACF5BCF5CCF5DCF5EF3AFF2FEF3ADCF5FCF60CF61CF62CF63CF64CF65F3B2CF66CF67CF68CF69F3B4CF6ACF6BCF6CCF6DF3A8CF6ECF6FCF70CF71F3B3CF72CF73CF74F3B5CF75CF76CF77CF78CF79CF7ACF7BCF7CCF7DCF7ED0B7CF80CF81CF82CF83F3B8CF84CF85CF86CF87D9F9CF88CF89CF8ACF8BCF8CCF8DF3B9CF8ECF8FCF90CF91CF92CF93CF94CF95F3B7CF96C8E4F3B6CF97CF98CF99CF9AF3BACF9BCF9CCF9DCF9ECF9FF3BBB4C0CFA0D040D041D042D043D044D045D046D047D048D049D04AD04BD04CD04DEEC3D04ED04FD050D051D052D053F3BCD054D055F3BDD056D057D058D1AAD059D05AD05BF4ACD0C6D05CD05DD05ED05FD060D061D0D0D1DCD062D063D064D065D066D067CFCED068D069BDD6D06AD1C3D06BD06CD06DD06ED06FD070D071BAE2E1E9D2C2F1C2B2B9D072D073B1EDF1C3D074C9C0B3C4D075D9F2D076CBA5D077F1C4D078D079D07AD07BD6D4D07CD07DD07ED080D081F1C5F4C0F1C6D082D4ACF1C7D083B0C0F4C1D084D085F4C2D086D087B4FCD088C5DBD089D08AD08BD08CCCBBD08DD08ED08FD0E4D090D091D092D093D094CDE0D095D096D097D098D099F1C8D09AD9F3D09BD09CD09DD09ED09FD0A0B1BBD140CFAED141D142D143B8A4D144D145D146D147D148F1CAD149D14AD14BD14CF1CBD14DD14ED14FD150B2C3C1D1D151D152D7B0F1C9D153D154F1CCD155D156D157D158F1CED159D15AD15BD9F6D15CD2E1D4A3D15DD15EF4C3C8B9D15FD160D161D162D163F4C4D164D165F1CDF1CFBFE3F1D0D166D167F1D4D168D169D16AD16BD16CD16DD16EF1D6F1D1D16FC9D1C5E1D170D171D172C2E3B9FCD173D174F1D3D175F1D5D176D177D178B9D3D179D17AD17BD17CD17DD17ED180F1DBD181D182D183D184D185BAD6D186B0FDF1D9D187D188D189D18AD18BF1D8F1D2F1DAD18CD18DD18ED18FD190F1D7D191D192D193C8ECD194D195D196D197CDCAF1DDD198D199D19AD19BE5BDD19CD19DD19EF1DCD19FF1DED1A0D240D241D242D243D244D245D246D247D248F1DFD249D24ACFE5D24BD24CD24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25BD25CD25DD25ED25FD260D261D262D263F4C5BDF3D264D265D266D267D268D269F1E0D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277D278D279D27AD27BD27CD27DF1E1D27ED280D281CEF7D282D2AAD283F1FBD284D285B8B2D286D287D288D289D28AD28BD28CD28DD28ED28FD290D291D292D293D294D295D296D297D298D299D29AD29BD29CD29DD29ED29FD2A0D340D341D342D343D344D345D346D347D348D349D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358D359D35AD35BD35CD35DD35EBCFBB9DBD35FB9E6C3D9CAD3EAE8C0C0BEF5EAE9EAEAEAEBD360EAECEAEDEAEEEAEFBDC7D361D362D363F5FBD364D365D366F5FDD367F5FED368F5FCD369D36AD36BD36CBDE2D36DF6A1B4A5D36ED36FD370D371F6A2D372D373D374F6A3D375D376D377ECB2D378D379D37AD37BD37CD37DD37ED380D381D382D383D384D1D4D385D386D387D388D389D38AD9EAD38BD38CD38DD38ED38FD390D391D392D393D394D395D396D397D398D399D39AD39BD39CD39DD39ED39FD3A0D440D441D442D443D444D445D446D447D448D449D44AD44BD44CD44DD44ED44FD450D451D452D453D454D455D456D457D458D459D45AD45BD45CD45DD45ED45FF6A4D460D461D462D463D464D465D466D467D468EEBAD469D46AD46BD46CD46DD46ED46FD470D471D472D473D474D475D476D477D478D479D47AD47BD47CD47DD47ED480D481D482D483D484D485D486D487D488D489D48AD48BD48CD48DD48ED48FD490D491D492D493D494D495D496D497D498D499D5B2D49AD49BD49CD49DD49ED49FD4A0D540D541D542D543D544D545D546D547D3FECCDCD548D549D54AD54BD54CD54DD54ED54FCAC4D550D551D552D553D554D555D556D557D558D559D55AD55BD55CD55DD55ED55FD560D561D562D563D564D565D566D567D568D569D56AD56BD56CD56DD56ED56FD570D571D572D573D574D575D576D577D578D579D57AD57BD57CD57DD57ED580D581D582D583D584D585D586D587D588D589D58AD58BD58CD58DD58ED58FD590D591D592D593D594D595D596D597D598D599D59AD59BD59CD59DD59ED59FD5A0D640D641D642D643D644D645D646D647D648D649D64AD64BD64CD64DD64ED64FD650D651D652D653D654D655D656D657D658D659D65AD65BD65CD65DD65ED65FD660D661D662E5C0D663D664D665D666D667D668D669D66AD66BD66CD66DD66ED66FD670D671D672D673D674D675D676D677D678D679D67AD67BD67CD67DD67ED680D681F6A5D682D683D684D685D686D687D688D689D68AD68BD68CD68DD68ED68FD690D691D692D693D694D695D696D697D698D699D69AD69BD69CD69DD69ED69FD6A0D740D741D742D743D744D745D746D747D748D749D74AD74BD74CD74DD74ED74FD750D751D752D753D754D755D756D757D758D759D75AD75BD75CD75DD75ED75FBEAFD760D761D762D763D764C6A9D765D766D767D768D769D76AD76BD76CD76DD76ED76FD770D771D772D773D774D775D776D777D778D779D77AD77BD77CD77DD77ED780D781D782D783D784D785D786D787D788D789D78AD78BD78CD78DD78ED78FD790D791D792D793D794D795D796D797D798DAA5BCC6B6A9B8BCC8CFBCA5DAA6DAA7CCD6C8C3DAA8C6FDD799D1B5D2E9D1B6BCC7D79ABDB2BBE4DAA9DAAAD1C8DAABD0EDB6EFC2DBD79BCBCFB7EDC9E8B7C3BEF7D6A4DAACDAADC6C0D7E7CAB6D79CD5A9CBDFD5EFDAAED6DFB4CADAB0DAAFD79DD2EBDAB1DAB2DAB3CAD4DAB4CAABDAB5DAB6B3CFD6EFDAB7BBB0B5AEDAB8DAB9B9EED1AFD2E8DABAB8C3CFEAB2EFDABBDABCD79EBDEBCEDCD3EFDABDCEF3DABED3D5BBE5DABFCBB5CBD0DAC0C7EBD6EEDAC1C5B5B6C1DAC2B7CCBFCEDAC3DAC4CBADDAC5B5F7DAC6C1C2D7BBDAC7CCB8D79FD2EAC4B1DAC8B5FDBBD1DAC9D0B3DACADACBCEBDDACCDACDDACEB2F7DAD1DACFD1E8DAD0C3D5DAD2D7A0DAD3DAD4DAD5D0BBD2A5B0F9DAD6C7ABDAD7BDF7C3A1DAD8DAD9C3FDCCB7DADADADBC0BEC6D7DADCDADDC7B4DADEDADFB9C8D840D841D842D843D844D845D846D847D848BBEDD849D84AD84BD84CB6B9F4F8D84DF4F9D84ED84FCDE3D850D851D852D853D854D855D856D857F5B9D858D859D85AD85BEBE0D85CD85DD85ED85FD860D861CFF3BBBFD862D863D864D865D866D867D868BAC0D4A5D869D86AD86BD86CD86DD86ED86FE1D9D870D871D872D873F5F4B1AAB2F2D874D875D876D877D878D879D87AF5F5D87BD87CF5F7D87DD87ED880BAD1F5F6D881C3B2D882D883D884D885D886D887D888F5F9D889D88AD88BF5F8D88CD88DD88ED88FD890D891D892D893D894D895D896D897D898D899D89AD89BD89CD89DD89ED89FD8A0D940D941D942D943D944D945D946D947D948D949D94AD94BD94CD94DD94ED94FD950D951D952D953D954D955D956D957D958D959D95AD95BD95CD95DD95ED95FD960D961D962D963D964D965D966D967D968D969D96AD96BD96CD96DD96ED96FD970D971D972D973D974D975D976D977D978D979D97AD97BD97CD97DD97ED980D981D982D983D984D985D986D987D988D989D98AD98BD98CD98DD98ED98FD990D991D992D993D994D995D996D997D998D999D99AD99BD99CD99DD99ED99FD9A0DA40DA41DA42DA43DA44DA45DA46DA47DA48DA49DA4ADA4BDA4CDA4DDA4EB1B4D5EAB8BADA4FB9B1B2C6D4F0CFCDB0DCD5CBBBF5D6CAB7B7CCB0C6B6B1E1B9BAD6FCB9E1B7A1BCFAEADAEADBCCF9B9F3EADCB4FBC3B3B7D1BAD8EADDD4F4EADEBCD6BBDFEADFC1DEC2B8D4DFD7CAEAE0EAE1EAE4EAE2EAE3C9DEB8B3B6C4EAE5CAEAC9CDB4CDDA50DA51E2D9C5E2EAE6C0B5DA52D7B8EAE7D7ACC8FCD8D3D8CDD4DEDA53D4F9C9C4D3AEB8D3B3E0DA54C9E2F4F6DA55DA56DA57BAD5DA58F4F7DA59DA5AD7DFDA5BDA5CF4F1B8B0D5D4B8CFC6F0DA5DDA5EDA5FDA60DA61DA62DA63DA64DA65B3C3DA66DA67F4F2B3ACDA68DA69DA6ADA6BD4BDC7F7DA6CDA6DDA6EDA6FDA70F4F4DA71DA72F4F3DA73DA74DA75DA76DA77DA78DA79DA7ADA7BDA7CCCCBDA7DDA7EDA80C8A4DA81DA82DA83DA84DA85DA86DA87DA88DA89DA8ADA8BDA8CDA8DF4F5DA8ED7E3C5BFF5C0DA8FDA90F5BBDA91F5C3DA92F5C2DA93D6BAF5C1DA94DA95DA96D4BEF5C4DA97F5CCDA98DA99DA9ADA9BB0CFB5F8DA9CF5C9F5CADA9DC5DCDA9EDA9FDAA0DB40F5C5F5C6DB41DB42F5C7F5CBDB43BEE0F5C8B8FADB44DB45DB46F5D0F5D3DB47DB48DB49BFE7DB4AB9F2F5BCF5CDDB4BDB4CC2B7DB4DDB4EDB4FCCF8DB50BCF9DB51F5CEF5CFF5D1B6E5F5D2DB52F5D5DB53DB54DB55DB56DB57DB58DB59F5BDDB5ADB5BDB5CF5D4D3BBDB5DB3ECDB5EDB5FCCA4DB60DB61DB62DB63F5D6DB64DB65DB66DB67DB68DB69DB6ADB6BF5D7BEE1F5D8DB6CDB6DCCDFF5DBDB6EDB6FDB70DB71DB72B2C8D7D9DB73F5D9DB74F5DAF5DCDB75F5E2DB76DB77DB78F5E0DB79DB7ADB7BF5DFF5DDDB7CDB7DF5E1DB7EDB80F5DEF5E4F5E5DB81CCE3DB82DB83E5BFB5B8F5E3F5E8CCA3DB84DB85DB86DB87DB88F5E6F5E7DB89DB8ADB8BDB8CDB8DDB8EF5BEDB8FDB90DB91DB92DB93DB94DB95DB96DB97DB98DB99DB9AB1C4DB9BDB9CF5BFDB9DDB9EB5C5B2E4DB9FF5ECF5E9DBA0B6D7DC40F5EDDC41F5EADC42DC43DC44DC45DC46F5EBDC47DC48B4DADC49D4EADC4ADC4BDC4CF5EEDC4DB3F9DC4EDC4FDC50DC51DC52DC53DC54F5EFF5F1DC55DC56DC57F5F0DC58DC59DC5ADC5BDC5CDC5DDC5EF5F2DC5FF5F3DC60DC61DC62DC63DC64DC65DC66DC67DC68DC69DC6ADC6BC9EDB9AADC6CDC6DC7FBDC6EDC6FB6E3DC70DC71DC72DC73DC74DC75DC76CCC9DC77DC78DC79DC7ADC7BDC7CDC7DDC7EDC80DC81DC82DC83DC84DC85DC86DC87DC88DC89DC8AEAA6DC8BDC8CDC8DDC8EDC8FDC90DC91DC92DC93DC94DC95DC96DC97DC98DC99DC9ADC9BDC9CDC9DDC9EDC9FDCA0DD40DD41DD42DD43DD44DD45DD46DD47DD48DD49DD4ADD4BDD4CDD4DDD4EDD4FDD50DD51DD52DD53DD54DD55DD56DD57DD58DD59DD5ADD5BDD5CDD5DDD5EDD5FDD60DD61DD62DD63DD64DD65DD66DD67DD68DD69DD6ADD6BDD6CDD6DDD6EDD6FDD70DD71DD72DD73DD74DD75DD76DD77DD78DD79DD7ADD7BDD7CDD7DDD7EDD80DD81DD82DD83DD84DD85DD86DD87DD88DD89DD8ADD8BDD8CDD8DDD8EDD8FDD90DD91DD92DD93DD94DD95DD96DD97DD98DD99DD9ADD9BDD9CDD9DDD9EDD9FDDA0DE40DE41DE42DE43DE44DE45DE46DE47DE48DE49DE4ADE4BDE4CDE4DDE4EDE4FDE50DE51DE52DE53DE54DE55DE56DE57DE58DE59DE5ADE5BDE5CDE5DDE5EDE5FDE60B3B5D4FEB9ECD0F9DE61E9EDD7AAE9EEC2D6C8EDBAE4E9EFE9F0E9F1D6E1E9F2E9F3E9F5E9F4E9F6E9F7C7E1E9F8D4D8E9F9BDCEDE62E9FAE9FBBDCFE9FCB8A8C1BEE9FDB1B2BBD4B9F5E9FEDE63EAA1EAA2EAA3B7F8BCADDE64CAE4E0CED4AFCFBDD5B7EAA4D5DEEAA5D0C1B9BCDE65B4C7B1D9DE66DE67DE68C0B1DE69DE6ADE6BDE6CB1E6B1E7DE6DB1E8DE6EDE6FDE70DE71B3BDC8E8DE72DE73DE74DE75E5C1DE76DE77B1DFDE78DE79DE7AC1C9B4EFDE7BDE7CC7A8D3D8DE7DC6F9D1B8DE7EB9FDC2F5DE80DE81DE82DE83DE84D3ADDE85D4CBBDFCDE86E5C2B7B5E5C3DE87DE88BBB9D5E2DE89BDF8D4B6CEA5C1ACB3D9DE8ADE8BCCF6DE8CE5C6E5C4E5C8DE8DE5CAE5C7B5CFC6C8DE8EB5FCE5C5DE8FCAF6DE90DE91E5C9DE92DE93DE94C3D4B1C5BCA3DE95DE96DE97D7B7DE98DE99CDCBCBCDCACACCD3E5CCE5CBC4E6DE9ADE9BD1A1D1B7E5CDDE9CE5D0DE9DCDB8D6F0E5CFB5DDDE9ECDBEDE9FE5D1B6BADEA0DF40CDA8B9E4DF41CAC5B3D1CBD9D4ECE5D2B7EADF42DF43DF44E5CEDF45DF46DF47DF48DF49DF4AE5D5B4FEE5D6DF4BDF4CDF4DDF4EDF4FE5D3E5D4DF50D2DDDF51DF52C2DFB1C6DF53D3E2DF54DF55B6DDCBECDF56E5D7DF57DF58D3F6DF59DF5ADF5BDF5CDF5DB1E9DF5EB6F4E5DAE5D8E5D9B5C0DF5FDF60DF61D2C5E5DCDF62DF63E5DEDF64DF65DF66DF67DF68DF69E5DDC7B2DF6AD2A3DF6BDF6CE5DBDF6DDF6EDF6FDF70D4E2D5DADF71DF72DF73DF74DF75E5E0D7F1DF76DF77DF78DF79DF7ADF7BDF7CE5E1DF7DB1DCD1FBDF7EE5E2E5E4DF80DF81DF82DF83E5E3DF84DF85E5E5DF86DF87DF88DF89DF8AD2D8DF8BB5CBDF8CE7DFDF8DDAF5DF8EDAF8DF8FDAF6DF90DAF7DF91DF92DF93DAFAD0CFC4C7DF94DF95B0EEDF96DF97DF98D0B0DF99DAF9DF9AD3CABAAADBA2C7F1DF9BDAFCDAFBC9DBDAFDDF9CDBA1D7DEDAFEC1DADF9DDF9EDBA5DF9FDFA0D3F4E040E041DBA7DBA4E042DBA8E043E044BDBCE045E046E047C0C9DBA3DBA6D6A3E048DBA9E049E04AE04BDBADE04CE04DE04EDBAEDBACBAC2E04FE050E051BFA4DBABE052E053E054DBAAD4C7B2BFE055E056DBAFE057B9F9E058DBB0E059E05AE05BE05CB3BBE05DE05EE05FB5A6E060E061E062E063B6BCDBB1E064E065E066B6F5E067DBB2E068E069E06AE06BE06CE06DE06EE06FE070E071E072E073E074E075E076E077E078E079E07AE07BB1C9E07CE07DE07EE080DBB4E081E082E083DBB3DBB5E084E085E086E087E088E089E08AE08BE08CE08DE08EDBB7E08FDBB6E090E091E092E093E094E095E096DBB8E097E098E099E09AE09BE09CE09DE09EE09FDBB9E0A0E140DBBAE141E142D3CFF4FAC7F5D7C3C5E4F4FCF4FDF4FBE143BEC6E144E145E146E147D0EFE148E149B7D3E14AE14BD4CDCCAAE14CE14DF5A2F5A1BAA8F4FECBD6E14EE14FE150F5A4C0D2E151B3EAE152CDAAF5A5F5A3BDB4F5A8E153F5A9BDCDC3B8BFE1CBE1F5AAE154E155E156F5A6F5A7C4F0E157E158E159E15AE15BF5ACE15CB4BCE15DD7EDE15EB4D7F5ABF5AEE15FE160F5ADF5AFD0D1E161E162E163E164E165E166E167C3D1C8A9E168E169E16AE16BE16CE16DF5B0F5B1E16EE16FE170E171E172E173F5B2E174E175F5B3F5B4F5B5E176E177E178E179F5B7F5B6E17AE17BE17CE17DF5B8E17EE180E181E182E183E184E185E186E187E188E189E18AB2C9E18BD3D4CACDE18CC0EFD6D8D2B0C1BFE18DBDF0E18EE18FE190E191E192E193E194E195E196E197B8AAE198E199E19AE19BE19CE19DE19EE19FE1A0E240E241E242E243E244E245E246E247E248E249E24AE24BE24CE24DE24EE24FE250E251E252E253E254E255E256E257E258E259E25AE25BE25CE25DE25EE25FE260E261E262E263E264E265E266E267E268E269E26AE26BE26CE26DE26EE26FE270E271E272E273E274E275E276E277E278E279E27AE27BE27CE27DE27EE280E281E282E283E284E285E286E287E288E289E28AE28BE28CE28DE28EE28FE290E291E292E293E294E295E296E297E298E299E29AE29BE29CE29DE29EE29FE2A0E340E341E342E343E344E345E346E347E348E349E34AE34BE34CE34DE34EE34FE350E351E352E353E354E355E356E357E358E359E35AE35BE35CE35DE35EE35FE360E361E362E363E364E365E366E367E368E369E36AE36BE36CE36DBCF8E36EE36FE370E371E372E373E374E375E376E377E378E379E37AE37BE37CE37DE37EE380E381E382E383E384E385E386E387F6C6E388E389E38AE38BE38CE38DE38EE38FE390E391E392E393E394E395E396E397E398E399E39AE39BE39CE39DE39EE39FE3A0E440E441E442E443E444E445F6C7E446E447E448E449E44AE44BE44CE44DE44EE44FE450E451E452E453E454E455E456E457E458E459E45AE45BE45CE45DE45EF6C8E45FE460E461E462E463E464E465E466E467E468E469E46AE46BE46CE46DE46EE46FE470E471E472E473E474E475E476E477E478E479E47AE47BE47CE47DE47EE480E481E482E483E484E485E486E487E488E489E48AE48BE48CE48DE48EE48FE490E491E492E493E494E495E496E497E498E499E49AE49BE49CE49DE49EE49FE4A0E540E541E542E543E544E545E546E547E548E549E54AE54BE54CE54DE54EE54FE550E551E552E553E554E555E556E557E558E559E55AE55BE55CE55DE55EE55FE560E561E562E563E564E565E566E567E568E569E56AE56BE56CE56DE56EE56FE570E571E572E573F6C9E574E575E576E577E578E579E57AE57BE57CE57DE57EE580E581E582E583E584E585E586E587E588E589E58AE58BE58CE58DE58EE58FE590E591E592E593E594E595E596E597E598E599E59AE59BE59CE59DE59EE59FF6CAE5A0E640E641E642E643E644E645E646E647E648E649E64AE64BE64CE64DE64EE64FE650E651E652E653E654E655E656E657E658E659E65AE65BE65CE65DE65EE65FE660E661E662F6CCE663E664E665E666E667E668E669E66AE66BE66CE66DE66EE66FE670E671E672E673E674E675E676E677E678E679E67AE67BE67CE67DE67EE680E681E682E683E684E685E686E687E688E689E68AE68BE68CE68DE68EE68FE690E691E692E693E694E695E696E697E698E699E69AE69BE69CE69DF6CBE69EE69FE6A0E740E741E742E743E744E745E746E747F7E9E748E749E74AE74BE74CE74DE74EE74FE750E751E752E753E754E755E756E757E758E759E75AE75BE75CE75DE75EE75FE760E761E762E763E764E765E766E767E768E769E76AE76BE76CE76DE76EE76FE770E771E772E773E774E775E776E777E778E779E77AE77BE77CE77DE77EE780E781E782E783E784E785E786E787E788E789E78AE78BE78CE78DE78EE78FE790E791E792E793E794E795E796E797E798E799E79AE79BE79CE79DE79EE79FE7A0E840E841E842E843E844E845E846E847E848E849E84AE84BE84CE84DE84EF6CDE84FE850E851E852E853E854E855E856E857E858E859E85AE85BE85CE85DE85EE85FE860E861E862E863E864E865E866E867E868E869E86AE86BE86CE86DE86EE86FE870E871E872E873E874E875E876E877E878E879E87AF6CEE87BE87CE87DE87EE880E881E882E883E884E885E886E887E888E889E88AE88BE88CE88DE88EE88FE890E891E892E893E894EEC4EEC5EEC6D5EBB6A4EEC8EEC7EEC9EECAC7A5EECBEECCE895B7B0B5F6EECDEECFE896EECEE897B8C6EED0EED1EED2B6DBB3AED6D3C4C6B1B5B8D6EED3EED4D4BFC7D5BEFBCED9B9B3EED6EED5EED8EED7C5A5EED9EEDAC7AEEEDBC7AFEEDCB2A7EEDDEEDEEEDFEEE0EEE1D7EAEEE2EEE3BCD8EEE4D3CBCCFAB2ACC1E5EEE5C7A6C3ADE898EEE6EEE7EEE8EEE9EEEAEEEBEEECE899EEEDEEEEEEEFE89AE89BEEF0EEF1EEF2EEF4EEF3E89CEEF5CDADC2C1EEF6EEF7EEF8D5A1EEF9CFB3EEFAEEFBE89DEEFCEEFDEFA1EEFEEFA2B8F5C3FAEFA3EFA4BDC2D2BFB2F9EFA5EFA6EFA7D2F8EFA8D6FDEFA9C6CCE89EEFAAEFABC1B4EFACCFFACBF8EFAEEFADB3FAB9F8EFAFEFB0D0E2EFB1EFB2B7E6D0BFEFB3EFB4EFB5C8F1CCE0EFB6EFB7EFB8EFB9EFBAD5E0EFBBB4EDC3AAEFBCE89FEFBDEFBEEFBFE8A0CEFDEFC0C2E0B4B8D7B6BDF5E940CFC7EFC3EFC1EFC2EFC4B6A7BCFCBEE2C3CCEFC5EFC6E941EFC7EFCFEFC8EFC9EFCAC7C2EFF1B6CDEFCBE942EFCCEFCDB6C6C3BEEFCEE943EFD0EFD1EFD2D5F2E944EFD3C4F7E945EFD4C4F8EFD5EFD6B8E4B0F7EFD7EFD8EFD9E946EFDAEFDBEFDCEFDDE947EFDEBEB5EFE1EFDFEFE0E948EFE2EFE3C1CDEFE4EFE5EFE6EFE7EFE8EFE9EFEAEFEBEFECC0D8E949EFEDC1ADEFEEEFEFEFF0E94AE94BCFE2E94CE94DE94EE94FE950E951E952E953B3A4E954E955E956E957E958E959E95AE95BE95CE95DE95EE95FE960E961E962E963E964E965E966E967E968E969E96AE96BE96CE96DE96EE96FE970E971E972E973E974E975E976E977E978E979E97AE97BE97CE97DE97EE980E981E982E983E984E985E986E987E988E989E98AE98BE98CE98DE98EE98FE990E991E992E993E994E995E996E997E998E999E99AE99BE99CE99DE99EE99FE9A0EA40EA41EA42EA43EA44EA45EA46EA47EA48EA49EA4AEA4BEA4CEA4DEA4EEA4FEA50EA51EA52EA53EA54EA55EA56EA57EA58EA59EA5AEA5BC3C5E3C5C9C1E3C6EA5CB1D5CECAB4B3C8F2E3C7CFD0E3C8BCE4E3C9E3CAC3C6D5A2C4D6B9EBCEC5E3CBC3F6E3CCEA5DB7A7B8F3BAD2E3CDE3CED4C4E3CFEA5EE3D0D1CBE3D1E3D2E3D3E3D4D1D6E3D5B2FBC0BBE3D6EA5FC0ABE3D7E3D8E3D9EA60E3DAE3DBEA61B8B7DAE2EA62B6D3EA63DAE4DAE3EA64EA65EA66EA67EA68EA69EA6ADAE6EA6BEA6CEA6DC8EEEA6EEA6FDAE5B7C0D1F4D2F5D5F3BDD7EA70EA71EA72EA73D7E8DAE8DAE7EA74B0A2CDD3EA75DAE9EA76B8BDBCCAC2BDC2A4B3C2DAEAEA77C2AAC4B0BDB5EA78EA79CFDEEA7AEA7BEA7CDAEBC9C2EA7DEA7EEA80EA81EA82B1DDEA83EA84EA85DAECEA86B6B8D4BAEA87B3FDEA88EA89DAEDD4C9CFD5C5E3EA8ADAEEEA8BEA8CEA8DEA8EEA8FDAEFEA90DAF0C1EACCD5CFDDEA91EA92EA93EA94EA95EA96EA97EA98EA99EA9AEA9BEA9CEA9DD3E7C2A1EA9EDAF1EA9FEAA0CBE5EB40DAF2EB41CBE6D2FEEB42EB43EB44B8F4EB45EB46DAF3B0AFCFB6EB47EB48D5CFEB49EB4AEB4BEB4CEB4DEB4EEB4FEB50EB51EB52CBEDEB53EB54EB55EB56EB57EB58EB59EB5ADAF4EB5BEB5CE3C4EB5DEB5EC1A5EB5FEB60F6BFEB61EB62F6C0F6C1C4D1EB63C8B8D1E3EB64EB65D0DBD1C5BCAFB9CDEB66EFF4EB67EB68B4C6D3BAF6C2B3FBEB69EB6AF6C3EB6BEB6CB5F1EB6DEB6EEB6FEB70EB71EB72EB73EB74EB75EB76F6C5EB77EB78EB79EB7AEB7BEB7CEB7DD3EAF6A7D1A9EB7EEB80EB81EB82F6A9EB83EB84EB85F6A8EB86EB87C1E3C0D7EB88B1A2EB89EB8AEB8BEB8CCEEDEB8DD0E8F6ABEB8EEB8FCFF6EB90F6AAD5F0F6ACC3B9EB91EB92EB93BBF4F6AEF6ADEB94EB95EB96C4DEEB97EB98C1D8EB99EB9AEB9BEB9CEB9DCBAAEB9ECFBCEB9FEBA0EC40EC41EC42EC43EC44EC45EC46EC47EC48F6AFEC49EC4AF6B0EC4BEC4CF6B1EC4DC2B6EC4EEC4FEC50EC51EC52B0D4C5F9EC53EC54EC55EC56F6B2EC57EC58EC59EC5AEC5BEC5CEC5DEC5EEC5FEC60EC61EC62EC63EC64EC65EC66EC67EC68EC69C7E0F6A6EC6AEC6BBEB8EC6CEC6DBEB2EC6EB5E5EC6FEC70B7C7EC71BFBFC3D2C3E6EC72EC73D8CCEC74EC75EC76B8EFEC77EC78EC79EC7AEC7BEC7CEC7DEC7EEC80BDF9D1A5EC81B0D0EC82EC83EC84EC85EC86F7B0EC87EC88EC89EC8AEC8BEC8CEC8DEC8EF7B1EC8FEC90EC91EC92EC93D0ACEC94B0B0EC95EC96EC97F7B2F7B3EC98F7B4EC99EC9AEC9BC7CAEC9CEC9DEC9EEC9FECA0ED40ED41BECFED42ED43F7B7ED44ED45ED46ED47ED48ED49ED4AF7B6ED4BB1DEED4CF7B5ED4DED4EF7B8ED4FF7B9ED50ED51ED52ED53ED54ED55ED56ED57ED58ED59ED5AED5BED5CED5DED5EED5FED60ED61ED62ED63ED64ED65ED66ED67ED68ED69ED6AED6BED6CED6DED6EED6FED70ED71ED72ED73ED74ED75ED76ED77ED78ED79ED7AED7BED7CED7DED7EED80ED81CEA4C8CDED82BAABE8B8E8B9E8BABEC2ED83ED84ED85ED86ED87D2F4ED88D4CFC9D8ED89ED8AED8BED8CED8DED8EED8FED90ED91ED92ED93ED94ED95ED96ED97ED98ED99ED9AED9BED9CED9DED9EED9FEDA0EE40EE41EE42EE43EE44EE45EE46EE47EE48EE49EE4AEE4BEE4CEE4DEE4EEE4FEE50EE51EE52EE53EE54EE55EE56EE57EE58EE59EE5AEE5BEE5CEE5DEE5EEE5FEE60EE61EE62EE63EE64EE65EE66EE67EE68EE69EE6AEE6BEE6CEE6DEE6EEE6FEE70EE71EE72EE73EE74EE75EE76EE77EE78EE79EE7AEE7BEE7CEE7DEE7EEE80EE81EE82EE83EE84EE85EE86EE87EE88EE89EE8AEE8BEE8CEE8DEE8EEE8FEE90EE91EE92EE93EE94EE95EE96EE97EE98EE99EE9AEE9BEE9CEE9DEE9EEE9FEEA0EF40EF41EF42EF43EF44EF45D2B3B6A5C7EAF1FCCFEECBB3D0EBE7EFCDE7B9CBB6D9F1FDB0E4CBCCF1FED4A4C2ADC1ECC6C4BEB1F2A1BCD5EF46F2A2F2A3EF47F2A4D2C3C6B5EF48CDC7F2A5EF49D3B1BFC5CCE2EF4AF2A6F2A7D1D5B6EEF2A8F2A9B5DFF2AAF2ABEF4BB2FCF2ACF2ADC8A7EF4CEF4DEF4EEF4FEF50EF51EF52EF53EF54EF55EF56EF57EF58EF59EF5AEF5BEF5CEF5DEF5EEF5FEF60EF61EF62EF63EF64EF65EF66EF67EF68EF69EF6AEF6BEF6CEF6DEF6EEF6FEF70EF71B7E7EF72EF73ECA9ECAAECABEF74ECACEF75EF76C6AEECADECAEEF77EF78EF79B7C9CAB3EF7AEF7BEF7CEF7DEF7EEF80EF81E2B8F7CFEF82EF83EF84EF85EF86EF87EF88EF89EF8AEF8BEF8CEF8DEF8EEF8FEF90EF91EF92EF93EF94EF95EF96EF97EF98EF99EF9AEF9BEF9CEF9DEF9EEF9FEFA0F040F041F042F043F044F7D0F045F046B2CDF047F048F049F04AF04BF04CF04DF04EF04FF050F051F052F053F054F055F056F057F058F059F05AF05BF05CF05DF05EF05FF060F061F062F063F7D1F064F065F066F067F068F069F06AF06BF06CF06DF06EF06FF070F071F072F073F074F075F076F077F078F079F07AF07BF07CF07DF07EF080F081F082F083F084F085F086F087F088F089F7D3F7D2F08AF08BF08CF08DF08EF08FF090F091F092F093F094F095F096E2BBF097BCA2F098E2BCE2BDE2BEE2BFE2C0E2C1B7B9D2FBBDA4CACEB1A5CBC7F099E2C2B6FCC8C4E2C3F09AF09BBDC8F09CB1FDE2C4F09DB6F6E2C5C4D9F09EF09FE2C6CFDAB9DDE2C7C0A1F0A0E2C8B2F6F140E2C9F141C1F3E2CAE2CBC2F8E2CCE2CDE2CECAD7D8B8D9E5CFE3F142F143F144F145F146F147F148F149F14AF14BF14CF0A5F14DF14EDCB0F14FF150F151F152F153F154F155F156F157F158F159F15AF15BF15CF15DF15EF15FF160F161F162F163F164F165F166F167F168F169F16AF16BF16CF16DF16EF16FF170F171F172F173F174F175F176F177F178F179F17AF17BF17CF17DF17EF180F181F182F183F184F185F186F187F188F189F18AF18BF18CF18DF18EF18FF190F191F192F193F194F195F196F197F198F199F19AF19BF19CF19DF19EF19FF1A0F240F241F242F243F244F245F246F247F248F249F24AF24BF24CF24DF24EF24FF250F251F252F253F254F255F256F257F258F259F25AF25BF25CF25DF25EF25FF260F261F262F263F264F265F266F267F268F269F26AF26BF26CF26DF26EF26FF270F271F272F273F274F275F276F277F278F279F27AF27BF27CF27DF27EF280F281F282F283F284F285F286F287F288F289F28AF28BF28CF28DF28EF28FF290F291F292F293F294F295F296F297F298F299F29AF29BF29CF29DF29EF29FF2A0F340F341F342F343F344F345F346F347F348F349F34AF34BF34CF34DF34EF34FF350F351C2EDD4A6CDD4D1B1B3DBC7FDF352B2B5C2BFE6E0CABBE6E1E6E2BED4E6E3D7A4CDD5E6E5BCDDE6E4E6E6E6E7C2EEF353BDBEE6E8C2E6BAA7E6E9F354E6EAB3D2D1E9F355F356BFA5E6EBC6EFE6ECE6EDF357F358E6EEC6ADE6EFF359C9A7E6F0E6F1E6F2E5B9E6F3E6F4C2E2E6F5E6F6D6E8E6F7F35AE6F8B9C7F35BF35CF35DF35EF35FF360F361F7BBF7BAF362F363F364F365F7BEF7BCBAA1F366F7BFF367F7C0F368F369F36AF7C2F7C1F7C4F36BF36CF7C3F36DF36EF36FF370F371F7C5F7C6F372F373F374F375F7C7F376CBE8F377F378F379F37AB8DFF37BF37CF37DF37EF380F381F7D4F382F7D5F383F384F385F386F7D6F387F388F389F38AF7D8F38BF7DAF38CF7D7F38DF38EF38FF390F391F392F393F394F395F7DBF396F7D9F397F398F399F39AF39BF39CF39DD7D7F39EF39FF3A0F440F7DCF441F442F443F444F445F446F7DDF447F448F449F7DEF44AF44BF44CF44DF44EF44FF450F451F452F453F454F7DFF455F456F457F7E0F458F459F45AF45BF45CF45DF45EF45FF460F461F462DBCBF463F464D8AAF465F466F467F468F469F46AF46BF46CE5F7B9EDF46DF46EF46FF470BFFDBBEAF7C9C6C7F7C8F471F7CAF7CCF7CBF472F473F474F7CDF475CEBAF476F7CEF477F478C4A7F479F47AF47BF47CF47DF47EF480F481F482F483F484F485F486F487F488F489F48AF48BF48CF48DF48EF48FF490F491F492F493F494F495F496F497F498F499F49AF49BF49CF49DF49EF49FF4A0F540F541F542F543F544F545F546F547F548F549F54AF54BF54CF54DF54EF54FF550F551F552F553F554F555F556F557F558F559F55AF55BF55CF55DF55EF55FF560F561F562F563F564F565F566F567F568F569F56AF56BF56CF56DF56EF56FF570F571F572F573F574F575F576F577F578F579F57AF57BF57CF57DF57EF580F581F582F583F584F585F586F587F588F589F58AF58BF58CF58DF58EF58FF590F591F592F593F594F595F596F597F598F599F59AF59BF59CF59DF59EF59FF5A0F640F641F642F643F644F645F646F647F648F649F64AF64BF64CF64DF64EF64FF650F651F652F653F654F655F656F657F658F659F65AF65BF65CF65DF65EF65FF660F661F662F663F664F665F666F667F668F669F66AF66BF66CF66DF66EF66FF670F671F672F673F674F675F676F677F678F679F67AF67BF67CF67DF67EF680F681F682F683F684F685F686F687F688F689F68AF68BF68CF68DF68EF68FF690F691F692F693F694F695F696F697F698F699F69AF69BF69CF69DF69EF69FF6A0F740F741F742F743F744F745F746F747F748F749F74AF74BF74CF74DF74EF74FF750F751F752F753F754F755F756F757F758F759F75AF75BF75CF75DF75EF75FF760F761F762F763F764F765F766F767F768F769F76AF76BF76CF76DF76EF76FF770F771F772F773F774F775F776F777F778F779F77AF77BF77CF77DF77EF780D3E3F781F782F6CFF783C2B3F6D0F784F785F6D1F6D2F6D3F6D4F786F787F6D6F788B1ABF6D7F789F6D8F6D9F6DAF78AF6DBF6DCF78BF78CF78DF78EF6DDF6DECFCAF78FF6DFF6E0F6E1F6E2F6E3F6E4C0F0F6E5F6E6F6E7F6E8F6E9F790F6EAF791F6EBF6ECF792F6EDF6EEF6EFF6F0F6F1F6F2F6F3F6F4BEA8F793F6F5F6F6F6F7F6F8F794F795F796F797F798C8FAF6F9F6FAF6FBF6FCF799F79AF6FDF6FEF7A1F7A2F7A3F7A4F7A5F79BF79CF7A6F7A7F7A8B1EEF7A9F7AAF7ABF79DF79EF7ACF7ADC1DBF7AEF79FF7A0F7AFF840F841F842F843F844F845F846F847F848F849F84AF84BF84CF84DF84EF84FF850F851F852F853F854F855F856F857F858F859F85AF85BF85CF85DF85EF85FF860F861F862F863F864F865F866F867F868F869F86AF86BF86CF86DF86EF86FF870F871F872F873F874F875F876F877F878F879F87AF87BF87CF87DF87EF880F881F882F883F884F885F886F887F888F889F88AF88BF88CF88DF88EF88FF890F891F892F893F894F895F896F897F898F899F89AF89BF89CF89DF89EF89FF8A0F940F941F942F943F944F945F946F947F948F949F94AF94BF94CF94DF94EF94FF950F951F952F953F954F955F956F957F958F959F95AF95BF95CF95DF95EF95FF960F961F962F963F964F965F966F967F968F969F96AF96BF96CF96DF96EF96FF970F971F972F973F974F975F976F977F978F979F97AF97BF97CF97DF97EF980F981F982F983F984F985F986F987F988F989F98AF98BF98CF98DF98EF98FF990F991F992F993F994F995F996F997F998F999F99AF99BF99CF99DF99EF99FF9A0FA40FA41FA42FA43FA44FA45FA46FA47FA48FA49FA4AFA4BFA4CFA4DFA4EFA4FFA50FA51FA52FA53FA54FA55FA56FA57FA58FA59FA5AFA5BFA5CFA5DFA5EFA5FFA60FA61FA62FA63FA64FA65FA66FA67FA68FA69FA6AFA6BFA6CFA6DFA6EFA6FFA70FA71FA72FA73FA74FA75FA76FA77FA78FA79FA7AFA7BFA7CFA7DFA7EFA80FA81FA82FA83FA84FA85FA86FA87FA88FA89FA8AFA8BFA8CFA8DFA8EFA8FFA90FA91FA92FA93FA94FA95FA96FA97FA98FA99FA9AFA9BFA9CFA9DFA9EFA9FFAA0FB40FB41FB42FB43FB44FB45FB46FB47FB48FB49FB4AFB4BFB4CFB4DFB4EFB4FFB50FB51FB52FB53FB54FB55FB56FB57FB58FB59FB5AFB5BC4F1F0AFBCA6F0B0C3F9FB5CC5B8D1BBFB5DF0B1F0B2F0B3F0B4F0B5D1BCFB5ED1ECFB5FF0B7F0B6D4A7FB60CDD2F0B8F0BAF0B9F0BBF0BCFB61FB62B8EBF0BDBAE8FB63F0BEF0BFBEE9F0C0B6ECF0C1F0C2F0C3F0C4C8B5F0C5F0C6FB64F0C7C5F4FB65F0C8FB66FB67FB68F0C9FB69F0CAF7BDFB6AF0CBF0CCF0CDFB6BF0CEFB6CFB6DFB6EFB6FF0CFBAD7FB70F0D0F0D1F0D2F0D3F0D4F0D5F0D6F0D8FB71FB72D3A5F0D7FB73F0D9FB74FB75FB76FB77FB78FB79FB7AFB7BFB7CFB7DF5BAC2B9FB7EFB80F7E4FB81FB82FB83FB84F7E5F7E6FB85FB86F7E7FB87FB88FB89FB8AFB8BFB8CF7E8C2B4FB8DFB8EFB8FFB90FB91FB92FB93FB94FB95F7EAFB96F7EBFB97FB98FB99FB9AFB9BFB9CC2F3FB9DFB9EFB9FFBA0FC40FC41FC42FC43FC44FC45FC46FC47FC48F4F0FC49FC4AFC4BF4EFFC4CFC4DC2E9FC4EF7E1F7E2FC4FFC50FC51FC52FC53BBC6FC54FC55FC56FC57D9E4FC58FC59FC5ACAF2C0E8F0A4FC5BBADAFC5CFC5DC7ADFC5EFC5FFC60C4ACFC61FC62F7ECF7EDF7EEFC63F7F0F7EFFC64F7F1FC65FC66F7F4FC67F7F3FC68F7F2F7F5FC69FC6AFC6BFC6CF7F6FC6DFC6EFC6FFC70FC71FC72FC73FC74FC75EDE9FC76EDEAEDEBFC77F6BCFC78FC79FC7AFC7BFC7CFC7DFC7EFC80FC81FC82FC83FC84F6BDFC85F6BEB6A6FC86D8BEFC87FC88B9C4FC89FC8AFC8BD8BBFC8CDCB1FC8DFC8EFC8FFC90FC91FC92CAF3FC93F7F7FC94FC95FC96FC97FC98FC99FC9AFC9BFC9CF7F8FC9DFC9EF7F9FC9FFCA0FD40FD41FD42FD43FD44F7FBFD45F7FAFD46B1C7FD47F7FCF7FDFD48FD49FD4AFD4BFD4CF7FEFD4DFD4EFD4FFD50FD51FD52FD53FD54FD55FD56FD57C6EBECB4FD58FD59FD5AFD5BFD5CFD5DFD5EFD5FFD60FD61FD62FD63FD64FD65FD66FD67FD68FD69FD6AFD6BFD6CFD6DFD6EFD6FFD70FD71FD72FD73FD74FD75FD76FD77FD78FD79FD7AFD7BFD7CFD7DFD7EFD80FD81FD82FD83FD84FD85B3DDF6B3FD86FD87F6B4C1E4F6B5F6B6F6B7F6B8F6B9F6BAC8A3F6BBFD88FD89FD8AFD8BFD8CFD8DFD8EFD8FFD90FD91FD92FD93C1FAB9A8EDE8FD94FD95FD96B9EAD9DFFD97FD98FD99FD9AFD9';
for (var i = 0; i < str.length; i++) {
var c = str.charAt(i),
code = str.charCodeAt(i);
if (c == " ") strOut += "+";
else if (code >= 19968 && code <= 40869) {
var index = code - 19968;
strOut += "%" + z.substr(index * 4, 2) + "%" + z.substr(index * 4 + 2, 2);
} else {
strOut += "%" + str.charCodeAt(i).toString(16);
}
}
return strOut;
},
/* 改变图片大小 */
scale: function (img, w, h) {
var ow = img.width,
oh = img.height;
if (ow >= oh) {
img.width = w * ow / oh;
img.height = h;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w;
img.height = h * oh / ow;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
},
getImageData: function(){
var _this = this,
key = $G('searchTxt').value,
type = $G('searchType').value,
keepOriginName = editor.options.keepOriginName ? "1" : "0",
url = "https://image.baidu.com/search/index?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimage&istype=2&rn=32&fm=index&pv=&word=" + _this.encodeToGb2312(key) + type + "&keeporiginname=" + keepOriginName + "&" + +new Date;
$G('searchListUl').innerHTML = lang.searchLoading;
ajax.request(url, {
'dataType': 'jsonp',
'charset': 'GB18030',
'onsuccess':function(json){
console.log(json);
var list = [];
if(json && json.data) {
for(var i = 0; i < json.data.length; i++) {
if(json.data[i].objURL) {
list.push({
title: json.data[i].fromPageTitleEnc,
src: json.data[i].objURL,
url: json.data[i].fromURL
});
}
}
}
_this.setList(list);
},
'onerror':function(){
$G('searchListUl').innerHTML = lang.searchRetry;
}
});
},
/* 添加图片到列表界面上 */
setList: function (list) {
var i, item, p, img, link, _this = this,
listUl = $G('searchListUl');
listUl.innerHTML = '';
if(list.length) {
for (i = 0; i < list.length; i++) {
item = document.createElement('li');
p = document.createElement('p');
img = document.createElement('img');
link = document.createElement('a');
img.onload = function () {
_this.scale(this, 113, 113);
};
img.width = 113;
img.setAttribute('src', list[i].src);
link.href = list[i].url;
link.target = '_blank';
link.title = list[i].title;
link.innerHTML = list[i].title;
p.appendChild(img);
item.appendChild(p);
item.appendChild(link);
listUl.appendChild(item);
}
} else {
listUl.innerHTML = lang.searchRetry;
}
},
getInsertList: function () {
var child,
src,
align = getAlign(),
list = [],
items = $G('searchListUl').children;
for(var i = 0; i < items.length; i++) {
child = items[i].firstChild && items[i].firstChild.firstChild;
if(child.tagName && child.tagName.toLowerCase() == 'img' && domUtils.hasClass(items[i], 'selected')) {
src = child.src;
list.push({
src: src,
_src: src,
alt: src.substr(src.lastIndexOf('/') + 1),
floatStyle: align
});
}
}
return list;
}
};
})();
================================================
FILE: static/common/user/uedit/dialogs/insertframe/insertframe.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/internal.js
================================================
(function () {
var parent = window.parent;
//dialog对象
dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )];
//当前打开dialog的编辑器实例
editor = dialog.editor;
UE = parent.UE;
domUtils = UE.dom.domUtils;
utils = UE.utils;
browser = UE.browser;
ajax = UE.ajax;
$G = function ( id ) {
return document.getElementById( id )
};
//focus元素
$focus = function ( node ) {
setTimeout( function () {
if ( browser.ie ) {
var r = node.createTextRange();
r.collapse( false );
r.select();
} else {
node.focus()
}
}, 0 )
};
utils.loadFile(document,{
href:editor.options.themePath + editor.options.theme + "/dialogbase.css?cache="+Math.random(),
tag:"link",
type:"text/css",
rel:"stylesheet"
});
lang = editor.getLang(dialog.className.split( "-" )[2]);
if(lang){
domUtils.on(window,'load',function () {
var langImgPath = editor.options.langPath + editor.options.lang + "/images/";
//针对静态资源
for ( var i in lang["static"] ) {
var dom = $G( i );
if(!dom) continue;
var tagName = dom.tagName,
content = lang["static"][i];
if(content.src){
//clone
content = utils.extend({},content,false);
content.src = langImgPath + content.src;
}
if(content.style){
content = utils.extend({},content,false);
content.style = content.style.replace(/url\s*\(/g,"url(" + langImgPath)
}
switch ( tagName.toLowerCase() ) {
case "var":
dom.parentNode.replaceChild( document.createTextNode( content ), dom );
break;
case "select":
var ops = dom.options;
for ( var j = 0, oj; oj = ops[j]; ) {
oj.innerHTML = content.options[j++];
}
for ( var p in content ) {
p != "options" && dom.setAttribute( p, content[p] );
}
break;
default :
domUtils.setAttributes( dom, content);
}
}
} );
}
})();
================================================
FILE: static/common/user/uedit/dialogs/link/link.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/map/map.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/map/show.html
================================================
百度地图API自定义地图
================================================
FILE: static/common/user/uedit/dialogs/music/music.css
================================================
.wrapper{margin: 5px 10px;}
.searchBar{height:30px;padding:7px 0 3px;text-align:center;}
.searchBtn{font-size:13px;height:24px;}
.resultBar{width:460px;margin:5px auto;border: 1px solid #CCC;border-radius: 5px;box-shadow: 2px 2px 5px #D3D6DA;overflow: hidden;}
.listPanel{overflow: hidden;}
.panelon{display:block;}
.paneloff{display:none}
.page{width:220px;margin:20px auto;overflow: hidden;}
.pageon{float:right;width:24px;line-height:24px;height:24px;margin-right: 5px;background: none;border: none;color: #000;font-weight: bold;text-align:center}
.pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff;
border: 1px solid #E7ECF0;color: #2D64B3;margin-right: 5px;text-decoration: none;text-align:center;}
.m-box{width:460px;}
.m-m{float: left;line-height: 20px;height: 20px;}
.m-h{height:24px;line-height:24px;padding-left: 46px;background-color:#FAFAFA;border-bottom: 1px solid #DAD8D8;font-weight: bold;font-size: 12px;color: #333;}
.m-l{float:left;width:40px; }
.m-t{float:left;width:140px;}
.m-s{float:left;width:110px;}
.m-z{float:left;width:100px;}
.m-try-t{float: left;width: 60px;;}
.m-try{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat ;}
.m-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;}
.loading{width:95px;height:7px;font-size:7px;margin:60px auto;background:url(http://static.tieba.baidu.com/tb/editor/images/loading.gif) no-repeat}
.empty{width:300px;height:40px;padding:2px;margin:50px auto;line-height:40px; color:#006699;text-align:center;}
================================================
FILE: static/common/user/uedit/dialogs/music/music.html
================================================
插入音乐
================================================
FILE: static/common/user/uedit/dialogs/music/music.js
================================================
function Music() {
this.init();
}
(function () {
var pages = [],
panels = [],
selectedItem = null;
Music.prototype = {
total:70,
pageSize:10,
dataUrl:"http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common",
playerUrl:"http://box.baidu.com/widget/flash/bdspacesong.swf",
init:function () {
var me = this;
domUtils.on($G("J_searchName"), "keyup", function (event) {
var e = window.event || event;
if (e.keyCode == 13) {
me.dosearch();
}
});
domUtils.on($G("J_searchBtn"), "click", function () {
me.dosearch();
});
},
callback:function (data) {
var me = this;
me.data = data.song_list;
setTimeout(function () {
$G('J_resultBar').innerHTML = me._renderTemplate(data.song_list);
}, 300);
},
dosearch:function () {
var me = this;
selectedItem = null;
var key = $G('J_searchName').value;
if (utils.trim(key) == "")return false;
key = encodeURIComponent(key);
me._sent(key);
},
doselect:function (i) {
var me = this;
if (typeof i == 'object') {
selectedItem = i;
} else if (typeof i == 'number') {
selectedItem = me.data[i];
}
},
onpageclick:function (id) {
var me = this;
for (var i = 0; i < pages.length; i++) {
$G(pages[i]).className = 'pageoff';
$G(panels[i]).className = 'paneloff';
}
$G('page' + id).className = 'pageon';
$G('panel' + id).className = 'panelon';
},
listenTest:function (elem) {
var me = this,
view = $G('J_preview'),
is_play_action = (elem.className == 'm-try'),
old_trying = me._getTryingElem();
if (old_trying) {
old_trying.className = 'm-try';
view.innerHTML = '';
}
if (is_play_action) {
elem.className = 'm-trying';
view.innerHTML = me._buildMusicHtml(me._getUrl(true));
}
},
_sent:function (param) {
var me = this;
$G('J_resultBar').innerHTML = '
';
utils.loadFile(document, {
src:me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback&.r=' + Math.random(),
tag:"script",
type:"text/javascript",
defer:"defer"
});
},
_removeHtml:function (str) {
var reg = /<\s*\/?\s*[^>]*\s*>/gi;
return str.replace(reg, "");
},
_getUrl:function (isTryListen) {
var me = this;
var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist='
+ encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra='
+ encodeURIComponent(me._removeHtml(selectedItem.album_title))
+ '&autoPlay='+isTryListen+'' + '&loop=true';
return me.playerUrl + "?" + param;
},
_getTryingElem:function () {
var s = $G('J_listPanel').getElementsByTagName('span');
for (var i = 0; i < s.length; i++) {
if (s[i].className == 'm-trying')
return s[i];
}
return null;
},
_buildMusicHtml:function (playerUrl) {
var html = '
';
return html;
},
_byteLength:function (str) {
return str.replace(/[^\u0000-\u007f]/g, "\u0061\u0061").length;
},
_getMaxText:function (s) {
var me = this;
s = me._removeHtml(s);
if (me._byteLength(s) > 12)
return s.substring(0, 5) + '...';
if (!s) s = " ";
return s;
},
_rebuildData:function (data) {
var me = this,
newData = [],
d = me.pageSize,
itembox;
for (var i = 0; i < data.length; i++) {
if ((i + d) % d == 0) {
itembox = [];
newData.push(itembox)
}
itembox.push(data[i]);
}
return newData;
},
_renderTemplate:function (data) {
var me = this;
if (data.length == 0)return '' + lang.emptyTxt + '
';
data = me._rebuildData(data);
var s = [], p = [], t = [];
s.push('');
p.push('
');
for (var i = 0, tmpList; tmpList = data[i++];) {
panels.push('panel' + i);
pages.push('page' + i);
if (i == 1) {
s.push('
');
if (data.length != 1) {
t.push('
' + (i ) + '
');
}
} else {
s.push('
');
t.push('
' + (i ) + '
');
}
s.push('
');
s.push('
' + lang.chapter + ' ' + lang.singer
+ ' ' + lang.special + ' ' + lang.listenTest + '
');
for (var j = 0, tmpObj; tmpObj = tmpList[j++];) {
s.push('
');
s.push(' ');
s.push('' + me._getMaxText(tmpObj.title) + ' ');
s.push('' + me._getMaxText(tmpObj.author) + ' ');
s.push('' + me._getMaxText(tmpObj.album_title) + ' ');
s.push(' ');
s.push(' ');
}
s.push('
');
s.push('
');
}
t.reverse();
p.push(t.join(''));
s.push('
');
p.push('
');
return s.join('') + p.join('');
},
exec:function () {
var me = this;
if (selectedItem == null) return;
$G('J_preview').innerHTML = "";
editor.execCommand('music', {
url:me._getUrl(false),
width:400,
height:95
});
}
};
})();
================================================
FILE: static/common/user/uedit/dialogs/preview/preview.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/scrawl/scrawl.css
================================================
/*common
*/
body{margin: 0;}
table{width:100%;}
table td{padding:2px 4px;vertical-align: middle;}
a{text-decoration: none;}
em{font-style: normal;}
.border_style1{border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;}
/*module
*/
.main{margin: 8px;overflow: hidden;}
.hot{float:left;height:335px;}
.drawBoard{position: relative; cursor: crosshair;}
.brushBorad{position: absolute;left:0;top:0;z-index: 998;}
.picBoard{border: none;text-align: center;line-height: 300px;cursor: default;}
.operateBar{margin-top:10px;font-size:12px;text-align: center;}
.operateBar span{margin-left: 10px;}
.drawToolbar{float:right;width:110px;height:300px;overflow: hidden;}
.colorBar{margin-top:10px;font-size: 12px;text-align: center;}
.colorBar a{display:block;width: 10px;height: 10px;border:1px solid #1006F1;border-radius: 3px; box-shadow:2px 2px 5px #d3d6da;opacity: 0.3}
.sectionBar{margin-top:15px;font-size: 12px;text-align: center;}
.sectionBar a{display:inline-block;width:10px;height:12px;color: #888;text-indent: -999px;opacity: 0.3}
.size1{background: url('images/size.png') 1px center no-repeat ;}
.size2{background: url('images/size.png') -10px center no-repeat;}
.size3{background: url('images/size.png') -22px center no-repeat;}
.size4{background: url('images/size.png') -35px center no-repeat;}
.addImgH{position: relative;}
.addImgH_form{position: absolute;left: 18px;top: -1px;width: 75px;height: 21px;opacity: 0;cursor: pointer;}
.addImgH_form input{width: 100%;}
/*scrawl遮罩层
*/
.maskLayerNull{display: none;}
.maskLayer{position: absolute;top:0;left:0;width: 100%; height: 100%;opacity: 0.7;
background-color: #fff;text-align:center;font-weight:bold;line-height:300px;z-index: 1000;}
/*btn state
*/
.previousStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undoH.png');cursor: pointer;}
.previousStepH .text{color:#888;cursor:pointer;}
.previousStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undo.png');cursor:default;}
.previousStep .text{color:#ccc;cursor:default;}
.nextStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redoH.png');cursor: pointer;}
.nextStepH .text{color:#888;cursor:pointer;}
.nextStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redo.png');cursor:default;}
.nextStep .text{color:#ccc;cursor:default;}
.clearBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/emptyH.png');cursor: pointer;}
.clearBoardH .text{color:#888;cursor:pointer;}
.clearBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/empty.png');cursor:default;}
.clearBoard .text{color:#ccc;cursor:default;}
.scaleBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scaleH.png');cursor: pointer;}
.scaleBoardH .text{color:#888;cursor:pointer;}
.scaleBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scale.png');cursor:default;}
.scaleBoard .text{color:#ccc;cursor:default;}
.removeImgH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimgH.png');cursor: pointer;}
.removeImgH .text{color:#888;cursor:pointer;}
.removeImg .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimg.png');cursor:default;}
.removeImg .text{color:#ccc;cursor:default;}
.addImgH .icon{vertical-align:top;display: inline-block;width:16px;height:16px;background-image: url('images/addimg.png')}
.addImgH .text{color:#888;cursor:pointer;}
/*icon
*/
.brushIcon{display: inline-block;width:16px;height:16px;background-image: url('images/brush.png')}
.eraserIcon{display: inline-block;width:16px;height:16px;background-image: url('images/eraser.png')}
================================================
FILE: static/common/user/uedit/dialogs/scrawl/scrawl.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/scrawl/scrawl.js
================================================
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-5-22
* Time: 上午11:38
* To change this template use File | Settings | File Templates.
*/
var scrawl = function (options) {
options && this.initOptions(options);
};
(function () {
var canvas = $G("J_brushBoard"),
context = canvas.getContext('2d'),
drawStep = [], //undo redo存储
drawStepIndex = 0; //undo redo指针
scrawl.prototype = {
isScrawl:false, //是否涂鸦
brushWidth:-1, //画笔粗细
brushColor:"", //画笔颜色
initOptions:function (options) {
var me = this;
me.originalState(options);//初始页面状态
me._buildToolbarColor(options.colorList);//动态生成颜色选择集合
me._addBoardListener(options.saveNum);//添加画板处理
me._addOPerateListener(options.saveNum);//添加undo redo clearBoard处理
me._addColorBarListener();//添加颜色选择处理
me._addBrushBarListener();//添加画笔大小处理
me._addEraserBarListener();//添加橡皮大小处理
me._addAddImgListener();//添加增添背景图片处理
me._addRemoveImgListenter();//删除背景图片处理
me._addScalePicListenter();//添加缩放处理
me._addClearSelectionListenter();//添加清楚选中状态处理
me._originalColorSelect(options.drawBrushColor);//初始化颜色选中
me._originalBrushSelect(options.drawBrushSize);//初始化画笔选中
me._clearSelection();//清楚选中状态
},
originalState:function (options) {
var me = this;
me.brushWidth = options.drawBrushSize;//同步画笔粗细
me.brushColor = options.drawBrushColor;//同步画笔颜色
context.lineWidth = me.brushWidth;//初始画笔大小
context.strokeStyle = me.brushColor;//初始画笔颜色
context.fillStyle = "transparent";//初始画布背景颜色
context.lineCap = "round";//去除锯齿
context.fill();
},
_buildToolbarColor:function (colorList) {
var tmp = null, arr = [];
arr.push("
");
for (var i = 0, color; color = colorList[i++];) {
if ((i - 1) % 5 == 0) {
if (i != 1) {
arr.push("");
}
arr.push("");
}
tmp = '#' + color;
arr.push(" ");
}
arr.push("
");
$G("J_colorBar").innerHTML = arr.join("");
},
_addBoardListener:function (saveNum) {
var me = this,
margin = 0,
startX = -1,
startY = -1,
isMouseDown = false,
isMouseMove = false,
isMouseUp = false,
buttonPress = 0, button, flag = '';
margin = parseInt(domUtils.getComputedStyle($G("J_wrap"), "margin-left"));
drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));
drawStepIndex += 1;
domUtils.on(canvas, ["mousedown", "mousemove", "mouseup", "mouseout"], function (e) {
button = browser.webkit ? e.which : buttonPress;
switch (e.type) {
case 'mousedown':
buttonPress = 1;
flag = 1;
isMouseDown = true;
isMouseUp = false;
isMouseMove = false;
me.isScrawl = true;
startX = e.clientX - margin;//10为外边距总和
startY = e.clientY - margin;
context.beginPath();
break;
case 'mousemove' :
if (!flag && button == 0) {
return;
}
if (!flag && button) {
startX = e.clientX - margin;//10为外边距总和
startY = e.clientY - margin;
context.beginPath();
flag = 1;
}
if (isMouseUp || !isMouseDown) {
return;
}
var endX = e.clientX - margin,
endY = e.clientY - margin;
context.moveTo(startX, startY);
context.lineTo(endX, endY);
context.stroke();
startX = endX;
startY = endY;
isMouseMove = true;
break;
case 'mouseup':
buttonPress = 0;
if (!isMouseDown)return;
if (!isMouseMove) {
context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false);
context.fillStyle = context.strokeStyle;
context.fill();
}
context.closePath();
me._saveOPerate(saveNum);
isMouseDown = false;
isMouseMove = false;
isMouseUp = true;
startX = -1;
startY = -1;
break;
case 'mouseout':
flag = '';
buttonPress = 0;
if (button == 1) return;
context.closePath();
break;
}
});
},
_addOPerateListener:function (saveNum) {
var me = this;
domUtils.on($G("J_previousStep"), "click", function () {
if (drawStepIndex > 1) {
drawStepIndex -= 1;
context.clearRect(0, 0, context.canvas.width, context.canvas.height);
context.putImageData(drawStep[drawStepIndex - 1], 0, 0);
me.btn2Highlight("J_nextStep");
drawStepIndex == 1 && me.btn2disable("J_previousStep");
}
});
domUtils.on($G("J_nextStep"), "click", function () {
if (drawStepIndex > 0 && drawStepIndex < drawStep.length) {
context.clearRect(0, 0, context.canvas.width, context.canvas.height);
context.putImageData(drawStep[drawStepIndex], 0, 0);
drawStepIndex += 1;
me.btn2Highlight("J_previousStep");
drawStepIndex == drawStep.length && me.btn2disable("J_nextStep");
}
});
domUtils.on($G("J_clearBoard"), "click", function () {
context.clearRect(0, 0, context.canvas.width, context.canvas.height);
drawStep = [];
me._saveOPerate(saveNum);
drawStepIndex = 1;
me.isScrawl = false;
me.btn2disable("J_previousStep");
me.btn2disable("J_nextStep");
me.btn2disable("J_clearBoard");
});
},
_addColorBarListener:function () {
var me = this;
domUtils.on($G("J_colorBar"), "click", function (e) {
var target = me.getTarget(e),
color = target.title;
if (!!color) {
me._addColorSelect(target);
me.brushColor = color;
context.globalCompositeOperation = "source-over";
context.lineWidth = me.brushWidth;
context.strokeStyle = color;
}
});
},
_addBrushBarListener:function () {
var me = this;
domUtils.on($G("J_brushBar"), "click", function (e) {
var target = me.getTarget(e),
size = browser.ie ? target.innerText : target.text;
if (!!size) {
me._addBESelect(target);
context.globalCompositeOperation = "source-over";
context.lineWidth = parseInt(size);
context.strokeStyle = me.brushColor;
me.brushWidth = context.lineWidth;
}
});
},
_addEraserBarListener:function () {
var me = this;
domUtils.on($G("J_eraserBar"), "click", function (e) {
var target = me.getTarget(e),
size = browser.ie ? target.innerText : target.text;
if (!!size) {
me._addBESelect(target);
context.lineWidth = parseInt(size);
context.globalCompositeOperation = "destination-out";
context.strokeStyle = "#FFF";
}
});
},
_addAddImgListener:function () {
var file = $G("J_imgTxt");
if (!window.FileReader) {
$G("J_addImg").style.display = 'none';
$G("J_removeImg").style.display = 'none';
$G("J_sacleBoard").style.display = 'none';
}
domUtils.on(file, "change", function (e) {
var frm = file.parentNode;
addMaskLayer(lang.backgroundUploading);
var target = e.target || e.srcElement,
reader = new FileReader();
reader.onload = function(evt){
var target = evt.target || evt.srcElement;
ue_callback(target.result, 'SUCCESS');
};
reader.readAsDataURL(target.files[0]);
frm.reset();
});
},
_addRemoveImgListenter:function () {
var me = this;
domUtils.on($G("J_removeImg"), "click", function () {
$G("J_picBoard").innerHTML = "";
me.btn2disable("J_removeImg");
me.btn2disable("J_sacleBoard");
});
},
_addScalePicListenter:function () {
domUtils.on($G("J_sacleBoard"), "click", function () {
var picBoard = $G("J_picBoard"),
scaleCon = $G("J_scaleCon"),
img = picBoard.children[0];
if (img) {
if (!scaleCon) {
picBoard.style.cssText = "position:relative;z-index:999;"+picBoard.style.cssText;
img.style.cssText = "position: absolute;top:" + (canvas.height - img.height) / 2 + "px;left:" + (canvas.width - img.width) / 2 + "px;";
var scale = new ScaleBoy();
picBoard.appendChild(scale.init());
scale.startScale(img);
} else {
if (scaleCon.style.visibility == "visible") {
scaleCon.style.visibility = "hidden";
picBoard.style.position = "";
picBoard.style.zIndex = "";
} else {
scaleCon.style.visibility = "visible";
picBoard.style.cssText += "position:relative;z-index:999";
}
}
}
});
},
_addClearSelectionListenter:function () {
var doc = document;
domUtils.on(doc, 'mousemove', function (e) {
if (browser.ie && browser.version < 11)
doc.selection.clear();
else
window.getSelection().removeAllRanges();
});
},
_clearSelection:function () {
var list = ["J_operateBar", "J_colorBar", "J_brushBar", "J_eraserBar", "J_picBoard"];
for (var i = 0, group; group = list[i++];) {
domUtils.unSelectable($G(group));
}
},
_saveOPerate:function (saveNum) {
var me = this;
if (drawStep.length <= saveNum) {
if(drawStepIndex
");
}
scale.innerHTML = arr.join("");
return scale;
}
var rect = [
//[left, top, width, height]
[1, 1, -1, -1],
[0, 1, 0, -1],
[0, 1, 1, -1],
[1, 0, -1, 0],
[0, 0, 1, 0],
[1, 0, -1, 1],
[0, 0, 0, 1],
[0, 0, 1, 1]
];
ScaleBoy.prototype = {
init:function () {
_appendStyle();
var me = this,
scale = me.dom = _getDom();
me.scaleMousemove.fp = me;
domUtils.on(scale, 'mousedown', function (e) {
var target = e.target || e.srcElement;
me.start = {x:e.clientX, y:e.clientY};
if (target.className.indexOf('hand') != -1) {
me.dir = target.className.replace('hand', '');
}
domUtils.on(document.body, 'mousemove', me.scaleMousemove);
e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
});
domUtils.on(document.body, 'mouseup', function (e) {
if (me.start) {
domUtils.un(document.body, 'mousemove', me.scaleMousemove);
if (me.moved) {
me.updateScaledElement({position:{x:scale.style.left, y:scale.style.top}, size:{w:scale.style.width, h:scale.style.height}});
}
delete me.start;
delete me.moved;
delete me.dir;
}
});
return scale;
},
startScale:function (objElement) {
var me = this, Idom = me.dom;
Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;';
me.scalingElement = objElement;
},
updateScaledElement:function (objStyle) {
var cur = this.scalingElement,
pos = objStyle.position,
size = objStyle.size;
if (pos) {
typeof pos.x != 'undefined' && (cur.style.left = pos.x);
typeof pos.y != 'undefined' && (cur.style.top = pos.y);
}
if (size) {
size.w && (cur.style.width = size.w);
size.h && (cur.style.height = size.h);
}
},
updateStyleByDir:function (dir, offset) {
var me = this,
dom = me.dom, tmp;
rect['def'] = [1, 1, 0, 0];
if (rect[dir][0] != 0) {
tmp = parseInt(dom.style.left) + offset.x;
dom.style.left = me._validScaledProp('left', tmp) + 'px';
}
if (rect[dir][1] != 0) {
tmp = parseInt(dom.style.top) + offset.y;
dom.style.top = me._validScaledProp('top', tmp) + 'px';
}
if (rect[dir][2] != 0) {
tmp = dom.clientWidth + rect[dir][2] * offset.x;
dom.style.width = me._validScaledProp('width', tmp) + 'px';
}
if (rect[dir][3] != 0) {
tmp = dom.clientHeight + rect[dir][3] * offset.y;
dom.style.height = me._validScaledProp('height', tmp) + 'px';
}
if (dir === 'def') {
me.updateScaledElement({position:{x:dom.style.left, y:dom.style.top}});
}
},
scaleMousemove:function (e) {
var me = arguments.callee.fp,
start = me.start,
dir = me.dir || 'def',
offset = {x:e.clientX - start.x, y:e.clientY - start.y};
me.updateStyleByDir(dir, offset);
arguments.callee.fp.start = {x:e.clientX, y:e.clientY};
arguments.callee.fp.moved = 1;
},
_validScaledProp:function (prop, value) {
var ele = this.dom,
wrap = $G("J_picBoard");
value = isNaN(value) ? 0 : value;
switch (prop) {
case 'left':
return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value;
case 'top':
return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value;
case 'width':
return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value;
case 'height':
return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value;
}
}
};
})();
//后台回调
function ue_callback(url, state) {
var doc = document,
picBorard = $G("J_picBoard"),
img = doc.createElement("img");
//图片缩放
function scale(img, max, oWidth, oHeight) {
var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight;
if (ow > max || oh > max) {
if (ow >= oh) {
if (width = ow - max) {
percent = (width / ow).toFixed(2);
img.height = oh - oh * percent;
img.width = max;
}
} else {
if (height = oh - max) {
percent = (height / oh).toFixed(2);
img.width = ow - ow * percent;
img.height = max;
}
}
}
}
//移除遮罩层
removeMaskLayer();
//状态响应
if (state == "SUCCESS") {
picBorard.innerHTML = "";
img.onload = function () {
scale(this, 300);
picBorard.appendChild(img);
var obj = new scrawl();
obj.btn2Highlight("J_removeImg");
//trace 2457
obj.btn2Highlight("J_sacleBoard");
};
img.src = url;
} else {
alert(state);
}
}
//去掉遮罩层
function removeMaskLayer() {
var maskLayer = $G("J_maskLayer");
maskLayer.className = "maskLayerNull";
maskLayer.innerHTML = "";
dialog.buttons[0].setDisabled(false);
}
//添加遮罩层
function addMaskLayer(html) {
var maskLayer = $G("J_maskLayer");
dialog.buttons[0].setDisabled(true);
maskLayer.className = "maskLayer";
maskLayer.innerHTML = html;
}
//执行确认按钮方法
function exec(scrawlObj) {
if (scrawlObj.isScrawl) {
addMaskLayer(lang.scrawlUpLoading);
var base64 = scrawlObj.getCanvasData();
if (!!base64) {
var options = {
timeout:100000,
onsuccess:function (xhr) {
if (!scrawlObj.isCancelScrawl) {
var responseObj;
responseObj = eval("(" + xhr.responseText + ")");
if (responseObj.state == "SUCCESS") {
var imgObj = {},
url = editor.options.scrawlUrlPrefix + responseObj.url;
imgObj.src = url;
imgObj._src = url;
imgObj.alt = responseObj.original || '';
imgObj.title = responseObj.title || '';
editor.execCommand("insertImage", imgObj);
dialog.close();
} else {
alert(responseObj.state);
}
}
},
onerror:function () {
alert(lang.imageError);
dialog.close();
}
};
options[editor.getOpt('scrawlFieldName')] = base64;
var actionUrl = editor.getActionUrl(editor.getOpt('scrawlActionName')),
params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params);
ajax.request(url, options);
}
} else {
addMaskLayer(lang.noScarwl + " ");
}
}
================================================
FILE: static/common/user/uedit/dialogs/searchreplace/searchreplace.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/searchreplace/searchreplace.js
================================================
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-9-26
* Time: 下午12:29
* To change this template use File | Settings | File Templates.
*/
//清空上次查选的痕迹
editor.firstForSR = 0;
editor.currentRangeForSR = null;
//给tab注册切换事件
/**
* tab点击处理事件
* @param tabHeads
* @param tabBodys
* @param obj
*/
function clickHandler( tabHeads,tabBodys,obj ) {
//head样式更改
for ( var k = 0, len = tabHeads.length; k < len; k++ ) {
tabHeads[k].className = "";
}
obj.className = "focus";
//body显隐
var tabSrc = obj.getAttribute( "tabSrc" );
for ( var j = 0, length = tabBodys.length; j < length; j++ ) {
var body = tabBodys[j],
id = body.getAttribute( "id" );
if ( id != tabSrc ) {
body.style.zIndex = 1;
} else {
body.style.zIndex = 200;
}
}
}
/**
* TAB切换
* @param tabParentId tab的父节点ID或者对象本身
*/
function switchTab( tabParentId ) {
var tabElements = $G( tabParentId ).children,
tabHeads = tabElements[0].children,
tabBodys = tabElements[1].children;
for ( var i = 0, length = tabHeads.length; i < length; i++ ) {
var head = tabHeads[i];
if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head );
head.onclick = function () {
clickHandler(tabHeads,tabBodys,this);
}
}
}
$G('searchtab').onmousedown = function(){
$G('search-msg').innerHTML = '';
$G('replace-msg').innerHTML = ''
}
//是否区分大小写
function getMatchCase(id) {
return $G(id).checked ? true : false;
}
//查找
$G("nextFindBtn").onclick = function (txt, dir, mcase) {
var findtxt = $G("findtxt").value, obj;
if (!findtxt) {
return false;
}
obj = {
searchStr:findtxt,
dir:1,
casesensitive:getMatchCase("matchCase")
};
if (!frCommond(obj)) {
var bk = editor.selection.getRange().createBookmark();
$G('search-msg').innerHTML = lang.getEnd;
editor.selection.getRange().moveToBookmark(bk).select();
}
};
$G("nextReplaceBtn").onclick = function (txt, dir, mcase) {
var findtxt = $G("findtxt1").value, obj;
if (!findtxt) {
return false;
}
obj = {
searchStr:findtxt,
dir:1,
casesensitive:getMatchCase("matchCase1")
};
frCommond(obj);
};
$G("preFindBtn").onclick = function (txt, dir, mcase) {
var findtxt = $G("findtxt").value, obj;
if (!findtxt) {
return false;
}
obj = {
searchStr:findtxt,
dir:-1,
casesensitive:getMatchCase("matchCase")
};
if (!frCommond(obj)) {
$G('search-msg').innerHTML = lang.getStart;
}
};
$G("preReplaceBtn").onclick = function (txt, dir, mcase) {
var findtxt = $G("findtxt1").value, obj;
if (!findtxt) {
return false;
}
obj = {
searchStr:findtxt,
dir:-1,
casesensitive:getMatchCase("matchCase1")
};
frCommond(obj);
};
//替换
$G("repalceBtn").onclick = function () {
var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj,
replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, "");
if (!findtxt) {
return false;
}
if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) {
return false;
}
obj = {
searchStr:findtxt,
dir:1,
casesensitive:getMatchCase("matchCase1"),
replaceStr:replacetxt
};
frCommond(obj);
};
//全部替换
$G("repalceAllBtn").onclick = function () {
var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj,
replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, "");
if (!findtxt) {
return false;
}
if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) {
return false;
}
obj = {
searchStr:findtxt,
casesensitive:getMatchCase("matchCase1"),
replaceStr:replacetxt,
all:true
};
var num = frCommond(obj);
if (num) {
$G('replace-msg').innerHTML = lang.countMsg.replace("{#count}", num);
}
};
//执行
var frCommond = function (obj) {
return editor.execCommand("searchreplace", obj);
};
switchTab("searchtab");
================================================
FILE: static/common/user/uedit/dialogs/snapscreen/snapscreen.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/spechars/spechars.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/spechars/spechars.js
================================================
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-9-26
* Time: 下午1:09
* To change this template use File | Settings | File Templates.
*/
var charsContent = [
{ name:"tsfh", title:lang.tsfh, content:toArray("、,。,·,ˉ,ˇ,¨,〃,々,—,~,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,$,¤,¢,£,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,¬,¦,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,�,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞")},
{ name:"lmsz", title:lang.lmsz, content:toArray("ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ")},
{ name:"szfh", title:lang.szfh, content:toArray("⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩")},
{ name:"rwfh", title:lang.rwfh, content:toArray("ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ")},
{ name:"xlzm", title:lang.xlzm, content:toArray("Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω")},
{ name:"ewzm", title:lang.ewzm, content:toArray("А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я")},
{ name:"pyzm", title:lang.pyzm, content:toArray("ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü")},
{ name:"yyyb", title:lang.yyyb, content:toArray("i:,i,e,æ,ʌ,ə:,ə,u:,u,ɔ:,ɔ,a:,ei,ai,ɔi,əu,au,iə,εə,uə,p,t,k,b,d,g,f,s,ʃ,θ,h,v,z,ʒ,ð,tʃ,tr,ts,dʒ,dr,dz,m,n,ŋ,l,r,w,j,")},
{ name:"zyzf", title:lang.zyzf, content:toArray("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ")}
];
(function createTab(content) {
for (var i = 0, ci; ci = content[i++];) {
var span = document.createElement("span");
span.setAttribute("tabSrc", ci.name);
span.innerHTML = ci.title;
if (i == 1)span.className = "focus";
domUtils.on(span, "click", function () {
var tmps = $G("tabHeads").children;
for (var k = 0, sk; sk = tmps[k++];) {
sk.className = "";
}
tmps = $G("tabBodys").children;
for (var k = 0, sk; sk = tmps[k++];) {
sk.style.display = "none";
}
this.className = "focus";
$G(this.getAttribute("tabSrc")).style.display = "";
});
$G("tabHeads").appendChild(span);
domUtils.insertAfter(span, document.createTextNode("\n"));
var div = document.createElement("div");
div.id = ci.name;
div.style.display = (i == 1) ? "" : "none";
var cons = ci.content;
for (var j = 0, con; con = cons[j++];) {
var charSpan = document.createElement("span");
charSpan.innerHTML = con;
domUtils.on(charSpan, "click", function () {
editor.execCommand("insertHTML", this.innerHTML);
dialog.close();
});
div.appendChild(charSpan);
}
$G("tabBodys").appendChild(div);
}
})(charsContent);
function toArray(str) {
return str.split(",");
}
================================================
FILE: static/common/user/uedit/dialogs/table/edittable.css
================================================
body{
overflow: hidden;
width: 540px;
}
.wrapper {
margin: 10px auto 0;
font-size: 12px;
overflow: hidden;
width: 520px;
height: 315px;
}
.clear {
clear: both;
}
.wrapper .left {
float: left;
margin-left: 10px;;
}
.wrapper .right {
float: right;
border-left: 2px dotted #EDEDED;
padding-left: 15px;
}
.section {
margin-bottom: 15px;
width: 240px;
overflow: hidden;
}
.section h3 {
font-weight: bold;
padding: 5px 0;
margin-bottom: 10px;
border-bottom: 1px solid #EDEDED;
font-size: 12px;
}
.section ul {
list-style: none;
overflow: hidden;
clear: both;
}
.section li {
float: left;
width: 120px;;
}
.section .tone {
width: 80px;;
}
.section .preview {
width: 220px;
}
.section .preview table {
text-align: center;
vertical-align: middle;
color: #666;
}
.section .preview caption {
font-weight: bold;
}
.section .preview td {
border-width: 1px;
border-style: solid;
height: 22px;
}
.section .preview th {
border-style: solid;
border-color: #DDD;
border-width: 2px 1px 1px 1px;
height: 22px;
background-color: #F7F7F7;
}
================================================
FILE: static/common/user/uedit/dialogs/table/edittable.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/table/edittable.js
================================================
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-12-19
* Time: 下午4:55
* To change this template use File | Settings | File Templates.
*/
(function () {
var title = $G("J_title"),
titleCol = $G("J_titleCol"),
caption = $G("J_caption"),
sorttable = $G("J_sorttable"),
autoSizeContent = $G("J_autoSizeContent"),
autoSizePage = $G("J_autoSizePage"),
tone = $G("J_tone"),
me,
preview = $G("J_preview");
var editTable = function () {
me = this;
me.init();
};
editTable.prototype = {
init:function () {
var colorPiker = new UE.ui.ColorPicker({
editor:editor
}),
colorPop = new UE.ui.Popup({
editor:editor,
content:colorPiker
});
title.checked = editor.queryCommandState("inserttitle") == -1;
titleCol.checked = editor.queryCommandState("inserttitlecol") == -1;
caption.checked = editor.queryCommandState("insertcaption") == -1;
sorttable.checked = editor.queryCommandState("enablesort") == 1;
var enablesortState = editor.queryCommandState("enablesort"),
disablesortState = editor.queryCommandState("disablesort");
sorttable.checked = !!(enablesortState < 0 && disablesortState >=0);
sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0);
sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg:'';
me.createTable(title.checked, titleCol.checked, caption.checked);
me.setAutoSize();
me.setColor(me.getColor());
domUtils.on(title, "click", me.titleHanler);
domUtils.on(titleCol, "click", me.titleColHanler);
domUtils.on(caption, "click", me.captionHanler);
domUtils.on(sorttable, "click", me.sorttableHanler);
domUtils.on(autoSizeContent, "click", me.autoSizeContentHanler);
domUtils.on(autoSizePage, "click", me.autoSizePageHanler);
domUtils.on(tone, "click", function () {
colorPop.showAnchor(tone);
});
domUtils.on(document, 'mousedown', function () {
colorPop.hide();
});
colorPiker.addListener("pickcolor", function () {
me.setColor(arguments[1]);
colorPop.hide();
});
colorPiker.addListener("picknocolor", function () {
me.setColor("");
colorPop.hide();
});
},
createTable:function (hasTitle, hasTitleCol, hasCaption) {
var arr = [],
sortSpan = '^ ';
arr.push("");
if (hasCaption) {
arr.push("" + lang.captionName + " ")
}
if (hasTitle) {
arr.push("");
if(hasTitleCol) { arr.push("" + lang.titleName + " "); }
for (var j = 0; j < 5; j++) {
arr.push("" + lang.titleName + " ");
}
arr.push(" ");
}
for (var i = 0; i < 6; i++) {
arr.push("");
if(hasTitleCol) { arr.push("" + lang.titleName + " ") }
for (var k = 0; k < 5; k++) {
arr.push("" + lang.cellsName + " ")
}
arr.push(" ");
}
arr.push("
");
preview.innerHTML = arr.join("");
this.updateSortSpan();
},
titleHanler:function () {
var example = $G("J_example"),
frg=document.createDocumentFragment(),
color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"),
colCount = example.rows[0].children.length;
if (title.checked) {
example.insertRow(0);
for (var i = 0, node; i < colCount; i++) {
node = document.createElement("th");
node.innerHTML = lang.titleName;
frg.appendChild(node);
}
example.rows[0].appendChild(frg);
} else {
domUtils.remove(example.rows[0]);
}
me.setColor(color);
me.updateSortSpan();
},
titleColHanler:function () {
var example = $G("J_example"),
color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"),
colArr = example.rows,
colCount = colArr.length;
if (titleCol.checked) {
for (var i = 0, node; i < colCount; i++) {
node = document.createElement("th");
node.innerHTML = lang.titleName;
colArr[i].insertBefore(node, colArr[i].children[0]);
}
} else {
for (var i = 0; i < colCount; i++) {
domUtils.remove(colArr[i].children[0]);
}
}
me.setColor(color);
me.updateSortSpan();
},
captionHanler:function () {
var example = $G("J_example");
if (caption.checked) {
var row = document.createElement('caption');
row.innerHTML = lang.captionName;
example.insertBefore(row, example.firstChild);
} else {
domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]);
}
},
sorttableHanler:function(){
me.updateSortSpan();
},
autoSizeContentHanler:function () {
var example = $G("J_example");
example.removeAttribute("width");
},
autoSizePageHanler:function () {
var example = $G("J_example");
var tds = example.getElementsByTagName(example, "td");
utils.each(tds, function (td) {
td.removeAttribute("width");
});
example.setAttribute('width', '100%');
},
updateSortSpan: function(){
var example = $G("J_example"),
row = example.rows[0];
var spans = domUtils.getElementsByTagName(example,"span");
utils.each(spans,function(span){
span.parentNode.removeChild(span);
});
if (sorttable.checked) {
utils.each(row.cells, function(cell, i){
var span = document.createElement("span");
span.innerHTML = "^";
cell.appendChild(span);
});
}
},
getColor:function () {
var start = editor.selection.getStart(), color,
cell = domUtils.findParentByTagName(start, ["td", "th", "caption"], true);
color = cell && domUtils.getComputedStyle(cell, "border-color");
if (!color) color = "#DDDDDD";
return color;
},
setColor:function (color) {
var example = $G("J_example"),
arr = domUtils.getElementsByTagName(example, "td").concat(
domUtils.getElementsByTagName(example, "th"),
domUtils.getElementsByTagName(example, "caption")
);
tone.value = color;
utils.each(arr, function (node) {
node.style.borderColor = color;
});
},
setAutoSize:function () {
var me = this;
autoSizePage.checked = true;
me.autoSizePageHanler();
}
};
new editTable;
dialog.onok = function () {
editor.__hasEnterExecCommand = true;
var checks = {
title:"inserttitle deletetitle",
titleCol:"inserttitlecol deletetitlecol",
caption:"insertcaption deletecaption",
sorttable:"enablesort disablesort"
};
editor.fireEvent('saveScene');
for(var i in checks){
var cmds = checks[i].split(" "),
input = $G("J_" + i);
if(input["checked"]){
editor.queryCommandState(cmds[0])!=-1 &&editor.execCommand(cmds[0]);
}else{
editor.queryCommandState(cmds[1])!=-1 &&editor.execCommand(cmds[1]);
}
}
editor.execCommand("edittable", tone.value);
autoSizeContent.checked ?editor.execCommand('adaptbytext') : "";
autoSizePage.checked ? editor.execCommand("adaptbywindow") : "";
editor.fireEvent('saveScene');
editor.__hasEnterExecCommand = false;
};
})();
================================================
FILE: static/common/user/uedit/dialogs/table/edittd.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/table/edittip.html
================================================
表格删除提示
================================================
FILE: static/common/user/uedit/dialogs/template/config.js
================================================
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-8-8
* Time: 下午2:00
* To change this template use File | Settings | File Templates.
*/
var templates = [
{
"pre":"pre0.png",
'title':lang.blank,
'preHtml':' 欢迎使用UEditor!
',
"html":'欢迎使用UEditor!
'
},
{
"pre":"pre1.png",
'title':lang.blog,
'preHtml':'深入理解Range UEditor二次开发
什么是Range 对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。
Range能干什么 在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。
',
"html":'[键入文档标题] [键入文档副标题]
[标题 1] 对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。
[标题 2] 在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。 您还可以使用“开始”选项卡上的其他控件来直接设置文本格式。大多数控件都允许您选择是使用当前主题外观,还是使用某种直接指定的格式。
[标题 3] 对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。
'
},
{
"pre":"pre2.png",
'title':lang.resume,
'preHtml':'WEB前端开发简历 插
入
照
片
联系电话: [键入您的电话]
电子邮件: [键入您的电子邮件地址]
家庭住址: [键入您的地址]
目标职位 WEB前端研发工程师
学历
[起止时间] [学校名称] [所学专业] [所获学位]
工作经验
',
"html":'[此处键入简历标题]
【此处插入照片】
联系电话:[键入您的电话]
电子邮件:[键入您的电子邮件地址]
家庭住址:[键入您的地址]
目标职位 [此处键入您的期望职位]
学历
[键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]
[键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]
工作经验 [键入起止时间] [键入公司名称] [键入职位名称]
[键入负责项目] [键入项目简介]
[键入负责项目] [键入项目简介]
[键入起止时间] [键入公司名称] [键入职位名称]
[键入负责项目] [键入项目简介]
掌握技能
[这里可以键入您所掌握的技能]
'
},
{
"pre":"pre3.png",
'title':lang.richText,
'preHtml':'[此处键入文章标题] 图文混排方法
图片居左,文字围绕图片排版
方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文
还有没有什么其他的环绕方式呢?这里是居右环绕
欢迎大家多多尝试,为UEditor提供更多高质量模板!
',
"html":'
[此处键入文章标题] 图文混排方法
1. 图片居左,文字围绕图片排版
方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文本
2. 图片居右,文字围绕图片排版
方法:在文字前面插入图片,设置居右对齐,然后即可在左边输入多行文本
3. 图片居中环绕排版
方法:亲,这个真心没有办法。。。
还有没有什么其他的环绕方式呢?这里是居右环绕
欢迎大家多多尝试,为UEditor提供更多高质量模板!
占位
占位
占位
占位
占位
'
},
{
"pre":"pre4.png",
'title':lang.sciPapers,
'preHtml':'[键入文章标题] 摘要 :这里可以输入很长很长很长很长很长很长很长很长很差的摘要
标题 1
这里可以输入很多内容,可以图文混排,可以有列表等。
标题 2
列表 1
列表 2
多级列表 1
多级列表 2
列表 3
标题 3
来个文字图文混排的
',
'html':'[键入文章标题] 摘要 :这里可以输入很长很长很长很长很长很长很长很长很差的摘要
标题 1
这里可以输入很多内容,可以图文混排,可以有列表等。
标题 2
来个列表瞅瞅:
列表 1
列表 2
多级列表 1
多级列表 2
列表 3
标题 3
来个文字图文混排的
这里可以多行
右边是图片
绝对没有问题的,不信你也可以试试看
'
}
];
================================================
FILE: static/common/user/uedit/dialogs/template/template.css
================================================
.wrap{ padding: 5px;font-size: 14px;}
.left{width:425px;float: left;}
.right{width:160px;border: 1px solid #ccc;float: right;padding: 5px;margin-right: 5px;}
.right .pre{height: 332px;overflow-y: auto;}
.right .preitem{border: white 1px solid;margin: 5px 0;padding: 2px 0;}
.right .preitem:hover{background-color: lemonChiffon;cursor: pointer;border: #ccc 1px solid;}
.right .preitem img{display: block;margin: 0 auto;width:100px;}
.clear{clear: both;}
.top{height:26px;line-height: 26px;padding: 5px;}
.bottom{height:320px;width:100%;margin: 0 auto;}
.transparent{ background: url("images/bg.gif") repeat;}
.bottom table tr td{border:1px dashed #ccc;}
#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;}
.border_style1{padding:2px;border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;}
p{margin: 5px 0}
table{clear:both;margin-bottom:10px;border-collapse:collapse;word-break:break-all;}
li{clear:both}
ol{padding-left:40px; }
================================================
FILE: static/common/user/uedit/dialogs/template/template.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/template/template.js
================================================
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-8-8
* Time: 下午2:09
* To change this template use File | Settings | File Templates.
*/
(function () {
var me = editor,
preview = $G( "preview" ),
preitem = $G( "preitem" ),
tmps = templates,
currentTmp;
var initPre = function () {
var str = "";
for ( var i = 0, tmp; tmp = tmps[i++]; ) {
str += '';
}
preitem.innerHTML = str;
};
var pre = function ( n ) {
var tmp = tmps[n - 1];
currentTmp = tmp;
clearItem();
domUtils.setStyles( preitem.childNodes[n - 1], {
"background-color":"lemonChiffon",
"border":"#ccc 1px solid"
} );
preview.innerHTML = tmp.preHtml ? tmp.preHtml : "";
};
var clearItem = function () {
var items = preitem.children;
for ( var i = 0, item; item = items[i++]; ) {
domUtils.setStyles( item, {
"background-color":"",
"border":"white 1px solid"
} );
}
};
dialog.onok = function () {
if ( !$G( "issave" ).checked ){
me.execCommand( "cleardoc" );
}
var obj = {
html:currentTmp && currentTmp.html
};
me.execCommand( "template", obj );
};
initPre();
window.pre = pre;
pre(2)
})();
================================================
FILE: static/common/user/uedit/dialogs/video/video.css
================================================
@charset "utf-8";
.wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative}
.tabbody{height: 335px;}
.tabbody .panel {
position: absolute;
width: 0;
height: 0;
background: #fff;
overflow: hidden;
display: none;
}
.tabbody .panel.focus {
width: 100%;
height: 335px;
display: block;
}
.tabbody .panel table td{vertical-align: middle;}
#videoUrl {
width: 490px;
height: 21px;
line-height: 21px;
margin: 8px 5px;
background: #FFF;
border: 1px solid #d7d7d7;
}
#videoSearchTxt{margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;}
#searchList{width: 570px;overflow: auto;zoom:1;height: 270px;}
#searchList div{float: left;width: 120px;height: 135px;margin: 5px 15px;}
#searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*不用缩略图*/
#searchList p{margin-left: 10px;}
#videoType{
width: 65px;
height: 23px;
line-height: 22px;
border: 1px solid #d7d7d7;
}
#videoSearchBtn,#videoSearchReset{
/*width: 80px;*/
height: 25px;
line-height: 25px;
background: #eee;
border: 1px solid #d7d7d7;
cursor: pointer;
padding: 0 5px;
}
#preview{position: relative;width: 420px;padding:0;overflow: hidden; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left}
#preview .previewMsg {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;background-color: #666;}
#preview .previewMsg span{display:block;margin: 125px auto 0 auto;text-align:center;font-size:18px;color:#fff;}
#preview .previewVideo {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;}
.edui-video-wrapper fieldset{
border: 1px solid #ddd;
padding-left: 5px;
margin-bottom: 20px;
padding-bottom: 5px;
width: 115px;
}
#videoInfo {width: 120px;float: left;margin-left: 10px;_margin-left:7px;}
fieldset{
border: 1px solid #ddd;
padding-left: 5px;
margin-bottom: 20px;
padding-bottom: 5px;
width: 115px;
}
fieldset legend{font-weight: bold;}
fieldset p{line-height: 30px;}
fieldset input.txt{
width: 65px;
height: 21px;
line-height: 21px;
margin: 8px 5px;
background: #FFF;
border: 1px solid #d7d7d7;
}
label.url{font-weight: bold;margin-left: 5px;color: #06c;}
#videoFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;}
#videoFloat .focus{opacity: 1;filter: alpha(opacity = 100)}
span.view{display: inline-block;width: 30px;float: right;cursor: pointer;color: blue}
/* upload video */
.tabbody #upload.panel {
width: 0;
height: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
background: #fff;
display: block;
}
.tabbody #upload.panel.focus {
width: 100%;
height: 335px;
display: block;
clip: auto;
}
#upload_alignment div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;}
#upload_alignment .focus{opacity: 1;filter: alpha(opacity = 100)}
#upload_left { width:427px; float:left; }
#upload_left .controller { height: 30px; clear: both; }
#uploadVideoInfo{margin-top:10px;float:right;padding-right:8px;}
#upload .queueList {
margin: 0;
}
#upload p {
margin: 0;
}
.element-invisible {
width: 0 !important;
height: 0 !important;
border: 0;
padding: 0;
margin: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
}
#upload .placeholder {
margin: 10px;
margin-right:0;
border: 2px dashed #e6e6e6;
*border: 0px dashed #e6e6e6;
height: 161px;
padding-top: 150px;
text-align: center;
width: 97%;
float: left;
background: url(./images/image.png) center 70px no-repeat;
color: #cccccc;
font-size: 18px;
position: relative;
top:0;
*margin-left: 0;
*left: 10px;
}
#upload .placeholder .webuploader-pick {
font-size: 18px;
background: #00b7ee;
border-radius: 3px;
line-height: 44px;
padding: 0 30px;
*width: 120px;
color: #fff;
display: inline-block;
margin: 0 auto 20px auto;
cursor: pointer;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
#upload .placeholder .webuploader-pick-hover {
background: #00a2d4;
}
#filePickerContainer {
text-align: center;
}
#upload .placeholder .flashTip {
color: #666666;
font-size: 12px;
position: absolute;
width: 100%;
text-align: center;
bottom: 20px;
}
#upload .placeholder .flashTip a {
color: #0785d1;
text-decoration: none;
}
#upload .placeholder .flashTip a:hover {
text-decoration: underline;
}
#upload .placeholder.webuploader-dnd-over {
border-color: #999999;
}
#upload .filelist {
list-style: none;
margin: 0;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
position: relative;
height: 285px;
}
#upload .filelist:after {
content: '';
display: block;
width: 0;
height: 0;
overflow: hidden;
clear: both;
}
#upload .filelist li {
width: 113px;
height: 113px;
background: url(./images/bg.png);
text-align: center;
margin: 15px 0 0 20px;
*margin: 15px 0 0 15px;
position: relative;
display: block;
float: left;
overflow: hidden;
font-size: 12px;
}
#upload .filelist li p.log {
position: relative;
top: -45px;
}
#upload .filelist li p.title {
position: absolute;
top: 0;
left: 0;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
top: 5px;
text-indent: 5px;
text-align: left;
}
#upload .filelist li p.progress {
position: absolute;
width: 100%;
bottom: 0;
left: 0;
height: 8px;
overflow: hidden;
z-index: 50;
margin: 0;
border-radius: 0;
background: none;
-webkit-box-shadow: 0 0 0;
}
#upload .filelist li p.progress span {
display: none;
overflow: hidden;
width: 0;
height: 100%;
background: #1483d8 url(./images/progress.png) repeat-x;
-webit-transition: width 200ms linear;
-moz-transition: width 200ms linear;
-o-transition: width 200ms linear;
-ms-transition: width 200ms linear;
transition: width 200ms linear;
-webkit-animation: progressmove 2s linear infinite;
-moz-animation: progressmove 2s linear infinite;
-o-animation: progressmove 2s linear infinite;
-ms-animation: progressmove 2s linear infinite;
animation: progressmove 2s linear infinite;
-webkit-transform: translateZ(0);
}
@-webkit-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@-moz-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
#upload .filelist li p.imgWrap {
position: relative;
z-index: 2;
line-height: 113px;
vertical-align: middle;
overflow: hidden;
width: 113px;
height: 113px;
-webkit-transform-origin: 50% 50%;
-moz-transform-origin: 50% 50%;
-o-transform-origin: 50% 50%;
-ms-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webit-transition: 200ms ease-out;
-moz-transition: 200ms ease-out;
-o-transition: 200ms ease-out;
-ms-transition: 200ms ease-out;
transition: 200ms ease-out;
}
#upload .filelist li p.imgWrap.notimage {
margin-top: 0;
width: 111px;
height: 111px;
border: 1px #eeeeee solid;
}
#upload .filelist li p.imgWrap.notimage i.file-preview {
margin-top: 15px;
}
#upload .filelist li img {
width: 100%;
}
#upload .filelist li p.error {
background: #f43838;
color: #fff;
position: absolute;
bottom: 0;
left: 0;
height: 28px;
line-height: 28px;
width: 100%;
z-index: 100;
display:none;
}
#upload .filelist li .success {
display: block;
position: absolute;
left: 0;
bottom: 0;
height: 40px;
width: 100%;
z-index: 200;
background: url(./images/success.png) no-repeat right bottom;
background-image: url(./images/success.gif) \9;
}
#upload .filelist li.filePickerBlock {
width: 113px;
height: 113px;
background: url(./images/image.png) no-repeat center 12px;
border: 1px solid #eeeeee;
border-radius: 0;
}
#upload .filelist li.filePickerBlock div.webuploader-pick {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
opacity: 0;
background: none;
font-size: 0;
}
#upload .filelist div.file-panel {
position: absolute;
height: 0;
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
background: rgba(0, 0, 0, 0.5);
width: 100%;
top: 0;
left: 0;
overflow: hidden;
z-index: 300;
}
#upload .filelist div.file-panel span {
width: 24px;
height: 24px;
display: inline;
float: right;
text-indent: -9999px;
overflow: hidden;
background: url(./images/icons.png) no-repeat;
background: url(./images/icons.gif) no-repeat \9;
margin: 5px 1px 1px;
cursor: pointer;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .filelist div.file-panel span.rotateLeft {
display:none;
background-position: 0 -24px;
}
#upload .filelist div.file-panel span.rotateLeft:hover {
background-position: 0 0;
}
#upload .filelist div.file-panel span.rotateRight {
display:none;
background-position: -24px -24px;
}
#upload .filelist div.file-panel span.rotateRight:hover {
background-position: -24px 0;
}
#upload .filelist div.file-panel span.cancel {
background-position: -48px -24px;
}
#upload .filelist div.file-panel span.cancel:hover {
background-position: -48px 0;
}
#upload .statusBar {
height: 45px;
border-bottom: 1px solid #dadada;
margin: 0 10px;
padding: 0;
line-height: 45px;
vertical-align: middle;
position: relative;
}
#upload .statusBar .progress {
border: 1px solid #1483d8;
width: 198px;
background: #fff;
height: 18px;
position: absolute;
top: 12px;
display: none;
text-align: center;
line-height: 18px;
color: #6dbfff;
margin: 0 10px 0 0;
}
#upload .statusBar .progress span.percentage {
width: 0;
height: 100%;
left: 0;
top: 0;
background: #1483d8;
position: absolute;
}
#upload .statusBar .progress span.text {
position: relative;
z-index: 10;
}
#upload .statusBar .info {
display: inline-block;
font-size: 14px;
color: #666666;
}
#upload .statusBar .btns {
position: absolute;
top: 7px;
right: 0;
line-height: 30px;
}
#filePickerBtn {
display: inline-block;
float: left;
}
#upload .statusBar .btns .webuploader-pick,
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-uploading,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #ffffff;
border: 1px solid #cfcfcf;
color: #565656;
padding: 0 18px;
display: inline-block;
border-radius: 3px;
margin-left: 10px;
cursor: pointer;
font-size: 14px;
float: left;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .statusBar .btns .webuploader-pick-hover,
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-uploading:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #f0f0f0;
}
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-paused{
background: #00b7ee;
color: #fff;
border-color: transparent;
}
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover{
background: #00a2d4;
}
#upload .statusBar .btns .uploadBtn.disabled {
pointer-events: none;
filter:alpha(opacity=60);
-moz-opacity:0.6;
-khtml-opacity: 0.6;
opacity: 0.6;
}
/* 在线文件的文件预览图标 */
i.file-preview {
display: block;
margin: 10px auto;
width: 70px;
height: 70px;
background-image: url("./images/file-icons.png");
background-image: url("./images/file-icons.gif") \9;
background-position: -140px center;
background-repeat: no-repeat;
}
i.file-preview.file-type-dir{
background-position: 0 center;
}
i.file-preview.file-type-file{
background-position: -140px center;
}
i.file-preview.file-type-filelist{
background-position: -210px center;
}
i.file-preview.file-type-zip,
i.file-preview.file-type-rar,
i.file-preview.file-type-7z,
i.file-preview.file-type-tar,
i.file-preview.file-type-gz,
i.file-preview.file-type-bz2{
background-position: -280px center;
}
i.file-preview.file-type-xls,
i.file-preview.file-type-xlsx{
background-position: -350px center;
}
i.file-preview.file-type-doc,
i.file-preview.file-type-docx{
background-position: -420px center;
}
i.file-preview.file-type-ppt,
i.file-preview.file-type-pptx{
background-position: -490px center;
}
i.file-preview.file-type-vsd{
background-position: -560px center;
}
i.file-preview.file-type-pdf{
background-position: -630px center;
}
i.file-preview.file-type-txt,
i.file-preview.file-type-md,
i.file-preview.file-type-json,
i.file-preview.file-type-htm,
i.file-preview.file-type-xml,
i.file-preview.file-type-html,
i.file-preview.file-type-js,
i.file-preview.file-type-css,
i.file-preview.file-type-php,
i.file-preview.file-type-jsp,
i.file-preview.file-type-asp{
background-position: -700px center;
}
i.file-preview.file-type-apk{
background-position: -770px center;
}
i.file-preview.file-type-exe{
background-position: -840px center;
}
i.file-preview.file-type-ipa{
background-position: -910px center;
}
i.file-preview.file-type-mp4,
i.file-preview.file-type-swf,
i.file-preview.file-type-mkv,
i.file-preview.file-type-avi,
i.file-preview.file-type-flv,
i.file-preview.file-type-mov,
i.file-preview.file-type-mpg,
i.file-preview.file-type-mpeg,
i.file-preview.file-type-ogv,
i.file-preview.file-type-webm,
i.file-preview.file-type-rm,
i.file-preview.file-type-rmvb{
background-position: -980px center;
}
i.file-preview.file-type-ogg,
i.file-preview.file-type-wav,
i.file-preview.file-type-wmv,
i.file-preview.file-type-mid,
i.file-preview.file-type-mp3{
background-position: -1050px center;
}
i.file-preview.file-type-jpg,
i.file-preview.file-type-jpeg,
i.file-preview.file-type-gif,
i.file-preview.file-type-bmp,
i.file-preview.file-type-png,
i.file-preview.file-type-psd{
background-position: -140px center;
}
================================================
FILE: static/common/user/uedit/dialogs/video/video.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/video/video.js
================================================
/**
* Created by JetBrains PhpStorm.
* User: taoqili
* Date: 12-2-20
* Time: 上午11:19
* To change this template use File | Settings | File Templates.
*/
(function(){
var video = {},
uploadVideoList = [],
isModifyUploadVideo = false,
uploadFile;
window.onload = function(){
$focus($G("videoUrl"));
initTabs();
initVideo();
initUpload();
};
/* 初始化tab标签 */
function initTabs(){
var tabs = $G('tabHeads').children;
for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) {
var j, bodyId, target = e.target || e.srcElement;
for (j = 0; j < tabs.length; j++) {
bodyId = tabs[j].getAttribute('data-content-id');
if(tabs[j] == target){
domUtils.addClass(tabs[j], 'focus');
domUtils.addClass($G(bodyId), 'focus');
}else {
domUtils.removeClasses(tabs[j], 'focus');
domUtils.removeClasses($G(bodyId), 'focus');
}
}
});
}
}
function initVideo(){
createAlignButton( ["videoFloat", "upload_alignment"] );
addUrlChangeListener($G("videoUrl"));
addOkListener();
//编辑视频时初始化相关信息
(function(){
var img = editor.selection.getRange().getClosedNode(),url;
if(img && img.className){
var hasFakedClass = (img.className == "edui-faked-video"),
hasUploadClass = img.className.indexOf("edui-upload-video")!=-1;
if(hasFakedClass || hasUploadClass) {
$G("videoUrl").value = url = img.getAttribute("_url");
$G("videoWidth").value = img.width;
$G("videoHeight").value = img.height;
var align = domUtils.getComputedStyle(img,"float"),
parentAlign = domUtils.getComputedStyle(img.parentNode,"text-align");
updateAlignButton(parentAlign==="center"?"center":align);
}
if(hasUploadClass) {
isModifyUploadVideo = true;
}
}
createPreviewVideo(url);
})();
}
/**
* 监听确认和取消两个按钮事件,用户执行插入或者清空正在播放的视频实例操作
*/
function addOkListener(){
dialog.onok = function(){
$G("preview").innerHTML = "";
var currentTab = findFocus("tabHeads","tabSrc");
switch(currentTab){
case "video":
return insertSingle();
break;
case "videoSearch":
return insertSearch("searchList");
break;
case "upload":
return insertUpload();
break;
}
};
dialog.oncancel = function(){
$G("preview").innerHTML = "";
};
}
/**
* 依据传入的align值更新按钮信息
* @param align
*/
function updateAlignButton( align ) {
var aligns = $G( "videoFloat" ).children;
for ( var i = 0, ci; ci = aligns[i++]; ) {
if ( ci.getAttribute( "name" ) == align ) {
if ( ci.className !="focus" ) {
ci.className = "focus";
}
} else {
if ( ci.className =="focus" ) {
ci.className = "";
}
}
}
}
/**
* 将单个视频信息插入编辑器中
*/
function insertSingle(){
var width = $G("videoWidth"),
height = $G("videoHeight"),
url=$G('videoUrl').value,
align = findFocus("videoFloat","name");
if(!url) return false;
if ( !checkNum( [width, height] ) ) return false;
editor.execCommand('insertvideo', {
url: convert_url(url),
width: width.value,
height: height.value,
align: align
}, isModifyUploadVideo ? 'upload':null);
}
/**
* 将元素id下的所有代表视频的图片插入编辑器中
* @param id
*/
function insertSearch(id){
var imgs = domUtils.getElementsByTagName($G(id),"img"),
videoObjs=[];
for(var i=0,img; img=imgs[i++];){
if(img.getAttribute("selected")){
videoObjs.push({
url:img.getAttribute("ue_video_url"),
width:420,
height:280,
align:"none"
});
}
}
editor.execCommand('insertvideo',videoObjs);
}
/**
* 找到id下具有focus类的节点并返回该节点下的某个属性
* @param id
* @param returnProperty
*/
function findFocus( id, returnProperty ) {
var tabs = $G( id ).children,
property;
for ( var i = 0, ci; ci = tabs[i++]; ) {
if ( ci.className=="focus" ) {
property = ci.getAttribute( returnProperty );
break;
}
}
return property;
}
function convert_url(url){
if ( !url ) return '';
url = utils.trim(url)
.replace(/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, 'player.youku.com/player.php/sid/$1/v.swf')
.replace(/(www\.)?youtube\.com\/watch\?v=([\w\-]+)/i, "www.youtube.com/v/$2")
.replace(/youtu.be\/(\w+)$/i, "www.youtube.com/v/$1")
.replace(/v\.ku6\.com\/.+\/([\w\.]+)\.html.*$/i, "player.ku6.com/refer/$1/v.swf")
.replace(/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "player.56.com/v_$1.swf")
.replace(/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "player.56.com/v_$1.swf")
.replace(/v\.pps\.tv\/play_([\w]+)\.html.*$/i, "player.pps.tv/player/sid/$1/v.swf")
.replace(/www\.letv\.com\/ptv\/vplay\/([\d]+)\.html.*$/i, "i7.imgs.letv.com/player/swfPlayer.swf?id=$1&autoplay=0")
.replace(/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "www.tudou.com/v/$1")
.replace(/v\.qq\.com\/cover\/[\w]+\/[\w]+\/([\w]+)\.html/i, "static.video.qq.com/TPout.swf?vid=$1")
.replace(/v\.qq\.com\/.+[\?\&]vid=([^&]+).*$/i, "static.video.qq.com/TPout.swf?vid=$1")
.replace(/my\.tv\.sohu\.com\/[\w]+\/[\d]+\/([\d]+)\.shtml.*$/i, "share.vrs.sohu.com/my/v.swf&id=$1");
return url;
}
/**
* 检测传入的所有input框中输入的长宽是否是正数
* @param nodes input框集合,
*/
function checkNum( nodes ) {
for ( var i = 0, ci; ci = nodes[i++]; ) {
var value = ci.value;
if ( !isNumber( value ) && value) {
alert( lang.numError );
ci.value = "";
ci.focus();
return false;
}
}
return true;
}
/**
* 数字判断
* @param value
*/
function isNumber( value ) {
return /(0|^[1-9]\d*$)/.test( value );
}
/**
* 创建图片浮动选择按钮
* @param ids
*/
function createAlignButton( ids ) {
for ( var i = 0, ci; ci = ids[i++]; ) {
var floatContainer = $G( ci ),
nameMaps = {"none":lang['default'], "left":lang.floatLeft, "right":lang.floatRight, "center":lang.block};
for ( var j in nameMaps ) {
var div = document.createElement( "div" );
div.setAttribute( "name", j );
if ( j == "none" ) div.className="focus";
div.style.cssText = "background:url(images/" + j + "_focus.jpg);";
div.setAttribute( "title", nameMaps[j] );
floatContainer.appendChild( div );
}
switchSelect( ci );
}
}
/**
* 选择切换
* @param selectParentId
*/
function switchSelect( selectParentId ) {
var selects = $G( selectParentId ).children;
for ( var i = 0, ci; ci = selects[i++]; ) {
domUtils.on( ci, "click", function () {
for ( var j = 0, cj; cj = selects[j++]; ) {
cj.className = "";
cj.removeAttribute && cj.removeAttribute( "class" );
}
this.className = "focus";
} )
}
}
/**
* 监听url改变事件
* @param url
*/
function addUrlChangeListener(url){
if (browser.ie) {
url.onpropertychange = function () {
createPreviewVideo( this.value );
}
} else {
url.addEventListener( "input", function () {
createPreviewVideo( this.value );
}, false );
}
}
/**
* 根据url生成视频预览
* @param url
*/
function createPreviewVideo(url){
if ( !url )return;
var conUrl = convert_url(url);
conUrl = utils.unhtmlForUrl(conUrl);
$G("preview").innerHTML = ''+lang.urlError+'
'+
'' +
' ';
}
/* 插入上传视频 */
function insertUpload(){
var videoObjs=[],
uploadDir = editor.getOpt('videoUrlPrefix'),
width = parseInt($G('upload_width').value, 10) || 420,
height = parseInt($G('upload_height').value, 10) || 280,
align = findFocus("upload_alignment","name") || 'none';
for(var key in uploadVideoList) {
var file = uploadVideoList[key];
videoObjs.push({
url: uploadDir + file.url,
width:width,
height:height,
align:align
});
}
var count = uploadFile.getQueueCount();
if (count) {
$('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ' ');
return false;
} else {
editor.execCommand('insertvideo', videoObjs, 'upload');
}
}
/*初始化上传标签*/
function initUpload(){
uploadFile = new UploadFile('queueList');
}
/* 上传附件 */
function UploadFile(target) {
this.$wrap = target.constructor == String ? $('#' + target) : $(target);
this.init();
}
UploadFile.prototype = {
init: function () {
this.fileList = [];
this.initContainer();
this.initUploader();
},
initContainer: function () {
this.$queue = this.$wrap.find('.filelist');
},
/* 初始化容器 */
initUploader: function () {
var _this = this,
$ = jQuery, // just in case. Make sure it's not an other libaray.
$wrap = _this.$wrap,
// 图片容器
$queue = $wrap.find('.filelist'),
// 状态栏,包括进度和控制按钮
$statusBar = $wrap.find('.statusBar'),
// 文件总体选择信息。
$info = $statusBar.find('.info'),
// 上传按钮
$upload = $wrap.find('.uploadBtn'),
// 上传按钮
$filePickerBtn = $wrap.find('.filePickerBtn'),
// 上传按钮
$filePickerBlock = $wrap.find('.filePickerBlock'),
// 没选择文件之前的内容。
$placeHolder = $wrap.find('.placeholder'),
// 总体进度条
$progress = $statusBar.find('.progress').hide(),
// 添加的文件数量
fileCount = 0,
// 添加的文件总大小
fileSize = 0,
// 优化retina, 在retina下这个值是2
ratio = window.devicePixelRatio || 1,
// 缩略图大小
thumbnailWidth = 113 * ratio,
thumbnailHeight = 113 * ratio,
// 可能有pedding, ready, uploading, confirm, done.
state = '',
// 所有文件的进度信息,key为file id
percentages = {},
supportTransition = (function () {
var s = document.createElement('p').style,
r = 'transition' in s ||
'WebkitTransition' in s ||
'MozTransition' in s ||
'msTransition' in s ||
'OTransition' in s;
s = null;
return r;
})(),
// WebUploader实例
uploader,
actionUrl = editor.getActionUrl(editor.getOpt('videoActionName')),
fileMaxSize = editor.getOpt('videoMaxSize'),
acceptExtensions = (editor.getOpt('videoAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');;
if (!WebUploader.Uploader.support()) {
$('#filePickerReady').after($('').html(lang.errorNotSupport)).hide();
return;
} else if (!editor.getOpt('videoActionName')) {
$('#filePickerReady').after($('
').html(lang.errorLoadConfig)).hide();
return;
}
uploader = _this.uploader = WebUploader.create({
pick: {
id: '#filePickerReady',
label: lang.uploadSelectFile
},
swf: '../../third-party/webuploader/Uploader.swf',
server: actionUrl,
fileVal: editor.getOpt('videoFieldName'),
duplicate: true,
fileSingleSizeLimit: fileMaxSize,
compress: false
});
uploader.addButton({
id: '#filePickerBlock'
});
uploader.addButton({
id: '#filePickerBtn',
label: lang.uploadAddFile
});
setState('pedding');
// 当有文件添加进来时执行,负责view的创建
function addFile(file) {
var $li = $('
' +
'' + file.name + '
' +
'
' +
'
' +
' '),
$btns = $('
' +
'' + lang.uploadDelete + ' ' +
'' + lang.uploadTurnRight + ' ' +
'' + lang.uploadTurnLeft + '
').appendTo($li),
$prgress = $li.find('p.progress span'),
$wrap = $li.find('p.imgWrap'),
$info = $('
').hide().appendTo($li),
showError = function (code) {
switch (code) {
case 'exceed_size':
text = lang.errorExceedSize;
break;
case 'interrupt':
text = lang.errorInterrupt;
break;
case 'http':
text = lang.errorHttp;
break;
case 'not_allow_type':
text = lang.errorFileType;
break;
default:
text = lang.errorUploadRetry;
break;
}
$info.text(text).show();
};
if (file.getStatus() === 'invalid') {
showError(file.statusText);
} else {
$wrap.text(lang.uploadPreview);
if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) {
$wrap.empty().addClass('notimage').append('
' +
'
' + file.name + ' ');
} else {
if (browser.ie && browser.version <= 7) {
$wrap.text(lang.uploadNoPreview);
} else {
uploader.makeThumb(file, function (error, src) {
if (error || !src || (/^data:/.test(src) && browser.ie && browser.version <= 7)) {
$wrap.text(lang.uploadNoPreview);
} else {
var $img = $('
');
$wrap.empty().append($img);
$img.on('error', function () {
$wrap.text(lang.uploadNoPreview);
});
}
}, thumbnailWidth, thumbnailHeight);
}
}
percentages[ file.id ] = [ file.size, 0 ];
file.rotation = 0;
/* 检查文件格式 */
if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
showError('not_allow_type');
uploader.removeFile(file);
}
}
file.on('statuschange', function (cur, prev) {
if (prev === 'progress') {
$prgress.hide().width(0);
} else if (prev === 'queued') {
$li.off('mouseenter mouseleave');
$btns.remove();
}
// 成功
if (cur === 'error' || cur === 'invalid') {
showError(file.statusText);
percentages[ file.id ][ 1 ] = 1;
} else if (cur === 'interrupt') {
showError('interrupt');
} else if (cur === 'queued') {
percentages[ file.id ][ 1 ] = 0;
} else if (cur === 'progress') {
$info.hide();
$prgress.css('display', 'block');
} else if (cur === 'complete') {
}
$li.removeClass('state-' + prev).addClass('state-' + cur);
});
$li.on('mouseenter', function () {
$btns.stop().animate({height: 30});
});
$li.on('mouseleave', function () {
$btns.stop().animate({height: 0});
});
$btns.on('click', 'span', function () {
var index = $(this).index(),
deg;
switch (index) {
case 0:
uploader.removeFile(file);
return;
case 1:
file.rotation += 90;
break;
case 2:
file.rotation -= 90;
break;
}
if (supportTransition) {
deg = 'rotate(' + file.rotation + 'deg)';
$wrap.css({
'-webkit-transform': deg,
'-mos-transform': deg,
'-o-transform': deg,
'transform': deg
});
} else {
$wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
}
});
$li.insertBefore($filePickerBlock);
}
// 负责view的销毁
function removeFile(file) {
var $li = $('#' + file.id);
delete percentages[ file.id ];
updateTotalProgress();
$li.off().find('.file-panel').off().end().remove();
}
function updateTotalProgress() {
var loaded = 0,
total = 0,
spans = $progress.children(),
percent;
$.each(percentages, function (k, v) {
total += v[ 0 ];
loaded += v[ 0 ] * v[ 1 ];
});
percent = total ? loaded / total : 0;
spans.eq(0).text(Math.round(percent * 100) + '%');
spans.eq(1).css('width', Math.round(percent * 100) + '%');
updateStatus();
}
function setState(val, files) {
if (val != state) {
var stats = uploader.getStats();
$upload.removeClass('state-' + state);
$upload.addClass('state-' + val);
switch (val) {
/* 未选择文件 */
case 'pedding':
$queue.addClass('element-invisible');
$statusBar.addClass('element-invisible');
$placeHolder.removeClass('element-invisible');
$progress.hide(); $info.hide();
uploader.refresh();
break;
/* 可以开始上传 */
case 'ready':
$placeHolder.addClass('element-invisible');
$queue.removeClass('element-invisible');
$statusBar.removeClass('element-invisible');
$progress.hide(); $info.show();
$upload.text(lang.uploadStart);
uploader.refresh();
break;
/* 上传中 */
case 'uploading':
$progress.show(); $info.hide();
$upload.text(lang.uploadPause);
break;
/* 暂停上传 */
case 'paused':
$progress.show(); $info.hide();
$upload.text(lang.uploadContinue);
break;
case 'confirm':
$progress.show(); $info.hide();
$upload.text(lang.uploadStart);
stats = uploader.getStats();
if (stats.successNum && !stats.uploadFailNum) {
setState('finish');
return;
}
break;
case 'finish':
$progress.hide(); $info.show();
if (stats.uploadFailNum) {
$upload.text(lang.uploadRetry);
} else {
$upload.text(lang.uploadStart);
}
break;
}
state = val;
updateStatus();
}
if (!_this.getQueueCount()) {
$upload.addClass('disabled')
} else {
$upload.removeClass('disabled')
}
}
function updateStatus() {
var text = '', stats;
if (state === 'ready') {
text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
} else if (state === 'confirm') {
stats = uploader.getStats();
if (stats.uploadFailNum) {
text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
}
} else {
stats = uploader.getStats();
text = lang.updateStatusFinish.replace('_', fileCount).
replace('_KB', WebUploader.formatSize(fileSize)).
replace('_', stats.successNum);
if (stats.uploadFailNum) {
text += lang.updateStatusError.replace('_', stats.uploadFailNum);
}
}
$info.html(text);
}
uploader.on('fileQueued', function (file) {
fileCount++;
fileSize += file.size;
if (fileCount === 1) {
$placeHolder.addClass('element-invisible');
$statusBar.show();
}
addFile(file);
});
uploader.on('fileDequeued', function (file) {
fileCount--;
fileSize -= file.size;
removeFile(file);
updateTotalProgress();
});
uploader.on('filesQueued', function (file) {
if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
setState('ready');
}
updateTotalProgress();
});
uploader.on('all', function (type, files) {
switch (type) {
case 'uploadFinished':
setState('confirm', files);
break;
case 'startUpload':
/* 添加额外的GET参数 */
var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params);
uploader.option('server', url);
setState('uploading', files);
break;
case 'stopUpload':
setState('paused', files);
break;
}
});
uploader.on('uploadBeforeSend', function (file, data, header) {
//这里可以通过data对象添加POST参数
header['X_Requested_With'] = 'XMLHttpRequest';
});
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress span');
$percent.css('width', percentage * 100 + '%');
percentages[ file.id ][ 1 ] = percentage;
updateTotalProgress();
});
uploader.on('uploadSuccess', function (file, ret) {
var $file = $('#' + file.id);
try {
var responseText = (ret._raw || ret),
json = utils.str2json(responseText);
if (json.state == 'SUCCESS') {
uploadVideoList.push({
'url': json.url,
'type': json.type,
'original':json.original
});
$file.append('
');
} else {
$file.find('.error').text(json.state).show();
}
} catch (e) {
$file.find('.error').text(lang.errorServerUpload).show();
}
});
uploader.on('uploadError', function (file, code) {
});
uploader.on('error', function (code, file) {
if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
addFile(file);
}
});
uploader.on('uploadComplete', function (file, ret) {
});
$upload.on('click', function () {
if ($(this).hasClass('disabled')) {
return false;
}
if (state === 'ready') {
uploader.upload();
} else if (state === 'paused') {
uploader.upload();
} else if (state === 'uploading') {
uploader.stop();
}
});
$upload.addClass('state-' + state);
updateTotalProgress();
},
getQueueCount: function () {
var file, i, status, readyFile = 0, files = this.uploader.getFiles();
for (i = 0; file = files[i++]; ) {
status = file.getStatus();
if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
}
return readyFile;
},
refresh: function(){
this.uploader.refresh();
}
};
})();
================================================
FILE: static/common/user/uedit/dialogs/webapp/webapp.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/wordimage/tangram.js
================================================
// Copyright (c) 2009, Baidu Inc. All rights reserved.
//
// Licensed under the BSD License
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http:// tangram.baidu.com/license.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @namespace T Tangram七巧板
* @name T
* @version 1.6.0
*/
/**
* 声明baidu包
* @author: allstar, erik, meizz, berg
*/
var T,
baidu = T = baidu || {version: "1.5.0"};
baidu.guid = "$BAIDU$";
baidu.$$ = window[baidu.guid] = window[baidu.guid] || {global:{}};
/**
* 使用flash资源封装的一些功能
* @namespace baidu.flash
*/
baidu.flash = baidu.flash || {};
/**
* 操作dom的方法
* @namespace baidu.dom
*/
baidu.dom = baidu.dom || {};
/**
* 从文档中获取指定的DOM元素
* @name baidu.dom.g
* @function
* @grammar baidu.dom.g(id)
* @param {string|HTMLElement} id 元素的id或DOM元素.
* @shortcut g,T.G
* @meta standard
* @see baidu.dom.q
*
* @return {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数.
*/
baidu.dom.g = function(id) {
if (!id) return null;
if ('string' == typeof id || id instanceof String) {
return document.getElementById(id);
} else if (id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {
return id;
}
return null;
};
baidu.g = baidu.G = baidu.dom.g;
/**
* 操作数组的方法
* @namespace baidu.array
*/
baidu.array = baidu.array || {};
/**
* 遍历数组中所有元素
* @name baidu.array.each
* @function
* @grammar baidu.array.each(source, iterator[, thisObject])
* @param {Array} source 需要遍历的数组
* @param {Function} iterator 对每个数组元素进行调用的函数,该函数有两个参数,第一个为数组元素,第二个为数组索引值,function (item, index)。
* @param {Object} [thisObject] 函数调用时的this指针,如果没有此参数,默认是当前遍历的数组
* @remark
* each方法不支持对Object的遍历,对Object的遍历使用baidu.object.each 。
* @shortcut each
* @meta standard
*
* @returns {Array} 遍历的数组
*/
baidu.each = baidu.array.forEach = baidu.array.each = function (source, iterator, thisObject) {
var returnValue, item, i, len = source.length;
if ('function' == typeof iterator) {
for (i = 0; i < len; i++) {
item = source[i];
returnValue = iterator.call(thisObject || source, item, i);
if (returnValue === false) {
break;
}
}
}
return source;
};
/**
* 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。
* @namespace baidu.lang
*/
baidu.lang = baidu.lang || {};
/**
* 判断目标参数是否为function或Function实例
* @name baidu.lang.isFunction
* @function
* @grammar baidu.lang.isFunction(source)
* @param {Any} source 目标参数
* @version 1.2
* @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
* @meta standard
* @returns {boolean} 类型判断结果
*/
baidu.lang.isFunction = function (source) {
return '[object Function]' == Object.prototype.toString.call(source);
};
/**
* 判断目标参数是否string类型或String对象
* @name baidu.lang.isString
* @function
* @grammar baidu.lang.isString(source)
* @param {Any} source 目标参数
* @shortcut isString
* @meta standard
* @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
*
* @returns {boolean} 类型判断结果
*/
baidu.lang.isString = function (source) {
return '[object String]' == Object.prototype.toString.call(source);
};
baidu.isString = baidu.lang.isString;
/**
* 判断浏览器类型和特性的属性
* @namespace baidu.browser
*/
baidu.browser = baidu.browser || {};
/**
* 判断是否为opera浏览器
* @property opera opera版本号
* @grammar baidu.browser.opera
* @meta standard
* @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome
* @returns {Number} opera版本号
*/
/**
* opera 从10开始不是用opera后面的字符串进行版本的判断
* 在Browser identification最后添加Version + 数字进行版本标识
* opera后面的数字保持在9.80不变
*/
baidu.browser.opera = /opera(\/| )(\d+(\.\d+)?)(.+?(version\/(\d+(\.\d+)?)))?/i.test(navigator.userAgent) ? + ( RegExp["\x246"] || RegExp["\x242"] ) : undefined;
/**
* 在目标元素的指定位置插入HTML代码
* @name baidu.dom.insertHTML
* @function
* @grammar baidu.dom.insertHTML(element, position, html)
* @param {HTMLElement|string} element 目标元素或目标元素的id
* @param {string} position 插入html的位置信息,取值为beforeBegin,afterBegin,beforeEnd,afterEnd
* @param {string} html 要插入的html
* @remark
*
* 对于position参数,大小写不敏感
* 参数的意思:beforeBegin<span>afterBegin this is span! beforeEnd</span> afterEnd
* 此外,如果使用本函数插入带有script标签的HTML字符串,script标签对应的脚本将不会被执行。
*
* @shortcut insertHTML
* @meta standard
*
* @returns {HTMLElement} 目标元素
*/
baidu.dom.insertHTML = function (element, position, html) {
element = baidu.dom.g(element);
var range,begin;
if (element.insertAdjacentHTML && !baidu.browser.opera) {
element.insertAdjacentHTML(position, html);
} else {
range = element.ownerDocument.createRange();
position = position.toUpperCase();
if (position == 'AFTERBEGIN' || position == 'BEFOREEND') {
range.selectNodeContents(element);
range.collapse(position == 'AFTERBEGIN');
} else {
begin = position == 'BEFOREBEGIN';
range[begin ? 'setStartBefore' : 'setEndAfter'](element);
range.collapse(begin);
}
range.insertNode(range.createContextualFragment(html));
}
return element;
};
baidu.insertHTML = baidu.dom.insertHTML;
/**
* 操作flash对象的方法,包括创建flash对象、获取flash对象以及判断flash插件的版本号
* @namespace baidu.swf
*/
baidu.swf = baidu.swf || {};
/**
* 浏览器支持的flash插件版本
* @property version 浏览器支持的flash插件版本
* @grammar baidu.swf.version
* @return {String} 版本号
* @meta standard
*/
baidu.swf.version = (function () {
var n = navigator;
if (n.plugins && n.mimeTypes.length) {
var plugin = n.plugins["Shockwave Flash"];
if (plugin && plugin.description) {
return plugin.description
.replace(/([a-zA-Z]|\s)+/, "")
.replace(/(\s)+r/, ".") + ".0";
}
} else if (window.ActiveXObject && !window.opera) {
for (var i = 12; i >= 2; i--) {
try {
var c = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + i);
if (c) {
var version = c.GetVariable("$version");
return version.replace(/WIN/g,'').replace(/,/g,'.');
}
} catch(e) {}
}
}
})();
/**
* 操作字符串的方法
* @namespace baidu.string
*/
baidu.string = baidu.string || {};
/**
* 对目标字符串进行html编码
* @name baidu.string.encodeHTML
* @function
* @grammar baidu.string.encodeHTML(source)
* @param {string} source 目标字符串
* @remark
* 编码字符有5个:&<>"'
* @shortcut encodeHTML
* @meta standard
* @see baidu.string.decodeHTML
*
* @returns {string} html编码后的字符串
*/
baidu.string.encodeHTML = function (source) {
return String(source)
.replace(/&/g,'&')
.replace(//g,'>')
.replace(/"/g, """)
.replace(/'/g, "'");
};
baidu.encodeHTML = baidu.string.encodeHTML;
/**
* 创建flash对象的html字符串
* @name baidu.swf.createHTML
* @function
* @grammar baidu.swf.createHTML(options)
*
* @param {Object} options 创建flash的选项参数
* @param {string} options.id 要创建的flash的标识
* @param {string} options.url flash文件的url
* @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示
* @param {string} options.ver 最低需要的flash player版本号
* @param {string} options.width flash的宽度
* @param {string} options.height flash的高度
* @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom
* @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL
* @param {string} options.bgcolor swf文件的背景色
* @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br
* @param {boolean} options.menu 是否显示右键菜单,允许值:true/false
* @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false
* @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false
* @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best
* @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit
* @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent
* @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain
* @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none
* @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false
* @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false
* @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false
* @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false
* @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。
*
* @see baidu.swf.create
* @meta standard
* @returns {string} flash对象的html字符串
*/
baidu.swf.createHTML = function (options) {
options = options || {};
var version = baidu.swf.version,
needVersion = options['ver'] || '6.0.0',
vUnit1, vUnit2, i, k, len, item, tmpOpt = {},
encodeHTML = baidu.string.encodeHTML;
for (k in options) {
tmpOpt[k] = options[k];
}
options = tmpOpt;
if (version) {
version = version.split('.');
needVersion = needVersion.split('.');
for (i = 0; i < 3; i++) {
vUnit1 = parseInt(version[i], 10);
vUnit2 = parseInt(needVersion[i], 10);
if (vUnit2 < vUnit1) {
break;
} else if (vUnit2 > vUnit1) {
return '';
}
}
} else {
return '';
}
var vars = options['vars'],
objProperties = ['classid', 'codebase', 'id', 'width', 'height', 'align'];
options['align'] = options['align'] || 'middle';
options['classid'] = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000';
options['codebase'] = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0';
options['movie'] = options['url'] || '';
delete options['vars'];
delete options['url'];
if ('string' == typeof vars) {
options['flashvars'] = vars;
} else {
var fvars = [];
for (k in vars) {
item = vars[k];
fvars.push(k + "=" + encodeURIComponent(item));
}
options['flashvars'] = fvars.join('&');
}
var str = ['
');
var params = {
'wmode' : 1,
'scale' : 1,
'quality' : 1,
'play' : 1,
'loop' : 1,
'menu' : 1,
'salign' : 1,
'bgcolor' : 1,
'base' : 1,
'allowscriptaccess' : 1,
'allownetworking' : 1,
'allowfullscreen' : 1,
'seamlesstabbing' : 1,
'devicefont' : 1,
'swliveconnect' : 1,
'flashvars' : 1,
'movie' : 1
};
for (k in options) {
item = options[k];
k = k.toLowerCase();
if (params[k] && (item || item === false || item === 0)) {
str.push(' ');
}
}
options['src'] = options['movie'];
options['name'] = options['id'];
delete options['id'];
delete options['movie'];
delete options['classid'];
delete options['codebase'];
options['type'] = 'application/x-shockwave-flash';
options['pluginspage'] = 'http://www.macromedia.com/go/getflashplayer';
str.push(' ');
return str.join('');
};
/**
* 在页面中创建一个flash对象
* @name baidu.swf.create
* @function
* @grammar baidu.swf.create(options[, container])
*
* @param {Object} options 创建flash的选项参数
* @param {string} options.id 要创建的flash的标识
* @param {string} options.url flash文件的url
* @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示
* @param {string} options.ver 最低需要的flash player版本号
* @param {string} options.width flash的宽度
* @param {string} options.height flash的高度
* @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom
* @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL
* @param {string} options.bgcolor swf文件的背景色
* @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br
* @param {boolean} options.menu 是否显示右键菜单,允许值:true/false
* @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false
* @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false
* @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best
* @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit
* @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent
* @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain
* @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none
* @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false
* @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false
* @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false
* @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false
* @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。
*
* @param {HTMLElement|string} [container] flash对象的父容器元素,不传递该参数时在当前代码位置创建flash对象。
* @meta standard
* @see baidu.swf.createHTML,baidu.swf.getMovie
*/
baidu.swf.create = function (options, target) {
options = options || {};
var html = baidu.swf.createHTML(options)
|| options['errorMessage']
|| '';
if (target && 'string' == typeof target) {
target = document.getElementById(target);
}
baidu.dom.insertHTML( target || document.body ,'beforeEnd',html );
};
/**
* 判断是否为ie浏览器
* @name baidu.browser.ie
* @field
* @grammar baidu.browser.ie
* @returns {Number} IE版本号
*/
baidu.browser.ie = baidu.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || + RegExp['\x241']) : undefined;
/**
* 移除数组中的项
* @name baidu.array.remove
* @function
* @grammar baidu.array.remove(source, match)
* @param {Array} source 需要移除项的数组
* @param {Any} match 要移除的项
* @meta standard
* @see baidu.array.removeAt
*
* @returns {Array} 移除后的数组
*/
baidu.array.remove = function (source, match) {
var len = source.length;
while (len--) {
if (len in source && source[len] === match) {
source.splice(len, 1);
}
}
return source;
};
/**
* 判断目标参数是否Array对象
* @name baidu.lang.isArray
* @function
* @grammar baidu.lang.isArray(source)
* @param {Any} source 目标参数
* @meta standard
* @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
*
* @returns {boolean} 类型判断结果
*/
baidu.lang.isArray = function (source) {
return '[object Array]' == Object.prototype.toString.call(source);
};
/**
* 将一个变量转换成array
* @name baidu.lang.toArray
* @function
* @grammar baidu.lang.toArray(source)
* @param {mix} source 需要转换成array的变量
* @version 1.3
* @meta standard
* @returns {array} 转换后的array
*/
baidu.lang.toArray = function (source) {
if (source === null || source === undefined)
return [];
if (baidu.lang.isArray(source))
return source;
if (typeof source.length !== 'number' || typeof source === 'string' || baidu.lang.isFunction(source)) {
return [source];
}
if (source.item) {
var l = source.length, array = new Array(l);
while (l--)
array[l] = source[l];
return array;
}
return [].slice.call(source);
};
/**
* 获得flash对象的实例
* @name baidu.swf.getMovie
* @function
* @grammar baidu.swf.getMovie(name)
* @param {string} name flash对象的名称
* @see baidu.swf.create
* @meta standard
* @returns {HTMLElement} flash对象的实例
*/
baidu.swf.getMovie = function (name) {
var movie = document[name], ret;
return baidu.browser.ie == 9 ?
movie && movie.length ?
(ret = baidu.array.remove(baidu.lang.toArray(movie),function(item){
return item.tagName.toLowerCase() != "embed";
})).length == 1 ? ret[0] : ret
: movie
: movie || window[name];
};
baidu.flash._Base = (function(){
var prefix = 'bd__flash__';
/**
* 创建一个随机的字符串
* @private
* @return {String}
*/
function _createString(){
return prefix + Math.floor(Math.random() * 2147483648).toString(36);
};
/**
* 检查flash状态
* @private
* @param {Object} target flash对象
* @return {Boolean}
*/
function _checkReady(target){
if(typeof target !== 'undefined' && typeof target.flashInit !== 'undefined' && target.flashInit()){
return true;
}else{
return false;
}
};
/**
* 调用之前进行压栈的函数
* @private
* @param {Array} callQueue 调用队列
* @param {Object} target flash对象
* @return {Null}
*/
function _callFn(callQueue, target){
var result = null;
callQueue = callQueue.reverse();
baidu.each(callQueue, function(item){
result = target.call(item.fnName, item.params);
item.callBack(result);
});
};
/**
* 为传入的匿名函数创建函数名
* @private
* @param {String|Function} fun 传入的匿名函数或者函数名
* @return {String}
*/
function _createFunName(fun){
var name = '';
if(baidu.lang.isFunction(fun)){
name = _createString();
window[name] = function(){
fun.apply(window, arguments);
};
return name;
}else if(baidu.lang.isString){
return fun;
}
};
/**
* 绘制flash
* @private
* @param {Object} options 创建参数
* @return {Object}
*/
function _render(options){
if(!options.id){
options.id = _createString();
}
var container = options.container || '';
delete(options.container);
baidu.swf.create(options, container);
return baidu.swf.getMovie(options.id);
};
return function(options, callBack){
var me = this,
autoRender = (typeof options.autoRender !== 'undefined' ? options.autoRender : true),
createOptions = options.createOptions || {},
target = null,
isReady = false,
callQueue = [],
timeHandle = null,
callBack = callBack || [];
/**
* 将flash文件绘制到页面上
* @public
* @return {Null}
*/
me.render = function(){
target = _render(createOptions);
if(callBack.length > 0){
baidu.each(callBack, function(funName, index){
callBack[index] = _createFunName(options[funName] || new Function());
});
}
me.call('setJSFuncName', [callBack]);
};
/**
* 返回flash状态
* @return {Boolean}
*/
me.isReady = function(){
return isReady;
};
/**
* 调用flash接口的统一入口
* @param {String} fnName 调用的函数名
* @param {Array} params 传入的参数组成的数组,若不许要参数,需传入空数组
* @param {Function} [callBack] 异步调用后将返回值作为参数的调用回调函数,如无返回值,可以不传入此参数
* @return {Null}
*/
me.call = function(fnName, params, callBack){
if(!fnName) return null;
callBack = callBack || new Function();
var result = null;
if(isReady){
result = target.call(fnName, params);
callBack(result);
}else{
callQueue.push({
fnName: fnName,
params: params,
callBack: callBack
});
(!timeHandle) && (timeHandle = setInterval(_check, 200));
}
};
/**
* 为传入的匿名函数创建函数名
* @public
* @param {String|Function} fun 传入的匿名函数或者函数名
* @return {String}
*/
me.createFunName = function(fun){
return _createFunName(fun);
};
/**
* 检查flash是否ready, 并进行调用
* @private
* @return {Null}
*/
function _check(){
if(_checkReady(target)){
clearInterval(timeHandle);
timeHandle = null;
_call();
isReady = true;
}
};
/**
* 调用之前进行压栈的函数
* @private
* @return {Null}
*/
function _call(){
_callFn(callQueue, target);
callQueue = [];
}
autoRender && me.render();
};
})();
/**
* 创建flash based imageUploader
* @class
* @grammar baidu.flash.imageUploader(options)
* @param {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档
* @config {Object} vars 创建imageUploader时所需要的参数
* @config {Number} vars.gridWidth 每一个预览图片所占的宽度,应该为flash寛的整除
* @config {Number} vars.gridHeight 每一个预览图片所占的高度,应该为flash高的整除
* @config {Number} vars.picWidth 单张预览图片的宽度
* @config {Number} vars.picHeight 单张预览图片的高度
* @config {String} vars.uploadDataFieldName POST请求中图片数据的key,默认值'picdata'
* @config {String} vars.picDescFieldName POST请求中图片描述的key,默认值'picDesc'
* @config {Number} vars.maxSize 文件的最大体积,单位'MB'
* @config {Number} vars.compressSize 上传前如果图片体积超过该值,会先压缩
* @config {Number} vars.maxNum:32 最大上传多少个文件
* @config {Number} vars.compressLength 能接受的最大边长,超过该值会等比压缩
* @config {String} vars.url 上传的url地址
* @config {Number} vars.mode mode == 0时,是使用滚动条,mode == 1时,拉伸flash, 默认值为0
* @see baidu.swf.createHTML
* @param {String} backgroundUrl 背景图片路径
* @param {String} listBacgroundkUrl 布局控件背景
* @param {String} buttonUrl 按钮图片不背景
* @param {String|Function} selectFileCallback 选择文件的回调
* @param {String|Function} exceedFileCallback文件超出限制的最大体积时的回调
* @param {String|Function} deleteFileCallback 删除文件的回调
* @param {String|Function} startUploadCallback 开始上传某个文件时的回调
* @param {String|Function} uploadCompleteCallback 某个文件上传完成的回调
* @param {String|Function} uploadErrorCallback 某个文件上传失败的回调
* @param {String|Function} allCompleteCallback 全部上传完成时的回调
* @param {String|Function} changeFlashHeight 改变Flash的高度,mode==1的时候才有用
*/
baidu.flash.imageUploader = baidu.flash.imageUploader || function(options){
var me = this,
options = options || {},
_flash = new baidu.flash._Base(options, [
'selectFileCallback',
'exceedFileCallback',
'deleteFileCallback',
'startUploadCallback',
'uploadCompleteCallback',
'uploadErrorCallback',
'allCompleteCallback',
'changeFlashHeight'
]);
/**
* 开始或回复上传图片
* @public
* @return {Null}
*/
me.upload = function(){
_flash.call('upload');
};
/**
* 暂停上传图片
* @public
* @return {Null}
*/
me.pause = function(){
_flash.call('pause');
};
me.addCustomizedParams = function(index,obj){
_flash.call('addCustomizedParams',[index,obj]);
}
};
/**
* 操作原生对象的方法
* @namespace baidu.object
*/
baidu.object = baidu.object || {};
/**
* 将源对象的所有属性拷贝到目标对象中
* @author erik
* @name baidu.object.extend
* @function
* @grammar baidu.object.extend(target, source)
* @param {Object} target 目标对象
* @param {Object} source 源对象
* @see baidu.array.merge
* @remark
*
1.目标对象中,与源对象key相同的成员将会被覆盖。
2.源对象的prototype成员不会拷贝。
* @shortcut extend
* @meta standard
*
* @returns {Object} 目标对象
*/
baidu.extend =
baidu.object.extend = function (target, source) {
for (var p in source) {
if (source.hasOwnProperty(p)) {
target[p] = source[p];
}
}
return target;
};
/**
* 创建flash based fileUploader
* @class
* @grammar baidu.flash.fileUploader(options)
* @param {Object} options
* @config {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档
* @config {String} createOptions.width
* @config {String} createOptions.height
* @config {Number} maxNum 最大可选文件数
* @config {Function|String} selectFile
* @config {Function|String} exceedMaxSize
* @config {Function|String} deleteFile
* @config {Function|String} uploadStart
* @config {Function|String} uploadComplete
* @config {Function|String} uploadError
* @config {Function|String} uploadProgress
*/
baidu.flash.fileUploader = baidu.flash.fileUploader || function(options){
var me = this,
options = options || {};
options.createOptions = baidu.extend({
wmod: 'transparent'
},options.createOptions || {});
var _flash = new baidu.flash._Base(options, [
'selectFile',
'exceedMaxSize',
'deleteFile',
'uploadStart',
'uploadComplete',
'uploadError',
'uploadProgress'
]);
_flash.call('setMaxNum', options.maxNum ? [options.maxNum] : [1]);
/**
* 设置当鼠标移动到flash上时,是否变成手型
* @public
* @param {Boolean} isCursor
* @return {Null}
*/
me.setHandCursor = function(isCursor){
_flash.call('setHandCursor', [isCursor || false]);
};
/**
* 设置鼠标相应函数名
* @param {String|Function} fun
*/
me.setMSFunName = function(fun){
_flash.call('setMSFunName',[_flash.createFunName(fun)]);
};
/**
* 执行上传操作
* @param {String} url 上传的url
* @param {String} fieldName 上传的表单字段名
* @param {Object} postData 键值对,上传的POST数据
* @param {Number|Array|null|-1} [index]上传的文件序列
* Int值上传该文件
* Array一次串行上传该序列文件
* -1/null上传所有文件
* @return {Null}
*/
me.upload = function(url, fieldName, postData, index){
if(typeof url !== 'string' || typeof fieldName !== 'string') return null;
if(typeof index === 'undefined') index = -1;
_flash.call('upload', [url, fieldName, postData, index]);
};
/**
* 取消上传操作
* @public
* @param {Number|-1} index
*/
me.cancel = function(index){
if(typeof index === 'undefined') index = -1;
_flash.call('cancel', [index]);
};
/**
* 删除文件
* @public
* @param {Number|Array} [index] 要删除的index,不传则全部删除
* @param {Function} callBack
* */
me.deleteFile = function(index, callBack){
var callBackAll = function(list){
callBack && callBack(list);
};
if(typeof index === 'undefined'){
_flash.call('deleteFilesAll', [], callBackAll);
return;
};
if(typeof index === 'Number') index = [index];
index.sort(function(a,b){
return b-a;
});
baidu.each(index, function(item){
_flash.call('deleteFileBy', item, callBackAll);
});
};
/**
* 添加文件类型,支持macType
* @public
* @param {Object|Array[Object]} type {description:String, extention:String}
* @return {Null};
*/
me.addFileType = function(type){
var type = type || [[]];
if(type instanceof Array) type = [type];
else type = [[type]];
_flash.call('addFileTypes', type);
};
/**
* 设置文件类型,支持macType
* @public
* @param {Object|Array[Object]} type {description:String, extention:String}
* @return {Null};
*/
me.setFileType = function(type){
var type = type || [[]];
if(type instanceof Array) type = [type];
else type = [[type]];
_flash.call('setFileTypes', type);
};
/**
* 设置可选文件的数量限制
* @public
* @param {Number} num
* @return {Null}
*/
me.setMaxNum = function(num){
_flash.call('setMaxNum', [num]);
};
/**
* 设置可选文件大小限制,以兆M为单位
* @public
* @param {Number} num,0为无限制
* @return {Null}
*/
me.setMaxSize = function(num){
_flash.call('setMaxSize', [num]);
};
/**
* @public
*/
me.getFileAll = function(callBack){
_flash.call('getFileAll', [], callBack);
};
/**
* @public
* @param {Number} index
* @param {Function} [callBack]
*/
me.getFileByIndex = function(index, callBack){
_flash.call('getFileByIndex', [], callBack);
};
/**
* @public
* @param {Number} index
* @param {function} [callBack]
*/
me.getStatusByIndex = function(index, callBack){
_flash.call('getStatusByIndex', [], callBack);
};
};
/**
* 使用动态script标签请求服务器资源,包括由服务器端的回调和浏览器端的回调
* @namespace baidu.sio
*/
baidu.sio = baidu.sio || {};
/**
*
* @param {HTMLElement} src script节点
* @param {String} url script节点的地址
* @param {String} [charset] 编码
*/
baidu.sio._createScriptTag = function(scr, url, charset){
scr.setAttribute('type', 'text/javascript');
charset && scr.setAttribute('charset', charset);
scr.setAttribute('src', url);
document.getElementsByTagName('head')[0].appendChild(scr);
};
/**
* 删除script的属性,再删除script标签,以解决修复内存泄漏的问题
*
* @param {HTMLElement} src script节点
*/
baidu.sio._removeScriptTag = function(scr){
if (scr.clearAttributes) {
scr.clearAttributes();
} else {
for (var attr in scr) {
if (scr.hasOwnProperty(attr)) {
delete scr[attr];
}
}
}
if(scr && scr.parentNode){
scr.parentNode.removeChild(scr);
}
scr = null;
};
/**
* 通过script标签加载数据,加载完成由浏览器端触发回调
* @name baidu.sio.callByBrowser
* @function
* @grammar baidu.sio.callByBrowser(url, opt_callback, opt_options)
* @param {string} url 加载数据的url
* @param {Function|string} opt_callback 数据加载结束时调用的函数或函数名
* @param {Object} opt_options 其他可选项
* @config {String} [charset] script的字符集
* @config {Integer} [timeOut] 超时时间,超过这个时间将不再响应本请求,并触发onfailure函数
* @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数
* @remark
* 1、与callByServer不同,callback参数只支持Function类型,不支持string。
* 2、如果请求了一个不存在的页面,callback函数在IE/opera下也会被调用,因此使用者需要在onsuccess函数中判断数据是否正确加载。
* @meta standard
* @see baidu.sio.callByServer
*/
baidu.sio.callByBrowser = function (url, opt_callback, opt_options) {
var scr = document.createElement("SCRIPT"),
scriptLoaded = 0,
options = opt_options || {},
charset = options['charset'],
callback = opt_callback || function(){},
timeOut = options['timeOut'] || 0,
timer;
scr.onload = scr.onreadystatechange = function () {
if (scriptLoaded) {
return;
}
var readyState = scr.readyState;
if ('undefined' == typeof readyState
|| readyState == "loaded"
|| readyState == "complete") {
scriptLoaded = 1;
try {
callback();
clearTimeout(timer);
} finally {
scr.onload = scr.onreadystatechange = null;
baidu.sio._removeScriptTag(scr);
}
}
};
if( timeOut ){
timer = setTimeout(function(){
scr.onload = scr.onreadystatechange = null;
baidu.sio._removeScriptTag(scr);
options.onfailure && options.onfailure();
}, timeOut);
}
baidu.sio._createScriptTag(scr, url, charset);
};
/**
* 通过script标签加载数据,加载完成由服务器端触发回调
* @name baidu.sio.callByServer
* @function
* @grammar baidu.sio.callByServer(url, callback[, opt_options])
* @param {string} url 加载数据的url.
* @param {Function|string} callback 服务器端调用的函数或函数名。如果没有指定本参数,将在URL中寻找options['queryField']做为callback的方法名.
* @param {Object} opt_options 加载数据时的选项.
* @config {string} [charset] script的字符集
* @config {string} [queryField] 服务器端callback请求字段名,默认为callback
* @config {Integer} [timeOut] 超时时间(单位:ms),超过这个时间将不再响应本请求,并触发onfailure函数
* @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数
* @remark
* 如果url中已经包含key为“options['queryField']”的query项,将会被替换成callback中参数传递或自动生成的函数名。
* @meta standard
* @see baidu.sio.callByBrowser
*/
baidu.sio.callByServer = /**@function*/function(url, callback, opt_options) {
var scr = document.createElement('SCRIPT'),
prefix = 'bd__cbs__',
callbackName,
callbackImpl,
options = opt_options || {},
charset = options['charset'],
queryField = options['queryField'] || 'callback',
timeOut = options['timeOut'] || 0,
timer,
reg = new RegExp('(\\?|&)' + queryField + '=([^&]*)'),
matches;
if (baidu.lang.isFunction(callback)) {
callbackName = prefix + Math.floor(Math.random() * 2147483648).toString(36);
window[callbackName] = getCallBack(0);
} else if(baidu.lang.isString(callback)){
callbackName = callback;
} else {
if (matches = reg.exec(url)) {
callbackName = matches[2];
}
}
if( timeOut ){
timer = setTimeout(getCallBack(1), timeOut);
}
url = url.replace(reg, '\x241' + queryField + '=' + callbackName);
if (url.search(reg) < 0) {
url += (url.indexOf('?') < 0 ? '?' : '&') + queryField + '=' + callbackName;
}
baidu.sio._createScriptTag(scr, url, charset);
/*
* 返回一个函数,用于立即(挂在window上)或者超时(挂在setTimeout中)时执行
*/
function getCallBack(onTimeOut){
/*global callbackName, callback, scr, options;*/
return function(){
try {
if( onTimeOut ){
options.onfailure && options.onfailure();
}else{
callback.apply(window, arguments);
clearTimeout(timer);
}
window[callbackName] = null;
delete window[callbackName];
} catch (exception) {
} finally {
baidu.sio._removeScriptTag(scr);
}
}
}
};
/**
* 通过请求一个图片的方式令服务器存储一条日志
* @function
* @grammar baidu.sio.log(url)
* @param {string} url 要发送的地址.
* @author: int08h,leeight
*/
baidu.sio.log = function(url) {
var img = new Image(),
key = 'tangram_sio_log_' + Math.floor(Math.random() *
2147483648).toString(36);
window[key] = img;
img.onload = img.onerror = img.onabort = function() {
img.onload = img.onerror = img.onabort = null;
window[key] = null;
img = null;
};
img.src = url;
};
/*
* Tangram
* Copyright 2009 Baidu Inc. All rights reserved.
*
* path: baidu/json.js
* author: erik
* version: 1.1.0
* date: 2009/12/02
*/
/**
* 操作json对象的方法
* @namespace baidu.json
*/
baidu.json = baidu.json || {};
/*
* Tangram
* Copyright 2009 Baidu Inc. All rights reserved.
*
* path: baidu/json/parse.js
* author: erik, berg
* version: 1.2
* date: 2009/11/23
*/
/**
* 将字符串解析成json对象。注:不会自动祛除空格
* @name baidu.json.parse
* @function
* @grammar baidu.json.parse(data)
* @param {string} source 需要解析的字符串
* @remark
* 该方法的实现与ecma-262第五版中规定的JSON.parse不同,暂时只支持传入一个参数。后续会进行功能丰富。
* @meta standard
* @see baidu.json.stringify,baidu.json.decode
*
* @returns {JSON} 解析结果json对象
*/
baidu.json.parse = function (data) {
//2010/12/09:更新至不使用原生parse,不检测用户输入是否正确
return (new Function("return (" + data + ")"))();
};
/*
* Tangram
* Copyright 2009 Baidu Inc. All rights reserved.
*
* path: baidu/json/decode.js
* author: erik, cat
* version: 1.3.4
* date: 2010/12/23
*/
/**
* 将字符串解析成json对象,为过时接口,今后会被baidu.json.parse代替
* @name baidu.json.decode
* @function
* @grammar baidu.json.decode(source)
* @param {string} source 需要解析的字符串
* @meta out
* @see baidu.json.encode,baidu.json.parse
*
* @returns {JSON} 解析结果json对象
*/
baidu.json.decode = baidu.json.parse;
/*
* Tangram
* Copyright 2009 Baidu Inc. All rights reserved.
*
* path: baidu/json/stringify.js
* author: erik
* version: 1.1.0
* date: 2010/01/11
*/
/**
* 将json对象序列化
* @name baidu.json.stringify
* @function
* @grammar baidu.json.stringify(value)
* @param {JSON} value 需要序列化的json对象
* @remark
* 该方法的实现与ecma-262第五版中规定的JSON.stringify不同,暂时只支持传入一个参数。后续会进行功能丰富。
* @meta standard
* @see baidu.json.parse,baidu.json.encode
*
* @returns {string} 序列化后的字符串
*/
baidu.json.stringify = (function () {
/**
* 字符串处理时需要转义的字符表
* @private
*/
var escapeMap = {
"\b": '\\b',
"\t": '\\t',
"\n": '\\n',
"\f": '\\f',
"\r": '\\r',
'"' : '\\"',
"\\": '\\\\'
};
/**
* 字符串序列化
* @private
*/
function encodeString(source) {
if (/["\\\x00-\x1f]/.test(source)) {
source = source.replace(
/["\\\x00-\x1f]/g,
function (match) {
var c = escapeMap[match];
if (c) {
return c;
}
c = match.charCodeAt();
return "\\u00"
+ Math.floor(c / 16).toString(16)
+ (c % 16).toString(16);
});
}
return '"' + source + '"';
}
/**
* 数组序列化
* @private
*/
function encodeArray(source) {
var result = ["["],
l = source.length,
preComma, i, item;
for (i = 0; i < l; i++) {
item = source[i];
switch (typeof item) {
case "undefined":
case "function":
case "unknown":
break;
default:
if(preComma) {
result.push(',');
}
result.push(baidu.json.stringify(item));
preComma = 1;
}
}
result.push("]");
return result.join("");
}
/**
* 处理日期序列化时的补零
* @private
*/
function pad(source) {
return source < 10 ? '0' + source : source;
}
/**
* 日期序列化
* @private
*/
function encodeDate(source){
return '"' + source.getFullYear() + "-"
+ pad(source.getMonth() + 1) + "-"
+ pad(source.getDate()) + "T"
+ pad(source.getHours()) + ":"
+ pad(source.getMinutes()) + ":"
+ pad(source.getSeconds()) + '"';
}
return function (value) {
switch (typeof value) {
case 'undefined':
return 'undefined';
case 'number':
return isFinite(value) ? String(value) : "null";
case 'string':
return encodeString(value);
case 'boolean':
return String(value);
default:
if (value === null) {
return 'null';
} else if (value instanceof Array) {
return encodeArray(value);
} else if (value instanceof Date) {
return encodeDate(value);
} else {
var result = ['{'],
encode = baidu.json.stringify,
preComma,
item;
for (var key in value) {
if (Object.prototype.hasOwnProperty.call(value, key)) {
item = value[key];
switch (typeof item) {
case 'undefined':
case 'unknown':
case 'function':
break;
default:
if (preComma) {
result.push(',');
}
preComma = 1;
result.push(encode(key) + ':' + encode(item));
}
}
}
result.push('}');
return result.join('');
}
}
};
})();
/*
* Tangram
* Copyright 2009 Baidu Inc. All rights reserved.
*
* path: baidu/json/encode.js
* author: erik, cat
* version: 1.3.4
* date: 2010/12/23
*/
/**
* 将json对象序列化,为过时接口,今后会被baidu.json.stringify代替
* @name baidu.json.encode
* @function
* @grammar baidu.json.encode(value)
* @param {JSON} value 需要序列化的json对象
* @meta out
* @see baidu.json.decode,baidu.json.stringify
*
* @returns {string} 序列化后的字符串
*/
baidu.json.encode = baidu.json.stringify;
================================================
FILE: static/common/user/uedit/dialogs/wordimage/wordimage.html
================================================
================================================
FILE: static/common/user/uedit/dialogs/wordimage/wordimage.js
================================================
/**
* Created by JetBrains PhpStorm.
* User: taoqili
* Date: 12-1-30
* Time: 下午12:50
* To change this template use File | Settings | File Templates.
*/
var wordImage = {};
//(function(){
var g = baidu.g,
flashObj,flashContainer;
wordImage.init = function(opt, callbacks) {
showLocalPath("localPath");
//createCopyButton("clipboard","localPath");
createFlashUploader(opt, callbacks);
addUploadListener();
addOkListener();
};
function hideFlash(){
flashObj = null;
flashContainer.innerHTML = "";
}
function addOkListener() {
dialog.onok = function() {
if (!imageUrls.length) return;
var urlPrefix = editor.getOpt('imageUrlPrefix'),
images = domUtils.getElementsByTagName(editor.document,"img");
editor.fireEvent('saveScene');
for (var i = 0,img; img = images[i++];) {
var src = img.getAttribute("word_img");
if (!src) continue;
for (var j = 0,url; url = imageUrls[j++];) {
if (src.indexOf(url.original.replace(" ","")) != -1) {
img.src = urlPrefix + url.url;
img.setAttribute("_src", urlPrefix + url.url); //同时修改"_src"属性
img.setAttribute("title",url.title);
domUtils.removeAttributes(img, ["word_img","style","width","height"]);
editor.fireEvent("selectionchange");
break;
}
}
}
editor.fireEvent('saveScene');
hideFlash();
};
dialog.oncancel = function(){
hideFlash();
}
}
/**
* 绑定开始上传事件
*/
function addUploadListener() {
g("upload").onclick = function () {
flashObj.upload();
this.style.display = "none";
};
}
function showLocalPath(id) {
//单张编辑
var img = editor.selection.getRange().getClosedNode();
var images = editor.execCommand('wordimage');
if(images.length==1 || img && img.tagName == 'IMG'){
g(id).value = images[0];
return;
}
var path = images[0];
var leftSlashIndex = path.lastIndexOf("/")||0, //不同版本的doc和浏览器都可能影响到这个符号,故直接判断两种
rightSlashIndex = path.lastIndexOf("\\")||0,
separater = leftSlashIndex > rightSlashIndex ? "/":"\\" ;
path = path.substring(0, path.lastIndexOf(separater)+1);
g(id).value = path;
}
function createFlashUploader(opt, callbacks) {
//由于lang.flashI18n是静态属性,不可以直接进行修改,否则会影响到后续内容
var i18n = utils.extend({},lang.flashI18n);
//处理图片资源地址的编码,补全等问题
for(var i in i18n){
if(!(i in {"lang":1,"uploadingTF":1,"imageTF":1,"textEncoding":1}) && i18n[i]){
i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]);
}
}
opt = utils.extend(opt,i18n,false);
var option = {
createOptions:{
id:'flash',
url:opt.flashUrl,
width:opt.width,
height:opt.height,
errorMessage:lang.flashError,
wmode:browser.safari ? 'transparent' : 'window',
ver:'10.0.0',
vars:opt,
container:opt.container
}
};
option = extendProperty(callbacks, option);
flashObj = new baidu.flash.imageUploader(option);
flashContainer = $G(opt.container);
}
function extendProperty(fromObj, toObj) {
for (var i in fromObj) {
if (!toObj[i]) {
toObj[i] = fromObj[i];
}
}
return toObj;
}
//})();
function getPasteData(id) {
baidu.g("msg").innerHTML = lang.copySuccess + "";
setTimeout(function() {
baidu.g("msg").innerHTML = "";
}, 5000);
return baidu.g(id).value;
}
function createCopyButton(id, dataFrom) {
baidu.swf.create({
id:"copyFlash",
url:"fClipboard_ueditor.swf",
width:"58",
height:"25",
errorMessage:"",
bgColor:"#CBCBCB",
wmode:"transparent",
ver:"10.0.0",
vars:{
tid:dataFrom
}
}, id
);
var clipboard = baidu.swf.getMovie("copyFlash");
var clipinterval = setInterval(function() {
if (clipboard && clipboard.flashInit) {
clearInterval(clipinterval);
clipboard.setHandCursor(true);
clipboard.setContentFuncName("getPasteData");
//clipboard.setMEFuncName("mouseEventHandler");
}
}, 500);
}
createCopyButton("clipboard", "localPath");
================================================
FILE: static/common/user/uedit/lang/en/en.js
================================================
/**
* Created with JetBrains PhpStorm.
* User: taoqili
* Date: 12-6-12
* Time: 下午6:57
* To change this template use File | Settings | File Templates.
*/
UE.I18N['en'] = {
'labelMap':{
'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen',
'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border',
'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote',
'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview',
'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date',
'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown',
'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'insert code',
'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle',
'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable",
'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link',
'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap',
'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter',
'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL',
'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight',
'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default',
'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage',
'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset',
'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable',
'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts'
},
'insertorderedlist':{
'num':'1,2,3...',
'num1':'1),2),3)...',
'num2':'(1),(2),(3)...',
'cn':'一,二,三....',
'cn1':'一),二),三)....',
'cn2':'(一),(二),(三)....',
'decimal':'1,2,3...',
'lower-alpha':'a,b,c...',
'lower-roman':'i,ii,iii...',
'upper-alpha':'A,B,C...',
'upper-roman':'I,II,III...'
},
'insertunorderedlist':{
'circle':'○ Circle',
'disc':'● Circle dot',
'square':'■ Rectangle ',
'dash' :'- Dash',
'dot' : '。dot'
},
'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'},
'fontfamily':{
'songti':'Sim Sun',
'kaiti':'Sim Kai',
'heiti':'Sim Hei',
'lishu':'Sim Li',
'yahei': 'Microsoft YaHei',
'andaleMono':'Andale Mono',
'arial': 'Arial',
'arialBlack':'Arial Black',
'comicSansMs':'Comic Sans MS',
'impact':'Impact',
'timesNewRoman':'Times New Roman'
},
'customstyle':{
'tc':'Title center',
'tl':'Title left',
'im':'Important',
'hi':'Highlight'
},
'autoupload': {
'exceedSizeError': 'File Size Exceed',
'exceedTypeError': 'File Type Not Allow',
'jsonEncodeError': 'Server Return Format Error',
'loading':"loading...",
'loadError':"load error",
'errorLoadConfig': 'Server config not loaded, upload can not work.',
},
'simpleupload':{
'exceedSizeError': 'File Size Exceed',
'exceedTypeError': 'File Type Not Allow',
'jsonEncodeError': 'Server Return Format Error',
'loading':"loading...",
'loadError':"load error",
'errorLoadConfig': 'Server config not loaded, upload can not work.',
},
'elementPathTip':"Path",
'wordCountTip':"Word Count",
'wordCountMsg':'{#count} characters entered,{#leave} left. ',
'wordOverFlowMsg':'
The number of characters has exceeded allowable maximum values, the server may refuse to save! ',
'ok':"OK",
'cancel':"Cancel",
'closeDialog':"closeDialog",
'tableDrag':"You must import the file uiUtils.js before drag! ",
'autofloatMsg':"The plugin AutoFloat depends on EditorUI!",
'loadconfigError': 'Get server config error.',
'loadconfigFormatError': 'Server config format error.',
'loadconfigHttpError': 'Get server config http error.',
'snapScreen_plugin':{
'browserMsg':"Only IE supported!",
'callBackErrorMsg':"The callback data is wrong,please check the config!",
'uploadErrorMsg':"Upload error,please check your server environment! "
},
'insertcode':{
'as3':'ActionScript 3',
'bash':'Bash/Shell',
'cpp':'C/C++',
'css':'CSS',
'cf':'ColdFusion',
'c#':'C#',
'delphi':'Delphi',
'diff':'Diff',
'erlang':'Erlang',
'groovy':'Groovy',
'html':'HTML',
'java':'Java',
'jfx':'JavaFX',
'js':'JavaScript',
'pl':'Perl',
'php':'PHP',
'plain':'Plain Text',
'ps':'PowerShell',
'python':'Python',
'ruby':'Ruby',
'scala':'Scala',
'sql':'SQL',
'vb':'Visual Basic',
'xml':'XML'
},
'confirmClear':"Do you confirm to clear the Document?",
'contextMenu':{
'delete':"Delete",
'selectall':"Select all",
'deletecode':"Delete Code",
'cleardoc':"Clear Document",
'confirmclear':"Do you confirm to clear the Document?",
'unlink':"Unlink",
'paragraph':"Paragraph",
'edittable':"Table property",
'aligncell':'Align cell',
'aligntable':'Table alignment',
'tableleft':'Left float',
'tablecenter':'Center',
'tableright':'Right float',
'aligntd':'Cell alignment',
'edittd':"Cell property",
'setbordervisible':'set table edge visible',
'table':"Table",
'justifyleft':'Justify Left',
'justifyright':'Justify Right',
'justifycenter':'Justify Center',
'justifyjustify':'Default',
'deletetable':"Delete table",
'insertparagraphbefore':"InsertedBeforeLine",
'insertparagraphafter':'InsertedAfterLine',
'inserttable':'Insert table',
'insertcaption':'Insert caption',
'deletecaption':'Delete Caption',
'inserttitle':'Insert Title',
'deletetitle':'Delete Title',
'inserttitlecol':'Insert Title Col',
'deletetitlecol':'Delete Title Col',
'averageDiseRow':'AverageDise Row',
'averageDisCol':'AverageDis Col',
'deleterow':"Delete row",
'deletecol':"Delete col",
'insertrow':"Insert row",
'insertcol':"Insert col",
'insertrownext':'Insert Row Next',
'insertcolnext':'Insert Col Next',
'mergeright':"Merge right",
'mergeleft':"Merge left",
'mergedown':"Merge down",
'mergecells':"Merge cells",
'splittocells':"Split to cells",
'splittocols':"Split to Cols",
'splittorows':"Split to Rows",
'tablesort':'Table sorting',
'enablesort':'Sorting Enable',
'disablesort':'Sorting Disable',
'reversecurrent':'Reverse current',
'orderbyasc':'Order By ASCII',
'reversebyasc':'Reverse By ASCII',
'orderbynum':'Order By Num',
'reversebynum':'Reverse By Num',
'borderbk':'Border shading',
'setcolor':'interlaced color',
'unsetcolor':'Cancel interlacedcolor',
'setbackground':'Background interlaced',
'unsetbackground':'Cancel Bk interlaced',
'redandblue':'Blue and red',
'threecolorgradient':'Three-color gradient',
'copy':"Copy(Ctrl + c)",
'copymsg':"Browser does not support. Please use 'Ctrl + c' instead!",
'paste':"Paste(Ctrl + v)",
'pastemsg':"Browser does not support. Please use 'Ctrl + v' instead!"
},
'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!",
'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!",
'anthorMsg':"Link",
'clearColor':'Clear',
'standardColor':'Standard color',
'themeColor':'Theme color',
'property':'Property',
'default':'Default',
'modify':'Modify',
'justifyleft':'Justify Left',
'justifyright':'Justify Right',
'justifycenter':'Justify Center',
'justify':'Default',
'clear':'Clear',
'anchorMsg':'Anchor',
'delete':'Delete',
'clickToUpload':"Click to upload",
'unset':'Language hasn\'t been set!',
't_row':'row',
't_col':'col',
'pasteOpt':'Paste Option',
'pasteSourceFormat':"Keep Source Formatting",
'tagFormat':'Keep tag',
'pasteTextFormat':'Keep Text only',
'more':'More',
'autoTypeSet':{
'mergeLine':"Merge empty line",
'delLine':"Del empty line",
'removeFormat':"Remove format",
'indent':"Indent",
'alignment':"Alignment",
'imageFloat':"Image float",
'removeFontsize':"Remove font size",
'removeFontFamily':"Remove fontFamily",
'removeHtml':"Remove redundant HTML code",
'pasteFilter':"Paste filter",
'run':"Done",
'symbol':'Symbol Conversion',
'bdc2sb':'Full-width to Half-width',
'tobdc':'Half-width to Full-width'
},
'background':{
'static':{
'lang_background_normal':'Normal',
'lang_background_local':'Online',
'lang_background_set':'Background Set',
'lang_background_none':'No Background',
'lang_background_colored':'Colored Background',
'lang_background_color':'Color Set',
'lang_background_netimg':'Net-Image',
'lang_background_align':'Align Type',
'lang_background_position':'Position',
'repeatType':{'options':["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]}
},
'noUploadImage':"No pictures has been uploaded!",
'toggleSelect':'Change the active state by click!\n Image Size: '
},
//===============dialog i18N=======================
'insertimage':{
'static':{
'lang_tab_remote':"Insert",
'lang_tab_upload':"Local",
'lang_tab_online':"Manager",
'lang_tab_search':"Search",
'lang_input_url':"Address:",
'lang_input_size':"Size:",
'lang_input_width':"Width",
'lang_input_height':"Height",
'lang_input_border':"Border:",
'lang_input_vhspace':"Margins:",
'lang_input_title':"Title:",
'lang_input_align':'Image Float Style:',
'lang_imgLoading':"Loading...",
'lang_start_upload':"Start Upload",
'lock':{'title':"Lock rate"},
'searchType':{'title':"ImageType", 'options':["News", "Wallpaper", "emotions", "photo"]},
'searchTxt':{'value':"Enter the search keyword!"},
'searchBtn':{'value':"Search"},
'searchReset':{'value':"Clear"},
'noneAlign':{'title':'None Float'},
'leftAlign':{'title':'Left Float'},
'rightAlign':{'title':'Right Float'},
'centerAlign':{'title':'Center In A Line'}
},
'uploadSelectFile':'Select File',
'uploadAddFile':'Add File',
'uploadStart':'Start Upload',
'uploadPause':'Pause Upload',
'uploadContinue':'Continue Upload',
'uploadRetry':'Retry Upload',
'uploadDelete':'Delete',
'uploadTurnLeft':'Turn Left',
'uploadTurnRight':'Turn Right',
'uploadPreview':'Doing Preview',
'uploadNoPreview':'Can Not Preview',
'updateStatusReady': 'Selected _ pictures, total _KB.',
'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully',
'updateStatusError': ' and _ upload failed',
'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
'errorLoadConfig': 'Server config not loaded, upload can not work.',
'errorExceedSize':'File Size Exceed',
'errorFileType':'File Type Not Allow',
'errorInterrupt':'File Upload Interrupted',
'errorUploadRetry':'Upload Error, Please Retry.',
'errorHttp':'Http Error',
'errorServerUpload':'Server Result Error.',
'remoteLockError':"Cannot Lock the Proportion between width and height",
'numError':"Please enter the correct Num. e.g 123,400",
'imageUrlError':"The image format may be wrong!",
'imageLoadError':"Error,please check the network or URL!",
'searchRemind':"Enter the search keyword!",
'searchLoading':"Image is loading,please wait...",
'searchRetry':" Sorry,can't find the image,please try again!"
},
'attachment':{
'static':{
'lang_tab_upload': 'Upload',
'lang_tab_online': 'Online',
'lang_start_upload':"Start upload",
'lang_drop_remind':"You can drop files here, a single maximum of 300 files"
},
'uploadSelectFile':'Select File',
'uploadAddFile':'Add File',
'uploadStart':'Start Upload',
'uploadPause':'Pause Upload',
'uploadContinue':'Continue Upload',
'uploadRetry':'Retry Upload',
'uploadDelete':'Delete',
'uploadTurnLeft':'Turn Left',
'uploadTurnRight':'Turn Right',
'uploadPreview':'Doing Preview',
'updateStatusReady': 'Selected _ files, total _KB.',
'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
'updateStatusError': ' and _ upload failed',
'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
'errorLoadConfig': 'Server config not loaded, upload can not work.',
'errorExceedSize':'File Size Exceed',
'errorFileType':'File Type Not Allow',
'errorInterrupt':'File Upload Interrupted',
'errorUploadRetry':'Upload Error, Please Retry.',
'errorHttp':'Http Error',
'errorServerUpload':'Server Result Error.'
},
'insertvideo':{
'static':{
'lang_tab_insertV':"Video",
'lang_tab_searchV':"Search",
'lang_tab_uploadV':"Upload",
'lang_video_url':" URL ",
'lang_video_size':"Video Size",
'lang_videoW':"Width",
'lang_videoH':"Height",
'lang_alignment':"Alignment",
'videoSearchTxt':{'value':"Enter the search keyword!"},
'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]},
'videoSearchBtn':{'value':"Search in Baidu"},
'videoSearchReset':{'value':"Clear result"},
'lang_input_fileStatus':' No file uploaded!',
'startUpload':{'style':"background:url(upload.png) no-repeat;"},
'lang_upload_size':"Video Size",
'lang_upload_width':"Width",
'lang_upload_height':"Height",
'lang_upload_alignment':"Alignment",
'lang_format_advice':"Recommends mp4 format."
},
'numError':"Please enter the correct Num. e.g 123,400",
'floatLeft':"Float left",
'floatRight':"Float right",
'default':"Default",
'block':"Display in block",
'urlError':"The video url format may be wrong!",
'loading':" The video is loading, please wait…",
'clickToSelect':"Click to select",
'goToSource':'Visit source video ',
'noVideo':" Sorry,can't find the video,please try again!",
'browseFiles':'Open files',
'uploadSuccess':'Upload Successful!',
'delSuccessFile':'Remove from the success of the queue',
'delFailSaveFile':'Remove the save failed file',
'statusPrompt':' file(s) uploaded! ',
'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!',
'flashLoadingError':'The Flash failed loading! Please check the path or network state',
'fileUploadReady':'Wait for uploading...',
'delUploadQueue':'Remove from the uploading queue ',
'limitPrompt1':'Can not choose more than single',
'limitPrompt2':'file(s)!Please choose again!',
'delFailFile':'Remove failure file',
'fileSizeLimit':'File size exceeds the limit!',
'emptyFile':'Can not upload an empty file!',
'fileTypeError':'File type error!',
'unknownError':'Unknown error!',
'fileUploading':'Uploading,please wait...',
'cancelUpload':'Cancel upload',
'netError':'Network error',
'failUpload':'Upload failed',
'serverIOError':'Server IO error!',
'noAuthority':'No Permission!',
'fileNumLimit':'Upload limit to the number',
'failCheck':'Authentication fails, the upload is skipped!',
'fileCanceling':'Cancel, please wait...',
'stopUploading':'Upload has stopped...',
'uploadSelectFile':'Select File',
'uploadAddFile':'Add File',
'uploadStart':'Start Upload',
'uploadPause':'Pause Upload',
'uploadContinue':'Continue Upload',
'uploadRetry':'Retry Upload',
'uploadDelete':'Delete',
'uploadTurnLeft':'Turn Left',
'uploadTurnRight':'Turn Right',
'uploadPreview':'Doing Preview',
'updateStatusReady': 'Selected _ files, total _KB.',
'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
'updateStatusError': ' and _ upload failed',
'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
'errorLoadConfig': 'Server config not loaded, upload can not work.',
'errorExceedSize':'File Size Exceed',
'errorFileType':'File Type Not Allow',
'errorInterrupt':'File Upload Interrupted',
'errorUploadRetry':'Upload Error, Please Retry.',
'errorHttp':'Http Error',
'errorServerUpload':'Server Result Error.'
},
'webapp':{
'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!",
'tip2':"And then open the file ueditor.config.js to set it! ",
'applyFor':"APPLY FOR",
'anthorApi':"Baidu API"
},
'template':{
'static':{
'lang_template_bkcolor':'Background Color',
'lang_template_clear' : 'Keep Content',
'lang_template_select':'Select Template'
},
'blank':"Blank",
'blog':"Blog",
'resume':"Resume",
'richText':"Rich Text",
'scrPapers':"Scientific Papers"
},
scrawl:{
'static':{
'lang_input_previousStep':"Previous",
'lang_input_nextsStep':"Next",
'lang_input_clear':'Clear',
'lang_input_addPic':'AddImage',
'lang_input_ScalePic':'ScaleImage',
'lang_input_removePic':'RemoveImage',
'J_imgTxt':{title:'Add background image'}
},
'noScarwl':"No paint, a white paper...",
'scrawlUpLoading':"Image is uploading, please wait...",
'continueBtn':"Try again",
'imageError':"Image failed to load!",
'backgroundUploading':'Image is uploading,please wait...'
},
'music':{
'static':{
'lang_input_tips':"Input singer/song/album, search you interested in music!",
'J_searchBtn':{value:'Search songs'}
},
'emptyTxt':'Not search to the relevant music results, please change a keyword try.',
'chapter':'Songs',
'singer':'Singer',
'special':'Album',
'listenTest':'Audition'
},
anchor:{
'static':{
'lang_input_anchorName':'Anchor Name:'
}
},
'charts':{
'static':{
'lang_data_source':'Data source:',
'lang_chart_format': 'Chart format:',
'lang_data_align': 'Align',
'lang_chart_align_same': 'Consistent with the X-axis Y-axis',
'lang_chart_align_reverse': 'X-axis Y-axis opposite',
'lang_chart_title': 'Title',
'lang_chart_main_title': 'main title:',
'lang_chart_sub_title': 'sub title:',
'lang_chart_x_title': 'X-axis title:',
'lang_chart_y_title': 'Y-axis title:',
'lang_chart_tip': 'Prompt',
'lang_cahrt_tip_prefix': 'prefix:',
'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀',
'lang_chart_data_unit': 'Unit',
'lang_chart_data_unit_title': 'unit:',
'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃',
'lang_chart_type': 'Chart type:',
'lang_prev_btn': 'Previous',
'lang_next_btn': 'Next'
}
},
emotion:{
'static':{
'lang_input_choice':'Choice',
'lang_input_Tuzki':'Tuzki',
'lang_input_lvdouwa':'LvDouWa',
'lang_input_BOBO':'BOBO',
'lang_input_babyCat':'BabyCat',
'lang_input_bubble':'Bubble',
'lang_input_youa':'YouA'
}
},
gmap:{
'static':{
'lang_input_address':'Address:',
'lang_input_search':'Search',
'address':{value:"Beijing"}
},
searchError:'Unable to locate the address!'
},
help:{
'static':{
'lang_input_about':'About',
'lang_input_shortcuts':'Shortcuts',
'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.",
'lang_Txt_shortcuts':'Shortcuts',
'lang_Txt_func':'Function',
'lang_Txt_bold':'Bold',
'lang_Txt_copy':'Copy',
'lang_Txt_cut':'Cut',
'lang_Txt_Paste':'Paste',
'lang_Txt_undo':'Undo',
'lang_Txt_redo':'Redo',
'lang_Txt_italic':'Italic',
'lang_Txt_underline':'Underline',
'lang_Txt_selectAll':'Select All',
'lang_Txt_visualEnter':'Submit',
'lang_Txt_fullscreen':'Fullscreen'
}
},
insertframe:{
'static':{
'lang_input_address':'Address:',
'lang_input_width':'Width:',
'lang_input_height':'height:',
'lang_input_isScroll':'Enable scrollbars:',
'lang_input_frameborder':'Show frame border:',
'lang_input_alignMode':'Alignment:',
'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]}
},
'enterAddress':'Please enter an address!'
},
link:{
'static':{
'lang_input_text':'Text:',
'lang_input_url':'URL:',
'lang_input_title':'Title:',
'lang_input_target':'open in new window:'
},
'validLink':'Supports only effective when a link is selected',
'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!'
},
map:{
'static':{
lang_city:"City",
lang_address:"Address",
city:{value:"Beijing"},
lang_search:"Search",
lang_dynamicmap:"Dynamic map"
},
cityMsg:"Please enter the city name!",
errorMsg:"Can't find the place!"
},
searchreplace:{
'static':{
lang_tab_search:"Search",
lang_tab_replace:"Replace",
lang_search1:"Search",
lang_search2:"Search",
lang_replace:"Replace",
lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
lang_case_sensitive1:"Case sense",
lang_case_sensitive2:"Case sense",
nextFindBtn:{value:"Next"},
preFindBtn:{value:"Preview"},
nextReplaceBtn:{value:"Next"},
preReplaceBtn:{value:"Preview"},
repalceBtn:{value:"Replace"},
repalceAllBtn:{value:"Replace all"}
},
getEnd:"Has the search to the bottom!",
getStart:"Has the search to the top!",
countMsg:"Altogether replaced {#count} character(s)!"
},
snapscreen:{
'static':{
lang_showMsg:"You should install the UEditor screenshots program first!",
lang_download:"Download!",
lang_step1:"Step1:Download the program and then run it",
lang_step2:"Step2:After complete install,try to click the button again"
}
},
spechars:{
'static':{},
tsfh:"Special",
lmsz:"Roman",
szfh:"Numeral",
rwfh:"Japanese",
xlzm:"The Greek",
ewzm:"Russian",
pyzm:"Phonetic",
yyyb:"English",
zyzf:"Others"
},
'edittable':{
'static':{
'lang_tableStyle':'Table style',
'lang_insertCaption':'Add table header row',
'lang_insertTitle':'Add table title row',
'lang_insertTitleCol':'Add table title col',
'lang_tableSize':'Automatically adjust table size',
'lang_autoSizeContent':'Adaptive by form text',
'lang_orderbycontent':"Table of contents sortable",
'lang_autoSizePage':'Page width adaptive',
'lang_example':'Example',
'lang_borderStyle':'Table Border',
'lang_color':'Color:'
},
captionName:'Caption',
titleName:'Title',
cellsName:'text',
errorMsg:'There are merged cells, can not sort.'
},
'edittip':{
'static':{
lang_delRow:'Delete entire row',
lang_delCol:'Delete entire col'
}
},
'edittd':{
'static':{
lang_tdBkColor:'Background Color:'
}
},
'formula':{
'static':{
}
},
wordimage:{
'static':{
lang_resave:"The re-save step",
uploadBtn:{src:"upload.png", alt:"Upload"},
clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process."
},
fileType:"Image",
flashError:"Flash initialization failed!",
netError:"Network error! Please try again!",
copySuccess:"URL has been copied!",
'flashI18n':{
lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ),
uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ),
imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ),
textEncoding:"utf-8",
addImageSkinURL:"addImage.png",
allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png",
allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png",
rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png",
rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png",
rotateRightBtnEnableSkinURL:"rotateRightEnable.png",
rotateRightBtnDisableSkinURL:"rotateRightDisable.png",
deleteBtnEnableSkinURL:"deleteEnable.png",
deleteBtnDisableSkinURL:"deleteDisable.png",
backgroundURL:'',
listBackgroundURL:'',
buttonURL:'button.png'
}
},
'autosave': {
'success':'Local conservation success'
}
};
================================================
FILE: static/common/user/uedit/lang/zh-cn/zh-cn.js
================================================
/**
* Created with JetBrains PhpStorm.
* User: taoqili
* Date: 12-6-12
* Time: 下午5:02
* To change this template use File | Settings | File Templates.
*/
UE.I18N['zh-cn'] = {
'labelMap':{
'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图',
'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框',
'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用',
'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览',
'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期',
'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格',
'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行',
'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题',
'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言',
'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'多图上传','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接',
'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图', 'gmap':'Google地图',
'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐',
'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表',
'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入',
'rowspacingtop':'段前距', 'rowspacingbottom':'段后距', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认',
'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存',
'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版',
'webapp':'百度应用','touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦',
'music':'音乐','inserttable':'插入表格','drafts': '从草稿箱加载', 'charts': '图表'
},
'insertorderedlist':{
'num':'1,2,3...',
'num1':'1),2),3)...',
'num2':'(1),(2),(3)...',
'cn':'一,二,三....',
'cn1':'一),二),三)....',
'cn2':'(一),(二),(三)....',
'decimal':'1,2,3...',
'lower-alpha':'a,b,c...',
'lower-roman':'i,ii,iii...',
'upper-alpha':'A,B,C...',
'upper-roman':'I,II,III...'
},
'insertunorderedlist':{
'circle':'○ 大圆圈',
'disc':'● 小黑点',
'square':'■ 小方块 ',
'dash' :'— 破折号',
'dot':' 。 小圆圈'
},
'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'},
'fontfamily':{
'songti':'宋体',
'kaiti':'楷体',
'heiti':'黑体',
'lishu':'隶书',
'yahei':'微软雅黑',
'andaleMono':'andale mono',
'arial': 'arial',
'arialBlack':'arial black',
'comicSansMs':'comic sans ms',
'impact':'impact',
'timesNewRoman':'times new roman'
},
'customstyle':{
'tc':'标题居中',
'tl':'标题居左',
'im':'强调',
'hi':'明显强调'
},
'autoupload': {
'exceedSizeError': '文件大小超出限制',
'exceedTypeError': '文件格式不允许',
'jsonEncodeError': '服务器返回格式错误',
'loading':"正在上传...",
'loadError':"上传错误",
'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
},
'simpleupload':{
'exceedSizeError': '文件大小超出限制',
'exceedTypeError': '文件格式不允许',
'jsonEncodeError': '服务器返回格式错误',
'loading':"正在上传...",
'loadError':"上传错误",
'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
},
'elementPathTip':"元素路径",
'wordCountTip':"字数统计",
'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ',
'wordOverFlowMsg':'
字数超出最大允许值,服务器可能拒绝保存! ',
'ok':"确认",
'cancel':"取消",
'closeDialog':"关闭对话框",
'tableDrag':"表格拖动必须引入uiUtils.js文件!",
'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!",
'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!',
'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!',
'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!',
'snapScreen_plugin':{
'browserMsg':"仅支持IE浏览器!",
'callBackErrorMsg':"服务器返回数据有误,请检查配置项之后重试。",
'uploadErrorMsg':"截图上传失败,请检查服务器端环境! "
},
'insertcode':{
'as3':'ActionScript 3',
'bash':'Bash/Shell',
'cpp':'C/C++',
'css':'CSS',
'cf':'ColdFusion',
'c#':'C#',
'delphi':'Delphi',
'diff':'Diff',
'erlang':'Erlang',
'groovy':'Groovy',
'html':'HTML',
'java':'Java',
'jfx':'JavaFX',
'js':'JavaScript',
'pl':'Perl',
'php':'PHP',
'plain':'Plain Text',
'ps':'PowerShell',
'python':'Python',
'ruby':'Ruby',
'scala':'Scala',
'sql':'SQL',
'vb':'Visual Basic',
'xml':'XML'
},
'confirmClear':"确定清空当前文档么?",
'contextMenu':{
'delete':"删除",
'selectall':"全选",
'deletecode':"删除代码",
'cleardoc':"清空文档",
'confirmclear':"确定清空当前文档么?",
'unlink':"删除超链接",
'paragraph':"段落格式",
'edittable':"表格属性",
'aligntd':"单元格对齐方式",
'aligntable':'表格对齐方式',
'tableleft':'左浮动',
'tablecenter':'居中显示',
'tableright':'右浮动',
'edittd':"单元格属性",
'setbordervisible':'设置表格边线可见',
'justifyleft':'左对齐',
'justifyright':'右对齐',
'justifycenter':'居中对齐',
'justifyjustify':'两端对齐',
'table':"表格",
'inserttable':'插入表格',
'deletetable':"删除表格",
'insertparagraphbefore':"前插入段落",
'insertparagraphafter':'后插入段落',
'deleterow':"删除当前行",
'deletecol':"删除当前列",
'insertrow':"前插入行",
'insertcol':"左插入列",
'insertrownext':'后插入行',
'insertcolnext':'右插入列',
'insertcaption':'插入表格名称',
'deletecaption':'删除表格名称',
'inserttitle':'插入表格标题行',
'deletetitle':'删除表格标题行',
'inserttitlecol':'插入表格标题列',
'deletetitlecol':'删除表格标题列',
'averageDiseRow':'平均分布各行',
'averageDisCol':'平均分布各列',
'mergeright':"向右合并",
'mergeleft':"向左合并",
'mergedown':"向下合并",
'mergecells':"合并单元格",
'splittocells':"完全拆分单元格",
'splittocols':"拆分成列",
'splittorows':"拆分成行",
'tablesort':'表格排序',
'enablesort':'设置表格可排序',
'disablesort':'取消表格可排序',
'reversecurrent':'逆序当前',
'orderbyasc':'按ASCII字符升序',
'reversebyasc':'按ASCII字符降序',
'orderbynum':'按数值大小升序',
'reversebynum':'按数值大小降序',
'borderbk':'边框底纹',
'setcolor':'表格隔行变色',
'unsetcolor':'取消表格隔行变色',
'setbackground':'选区背景隔行',
'unsetbackground':'取消选区背景',
'redandblue':'红蓝相间',
'threecolorgradient':'三色渐变',
'copy':"复制(Ctrl + c)",
'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
'paste':"粘贴(Ctrl + v)",
'pastemsg': "浏览器不支持,请使用 'Ctrl + v'"
},
'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
'pastemsg': "浏览器不支持,请使用 'Ctrl + v'",
'anthorMsg':"链接",
'clearColor':'清空颜色',
'standardColor':'标准颜色',
'themeColor':'主题颜色',
'property':'属性',
'default':'默认',
'modify':'修改',
'justifyleft':'左对齐',
'justifyright':'右对齐',
'justifycenter':'居中',
'justify':'默认',
'clear':'清除',
'anchorMsg':'锚点',
'delete':'删除',
'clickToUpload':"点击上传",
'unset':'尚未设置语言文件',
't_row':'行',
't_col':'列',
'more':'更多',
'pasteOpt':'粘贴选项',
'pasteSourceFormat':"保留源格式",
'tagFormat':'只保留标签',
'pasteTextFormat':'只保留文本',
'autoTypeSet':{
'mergeLine':"合并空行",
'delLine':"清除空行",
'removeFormat':"清除格式",
'indent':"首行缩进",
'alignment':"对齐方式",
'imageFloat':"图片浮动",
'removeFontsize':"清除字号",
'removeFontFamily':"清除字体",
'removeHtml':"清除冗余HTML代码",
'pasteFilter':"粘贴过滤",
'run':"执行",
'symbol':'符号转换',
'bdc2sb':'全角转半角',
'tobdc':'半角转全角'
},
'background':{
'static':{
'lang_background_normal':'背景设置',
'lang_background_local':'在线图片',
'lang_background_set':'选项',
'lang_background_none':'无背景色',
'lang_background_colored':'有背景色',
'lang_background_color':'颜色设置',
'lang_background_netimg':'网络图片',
'lang_background_align':'对齐方式',
'lang_background_position':'精确定位',
'repeatType':{'options':["居中", "横向重复", "纵向重复", "平铺","自定义"]}
},
'noUploadImage':"当前未上传过任何图片!",
'toggleSelect':"单击可切换选中状态\n原图尺寸: "
},
//===============dialog i18N=======================
'insertimage':{
'static':{
'lang_tab_remote':"插入图片", //节点
'lang_tab_upload':"本地上传",
'lang_tab_online':"在线管理",
'lang_tab_search':"图片搜索",
'lang_input_url':"地 址:",
'lang_input_size':"大 小:",
'lang_input_width':"宽度",
'lang_input_height':"高度",
'lang_input_border':"边 框:",
'lang_input_vhspace':"边 距:",
'lang_input_title':"描 述:",
'lang_input_align':'图片浮动方式:',
'lang_imgLoading':" 图片加载中……",
'lang_start_upload':"开始上传",
'lock':{'title':"锁定宽高比例"}, //属性
'searchType':{'title':"图片类型", 'options':["新闻", "壁纸", "表情", "头像"]}, //select的option
'searchTxt':{'value':"请输入搜索关键词"},
'searchBtn':{'value':"百度一下"},
'searchReset':{'value':"清空搜索"},
'noneAlign':{'title':'无浮动'},
'leftAlign':{'title':'左浮动'},
'rightAlign':{'title':'右浮动'},
'centerAlign':{'title':'居中独占一行'}
},
'uploadSelectFile':'点击选择图片',
'uploadAddFile':'继续添加',
'uploadStart':'开始上传',
'uploadPause':'暂停上传',
'uploadContinue':'继续上传',
'uploadRetry':'重试上传',
'uploadDelete':'删除',
'uploadTurnLeft':'向左旋转',
'uploadTurnRight':'向右旋转',
'uploadPreview':'预览中',
'uploadNoPreview':'不能预览',
'updateStatusReady': '选中_张图片,共_KB。',
'updateStatusConfirm': '已成功上传_张照片,_张照片上传失败',
'updateStatusFinish': '共_张(_KB),_张上传成功',
'updateStatusError': ',_张上传失败。',
'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
'errorExceedSize':'文件大小超出',
'errorFileType':'文件格式不允许',
'errorInterrupt':'文件传输中断',
'errorUploadRetry':'上传失败,请重试',
'errorHttp':'http请求错误',
'errorServerUpload':'服务器返回出错',
'remoteLockError':"宽高不正确,不能所定比例",
'numError':"请输入正确的长度或者宽度值!例如:123,400",
'imageUrlError':"不允许的图片格式或者图片域!",
'imageLoadError':"图片加载失败!请检查链接地址或网络状态!",
'searchRemind':"请输入搜索关键词",
'searchLoading':"图片加载中,请稍后……",
'searchRetry':" :( ,抱歉,没有找到图片!请重试一次!"
},
'attachment':{
'static':{
'lang_tab_upload': '上传附件',
'lang_tab_online': '在线附件',
'lang_start_upload':"开始上传",
'lang_drop_remind':"可以将文件拖到这里,单次最多可选100个文件"
},
'uploadSelectFile':'点击选择文件',
'uploadAddFile':'继续添加',
'uploadStart':'开始上传',
'uploadPause':'暂停上传',
'uploadContinue':'继续上传',
'uploadRetry':'重试上传',
'uploadDelete':'删除',
'uploadTurnLeft':'向左旋转',
'uploadTurnRight':'向右旋转',
'uploadPreview':'预览中',
'updateStatusReady': '选中_个文件,共_KB。',
'updateStatusConfirm': '已成功上传_个文件,_个文件上传失败',
'updateStatusFinish': '共_个(_KB),_个上传成功',
'updateStatusError': ',_张上传失败。',
'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
'errorExceedSize':'文件大小超出',
'errorFileType':'文件格式不允许',
'errorInterrupt':'文件传输中断',
'errorUploadRetry':'上传失败,请重试',
'errorHttp':'http请求错误',
'errorServerUpload':'服务器返回出错'
},
'insertvideo':{
'static':{
'lang_tab_insertV':"插入视频",
'lang_tab_searchV':"搜索视频",
'lang_tab_uploadV':"上传视频",
'lang_video_url':"视频网址",
'lang_video_size':"视频尺寸",
'lang_videoW':"宽度",
'lang_videoH':"高度",
'lang_alignment':"对齐方式",
'videoSearchTxt':{'value':"请输入搜索关键字!"},
'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]},
'videoSearchBtn':{'value':"百度一下"},
'videoSearchReset':{'value':"清空结果"},
'lang_input_fileStatus':' 当前未上传文件',
'startUpload':{'style':"background:url(upload.png) no-repeat;"},
'lang_upload_size':"视频尺寸",
'lang_upload_width':"宽度",
'lang_upload_height':"高度",
'lang_upload_alignment':"对齐方式",
'lang_format_advice':"建议使用mp4格式."
},
'numError':"请输入正确的数值,如123,400",
'floatLeft':"左浮动",
'floatRight':"右浮动",
'"default"':"默认",
'block':"独占一行",
'urlError':"输入的视频地址有误,请检查后再试!",
'loading':" 视频加载中,请等待……",
'clickToSelect':"点击选中",
'goToSource':'访问源视频',
'noVideo':" 抱歉,找不到对应的视频,请重试!",
'browseFiles':'浏览文件',
'uploadSuccess':'上传成功!',
'delSuccessFile':'从成功队列中移除',
'delFailSaveFile':'移除保存失败文件',
'statusPrompt':' 个文件已上传! ',
'flashVersionError':'当前Flash版本过低,请更新FlashPlayer后重试!',
'flashLoadingError':'Flash加载失败!请检查路径或网络状态',
'fileUploadReady':'等待上传……',
'delUploadQueue':'从上传队列中移除',
'limitPrompt1':'单次不能选择超过',
'limitPrompt2':'个文件!请重新选择!',
'delFailFile':'移除失败文件',
'fileSizeLimit':'文件大小超出限制!',
'emptyFile':'空文件无法上传!',
'fileTypeError':'文件类型不允许!',
'unknownError':'未知错误!',
'fileUploading':'上传中,请等待……',
'cancelUpload':'取消上传',
'netError':'网络错误',
'failUpload':'上传失败!',
'serverIOError':'服务器IO错误!',
'noAuthority':'无权限!',
'fileNumLimit':'上传个数限制',
'failCheck':'验证失败,本次上传被跳过!',
'fileCanceling':'取消中,请等待……',
'stopUploading':'上传已停止……',
'uploadSelectFile':'点击选择文件',
'uploadAddFile':'继续添加',
'uploadStart':'开始上传',
'uploadPause':'暂停上传',
'uploadContinue':'继续上传',
'uploadRetry':'重试上传',
'uploadDelete':'删除',
'uploadTurnLeft':'向左旋转',
'uploadTurnRight':'向右旋转',
'uploadPreview':'预览中',
'updateStatusReady': '选中_个文件,共_KB。',
'updateStatusConfirm': '成功上传_个,_个失败',
'updateStatusFinish': '共_个(_KB),_个成功上传',
'updateStatusError': ',_张上传失败。',
'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
'errorExceedSize':'文件大小超出',
'errorFileType':'文件格式不允许',
'errorInterrupt':'文件传输中断',
'errorUploadRetry':'上传失败,请重试',
'errorHttp':'http请求错误',
'errorServerUpload':'服务器返回出错'
},
'webapp':{
'tip1':"本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey!",
'tip2':"申请完成之后请至ueditor.config.js中配置获得的appkey! ",
'applyFor':"点此申请",
'anthorApi':"百度API"
},
'template':{
'static':{
'lang_template_bkcolor':'背景颜色',
'lang_template_clear' : '保留原有内容',
'lang_template_select' : '选择模板'
},
'blank':"空白文档",
'blog':"博客文章",
'resume':"个人简历",
'richText':"图文混排",
'sciPapers':"科技论文"
},
'scrawl':{
'static':{
'lang_input_previousStep':"上一步",
'lang_input_nextsStep':"下一步",
'lang_input_clear':'清空',
'lang_input_addPic':'添加背景',
'lang_input_ScalePic':'缩放背景',
'lang_input_removePic':'删除背景',
'J_imgTxt':{title:'添加背景图片'}
},
'noScarwl':"尚未作画,白纸一张~",
'scrawlUpLoading':"涂鸦上传中,别急哦~",
'continueBtn':"继续",
'imageError':"糟糕,图片读取失败了!",
'backgroundUploading':'背景图片上传中,别急哦~'
},
'music':{
'static':{
'lang_input_tips':"输入歌手/歌曲/专辑,搜索您感兴趣的音乐!",
'J_searchBtn':{value:'搜索歌曲'}
},
'emptyTxt':'未搜索到相关音乐结果,请换一个关键词试试。',
'chapter':'歌曲',
'singer':'歌手',
'special':'专辑',
'listenTest':'试听'
},
'anchor':{
'static':{
'lang_input_anchorName':'锚点名字:'
}
},
'charts':{
'static':{
'lang_data_source':'数据源:',
'lang_chart_format': '图表格式:',
'lang_data_align': '数据对齐方式',
'lang_chart_align_same': '数据源与图表X轴Y轴一致',
'lang_chart_align_reverse': '数据源与图表X轴Y轴相反',
'lang_chart_title': '图表标题',
'lang_chart_main_title': '主标题:',
'lang_chart_sub_title': '子标题:',
'lang_chart_x_title': 'X轴标题:',
'lang_chart_y_title': 'Y轴标题:',
'lang_chart_tip': '提示文字',
'lang_cahrt_tip_prefix': '提示文字前缀:',
'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀',
'lang_chart_data_unit': '数据单位',
'lang_chart_data_unit_title': '单位:',
'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃',
'lang_chart_type': '图表类型:',
'lang_prev_btn': '上一个',
'lang_next_btn': '下一个'
}
},
'emotion':{
'static':{
'lang_input_choice':'精选',
'lang_input_Tuzki':'兔斯基',
'lang_input_BOBO':'BOBO',
'lang_input_lvdouwa':'绿豆蛙',
'lang_input_babyCat':'baby猫',
'lang_input_bubble':'泡泡',
'lang_input_youa':'有啊'
}
},
'gmap':{
'static':{
'lang_input_address':'地址',
'lang_input_search':'搜索',
'address':{value:"北京"}
},
searchError:'无法定位到该地址!'
},
'help':{
'static':{
'lang_input_about':'关于UEditor',
'lang_input_shortcuts':'快捷键',
'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。开源基于BSD协议,允许自由使用和修改代码。',
'lang_Txt_shortcuts':'快捷键',
'lang_Txt_func':'功能',
'lang_Txt_bold':'给选中字设置为加粗',
'lang_Txt_copy':'复制选中内容',
'lang_Txt_cut':'剪切选中内容',
'lang_Txt_Paste':'粘贴',
'lang_Txt_undo':'重新执行上次操作',
'lang_Txt_redo':'撤销上一次操作',
'lang_Txt_italic':'给选中字设置为斜体',
'lang_Txt_underline':'给选中字加下划线',
'lang_Txt_selectAll':'全部选中',
'lang_Txt_visualEnter':'软回车',
'lang_Txt_fullscreen':'全屏'
}
},
'insertframe':{
'static':{
'lang_input_address':'地址:',
'lang_input_width':'宽度:',
'lang_input_height':'高度:',
'lang_input_isScroll':'允许滚动条:',
'lang_input_frameborder':'显示框架边框:',
'lang_input_alignMode':'对齐方式:',
'align':{title:"对齐方式", options:["默认", "左对齐", "右对齐", "居中"]}
},
'enterAddress':'请输入地址!'
},
'link':{
'static':{
'lang_input_text':'文本内容:',
'lang_input_url':'链接地址:',
'lang_input_title':'标题:',
'lang_input_target':'是否在新窗口打开:'
},
'validLink':'只支持选中一个链接时生效',
'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀'
},
'map':{
'static':{
lang_city:"城市",
lang_address:"地址",
city:{value:"北京"},
lang_search:"搜索",
lang_dynamicmap:"插入动态地图"
},
cityMsg:"请选择城市",
errorMsg:"抱歉,找不到该位置!"
},
'searchreplace':{
'static':{
lang_tab_search:"查找",
lang_tab_replace:"替换",
lang_search1:"查找",
lang_search2:"查找",
lang_replace:"替换",
lang_searchReg:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
lang_searchReg1:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
lang_case_sensitive1:"区分大小写",
lang_case_sensitive2:"区分大小写",
nextFindBtn:{value:"下一个"},
preFindBtn:{value:"上一个"},
nextReplaceBtn:{value:"下一个"},
preReplaceBtn:{value:"上一个"},
repalceBtn:{value:"替换"},
repalceAllBtn:{value:"全部替换"}
},
getEnd:"已经搜索到文章末尾!",
getStart:"已经搜索到文章头部",
countMsg:"总共替换了{#count}处!"
},
'snapscreen':{
'static':{
lang_showMsg:"截图功能需要首先安装UEditor截图插件! ",
lang_download:"点此下载",
lang_step1:"第一步,下载UEditor截图插件并运行安装。",
lang_step2:"第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!"
}
},
'spechars':{
'static':{},
tsfh:"特殊字符",
lmsz:"罗马字符",
szfh:"数学字符",
rwfh:"日文字符",
xlzm:"希腊字母",
ewzm:"俄文字符",
pyzm:"拼音字母",
yyyb:"英语音标",
zyzf:"其他"
},
'edittable':{
'static':{
'lang_tableStyle':'表格样式',
'lang_insertCaption':'添加表格名称行',
'lang_insertTitle':'添加表格标题行',
'lang_insertTitleCol':'添加表格标题列',
'lang_orderbycontent':"使表格内容可排序",
'lang_tableSize':'自动调整表格尺寸',
'lang_autoSizeContent':'按表格文字自适应',
'lang_autoSizePage':'按页面宽度自适应',
'lang_example':'示例',
'lang_borderStyle':'表格边框',
'lang_color':'颜色:'
},
captionName:'表格名称',
titleName:'标题',
cellsName:'内容',
errorMsg:'有合并单元格,不可排序'
},
'edittip':{
'static':{
lang_delRow:'删除整行',
lang_delCol:'删除整列'
}
},
'edittd':{
'static':{
lang_tdBkColor:'背景颜色:'
}
},
'formula':{
'static':{
}
},
'wordimage':{
'static':{
lang_resave:"转存步骤",
uploadBtn:{src:"upload.png",alt:"上传"},
clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
lang_step:"1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。"
},
'fileType':"图片",
'flashError':"FLASH初始化失败,请检查FLASH插件是否正确安装!",
'netError':"网络连接错误,请重试!",
'copySuccess':"图片地址已经复制!",
'flashI18n':{} //留空默认中文
},
'autosave': {
'saving':'保存中...',
'success':'本地保存成功'
}
};
================================================
FILE: static/common/user/uedit/themes/default/_css/autotypesetpicker.css
================================================
/*自动排版弹出菜单*/
.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body {
font-size: 12px;
margin-bottom: 3px;
clear: both;
}
.edui-default .edui-autotypesetpicker-body table {
border-collapse: separate;
border-spacing: 2px;
}
.edui-default .edui-autotypesetpicker-body td {
font-size: 12px;
word-wrap:break-word;
}
.edui-default .edui-autotypesetpicker-body td input {
margin: 3px 3px 3px 4px;
*margin: 1px 0 0 0;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/button.css
================================================
/*普通按钮样式及状态*/
.edui-default .edui-toolbar .edui-button .edui-icon,
.edui-default .edui-toolbar .edui-menubutton .edui-icon,
.edui-default .edui-toolbar .edui-splitbutton .edui-icon {
height: 20px !important;
width: 20px !important;
background-image: url(../images/icons.png);
background-image: url(../images/icons.gif) \9;
}
.edui-default .edui-toolbar .edui-button .edui-button-wrap {
padding: 1px;
position: relative;
}
.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap {
background-color: #fff5d4;
padding: 0;
border: 1px solid #dcac6c;
}
.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap {
background-color: #ffe69f;
padding: 0;
border: 1px solid #dcac6c;
border-radius: 2px;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
}
.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap {
background-color: #ffffff;
padding: 0;
border: 1px solid gray;
}
.edui-default .edui-toolbar .edui-state-disabled .edui-label {
color: #ccc;
}
.edui-default .edui-toolbar .edui-state-disabled .edui-icon {
opacity: 0.3;
filter: alpha(opacity = 30);
}
================================================
FILE: static/common/user/uedit/themes/default/_css/buttonicon.css
================================================
/* toolbar icons */
.edui-default .edui-for-undo .edui-icon {
background-position: -160px 0;
}
.edui-default .edui-for-redo .edui-icon {
background-position: -100px 0;
}
.edui-default .edui-for-bold .edui-icon {
background-position: 0 0;
}
.edui-default .edui-for-italic .edui-icon {
background-position: -60px 0;
}
.edui-default .edui-for-fontborder .edui-icon {
background-position:-160px -40px;
}
.edui-default .edui-for-underline .edui-icon {
background-position: -140px 0;
}
.edui-default .edui-for-strikethrough .edui-icon {
background-position: -120px 0;
}
.edui-default .edui-for-subscript .edui-icon {
background-position: -600px 0;
}
.edui-default .edui-for-superscript .edui-icon {
background-position: -620px 0;
}
.edui-default .edui-for-blockquote .edui-icon {
background-position: -220px 0;
}
.edui-default .edui-for-forecolor .edui-icon {
background-position: -720px 0;
}
.edui-default .edui-for-backcolor .edui-icon {
background-position: -760px 0;
}
.edui-default .edui-for-inserttable .edui-icon {
background-position: -580px -20px;
}
.edui-default .edui-for-autotypeset .edui-icon {
background-position: -640px -40px;
}
.edui-default .edui-for-justifyleft .edui-icon {
background-position: -460px 0;
}
.edui-default .edui-for-justifycenter .edui-icon {
background-position: -420px 0;
}
.edui-default .edui-for-justifyright .edui-icon {
background-position: -480px 0;
}
.edui-default .edui-for-justifyjustify .edui-icon {
background-position: -440px 0;
}
.edui-default .edui-for-insertorderedlist .edui-icon {
background-position: -80px 0;
}
.edui-default .edui-for-insertunorderedlist .edui-icon {
background-position: -20px 0;
}
.edui-default .edui-for-lineheight .edui-icon {
background-position: -725px -40px;
}
.edui-default .edui-for-rowspacingbottom .edui-icon {
background-position: -745px -40px;
}
.edui-default .edui-for-rowspacingtop .edui-icon {
background-position: -765px -40px;
}
.edui-default .edui-for-horizontal .edui-icon {
background-position: -360px 0;
}
.edui-default .edui-for-link .edui-icon {
background-position: -500px 0;
}
.edui-default .edui-for-code .edui-icon {
background-position: -440px -40px;
}
.edui-default .edui-for-insertimage .edui-icon {
background-position: -726px -77px;
}
.edui-default .edui-for-insertframe .edui-icon {
background-position: -240px -40px;
}
.edui-default .edui-for-emoticon .edui-icon {
background-position: -60px -20px;
}
.edui-default .edui-for-spechars .edui-icon {
background-position: -240px 0;
}
.edui-default .edui-for-help .edui-icon {
background-position: -340px 0;
}
.edui-default .edui-for-print .edui-icon {
background-position: -440px -20px;
}
.edui-default .edui-for-preview .edui-icon {
background-position: -420px -20px;
}
.edui-default .edui-for-selectall .edui-icon {
background-position: -400px -20px;
}
.edui-default .edui-for-searchreplace .edui-icon {
background-position: -520px -20px;
}
.edui-default .edui-for-map .edui-icon {
background-position: -40px -40px;
}
.edui-default .edui-for-gmap .edui-icon {
background-position: -260px -40px;
}
.edui-default .edui-for-insertvideo .edui-icon {
background-position: -320px -20px;
}
.edui-default .edui-for-time .edui-icon {
background-position: -160px -20px;
}
.edui-default .edui-for-date .edui-icon {
background-position: -140px -20px;
}
.edui-default .edui-for-cut .edui-icon {
background-position: -680px 0;
}
.edui-default .edui-for-copy .edui-icon {
background-position: -700px 0;
}
.edui-default .edui-for-paste .edui-icon {
background-position: -560px 0;
}
.edui-default .edui-for-formatmatch .edui-icon {
background-position: -40px 0;
}
.edui-default .edui-for-pasteplain .edui-icon {
background-position: -360px -20px;
}
.edui-default .edui-for-directionalityltr .edui-icon {
background-position: -20px -20px;
}
.edui-default .edui-for-directionalityrtl .edui-icon {
background-position: -40px -20px;
}
.edui-default .edui-for-source .edui-icon {
background-position: -261px -0px;
}
.edui-default .edui-for-removeformat .edui-icon {
background-position: -580px 0;
}
.edui-default .edui-for-unlink .edui-icon {
background-position: -640px 0;
}
.edui-default .edui-for-touppercase .edui-icon {
background-position: -786px 0;
}
.edui-default .edui-for-tolowercase .edui-icon {
background-position: -806px 0;
}
.edui-default .edui-for-insertrow .edui-icon {
background-position: -478px -76px;
}
.edui-default .edui-for-insertrownext .edui-icon {
background-position: -498px -76px;
}
.edui-default .edui-for-insertcol .edui-icon {
background-position: -455px -76px;
}
.edui-default .edui-for-insertcolnext .edui-icon {
background-position: -429px -76px;
}
.edui-default .edui-for-mergeright .edui-icon {
background-position: -60px -40px;
}
.edui-default .edui-for-mergedown .edui-icon {
background-position: -80px -40px;
}
.edui-default .edui-for-splittorows .edui-icon {
background-position: -100px -40px;
}
.edui-default .edui-for-splittocols .edui-icon {
background-position: -120px -40px;
}
.edui-default .edui-for-insertparagraphbeforetable .edui-icon {
background-position: -140px -40px;
}
.edui-default .edui-for-deleterow .edui-icon {
background-position: -660px -20px;
}
.edui-default .edui-for-deletecol .edui-icon {
background-position: -640px -20px;
}
.edui-default .edui-for-splittocells .edui-icon {
background-position: -800px -20px;
}
.edui-default .edui-for-mergecells .edui-icon {
background-position: -760px -20px;
}
.edui-default .edui-for-deletetable .edui-icon {
background-position: -620px -20px;
}
.edui-default .edui-for-cleardoc .edui-icon {
background-position: -520px 0;
}
.edui-default .edui-for-fullscreen .edui-icon {
background-position: -100px -20px;
}
.edui-default .edui-for-anchor .edui-icon {
background-position: -200px 0;
}
.edui-default .edui-for-pagebreak .edui-icon {
background-position: -460px -40px;
}
.edui-default .edui-for-imagenone .edui-icon {
background-position: -480px -40px;
}
.edui-default .edui-for-imageleft .edui-icon {
background-position: -500px -40px;
}
.edui-default .edui-for-wordimage .edui-icon {
background-position: -660px -40px;
}
.edui-default .edui-for-imageright .edui-icon {
background-position: -520px -40px;
}
.edui-default .edui-for-imagecenter .edui-icon {
background-position: -540px -40px;
}
.edui-default .edui-for-indent .edui-icon {
background-position: -400px 0;
}
.edui-default .edui-for-outdent .edui-icon {
background-position: -540px 0;
}
.edui-default .edui-for-webapp .edui-icon {
background-position: -601px -40px
}
.edui-default .edui-for-table .edui-icon {
background-position: -580px -20px;
}
.edui-default .edui-for-edittable .edui-icon {
background-position: -420px -40px;
}
.edui-default .edui-for-template .edui-icon {
background-position: -339px -40px;
}
.edui-default .edui-for-delete .edui-icon {
background-position: -360px -40px;
}
.edui-default .edui-for-attachment .edui-icon {
background-position: -620px -40px;
}
.edui-default .edui-for-edittd .edui-icon {
background-position: -700px -40px;
}
.edui-default .edui-for-snapscreen .edui-icon {
background-position: -581px -40px
}
.edui-default .edui-for-scrawl .edui-icon {
background-position: -801px -41px
}
.edui-default .edui-for-background .edui-icon {
background-position: -680px -40px;
}
.edui-default .edui-for-music .edui-icon {
background-position: -18px -40px
}
.edui-default .edui-for-formula .edui-icon {
background-position: -200px -40px
}
.edui-default .edui-for-aligntd .edui-icon {
background-position: -236px -76px;
}
.edui-default .edui-for-insertparagraphtrue .edui-icon {
background-position: -625px -76px;
}
.edui-default .edui-for-insertparagraph .edui-icon {
background-position: -602px -76px;
}
.edui-default .edui-for-insertcaption .edui-icon {
background-position: -336px -76px;
}
.edui-default .edui-for-deletecaption .edui-icon {
background-position: -362px -76px;
}
.edui-default .edui-for-inserttitle .edui-icon {
background-position: -286px -76px;
}
.edui-default .edui-for-deletetitle .edui-icon {
background-position: -311px -76px;
}
.edui-default .edui-for-aligntable .edui-icon {
background-position: -440px 0;
}
.edui-default .edui-for-tablealignment-left .edui-icon {
background-position: -460px 0;
}
.edui-default .edui-for-tablealignment-center .edui-icon {
background-position: -420px 0;
}
.edui-default .edui-for-tablealignment-right .edui-icon {
background-position: -480px 0;
}
.edui-default .edui-for-drafts .edui-icon {
background-position: -560px 0;
}
.edui-default .edui-for-charts .edui-icon {
background: url( ../images/charts.png ) no-repeat 2px 3px!important;
}
.edui-default .edui-for-inserttitlecol .edui-icon {
background-position: -673px -76px;
}
.edui-default .edui-for-deletetitlecol .edui-icon {
background-position: -698px -76px;
}
.edui-default .edui-for-simpleupload .edui-icon {
background-position: -380px 0px;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/cellalignpicker.css
================================================
/*自动排版弹出菜单*/
.edui-default .edui-cellalignpicker .edui-cellalignpicker-body {
width: 70px;
font-size: 12px;
cursor: default;
}
.edui-default .edui-cellalignpicker-body table {
border-collapse: separate;
border-spacing: 0;
}
.edui-default .edui-cellalignpicker-body td{
padding: 1px;
}
.edui-default .edui-cellalignpicker-body .edui-icon{
height: 20px;
width: 20px;
padding: 1px;
background-image: url(../images/table-cell-align.png);
}
.edui-default .edui-cellalignpicker-body .edui-left{
background-position: 0 0;
}
.edui-default .edui-cellalignpicker-body .edui-center{
background-position: -25px 0;
}
.edui-default .edui-cellalignpicker-body .edui-right{
background-position: -51px 0;
}
.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{
background-position: -73px 0;
}
.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{
background-position: -98px 0;
}
.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{
background-position: -124px 0;
}
.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left {
background-position: -146px 0;
background-color: #f1f4f5;
}
.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center {
background-position: -245px 0;
}
.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right {
background-position: -271px 0;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/colorbutton.css
================================================
/*颜色按钮 */
.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump {
position: absolute;
overflow: hidden;
bottom: 1px;
left: 1px;
width: 18px;
height: 4px;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/colorpicker.css
================================================
/* 颜色弹出菜单 */
.edui-default .edui-colorpicker-topbar {
height: 27px;
width: 200px;
/*border-bottom: 1px gray dashed;*/
}
.edui-default .edui-colorpicker-preview {
height: 20px;
border: 1px inset black;
margin-left: 1px;
width: 128px;
float: left;
}
.edui-default .edui-colorpicker-nocolor {
float: right;
margin-right: 1px;
font-size: 12px;
line-height: 14px;
height: 14px;
border: 1px solid #333;
padding: 3px 5px;
cursor: pointer;
}
.edui-default .edui-colorpicker-tablefirstrow {
height: 30px;
}
.edui-default .edui-colorpicker-colorcell {
width: 14px;
height: 14px;
display: block;
margin: 0;
cursor: pointer;
}
.edui-default .edui-colorpicker-colorcell:hover {
width: 14px;
height: 14px;
margin: 0;
}
.edui-default .edui-colorpicker-advbtn{
display: block;
text-align: center;
cursor: pointer;
height:20px;
}
.arrow_down{
background: white url('../images/arrow_down.png') no-repeat center;
}
.arrow_up{
background: white url('../images/arrow_up.png') no-repeat center;
}
/*高级的样式*/
.edui-colorpicker-adv{
position: relative;
overflow: hidden;
height: 180px;
display: none;
}
.edui-colorpicker-plant, .edui-colorpicker-hue {
border: solid 1px #666;
}
.edui-colorpicker-pad {
width: 150px;
height: 150px;
left: 14px;
top: 13px;
position: absolute;
background: red;
overflow: hidden;
cursor: crosshair;
}
.edui-colorpicker-cover{
position: absolute;
top: 0;
left: 0;
width: 150px;
height: 150px;
background: url("../images/tangram-colorpicker.png") -160px -200px;
}
.edui-colorpicker-padDot{
position: absolute;
top: 0;
left: 0;
width: 11px;
height: 11px;
overflow: hidden;
background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x;
z-index: 1000;
}
.edui-colorpicker-sliderMain {
position: absolute;
left: 171px;
top: 13px;
width: 19px;
height: 152px;
background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat;
}
.edui-colorpicker-slider {
width: 100%;
height: 100%;
cursor: pointer;
}
.edui-colorpicker-thumb{
position: absolute;
top: 0;
cursor: pointer;
height: 3px;
left: -1px;
right: -1px;
border: 1px solid black;
background: white;
opacity: .8;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/combox.css
================================================
/*不可选中菜单按钮 */
.edui-default .edui-toolbar .edui-combox-body .edui-button-body {
width: 60px;
font-size: 12px;
height: 20px;
line-height: 20px;
padding-left: 5px;
white-space: nowrap;
margin: 0 3px 0 0;
}
.edui-default .edui-toolbar .edui-combox-body .edui-arrow {
background: url(../images/icons.png) -741px 0;
_background: url(../images/icons.gif) -741px 0;
height: 20px;
width: 9px;
}
.edui-default .edui-toolbar .edui-combox .edui-combox-body {
border: 1px solid #CCC;
background-color: white;
border-radius: 2px;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
}
.edui-default .edui-toolbar .edui-combox-body .edui-splitborder {
display: none;
}
.edui-default .edui-toolbar .edui-combox-body .edui-arrow {
border-left: 1px solid #CCC;
}
.edui-default .edui-toolbar .edui-state-hover .edui-combox-body {
background-color: #fff5d4;
border: 1px solid #dcac6c;
}
.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow {
border-left: 1px solid #dcac6c;
}
.edui-default .edui-toolbar .edui-state-checked .edui-combox-body {
background-color: #FFE69F;
border: 1px solid #DCAC6C;
}
.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow {
border-left: 1px solid #DCAC6C;
}
.edui-toolbar .edui-state-disabled .edui-combox-body {
background-color: #F0F0EE;
opacity: 0.3;
filter: alpha(opacity = 30);
}
.edui-toolbar .edui-state-opened .edui-combox-body {
background-color: white;
border: 1px solid gray;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/contextmenu.css
================================================
/*contextmenu*/
.edui-default .edui-hassubmenu .edui-arrow {
height: 20px;
width: 20px;
float: right;
background: url("../images/icons-all.gif") no-repeat 10px -233px;
}
.edui-default .edui-menu-body .edui-menuitem {
padding: 1px;
}
.edui-default .edui-menuseparator {
margin: 2px 0;
height: 1px;
overflow: hidden;
}
.edui-default .edui-menuseparator-inner {
border-bottom: 1px solid #e2e3e3;
margin-left: 29px;
margin-right: 1px;
}
.edui-default .edui-menu-body .edui-state-hover {
padding: 0 !important;
background-color: #fff5d4;
border: 1px solid #dcac6c;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/dialog.css
================================================
/* 弹出对话框按钮和对话框大小 */
.edui-default .edui-dialog {
z-index: 2000;
position: absolute;
}
.edui-dialog div{
width:auto;
}
.edui-default .edui-dialog-wrap {
margin-right: 6px;
margin-bottom: 6px;
}
.edui-default .edui-dialog-fullscreen-flag {
margin-right: 0;
margin-bottom: 0;
}
.edui-default .edui-dialog-body {
position: relative;
padding:2px 0 0 2px;
_zoom: 1;
}
.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body {
padding: 0;
}
.edui-default .edui-dialog-shadow {
position: absolute;
z-index: -1;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: #ffffff;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);
*border-right-width: 2px;
*border-bottom-width: 2px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
}
.edui-default .edui-dialog-foot {
background-color: white;
}
.edui-default .edui-dialog-titlebar {
height: 26px;
border-bottom: 1px solid #c6c6c6;
background: url(../images/dialog-title-bg.png) repeat-x bottom;
position: relative;
cursor: move;
}
.edui-default .edui-dialog-caption {
font-weight: bold;
font-size: 12px;
line-height: 26px;
padding-left: 5px;
}
.edui-default .edui-dialog-draghandle {
height: 26px;
}
.edui-default .edui-dialog-closebutton {
position: absolute !important;
right: 5px;
top: 3px;
}
.edui-default .edui-dialog-closebutton .edui-button-body {
height: 20px;
width: 20px;
cursor: pointer;
background: url("../images/icons-all.gif") no-repeat 0 -59px;
}
.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body {
background: url("../images/icons-all.gif") no-repeat 0 -89px;
}
.edui-default .edui-dialog-foot {
height: 40px;
}
.edui-default .edui-dialog-buttons {
position: absolute;
right: 0;
}
.edui-default .edui-dialog-buttons .edui-button {
margin-right: 10px;
}
.edui-default .edui-dialog-buttons .edui-button .edui-button-body {
background: url("../images/icons-all.gif") no-repeat;
height: 24px;
width: 96px;
font-size: 12px;
line-height: 24px;
text-align: center;
cursor: default;
}
.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body {
background: url("../images/icons-all.gif") no-repeat 0 -30px;
}
.edui-default .edui-dialog iframe {
border: 0;
padding: 0;
margin: 0;
vertical-align: top;
}
.edui-default .edui-dialog-modalmask {
opacity: 0.3;
filter: alpha(opacity = 30);
background-color: #ccc;
position: absolute;
/*z-index: 1999;*/
}
.edui-default .edui-dialog-dragmask {
position: absolute;
/*z-index: 2001;*/
background-color: transparent;
cursor: move;
}
.edui-default .edui-dialog-content {
position: relative;
}
.edui-default .dialogcontmask {
cursor: move;
visibility: hidden;
display: block;
position: absolute;
width: 100%;
height: 100%;
opacity: 0;
filter: alpha(opacity = 0);
}
/*link-dialog*/
.edui-default .edui-for-link .edui-dialog-content {
width: 420px;
height: 200px;
overflow: hidden;
}
/*background-dialog*/
.edui-default .edui-for-background .edui-dialog-content {
width: 440px;
height: 280px;
overflow: hidden;
}
/*template-dialog*/
.edui-default .edui-for-template .edui-dialog-content {
width: 630px;
height: 390px;
overflow: hidden;
}
/*scrawl-dialog*/
.edui-default .edui-for-scrawl .edui-dialog-content {
width: 515px;
*width: 506px;
height: 360px;
}
/*spechars-dialog*/
.edui-default .edui-for-spechars .edui-dialog-content {
width: 620px;
height: 500px;
*width: 630px;
*height: 570px;
}
/*image-dialog*/
.edui-default .edui-for-insertimage .edui-dialog-content {
width: 650px;
height: 400px;
overflow: hidden;
}
/*webapp-dialog*/
.edui-default .edui-for-webapp .edui-dialog-content {
width: 560px;
_width: 565px;
height: 450px;
overflow: hidden;
}
/*image-insertframe*/
.edui-default .edui-for-insertframe .edui-dialog-content {
width: 350px;
height: 200px;
overflow: hidden;
}
/*wordImage-dialog*/
.edui-default .edui-for-wordimage .edui-dialog-content {
width: 620px;
height: 380px;
overflow: hidden;
}
/*attachment-dialog*/
.edui-default .edui-for-attachment .edui-dialog-content {
width: 650px;
height: 400px;
overflow: hidden;
}
/*map-dialog*/
.edui-default .edui-for-map .edui-dialog-content {
width: 550px;
height: 400px;
}
/*gmap-dialog*/
.edui-default .edui-for-gmap .edui-dialog-content {
width: 550px;
height: 400px;
}
/*video-dialog*/
.edui-default .edui-for-insertvideo .edui-dialog-content {
width: 590px;
height: 390px;
}
/*anchor-dialog*/
.edui-default .edui-for-anchor .edui-dialog-content {
width: 320px;
height: 60px;
overflow: hidden;
}
/*searchreplace-dialog*/
.edui-default .edui-for-searchreplace .edui-dialog-content {
width: 400px;
height: 220px;
}
/*help-dialog*/
.edui-default .edui-for-help .edui-dialog-content {
width: 400px;
height: 420px;
}
/*edittable-dialog*/
.edui-default .edui-for-edittable .edui-dialog-content {
width: 540px;
_width:590px;
height: 335px;
}
/*edittip-dialog*/
.edui-default .edui-for-edittip .edui-dialog-content {
width: 225px;
height: 60px;
}
/*edittd-dialog*/
.edui-default .edui-for-edittd .edui-dialog-content {
width: 240px;
height: 50px;
}
/*snapscreen-dialog*/
.edui-default .edui-for-snapscreen .edui-dialog-content {
width: 400px;
height: 220px;
}
/*music-dialog*/
.edui-default .edui-for-music .edui-dialog-content {
width: 515px;
height: 360px;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/editor.css
================================================
/*UI工具栏、编辑区域、底部*/
.edui-default .edui-editor {
border: 1px solid #d4d4d4;
background-color: white;
position: relative;
overflow: visible;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.edui-editor div{
width:auto;
height:auto;
}
.edui-default .edui-editor-toolbarbox {
position: relative;
zoom: 1;
-webkit-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);
-moz-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);
box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);
border-top-left-radius:2px;
border-top-right-radius:2px;
}
.edui-default .edui-editor-toolbarboxouter {
border-bottom: 1px solid #d4d4d4;
background-color: #fafafa;
background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
background-repeat: repeat-x;
/*border: 1px solid #d4d4d4;*/
-webkit-border-radius: 4px 4px 0 0;
-moz-border-radius: 4px 4px 0 0;
border-radius: 4px 4px 0 0;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
*zoom: 1;
-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
}
.edui-default .edui-editor-toolbarboxinner {
padding: 2px;
}
.edui-default .edui-editor-iframeholder {
position: relative;
/*for fix ie6 toolbarmsg under iframe bug. relative -> static */
/*_position: static !important;*
}
.edui-default .edui-editor-iframeholder textarea {
font-family: consolas, "Courier New", "lucida console", monospace;
font-size: 12px;
line-height: 18px;
}
.edui-default .edui-editor-bottombar {
/*border-top: 1px solid #ccc;*/
/*height: 20px;*/
/*width: 40%;*/
/*float: left;*/
/*overflow: hidden;*/
}
.edui-default .edui-editor-bottomContainer {
overflow: hidden;
}
.edui-default .edui-editor-bottomContainer table {
width: 100%;
height: 0;
overflow: hidden;
border-spacing: 0;
}
.edui-default .edui-editor-bottomContainer td {
white-space: nowrap;
border-top: 1px solid #ccc;
line-height: 20px;
font-size: 12px;
font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif;
}
.edui-default .edui-editor-wordcount {
text-align: right;
margin-right: 5px;
color: #aaa;
}
.edui-default .edui-editor-scale {
width: 12px;
}
.edui-default .edui-editor-scale .edui-editor-icon {
float: right;
width: 100%;
height: 12px;
margin-top: 10px;
background: url(../images/scale.png) no-repeat;
cursor: se-resize;
}
.edui-default .edui-editor-breadcrumb {
margin: 2px 0 0 3px;
}
.edui-default .edui-editor-breadcrumb span {
cursor: pointer;
text-decoration: underline;
color: blue;
}
.edui-default .edui-toolbar .edui-for-fullscreen {
float: right;
}
.edui-default .edui-bubble .edui-popup-content {
border: 1px solid #DCAC6C;
background-color: #fff6d9;
padding: 5px;
font-size: 10pt;
font-family: "宋体";
}
.edui-default .edui-bubble .edui-shadow {
/*box-shadow: 1px 1px 3px #818181;*/
/*-webkit-box-shadow: 2px 2px 3px #818181;*/
/*-moz-box-shadow: 2px 2px 3px #818181;*/
/*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/
}
.edui-default .edui-editor-toolbarmsg {
background-color: #FFF6D9;
border-bottom: 1px solid #ccc;
position: absolute;
bottom: -25px;
left: 0;
z-index: 1009;
width: 99.9%;
}
.edui-default .edui-editor-toolbarmsg-upload {
font-size: 14px;
color: blue;
width: 100px;
height: 16px;
line-height: 16px;
cursor: pointer;
position: absolute;
top: 5px;
left: 350px;
}
.edui-default .edui-editor-toolbarmsg-label {
font-size: 12px;
line-height: 16px;
padding: 4px;
}
.edui-default .edui-editor-toolbarmsg-close {
float: right;
width: 20px;
height: 16px;
line-height: 16px;
cursor: pointer;
color: red;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/menu.css
================================================
/* 可选中按钮弹出菜单*/
.edui-default .edui-menu {
z-index: 3000;
}
.edui-default .edui-menu .edui-popup-content {
padding: 3px;
}
.edui-default .edui-menu-body {
_width: 150px;
min-width: 170px;
background: url("../images/sparator_v.png") repeat-y 25px;
}
.edui-default .edui-menuitem-body {
}
.edui-default .edui-menuitem {
height: 20px;
cursor: default;
vertical-align: top;
}
.edui-default .edui-menuitem .edui-icon {
width: 20px !important;
height: 20px !important;
background: url(../images/icons.png) 0 -4000px;
background: url(../images/icons.gif) 0 -4000px\9;
}
.edui-default .edui-menuitem .edui-label {
font-size: 12px;
line-height: 20px;
height: 20px;
padding-left: 10px;
}
.edui-default .edui-state-checked .edui-menuitem-body {
background: url("../images/icons-all.gif") no-repeat 6px -205px;
}
.edui-default .edui-state-disabled .edui-menuitem-label {
color: gray;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/menubutton.css
================================================
/*可选中菜单按钮*/
.edui-default .edui-list .edui-bordereraser {
display: none;
}
.edui-default .edui-listitem {
padding: 1px;
white-space: nowrap;
}
.edui-default .edui-list .edui-state-hover {
position: relative;
background-color: #fff5d4;
border: 1px solid #dcac6c;
padding: 0;
}
.edui-default .edui-for-fontfamily .edui-listitem-label {
min-width: 130px;
_width: 120px;
font-size: 12px;
height: 22px;
line-height: 22px;
padding-left: 5px;
}
.edui-default .edui-for-insertcode .edui-listitem-label {
min-width: 120px;
_width: 120px;
font-size: 12px;
height: 22px;
line-height: 22px;
padding-left: 5px;
}
.edui-default .edui-for-underline .edui-listitem-label {
min-width: 120px;
_width: 120px;
padding: 3px 5px;
font-size: 12px;
}
.edui-default .edui-for-fontsize .edui-listitem-label {
min-width: 120px;
_width: 120px;
padding: 3px 5px;
}
.edui-default .edui-for-paragraph .edui-listitem-label {
min-width: 200px;
_width: 200px;
padding: 2px 5px;
}
.edui-default .edui-for-rowspacingtop .edui-listitem-label,
.edui-default .edui-for-rowspacingbottom .edui-listitem-label {
min-width: 53px;
_width: 53px;
padding: 2px 5px;
}
.edui-default .edui-for-lineheight .edui-listitem-label {
min-width: 53px;
_width: 53px;
padding: 2px 5px;
}
.edui-default .edui-for-customstyle .edui-listitem-label {
min-width: 200px;
_width: 200px;
width: 200px !important;
padding: 2px 5px;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/message.css
================================================
.edui-default .edui-editor-messageholder {
display: block;
width: 150px;
height: auto;
border: 0;
margin: 0;
padding: 0;
position: absolute;
top: 28px;
right: 3px;
}
.edui-default .edui-message{
min-height: 10px;
text-shadow: 0 1px 0 rgba(255,255,255,0.5);
padding: 0;
margin-bottom: 3px;
position: relative;
}
.edui-default .edui-message-body{
border-radius: 3px;
padding: 8px 15px 8px 8px;
color: #c09853;
background-color: #fcf8e3;
border: 1px solid #fbeed5;
}
.edui-default .edui-message-type-info{
color: #3a87ad;
background-color: #d9edf7;
border-color: #bce8f1
}
.edui-default .edui-message-type-success{
color: #468847;
background-color: #dff0d8;
border-color: #d6e9c6
}
.edui-default .edui-message-type-danger,
.edui-default .edui-message-type-error{
color: #b94a48;
background-color: #f2dede;
border-color: #eed3d7
}
.edui-default .edui-message .edui-message-closer {
display: block;
width: 16px;
height: 16px;
line-height: 16px;
position: absolute;
top: 0;
right: 0;
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
float: right;
font-size: 20px;
font-weight: bold;
color: #999;
text-shadow: 0 1px 0 #fff;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
}
.edui-default .edui-message .edui-message-content {
font-size: 10pt;
word-wrap: break-word;
word-break: normal;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/multiMenu.css
================================================
/*表情按钮及弹出菜单*/
/*去除了表情的下拉箭头*/
.edui-default .edui-for-emotion .edui-icon {
background-position: -60px -20px;
}
.edui-default .edui-for-emotion .edui-popup-content iframe
{
width: 514px;
height: 380px;
overflow: hidden;
}
.edui-default .edui-for-emotion .edui-popup-content
{
position: relative;
z-index: 555
}
.edui-default .edui-for-emotion .edui-splitborder {
display: none
}
.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow
{
width: 0
}
.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder
{
border-left: 1px solid transparent;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/paragraphpicker.css
================================================
/*段落弹出菜单*/
.edui-default .edui-for-paragraph .edui-listitem-label {
font-family: Tahoma, Verdana, Arial, Helvetica;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p {
font-size: 22px;
line-height: 27px;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 {
font-weight: bolder;
font-size: 32px;
line-height: 36px;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 {
font-weight: bolder;
font-size: 27px;
line-height: 29px;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 {
font-weight: bolder;
font-size: 19px;
line-height: 23px;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 {
font-weight: bolder;
font-size: 16px;
line-height: 19px
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 {
font-weight: bolder;
font-size: 13px;
line-height: 16px;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 {
font-weight: bolder;
font-size: 12px;
line-height: 14px;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/pastepicker.css
================================================
/*粘贴弹出菜单*/
.edui-default .edui-wordpastepop .edui-popup-content{
border: none;
padding: 0;
width: 54px;
height: 21px;
}
.edui-default .edui-pasteicon {
width: 100%;
height: 100%;
background-image: url('../images/wordpaste.png');
background-position: 0 0;
}
.edui-default .edui-pasteicon.edui-state-opened {
background-position: 0 -34px;
}
.edui-default .edui-pastecontainer {
position: relative;
visibility: hidden;
width: 97px;
background: #fff;
border: 1px solid #ccc;
}
.edui-default .edui-pastecontainer .edui-title {
font-weight: bold;
background: #F8F8FF;
height: 25px;
line-height: 25px;
font-size: 12px;
padding-left: 5px;
}
.edui-default .edui-pastecontainer .edui-button {
overflow: hidden;
margin: 3px 0;
}
.edui-default .edui-pastecontainer .edui-button .edui-richtxticon,
.edui-default .edui-pastecontainer .edui-button .edui-tagicon,
.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{
float: left;
cursor: pointer;
width: 29px;
height: 29px;
margin-left: 5px;
background-image: url('../images/wordpaste.png');
background-repeat: no-repeat;
}
.edui-default .edui-pastecontainer .edui-button .edui-richtxticon {
margin-left: 0;
background-position: -109px 0;
}
.edui-default .edui-pastecontainer .edui-button .edui-tagicon {
background-position: -148px 1px;
}
.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon {
background-position: -72px 0;
}
.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon {
background-position: -109px -34px;
}
.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{
background-position: -148px -34px;
}
.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{
background-position: -72px -34px;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/popup.css
================================================
/* 弹出菜单 */
.edui-default .edui-popup {
z-index: 3000;
background-color: #ffffff;
width:auto;
height:auto;
}
.edui-default .edui-popup .edui-shadow {
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.edui-default .edui-popup-content {
border:1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);
*border-right-width: 2px;
*border-bottom-width: 2px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
-webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);
box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
padding: 5px;
background:#ffffff;
}
.edui-default .edui-popup .edui-bordereraser {
background-color: white;
height: 3px;
}
.edui-default .edui-menu .edui-bordereraser {
height: 3px;
}
.edui-default .edui-anchor-topleft .edui-bordereraser {
left: 1px;
top: -2px;
}
.edui-default .edui-anchor-topright .edui-bordereraser {
right: 1px;
top: -2px;
}
.edui-default .edui-anchor-bottomleft .edui-bordereraser {
left: 0;
bottom: -6px;
height: 7px;
border-left: 1px solid gray;
border-right: 1px solid gray;
}
.edui-default .edui-anchor-bottomright .edui-bordereraser {
right: 0;
bottom: -6px;
height: 7px;
border-left: 1px solid gray;
border-right: 1px solid gray;
}
.edui-popup div{
width:auto;
height:auto;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/separtor.css
================================================
/*分隔线*/
.edui-default .edui-toolbar .edui-separator {
width: 2px;
height: 20px;
margin: 2px 4px 2px 3px;
background: url(../images/icons.png) -181px 0;
background: url(../images/icons.gif) -181px 0 \9;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/shortcutmenu.css
================================================
/*弹出菜单*/
.edui-default .edui-shortcutmenu {
padding: 2px;
width: 190px;
height: 50px;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 5px;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/splitbutton.css
================================================
/*splitbutton*/
.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow,
.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow {
background: url(../images/icons.png) -741px 0;
_background: url(../images/icons.gif) -741px 0;
height: 20px;
width: 9px;
}
.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body,
.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body {
padding: 1px;
}
.edui-default .edui-toolbar .edui-splitborder {
width: 1px;
height: 20px;
}
.edui-default .edui-toolbar .edui-state-hover .edui-splitborder {
width: 1px;
border-left: 0px solid #dcac6c;
}
.edui-default .edui-toolbar .edui-state-active .edui-splitborder {
width: 0;
border-left: 1px solid gray;
}
.edui-default .edui-toolbar .edui-state-opened .edui-splitborder {
width: 1px;
border: 0;
}
.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body,
.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body {
background-color: #fff5d4;
border: 1px solid #dcac6c;
padding: 0;
}
.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body,
.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body {
background-color: #FFE69F;
border: 1px solid #DCAC6C;
padding: 0;
}
.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body,
.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body {
background-color: #ffffff;
border: 1px solid gray;
padding: 0;
}
.edui-default .edui-state-disabled .edui-arrow {
opacity: 0.3;
_filter: alpha(opacity = 30);
}
.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body,
.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body {
background-color: white;
border: 1px solid gray;
padding: 0;
}
.edui-default .edui-for-insertorderedlist .edui-bordereraser,
.edui-default .edui-for-lineheight .edui-bordereraser,
.edui-default .edui-for-rowspacingtop .edui-bordereraser,
.edui-default .edui-for-rowspacingbottom .edui-bordereraser,
.edui-default .edui-for-insertunorderedlist .edui-bordereraser {
background-color: white;
}
/* 解决嵌套导致的图标问题 */
.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon,
.edui-default .edui-for-lineheight .edui-popup-body .edui-icon,
.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon,
.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon,
.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon {
/*background-position: 0 -40px;*/
background-image: none ;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/tablepicker.css
================================================
/* 表格弹出菜单 */
.edui-default .edui-for-inserttable .edui-splitborder {
display: none
}
.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow {
width: 0
}
.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{
border-left: 1px solid transparent;
}
.edui-default .edui-tablepicker .edui-infoarea {
height: 14px;
line-height: 14px;
font-size: 12px;
width: 220px;
margin-bottom: 3px;
clear: both;
}
.edui-default .edui-tablepicker .edui-infoarea .edui-label {
float: left;
}
.edui-default .edui-dialog-buttons .edui-label {
line-height: 24px;
}
.edui-default .edui-tablepicker .edui-infoarea .edui-clickable {
float: right;
}
.edui-default .edui-tablepicker .edui-pickarea {
background: url("../images/unhighlighted.gif") repeat;
height: 220px;
width: 220px;
}
.edui-default .edui-tablepicker .edui-pickarea .edui-overlay {
background: url("../images/highlighted.gif") repeat;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/toolbar.css
================================================
/* 工具栏 */
.edui-default .edui-toolbar {
cursor: default;
-webkit-user-select: none;
-moz-user-select: none;
padding: 1px;
overflow: hidden; /*全屏下单独一行不占位*/
zoom: 1;
width:auto;
height:auto;
}
.edui-default .edui-toolbar .edui-button,
.edui-default .edui-toolbar .edui-splitbutton,
.edui-default .edui-toolbar .edui-menubutton,
.edui-default .edui-toolbar .edui-combox {
margin: 1px;
}
================================================
FILE: static/common/user/uedit/themes/default/_css/ueditor.css
================================================
/*根据UI结构重写CSS,仅在相应UI组件创建时,加载对应css,顺序加载
*/
/*-------基础UI构建,必须加载-------*/
@import "uibase.css";
@import "toolbar.css";
@import "editor.css";
/*-------可选中菜单按钮,按需加载-------*/
/*可选中菜单按钮--依赖splitbutton*/
@import "menubutton.css";
/*可选中菜单按钮-弹出菜单*/
@import "menu.css";
/*-------不可选中菜单按钮,按需加载-------*/
/*不可选中菜单按钮--依赖splitbutton*/
@import "combox.css";
/*-------按钮类型,按需加载-------*/
/*普通按钮*/
@import "button.css";
/*按钮icon*/
@import "buttonicon.css";
/*弹出菜单按钮-附加按钮*/
@import "splitbutton.css";
/*弹出菜单*/
@import "popup.css";
/*提示消息*/
@import "message.css";
/*-------独立按钮样式,按需加载-------*/
/*弹出对话框样式*/
@import "dialog.css";
/*段落格式弹出菜单*/
@import "paragraphpicker.css";
/*表格弹出菜单*/
@import "tablepicker.css";
/*颜色弹出菜单*/
@import "colorpicker.css";
/*自动排版弹出菜单*/
@import "autotypesetpicker.css";
/*平均分布菜单*/
@import "cellalignpicker.css";
/*分隔线*/
@import "separtor.css";
/*颜色按钮--依赖splitbutton*/
@import "colorbutton.css";
/*表情按钮--依赖splitbutton*/
@import "multiMenu.css";
/*右键菜单*/
@import "contextmenu.css";
/*快捷菜单*/
@import "shortcutmenu.css";
/*粘贴提示*/
@import "pastepicker.css";
================================================
FILE: static/common/user/uedit/themes/default/_css/uibase.css
================================================
/*基础UI构建
*/
/* common layer */
.edui-default .edui-box {
border: none;
padding: 0;
margin: 0;
overflow: hidden;
}
.edui-default a.edui-box {
display: block;
text-decoration: none;
color: black;
}
.edui-default a.edui-box:hover {
text-decoration: none;
}
.edui-default a.edui-box:active {
text-decoration: none;
}
.edui-default table.edui-box {
border-collapse: collapse;
}
.edui-default ul.edui-box {
list-style-type: none;
}
div.edui-box {
position: relative;
display: -moz-inline-box !important;
display: inline-block !important;
vertical-align: top;
}
.edui-default .edui-clearfix {
zoom: 1
}
.edui-default .edui-clearfix:after {
content: '\20';
display: block;
clear: both;
}
* html div.edui-box {
display: inline !important;
}
*:first-child+html div.edui-box {
display: inline !important;
}
/* control layout */
.edui-default .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body {
position: relative;
}
.edui-default .edui-popup {
position: absolute;
-webkit-user-select: none;
-moz-user-select: none;
}
.edui-default .edui-popup .edui-shadow {
position: absolute;
z-index: -1;
}
.edui-default .edui-popup .edui-bordereraser {
position: absolute;
overflow: hidden;
}
.edui-default .edui-tablepicker .edui-canvas {
position: relative;
}
.edui-default .edui-tablepicker .edui-canvas .edui-overlay {
position: absolute;
}
.edui-default .edui-dialog-modalmask, .edui-dialog-dragmask {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.edui-default .edui-toolbar {
position: relative;
}
/*
* default theme
*/
.edui-default .edui-label {
cursor: default;
}
.edui-default span.edui-clickable {
color: blue;
cursor: pointer;
text-decoration: underline;
}
.edui-default span.edui-unclickable {
color: gray;
cursor: default;
}
================================================
FILE: static/common/user/uedit/themes/default/css/ueditor.css
================================================
/*基础UI构建
*/
/* common layer */
.edui-default .edui-box {
border: none;
padding: 0;
margin: 0;
overflow: hidden;
}
.edui-default a.edui-box {
display: block;
text-decoration: none;
color: black;
}
.edui-default a.edui-box:hover {
text-decoration: none;
}
.edui-default a.edui-box:active {
text-decoration: none;
}
.edui-default table.edui-box {
border-collapse: collapse;
}
.edui-default ul.edui-box {
list-style-type: none;
}
div.edui-box {
position: relative;
display: -moz-inline-box !important;
display: inline-block !important;
vertical-align: top;
}
.edui-default .edui-clearfix {
zoom: 1
}
.edui-default .edui-clearfix:after {
content: '\20';
display: block;
clear: both;
}
* html div.edui-box {
display: inline !important;
}
*:first-child+html div.edui-box {
display: inline !important;
}
/* control layout */
.edui-default .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body {
position: relative;
}
.edui-default .edui-popup {
position: absolute;
-webkit-user-select: none;
-moz-user-select: none;
}
.edui-default .edui-popup .edui-shadow {
position: absolute;
z-index: -1;
}
.edui-default .edui-popup .edui-bordereraser {
position: absolute;
overflow: hidden;
}
.edui-default .edui-tablepicker .edui-canvas {
position: relative;
}
.edui-default .edui-tablepicker .edui-canvas .edui-overlay {
position: absolute;
}
.edui-default .edui-dialog-modalmask, .edui-dialog-dragmask {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.edui-default .edui-toolbar {
position: relative;
}
/*
* default theme
*/
.edui-default .edui-label {
cursor: default;
}
.edui-default span.edui-clickable {
color: blue;
cursor: pointer;
text-decoration: underline;
}
.edui-default span.edui-unclickable {
color: gray;
cursor: default;
}
/* 工具栏 */
.edui-default .edui-toolbar {
cursor: default;
-webkit-user-select: none;
-moz-user-select: none;
padding: 1px;
overflow: hidden; /*全屏下单独一行不占位*/
zoom: 1;
width:auto;
height:auto;
}
.edui-default .edui-toolbar .edui-button,
.edui-default .edui-toolbar .edui-splitbutton,
.edui-default .edui-toolbar .edui-menubutton,
.edui-default .edui-toolbar .edui-combox {
margin: 1px;
}
/*UI工具栏、编辑区域、底部*/
.edui-default .edui-editor {
border: 1px solid #d4d4d4;
background-color: white;
position: relative;
overflow: visible;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.edui-editor div{
width:auto;
height:auto;
}
.edui-default .edui-editor-toolbarbox {
position: relative;
zoom: 1;
-webkit-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);
-moz-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);
box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);
border-top-left-radius:2px;
border-top-right-radius:2px;
}
.edui-default .edui-editor-toolbarboxouter {
border-bottom: 1px solid #d4d4d4;
background-color: #fafafa;
background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
background-repeat: repeat-x;
/*border: 1px solid #d4d4d4;*/
-webkit-border-radius: 4px 4px 0 0;
-moz-border-radius: 4px 4px 0 0;
border-radius: 4px 4px 0 0;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
*zoom: 1;
-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
}
.edui-default .edui-editor-toolbarboxinner {
padding: 2px;
}
.edui-default .edui-editor-iframeholder {
position: relative;
/*for fix ie6 toolbarmsg under iframe bug. relative -> static */
/*_position: static !important;*
}
.edui-default .edui-editor-iframeholder textarea {
font-family: consolas, "Courier New", "lucida console", monospace;
font-size: 12px;
line-height: 18px;
}
.edui-default .edui-editor-bottombar {
/*border-top: 1px solid #ccc;*/
/*height: 20px;*/
/*width: 40%;*/
/*float: left;*/
/*overflow: hidden;*/
}
.edui-default .edui-editor-bottomContainer {
overflow: hidden;
}
.edui-default .edui-editor-bottomContainer table {
width: 100%;
height: 0;
overflow: hidden;
border-spacing: 0;
}
.edui-default .edui-editor-bottomContainer td {
white-space: nowrap;
border-top: 1px solid #ccc;
line-height: 20px;
font-size: 12px;
font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif;
}
.edui-default .edui-editor-wordcount {
text-align: right;
margin-right: 5px;
color: #aaa;
}
.edui-default .edui-editor-scale {
width: 12px;
}
.edui-default .edui-editor-scale .edui-editor-icon {
float: right;
width: 100%;
height: 12px;
margin-top: 10px;
background: url(../images/scale.png) no-repeat;
cursor: se-resize;
}
.edui-default .edui-editor-breadcrumb {
margin: 2px 0 0 3px;
}
.edui-default .edui-editor-breadcrumb span {
cursor: pointer;
text-decoration: underline;
color: blue;
}
.edui-default .edui-toolbar .edui-for-fullscreen {
float: right;
}
.edui-default .edui-bubble .edui-popup-content {
border: 1px solid #DCAC6C;
background-color: #fff6d9;
padding: 5px;
font-size: 10pt;
font-family: "宋体";
}
.edui-default .edui-bubble .edui-shadow {
/*box-shadow: 1px 1px 3px #818181;*/
/*-webkit-box-shadow: 2px 2px 3px #818181;*/
/*-moz-box-shadow: 2px 2px 3px #818181;*/
/*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/
}
.edui-default .edui-editor-toolbarmsg {
background-color: #FFF6D9;
border-bottom: 1px solid #ccc;
position: absolute;
bottom: -25px;
left: 0;
z-index: 1009;
width: 99.9%;
}
.edui-default .edui-editor-toolbarmsg-upload {
font-size: 14px;
color: blue;
width: 100px;
height: 16px;
line-height: 16px;
cursor: pointer;
position: absolute;
top: 5px;
left: 350px;
}
.edui-default .edui-editor-toolbarmsg-label {
font-size: 12px;
line-height: 16px;
padding: 4px;
}
.edui-default .edui-editor-toolbarmsg-close {
float: right;
width: 20px;
height: 16px;
line-height: 16px;
cursor: pointer;
color: red;
}
/*可选中菜单按钮*/
.edui-default .edui-list .edui-bordereraser {
display: none;
}
.edui-default .edui-listitem {
padding: 1px;
white-space: nowrap;
}
.edui-default .edui-list .edui-state-hover {
position: relative;
background-color: #fff5d4;
border: 1px solid #dcac6c;
padding: 0;
}
.edui-default .edui-for-fontfamily .edui-listitem-label {
min-width: 130px;
_width: 120px;
font-size: 12px;
height: 22px;
line-height: 22px;
padding-left: 5px;
}
.edui-default .edui-for-insertcode .edui-listitem-label {
min-width: 120px;
_width: 120px;
font-size: 12px;
height: 22px;
line-height: 22px;
padding-left: 5px;
}
.edui-default .edui-for-underline .edui-listitem-label {
min-width: 120px;
_width: 120px;
padding: 3px 5px;
font-size: 12px;
}
.edui-default .edui-for-fontsize .edui-listitem-label {
min-width: 120px;
_width: 120px;
padding: 3px 5px;
}
.edui-default .edui-for-paragraph .edui-listitem-label {
min-width: 200px;
_width: 200px;
padding: 2px 5px;
}
.edui-default .edui-for-rowspacingtop .edui-listitem-label,
.edui-default .edui-for-rowspacingbottom .edui-listitem-label {
min-width: 53px;
_width: 53px;
padding: 2px 5px;
}
.edui-default .edui-for-lineheight .edui-listitem-label {
min-width: 53px;
_width: 53px;
padding: 2px 5px;
}
.edui-default .edui-for-customstyle .edui-listitem-label {
min-width: 200px;
_width: 200px;
width: 200px !important;
padding: 2px 5px;
}
/* 可选中按钮弹出菜单*/
.edui-default .edui-menu {
z-index: 3000;
}
.edui-default .edui-menu .edui-popup-content {
padding: 3px;
}
.edui-default .edui-menu-body {
_width: 150px;
min-width: 170px;
background: url("../images/sparator_v.png") repeat-y 25px;
}
.edui-default .edui-menuitem-body {
}
.edui-default .edui-menuitem {
height: 20px;
cursor: default;
vertical-align: top;
}
.edui-default .edui-menuitem .edui-icon {
width: 20px !important;
height: 20px !important;
background: url(../images/icons.png) 0 -4000px;
background: url(../images/icons.gif) 0 -4000px\9;
}
.edui-default .edui-menuitem .edui-label {
font-size: 12px;
line-height: 20px;
height: 20px;
padding-left: 10px;
}
.edui-default .edui-state-checked .edui-menuitem-body {
background: url("../images/icons-all.gif") no-repeat 6px -205px;
}
.edui-default .edui-state-disabled .edui-menuitem-label {
color: gray;
}
/*不可选中菜单按钮 */
.edui-default .edui-toolbar .edui-combox-body .edui-button-body {
width: 60px;
font-size: 12px;
height: 20px;
line-height: 20px;
padding-left: 5px;
white-space: nowrap;
margin: 0 3px 0 0;
}
.edui-default .edui-toolbar .edui-combox-body .edui-arrow {
background: url(../images/icons.png) -741px 0;
_background: url(../images/icons.gif) -741px 0;
height: 20px;
width: 9px;
}
.edui-default .edui-toolbar .edui-combox .edui-combox-body {
border: 1px solid #CCC;
background-color: white;
border-radius: 2px;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
}
.edui-default .edui-toolbar .edui-combox-body .edui-splitborder {
display: none;
}
.edui-default .edui-toolbar .edui-combox-body .edui-arrow {
border-left: 1px solid #CCC;
}
.edui-default .edui-toolbar .edui-state-hover .edui-combox-body {
background-color: #fff5d4;
border: 1px solid #dcac6c;
}
.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow {
border-left: 1px solid #dcac6c;
}
.edui-default .edui-toolbar .edui-state-checked .edui-combox-body {
background-color: #FFE69F;
border: 1px solid #DCAC6C;
}
.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow {
border-left: 1px solid #DCAC6C;
}
.edui-toolbar .edui-state-disabled .edui-combox-body {
background-color: #F0F0EE;
opacity: 0.3;
filter: alpha(opacity = 30);
}
.edui-toolbar .edui-state-opened .edui-combox-body {
background-color: white;
border: 1px solid gray;
}
/*普通按钮样式及状态*/
.edui-default .edui-toolbar .edui-button .edui-icon,
.edui-default .edui-toolbar .edui-menubutton .edui-icon,
.edui-default .edui-toolbar .edui-splitbutton .edui-icon {
height: 20px !important;
width: 20px !important;
background-image: url(../images/icons.png);
background-image: url(../images/icons.gif) \9;
}
.edui-default .edui-toolbar .edui-button .edui-button-wrap {
padding: 1px;
position: relative;
}
.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap {
background-color: #fff5d4;
padding: 0;
border: 1px solid #dcac6c;
}
.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap {
background-color: #ffe69f;
padding: 0;
border: 1px solid #dcac6c;
border-radius: 2px;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
}
.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap {
background-color: #ffffff;
padding: 0;
border: 1px solid gray;
}
.edui-default .edui-toolbar .edui-state-disabled .edui-label {
color: #ccc;
}
.edui-default .edui-toolbar .edui-state-disabled .edui-icon {
opacity: 0.3;
filter: alpha(opacity = 30);
}
/* toolbar icons */
.edui-default .edui-for-undo .edui-icon {
background-position: -160px 0;
}
.edui-default .edui-for-redo .edui-icon {
background-position: -100px 0;
}
.edui-default .edui-for-bold .edui-icon {
background-position: 0 0;
}
.edui-default .edui-for-italic .edui-icon {
background-position: -60px 0;
}
.edui-default .edui-for-fontborder .edui-icon {
background-position:-160px -40px;
}
.edui-default .edui-for-underline .edui-icon {
background-position: -140px 0;
}
.edui-default .edui-for-strikethrough .edui-icon {
background-position: -120px 0;
}
.edui-default .edui-for-subscript .edui-icon {
background-position: -600px 0;
}
.edui-default .edui-for-superscript .edui-icon {
background-position: -620px 0;
}
.edui-default .edui-for-blockquote .edui-icon {
background-position: -220px 0;
}
.edui-default .edui-for-forecolor .edui-icon {
background-position: -720px 0;
}
.edui-default .edui-for-backcolor .edui-icon {
background-position: -760px 0;
}
.edui-default .edui-for-inserttable .edui-icon {
background-position: -580px -20px;
}
.edui-default .edui-for-autotypeset .edui-icon {
background-position: -640px -40px;
}
.edui-default .edui-for-justifyleft .edui-icon {
background-position: -460px 0;
}
.edui-default .edui-for-justifycenter .edui-icon {
background-position: -420px 0;
}
.edui-default .edui-for-justifyright .edui-icon {
background-position: -480px 0;
}
.edui-default .edui-for-justifyjustify .edui-icon {
background-position: -440px 0;
}
.edui-default .edui-for-insertorderedlist .edui-icon {
background-position: -80px 0;
}
.edui-default .edui-for-insertunorderedlist .edui-icon {
background-position: -20px 0;
}
.edui-default .edui-for-lineheight .edui-icon {
background-position: -725px -40px;
}
.edui-default .edui-for-rowspacingbottom .edui-icon {
background-position: -745px -40px;
}
.edui-default .edui-for-rowspacingtop .edui-icon {
background-position: -765px -40px;
}
.edui-default .edui-for-horizontal .edui-icon {
background-position: -360px 0;
}
.edui-default .edui-for-link .edui-icon {
background-position: -500px 0;
}
.edui-default .edui-for-code .edui-icon {
background-position: -440px -40px;
}
.edui-default .edui-for-insertimage .edui-icon {
background-position: -726px -77px;
}
.edui-default .edui-for-insertframe .edui-icon {
background-position: -240px -40px;
}
.edui-default .edui-for-emoticon .edui-icon {
background-position: -60px -20px;
}
.edui-default .edui-for-spechars .edui-icon {
background-position: -240px 0;
}
.edui-default .edui-for-help .edui-icon {
background-position: -340px 0;
}
.edui-default .edui-for-print .edui-icon {
background-position: -440px -20px;
}
.edui-default .edui-for-preview .edui-icon {
background-position: -420px -20px;
}
.edui-default .edui-for-selectall .edui-icon {
background-position: -400px -20px;
}
.edui-default .edui-for-searchreplace .edui-icon {
background-position: -520px -20px;
}
.edui-default .edui-for-map .edui-icon {
background-position: -40px -40px;
}
.edui-default .edui-for-gmap .edui-icon {
background-position: -260px -40px;
}
.edui-default .edui-for-insertvideo .edui-icon {
background-position: -320px -20px;
}
.edui-default .edui-for-time .edui-icon {
background-position: -160px -20px;
}
.edui-default .edui-for-date .edui-icon {
background-position: -140px -20px;
}
.edui-default .edui-for-cut .edui-icon {
background-position: -680px 0;
}
.edui-default .edui-for-copy .edui-icon {
background-position: -700px 0;
}
.edui-default .edui-for-paste .edui-icon {
background-position: -560px 0;
}
.edui-default .edui-for-formatmatch .edui-icon {
background-position: -40px 0;
}
.edui-default .edui-for-pasteplain .edui-icon {
background-position: -360px -20px;
}
.edui-default .edui-for-directionalityltr .edui-icon {
background-position: -20px -20px;
}
.edui-default .edui-for-directionalityrtl .edui-icon {
background-position: -40px -20px;
}
.edui-default .edui-for-source .edui-icon {
background-position: -261px -0px;
}
.edui-default .edui-for-removeformat .edui-icon {
background-position: -580px 0;
}
.edui-default .edui-for-unlink .edui-icon {
background-position: -640px 0;
}
.edui-default .edui-for-touppercase .edui-icon {
background-position: -786px 0;
}
.edui-default .edui-for-tolowercase .edui-icon {
background-position: -806px 0;
}
.edui-default .edui-for-insertrow .edui-icon {
background-position: -478px -76px;
}
.edui-default .edui-for-insertrownext .edui-icon {
background-position: -498px -76px;
}
.edui-default .edui-for-insertcol .edui-icon {
background-position: -455px -76px;
}
.edui-default .edui-for-insertcolnext .edui-icon {
background-position: -429px -76px;
}
.edui-default .edui-for-mergeright .edui-icon {
background-position: -60px -40px;
}
.edui-default .edui-for-mergedown .edui-icon {
background-position: -80px -40px;
}
.edui-default .edui-for-splittorows .edui-icon {
background-position: -100px -40px;
}
.edui-default .edui-for-splittocols .edui-icon {
background-position: -120px -40px;
}
.edui-default .edui-for-insertparagraphbeforetable .edui-icon {
background-position: -140px -40px;
}
.edui-default .edui-for-deleterow .edui-icon {
background-position: -660px -20px;
}
.edui-default .edui-for-deletecol .edui-icon {
background-position: -640px -20px;
}
.edui-default .edui-for-splittocells .edui-icon {
background-position: -800px -20px;
}
.edui-default .edui-for-mergecells .edui-icon {
background-position: -760px -20px;
}
.edui-default .edui-for-deletetable .edui-icon {
background-position: -620px -20px;
}
.edui-default .edui-for-cleardoc .edui-icon {
background-position: -520px 0;
}
.edui-default .edui-for-fullscreen .edui-icon {
background-position: -100px -20px;
}
.edui-default .edui-for-anchor .edui-icon {
background-position: -200px 0;
}
.edui-default .edui-for-pagebreak .edui-icon {
background-position: -460px -40px;
}
.edui-default .edui-for-imagenone .edui-icon {
background-position: -480px -40px;
}
.edui-default .edui-for-imageleft .edui-icon {
background-position: -500px -40px;
}
.edui-default .edui-for-wordimage .edui-icon {
background-position: -660px -40px;
}
.edui-default .edui-for-imageright .edui-icon {
background-position: -520px -40px;
}
.edui-default .edui-for-imagecenter .edui-icon {
background-position: -540px -40px;
}
.edui-default .edui-for-indent .edui-icon {
background-position: -400px 0;
}
.edui-default .edui-for-outdent .edui-icon {
background-position: -540px 0;
}
.edui-default .edui-for-webapp .edui-icon {
background-position: -601px -40px
}
.edui-default .edui-for-table .edui-icon {
background-position: -580px -20px;
}
.edui-default .edui-for-edittable .edui-icon {
background-position: -420px -40px;
}
.edui-default .edui-for-template .edui-icon {
background-position: -339px -40px;
}
.edui-default .edui-for-delete .edui-icon {
background-position: -360px -40px;
}
.edui-default .edui-for-attachment .edui-icon {
background-position: -620px -40px;
}
.edui-default .edui-for-edittd .edui-icon {
background-position: -700px -40px;
}
.edui-default .edui-for-snapscreen .edui-icon {
background-position: -581px -40px
}
.edui-default .edui-for-scrawl .edui-icon {
background-position: -801px -41px
}
.edui-default .edui-for-background .edui-icon {
background-position: -680px -40px;
}
.edui-default .edui-for-music .edui-icon {
background-position: -18px -40px
}
.edui-default .edui-for-formula .edui-icon {
background-position: -200px -40px
}
.edui-default .edui-for-aligntd .edui-icon {
background-position: -236px -76px;
}
.edui-default .edui-for-insertparagraphtrue .edui-icon {
background-position: -625px -76px;
}
.edui-default .edui-for-insertparagraph .edui-icon {
background-position: -602px -76px;
}
.edui-default .edui-for-insertcaption .edui-icon {
background-position: -336px -76px;
}
.edui-default .edui-for-deletecaption .edui-icon {
background-position: -362px -76px;
}
.edui-default .edui-for-inserttitle .edui-icon {
background-position: -286px -76px;
}
.edui-default .edui-for-deletetitle .edui-icon {
background-position: -311px -76px;
}
.edui-default .edui-for-aligntable .edui-icon {
background-position: -440px 0;
}
.edui-default .edui-for-tablealignment-left .edui-icon {
background-position: -460px 0;
}
.edui-default .edui-for-tablealignment-center .edui-icon {
background-position: -420px 0;
}
.edui-default .edui-for-tablealignment-right .edui-icon {
background-position: -480px 0;
}
.edui-default .edui-for-drafts .edui-icon {
background-position: -560px 0;
}
.edui-default .edui-for-charts .edui-icon {
background: url( ../images/charts.png ) no-repeat 2px 3px!important;
}
.edui-default .edui-for-inserttitlecol .edui-icon {
background-position: -673px -76px;
}
.edui-default .edui-for-deletetitlecol .edui-icon {
background-position: -698px -76px;
}
.edui-default .edui-for-simpleupload .edui-icon {
background-position: -380px 0px;
}
/*splitbutton*/
.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow,
.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow {
background: url(../images/icons.png) -741px 0;
_background: url(../images/icons.gif) -741px 0;
height: 20px;
width: 9px;
}
.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body,
.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body {
padding: 1px;
}
.edui-default .edui-toolbar .edui-splitborder {
width: 1px;
height: 20px;
}
.edui-default .edui-toolbar .edui-state-hover .edui-splitborder {
width: 1px;
border-left: 0px solid #dcac6c;
}
.edui-default .edui-toolbar .edui-state-active .edui-splitborder {
width: 0;
border-left: 1px solid gray;
}
.edui-default .edui-toolbar .edui-state-opened .edui-splitborder {
width: 1px;
border: 0;
}
.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body,
.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body {
background-color: #fff5d4;
border: 1px solid #dcac6c;
padding: 0;
}
.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body,
.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body {
background-color: #FFE69F;
border: 1px solid #DCAC6C;
padding: 0;
}
.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body,
.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body {
background-color: #ffffff;
border: 1px solid gray;
padding: 0;
}
.edui-default .edui-state-disabled .edui-arrow {
opacity: 0.3;
_filter: alpha(opacity = 30);
}
.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body,
.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body {
background-color: white;
border: 1px solid gray;
padding: 0;
}
.edui-default .edui-for-insertorderedlist .edui-bordereraser,
.edui-default .edui-for-lineheight .edui-bordereraser,
.edui-default .edui-for-rowspacingtop .edui-bordereraser,
.edui-default .edui-for-rowspacingbottom .edui-bordereraser,
.edui-default .edui-for-insertunorderedlist .edui-bordereraser {
background-color: white;
}
/* 解决嵌套导致的图标问题 */
.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon,
.edui-default .edui-for-lineheight .edui-popup-body .edui-icon,
.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon,
.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon,
.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon {
/*background-position: 0 -40px;*/
background-image: none ;
}
/* 弹出菜单 */
.edui-default .edui-popup {
z-index: 3000;
background-color: #ffffff;
width:auto;
height:auto;
}
.edui-default .edui-popup .edui-shadow {
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.edui-default .edui-popup-content {
border:1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);
*border-right-width: 2px;
*border-bottom-width: 2px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
-webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);
box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
padding: 5px;
background:#ffffff;
}
.edui-default .edui-popup .edui-bordereraser {
background-color: white;
height: 3px;
}
.edui-default .edui-menu .edui-bordereraser {
height: 3px;
}
.edui-default .edui-anchor-topleft .edui-bordereraser {
left: 1px;
top: -2px;
}
.edui-default .edui-anchor-topright .edui-bordereraser {
right: 1px;
top: -2px;
}
.edui-default .edui-anchor-bottomleft .edui-bordereraser {
left: 0;
bottom: -6px;
height: 7px;
border-left: 1px solid gray;
border-right: 1px solid gray;
}
.edui-default .edui-anchor-bottomright .edui-bordereraser {
right: 0;
bottom: -6px;
height: 7px;
border-left: 1px solid gray;
border-right: 1px solid gray;
}
.edui-popup div{
width:auto;
height:auto;
}
.edui-default .edui-editor-messageholder {
display: block;
width: 150px;
height: auto;
border: 0;
margin: 0;
padding: 0;
position: absolute;
top: 28px;
right: 3px;
}
.edui-default .edui-message{
min-height: 10px;
text-shadow: 0 1px 0 rgba(255,255,255,0.5);
padding: 0;
margin-bottom: 3px;
position: relative;
}
.edui-default .edui-message-body{
border-radius: 3px;
padding: 8px 15px 8px 8px;
color: #c09853;
background-color: #fcf8e3;
border: 1px solid #fbeed5;
}
.edui-default .edui-message-type-info{
color: #3a87ad;
background-color: #d9edf7;
border-color: #bce8f1
}
.edui-default .edui-message-type-success{
color: #468847;
background-color: #dff0d8;
border-color: #d6e9c6
}
.edui-default .edui-message-type-danger,
.edui-default .edui-message-type-error{
color: #b94a48;
background-color: #f2dede;
border-color: #eed3d7
}
.edui-default .edui-message .edui-message-closer {
display: block;
width: 16px;
height: 16px;
line-height: 16px;
position: absolute;
top: 0;
right: 0;
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
float: right;
font-size: 20px;
font-weight: bold;
color: #999;
text-shadow: 0 1px 0 #fff;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
}
.edui-default .edui-message .edui-message-content {
font-size: 10pt;
word-wrap: break-word;
word-break: normal;
}
/* 弹出对话框按钮和对话框大小 */
.edui-default .edui-dialog {
z-index: 2000;
position: absolute;
}
.edui-dialog div{
width:auto;
}
.edui-default .edui-dialog-wrap {
margin-right: 6px;
margin-bottom: 6px;
}
.edui-default .edui-dialog-fullscreen-flag {
margin-right: 0;
margin-bottom: 0;
}
.edui-default .edui-dialog-body {
position: relative;
padding:2px 0 0 2px;
_zoom: 1;
}
.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body {
padding: 0;
}
.edui-default .edui-dialog-shadow {
position: absolute;
z-index: -1;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: #ffffff;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);
*border-right-width: 2px;
*border-bottom-width: 2px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
}
.edui-default .edui-dialog-foot {
background-color: white;
}
.edui-default .edui-dialog-titlebar {
height: 26px;
border-bottom: 1px solid #c6c6c6;
background: url(../images/dialog-title-bg.png) repeat-x bottom;
position: relative;
cursor: move;
}
.edui-default .edui-dialog-caption {
font-weight: bold;
font-size: 12px;
line-height: 26px;
padding-left: 5px;
}
.edui-default .edui-dialog-draghandle {
height: 26px;
}
.edui-default .edui-dialog-closebutton {
position: absolute !important;
right: 5px;
top: 3px;
}
.edui-default .edui-dialog-closebutton .edui-button-body {
height: 20px;
width: 20px;
cursor: pointer;
background: url("../images/icons-all.gif") no-repeat 0 -59px;
}
.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body {
background: url("../images/icons-all.gif") no-repeat 0 -89px;
}
.edui-default .edui-dialog-foot {
height: 40px;
}
.edui-default .edui-dialog-buttons {
position: absolute;
right: 0;
}
.edui-default .edui-dialog-buttons .edui-button {
margin-right: 10px;
}
.edui-default .edui-dialog-buttons .edui-button .edui-button-body {
background: url("../images/icons-all.gif") no-repeat;
height: 24px;
width: 96px;
font-size: 12px;
line-height: 24px;
text-align: center;
cursor: default;
}
.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body {
background: url("../images/icons-all.gif") no-repeat 0 -30px;
}
.edui-default .edui-dialog iframe {
border: 0;
padding: 0;
margin: 0;
vertical-align: top;
}
.edui-default .edui-dialog-modalmask {
opacity: 0.3;
filter: alpha(opacity = 30);
background-color: #ccc;
position: absolute;
/*z-index: 1999;*/
}
.edui-default .edui-dialog-dragmask {
position: absolute;
/*z-index: 2001;*/
background-color: transparent;
cursor: move;
}
.edui-default .edui-dialog-content {
position: relative;
}
.edui-default .dialogcontmask {
cursor: move;
visibility: hidden;
display: block;
position: absolute;
width: 100%;
height: 100%;
opacity: 0;
filter: alpha(opacity = 0);
}
/*link-dialog*/
.edui-default .edui-for-link .edui-dialog-content {
width: 420px;
height: 200px;
overflow: hidden;
}
/*background-dialog*/
.edui-default .edui-for-background .edui-dialog-content {
width: 440px;
height: 280px;
overflow: hidden;
}
/*template-dialog*/
.edui-default .edui-for-template .edui-dialog-content {
width: 630px;
height: 390px;
overflow: hidden;
}
/*scrawl-dialog*/
.edui-default .edui-for-scrawl .edui-dialog-content {
width: 515px;
*width: 506px;
height: 360px;
}
/*spechars-dialog*/
.edui-default .edui-for-spechars .edui-dialog-content {
width: 620px;
height: 500px;
*width: 630px;
*height: 570px;
}
/*image-dialog*/
.edui-default .edui-for-insertimage .edui-dialog-content {
width: 650px;
height: 400px;
overflow: hidden;
}
/*webapp-dialog*/
.edui-default .edui-for-webapp .edui-dialog-content {
width: 560px;
_width: 565px;
height: 450px;
overflow: hidden;
}
/*image-insertframe*/
.edui-default .edui-for-insertframe .edui-dialog-content {
width: 350px;
height: 200px;
overflow: hidden;
}
/*wordImage-dialog*/
.edui-default .edui-for-wordimage .edui-dialog-content {
width: 620px;
height: 380px;
overflow: hidden;
}
/*attachment-dialog*/
.edui-default .edui-for-attachment .edui-dialog-content {
width: 650px;
height: 400px;
overflow: hidden;
}
/*map-dialog*/
.edui-default .edui-for-map .edui-dialog-content {
width: 550px;
height: 400px;
}
/*gmap-dialog*/
.edui-default .edui-for-gmap .edui-dialog-content {
width: 550px;
height: 400px;
}
/*video-dialog*/
.edui-default .edui-for-insertvideo .edui-dialog-content {
width: 590px;
height: 390px;
}
/*anchor-dialog*/
.edui-default .edui-for-anchor .edui-dialog-content {
width: 320px;
height: 60px;
overflow: hidden;
}
/*searchreplace-dialog*/
.edui-default .edui-for-searchreplace .edui-dialog-content {
width: 400px;
height: 220px;
}
/*help-dialog*/
.edui-default .edui-for-help .edui-dialog-content {
width: 400px;
height: 420px;
}
/*edittable-dialog*/
.edui-default .edui-for-edittable .edui-dialog-content {
width: 540px;
_width:590px;
height: 335px;
}
/*edittip-dialog*/
.edui-default .edui-for-edittip .edui-dialog-content {
width: 225px;
height: 60px;
}
/*edittd-dialog*/
.edui-default .edui-for-edittd .edui-dialog-content {
width: 240px;
height: 50px;
}
/*snapscreen-dialog*/
.edui-default .edui-for-snapscreen .edui-dialog-content {
width: 400px;
height: 220px;
}
/*music-dialog*/
.edui-default .edui-for-music .edui-dialog-content {
width: 515px;
height: 360px;
}
/*段落弹出菜单*/
.edui-default .edui-for-paragraph .edui-listitem-label {
font-family: Tahoma, Verdana, Arial, Helvetica;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p {
font-size: 22px;
line-height: 27px;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 {
font-weight: bolder;
font-size: 32px;
line-height: 36px;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 {
font-weight: bolder;
font-size: 27px;
line-height: 29px;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 {
font-weight: bolder;
font-size: 19px;
line-height: 23px;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 {
font-weight: bolder;
font-size: 16px;
line-height: 19px
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 {
font-weight: bolder;
font-size: 13px;
line-height: 16px;
}
.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 {
font-weight: bolder;
font-size: 12px;
line-height: 14px;
}
/* 表格弹出菜单 */
.edui-default .edui-for-inserttable .edui-splitborder {
display: none
}
.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow {
width: 0
}
.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{
border-left: 1px solid transparent;
}
.edui-default .edui-tablepicker .edui-infoarea {
height: 14px;
line-height: 14px;
font-size: 12px;
width: 220px;
margin-bottom: 3px;
clear: both;
}
.edui-default .edui-tablepicker .edui-infoarea .edui-label {
float: left;
}
.edui-default .edui-dialog-buttons .edui-label {
line-height: 24px;
}
.edui-default .edui-tablepicker .edui-infoarea .edui-clickable {
float: right;
}
.edui-default .edui-tablepicker .edui-pickarea {
background: url("../images/unhighlighted.gif") repeat;
height: 220px;
width: 220px;
}
.edui-default .edui-tablepicker .edui-pickarea .edui-overlay {
background: url("../images/highlighted.gif") repeat;
}
/* 颜色弹出菜单 */
.edui-default .edui-colorpicker-topbar {
height: 27px;
width: 200px;
/*border-bottom: 1px gray dashed;*/
}
.edui-default .edui-colorpicker-preview {
height: 20px;
border: 1px inset black;
margin-left: 1px;
width: 128px;
float: left;
}
.edui-default .edui-colorpicker-nocolor {
float: right;
margin-right: 1px;
font-size: 12px;
line-height: 14px;
height: 14px;
border: 1px solid #333;
padding: 3px 5px;
cursor: pointer;
}
.edui-default .edui-colorpicker-tablefirstrow {
height: 30px;
}
.edui-default .edui-colorpicker-colorcell {
width: 14px;
height: 14px;
display: block;
margin: 0;
cursor: pointer;
}
.edui-default .edui-colorpicker-colorcell:hover {
width: 14px;
height: 14px;
margin: 0;
}
.edui-default .edui-colorpicker-advbtn{
display: block;
text-align: center;
cursor: pointer;
height:20px;
}
.arrow_down{
background: white url('../images/arrow_down.png') no-repeat center;
}
.arrow_up{
background: white url('../images/arrow_up.png') no-repeat center;
}
/*高级的样式*/
.edui-colorpicker-adv{
position: relative;
overflow: hidden;
height: 180px;
display: none;
}
.edui-colorpicker-plant, .edui-colorpicker-hue {
border: solid 1px #666;
}
.edui-colorpicker-pad {
width: 150px;
height: 150px;
left: 14px;
top: 13px;
position: absolute;
background: red;
overflow: hidden;
cursor: crosshair;
}
.edui-colorpicker-cover{
position: absolute;
top: 0;
left: 0;
width: 150px;
height: 150px;
background: url("../images/tangram-colorpicker.png") -160px -200px;
}
.edui-colorpicker-padDot{
position: absolute;
top: 0;
left: 0;
width: 11px;
height: 11px;
overflow: hidden;
background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x;
z-index: 1000;
}
.edui-colorpicker-sliderMain {
position: absolute;
left: 171px;
top: 13px;
width: 19px;
height: 152px;
background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat;
}
.edui-colorpicker-slider {
width: 100%;
height: 100%;
cursor: pointer;
}
.edui-colorpicker-thumb{
position: absolute;
top: 0;
cursor: pointer;
height: 3px;
left: -1px;
right: -1px;
border: 1px solid black;
background: white;
opacity: .8;
}
/*自动排版弹出菜单*/
.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body {
font-size: 12px;
margin-bottom: 3px;
clear: both;
}
.edui-default .edui-autotypesetpicker-body table {
border-collapse: separate;
border-spacing: 2px;
}
.edui-default .edui-autotypesetpicker-body td {
font-size: 12px;
word-wrap:break-word;
}
.edui-default .edui-autotypesetpicker-body td input {
margin: 3px 3px 3px 4px;
*margin: 1px 0 0 0;
}
/*自动排版弹出菜单*/
.edui-default .edui-cellalignpicker .edui-cellalignpicker-body {
width: 70px;
font-size: 12px;
cursor: default;
}
.edui-default .edui-cellalignpicker-body table {
border-collapse: separate;
border-spacing: 0;
}
.edui-default .edui-cellalignpicker-body td{
padding: 1px;
}
.edui-default .edui-cellalignpicker-body .edui-icon{
height: 20px;
width: 20px;
padding: 1px;
background-image: url(../images/table-cell-align.png);
}
.edui-default .edui-cellalignpicker-body .edui-left{
background-position: 0 0;
}
.edui-default .edui-cellalignpicker-body .edui-center{
background-position: -25px 0;
}
.edui-default .edui-cellalignpicker-body .edui-right{
background-position: -51px 0;
}
.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{
background-position: -73px 0;
}
.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{
background-position: -98px 0;
}
.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{
background-position: -124px 0;
}
.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left {
background-position: -146px 0;
background-color: #f1f4f5;
}
.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center {
background-position: -245px 0;
}
.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right {
background-position: -271px 0;
}
/*分隔线*/
.edui-default .edui-toolbar .edui-separator {
width: 2px;
height: 20px;
margin: 2px 4px 2px 3px;
background: url(../images/icons.png) -181px 0;
background: url(../images/icons.gif) -181px 0 \9;
}
/*颜色按钮 */
.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump {
position: absolute;
overflow: hidden;
bottom: 1px;
left: 1px;
width: 18px;
height: 4px;
}
/*表情按钮及弹出菜单*/
/*去除了表情的下拉箭头*/
.edui-default .edui-for-emotion .edui-icon {
background-position: -60px -20px;
}
.edui-default .edui-for-emotion .edui-popup-content iframe
{
width: 514px;
height: 380px;
overflow: hidden;
}
.edui-default .edui-for-emotion .edui-popup-content
{
position: relative;
z-index: 555
}
.edui-default .edui-for-emotion .edui-splitborder {
display: none
}
.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow
{
width: 0
}
.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder
{
border-left: 1px solid transparent;
}
/*contextmenu*/
.edui-default .edui-hassubmenu .edui-arrow {
height: 20px;
width: 20px;
float: right;
background: url("../images/icons-all.gif") no-repeat 10px -233px;
}
.edui-default .edui-menu-body .edui-menuitem {
padding: 1px;
}
.edui-default .edui-menuseparator {
margin: 2px 0;
height: 1px;
overflow: hidden;
}
.edui-default .edui-menuseparator-inner {
border-bottom: 1px solid #e2e3e3;
margin-left: 29px;
margin-right: 1px;
}
.edui-default .edui-menu-body .edui-state-hover {
padding: 0 !important;
background-color: #fff5d4;
border: 1px solid #dcac6c;
}
/*弹出菜单*/
.edui-default .edui-shortcutmenu {
padding: 2px;
width: 190px;
height: 50px;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 5px;
}
/*粘贴弹出菜单*/
.edui-default .edui-wordpastepop .edui-popup-content{
border: none;
padding: 0;
width: 54px;
height: 21px;
}
.edui-default .edui-pasteicon {
width: 100%;
height: 100%;
background-image: url('../images/wordpaste.png');
background-position: 0 0;
}
.edui-default .edui-pasteicon.edui-state-opened {
background-position: 0 -34px;
}
.edui-default .edui-pastecontainer {
position: relative;
visibility: hidden;
width: 97px;
background: #fff;
border: 1px solid #ccc;
}
.edui-default .edui-pastecontainer .edui-title {
font-weight: bold;
background: #F8F8FF;
height: 25px;
line-height: 25px;
font-size: 12px;
padding-left: 5px;
}
.edui-default .edui-pastecontainer .edui-button {
overflow: hidden;
margin: 3px 0;
}
.edui-default .edui-pastecontainer .edui-button .edui-richtxticon,
.edui-default .edui-pastecontainer .edui-button .edui-tagicon,
.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{
float: left;
cursor: pointer;
width: 29px;
height: 29px;
margin-left: 5px;
background-image: url('../images/wordpaste.png');
background-repeat: no-repeat;
}
.edui-default .edui-pastecontainer .edui-button .edui-richtxticon {
margin-left: 0;
background-position: -109px 0;
}
.edui-default .edui-pastecontainer .edui-button .edui-tagicon {
background-position: -148px 1px;
}
.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon {
background-position: -72px 0;
}
.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon {
background-position: -109px -34px;
}
.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{
background-position: -148px -34px;
}
.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{
background-position: -72px -34px;
}
================================================
FILE: static/common/user/uedit/themes/default/dialogbase.css
================================================
/*弹出对话框页面样式组件
*/
/*reset
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
outline: 0;
font-size: 100%;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
ins {
text-decoration: none;
}
del {
text-decoration: line-through;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
/*module
*/
body {
background-color: #fff;
font: 12px/1.5 sans-serif, "宋体", "Arial Narrow", HELVETICA;
color: #646464;
}
/*tab*/
.tabhead {
position: relative;
z-index: 10;
}
.tabhead span {
display: inline-block;
padding: 0 5px;
height: 30px;
border: 1px solid #ccc;
background: url("images/dialog-title-bg.png") repeat-x;
text-align: center;
line-height: 30px;
cursor: pointer;
*margin-right: 5px;
}
.tabhead span.focus {
height: 31px;
border-bottom: none;
background: #fff;
}
.tabbody {
position: relative;
top: -1px;
margin: 0 auto;
border: 1px solid #ccc;
}
/*button*/
a.button {
display: block;
text-align: center;
line-height: 24px;
text-decoration: none;
height: 24px;
width: 95px;
border: 0;
color: #838383;
background: url(../../themes/default/images/icons-all.gif) no-repeat;
}
a.button:hover {
background-position: 0 -30px;
}
================================================
FILE: static/common/user/uedit/themes/iframe.css
================================================
/*可以在这里添加你自己的css*/
================================================
FILE: static/common/user/uedit/third-party/SyntaxHighlighter/shCore.js
================================================
// XRegExp 1.5.1
// (c) 2007-2012 Steven Levithan
// MIT License
//
// Provides an augmented, extensible, cross-browser implementation of regular expressions,
// including support for additional syntax, flags, and methods
var XRegExp;
if (XRegExp) {
// Avoid running twice, since that would break references to native globals
throw Error("can't load XRegExp twice in the same frame");
}
// Run within an anonymous function to protect variables and avoid new globals
(function (undefined) {
//---------------------------------
// Constructor
//---------------------------------
// Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native
// regular expression in that additional syntax and flags are supported and cross-browser
// syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and
// converts to type XRegExp
XRegExp = function (pattern, flags) {
var output = [],
currScope = XRegExp.OUTSIDE_CLASS,
pos = 0,
context, tokenResult, match, chr, regex;
if (XRegExp.isRegExp(pattern)) {
if (flags !== undefined)
throw TypeError("can't supply flags when constructing one RegExp from another");
return clone(pattern);
}
// Tokens become part of the regex construction process, so protect against infinite
// recursion when an XRegExp is constructed within a token handler or trigger
if (isInsideConstructor)
throw Error("can't call the XRegExp constructor within token definition functions");
flags = flags || "";
context = { // `this` object for custom tokens
hasNamedCapture: false,
captureNames: [],
hasFlag: function (flag) {return flags.indexOf(flag) > -1;},
setFlag: function (flag) {flags += flag;}
};
while (pos < pattern.length) {
// Check for custom tokens at the current position
tokenResult = runTokens(pattern, pos, currScope, context);
if (tokenResult) {
output.push(tokenResult.output);
pos += (tokenResult.match[0].length || 1);
} else {
// Check for native multicharacter metasequences (excluding character classes) at
// the current position
if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) {
output.push(match[0]);
pos += match[0].length;
} else {
chr = pattern.charAt(pos);
if (chr === "[")
currScope = XRegExp.INSIDE_CLASS;
else if (chr === "]")
currScope = XRegExp.OUTSIDE_CLASS;
// Advance position one character
output.push(chr);
pos++;
}
}
}
regex = RegExp(output.join(""), nativ.replace.call(flags, flagClip, ""));
regex._xregexp = {
source: pattern,
captureNames: context.hasNamedCapture ? context.captureNames : null
};
return regex;
};
//---------------------------------
// Public properties
//---------------------------------
XRegExp.version = "1.5.1";
// Token scope bitflags
XRegExp.INSIDE_CLASS = 1;
XRegExp.OUTSIDE_CLASS = 2;
//---------------------------------
// Private variables
//---------------------------------
var replacementToken = /\$(?:(\d\d?|[$&`'])|{([$\w]+)})/g,
flagClip = /[^gimy]+|([\s\S])(?=[\s\S]*\1)/g, // Nonnative and duplicate flags
quantifier = /^(?:[?*+]|{\d+(?:,\d*)?})\??/,
isInsideConstructor = false,
tokens = [],
// Copy native globals for reference ("native" is an ES3 reserved keyword)
nativ = {
exec: RegExp.prototype.exec,
test: RegExp.prototype.test,
match: String.prototype.match,
replace: String.prototype.replace,
split: String.prototype.split
},
compliantExecNpcg = nativ.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups
compliantLastIndexIncrement = function () {
var x = /^/g;
nativ.test.call(x, "");
return !x.lastIndex;
}(),
hasNativeY = RegExp.prototype.sticky !== undefined,
nativeTokens = {};
// `nativeTokens` match native multicharacter metasequences only (including deprecated octals,
// excluding character classes)
nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/;
nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/;
//---------------------------------
// Public methods
//---------------------------------
// Lets you extend or change XRegExp syntax and create custom flags. This is used internally by
// the XRegExp library and can be used to create XRegExp plugins. This function is intended for
// users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can
// be disabled by `XRegExp.freezeTokens`
XRegExp.addToken = function (regex, handler, scope, trigger) {
tokens.push({
pattern: clone(regex, "g" + (hasNativeY ? "y" : "")),
handler: handler,
scope: scope || XRegExp.OUTSIDE_CLASS,
trigger: trigger || null
});
};
// Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag
// combination has previously been cached, the cached copy is returned; otherwise the newly
// created regex is cached
XRegExp.cache = function (pattern, flags) {
var key = pattern + "/" + (flags || "");
return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags));
};
// Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh
// `lastIndex` (set to zero). If you want to copy a regex without forcing the `global`
// property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve
// special properties required for named capture
XRegExp.copyAsGlobal = function (regex) {
return clone(regex, "g");
};
// Accepts a string; returns the string with regex metacharacters escaped. The returned string
// can safely be used at any point within a regex to match the provided literal string. Escaped
// characters are [ ] { } ( ) * + ? - . , \ ^ $ | # and whitespace
XRegExp.escape = function (str) {
return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
};
// Accepts a string to search, regex to search with, position to start the search within the
// string (default: 0), and an optional Boolean indicating whether matches must start at-or-
// after the position or at the specified position only. This function ignores the `lastIndex`
// of the provided regex in its own handling, but updates the property for compatibility
XRegExp.execAt = function (str, regex, pos, anchored) {
var r2 = clone(regex, "g" + ((anchored && hasNativeY) ? "y" : "")),
match;
r2.lastIndex = pos = pos || 0;
match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.)
if (anchored && match && match.index !== pos)
match = null;
if (regex.global)
regex.lastIndex = match ? r2.lastIndex : 0;
return match;
};
// Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing
// syntax and flag changes. Should be run after XRegExp and any plugins are loaded
XRegExp.freezeTokens = function () {
XRegExp.addToken = function () {
throw Error("can't run addToken after freezeTokens");
};
};
// Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object.
// Note that this is also `true` for regex literals and regexes created by the `XRegExp`
// constructor. This works correctly for variables created in another frame, when `instanceof`
// and `constructor` checks would fail to work as intended
XRegExp.isRegExp = function (o) {
return Object.prototype.toString.call(o) === "[object RegExp]";
};
// Executes `callback` once per match within `str`. Provides a simpler and cleaner way to
// iterate over regex matches compared to the traditional approaches of subverting
// `String.prototype.replace` or repeatedly calling `exec` within a `while` loop
XRegExp.iterate = function (str, regex, callback, context) {
var r2 = clone(regex, "g"),
i = -1, match;
while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.)
if (regex.global)
regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback`
callback.call(context, match, ++i, str, regex);
if (r2.lastIndex === match.index)
r2.lastIndex++;
}
if (regex.global)
regex.lastIndex = 0;
};
// Accepts a string and an array of regexes; returns the result of using each successive regex
// to search within the matches of the previous regex. The array of regexes can also contain
// objects with `regex` and `backref` properties, in which case the named or numbered back-
// references specified are passed forward to the next regex or returned. E.g.:
// var xregexpImgFileNames = XRegExp.matchChain(html, [
// {regex: / ]+)>/i, backref: 1}, // tag attributes
// {regex: XRegExp('(?ix) \\s src=" (? [^"]+ )'), backref: "src"}, // src attribute values
// {regex: XRegExp("^http://xregexp\\.com(/[^#?]+)", "i"), backref: 1}, // xregexp.com paths
// /[^\/]+$/ // filenames (strip directory paths)
// ]);
XRegExp.matchChain = function (str, chain) {
return function recurseChain (values, level) {
var item = chain[level].regex ? chain[level] : {regex: chain[level]},
regex = clone(item.regex, "g"),
matches = [], i;
for (i = 0; i < values.length; i++) {
XRegExp.iterate(values[i], regex, function (match) {
matches.push(item.backref ? (match[item.backref] || "") : match[0]);
});
}
return ((level === chain.length - 1) || !matches.length) ?
matches : recurseChain(matches, level + 1);
}([str], 0);
};
//---------------------------------
// New RegExp prototype methods
//---------------------------------
// Accepts a context object and arguments array; returns the result of calling `exec` with the
// first value in the arguments array. the context is ignored but is accepted for congruity
// with `Function.prototype.apply`
RegExp.prototype.apply = function (context, args) {
return this.exec(args[0]);
};
// Accepts a context object and string; returns the result of calling `exec` with the provided
// string. the context is ignored but is accepted for congruity with `Function.prototype.call`
RegExp.prototype.call = function (context, str) {
return this.exec(str);
};
//---------------------------------
// Overriden native methods
//---------------------------------
// Adds named capture support (with backreferences returned as `result.name`), and fixes two
// cross-browser issues per ES3:
// - Captured values for nonparticipating capturing groups should be returned as `undefined`,
// rather than the empty string.
// - `lastIndex` should not be incremented after zero-length matches.
RegExp.prototype.exec = function (str) {
var match, name, r2, origLastIndex;
if (!this.global)
origLastIndex = this.lastIndex;
match = nativ.exec.apply(this, arguments);
if (match) {
// Fix browsers whose `exec` methods don't consistently return `undefined` for
// nonparticipating capturing groups
if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) {
r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), "g", ""));
// Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed
// matching due to characters outside the match
nativ.replace.call((str + "").slice(match.index), r2, function () {
for (var i = 1; i < arguments.length - 2; i++) {
if (arguments[i] === undefined)
match[i] = undefined;
}
});
}
// Attach named capture properties
if (this._xregexp && this._xregexp.captureNames) {
for (var i = 1; i < match.length; i++) {
name = this._xregexp.captureNames[i - 1];
if (name)
match[name] = match[i];
}
}
// Fix browsers that increment `lastIndex` after zero-length matches
if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))
this.lastIndex--;
}
if (!this.global)
this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)
return match;
};
// Fix browser bugs in native method
RegExp.prototype.test = function (str) {
// Use the native `exec` to skip some processing overhead, even though the altered
// `exec` would take care of the `lastIndex` fixes
var match, origLastIndex;
if (!this.global)
origLastIndex = this.lastIndex;
match = nativ.exec.call(this, str);
// Fix browsers that increment `lastIndex` after zero-length matches
if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))
this.lastIndex--;
if (!this.global)
this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)
return !!match;
};
// Adds named capture support and fixes browser bugs in native method
String.prototype.match = function (regex) {
if (!XRegExp.isRegExp(regex))
regex = RegExp(regex); // Native `RegExp`
if (regex.global) {
var result = nativ.match.apply(this, arguments);
regex.lastIndex = 0; // Fix IE bug
return result;
}
return regex.exec(this); // Run the altered `exec`
};
// Adds support for `${n}` tokens for named and numbered backreferences in replacement text,
// and provides named backreferences to replacement functions as `arguments[0].name`. Also
// fixes cross-browser differences in replacement text syntax when performing a replacement
// using a nonregex search value, and the value of replacement regexes' `lastIndex` property
// during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary
// third (`flags`) parameter
String.prototype.replace = function (search, replacement) {
var isRegex = XRegExp.isRegExp(search),
captureNames, result, str, origLastIndex;
// There are too many combinations of search/replacement types/values and browser bugs that
// preclude passing to native `replace`, so don't try
//if (...)
// return nativ.replace.apply(this, arguments);
if (isRegex) {
if (search._xregexp)
captureNames = search._xregexp.captureNames; // Array or `null`
if (!search.global)
origLastIndex = search.lastIndex;
} else {
search = search + ""; // Type conversion
}
if (Object.prototype.toString.call(replacement) === "[object Function]") {
result = nativ.replace.call(this + "", search, function () {
if (captureNames) {
// Change the `arguments[0]` string primitive to a String object which can store properties
arguments[0] = new String(arguments[0]);
// Store named backreferences on `arguments[0]`
for (var i = 0; i < captureNames.length; i++) {
if (captureNames[i])
arguments[0][captureNames[i]] = arguments[i + 1];
}
}
// Update `lastIndex` before calling `replacement` (fix browsers)
if (isRegex && search.global)
search.lastIndex = arguments[arguments.length - 2] + arguments[0].length;
return replacement.apply(null, arguments);
});
} else {
str = this + ""; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`)
result = nativ.replace.call(str, search, function () {
var args = arguments; // Keep this function's `arguments` available through closure
return nativ.replace.call(replacement + "", replacementToken, function ($0, $1, $2) {
// Numbered backreference (without delimiters) or special variable
if ($1) {
switch ($1) {
case "$": return "$";
case "&": return args[0];
case "`": return args[args.length - 1].slice(0, args[args.length - 2]);
case "'": return args[args.length - 1].slice(args[args.length - 2] + args[0].length);
// Numbered backreference
default:
// What does "$10" mean?
// - Backreference 10, if 10 or more capturing groups exist
// - Backreference 1 followed by "0", if 1-9 capturing groups exist
// - Otherwise, it's the string "$10"
// Also note:
// - Backreferences cannot be more than two digits (enforced by `replacementToken`)
// - "$01" is equivalent to "$1" if a capturing group exists, otherwise it's the string "$01"
// - There is no "$0" token ("$&" is the entire match)
var literalNumbers = "";
$1 = +$1; // Type conversion; drop leading zero
if (!$1) // `$1` was "0" or "00"
return $0;
while ($1 > args.length - 3) {
literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers;
$1 = Math.floor($1 / 10); // Drop the last digit
}
return ($1 ? args[$1] || "" : "$") + literalNumbers;
}
// Named backreference or delimited numbered backreference
} else {
// What does "${n}" mean?
// - Backreference to numbered capture n. Two differences from "$n":
// - n can be more than two digits
// - Backreference 0 is allowed, and is the entire match
// - Backreference to named capture n, if it exists and is not a number overridden by numbered capture
// - Otherwise, it's the string "${n}"
var n = +$2; // Type conversion; drop leading zeros
if (n <= args.length - 3)
return args[n];
n = captureNames ? indexOf(captureNames, $2) : -1;
return n > -1 ? args[n + 1] : $0;
}
});
});
}
if (isRegex) {
if (search.global)
search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows)
else
search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)
}
return result;
};
// A consistent cross-browser, ES3 compliant `split`
String.prototype.split = function (s /* separator */, limit) {
// If separator `s` is not a regex, use the native `split`
if (!XRegExp.isRegExp(s))
return nativ.split.apply(this, arguments);
var str = this + "", // Type conversion
output = [],
lastLastIndex = 0,
match, lastLength;
// Behavior for `limit`: if it's...
// - `undefined`: No limit
// - `NaN` or zero: Return an empty array
// - A positive number: Use `Math.floor(limit)`
// - A negative number: No limit
// - Other: Type-convert, then use the above rules
if (limit === undefined || +limit < 0) {
limit = Infinity;
} else {
limit = Math.floor(+limit);
if (!limit)
return [];
}
// This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero
// and restore it to its original value when we're done using the regex
s = XRegExp.copyAsGlobal(s);
while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.)
if (s.lastIndex > lastLastIndex) {
output.push(str.slice(lastLastIndex, match.index));
if (match.length > 1 && match.index < str.length)
Array.prototype.push.apply(output, match.slice(1));
lastLength = match[0].length;
lastLastIndex = s.lastIndex;
if (output.length >= limit)
break;
}
if (s.lastIndex === match.index)
s.lastIndex++;
}
if (lastLastIndex === str.length) {
if (!nativ.test.call(s, "") || lastLength)
output.push("");
} else {
output.push(str.slice(lastLastIndex));
}
return output.length > limit ? output.slice(0, limit) : output;
};
//---------------------------------
// Private helper functions
//---------------------------------
// Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp`
// instance with a fresh `lastIndex` (set to zero), preserving properties required for named
// capture. Also allows adding new flags in the process of copying the regex
function clone (regex, additionalFlags) {
if (!XRegExp.isRegExp(regex))
throw TypeError("type RegExp expected");
var x = regex._xregexp;
regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || ""));
if (x) {
regex._xregexp = {
source: x.source,
captureNames: x.captureNames ? x.captureNames.slice(0) : null
};
}
return regex;
}
function getNativeFlags (regex) {
return (regex.global ? "g" : "") +
(regex.ignoreCase ? "i" : "") +
(regex.multiline ? "m" : "") +
(regex.extended ? "x" : "") + // Proposed for ES4; included in AS3
(regex.sticky ? "y" : "");
}
function runTokens (pattern, index, scope, context) {
var i = tokens.length,
result, match, t;
// Protect against constructing XRegExps within token handler and trigger functions
isInsideConstructor = true;
// Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws
try {
while (i--) { // Run in reverse order
t = tokens[i];
if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) {
t.pattern.lastIndex = index;
match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc.
if (match && match.index === index) {
result = {
output: t.handler.call(context, match, scope),
match: match
};
break;
}
}
}
} catch (err) {
throw err;
} finally {
isInsideConstructor = false;
}
return result;
}
function indexOf (array, item, from) {
if (Array.prototype.indexOf) // Use the native array method if available
return array.indexOf(item, from);
for (var i = from || 0; i < array.length; i++) {
if (array[i] === item)
return i;
}
return -1;
}
//---------------------------------
// Built-in tokens
//---------------------------------
// Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the
// third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS`
// Comment pattern: (?# )
XRegExp.addToken(
/\(\?#[^)]*\)/,
function (match) {
// Keep tokens separated unless the following token is a quantifier
return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)";
}
);
// Capturing group (match the opening parenthesis only).
// Required for support of named capturing groups
XRegExp.addToken(
/\((?!\?)/,
function () {
this.captureNames.push(null);
return "(";
}
);
// Named capturing group (match the opening delimiter only): (?
XRegExp.addToken(
/\(\?<([$\w]+)>/,
function (match) {
this.captureNames.push(match[1]);
this.hasNamedCapture = true;
return "(";
}
);
// Named backreference: \k
XRegExp.addToken(
/\\k<([\w$]+)>/,
function (match) {
var index = indexOf(this.captureNames, match[1]);
// Keep backreferences separate from subsequent literal numbers. Preserve back-
// references to named groups that are undefined at this point as literal strings
return index > -1 ?
"\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? "" : "(?:)") :
match[0];
}
);
// Empty character class: [] or [^]
XRegExp.addToken(
/\[\^?]/,
function (match) {
// For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S].
// (?!) should work like \b\B, but is unreliable in Firefox
return match[0] === "[]" ? "\\b\\B" : "[\\s\\S]";
}
);
// Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx)
// Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc.
XRegExp.addToken(
/^\(\?([imsx]+)\)/,
function (match) {
this.setFlag(match[1]);
return "";
}
);
// Whitespace and comments, in free-spacing (aka extended) mode only
XRegExp.addToken(
/(?:\s+|#.*)+/,
function (match) {
// Keep tokens separated unless the following token is a quantifier
return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)";
},
XRegExp.OUTSIDE_CLASS,
function () {return this.hasFlag("x");}
);
// Dot, in dotall (aka singleline) mode only
XRegExp.addToken(
/\./,
function () {return "[\\s\\S]";},
XRegExp.OUTSIDE_CLASS,
function () {return this.hasFlag("s");}
);
//---------------------------------
// Backward compatibility
//---------------------------------
// Uncomment the following block for compatibility with XRegExp 1.0-1.2:
/*
XRegExp.matchWithinChain = XRegExp.matchChain;
RegExp.prototype.addFlags = function (s) {return clone(this, s);};
RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;};
RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);};
RegExp.prototype.validate = function (s) {var r = RegExp("^(?:" + this.source + ")$(?!\\s)", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;};
*/
})();
//
// Begin anonymous function. This is used to contain local scope variables without polutting global scope.
//
if (typeof(SyntaxHighlighter) == 'undefined') var SyntaxHighlighter = function() {
// CommonJS
if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined')
{
XRegExp = require('XRegExp').XRegExp;
}
// Shortcut object which will be assigned to the SyntaxHighlighter variable.
// This is a shorthand for local reference in order to avoid long namespace
// references to SyntaxHighlighter.whatever...
var sh = {
defaults : {
/** Additional CSS class names to be added to highlighter elements. */
'class-name' : '',
/** First line number. */
'first-line' : 1,
/**
* Pads line numbers. Possible values are:
*
* false - don't pad line numbers.
* true - automaticaly pad numbers with minimum required number of leading zeroes.
* [int] - length up to which pad line numbers.
*/
'pad-line-numbers' : false,
/** Lines to highlight. */
'highlight' : false,
/** Title to be displayed above the code block. */
'title' : null,
/** Enables or disables smart tabs. */
'smart-tabs' : true,
/** Gets or sets tab size. */
'tab-size' : 4,
/** Enables or disables gutter. */
'gutter' : true,
/** Enables or disables toolbar. */
'toolbar' : true,
/** Enables quick code copy and paste from double click. */
'quick-code' : true,
/** Forces code view to be collapsed. */
'collapse' : false,
/** Enables or disables automatic links. */
'auto-links' : false,
/** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */
'light' : false,
'unindent' : true,
'html-script' : false
},
config : {
space : ' ',
/** Enables use of tags. */
useScriptTags : true,
/** Blogger mode flag. */
bloggerMode : false,
stripBrs : false,
/** Name of the tag that SyntaxHighlighter will automatically look for. */
tagName : 'pre',
strings : {
expandSource : 'expand source',
help : '?',
alert: 'SyntaxHighlighter\n\n',
noBrush : 'Can\'t find brush for: ',
brushNotHtmlScript : 'Brush wasn\'t configured for html-script option: ',
// this is populated by the build script
aboutDialog : '@ABOUT@'
}
},
/** Internal 'global' variables. */
vars : {
discoveredBrushes : null,
highlighters : {}
},
/** This object is populated by user included external brush files. */
brushes : {},
/** Common regular expressions. */
regexLib : {
multiLineCComments : /\/\*[\s\S]*?\*\//gm,
singleLineCComments : /\/\/.*$/gm,
singleLinePerlComments : /#.*$/gm,
doubleQuotedString : /"([^\\"\n]|\\.)*"/g,
singleQuotedString : /'([^\\'\n]|\\.)*'/g,
multiLineDoubleQuotedString : new XRegExp('"([^\\\\"]|\\\\.)*"', 'gs'),
multiLineSingleQuotedString : new XRegExp("'([^\\\\']|\\\\.)*'", 'gs'),
xmlComments : /(<|<)!--[\s\S]*?--(>|>)/gm,
url : /\w+:\/\/[\w-.\/?%&=:@;#]*/g,
/** = ?> tags. */
phpScriptTags : { left: /(<|<)\?(?:=|php)?/g, right: /\?(>|>)/g, 'eof' : true },
/** <%= %> tags. */
aspScriptTags : { left: /(<|<)%=?/g, right: /%(>|>)/g },
/**
*