态势感知平台-增加武汉市开源建设生态页面展示

This commit is contained in:
fmk1023
2026-01-12 09:50:53 +08:00
parent 0d97d2075a
commit cbc5585b4b
304 changed files with 41812 additions and 0 deletions

View File

@@ -0,0 +1,606 @@
<template>
<div class="chat-sidebar">
<div class="top-section">
<div class="new-chat-btn" @click="handleNewChat">
<div class="btn-content">
<d-icon name="icon-edit" size="16px"></d-icon>
<span class="btn-text">新对话</span>
</div>
</div>
</div>
<div class="scroll-container">
<div class="menu-section">
<div
v-for="menu in menuList"
:key="menu.id"
class="menu-item"
@click="handleMenuClick(menu)"
>
<d-icon :name="menu.icon" size="16px" class="menu-icon"></d-icon>
<span class="menu-text">{{ menu.title }}</span>
</div>
</div>
<div class="divider"></div>
<div class="search-section">
<d-search icon-position="left" style="width: 100%" placeholder="搜索历史对话" v-model="searchText" @change="loadData" @search="loadData"></d-search>
</div>
<div class="history-section">
<div class="section-title">历史对话</div>
<div v-if="dhlsList.length > 0">
<div
v-for="(item, index) in dhlsList"
:key="item.conversationId"
:class="['history-item', { 'active': props.CONV_ID === item.conversationId }]"
@click="handleSelect(item)"
@mouseenter="hoverIndex = index"
@mouseleave="hoverIndex = null"
>
<template v-if="item.isEditing">
<d-input
v-model="item.tempTitle"
autofocus
class="edit-input"
@keypress.enter="confirmEdit(item)"
@blur="cancelEdit(item)"
/>
<div class="edit-actions">
<d-icon name="icon-right" class="action-icon success" @click.stop="confirmEdit(item)"/>
<d-icon name="icon-error" class="action-icon danger" @click.stop="cancelEdit(item)"/>
</div>
</template>
<template v-else>
<d-icon name="icon-message" size="16px" class="item-icon"></d-icon>
<div class="item-content" @dblclick="startEdit(item)">
<span class="item-title text-ellipsis">{{ item.title || '新对话' }}</span>
</div>
<div class="item-actions">
<d-icon v-if="item.is_collected" name="icon-star-o" size="14px" class="pin-icon" style="color: #f7ba2a;"></d-icon>
<d-icon v-if="item.isPinned" name="icon-pin-fill" size="14px" class="pin-icon"></d-icon>
<div class="hover-actions" v-show="hoverIndex === index">
<d-dropdown trigger="click" :close-on-click="true" align="start">
<d-icon name="icon-more-operate" size="16px" class="more-btn"></d-icon>
<template #menu>
<ul class="dropdown-menu">
<li @click.stop="handlePin(item)">
{{ item.isPinned ? '取消置顶' : '置顶' }}
</li>
<li @click.stop="toggleCollect(item)">
{{ item.is_collected ? '取消收藏' : '收藏' }}
</li>
<li @click.stop="startEdit(item)">重命名</li>
<li @click.stop="handleDelete([item.conversationId])" class="danger">删除</li>
</ul>
</template>
</d-dropdown>
</div>
</div>
</template>
</div>
</div>
<div v-else class="empty-state">
暂无历史对话
</div>
</div>
</div>
<div class="bottom-section">
<div class="bottom-controls">
<div class="limit-select">
<span>保存条数</span>
<d-select
v-model="historyLimit"
size="sm"
class="mini-select"
@value-change="handleHistoryLimitChange"
>
<d-option value="10">10</d-option>
<d-option value="20">20</d-option>
<d-option value="30">30</d-option>
<d-option value="0">不限</d-option>
</d-select>
</div>
<div class="batch-btn" @click="openBatchManageModal">
<d-icon name="icon-property-setting"></d-icon>
<span>批量管理</span>
</div>
</div>
<BatchManageModal :username="props.username" @loadData="loadData" ref="BatchManageModalRef"/>
</div>
</div>
</template>
<script setup>
import { onMounted, ref, defineEmits, defineExpose, defineProps } from 'vue';
import BatchManageModal from './BatchManageModal.vue';
import { Message } from 'vue-devui/message';
import { useTimeFormat } from '@/utils/hooks/useTimeFormat';
import {
fetchChangeConversationTitle,
fetchConversationList,
fetchDeleteConversation,
fetchToggleConversationCollect
} from '@/api/jyh';
import {useRouter} from "vue-router";
// --- Props & Emits ---
const props = defineProps(['username', 'CONV_ID']);
const emit = defineEmits(['select-conv','onNewConvo']);
// --- State ---
const searchText = ref('');
const historyLimit = ref('30');
const hoverIndex = ref(null);
const BatchManageModalRef = ref(null);
const dhlsList = ref([]); // 历史对话列表
const page = ref({
pageNum: 1,
size: 30 // 默认 30与 historyLimit 对应
});
// 静态菜单数据
const menuList = [
{ id: 'write', title: 'SBOM分析', icon: 'icon-accelerations' },
{ id: 'create', title: '许可证合规检测', icon: 'icon-add-example' },
{ id: 'app', title: '供应链安全检测', icon: 'icon-branch-merge-o' },
{ id: 'cloud', title: '代码安全审计', icon: 'icon-add-token' },
{ id: 'more', title: '漏洞智能修复', icon: 'icon-assembly-new' },
];
const { formatTime } = useTimeFormat();
// --- Methods ---
// 1. 加载数据
const loadData = async () => {
await getQuestionHistory();
};
const getQuestionHistory = async () => {
if (props.username) {
const { data } = await fetchConversationList({
"userId": props.username,
"list_type": "history", // 或者根据需求调整,例如同时获取收藏
"is_manage": false,
"page": page.value.pageNum,
"size": page.value.size,
"search": searchText.value
});
if (data.code === 200) {
// 处理数据,补充前端状态字段
dhlsList.value = data.data.map(item => ({
...item,
isEditing: false,
tempTitle: '',
isPinned: item.isPinned || false // 如果后端有置顶字段则使用,否则默认 false
}));
} else {
// Message.error(data.msg || '接口异常!');
}
}
};
// 2. 新建对话
const handleNewChat = () => {
emit('select-conv', null);
emit('onNewConvo', null);
};
// 3. 选中对话
const handleSelect = (item) => {
if (item.isEditing) return; // 编辑中不触发选中
emit('select-conv', item.conversationId);
};
const router = useRouter();
// 4. 菜单点击 - 修改为跳转逻辑
const handleMenuClick = (menu) => {
console.log('点击菜单:', menu.title);
// 使用 router.push 跳转,并通过 query 传递参数
router.push({
path: '/model-chat', // 对应路由中的 path
query: {
id: menu.id,
title: menu.title
}
});
};
// 5. 编辑/重命名逻辑
const startEdit = (item) => {
item.isEditing = true;
item.tempTitle = item.title;
};
const confirmEdit = async (item) => {
if (!item.tempTitle.trim()) {
Message.error('标题不能为空');
return;
}
try {
const res = await fetchChangeConversationTitle({
conversationId: item.conversationId,
newTitle: item.tempTitle,
userId: props.username,
});
if (res.data.code === 200 || res.data.code === 20001 || res.data.code === 20000) {
item.title = item.tempTitle;
item.isEditing = false;
Message.success('标题修改成功');
} else {
Message.error(res.data.msg || '修改失败');
}
} catch (error) {
console.error('编辑失败:', error);
item.tempTitle = item.title;
item.isEditing = false;
}
};
const cancelEdit = (item) => {
item.isEditing = false;
item.tempTitle = item.title;
};
// 6. 收藏逻辑
const toggleCollect = async (item) => {
if (!props.username) {
return Message.error('请先登录');
}
try {
const res = await fetchToggleConversationCollect({
userId: props.username,
conversationIdList: [item.conversationId]
});
if (res.data.code === 200 || res.data.code === 20000) {
await loadData(); // 重新加载以更新状态
Message.success(res.data.msg || '操作成功');
} else {
Message.error(res.data.msg);
}
} catch (error) {
console.error('收藏操作失败:', error);
}
};
// 7. 删除逻辑
const handleDelete = async (conversationIds) => {
if (!props.username) {
return Message.error('请先登录');
}
try {
const res = await fetchDeleteConversation({
userId: props.username,
conversationIdList: conversationIds
}
);
if (res.data.code === 200 || res.data.code === 20000) {
Message.success(res.data.message || '删除成功');
loadData();
} else {
Message.error(res.data.msg || '删除对话失败!');
}
} catch (error) {
console.error('删除对话失败:', error);
}
};
// 8. 置顶逻辑 (前端模拟)
const handlePin = (item) => {
item.isPinned = !item.isPinned;
// 本地排序:置顶的排前面
dhlsList.value.sort((a, b) => (b.isPinned ? 1 : 0) - (a.isPinned ? 1 : 0));
// 如果有后端置顶接口,请在这里调用
};
// 9. 批量管理 & 分页条数
const openBatchManageModal = () => {
if (BatchManageModalRef.value) {
BatchManageModalRef.value.openModal();
}
};
const handleHistoryLimitChange = (val) => {
page.value.size = Number(val) || 10000; // 0 为不限
page.value.pageNum = 1;
loadData();
};
// --- Lifecycle ---
onMounted(() => {
loadData();
});
defineExpose({
getQuestionHistory,
loadData
});
</script>
<style lang="scss" scoped>
/* 容器样式:固定宽度,高度适配 */
.chat-sidebar {
width: 260px;
height: 85vh; /* 或 100% */
background-color: #f7f8fa; /* 浅灰背景 */
border-radius: 12px;
display: flex;
flex-direction: column;
padding: 12px;
box-sizing: border-box;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
color: #333;
position: fixed; /* 保持原来的固定定位 */
top: 64px;
left: 20px;
box-shadow: 0 2px 8px rgba(0,0,0,0.05);
}
/* 1. 顶部:新对话按钮 */
.top-section {
flex-shrink: 0;
margin-bottom: 12px;
}
.new-chat-btn {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #eef4ff; /* 浅蓝背景 */
color: #2563eb; /* 蓝色文字 */
border-radius: 8px;
padding: 10px 12px;
cursor: pointer;
transition: all 0.2s;
&:hover {
background-color: #dbeafe;
}
.btn-content {
display: flex;
align-items: center;
gap: 8px;
font-weight: 500;
font-size: 14px;
}
}
/* 2. 中间滚动区域 */
.scroll-container {
flex: 1;
overflow-y: auto;
/* 隐藏滚动条但保持功能 */
&::-webkit-scrollbar {
width: 4px;
}
&::-webkit-scrollbar-thumb {
background-color: #ddd;
border-radius: 2px;
}
&::-webkit-scrollbar-track {
background: transparent;
}
}
/* 功能菜单 */
.menu-section {
margin-bottom: 8px;
}
.menu-item {
display: flex;
align-items: center;
padding: 10px 12px;
border-radius: 8px;
cursor: pointer;
color: #4b5563;
font-size: 14px;
transition: background-color 0.2s;
&:hover {
background-color: #e5e7eb;
}
.menu-icon {
margin-right: 10px;
color: #6b7280;
}
.menu-text {
flex: 1;
}
}
/* 分割线 */
.divider {
height: 1px;
background-color: #e5e7eb;
margin: 8px 4px;
}
/* 搜索框 */
.search-section {
padding: 0 4px 8px 4px;
}
/* 历史对话列表 */
.history-section {
.section-title {
font-size: 12px;
color: #9ca3af;
padding: 8px 4px;
}
}
.history-item {
display: flex;
align-items: center;
padding: 10px 8px;
border-radius: 8px;
cursor: pointer;
position: relative;
transition: background-color 0.2s;
height: 40px; /* 固定高度 */
&:hover {
background-color: #e5e7eb;
.item-actions .pin-icon {
display: none; /* 悬停时隐藏置顶/收藏图标,显示更多操作 */
}
}
&.active {
background-color: #e5e7eb; /* 选中态背景 */
font-weight: 500;
}
.item-icon {
margin-right: 10px;
color: #9ca3af;
flex-shrink: 0;
}
.item-content {
flex: 1;
overflow: hidden;
margin-right: 4px;
}
.item-title {
font-size: 14px;
color: #374151;
display: block;
}
.text-ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.item-actions {
display: flex;
align-items: center;
min-width: 20px;
justify-content: flex-end;
}
.pin-icon {
color: #9ca3af;
}
.hover-actions {
position: absolute;
right: 8px;
top: 50%;
transform: translateY(-50%);
background-color: #e5e7eb;
padding-left: 4px;
.more-btn {
color: #6b7280;
&:hover { color: #374151; }
}
}
/* 编辑框样式 */
.edit-input {
height: 30px;
font-size: 13px;
width: 100%;
}
.edit-actions {
display: flex;
align-items: center;
gap: 4px;
margin-left: 4px;
.action-icon {
font-size: 14px;
cursor: pointer;
&.success { color: #50d4ab; }
&.danger { color: #f66f6a; }
}
}
}
.empty-state {
text-align: center;
color: #9ca3af;
font-size: 13px;
padding: 20px 0;
}
/* 3. 底部区域:批量管理等 */
.bottom-section {
flex-shrink: 0;
padding-top: 8px;
border-top: 1px solid #e5e7eb;
}
.bottom-controls {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 12px;
color: #666;
padding: 0 4px;
.limit-select {
display: flex;
align-items: center;
gap: 4px;
:deep(.devui-select) {
width: 60px;
}
}
.batch-btn {
cursor: pointer;
display: flex;
align-items: center;
gap: 4px;
&:hover { color: #2563eb; }
}
}
/* 下拉菜单样式 */
.dropdown-menu {
list-style: none;
padding: 4px 0;
margin: 0;
min-width: 100px;
background: #fff;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
li {
padding: 8px 12px;
font-size: 13px;
cursor: pointer;
color: #374151;
&:hover {
background-color: #f3f4f6;
}
&.danger {
color: #ef4444;
}
}
}
</style>

View File

@@ -0,0 +1,137 @@
<template>
<div class="stats-glass-bar">
<div class="stat-node">
<span class="stat-value">150+</span>
<span class="stat-desc">开源企业</span>
</div>
<div class="stat-separator"></div>
<div class="stat-node">
<span class="stat-value">12</span>
<span class="stat-desc">武汉开源社区数量</span>
</div>
<div class="stat-separator"></div>
<div class="stat-node">
<span class="stat-value">70W+</span>
<span class="stat-desc">武汉开源开发者数量</span>
</div>
<div class="stat-separator"></div>
<div class="stat-node">
<span class="stat-value">500+</span>
<span class="stat-desc">武汉开源项目数量</span>
</div>
</div>
</template>
<script>
export default {
name: "StatsBar"
}
</script>
<style lang="scss" scoped>
.stats-glass-bar {
display: flex;
align-items: center;
justify-content: space-between;
/* 布局控制:撑满容器并增加内边距 */
width: 100%;
padding: 2rem 4rem;
//margin: 2rem 0;
/* 深色玻璃拟态背景 */
background: rgba(255, 255, 255, 0.02);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
/* 极细微的边框勾勒 */
border-radius: 1rem;
border: 1px solid rgba(255, 255, 255, 0.08);
/* 外阴影与内发光,增加悬浮感 */
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.3),
inset 0 0 20px rgba(255, 255, 255, 0.02);
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
&:hover {
border-color: rgba(56, 189, 248, 0.4);
background: rgba(255, 255, 255, 0.04);
transform: translateY(-2px);
}
}
.stat-node {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
gap: 0.75rem;
transition: transform 0.3s ease;
&:hover {
transform: scale(1.05);
.stat-value {
text-shadow: 0 0 25px rgba(56, 189, 248, 0.8);
}
}
}
.stat-value {
/* 科技感亮蓝渐变 */
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
font-size: 2.25rem;
font-weight: 800;
background: linear-gradient(180deg, #fff 0%, #38bdf8 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
/* 基础发光效果 */
filter: drop-shadow(0 0 10px rgba(56, 189, 248, 0.3));
letter-spacing: -1px;
}
.stat-desc {
/* 在黑底上使用半透明白色,更有高级感 */
color: rgba(255, 255, 255, 0.6);
font-size: 0.875rem;
font-weight: 500;
letter-spacing: 0.1rem;
text-transform: uppercase;
}
.stat-separator {
/* 渐隐分割线 */
width: 1px;
height: 3rem;
background: linear-gradient(
to bottom,
rgba(255, 255, 255, 0),
rgba(255, 255, 255, 0.2),
rgba(255, 255, 255, 0)
);
margin: 0 1rem;
}
/* 响应式适配 */
@media (max-width: 1024px) {
.stats-glass-bar {
padding: 2rem;
}
.stat-value {
font-size: 1.75rem;
}
}
@media (max-width: 768px) {
.stats-glass-bar {
flex-direction: column;
gap: 2rem;
}
.stat-separator {
width: 50%;
height: 1px;
background: linear-gradient(to right, transparent, rgba(255,255,255,0.2), transparent);
}
}
</style>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,236 @@
<template>
<header class="app-header">
<div class="header-left">
<button class="logo-btn" aria-label="Home">
<a aria-current="page" href="/" class="router-link-active router-link-exact-active logo">
<img src="@/assets/imgs/logo3.png" alt="Tcode">
</a>
</button>
</div>
<div class="header-right">
<div class="agent-text"><router-link to="/ai/home">金银湖大模型</router-link></div>
<button class="user-avatar-btn" @click="toggleDropdown" aria-label="User Account">
</button>
<transition name="dropdown">
<div v-if="isDropdownOpen" class="user-dropdown-menu">
<div class="dropdown-header">
<div class="user-name">用户名</div>
<div class="user-email">123456@gmail.com</div>
</div>
<hr class="dropdown-divider">
<a href="#" class="dropdown-item download-link">
下载适用于 Windows 的版本
</a>
<hr class="dropdown-divider">
<button @click="logout" class="dropdown-item logout-btn">
退出登录
<span class="logout-icon"></span>
</button>
</div>
</transition>
</div>
</header>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import {toLogout} from "@/api/user";
import {reqCatch} from "@/utils/catch";
import {devLogout} from "@/api/org/devIndex";
import {useAccount} from "@/utils/hooks/useAccount";
import {useRoute, useRouter} from "vue-router";
// 控制下拉菜单的显示/隐藏状态
const isDropdownOpen = ref(false);
const toggleDropdown = () => {
isDropdownOpen.value = !isDropdownOpen.value;
};
// 点击外部关闭下拉菜单的逻辑
const closeDropdown = (event) => {
// 检查点击事件是否发生在下拉菜单或其触发按钮之外
const header = document.querySelector('.app-header');
if (header && !header.contains(event.target)) {
isDropdownOpen.value = false;
}
};
const route = useRoute();
const router = useRouter();
const { accountInfo, RemoveInfo } = useAccount();
const logout = async () => {
RemoveInfo(); // 目前先强制清除用户信息,后面接口通了再调
const res = await toLogout();
await reqCatch(devLogout, {}); // 清除社区登录
if (!res.error) {
RemoveInfo();
router.push('/');
}
// 退出系统刷新页面
setTimeout(() => {
location.reload();
}, 100);
};
onMounted(() => {
document.addEventListener('click', closeDropdown);
});
onUnmounted(() => {
document.removeEventListener('click', closeDropdown);
});
</script>
<style scoped>
.app-header {
display: flex;
justify-content: space-between;
align-items: center;
height: 56px; /* 常见 Header 高度 */
padding: 0 16px;
background-color: rgb(20, 18, 11);
color: #fff;
position: sticky;
top: 0;
z-index: 1000;
}
/* ------------------- 左侧 Logo ------------------- */
.logo-btn {
background: none;
border: none;
cursor: pointer;
padding: 0;
}
.logo-btn svg circle {
fill: #fff;
}
/* ------------------- 右侧区域 ------------------- */
.header-right {
display: flex;
align-items: center;
position: relative; /* 用于定位下拉菜单 */
}
.agent-text {
font-size: 14px;
margin-right: 12px;
color: #ccc; /* 略微浅灰色 */
}
/* 用户头像/首字母按钮 */
.user-avatar-btn {
width: 32px;
height: 32px;
border-radius: 50%;
background-color: #333; /* 头像背景色 */
color: #fff;
font-weight: bold;
font-size: 14px;
border: 1px solid #666; /* 模仿图片的圆形边框 */
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
padding: 0;
}
/* ------------------- 下拉菜单样式 ------------------- */
.user-dropdown-menu {
position: absolute;
top: 48px; /* 位于 header 底部下方 */
right: 0;
min-width: 250px;
background-color: #2b2b2b; /* 下拉菜单背景色 */
border: 1px solid #444;
border-radius: 4px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
padding: 8px 0;
z-index: 1001;
}
/* 头部信息 (姓名和邮箱) */
.dropdown-header {
padding: 8px 16px;
margin-bottom: 8px;
}
.user-name {
font-size: 16px;
font-weight: 500;
margin-bottom: 4px;
}
.user-email {
font-size: 12px;
color: #aaa;
}
/* 分隔线 */
.dropdown-divider {
border: none;
border-top: 1px solid #3c3c3c;
margin: 4px 0;
}
/* 菜单项基础样式 (链接和按钮) */
.dropdown-item {
display: flex;
width: 100%;
padding: 10px 16px;
font-size: 14px;
color: #fff;
background: none;
border: none;
text-align: left;
text-decoration: none;
cursor: pointer;
transition: background-color 0.15s;
box-sizing: border-box;
align-items: center;
}
.dropdown-item:hover {
background-color: #3c3c3c; /* 悬停背景色 */
}
/* 下载链接样式 */
.download-link {
color: #58a6ff; /* 蓝色突出 */
}
/* 退出登录样式 */
.logout-btn {
justify-content: space-between;
}
.logout-icon {
font-size: 16px;
margin-left: 10px;
line-height: 1;
}
/* Vue 过渡动画 */
.dropdown-enter-active, .dropdown-leave-active {
transition: opacity 0.2s, transform 0.2s;
}
.dropdown-enter-from, .dropdown-leave-to {
opacity: 0;
transform: translateY(-5px);
}
.logo img {
display: block;
height: auto;
width: 86px
}
</style>

View File

@@ -0,0 +1,260 @@
<template>
<d-content class="content-area">
<div class="integration-container">
<div class="header">集成</div>
<div class="integration-list">
<div class="integration-item">
<div class="inte-icon github-icon">
<svg viewBox="0 0 16 16" width="24" height="24" fill="#EAEAEA"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
</div>
<div class="inte-info">
<div class="inte-name">GitHub</div>
<div class="inte-desc">连接 GitHub 以获取云代理Bugbot和增强的代码库上下文</div>
</div>
<d-button class="connect-btn" variant="outline">连接 <i class="d-icon d-icon-link-external"></i></d-button>
</div>
<div class="integration-item">
<div class="inte-icon gitlab-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="#FC6D26" d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.13-.94l2.03-6.26h17.5l2.03 6.26a.84.84 0 0 1-.13.94z"/><path fill="#E24329" d="M12 22.13l-5.84-17.96A.85.85 0 0 1 7.23 3h9.54a.85.85 0 0 1 1.07 1.17L12 22.13z"/><path fill="#FC6D26" d="M12 22.13L7.23 4.17 1.35 14.39a.84.84 0 0 0 .13.94L12 22.13z"/><path fill="#FC6D26" d="M12 22.13l4.77-17.96 5.88 10.22a.84.84 0 0 1 .13.94L12 22.13z"/></svg>
</div>
<div class="inte-info">
<div class="inte-name">GitLab</div>
<div class="inte-desc">连接 GitLab 以用于云代理Bugbot和增强的代码库上下文</div>
</div>
<d-button class="connect-btn" variant="outline">连接 <i class="d-icon d-icon-link-external"></i></d-button>
</div>
<div class="integration-item">
<div class="inte-icon slack-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><circle cx="12" cy="12" r="10" fill="#4A154B"/></svg>
</div>
<div class="inte-info">
<div class="inte-name">松弛</div>
<div class="inte-desc">通过 Slack 与云代理协作</div>
</div>
<d-button class="connect-btn disabled-btn" disabled>连接 <i class="d-icon d-icon-link-external"></i></d-button>
</div>
<div class="integration-item">
<div class="inte-icon linear-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><circle cx="12" cy="12" r="10" fill="#5E6AD2"/></svg>
</div>
<div class="inte-info">
<div class="inte-name">线性</div>
<div class="inte-desc">连接 Linear 工作区将问题委派给云代理</div>
</div>
<d-button class="connect-btn" variant="outline">连接 <i class="d-icon d-icon-link-external"></i></d-button>
</div>
</div>
<div class="api-section">
<div class="api-header">用户 API 密钥</div>
<p class="api-description">
用户 API 密钥提供对您的 **金银湖大模型 账户**的安全程序化访问权限包括 **金银湖大模型 Agent CLI** 的无头版本和 **Cloud Agent API**请像对待密码一样妥善保管它们确保其安全切勿公开分享注意<span class="highlight-text">Cloud Agent API 目前处于测试阶段</span>
</p>
<div class="api-card">
<div class="api-status">
<div class="status-icon">🔑</div>
<div class="status-text">
<div class="status-title">暂无 API 密钥</div>
<div class="status-subtitle">尚未创建任何 API 密钥</div>
</div>
</div>
<d-button class="new-key-btn">
<i class="d-icon d-icon-add"></i> + API 密钥
</d-button>
</div>
</div>
</div>
</d-content >
</template>
<script setup lang="ts">
// 静态页面,无需特殊逻辑
</script>
<style lang="scss" scoped>
/* 定义核心暗色变量 */
$bg-primary: #1e1e1e;
$bg-secondary: #141414;
$text-primary: #eaeaea;
$text-secondary: #aaaaaa;
$border-color: #333333;
$highlight-blue: #4a90e2; // 链接颜色
$highlight-yellow: #f5a623; // 黄色提示
.content-area {
background-color: rgb(20, 18, 11);
padding: 40px 60px;
//overflow-y: auto;
}
.integration-page {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background-color: $bg-secondary;
min-height: 100vh;
padding: 40px;
}
.integration-container {
//max-width: 800px;
margin: 0 auto;
}
.header {
font-size: 28px;
font-weight: 500;
color: $text-primary;
margin-bottom: 30px;
}
/* --- 集成列表样式 --- */
.integration-list {
display: flex;
flex-direction: column;
gap: 10px;
margin-bottom: 40px;
}
.integration-item {
background-color: $bg-primary;
border-radius: 8px;
padding: 16px 24px;
display: flex;
align-items: center;
justify-content: space-between;
}
.inte-icon {
width: 24px;
height: 24px;
margin-right: 16px;
display: flex;
align-items: center;
flex-shrink: 0;
}
.inte-info {
flex-grow: 1;
margin-right: 20px;
}
.inte-name {
font-size: 16px;
font-weight: 500;
color: $text-primary;
margin-bottom: 4px;
}
.inte-desc {
font-size: 13px;
color: $text-secondary;
}
.connect-btn {
height: 32px;
padding: 0 16px;
border-radius: 6px;
font-size: 13px;
font-weight: 500;
color: $text-secondary !important;
border-color: $border-color !important;
background: transparent !important;
&:hover {
border-color: #555555 !important;
}
.d-icon-link-external {
margin-left: 5px;
}
}
.disabled-btn {
/* 模拟松弛的灰色禁用按钮 */
background-color: #2b2b2b !important;
color: #666666 !important;
border: 1px solid #444444 !important;
cursor: not-allowed;
}
/* --- API 密钥部分样式 --- */
.api-header {
font-size: 18px;
font-weight: 500;
color: $text-primary;
margin-bottom: 16px;
}
.api-description {
font-size: 13px;
color: $text-secondary;
line-height: 1.6;
margin-bottom: 20px;
.highlight-text {
color: $highlight-yellow;
}
}
.api-card {
background-color: $bg-primary;
border-radius: 8px;
border: 1px solid $border-color;
padding: 20px 24px;
display: flex;
justify-content: space-between;
align-items: center;
}
.api-status {
display: flex;
align-items: center;
}
.status-icon {
font-size: 24px;
margin-right: 16px;
}
.status-title {
font-size: 16px;
font-weight: 500;
color: $text-primary;
}
.status-subtitle {
font-size: 13px;
color: $text-secondary;
}
.new-key-btn {
background-color: $highlight-blue !important;
color: $text-primary !important;
border: none;
height: 36px;
padding: 0 18px;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
&:hover {
background-color: darken($highlight-blue, 5%) !important;
}
.d-icon-add {
margin-right: 4px;
}
}
</style>

View File

@@ -0,0 +1,258 @@
<template>
<d-content class="content-area">
<div class="billing-container">
<div class="billing-header">
<span class="main-title">账单和发票</span>
<d-button class="manage-subscription-btn" variant="outline">
管理订阅 <i class="d-icon d-icon-link-external"></i>
</d-button>
</div>
<div class="section-card on-demand-section">
<div class="card-header">
<span class="card-title">按需使用</span>
<div class="cycle-selector">
<span class="cycle-text">Cycle Starting 2025年12月2日</span>
<i class="d-icon d-icon-arrow-down-filling"></i>
</div>
</div>
<div class="summary-area">
<div class="cycle-period">2025年12月2日 - 2026年1月2日</div>
<div class="total-amount">0.00 <span class="currency">美元</span></div>
</div>
<div class="table-header">
<span class="col-type">类型</span>
<span class="col-token">代币</span>
<span class="col-cost">成本</span>
<span class="col-quantity">数量</span>
<span class="col-total">全部的</span>
</div>
<div class="subtotal-row">
<span class="subtotal-label">小计:</span>
<span class="subtotal-value">0.00 <span class="currency">美元</span></span>
</div>
</div>
<div class="invoices-section">
<div class="section-title">发票</div>
<p class="invoice-status">
未找到发票
</p>
</div>
</div>
</d-content>
</template>
<script setup lang="ts">
</script>
<style lang="scss" scoped>
$bg-primary: #1e1e1e; // 卡片/区块背景
$bg-secondary: #141414; // 页面背景
$text-primary: #eaeaea; // 主要文本色
$text-secondary: #aaaaaa; // 次要文本色,如日期
$text-light-gray: #c9c9c9; // 浅灰色文本,如表格头部
$border-color: #333333; // 分隔线颜色
.content-area {
background-color: rgb(20, 18, 11);
padding: 40px 60px;
//overflow-y: auto;
}
.billing-container {
//max-width: 900px;
margin: 0 auto;
}
/* --- 头部样式 --- */
.billing-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
.main-title {
font-size: 20px; /* 标题字体略小,与图片匹配 */
font-weight: 500;
color: $text-primary;
}
.manage-subscription-btn {
height: 32px;
padding: 0 16px;
border-radius: 6px;
font-size: 13px;
font-weight: 500;
color: $text-secondary !important;
border-color: $border-color !important;
background: transparent !important;
.d-icon-link-external {
margin-left: 5px;
font-size: 12px;
}
}
}
/* --- 按需使用卡片 --- */
.section-card {
background-color: $bg-primary;
border-radius: 8px;
padding: 24px;
}
.on-demand-section {
padding-bottom: 0; /* 小计行在卡片内部,所以不需要底部额外内边距 */
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
.card-title {
font-size: 16px;
font-weight: 500;
color: $text-primary;
}
}
.cycle-selector {
display: flex;
align-items: center;
color: $text-secondary;
font-size: 13px;
cursor: pointer;
padding: 4px 8px;
border-radius: 4px;
// 模拟深色下拉菜单样式
&:hover {
background-color: #2a2a2a;
}
.d-icon-arrow-down-filling {
margin-left: 4px;
font-size: 10px;
}
}
.summary-area {
margin-bottom: 24px;
}
.cycle-period {
font-size: 13px;
color: $text-secondary;
margin-bottom: 4px;
}
.total-amount {
font-size: 32px;
font-weight: 400;
color: $text-primary;
.currency {
font-size: 16px;
margin-left: 4px;
color: $text-secondary;
}
}
/* --- 表格样式 (使用 Flex/Grid 模拟) --- */
.table-header {
display: flex;
padding: 12px 0;
border-bottom: 1px solid $border-color;
font-size: 12px;
font-weight: 500;
color: $text-light-gray; /* 浅灰色字体 */
}
.col-type {
flex: 3; /* 类型占比较大 */
}
.col-token {
flex: 2;
}
.col-cost {
flex: 2;
}
.col-quantity {
flex: 2;
}
.col-total {
flex: 1; /* 总计靠右对齐,占位较小 */
text-align: right;
padding-right: 24px; // 留出空间给小计的右侧对齐
}
/* --- 小计行 --- */
.subtotal-row {
display: flex;
justify-content: flex-end; /* 将小计行整体靠右 */
padding: 16px 0;
border-top: 1px solid $border-color;
background-color: #242424; /* 模拟小计行的背景颜色比卡片背景稍亮 */
margin-top: 1px; /* 避免表格与小计行的边框重叠 */
// 确保小计行和卡片圆角自然衔接
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
// 调整外边距以覆盖卡片本身的内边距
margin: 0 -24px;
padding-right: 24px; // 保持右侧对齐的内边距
}
.subtotal-label {
font-size: 14px;
font-weight: 600;
color: $text-primary;
margin-right: 40px; /* 标签与值的间距 */
}
.subtotal-value {
font-size: 14px;
font-weight: 600;
color: $text-primary;
width: 10%; /* 保证与表格最后一列宽度大致对齐 */
min-width: 80px;
text-align: right;
.currency {
font-weight: 400;
color: $text-secondary;
margin-left: 4px;
}
}
/* --- 发票部分 --- */
.invoices-section {
margin-top: 40px;
}
.section-title {
font-size: 16px;
font-weight: 500;
color: $text-primary;
margin-bottom: 10px;
}
.invoice-status {
font-size: 14px;
color: $text-secondary; /* 浅绿色文字 */
}
</style>

View File

@@ -0,0 +1,102 @@
<template>
<d-content class="content-area">
<div class="page-container">
<h2 class="title">按需使用</h2>
<div class="feature-card">
<div class="card-content">
<div class="text-area">
<h3 class="card-title">按需使用</h3>
<p class="card-description">启用按需使用功能即可超出套餐包含的流量此功能需要付费套餐</p>
</div>
<button class="upgrade-button">
升级到专业版
</button>
</div>
</div>
</div>
</d-content>
</template>
<script setup>
</script>
<style scoped>
.content-area {
background-color: rgb(20, 18, 11);
padding: 40px 60px;
/*overflow-y: auto;*/
}
.page-container {
/* 使用深色背景,模拟图片中的深黑/灰色 */
/*background-color: #1c1c1c;*/
min-height: 100vh; /* 保证至少覆盖整个视口高度 */
/*padding: 20px 40px; !* 内部留白 *!*/
color: #ffffff; /* 默认文本颜色为白色 */
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
}
.title {
font-size: 16px;
font-weight: 500;
margin-bottom: 20px; /* 标题与内容卡片的间距 */
color: #f0f0f0; /* 略微亮一点的白色 */
}
.feature-card {
background-color: #2a2a2a;
border-radius: 8px;
padding: 16px 20px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2);
}
.card-content {
display: flex; /* 启用 Flex 布局 */
justify-content: space-between;
align-items: center; /* 垂直居中对齐 */
}
.text-area {
flex-grow: 1;
margin-right: 20px;
}
.card-title {
font-size: 16px;
font-weight: 600;
margin: 0;
margin-bottom: 4px;
color: #ffffff;
}
.card-description {
font-size: 14px;
margin: 0;
color: #c7a2e8;
}
.upgrade-button {
/* 按钮的通用样式 */
background-color: transparent; /* 背景透明 */
color: #f0f0f0; /* 按钮文字颜色 */
border: 1px solid #7c7c7c; /* 浅灰色边框,模拟图片中的效果 */
border-radius: 20px; /* 较大的圆角,看起来像药丸形状 */
padding: 6px 16px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: background-color 0.3s, border-color 0.3s;
/* 保持按钮宽度不随内容变化 */
flex-shrink: 0;
}
/* 悬停效果 */
.upgrade-button:hover {
background-color: #3b3b3b;
border-color: #a0a0a0;
}
</style>

View File

@@ -0,0 +1,310 @@
<template>
<div class="app-container">
<d-header class="dheader">
<Header />
</d-header>
<d-layout class="main-layout">
<d-aside class="sidebar">
<div class="user-profile">
<div class="avatar-area">
<span class="username">用户名</span>
<d-icon name="edit" size="14px" color="#666" />
</div>
<div class="user-email">免费计划 · 123456@gmail.com</div>
</div>
<div class="nav-menu">
<div
class="menu-item"
:class="{ active: activeMenu === 'overview' }"
@click="activeMenu = 'overview'"
>
<i class="icon-end-new"></i> 概述
</div>
<div
class="menu-item"
:class="{ active: activeMenu === 'setting' }"
@click="activeMenu = 'setting'"
>
<i class="icon-setting"></i> 设置
</div>
</div>
<div class="divider"></div>
<div class="nav-menu">
<div
class="menu-item"
:class="{ active: activeMenu === 'integration' }"
@click="activeMenu = 'integration'"
>
<i class="icon-assembly-new"></i> 集成
</div>
<div
class="menu-item"
:class="{ active: activeMenu === 'proxy' }"
@click="activeMenu = 'proxy'"
>
<i class="icon-cloud"></i> 云代理
</div>
</div>
<!-- <div class="spacer"></div>-->
<div class="nav-menu bottom-menu">
<div
class="menu-item"
:class="{ active: activeMenu === 'usage' }"
@click="activeMenu = 'usage'"
>
<i class="icon-chart"></i> 用法
</div>
<div
class="menu-item"
:class="{ active: activeMenu === 'expense' }"
@click="activeMenu = 'expense'"
>
<i class="icon-time"></i> 开支
</div>
<div
class="menu-item"
:class="{ active: activeMenu === 'billing' }"
@click="activeMenu = 'billing'"
>
<i class="icon-remove-member"></i> 账单和发票
</div>
</div>
<div class="divider"></div>
<div class="nav-menu">
<div
class="menu-item"
:class="{ active: activeMenu === 'docs' }"
@click="activeMenu = 'docs'"
>
<i class="icon-doc"></i> 文档
</div>
<div
class="menu-item"
:class="{ active: activeMenu === 'contact' }"
@click="activeMenu = 'contact'"
>
<i class="icon-mail"></i> 联系我们
</div>
</div>
</d-aside>
<!-- 动态内容区域 -->
<component :is="currentComponent" />
</d-layout>
</div>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue';
import OverView from './overview/index.vue';
import Setting from './setting/index.vue';
import Integration from './Integration.vue';
import Proxy from './proxy.vue';
import Usage from './usage.vue';
import Expense from './expense.vue';
import Billing from './billing.vue';
import Header from './Header.vue';
// 定义菜单映射关系
const menuComponents = {
overview: OverView,
setting: Setting,
integration: Integration,
proxy: Proxy,
usage: Usage,
expense: Expense,
billing: Billing,
};
// 选中的菜单
const activeMenu = ref('overview');
// 根据选中的菜单获取当前组件
const currentComponent = computed(() => {
return menuComponents[activeMenu.value] || OverView;
});
</script>
<style lang="scss" scoped>
/* 全局暗黑重置 */
.app-container {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background-color: rgb(20, 18, 11);
color: #fff;
//min-height: 100vh;
height: 100%;
width: 100%;
overflow-y: auto;
}
.main-layout {
min-height: calc(100% - 56px);
margin-left: auto;
margin-right: auto;
width: 100%;
max-width: 1344px;
padding-top: 2rem;
padding-bottom: 2rem;
}
.sidebar {
background-color: rgb(20, 18, 11);
width: 260px;
border-right: 1px solid #252525;
padding: 20px 16px;
display: flex;
flex-direction: column;
}
.user-profile {
margin-bottom: 24px;
.username {
font-size: 14px;
font-weight: 500;
margin-right: 8px;
color: #e5e5e5;
}
.user-email {
font-size: 12px;
color: #888;
margin-top: 4px;
}
}
.nav-menu {
display: flex;
flex-direction: column;
gap: 4px;
}
.menu-item {
padding: 8px 12px;
border-radius: 6px;
font-size: 14px;
color: #999;
cursor: pointer;
display: flex;
align-items: center;
transition: all 0.2s;
&:hover {
background-color: #252525;
color: #fff;
}
&.active {
background-color: #252525;
color: #fff;
font-weight: 500;
}
i {
margin-right: 10px;
/* 简单的 CSS 图标模拟 */
width: 14px;
height: 14px;
border: 1px solid currentColor;
border-radius: 3px;
display: inline-block;
}
}
/* 不同图标的特殊样式 */
.icon-overview {
border-radius: 2px;
background-color: currentColor;
}
.icon-setting {
border-radius: 50%;
}
.icon-cube {
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
}
.icon-cloud {
border-radius: 50% 50% 0 0;
}
.icon-chart {
position: relative;
&::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 2px;
background-color: currentColor;
}
}
.icon-time {
border-radius: 50%;
position: relative;
&::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 40%;
height: 2px;
background-color: currentColor;
transform-origin: left center;
}
}
.icon-bill {
border-radius: 2px;
}
.icon-doc {
border-radius: 2px;
position: relative;
&::after {
content: '';
position: absolute;
top: 3px;
right: 3px;
width: 4px;
height: 4px;
border-radius: 50%;
background-color: currentColor;
}
}
.icon-mail {
border-radius: 2px;
position: relative;
&::after {
content: '';
position: absolute;
bottom: 2px;
left: 2px;
width: 60%;
height: 2px;
background-color: currentColor;
}
}
.divider {
height: 1px;
background-color: #252525;
margin: 16px 0;
}
.spacer {
flex-grow: 1;
}
</style>

View File

@@ -0,0 +1,92 @@
<template>
<d-modal
:modelValue="visible"
title="邀请团队成员"
:close-on-click-overlay="true"
:show-close="true"
@close="$emit('update:visible', false)"
class="TeamSetupModal"
>
<div class="invite-member-content">
<div class="form-group">
<label>输入成员的邮箱</label>
<input type="email" placeholder="member@example.com" v-model="inviteEmail">
</div>
</div>
<template #footer>
<div class="modal-actions-footer">
<button class="primary-btn" @click="sendInvite">邀请</button>
</div>
</template>
</d-modal>
</template>
<script setup>
import { ref } from 'vue';
const props = defineProps({
visible: {
type: Boolean,
default: false
}
});
const emit = defineEmits(['update:visible', 'invite-sent']);
const inviteEmail = ref('');
const sendInvite = () => {
if (inviteEmail.value) {
alert(`邀请已发送给: ${inviteEmail.value}`);
emit('invite-sent', inviteEmail.value);
emit('update:visible', false); // 关闭模态框
} else {
alert('请输入有效的邮箱地址');
}
};
</script>
<style lang="scss" scoped>
.form-group {
margin-bottom: 20px;
}
.form-group label {
display: block;
font-size: 14px;
color: #a0a0a0;
margin-bottom: 8px;
}
input[type="email"] {
width: 100%;
padding: 10px 12px;
background-color: #2b2b2b;
border: 1px solid #444;
border-radius: 4px;
color: #fff;
font-size: 14px;
box-sizing: border-box;
}
/* 底部按钮排版,使用 footer 插槽需要自定义样式 */
.modal-actions-footer {
display: flex;
flex-direction: column;
gap: 10px;
width: 100%; /* 使按钮占满宽度 */
}
.primary-btn {
padding: 12px;
border-radius: 4px;
font-size: 14px;
cursor: pointer;
width: 100%;
font-weight: bold;
background-color: #fff;
color: #000;
border: none;
}
</style>

View File

@@ -0,0 +1,254 @@
<template>
<d-modal
class="TeamSetupModal"
:modelValue="visible"
title="组建团队"
:close-on-click-overlay="true"
:show-close="true"
@close="$emit('update:visible', false)"
>
<div class="team-setup-content">
<div class="form-group">
<label>您当前登录身份为:</label>
<input type="text" :value="userEmail" disabled class="disabled-input">
</div>
<div class="form-group">
<label>团队名称</label>
<input type="text" placeholder="请输入您的团队名称">
</div>
<div class="form-group seats-group">
<label>你们需要多少个座位?</label>
<div class="seat-controls">
<button @click="adjustSeats(-1)" :disabled="seats === 2">-</button>
<span>{{ seats }}</span>
<button @click="adjustSeats(1)">+</button>
<span class="seat-note">至少需要 2 个座位</span>
</div>
<p class="small-text">您可以根据需要稍后添加更多团队成员</p>
</div>
<div class="checkbox-group">
<label>
<input type="checkbox" v-model="agreeToTerms">
我的团队的代码和使用数据将用于改进 金银湖大模型
</label>
<span class="link-text">改变</span>
</div>
<div class="plan-info">
团队计划 ({{ seats }}个席位) <span>每月{{ seats * 40 }}美元</span>
</div>
<div class="annual-billing">
年度结算
<div class="toggle-switch">
<input type="checkbox" id="annual" v-model="annualBilling">
<label for="annual"></label>
</div>
</div>
</div>
<template #footer>
<div class="modal-actions-footer">
<button class="primary-btn" @click="$emit('create-team'); $emit('update:visible', false);">创建团队</button>
<button class="secondary-btn">使用其他帐户登录</button>
</div>
</template>
</d-modal>
</template>
<script setup>
import { ref } from 'vue';
// 假设 DevUI 组件库已全局或局部注册,这里无需额外导入 d-modal
const props = defineProps({
// 必须使用 modelValue 来匹配 v-model
visible: {
type: Boolean,
default: false
},
userEmail: {
type: String,
default: 'fukang10032@gmail.com'
}
});
// 使用 update:visible 事件来实现 v-model 双向绑定
const emit = defineEmits(['update:visible', 'create-team']);
const seats = ref(2);
const agreeToTerms = ref(false);
const annualBilling = ref(false);
const adjustSeats = (delta) => {
if (seats.value + delta >= 2) {
seats.value += delta;
}
};
</script>
<style lang="scss" scoped>
.form-group {
margin-bottom: 20px;
}
.form-group label {
display: block;
font-size: 14px;
color: #a0a0a0;
margin-bottom: 8px;
}
input[type="text"], .disabled-input {
width: 100%;
padding: 10px 12px;
background-color: #2b2b2b;
border: 1px solid #444;
border-radius: 4px;
color: #fff;
font-size: 14px;
box-sizing: border-box;
}
.disabled-input {
cursor: not-allowed;
color: #888;
}
.seat-controls {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 5px;
}
.seat-controls button {
width: 30px;
height: 30px;
background-color: #3b3b3b;
border: 1px solid #555;
color: #fff;
border-radius: 4px;
cursor: pointer;
}
.seat-controls button:disabled {
background-color: #2b2b2b;
color: #666;
cursor: not-allowed;
}
.seat-note {
font-size: 14px;
color: #a0a0a0;
}
.small-text {
font-size: 12px;
color: #888;
margin-top: 5px;
}
.checkbox-group {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
font-size: 14px;
}
.checkbox-group label {
color: #a0a0a0;
}
.link-text {
color: #58a6ff;
cursor: pointer;
font-size: 14px;
}
.plan-info {
font-size: 16px;
color: #fff;
margin-bottom: 15px;
}
.plan-info span {
font-weight: bold;
float: right;
}
.annual-billing {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
color: #a0a0a0;
}
/* 简化开关样式 (Toggle Switch) */
.toggle-switch input[type="checkbox"] {
display: none;
}
.toggle-switch label {
cursor: pointer;
width: 40px;
height: 20px;
background-color: #444;
border-radius: 10px;
position: relative;
display: block;
}
.toggle-switch label:after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 16px;
height: 16px;
background-color: #ccc;
border-radius: 50%;
transition: 0.3s;
}
.toggle-switch input:checked + label {
background-color: #58a6ff;
}
.toggle-switch input:checked + label:after {
left: calc(100% - 18px);
background-color: white;
}
/* 底部按钮排版,使用 footer 插槽需要自定义样式 */
.modal-actions-footer {
display: flex;
flex-direction: column;
gap: 10px;
width: 100%; /* 使按钮占满宽度 */
}
.primary-btn, .secondary-btn {
padding: 12px;
border-radius: 4px;
font-size: 14px;
cursor: pointer;
width: 100%;
font-weight: bold;
}
.primary-btn {
background-color: #fff;
color: #000;
border: none;
}
.secondary-btn {
background-color: transparent;
color: #fff;
border: 1px solid #444;
}
</style>

View File

@@ -0,0 +1,294 @@
<template>
<d-content class="content-area">
<div class="plan-cards-container">
<d-card class="plan-card">
<div class="card-title">专业版 <span class="price">20美元/</span></div>
<div class="card-desc">入门级套餐可访问高级模型无限次 Tab 键自动补全等功能</div>
<d-button class="card-btn white-btn">
<router-link to="/CheckoutPage">免费试用7天</router-link>
</d-button>
</d-card>
<d-card class="plan-card">
<div class="card-title">专业+ <span class="price">60美元/</span></div>
<div class="card-desc">使用量是专业版的 3 解锁代理程序更高的限制等等</div>
<d-button class="card-btn white-btn">
<router-link to="/CheckoutPayPage">升级到专业版+</router-link>
</d-button>
</d-card>
<d-card class="plan-card">
<div class="card-title">超级版 <span class="price">200美元/</span></div>
<div class="card-desc">并行运行代理享受 20 倍使用限制并获得高级功能的优先使用权从而获得最大价值</div>
<d-button class="card-btn white-btn">
<router-link to="/CheckoutPayPage">升级到超级版</router-link>
</d-button>
</d-card>
</div>
<div class="invite-section">
<div class="invite-text">
<h3>邀请团队成员</h3>
<p>利用管理控制分析和企业级安全功能加速您的团队发展</p>
</div>
<d-button class="invite-btn" variant="outline" @click="handleInviteClick">邀请您的团队</d-button>
</div>
<TeamSetupModal
v-model:visible="showSetupModal"
@create-team="handleTeamCreation"
/>
<InviteMemberModal
v-model:visible="showInviteModal"
@invite-sent="handleInviteSent"
/>
<div class="integration-list">
<div class="integration-item">
<div class="inte-left">
<div class="inte-icon github-icon"><svg viewBox="0 0 16 16" width="24" height="24" fill="white"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"></path></svg></div>
<div class="inte-info">
<div class="inte-name">GitHub</div>
<div class="inte-desc">连接 GitHub 以获取云代理Bugbot 和增强的代码库上下文</div>
</div>
</div>
<d-button class="connect-btn">LINK <i class="icon-link-external"></i></d-button>
</div>
<div class="integration-item">
<div class="inte-left">
<div class="inte-icon gitlab-icon"><svg viewBox="0 0 24 24" width="24" height="24"><path fill="#FC6D26" d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.13-.94l2.03-6.26h17.5l2.03 6.26a.84.84 0 0 1-.13.94z"/><path fill="#E24329" d="M12 22.13l-5.84-17.96A.85.85 0 0 1 7.23 3h9.54a.85.85 0 0 1 1.07 1.17L12 22.13z"/><path fill="#FC6D26" d="M12 22.13L7.23 4.17 1.35 14.39a.84.84 0 0 0 .13.94L12 22.13z"/><path fill="#FC6D26" d="M12 22.13l4.77-17.96 5.88 10.22a.84.84 0 0 1 .13.94L12 22.13z"/></svg></div>
<div class="inte-info">
<div class="inte-name">GitLab</div>
<div class="inte-desc">连接 GitLab 以用于云代理Bugbot 和增强的代码库上下文</div>
</div>
</div>
<d-button class="connect-btn">LINK <i class="icon-link-external"></i></d-button>
</div>
<div class="integration-item">
<div class="inte-left">
<div class="inte-icon slack-icon"><svg viewBox="0 0 24 24" width="24" height="24" fill="white"><circle cx="12" cy="12" r="10" fill="#4A154B"/></svg></div> <div class="inte-info">
<div class="inte-name">松弛</div>
<div class="inte-desc">通过 Slack 与云代理协作</div>
</div>
</div>
<d-button class="connect-btn disabled" disabled>LINK <i class="icon-link-external"></i></d-button>
</div>
<div class="integration-item">
<div class="inte-left">
<div class="inte-icon linear-icon"><svg viewBox="0 0 24 24" width="24" height="24" fill="white"><circle cx="12" cy="12" r="10" fill="#5E6AD2"/></svg></div>
<div class="inte-info">
<div class="inte-name">线性</div>
<div class="inte-desc">连接 Linear 工作区将问题委派给云代理</div>
</div>
</div>
<d-button class="connect-btn">LINK <i class="icon-link-external"></i></d-button>
</div>
</div>
</d-content>
</template>
<script setup>
import { ref } from 'vue';
import TeamSetupModal from './TeamSetupModal.vue';
import InviteMemberModal from './InviteMemberModal.vue';
// 状态管理
const showSetupModal = ref(false);
const showInviteModal = ref(false);
// 模拟团队状态true表示用户已经有团队false表示没有
const hasTeam = ref(false);
// 处理邀请团队按钮点击
const handleInviteClick = () => {
if (hasTeam.value) {
showInviteModal.value = true;
} else {
showSetupModal.value = true;
}
};
const handleTeamCreation = () => {
alert('团队创建成功!');
hasTeam.value = true;
};
const handleInviteSent = (email) => {
console.log(`邀请已发送给: ${email}`);
};
</script>
<style lang="scss" scoped>
.content-area {
background-color: rgb(20, 18, 11);
padding: 40px 60px;
//overflow-y: auto;
}
/* 顶部卡片 */
.plan-cards-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
margin-bottom: 40px;
}
.plan-card {
background-color: #161616 !important; /* 强制覆盖 DevUI 默认白底 */
border: 1px solid #252525 !important;
border-radius: 8px;
padding: 24px;
display: flex;
flex-direction: column;
justify-content: space-between;
height: 200px;
color: #fff;
:deep(.devui-card__header) {
padding: 0 0 12px 0;
border-bottom: none;
}
.card-title {
font-size: 16px;
font-weight: 500;
color: #fff;
.price {
font-size: 14px;
color: #666;
margin-left: 8px;
font-weight: normal;
}
}
.card-desc {
font-size: 13px;
color: #888;
line-height: 1.5;
margin-bottom: 20px;
flex-grow: 1;
}
.card-btn {
width: fit-content;
font-size: 12px;
font-weight: 600;
padding: 6px 12px;
border-radius: 4px;
&.white-btn {
background-color: #fff !important;
color: #000 !important;
border: none !important;
&:hover {
background-color: #e0e0e0 !important;
}
}
}
}
/* 中间邀请部分 */
.invite-section {
background-color: #121212;
text-align: center;
padding: 40px 0;
margin-bottom: 20px;
.invite-text {
margin-bottom: 20px;
h3 {
font-size: 14px;
color: #666;
font-weight: normal;
margin-bottom: 8px;
}
p {
font-size: 14px;
color: #888;
max-width: 500px;
margin: 0 auto;
}
}
.invite-btn {
background: transparent;
border: 1px solid #444;
color: #fff;
&:hover {
border-color: #666;
}
}
}
/* 底部集成列表 */
.integration-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.integration-item {
background-color: #161616;
border: 1px solid #252525;
border-radius: 8px;
padding: 16px 24px;
display: flex;
align-items: center;
justify-content: space-between;
.inte-left {
display: flex;
align-items: center;
gap: 16px;
}
.inte-icon {
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
}
.inte-info {
.inte-name {
font-size: 14px;
font-weight: 600;
color: #e5e5e5;
margin-bottom: 4px;
}
.inte-desc {
font-size: 12px;
color: #666;
}
}
.connect-btn {
background-color: #fff !important;
color: #000 !important;
border: none;
font-size: 12px;
height: 28px;
padding: 0 12px;
display: flex;
align-items: center;
gap: 4px;
&.disabled {
background-color: #252525 !important;
color: #555 !important;
}
i {
font-style: normal;
}
}
}
</style>

View File

@@ -0,0 +1,407 @@
<template>
<d-content class="content-area">
<div class="agent-container">
<div class="header">
<span class="main-title">云代理</span>
<span class="subtitle">创建代理异步方式编辑和运行代码</span>
</div>
<div class="section-title">集成</div>
<div class="integration-list">
<div class="integration-item">
<div class="inte-icon github-icon">
<svg viewBox="0 0 16 16" width="24" height="24" fill="#EAEAEA"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
</div>
<div class="inte-info">
<div class="inte-name">GitHub</div>
<div class="inte-desc">连接 GitHub 以获取云代理Bugbot和增强的代码库上下文</div>
</div>
<d-button class="connect-btn" variant="outline">连接 <i class="d-icon d-icon-link-external"></i></d-button>
</div>
<div class="integration-item">
<div class="inte-icon gitlab-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><path fill="#FC6D26" d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.13-.94l2.03-6.26h17.5l2.03 6.26a.84.84 0 0 1-.13.94z"/><path fill="#E24329" d="M12 22.13l-5.84-17.96A.85.85 0 0 1 7.23 3h9.54a.85.85 0 0 1 1.07 1.17L12 22.13z"/><path fill="#FC6D26" d="M12 22.13L7.23 4.17 1.35 14.39a.84.84 0 0 0 .13.94L12 22.13z"/><path fill="#FC6D26" d="M12 22.13l4.77-17.96 5.88 10.22a.84.84 0 0 1 .13.94L12 22.13z"/></svg>
</div>
<div class="inte-info">
<div class="inte-name">GitLab</div>
<div class="inte-desc">连接 GitLab 以用于云代理Bugbot和增强的代码库上下文</div>
</div>
<d-button class="connect-btn" variant="outline">连接 <i class="d-icon d-icon-link-external"></i></d-button>
</div>
<div class="integration-item">
<div class="inte-icon slack-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><circle cx="12" cy="12" r="10" fill="#4A154B"/></svg>
</div>
<div class="inte-info">
<div class="inte-name">松弛</div>
<div class="inte-desc">通过 Slack 与云代理协作</div>
</div>
<d-button class="connect-btn disabled-btn" disabled>连接 <i class="d-icon d-icon-link-external"></i></d-button>
</div>
<div class="integration-item">
<div class="inte-icon linear-icon">
<svg viewBox="0 0 24 24" width="24" height="24"><circle cx="12" cy="12" r="10" fill="#5E6AD2"/></svg>
</div>
<div class="inte-info">
<div class="inte-name">线性</div>
<div class="inte-desc">连接 Linear 工作区将问题委派给云代理</div>
</div>
<d-button class="connect-btn" variant="outline">连接 <i class="d-icon d-icon-link-external"></i></d-button>
</div>
</div>
<div class="upgrade-card">
<div class="upgrade-text">
<div class="upgrade-title">升级以解锁云代理</div>
<div class="upgrade-subtitle">升级至云代理无限次完成MAX模式等功能</div>
</div>
<d-button class="trial-btn">免费试用7天</d-button>
</div>
<div class="api-section">
<div class="section-title">用户 API 密钥</div>
<p class="api-description">
用户 API 密钥提供对您的 金银湖大模型 账户的安全程序化访问权限包括 **金银湖大模型 Agent CLI** 的无头版本和 **Cloud Agent API**请像对待密码一样妥善保管它们确保其安全切勿公开分享注意<span class="highlight-text">Cloud Agent API 目前处于测试阶段</span>
</p>
<div class="api-card">
<div class="api-status">
<div class="status-icon">🔑</div>
<div class="status-text">
<div class="status-title">暂无 API 密钥</div>
<div class="status-subtitle">尚未创建任何 API 密钥</div>
</div>
</div>
<d-button class="new-key-btn">
<i class="d-icon d-icon-add"></i> + API 密钥
</d-button>
</div>
</div>
<div class="env-section">
<div class="env-header">
<div class="section-title">全局环境变量</div>
<d-button class="reset-btn" variant="outline"><i class="d-icon d-icon-refresh"></i> 重置密钥</d-button>
</div>
<p class="env-description">
将密钥作为环境变量注入到后台云代理环境中您的密钥将覆盖团队的密钥
</p>
<div class="env-status-card">
<div class="status-left">
<div class="status-title">目前还没有任何秘钥</div>
<div class="status-subtitle">添加或导入 .env 文件以用作后台代理远程的环境变量</div>
</div>
<d-button class="add-env-btn">添加秘钥</d-button>
</div>
</div>
</div>
</d-content>
</template>
<script setup lang="ts">
// 静态页面,无需特殊逻辑
</script>
<style lang="scss" scoped>
/* 定义核心暗色变量 */
$bg-primary: #1e1e1e;
$bg-secondary: #141414;
$text-primary: #eaeaea;
$text-secondary: #aaaaaa;
$border-color: #333333;
$highlight-blue: #4a90e2; // 链接/主要按钮颜色
$highlight-yellow: #f5a623; // 黄色提示
$upgrade-bg: #222222; // 升级卡片背景色
$button-bg: #444444; // 试用按钮背景色
.content-area {
background-color: rgb(20, 18, 11);
padding: 40px 60px;
//overflow-y: auto;
}
.cloud-agent-page {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background-color: $bg-secondary;
min-height: 100vh;
padding: 40px;
}
.agent-container {
//max-width: 800px;
margin: 0 auto;
}
/* --- 基础结构样式 --- */
.header {
margin-bottom: 30px;
.main-title {
font-size: 28px;
font-weight: 500;
color: $text-primary;
display: block;
margin-bottom: 4px;
}
.subtitle {
font-size: 13px;
color: $text-secondary;
}
}
.section-title {
font-size: 14px;
font-weight: 600;
color: $text-secondary;
margin-top: 30px;
margin-bottom: 8px;
}
.integration-list {
display: flex;
flex-direction: column;
gap: 10px;
}
.integration-item {
background-color: $bg-primary;
border-radius: 8px;
padding: 16px 24px;
display: flex;
align-items: center;
}
.inte-icon {
width: 24px;
height: 24px;
margin-right: 16px;
display: flex;
align-items: center;
flex-shrink: 0;
}
.inte-info {
flex-grow: 1;
margin-right: 20px;
}
.inte-name {
font-size: 16px;
font-weight: 500;
color: $text-primary;
margin-bottom: 4px;
}
.inte-desc {
font-size: 13px;
color: $text-secondary;
}
.connect-btn {
height: 32px;
padding: 0 16px;
border-radius: 6px;
font-size: 13px;
font-weight: 500;
color: $text-secondary !important;
border-color: $border-color !important;
background: transparent !important;
.d-icon-link-external {
margin-left: 5px;
}
}
.disabled-btn {
background-color: #2b2b2b !important;
color: #666666 !important;
border: 1px solid #444444 !important;
cursor: not-allowed;
}
/* --- 升级卡片 --- */
.upgrade-card {
background-color: $upgrade-bg;
border-radius: 8px;
padding: 20px 24px;
margin-top: 20px;
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #383838;
}
.upgrade-title {
font-size: 16px;
font-weight: 500;
color: $text-primary;
margin-bottom: 4px;
}
.upgrade-subtitle {
font-size: 13px;
color: $text-secondary;
}
.trial-btn {
background-color: $button-bg !important;
color: $text-primary !important;
border: none;
height: 36px;
padding: 0 18px;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
&:hover {
background-color: darken($button-bg, 5%) !important;
}
}
.api-section {
padding-top: 10px; /* 调整间距 */
}
.api-description {
font-size: 13px;
color: $text-secondary;
line-height: 1.6;
margin-bottom: 20px;
.highlight-text {
color: $highlight-yellow;
}
}
.api-card {
background-color: $bg-primary;
border-radius: 8px;
border: 1px solid $border-color;
padding: 20px 24px;
display: flex;
justify-content: space-between;
align-items: center;
}
.api-status {
display: flex;
align-items: center;
}
.status-icon {
font-size: 24px;
margin-right: 16px;
}
.status-title {
font-size: 16px;
font-weight: 500;
color: $text-primary;
}
.status-subtitle {
font-size: 13px;
color: $text-secondary;
}
.new-key-btn {
background-color: $highlight-blue !important;
color: $text-primary !important;
border: none;
height: 36px;
padding: 0 18px;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
.d-icon-add {
margin-right: 4px;
}
}
/* --- 环境变量部分 --- */
.env-section {
padding-bottom: 40px;
}
.env-header {
display: flex;
justify-content: space-between;
align-items: flex-end;
.section-title {
margin-top: 40px;
margin-bottom: 0;
}
}
.reset-btn {
height: 32px;
padding: 0 16px;
border-radius: 6px;
font-size: 13px;
color: $text-secondary !important;
border-color: $border-color !important;
background: transparent !important;
.d-icon-refresh {
margin-right: 4px;
}
}
.env-description {
font-size: 13px;
color: $text-secondary;
line-height: 1.6;
margin-top: 8px;
margin-bottom: 20px;
}
.env-status-card {
background-color: $bg-primary;
border-radius: 8px;
border: 1px solid $border-color;
padding: 20px 24px;
display: flex;
justify-content: space-between;
align-items: center;
.status-left {
// 覆盖 API 密钥部分的样式,使其更贴合图片
.status-title {
font-size: 14px;
margin-bottom: 4px;
}
.status-subtitle {
font-size: 13px;
}
}
}
.add-env-btn {
background-color: #333333 !important;
color: $text-primary !important;
border: 1px solid #555 !important;
height: 36px;
padding: 0 18px;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
&:hover {
background-color: #444444 !important;
}
}
</style>

View File

@@ -0,0 +1,241 @@
<template>
<d-modal
:modelValue="visible"
title="隐私设置"
:close-on-click-overlay="true"
:show-close="true"
@close="$emit('update:visible', false)"
class="TeamSetupModal"
>
<p class="modal-subtitle">
选择 Cursor 如何存储和使用数据您可以随时修改此设置<a href="#" class="learn-more-link">了解更多</a>
</p>
<div class="modal-body">
<div class="setting-option" :class="{ 'is-selected': selectedMode === 'private' }" @click="selectedMode = 'private'">
<div class="option-content">
<div class="option-header">
<span class="mode-title">隐私模式</span>
</div>
<p class="mode-description">无需训练代码可能存储用于云代理团队规则和其他功能</p>
</div>
<div class="radio-indicator">
<div class="custom-radio" :class="{ 'is-checked': selectedMode === 'private' }">
<svg v-if="selectedMode === 'private'" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
<polyline points="20 6 9 17 4 12"></polyline>
</svg>
</div>
</div>
</div>
<div class="setting-option" :class="{ 'is-selected': selectedMode === 'shared' }" @click="selectedMode = 'shared'">
<div class="option-content">
<div class="option-tag">1小时后激活</div>
<p class="mode-description">代码数据共享旨在帮助所有人改进 Cursor</p>
</div>
<div class="radio-indicator">
<div class="custom-radio" :class="{ 'is-checked': selectedMode === 'shared' }">
<svg v-if="selectedMode === 'shared'" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
<polyline points="20 6 9 17 4 12"></polyline>
</svg>
</div>
</div>
</div>
<div class="toggle-more" @click="showMore = !showMore">
<span>{{ showMore ? '收起选项' : '更多选项' }}</span>
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" :style="{ transform: showMore ? 'rotate(180deg)' : 'rotate(0deg)' }">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</div>
<div v-if="showMore" class="setting-option more-option" :class="{ 'is-selected': selectedMode === 'legacy' }" @click="selectedMode = 'legacy'">
<div class="option-content">
<div class="option-header">
<span class="mode-title">隐私模式 (传统版)</span>
</div>
<p class="mode-description">不提供训练或存储禁用云代理和其他需要代码存储的功能</p>
</div>
<div class="radio-indicator">
<div class="custom-radio" :class="{ 'is-checked': selectedMode === 'legacy' }">
<svg v-if="selectedMode === 'legacy'" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
<polyline points="20 6 9 17 4 12"></polyline>
</svg>
</div>
</div>
</div>
</div>
<template #footer>
<div class="modal-footer-actions">
<d-button class="finish-btn" @click="handleFinish">完成</d-button>
</div>
</template>
</d-modal>
</template>
<script setup lang="ts">
import { ref,defineProps,defineEmits } from 'vue';
const props = defineProps({
visible: {
type: Boolean,
default: false
}
});
const emit = defineEmits(['update:visible', 'mode-selected']);
const selectedMode = ref('shared');
const showMore = ref(false);
const handleFinish = () => {
emit('mode-selected', selectedMode.value);
emit('update:visible', false);
};
</script>
<style lang="scss" scoped>
.modal-custom-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 10px;
margin-left: 16px;
}
.modal-title {
font-size: 24px;
font-weight: 700;
color: #fff;
}
.modal-subtitle {
font-size: 14px;
color: #aaa;
line-height: 1.5;
margin-bottom: 20px;
}
.learn-more-link {
color: #58a6ff; /* 蓝色链接 */
text-decoration: none;
}
/* ------------------- 选项卡样式 ------------------- */
.setting-option {
background-color: #1a1a1a; /* 保持背景一致 */
border: 1px solid #333;
border-radius: 8px;
padding: 16px;
margin-bottom: 12px;
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: flex-start;
transition: border-color 0.2s, background-color 0.2s;
}
.setting-option.is-selected {
border-color: #58a6ff; /* 选中时边框变蓝 */
background-color: #252525; /* 选中时背景略深 */
}
.setting-option.more-option {
margin-top: 12px;
}
.option-content {
flex-grow: 1;
padding-right: 15px;
}
.option-header {
display: flex;
align-items: center;
margin-bottom: 4px;
}
.mode-title {
font-size: 16px;
font-weight: 600;
color: #fff;
}
.mode-description {
font-size: 13px;
color: #aaa;
line-height: 1.4;
}
.option-tag {
display: inline-block;
background-color: #333;
color: #fff;
font-size: 11px;
padding: 2px 6px;
border-radius: 4px;
margin-bottom: 8px; /* 标签在描述之上 */
}
.radio-indicator {
width: 24px;
height: 24px;
display: flex;
justify-content: center;
align-items: center;
flex-shrink: 0;
}
.custom-radio {
width: 20px;
height: 20px;
border-radius: 50%;
border: 2px solid #555;
display: flex;
justify-content: center;
align-items: center;
transition: border-color 0.2s;
}
.custom-radio.is-checked {
border-color: #58a6ff; /* 选中时外圈变蓝 */
background-color: #58a6ff; /* 填充蓝色 */
}
.custom-radio.is-checked svg {
color: #fff; /* 勾选图标为白色 */
}
.toggle-more {
display: flex;
align-items: center;
justify-content: flex-start;
font-size: 14px;
color: #58a6ff;
cursor: pointer;
margin-top: 20px;
margin-bottom: 12px;
padding: 5px 0;
}
.toggle-more span {
margin-right: 5px;
}
.toggle-more svg {
transition: transform 0.3s;
}
.modal-footer-actions {
display: flex;
justify-content: flex-end;
margin-right: 24px;
margin-bottom: 24px;
}
.finish-btn {
background-color: #fff !important;
color: #000 !important;
border: none !important;
padding: 8px 20px;
font-size: 14px;
font-weight: 600;
border-radius: 6px;
}
</style>

View File

@@ -0,0 +1,358 @@
<template>
<d-content class="content-area">
<div class="settings-container">
<div class="header">设置</div>
<div class="section-title">隐私</div>
<div class="setting-block">
<div class="setting-item">
<div class="item-content">
<div class="item-header">
<span class="item-title">共享数据</span>
<span class="status-tag">1小时后激活</span>
</div>
<p class="item-description">您的代码库提示编辑和其他使用数据将被 金银湖大模型 存储和训练以改进产品</p>
</div>
<d-button class="action-btn edit-btn" @click="showPrivacyModal = true">编辑</d-button>
</div>
<PrivacySettingsModal v-model:visible="showPrivacyModal" @mode-selected="handleModeChange"/>
<div class="info-note">
<span class="highlight-text">首次使用时数据共享功能将暂停</span>共享功能将在1小时后激活<a href="#" class="learn-more">了解更多</a>
</div>
</div>
<div class="section-title">学生验证</div>
<div class="setting-block">
<div class="setting-item">
<div class="item-content">
<div class="item-header">
<span class="item-title">学生身份</span>
</div>
<p class="item-description">只有 .edu 邮箱和特定教育领域人才可进行学生身份验证</p>
</div>
<d-button class="action-btn disabled-btn" disabled>不符合条件</d-button>
</div>
</div>
<div class="section-title">活跃会话</div>
<div class="setting-block">
<div class="setting-item">
<div class="item-content session-content">
<div class="custom-checkbox"></div>
<div>
<div class="item-header">
<span class="item-title">网站</span>
</div>
<p class="item-description">创建于 6 天前</p>
</div>
</div>
<d-popover :visible="revokePopoverVisible" trigger="click" @visible-change="toggleRevokePopover">
<d-button class="action-btn revoke-btn">撤销</d-button>
<template #content>
<div class="popover-content">
<p>确定撤销当前会话吗</p>
<footer>
<d-button @click="toggleRevokePopover(false)" size="sm">取消</d-button>
<d-button @click="confirmRevoke" size="sm" variant="solid">确认</d-button>
</footer>
</div>
</template>
</d-popover>
</div>
<div class="session-note">
撤销会话可能需要最多 10 分钟才能完成
</div>
</div>
<div class="section-title">更多的</div>
<div class="setting-block">
<div class="setting-item">
<div class="item-content">
<div class="item-header">
<span class="item-title">删除账户</span>
</div>
</div>
<d-popover :visible="deletePopoverVisible" trigger="click" @visible-change="toggleDeletePopover">
<d-button class="action-btn delete-btn">删除</d-button>
<template #content>
<div class="popover-content delete-popover">
<p>
<strong>警告</strong>删除账户将不可逆转您确定要继续吗
</p>
<footer>
<d-button @click="toggleDeletePopover(false)" size="sm">取消</d-button>
<d-button @click="confirmDelete" size="sm" color="danger" variant="solid">确认删除</d-button>
</footer>
</div>
</template>
</d-popover>
</div>
</div>
</div>
</d-content>
</template>
<script setup lang="ts">
import {ref} from 'vue';
import PrivacySettingsModal from './PrivacySettingsModal.vue';
const showPrivacyModal = ref(false);
// Popover 状态
const revokePopoverVisible = ref(false);
const deletePopoverVisible = ref(false);
const handleModeChange = (newMode: string) => {
console.log("新的隐私模式已选择:", newMode);
// 在这里执行更新后端或前端状态的逻辑
};
// --- 撤销会话逻辑 ---
const toggleRevokePopover = (visible: boolean) => {
revokePopoverVisible.value = visible;
};
const confirmRevoke = () => {
console.log("会话已确认撤销!");
// 实际的撤销 API 调用逻辑
revokePopoverVisible.value = false;
};
// --- 删除账户逻辑 ---
const toggleDeletePopover = (visible: boolean) => {
deletePopoverVisible.value = visible;
};
const confirmDelete = () => {
console.log("账户已确认删除!");
// 实际的删除账户 API 调用逻辑
deletePopoverVisible.value = false;
};
</script>
<style lang="scss" scoped>
/* 定义核心暗色变量 */
$bg-primary: #1e1e1e;
$bg-secondary: #141414;
$text-primary: #ffffff;
$text-secondary: #aaaaaa;
$border-color: #333333;
$highlight-orange: #f5a623;
$delete-red: #a93b4d;
.content-area {
background-color: rgb(20, 18, 11);
padding: 40px 60px;
}
.settings-page {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background-color: $bg-secondary;
min-height: 100vh;
padding: 40px;
}
.settings-container {
margin: 0 auto;
}
/* --- 基础结构样式 --- */
.header {
font-size: 28px;
font-weight: 500;
color: $text-primary;
margin-bottom: 30px;
}
.section-title {
font-size: 14px;
font-weight: 600;
color: $text-secondary;
margin-top: 24px;
margin-bottom: 8px;
}
.setting-block {
background-color: $bg-primary;
border-radius: 8px;
border: 1px solid $border-color;
overflow: hidden;
}
/* --- 列表项样式 --- */
.setting-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 24px;
border-bottom: 1px solid $border-color;
&:last-child {
border-bottom: none;
}
}
.item-content {
flex-grow: 1;
}
.item-header {
display: flex;
align-items: center;
margin-bottom: 4px;
}
.item-title {
font-size: 16px;
font-weight: 500;
color: $text-primary;
margin-right: 12px;
}
.status-tag {
background-color: #333333;
color: $text-secondary;
font-size: 12px;
padding: 2px 8px;
border-radius: 4px;
}
.item-description {
font-size: 13px;
color: $text-secondary;
margin: 0;
line-height: 1.5;
}
/* --- 信息和提示样式 --- */
.info-note, .session-note {
font-size: 13px;
color: $text-secondary;
padding: 12px 24px;
border-top: 1px solid $border-color;
}
.info-note {
border-top: none;
background-color: darken($bg-primary, 2%);
.highlight-text {
color: $highlight-orange;
}
.learn-more {
color: #4a90e2;
text-decoration: none;
margin-left: 4px;
&:hover {
text-decoration: underline;
}
}
}
.session-note {
border-top: 1px solid $border-color;
}
/* --- 按钮样式 --- */
.action-btn {
height: 32px;
padding: 0 16px;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
/* 默认按钮 (编辑/撤销) - 灰色背景 */
&.edit-btn, &.revoke-btn {
background-color: #333333 !important;
color: $text-primary !important;
border: none;
&:hover {
background-color: #444444 !important;
}
}
/* 删除按钮 - 红色背景 */
&.delete-btn {
background-color: $delete-red !important;
color: $text-primary !important;
border: none;
&:hover {
background-color: darken($delete-red, 5%) !important;
}
}
/* 不符合条件 (Disabled) */
&.disabled-btn {
background-color: #333333 !important;
color: #666666 !important;
border: 1px solid #444444 !important;
cursor: not-allowed;
&::before {
content: '🗋 ';
margin-right: 4px;
font-size: 16px;
}
}
}
/* --- 活跃会话区域定制 --- */
.session-content {
display: flex;
align-items: center;
gap: 16px;
}
.custom-checkbox {
width: 18px;
height: 18px;
border: 1px solid $border-color;
border-radius: 4px;
background-color: #222;
cursor: pointer;
}
/* 🚀 Popover 内容样式 */
.popover-content {
padding: 8px 12px;
//color: #333; /* Popover 默认是白色背景 */
max-width: 200px;
p {
margin: 0 0 10px 0;
font-size: 13px;
line-height: 1.4;
}
footer {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 8px;
}
// 适配删除 Popover 的警告文字
&.delete-popover {
p {
color: #CC0000; /* 警告文字红色 */
}
}
}
</style>

View File

@@ -0,0 +1,281 @@
<template>
<d-content class="content-area">
<div class="usage-container">
<div class="control-bar">
<d-range-date-picker-pro
v-model="rangeDatePickerProValue"
:maxDate="today"
:format="dateFormat"
:placeholder="['开始日期', '结束日期']"
class="dark-picker"
/>
<div class="filter-tabs-container">
<d-tabs type="slider" v-model="activeDaysStr" class="custom-tabs-group time-tabs">
<d-tab id="1天" title="1天"></d-tab>
<d-tab id="7天" title="7天"></d-tab>
<d-tab id="30天" title="30天"></d-tab>
</d-tabs>
</div>
<d-button class="export-btn" variant="text">
<i class="d-icon icon-download"></i> 导出 CSV 文件
</d-button>
</div>
<div class="data-content">
<div class="no-events-found">
<p class="main-text">No Events Found</p>
<p class="sub-text">No usage events found for the selected filters</p>
</div>
</div>
</div>
</d-content>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue';
// 辅助函数:根据天数设置日期范围
const today = new Date();
today.setHours(23, 59, 59, 999); // 确保 maxDate 覆盖今天全天
const getRangeByDays = (days: number): Date[] => {
const endDate = new Date(today); // 确保结束日期是今天
const startDate = new Date(today);
// 注意:如果是 1天实际是今天这 24小时所以减 1 天
startDate.setDate(today.getDate() - (days - 1));
startDate.setHours(0, 0, 0, 0); // 开始日期从当天 0点开始
return [startDate, endDate];
};
const dateFormat = 'MM月DD日';
// 默认值30天
const rangeDatePickerProValue = ref<Date[]>(getRangeByDays(30));
const activeTag = ref('Bug Bot');
const activeDaysStr = ref('30天'); // 默认选中 30天
watch(activeDaysStr, (newVal) => {
let days: number;
// 从字符串 'X天' 中提取天数
switch (newVal) {
case '1天':
days = 1;
break;
case '7天':
days = 7;
break;
case '30天':
days = 30;
break;
default:
return;
}
// 更新日期范围
rangeDatePickerProValue.value = getRangeByDays(days);
});
</script>
<style lang="scss" scoped>
/* 定义核心暗色变量 */
$bg-secondary: #141414;
$bg-card: #1e1e1e;
$text-primary: #eaeaea;
$text-secondary: #aaaaaa;
$border-color: #333333;
$active-tag-bg: #444444;
.content-area {
background-color: rgb(20, 18, 11);
padding: 40px 60px;
//overflow-y: auto;
}
.usage-page {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background-color: $bg-secondary;
min-height: 100vh;
padding: 40px;
}
.usage-container {
//max-width: 1000px;
margin: 0 auto;
}
/* --- 顶部控制栏样式 --- */
.control-bar {
display: flex;
align-items: center;
gap: 16px;
padding-bottom: 20px;
border-bottom: 1px solid $border-color;
}
/* 日期范围选择器样式重写 (d-range-date-picker-pro) */
:deep(.d-range-date-picker-pro) {
width: 180px;
.devui-input-wrap, .devui-input-affix-wrapper {
background-color: $bg-card !important;
border: 1px solid $border-color !important;
border-radius: 6px !important;
height: 36px !important;
padding: 0 8px !important;
.devui-input {
color: $text-primary !important;
font-weight: 500 !important;
cursor: pointer !important;
padding: 0 4px !important;
}
}
.d-icon-calendar {
display: none !important;
}
.devui-separator {
color: $text-primary !important;
margin: 0 4px !important;
}
}
/* --- 筛选标签区域样式 (d-tabs) --- */
.filter-tabs-container {
display: flex;
gap: 8px; /* 保持两个 Tab 组之间的间隔 */
flex-grow: 1; /* 占据中间空间 */
}
// 统一对 Tab 组进行样式覆盖,以实现标签的外观
:deep(.custom-tabs-group) {
height: 36px; /* 保持与日期选择器高度一致 */
// 隐藏 Tab 的底部边框
.devui-nav-container {
border-bottom: none !important;
margin-bottom: 0 !important;
}
// 针对每个 Tab Item 进行样式覆盖
.devui-nav-item {
margin-right: 8px; /* 调整 Tab Item 之间的间距 */
}
// Tab 内容:实现卡片/标签样式
.devui-nav-item__link {
color: $text-primary !important;
background-color: $bg-card !important;
border: 1px solid $border-color !important;
border-radius: 6px !important;
padding: 6px 12px !important;
height: 36px;
line-height: 24px;
transition: none;
// 隐藏 slider 类型自带的底部滑块
&::after {
display: none !important;
}
// 鼠标悬停效果
&:hover {
border-color: #555555 !important;
}
}
// 选中 Tab 的样式
.devui-nav-item.active .devui-nav-item__link {
background-color: $active-tag-bg !important;
border-color: $active-tag-bg !important;
color: $text-primary !important;
}
}
/* 导出按钮样式 */
.export-btn {
color: $text-secondary !important;
font-size: 14px;
padding: 0 8px !important;
&:hover {
color: $text-primary !important;
}
.d-icon-upload {
font-size: 16px;
margin-right: 4px;
}
}
/* --- 数据内容区样式 --- */
.data-content {
background-color: $bg-card;
border-radius: 8px;
border: 1px solid $border-color;
margin-top: 20px;
height: 500px;
display: flex;
align-items: center;
justify-content: center;
}
.no-events-found {
text-align: center;
color: #666666;
.main-text {
font-size: 18px;
font-weight: 600;
margin-bottom: 8px;
}
.sub-text {
font-size: 14px;
}
}
:deep(.devui-range-date-picker-pro__range-picker) {
background-color: black;
.devui-input__wrapper {
background-color: black;
color: white;
.devui-input__inner {
color: white;
}
}
}
:deep(.devui-tabs__nav) {
background-color: black;
border-color: black;
}
:deep(.devui-tabs__nav--slider) {
li:first-child {
border-left-width: 0;
}
span {
color: white;
}
}
:deep(.devui-tab__content) {
margin-top: 0;
padding: 0;
}
</style>

View File

@@ -0,0 +1,149 @@
<template>
<div class="com-authority">
<!-- 主文案 -->
<h5 class="main-title wow xsddhxg animated" style="visibility: visible;">
准备好构建您的软件安全免疫系统了吗
</h5>
<!-- 描述文本 -->
<p class="sub-desc wow xsddhxg animated" style="visibility: visible;">
无论您是初创团队还是关基单位Tcode 灵活的订阅模式都能满足您的安全需求
</p>
<!-- 按钮组 -->
<div class="btn-group wow xsddhxg animated" style="visibility: visible;">
<a
class="btn-trial LNK"
@click="handleLogin('login')"
>
免费试用基础版
<span class="tag">面向中小企业</span>
</a>
<a
class="btn-custom LNK"
@click="handleLogin('login')"
>
联系专家定制方案
<span class="tag">面向大型关基单位</span>
</a>
</div>
</div>
</template>
<script setup lang="ts">
import {ref, onMounted, onBeforeUnmount, computed} from 'vue';
import {emitEvent} from "@/utils/eventBus";
const handleLogin = (type) => {
emitEvent('login', {type, triggerType: '主动注册'});
};
</script>
<style scoped lang="scss">
.com-authority {
background-color: #f5f5f5;
padding: 80px 20px; // 优化内边距,提升视觉效果
text-align: center;
}
// 主标题样式
.main-title {
color: #333;
font-size: 32px;
font-weight: 500;
letter-spacing: 1px;
line-height: 48px;
margin: 0 0 20px;
}
// 描述文本样式
.sub-desc {
color: #666;
font-size: 18px;
line-height: 30px;
margin: 0 0 40px;
max-width: 800px; // 限制宽度,避免文字过宽
margin-left: auto;
margin-right: auto;
}
// 按钮组样式
.btn-group {
display: flex;
justify-content: center;
align-items: center;
gap: 20px; // 按钮间距
flex-wrap: wrap; // 响应式换行
}
// 按钮通用样式
.btn-group a {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 16px 32px;
border-radius: 8px;
font-size: 16px;
font-weight: 500;
text-decoration: none;
transition: all 0.3s ease;
white-space: nowrap; // 防止文字换行
}
// 免费试用按钮样式
.btn-trial {
background-color: #4bad52;
color: #fff;
.tag {
font-size: 14px;
font-weight: 400;
margin-left: 8px;
opacity: 0.9;
}
&:hover {
background-color: #7aba4a;
transform: translateY(-2px); // 轻微上浮效果
box-shadow: 0 4px 12px rgba(75, 173, 82, 0.2); // 阴影增强
}
}
// 定制方案按钮样式
.btn-custom {
background-color: #fff;
color: #4bad52;
border: 1px solid #4bad52;
.tag {
font-size: 14px;
font-weight: 400;
margin-left: 8px;
opacity: 0.9;
}
&:hover {
background-color: #f0f9f1;
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(75, 173, 82, 0.1);
}
}
// 响应式适配(移动端)
@media (max-width: 768px) {
.main-title {
font-size: 24px;
line-height: 36px;
}
.sub-desc {
font-size: 16px;
line-height: 28px;
}
.btn-group a {
padding: 14px 24px;
font-size: 14px;
}
}
</style>

View File

@@ -0,0 +1,157 @@
<template>
<div class="com-authority"><h5 class="wow xsddhxg animated" style="visibility: visible;">屡获国际权威认证硬核技术驱动智能安全</h5>
<ul class="wow xsddhxg animated" style="visibility: visible;">
<li><img
src="http://chaitin-marketing-public.oss-cn-beijing.aliyuncs.com/images/2025/06/20/42f9989f44fb422db95349647b15409c">
<p class="num">/ 01</p>
<p class="title MultiLine">Tcode雷池WAF 软硬件市场营收规模国内安全厂商第一</p>
<p class="line"></p>
<p class="desc MultiLine">近日国际权威咨询机构 IDC 发布针对中国 Web 应用防火墙产品的市场份额系列研究报告报告显示 2024 年中国硬件 WAF 市场份额排名中Tcode科技以
10.6% 的市场份额跃居至第二全面领先于市场主流水平 2024 年私有云WAF市场份额排名中Tcode科技位列第三连续三年稳居前三持续占据领先地位与此同时2024 年国内 WAF
软硬件市场总营收规模Tcode科技位列安全厂商第一</p><a class="EASE btn-more LNK"
href="https://mp.weixin.qq.com/s/0oEiHBJuIALEcEcXqjK-iA" target="_blank">了解更多
<i class="EASE ICO ic-arow"></i></a></li>
<li><img
src="http://chaitin-bbs-test.oss-cn-beijing.aliyuncs.com/images/2025/01/06/94e1522a576e485abaa30473984a07db.jpg">
<p class="num">/ 02</p>
<p class="title MultiLine">攻防技术标杆Tcode荣获 Gartner 三项权威认可</p>
<p class="line"></p>
<p class="desc MultiLine">Tcode科技在攻击面管理ASM入侵和攻击模拟BAS云工作负载保护平台CWPP领域的技术被列入报告 Gartner 认可为推荐厂商Sample
Vendor</p><a class="EASE btn-more LNK" href="https://mp.weixin.qq.com/s/EKov7PEEhkyHP9tOd600hQ"
target="_blank">了解更多 <i class="EASE ICO ic-arow"></i></a></li>
<li><img
src="http://chaitin-bbs-test.oss-cn-beijing.aliyuncs.com/images/2025/01/03/6d7c4427b1874cb2950764d5ff12c9a0.jpg">
<p class="num">/ 03</p>
<p class="title MultiLine">安全咨询能力获认可Tcode入选国际权威报告</p>
<p class="line"></p>
<p class="desc MultiLine">全球权威咨询机构 Forrester 发布报告The Cybersecurity Consulting Services Landscape In Asia
Pacific, Q3 2023Tcode科技安全咨询服务得到国际权威专家的高度认可</p><a class="EASE btn-more LNK"
href="https://mp.weixin.qq.com/s/oFXXhpP2RjBAo6UWH5JVyQ"
target="_blank">了解更多 <i class="EASE ICO ic-arow"></i></a>
</li>
</ul>
</div>
</template>
<script>
export default {
name: "ComAuthority"
}
</script>
<style scoped lang="scss">
.com-authority {
background-color: #f5f5f5;
padding-bottom: 50px;
padding-top: 50px;
text-align: center
}
.com-authority h5 {
color: #333;
font-size: 28px;
font-weight: 400;
letter-spacing: 1.7px;
line-height: 40px
}
.com-authority ul {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
margin: 54px 0 0;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center
}
.com-authority li {
background: #fff;
border-radius: 24px;
-webkit-box-shadow: 0 2px 26px 7px rgba(50,50,50,.06);
box-shadow: 0 2px 26px 7px #3232320f;
list-style: none;
margin: 0 14px;
padding: 33px;
text-align: left;
width: 436px
}
.com-authority li img {
border-radius: 10px;
display: block;
height: 327px;
-o-object-fit: cover;
object-fit: cover;
width: 100%
}
.com-authority li .num {
color: #969696;
font-size: 14px;
font-weight: 400;
line-height: 20px;
margin: 47px 0 0
}
.com-authority li .title {
color: #333;
font-size: 20px;
font-weight: 400;
height: 60px;
letter-spacing: .5px;
line-height: 30px;
margin: 14px 0 0
}
.com-authority li .desc {
color: #4d4d4d;
font-size: 14px;
font-weight: 400;
height: 96px;
line-height: 24px;
-webkit-line-clamp: 4;
letter-spacing: .5px
}
.com-authority li .line {
background-color: #969696;
height: 2px;
margin: 21px 0 29px
}
.com-authority li .btn-more {
background-color: #4bad52;
border-radius: 8px;
color: #fff;
display: block;
height: 44px;
line-height: 44px;
margin: 20px 0 0;
text-align: center;
width: 155px
}
.com-authority li .btn-more:hover {
background-color: #7aba4a;
color: #fff
}
.com-authority li .btn-more:hover .ICO {
left: 15px
}
.com-authority li .btn-more .ICO {
left: 7px;
position: relative
}
.MultiLine {
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-word;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
</style>

View File

@@ -0,0 +1,91 @@
<template>
<div class="com-bank">
<!-- 第一组滚动从左到右对应原 duration: 222.105s -->
<Marquee
class="marquee-group"
:duration="222.105"
direction="normal"
:pause-on-hover="false"
:pause-on-click="false"
:iteration-count="Infinity"
>
<div class="bank-item">
<img src="@/assets/v3/brand/cm.jpg" alt="中国移动">
<img src="@/assets/v3/brand/gnzs.png" alt="国能智深">
<img src="@/assets/v3/brand/htkgjt.png" alt="航天科工">
<img style="height: 40px" src="@/assets/v3/brand/why.png" alt="武汉云计算">
<img src="@/assets/v3/brand/zyhlw.png" alt="中移互联网">
<img src="@/assets/v3/brand/zywq.png" alt="中移湾区">
<img src="@/assets/v3/brand/ynjf.png" alt="上海元年">
<img src="@/assets/v3/brand/qianxin.png" alt="奇安信">
<img src="@/assets/v3/brand/whrq.png" alt="武汉燃气">
<img src="@/assets/v3/brand/bjdftwx.png" alt="北京东方通网信">
<img src="@/assets/v3/brand/mfwl.png" alt="墨菲未来">
</div>
</Marquee >
<!-- 第二组滚动-->
<Marquee
class="marquee-group"
:duration="205.02"
direction="normal"
:pause-on-hover="false"
:pause-on-click="false"
:iteration-count="Infinity"
style="margin-top: 20px;"
>
<div class="bank-item">
<img src="@/assets/v3/brand/yakj.png" alt="亚信科技">
<img src="@/assets/v3/brand/ziran.png" alt="武汉自然资源城乡建设局">
<img style="height: 56px" src="@/assets/v3/brand/hkws.png" alt="海康威视">
<img style="height: 56px" src="@/assets/v3/brand/zgdx.png" alt="中国电信">
<img src="@/assets/v3/brand/csdn.png" alt="CSDN">
<img src="@/assets/v3/brand/gitcode.png" alt="GitCode">
<img src="@/assets/v3/brand/ht.png" alt="航天科工第三院">
<img src="@/assets/v3/brand/gjny.png" alt="国家能源">
<img src="@/assets/v3/brand/fenhuo.png" alt="烽火通信">
<img src="@/assets/v3/brand/cjb.png" alt="超聚变">
</div>
</Marquee>
</div>
</template>
<script>
import { Marquee } from 'vue-fast-marquee';
import 'vue-fast-marquee/style.css';
export default {
name: "ComBank",
}
</script>
<style lang="scss" scoped>
.com-bank {
background-color: #fff;
margin: 0 auto;
max-width: 1440px;
overflow: hidden; /* 隐藏滚动溢出部分 */
padding: 61px 0 71px;
width: 100%;
}
/* 滚动容器样式 */
.marquee-group {
width: 100%;
}
/* 图标容器样式 */
.bank-item {
display: flex;
align-items: center;
justify-content: center;
white-space: nowrap;
}
.bank-item img {
height: 66px;
margin: 8px 22px;
width: auto;
object-fit: contain;
}
</style>

View File

@@ -0,0 +1,482 @@
<template>
<div class="com-entry">
<div class="com-slider">
<div class="swiper swiper-creative swiper-3d" ref="swiperContainer">
<div class="swiper-wrapper">
<div class="swiper-slide" data-swiper-slide-index="0">
<div class="banner-container">
<div class="sImg">
<img src="@/assets/v3/bg3.png" class="bg-image" />
<div class="overlay-mask"></div>
</div>
<div class="content-wrapper">
<div class="title-group animate-up">
<h1 class="main-headline">
Tcode构建数字世界的<span class="gradient-text">免疫系统</span>
</h1>
<h2 class="sub-headline">
AI 驱动的软件供应链安全全链路治理平台
</h2>
</div>
<p class="description animate-up delay-1">
<span class="highlight">金银湖安全大模型</span>为核心打通
<span class="tech-tag">开源感知</span> -
<span class="tech-tag">代码审计</span> -
<span class="tech-tag">供应链治理</span> -
<span class="tech-tag">终端监测</span>
<br>全生命周期让每一行代码都可信可控可追溯
</p>
<div class="cta-group animate-up delay-2">
<button class="btn btn-primary" @click="handleLogin('login')">
<span class="btn-text">立即体验 SaaS </span>
<span class="btn-glow"></span>
</button>
<button class="btn btn-secondary" @click="handleLogin('login')">
<span class="btn-text">申请私有化演示</span>
</button>
</div>
</div>
</div>
</div>
<!-- <div class="swiper-slide" data-swiper-slide-index="1">-->
<!-- <div class="sVdo">-->
<!-- <video-->
<!-- class="full-bg-video"-->
<!-- loop muted autoplay-->
<!-- playsinline-->
<!-- src="@/assets/v3/ab622e07e5f14b23be0d5c2e620ea4be.mp4">-->
<!-- </video>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="swiper-slide" data-swiper-slide-index="2">-->
<!-- <div class="sImg">-->
<!-- <img src="@/assets/v3/09d1ab34dd334323a1bb50e4a298bcfb.jpg" />-->
<!-- </div>-->
<!-- </div>-->
</div>
<div class="swiper-button-prev swiper-button-white" ref="prevButton"></div>
<div class="swiper-button-next swiper-button-white" ref="nextButton"></div>
<div class="swiper-pagination" ref="paginationEl"></div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import {onMounted, ref,onBeforeUnmount} from 'vue';
import Swiper from 'swiper';
// 导入 Swiper 样式和模块
import 'swiper/swiper-bundle.css';
import { Navigation, Pagination, EffectCreative,Autoplay } from 'swiper/modules';
import {emitEvent} from "@/utils/eventBus";
const featureCards = [
{
title: 'SBOM 自动化分析',
description1: '生成标准 CycloneDX/SPDX',
description2: '物料清单,透视组件资产。',
link: '/sbom-analysis',
linkText: '[了解详情 >]',
},
{
title: '供应链漏洞检测分析',
description1: '深度解析依赖树,精准定位',
description2: 'CVE 漏洞与传播路径。',
link: '/supply-chain-vulnerability',
linkText: '[了解详情 >]',
},
{
title: '恶意代码投毒检测',
description1: '识别依赖混淆、组件篡改',
description2: '及后门植入攻击。',
link: '/malware-detection',
linkText: '[了解详情 >]',
},
];
// 1. 定义 ref 引用到 DOM 元素
const swiperContainer = ref(null);
const prevButton = ref(null);
const nextButton = ref(null);
const paginationEl = ref(null);
let mySwiper = null;
onMounted(() => {
if (swiperContainer.value) {
// 2. 初始化 Swiper 实例
new Swiper(swiperContainer.value, {
// 3. 注册使用的模块(必须)
modules: [Navigation, Pagination, EffectCreative,Autoplay],
// 4. 配置 Swiper 选项
loop: true, // 确保轮播循环
// 5. 配置 3D Creative 效果(必须)
effect: 'creative',
creativeEffect: {
prev: {
shadow: true,
translate: ['-100%', 0, -1],
},
next: {
translate: ['100%', 0, -1],
},
},
// 6. 配置 Navigation (导航按钮)
navigation: {
// 使用 ref 引用或 CSS 类名指向按钮元素
nextEl: nextButton.value, // 使用 ref 引用更精确
prevEl: prevButton.value, // 使用 ref 引用更精确
// 也可以使用: nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev',
// 但使用 ref 在 Vue 中更稳定。
},
// 7. 配置 Pagination (分页器)
pagination: {
el: paginationEl.value, // 使用 ref 引用指向分页器容器
clickable: true, // 确保点击分页点可以切换
},
// 自动播放(可选,如果需要)
autoplay: {
delay: 4000,
disableOnInteraction: false,
},
// 其他配置,如速度、初始化索引等...
initialSlide: 2, // 假设您想从 index=2 的 Slide 开始
});
}
});
const handleLogin = (type) => {
emitEvent('login', {type, triggerType: '主动注册'});
};
onBeforeUnmount(() => {
if (mySwiper) {
mySwiper.destroy();
}
});
</script>
<style scoped lang="scss">
.com-entry {
position: relative
}
.com-entry .entry-in {
background: #9696964d;
border-radius: 12px;
bottom: 68px;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
left: 50%;
padding: 34px 0;
position: absolute;
-webkit-transform: translate(-50%);
transform: translate(-50%);
z-index: 2
}
.com-entry .entry-in li {
border-right: 1px solid #979797;
font-size: 14px;
font-weight: 400;
line-height: 22px;
list-style: none;
padding: 7px 36px 0 40px;
width: 314px
}
.com-entry .entry-in li .ic-arow {
left: 0;
position: relative
}
.com-entry .entry-in li:hover h5 {
color: #fff
}
.com-entry .entry-in li:hover a {
color: #4bad52
}
.com-entry .entry-in li:hover .ic-arow {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAWCAMAAADgvdz9AAAAAXNSR0IArs4c6QAAAKhQTFRFAAAAAP8AgICAVapVVapVSbZJQJ9gRqJdSaRbUa5RRq5RTKpVSa1SSK9QSa9QSq5RSKpVS65RTK5RS6tUSa5RSa9QSqxTTK5RS6xTS6xTTKxTTK1SS65RS61SSq1STKxTS61SS61SSq1STK1SS65RS61SSq1SSq5RS61SS6xTS65RS61SS61SS61SS61SS61SS61SS61SS61SS61SS61SS61SS61SS61SEkaAMAAAADd0Uk5TAAECAwYHCAsOExYbHCAjJicsOTpCSVlhYmlyeYGCiZGSmaGiqbGyucjP1dze4Obq7/L1+Pv8/muR6mgAAACNSURBVHichZLXDoJQEERXUBALRcGuFEWl2p3//zMTY+LL3b3zeiZbh+gv1yRBvbqMBOxXwCngeXd1xSsd8AYneeK2toQOR6CZdXhDWADnKc+NRQscxrzB3t7x2PV5w2j/xmVpEnngVUY6rNYw+xVXjrYRRjPm0mLfs0wY6OfCUZ1YeIn8UE0cNGFSRfEDg08bjv6UEeIAAAAASUVORK5CYII=);
left: 10px
}
.com-entry .entry-in li:last-child {
border: none
}
.com-entry .entry-in li h5 {
color: #4bad52;
font-size: 20px;
font-weight: 400;
letter-spacing: .5px;
line-height: 30px;
margin: 0 0 19px
}
.com-entry .entry-in li .txt {
font-size: 14px;
font-weight: 400;
height: 48px;
letter-spacing: .5px;
line-height: 24px
}
.com-slider {
background-color: #0c0c0f
}
.com-slider .swiper-slide {
background-position: top;
background-repeat: no-repeat;
background-size: cover;
cursor: pointer;
height: 540px
}
.com-slider .swiper-slide .sVdo {
height: 100%;
position: relative;
width: 100%
}
.com-slider .swiper-slide .sVdo video {
max-height: 900px;
width: 100%
}
.com-slider .swiper-slide .sVdo .btn-play {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAAXNSR0IArs4c6QAAALdQTFRFAAAA////////////////////////////////////////////////////////////////////////////////////////+/379/v49Pr08/rz7vfv6vXr6fXq2O3a1+3Zz+nRxeXHxOTHu+C+ut+9pdaopNanmtGemdGdmNCckM2Uj8yUhsiKhceKfMOBe8OAabtvabtuaLpuZ7ptYrhoXLViWbNgV7JeVrJdT69WT69VTK5TS61ST2RNRwAAABZ0Uk5TAAEJDBYXI1Jyf4KDpaqrv9PZ6PLz/pJYTDUAAAEkSURBVHjanZXHcsMwDERXJbKoqItiepzi9N6chv//rlwyMnvo7JF4QwxAYAkoyvKy6QbeNWWewam0aIWktkitWMK40MRZYnKzXljUzzQsYqOwamSRzMW1cKqKpfsq4VG9upMJr9hUx+gHx9+Kkl78oT4xEl8uz7dcyVO5z59ET3MT5CmATfmEiOj7YtsgCwCtDhK9HulgC2TCBImudzQyQ24F6e1YBXOUdpDodk8OlGhcIL2fSoEGnRMkut+fAh24B6TnKTBg8IEvEuhL/XAgpXYX87FQinG2505rj6vhJ3rD7U94s2s8YfBQhI+ZMrhfRI+HjsFVVuFqeeZchfDlCl7XcANAVPu4SrKp2GM+dfwf2ws30jWsGcBGmNmvvg9u+z5+AJMEhmRVU6aXAAAAAElFTkSuQmCC) no-repeat 50%;
background-size: 100% 100%;
height: 30px;
left: 50%;
position: absolute;
top: 50%;
width: 30px
}
.com-slider .swiper-slide .sImg {
background-position: top;
background-repeat: no-repeat;
background-size: cover;
height: 100%;
width: 100%
}
.MultiLine {
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-word;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.ic-arow {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAWCAMAAADgvdz9AAAAAXNSR0IArs4c6QAAALdQTFRFAAAA////////////////////6urq6+vr8vLy8/Pz6urq6+vr7e3t7+/v7e3t8fHx8fHx7e3t8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw7+/v8PDw8PDw8PDw8PDw8PDw8PDw7+/v7+/v8PDw8PDw7+/v8PDw8PDw8PDw8PDw7+/v7+/v8PDw7+/v7+/v7+/v7+/v7+/v8PDw7+/v7+/v7+/v7+/v8PDw7+/v7+/v7+/v7+/v4uiVIAAAADx0Uk5TAAECAwYHDA0UFRgZHR8qNTc4RlNUVldkZWZnc3R2d4SGh5OUlpekpqe2t8PExsvR093f5+nw8fb3+/z+BY9v3gAAAJtJREFUKM99UkcWglAQ+wKKDcGGXVTsXbGT+5/L0Y0bM9kmb14miTE/eFmjILM/NxW6dAB2Vc5b7QRYeFyQi+54jFwuKM9TXDo2F/hb4FhTPDZOwKrCead/xWta4IJ8/MRtIDG54JCYVDpkxydyfEg6cHpibcas1eWxNXvM3yixfEPt2kolY1KJ1UqQLlmhxc8cAm1MoTa2P1N8A11AHbmJaAv2AAAAAElFTkSuQmCC);
margin: 10px 0 0;
width: 16px;
}
.ic-arow, .ic-down {
display: inline-block;
height: 12px;
}
.EASE {
-webkit-transition: all .4s ease-out;
transition: all .4s ease-out;
}
.ICO {
background-position: 50%;
background-repeat: no-repeat;
background-size: 100% 100%;
}
.banner-container {
position: relative;
width: 84vw;
margin: 0 auto;
height: 540px;
overflow: hidden;
font-family: 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;
/* 背景图样式优化 */
.sImg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
}
.bg-image {
width: 100%;
height: 100%;
//object-fit: cover; /* 确保图片覆盖整个区域且不变形 */
object-position: center top;
}
/* 暗色遮罩:防止背景过亮导致文字看不清 */
.overlay-mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(circle at center, rgba(0,0,0,0.2) 0%, rgba(0,0,0,0.6) 100%);
}
/* 内容层布局 */
.content-wrapper {
position: relative;
z-index: 10; /* 确保内容在背景之上 */
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
color: #ffffff;
padding: 0 20px;
//margin-top: -50px; /* 视觉微调,稍微向上提一点 */
}
/* 标题样式 */
.main-headline {
font-size: 64px;
font-weight: 700;
letter-spacing: 2px;
margin-bottom: 16px;
text-shadow: 0 4px 10px rgba(0, 0, 0, 0.5);
.gradient-text {
/* 科技感蓝紫渐变 */
background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-weight: 800;
}
}
.sub-headline {
font-size: 32px;
font-weight: 400;
color: #e0e0e0;
margin-bottom: 40px;
letter-spacing: 1px;
}
/* 描述文字样式 */
.description {
font-size: 18px;
line-height: 1.8;
color: #cccccc;
max-width: 800px;
margin-bottom: 60px;
.highlight {
color: #fff;
font-weight: bold;
color: #4facfe;
}
.tech-tag {
display: inline-block;
padding: 0 4px;
font-weight: 500;
color: #fff;
}
}
/* 按钮组样式 */
.cta-group {
display: flex;
gap: 30px;
}
.btn {
position: relative;
padding: 14px 40px;
font-size: 18px;
font-weight: 600;
border-radius: 50px;
cursor: pointer;
transition: all 0.3s ease;
overflow: hidden;
letter-spacing: 1px;
}
/* 主要按钮SaaS 体验 (高亮) */
.btn-primary {
background: linear-gradient(90deg, #2b5876 0%, #4e4376 100%);
border: 1px solid rgba(255, 255, 255, 0.2);
color: white;
box-shadow: 0 0 20px rgba(78, 67, 118, 0.4);
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 0 30px rgba(78, 67, 118, 0.6);
background: linear-gradient(90deg, #356b8f 0%, #5f5291 100%);
}
/* 次要按钮:私有化演示 (玻璃拟态/描边) */
.btn-secondary {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.5);
color: white;
}
.btn-secondary:hover {
background: rgba(255, 255, 255, 0.2);
border-color: #fff;
transform: translateY(-2px);
}
/* 简单的入场动画 */
.animate-up {
animation: fadeInUp 1s ease-out forwards;
opacity: 0;
transform: translateY(30px);
}
.delay-1 { animation-delay: 0.2s; }
.delay-2 { animation-delay: 0.4s; }
@keyframes fadeInUp {
to {
opacity: 1;
transform: translateY(0);
}
}
/* 响应式适配 */
@media (max-width: 768px) {
.banner-container { height: 800px; }
.main-headline { font-size: 36px; }
.sub-headline { font-size: 20px; }
.cta-group { flex-direction: column; gap: 15px; }
}
}
</style>

View File

@@ -0,0 +1,497 @@
<template>
<div class="com-entry">
<div class="com-slider">
<div class="swiper swiper-creative swiper-3d" ref="swiperContainer">
<div class="swiper-wrapper">
<div class="swiper-slide" data-swiper-slide-index="0">
<div class="banner-container">
<div class="sImg">
<img src="@/assets/v3/bg3.png" class="bg-image" />
<div class="overlay-mask"></div>
</div>
<div class="content-wrapper">
<div class="title-group animate-up">
<h1 class="main-headline">
Tcode构建数字世界的<span class="gradient-text">免疫系统</span>
</h1>
<h2 class="sub-headline">
AI 驱动的软件供应链安全全链路治理平台
</h2>
</div>
<p class="description animate-up delay-1">
<span class="highlight">金银湖安全大模型</span>为核心打通
<span class="tech-tag">开源感知</span> -
<span class="tech-tag">代码审计</span> -
<span class="tech-tag">供应链治理</span> -
<span class="tech-tag">终端监测</span>
<br>全生命周期让每一行代码都可信可控可追溯
</p>
<div class="cta-group animate-up delay-2">
<button class="btn btn-primary" @click="handleLogin('login')">
<span class="btn-text">立即体验 SaaS </span>
<span class="btn-glow"></span>
</button>
<button class="btn btn-secondary" @click="handleLogin('login')">
<span class="btn-text">申请私有化演示</span>
</button>
</div>
</div>
</div>
</div>
<div class="swiper-slide" data-swiper-slide-index="1">
<div class="sVdo">
<video
class="full-bg-video"
loop muted autoplay
playsinline
src="@/assets/v3/ab622e07e5f14b23be0d5c2e620ea4be.mp4">
</video>
</div>
</div>
<!-- <div class="swiper-slide" data-swiper-slide-index="2">-->
<!-- <div class="sImg">-->
<!-- <img src="@/assets/v3/09d1ab34dd334323a1bb50e4a298bcfb.jpg" />-->
<!-- </div>-->
<!-- </div>-->
</div>
<div class="swiper-button-prev swiper-button-white" ref="prevButton"></div>
<div class="swiper-button-next swiper-button-white" ref="nextButton"></div>
<div class="swiper-pagination" ref="paginationEl"></div>
</div>
</div>
<ul class="entry-in new-feature-cards">
<li v-for="(item, index) in featureCards" :key="index" class="feature-card">
<h5 class="card-title">{{ item.title }}</h5>
<a class="EASE LNK MultiLine txt" target="_blank" :href="item.link">
{{ item.description1 }}
<br>
{{ item.description2 }}
</a>
<a class="EASE LNK MultiLine card-link" target="_blank" :href="item.link"><i class="EASE ICO ic-arow"></i></a>
</li>
</ul>
</div>
</template>
<script setup lang="ts">
import {onMounted, ref,onBeforeUnmount} from 'vue';
import Swiper from 'swiper';
// 导入 Swiper 样式和模块
import 'swiper/swiper-bundle.css';
import { Navigation, Pagination, EffectCreative,Autoplay } from 'swiper/modules';
import {emitEvent} from "@/utils/eventBus";
const featureCards = [
{
title: 'SBOM 自动化分析',
description1: '生成标准 CycloneDX/SPDX',
description2: '物料清单,透视组件资产。',
link: '/sbom-analysis',
linkText: '[了解详情 >]',
},
{
title: '供应链漏洞检测分析',
description1: '深度解析依赖树,精准定位',
description2: 'CVE 漏洞与传播路径。',
link: '/supply-chain-vulnerability',
linkText: '[了解详情 >]',
},
{
title: '恶意代码投毒检测',
description1: '识别依赖混淆、组件篡改',
description2: '及后门植入攻击。',
link: '/malware-detection',
linkText: '[了解详情 >]',
},
];
// 1. 定义 ref 引用到 DOM 元素
const swiperContainer = ref(null);
const prevButton = ref(null);
const nextButton = ref(null);
const paginationEl = ref(null);
let mySwiper = null;
onMounted(() => {
if (swiperContainer.value) {
// 2. 初始化 Swiper 实例
new Swiper(swiperContainer.value, {
// 3. 注册使用的模块(必须)
modules: [Navigation, Pagination, EffectCreative,Autoplay],
// 4. 配置 Swiper 选项
loop: true, // 确保轮播循环
// 5. 配置 3D Creative 效果(必须)
effect: 'creative',
creativeEffect: {
prev: {
shadow: true,
translate: ['-100%', 0, -1],
},
next: {
translate: ['100%', 0, -1],
},
},
// 6. 配置 Navigation (导航按钮)
navigation: {
// 使用 ref 引用或 CSS 类名指向按钮元素
nextEl: nextButton.value, // 使用 ref 引用更精确
prevEl: prevButton.value, // 使用 ref 引用更精确
// 也可以使用: nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev',
// 但使用 ref 在 Vue 中更稳定。
},
// 7. 配置 Pagination (分页器)
pagination: {
el: paginationEl.value, // 使用 ref 引用指向分页器容器
clickable: true, // 确保点击分页点可以切换
},
// 自动播放(可选,如果需要)
autoplay: {
delay: 4000,
disableOnInteraction: false,
},
// 其他配置,如速度、初始化索引等...
initialSlide: 2, // 假设您想从 index=2 的 Slide 开始
});
}
});
const handleLogin = (type) => {
emitEvent('login', {type, triggerType: '主动注册'});
};
onBeforeUnmount(() => {
if (mySwiper) {
mySwiper.destroy();
}
});
</script>
<style scoped lang="scss">
.com-entry {
position: relative
}
.com-entry .entry-in {
background: #9696964d;
border-radius: 12px;
bottom: 68px;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
left: 50%;
padding: 34px 0;
position: absolute;
-webkit-transform: translate(-50%);
transform: translate(-50%);
z-index: 2
}
.com-entry .entry-in li {
border-right: 1px solid #979797;
font-size: 14px;
font-weight: 400;
line-height: 22px;
list-style: none;
padding: 7px 36px 0 40px;
width: 314px
}
.com-entry .entry-in li .ic-arow {
left: 0;
position: relative
}
.com-entry .entry-in li:hover h5 {
color: #fff
}
.com-entry .entry-in li:hover a {
color: #4bad52
}
.com-entry .entry-in li:hover .ic-arow {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAWCAMAAADgvdz9AAAAAXNSR0IArs4c6QAAAKhQTFRFAAAAAP8AgICAVapVVapVSbZJQJ9gRqJdSaRbUa5RRq5RTKpVSa1SSK9QSa9QSq5RSKpVS65RTK5RS6tUSa5RSa9QSqxTTK5RS6xTS6xTTKxTTK1SS65RS61SSq1STKxTS61SS61SSq1STK1SS65RS61SSq1SSq5RS61SS6xTS65RS61SS61SS61SS61SS61SS61SS61SS61SS61SS61SS61SS61SS61SEkaAMAAAADd0Uk5TAAECAwYHCAsOExYbHCAjJicsOTpCSVlhYmlyeYGCiZGSmaGiqbGyucjP1dze4Obq7/L1+Pv8/muR6mgAAACNSURBVHichZLXDoJQEERXUBALRcGuFEWl2p3//zMTY+LL3b3zeiZbh+gv1yRBvbqMBOxXwCngeXd1xSsd8AYneeK2toQOR6CZdXhDWADnKc+NRQscxrzB3t7x2PV5w2j/xmVpEnngVUY6rNYw+xVXjrYRRjPm0mLfs0wY6OfCUZ1YeIn8UE0cNGFSRfEDg08bjv6UEeIAAAAASUVORK5CYII=);
left: 10px
}
.com-entry .entry-in li:last-child {
border: none
}
.com-entry .entry-in li h5 {
color: #4bad52;
font-size: 20px;
font-weight: 400;
letter-spacing: .5px;
line-height: 30px;
margin: 0 0 19px
}
.com-entry .entry-in li .txt {
font-size: 14px;
font-weight: 400;
height: 48px;
letter-spacing: .5px;
line-height: 24px
}
.com-slider {
background-color: #0c0c0f
}
.com-slider .swiper-slide {
background-position: top;
background-repeat: no-repeat;
background-size: cover;
cursor: pointer;
height: 990px
}
.com-slider .swiper-slide .sVdo {
height: 100%;
position: relative;
width: 100%
}
.com-slider .swiper-slide .sVdo video {
max-height: 900px;
width: 100%
}
.com-slider .swiper-slide .sVdo .btn-play {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAAXNSR0IArs4c6QAAALdQTFRFAAAA////////////////////////////////////////////////////////////////////////////////////////+/379/v49Pr08/rz7vfv6vXr6fXq2O3a1+3Zz+nRxeXHxOTHu+C+ut+9pdaopNanmtGemdGdmNCckM2Uj8yUhsiKhceKfMOBe8OAabtvabtuaLpuZ7ptYrhoXLViWbNgV7JeVrJdT69WT69VTK5TS61ST2RNRwAAABZ0Uk5TAAEJDBYXI1Jyf4KDpaqrv9PZ6PLz/pJYTDUAAAEkSURBVHjanZXHcsMwDERXJbKoqItiepzi9N6chv//rlwyMnvo7JF4QwxAYAkoyvKy6QbeNWWewam0aIWktkitWMK40MRZYnKzXljUzzQsYqOwamSRzMW1cKqKpfsq4VG9upMJr9hUx+gHx9+Kkl78oT4xEl8uz7dcyVO5z59ET3MT5CmATfmEiOj7YtsgCwCtDhK9HulgC2TCBImudzQyQ24F6e1YBXOUdpDodk8OlGhcIL2fSoEGnRMkut+fAh24B6TnKTBg8IEvEuhL/XAgpXYX87FQinG2505rj6vhJ3rD7U94s2s8YfBQhI+ZMrhfRI+HjsFVVuFqeeZchfDlCl7XcANAVPu4SrKp2GM+dfwf2ws30jWsGcBGmNmvvg9u+z5+AJMEhmRVU6aXAAAAAElFTkSuQmCC) no-repeat 50%;
background-size: 100% 100%;
height: 30px;
left: 50%;
position: absolute;
top: 50%;
width: 30px
}
.com-slider .swiper-slide .sImg {
background-position: top;
background-repeat: no-repeat;
background-size: cover;
height: 100%;
width: 100%
}
.MultiLine {
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-word;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.ic-arow {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAWCAMAAADgvdz9AAAAAXNSR0IArs4c6QAAALdQTFRFAAAA////////////////////6urq6+vr8vLy8/Pz6urq6+vr7e3t7+/v7e3t8fHx8fHx7e3t8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw7+/v8PDw8PDw8PDw8PDw8PDw8PDw7+/v7+/v8PDw8PDw7+/v8PDw8PDw8PDw8PDw7+/v7+/v8PDw7+/v7+/v7+/v7+/v7+/v8PDw7+/v7+/v7+/v7+/v8PDw7+/v7+/v7+/v7+/v4uiVIAAAADx0Uk5TAAECAwYHDA0UFRgZHR8qNTc4RlNUVldkZWZnc3R2d4SGh5OUlpekpqe2t8PExsvR093f5+nw8fb3+/z+BY9v3gAAAJtJREFUKM99UkcWglAQ+wKKDcGGXVTsXbGT+5/L0Y0bM9kmb14miTE/eFmjILM/NxW6dAB2Vc5b7QRYeFyQi+54jFwuKM9TXDo2F/hb4FhTPDZOwKrCead/xWta4IJ8/MRtIDG54JCYVDpkxydyfEg6cHpibcas1eWxNXvM3yixfEPt2kolY1KJ1UqQLlmhxc8cAm1MoTa2P1N8A11AHbmJaAv2AAAAAElFTkSuQmCC);
margin: 10px 0 0;
width: 16px;
}
.ic-arow, .ic-down {
display: inline-block;
height: 12px;
}
.EASE {
-webkit-transition: all .4s ease-out;
transition: all .4s ease-out;
}
.ICO {
background-position: 50%;
background-repeat: no-repeat;
background-size: 100% 100%;
}
.banner-container {
position: relative;
width: 84vw;
margin: 0 auto;
height: 840px;
overflow: hidden;
font-family: 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, sans-serif;
/* 背景图样式优化 */
.sImg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
}
.bg-image {
width: 100%;
height: 100%;
object-fit: cover; /* 确保图片覆盖整个区域且不变形 */
object-position: center top;
}
/* 暗色遮罩:防止背景过亮导致文字看不清 */
.overlay-mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(circle at center, rgba(0,0,0,0.2) 0%, rgba(0,0,0,0.6) 100%);
}
/* 内容层布局 */
.content-wrapper {
position: relative;
z-index: 10; /* 确保内容在背景之上 */
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
color: #ffffff;
padding: 0 20px;
margin-top: -50px; /* 视觉微调,稍微向上提一点 */
}
/* 标题样式 */
.main-headline {
font-size: 64px;
font-weight: 700;
letter-spacing: 2px;
margin-bottom: 16px;
text-shadow: 0 4px 10px rgba(0, 0, 0, 0.5);
.gradient-text {
/* 科技感蓝紫渐变 */
background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-weight: 800;
}
}
.sub-headline {
font-size: 32px;
font-weight: 400;
color: #e0e0e0;
margin-bottom: 40px;
letter-spacing: 1px;
}
/* 描述文字样式 */
.description {
font-size: 18px;
line-height: 1.8;
color: #cccccc;
max-width: 800px;
margin-bottom: 60px;
.highlight {
color: #fff;
font-weight: bold;
color: #4facfe;
}
.tech-tag {
display: inline-block;
padding: 0 4px;
font-weight: 500;
color: #fff;
}
}
/* 按钮组样式 */
.cta-group {
display: flex;
gap: 30px;
}
.btn {
position: relative;
padding: 14px 40px;
font-size: 18px;
font-weight: 600;
border-radius: 50px;
cursor: pointer;
transition: all 0.3s ease;
overflow: hidden;
letter-spacing: 1px;
}
/* 主要按钮SaaS 体验 (高亮) */
.btn-primary {
background: linear-gradient(90deg, #2b5876 0%, #4e4376 100%);
border: 1px solid rgba(255, 255, 255, 0.2);
color: white;
box-shadow: 0 0 20px rgba(78, 67, 118, 0.4);
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 0 30px rgba(78, 67, 118, 0.6);
background: linear-gradient(90deg, #356b8f 0%, #5f5291 100%);
}
/* 次要按钮:私有化演示 (玻璃拟态/描边) */
.btn-secondary {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.5);
color: white;
}
.btn-secondary:hover {
background: rgba(255, 255, 255, 0.2);
border-color: #fff;
transform: translateY(-2px);
}
/* 简单的入场动画 */
.animate-up {
animation: fadeInUp 1s ease-out forwards;
opacity: 0;
transform: translateY(30px);
}
.delay-1 { animation-delay: 0.2s; }
.delay-2 { animation-delay: 0.4s; }
@keyframes fadeInUp {
to {
opacity: 1;
transform: translateY(0);
}
}
/* 响应式适配 */
@media (max-width: 768px) {
.banner-container { height: 800px; }
.main-headline { font-size: 36px; }
.sub-headline { font-size: 20px; }
.cta-group { flex-direction: column; gap: 15px; }
}
}
</style>

View File

@@ -0,0 +1,340 @@
<template>
<div class="comFooter">
<div class="footer-top">
<div class="footer-l"><p class="form-tip">立即预约开启智能安全之旅</p>
<form class="form"><input placeholder="请输入您的电话 +86" class="form-ipt" type="tel" maxlength="11"><!---->
<button class="EASE form-sbmt" type="submit">预约 <i class="EASE ICO ic-arow"></i></button>
</form>
<p class="contact-tip">联系我们</p>
<div class="contact-item"><i class="ICO ic-phone-g"></i> 电话027-83391083</div>
<div class="contact-item"><i class="ICO ic-mail-g"></i> 邮箱jyhlab@jyhlab.org.cn</div>
<div class="contact-item"><i class="ICO ic-addr-g"></i> 地址武汉市东西湖区G347国家网络安全人才与创新基地</div>
<div class="contact-media">
<div class="media-item EASE"><img src="@/assets/imgs/gzh.jpg" alt="公众号"> 公众号</div>
<!-- <div class="media-item m-sph EASE"><img src="https://www.chaitin.cn/_nuxt/shipinhao.BWbq9rer.png" alt="视频号">-->
<!-- 视频号-->
<!-- </div>-->
<!-- <div class="media-item m-bz EASE"><img src="https://www.chaitin.cn/_nuxt/bzhan.CjlwQaqe.png" alt="B站"> B站-->
<!-- </div>-->
</div>
</div>
<div class="footer-r">
<div class="r-links"><h5>产品与服务</h5>
<ul>
<li><a href="javascript:;" class="">SBOM 分析</a></li>
<li><a href="javascript:;" class="">供应链漏洞检测</a></li>
<li><a href="javascript:;" class="">恶意代码检测</a></li>
<li><a href="javascript:;" class="">未知漏洞检测</a></li>
<li><a href="javascript:;" class="">合规性检测</a></li>
</ul><!----></div>
<div class="r-links"><h5>解决方案</h5>
<ul>
<li><a href="javascript:;" class="">能源行业</a></li>
<li><a href="javascript:;" class="">金融行业</a></li>
<li><a href="javascript:;" class="">交通行业</a></li>
</ul>
</div>
<div class="r-links"><h5>资源中心</h5>
<ul>
<li><a target="_blank" href="javascript:;">漏洞数据库</a><!----></li>
<li><a target="_blank" href="javascript:;">威胁情报库</a><!----></li>
<li><a target="_blank" href="javascript:;">安全事件中心</a><!----></li>
<li><a target="_blank" href="javascript:;">开发者文档</a><!----></li>
</ul>
</div>
<div class="r-links"><h5>关于我们</h5>
<ul>
<li><!----><a href="javascript:;" class="">公司简介</a></li>
<li><a target="_self" class="LNK" href="javascript:;">加入我们</a><!----></li>
<li><!----><a href="javascript:;" class="">联系方式</a></li>
</ul>
</div>
<div class="r-links"><h5>Tcode站点</h5>
<ul>
<li><a target="_blank" href="https://tcode.com.cn/openRepoPortal/home">可信开源代码库</a><!----></li>
<li><a target="_blank" href="https://zzjh.org.cn/#/">创新资助计划平台</a><!----></li>
</ul>
</div>
</div>
</div>
<div class="footer-botm">
<div class="Wrap">
<div class="beian"> © 2025 武汉金银湖实验室 <a href="" target="_blank" rel="noreferrer">京ICP备xxxxxxx号</a>
<a href="" target="_blank"
rel="noreferrer"> 京公网安备 京ICP备xxxxxxx号 </a> <a href="/html/legal.html" target="_blank"
rel="noreferrer">法律声明</a> <a
href="/html/privacy.html" target="_blank" rel="noreferrer">隐私政策</a> <a
href="/html/privacy.html" target="_blank" rel="noreferrer">服务条款</a></div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "ComFooter"
}
</script>
<style lang="scss" scoped>
.comFooter {
background-color: #fff
}
.comFooter.EN .r-links {
margin-right: 30px
}
.comFooter.EN .contact-item {
-webkit-box-align: start;
-ms-flex-align: start;
align-items: flex-start
}
.comFooter.EN .contact-item .ICO {
position: relative;
top: 9px
}
.comFooter.EN .contact-item .ic-addr-g {
top: 6px
}
.comFooter .contact-media {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
margin: 40px 0 0
}
.comFooter .contact-media .media-item {
margin: 0 30px 0 0;
text-align: center;
width: 80px
}
.comFooter .contact-media .media-item img {
background: #fff;
border-radius: 4px;
-webkit-box-shadow: 0 2px 11px 2px rgba(0,0,0,.08);
box-shadow: 0 2px 11px 2px #00000014;
display: block;
margin: 0 0 10px;
padding: 10px;
width: 100%
}
.comFooter .footer-l {
position: relative
}
.comFooter .footer-l:after {
background-color: gray;
bottom: 0;
content: "";
position: absolute;
right: -50px;
top: 0;
width: 1px
}
.comFooter .footer-top {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
position: relative;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
padding: 50px 45px
}
.comFooter .footer-botm {
background-color: #252525;
color: #b0b0b0;
font-size: 12px;
font-weight: 400;
line-height: 17px
}
.comFooter .footer-botm .Wrap {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
line-height: 24px;
padding: 18px 45px
}
.comFooter .form-tip {
color: #333;
font-size: 20px;
font-weight: 400;
letter-spacing: .5px;
line-height: 35px;
margin: 0 0 24px
}
.comFooter .form {
position: relative;
width: 363px
}
.comFooter .form-ipt {
background: #f5f5f5;
border: none;
border-radius: 8px;
color: #333;
font-size: 12px;
font-weight: 400;
height: 41px;
line-height: 40px;
padding: 0 12px;
width: 100%
}
.comFooter .form-ipt:focus-visible {
border: none
}
.comFooter .form-sbmt {
background: #4bad52;
border: none;
border-radius: 0 8px 8px 0;
color: #fff;
cursor: pointer;
font-size: 14px;
height: 41px;
letter-spacing: .5px;
line-height: 41px;
position: absolute;
right: 0;
text-align: center;
top: 0;
width: 119px
}
.comFooter .form-sbmt .ICO {
left: 6px;
position: relative
}
.comFooter .form-sbmt:hover {
background: #7aba4a
}
.comFooter .form-sbmt:hover .ICO {
left: 15px;
position: relative
}
.comFooter .footer-r {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
padding: 0 0 0 100px;
position: relative
}
.comFooter .r-links {
margin: 0 55px 0 0;
white-space: nowrap
}
.comFooter .r-links:last-child {
margin-right: 0
}
.comFooter .r-links h5 {
color: #333;
font-size: 16px;
font-weight: 400;
line-height: 22px
}
.comFooter .r-links ul {
margin: 17px 0 0
}
.comFooter .r-links li {
color: gray;
font-size: 12px;
font-weight: 400;
line-height: 30px;
list-style: none
}
.comFooter .r-links a:link,.comFooter .r-links a:visited {
color: gray;
-webkit-text-decoration: none;
text-decoration: none
}
.comFooter .r-links a:hover {
color: #4bad52
}
.comFooter .contact-tip {
color: #333;
font-size: 16px;
font-weight: 400;
line-height: 22px;
margin: 51px 0 12px
}
.comFooter .contact-item {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
color: #4d4d4d;
font-size: 14px;
font-weight: 400;
line-height: 32px
}
.comFooter .contact-item .ICO {
margin-right: 12px;
-ms-flex-negative: 0;
flex-shrink: 0
}
.comFooter .contact-item .ic-phone-g {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAgCAMAAABAUVr7AAAAAXNSR0IArs4c6QAAAtBQTFRFAAAAAP8AgICAVapVQL9AM5lmVapVSbZJQJ9gVapVVapVTrFOSaRbRKpVUK9QS7RLR6pVUa5RTbNNSapVRq5RTrFOSqpVTrFOTKpVSa1ST7BPTKpVSq1SSK9QTapVS61TTKxTSKpVS65RSrBPTqxTTK5RSq9QUKpVSaxTS69QSrFOSqxTSqxTTK5RTrFSSa1SSq1STa5VTa5RTKtUS6lWS61TS6lTTq5VSa9QS6xTSKxTSq5RTKxTSq5RTatUSq5RS65RSK5RTK1SSa1PSapSSqxTS6xTSq1SS65RS69QS61SSq1SSqxTTK5RSqxTSqxRTKxTTK9TSqxTS61STK5RTKxTTK1QSa1SS6xTTK9QS61USq9STK1SS65RSa5RTK1STKxTS65TTK5RSq5RS6xTS61SSq5RTK5RS61TTK5RS61STK5RSqxTS61QS61TTK1SSq5RS65RS65RS61STKxSTK1STKxTS65RSq1SS6xTS61SS65SS61SSq5RS61STK1RSq1SSa5RTK1SS61SS61SS6xTS6xSSqxTTK1SS61SS65RS61STK1SSq1SS61TS61STKxSSq5RS65RS61SS61RSq1SS65TS6xTS61TS61SS61RTK1SS61SS61STK5TTK5RTKxTTKxRS65RTK1SSq1SS61SSq1SS65RSqxSS61SSq1RS61SS6xTS6xSTK5RTK1STK1RS61SS6xTS65SS65RTK1SS65SS61SS61SS6xSTK5STK5RTK1SSq1SS6xTS6xSSqxSS65RS61STK5SS65RTK1SS61SS61TS61SS61TS65SS65RS61SSq1TS6xSS6xTS61STK5STK1SS61SSqxTTK1SS61RTK1STKxSS61SS65SS61SS65SS61TS61SSq1SS6xTS65RSq1STK1SS61STKxTTK5STK1SS61STKxTTKxSS6xSS65SS61SSq1RS61SOBldxgAAAO90Uk5TAAECAwQFBgcICQwNDg8QERITFBUWFxgaGxwdHh8gISIlJyktLi8wMDEzNDQ3OTs7Pj8/QEFEREVGR0dISkxMT1JSVFRUWVxgYmNjZGhra2tsb29wdXV2dnt8fX+DhISGh4iKiouMjZCTlJWXl5mcnp6go6Slq6ytr7C1t7e5ur2+v8PExcXFxcbGycnKy8zNzs/Q0NDR0tLT09PU1NbY2NjY2dvc3d3f3+Dg4eHh4uLi5OTl5eXm5ufn6Ojp6urq6uvr7Ozs7O3t7u/v7/Dw8fLz8/T09fX29vf4+Pn6+vr6+/v8/Pz9/f39/f3+/v7UCC1AAAAB+ElEQVR42mNgIBYI6lpa6wjgUcDp27/99u1Nvd4cuFSI77n8ZPX0metfn68Rw65CqvX9mgQVfkG13JPvl2NXk/7uuB2E5bDpSTw2FSKz74bC2JEvp/JjUWJ0YqUyjK29dYcuFiW2j2fCPcI795IlFiWm16bBDZddvFkbixL9PQvFYezge1OEsCiRnn9QH8p0OPkwiRGLEpbu9z4QluG+9+2CWMMl7X0dWKvMqrfzRLGHrvGhpYogmq3/jT+uSGx5nwxmlL4vxxWN3jfny4Fol4sb1HAo4et4X8bKwMDA3/m+Be4YAQVNBVaEGsdjp91BtPP+5xWQqNbImbhk3aKuEC64vwtfzJQFMVIuPJ5jwsjAEH7i/Z21y868v96oDlMj2fW+FmQFY/SW99uqPWMOPWhzV5Yxjtr7/ooMTI3WnGdVwiCGfdP59++vPjwgAomcGe/L4HGst+BJJThkuWyK+lZs5IYKW+06agF3stnORxdUIUxmObgrmXveJyIF8tL3k2wwAiT/fTEST6Xx/qYILjQlde9zkLn8mQdvNDuh5CWBOQ88ULQwuU24d6relBORUPKezpJHM1cobOarI32pBuwQbuDhs+GYaUwibvK59wenNhQnBPlxBGzPYMMWqwLm2VN2v3v//v0tL2YlnOUAj65rbFZBCSQAAenMpeRemUEEAAAAAElFTkSuQmCC);
height: 16px;
width: 17px
}
.comFooter .contact-item .ic-addr-g {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAqCAYAAADS4VmSAAAAAXNSR0IArs4c6QAABX9JREFUeNrVWGuMFEUQXhRfaHzjA4QgRBRfwfiKiYYzenDb1bM3Xb3jcRgM+EPhj4lGNPFJEP2lf9QfoIkoEjhmu3rugJzyUCKIQBRNEI2KCAIBJQGjIARO7kzNNsve3s7ea8/ESubPTPdU9Vf1fVUzqdT/zjpSgx4Mg4syLZkrZRiMTEf+mDThNekwGBqEwQUD5pcdCqvqJOm3JOF6QfgTkD4oCE8Aqd+AcJu0eqVHOEdG/l3pRQ9fWBXH3nLvckH4OFj1DRB2uOsoGL1dEG4Cg58C4RawaieQ/if/XLWBVatELiv7jkpHalBdGNwDVq9zTtuE0SuFVbOgqWEcI+JH/sVBGJwHK+ASEQZX8XqRw9fAqs3xHqNPgNVLgaaM7rVzsGoyEO5xzteDVcjOerKdAwKjZ4JV3zlEvgXC+3vsX1g1HQweAUKGdB6/sC8gymXBSLC6OR+E3icjv6bbTTHspPeyc0n48sSFU8/vTw0pqy4Dq4mDkAa3eYsbb6hYcGBVnHNh9dv9dV7EoGGCcEWMRC7bwjQuDz1Xez7nn/cV9sS6oCmjgfBXSXhSRH5jWZ47qjGFsCeFVt9cP2KSabxJhsHwbgPuSA1KEz6XT4XeyGiXFl6dO/0qb7k3pEKahggKpnKqBOHvQNgOhHvB6jUZq4KatTWDK4mZJNzOe2TkP9ApOlY4DsCz6tmkF9w+/7Gz0hHOj1HKB3sSCA8WCdRxj/BVXldufxAGZwrChW7tm+w3fsCCwvIqSR9Nh8GNibSy2UdiahrNFF0gwmA8F5i06l4wMd3apcXDjGYixSO/MS9SuIH9ntb5WNtxOytaorjkGdIuCZ8JwuDs4ufxIaxqdTleWDhdKc2b8M44AKt2FHxxV3ONZVMhqhLjguOcC6O3MrcTTjfeIbQuqRl5YXCtMPqYJPyrLvJHxTe5pYJVbdxYkuSWq93lfHXp6QtrCK8GgwcE4cZKBwGj/2QUMmFwffFNLqbNSRvjl1u1UxDurm3JDCuLQKhqHbxLuOASZH5szByjjxQQiOlh1Q9gcR9zutxGhhQIbayShMsyJUGAbRgHRn8Zo2TVo4mFHGI2rhPSp2sg3Zo+Rxi9LH7QiZ+drXaJvgMI97tTrhNGz/KMr8GquUC4y91fU0nChdFvOBp+1CndYPTz7sG82bNnn5GkZl7kPwRWf1XE/Q6HyjHeq6y6optesyWPAL7SGeJWf4xkZbNqR1KOC2vDYGg8L1g9F6x+B3LZp2UuW8NIVmzzRmtH48P1YXBLF5UDo993avhSEo/7avHpCb9waVpcs2DauV0X5fw0yylYtUs0NYytmveiRgSEf3AtlV3HUUnC99wEE1ZrzPYoVr8D/N600XMrNaxUOmoYwxNvTKdIz+xvKpi+wuhWNxt+1qUNV2g63PH2ZIy+tT/QS6Ofcs4PQXP2vp4WzBCwalG+YDB5hOrG8r1B7XO5fzFJHcujYPR1YPFnNx8+magNCcb1I42OnPPVk8Lg0t6fgPxp+VTo/dxGe7NXWj3Daf4B0Vx/d1+5y6n40J3i46RGVWqqqeFmYdXuPHpqVm/R65qKPCtYPl/oLo9x0zKnPkZwRU+D7iYVODX+4CR9yLNqQtI6Pqmr+nYuvnRL5raqCBl3LZHDD5xAbZiY0HA419JNyp5VT1RVzt2HxY8O2tdLpyIe0yThJ64zRlX7P1DC60Zh+IcE/i2N9goSvrZmMBDOcUW3u0unq5ZxKmTO9QqjttYvmTyC72esqnVz3klh9Ixqd9JO5kf+KCD1fZ4V2XflcjncjWIc1NIB/U90yvgTTBp9XBh9Qri8S8JfClPuQBu3bTB6ftFI1iZyanrqvzTOvzT4tfsX1Fx2whloi/8TWjWhr92S7V9fD3PQ+dnr/wAAAABJRU5ErkJggg==);
height: 21px;
width: 16px
}
.comFooter .contact-item .ic-mail-g {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAcCAMAAAAz6Z0tAAAAAXNSR0IArs4c6QAAAadQTFRFAAAAAP8AgICAVapVQL9AM5lmVapVSbZJVapVTbNNRqJdVapVSaRbRKpVUK9QS7RLVapVR6pVUa5RTbNNSapVRq5RTrFOSrVKR61STrFOSa1ST7BPTKpVTapVS61TSa9QTqpVSq5RSqhXTaxTTK5XSrFOSK1SSKpVS6tUTq1SSa1STK5VTK5RTKpVS7BUS7BPSa5RTapVS61TSqpRSq5RTK1SSq9QSq1VTK5PS69QSq5TSqxTS6tUS65RS6tRTK1SS7BSS61USq1STKtSS65RSqtSTKxTTK5RSqxRS6xTSa1SS61SS6xRS6xTTK1STK1SSq1SS61SSq5RSa1RSq5RS61STK1TS65TSq1SSqxTSq5RS61SSq1STK1STKxTSq1SS65RS61TS61SSqxTS6xTSq5RS61TS61TS6xTS61SS6xSS61SS61STKxTSq5RS61SS6xSTK5SS65RS61SSq1SS61SS6xSTK1STK1SS61SS65TS61SS61SS61SS61RS61STK1TTK1SS61SSq1SS6xTTK1SS61SSqxSTK5RS61SS61SS61SS61SBebJyQAAAIx0Uk5TAAECAwQFBgcJCgsMDg8QERISExQVFhcYGRocHR4hIiMkJiYrLzQ1OTo7Ozw8PD09Pz9ESE9UWV1hY2hucHR0eXp6fICEhoqNkZaWnJ2foqSlp6mrra6vsLKys7S3vcLIyczQ0tXY2drb3Nzd3t7f4eHl5eXp6urr7Ozu7/Lz8/X29vb39/j5+vv8/f77eWZPAAABOUlEQVR42q3T1VMCURTH8R/ILgaCsmBgLHaL3Yrd3R2oCHa3IibC+aN9EHCH3TvDg9/nz9w558xcIKoE0cpMFDUAyja9xO6hGzCu0/stq2eiXiDLc1OVwajmgMb0gJW2BcaQlW4aN+CXqEpzVXJhc9NEMoIkZ/esTmZs+zRpRIhwo3Rdr5aJKSP4ga7gLIYRumuIkYpyF00LQObFaWjcxGG6b5SYEhfNCAAsl+fhjXSDgcdmTVjs0awJEQQJ/f6nFi4s5kyQEcT3fXtb+aBYMEOBIK7H99ahBYqdtJgKRYLYzq9PO1/kpOWQkBFo2z98Qzu0kgYmgbbtlWj1TygQcE1r80mSC1quZARqHS89ssIrkf0jyX45ydMzq/AcAuYtOtpgdkxLAGodAfYf8TsKASC9oJpZfgqi6AdDypbgcduQAQAAAABJRU5ErkJggg==);
height: 14px;
width: 17px
}
.layout {
padding: 64px 0 0
}
input, textarea {
-webkit-user-select: auto;
}
.ic-arow {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAWCAMAAADgvdz9AAAAAXNSR0IArs4c6QAAALdQTFRFAAAA////////////////////6urq6+vr8vLy8/Pz6urq6+vr7e3t7+/v7e3t8fHx8fHx7e3t8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw7+/v8PDw8PDw8PDw8PDw8PDw8PDw7+/v7+/v8PDw8PDw7+/v8PDw8PDw8PDw8PDw7+/v7+/v8PDw7+/v7+/v7+/v7+/v7+/v8PDw7+/v7+/v7+/v7+/v8PDw7+/v7+/v7+/v7+/v4uiVIAAAADx0Uk5TAAECAwYHDA0UFRgZHR8qNTc4RlNUVldkZWZnc3R2d4SGh5OUlpekpqe2t8PExsvR093f5+nw8fb3+/z+BY9v3gAAAJtJREFUKM99UkcWglAQ+wKKDcGGXVTsXbGT+5/L0Y0bM9kmb14miTE/eFmjILM/NxW6dAB2Vc5b7QRYeFyQi+54jFwuKM9TXDo2F/hb4FhTPDZOwKrCead/xWta4IJ8/MRtIDG54JCYVDpkxydyfEg6cHpibcas1eWxNXvM3yixfEPt2kolY1KJ1UqQLlmhxc8cAm1MoTa2P1N8A11AHbmJaAv2AAAAAElFTkSuQmCC);
margin: 10px 0 0;
width: 16px;
}
</style>

View File

@@ -0,0 +1,145 @@
<template>
<div class="com-news"><h4 class="wow animated" style="visibility: visible;">最新动态</h4>
<ul class="wow animated" style="visibility: visible;">
<li><a href="https://mp.weixin.qq.com/s/gFi3Lo1KFcjt0gwhetaT5w" rel="nofollow" class="EASE" target="_blank"><img
src="@/assets/v3/6b8d01d61f9a40d2b0c74bc6783ff296.png"
alt="“Tcode外”夺冠网络攻防从此“攻守易形”AI 智能体才是终极胜负手" class="EASE"></a>
<div class="ptime"><i class="ICO ic-air"></i> 发布时间 <span>2025/11/21</span></div>
<h5 class="EASE MultiLine"><a href="https://mp.weixin.qq.com/s/gFi3Lo1KFcjt0gwhetaT5w" rel="nofollow"
class="EASE" target="_blank">Tcode外夺冠网络攻防从此攻守易形AI 智能体才是终极胜负手</a></h5>
<p class="desc MultiLine">在近日结束的腾讯云黑客松-智能渗透挑战赛线上赛中Tcode科技旗下Tcode外战队力压 238 支全球顶尖战队以全程稳定高分斩获第一名</p></li>
<li><a href="https://mp.weixin.qq.com/s/rczHE9BYY_VRMo_DgJMV-w" rel="nofollow" class="EASE" target="_blank"><img
src="@/assets/v3/2fde85b65bc84c01b5d280151a5fb555.png"
alt="Tcode科技上榜国家专精特新“小巨人”以 AI 安全创新领跑网络安全新赛道" class="EASE"></a>
<div class="ptime"><i class="ICO ic-air"></i> 发布时间 <span>2025/10/27</span></div>
<h5 class="EASE MultiLine"><a href="https://mp.weixin.qq.com/s/rczHE9BYY_VRMo_DgJMV-w" rel="nofollow"
class="EASE" target="_blank">Tcode科技上榜国家专精特新小巨人 AI 安全创新领跑网络安全新赛道</a></h5>
<p class="desc MultiLine">近日北京市经济和信息化局公示了北京市第七批专精特新小巨人企业名单Tcode科技凭借其卓越的科技创新能力和专业化的技术实力成功入选</p></li>
<li><a href="https://mp.weixin.qq.com/s/9KfUvw3zmrH3CfVbXzdLhg" rel="nofollow" class="EASE" target="_blank"><img
src="@/assets/v3/ee5c7cb6d2ef4504b0e47a2bed942d7f.png"
alt="蝉联第一Tcode科技再次问鼎“天网杯”" class="EASE"></a>
<div class="ptime"><i class="ICO ic-air"></i> 发布时间 <span>2025/09/23</span></div>
<h5 class="EASE MultiLine"><a href="https://mp.weixin.qq.com/s/9KfUvw3zmrH3CfVbXzdLhg" rel="nofollow"
class="EASE" target="_blank">蝉联第一Tcode科技再次问鼎天网杯</a></h5>
<p class="desc MultiLine">9 23 2025 年第三届天网杯网络安全大赛的赛场上Tcode科技再次展现其在漏洞挖掘领域的顶尖实力在关键产品漏洞挖掘挑战赛中拔得头筹获得一等奖</p>
</li>
</ul>
</div>
</template>
<script>
export default {
name: "ComNews"
}
</script>
<style lang="scss" scoped>
.com-news {
margin: 0 auto;
padding: 100px 0 50px;
width: 1364px
}
.com-news h4 {
color: #333;
font-size: 28px;
font-weight: 400;
letter-spacing: 1.7px;
line-height: 40px;
margin-bottom: 57px;
text-align: center
}
.com-news ul {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center
}
.com-news li {
list-style: none;
margin: 0 28px 0 0;
width: 33.333%
}
.com-news li img {
border-radius: 10px;
height: 338px;
-o-object-fit: cover;
object-fit: cover;
-o-object-position: center;
object-position: center;
width: 100%
}
.com-news li:hover img {
-webkit-transform: scale(1.02);
transform: scale(1.02)
}
.com-news li:hover h5 {
color: #4bb752
}
.com-news .ptime {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
margin: 20px 0 0;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
color: #333;
font-size: 14px;
font-weight: 400;
line-height: 20px
}
.com-news .ptime span {
color: #969696;
font-size: 12px;
font-weight: 400;
line-height: 17px
}
.com-news li .ic-air {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAQAAAD/5HvMAAAAAXNSR0IArs4c6QAABFVJREFUeNrNmkloFFkYx4tMCB68itRXtImRqEzAZYLLQRRbBAUPCnEJfXCmIQw4kww0fRAVccFDqwh2VBQRPbkcBioEhY6oB/EyE5AOAWG2nsElM0NrYjSHHJK/dHVXpZd6Ve+rJVT9IXS/qn71y1u+73vve4ri7WpSuyhJGdIpTwUq0gzNUJEKlCedMpRUu5QmZWGuGFEf6TRBcNEE6dQXoxBR2hapCcrRrCtKtWYppybaFgUOs2QxpWmchVKtcUovWRwcTbOWoqJnGFNFLaU0B0CjbqFR3zCmRtUtvmA6WyhLc4HhlDRH2c4WjzhL22kkUBhTI0vbPeBocXUyFBwQ1EktzsXZTzNh4Ria0fZzBnIv09p40azaK9864eMYSFKtpMVD7qzajou7zqzwhrL98HaccZ0tIU10RyPgYJcou+A4JWXFTmIujBe24QiGHK23vUNpDtBnWdqAS3iDaeRcfJyN29VSwaJo6MYgpjBtKOv2dKox3ikGB7MSRzFWQSnriGtwUhcvUToomG24if9rYEra7v7LdE1w6iMatLQMSTxrQCnpI1olosqqQFdN+IVZg3P4yxampJdyRjIx32E5PzB7cB8fhTAl3ZWrKTe/sPHoTFfgJ4w4opR1UtLZVhZN1O8FZjMGMC4A+L1uWB+QrbWvDDTItTA9eITPwvZ4hpd1JWtl69aNRbHEKtTSapzAK8fuuQe9ruS1/D87oTQpapfs4ztwB+9dRstlXG4oe8wJR7oUSro/1orv8dx16H7GMaRsygc4AyKpUMb5kfU4j38kZtIkenHQdvr/wAHKKKSLb+/Dzy4WxtR/2IftNi6jpB0cIF2hvPh2D/6QwvkbcazDnwK30cYByitUcHqgA7ccJnhZY9iADvzqy21YKijuYcdex4n+Al8jhofC+/d5QEVFZtHTjgF8sn3dEFaAcMMB+BRzYaTIrsJ2I9/wstuIgXDcsUMPsYGkI8VWXKiZc+eN0m8FbWdqHbvLCpwfxPGL8ZoppIzvu1B0xHnLddoFx2lvHxeexr84bHze6Goyn3CB8o6GUaTlxt9VNqOqXle4deuurkOsaxIm80durRkp5yrqvIvWukukndxak4zww94YjDngTFU6lxV+8AK0am2qxNXXhc4lz61zwsiQcENYUzncQofxqVvgWB/wh7T3IJ8wjGn8hu7KjLtrA3SGW2efr2XQcOW1Zjt9Z+xzVKuHV+OslTvytlA0gT4hUSlZg6EaoG94NeZ8LqVNoFRNab8VN77jzrCEz82GMtDZhvKNeFpZn7HqG6/JqnnZjikBXbW9o+EEPuAar7607w2rYdyDJry7FXtZYUdDgo+/pXccy3zY+Lo2TS3QpqekRm1zjWFtC7tqTphnjNjGeQRTC5FLvkQwPRXBBF4EU5wRTAJHME0ewYMEETxqEcHDKKbbjdRxHSteitCBJivQjdCRr/krRtRPg1KH4gZDPhRXc30V1rHBL/3JmVpOd2CzAAAAAElFTkSuQmCC);
height: 36px;
margin-right: 14px;
width: 36px
}
.com-news li:last-child {
margin: 0
}
.com-news li h5 {
color: #333;
font-size: 20px;
height: 60px;
line-height: 30px;
margin: 20px 0 0
}
.com-news li .desc,.com-news li h5 {
font-weight: 400;
letter-spacing: .5px
}
.com-news li .desc {
color: #4d4d4d;
font-size: 14px;
line-height: 24px;
margin: 18px 0 0;
-webkit-line-clamp: 4
}
.ICO {
background-position: 50%;
background-repeat: no-repeat;
background-size: 100% 100%;
}
</style>

View File

@@ -0,0 +1,140 @@
<template>
<div class="secondEdition">
<p class="theTitle">核心产品</p>
<div>
<div class="" style="">
<div class="ant-anchor-wrapper" style="max-height: 100vh;">
<div class="ant-anchor">
<div class="ant-anchor-ink"><span class="ant-anchor-ink-ball"></span></div>
<li
v-for="(item, index) in menuList"
:key="index"
:class="{ active: activeIndex === index }"
@click="changeTab(index)"
>
<a>{{ item.name }}</a>
</li>
</div>
</div>
</div>
</div>
<div class="product-content">
<div v-if="activeIndex === 0" class="component-box">
<Product1 />
</div>
<div v-if="activeIndex === 1" class="component-box">
<Product2 />
</div>
<div v-if="activeIndex === 2" class="component-box">
<Product3 />
</div>
<div v-if="activeIndex === 3" class="component-box">
<Product4 />
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
import Product1 from './product1.vue';
import Product2 from './product2.vue';
import Product3 from './product3.vue';
import Product4 from './product4.vue';
const activeIndex = ref(0);
// 定义菜单列表数据
const menuList = [
{ name: '可信开源态势感知平台(源感)' },
{ name: '金银湖代码安全大模型(源鉴)' },
{ name: '供应链安全检测系统(源链)' },
{ name: '智能终端应用安全监测平台(源端)' }
];
const changeTab = (index) => {
activeIndex.value = index;
};
</script>
<style lang="scss" scoped>
.secondEdition .theTitle {
height: 53px;
line-height: 53px;
font-size: 38px;
font-weight: 500;
color: #1e1e1e;
text-align: center;
margin: 42px 0 30px !important
}
.secondEdition .ant-affix {
background-color: #fff;
box-shadow: 0 2px 7px 0 rgba(0, 0, 0, .09)
}
.secondEdition .ant-anchor-wrapper {
width: 1200px;
margin: 0 auto;
padding-left: 0
}
.secondEdition .ant-anchor-wrapper .ant-anchor {
display: flex;
align-items: center;
justify-content: center;
list-style: none;
}
.secondEdition .ant-anchor-wrapper .ant-anchor .ant-anchor-ink {
width: 100%;
height: 1px;
border-bottom: 1px solid hsla(0, 0%, 60%, .5);
bottom: 0;
top: auto;
display: none;
}
.secondEdition .ant-anchor-wrapper .ant-anchor li {
padding: 18px 19px;
margin: 0 10px;
position: relative;
font-size: 16px;
cursor: pointer;
transition: all 0.3s;
}
.secondEdition .ant-anchor-wrapper .ant-anchor li a {
color: #333 !important;
display: block;
}
.secondEdition .ant-anchor-wrapper .ant-anchor li.active:after {
position: absolute;
left: 0;
bottom: 0;
height: 3px;
background-color: #466aff;
content: "";
width: 100%;
transition: all 0.3s;
}
.secondEdition .ant-anchor-wrapper .ant-anchor li.active a {
color: #466aff !important;
font-weight: 600;
}
.product-content {
//width: 1200px;
//margin: 40px auto;
//min-height: 300px;
}
</style>

View File

@@ -0,0 +1,833 @@
<template>
<div class="secondEditionContent">
<div class="hadoop" id="hadoop">
<div class="hadoopCon">
<div class="descBox">
<p class="desc1">产品介绍</p>
<p class="desc2">
<b>📍 定位</b><br>
国家级开源安全数据底座 全景风险感知 实时情报监测
</p>
<p class="desc3">
<b>👥 目标客户与合作伙伴</b><br>
G端政府/事业单位B端关基单位/大中企业生态伙伴开源社区/代码托管平台/安全厂商
</p>
<p class="desc3">
<b>💼 使用场景</b><br>
行业监管中心主动威胁情报安全风险阻断
</p>
</div>
<div class="hadoopCode activeCode" :ref="(el) => setTargetRef(el, 'hadoop')">
<img src="@/assets/v3/Line/sec2.png" alt="态势感知运行结果" class="activeImg">
</div>
</div>
</div>
<div class="oneStop" :ref="(el) => setTargetRef(el, 'oneStop')" id="oneStop">
<div class="oneStopContent">
<div class="osLeftMain" style=" position: relative;">
<img src="@/assets/v3/Line/sec3.jpeg" alt="" width=700px class="osleftPosi">
<img
src="@/assets/v3/Line/sec3_2.png"
alt="叠加图标"
style="
position: absolute;
bottom: -100px; /* 让图片向下超出 px */
right: -50px; /* 让图片向右超出 px */
width: 80%;
height: auto;
z-index: 10; /*确保在最上层*/
"
/>
<img
src="@/assets/v3/Line/sec3_5.png"
alt="新增叠加图标"
style="
position: absolute;
bottom: -180px; /* 根据需要调整位置 */
right: -90px; /* 根据需要调整位置 */
width: 60%; /* 根据实际需求调整尺寸 */
height: auto; /* 维持宽高比 */
z-index: 11; /* 确保在最上层 */
"
/>
</div>
<div class="osRightMain">
<p class="osRightTitle">技术优势</p>
<p>平台架构遵循 <b>"安全数据湖仓 -> AI智能引擎 -> 智能态势应用"</b> 的演进路线</p>
<p><b>a.安全数据湖仓</b>基于国家网安基地云平台聚合全球主流开源社区NVD/CNNVD等多源漏洞库以及21个行业投毒威胁情报库</p>
<p><b>b.AI智能引擎</b>知识图谱构建跨域标签引擎智能态势应用</p>
<p><b>c.智能态势应用</b> 对外提供SaaS订阅API数据流可视化大屏及私有化一体机交付</p>
</div>
</div>
<img src="@/assets/v3/Line/2-2-1.bcb33d47.png" alt="" height="83px" class="imgring">
</div>
<div class="highDevops" :ref="(el) => setTargetRef(el, 'highDevops')" id="highDevops">
<div class="highDoTitle"><span> 创新点</span></div>
<div class="highDoSubtitle">
<b>a.全景安全态势感知</b>聚合全球开源社区实时监控开源组件安全漏洞以及21个行业投毒威胁情报库<br>
<b>b.主动式漏洞挖掘</b>通过AI驱动的补丁代码与自动化测试挖掘0day漏洞助建高质量CVE库<br>
<b>c.精确溯源-组件关联</b>借助SBOM与溯源技术一键生成供应链图谱自动追踪高危漏洞<br>
<b>d.实时风险预警与应急响应</b>智能感知异常事件的人工分析与现场处置可视化决策支持
</div>
<div class="highDoContent">
<div><img src="@/assets/v3/Line/sec10.png" alt="" width="1200px">
</div>
</div>
</div>
<div class="multipleAnalyse" :ref="(el) => setTargetRef(el, 'multipleAnalyse')" id="multipleAnalyse">
<span class="title">📈 性能指标</span>
<div class="maContent">
</div>
<p class="desc">
<b>数据提速</b>11种主流编程语言全球Top5开源社区全量<br>
<b>情报时效</b>分钟级简报小时级预警<br>
<b>检测能力</b>SCA组件识别覆盖95%投毒检测覆盖5%<br>
<b>系统开发</b>API接口支持方式QPS大屏数据秒级刷新
</p>
</div>
<div class="multidimensional" style="opacity: 1">
<div style="height: 168px;"></div>
<div class="" :ref="(el) => setTargetRef(el, 'multidimensional')" id="multidimensional">
<div class="multidimensinalhalf">
<div>
<p class="halfTitle">📊 产品功能</p>
<p class="halfsubTitle"><b>数据标签服务</b>行业属性技术领域开源贡献组件画像<br>
<b>风险感知服务</b>态势大屏情报推送攻击面管理
</p>
</div>
<div style="width: 820px; margin-left: 34px;"><img src="@/assets/v3/Line/sec5.png" alt=""
width="820px"></div>
</div>
<div class="multidimensinalPart">
<div style="width: 614px; margin-right: 40px;"><img src="@/assets/v3/Line/sec11.png" alt=""
width="614px"></div>
<div>
<p><b>数据定制服务</b>情报订阅深度分析API对接<br><br>
<b>安全预警与应急响应服务</b>分级预警应急处置协同指挥
</p>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted, nextTick } from 'vue';
// 1. 定义响应式对象存储所有目标元素标识DOM元素
const targetElements = ref({});
// 2. 存储交叉观察者实例
let observer = null;
// 3. 规范的 ref 收集函数:处理元素挂载/卸载
const setTargetRef = (el, key) => {
if (el) {
// 元素挂载:存入对象
targetElements.value[key] = el;
} else {
// 元素卸载:从对象中移除
delete targetElements.value[key];
}
};
// 4. 初始化交叉观察者(批量监听)
const initObserver = () => {
// 获取所有元素的数组
const elements = Object.values(targetElements.value);
if (elements.length === 0) return;
const observerOptions = {
root: null,
rootMargin: '0px',
threshold: 0.1,
};
const observerCallback = (entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add('activeCode');
} else {
// 可选:离开视口时移除类
// entry.target.classList.remove('activeCode');
}
});
};
observer = new IntersectionObserver(observerCallback, observerOptions);
// 批量监听所有元素
elements.forEach((el) => {
observer.observe(el);
});
};
// 5. 组件挂载时等待DOM渲染完成后初始化
onMounted(async () => {
// 清空原有元素(防止重渲染重复)
targetElements.value = {};
await nextTick(); // 等待DOM渲染完成
initObserver();
});
// 6. 组件卸载时:批量销毁观察者
onUnmounted(() => {
if (observer) {
// 停止监听所有元素
Object.values(targetElements.value).forEach((el) => {
observer.unobserve(el);
});
observer.disconnect();
observer = null;
}
});
</script>
<style lang="scss" scoped>
.secondEdition .theTitle {
height: 53px;
line-height: 53px;
font-size: 38px;
font-weight: 500;
color: #1e1e1e;
text-align: center;
margin: 42px 0 30px !important
}
.secondEdition .ant-affix {
background-color: #fff;
box-shadow: 0 2px 7px 0 rgba(0, 0, 0, .09)
}
.secondEdition .ant-anchor-wrapper {
width: 1200px;
margin: 0 auto;
padding-left: 0
}
.secondEdition .ant-anchor-wrapper .ant-anchor {
display: flex;
align-items: center;
justify-content: center
}
.secondEdition .ant-anchor-wrapper .ant-anchor .ant-anchor-ink {
width: 100%;
height: 1px;
border-bottom: 1px solid hsla(0, 0%, 60%, .5);
bottom: 0;
top: auto
}
.secondEdition .ant-anchor-wrapper .ant-anchor li {
padding: 18px 19px;
margin: 0 10px;
position: relative;
font-size: 18px
}
.secondEdition .ant-anchor-wrapper .ant-anchor li a {
color: #333 !important
}
.secondEdition .ant-anchor-wrapper .ant-anchor li.active:after {
position: absolute;
left: 0;
bottom: 0;
height: 2px;
background-color: #466aff;
content: "";
width: 100%
}
.secondEdition .secondEditionContent {
padding: 65px 0;
width: 1200px;
margin: 0 auto
}
.secondEdition .secondEditionContent .hadoop {
background: url(@/assets/v3/Line/2-1bg.d22a63b9.png) no-repeat 50%;
background-size: cover;
min-height: 753px;
padding: 50px 56px
}
.secondEdition .secondEditionContent .hadoop .hadoopCon {
display: flex;
width: 100%
}
.secondEdition .secondEditionContent .hadoop .descBox {
max-width: 352px;
word-break: break-all
}
.secondEdition .secondEditionContent .hadoop .descBox .desc1 {
height: 50px;
line-height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
background: -webkit-linear-gradient(90deg, #50edff, #557cff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent
}
.secondEdition .secondEditionContent .hadoop .descBox .desc2 {
height: 72px;
font-size: 18px;
font-weight: 500;
color: #69daf5;
line-height: 36px;
margin-top: 20px
}
.secondEdition .secondEditionContent .hadoop .descBox .desc3 {
height: 108px;
font-size: 18px;
font-weight: 500;
color: #fff;
line-height: 36px;
margin-top: 100px
}
.secondEdition .secondEditionContent .hadoop .hadoopdesc {
color: #fff;
background: -webkit-linear-gradient(112deg, #ff8b75, #dd2476);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-size: 18px;
line-height: 25px;
font-weight: 500;
text-align: center;
margin-top: 40px
}
.secondEdition .secondEditionContent .oneStop {
text-align: center;
opacity: .3;
transition: 2s
}
.secondEdition .secondEditionContent .oneStop .oneStopContent {
display: flex;
justify-content: flex-start;
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osLeftMain {
display: flex;
justify-content: flex-start;
align-items: flex-start;
position: relative;
margin-bottom: 182px
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain {
margin-left: 22px;
text-align: left;
max-width: 400px;
margin-left: auto;
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain .osRightTitle {
height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
line-height: 50px;
background: -webkit-linear-gradient(112deg, #ff8b75, #dd2476);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-top: 28px
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain p {
font-size: 20px;
color: #637497;
line-height: 36px;
margin-top: 50px;
margin-bottom: 0 !important
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain p span {
color: #000;
font-weight: 500
}
.secondEdition .secondEditionContent .oneStop .imgring,
.secondEdition .secondEditionContent .oneStop .osleftPosi {
transition: 3s;
opacity: 0
}
.secondEdition .secondEditionContent .oneStop .osleftPosi1,
.secondEdition .secondEditionContent .oneStop .osleftPosi2 {
position: absolute;
right: -200px;
top: 102px;
transition: 2s;
opacity: 0;
z-index: 1
}
.secondEdition .secondEditionContent .oneStop .osleftPosi2 {
top: 317px;
right: 10px;
transition: 2.5s;
z-index: 2
}
.secondEdition .secondEditionContent .oneStop.activeCode,
.secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi,
.secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi1,
.secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi2 {
opacity: 1
}
.secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi1 {
right: 10px
}
.secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi2 {
top: 217px
}
.secondEdition .secondEditionContent .oneStop.activeCode .imgring {
opacity: 1
}
.secondEdition .secondEditionContent .highDevops {
text-align: center
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img {
opacity: 1
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img.highImg1 {
bottom: 62px
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img.highImg2 {
bottom: 215px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle {
position: relative;
padding: 2px;
width: 384px;
height: 90px;
margin: 7px auto 0;
border-radius: 10px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle span {
position: absolute;
z-index: 3;
width: 380px;
height: 86px;
line-height: 86px;
border-radius: 10px;
left: 2px;
top: 2px;
display: inline-block;
font-size: 36px;
font-weight: 600;
background: -webkit-linear-gradient(1deg, #d57ca0 12%, #4877f3 57%, #20c3ef 76%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent
}
.secondEdition .secondEditionContent .highDevops .highDoTitle:before {
position: absolute;
z-index: 2;
width: 380px;
height: 86px;
line-height: 86px;
background-color: #fff;
border-radius: 10px;
content: "";
top: 2px;
left: 2px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle:after {
position: absolute;
content: "";
width: 100%;
height: 100%;
top: 0;
left: 0;
border-radius: 10px;
background: -webkit-linear-gradient(1deg, #d57ca0 12%, #4877f3 57%, #20c3ef 76%);
z-index: 1
}
.secondEdition .secondEditionContent .highDevops .highDoSubtitle {
color: #637497;
font-size: 20px;
line-height: 36px;
max-width: 950px;
margin: 30px auto 28px;
text-align: center
}
.secondEdition .secondEditionContent .highDevops .highDoSubtitle span {
color: #000;
font-weight: 500
}
.secondEdition .secondEditionContent .highDevops .highDoContent {
background: url(@/assets/v3/Line/2-3bg.deef1b07.png) no-repeat 50%;
background-size: cover;
height: 920px;
padding: 20px 0 114px;
position: relative;
display: flex;
flex-direction: column;
align-items: center
}
.secondEdition .secondEditionContent .highDevops .highDoContent>div {
display: flex;
flex-direction: column;
align-items: center
}
.secondEdition .secondEditionContent .highDevops .highDoContent img {
opacity: 0;
transition: 2.4s
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highImg1 {
position: absolute;
bottom: 0;
transition: 1s;
transition-delay: 1s;
left: 10px
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highImg2 {
position: absolute;
bottom: 0;
right: 10px;
transition: 2s;
transition-delay: 1s
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highDoBottondesc {
font-size: 20px;
font-weight: 500;
color: #000;
line-height: 39px
}
.secondEdition .secondEditionContent .multipleAnalyse {
background: url(@/assets/v3/Line/2-4bg.45478d20.png) no-repeat 50%;
background-size: cover;
height: 850px;
padding-left: 58px;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
opacity: .3;
transition: 2s
}
.secondEdition .secondEditionContent .multipleAnalyse.activeCode {
opacity: 1
}
.secondEdition .secondEditionContent .multipleAnalyse.activeCode .maContent {
transform: rotateY(1turn)
}
.secondEdition .secondEditionContent .multipleAnalyse .title {
display: inline-block;
font-size: 36px;
font-weight: 600;
margin-bottom: 46px;
background: -webkit-linear-gradient(1deg, #6d66ff 12%, #c148ff 57%, #f59f77 76%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
line-height: 50px;
margin-top: 20px
}
.secondEdition .secondEditionContent .multipleAnalyse .maContent {
height: 400px;
width: 1000px;
background: url(@/assets/v3/Line/sec7.png) no-repeat;
background-size: 100% 100%;
margin: 26px 0;
transition: 3s
}
.secondEdition .secondEditionContent .multipleAnalyse .desc {
text-align: center;
max-width: 869px;
line-height: 30px;
color: #69daf5;
font-weight: 400;
font-size: 18px
}
.secondEdition .secondEditionContent .multidimensional {
background: url(@/assets/v3/Line/2-5bg.9cca3de1.png) no-repeat 50%;
background-size: cover;
height: 1139px;
padding: 100px 0 0;
display: flex;
flex-direction: column;
opacity: .3;
transition: 1s
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf {
display: flex;
align-items: center;
position: relative;
height: 447px
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf img {
position: absolute;
left: 0;
bottom: -20px;
opacity: 0;
transition: 3s
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfTitle {
height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
line-height: 50px;
background: -webkit-linear-gradient(112deg, #d57ca0, #4877f3 51%, #20c3ef);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 70px !important
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfsubTitle {
font-size: 20px;
font-weight: 500;
line-height: 36px;
color: #000;
max-width: 350px
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfsubTitle span {
color: #637497;
font-weight: 400
}
.secondEdition .secondEditionContent .multidimensional .activeCode {
opacity: 1
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalPart img {
left: 0;
opacity: 1
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalhalf img {
left: 380px;
opacity: 1
}
.secondEdition .secondEditionContent .multidimensinalPart {
display: flex;
align-items: center;
margin-top: 50px;
position: relative;
height: 396px;
transition: 4s
}
.secondEdition .secondEditionContent .multidimensinalPart img {
position: absolute;
left: 620px;
bottom: -20px;
opacity: 0;
transition: 3s
}
.secondEdition .secondEditionContent .multidimensinalPart p {
max-width: 422px;
text-align: left;
font-weight: 500;
line-height: 32px;
color: #000;
font-size: 20px
}
.secondEdition .secondEditionContent .multidimensinalPart p span {
color: #637497;
font-weight: 400
}
.secondEdition .secondEditionContent .multidimensinalPart p:first-child {
margin-bottom: 55px !important
}
.ant-anchor-wrapper {
margin-left: -4px;
padding-left: 4px;
overflow: auto;
background-color: #fff;
}
.ant-anchor-wrapper {
padding-left: 2px !important
}
.ant-anchor-wrapper .ant-anchor-ink:before {
background-color: #fff
}
.ant-anchor {
box-sizing: border-box;
margin: 0;
padding: 0;
color: rgba(0, 0, 0, 0.65);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5;
list-style: none;
font-feature-settings: 'tnum';
position: relative;
padding-left: 2px;
}
.ant-anchor-ink {
position: absolute;
top: 0;
left: 0;
height: 100%;
}
.ant-anchor-ink::before {
position: relative;
display: block;
width: 2px;
height: 100%;
margin: 0 auto;
background-color: #e8e8e8;
content: ' ';
}
.ant-anchor-ink-ball {
position: absolute;
left: 50%;
display: none;
width: 8px;
height: 8px;
background-color: #fff;
border: 2px solid #466aff;
border-radius: 8px;
transform: translateX(-50%);
transition: top 0.3s ease-in-out;
}
html li {
list-style: none;
}
a {
color: #466aff;
text-decoration: none;
background-color: transparent;
outline: none;
cursor: pointer;
transition: color 0.3s;
-webkit-text-decoration-skip: objects;
}
div,
img,
tr,
td,
table {
border: 0;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
div {
display: block;
}
img {
vertical-align: middle;
border-style: none;
}
img,
video {
max-width: none;
height: revert-layer;
display: inline;
}
.hadoopCode {
margin-left: 32px;
//box-shadow: 0 0 0 2px hsla(0, 0%, 100%, .1);
border-radius: 10px;
padding: 18px 20px;
flex: 1;
margin-top: 60px;
position: relative;
}
.hadoopCode>img {
position: absolute;
right: -50px;
bottom: -50px;
width: 805px;
border-radius: 4px;
opacity: 0;
z-index: 1;
}
.activeCode>img.activeImg {
right: 0;
top: 0px;
opacity: 1;
width: 705px;
transition: 1s;
transition-delay: 3s;
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalhalf img {
left: 380px;
opacity: 1;
}
</style>

View File

@@ -0,0 +1,934 @@
<template>
<div class="secondEditionContent">
<div class="hadoop" id="hadoop">
<div class="hadoopCon">
<div class="descBox">
<p class="desc1">产品介绍</p>
<p class="desc2">
<b>📍 定位</b><br>
安全领域智能专家强化安全基座能力驱动上层安全应用的核心大脑
</p>
<p class="desc3">
<b>👥 目标客户</b><br>
关基单位互联网企业软件开发商
</p>
<p class="desc3" style="margin-top: 50px;">
<b>💼 使用场景</b><br>
DevSecOps软件安全开发系统安全运维合规审计与治理
</p>
</div>
<div class="hadoopCode activeCode" :ref="(el) => setTargetRef(el, 'hadoop')">
<img src="@/assets/v3/Line/1.png" alt="金银湖安全大模型架构示意图" class="activeImg">
</div>
</div>
<!-- <p class="hadoopdesc">懂代码更懂安全的 AI 专家</p> -->
</div>
<div class="oneStop" :ref="(el) => setTargetRef(el, 'oneStop')" id="oneStop">
<div class="oneStopContent">
<div class="osLeftMain"><img src="@/assets/v3/Line/1-1.png" alt="" width="520px"
class="osleftPosi"><img src="@/assets/v3/Line/2-2-head.5e69dbb2.png" alt=""
width="213px" style="margin-left: -12px;"><img
src="@/assets/v3/Line/1-3.png" alt="" width="653px" class="mt-[100px] osleftPosi1"><img
src="@/assets/v3/Line/1-5.png" alt="" width="367px" class="mt-[250px] osleftPosi2"></div>
<div class="osRightMain">
<p class="osRightTitle">💡 创新亮点</p>
<p><b>01.全面漏洞数据集</b>已收集高质量漏洞代码样本349547条涵盖30余种编程语言总规模约48.7GB其中CWE漏洞提交信息87279条</p>
<p><b>02.专家经验融合</b>将安全专家经验以COT思维链形式嵌入训练构建具备可解释推理链的安全AI基座</p>
<p><b>03.仓库级漏洞检测</b>基于AST语法树与函数调用图结合静态分析AI语义理解自动完成漏洞精准定位与去重</p>
<p><b>04.智能检测修复</b>支持漏洞检测识别与自动修复通过领域知识输入降低误报率提升修复代码质量</p>
</div>
</div>
<img src="@/assets/v3/Line/2-2-1.bcb33d47.png" alt="" height="83px" class="imgring">
</div>
<div class="highDevops" :ref="(el) => setTargetRef(el, 'highDevops')" id="highDevops">
<div class="highDoTitle"><span>系统优势</span></div>
<div class="highDoContent">
<table class="comparisonTable">
<thead>
<tr>
<th class="headerCol">对比维度</th>
<th class="highlightCol">金银湖安全大模型</th>
<th>传统工具<br><span style="font-size: 14px; font-weight: 400;">(Fortify SCAcoverity等)</span></th>
<th>类似大模型平台<br><span style="font-size: 14px; font-weight: 400;">(BiDeepSeekChat金银湖大模型等)</span></th>
</tr>
</thead>
<tbody>
<tr>
<td class="headerCol">功能定位</td>
<td class="highlightCol">专注代码安全实现可信组件的智能组装</td>
<td>静态分析工具主要就是为了在不运行代码的情况下发现潜在的错误和安全漏洞</td>
<td>覆盖文本生成问答等广泛场景</td>
</tr>
<tr>
<td class="headerCol">代码生成能力</td>
<td class="highlightCol">可信组件智能组合减少人工干预</td>
<td>它们是分析工具不是生成工具所以不具备代码生成能力</td>
<td>有限的代码生成能力不涉及组件级别的生成与复合</td>
</tr>
<tr>
<td class="headerCol">报告输出</td>
<td class="highlightCol">结构化报告含漏洞类型风险等级修复代码一键生成下载</td>
<td>输出详细的缺陷报告但通常是列表形式不如智能平台"翻译""一键生成修复建议"</td>
<td>无标准化报告生成功能需人工整理</td>
</tr>
<tr>
<td class="headerCol">检测范围</td>
<td class="highlightCol">仓库级代码扫描突破上下文长度限制精准识别跨文件漏洞</td>
<td>在处理大型复杂项目时特别是在跨文件跨模块分析方面可能遇到限制容易产生误报或漏报</td>
<td>受限于Token长度仅支持单文件片段分析</td>
</tr>
<tr>
<td class="headerCol">工具链集成</td>
<td class="highlightCol">提供IDE插件MCP接口无缝集成DevOps流程</td>
<td>DevOps流程如CI/CD管道集成时通常需要更多的手动配置和脚本支持</td>
<td>无工具链集成能力需额外开发对接</td>
</tr>
<tr>
<td class="headerCol">安全能力矩阵</td>
<td class="highlightCol">静态审计+动态扫描+修复验证形成完整安全工具链</td>
<td>只做静态分析不涉及动态测试或自动修复验证</td>
<td>单一模型能力缺乏工具协同</td>
</tr>
<tr>
<td class="headerCol">行业定制</td>
<td class="highlightCol">支持金融政务等场景的定制化私有部署</td>
<td>大多数传统静态分析工具是通用型的缺乏针对特定行业如金融医疗等的合规性要求及特定风险模式的深度定制能力</td>
<td>无法满足单独行业特殊需求</td>
</tr>
<tr>
<td class="headerCol">智能决策能力</td>
<td class="highlightCol">基于多智能体协作和专业知识库优化学习生成改进策略与漏洞利用建议</td>
<td>只是发现问题不具备"智能"地提供优化建议或漏洞利用建议的能力需要安全专家的人工分析</td>
<td>单一模型缺乏专业知识库</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="multipleAnalyse" :ref="(el) => setTargetRef(el, 'multipleAnalyse')" id="multipleAnalyse">
<span class="title">落地案例</span>
<div class="maContent">
</div>
<p class="desc">
<b>01.国家关键信息基础设施开源组件治理</b><br>
深耕电力交通通信等国家命脉领域深度审计核心系统开源组件累计检出185个未知高危漏洞智能生成合规修复方案构建漏洞安全主动防御体系实现漏洞治理率超90%<br>
<b>02.湖北电信核心业务系统智能漏洞治理</b><br>
覆盖全省业务系统与云平台环境支持Java/Python/Go等多语言自动扫描平均修复周期由30天缩短至7天平均修复周期提升60%保障电信核心业务安全稳定上线筑牢数字基础设施安全防线<br>
<b>03.某研究所保密业务系统源码审计</b><br>
聚焦C/C++核心模块复杂业务逻辑深度审计多级指针操作关键代码精准识别到空指针解引用缓冲区溢出等传统工具检测盲区构建保密场景智能审计标准流程树立关键系统安全治理行业标杆
</p>
</div>
<div class="multidimensional" style="opacity: 1">
<div style="height: 168px;"></div>
<div class="" :ref="(el) => setTargetRef(el, 'multidimensional')" id="multidimensional">
<div class="multidimensinalhalf">
<div>
<p class="halfTitle">🎯 市场推广</p>
<p class="halfsubTitle">
<b>面向客户</b><br>
强合规型能源金融运营商政务信创<br>
高敏捷型互联网大厂车联网AI厂商等
</p>
</div>
<div style="width: 820px; margin-left: 34px;"><img src="@/assets/v3/Line/1-7.jpg" alt=""
width="820px"></div>
</div>
<div class="multidimensinalPart">
<div style="width: 614px; margin-right: 40px;"><img src="@/assets/v3/Line/1-6.jpg" alt=""
width="614px"></div>
<div>
<p class="halfsubTitle">
<b>收费模式</b><br><br>
<b> SaaS型</b>按用户数用量或功能计费灵活低门槛快速覆盖中小企业与互联网客户<br><br>
<b> 软硬件一体化部署</b>私有化部署满足安全性金融等高点业务对数据安全模型可控与高创新配的高要求形成高价值单
</p>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted, nextTick } from 'vue';
// 1. 定义响应式对象存储所有目标元素标识DOM元素
const targetElements = ref({});
// 2. 存储交叉观察者实例
let observer = null;
// 3. 规范的 ref 收集函数:处理元素挂载/卸载
const setTargetRef = (el, key) => {
if (el) {
// 元素挂载:存入对象
targetElements.value[key] = el;
} else {
// 元素卸载:从对象中移除
delete targetElements.value[key];
}
};
// 4. 初始化交叉观察者(批量监听)
const initObserver = () => {
// 获取所有元素的数组
const elements = Object.values(targetElements.value);
if (elements.length === 0) return;
const observerOptions = {
root: null,
rootMargin: '0px',
threshold: 0.1,
};
const observerCallback = (entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add('activeCode');
} else {
// 可选:离开视口时移除类
// entry.target.classList.remove('activeCode');
}
});
};
observer = new IntersectionObserver(observerCallback, observerOptions);
// 批量监听所有元素
elements.forEach((el) => {
observer.observe(el);
});
};
// 5. 组件挂载时等待DOM渲染完成后初始化
onMounted(async () => {
// 清空原有元素(防止重渲染重复)
targetElements.value = {};
await nextTick(); // 等待DOM渲染完成
initObserver();
});
// 6. 组件卸载时:批量销毁观察者
onUnmounted(() => {
if (observer) {
// 停止监听所有元素
Object.values(targetElements.value).forEach((el) => {
observer.unobserve(el);
});
observer.disconnect();
observer = null;
}
});
</script>
<style lang="scss" scoped>
.secondEdition .theTitle {
height: 53px;
line-height: 53px;
font-size: 38px;
font-weight: 500;
color: #1e1e1e;
text-align: center;
margin: 42px 0 30px !important
}
.secondEdition .ant-affix {
background-color: #fff;
box-shadow: 0 2px 7px 0 rgba(0, 0, 0, .09)
}
.secondEdition .ant-anchor-wrapper {
width: 1200px;
margin: 0 auto;
padding-left: 0
}
.secondEdition .ant-anchor-wrapper .ant-anchor {
display: flex;
align-items: center;
justify-content: center
}
.secondEdition .ant-anchor-wrapper .ant-anchor .ant-anchor-ink {
width: 100%;
height: 1px;
border-bottom: 1px solid hsla(0, 0%, 60%, .5);
bottom: 0;
top: auto
}
.secondEdition .ant-anchor-wrapper .ant-anchor li {
padding: 18px 19px;
margin: 0 10px;
position: relative;
font-size: 18px
}
.secondEdition .ant-anchor-wrapper .ant-anchor li a {
color: #333 !important
}
.secondEdition .ant-anchor-wrapper .ant-anchor li.active:after {
position: absolute;
left: 0;
bottom: 0;
height: 2px;
background-color: #466aff;
content: "";
width: 100%
}
.secondEdition .secondEditionContent {
padding: 65px 0;
width: 1200px;
margin: 0 auto
}
.secondEdition .secondEditionContent .hadoop {
background: url(@/assets/v3/Line/2-1bg.d22a63b9.png) no-repeat 50%;
background-size: cover;
min-height: 753px;
padding: 50px 56px
}
.secondEdition .secondEditionContent .hadoop .hadoopCon {
display: flex;
width: 100%
}
.secondEdition .secondEditionContent .hadoop .descBox {
max-width: 352px;
word-break: break-all
}
.secondEdition .secondEditionContent .hadoop .descBox .desc1 {
height: 50px;
line-height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
background: -webkit-linear-gradient(90deg, #50edff, #557cff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent
}
.secondEdition .secondEditionContent .hadoop .descBox .desc2 {
height: 72px;
font-size: 18px;
font-weight: 500;
color: #69daf5;
line-height: 36px;
margin-top: 30px
}
.secondEdition .secondEditionContent .hadoop .descBox .desc3 {
height: 108px;
font-size: 18px;
font-weight: 500;
color: #fff;
line-height: 36px;
margin-top: 130px
}
.secondEdition .secondEditionContent .hadoop .hadoopdesc {
color: #fff;
background: -webkit-linear-gradient(112deg, #ff8b75, #dd2476);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-size: 18px;
line-height: 25px;
font-weight: 500;
text-align: center;
margin-top: 40px
}
.secondEdition .secondEditionContent .oneStop {
text-align: center;
opacity: .3;
transition: 2s
}
.secondEdition .secondEditionContent .oneStop .oneStopContent {
display: flex
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osLeftMain {
display: flex;
justify-content: flex-start;
align-items: flex-start;
position: relative;
margin-bottom: 182px
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain {
margin-left: 22px;
text-align: left
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain .osRightTitle {
height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
line-height: 50px;
background: -webkit-linear-gradient(112deg, #ff8b75, #dd2476);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-top: 28px
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain p {
font-size: 20px;
color: #637497;
line-height: 36px;
margin-top: 50px;
margin-bottom: 0 !important
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain p span {
color: #000;
font-weight: 500
}
.secondEdition .secondEditionContent .oneStop .imgring, .secondEdition .secondEditionContent .oneStop .osleftPosi {
transition: 3s;
opacity: 0
}
.secondEdition .secondEditionContent .oneStop .osleftPosi1, .secondEdition .secondEditionContent .oneStop .osleftPosi2 {
position: absolute;
right: -200px;
top: 102px;
transition: 2s;
opacity: 0;
z-index: 1
}
.secondEdition .secondEditionContent .oneStop .osleftPosi2 {
top: 317px;
right: 10px;
transition: 2.5s;
z-index: 2
}
.secondEdition .secondEditionContent .oneStop.activeCode, .secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi, .secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi1, .secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi2 {
opacity: 1
}
.secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi1 {
right: 10px
}
.secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi2 {
top: 217px
}
.secondEdition .secondEditionContent .oneStop.activeCode .imgring {
opacity: 1
}
.secondEdition .secondEditionContent .highDevops {
text-align: center
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img {
opacity: 1
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img.highImg1 {
bottom: 62px
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img.highImg2 {
bottom: 215px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle {
position: relative;
padding: 2px;
width: 384px;
height: 90px;
margin: 7px auto 0;
border-radius: 10px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle span {
position: absolute;
z-index: 3;
width: 380px;
height: 86px;
line-height: 86px;
border-radius: 10px;
left: 2px;
top: 2px;
display: inline-block;
font-size: 36px;
font-weight: 600;
background: -webkit-linear-gradient(1deg, #d57ca0 12%, #4877f3 57%, #20c3ef 76%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent
}
.secondEdition .secondEditionContent .highDevops .highDoTitle:before {
position: absolute;
z-index: 2;
width: 380px;
height: 86px;
line-height: 86px;
background-color: #fff;
border-radius: 10px;
content: "";
top: 2px;
left: 2px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle:after {
position: absolute;
content: "";
width: 100%;
height: 100%;
top: 0;
left: 0;
border-radius: 10px;
background: -webkit-linear-gradient(1deg, #d57ca0 12%, #4877f3 57%, #20c3ef 76%);
z-index: 1
}
.secondEdition .secondEditionContent .highDevops .highDoSubtitle {
color: #637497;
font-size: 20px;
line-height: 36px;
max-width: 950px;
margin: 30px auto 28px;
text-align: center
}
.secondEdition .secondEditionContent .highDevops .highDoSubtitle span {
color: #000;
font-weight: 500
}
.secondEdition .secondEditionContent .highDevops .highDoContent {
background: url(@/assets/v3/Line/2-3bg.deef1b07.png) no-repeat 50%;
background-size: cover;
min-height: 920px;
padding: 40px 20px;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.comparisonTable {
width: 100%;
max-width: 1160px;
border-collapse: collapse;
background: rgba(255, 255, 255, 0.95);
border-radius: 12px;
overflow: hidden;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
font-size: 15px;
line-height: 1.6;
}
.comparisonTable thead {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
.comparisonTable th {
padding: 18px 12px;
font-weight: 600;
text-align: center;
font-size: 16px;
border-right: 1px solid rgba(255, 255, 255, 0.2);
}
.comparisonTable th:last-child {
border-right: none;
}
.comparisonTable tbody tr {
border-bottom: 1px solid #e5e7eb;
transition: background-color 0.3s ease;
}
.comparisonTable tbody tr:hover {
background-color: rgba(102, 126, 234, 0.05);
}
.comparisonTable tbody tr:last-child {
border-bottom: none;
}
.comparisonTable td {
padding: 16px 12px;
text-align: left;
color: #374151;
border-right: 1px solid #e5e7eb;
vertical-align: top;
}
.comparisonTable td:last-child {
border-right: none;
}
.comparisonTable .headerCol {
background: linear-gradient(135deg, #f3f4f6 0%, #e5e7eb 100%);
font-weight: 600;
color: #1f2937;
text-align: center;
width: 120px;
}
.comparisonTable .highlightCol {
background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);
font-weight: 500;
color: #92400e;
position: relative;
}
.comparisonTable .highlightCol::before {
content: '✓';
position: absolute;
left: 8px;
top: 50%;
transform: translateY(-50%);
color: #059669;
font-weight: bold;
font-size: 18px;
}
.secondEdition .secondEditionContent .highDevops .highDoContent > div {
display: flex;
flex-direction: column;
align-items: center
}
.secondEdition .secondEditionContent .highDevops .highDoContent img {
opacity: 0;
transition: 2.4s
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highImg1 {
position: absolute;
bottom: 0;
transition: 1s;
transition-delay: 1s;
left: 10px
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highImg2 {
position: absolute;
bottom: 0;
right: 10px;
transition: 2s;
transition-delay: 1s
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highDoBottondesc {
font-size: 20px;
font-weight: 500;
color: #000;
line-height: 39px
}
.secondEdition .secondEditionContent .multipleAnalyse {
background: url(@/assets/v3/Line/2-4bg.45478d20.png) no-repeat 50%;
background-size: cover;
height: 710px;
padding-left: 58px;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
opacity: .3;
transition: 2s
}
.secondEdition .secondEditionContent .multipleAnalyse.activeCode {
opacity: 1
}
.secondEdition .secondEditionContent .multipleAnalyse.activeCode .maContent {
transform: rotateY(1turn)
}
.secondEdition .secondEditionContent .multipleAnalyse .title {
display: inline-block;
font-size: 36px;
font-weight: 600;
margin-bottom: 0px;
background: -webkit-linear-gradient(1deg, #6d66ff 12%, #c148ff 57%, #f59f77 76%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
line-height: 50px;
margin-top: 30px
}
.secondEdition .secondEditionContent .multipleAnalyse .maContent {
height: 400px;
width: 723px;
background: url(@/assets/v3/Line/1-8.jpg) no-repeat;
background-size: 100% 100%;
margin: 26px 0;
transition: 3s
}
.secondEdition .secondEditionContent .multipleAnalyse .desc {
text-align: center;
//max-width: 869px;
line-height: 30px;
color: #69daf5;
font-weight: 400;
font-size: 18px
}
.secondEdition .secondEditionContent .multidimensional {
background: url(@/assets/v3/Line/2-5bg.9cca3de1.png) no-repeat 50%;
background-size: cover;
height: 1139px;
padding: 100px 0 0;
display: flex;
flex-direction: column;
opacity: .3;
transition: 1s
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf {
display: flex;
align-items: center;
position: relative;
height: 447px
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf img {
position: absolute;
left: 0;
bottom: -20px;
opacity: 0;
transition: 3s
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfTitle {
height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
line-height: 50px;
background: -webkit-linear-gradient(112deg, #d57ca0, #4877f3 51%, #20c3ef);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 70px !important
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfsubTitle {
font-size: 20px;
font-weight: 500;
line-height: 36px;
color: #000;
max-width: 350px
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfsubTitle span {
color: #637497;
font-weight: 400
}
.secondEdition .secondEditionContent .multidimensional .activeCode {
opacity: 1
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalPart img {
left: 0;
opacity: 1
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalhalf img {
left: 380px;
opacity: 1
}
.secondEdition .secondEditionContent .multidimensinalPart {
display: flex;
align-items: center;
margin-top: 50px;
position: relative;
height: 396px;
transition: 4s
}
.secondEdition .secondEditionContent .multidimensinalPart img {
position: absolute;
left: 620px;
bottom: -20px;
opacity: 0;
transition: 3s
}
.secondEdition .secondEditionContent .multidimensinalPart p {
max-width: 422px;
text-align: left;
font-weight: 500;
line-height: 32px;
color: #000;
font-size: 20px
}
.secondEdition .secondEditionContent .multidimensinalPart p span {
color: #637497;
font-weight: 400
}
.secondEdition .secondEditionContent .multidimensinalPart p:first-child {
margin-bottom: 55px !important
}
.ant-anchor-wrapper {
margin-left: -4px;
padding-left: 4px;
overflow: auto;
background-color: #fff;
}
.ant-anchor-wrapper {
padding-left: 2px !important
}
.ant-anchor-wrapper .ant-anchor-ink:before {
background-color: #fff
}
.ant-anchor {
box-sizing: border-box;
margin: 0;
padding: 0;
color: rgba(0, 0, 0, 0.65);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5;
list-style: none;
font-feature-settings: 'tnum';
position: relative;
padding-left: 2px;
}
.ant-anchor-ink {
position: absolute;
top: 0;
left: 0;
height: 100%;
}
.ant-anchor-ink::before {
position: relative;
display: block;
width: 2px;
height: 100%;
margin: 0 auto;
background-color: #e8e8e8;
content: ' ';
}
.ant-anchor-ink-ball {
position: absolute;
left: 50%;
display: none;
width: 8px;
height: 8px;
background-color: #fff;
border: 2px solid #466aff;
border-radius: 8px;
transform: translateX(-50%);
transition: top 0.3s ease-in-out;
}
html li {
list-style: none;
}
a {
color: #466aff;
text-decoration: none;
background-color: transparent;
outline: none;
cursor: pointer;
transition: color 0.3s;
-webkit-text-decoration-skip: objects;
}
div, img, tr, td, table {
border: 0;
}
*, *::before, *::after {
box-sizing: border-box;
}
div {
display: block;
}
img {
vertical-align: middle;
border-style: none;
}
img, video {
max-width: none;
height: revert-layer;
display: inline;
}
.hadoopCode {
margin-left: 32px;
//box-shadow: 0 0 0 2px hsla(0,0%,100%,.1);
border-radius: 10px;
padding: 18px 20px;
flex: 1;
margin-top: 60px;
position: relative;
}
.hadoopCode>img {
position: absolute;
right: -50px;
bottom: -50px;
width: 805px;
border-radius: 4px;
opacity: 0;
z-index: 1;
}
.activeCode>img.activeImg {
right: 0;
top: 0px;
opacity: 1;
width: 705px;
transition: 1s;
transition-delay: 3s;
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalhalf img {
left: 380px;
opacity: 1;
}
</style>

View File

@@ -0,0 +1,851 @@
<template>
<div class="secondEditionContent">
<div class="hadoop" id="hadoop">
<div class="hadoopCon">
<div class="descBox">
<p class="desc1">产品介绍</p>
<p class="desc2">
<b>📍 定位</b><br>
深度洞察软件成分 一键识别安全合规风险
</p>
<p class="desc3">
<b>👥 目标客户</b><br>
关基行业政府企业软件开发企业网安及互联网企业等
</p>
<p class="desc3">
<b>💼 使用场景</b><br>
软件采购与引入前软件开发与构建中内部资产管理与治理合规审计与响应
</p>
</div>
<div class="hadoopCode activeCode" :ref="(el) => setTargetRef(el, 'hadoop')">
<img src="@/assets/v3/Line/jiance.png" alt="软件供应链检测平台资产视图" class="activeImg">
</div>
</div>
<!-- <p class="hadoopdesc">透视黑盒溯源无忧</p> -->
</div>
<div class="oneStop" :ref="(el) => setTargetRef(el, 'oneStop')" id="oneStop">
<div class="oneStopContent">
<div class="osLeftMain">
<img src="@/assets/v3/Line/jishu4.png" alt="技术优势图4" width="500px" height="300px" class="img1">
<!-- <img src="@/assets/v3/Line/jishu3.png" alt="技术优势图3" width="180px" class="img2"> -->
<img src="@/assets/v3/Line/jishu2.png" alt="技术优势图2" width="540px" height="350px" class="img3">
<img src="@/assets/v3/Line/jishu1.png" alt="技术优势图1" width="360px" height="300px" class="img4">
</div>
<div class="osRightMain">
<p class="osRightTitle">💡 技术优势</p>
<p><b>01.供应链溯源检测能力</b>全景软件依赖图谱精准软件成分识别经第三方测试自研供应链溯源检测引擎检测准确率为95%</p>
<p><b>02.代码合规检测能力</b>许可证兼容性检测许可证兼容性关联检测支持多种主流许可证格式</p>
<p><b>03.恶意代码检测能力</b>首创11种语言跨组件投毒分析能力集成21个行业投毒情报库</p>
<p><b>04.漏洞可达性分析能力</b>识别漏洞影响路径精准定位受影响组件判断组件补丁状态跟踪已修复路径</p>
</div>
</div>
<img src="@/assets/v3/Line/2-2-1.bcb33d47.png" alt="" height="83px" class="imgring">
</div>
<div class="highDevops" :ref="(el) => setTargetRef(el, 'highDevops')" id="highDevops">
<div class="highDoTitle"><span> 创新点</span></div>
<div class="highDoSubtitle">
<b>01.</b>融合函数调用图的结构化语义表达与哈希精确匹配弥补哈希仅依赖特征值匹配缺乏语义关联的短板<br>
<b>02.</b>引入中心性分析量化函数为哈希精确匹配中的核心函数筛选提供量化依据提升匹配针对性<br>
<b>03.</b>以组件知识图谱与漏洞知识图谱为核心构建影响软件版本节点与组件节点的关联形成完整供应链知识图谱
</div>
<div class="highDoContent">
<div>
<img src="@/assets/v3/Line/chuangxin2.png" alt="" width="600px">
<img src="@/assets/v3/Line/kehu.png" alt="" style="margin-top: 100px" width="600px">
</div>
</div>
</div>
<div class="multipleAnalyse" :ref="(el) => setTargetRef(el, 'multipleAnalyse')" id="multipleAnalyse">
<span class="title">🎯 技术路线</span>
<div class="maContent">
</div>
</div>
<div class="multidimensional" style="opacity: 1">
<div style="height: 168px;"></div>
<div class="" :ref="(el) => setTargetRef(el, 'multidimensional')" id="multidimensional">
<div class="multidimensinalhalf">
<div>
<p class="halfTitle">📊 产品功能</p>
<p class="halfsubTitle"><b>平台展示及用户交互模块</b>Web界面和API项目管理扫描任务配置结果可视化和自定义报告<br>
<b>数据管理模块</b>负责内部和外部数据的采集存储清洗和更新包括漏洞数据库组件信息许可证文本和恶意代码特征<br>
<b>包管理器SCA引擎</b>针对常见包管理器如npmPyPIMaven的依赖分析引擎自动识别组件及其版本
</p>
</div>
<div><img style="margin-left: 100px;" src="@/assets/v3/Line/chanpin1.png" alt=""
width="620px"></div>
</div>
<div class="multidimensinalPart">
<div style="width: 614px; margin-right: 40px;"><img src="@/assets/v3/Line/chanpin2.png" alt=""
width="620px" class="wdsdsf"></div>
<div>
<p><b>C/C++ SCA引擎</b>处理C/C++项目成分分析支持源代码和编译依赖扫描<br><br>
<b>二进制SCA引擎</b>针对二进制文件分析通过反编译和特征匹配识别成分和漏洞<br><br>
<b>供应链溯源检测</b>综合多数据源和引擎结果检测供应链安全漏洞<br><br>
<b>许可证兼容性检测</b>分析组件许可证信息检查兼容性和合规性<br><br>
<b>恶意代码检测</b>集成恶意代码扫描识别供应链恶意组件
</p>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted, nextTick } from 'vue';
// 1. 定义响应式对象存储所有目标元素标识DOM元素
const targetElements = ref({});
// 2. 存储交叉观察者实例
let observer = null;
// 3. 规范的 ref 收集函数:处理元素挂载/卸载
const setTargetRef = (el, key) => {
if (el) {
// 元素挂载:存入对象
targetElements.value[key] = el;
} else {
// 元素卸载:从对象中移除
delete targetElements.value[key];
}
};
// 4. 初始化交叉观察者(批量监听)
const initObserver = () => {
// 获取所有元素的数组
const elements = Object.values(targetElements.value);
if (elements.length === 0) return;
const observerOptions = {
root: null,
rootMargin: '0px',
threshold: 0.1,
};
const observerCallback = (entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add('activeCode');
} else {
// 可选:离开视口时移除类
// entry.target.classList.remove('activeCode');
}
});
};
observer = new IntersectionObserver(observerCallback, observerOptions);
// 批量监听所有元素
elements.forEach((el) => {
observer.observe(el);
});
};
// 5. 组件挂载时等待DOM渲染完成后初始化
onMounted(async () => {
// 清空原有元素(防止重渲染重复)
targetElements.value = {};
await nextTick(); // 等待DOM渲染完成
initObserver();
});
// 6. 组件卸载时:批量销毁观察者
onUnmounted(() => {
if (observer) {
// 停止监听所有元素
Object.values(targetElements.value).forEach((el) => {
observer.unobserve(el);
});
observer.disconnect();
observer = null;
}
});
</script>
<style lang="scss" scoped>
.secondEdition .theTitle {
height: 53px;
line-height: 53px;
font-size: 38px;
font-weight: 500;
color: #1e1e1e;
text-align: center;
margin: 42px 0 30px !important
}
.secondEdition .ant-affix {
background-color: #fff;
box-shadow: 0 2px 7px 0 rgba(0, 0, 0, .09)
}
.secondEdition .ant-anchor-wrapper {
width: 1200px;
margin: 0 auto;
padding-left: 0
}
.secondEdition .ant-anchor-wrapper .ant-anchor {
display: flex;
align-items: center;
justify-content: center
}
.secondEdition .ant-anchor-wrapper .ant-anchor .ant-anchor-ink {
width: 100%;
height: 1px;
border-bottom: 1px solid hsla(0, 0%, 60%, .5);
bottom: 0;
top: auto
}
.secondEdition .ant-anchor-wrapper .ant-anchor li {
padding: 18px 19px;
margin: 0 10px;
position: relative;
font-size: 18px
}
.secondEdition .ant-anchor-wrapper .ant-anchor li a {
color: #333 !important
}
.secondEdition .ant-anchor-wrapper .ant-anchor li.active:after {
position: absolute;
left: 0;
bottom: 0;
height: 2px;
background-color: #466aff;
content: "";
width: 100%
}
.secondEdition .secondEditionContent {
padding: 65px 0;
width: 1200px;
margin: 0 auto
}
.secondEdition .secondEditionContent .hadoop {
background: url(@/assets/v3/Line/2-1bg.d22a63b9.png) no-repeat 50%;
background-size: cover;
min-height: 753px;
padding: 50px 56px
}
.secondEdition .secondEditionContent .hadoop .hadoopCon {
display: flex;
width: 100%
}
.secondEdition .secondEditionContent .hadoop .descBox {
max-width: 352px;
word-break: break-all
}
.secondEdition .secondEditionContent .hadoop .descBox .desc1 {
height: 50px;
line-height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
background: -webkit-linear-gradient(90deg, #50edff, #557cff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent
}
.secondEdition .secondEditionContent .hadoop .descBox .desc2 {
height: 72px;
font-size: 18px;
font-weight: 500;
color: #69daf5;
line-height: 36px;
margin-top: 30px
}
.secondEdition .secondEditionContent .hadoop .descBox .desc3 {
height: 108px;
font-size: 18px;
font-weight: 500;
color: #fff;
line-height: 36px;
margin-top: 90px;
}
.secondEdition .secondEditionContent .hadoop .hadoopdesc {
color: #fff;
background: -webkit-linear-gradient(112deg, #ff8b75, #dd2476);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-size: 18px;
line-height: 25px;
font-weight: 500;
text-align: center;
margin-top: 40px
}
.secondEdition .secondEditionContent .oneStop {
text-align: center;
opacity: .3;
transition: 2s
}
.secondEdition .secondEditionContent .oneStop .oneStopContent {
display: flex;
flex-direction: row;
align-items: flex-start;
justify-content: flex-start
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osLeftMain {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr;
gap: 15px;
position: relative;
margin-bottom: 182px;
margin-left: 290px;
width: 450px;
height: 320px;
flex-shrink: 0
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain {
margin-left: 30px;
text-align: left;
flex: 1
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain .osRightTitle {
height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
line-height: 50px;
background: -webkit-linear-gradient(112deg, #ff8b75, #dd2476);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-top: 0
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain p {
font-size: 20px;
color: #637497;
line-height: 36px;
margin-top: 50px;
margin-bottom: 0 !important
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain p span {
color: #000;
font-weight: 500
}
.secondEdition .secondEditionContent .oneStop .imgring {
transition: 3s;
opacity: 0
}
.secondEdition .secondEditionContent .oneStop .osLeftMain img {
opacity: 0;
transition: all 2s ease-out;
position: absolute;
border-radius: 8px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12)
}
.secondEdition .secondEditionContent .oneStop .osLeftMain .img1 {
left: -150px;
top: 10px;
z-index: 1
}
.secondEdition .secondEditionContent .oneStop .osLeftMain .img2 {
right: -150px;
top: 0;
z-index: 3;
transition-delay: 0.3s
}
.secondEdition .secondEditionContent .oneStop .osLeftMain .img3 {
left: -150px;
bottom: -50px;
z-index: 2;
transition-delay: 0.2s
}
.secondEdition .secondEditionContent .oneStop .osLeftMain .img4 {
right: -150px;
bottom: 20px;
z-index: 4;
transition-delay: 0.4s
}
.secondEdition .secondEditionContent .oneStop.activeCode {
opacity: 1
}
.secondEdition .secondEditionContent .oneStop.activeCode .osLeftMain img {
opacity: 1
}
.secondEdition .secondEditionContent .oneStop.activeCode .osLeftMain .img1 {
left: -190px;
top: 15px
}
.secondEdition .secondEditionContent .oneStop.activeCode .osLeftMain .img2 {
right: 30px;
top: 0
}
.secondEdition .secondEditionContent .oneStop.activeCode .osLeftMain .img3 {
left: -150px;
bottom: 15px;
top: 100px;
}
.secondEdition .secondEditionContent .oneStop.activeCode .osLeftMain .img4 {
right: 15px;
bottom: 20px;
top: 200px;
}
.secondEdition .secondEditionContent .oneStop.activeCode .imgring {
opacity: 1
}
.secondEdition .secondEditionContent .highDevops {
text-align: center
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img {
opacity: 1;
padding-top:10px;
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img.highImg1 {
bottom: 62px
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img.highImg2 {
bottom: 215px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle {
position: relative;
padding: 2px;
width: 384px;
height: 90px;
margin: 7px auto 0;
border-radius: 10px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle span {
position: absolute;
z-index: 3;
width: 380px;
height: 86px;
line-height: 86px;
border-radius: 10px;
left: 2px;
top: 2px;
display: inline-block;
font-size: 36px;
font-weight: 600;
background: -webkit-linear-gradient(1deg, #d57ca0 12%, #4877f3 57%, #20c3ef 76%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent
}
.secondEdition .secondEditionContent .highDevops .highDoTitle:before {
position: absolute;
z-index: 2;
width: 380px;
height: 86px;
line-height: 86px;
background-color: #fff;
border-radius: 10px;
content: "";
top: 2px;
left: 2px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle:after {
position: absolute;
content: "";
width: 100%;
height: 100%;
top: 0;
left: 0;
border-radius: 10px;
background: -webkit-linear-gradient(1deg, #d57ca0 12%, #4877f3 57%, #20c3ef 76%);
z-index: 1
}
.secondEdition .secondEditionContent .highDevops .highDoSubtitle {
color: #637497;
font-size: 20px;
line-height: 36px;
max-width: 950px;
margin: 30px auto 28px;
text-align: center
}
.secondEdition .secondEditionContent .highDevops .highDoSubtitle span {
color: #000;
font-weight: 500
}
.secondEdition .secondEditionContent .highDevops .highDoContent {
background: url(@/assets/v3/Line/2-3bg.deef1b07.png) no-repeat 50%;
background-size: cover;
height: 920px;
padding: 20px 0 114px;
position: relative;
display: flex;
flex-direction: column;
align-items: center
}
.secondEdition .secondEditionContent .highDevops .highDoContent>div {
display: flex;
flex-direction: column;
align-items: center
}
.secondEdition .secondEditionContent .highDevops .highDoContent img {
opacity: 0;
transition: 2.4s
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highImg1 {
position: absolute;
bottom: 0;
transition: 1s;
transition-delay: 1s;
left: 10px
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highImg2 {
position: absolute;
bottom: 0;
right: 10px;
transition: 2s;
transition-delay: 1s
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highDoBottondesc {
font-size: 20px;
font-weight: 500;
color: #000;
line-height: 39px
}
.secondEdition .secondEditionContent .multipleAnalyse {
background: url(@/assets/v3/Line/2-4bg.45478d20.png) no-repeat 50%;
background-size: cover;
height: 710px;
padding-left: 58px;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
opacity: .3;
transition: 2s
}
.secondEdition .secondEditionContent .multipleAnalyse.activeCode {
opacity: 1
}
.secondEdition .secondEditionContent .multipleAnalyse.activeCode .maContent {
transform: rotateY(1turn)
}
.secondEdition .secondEditionContent .multipleAnalyse .title {
display: inline-block;
font-size: 36px;
font-weight: 600;
margin-bottom: 66px;
background: -webkit-linear-gradient(1deg, #6d66ff 12%, #c148ff 57%, #f59f77 76%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
line-height: 50px;
margin-top: -20px
}
.secondEdition .secondEditionContent .multipleAnalyse .maContent {
height: 400px;
width: 600px;
background: url(@/assets/v3/Line/chuangxin1.png) no-repeat;
background-size: 100% 100%;
margin: 26px 0;
transition: 3s
}
.secondEdition .secondEditionContent .multipleAnalyse .desc {
text-align: center;
max-width: 869px;
line-height: 30px;
color: #69daf5;
font-weight: 400;
font-size: 18px
}
.secondEdition .secondEditionContent .multidimensional {
background: url(@/assets/v3/Line/2-5bg.9cca3de1.png) no-repeat 50%;
background-size: cover;
height: 1139px;
padding: 100px 0 0;
display: flex;
flex-direction: column;
opacity: .3;
transition: 1s
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf {
display: flex;
align-items: center;
position: relative;
height: 447px
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf img {
position: absolute;
left: 0;
bottom: -20px;
opacity: 0;
transition: 3s
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfTitle {
height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
line-height: 50px;
background: -webkit-linear-gradient(112deg, #d57ca0, #4877f3 51%, #20c3ef);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 70px !important
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfsubTitle {
font-size: 20px;
font-weight: 500;
line-height: 36px;
color: #000;
max-width: 350px
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfsubTitle span {
color: #637497;
font-weight: 400
}
.secondEdition .secondEditionContent .multidimensional .activeCode {
opacity: 1
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalPart img {
left: 0;
opacity: 1;
top:10
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalhalf img {
left: 380px;
opacity: 1
}
.secondEdition .secondEditionContent .multidimensinalPart {
display: flex;
align-items: center;
margin-top: 50px;
position: relative;
height: 396px;
transition: 4s
}
.secondEdition .secondEditionContent .multidimensinalPart img {
position: absolute;
left: 620px;
bottom: -20px;
opacity: 0;
transition: 3s;
}
.secondEdition .secondEditionContent .multidimensinalPart p {
max-width: 422px;
text-align: left;
font-weight: 500;
line-height: 32px;
color: #000;
font-size: 20px
}
.secondEdition .secondEditionContent .multidimensinalPart p span {
color: #637497;
font-weight: 400
}
.secondEdition .secondEditionContent .multidimensinalPart p:first-child {
margin-bottom: 55px !important
}
.ant-anchor-wrapper {
margin-left: -4px;
padding-left: 4px;
overflow: auto;
background-color: #fff;
}
.ant-anchor-wrapper {
padding-left: 2px !important
}
.ant-anchor-wrapper .ant-anchor-ink:before {
background-color: #fff
}
.ant-anchor {
box-sizing: border-box;
margin: 0;
padding: 0;
color: rgba(0, 0, 0, 0.65);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5;
list-style: none;
font-feature-settings: 'tnum';
position: relative;
padding-left: 2px;
}
.ant-anchor-ink {
position: absolute;
top: 0;
left: 0;
height: 100%;
}
.ant-anchor-ink::before {
position: relative;
display: block;
width: 2px;
height: 100%;
margin: 0 auto;
background-color: #e8e8e8;
content: ' ';
}
.ant-anchor-ink-ball {
position: absolute;
left: 50%;
display: none;
width: 8px;
height: 8px;
background-color: #fff;
border: 2px solid #466aff;
border-radius: 8px;
transform: translateX(-50%);
transition: top 0.3s ease-in-out;
}
.wdsdsf{
margin-left: -100px;
}
html li {
list-style: none;
}
a {
color: #466aff;
text-decoration: none;
background-color: transparent;
outline: none;
cursor: pointer;
transition: color 0.3s;
-webkit-text-decoration-skip: objects;
}
div,
img,
tr,
td,
table {
border: 0;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
div {
display: block;
}
img {
vertical-align: middle;
border-style: none;
}
img,
video {
max-width: none;
height: revert-layer;
display: inline;
}
.hadoopCode {
margin-left: 32px;
//box-shadow: 0 0 0 2px hsla(0, 0%, 100%, .1);
border-radius: 10px;
padding: 18px 20px;
flex: 1;
margin-top: 60px;
position: relative;
}
.hadoopCode>img {
position: absolute;
right: -50px;
bottom: -50px;
width: 805px;
border-radius: 4px;
opacity: 0;
z-index: 1;
}
.activeCode>img.activeImg {
right: 0;
top: 30px;
opacity: 1;
width: 705px;
transition: 1s;
transition-delay: 3s;
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalhalf img {
left: 380px;
opacity: 1;
}
</style>

View File

@@ -0,0 +1,807 @@
<template>
<div class="secondEditionContent">
<div class="hadoop" id="hadoop">
<div class="hadoopCon">
<div class="descBox">
<p class="desc1">产品介绍</p>
<p class="desc2">
<b>📍 定位</b><br>
多端安全智能防护全场景风险感知实时安全监测
</p>
<p class="desc3">
<b>👥 目标客户</b><br>
车联网APP安全无人机安全具身智能安全工业IoT安全
</p>
<p class="desc3" style="margin-top: 50px;">
<b>💼 核心技术路线</b><br>
轻量级语义模型 深度图谱分析 持续演化学习
</p>
</div>
<div class="hadoopCode activeCode" :ref="(el) => setTargetRef(el, 'hadoop')">
<img src="@/assets/v3/Line/zhineng.png" alt="智能终端安全监测平台威胁分析界面" class="activeImg">
</div>
</div>
<!-- <p class="hadoopdesc">守护终端运行无界</p> -->
</div>
<div class="oneStop" :ref="(el) => setTargetRef(el, 'oneStop')" id="oneStop">
<div class="oneStopContent">
<div class="osLeftMain"><img src="@/assets/v3/Line/znzd3.png" alt="" width="520px"
class="osleftPosi"><img src="@/assets/v3/Line/2-2-head.5e69dbb2.png" alt=""
width="213px" style="margin-left: -12px;"><img
src="@/assets/v3/Line/znzd2.png" alt="" width="653px" class="osleftPosi1"><img
src="@/assets/v3/Line/znzd10.png" alt="" height="330px" width="367px" class="osleftPosi2"></div>
<div class="osRightMain">
<p class="osRightTitle">💡 平台概述</p>
<p><b>智能终端安全检测平台专注于移动应用程序和终端设备的安全防护</b>提供从应用上架审核到实时运行监控的全生命周期安全治理方案</p>
<p><b> 毫秒级检测审核速度</b>支持海量应用快速扫描</p>
<p><b> 实时阻断恶意代码</b>主动挖掘零日威胁</p>
<p><b> 主动挖掘零日威胁</b>持续发现新型攻击手段</p>
</div>
</div>
<img src="@/assets/v3/Line/2-2-1.bcb33d47.png" alt="" height="83px" class="imgring">
</div>
<div class="highDevops" :ref="(el) => setTargetRef(el, 'highDevops')" id="highDevops">
<div class="highDoTitle"><span> 核心技术路线</span></div>
<div class="highDoSubtitle">
<b>采用"轻量级语义模型 → 深度图谱分析 → 持续演化学习"技术路线</b><br><br>
以轻量级高效预处理或数据调用与权限列表关系实现用户应用快速检测通过动态抗拒技术实现对恶意API调用的监控基于AI的行为分析模型识别已知和未知威胁提供实时告警与自启动应对机制
</div>
<div class="highDoContent">
<div><img src="@/assets/v3/Line/znzd4.png" alt="" width="794px">
<div style="margin-bottom: 100px; margin-top: 25px; position: relative;"><img
src="@/assets/v3/Line/znzd11.png" alt="" width="520px"></div>
<img src="@/assets/v3/Line/znzd9.png" alt="" width="427px" class="highImg2"><img
src="@/assets/v3/Line/znzd8.png" alt="" width="413px" class="highImg1"></div>
<!-- <p class="highDoBottondesc">实现 <b>终端安全事件的可视化可追溯可阻断</b></p> -->
</div>
</div>
<div class="multipleAnalyse" :ref="(el) => setTargetRef(el, 'multipleAnalyse')" id="multipleAnalyse">
<span class="title">📊 核心优势</span>
<div class="maContent">
</div>
<p class="desc">
<b> 检测精度</b>95% - 高精确下实现零误杀工业化检测显著优于主流工具<br>
<b> Zero-day样本</b>530 - 在Google Play实战中发现的现有防护体系未发现的样本<br>
<b> 跨平台特征覆盖</b>免人工干预应急响应不依赖已知特征库的零日挖掘能力<br>
<b> 毫秒级检测速度</b>轻量级语义模型与高效预处理理论实现用户应用快速检测审核极大提升大规模检测效率<br>
<b> 零日威胁挖掘</b>不依赖已知特征库的零日挖掘能力主动发现未知威胁提前防护下一代攻击<br>
<b> 社会动力学识别</b>首创基于社会动力学中心度亲密度同质性识别恶意软件提高购买性恶意软件检测率<br>
<b> 持续演化学习</b>构建抗拒概念漂移的持续演化检测框架随着恶意软件变化自动调整检测策略保持长期有效性
</p>
</div>
<div class="multidimensional" style="opacity: 1">
<div style="height: 168px;"></div>
<div class="" :ref="(el) => setTargetRef(el, 'multidimensional')" id="multidimensional">
<div class="multidimensinalhalf">
<div>
<p class="halfTitle">🚗 应用场景</p>
<p class="halfsubTitle">
<b>车联网安全</b><br>
车载系统组件生命周期安全全检测<br>
车载软件供应链风险检测<br>
运行安全监测与漏洞修复
</p>
</div>
<div style="width: 820px; margin-left: 34px;"><img src="@/assets/v3/Line/znzd5.png" alt=""
width="820px"></div>
</div>
<div class="multidimensinalPart">
<div style="width: 614px; margin-right: 40px;"><img src="@/assets/v3/Line/znzd6.png" alt=""
width="614px"></div>
<div>
<p class="halfsubTitle">
<b>无人机安全</b><br>
飞控系统代码安全审计<br>
防止与飞行器通讯安全监测<br>
通信链路劫持风险身份认证<br><br>
<b>工业IoT安全</b><br>
工业控制系统(ICS)安全监测<br>
物联网设备固件安全分析<br>
OT与IT融合安全防护
</p>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted, nextTick } from 'vue';
// 1. 定义响应式对象存储所有目标元素标识DOM元素
const targetElements = ref({});
// 2. 存储交叉观察者实例
let observer = null;
// 3. 规范的 ref 收集函数:处理元素挂载/卸载
const setTargetRef = (el, key) => {
if (el) {
// 元素挂载:存入对象
targetElements.value[key] = el;
} else {
// 元素卸载:从对象中移除
delete targetElements.value[key];
}
};
// 4. 初始化交叉观察者(批量监听)
const initObserver = () => {
// 获取所有元素的数组
const elements = Object.values(targetElements.value);
if (elements.length === 0) return;
const observerOptions = {
root: null,
rootMargin: '0px',
threshold: 0.1,
};
const observerCallback = (entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add('activeCode');
} else {
// 可选:离开视口时移除类
// entry.target.classList.remove('activeCode');
}
});
};
observer = new IntersectionObserver(observerCallback, observerOptions);
// 批量监听所有元素
elements.forEach((el) => {
observer.observe(el);
});
};
// 5. 组件挂载时等待DOM渲染完成后初始化
onMounted(async () => {
// 清空原有元素(防止重渲染重复)
targetElements.value = {};
await nextTick(); // 等待DOM渲染完成
initObserver();
});
// 6. 组件卸载时:批量销毁观察者
onUnmounted(() => {
if (observer) {
// 停止监听所有元素
Object.values(targetElements.value).forEach((el) => {
observer.unobserve(el);
});
observer.disconnect();
observer = null;
}
});
</script>
<style lang="scss" scoped>
.secondEdition .theTitle {
height: 53px;
line-height: 53px;
font-size: 38px;
font-weight: 500;
color: #1e1e1e;
text-align: center;
margin: 42px 0 30px !important
}
.secondEdition .ant-affix {
background-color: #fff;
box-shadow: 0 2px 7px 0 rgba(0, 0, 0, .09)
}
.secondEdition .ant-anchor-wrapper {
width: 1200px;
margin: 0 auto;
padding-left: 0
}
.secondEdition .ant-anchor-wrapper .ant-anchor {
display: flex;
align-items: center;
justify-content: center
}
.secondEdition .ant-anchor-wrapper .ant-anchor .ant-anchor-ink {
width: 100%;
height: 1px;
border-bottom: 1px solid hsla(0, 0%, 60%, .5);
bottom: 0;
top: auto
}
.secondEdition .ant-anchor-wrapper .ant-anchor li {
padding: 18px 19px;
margin: 0 10px;
position: relative;
font-size: 18px
}
.secondEdition .ant-anchor-wrapper .ant-anchor li a {
color: #333 !important
}
.secondEdition .ant-anchor-wrapper .ant-anchor li.active:after {
position: absolute;
left: 0;
bottom: 0;
height: 2px;
background-color: #466aff;
content: "";
width: 100%
}
.secondEdition .secondEditionContent {
padding: 65px 0;
width: 1200px;
margin: 0 auto
}
.secondEdition .secondEditionContent .hadoop {
background: url(@/assets/v3/Line/2-1bg.d22a63b9.png) no-repeat 50%;
background-size: cover;
min-height: 753px;
padding: 50px 56px
}
.secondEdition .secondEditionContent .hadoop .hadoopCon {
display: flex;
width: 100%
}
.secondEdition .secondEditionContent .hadoop .descBox {
max-width: 352px;
word-break: break-all
}
.secondEdition .secondEditionContent .hadoop .descBox .desc1 {
height: 50px;
line-height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
background: -webkit-linear-gradient(90deg, #50edff, #557cff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent
}
.secondEdition .secondEditionContent .hadoop .descBox .desc2 {
height: 72px;
font-size: 18px;
font-weight: 500;
color: #69daf5;
line-height: 36px;
margin-top: 18px
}
.secondEdition .secondEditionContent .hadoop .descBox .desc3 {
height: 108px;
font-size: 18px;
font-weight: 500;
color: #fff;
line-height: 36px;
margin-top: 70px
}
.secondEdition .secondEditionContent .hadoop .hadoopdesc {
color: #fff;
background: -webkit-linear-gradient(112deg, #ff8b75, #dd2476);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-size: 18px;
line-height: 25px;
font-weight: 500;
text-align: center;
margin-top: 40px
}
.secondEdition .secondEditionContent .oneStop {
text-align: center;
opacity: .3;
transition: 2s
}
.secondEdition .secondEditionContent .oneStop .oneStopContent {
display: flex
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osLeftMain {
display: flex;
justify-content: flex-start;
align-items: flex-start;
position: relative;
margin-bottom: 182px
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain {
margin-left: 22px;
text-align: left
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain .osRightTitle {
height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
line-height: 50px;
background: -webkit-linear-gradient(112deg, #ff8b75, #dd2476);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-top: 28px
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain p {
font-size: 20px;
color: #637497;
line-height: 36px;
margin-top: 50px;
margin-bottom: 0 !important
}
.secondEdition .secondEditionContent .oneStop .oneStopContent .osRightMain p span {
color: #000;
font-weight: 500
}
.secondEdition .secondEditionContent .oneStop .imgring, .secondEdition .secondEditionContent .oneStop .osleftPosi {
transition: 3s;
opacity: 0
}
.secondEdition .secondEditionContent .oneStop .osleftPosi1, .secondEdition .secondEditionContent .oneStop .osleftPosi2 {
position: absolute;
right: -200px;
top: 102px;
transition: 2s;
opacity: 0;
z-index: 1
}
.secondEdition .secondEditionContent .oneStop .osleftPosi2 {
top: 317px;
right: 10px;
transition: 2.5s;
z-index: 2
}
.secondEdition .secondEditionContent .oneStop.activeCode, .secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi, .secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi1, .secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi2 {
opacity: 1
}
.secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi1 {
right: 10px
}
.secondEdition .secondEditionContent .oneStop.activeCode .osleftPosi2 {
top: 217px
}
.secondEdition .secondEditionContent .oneStop.activeCode .imgring {
opacity: 1
}
.secondEdition .secondEditionContent .highDevops {
text-align: center
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img {
opacity: 1
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img.highImg1 {
bottom: 62px
}
.secondEdition .secondEditionContent .highDevops.activeCode .highDoContent img.highImg2 {
bottom: 215px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle {
position: relative;
padding: 2px;
width: 384px;
height: 90px;
margin: 7px auto 0;
border-radius: 10px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle span {
position: absolute;
z-index: 3;
width: 380px;
height: 86px;
line-height: 86px;
border-radius: 10px;
left: 2px;
top: 2px;
display: inline-block;
font-size: 36px;
font-weight: 600;
background: -webkit-linear-gradient(1deg, #d57ca0 12%, #4877f3 57%, #20c3ef 76%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent
}
.secondEdition .secondEditionContent .highDevops .highDoTitle:before {
position: absolute;
z-index: 2;
width: 380px;
height: 86px;
line-height: 86px;
background-color: #fff;
border-radius: 10px;
content: "";
top: 2px;
left: 2px
}
.secondEdition .secondEditionContent .highDevops .highDoTitle:after {
position: absolute;
content: "";
width: 100%;
height: 100%;
top: 0;
left: 0;
border-radius: 10px;
background: -webkit-linear-gradient(1deg, #d57ca0 12%, #4877f3 57%, #20c3ef 76%);
z-index: 1
}
.secondEdition .secondEditionContent .highDevops .highDoSubtitle {
color: #637497;
font-size: 20px;
line-height: 36px;
max-width: 950px;
margin: 30px auto 28px;
text-align: center
}
.secondEdition .secondEditionContent .highDevops .highDoSubtitle span {
color: #000;
font-weight: 500
}
.secondEdition .secondEditionContent .highDevops .highDoContent {
background: url(@/assets/v3/Line/2-3bg.deef1b07.png) no-repeat 50%;
background-size: cover;
height: 920px;
padding: 20px 0 114px;
position: relative;
display: flex;
flex-direction: column;
align-items: center
}
.secondEdition .secondEditionContent .highDevops .highDoContent > div {
display: flex;
flex-direction: column;
align-items: center
}
.secondEdition .secondEditionContent .highDevops .highDoContent img {
opacity: 0;
transition: 2.4s
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highImg1 {
position: absolute;
bottom: 0;
transition: 1s;
transition-delay: 1s;
left: 10px
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highImg2 {
position: absolute;
bottom: 0;
right: 10px;
transition: 2s;
transition-delay: 1s
}
.secondEdition .secondEditionContent .highDevops .highDoContent .highDoBottondesc {
font-size: 20px;
font-weight: 500;
color: #000;
line-height: 39px
}
.secondEdition .secondEditionContent .multipleAnalyse {
background: url(@/assets/v3/Line/2-4bg.45478d20.png) no-repeat 50%;
background-size: cover;
height: 710px;
padding-left: 58px;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
opacity: .3;
transition: 2s
}
.secondEdition .secondEditionContent .multipleAnalyse.activeCode {
opacity: 1
}
.secondEdition .secondEditionContent .multipleAnalyse.activeCode .maContent {
transform: rotateY(1turn)
}
.secondEdition .secondEditionContent .multipleAnalyse .title {
display: inline-block;
font-size: 36px;
font-weight: 600;
margin-bottom: 26px;
background: -webkit-linear-gradient(1deg, #6d66ff 12%, #c148ff 57%, #f59f77 76%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
line-height: 50px;
margin-top: 20px
}
.secondEdition .secondEditionContent .multipleAnalyse .maContent {
height: 400px;
width: 723px;
background: url(@/assets/v3/Line/znzd7.png) no-repeat;
background-size: 100% 100%;
margin: 26px 0;
transition: 3s
}
.secondEdition .secondEditionContent .multipleAnalyse .desc {
text-align: center;
max-width: 869px;
line-height: 30px;
color: #69daf5;
font-weight: 400;
font-size: 18px
}
.secondEdition .secondEditionContent .multidimensional {
background: url(@/assets/v3/Line/2-5bg.9cca3de1.png) no-repeat 50%;
background-size: cover;
height: 1139px;
padding: 100px 0 0;
display: flex;
flex-direction: column;
opacity: .3;
transition: 1s
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf {
display: flex;
align-items: center;
position: relative;
height: 447px
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf img {
position: absolute;
left: 0;
bottom: -20px;
opacity: 0;
transition: 3s
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfTitle {
height: 50px;
font-size: 36px;
font-weight: 600;
color: #fff;
line-height: 50px;
background: -webkit-linear-gradient(112deg, #d57ca0, #4877f3 51%, #20c3ef);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 70px !important
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfsubTitle {
font-size: 20px;
font-weight: 500;
line-height: 36px;
color: #000;
max-width: 350px
}
.secondEdition .secondEditionContent .multidimensional .multidimensinalhalf .halfsubTitle span {
color: #637497;
font-weight: 400
}
.secondEdition .secondEditionContent .multidimensional .activeCode {
opacity: 1
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalPart img {
left: 0;
opacity: 1
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalhalf img {
left: 380px;
opacity: 1
}
.secondEdition .secondEditionContent .multidimensinalPart {
display: flex;
align-items: center;
margin-top: 50px;
position: relative;
height: 396px;
transition: 4s
}
.secondEdition .secondEditionContent .multidimensinalPart img {
position: absolute;
left: 620px;
bottom: -20px;
opacity: 0;
transition: 3s
}
.secondEdition .secondEditionContent .multidimensinalPart p {
max-width: 422px;
text-align: left;
font-weight: 500;
line-height: 32px;
color: #000;
font-size: 20px
}
.secondEdition .secondEditionContent .multidimensinalPart p span {
color: #637497;
font-weight: 400
}
.secondEdition .secondEditionContent .multidimensinalPart p:first-child {
margin-bottom: 55px !important
}
.ant-anchor-wrapper {
margin-left: -4px;
padding-left: 4px;
overflow: auto;
background-color: #fff;
}
.ant-anchor-wrapper {
padding-left: 2px !important
}
.ant-anchor-wrapper .ant-anchor-ink:before {
background-color: #fff
}
.ant-anchor {
box-sizing: border-box;
margin: 0;
padding: 0;
color: rgba(0, 0, 0, 0.65);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5;
list-style: none;
font-feature-settings: 'tnum';
position: relative;
padding-left: 2px;
}
.ant-anchor-ink {
position: absolute;
top: 0;
left: 0;
height: 100%;
}
.ant-anchor-ink::before {
position: relative;
display: block;
width: 2px;
height: 100%;
margin: 0 auto;
background-color: #e8e8e8;
content: ' ';
}
.ant-anchor-ink-ball {
position: absolute;
left: 50%;
display: none;
width: 8px;
height: 8px;
background-color: #fff;
border: 2px solid #466aff;
border-radius: 8px;
transform: translateX(-50%);
transition: top 0.3s ease-in-out;
}
html li {
list-style: none;
}
a {
color: #466aff;
text-decoration: none;
background-color: transparent;
outline: none;
cursor: pointer;
transition: color 0.3s;
-webkit-text-decoration-skip: objects;
}
div, img, tr, td, table {
border: 0;
}
*, *::before, *::after {
box-sizing: border-box;
}
div {
display: block;
}
img {
vertical-align: middle;
border-style: none;
}
img, video {
max-width: none;
height: revert-layer;
display: inline;
}
.hadoopCode {
margin-left: 32px;
//box-shadow: 0 0 0 2px hsla(0,0%,100%,.1);
border-radius: 10px;
padding: 18px 20px;
flex: 1;
margin-top: 60px;
position: relative;
}
.hadoopCode>img {
position: absolute;
right: -50px;
bottom: -50px;
width: 805px;
border-radius: 4px;
opacity: 0;
z-index: 1;
}
.activeCode>img.activeImg {
right: 0;
top: 0px;
opacity: 1;
width: 705px;
transition: 1s;
transition-delay: 3s;
}
.secondEdition .secondEditionContent .multidimensional .activeCode .multidimensinalhalf img {
left: 380px;
opacity: 1;
}
</style>

View File

@@ -0,0 +1,78 @@
<template>
<div class="com-rank">
<div class="rank-item wow xsddhxg animated" style="visibility: visible;">
<h5 class="JBFont">
<span class="comStatistic" data-animation-running="false">95</span>%
</h5>
<p>漏洞识别****准确率<br>确保威胁分析的可靠性</p>
</div>
<div class="rank-item wow xsddhxg animated" style="visibility: visible;">
<h5 class="JBFont">
<span class="comStatistic" data-animation-running="false">15</span>+
</h5>
<p>覆盖**车联网IoT金融**<br> 15+ 行业场景</p>
</div>
<div class="rank-item wow xsddhxg animated" style="visibility: visible;">
<h5 class="JBFont">
<span class="comStatistic" data-animation-running="false">60</span>+
</h5>
<p>SaaS订阅企业目标<br>助力中小企业实现安全左移</p>
</div>
<div class="rank-item wow xsddhxg animated" style="visibility: visible;">
<h5 class="JBFont">
<span class="comStatistic" data-animation-running="false">98</span>%
</h5>
<p>****风险场景仿真相似度<br>高度还原真实攻击环境</p>
</div>
</div>
</template>
<script>
export default {
name: "ComSystem"
}
</script>
<style scoped lang="scss">
// 样式保持不变,以确保排版一致
.com-rank {
background-color: #f5f5f5;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
padding: 100px 0 50px;
text-align: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
background: url(@/assets/v3/index-top-bg.D8cqOFJJ.png) no-repeat bottom;
background-size: cover;
justify-content: center; /* 确保内容居中 */
}
.com-rank .rank-item {
padding: 0 40px; /* 调整间距以容纳四个指标 */
width: 360px; /* 调整宽度以容纳四个指标 */
}
.com-rank .rank-item h5 {
font-family: Avenir;
font-size: 70px;
font-weight: 400;
letter-spacing: 2px;
line-height: 109px
}
.com-rank .rank-item p {
color: #333;
font-size: 16px;
font-weight: 400;
letter-spacing: .5px;
line-height: 24px;
margin: 30px 0 0
}
</style>

View File

@@ -0,0 +1,198 @@
<template>
<div class="com-safe">
<div class="safe-tit wow xsddhxg animated" style="visibility: visible;">
<div class="safe-swip"><span></span>
<div class="swiper swiper-initialized swiper-vertical swiper-backface-hidden">
<div class="swiper-wrapper"
style="transition-duration: 0ms; transform: translate3d(0px, -70px, 0px); transition-delay: 0ms;">
<div class="swiper-slide swiper-slide-next swiper-slide-prev" data-swiper-slide-index="0"
style="height: 70px;"><h5><span class="JBFont">技术驱动</span></h5><!----></div>
<div class="swiper-slide swiper-slide-active" data-swiper-slide-index="1" style="height: 70px;"><h5><span
class="JBFont">实战攻防</span></h5><!----></div>
</div><!----><!----><!----></div>
<span></span>
<div class="swiper swiper-initialized swiper-vertical swiper-backface-hidden">
<div class="swiper-wrapper"
style="transition-duration: 0ms; transform: translate3d(0px, -70px, 0px); transition-delay: 0ms;">
<div class="swiper-slide swiper-slide-next swiper-slide-prev" data-swiper-slide-index="0"
style="height: 70px;"><h5><span class="JBFont">场景沉淀</span></h5><!----></div>
<div class="swiper-slide swiper-slide-active" data-swiper-slide-index="1" style="height: 70px;"><h5><span
class="JBFont">智能安全</span></h5><!----></div>
</div><!----><!----><!----></div>
</div><!----></div>
<div class="safe-item wow xsddhxg animated" style="visibility: visible;"><span class="num">/ 01</span><img
src="@/assets/v3/7a87c819de3a45f69d1697d6344f5483.gif">
<div class="item-r"><h6 class="MultiLine"><a class="EASE" href="https://www.chaitin.cn/solutions">防勒索专项解决方案</a>
</h6>
<div class="desc-out MultiLine"><p class="desc"><a class="EASE" href="https://www.chaitin.cn/solutions">此方案针对勒索攻击特点和企业在防护过程中的薄弱点借鉴
IPDRR 架构建立风险识别防御检测响应与恢复的能力提升应对勒索攻击的能力覆盖事前安全布防事中监测处置和事后复盘优化同时具备对防范勒索攻击体系有效性的验证能力</a></p></div>
<a class="EASE btn-more LNK" href="https://www.chaitin.cn/solutions">了解更多 <i class="EASE ICO ic-arow"></i></a>
</div>
</div>
<div class="safe-item wow xsddhxg animated" style="visibility: visible;"><span class="num">/ 02</span><img
src="@/assets/v3/b173212bc7814f28b4674b9cff1097ed.gif">
<div class="item-r"><h6 class="MultiLine"><a class="EASE"
href="https://www.chaitin.cn/solutions?tab=hot&amp;catId=3">实战攻防常态化保障方案</a>
</h6>
<div class="desc-out MultiLine"><p class="desc"><a class="EASE"
href="https://www.chaitin.cn/solutions?tab=hot&amp;catId=3">通过组建高质量远程值守团队虚拟坐席无需客户数据出网提供远程值守同时基于云图御衡万象等自动化平台降低人工成本提供弹性演练策略消除监控真空期针对一系列专项推出勒索演练两高一弱自查0
Day演练等方案可在演练期兼顾各类专项工作保障总体成效</a></p></div>
<a class="EASE btn-more LNK" href="https://www.chaitin.cn/solutions?tab=hot&amp;catId=3">了解更多 <i
class="EASE ICO ic-arow"></i></a></div>
</div>
<div class="safe-item wow xsddhxg animated" style="visibility: visible;"><span class="num">/ 03</span><img
src="@/assets/v3/a631f17938ec427eb0efcaf7ef19d716.gif">
<div class="item-r"><h6 class="MultiLine"><a class="EASE"
href="https://www.chaitin.cn/solutions?tab=hot&amp;catId=2">CTEM-漏洞运营解决方案</a>
</h6>
<div class="desc-out MultiLine"><p class="desc"><a class="EASE"
href="https://www.chaitin.cn/solutions?tab=hot&amp;catId=2">此方案结合企业现状及漏洞管理成熟度针对性地建立常态化漏洞巡检突发漏洞响应专项漏洞管理漏洞优先级排序漏洞闭环流转等机制实现资产暴露面漏洞的精准发现进而建立覆盖漏洞全生命周期的自动化管理体系实现风险处置的快速闭环</a>
</p></div>
<a class="EASE btn-more LNK" href="https://www.chaitin.cn/solutions?tab=hot&amp;catId=2">了解更多 <i
class="EASE ICO ic-arow"></i></a></div>
</div>
</div>
</template>
<script>
export default {
name: "ComSafe"
}
</script>
<style lang="scss" scoped>
.com-safe {
padding-top: 50px
}
.com-safe .safe-tit {
color: #333;
font-size: 28px;
font-weight: 400;
height: 40px;
letter-spacing: 1.7px;
line-height: 40px;
margin-bottom: 40px;
overflow: hidden;
text-align: center
}
.com-safe .safe-tit span {
margin: 0 20px
}
.com-safe .safe-tit .safe-swip {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center
}
.com-safe .safe-tit .safe-swip .swiper {
height: 40px;
margin: 0
}
.com-safe .safe-item {
border-top: 1px solid #969696;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
margin: 0 auto;
padding: 63px 0 63px 177px;
position: relative;
width: 1351px
}
.com-safe .safe-item .desc-out {
-webkit-line-clamp: 3
}
.com-safe .safe-item:hover img {
-webkit-transform: scale(1.08);
transform: scale(1.08)
}
.com-safe .safe-item:hover .item-r .btn-more {
background-color: #4bad52;
color: #fff
}
.com-safe .safe-item:hover .item-r .btn-more .ICO {
left: 15px
}
.com-safe .safe-item .num {
color: #1a1a1a;
font-size: 14px;
font-weight: 400;
left: 0;
line-height: 20px;
position: absolute;
top: 76px
}
.com-safe .safe-item img {
height: auto;
-o-object-fit: contain;
object-fit: contain;
width: 160px;
-ms-flex-negative: 0;
flex-shrink: 0
}
.com-safe .safe-item .item-r {
padding: 6px 177px 0 148px
}
.com-safe .safe-item .item-r h6 {
color: #333;
font-size: 20px;
font-weight: 400;
height: 30px;
letter-spacing: .5px;
line-height: 30px;
margin-bottom: 27px;
-webkit-line-clamp: 1
}
.com-safe .safe-item .item-r .desc {
color: #333;
font-size: 14px;
font-style: normal;
font-weight: 400;
letter-spacing: .5px;
line-height: 24px
}
.com-safe .safe-item .item-r .btn-more {
background: #7aba4a;
border-radius: 8px;
color: #fff;
display: block;
height: 38px;
line-height: 38px;
margin: 51px 0 0;
text-align: center;
width: 140px
}
.com-safe .safe-item .item-r .btn-more .ICO {
left: 7px;
position: relative
}
.com-safe .safe-item .item-r .btn-more:hover {
background-color: #4bad52;
color: #fff
}
.com-safe .safe-item .item-r .btn-more:hover .ICO {
left: 15px
}
</style>

View File

@@ -0,0 +1,39 @@
<template>
<div class="com-system"><p class="tip wow xsddhxg animated" style="margin: 0px; visibility: visible;">
知攻善防由攻击视角构建防御体系</p>
<p class="tip tip2 wow xsddhxg animated" style="visibility: visible;">智能安全 AI 驱动重塑安全范式</p><img
class="wow xsddhxg animated" src="@/assets/v3/system-zh.png" alt="立足于攻防,打造智能安全运营体系"
style="visibility: visible;"><!----></div>
</template>
<script>
export default {
name: "ComSystem"
}
</script>
<style scoped lang="scss">
.com-system {
background-color: #050705;
padding: 97px 0 125px;
position: relative;
text-align: center
}
.com-system img {
display: block;
margin: 0 auto;
width: 1200px
}
.com-system .tip {
color: #fff;
font-size: 28px;
font-weight: 400;
letter-spacing: 1.7px;
line-height: 40px;
margin-bottom: 46px;
text-align: center;
width: 100%
}
</style>

View File

@@ -0,0 +1,53 @@
<template>
<div class="com-video"><h5 class="wow xsddhxg animated" style="visibility: visible;">4000+ 客户信赖之选</h5>
<div class="v-in wow xsddhxg animated" style="visibility: visible;">
<video class="video" preload="none" controls="" controlslist="nodownload" loop=""
poster=""
src="https://chaitin-marketing-public.oss-cn-beijing.aliyuncs.com/%E9%95%BF%E4%BA%AD%E6%A1%88%E4%BE%8B_250402.mp4"></video>
</div>
</div>
</template>
<script>
export default {
name: "ComVideo"
}
</script>
<style lang="scss" scoped>
.com-video {
padding: 23px 0 0
}
.com-video h5 {
color: #333;
font-size: 28px;
font-weight: 400;
letter-spacing: 1.7px;
line-height: 40px;
text-align: center
}
.com-video .v-in {
overflow: hidden;
overflow-x: scroll;
padding: 40px 0 100px;
width: 100%
}
.com-video .v-in > * {
display: block;
margin: 0 auto
}
.pg-home .video {
display: block;
height: auto;
margin: 0 auto;
max-width: 1440px;
-o-object-fit: cover;
object-fit: cover;
width: 100%;
}
</style>

View File

@@ -0,0 +1,625 @@
<template>
<d-breadcrumb class="secret-breadcrumb">
<gc-breadcrumb-item :to="{ name: 'home' }"><span class="title">首页</span></gc-breadcrumb-item>
<gc-breadcrumb-item>
<span class="cur-title">安全情报与动态</span>
</gc-breadcrumb-item>
</d-breadcrumb>
<div class="page-wrap">
<!-- 情报分类标签页 -->
<Card class="info-main-card">
<div class="info-title">安全情报与动态</div>
<d-tabs v-model="activeTab" @change="handleTabChange" class="info-tabs">
<!-- 漏洞预警 -->
<d-tab id="vulnerability" title="漏洞预警">
<div class="info-stats">
<d-row :gutter="16">
<d-col :span="6">
<d-card class="stat-card">
<div class="stat-title">高危漏洞</div>
<div class="stat-value">{{ vulnerabilityStats.critical }}</div>
<div class="stat-trend" :class="{ up: vulnerabilityTrends.critical > 0, down: vulnerabilityTrends.critical < 0 }">
{{ vulnerabilityTrends.critical > 0 ? '+' : '' }}{{ vulnerabilityTrends.critical }}% 较上周
</div>
</d-card>
</d-col>
<d-col :span="6">
<d-card class="stat-card">
<div class="stat-title">中危漏洞</div>
<div class="stat-value">{{ vulnerabilityStats.high }}</div>
<div class="stat-trend" :class="{ up: vulnerabilityTrends.high > 0, down: vulnerabilityTrends.high < 0 }">
{{ vulnerabilityTrends.high > 0 ? '+' : '' }}{{ vulnerabilityTrends.high }}% 较上周
</div>
</d-card>
</d-col>
<d-col :span="6">
<d-card class="stat-card">
<div class="stat-title">低危漏洞</div>
<div class="stat-value">{{ vulnerabilityStats.medium }}</div>
<div class="stat-trend" :class="{ up: vulnerabilityTrends.medium > 0, down: vulnerabilityTrends.medium < 0 }">
{{ vulnerabilityTrends.medium > 0 ? '+' : '' }}{{ vulnerabilityTrends.medium }}% 较上周
</div>
</d-card>
</d-col>
<d-col :span="6">
<d-card class="stat-card">
<div class="stat-title">本月新增</div>
<div class="stat-value">{{ vulnerabilityStats.total }}</div>
<div class="stat-trend" :class="{ up: vulnerabilityTrends.total > 0, down: vulnerabilityTrends.total < 0 }">
{{ vulnerabilityTrends.total > 0 ? '+' : '' }}{{ vulnerabilityTrends.total }}% 较上月
</div>
</d-card>
</d-col>
</d-row>
</div>
<d-table
:data="vulnerabilityList"
class="jyh-table "
table-layout="auto"
:show-loading="loading"
>
<d-column type="index" width="50"></d-column>
<d-column field="title" header="漏洞名称" :width="400">
<template #default="scope">
<a class="title-link" @click="showDetail(scope.row)">{{ scope.row.title }}</a>
</template>
</d-column>
<d-column field="cveId" header="CVE编号"></d-column>
<d-column field="severity" header="危险等级">
<template #default="scope">
<d-tag :type="getSeverityType(scope.row.severity)">{{ scope.row.severity }}</d-tag>
</template>
</d-column>
<d-column field="publishTime" header="发布时间">
<template #default="scope">{{ formatTime(scope.row.publishTime) }}</template>
</d-column>
<d-column field="affectScope" header="影响范围" :width="200">
<template #default="scope">{{ scope.row.affectScope }}</template>
</d-column>
</d-table>
</d-tab>
<!-- 政策解读 -->
<d-tab id="policy" title="政策解读">
<d-table
:data="policyList"
class="info-table"
table-layout="auto"
:show-loading="loading"
>
<d-column type="index" width="50"></d-column>
<d-column field="title" header="政策标题" :width="400">
<template #default="scope">
<a class="title-link" @click="showDetail(scope.row)">{{ scope.row.title }}</a>
</template>
</d-column>
<d-column field="department" header="发布部门"></d-column>
<d-column field="level" header="政策级别">
<template #default="scope">
<d-tag :type="getPolicyLevelType(scope.row.level)">{{ scope.row.level }}</d-tag>
</template>
</d-column>
<d-column field="publishTime" header="发布时间">
<template #default="scope">{{ formatTime(scope.row.publishTime) }}</template>
</d-column>
<d-column field="effectiveDate" header="生效日期">
<template #default="scope">{{ formatTime(scope.row.effectiveDate) }}</template>
</d-column>
</d-table>
</d-tab>
<!-- 技术专栏 -->
<d-tab id="technology" title="技术专栏">
<d-table
:data="technologyList"
class="info-table"
table-layout="auto"
:show-loading="loading"
>
<d-column type="index" width="50"></d-column>
<d-column field="title" header="文章标题" :width="400">
<template #default="scope">
<a class="title-link" @click="showDetail(scope.row)">{{ scope.row.title }}</a>
</template>
</d-column>
<d-column field="author" header="作者/机构"></d-column>
<d-column field="category" header="技术分类">
<template #default="scope">
<d-tag type="info">{{ scope.row.category }}</d-tag>
</template>
</d-column>
<d-column field="publishTime" header="发布时间">
<template #default="scope">{{ formatTime(scope.row.publishTime) }}</template>
</d-column>
<d-column field="readCount" header="阅读量">
<template #default="scope">{{ scope.row.readCount }}</template>
</d-column>
</d-table>
</d-tab>
<!-- 新闻发布 -->
<d-tab id="news" title="新闻发布">
<d-table
:data="newsList"
class="info-table"
table-layout="auto"
:show-loading="loading"
>
<d-column type="index" width="50"></d-column>
<d-column field="title" header="新闻标题" :width="400">
<template #default="scope">
<a class="title-link" @click="showDetail(scope.row)">{{ scope.row.title }}</a>
</template>
</d-column>
<d-column field="source" header="新闻来源"></d-column>
<d-column field="category" header="新闻分类">
<template #default="scope">
<d-tag type="secondary">{{ scope.row.category }}</d-tag>
</template>
</d-column>
<d-column field="publishTime" header="发布时间">
<template #default="scope">{{ formatTime(scope.row.publishTime) }}</template>
</d-column>
<d-column field="importance" header="重要程度">
<template #default="scope">
<d-tag :type="getImportanceType(scope.row.importance)">{{ scope.row.importance }}</d-tag>
</template>
</d-column>
</d-table>
</d-tab>
</d-tabs>
<!-- 分页 -->
<div class="pagination-container" v-if="currentList.length > 0">
<d-pagination
size="md"
:page-size-options="[10, 20, 50]"
:total="pager.total"
v-model:pageSize="pager.pageSize"
v-model:pageIndex="pager.pageIndex"
:max-items="5"
:can-change-page-size="true"
:can-view-total="true"
total-item-text="总计"
@page-index-change="handlePageChange"
@page-size-change="handlePageSizeChange"
/>
</div>
<!-- 无数据提示 -->
<NoData v-if="!loading && currentList.length === 0" :small="false"></NoData>
</Card>
</div>
<!-- 详情抽屉 -->
<d-drawer
v-model="detailVisible"
:width="800"
:title="currentDetail?.title || '详情'"
>
<div class="detail-content">
<div class="detail-meta">
<div class="meta-item"><span class="meta-label">发布时间</span>{{ formatTime(currentDetail?.publishTime) }}</div>
<div class="meta-item" v-if="currentDetail?.source"><span class="meta-label">来源</span>{{ currentDetail.source }}</div>
<div class="meta-item" v-if="currentDetail?.severity || currentDetail?.level || currentDetail?.importance">
<span class="meta-label">级别</span>
<d-tag
:type="getDetailTagType()"
>{{ currentDetail.severity || currentDetail.level || currentDetail.importance }}</d-tag>
</div>
</div>
<div class="detail-body" v-html="currentDetail?.content || '暂无详情内容'"></div>
</div>
</d-drawer>
</template>
<script setup lang="ts">
import { ref, computed, onMounted, watch } from 'vue';
import { useRoute } from 'vue-router';
import NoData from '@/components/NoData/NoData.vue';
import dayjs from 'dayjs';
// 假设引入情报相关接口(实际项目中替换为真实接口)
// import { getVulnerabilityList, getPolicyList, getTechnologyList, getNewsList } from '@/api/jyh/securityInfo';
const route = useRoute();
// 标签页状态
const activeTab = ref('vulnerability');
const loading = ref(false);
// 分页配置
const pager = ref({
total: 0,
pageIndex: 1,
pageSize: 10
});
// 漏洞预警数据
const vulnerabilityStats = ref({
critical: 28, // 高危
high: 76, // 中危
medium: 134, // 低危
total: 238 // 本月新增
});
// 漏洞趋势数据
const vulnerabilityTrends = ref({
critical: 12, // 较上周变化百分比
high: 8,
medium: -5,
total: 15
});
// 模拟漏洞列表数据
const vulnerabilityList = ref([
{
id: 'vuln-1',
title: 'Apache Log4j2 远程代码执行漏洞 (CVE-2021-44228)',
cveId: 'CVE-2021-44228',
severity: '高危',
publishTime: '2024-06-15T09:30:00',
affectScope: 'Apache Log4j 2.0-2.14.1',
content: `<p>Apache Log4j2 存在远程代码执行漏洞,攻击者可通过构造特殊请求触发漏洞,执行任意代码。</p>
<p><strong>影响范围:</strong>Apache Log4j 2.0 至 2.14.1 版本</p>
<p><strong>修复建议:</strong>升级至 Log4j 2.15.0 及以上版本,或采取临时缓解措施。</p>`
},
{
id: 'vuln-2',
title: 'Chrome 浏览器类型混淆漏洞 (CVE-2024-2625)',
cveId: 'CVE-2024-2625',
severity: '中危',
publishTime: '2024-06-12T14:20:00',
affectScope: 'Chrome < 123.0.6312.105',
content: `<p>Google Chrome 存在类型混淆漏洞,攻击者可通过精心构造的网页利用该漏洞执行任意代码。</p>
<p><strong>影响范围:</strong>版本低于 123.0.6312.105 的 Chrome 浏览器</p>
<p><strong>修复建议:</strong>及时更新 Chrome 浏览器至最新版本。</p>`
},
{
id: 'vuln-3',
title: 'Windows 内核权限提升漏洞 (CVE-2024-21303)',
cveId: 'CVE-2024-21303',
severity: '高危',
publishTime: '2024-06-10T11:45:00',
affectScope: 'Windows 10/11, Windows Server 2019/2022',
content: `<p>Microsoft Windows 内核存在权限提升漏洞,本地攻击者可利用该漏洞提升至系统权限。</p>
<p><strong>影响范围:</strong>Windows 10、Windows 11、Windows Server 2019/2022</p>
<p><strong>修复建议:</strong>安装微软 2024 年 6 月安全更新补丁。</p>`
}
]);
// 模拟政策解读数据
const policyList = ref([
{
id: 'policy-1',
title: '《网络安全等级保护基本要求》(GB/T 22239-2025) 修订解读',
department: '国家网络安全标准化技术委员会',
level: '国家标准',
publishTime: '2024-05-20T10:00:00',
effectiveDate: '2024-12-01T00:00:00',
content: `<p>本次修订进一步完善了网络安全等级保护的基本要求,新增了云计算、大数据、人工智能等新兴技术场景的安全控制点。</p>
<p><strong>主要变化:</strong></p>
<ul>
<li>强化了数据安全保护要求,新增数据全生命周期安全控制</li>
<li>增加了供应链安全管理相关条款</li>
<li>完善了应急响应与灾备恢复要求</li>
</ul>`
},
{
id: 'policy-2',
title: '《关键信息基础设施安全保护条例》实施指南',
department: '工信部网络安全管理局',
level: '部门规章',
publishTime: '2024-04-15T09:30:00',
effectiveDate: '2024-05-01T00:00:00',
content: `<p>指南明确了关键信息基础设施的识别范围、安全责任与保护措施,为运营者提供了具体实施参考。</p>
<p><strong>核心内容:</strong></p>
<ul>
<li>关键信息基础设施识别流程与标准</li>
<li>安全防护体系建设要求</li>
<li>安全评估与监测预警机制</li>
</ul>`
}
]);
// 模拟技术专栏数据
const technologyList = ref([
{
id: 'tech-1',
title: '基于大语言模型的恶意代码检测技术研究',
author: '安全研究院 张教授团队',
category: '人工智能安全',
publishTime: '2024-06-05T16:20:00',
readCount: 2356,
content: `<p>本文探讨了利用大语言模型LLM进行恶意代码检测的可行性提出了基于Transformer架构的检测模型。</p>
<p><strong>研究亮点:</strong></p>
<ul>
<li>将恶意代码转换为结构化文本序列利用LLM进行特征学习</li>
<li>在10万级样本集上测试准确率达98.7%</li>
<li>对未知变种恶意代码的检测率提升32%</li>
</ul>`
},
{
id: 'tech-2',
title: '零信任架构在企业网络中的实践路径',
author: '某大型科技公司 网络安全部',
category: '网络安全架构',
publishTime: '2024-05-28T14:10:00',
readCount: 1892,
content: `<p>本文结合实际案例,阐述了零信任架构从规划到落地的全流程,包括身份认证、权限管理、持续验证等关键环节。</p>
<p><strong>实践要点:</strong></p>
<ul>
<li>基于最小权限原则的动态访问控制</li>
<li>多因素认证与持续信任评估</li>
<li>零信任与现有安全体系的融合策略</li>
</ul>`
}
]);
// 模拟新闻发布数据
const newsList = ref([
{
id: 'news-1',
title: '2024年国家网络安全宣传周将于9月在郑州举办',
source: '央视新闻',
category: '行业动态',
publishTime: '2024-06-18T08:30:00',
importance: '重要',
content: `<p>2024年国家网络安全宣传周将于9月16日至22日在河南省郑州市举办主题为"网络安全为人民,网络安全靠人民"。</p>
<p>活动将包括开幕式、网络安全博览会、网络安全技术高峰论坛以及系列主题日活动,聚焦人工智能、数据安全、关键信息基础设施保护等热点领域。</p>`
},
{
id: 'news-2',
title: '全球网络攻击事件同比下降12%,勒索软件攻击减少明显',
source: '安全产业报',
category: '全球态势',
publishTime: '2024-06-15T11:20:00',
importance: '一般',
content: `<p>根据最新全球安全报告2024年第一季度全球网络攻击事件同比下降12%其中勒索软件攻击减少23%,归因于企业安全防护意识提升和防护措施加强。</p>
<p>报告同时指出,针对工业控制系统和医疗行业的定向攻击有所增加,需引起相关行业重视。</p>`
}
]);
// 详情抽屉状态
const detailVisible = ref(false);
const currentDetail = ref(null);
// 当前列表(根据标签页动态切换)
const currentList = computed(() => {
switch (activeTab.value) {
case 'vulnerability': return vulnerabilityList.value;
case 'policy': return policyList.value;
case 'technology': return technologyList.value;
case 'news': return newsList.value;
default: return [];
}
});
// 标签页切换
const handleTabChange = (key) => {
activeTab.value = key;
pager.value.pageIndex = 1; // 切换标签重置页码
fetchCurrentList(); // 重新获取数据
};
// 分页切换
const handlePageChange = (pageIndex) => {
pager.value.pageIndex = pageIndex;
fetchCurrentList();
};
const handlePageSizeChange = (pageSize) => {
pager.value.pageSize = pageSize;
pager.value.pageIndex = 1;
fetchCurrentList();
};
// 获取当前标签页数据(实际项目中替换为接口调用)
const fetchCurrentList = async () => {
loading.value = true;
try {
// 模拟接口请求延迟
await new Promise(resolve => setTimeout(resolve, 500));
// 实际项目中根据activeTab调用对应接口
// 示例:
// if (activeTab.value === 'vulnerability') {
// const res = await getVulnerabilityList({ page: pager.value.pageIndex, size: pager.value.pageSize });
// vulnerabilityList.value = res.data.records;
// pager.value.total = res.data.total;
// }
// 模拟总数
pager.value.total = currentList.value.length;
} catch (error) {
console.error('获取数据失败:', error);
} finally {
loading.value = false;
}
};
// 查看详情
const showDetail = (item) => {
currentDetail.value = item;
detailVisible.value = true;
};
// 格式化时间
const formatTime = (time) => {
return time ? dayjs(time).format('YYYY-MM-DD HH:mm:ss') : '--';
};
// 漏洞危险等级标签类型
const getSeverityType = (severity) => {
const typeMap = {
'高危': 'danger',
'中危': 'warning',
'低危': 'info'
};
return typeMap[severity] || 'default';
};
// 政策级别标签类型
const getPolicyLevelType = (level) => {
const typeMap = {
'国家标准': 'primary',
'部门规章': 'info',
'地方规定': 'secondary'
};
return typeMap[level] || 'default';
};
// 新闻重要程度标签类型
const getImportanceType = (importance) => {
const typeMap = {
'重要': 'warning',
'一般': 'info'
};
return typeMap[importance] || 'default';
};
// 详情页标签类型
const getDetailTagType = () => {
if (currentDetail.value?.severity) {
return getSeverityType(currentDetail.value.severity);
}
if (currentDetail.value?.level) {
return getPolicyLevelType(currentDetail.value.level);
}
if (currentDetail.value?.importance) {
return getImportanceType(currentDetail.value.importance);
}
return 'default';
};
// 页面加载时获取数据
onMounted(() => {
fetchCurrentList();
});
// 监听分页和标签变化
watch([() => pager.value.pageIndex, () => pager.value.pageSize], () => {
fetchCurrentList();
});
</script>
<style scoped lang="scss">
.page-wrap {
margin: 16px;
}
.info-main-card {
padding: 20px;
}
.info-title {
font-size: 16px;
font-weight: 600;
margin-bottom: 20px;
color: #191919;
}
.info-tabs {
margin-top: 10px;
}
// 统计卡片样式
.info-stats {
margin-bottom: 24px;
}
.stat-card {
height: 100%;
padding: 16px;
background-color: #f9fafb;
border-radius: 8px;
}
.stat-title {
font-size: 16px;
color: #666;
margin-bottom: 8px;
}
.stat-value {
font-size: 24px;
font-weight: 600;
color: #191919;
margin-bottom: 4px;
}
.stat-trend {
font-size: 14px;
&.up {
color: #f53f3f; // 上升趋势红色
}
&.down {
color: #00b42a; // 下降趋势绿色
}
}
// 表格样式
.info-table {
margin-top: 16px;
}
.title-link {
font-size: 16px;
color: #1890ff;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
// 分页样式
.pagination-container {
margin: 20px 0;
display: flex;
justify-content: flex-end;
}
// 详情抽屉样式
.detail-content {
padding: 16px 0;
}
.detail-meta {
margin-bottom: 20px;
padding-bottom: 16px;
border-bottom: 1px solid #eee;
}
.meta-item {
margin-bottom: 8px;
font-size: 16px;
}
.meta-label {
color: #666;
font-weight: 500;
}
.detail-body {
font-size: 16px;
line-height: 1.8;
p {
margin-bottom: 16px;
}
ul {
margin-left: 20px;
margin-bottom: 16px;
}
strong {
color: #191919;
}
}
// 复用安全检测中心的面包屑样式
.secret-breadcrumb {
padding: 7px 20px 12px;
background: #ffffff;
}
</style>

View File

@@ -0,0 +1,227 @@
<template>
<div class="item-power">
<h4 class="wow xsddhxg animated" style="visibility: visible;">我们的实力</h4>
<div class="power-slider wow xsddhxg animated" style="visibility: visible;">
<div class="power-list"> <!-- Flex布局容器 -->
<!-- 第一个模块 -->
<div class="power-item">
<div class="s-item">
<img src="@/assets/v3/first.png" alt="演练成绩">
<div class="s-txt">
<h5>演练成绩</h5>
<div class="ul-out">
<ul class="EASE">
<li>2024 武汉市东西湖区网络安全实战攻防演练第一名</li>
<li>2023 "磐石行动"东西湖区工业和信息化领域网络安全实战攻防第一名</li>
<li>20222023 湖北省数字政府网络安全攻防演练第一名</li>
</ul>
</div>
</div>
</div>
</div>
<!-- 第二个模块 -->
<div class="power-item">
<div class="s-item">
<img src="@/assets/v3/sl5.png" alt="国家级漏洞库全支撑">
<div class="s-txt">
<h5>国家级漏洞库全支撑</h5>
<div class="ul-out">
<ul class="EASE">
<li>国家信息安全漏洞共享平台CNVD技术组支撑单位</li>
<li>国家信息安全漏洞库CNNVD技术支撑单位等级证书一级</li>
<li>工业和信息化部网络安全威胁和漏洞信息共享平台NVDB</li>
<li>通用网络产品安全漏洞专业库三星级</li>
<li>信创政务产品安全漏洞专业库-技术支撑单位三级</li>
<li>工业和信息化部移动互联网 APP 产品安全漏洞库-技术支撑单位</li>
</ul>
</div>
</div>
</div>
</div>
<!-- 第三个模块 -->
<div class="power-item">
<div class="s-item">
<img src="@/assets/v3/sl6.png" alt="权威漏洞机构能力认可">
<div class="s-txt">
<h5>权威漏洞机构能力认可</h5>
<div class="ul-out">
<ul class="EASE">
<li>NVDB 2023 年度漏洞治理合作最具贡献单位优秀漏洞合作治理单位优秀漏洞报送机构</li>
<li>CNVD 2023 年度漏洞信息报送贡献单位2022 年度漏洞应急工作突出贡献单位</li>
<li>CNVD 2020 年度原创漏洞发现贡献单位最具价值漏洞奖</li>
<li>CNNVD 2023 年度第一期漏洞激励一级贡献奖二级贡献奖</li>
<li>CNNVD 2024 年度第一期漏洞激励一级贡献奖</li>
<li>CNNVD 2023 年度重大漏洞消控优秀贡献奖</li>
<li>CNNVD 2023 年度2022 年度优秀技术支撑单位</li>
<li>2023 年提交漏洞 1500+原创漏洞 290+63%为高危以上漏洞</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "ItemPower"
}
</script>
<style lang="scss" scoped>
.pg-intro .item-power {
background-color: #f1f2f5;
padding: 80px 0;
padding-left: 20px;
padding-right: 20px;
}
.pg-intro .item-power h4 {
color: #333;
font-size: 28px;
font-style: normal;
font-weight: 400;
letter-spacing: 1px;
letter-spacing: 1.7px;
line-height: 40px;
text-align: center;
margin: 0;
}
.pg-intro .item-power .power-slider {
margin: 50px auto 0;
width: 100%;
max-width: 1600px;
}
.pg-intro .item-power .power-list {
display: flex;
justify-content: center;
align-items: stretch;
gap: 30px;
flex-wrap: wrap;
}
.pg-intro .item-power .power-item {
width: calc(33.333% - 20px);
min-width: 320px;
height: 490px;
}
.pg-intro .item-power .power-item .s-item {
overflow: hidden;
position: relative;
height: 100%;
width: 100%;
}
.pg-intro .item-power .power-item .s-item .hd {
display: none;
}
.pg-intro .item-power .power-item .s-item>img {
display: block;
height: 100%;
object-fit: cover;
object-position: center top;
width: 100%;
}
// 核心s-txt 基础样式 + 过渡动画
.pg-intro .item-power .power-item .s-txt {
background-color: #fffffff5;
bottom: 0;
color: #333;
font-size: 14px;
font-style: normal;
font-weight: 400;
height: 179px; /* 默认高度 */
left: 0;
line-height: 24px;
overflow: hidden;
padding: 33px 36px;
position: absolute;
right: 0;
text-align: left;
transition: height 0.4s ease-out; /* 仅过渡高度,保证动画流畅 */
width: 100%;
}
// 鼠标悬浮到s-item整个模块s-txt 高度变为340px
.pg-intro .item-power .power-item .s-item:hover .s-txt {
height: 340px; /* 悬浮延伸高度 */
}
// 基础状态ul-out 高度限制,隐藏多余内容
.pg-intro .item-power .power-item .s-txt .ul-out {
height: 70px;
overflow: hidden;
transition: height 0.4s ease-out; /* 内容高度也加过渡 */
}
// 悬浮时ul-out 高度自动,显示全部内容
.pg-intro .item-power .power-item .s-item:hover .s-txt .ul-out {
height: auto;
overflow: visible;
}
.pg-intro .item-power .power-item .s-txt .ul-out ul {
margin: 16px 0 0;
}
.pg-intro .item-power .power-item .s-txt .ul-out ul:first-child {
margin: 0;
}
.pg-intro .item-power .power-item .s-txt h5 {
color: #333;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 30px;
margin: 0 0 5px;
text-align: left;
}
.pg-intro .item-power .power-item .s-txt li {
font-style: normal;
padding: 0 0 0 16px;
position: relative;
text-align: left;
transition: all .4s ease-out;
}
.pg-intro .item-power .power-item .s-txt li:after {
background: #4bad52;
border-radius: 50%;
content: "";
height: 6px;
left: 0;
position: absolute;
top: 12px;
transform: translateY(-50%);
width: 6px;
}
// 响应式适配
@media (max-width: 1200px) {
.pg-intro .item-power .power-item {
width: calc(50% - 15px);
}
}
@media (max-width: 768px) {
.pg-intro .item-power .power-item {
width: 100%;
margin-bottom: 20px;
// 移动端悬浮高度适当调整(可选)
height: auto;
}
.pg-intro .item-power .power-item .s-txt {
height: auto;
position: relative;
}
}
</style>

View File

@@ -0,0 +1,103 @@
<template>
<div class="item-rank">
<div class="rank-item wow xsddhxg animated" style="visibility: visible;">
<div class="JBFont"><span class="comStatistic" data-animation-running="false">90</span><i>+</i></div>
<p class="name">发明专利</p></div>
<!-- <div class="rank-item wow xsddhxg animated" style="visibility: visible;">-->
<!-- <div class="JBFont"><span class="comStatistic" data-animation-running="false">120</span><i>+</i></div>-->
<!-- <p class="name">软件著作权</p></div>-->
<!-- <div class="rank-item wow xsddhxg animated" style="visibility: visible;">-->
<!-- <div class="JBFont"><span class="comStatistic" data-animation-running="false">20</span></div>-->
<!-- <p class="name">标准制定</p></div>-->
<div class="rank-item wow xsddhxg animated" style="visibility: visible;">
<div class="JBFont"><span class="comStatistic" data-animation-running="false">12</span></div>
<p class="name">网络安全资质</p></div>
<!-- <div class="rank-item wow xsddhxg animated" style="visibility: visible;">-->
<!-- <div class="JBFont"><span class="comStatistic" data-animation-running="false">80</span><i>+</i></div>-->
<!-- <p class="name">产品资质</p></div>-->
<!-- <div class="rank-item wow xsddhxg animated" style="visibility: visible;">-->
<!-- <div class="JBFont"><span class="comStatistic" data-animation-running="false">140</span><i>+</i></div>-->
<!-- <p class="name">产品兼容性认证</p></div>-->
<div class="rank-item wow xsddhxg animated" style="visibility: visible;">
<div class="JBFont">数百个</div>
<p class="name">高质量漏洞贡献</p></div>
<div class="rank-item wow xsddhxg animated" style="visibility: visible;">
<div class="JBFont"><span class="comStatistic" data-animation-running="false">500</span><i>+</i></div>
<p class="name">关基客户</p>
</div>
<div class="rank-item wow xsddhxg animated" style="visibility: visible;">
<div class="JBFont"><span class="comStatistic" data-animation-running="false">10亿</span><i>+</i></div>
<p class="name">组件扫描</p>
</div>
<div class="rank-item wow xsddhxg animated" style="visibility: visible;">
<div class="JBFont"><span class="comStatistic" data-animation-running="false">99.9</span><i>%</i></div>
<p class="name">检出率</p>
</div>
<div class="rank-item wow xsddhxg animated" style="visibility: visible;">
<div class="JBFont"><span class="comStatistic" data-animation-running="false">7x24</span></div>
<p class="name">应急响应</p>
</div>
</div>
</template>
<script>
export default {
name: "ItemRank"
}
</script>
<style lang="scss" scoped>
.pg-intro .item-rank {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
margin: 0 auto;
padding: 60px 0;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center
}
.pg-intro .item-rank .rank-item {
padding: 0 40px;
position: relative;
text-align: center
}
.pg-intro .item-rank .rank-item:last-child:after {
display: none
}
.pg-intro .item-rank .rank-item:after {
border: 1px solid #d8d8d8;
content: "";
height: 63px;
position: absolute;
right: -1px;
top: 50%;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
width: 1px
}
.pg-intro .item-rank .rank-item>div {
font-size: 42px;
font-style: normal;
font-weight: 400;
letter-spacing: 1px;
line-height: 57px;
min-width: 100px;
text-align: center
}
.pg-intro .item-rank .rank-item .name {
color: #333;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
margin: -1px 0 0;
text-align: center
}
</style>

View File

@@ -0,0 +1,335 @@
<template>
<div class="pg-intro item-trip">
<h4 class="main-title">实验室里程碑</h4>
<div class="trip-slider" ref="tripSliderRef" @mousemove="handleMouseMove">
<swiper
:slides-per-view="'auto'"
:grab-cursor="true"
class="mySwiper"
>
<swiper-slide v-for="(item, index) in rawTimelineData" :key="index">
<div :class="['s-item', item.className, { 'ON': true }]">
<div class="imgMask">
<img :src="item.image" :alt="item.year">
</div>
<div class="s-txt">
<h5>
{{ item.year }}
<span></span> <!-- 年份下方的圆点 -->
</h5>
<ul>
<li v-for="(txt, i) in item.details" :key="i">{{ txt }}</li>
</ul>
</div>
</div>
<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" class="timeline-svg">
<line v-if="index === 0" x1="0" y1="290" x2="700" y2="290" style="stroke:#4bad52;" stroke-width="2"></line>
<template v-else-if="index === 1">
<line x1="0" y1="290" x2="250" y2="290" style="stroke:#4bad52;" stroke-width="2"></line>
<line x1="250" y1="290" x2="700" y2="290" style="stroke:#4bad52;" stroke-width="2"></line>
</template>
<template v-else-if="index === 2">
<line x1="0" y1="290" x2="250" y2="290" style="stroke:#4bad52;" stroke-width="2"></line>
<line x1="250" y1="290" x2="800" y2="290" style="stroke:#4bad52;" stroke-width="2"></line>
</template>
<template v-else-if="index === 3">
<line x1="0" y1="290" x2="250" y2="280" style="stroke:#4bad52;" stroke-width="2"></line>
<line x1="250" y1="280" x2="500" y2="290" style="stroke:#4bad52;" stroke-width="2"></line>
</template>
<template v-else-if="index === 4">
<line x1="0" y1="290" x2="250" y2="300" style="stroke:#4bad52;" stroke-width="2"></line>
<line x1="250" y1="300" x2="500" y2="290" style="stroke:#4bad52;" stroke-width="2"></line>
</template>
<template v-else-if="index === 5">
<line x1="0" y1="290" x2="700" y2="290" style="stroke:#4bad52;" stroke-width="2"></line>
</template>
</svg>
</swiper-slide>
</swiper>
<div
class="btn-tip EASE drop"
:class="{ 'drag': isDragging }"
:style="cursorStyle"
>
<i class="ICO"></i>
<span>点击并拖动</span>
</div>
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue';
import { Swiper, SwiperSlide } from 'swiper/vue';
import 'swiper/css';
// 鼠标跟随逻辑
const tripSliderRef = ref(null);
const mouseX = ref(0);
const mouseY = ref(0);
const isDragging = ref(false);
const handleMouseMove = (event) => {
if (tripSliderRef.value) {
const rect = tripSliderRef.value.getBoundingClientRect();
mouseX.value = event.clientX - rect.left;
mouseY.value = event.clientY - rect.top;
}
};
const cursorStyle = computed(() => {
return {
left: `${mouseX.value}px`,
top: `${mouseY.value}px`,
opacity: mouseX.value > 0 && mouseY.value > 0 ? 1 : 0,
transform: `translate(-50%, -50%) scale(${isDragging.value ? 1.2 : 1})`,
};
});
import pic1 from '@/assets/v3/intro/1.png'
import pic2 from '@/assets/v3/intro/2.png'
import pic3 from '@/assets/v3/intro/3.png'
import pic4 from '@/assets/v3/intro/4.png'
// 时间线数据
const rawTimelineData = ref([
{
year: 'intro_our_journey',
image: '1.png',
className: 'blank-left',
details: []
},
{
year: '2020',
image: pic1,
className: 's1 ON',
details: [
'武汉金银湖实验室正式注册成立,落户武汉临空港经开区',
'组建完成核心研发团队规模超50人聚焦漏洞检测技术',
'与华中科技大学、武汉大学共建网络安全联合实验室',
'承接湖北省网络安全专项课题,启动软件供应链安全预研'
]
},
{
year: '2021',
image: pic2,
className: 's2 ON',
details: [
'发布首款核心产品软件成分分析SCA系统V1.0',
'获得国家网络安全等级保护测评机构资质',
'申请软件供应链漏洞检测相关发明专利8项',
'为武汉本地30余家政企单位提供安全合规检测服务',
'入选湖北省"专精特新"中小企业培育库'
]
},
{
year: '2023',
image: pic3,
className: 's3 ON',
details: [
'完成Pre-A轮数千万元融资由国资背景创投机构领投',
'实验室场地扩建至5000㎡研发团队规模突破200人',
'发布漏洞挖掘平台累计发现通用型漏洞超100个',
'牵头制定《湖北省软件供应链安全地方标准》',
'与中国信科、长江计算达成深度战略合作'
]
},
{
year: '2025',
image: pic4,
className: 's4 ON',
details: [
'推出网络安全态势感知中心,覆盖政企全场景安全监测',
'迭代发布SCA系统V3.0,新增恶意代码投毒检测模块',
'首次商业化发布漏洞扫描系统洞察D-Sensor',
'核心团队参加世界黑客防御赛 DEFCON CTF 获得全球亚军',
'获批国家级网络安全应急技术支撑单位资质',
]
},
{
year: '',
image: '1.png',
className: 'blank-right',
details: []
}
]);
</script>
<style lang="scss" scoped>
/* 原有样式保持不变新增2015/2016圆点的单独样式 */
.pg-intro .item-trip {
background: linear-gradient(180deg, #000, #1a2c3a);
overflow: hidden;
padding: 83px 0 66px
}
.pg-intro .item-trip .main-title {
color: #fff;
font-size: 28px;
font-weight: 400;
letter-spacing: 1.7px;
line-height: 40px;
text-align: center
}
.pg-intro .item-trip .trip-slider {
margin: 50px 0 0;
position: relative;
height: 500px;
cursor: none;
}
.mySwiper {
height: 100%;
padding-bottom: 50px;
}
.pg-intro .item-trip .trip-slider .swiper-slide {
padding-right: 100px !important;
width: 500px !important;
position: relative;
}
.pg-intro .item-trip .trip-slider .swiper-slide:first-child {padding-top: 74px;}
.pg-intro .item-trip .trip-slider .swiper-slide:nth-child(2) {padding-top: 33px;}
.pg-intro .item-trip .trip-slider .swiper-slide:nth-child(3) {padding-top: 29px;}
.pg-intro .item-trip .trip-slider .swiper-slide:nth-child(4) {padding-top: 29px;}
.pg-intro .item-trip .trip-slider .swiper-slide:nth-child(5) {padding-top: 29px;}
.pg-intro .item-trip .trip-slider .swiper-slide:nth-child(6) {padding-top: 29px;}
.pg-intro .item-trip .trip-slider svg {
bottom: 0;
left: 0;
position: absolute;
right: 0;
top: 0;
z-index: 1;
pointer-events: none;
}
.pg-intro .item-trip .trip-slider .blank-left, .pg-intro .item-trip .trip-slider .blank-right {
visibility: hidden
}
.pg-intro .item-trip .btn-tip {
background: #4bad52;
border-radius: 50%;
color: #fff;
font-size: 14px;
height: 100px;
width: 100px;
line-height: 24px;
text-align: center;
position: absolute;
z-index: 10;
pointer-events: none;
transition: transform 0.3s ease-out, opacity 0.3s ease-out;
}
.pg-intro .item-trip .btn-tip .ICO {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAYCAQAAADgvTPPAAAAAXNSR0IArs4c6QAAAMVJREFUeJzNzr0JQlEMQOGAhQPYvBnEDQRXUCuxdBHB0gmcwFZsBDewtRNLsXOEh3JsrmjxfnIhCaZLuNzzifznsOJO3/C/NVcGOc+hNAVsgIeSkPJju7wIXQ5Kgkc+g+CVVxI88wqCd76FkPITz3wDISpfQ4jMVxCYAa+4fCIcgRsdEWHEE1iGAgouwOmzzmMJKX+m9z0FEirykYSafBShIR9BaMl7ExR5T4Iy70XIyP8QhoaAXUZeRIQpewpDwIJtRj5y3lb5MPSwyxcQAAAAAElFTkSuQmCC);
display: block;
height: 12px;
margin: 34px auto 7px;
width: 32px
}
.pg-intro .item-trip .trip-slider .s-item {
color: #fff;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 27px;
text-align: left
}
.pg-intro .item-trip .trip-slider .s-item h5 {
background: linear-gradient(15deg, #49ac8c, #79ba49);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
font-size: 28px;
font-weight: 400;
letter-spacing: 1.7px;
line-height: 40px;
position: relative;
text-align: center
}
/* 通用圆点样式 */
.pg-intro .item-trip .trip-slider .s-item h5 span {
background: #4bad52;
border-radius: 50%;
bottom: -20px;
height: 14px;
left: 50%;
position: absolute;
transform: translate(-50%);
width: 14px;
z-index: 2; /* 确保圆点在线上方 */
}
/* 2015的圆点在线上方抬高 */
.pg-intro .item-trip .trip-slider .s-item.s3 h5 span {
bottom: -10px; /* 比默认高10px位于线y=280的上方 */
}
/* 2016的圆点在线下方降低 */
.pg-intro .item-trip .trip-slider .s-item.s4 h5 span {
bottom: -30px; /* 比默认低10px位于线y=300的下方 */
}
.pg-intro .item-trip .trip-slider .s-item .imgMask {
height: 176px;
margin: 0 auto 26px;
width: 176px;
overflow: hidden;
border-radius: 50%;
}
.pg-intro .item-trip .trip-slider .s-item .imgMask img {
display: block;
height: 0;
margin: 0 auto;
width: 0;
transition: height .4s ease-out, width .4s ease-out;
object-fit: cover;
}
.pg-intro .item-trip .trip-slider .s-item.ON .imgMask img {
height: 176px;
width: 176px;
}
.pg-intro .item-trip .trip-slider .s-item .s-txt ul {
margin: 50px 0 0
}
.pg-intro .item-trip .trip-slider li {
padding: 0 0 0 16px;
position: relative;
text-align: left;
transition: all .4s ease-out
}
.pg-intro .item-trip .trip-slider li:after {
background: #4bad52;
border-radius: 50%;
content: "";
height: 6px;
left: 0;
position: absolute;
top: 10px;
width: 6px
}
</style>

View File

@@ -0,0 +1,51 @@
<template>
<div class="mod-banner">
<div class="txt xyCenter"><p class="zh wow animated" style="visibility: visible;">守护每一行代码的安全</p>
<p class="en wow animated" style="visibility: visible;">Profile</p></div>
</div>
</template>
<script>
export default {
name: "ModBanner"
}
</script>
<style lang="scss" scoped>
.pg-intro .mod-banner {
background: url(@/assets/v3/banner.C9fFbpMH.png) no-repeat 50%;
background-size: 100% 100%;
height: 400px;
position: relative
}
.pg-intro .mod-banner .txt {
left: 50%;
position: absolute;
top: 50%
}
.pg-intro .mod-banner .txt .zh {
color: #fff;
font-size: 40px;
font-style: normal;
font-weight: 400;
letter-spacing: 2px;
letter-spacing: 1px;
line-height: 56px
}
.pg-intro .mod-banner .txt .en {
color: #fff;
font-size: 14px;
font-weight: 400;
letter-spacing: 9px;
line-height: 20px;
text-align: center
}
.xyCenter {
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
</style>

View File

@@ -0,0 +1,85 @@
<template>
<div class="mod-center">
<div class="item-who" data-aos="slide-up">
<div class="in"><h4 class="wow animated" style="visibility: visible;">我们是谁</h4>
<div class="txt wow animated" style="visibility: visible;">
<div class="txt-item">
<p>武汉金银湖实验室成立于数字安全产业高速发展的关键阶段是聚焦网络安全数据安全人工智能安全等前沿领域的新型研发机构依托武汉科教资源优势与产业基础打造集技术攻关成果转化人才培养于一体的国家级数字安全创新平台</p>
<p>实验室汇聚了来自国内顶尖高校科研院所及龙头企业的核心研发团队深耕实战化网络安全防护零信任架构数据安全治理工业控制系统安全等关键领域在国家级网络安全攻防演练关键信息基础设施保护数字安全技术标准制定等方面成果显著为区域乃至全国数字安全保障提供核心支撑</p>
</div>
<div class="txt-item">
<p>面向数字经济时代的安全挑战武汉金银湖实验室立足"实战导向、技术突破、产业赋能"的核心理念构建以网络安全攻防验证平台数据安全治理体系工业互联网安全防护系统AI安全风险监测平台等为核心的技术体系通过政产学研用深度融合为政府金融能源交通等关键行业提供定制化体系化的数字安全解决方案与技术服务</p>
<p>金银湖得名于武汉东西湖核心生态地标寓意实验室如湖水般包容创新稳守安全底线实验室以"守护数字空间安全,赋能数字经济发展"为使命致力于攻克数字安全领域"卡脖子"技术推动安全技术创新与产业落地筑牢数字时代安全屏障</p>
</div>
</div>
</div>
<div class="building wow animated" style="visibility: visible;"></div>
</div>
</div>
</template>
<script>
export default {
name: "ModCenter"
}
</script>
<style lang="scss" scoped>
.pg-intro .item-who {
background: #f5f5f5;
position: relative
}
.pg-intro .item-who .building {
background: url(@/assets/v3/building.DsPJNC9Y.png) no-repeat top;
background-size: 100% 100%;
bottom: 0;
height: 95%;
position: absolute;
right: 0;
width: 461px
}
.pg-intro .item-who .in {
margin: 0 auto;
max-width: 1236px;
padding: 90px 0;
position: relative
}
.pg-intro .item-who h4 {
color: #4bad52;
font-size: 28px;
letter-spacing: 1px;
letter-spacing: 1.7px;
line-height: 40px
}
.pg-intro .item-who .txt,.pg-intro .item-who h4 {
font-style: normal;
font-weight: 400;
text-align: left
}
.pg-intro .item-who .txt {
color: #333;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 14px;
line-height: 24px;
position: relative;
z-index: 2
}
.pg-intro .item-who .txt .txt-item {
margin: 0 66px 0 0;
text-align: justify;
width: 453px
}
.pg-intro .item-who .txt p {
margin: 20px 0 0;
text-indent: 2em
}
</style>

View File

@@ -0,0 +1,25 @@
<template>
<div class="pg-intro">
<ModBanner />
<ModCenter />
<ItemRank />
<ItemPower />
<ItemTrip />
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import ModBanner from './component/ModBanner.vue'
import ModCenter from './component/ModCenter.vue'
import ItemRank from './component/ItemRank.vue'
import ItemPower from './component/ItemPower.vue'
import ItemTrip from './component/ItemTrip.vue'
</script>
<style lang="scss" scoped>
</style>

View File

@@ -0,0 +1,279 @@
<template>
<d-modal
v-model="visible"
title="AI问答"
@ok="handleClose"
:cancel="handleClose"
style="width: 900px;"
>
<div class="log-content">
<McLayout>
<!-- <McLayoutHeader>
<McHeader :logoImg="'/logo.svg'" :title="'MateChat'"></McHeader>
</McLayoutHeader>-->
<McLayoutContent v-if="visible" style="margin: 16px 0;">
<div ref="conversationRef" class="conversation-area">
<!-- 欢迎提示 -->
<div v-if="messages.length === 0" class="welcome-message">
<div class="welcome-page">
<div class="home-title">
<img src="@/assets/imgs/jyh/aiLogo2.png" alt="logo" />
<h1>TcodeAI助手</h1>
</div>
<div class="home-detail">
<div class="home-detail-1">Hi欢迎使用TcodeAI助手</div>
<div class="home-detail-2">TcodeAI助手 可以辅助研发人员进行软件查询批量校验查看软件详情等</div>
<div class="home-detail-2">作为AI模型TcodeAI助手 提供的答案可能不总是确定或准确的但您的反馈可以帮助 TcodeAI助手 做得更好</div>
</div>
</div>
<!-- <div class="welcome-icon">-->
<!-- <i class="fa fa-comment-dots"></i>-->
<!-- </div>-->
<!-- <div class="welcome-text">-->
<!-- <h3>请输入你想问的内容</h3>-->
<!-- <p>与AI助手开始对话获取智能回答</p>-->
<!-- </div>-->
</div>
<template v-for="(msg, idx) in messages" :key="idx">
<McBubble v-if="msg.role === 'user'" :content="msg.content" :align="'right'"></McBubble>
<McBubble v-else :loading="msg.loading ?? false">
<McMarkdownCard :content="msg.content" :theme="theme"></McMarkdownCard>
</McBubble>
</template>
</div>
</McLayoutContent>
<McLayoutSender>
<McInput :value="inputValue" :maxLength="2000" @submit="onSubmit" showCount></McInput>
</McLayoutSender>
</McLayout>
</div>
</d-modal>
</template>
<script setup>
import { ref, watch,nextTick } from 'vue';
import { Message } from 'vue-devui';
import axios from 'axios';
import {uvdV1Chat} from "@/api/inboundTask/inboundTaskApi";
const messages = ref([]);
const history = ref([]);
const resultInfo = ref(null);
const inputValue = ref('');
const conversationRef = ref(null);
// 组件状态
const visible = ref(false);
const VITE_AI_API_HOST = import.meta.env.VITE_AI_API_HOST;
// 打开弹框时调用接口
const open = async (id) => {
if (!id) return Message.error('缺少result_id参数');
visible.value = true;
resultInfo.value = id
};
const onSubmit = (e) => {
if(e === '') {
return;
}
if(messages.value[messages.value.length-1]?.loading) return;
inputValue.value = '';
messages.value.push({
role: 'user',
content: e,
});
nextTick(() => {
conversationRef.value?.scrollTo({
top: conversationRef.value.scrollHeight,
behavior: 'smooth',
});
});
getAIAnswer(e);
};
const getAIAnswer = async (content) => {
messages.value.push({
role: 'assistant',
content: '',
loading: true,
});
const res = await uvdV1Chat({
"resultInfo": resultInfo.value,
"query": content,
"history": history.value || []
});
let reply = res?.data?.data?.reply || '';
history.value.push({role: "user", content: content});
history.value.push({role: "assistant", content: reply});
messages.value[messages.value.length - 1].content = reply;
messages.value[messages.value.length - 1].loading = false;
nextTick(() => {
conversationRef.value?.scrollTo({
top: conversationRef.value.scrollHeight
});
});
/* 模拟流式数据返回 */
// setTimeout(async () => {
// messages.value.at(-1).loading = false;
// for (let i = 0; i < reply.length;) {
// await new Promise(r => setTimeout(r, 300 * Math.random()));
// messages.value[messages.value.length - 1].content = reply.slice(0, i += Math.random() * 10);
// nextTick(() => {
// conversationRef.value?.scrollTo({
// top: conversationRef.value.scrollHeight
// });
// });
// }
// }, 1000);
};
// 暴露给父组件的方法
defineExpose({
open // 通过ref调用open方法传递resultId
});
// 关闭弹框
const handleClose = () => {
messages.value = [];
history.value = [];
result_id.value = null;
inputValue.value = '';
visible.value = false;
};
</script>
<style lang="scss" scoped>
.log-content {
padding: 24px;
line-height: 1.6;
white-space: pre-wrap; // 保留日志换行
word-break: break-all; // 自动换行长单词
min-height: 200px;
p {
margin: 0;
color: #333;
}
}
.conversation-area,
.welcome-page {
flex: 1;
display: flex;
flex-direction: column;
overflow: auto;
padding: 0 12px;
min-height: 400px;
max-height: 600px;
overflow-y: auto;
}
.conversation-area {
gap: 8px;
}
.welcome-message {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
padding: 32px;
text-align: center;
.welcome-icon {
width: 64px;
height: 64px;
background-color: #e6f4ff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 16px;
i {
font-size: 28px;
color: #1677ff;
}
}
.welcome-text {
h3 {
font-size: 18px;
font-weight: 500;
color: #333;
margin-bottom: 8px;
}
p {
font-size: 14px;
color: #666;
}
}
}
.home-title {
display: flex;
flex-shrink: 0;
justify-content: center;
align-items: center;
gap: 20px;
h1 {
color: #191919;
font-family: Huawei Sans;
font-weight: bold;
font-size: 32px;
line-height: 48px;
letter-spacing: 0px;
text-align: center;
}
img {
width: 64px;
//filter: brightness(0);
}
}
.home-detail {
.home-detail-1 {
color: #191919;
font-family: HarmonyOS Sans SC;
font-weight: medium;
font-size: 24px;
line-height: 32px;
letter-spacing: 0px;
text-align: center;
margin-bottom: 24px;
}
.home-detail-2 {
color: #777777;
font-family: HarmonyOS Sans SC;
font-weight: regular;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: center;
}
}
.welcome-page {
//height: 90%;
width: 100%;
flex: 1;
display: flex;
flex-direction: column;
overflow: auto;
padding: 0 12px;
}
.welcome-page {
gap: 16px;
justify-content: center;
}
</style>

View File

@@ -0,0 +1,605 @@
<template>
<div class="BatchVerify">
<div class="search-form" v-if="isLogin">
<FileUploadButton buttonText="批量导入匹配" accept=".xlsx" :onFileUpload="handleFileUpload" />
<d-search
class="mt-0 mb-2"
style="width: 400px"
:delay="1000"
@search="onSearch($event)"
placeholder="请输入软件名称"
></d-search>
<div class="tjsj">
<span style="height: 14px" class="split"></span>
<span>可使用</span>
<span class="green" @click="filterVerifyResult(1)">{{ useNum }}</span>
<span style="height: 14px" class="split"></span>
<span>有风险</span>
<span class="red" @click="filterVerifyResult(2)">{{ riskNum }}</span>
<span style="height: 14px" class="split"></span>
<span>未治理</span>
<span class="yellow" @click="filterVerifyResult(0)">{{ noNum }}</span>
</div>
<div class="left-btn">
<a v-if="isLogin" class="cursor-pointer" href="/file/软件存在及可信校验模版.xlsx" download
><i class="icon icon-download-2"></i>下载excel模板</a
>
<span v-if="isLogin" style="height: 14px" class="split"></span>
<d-button v-if="isLogin" class="output-btn" icon="icon-share" variant="text" @click="exportResult"
>导出</d-button
>
<span v-if="isLogin" style="height: 14px" class="split"></span>
<TableSetting
:columns="columns"
@setDefult="setDefult"
@updateTableKey="updateTableKey"
:show-column-list="showColumnList"
@update:show-column-list="updateShowColumnList"
/>
</div>
</div>
<div class="mt-3 px-20">
<d-table
class="jyh-table"
v-if="tableData.length"
:striped="false"
:data="tableData"
table-layout="auto"
:show-loading="loading"
>
<!-- 索引列 -->
<d-column type="index" width="40"></d-column>
<!-- 动态渲染列 -->
<template v-for="column in columns" :key="column.key">
<d-column v-if="column.visible" :field="column.key" :header="column.label">
<!-- 自定义列内容 -->
<template #default="scope">
<template v-if="column.key === 'validStatus'">
<div v-if="scope.row.validStatus == 1" style="display: flex; align-items: center">
<d-icon class="mr-1" name="icon-right-o" style="font-size: 14px; color: rgb(80, 212, 171)"></d-icon>
<span>可使用</span>
</div>
<div v-else-if="scope.row.validStatus == 2" style="display: flex; align-items: center">
<d-icon class="mr-1" name="icon-warning-o" style="font-size: 14px; color: rgb(250, 194, 10)"></d-icon>
<span>有风险</span>
</div>
<div v-else style="display: flex; align-items: center">
<d-icon class="mr-1" name="icon-error-o" style="font-size: 14px; color: rgb(246, 111, 106)"></d-icon>
<span>未治理</span>
</div>
</template>
<template v-else-if="column.key === 'versionName'">
<a @click="gotoDetail(scope.row)">{{ scope.row.versionName }}</a>
</template>
<template v-else-if="column.key === 'softwareName'">
<a v-if="scope.row.validStatus===1" @click="gotoDetail(scope.row)">{{ scope.row.softwareName }}</a>
<span v-else>{{ scope.row.softwareName }}</span>
</template>
<template v-else-if="column.key === 'softwareVersion'">
<a v-if="scope.row.validStatus===1" @click="gotoDetail(scope.row)">{{ scope.row.softwareVersion }}</a>
<span v-else>{{ scope.row.softwareVersion }}</span>
</template>
<template v-else-if="column.key === 'versionCode'">
<a @click="gotoDetail(scope.row)">{{ scope.row.versionCode }}</a>
</template>
<template v-else-if="column.key === 'smStatus'">
<a>{{ scope.row.smStatus }}</a>
</template>
<template v-else-if="column.key === 'type'">
<d-tag type="success">{{ scope.row.type }}</d-tag>
</template>
<template v-else-if="column.key === 'license'">
<span class="mr-2">{{ scope.row.license }}</span>
<d-tag color="gray">+3</d-tag>
</template>
<template v-else-if="column.key === 'url'">
<a>{{ scope.row.url }}</a>
</template>
<template v-else>
{{ scope.row[column.key] }}
</template>
</template>
</d-column>
</template>
<d-column header="操作" width="200" fixed-right="0px">
<!--TODO:申请入口只有校验不通过的才显示-->
<template #default="scope">
<d-button @click="showApplyDialog(scope.row)" variant="text" v-if="scope.row.validStatus == 0" :disabled="scope.row.validStatus !== 0">
申请入库
</d-button>
</template>
</d-column>
</d-table>
<!-- <DataPanel v-else skeleton :card="false" :empty="true">-->
<!-- </DataPanel>-->
<NoData v-else :small="false"></NoData>
</div>
<!-- 新增申请入库提示弹窗 -->
<d-modal v-model="applyDialogVisible" title="申请入库提示" style="width: 400px">
<div class="text-G900 text-sm leading-[24px]">
如需提交治理申请请邮件联系平台运营团队<br>
<a class="text-blue-500 cursor-pointer" @click="openEmailClient">luoxunzhao@jyhlab.org.cn</a>
</div>
<template #footer>
<d-modal-footer style="text-align: right; padding-right: 20px;">
<d-button @click="hidden">取消</d-button>
<d-button @click="hidden">确认</d-button>
</d-modal-footer>
</template>
</d-modal>
<!-- 删除组件 -->
<GModal
v-model="deletevModels"
ref="deleteModal"
title="删除?"
@confirm="confirmDelete"
showWarnIcon
confirmColor="danger"
>
<span class="inline-block text-G900 text-sm font-normal leading-[20px] break-all"
>你确认删除此项{{ item.cla_name }} </span
>
</GModal>
</div>
</template>
<script setup lang="ts">
import SettingTitle from '@/components/Setting/SettingTitle/index.vue';
import SettingText from '@/components/Setting/SettingText/index.vue';
import { ref, reactive, onMounted, computed } from 'vue';
import { getGroupClaList, setGroupClaStatus, deleteGroupCla } from '@/api/cla';
import { useRouter, useRoute } from 'vue-router';
import { GModal } from '@/components/Setting/index';
import { reqCatch } from '@/utils/catch';
import { getOrgInfo } from '@/views/Org/hooks/orgInfo';
import { Message } from 'vue-devui';
import { useAccountStore } from '@/stores/user';
import { storeToRefs } from 'pinia';
import TableSetting from '@/components/TableSetting/index.vue';
import FileUploadButton from '@/components/FileUploadButton/index.vue';
import { releasePage, repoImport } from '@/api/jyh';
import NoData from '@/components/NoData/NoData.vue';
import * as XLSX from 'xlsx';
const hidden = () => {
applyDialogVisible.value = false;
};
// 新增弹窗状态
const applyDialogVisible = ref(false);
// 显示申请入库提示弹窗
const showApplyDialog = (row: any) => {
applyDialogVisible.value = true;
};
// 打开邮件客户端
const openEmailClient = () => {
try {
window.location.href = 'mailto:luoxunzhao@jyhlab.org.cn';
} catch (error) {
Message.error('无法打开邮件客户端,请手动复制邮箱地址联系');
}
};
const downloadTemplate = async () => {
try {
const response = await fetch('/static/软件存在及可信校验模版.xlsx');
const blob = await response.blob();
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = '软件存在及可信校验模版.xlsx';
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
} catch (error) {
console.error('下载失败:', error);
}
};
const useNum = computed(() => {
if (tableData.value.length > 0) {
return tableData.value.filter((item) => item.validStatus === 1).length;
} else {
return 0;
}
});
const riskNum = computed(() => {
if (tableData.value.length > 0) {
return tableData.value.filter((item) => item.validStatus === 2).length;
} else {
return 0;
}
});
const noNum = computed(() => {
if (tableData.value.length > 0) {
return tableData.value.filter((item) => item.validStatus === 0).length;
} else {
return 0;
}
});
const setDefult = () => {
columns.value = defultColumns.value;
};
// 处理文件上传
const handleFileUpload = async (file) => {
// 1. 校验文件类型
const allowedExtensions = ['.xlsx'];
const fileExtension = file.name.slice(file.name.lastIndexOf('.')).toLowerCase();
if (!allowedExtensions.includes(fileExtension)) {
Message.error('仅支持上传 .xlsx 格式的Excel文件');
return Promise.reject(new Error('文件格式不正确'));
}
const { data, error } = await repoImport({ file });
if (!error && data) {
currentReusltFilter.value = null;
allTableData.value = data.data.data;
tableData.value = [...allTableData.value];
}
// 模拟文件上传逻辑
return new Promise((resolve) => {
setTimeout(() => {
console.log('文件上传成功:', file.name);
resolve();
}, 2000); // 模拟 2 秒上传时间
});
};
const userInfo = useAccountStore();
const { isLogin } = storeToRefs(userInfo);
const { namespace } = getOrgInfo();
const allTableData = ref([]);
const tableData = ref([]);
const loading = ref(false);
const columns = ref([
{ key: 'validStatus', label: '校验结果', visible: true, filterable: true, sortable: false },
{ key: 'softwareName', label: '软件名称', visible: true, filterable: true, sortable: false },
{ key: 'softwareVersion', label: '软件版本', visible: true, filterable: true, sortable: false },
{ key: 'securityScore', label: '软件评分', visible: true, filterable: false, sortable: true },
{ key: 'licenseCount', label: 'License数量', visible: true, filterable: false, sortable: false },
{ key: 'industryCategory', label: '行业类型', visible: true, filterable: true, sortable: false },
{ key: 'primaryLanguage', label: '编程语言', visible: true, filterable: true, sortable: false },
{ key: 'codeLines', label: '代码量', visible: true, filterable: false, sortable: false }
]);
const defultColumns = ref([
{ key: 'validStatus', label: '校验结果', visible: true, filterable: true, sortable: false },
{ key: 'softwareName', label: '软件名称', visible: true, filterable: true, sortable: false },
{ key: 'softwareVersion', label: '软件版本', visible: true, filterable: true, sortable: false },
{ key: 'securityScore', label: '软件评分', visible: true, filterable: false, sortable: true },
{ key: 'licenseCount', label: 'License数量', visible: true, filterable: false, sortable: false },
{ key: 'industryCategory', label: '行业类型', visible: true, filterable: true, sortable: false },
{ key: 'primaryLanguage', label: '编程语言', visible: true, filterable: true, sortable: false },
{ key: 'codeLines', label: '代码量', visible: true, filterable: false, sortable: false }
]);
const validStatusMap = {
0: '未治理',
1: '可使用',
2: '有风险'
};
const formData = ref({
title: '',
type: '',
useType: '',
formData: '',
select: '',
time1: null,
name: '',
versionCode: '',
pulishTime: ''
});
const typeOptions = reactive(['主软件', '依赖软件']);
const riskOptions = reactive(['低', '中', '高']);
const useTypeOptions = reactive(['软件', '文档', '文档+软件']);
const isUseOptions = reactive(['是', '否']);
const currentReusltFilter = ref(null);
const searchStr = ref('');
// 定义 tableKey用于强制刷新表格
const tableKey = ref(0);
const pager = ref({
total: 0,
pageIndex: 1,
pageSize: 10
});
const loadingStatus = reactive({
batchMigrating: false
});
// 删除弹窗
const item = ref('');
const deleteModal = ref();
const deletevModels = ref(false);
const openDelete = (row: any) => {
item.value = row;
deleteModal.value.showFlag = true;
deletevModels.value = true;
};
const getReleaseList = async () => {
if (!isLogin.value) {
return;
}
loading.value = true;
const { data, error } = await releasePage({ current: pager.value.pageIndex, size: pager.value.pageSize });
if (!error && data) {
loading.value = false;
allTableData.value = data.data.records;
tableData.value = [...allTableData.value];
pager.value.total = data.data.total;
} else {
loading.value = false;
}
};
onMounted(async () => {
// getReleaseList();
});
const filterTable = () => {
tableData.value = allTableData.value.filter((item) => {
if (currentReusltFilter.value !== null) {
return (
item.softwareName.trim().toLowerCase().includes(searchStr.value.trim().toLowerCase()) &&
item.validStatus === currentReusltFilter.value
);
} else {
return item.softwareName.trim().toLowerCase().includes(searchStr.value.trim().toLowerCase());
}
});
};
const filterVerifyResult = (type) => {
if (currentReusltFilter.value === type) {
currentReusltFilter.value = null;
} else {
currentReusltFilter.value = type;
}
filterTable();
};
const onSearch = (str: string) => {
searchStr.value = str;
filterTable();
};
const router = useRouter();
const updateTableKey = () => {
tableKey.value++; // 更新 tableKey强制刷新表格
};
// 定义 showColumnList 状态
const showColumnList = ref(false);
// 更新 showColumnList 的方法
const updateShowColumnList = (newValue) => {
showColumnList.value = newValue;
// tableKey.value++; // 更新 tableKey强制刷新表格
};
const handleBatchImport = async () => {
// 多个项目导入
// importRepo.value = queryTable.value.filter((val) => val.checked);
loadingStatus.batchMigrating = true;
// await batchMigrate();
loadingStatus.batchMigrating = false;
};
const exportResult = () => {
if (!allTableData.value.length) {
Message.info('暂无结果');
return;
}
const exportData = allTableData.value.map((item) => {
let res = {};
columns.value.forEach((col) => {
if (col.key === 'validStatus') {
res[col.label] = validStatusMap[item[col.key]] ? validStatusMap[item[col.key]] : '';
} else {
res[col.label] = item[col.key] ? item[col.key] : '';
}
});
return res;
});
try {
const workSheet = XLSX.utils.json_to_sheet(exportData);
const workBook: any = { Sheets: { 校验结果: workSheet }, SheetNames: ['校验结果'] };
const excelBuffer = XLSX.write(workBook, { bookType: 'xlsx', type: 'array' });
const link = document.createElement('a');
const blob = new Blob([excelBuffer]);
link.setAttribute('href', window.URL.createObjectURL(blob));
link.setAttribute('download', '软件存在及可信校验结果.xlsx');
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
Message.success('导出成功');
} catch {
// Message.error('导出失败');
}
};
// 跳转
const gotoDetail = (row) => {
// 后续请换成params暂时params传参没传过去
router.push({
path: 'repoDetail/' + row.softwareId
});
};
// 分页
const changeIndex = () => {
// getReleaseList();
};
const changeSize = () => {
pager.value.pageIndex = 1;
// getReleaseList();
};
const repoFun = (arr: any) => {
return arr ? (arr.length > 3 ? arr.slice(0, 3) : arr) : [];
};
// 编辑
const editRow = (row: any) => {
// 后续请换成params暂时params传参没传过去
router.push({
path: 'cla/edit/' + row.object_id,
query: { cla: row.cla, pageType: 'edit' }
});
};
// 确认删除
const confirmDelete = async (e: any) => {
// const res = await reqCatch(deleteGroupCla, { group_id: namespace.value, cla_id: item.value.object_id });
// if (!res.error) {
// getGroupClaListData();
// }
};
// 去成员页
const goMember = (row: any) => {
// 后续请换成params暂时params传参没传过去,注意路由有个:claID
router.push({
path: 'cla/claId/member',
query: { claId: row.object_id, claName: row.cla_name, group_path: namespace.value, pageType: 'edit' }
});
};
const getGroupClaListData = async () => {
// const params = {
// group_id: namespace.value,
// page: pager.value.pageIndex,
// per_page: pager.value.pageSize
// };
// const res = await reqCatch(getGroupClaList, params);
// if (!res.error) {
// tableData.value = res?.data?.data?.content;
// pager.value.total = res.data.data.total;
// }
};
getGroupClaListData();
const setClaStatus = async (row: any) => {
// const params = {
// group_id: namespace.value,
// cla_id: row.object_id,
// status: row.status
// };
// const res = await reqCatch(setGroupClaStatus, params);
// if (!res.error) {
// Message.success('操作成功!');
// getGroupClaListData();
// }
};
const signCla = (row: any) => {
router.push('/cla/' + row.object_id);
};
</script>
<style scoped lang="scss">
@import 'devui-theme/styles-var/devui-var.scss';
.BatchVerify {
position: relative;
min-height: 400px;
.secret-op {
position: absolute;
right: 0;
top: 0;
}
}
.error {
color: $devui-contrast;
}
:deep(.devui-table__row td) {
padding-top: 16px;
padding-bottom: 16px;
}
:deep(.devui-tag .devui-tag--default) {
background-color: #fff;
border-radius: 12px;
padding: 4px 8px;
font-size: 12px;
line-height: 16px;
margin-right: 8px;
border: 1px solid #e3e3ee;
}
.one-line {
word-break: break-all;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.title {
font-size: 14px;
font-weight: 400;
color: #9a9b9c;
line-height: 20px;
}
.cur-title {
font-size: 14px;
font-weight: 500;
color: #2d2d2e;
line-height: 20px;
}
.search-form {
position: relative;
padding: 12px 20px;
display: flex;
border-radius: 8px 0px 8px 8px;
//background: #F2F5FC;
.left-btn {
position: absolute;
right: 28px;
bottom: 4px;
}
.output-btn {
color: #191919;
font-family: HarmonyOS Sans SC;
font-weight: regular;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
}
}
.secret-breadcrumb {
padding: 7px 20px 12px;
background: #ffffff;
}
.tjsj {
display: flex;
align-items: center;
margin-left: 8px;
}
</style>

View File

@@ -0,0 +1,84 @@
<template>
<d-modal
title="贡献者分布"
v-model="visible"
class="file-search-modal"
:style="{ width: '800px' }"
@close="handleClose"
>
<Card simple class="jyh-card mb-4" style="box-shadow: none;padding: 0">
<d-chart :option="optionConChart" style="width: 100%; height: 400px"></d-chart>
<p class="text-center mt-translate-y">国家/地球分布</p>
</Card>
<template #footer>
<d-modal-footer style="text-align: center;">
<d-button variant="solid" color="primary" @click="handleClose">确认</d-button>
<d-button @click="handleClose">取消</d-button>
</d-modal-footer>
</template>
</d-modal>
</template>
<script setup lang="ts">
import { ref, defineExpose, reactive } from 'vue';
import { DChart } from 'vue-devui/echarts';
const optionConChart = reactive({
tooltip: {
show: true,
trigger: 'item'
},
xAxis: {
type: 'category',
data: ['美国', '中国', '德国', '瑞士', '法国', '英国', '印度', '日本', '荷兰', '俄罗斯']
},
yAxis: {
// 给y轴添加单位后缀
axisLabel: {
formatter: '{value}%'
},
name: '单位',
type: 'value'
},
series: [
{
data: [12, 14.8, 23.6, 18.6, 17.3, 13.1, 16, 11.8, 13.9, 16.4],
type: 'bar',
barWidth: '40%',
// 给label添加单位后缀
label: {
show: true,
position: 'top',
formatter: '{c}%'
},
itemStyle: {
color: '#2070F3',
borderRadius: [5, 5, 0, 0]
}
}
]
});
// 控制模态框显示/隐藏
const visible = ref(false);
// 打开模态框
const openModal = () => {
visible.value = true;
};
// 关闭模态框
const handleClose = () => {
visible.value = false;
};
// 暴露方法,供父组件调用
defineExpose({
openModal,
});
</script>
<style scoped lang="scss">
@import 'devui-theme/styles-var/devui-var.scss';
</style>

View File

@@ -0,0 +1,295 @@
<template>
<div class="intelligence-detail">
<!-- 头部信息 -->
<div class="detail-header">
<h2 class="title">{{ intelligence?.title }}</h2>
<div class="header-tags">
<d-tag :color="typeColorMap[intelligence?.intelligenceType]">
{{ intelligence?.intelligenceType }}
</d-tag>
<d-tag :color="urgencyColorMap[intelligence?.urgency]">
{{ intelligence?.urgency }}
</d-tag>
</div>
</div>
<!-- 基本信息卡片 -->
<d-card class="detail-card mt-4">
<div slot="header" class="card-header">基本信息</div>
<d-descriptions column="2" bordered>
<d-description-item term="情报ID">{{ intelligence?.intelligenceId }}</d-description-item>
<d-description-item term="情报类型">{{ intelligence?.intelligenceType }}</d-description-item>
<d-description-item term="情报来源">{{ intelligence?.source }}</d-description-item>
<d-description-item term="发布时间">
{{ intelligence?.publishDate ? dayjs(intelligence.publishDate).format('YYYY-MM-DD HH:mm:ss') : '--' }}
</d-description-item>
<d-description-item term="紧急程度">{{ intelligence?.urgency }}</d-description-item>
<d-description-item term="情报版本">{{ intelligence?.version || '1.0' }}</d-description-item>
</d-descriptions>
</d-card>
<!-- 情报摘要 -->
<d-card class="detail-card mt-4">
<div slot="header" class="card-header">情报摘要</div>
<div class="summary-content">
{{ intelligence?.summary || '暂无摘要信息' }}
</div>
</d-card>
<!-- 详细内容 -->
<d-card class="detail-card mt-4">
<div slot="header" class="card-header">
详细内容
<d-button size="sm" variant="text" @click="toggleContentExpand">
{{ isContentExpanded ? '收起' : '全文展开' }}
</d-button>
</div>
<div class="detail-content" :class="{ 'expanded': isContentExpanded }">
<pre v-if="intelligence?.content">{{ formatContent(intelligence.content) }}</pre>
<p v-else>暂无详细内容</p>
</div>
</d-card>
<!-- 相关IOCs -->
<d-card class="detail-card mt-4" v-if="intelligence?.relatedIocs && intelligence.relatedIocs.length">
<div slot="header" class="card-header">
相关IOCs
<d-button size="sm" variant="text" @click="copyAllIocs">
<i class="fa fa-copy mr-1"></i>复制全部
</d-button>
</div>
<d-table :data="intelligence.relatedIocs" table-layout="auto">
<d-column field="type" header="类型" :width="100"></d-column>
<d-column field="value" header="值"></d-column>
<d-column header="操作" :width="100">
<template #default="scope">
<d-button
size="sm"
variant="text"
@click="copyIoc(scope.row.value)"
>
<i class="fa fa-copy"></i>复制
</d-button>
</template>
</d-column>
</d-table>
</d-card>
<!-- 参考信息 -->
<d-card class="detail-card mt-4" v-if="intelligence?.references && intelligence.references.length">
<div slot="header" class="card-header">参考信息</div>
<ul class="reference-list">
<li v-for="(ref, idx) in intelligence.references" :key="idx">
<a :href="ref.url" target="_blank" class="reference-link">
{{ ref.title || `参考链接 ${idx + 1}` }}
</a>
</li>
</ul>
</d-card>
<!-- 操作按钮 -->
<div class="detail-actions mt-6">
<d-button @click="$emit('close')" variant="secondary">关闭</d-button>
<d-button @click="exportReport" class="ml-2">
<i class="fa fa-download mr-1"></i>导出报告
</d-button>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import dayjs from 'dayjs';
// 接收父组件传入的情报数据
const props = defineProps({
intelligence: {
type: Object,
required: true,
default: () => ({})
}
});
// 组件内部状态
const isContentExpanded = ref(false);
const toast = ref();
// 类型颜色映射(与列表页保持一致)
const typeColorMap = {
'威胁情报': '#165DFF',
'漏洞情报': '#f66f6a',
'事件情报': '#fac20a',
'APT情报': '#722ED1',
'恶意代码情报': '#f5319d'
};
// 紧急程度颜色映射(与列表页保持一致)
const urgencyColorMap = {
'紧急': '#c7000b',
'高': '#f66f6a',
'中': '#fac20a',
'低': '#5e7ce0'
};
// 切换内容展开/收起状态
const toggleContentExpand = () => {
isContentExpanded.value = !isContentExpanded.value;
};
// 格式化内容(处理换行和缩进)
const formatContent = (content: string) => {
return content.replace(/\\n/g, '\n').replace(/ /g, ' ');
};
// 复制单个IOC
const copyIoc = (value: string) => {
navigator.clipboard.writeText(value).then(() => {
toast.success({ content: '已复制到剪贴板', duration: 2000 });
}).catch(() => {
toast.error({ content: '复制失败,请手动复制', duration: 2000 });
});
};
// 复制所有IOCs
const copyAllIocs = () => {
if (!props.intelligence.relatedIocs || !props.intelligence.relatedIocs.length) return;
const allIocs = props.intelligence.relatedIocs
.map(item => `${item.type}: ${item.value}`)
.join('\n');
navigator.clipboard.writeText(allIocs).then(() => {
toast.success({ content: '全部IOC已复制到剪贴板', duration: 2000 });
}).catch(() => {
toast.error({ content: '复制失败,请手动复制', duration: 2000 });
});
};
// 导出报告
const exportReport = () => {
// 模拟导出功能
toast.info({ content: '正在准备导出报告...', duration: 2000 });
// 实际应用中应调用后端导出接口
// const reportData = { ...props.intelligence };
// exportIntelligenceReport(reportData).then(() => {
// toast.success({ content: '报告导出成功', duration: 2000 });
// });
};
</script>
<style scoped lang="scss">
@import 'devui-theme/styles-var/devui-var.scss';
.intelligence-detail {
padding: 20px;
height: 100%;
box-sizing: border-box;
overflow-y: auto;
max-height: 80vh;
}
.detail-header {
display: flex;
flex-direction: column;
gap: 12px;
}
.title {
font-size: 20px;
font-weight: 600;
color: var(--devui-text-primary);
line-height: 1.5;
margin: 0;
}
.header-tags {
display: flex;
gap: 8px;
}
.detail-card {
--devui-card-padding: 16px;
}
.card-header {
font-size: 16px;
font-weight: 600;
color: var(--devui-text-primary);
display: flex;
justify-content: space-between;
align-items: center;
}
.summary-content {
padding: 8px 0;
line-height: 1.6;
color: var(--devui-text-secondary);
text-indent: 2em;
}
.detail-content {
max-height: 300px;
overflow-y: auto;
padding: 8px 0;
&.expanded {
max-height: none;
}
pre {
white-space: pre-wrap;
word-wrap: break-word;
line-height: 1.6;
color: var(--devui-text-secondary);
font-family: inherit;
margin: 0;
}
}
.reference-list {
padding: 8px 0 8px 20px;
margin: 0;
li {
margin-bottom: 8px;
&:last-child {
margin-bottom: 0;
}
}
}
.reference-link {
color: var(--devui-primary);
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
.detail-actions {
display: flex;
justify-content: flex-end;
//padding-top: 16px;
border-top: 1px solid var(--devui-border);
}
// 滚动条美化
.detail-content::-webkit-scrollbar,
.intelligence-detail::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.detail-content::-webkit-scrollbar-thumb,
.intelligence-detail::-webkit-scrollbar-thumb {
border-radius: 3px;
background-color: var(--devui-scrollbar-thumb-color);
}
.detail-content::-webkit-scrollbar-track,
.intelligence-detail::-webkit-scrollbar-track {
background-color: var(--devui-scrollbar-track-color);
}
</style>

View File

@@ -0,0 +1,327 @@
<template>
<div class="page-wrap">
<div class="search-form">
<d-form layout="horizontal" :label-align="'end'">
<d-row :gutter="16">
<d-col :span="6">
<d-form-item field="intelligenceId" label="情报ID">
<d-input placeholder="请输入情报ID" v-model="newFormData.intelligenceId" />
</d-form-item>
</d-col>
<d-col :span="6">
<d-form-item field="intelligenceType" label="情报类型">
<d-select
:options="typeArray"
:allow-clear="true"
v-model="newFormData.intelligenceType"
placeholder="请选择情报类型"
></d-select>
</d-form-item>
</d-col>
<d-col :span="6">
<d-form-item field="source" label="情报来源">
<d-select
:options="sourceArray"
:allow-clear="true"
v-model="newFormData.source"
placeholder="请选择情报来源"
></d-select>
</d-form-item>
</d-col>
<d-col :span="6">
<d-form-item field="urgency" label="紧急程度">
<d-select
:options="urgencyArray"
:allow-clear="true"
v-model="newFormData.urgency"
placeholder="请选择紧急程度"
></d-select>
</d-form-item>
</d-col>
</d-row>
</d-form>
<div class="jyh-form-operation">
<d-button @click="getList(1)" class="mr-2" variant="solid">搜索</d-button>
<d-button variant="solid" color="secondary" @click="clear">清空</d-button>
</div>
</div>
<Card class="mt-3">
<d-table :show-loading="loading" class="jyh-table" :data="dataLists" v-if="dataLists.length > 0" table-layout="auto">
<d-column type="index" width="40"></d-column>
<d-column field="intelligenceId" header="情报ID"></d-column>
<d-column field="title" header="情报标题"></d-column>
<d-column field="intelligenceType" header="情报类型">
<template #default="scope">
<d-tag :color="typeColorMap[scope.row.intelligenceType]">{{ scope.row.intelligenceType }}</d-tag>
</template>
</d-column>
<d-column field="source" header="情报来源"></d-column>
<d-column field="publishDate" header="发布时间">
<template #default="scope">
{{ scope.row.publishDate
? dayjs(scope.row.publishDate).format('YYYY-MM-DD HH:mm:ss')
: '--'
}}
</template>
</d-column>
<d-column field="urgency" header="紧急程度">
<template #default="scope">
<d-tag :color="urgencyColorMap[scope.row.urgency]">{{ scope.row.urgency }}</d-tag>
</template>
</d-column>
<d-column header="操作" fixed-right="0px" width="130">
<template #default="scope">
<a style="margin-right: 8px" class="devui-link" @click="openIntelligenceDetail(scope.row)">详情</a>
<d-button @click="handleViewAIModal(scope.row)" variant="text" color="primary"> AI问答 </d-button>
</template>
</d-column>
</d-table>
<NoData v-else :small="false"></NoData>
<div class="mt-20 mb-20 flex justify-end" v-if="dataLists.length > 0">
<d-pagination
size="md"
:page-size-options="[10, 20, 50]"
:total="pager.total"
v-model:pageSize="pager.pageSize"
v-model:pageIndex="pager.pageIndex"
:max-items="5"
:can-change-page-size="true"
:can-view-total="true"
total-item-text="总计"
@page-index-change="getList()"
@page-size-change="getList()"
/>
</div>
</Card>
</div>
<!-- 情报详情抽屉 -->
<d-drawer v-model="detailVisible" style="width: 900px">
<IntelligenceDetail :intelligence="currentIntelligence" @close="detailVisible = false"></IntelligenceDetail>
</d-drawer>
<AIModal ref="AIModalRef" />
</template>
<script setup lang="ts">
import { computed, onMounted, ref } from 'vue';
import { useRoute } from 'vue-router';
import NoData from '@/components/NoData/NoData.vue';
import dayjs from 'dayjs';
import AIModal from '../AIModal.vue';
// 假设存在情报详情组件
import IntelligenceDetail from './IntelligenceDetail.vue';
const route = useRoute();
const title = computed(() => route.meta?.title || '情报列表');
// 打开弹框方法
const AIModalRef = ref(null);
const handleViewAIModal = (resultId) => {
AIModalRef.value.open(resultId); // 传递result_id参数
};
// 分页配置
const pager = ref({
total: 50,
pageIndex: 1,
pageSize: 10
});
// 搜索表单数据
const newFormData = ref({
intelligenceId: '',
intelligenceType: '',
source: '',
urgency: ''
});
// 加载状态
const loading = ref(false);
// 情报列表数据
const dataLists = ref([]);
// 详情抽屉状态
const detailVisible = ref(false);
const currentIntelligence = ref(null);
// 类型选项与颜色映射
const typeArray = [
{ value: '威胁情报', name: '威胁情报' },
{ value: '漏洞情报', name: '漏洞情报' },
{ value: '事件情报', name: '事件情报' },
{ value: 'APT情报', name: 'APT情报' },
{ value: '恶意代码情报', name: '恶意代码情报' }
];
const typeColorMap = {
'威胁情报': '#165DFF',
'漏洞情报': '#f66f6a',
'事件情报': '#fac20a',
'APT情报': '#722ED1',
'恶意代码情报': '#f5319d'
};
// 来源选项
const sourceArray = [
{ value: '内部监测', name: '内部监测' },
{ value: '合作伙伴', name: '合作伙伴' },
{ value: '公开渠道', name: '公开渠道' },
{ value: '威胁情报平台', name: '威胁情报平台' },
{ value: 'CERT/CC', name: 'CERT/CC' }
];
// 紧急程度选项与颜色映射
const urgencyArray = [
{ value: '紧急', name: '紧急' },
{ value: '高', name: '高' },
{ value: '中', name: '中' },
{ value: '低', name: '低' }
];
const urgencyColorMap = {
'紧急': '#c7000b',
'高': '#f66f6a',
'中': '#fac20a',
'低': '#5e7ce0'
};
// 清空搜索条件
const clear = () => {
newFormData.value = {
intelligenceId: '',
intelligenceType: '',
source: '',
urgency: ''
};
getList();
};
// 打开情报详情
const openIntelligenceDetail = (row) => {
currentIntelligence.value = row;
detailVisible.value = true;
};
// 获取情报列表数据
const getList = async (current?) => {
loading.value = true;
if (current) pager.value.pageIndex = current;
// 模拟API请求
setTimeout(() => {
// 模拟情报数据
const mockData = Array.from({ length: pager.value.pageSize }, (_, i) => {
const id = (pager.value.pageIndex - 1) * pager.value.pageSize + i + 1;
const types = ['威胁情报', '漏洞情报', '事件情报', 'APT情报', '恶意代码情报'];
const sources = ['内部监测', '合作伙伴', '公开渠道', '威胁情报平台', 'CERT/CC'];
const urgencies = ['紧急', '高', '中', '低'];
const randomType = types[Math.floor(Math.random() * types.length)];
return {
id: id,
intelligenceId: `INT-${2024}${String(id).padStart(5, '0')}`,
title: `${randomType}:关于${['某APT组织', '新型勒索病毒', '重大漏洞', '网络攻击事件'][Math.floor(Math.random() * 4)]}的分析`,
intelligenceType: randomType,
source: sources[Math.floor(Math.random() * sources.length)],
publishDate: dayjs().subtract(Math.floor(Math.random() * 30), 'day').toISOString(),
urgency: urgencies[Math.floor(Math.random() * urgencies.length)],
summary: '这是一份重要的安全情报,包含潜在威胁的详细分析和应对建议...',
content: '【情报详情】\n近期监测到相关威胁活动频繁发生主要影响范围包括政府、金融和能源行业...\n【影响范围】\n...\n【应对建议】\n1. 及时更新系统补丁\n2. 加强网络边界防护\n3. 部署威胁检测设备',
relatedIocs: [
{ type: 'IP', value: `192.168.${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}` },
{ type: '域名', value: `malicious-${id}.com` }
]
};
});
dataLists.value = mockData;
pager.value.total = 50; // 模拟总条数
loading.value = false;
}, 600);
// 实际接口调用示例
/*
const { data } = await getIntelligenceList({
intelligenceId: newFormData.value.intelligenceId,
intelligenceType: newFormData.value.intelligenceType,
source: newFormData.value.source,
urgency: newFormData.value.urgency,
current: current || pager.value.pageIndex,
size: pager.value.pageSize
}).finally(() => {
loading.value = false;
});
dataLists.value = data?.data?.data?.records || [];
pager.value.total = data.data.data?.total || 0;
*/
};
// 页面挂载时加载数据
onMounted(() => {
getList();
});
// 搜索触发
const search = () => {
pager.value.pageIndex = 1;
getList();
};
</script>
<style scoped lang="scss">
@import 'devui-theme/styles-var/devui-var.scss';
.page-wrap {
margin: 16px;
.page-title {
color: #191919;
font-family: HarmonyOS Sans SC;
font-weight: medium;
font-size: 18px;
line-height: 26px;
letter-spacing: 0px;
text-align: left;
}
.g-content-card {
overflow: hidden;
padding: 0;
}
}
.search-form {
position: relative;
border-radius: 8px 0px 8px 8px;
margin-right: 20px;
.left-btn {
position: absolute;
right: 28px;
bottom: 4px;
}
.output-btn {
color: #191919;
font-family: HarmonyOS Sans SC;
font-weight: regular;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
}
.jyh-form-operation {
margin-left: 20px !important;
margin-top: 16px;
}
}
// 适配情报标题较长的情况
::v-deep .devui-table-cell {
&.devui-table-cell-ellipsis {
max-width: 250px;
}
}
</style>

View File

@@ -0,0 +1,84 @@
<template>
<d-modal
title="贡献者分布"
v-model="visible"
class="file-search-modal"
:style="{ width: '800px' }"
@close="handleClose"
>
<Card simple class="jyh-card mb-4" style="box-shadow: none;padding: 0">
<d-chart :option="optionOrgChart" style="width: 100%; height: 400px"></d-chart>
<p class="text-center mt-translate-y">组织/公司分布</p>
</Card>
<template #footer>
<d-modal-footer style="text-align: center;">
<d-button variant="solid" color="primary" @click="handleClose">确认</d-button>
<d-button @click="handleClose">取消</d-button>
</d-modal-footer>
</template>
</d-modal>
</template>
<script setup lang="ts">
import { ref, defineExpose, reactive } from 'vue';
import { DChart } from 'vue-devui/echarts';
const optionOrgChart = reactive({
tooltip: {
show: true,
trigger: 'item'
},
xAxis: {
type: 'category',
data: ['公司1', '公司2', '公司3', '公司4', '公司5', '公司6', '公司7', '公司8', '公司9', '公司10']
},
yAxis: {
// 给y轴添加单位后缀
axisLabel: {
formatter: '{value}%'
},
name: '单位',
type: 'value'
},
series: [
{
data: [12, 14.8, 23.6, 18.6, 17.3, 13.1, 16, 11.8, 13.9, 16.4],
type: 'bar',
barWidth: '40%',
// 给label添加单位后缀
label: {
show: true,
position: 'top',
formatter: '{c}%'
},
itemStyle: {
color: '#2CB8C9',
borderRadius: [5, 5, 0, 0]
}
}
]
});
// 控制模态框显示/隐藏
const visible = ref(false);
// 打开模态框
const openModal = () => {
visible.value = true;
};
// 关闭模态框
const handleClose = () => {
visible.value = false;
};
// 暴露方法,供父组件调用
defineExpose({
openModal,
});
</script>
<style scoped lang="scss">
@import 'devui-theme/styles-var/devui-var.scss';
</style>

View File

@@ -0,0 +1,839 @@
<template>
<div class="secret-container">
<div class="search-form">
<d-form layout="horizontal" :label-align="'end'">
<d-row :gutter="16">
<d-col :span="8">
<d-form-item field="name" label="组件名称">
<d-input placeholder="请输入组件名称" v-model="newFormData.softwareName" />
</d-form-item>
</d-col>
<d-col :span="8">
<d-form-item field="version" label="组件版本">
<d-input placeholder="请输入组件版本" v-model="newFormData.softwareVersion" />
</d-form-item>
</d-col>
<d-col :span="8">
<d-form-item field="language" label="编程语言">
<d-select
:options="languageList"
:allow-clear="true"
v-model="newFormData.programmingLanguage"
placeholder="请选择编程语言"
></d-select>
</d-form-item>
</d-col>
<!-- <d-col :span="8">-->
<!-- <d-form-item field="license" label="license">-->
<!-- <d-input placeholder="请输入license名称" v-model="newFormData.licenseName" />-->
<!-- </d-form-item>-->
<!-- </d-col>-->
</d-row>
<d-row :gutter="16">
<!-- <d-col :span="8">-->
<!-- <d-form-item field="dependency" label="依赖组件名称">-->
<!-- <d-input placeholder="请输入依赖组件名称" v-model="newFormData.dependentSoftware" />-->
<!-- </d-form-item>-->
<!-- </d-col>-->
<d-col :span="8">
<d-form-item field="date" label="版本发布日期">
<d-range-date-picker-pro
v-model="newFormData.dateRange"
style="width: 100%"
:placeholder="['开始日期', '结束日期']"
:limitDateRange="limitDateRange"
/>
</d-form-item>
</d-col>
<d-col :span="8">
<d-form-item field="industry" label="行业">
<d-select
:key="newFormData.industry"
:options="industryList"
:allow-clear="true"
v-model="newFormData.industry"
placeholder="请选择行业"
></d-select>
</d-form-item>
</d-col>
</d-row>
<!-- <d-row :gutter="16">-->
<!--&lt;!&ndash; <d-col :span="8">&ndash;&gt;-->
<!--&lt;!&ndash; <d-form-item field="interestTag" label="属性标签">&ndash;&gt;-->
<!--&lt;!&ndash; <d-input placeholder="请输入属性标签" v-model="newFormData.interestTag" />&ndash;&gt;-->
<!--&lt;!&ndash; </d-form-item>&ndash;&gt;-->
<!--&lt;!&ndash; </d-col>&ndash;&gt;-->
<!-- <d-col :span="8">-->
<!-- <d-form-item field="industry" label="行业">-->
<!-- <d-select-->
<!-- :key="newFormData.industry"-->
<!-- :options="industryList"-->
<!-- :allow-clear="true"-->
<!-- v-model="newFormData.industry"-->
<!-- placeholder="请选择行业"-->
<!-- ></d-select>-->
<!-- </d-form-item>-->
<!-- </d-col>-->
<!-- </d-row>-->
</d-form>
<div class="jyh-form-operation">
<d-button @click="getReleaseList" class="mr-2" variant="solid">搜索</d-button>
<d-button variant="solid" color="secondary" @click="clear">清空</d-button>
</div>
<div class="left-btn">
<d-button v-if="isLogin" class="output-btn" icon="icon-share" variant="text" @click="exportResult"
>导出</d-button
>
<span v-if="isLogin" style="height: 14px" class="split"></span>
<TableSetting
:columns="columns"
@setDefult="setDefult"
@updateTableKey="updateTableKey"
:show-column-list="showColumnList"
@update:show-column-list="updateShowColumnList"
/>
</div>
</div>
<div class="mt-3 px-20">
<d-table
:key="tableKey"
ref="filterTableRef"
class="jyh-table"
v-if="tableData.length"
:striped="false"
:data="tableData"
>
<d-column type="checkable" width="40" reserve-check align="center"></d-column>
<!-- 索引列 -->
<!-- <d-column type="index" width="40"></d-column> -->
<!-- 动态渲染列 -->
<template v-for="column in columns" :key="column.key">
<d-column v-if="column.visible" :field="column.key" :header="column.label" :width="column.width||120" :show-overflow-tooltip="!column.tooltip">
<!-- 自定义列内容 -->
<template #default="scope">
<template v-if="column.key === 'softwareName'">
<a @click="gotoDetail(scope.row)">{{ scope.row.softwareName }}</a>
</template>
<template v-else-if="column.key === 'versionName'">
<a @click="gotoDetail(scope.row)">{{ scope.row.versionName }}</a>
</template>
<template v-else-if="column.key === 'version'">
<a @click="gotoDetail(scope.row)">{{ scope.row.version }}</a>
</template>
<template v-else-if="column.key === 'securityScore'">
<!-- <a @click="gotoDetail(scope.row)" style="-->
<!-- <a style="-->
<!-- font-weight: bold;-->
<!-- color: #409EFF;-->
<!-- font-size: 16px;-->
<!-- ">{{ scope.row.securityScore }}</a>-->
<d-popover :content="scope.row.securityScore || '&#45;&#45;'" trigger="hover" style="background-color: #7693f5; color: #fff">
<d-tag color="#ef4444">{{ '非常重要' || '--' }}</d-tag>
</d-popover>
</template>
<template v-else-if="column.key === 'trustScore'">
<d-popover trigger="hover" >
<template #default>
<d-tag color="#ef4444">{{ '高度可信' || '--' }}</d-tag>
</template>
<template #content>
<div style="padding: 4px">
<div style="display: flex;justify-content: space-between;"><span>低</span><span>中</span><span>高</span></div>
<d-progress height="8px" bar-bg-color="#ef4444" style="width: 150px" :percentage="100" percentageText=""></d-progress>
</div>
</template>
</d-popover>
</template>
<template v-else-if="column.key === 'releaseDate'">
<span>{{ formatTime(scope.row.releaseDate, 'YYYY-MM-DD') }}</span>
</template>
<template v-else-if="column.key === 'eolDate'">
<span>{{ formatTime(scope.row.eolDate, 'YYYY-MM-DD') }}</span>
</template>
<template v-else-if="column.key === 'softwareVersion'">
<a @click="gotoDetail(scope.row)">{{ scope.row.softwareVersion }}</a>
</template>
<template v-else-if="column.key === 'smStatus'">
<a>{{ scope.row.smStatus }}</a>
</template>
<template v-else-if="column.key === 'industryCategory'">
<d-tag type="success">{{ getIndustryName(scope.row.industryCategory) }}</d-tag>
</template>
<template v-else-if="column.key === 'programmingLanguage'">
<d-tag type="success">{{ scope.row.programmingLanguage }}</d-tag>
</template>
<template v-else-if="column.key === 'primaryLanguage'">
<d-tag type="primary">{{ scope.row.primaryLanguage }}</d-tag>
</template>
<template v-else-if="column.key === 'contributorCountries'">
<!-- <div style="cursor: pointer" @click="openCountryModal(column)">-->
<!-- <span class="mr-2">美国 3.57%</span>-->
<!-- <d-tag color="gray">+3</d-tag>-->
<!-- </div>-->
</template>
<template v-else-if="column.key === 'contributorOrganizations'">
<!-- <div style="cursor: pointer" @click="openOrgModal(column)">-->
<!-- <span class="mr-2">microsoft 3.57%</span>-->
<!-- <d-tag color="gray">+3</d-tag>-->
<!-- </div>-->
</template>
<template v-else-if="column.key === 'sourceDownloadUrl'">
<a :href="scope.row.sourceDownloadUrl">{{ scope.row.sourceDownloadUrl }}</a>
</template>
<template v-else>
{{ scope.row[column.key] }}
</template>
</template>
</d-column>
</template>
<d-column header="操作" fixed-right="0px" width="130">
<template #default="scope">
<!-- <a class="devui-link" style="margin-right: 8px" @click="openVulnDetail(scope.row)">详情</a>-->
<d-button @click="handleViewAIModal(scope.row)" variant="text" color="primary"> AI问答 </d-button>
</template>
</d-column>
</d-table>
<!-- <DataPanel v-else skeleton :card="false" :empty="true">-->
<!-- </DataPanel>-->
<NoData v-else :small="false"></NoData>
</div>
<div class="mt-20 mb-20 flex justify-end">
<d-pagination
size="md"
:page-size-options="[10, 20, 50]"
:total="pager.total"
v-model:pageSize="pager.pageSize"
v-model:pageIndex="pager.pageIndex"
:max-items="5"
:can-change-page-size="true"
:can-view-total="true"
total-item-text="总计"
@page-index-change="getReleaseList()"
@page-size-change="getReleaseList()"
/>
</div>
<!-- 删除组件 -->
<GModal
v-model="deletevModels"
ref="deleteModal"
title="删除?"
@confirm="confirmDelete"
showWarnIcon
confirmColor="danger"
>
<span class="inline-block text-G900 text-sm font-normal leading-[20px] break-all"
>你确认删除此项:{{ item.cla_name }} </span
>
</GModal>
<!-- 引入子组件 -->
<CountryModal ref="countryModalRef" />
<!-- 引入子组件 -->
<OrgModal ref="orgModalRef" />
<AIModal ref="AIModalRef" />
</div>
</template>
<script setup lang="ts">
import AdvanceSearch from '@/components/AdvanceSearch/index.vue';
import SettingTitle from '@/components/Setting/SettingTitle/index.vue';
import SettingText from '@/components/Setting/SettingText/index.vue';
import { ref, reactive, onMounted, watch, nextTick } from 'vue';
import { getGroupClaList, setGroupClaStatus, deleteGroupCla } from '@/api/cla';
import { useRouter, useRoute } from 'vue-router';
import { GModal } from '@/components/Setting/index';
import TableSetting from '@/components/TableSetting/index.vue';
import { reqCatch } from '@/utils/catch';
import { getOrgInfo } from '@/views/Org/hooks/orgInfo';
import { Message } from 'vue-devui';
import { storeToRefs } from 'pinia';
import CountryModal from './CountryModal.vue';
import OrgModal from './OrgModal.vue';
import NoData from '@/components/NoData/NoData.vue';
import AIModal from './AIModal.vue';
import { useAccountStore } from '@/stores/user';
import * as XLSX from 'xlsx';
const { formatTime } = useTimeFormat();
import { getReleaseExport, releasePage, searchLanguageList } from '@/api/jyh';
import { useTimeFormat } from '@/utils/hooks/useTimeFormat';
import { useGlobalInfoStore } from '@/stores/Global';
const router = useRouter();
const route = useRoute();
const filterTableRef = ref();
const AIModalRef = ref();
const { namespace } = getOrgInfo();
const userInfo = useAccountStore();
const { isLogin } = storeToRefs(userInfo);
// 定义 tableKey用于强制刷新表格
const tableKey = ref(0);
const countryVisible = ref(false);
const orgVisible = ref(false);
const allTableData = ref([]);
const tableData = ref([
{
"id": 7085,
"userId": 372,
"softwareName": "killbill-embeddeddb-common",
"softwareVersion": "0.26.5",
"releaseVersionDate": "2024-03-21 00:00:00",
"releaseDate": null,
"primaryLanguage": "Java",
"contributorCount": 0,
"contributorCountries": null,
"organizationDistribution": null,
"developer": "org.kill-bill.commons",
"officialWebsite": null,
"integrationRiskLevel": 1,
"securityScore": 0.0,
"codeLines": 0,
"businessDomain": null,
"industryCategory": null,
"sourceDownloadUrl": "http://222.20.126.185:9030/test/software-packages/org.kill-bill.commons:killbill-embeddeddb-common:0.26.5.jar",
"repoHostingUrl": null,
"eolNoticeUrl": null,
"repoTagCommitId": null,
"eolDate": null,
"entityFilename": null,
"entityDownloadUrl": null,
"storageTime": null,
"communityName": null,
"communityWebsite": null,
"communityContact": null,
"communityDescription": null,
"softwareType": "1",
"deleted": 0,
"isTrust": 1,
"isCritical": 0,
"isGitcode": 0,
"status": 2,
"createBy": null,
"updateBy": null,
"createTime": "2025-10-15 09:38:22",
"updateTime": "2025-10-30 15:35:22",
"licenseUseCases": null,
"mainLicenseName": null,
"licenseName": null,
"mainLicenseDescription": null,
"licenseDescription": null,
"securityHelpChannel": null,
"vulnDisclosureUrl": null,
"sourceSoftwareInfo": null,
"copyrightReportName": null,
"copyrightEntryTime": null,
"copyrightReportUrl": null,
"link": "https://gitcode.com/baomidou/mybatis-plus.git",
"isImport": 1,
"componentCount": 2,
"licenseCount": 0,
"vulnerabilityCount": 0,
"vulnScore": 100,
"licenseScore": 0,
"malScore": null,
"trustScore": null,
"gitcodeLink": null,
"gitcodeDownloadUrl": null,
"taskId": null,
"taskType": null,
"softwareId": null,
"userName": null,
"contributorGeoDistribution": null,
"contributorOrgDistribution": null,
"communityHash": null,
"copyright": null,
"externalVulnerabilitySources": null,
"versionDescription": null,
"compatibilityRiskDescription": null,
"softwareTrustLevel": 3,
"entryTime": null,
"taskStatus": null,
"approvalComment": null
}
]);
// const languageList = ref([]);
const globalInfo = useGlobalInfoStore();
const languageList = globalInfo.languageList;
const headerSearch = ref(globalInfo.headerSearch);
const industryList = ref(globalInfo.industryList);
const newFormData = ref({
licenseName: '',
searchType: 'software',
softwareName: '',
softwareVersion: '',
dependentSoftware: '',
programmingLanguage: '',
interestTag: '',
industry: '',
dateRange: ['', '']
});
const currentDate = new Date(); // 获取当前时间
const limitDateRange = ref<Date[]>([new Date(2000, 1, 1), currentDate]); // 结束日期设置为当前时间
// watch(() => globalInfo.headerSearch, (newVal: any) => {
// headerSearch.value = newVal;
// console.log(newVal)
// newFormData.value.searchType = newVal.searchType;
// newFormData.value.softwareName = newVal.softwareName;
// getReleaseList();
// }, { deep: true })
// 打开弹框方法
const handleViewAIModal = (resultId) => {
AIModalRef.value.open(resultId); // 传递result_id参数
};
const pager = ref({
total: 10,
pageIndex: 1,
pageSize: 10
});
// 删除弹窗
const item = ref('');
const deleteModal = ref();
const deletevModels = ref(false);
const openDelete = (row: any) => {
item.value = row;
deleteModal.value.showFlag = true;
deletevModels.value = true;
};
const defultColumns = ref([
{ key: 'softwareName', label: '组件名称', visible: true, filterable: true, sortable: false },
{ key: 'softwareVersion', label: '组件版本', visible: true, filterable: true, sortable: false },
{ key: 'trustScore', label: '组件可信等级', visible: true, filterable: false, sortable: true, tooltip: true },
// { key: 'securityScore', label: '组件重要性评分', visible: true, filterable: false, sortable: true },
{ key: 'licenseNum', label: 'License数量', visible: true, filterable: false, sortable: false,width: 140 },
{ key: 'industryCategory', label: '行业类型', visible: true, filterable: true, sortable: false },
{ key: 'primaryLanguage', label: '编程语言', visible: true, filterable: true, sortable: false },
{ key: 'codeLines', label: '代码量', visible: true, filterable: false, sortable: false },
{ key: 'sourceDownloadUrl', label: '源码包下载地址', visible: true, filterable: false, sortable: false,width: 200 },
{ key: 'releaseDate', label: '版本发布时间', visible: false, filterable: true, sortable: true,width: 160 },
// { key: 'dependencyCount', label: '依赖组件数', visible: false, filterable: false, sortable: false },
// { key: 'productComponentUsage', label: '产品成分使用量', visible: false, filterable: false, sortable: false,width: 160 },
{ key: 'vulnerabilityCount', label: '漏洞数量', visible: false, filterable: false, sortable: false },
{ key: 'developer', label: '开发商', visible: false, filterable: true, sortable: false },
{ key: 'contributorCountries', label: '贡献者国家/地区分布', visible: false, filterable: false, sortable: false,width: 200 },
{ key: 'contributorOrganizations', label: '贡献者组织/公司分布', visible: false, filterable: false, sortable: false,width: 200 },
{ key: 'communityHash', label: '社区hash值', visible: false, filterable: false, sortable: false,width: 160 },
{ key: 'copyright', label: 'Copyright', visible: false, filterable: false, sortable: false },
{
key: 'externalVulnerabilitySource',
label: '外部漏洞源的组件名称',
visible: false,
filterable: true,
sortable: false,width: 200
},
{ key: 'versionDescription', label: '版本描述', visible: false, filterable: false, sortable: false },
{ key: 'compatibilityRisk', label: '兼容性风险描述', visible: false, filterable: false, sortable: false ,width: 160},
{ key: 'eolDate', label: '社区EOL时间', visible: false, filterable: true, sortable: true,width: 160 }
]);
// 定义 columns 数据
const columns = ref([
{ key: 'softwareName', label: '组件名称', visible: true, filterable: true, sortable: false },
{ key: 'softwareVersion', label: '组件版本', visible: true, filterable: true, sortable: false },
{ key: 'trustScore', label: '组件可信等级', visible: true, filterable: false, sortable: true, tooltip: true },
// { key: 'securityScore', label: '组件重要性评分', visible: true, filterable: false, sortable: true },
{ key: 'licenseNum', label: 'License数量', visible: true, filterable: false, sortable: false,width: 140 },
{ key: 'industryCategory', label: '行业类型', visible: true, filterable: true, sortable: false },
{ key: 'primaryLanguage', label: '编程语言', visible: true, filterable: true, sortable: false },
{ key: 'codeLines', label: '代码量', visible: true, filterable: false, sortable: false },
{ key: 'sourceDownloadUrl', label: '源码包下载地址', visible: true, filterable: false, sortable: false,width: 200 },
{ key: 'releaseDate', label: '版本发布时间', visible: false, filterable: true, sortable: true,width: 160 },
// { key: 'dependencyCount', label: '依赖组件数', visible: false, filterable: false, sortable: false },
// { key: 'productComponentUsage', label: '产品成分使用量', visible: false, filterable: false, sortable: false,width: 160 },
{ key: 'vulnerabilityCount', label: '漏洞数量', visible: false, filterable: false, sortable: false },
{ key: 'developer', label: '开发商', visible: false, filterable: true, sortable: false },
{ key: 'contributorCountries', label: '贡献者国家/地区分布', visible: false, filterable: false, sortable: false,width: 200 },
{ key: 'contributorOrganizations', label: '贡献者组织/公司分布', visible: false, filterable: false, sortable: false,width: 200 },
{ key: 'communityHash', label: '社区hash值', visible: false, filterable: false, sortable: false,width: 160 },
{ key: 'copyright', label: 'Copyright', visible: false, filterable: false, sortable: false },
{
key: 'externalVulnerabilitySource',
label: '外部漏洞源的组件名称',
visible: false,
filterable: true,
sortable: false,width: 200
},
{ key: 'versionDescription', label: '版本描述', visible: false, filterable: false, sortable: false },
{ key: 'compatibilityRisk', label: '兼容性风险描述', visible: false, filterable: false, sortable: false ,width: 160},
{ key: 'eolDate', label: '社区EOL时间', visible: false, filterable: true, sortable: true,width: 160 }
]);
// 定义 showColumnList 状态
const showColumnList = ref(false);
// 获取子组件的引用
const countryModalRef = ref(null);
const orgModalRef = ref(null);
const getIndustryName = (value) => {
const industry = industryList.value.find((item) => item.value === value);
return industry ? industry.name : '未知行业'; // 如果找不到,返回默认值
};
// 清空高级搜索
const clear = () => {
newFormData.value = {
licenseName: '',
searchType: 'software',
softwareName: '',
softwareVersion: '',
dependentSoftware: '',
programmingLanguage: '',
interestTag: '',
industry: '',
dateRange: ['', '']
};
getReleaseList();
};
// 打开模态框的方法
const setDefult = () => {
columns.value = defultColumns.value;
};
// 打开模态框的方法
const openCountryModal = () => {
if (countryModalRef.value) {
countryModalRef.value.openModal(); // 调用子组件的方法
}
};
// 打开模态框的方法
const openOrgModal = () => {
if (orgModalRef.value) {
orgModalRef.value.openModal(); // 调用子组件的方法
}
};
// 更新 showColumnList 的方法
const updateTableKey = () => {
tableKey.value++; // 更新 tableKey强制刷新表格
};
// 更新 showColumnList 的方法
const updateShowColumnList = (newValue) => {
showColumnList.value = newValue;
// tableKey.value++; // 更新 tableKey强制刷新表格
};
// 更新 showColumnList 的方法
const openCountryChart = (row) => {
// selectRow.value = row;
countryVisible.value = true;
};
// 更新 showColumnList 的方法
const openOrgChart = (row) => {
// selectRow.value = row;
orgVisible.value = true;
};
// 跳转
const gotoDetail = (row) => {
// 后续请换成params暂时params传参没传过去
router.push({
path: 'repoDetail/' + row.id
});
};
const repoFun = (arr: any) => {
return arr ? (arr.length > 3 ? arr.slice(0, 3) : arr) : [];
};
// 编辑
const editRow = (row: any) => {
// 后续请换成params暂时params传参没传过去
router.push({
path: 'cla/edit/' + row.object_id,
query: { cla: row.cla, pageType: 'edit' }
});
};
// 确认删除
const confirmDelete = async (e: any) => {
// const res = await reqCatch(deleteGroupCla, { group_id: namespace.value, cla_id: item.value.object_id });
// if (!res.error) {
// getGroupClaListData();
// }
};
// 去成员页
const goMember = (row: any) => {
// 后续请换成params暂时params传参没传过去,注意路由有个:claID
router.push({
path: 'cla/claId/member',
query: { claId: row.object_id, claName: row.cla_name, group_path: namespace.value, pageType: 'edit' }
});
};
const getGroupClaListData = async () => {
// const params = {
// group_id: namespace.value,
// page: pager.value.pageIndex,
// per_page: pager.value.pageSize
// };
// const res = await reqCatch(getGroupClaList, params);
// if (!res.error) {
// tableData.value = res?.data?.data?.content;
// pager.value.total = res.data.data.total;
// }
};
getGroupClaListData();
const setClaStatus = async (row: any) => {
// const params = {
// group_id: namespace.value,
// cla_id: row.object_id,
// status: row.status
// };
// const res = await reqCatch(setGroupClaStatus, params);
// if (!res.error) {
// Message.success('操作成功!');
// getGroupClaListData();
// }
};
const signCla = (row: any) => {
router.push('/cla/' + row.object_id);
};
const getReleaseList = async () => {
const { data, error } = await releasePage({
softwareName: newFormData.value.softwareName || '',
searchType: newFormData.value.searchType || '',
softwareVersion: newFormData.value.softwareVersion || '',
programmingLanguage: newFormData.value.programmingLanguage || '',
interestTag: newFormData.value.interestTag || '',
industry: newFormData.value.industry || '',
licenseName: newFormData.value.licenseName || '',
dependentSoftware: newFormData.value.dependentSoftware || '',
releaseDateStart:
newFormData.value.dateRange && newFormData.value.dateRange.length > 0 ? newFormData.value.dateRange[0] : '',
releaseDateEnd:
newFormData.value.dateRange && newFormData.value.dateRange.length > 0 ? newFormData.value.dateRange[1] : '',
current: pager.value.pageIndex,
size: pager.value.pageSize
});
if (!error && data) {
allTableData.value = data.data.records;
tableData.value = data.data.records;
pager.value.total = data.data.total;
console.log(tableData.value);
}
};
const getLanguageList = async () => {
const res: any = await searchLanguageList();
if (!res.error) {
languageList.value = res.data.data;
}
};
onMounted(async () => {
// await getLanguageList();
newFormData.value.softwareName = route.query.softwareName || '';
newFormData.value.searchType = route.query.searchType || '';
newFormData.value.softwareVersion = route.query.softwareVersion || '';
newFormData.value.programmingLanguage = route.query.programmingLanguage || '';
newFormData.value.interestTag = route.query.interestTag || '';
newFormData.value.industry = route.query.searchType || '';
newFormData.value.licenseName = route.query.licenseName || '';
newFormData.value.dependentSoftware = route.query.dependentSoftware || '';
newFormData.value.dateRange = [route.query.releaseDateStart || '', route.query.releaseDateEnd || ''];
nextTick(() => {
getReleaseList();
});
// getReleaseList();
});
const exportResult = async () => {
const selectDatas = filterTableRef.value.store.getCheckedRows().map((d) => d.id);
if (!allTableData.value.length || selectDatas.length <= 0) {
Message.info('未选择任何数据');
return;
}
const { data, error } = await getReleaseExport({
list: selectDatas,
});
if (data && !error) {
// 方法1如果后端返回的是文件流Blob
const blob = new Blob([data.data]);
const downloadUrl = window.URL.createObjectURL(blob);
// 创建一个临时的a标签触发下载
const link = document.createElement('a');
link.href = downloadUrl;
// 从Content-Disposition头中获取文件名或者使用默认文件名
const contentDisposition = data.headers['content-disposition'];
let fileName = 'export.xlsx'; // 默认文件名
// if (contentDisposition) {
// const fileNameMatch = contentDisposition.match(/filename="?(.+)"?/);
// if (fileNameMatch && fileNameMatch[1]) {
// fileName = fileNameMatch[1].replace(/^[^0-9]*|[^0-9.xlsx]*$/g, "");
// }
// }
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
// 清理
document.body.removeChild(link);
window.URL.revokeObjectURL(downloadUrl);
} else {
console.error('导出失败:', error);
// 这里可以添加错误提示比如使用Element Plus的ElMessage
// ElMessage.error('文件导出失败');
}
};
// onMounted(() => {
// const query: any = route.query;
// newFormData.value = {
// ...query
// };
// });
// const exportResult = () => {
//
// if (!allTableData.value.length) {
// Message.info('暂无结果');
// return;
// }
//
// const selectDatas = filterTableRef.value.store.getCheckedRows().map((d) => d.id);
// if (!allTableData.value.length || selectDatas.length <= 0) {
// Message.info('未选择任何数据');
// return;
// }
//
// const exportData = allTableData.value
// .filter((d) => {
// return selectDatas.includes(d.id);
// })
// .map((item) => {
// let res = {};
// columns.value.forEach((col) => {
// if (col.key === 'validStatus') {
// res[col.label] = validStatusMap[item[col.key]] ? validStatusMap[item[col.key]] : '';
// } else {
// res[col.label] = item[col.key] ? item[col.key] : '';
// }
// });
// return res;
// });
//
// try {
// const workSheet = XLSX.utils.json_to_sheet(exportData);
// const workBook: any = { Sheets: { 校验结果: workSheet }, SheetNames: ['校验结果'] };
// const excelBuffer = XLSX.write(workBook, { bookType: 'xlsx', type: 'array' });
//
// const link = document.createElement('a');
// const blob = new Blob([excelBuffer]);
// link.setAttribute('href', window.URL.createObjectURL(blob));
// link.setAttribute('download', '组件存在及可信校验结果.xlsx');
// link.style.visibility = 'hidden';
// document.body.appendChild(link);
// link.click();
// document.body.removeChild(link);
// Message.success('导出成功');
// } catch {
// Message.error('导出失败');
// }
// };
</script>
<style scoped lang="scss">
@import 'devui-theme/styles-var/devui-var.scss';
.secret-container {
position: relative;
min-height: 600px;
.secret-op {
position: absolute;
right: 0;
top: 0;
}
}
.error {
color: $devui-contrast;
}
:deep(.devui-table__row td) {
padding-top: 16px;
padding-bottom: 16px;
}
:deep(.devui-tag .devui-tag--default) {
background-color: #fff;
border-radius: 12px;
padding: 4px 8px;
font-size: 12px;
line-height: 16px;
margin-right: 8px;
border: 1px solid #e3e3ee;
}
.one-line {
word-break: break-all;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.title {
font-size: 14px;
font-weight: 400;
color: #9a9b9c;
line-height: 20px;
}
.cur-title {
font-size: 14px;
font-weight: 500;
color: #2d2d2e;
line-height: 20px;
}
.search-form {
position: relative;
border-radius: 8px 0px 8px 8px;
//background: #F2F5FC;
.left-btn {
position: absolute;
right: 28px;
bottom: 4px;
}
.output-btn {
color: #191919;
font-family: HarmonyOS Sans SC;
font-weight: regular;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
}
.jyh-form-operation {
margin-left: 20px !important;
}
}
.secret-breadcrumb {
padding: 7px 20px 12px;
background: #ffffff;
}
</style>

View File

@@ -0,0 +1,367 @@
<template>
<div class="vuln-detail-container">
<div class="vuln-title mb-2">
<span>漏洞预警详情</span>
<div class="vuln-sub-title">
<!-- <d-button @click="openWarningDetail()" variant="solid">预警发布</d-button>-->
<!-- <span class="split-line"></span>-->
<d-icon name="icon-close" @click="$emit('close')"></d-icon>
</div>
</div>
<Card simple class="jyh-card mb-4">
<div class="card-title">漏洞信息</div>
<d-row class="mb-3">
<d-col :span="12">
<span class="card-key width-90">漏洞名称</span>
<span class="card-val">{{ valInfos.vulnId || '--' }}</span>
</d-col>
<d-col :span="12">
<span class="card-key width-90">漏洞类型</span>
<span class="card-val">{{ valInfos.vulnType || '--' }}</span>
</d-col>
</d-row>
<d-row class="mb-3">
<d-col :span="12">
<span class="card-key width-90">漏洞时间</span>
<span class="card-val">{{
valInfos.publishDate ? dayjs(valInfos.publishDate).format('YYYY-MM-DD') : '--'
}}</span>
</d-col>
<d-col :span="12">
<span class="card-key width-90">严重程度</span>
<span class="card-val" v-if="tagMap[valInfos.severity]">
<d-tag :color="tagMap[valInfos.severity].color" size="sm">{{ tagMap[valInfos.severity].text }}</d-tag>
</span>
</d-col>
</d-row>
</Card>
<Card simple class="jyh-card mb-4">
<div class="card-title">漏洞影响的软件列表</div>
<d-row class="mb-3">
<d-col :span="24">
<div v-if="componentsLists.length>0">
<d-table
class="jyh-table jyh-table-2"
:header-bg="true"
:data="componentsLists"
:span-method="spanMethod"
>
<d-column field="effectedComponentName" header="软件名称" show-overflow-tooltip></d-column>
<d-column field="effectedComponentVersion" header="软件版本及范围" show-overflow-tooltip></d-column>
<d-column field="isCriticalInfrastructureComponent" header="是否用户订阅" width="140" align="center">
<template #default="scope">
<div class="text-center" v-if="scope.row.isCriticalInfrastructureComponent==='是'">
<d-icon name="icon-right-o" style="font-size: 14px; color: rgb(80, 212, 171)"></d-icon>
</div>
<div class="text-center" v-else>
<d-icon name="icon-error-o" style="font-size: 14px; color: rgb(246, 111, 106)"></d-icon>
</div>
</template>
</d-column>
<!-- <d-column field="fixVersion" header="补丁版本"></d-column>-->
<!-- <d-column field="fixIssue" header="修复建议" show-overflow-tooltip></d-column>-->
<template #empty>
<NoData :small="false"></NoData>
</template>
</d-table>
<div class="mt-20 mb-20 flex justify-end" >
<d-pagination
style="display: inline-flex"
:total="pager.total"
v-model:pageSize="pager.pageSize"
v-model:pageIndex="pager.pageIndex"
:can-view-total="true"
:can-change-page-size="true"
:can-jump-page="true"
:max-items="5"
total-item-text="总计"
@page-index-change="getComponentsList"
@page-size-change="getComponentsList"
/>
</div>
</div>
<NoData v-else :small="false"></NoData>
</d-col>
</d-row>
</Card>
<!-- <Card simple class="jyh-card mb-4">-->
<!-- <div class="card-title">受影响的开源软件是否出库</div>-->
<!-- <d-row class="mb-3">-->
<!-- <d-col :span="24">-->
<!-- <d-radio-group direction="row" v-model="isOut" @change="onStorageStartTask">-->
<!-- <d-radio :value="2">出库</d-radio>-->
<!-- <d-radio :value="1">不出库</d-radio>-->
<!-- </d-radio-group>-->
<!-- </d-col>-->
<!-- </d-row>-->
<!-- </Card>-->
<!-- <Card simple class="jyh-card mb-4">-->
<!-- <div class="card-title">预警订阅人员列表</div>-->
<!-- <d-row class="mb-3">-->
<!-- <d-col :span="24">-->
<!-- <d-table class="jyh-table jyh-table-2" :header-bg="true" :data="alertsUsersLists">-->
<!-- <d-column field="username" header="订阅人"></d-column>-->
<!-- <d-column field="method" header="订阅方式"></d-column>-->
<!-- <d-column field="notifiedStatus" header="通知状态">-->
<!-- <template #default="scope, text">-->
<!-- <d-tag v-if="scope.row.notifiedStatus === 0" type="danger" size="sm">未通知</d-tag>-->
<!-- <d-tag v-if="scope.row.notifiedStatus === 1" type="success" size="sm">已通知</d-tag>-->
<!-- </template>-->
<!-- </d-column>-->
<!-- <template #empty>-->
<!-- <NoData :small="false"></NoData>-->
<!-- </template>-->
<!-- </d-table>-->
<!-- &lt;!&ndash; <div class="invitation-pagination">-->
<!-- <d-pagination-->
<!-- style="display: inline-flex"-->
<!-- :total="subscribePager.total"-->
<!-- v-model:pageSize="subscribePager.pageSize"-->
<!-- v-model:pageIndex="subscribePager.pageIndex"-->
<!-- :can-view-total="true"-->
<!-- :can-change-page-size="true"-->
<!-- :can-jump-page="true"-->
<!-- :max-items="5"-->
<!-- />-->
<!-- </div> &ndash;&gt;-->
<!-- </d-col>-->
<!-- </d-row>-->
<!-- </Card>-->
</div>
<d-modal class="warning-modal" v-model="warningModalVisable" title="">
<EarlyWarningDetail
@close="colseWarningDetail"
:softwareId="valInfos.softwareId"
:valInfos="valInfos"
:softwareIds="softwareIds"
:isStartOutTask="isOut"
type="system"
></EarlyWarningDetail>
</d-modal>
</template>
<script setup lang="ts">
import NoData from '@/components/NoData/NoData.vue';
import dayjs from 'dayjs';
import {
getVulnAffected,
getVulnDetail,
getVulnerabilitiesAlertsUsers,
getVulnerabilitiesComponents,
getVulnerabilitiesDetails,
getVulnPatch,
storageStartOutTask
} from '@/api/repo';
import { computed, onMounted, ref, shallowReactive } from 'vue';
import EarlyWarningDetail from '@/views/Jyh/PersonalCenter/Detail/EarlyWarningDetail.vue';
import { Message } from 'vue-devui/message';
const tagMap = {
Critical: {
text: '致命',
color: '#c7000b'
},
High: {
text: '高',
color: '#f66f6a'
},
Medium: {
text: '中',
color: '#fac20a'
},
Low: {
text: '低',
color: '#5e7ce0'
},
high: {
text: '高',
color: '#f66f6a'
},
medium: {
text: '中',
color: '#fac20a'
},
low: {
text: '低',
color: '#5e7ce0'
}
};
const subscribePager = shallowReactive({
total: 1,
pageIndex: 1,
pageSize: 10,
pageSizeOptions: [10, 20, 30, 40, 50]
});
const isOut = ref(1);
const propsData = defineProps(['vulnId']);
const warningModalVisable = ref(false);
const softwareIds = computed(() => {
let arr = [];
alertsUsersLists.value?.map(i=>{
if(i.notifiedStatus==0) {
if(!arr.includes(i.softwareId)) {
arr.push(i.softwareId)
}
}
})
return arr;
});
const openWarningDetail = () => {
if(valInfos.value?.effectedComponents.length>0&&softwareIds.value.length>0) {
warningModalVisable.value = true;
} else {
Message.warning('当前暂无需要通知的用户');
}
};
const colseWarningDetail = () => {
warningModalVisable.value = false;
};
const onStorageStartTask = async (e) => {
if (!valInfos.value?.softwareId) return;
await storageStartOutTask({
softwareId: valInfos.value?.softwareId,
taskType: isOut.value
});
};
const severityMap = {
high: '高',
medium: '中',
low: '低'
};
const valInfos: any = ref({});
const componentsLists: any = ref([]);
const alertsUsersLists: any = ref([]);
const getComponentsList = async () => {
const response = await getVulnerabilitiesComponents({
id:propsData.vulnId,
current: pager.value.pageIndex,
size: pager.value.pageSize
});
debugger
if (response.data.data.code === 200) {
// 假设接口返回格式为 { code, data: { records, total } }
componentsLists.value = response.data.data.data.records || [];
pager.value.total = response.data.data.data.total || 0;
} else {
// Message.error('获取组件列表失败');
componentsLists.value = [];
pager.value.total = 0;
}
}
onMounted(async () => {
const _valInfos = await getVulnerabilitiesDetails(propsData.vulnId);
const _alertsUsersLists = await getVulnerabilitiesAlertsUsers(propsData.vulnId);
valInfos.value = _valInfos?.data?.data?.data;
alertsUsersLists.value = _alertsUsersLists?.data?.data?.data?.map((user) => {
const alertMethod = JSON.parse(user.alertTypeExt ?? '{}');
let method = '';
if (alertMethod.webSwitch) {
method = '站内通知';
} else if (alertMethod.emailSwitch) {
method = '邮件';
} else if (alertMethod.mobileSwitch) {
method = '短信';
}
return {
...user,
method
};
});
await getComponentsList()
});
const pager = ref({
total: 0,
pageIndex: 1,
pageSize: 10
});
// 分页事件处理
function onPageIndexChange(newPageIndex) {
pager.value.pageIndex = newPageIndex;
}
function onPageSizeChange(newPageSize) {
// 重置页码为1
pager.value.pageIndex = 1;
pager.value.pageSize = newPageSize;
}
</script>
<style scoped lang="scss">
.vuln-detail-container {
width: 800px;
padding: 20px;
.vuln-title {
color: #191919;
font-family: HarmonyOS Sans SC;
font-weight: 400;
font-size: 18px;
display: flex;
justify-content: space-between;
}
.vuln-sub-title {
color: #191919;
font-family: HarmonyOS Sans;
font-weight: regular;
font-size: 12px;
line-height: 20px;
letter-spacing: 0px;
text-align: left;
.split-line {
width: 1px;
display: inline-block;
line-height: 16px;
height: 16px;
vertical-align: middle;
margin: 0 8px;
background-color: #eef0f5;
}
.release-time {
color: #808080;
}
}
.card-val {
display: inline-block;
width: calc(100% - 90px);
vertical-align: top;
}
.invitation-pagination {
padding: 12px 0;
text-align: right;
}
}
</style>
<style lang="scss">
.warning-modal {
width: auto;
.devui-modal__header {
font-size: 20px;
height: auto !important;
}
.devui-modal__body {
padding: 0;
}
}
</style>

View File

@@ -0,0 +1,329 @@
<template>
<d-modal style="width: 1200px" v-model="visible" @close="close" class="software-modal">
<template #header>
<gc-modal-header>
<span class="text-G900 text-base font-bold leading-[24px]">受影响软件清单</span>
</gc-modal-header>
<div class="line bg-G200"></div>
</template>
<d-row class="mb-3">
<d-col :span="24">
<!-- 批量预警按钮保留 -->
<div class="mb-4 flex justify-start">
<d-button
variant="solid"
color="primary"
@click="batchPublishWarning"
:disabled="selectedRows.length === 0"
>
批量预警
</d-button>
<span class="ml-3 text-G600" v-if="selectedRows.length > 0">
已选中 {{ selectedRows.length }} 条数据
</span>
</div>
<div v-if="componentsLists.length > 0">
<d-table
ref="tableRef"
class="jyh-table jyh-table-2"
:header-bg="true"
:data="componentsLists"
:span-method="spanMethod"
row-key="effectedComponentVersion"
@check-change="handleCheckChange"
@check-all-change="handleCheckAllChange"
>
<!-- 1. 新增复选框列DevUI标准选中入口 -->
<d-column
type="checkable"
width="40"
reserve-check
></d-column>
<!-- 原有列保持不变 -->
<d-column field="effectedSoftwareName" header="应用名称" show-overflow-tooltip width="200"></d-column>
<d-column field="effectedComponentName" header="组件名称" show-overflow-tooltip width="200"></d-column>
<d-column field="effectedComponentVersion" header="版本及范围" show-overflow-tooltip width="200"></d-column>
<d-column field="develop" header="组件开发者" show-overflow-tooltip width="180"></d-column>
<d-column field="responsibleTeam" header="责任单位" show-overflow-tooltip width="180"></d-column>
<d-column header="操作" fixed-right="0px" width="160">
<template #default="scope">
<a class="devui-link mr-[8px]" @click="openWarningDetail(scope.row)">发布预警</a>
</template>
</d-column>
</d-table>
<!-- 分页组件保留新增选中状态重置逻辑 -->
<div class="mt-20 mb-20 flex justify-end">
<d-pagination
size="md"
:total="pager.total"
v-model:pageSize="pager.pageSize"
v-model:pageIndex="pager.pageIndex"
:can-view-total="true"
:can-change-page-size="true"
:can-jump-page="true"
:max-items="5"
total-item-text="总计"
@page-index-change="handlePageChange"
@page-size-change="handlePageChange"
/>
</div>
</div>
<NoData v-else :small="false"></NoData>
</d-col>
</d-row>
<template #footer>
<div class="flex justify-end px-[24px] pb-[24px] gap-2">
<d-button @click="handleCancel">取消</d-button>
<d-button variant="solid" :disabled="disabled" @click="handleConfirm">确定</d-button>
</div>
</template>
<!-- <EarlyWarningDetail :warningData="currentWarning" type="system" @refresh="getAlertSubscribesPage"></EarlyWarningDetail>-->
</d-modal>
</template>
<script setup>
import { ref } from 'vue';
import NoData from '@/components/NoData/NoData.vue';
import { getVulnerabilitiesComponents } from '@/api/repo';
import { Message } from 'vue-devui/message';
import { useGlobalInfoStore } from '@/stores/Global';
import { getNoticeAdd } from '@/api/jyh';
const globalStore = useGlobalInfoStore();
// -------------------------- 1. 核心状态调整 --------------------------
const tableRef = ref(null); // 新增表格Ref用于主动操作如清空选中
const vulnId = ref('');
const vulnRow = ref({});
const visible = ref(false);
const componentsLists = ref([]);
const disabled = ref(false);
const pager = ref({ total: 0, pageIndex: 1, pageSize: 10 });
const warningData = ref({});
const currentWarning = ref();
const selectedRows = ref([]); // 存储选中的行数据(核心)
// 暴露给父组件的方法
defineExpose({ open, close, setDisabled });
// -------------------------- 2. 选中功能核心逻辑适配DevUI标准 --------------------------
/**
* 可选:控制行是否允许选中(如过滤特定责任单位的行)
* @param row 当前行数据
* @param rowIndex 行索引
* @returns 是否允许选中
*/
const isRowCheckable = (row, rowIndex) => {
// 示例:所有行都允许选中(可自定义条件,如 row.responsibleUnit === '信支工程大学'
return true;
};
/**
* 单选事件DevUI标准事件@check-change
* @param checked 当前行是否选中boolean
* @param row 当前行数据object
* @param selection 所有选中的行数据array
*/
// 复选框选中状态变化
const handleCheckChange = (checked, row, selection) => {
if (checked) {
if (!selectedRows.value.some(r => r.effectedComponentVersion === row.effectedComponentVersion)) {
selectedRows.value.push(row);
}
} else {
selectedRows.value = selectedRows.value.filter(r => r.effectedComponentVersion !== row.effectedComponentVersion);
}
};
// 全选状态变化
const handleCheckAllChange = (checked, selection) => {
if (checked) {
selectedRows.value = [...selection];
} else {
selectedRows.value = [];
}
};
// -------------------------- 3. 分页事件调整(重置选中状态) --------------------------
/**
* 分页切换事件(统一处理页码/页大小变化)
*/
const handlePageChange = async () => {
// 分页切换时,清空上一页的选中状态(避免跨页残留)
selectedRows.value = [];
// 若需要保留跨页选中,可通过 tableRef 操作tableRef.value.store.clearSelection()
await getComponentsList();
};
// -------------------------- 4. 原有业务逻辑(保持不变,仅适配选中数据) --------------------------
/**
* 单条发布预警
*/
const openWarningDetail = async (row) => {
currentWarning.value = row;
// Message.success(`已为【${row.softName}】发布预警`);
const { data } = await getNoticeAdd({
"softwareId": [row?.effectedSoftwareId],
"username": globalStore.currentRoleKey,
"vulId": row?.vulnId,
}).catch((err) => {
Message({
type: 'error',
message: '预警发送失败,请重试'
});
});
if(data.ok) {
Message({
type: 'success',
message: '预警发送成功'
});
}
};
/**
* 批量发布预警
*/
const batchPublishWarning = async () => {
if (selectedRows.value.length === 0) {
Message.warning('请先选择需要发布预警的数据');
return;
}
const { data } = await getNoticeAdd({
"softwareId": selectedRows.value.map(i=>i.effectedSoftwareId),
"username": globalStore.currentRoleKey,
"vulId": selectedRows.value[0]?.vulnId,
}).catch((err) => {
Message({
type: 'error',
message: '预警发送失败,请重试'
});
});
if(data.ok) {
Message({
type: 'success',
message: '预警发送成功'
});
// // 批量预警后主动清空表格选中状态联动UI
// if (tableRef.value) {
// tableRef.value.store.clearSelection();
// }
// selectedRows.value = [];
}
};
/**
* 获取组件列表(模拟数据+真实接口)
*/
const getComponentsList = async () => {
if (vulnRow.value.vulnId === 'CVE-2025-27507') {
// 模拟数据(保持不变)
componentsLists.value = [
{
id: '1',
softName: '军工供应链管理系统 V2.0',
effectedComponentName: 'Apache Commons Text',
effectedComponentVersion: '1.9 - 1.11.0(含)',
coder: 'Apache软件基金会',
responsibleUnit: '信支工程大学'
},
{
id: '2',
softName: '高校科研项目管理平台',
effectedComponentName: 'Log4j',
effectedComponentVersion: '2.0 - 2.14.1(含)',
coder: 'Apache软件基金会',
responsibleUnit: '华中科技大学'
},
{
id: '3',
softName: '军工代码审计系统 V3.5',
effectedComponentName: 'Jackson Databind',
effectedComponentVersion: '2.9.0 - 2.15.2(含)',
coder: 'FasterXML',
responsibleUnit: '信支工程大学'
},
{
id: '4',
softName: '高校教学管理系统 V5.0',
effectedComponentName: 'Spring Framework',
effectedComponentVersion: '5.3.0 - 5.3.23(含)',
coder: 'Pivotal Software',
responsibleUnit: '武汉大学'
}
];
pager.value.total = componentsLists.value.length;
} else {
// 真实接口逻辑(保持不变)
const response = await getVulnerabilitiesComponents({
id: vulnId.value,
current: pager.value.pageIndex,
size: pager.value.pageSize
});
if (response.data.data.code === 200) {
componentsLists.value = response.data.data.data.records?.map(item => ({
...item,
coder: item.coder || '未知',
responsibleUnit: item.responsibleUnit || '未知单位'
})) || [];
pager.value.total = response.data.data.data.total || 0;
} else {
componentsLists.value = [];
pager.value.total = 0;
}
}
};
/**
* 打开/关闭模态框(重置选中状态)
*/
async function open(row) {
if (row.id || row.vulnId) {
vulnId.value = row.id;
vulnRow.value = row;
selectedRows.value = []; // 重置选中
await getComponentsList();
visible.value = true;
}
}
function close() {
componentsLists.value = [];
pager.value = { total: 0, pageIndex: 1, pageSize: 10 };
vulnId.value = '';
vulnRow.value = {};
selectedRows.value = []; // 清空选中
// if (tableRef.value) {
// tableRef.value.store.clearSelection(); // 联动表格UI清空
// }
visible.value = false;
}
// 其他原有方法(保持不变)
function setComponentsList(list) { componentsLists.value = list; }
function setDisabled(isDisabled) { disabled.value = isDisabled; }
function handleConfirm() { close(); }
function handleCancel() { close(); }
</script>
<style lang="scss" scoped>
.software-modal {
width: 1200px !important;
}
:deep(.devui-btn) {
margin-bottom: 8px;
}
:deep(.devui-table-cell) {
white-space: nowrap;
}
// 可选:调整复选框列样式(与表格对齐)
:deep(.devui-table-checkable-column) {
text-align: center;
}
</style>

View File

@@ -0,0 +1,376 @@
<template>
<div class="page-wrap">
<!-- <h1 class="page-title">{{ title }}</h1> -->
<div class="search-form">
<!-- <d-search-->
<!-- icon-position="left"-->
<!-- @search="search"-->
<!-- v-model="vulnId"-->
<!-- style="width: 400px"-->
<!-- placeholder="请输入漏洞编号"-->
<!-- ></d-search>-->
<d-form layout="horizontal" :label-align="'end'">
<d-row :gutter="16">
<d-col :span="6">
<d-form-item field="vulnId" label="漏洞编号">
<d-input placeholder="请输入漏洞编号" v-model="newFormData.vulnId" />
</d-form-item>
</d-col>
<d-col :span="6">
<d-form-item field="severity" label="严重程度">
<d-select
:key="newFormData.severity"
:options="tagArray"
:allow-clear="true"
v-model="newFormData.severity"
placeholder="请选择严重程度"
></d-select>
</d-form-item>
</d-col>
<d-col :span="6">
<d-form-item field="affectedComponentCount" label="受影响软件数">
<d-input-number style="width: 100%;background: #ffffff" :min="0" :max="100" placeholder="请输入受影响软件数" :allowEmpty="true" v-model="newFormData.affectedComponentCount" />
</d-form-item>
</d-col>
</d-row>
</d-form>
<div class="jyh-form-operation">
<d-button @click="getList(1)" class="mr-2" variant="solid">搜索</d-button>
<d-button variant="solid" color="secondary" @click="clear">清空</d-button>
</div>
</div>
<Card class="mt-3">
<d-table :show-loading="loading" class="jyh-table" :data="dataLists" v-if="dataLists.length > 0" table-layout="auto">
<d-column type="index" width="40"></d-column>
<d-column field="vulnId" header="漏洞编号"></d-column>
<d-column field="vulnType" header="漏洞类型"></d-column>
<d-column field="publishDate" header="漏洞发布时间">
<template #default="scope">
{{ scope.row.publishDate
? dayjs(scope.row.publishDate).add(5, 'month').format('YYYY-MM-DD HH:mm:ss')
: '--'
}}
</template>
</d-column>
<d-column field="severity" header="严重程度">
<template #default="scope">
<span class="card-val" v-if="tagMap[scope.row.severity]">
<d-tag :color="tagMap[scope.row.severity].color" size="sm">{{ tagMap[scope.row.severity].text }}</d-tag>
</span></template
>
</d-column>
<d-column field="effectedComponentCount" header="受影响软件清单">
<template #default="scope">
<!--TODO:将受影响软件清单数量改为十个以下-->
<a v-if="scope.row.vulnId==='CVE-2025-27507'" class="devui-link" @click="showModal(scope.row)">4个</a>
<a v-else class="devui-link" @click="showModal(scope.row)">{{scope.row.effectedComponentCount? String(scope.row.effectedComponentCount)[0]:'0'}}</a>
</template>
</d-column>
<d-column header="操作" fixed-right="0px" width="130">
<template #default="scope">
<a class="devui-link" style="margin-right: 8px" @click="openVulnDetail(scope.row)">详情</a>
<d-button @click="handleViewAIModal(scope.row)" variant="text" color="primary"> AI问答 </d-button>
</template>
</d-column>
</d-table>
<NoData v-else :small="false"></NoData>
<div class="mt-20 mb-20 flex justify-end" v-if="dataLists.length > 0">
<d-pagination
size="md"
:page-size-options="[10, 20, 50]"
:total="pager.total"
v-model:pageSize="pager.pageSize"
v-model:pageIndex="pager.pageIndex"
:max-items="5"
:can-change-page-size="true"
:can-view-total="true"
total-item-text="总计"
@page-index-change="getList()"
@page-size-change="getList()"
/>
</div>
</Card>
</div>
<!-- 漏洞详情 -->
<d-drawer v-model="vulnDetailVisable" style="width: auto">
<VulnerabilityDetail :vulnId="currentVuln.id" @close="colseVulnDetail"></VulnerabilityDetail>
</d-drawer>
<AIModal ref="AIModalRef" />
<EffectedComponents ref="modalRef" />
</template>
<script setup lang="ts">
import { computed, onMounted, ref } from 'vue';
import { useRoute } from 'vue-router';
import VulnerabilityDetail from './VulnerabilityDetail.vue';
import EffectedComponents from './effectedComponents.vue';
import { alertsPage } from '@/api/jyh/home';
import dayjs from 'dayjs';
import NoData from '@/components/NoData/NoData.vue';
import AIModal from '../AIModal.vue';
import { getVulnerabilitiespage } from '@/api/repo';
const route = useRoute();
const title = computed(() => route.meta?.reportTitle || '漏洞感知列表');
const pager = ref({
total: 10,
pageIndex: 1,
pageSize: 10
});
const newFormData = ref({
vulnId: '',
affectedComponentCount: '',
severity: '',
});
const loading = ref(false);
const AIModalRef = ref(null);
// 清空高级搜索
const clear = () => {
newFormData.value = {
vulnId: '',
affectedComponentCount: '',
severity: '',
};
getList();
};
const tagMap = {
Critical: {
text: '致命',
color: '#c7000b'
},
High: {
text: '高',
color: '#f66f6a'
},
Medium: {
text: '中',
color: '#fac20a'
},
Low: {
text: '低',
color: '#5e7ce0'
},
critical: {
text: '致命',
color: '#c7000b'
},
high: {
text: '高',
color: '#f66f6a'
},
medium: {
text: '中',
color: '#fac20a'
},
low: {
text: '低',
color: '#5e7ce0'
}
};
const tagArray = [
{ value: 'critical', name: '致命' },
{ value: 'high', name: '高' },
{ value: 'medium', name: '中' },
{ value: 'low', name: '低' }
]
const vulnDetailVisable = ref(false);
const currentVuln = ref();
const openVulnDetail = (row) => {
vulnDetailVisable.value = true;
currentVuln.value = row;
};
const modalRef = ref(null);
function showModal(row) {
if (modalRef.value) {
modalRef.value.setDisabled(false);
modalRef.value.open(row);
}
}
// 打开弹框方法
const handleViewAIModal = (resultId) => {
AIModalRef.value.open(resultId); // 传递result_id参数
};
const colseVulnDetail = () => {
vulnDetailVisable.value = false;
};
const vulnId = ref('');
const dataLists = ref([]);
const getList = async (current) => {
loading.value = true
if(current) pager.value.pageIndex=current;
const { data } = await getVulnerabilitiespage({
vulnId: newFormData.value.vulnId,
current: current || pager.value.pageIndex,
affectedComponentCount: newFormData.value.affectedComponentCount,
severity: newFormData.value.severity,
size: pager.value.pageSize
}).finally(()=>{
loading.value = false
});
dataLists.value = data?.data?.data?.records || [
{
"id": 184783,
"taskId": null,
"softwareId": null,
"componentId": null,
"vulnId": "CVE-2024-31585",
"cweId": "CWE-193",
"severity": "medium",
"vulnType": "CVE",
"cvssScore": 5.3,
"attackVector": null,
"attackComplexity": null,
"userInteraction": null,
"privilegesRequired": null,
"exploitabilityScore": null,
"impactScore": null,
"description": "FFmpeg version n5.1 to n6.1 was discovered to contain an Off-by-one Error vulnerability in libavfilter/avf_showspectrum.c. This vulnerability allows attackers to cause a Denial of Service (DoS) via a crafted input.",
"extraInfo": "{\"refs\": [\"https://gist.github.com/1047524396/dc2c64ffe0c3934a6176bcd2c5cf5656\", \"https://github.com/FFmpeg/FFmpeg/commit/81df787b53eb5c6433731f6eaaf7f2a94d8a8c80\", \"https://github.com/ffmpeg/ffmpeg/commit/ab0fdaedd1e7224f7e84ea22fcbfaa4ca75a6c06\", \"https://lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/6G7EYH2JAK5OJPVNC6AXYQ5K7YGYNCDN/\", \"https://lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/IPETICRXUOGRIM4U3BCRTIKE3IZWCSBT/\", \"https://lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/LE3ASLH6QF2E5OVJI5VA3JSEPJFFFMNY/\"]}",
"fixIssue": null,
"patchLink": null,
"source": "HUST",
"publishDate": "2024-04-17T19:15:08.000+00:00",
"fixVersion": null,
"exploitability": null,
"createTime": "2025-10-14T21:00:03.000+00:00",
"updateTime": "2025-10-14T21:00:03.000+00:00",
"componentName": null,
"componentVersion": null,
"effectedComponentCount": null,
"effectedComponents": null
},
{
"id": 184780,
"taskId": null,
"softwareId": null,
"componentId": null,
"vulnId": "CVE-2024-31578",
"cweId": null,
"severity": "high",
"vulnType": "CVE",
"cvssScore": 7.5,
"attackVector": null,
"attackComplexity": null,
"userInteraction": null,
"privilegesRequired": null,
"exploitabilityScore": null,
"impactScore": null,
"description": "FFmpeg version n6.1.1 was discovered to contain a heap use-after-free via the av_hwframe_ctx_init function.",
"extraInfo": "{\"refs\": [\"https://github.com/ffmpeg/ffmpeg/commit/3bb00c0a420c3ce83c6fafee30270d69622ccad7\", \"https://gist.github.com/1047524396/45400cce5859d78dcd3a62010df8d179\", \"https://lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/LE3ASLH6QF2E5OVJI5VA3JSEPJFFFMNY/\", \"https://lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/IPETICRXUOGRIM4U3BCRTIKE3IZWCSBT/\", \"https://lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/6G7EYH2JAK5OJPVNC6AXYQ5K7YGYNCDN/\"]}",
"fixIssue": null,
"patchLink": null,
"source": "HUST",
"publishDate": "2024-04-17T14:15:08.000+00:00",
"fixVersion": null,
"exploitability": null,
"createTime": "2025-10-14T21:00:03.000+00:00",
"updateTime": "2025-10-14T21:00:03.000+00:00",
"componentName": null,
"componentVersion": null,
"effectedComponentCount": 1,
"effectedComponents": null
},
{
"id": 184781,
"taskId": null,
"softwareId": null,
"componentId": null,
"vulnId": "CVE-2024-31578",
"cweId": null,
"severity": "high",
"vulnType": "CVE",
"cvssScore": 7.5,
"attackVector": null,
"attackComplexity": null,
"userInteraction": null,
"privilegesRequired": null,
"exploitabilityScore": null,
"impactScore": null,
"description": "FFmpeg version n6.1.1 was discovered to contain a heap use-after-free via the av_hwframe_ctx_init function.",
"extraInfo": "{\"refs\": [\"https://github.com/ffmpeg/ffmpeg/commit/3bb00c0a420c3ce83c6fafee30270d69622ccad7\", \"https://gist.github.com/1047524396/45400cce5859d78dcd3a62010df8d179\", \"https://lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/LE3ASLH6QF2E5OVJI5VA3JSEPJFFFMNY/\", \"https://lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/IPETICRXUOGRIM4U3BCRTIKE3IZWCSBT/\", \"https://lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/6G7EYH2JAK5OJPVNC6AXYQ5K7YGYNCDN/\"]}",
"fixIssue": null,
"patchLink": null,
"source": "HUST",
"publishDate": "2024-04-17T14:15:08.000+00:00",
"fixVersion": null,
"exploitability": null,
"createTime": "2025-10-14T21:00:03.000+00:00",
"updateTime": "2025-10-14T21:00:03.000+00:00",
"componentName": null,
"componentVersion": null,
"effectedComponentCount": null,
"effectedComponents": null
}
];
pager.value.total = data.data.data?.total;
};
onMounted(() => {
getList();
});
const search = () => {
pager.value.pageIndex = 1;
getList();
};
</script>
<style scoped lang="scss">
@import 'devui-theme/styles-var/devui-var.scss';
.page-wrap {
margin: 16px;
.page-title {
color: #191919;
font-family: HarmonyOS Sans SC;
font-weight: medium;
font-size: 18px;
line-height: 26px;
letter-spacing: 0px;
text-align: left;
}
.g-content-card {
overflow: hidden;
padding: 0;
}
}
.search-form {
position: relative;
border-radius: 8px 0px 8px 8px;
margin-right: 20px;
//background: #F2F5FC;
.left-btn {
position: absolute;
right: 28px;
bottom: 4px;
}
.output-btn {
color: #191919;
font-family: HarmonyOS Sans SC;
font-weight: regular;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
}
.jyh-form-operation {
margin-left: 20px !important;
}
}
</style>

View File

@@ -0,0 +1,228 @@
<template>
<div class="secret-container">
<d-breadcrumb class="secret-breadcrumb">
<gc-breadcrumb-item :to="{ name: 'home' }"
><span class="title">首页</span></gc-breadcrumb-item>
<gc-breadcrumb-item><span class="cur-title">安全知识库</span></gc-breadcrumb-item>
</d-breadcrumb>
<d-tabs class="jyh-tabs" type="wrapped" v-model="selectTab">
<d-tab id="VulnerabilityList" title="多源漏洞库">
<VulnerabilityList/>
</d-tab>
<d-tab id="OssQuery" title="可信组件库">
<OssQuery/>
</d-tab>
<d-tab id="BatchVerify" title="威胁情报库">
<IntelligenceList/>
</d-tab>
</d-tabs>
</div>
</template>
<script setup lang="ts">
import SettingTitle from '@/components/Setting/SettingTitle/index.vue';
import SettingText from '@/components/Setting/SettingText/index.vue';
import { ref,reactive,watch } from 'vue';
import { getGroupClaList, setGroupClaStatus, deleteGroupCla } from '@/api/cla';
import { useRouter, useRoute } from 'vue-router';
import { GModal } from '@/components/Setting/index';
import { reqCatch } from '@/utils/catch';
import { getOrgInfo } from '@/views/Org/hooks/orgInfo';
import { Message } from 'vue-devui';
import OssQuery from './Components/OssQuery.vue';
import VulnerabilityList from './Components/VulnerabilityList/index.vue';
import IntelligenceList from './Components/IntelligenceList/index.vue';
import BatchVerify from './Components/BatchVerify.vue';
import { useAccountStore } from '@/stores/user';
const { namespace } = getOrgInfo();
const { isLogin } = useAccountStore();
// 获取当前路由
const route = useRoute();
const selectTab = ref(route.query.tab || 'VulnerabilityList');
// 监听 tab 值变化,更新 URL 参数
watch(selectTab, (newTab) => {
router.replace({
name: route.name,
params: route.params,
query: { ...route.query, tab: newTab }
});
});
// 监听 URL 参数变化,更新 tab 值
watch(
() => route.query.tab,
(newTab) => {
if (newTab) {
selectTab.value = newTab;
}
},
{ immediate: true } // 初始化时执行一次
);
// 删除弹窗
const item = ref('');
const deleteModal = ref();
const deletevModels = ref(false);
const openDelete = (row: any) => {
item.value = row;
deleteModal.value.showFlag = true;
deletevModels.value = true;
};
const router = useRouter();
// 分页
const changeIndex = () => {
// getGroupClaListData();
};
const changeSize = () => {
pager.value.pageIndex = 1;
// getGroupClaListData();
};
const repoFun = (arr: any) => {
return arr ? (arr.length > 3 ? arr.slice(0, 3) : arr) : [];
};
// 编辑
const editRow = (row: any) => {
// 后续请换成params暂时params传参没传过去
router.push({
path: 'cla/edit/' + row.object_id,
query: { cla: row.cla, pageType: 'edit' }
});
};
// 确认删除
const confirmDelete = async (e: any) => {
// const res = await reqCatch(deleteGroupCla, { group_id: namespace.value, cla_id: item.value.object_id });
// if (!res.error) {
// getGroupClaListData();
// }
};
// 去成员页
const goMember = (row: any) => {
// 后续请换成params暂时params传参没传过去,注意路由有个:claID
router.push({
path: 'cla/claId/member',
query: { claId: row.object_id, claName: row.cla_name, group_path: namespace.value, pageType: 'edit' }
});
};
const getGroupClaListData = async () => {
// const params = {
// group_id: namespace.value,
// page: pager.value.pageIndex,
// per_page: pager.value.pageSize
// };
// const res = await reqCatch(getGroupClaList, params);
// if (!res.error) {
// tableData.value = res?.data?.data?.content;
// pager.value.total = res.data.data.total;
// }
};
getGroupClaListData();
const setClaStatus = async (row: any) => {
// const params = {
// group_id: namespace.value,
// cla_id: row.object_id,
// status: row.status
// };
// const res = await reqCatch(setGroupClaStatus, params);
// if (!res.error) {
// Message.success('操作成功!');
// getGroupClaListData();
// }
};
const signCla = (row: any) => {
router.push('/cla/' + row.object_id);
};
</script>
<style scoped lang="scss">
@import 'devui-theme/styles-var/devui-var.scss';
.secret-container {
position: relative;
.secret-op {
position: absolute;
right: 0;
top: 0;
}
}
.error {
color: $devui-contrast;
}
:deep(.devui-table__row td) {
padding-top: 16px;
padding-bottom: 16px;
}
:deep(.devui-tag .devui-tag--default) {
background-color: #fff;
border-radius: 12px;
padding: 4px 8px;
font-size: 12px;
line-height: 16px;
margin-right: 8px;
border: 1px solid #E3E3EE;
}
.one-line {
word-break: break-all;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.title {
font-size: 14px;
font-weight: 400;
color: #9a9b9c;
line-height: 20px;
}
.cur-title {
font-size: 14px;
font-weight: 500;
color: #2d2d2e;
line-height: 20px;
}
.search-form {
position: relative;
padding: 12px 20px 12px 0;
border-radius: 8px 0px 8px 8px;
background: #F2F5FC;
.output-btn {
position: absolute;
right: 28px;
bottom: 4px;
color: #191919;
font-family: HarmonyOS Sans SC;
font-weight: regular;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
}
}
.secret-breadcrumb {
padding: 7px 20px 12px;
background: #ffffff;
}
</style>

View File

@@ -0,0 +1,357 @@
<template>
<div class="secret-container pt-2 px-20">
<d-breadcrumb>
<gc-breadcrumb-item :to="{ name: 'home' }"
><span class="title">首页</span></gc-breadcrumb-item>
<gc-breadcrumb-item><span class="title">高级搜索</span></gc-breadcrumb-item>
<gc-breadcrumb-item><span class="cur-title">License</span></gc-breadcrumb-item>
</d-breadcrumb>
<div class="search-form mt-2">
<d-form
class="jyh-form"
ref="formRef"
:data="formData"
:pop-postion="['right']"
:rules="formRules"
>
<d-row :gutter="25" type="flex" class="docs-devui-row mb-4">
<d-col style="flex: 1">
<d-form-item field="title" label="搜索关键字" :show-feedback="false">
<d-input
style="width: 100%"
v-model="formData.title"
placeholder="关键字模糊搜索"
maxLength="50"
minLength="2"
/>
</d-form-item>
</d-col>
<d-col style="flex: 1">
<d-form-item field="title" label="License编码" :show-feedback="false">
<d-input
style="width: 100%"
v-model="formData.title"
placeholder="License编码模糊搜索"
maxLength="50"
minLength="2"
/>
</d-form-item>
</d-col>
<d-col style="flex: 1">
<d-form-item field="name" label="License名称" :show-feedback="false">
<d-input
style="width: 100%"
v-model="formData.title"
placeholder="License名称模糊搜索"
maxLength="50"
minLength="2"
/>
</d-form-item>
</d-col>
<d-col style="flex: 1">
<d-form-item field="title" label="类型" :show-feedback="false">
<d-select v-model="formData.select" :options="typeOptions" :allow-clear="true" />
</d-form-item>
</d-col>
<d-col style="flex: 1">
<d-form-item field="title" label="集成风险" :show-feedback="false">
<d-select v-model="formData.select" :options="riskOptions" :allow-clear="true" />
</d-form-item>
</d-col>
</d-row>
<d-row :gutter="25" type="flex" class="docs-devui-row mb-5">
<d-col style="flex: 1">
<d-form-item field="title" label="适用类型" :show-feedback="false">
<d-select v-model="formData.select" :options="useTypeOptions" :allow-clear="true" />
</d-form-item>
</d-col>
<d-col style="flex: 1">
<d-form-item field="title" label="是否可用" :show-feedback="false">
<d-select v-model="formData.select" :options="isUseOptions" :allow-clear="true" />
</d-form-item>
</d-col>
<d-col style="flex: 1">
<d-form-item field="name" label="键值" :show-feedback="false">
<d-input
style="width: 100%"
v-model="formData.title"
placeholder="请输入键值"
maxLength="50"
minLength="2"
/>
</d-form-item>
</d-col>
<d-col style="flex: 1">
<d-form-item field="title" label="创建时间" :show-feedback="false">
<d-date-picker-pro v-model="formData.time1" :showTime="true"
placeholder="请选择日期与时间"
format="YYYY-MM-DD HH:mm:ss" />
</d-form-item>
</d-col>
<d-col style="flex: 1">
<d-form-item field="title" label="更新时间" :show-feedback="false">
<d-date-picker-pro v-model="formData.time1" :showTime="true"
placeholder="请选择日期与时间"
format="YYYY-MM-DD HH:mm:ss" />
</d-form-item>
</d-col>
</d-row>
<gc-form-operation class="jyh-form-operation">
<d-button class="mr-2" variant="solid">筛选</d-button>
<d-button variant="solid" color="secondary">清空</d-button>
</gc-form-operation>
<d-button class="output-btn" icon="icon-share" variant="text">导出</d-button>
</d-form>
</div>
<div class="mt-3">
<d-table class="jyh-table" v-if="tableData.length" :striped="false" :data="tableData" table-layout="auto">
<d-column type="index" width="40"></d-column>
<d-column field="code" header="License编码">
<a>05822156</a>
</d-column>
<d-column field="name" header="License名称"></d-column>
<d-column field="type" header="类型"></d-column>
<d-column field="risk" header="集成风险"></d-column>
<d-column field="useType" header="适用类型"></d-column>
<d-column field="status" header="状态">
<d-status>未开始</d-status>
</d-column>
<d-column field="key" header="键值"></d-column>
<d-column field="created" header="创建时间"></d-column>
<d-column field="updated" header="更新时间"></d-column>
<!-- <d-column header="操作" width="300">-->
<!-- <template #default="scope">-->
<!-- <div class="flex">-->
<!-- <div class="cursor-pointer flex items-center mr-[32px]" @click="editRow(scope.row)">-->
<!-- <GIcon class="mr-[8px]" name="gt-plane-edit" />-->
<!-- <span class="text-[#3B3E55] text-base font-normal">编辑</span>-->
<!-- </div>-->
<!-- <div class="flex items-center mr-[32px]">-->
<!-- <d-switch v-model="scope.row.status" class="mr-[8px]" @change="setClaStatus(scope.row)"-->
<!-- :active-value="1" :inactive-value="0"> </d-switch>-->
<!-- <span class="text-[#3B3E55] text-base font-normal">{{ scope.row.status === 0 ? '停用' : '启用' }}</span>-->
<!-- </div>-->
<!-- <div class="cursor-pointer flex items-center" @click="openDelete(scope.row)">-->
<!-- <GIcon class="mr-[8px]" name="gt-plane-delete" />-->
<!-- <span class="text-[#3B3E55] text-base font-normal">删除</span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </template>-->
<!-- </d-column>-->
</d-table>
<DataPanel v-else skeleton :card="false" :empty="true">
</DataPanel>
</div>
<div class="mt-20 mb-20 flex justify-end">
<d-pagination size="md" :page-size-options="[10, 20, 50]" :total="pager.total"
v-model:pageSize="pager.pageSize" v-model:pageIndex="pager.pageIndex" :max-items="5"
:can-change-page-size="true" :can-view-total="true" total-item-text="总计" @page-index-change="changeIndex()"
@page-size-change="changeSize()" />
</div>
<!-- 删除组件 -->
<GModal v-model="deletevModels" ref="deleteModal" title="删除?" @confirm="confirmDelete" showWarnIcon
confirmColor="danger">
<span class="inline-block text-G900 text-sm font-normal leading-[20px] break-all">你确认删除此项{{ item.cla_name }}
</span>
</GModal>
</div>
</template>
<script setup lang="ts">
import SettingTitle from '@/components/Setting/SettingTitle/index.vue';
import SettingText from '@/components/Setting/SettingText/index.vue';
import { ref,reactive } from 'vue';
import { getGroupClaList, setGroupClaStatus, deleteGroupCla } from '@/api/cla';
import { useRouter, useRoute } from 'vue-router';
import { GModal } from '@/components/Setting/index';
import { reqCatch } from '@/utils/catch';
import { getOrgInfo } from '@/views/Org/hooks/orgInfo';
import { Message } from 'vue-devui';
const { namespace } = getOrgInfo();
const text = `贡献者协议CLA允许外部开发者向组织的代码库提交变更请求时系统会检查用户是否已签署CLA。如果已签署 "CLA-bot"会在变更请求评论区更新签署信息;如果未签署,"CLA-bot"会引导外部贡献者查看并签署贡献者协议。`;
const tableData = ref([
{code: '05822156', name:'联通智家通通中视频公司语音.',type:'客户指定预装软件(原预装软件)',risk:'中',useType:'软件',status:'未开始',key:'',created:'2025-03-10 17:25:19',updated:'2025-03-10 17:25:19'},
{code: '05822156', name:'联通智家通通中视频公司语音.',type:'客户指定预装软件(原预装软件)',risk:'中',useType:'软件',status:'未开始',key:'',created:'2025-03-10 17:25:19',updated:'2025-03-10 17:25:19'},
{code: '05822156', name:'联通智家通通中视频公司语音.',type:'客户指定预装软件(原预装软件)',risk:'中',useType:'软件',status:'未开始',key:'',created:'2025-03-10 17:25:19',updated:'2025-03-10 17:25:19'},
{code: '05822156', name:'联通智家通通中视频公司语音.',type:'客户指定预装软件(原预装软件)',risk:'中',useType:'软件',status:'未开始',key:'',created:'2025-03-10 17:25:19',updated:'2025-03-10 17:25:19'},
{code: '05822156', name:'联通智家通通中视频公司语音.',type:'客户指定预装软件(原预装软件)',risk:'中',useType:'软件',status:'未开始',key:'',created:'2025-03-10 17:25:19',updated:'2025-03-10 17:25:19'},
{code: '05822156', name:'联通智家通通中视频公司语音.',type:'客户指定预装软件(原预装软件)',risk:'中',useType:'软件',status:'未开始',key:'',created:'2025-03-10 17:25:19',updated:'2025-03-10 17:25:19'},
{code: '05822156', name:'联通智家通通中视频公司语音.',type:'客户指定预装软件(原预装软件)',risk:'中',useType:'软件',status:'未开始',key:'',created:'2025-03-10 17:25:19',updated:'2025-03-10 17:25:19'},
{code: '05822156', name:'联通智家通通中视频公司语音.',type:'客户指定预装软件(原预装软件)',risk:'中',useType:'软件',status:'未开始',key:'',created:'2025-03-10 17:25:19',updated:'2025-03-10 17:25:19'},
{code: '05822156', name:'联通智家通通中视频公司语音.',type:'客户指定预装软件(原预装软件)',risk:'中',useType:'软件',status:'未开始',key:'',created:'2025-03-10 17:25:19',updated:'2025-03-10 17:25:19'},
{code: '05822156', name:'联通智家通通中视频公司语音.',type:'客户指定预装软件(原预装软件)',risk:'中',useType:'软件',status:'未开始',key:'',created:'2025-03-10 17:25:19',updated:'2025-03-10 17:25:19'},
]);
const formData = ref({ title: '', md_content: '',select: '',time1:null });
const typeOptions = reactive(['Options1', 'Options2', 'Options3']);
const riskOptions = reactive(['低', '中', '高']);
const useTypeOptions = reactive(['软件', '文档', '文档+软件']);
const isUseOptions = reactive(['是', '否']);
const pager = ref({
total: 10,
pageIndex: 1,
pageSize: 10
});
// 删除弹窗
const item = ref('');
const deleteModal = ref();
const deletevModels = ref(false);
const openDelete = (row: any) => {
item.value = row;
deleteModal.value.showFlag = true;
deletevModels.value = true;
};
const router = useRouter();
// 分页
const changeIndex = () => {
// getGroupClaListData();
};
const changeSize = () => {
pager.value.pageIndex = 1;
// getGroupClaListData();
};
const repoFun = (arr: any) => {
return arr ? (arr.length > 3 ? arr.slice(0, 3) : arr) : [];
};
// 编辑
const editRow = (row: any) => {
// 后续请换成params暂时params传参没传过去
router.push({
path: 'cla/edit/' + row.object_id,
query: { cla: row.cla, pageType: 'edit' }
});
};
// 确认删除
const confirmDelete = async (e: any) => {
// const res = await reqCatch(deleteGroupCla, { group_id: namespace.value, cla_id: item.value.object_id });
// if (!res.error) {
// getGroupClaListData();
// }
};
// 去成员页
const goMember = (row: any) => {
// 后续请换成params暂时params传参没传过去,注意路由有个:claID
router.push({
path: 'cla/claId/member',
query: { claId: row.object_id, claName: row.cla_name, group_path: namespace.value, pageType: 'edit' }
});
};
const getGroupClaListData = async () => {
// const params = {
// group_id: namespace.value,
// page: pager.value.pageIndex,
// per_page: pager.value.pageSize
// };
// const res = await reqCatch(getGroupClaList, params);
// if (!res.error) {
// tableData.value = res?.data?.data?.content;
// pager.value.total = res.data.data.total;
// }
};
getGroupClaListData();
const setClaStatus = async (row: any) => {
// const params = {
// group_id: namespace.value,
// cla_id: row.object_id,
// status: row.status
// };
// const res = await reqCatch(setGroupClaStatus, params);
// if (!res.error) {
// Message.success('操作成功!');
// getGroupClaListData();
// }
};
const signCla = (row: any) => {
router.push('/cla/' + row.object_id);
};
</script>
<style scoped lang="scss">
@import 'devui-theme/styles-var/devui-var.scss';
.secret-container {
position: relative;
.secret-op {
position: absolute;
right: 0;
top: 0;
}
}
.error {
color: $devui-contrast;
}
:deep(.devui-table__row td) {
padding-top: 16px;
padding-bottom: 16px;
}
:deep(.devui-tag .devui-tag--default) {
background-color: #fff;
border-radius: 12px;
padding: 4px 8px;
font-size: 12px;
line-height: 16px;
margin-right: 8px;
border: 1px solid #E3E3EE;
}
.one-line {
word-break: break-all;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.title {
font-size: 14px;
font-weight: 400;
color: #9a9b9c;
line-height: 20px;
}
.cur-title {
font-size: 14px;
font-weight: 500;
color: #2d2d2e;
line-height: 20px;
}
.search-form {
position: relative;
padding: 12px 20px 12px 0;
border-radius: 8px 0px 8px 8px;
background: #F2F5FC;
.output-btn {
position: absolute;
right: 28px;
bottom: 4px;
color: #191919;
font-family: HarmonyOS Sans SC;
font-weight: regular;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
}
}
</style>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,318 @@
<template>
<div class="model-chat-container">
<div class="chat-header">
<div class="left">
<d-icon name="icon-arrow-left" class="back-icon" @click="goBack"></d-icon>
<div class="model-info">
<span class="title">{{ currentTitle }}</span>
<span class="subtitle">智能辅助模型</span>
</div>
</div>
<div class="right">
<d-button variant="text" icon="icon-delete" @click="clearHistory">清空</d-button>
</div>
</div>
<div class="chat-content" ref="scrollRef">
<div v-if="messages.length === 0" class="empty-placeholder">
<d-icon name="icon-robot" size="48px" color="#ccc"></d-icon>
<p>我是 {{ currentTitle }} 助手请告诉我您的需求</p>
</div>
<div v-for="(msg, index) in messages" :key="index" :class="['message-row', msg.role]">
<div class="avatar">
<d-icon :name="msg.role === 'user' ? 'icon-user' : 'icon-robot'" size="24px"></d-icon>
</div>
<div class="message-bubble">
<div class="text">{{ msg.content }}</div>
<div class="time" v-if="msg.time">{{ msg.time }}</div>
</div>
</div>
<div v-if="loading" class="message-row ai">
<div class="avatar"><d-icon name="icon-robot" size="24px"></d-icon></div>
<div class="message-bubble loading">
<span>正在思考...</span>
</div>
</div>
</div>
<div class="chat-footer">
<div class="input-wrapper">
<d-textarea
v-model="inputText"
placeholder="请输入您的问题..."
:rows="2"
class="chat-input"
@keydown.enter.prevent="handleSend"
></d-textarea>
<d-button
class="send-btn"
variant="solid"
:disabled="loading || !inputText.trim()"
@click="handleSend"
>
<d-icon name="icon-publish" color="#fff"></d-icon>
</d-button>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, nextTick } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { useTimeFormat } from '@/utils/hooks/useTimeFormat'; // 假设你在这个路径有工具
const route = useRoute();
const router = useRouter();
const { formatTime } = useTimeFormat();
// 状态
const currentTitle = ref('');
const currentModelId = ref('');
const inputText = ref('');
const loading = ref(false);
const scrollRef = ref(null);
const messages = ref([]);
// 初始化
onMounted(() => {
// 从路由参数获取当前选中的功能信息
currentTitle.value = route.query.title || '智能对话';
currentModelId.value = route.query.id || 'default';
// 模拟一条欢迎语
messages.value.push({
role: 'ai',
content: `您好,欢迎使用 ${currentTitle.value} 功能,有什么可以帮您?`,
time: getCurrentTime()
});
});
// 获取当前时间
const getCurrentTime = () => {
const now = new Date();
return `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`;
};
// 返回上一页
const goBack = () => {
router.back();
};
// 清空历史
const clearHistory = () => {
messages.value = [];
};
// 滚动到底部
const scrollToBottom = async () => {
await nextTick();
if (scrollRef.value) {
scrollRef.value.scrollTop = scrollRef.value.scrollHeight;
}
};
// 发送消息
const handleSend = async () => {
const text = inputText.value.trim();
if (!text || loading.value) return;
// 1. 添加用户消息
messages.value.push({
role: 'user',
content: text,
time: getCurrentTime()
});
inputText.value = '';
scrollToBottom();
// 2. 模拟请求后端 API
loading.value = true;
try {
// TODO: 这里替换为你真实的 API 调用,传入 currentModelId.value
// const res = await fetchModelChat({ model: currentModelId.value, prompt: text });
// 模拟延迟响应
setTimeout(() => {
messages.value.push({
role: 'ai',
content: `这是针对“${currentTitle.value}”功能的模拟回复:您发送了“${text}”。`,
time: getCurrentTime()
});
loading.value = false;
scrollToBottom();
}, 1000);
} catch (error) {
messages.value.push({
role: 'ai',
content: '服务暂时不可用,请稍后再试。',
time: getCurrentTime()
});
loading.value = false;
scrollToBottom();
}
};
</script>
<style scoped lang="scss">
.model-chat-container {
display: flex;
flex-direction: column;
height: 100vh; /* 或者 100% 视父容器而定 */
background-color: #f5f7fa;
.chat-header {
height: 60px;
background: #fff;
border-bottom: 1px solid #eee;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
.left {
display: flex;
align-items: center;
gap: 12px;
.back-icon {
cursor: pointer;
padding: 4px;
&:hover { background: #f0f0f0; border-radius: 4px; }
}
.model-info {
display: flex;
flex-direction: column;
.title { font-weight: bold; font-size: 16px; color: #333; }
.subtitle { font-size: 12px; color: #999; }
}
}
}
.chat-content {
flex: 1;
overflow-y: auto;
padding: 20px;
display: flex;
flex-direction: column;
gap: 20px;
.empty-placeholder {
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #999;
gap: 10px;
}
.message-row {
display: flex;
gap: 12px;
max-width: 80%;
.avatar {
width: 40px;
height: 40px;
border-radius: 50%;
background: #e0e0e0;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.message-bubble {
padding: 12px 16px;
border-radius: 8px;
position: relative;
font-size: 14px;
line-height: 1.5;
.time {
font-size: 10px;
color: rgba(0,0,0,0.4);
margin-top: 4px;
text-align: right;
}
}
/* AI 样式 */
&.ai {
align-self: flex-start;
.avatar { background: #e6f7ff; color: #1890ff; }
.message-bubble {
background: #fff;
border: 1px solid #e8e8e8;
color: #333;
border-top-left-radius: 0;
}
}
/* 用户样式 */
&.user {
align-self: flex-end;
flex-direction: row-reverse;
.avatar { background: #fff0f6; color: #eb2f96; }
.message-bubble {
background: #1890ff;
color: #fff;
border-top-right-radius: 0;
.time { color: rgba(255,255,255,0.7); }
}
}
}
}
.chat-footer {
background: #fff;
padding: 15px 20px;
border-top: 1px solid #eee;
.input-wrapper {
position: relative;
display: flex;
align-items: flex-end;
gap: 10px;
border: 1px solid #d9d9d9;
border-radius: 8px;
padding: 8px;
background: #fff;
transition: border-color 0.3s;
&:focus-within {
border-color: #1890ff;
}
.chat-input {
flex: 1;
border: none;
box-shadow: none;
padding: 4px;
/* 去除 DevUI textarea 默认样式 */
::v-deep .devui-textarea {
border: none;
box-shadow: none;
}
}
.send-btn {
width: 36px;
height: 36px;
padding: 0;
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
}
}
}
}
</style>

View File

@@ -0,0 +1,48 @@
<template>
<div class="mod-banner">
<div class="txt xyCenter"><p class="zh Jdh">安全事件中心</p>
<p class="en Jdh">Security Events Center</p></div>
</div>
</template>
<script>
</script>
<style lang="scss" scoped>
.pg-news .mod-banner {
background: url(@/assets/v3/banner.C3KTEfES.png) no-repeat 50%;
background-size: 100% 100%;
height: 400px;
position: relative
}
.pg-news .mod-banner .txt {
left: 50%;
position: absolute;
text-align: center;
top: 50%
}
.pg-news .mod-banner .txt .zh {
color: #fff;
font-size: 40px;
font-style: normal;
font-weight: 400;
letter-spacing: 2px;
letter-spacing: 1px;
line-height: 56px
}
.pg-news .mod-banner .txt .en {
color: #fff;
font-size: 14px;
font-weight: 400;
letter-spacing: 9px;
line-height: 20px
}
.xyCenter {
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
</style>

View File

@@ -0,0 +1,336 @@
<template>
<div class="pg-news">
<div class="mod-news Jdh">
<div
class="news-item"
v-for="(item, index) in newsList"
:key="index"
>
<img
:src="item.thumb"
:alt="item.title"
class="thumb"
>
<div class="thumb-r">
<h3 class="MultiLine EASE">
<a
:href="item.link"
rel="nofollow"
class="EASE"
target="_blank"
>
{{ item.title }}
</a>
</h3>
<div class="desc MultiLine">{{ item.desc }}</div>
<div class="meta">
<i class="ICO"></i>
<span class="time">发布时间{{ item.time }}</span>
</div>
</div>
</div>
</div>
<d-pagination
v-model:current-page="currentPage"
:total="total"
:page-size="pageSize"
:show-page-sizes="false"
:show-jumper="false"
:show-total="false"
class="comPaging"
@page-change="handlePageChange"
>
<template #prev-text>&lt;</template>
<template #next-text>&gt;</template>
<template #total="{ total, pageCount }">
<span class="total"> {{ pageCount }} </span>
</template>
</d-pagination>
</div>
</template>
<script setup>
import { ref } from 'vue';
import newsPic from '@/assets/v3/newspic1.png';
const newsList = ref([
{
thumb: newsPic, // 使用引入的图片变量
title: 'Log4j2 漏洞变种再现!开源组件供应链安全风险升级',
link: 'https://mp.weixin.qq.com/s/xxxxxx',
desc: '2025年12月安全研究人员发现Log4j2漏洞新型变种CVE-2025-XXXX该变种绕过了传统防护规则影响超过10万个开源项目。开源安全联盟已发布紧急修复指南建议企业立即对开源组件进行全量扫描。',
time: '2025/12/03'
},
{
thumb: newsPic, // 所有项都用这个变量
title: 'OSV漏洞数据库新增10万+开源组件漏洞数据覆盖9大主流语言',
link: 'https://mp.weixin.qq.com/s/xxxxxx',
desc: '近日开源漏洞数据库OSV完成年度最大规模数据更新新增10万+条开源组件漏洞记录覆盖Java、Python、Go、C++等9大主流开发语言。本次更新首次纳入鸿蒙生态开源组件漏洞数据进一步完善国产化开源安全体系。',
time: '2025/12/03'
},
// 剩余8项的 thumb 全部替换为 newsPic
{
thumb: newsPic,
title: '开源供应链安全平台上线!一键检测项目依赖漏洞与恶意包',
link: 'https://mp.weixin.qq.com/s/xxxxxx',
desc: '在2025开源安全峰会上国内首款开源供应链安全检测平台正式发布。该平台可自动化扫描项目依赖树识别恶意开源包、漏洞组件及许可证合规风险目前已接入Maven、NPM、PyPI等12大主流开源仓库。',
time: '2025/11/25'
},
{
thumb: newsPic,
title: 'PyPI仓库再现恶意包攻击伪装成热门AI库窃取开发者数据',
link: 'https://mp.weixin.qq.com/s/xxxxxx',
desc: '2025年11月安全团队监测到PyPI开源仓库中出现一批仿冒热门AI框架的恶意包累计下载量超5万次。该恶意包会在安装时窃取开发者本地配置文件及代码仓库密钥开源安全应急响应中心已紧急下架相关包并发布预警。',
time: '2025/11/19'
},
{
thumb: newsPic,
title: '开源安全奖励计划升级最高悬赏50万元征集核心组件漏洞',
link: 'https://mp.weixin.qq.com/s/xxxxxx',
desc: '2025年11月开源安全奖励计划OSRP完成规则升级将漏洞悬赏范围扩展至国产化开源组件最高单笔悬赏金额提升至50万元。本次升级重点覆盖政务、金融领域常用开源中间件鼓励白帽黑客参与开源生态安全建设。',
time: '2025/11/14'
},
{
thumb: newsPic,
title: '进博会首发开源安全治理AI平台实现漏洞秒级检测',
link: 'https://mp.weixin.qq.com/s/xxxxxx',
desc: '11月5日至10日第八届进博会期间开源安全领域首款AI治理平台正式发布。该平台基于大模型技术可实时分析开源代码仓库变动秒级识别漏洞、后门及合规风险已在多家央企完成试点落地。',
time: '2025/11/10'
},
{
thumb: newsPic,
title: '开源安全白皮书2025发布90%企业存在开源组件合规风险',
link: 'https://mp.weixin.qq.com/s/xxxxxx',
desc: '2025年11月《中国开源安全发展白皮书》正式发布。报告显示国内90%以上企业在使用开源组件时存在许可证合规风险其中35%的企业曾因开源漏洞导致业务中断。白皮书同时提出了开源安全治理的“三全”标准:全生命周期、全场景、全链路。',
time: '2025/11/03'
},
{
thumb: newsPic,
title: '开源安全企业入选专精特新“小巨人”AI检测技术成核心优势',
link: 'https://mp.weixin.qq.com/s/xxxxxx',
desc: '近日北京市第七批专精特新“小巨人”企业名单公示某开源安全企业凭借AI驱动的开源组件漏洞检测技术成功入选。该企业自研的开源安全扫描引擎误报率低于0.5%检测速度较行业平均水平提升3倍。',
time: '2025/10/27'
},
{
thumb: newsPic,
title: '国资国企开源安全联盟成立,共建国产化开源安全体系',
link: 'https://mp.weixin.qq.com/s/xxxxxx',
desc: '10月15日国资国企开源安全联盟在北京正式成立联盟成员涵盖30余家央企及开源安全企业。联盟将重点推进国产化开源组件的漏洞治理、合规审计及供应链安全建设首批落地10个开源安全共性技术攻关项目。',
time: '2025/10/21'
},
{
thumb: newsPic,
title: '“创客中国”开源安全赛道收官AI渗透检测项目获一等奖',
link: 'https://mp.weixin.qq.com/s/xxxxxx',
desc: '近日第十届“创客中国”创新创业大赛开源安全赛道决赛落幕基于大模型的开源组件AI渗透检测项目斩获一等奖。该项目可自动化模拟黑客攻击发现开源组件隐藏漏洞目前已申请发明专利12项。',
time: '2025/10/16'
}
]);
const currentPage = ref(1); // 当前页
const pageSize = ref(10); // 每页条数原有每页10条
const total = ref(70); // 总条数7页×10条
// 分页切换事件
const handlePageChange = (page) => {
console.log('切换到第', page, '页');
// 此处可对接接口获取对应页数据
// 示例fetchNewsList(page);
};
</script>
<style lang="scss" scoped>
.pg-news {
.mod-news {
background-color: #fafafa;
margin: 0 auto;
max-width: 1259px;
padding: 40px 0 0;
.news-item {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
color: #333;
cursor: pointer;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
padding: 35px 0;
text-align: justify;
&:not(:last-child) {
border-bottom: 1px solid #d8d8d8;
}
&:hover h3 a {
color: #4bad52;
}
.thumb {
display: block;
height: 191px;
-o-object-fit: cover;
object-fit: cover;
width: 340px;
-ms-flex-negative: 0;
border-radius: 8px;
flex-shrink: 0;
}
.thumb-r {
padding: 0 0 0 57px;
}
h3 {
color: #333;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 30px;
margin: 0 0 10px;
max-height: 60px;
text-align: justify;
}
.desc {
font-weight: 400;
letter-spacing: .5px;
margin: 0 0 14px;
}
.meta {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
color: #b0afaf;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
text-align: justify;
.ICO {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAQAAABLCVATAAAAAXNSR0IArs4c6QAAAddJREFUeNqtljtLw1AUxy/0C9jxnmh0EcGlLrp0EXEV6SKCzSg4+NhEcVInt+Kio+0qCk6CYIJDEVwUxEpx6CbioNAIohH/YohtHicvzDlDk9vbX+8597yECBE1L8uyKg1qkkkmNaUhq7Ks5kUakSXSySIwapEuS4kgVKQ6i3BrnYrRlJxSiYU4qlRELoQy0ENnSTG2ng308JhGKsyvNoKoXMrTdE7lMzC5bxhfeW4K/9DuDSa48Mhg6IZfip+NYhdbvjUnRElPCpnBKb4ALPq/0e2cCkkGjw5hAw/4k4lA4qh5IbU4yDgO8IaufEIN7JGaUGrhCBXzqHcAFt7tzzsuCGpCGjykgB08us7xhkvn6ZDZLQ1BzeDyFI7xCbc8Yx/fzvMm98dNQaZ3aQm38EsLK/jovM1yIFNQ27s0gWsf5gbTeHG9FzhQmzGtD9uOW39FxxhaHiOJN413dtFx7SEGceU53wULkoaQ1ZCsxjoq6MWJz9A9HlSNCUgt4PhlHlSOTZE5PHlAk2xvsdtUXNIOu8yz0M/t0ROXkQW82qB73rBSisI2gnMAR1GFLXmpXcVadKnNrPhn2I6ya5DZtewMh4gsx5osBy3X6KcpNffop9SkFj76/QC1at54IoZE9wAAAABJRU5ErkJggg==);
display: block;
height: 18px;
margin: 0 10px 0 0;
width: 18px;
}
}
}
}
// DevUI分页组件样式覆盖保持原有样式
.comPaging {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
padding: 36px 0 79px;
-webkit-box-pack: center;
-ms-flex-pack: center;
color: #333;
font-size: 14px;
font-style: normal;
font-weight: 400;
justify-content: center;
line-height: 24px;
text-align: justify;
// 覆盖DevUI默认样式
:deep(.devui-pagination) {
display: flex;
align-items: center;
.devui-pagination-item {
margin: 0 3px;
transition: all .4s ease-out;
height: 32px;
line-height: 32px;
min-width: 32px;
padding: 0 12px;
text-align: center;
border: none;
border-radius: 0;
&.devui-pagination-item-active {
background: #333;
border-radius: 50%;
color: #fff;
&:hover {
color: #fff;
}
}
&:hover {
color: #4bad52;
}
&.devui-pagination-prev,
&.devui-pagination-next {
font-size: 16px;
}
&[disabled] {
color: #cecece;
cursor: not-allowed;
}
}
.devui-pagination-ellipsis {
margin: 0 3px;
}
.total {
margin-left: 8px;
}
}
}
}
// 响应式样式保留
@media (max-width: 1023px) {
.pg-news .comPaging {
-ms-flex-wrap: wrap;
flex-wrap: wrap;
font-size: 12px;
gap: 8px;
padding: 20px 0 40px;
&>* {
margin: 0;
}
:deep(.devui-pagination-item) {
font-size: 12px;
height: 28px;
line-height: 28px;
min-width: 28px;
padding: 0 8px;
&.devui-pagination-prev,
&.devui-pagination-next {
font-size: 14px;
min-width: 32px;
}
}
:deep(.total) {
font-size: 12px;
text-align: center;
}
}
}
</style>

View File

@@ -0,0 +1,16 @@
<template>
<div class="pg-news">
<ModBanner />
<ModNews />
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import ModBanner from './ModBanner.vue'
import ModNews from './ModNews.vue'
</script>
<style lang="scss" scoped>
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,530 @@
<template>
<div class="checkout-page">
<div class="summary-panel">
<div class="summary-content">
<div class="back-button-placeholder">
<button class="back-btn" @click="goBack">
<svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<polyline points="15 18 9 12 15 6"></polyline>
</svg>
</button>
</div>
<h1 class="panel-title">试用 金银湖大模型 Pro</h1>
<div class="trial-info">
<span class="trial-days">7 天免费</span>
<p class="trial-note">随后 US$20.00/ ( 2025年12月17日开始)</p>
</div>
<div class="plan-card">
<div class="card-details">
<div class="card-header">
<span class="card-title">金银湖大模型 Pro</span>
<span class="card-tag">7 天免费</span>
</div>
<div class="card-features">
金银湖大模型 Pro unlocks unlimited tab completion, extended agent limits, and access to most features.
</div>
<div class="card-price">US$20.00 / 月度</div>
</div>
</div>
<div class="toggle-row">
<span class="toggle-label">采用年费计划</span>
<div class="toggle-switch">
<input type="checkbox" id="annual" v-model="isAnnual">
<label for="annual"></label>
</div>
<span class="toggle-discount">节省 US$4.00</span>
</div>
<div class="spacer"></div>
<div class="price-detail">
<div class="detail-row">
<span>小计</span>
<span>US$20.00</span>
</div>
<div class="detail-row">
<span> <i class="icon-info"></i></span>
<span>US$0.00</span>
</div>
<div class="detail-row total-row">
<span>试用后总额</span>
<span>US$20.00</span>
</div>
<div class="detail-row today-total">
<span>今日合计</span>
<span>US$0.00</span>
</div>
</div>
</div>
</div>
<div class="form-panel">
<h2 class="form-title">输入付款详情</h2>
<div class="form-group email-group">
<label>邮箱</label>
<d-input
size="lg"
placeholder="fukang10032@gmail.com"
v-model="formData.email"
class="email-input-custom"
></d-input>
</div>
<div class="form-group payment-group">
<label>支付方式</label>
<div class="payment-option">
<d-radio name="payment" value="card" v-model="formData.paymentMethod">
<img class="wechart-icon" src="@/assets/v3/card-ce24697297bd3c6a00fdd2fb6f760f0d.svg">
<span class="radio-label">银行卡</span>
</d-radio>
<!-- <div v-if="formData.paymentMethod === 'card'" class="card-input-placeholder">-->
<!-- [Card Element Input Placeholder]-->
<!-- </div>-->
</div>
<div class="payment-option">
<d-radio name="payment" value="wechat" v-model="formData.paymentMethod">
<img class="wechart-icon" src="@/assets/v3/NTI4MWU5.ico">
<span class="radio-label">微信支付</span>
</d-radio>
</div>
<div class="payment-option">
<d-radio name="payment" value="alipay" v-model="formData.paymentMethod">
<img class="alipay-icon" src="@/assets/v3/alipay-22c167d415e209c71b2ac68b7fbc9f43.svg">
<span class="radio-label">支付宝</span>
</d-radio>
</div>
</div>
<div class="save-info-text">
保存您的信息以便更快地在 金银湖大模型 和支持 Stripe 的地方安全地支付
</div>
<d-button class="start-trial-btn" @click="startTrial">开始试用</d-button>
<p class="terms-text">
订阅即表示您同意 金银湖大模型 服务条款并且理解您的订阅将自动续订直到您在 Stripe 客户门户上取消
</p>
<div class="powered-by">
Powered by <span class="stripe-link">stripe</span> | 条款 | 隐私
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
import {useRouter} from "vue-router";
const router = useRouter();
const formData = ref({
email: 'fukang10032@gmail.com',
paymentMethod: 'card', // 默认选中银行卡
});
const isAnnual = ref(false); // 控制年费月费切换
const startTrial = () => {
alert('开始试用按钮被点击!');
};
const goBack = () => {
router.go(-1);
};
</script>
<style lang="scss" scoped>
.checkout-page {
display: flex;
min-height: 100vh;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
box-sizing: border-box;
}
.summary-panel {
flex: 1.1;
background-color: #000;
color: #fff;
padding: 0 40px;
display: flex;
justify-content: flex-end;
}
.summary-content {
width: 100%;
max-width: 600px;
padding: 60px 0;
}
.form-panel {
flex: 1;
background-color: #fff;
color: #333;
padding: 60px 40px;
}
/* ------------------- 左侧摘要样式 ------------------- */
/* 优化点 3: 返回按钮样式 */
.back-button-placeholder {
margin-bottom: 50px;
}
.back-btn {
background: none;
border: none;
cursor: pointer;
padding: 0;
color: #fff;
opacity: 0.7;
transition: opacity 0.2s;
}
.back-btn:hover {
opacity: 1;
}
.panel-title {
font-size: 28px;
font-weight: 600;
margin-bottom: 5px;
}
.trial-info {
margin-bottom: 50px;
}
.trial-days {
font-size: 44px;
font-weight: 700;
display: block;
}
.trial-note {
font-size: 14px;
color: #777;
margin-top: 5px;
}
/* 计划卡片 */
.plan-card {
background-color: #1e1e1e;
border-radius: 8px;
padding: 16px;
display: flex;
position: relative;
margin-bottom: 30px;
border: 1px solid #333;
}
.card-details {
flex-grow: 1;
padding: 4px 0;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 4px;
}
.card-title {
font-weight: 600;
font-size: 16px;
color: #fff;
}
.card-features {
font-size: 12px;
color: #888;
line-height: 1.5;
margin-bottom: 8px;
}
.card-price {
font-size: 12px;
color: #aaa;
font-weight: 500;
}
.card-tag {
background-color: transparent;
color: #4CAF50;
font-size: 11px;
font-weight: 500;
padding: 2px 0;
}
/* 年月切换 */
.toggle-row {
display: flex;
align-items: center;
margin-bottom: 30px;
background-color: #111;
border-radius: 4px;
padding: 8px 12px;
justify-content: space-between;
}
.toggle-label {
font-size: 14px;
color: #ccc;
font-weight: 500;
}
.toggle-discount {
font-size: 12px;
color: #4CAF50;
font-weight: 500;
}
/* 简化开关样式 (Toggle Switch) */
.toggle-switch {
margin: 0 15px;
flex-grow: 1;
display: flex;
justify-content: flex-end;
}
.toggle-switch input[type="checkbox"] {
display: none;
}
.toggle-switch label {
cursor: pointer;
width: 40px;
height: 20px;
background-color: #444;
border-radius: 10px;
position: relative;
display: block;
transition: background-color 0.3s;
}
.toggle-switch label:after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 16px;
height: 16px;
background-color: #ccc;
border-radius: 50%;
transition: 0.3s;
}
.toggle-switch input:checked + label {
background-color: #58a6ff;
}
.toggle-switch input:checked + label:after {
left: calc(100% - 18px);
background-color: white;
}
.spacer {
border-top: 1px solid #333;
margin: 20px 0;
}
/* 价格明细 */
.price-detail {
font-size: 14px;
}
.detail-row {
display: flex;
justify-content: space-between;
margin-bottom: 15px;
color: #aaa;
}
.detail-row span:last-child {
font-weight: 500;
color: #fff;
}
.detail-row.total-row {
border-top: 1px solid #333;
padding-top: 20px;
margin-top: 15px;
color: #fff;
}
.detail-row.today-total {
font-size: 16px;
font-weight: 700;
color: #4CAF50;
}
.detail-row.today-total span:last-child {
color: #4CAF50;
}
/* ------------------- 右侧表单样式 ------------------- */
.form-title {
font-size: 28px;
font-weight: 600;
margin-bottom: 40px;
color: #333;
}
.form-group {
margin-bottom: 30px;
}
.form-group label {
display: block;
font-size: 14px;
font-weight: 500;
color: #333;
margin-bottom: 8px;
}
/* 优化点 1: 邮箱输入框美化 (参考 image_15239f.png) */
.email-input-custom :deep(.devui-input-wrapper) {
border: 1px solid #ddd;
border-radius: 4px; /* 略微减少圆角,更符合 image_15239f.png */
transition: border-color 0.2s, box-shadow 0.2s;
}
.email-input-custom :deep(.devui-input-wrapper.focus) {
border-color: #58a6ff;
box-shadow: 0 0 0 1px #58a6ff; /* 增加细微的聚焦阴影 */
}
.email-input-custom :deep(.devui-input) {
padding: 10px 12px;
font-size: 14px;
height: auto;
}
/* 支付方式 */
.payment-group {
margin-bottom: 40px;
}
.payment-group label {
margin-bottom: 12px;
}
/* 支付选项容器 */
.payment-option {
margin-bottom: 15px;
border: 1px solid #ddd;
border-radius: 6px;
padding: 10px 15px;
/* 确保 Radio 按钮在未选中的 payment-option 中也能看到 */
}
.payment-option:hover {
border-color: #ccc;
}
/* DevUI Radio 样式定制 */
.payment-option :deep(.devui-radio-list) {
display: block;
}
.payment-option :deep(.devui-radio) {
display: flex;
justify-content: space-between;
align-items: center;
}
.payment-option :deep(.devui-radio-input) {
width: 16px;
height: 16px;
border: 1px solid #999;
}
.payment-option :deep(.devui-radio-input.checked) {
background-color: #000;
border-color: #000;
}
.payment-option :deep(.devui-radio-label) {
flex-grow: 1;
font-size: 14px;
font-weight: 500;
padding-left: 10px;
}
/* 银行卡图标组 */
.card-icons {
display: flex;
gap: 4px;
align-items: center;
}
/* 银行卡具体颜色 */
.visa-icon { background-color: #1a1f71; content: "V"; }
.master-icon { background-color: #ff5f00; content: "M"; }
.amex-icon { background-color: #007bc1; content: "A"; }
.card-input-placeholder {
height: 44px;
background-color: #f7f7f7;
border: 1px solid #eee;
border-radius: 4px;
margin: 15px 0 0 0;
display: flex;
align-items: center;
padding-left: 15px;
font-size: 14px;
color: #999;
}
/* 底部文本和按钮 */
.save-info-text {
font-size: 12px;
color: #666;
margin-bottom: 25px;
}
.start-trial-btn {
width: 100%;
height: 48px;
background-color: #000 !important;
color: #fff !important;
border-radius: 6px;
font-size: 16px;
font-weight: 600;
margin-bottom: 20px;
border: none !important;
}
.terms-text {
font-size: 10px;
color: #888;
text-align: center;
line-height: 1.4;
max-width: 400px;
margin: 0 auto 15px;
}
.powered-by {
font-size: 10px;
color: #aaa;
text-align: center;
}
.stripe-link {
font-weight: bold;
color: #666;
}
::v-deep(.devui-radio__label) {
display: flex;
align-items: center;
margin-left: 16px;
img {
height: 16px;
text-align: center;
width: 24px;
margin-inline-end:8px;
border-radius: 2px;
max-width: 24px;
}
.wechart-icon {
width: 16px;
margin-right: 12px;
}
}
</style>

View File

@@ -0,0 +1,530 @@
<template>
<div class="checkout-page">
<div class="summary-panel">
<div class="summary-content">
<div class="back-button-placeholder">
<button class="back-btn" @click="goBack">
<svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<polyline points="15 18 9 12 15 6"></polyline>
</svg>
</button>
</div>
<h1 class="panel-title">订阅 金银湖大模型 Pro</h1>
<div class="trial-info">
<span class="trial-days">US$60.00</span>
<p class="trial-note">每个月</p>
</div>
<div class="plan-card">
<div class="card-details">
<div class="card-header">
<span class="card-title">金银湖大模型 Pro</span>
<span class="card-tag">7 天免费</span>
</div>
<div class="card-features">
金银湖大模型 Pro unlocks unlimited tab completion, extended agent limits, and access to most features.
</div>
<div class="card-price">US$20.00 / 月度</div>
</div>
</div>
<div class="toggle-row">
<span class="toggle-label">采用年费计划</span>
<div class="toggle-switch">
<input type="checkbox" id="annual" v-model="isAnnual">
<label for="annual"></label>
</div>
<span class="toggle-discount">节省 US$4.00</span>
</div>
<div class="spacer"></div>
<div class="price-detail">
<div class="detail-row">
<span>小计</span>
<span>US$20.00</span>
</div>
<div class="detail-row">
<span> <i class="icon-info"></i></span>
<span>US$0.00</span>
</div>
<div class="detail-row total-row">
<span>试用后总额</span>
<span>US$20.00</span>
</div>
<div class="detail-row today-total">
<span>今日合计</span>
<span>US$0.00</span>
</div>
</div>
</div>
</div>
<div class="form-panel">
<h2 class="form-title">输入付款详情</h2>
<div class="form-group email-group">
<label>邮箱</label>
<d-input
size="lg"
placeholder="fukang10032@gmail.com"
v-model="formData.email"
class="email-input-custom"
></d-input>
</div>
<div class="form-group payment-group">
<label>支付方式</label>
<div class="payment-option">
<d-radio name="payment" value="card" v-model="formData.paymentMethod">
<img class="wechart-icon" src="@/assets/v3/card-ce24697297bd3c6a00fdd2fb6f760f0d.svg">
<span class="radio-label">银行卡</span>
</d-radio>
<!-- <div v-if="formData.paymentMethod === 'card'" class="card-input-placeholder">-->
<!-- [Card Element Input Placeholder]-->
<!-- </div>-->
</div>
<div class="payment-option">
<d-radio name="payment" value="wechat" v-model="formData.paymentMethod">
<img class="wechart-icon" src="@/assets/v3/NTI4MWU5.ico">
<span class="radio-label">微信支付</span>
</d-radio>
</div>
<div class="payment-option">
<d-radio name="payment" value="alipay" v-model="formData.paymentMethod">
<img class="alipay-icon" src="@/assets/v3/alipay-22c167d415e209c71b2ac68b7fbc9f43.svg">
<span class="radio-label">支付宝</span>
</d-radio>
</div>
</div>
<div class="save-info-text">
保存您的信息以便更快地在 金银湖大模型 和支持 Stripe 的地方安全地支付
</div>
<d-button class="start-trial-btn" @click="startTrial">订阅</d-button>
<p class="terms-text">
订阅即表示您同意 金银湖大模型 服务条款并且理解您的订阅将自动续订直到您在 Stripe 客户门户上取消
</p>
<div class="powered-by">
Powered by <span class="stripe-link">stripe</span> | 条款 | 隐私
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
import {useRouter} from "vue-router";
const router = useRouter();
const formData = ref({
email: 'fukang10032@gmail.com',
paymentMethod: 'card', // 默认选中银行卡
});
const isAnnual = ref(false); // 控制年费月费切换
const startTrial = () => {
alert('订阅按钮被点击!');
};
const goBack = () => {
router.go(-1);
};
</script>
<style lang="scss" scoped>
.checkout-page {
display: flex;
min-height: 100vh;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
box-sizing: border-box;
}
.summary-panel {
flex: 1.1;
background-color: #000;
color: #fff;
padding: 0 40px;
display: flex;
justify-content: flex-end;
}
.summary-content {
width: 100%;
max-width: 600px;
padding: 60px 0;
}
.form-panel {
flex: 1;
background-color: #fff;
color: #333;
padding: 60px 40px;
}
/* ------------------- 左侧摘要样式 ------------------- */
/* 优化点 3: 返回按钮样式 */
.back-button-placeholder {
margin-bottom: 50px;
}
.back-btn {
background: none;
border: none;
cursor: pointer;
padding: 0;
color: #fff;
opacity: 0.7;
transition: opacity 0.2s;
}
.back-btn:hover {
opacity: 1;
}
.panel-title {
font-size: 28px;
font-weight: 600;
margin-bottom: 5px;
}
.trial-info {
margin-bottom: 50px;
}
.trial-days {
font-size: 44px;
font-weight: 700;
display: block;
}
.trial-note {
font-size: 14px;
color: #777;
margin-top: 5px;
}
/* 计划卡片 */
.plan-card {
background-color: #1e1e1e;
border-radius: 8px;
padding: 16px;
display: flex;
position: relative;
margin-bottom: 30px;
border: 1px solid #333;
}
.card-details {
flex-grow: 1;
padding: 4px 0;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 4px;
}
.card-title {
font-weight: 600;
font-size: 16px;
color: #fff;
}
.card-features {
font-size: 12px;
color: #888;
line-height: 1.5;
margin-bottom: 8px;
}
.card-price {
font-size: 12px;
color: #aaa;
font-weight: 500;
}
.card-tag {
background-color: transparent;
color: #4CAF50;
font-size: 11px;
font-weight: 500;
padding: 2px 0;
}
/* 年月切换 */
.toggle-row {
display: flex;
align-items: center;
margin-bottom: 30px;
background-color: #111;
border-radius: 4px;
padding: 8px 12px;
justify-content: space-between;
}
.toggle-label {
font-size: 14px;
color: #ccc;
font-weight: 500;
}
.toggle-discount {
font-size: 12px;
color: #4CAF50;
font-weight: 500;
}
/* 简化开关样式 (Toggle Switch) */
.toggle-switch {
margin: 0 15px;
flex-grow: 1;
display: flex;
justify-content: flex-end;
}
.toggle-switch input[type="checkbox"] {
display: none;
}
.toggle-switch label {
cursor: pointer;
width: 40px;
height: 20px;
background-color: #444;
border-radius: 10px;
position: relative;
display: block;
transition: background-color 0.3s;
}
.toggle-switch label:after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 16px;
height: 16px;
background-color: #ccc;
border-radius: 50%;
transition: 0.3s;
}
.toggle-switch input:checked + label {
background-color: #58a6ff;
}
.toggle-switch input:checked + label:after {
left: calc(100% - 18px);
background-color: white;
}
.spacer {
border-top: 1px solid #333;
margin: 20px 0;
}
/* 价格明细 */
.price-detail {
font-size: 14px;
}
.detail-row {
display: flex;
justify-content: space-between;
margin-bottom: 15px;
color: #aaa;
}
.detail-row span:last-child {
font-weight: 500;
color: #fff;
}
.detail-row.total-row {
border-top: 1px solid #333;
padding-top: 20px;
margin-top: 15px;
color: #fff;
}
.detail-row.today-total {
font-size: 16px;
font-weight: 700;
color: #4CAF50;
}
.detail-row.today-total span:last-child {
color: #4CAF50;
}
/* ------------------- 右侧表单样式 ------------------- */
.form-title {
font-size: 28px;
font-weight: 600;
margin-bottom: 40px;
color: #333;
}
.form-group {
margin-bottom: 30px;
}
.form-group label {
display: block;
font-size: 14px;
font-weight: 500;
color: #333;
margin-bottom: 8px;
}
/* 优化点 1: 邮箱输入框美化 (参考 image_15239f.png) */
.email-input-custom :deep(.devui-input-wrapper) {
border: 1px solid #ddd;
border-radius: 4px; /* 略微减少圆角,更符合 image_15239f.png */
transition: border-color 0.2s, box-shadow 0.2s;
}
.email-input-custom :deep(.devui-input-wrapper.focus) {
border-color: #58a6ff;
box-shadow: 0 0 0 1px #58a6ff; /* 增加细微的聚焦阴影 */
}
.email-input-custom :deep(.devui-input) {
padding: 10px 12px;
font-size: 14px;
height: auto;
}
/* 支付方式 */
.payment-group {
margin-bottom: 40px;
}
.payment-group label {
margin-bottom: 12px;
}
/* 支付选项容器 */
.payment-option {
margin-bottom: 15px;
border: 1px solid #ddd;
border-radius: 6px;
padding: 10px 15px;
/* 确保 Radio 按钮在未选中的 payment-option 中也能看到 */
}
.payment-option:hover {
border-color: #ccc;
}
/* DevUI Radio 样式定制 */
.payment-option :deep(.devui-radio-list) {
display: block;
}
.payment-option :deep(.devui-radio) {
display: flex;
justify-content: space-between;
align-items: center;
}
.payment-option :deep(.devui-radio-input) {
width: 16px;
height: 16px;
border: 1px solid #999;
}
.payment-option :deep(.devui-radio-input.checked) {
background-color: #000;
border-color: #000;
}
.payment-option :deep(.devui-radio-label) {
flex-grow: 1;
font-size: 14px;
font-weight: 500;
padding-left: 10px;
}
/* 银行卡图标组 */
.card-icons {
display: flex;
gap: 4px;
align-items: center;
}
/* 银行卡具体颜色 */
.visa-icon { background-color: #1a1f71; content: "V"; }
.master-icon { background-color: #ff5f00; content: "M"; }
.amex-icon { background-color: #007bc1; content: "A"; }
.card-input-placeholder {
height: 44px;
background-color: #f7f7f7;
border: 1px solid #eee;
border-radius: 4px;
margin: 15px 0 0 0;
display: flex;
align-items: center;
padding-left: 15px;
font-size: 14px;
color: #999;
}
/* 底部文本和按钮 */
.save-info-text {
font-size: 12px;
color: #666;
margin-bottom: 25px;
}
.start-trial-btn {
width: 100%;
height: 48px;
background-color: #000 !important;
color: #fff !important;
border-radius: 6px;
font-size: 16px;
font-weight: 600;
margin-bottom: 20px;
border: none !important;
}
.terms-text {
font-size: 10px;
color: #888;
text-align: center;
line-height: 1.4;
max-width: 400px;
margin: 0 auto 15px;
}
.powered-by {
font-size: 10px;
color: #aaa;
text-align: center;
}
.stripe-link {
font-weight: bold;
color: #666;
}
::v-deep(.devui-radio__label) {
display: flex;
align-items: center;
margin-left: 16px;
img {
height: 16px;
text-align: center;
width: 24px;
margin-inline-end:8px;
border-radius: 2px;
max-width: 24px;
}
.wechart-icon {
width: 16px;
margin-right: 12px;
}
}
</style>

View File

@@ -0,0 +1,340 @@
<template>
<div class="comparison-table-container">
<h2 class="main-title">比较不同套餐的功能</h2>
<div class="table-scroll-wrapper">
<table class="features-table">
<thead>
<tr>
<th class="feature-col-header"></th> <th v-for="plan in plans" :key="plan.name" class="plan-col-header">
<div class="header-content">
<span class="plan-name">{{ plan.name }}</span>
<a href="#" class="get-plan-btn">
{{ plan.btnText }}
<span class="arrow"></span>
</a>
</div>
</th>
</tr>
</thead>
<tbody>
<template v-for="(section, sIndex) in comparisonData" :key="sIndex">
<tr
class="category-row"
v-if="section.category"
>
<td colspan="6" class="category-title">{{ section.category }}</td>
</tr>
<tr v-for="(row, rIndex) in section.featureRows" :key="rIndex" class="data-row">
<td class="feature-name">{{ row.name }}</td>
<td v-for="(value, vIndex) in row.values" :key="vIndex" class="feature-value">
<span v-if="value === 'check'" class="check-icon"></span>
<span v-else-if="value === 'dash'" class="dash-icon"></span>
<span v-else class="value-text">{{ value }}</span>
</td>
</tr>
</template>
<tr class="category-row">
<td colspan="6" class="category-title">安全与行政管理</td>
</tr>
<tr v-for="(row, rIndex) in adminFeatures" :key="rIndex" class="data-row">
<td class="feature-name">{{ row.name }}</td>
<td v-for="(value, vIndex) in row.values" :key="vIndex" class="feature-value">
<span v-if="value === 'check'" class="check-icon"></span>
<span v-else-if="value === 'dash'" class="dash-icon"></span>
<span v-else class="value-text">{{ value }}</span>
</td>
</tr>
<tr class="category-row">
<td colspan="6" class="category-title">隐私</td>
</tr>
<tr v-for="(row, rIndex) in privacyFeatures" :key="rIndex" class="data-row">
<td class="feature-name">{{ row.name }}</td>
<td v-for="(value, vIndex) in row.values" :key="vIndex" class="feature-value">
<span v-if="value === 'check'" class="check-icon"></span>
<span v-else-if="value === 'dash'" class="dash-icon"></span>
<span v-else class="value-text">{{ value }}</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
// 定义数据接口
interface PlanHeader {
name: string;
btnText: string;
}
interface FeatureRow {
name: string;
values: string[];
}
interface FeatureSection {
category: string;
featureRows: FeatureRow[];
}
// 表头数据 (从截图 1 中提取)
const plans = ref<PlanHeader[]>([
{ name: '免费版', btnText: '获取免费版' },
{ name: 'Plus 版', btnText: '获取 Plus' },
{ name: 'Pro 版', btnText: '获取 Pro 版本' },
{ name: 'Business 版', btnText: '获取 Business 版' },
{ name: 'Enterprise 版', btnText: '联系销售人员' },
]);
// 隐私分类数据 (来自新截图 4.png)
const privacyFeatures = ref<FeatureRow[]>([
{
name: '内容用于训练模型',
values: ['可选退出', '可选退出', '可选退出', '可选退出', '否,提供定制数据保留选项']
},
]);
// 安全与行政管理分类数据 (来自新截图 4.png)
const adminFeatures = ref<FeatureRow[]>([
{ name: 'SAML SSO', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: '统一搜索', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: '专属工作空间', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: '金银湖大模型 分析与管理', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: '管理员控制台', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: '批量成员管理', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: '管理员角色', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: 'Soc 2 Type 2 合规认证', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: '已获 ISO 27001, 27017, 27018 和 27701 认证', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: '域验证', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: 'SCIM', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: '企业密钥管理', values: ['dash', 'dash', 'dash', 'dash', 'check'] },
{ name: '基于角色的访问控制', values: ['dash', 'dash', 'dash', 'dash', 'check'] },
{ name: '分析控制面板', values: ['dash', 'dash', 'dash', 'dash', 'check'] },
{ name: '合规 API', values: ['dash', 'dash', 'dash', 'dash', 'check'] },
{ name: 'IP 白名单', values: ['dash', 'dash', 'dash', 'dash', 'check'] },
{ name: '数据驻留地:美国、欧盟、英国、日本、新加坡、韩国、南非、印度、澳大利亚、巴西、阿联酋', values: ['dash', 'dash', 'dash', 'dash', 'check'] },
{ name: '品牌化工作空间', values: ['dash', 'dash', 'dash', 'dash', 'check'] },
{ name: '全局管理员控制台', values: ['dash', 'dash', 'dash', 'dash', 'check'] },
{ name: '连接注册服务', values: ['dash', 'dash', 'dash', 'dash', 'check'] },
]);
// 整合其他所有分类 (核心功能、模型、功能)
const comparisonData = ref<FeatureSection[]>([
{
category: '核心功能',
featureRows: [
{ name: '消息和互动', values: ['无限制', '无限制', '无限制', '无限制', '无限制'] },
{ name: '聊天历史记录', values: ['无限制', '无限制', '无限制', '无限制', '无限制'] },
{ name: '在网页、iOS 和 Android 设备上访问', values: ['check', 'check', 'check', 'check', 'check'] }
]
},
{
category: '模型',
featureRows: [
{ name: '金银湖大模型-5', values: ['check', '扩展', '无限制*', '无限制*', '无限制*'] },
{ name: '金银湖大模型-5 Thinking', values: ['check', '扩展', '无限制*', '灵活**', '灵活**'] },
{ name: '金银湖大模型-5 pro', values: ['dash', 'dash', 'check', '灵活**', '灵活**'] },
{ name: '金银湖大模型-5 Thinking mini', values: ['check', '扩展', '无限制*', '灵活**', '灵活**'] },
{ name: '金银湖大模型-4o', values: ['dash', '标准', '无限制*', '无限制*', '无限制*'] },
{ name: '金银湖大模型-4.1', values: ['dash', '标准', '无限制*', '灵活**', '灵活**'] },
{ name: '金银湖大模型-4.5', values: ['dash', 'dash', 'check', 'dash', '灵活**'] },
{ name: 'OpenAI o3', values: ['dash', '标准', '无限制*', '灵活**', '灵活**'] },
{ name: 'OpenAI o3 pro', values: ['dash', 'dash', '无限制*', 'dash', '灵活**'] },
{ name: 'OpenAI o4-mini', values: ['dash', '无限制*', '无限制*', '灵活**', '灵活**'] },
]
},
{
category: '', // 模型下方的无标题部分
featureRows: [
{ name: '联网访问', values: ['带限制可用性限', '快速', '快速', '快速', '最快'] },
{ name: '上下文窗口处理', values: ['16K', '32K', '128K', '32K', '128K'] },
{ name: '上下文窗口处理', values: ['196K', '196K', '196K', '196K', '196K'] },
{ name: '跨越模型的视觉、跨模态和速度', values: ['check', 'check', 'check', 'check', 'check'] }
]
},
{
category: '功能',
featureRows: [
{ name: '高级语音对话', values: ['带限制', 'check', '无限制*', '标准', '灵活**'] },
{ name: '高级视觉对话', values: ['dash', 'check', 'check', 'check', 'check'] },
{ name: '标准语音对话', values: ['check', 'check', 'check', 'check', 'check'] },
{ name: '应用', values: ['check', 'check', 'check', 'check', 'check'] },
{ name: '记忆', values: ['带限制', '扩展', '扩展', '扩展', '扩展'] },
{ name: '历史聊天记录', values: ['带限制', '随时删除', '随时删除', '随时删除', '随时删除'] },
{ name: '搜索', values: ['check', 'check', 'check', 'check', 'check'] },
{ name: 'Canvas', values: ['check', 'check', 'check', 'check', 'check'] },
{ name: '在 macOS 上进行代码编辑', values: ['check', 'check', 'check', 'check', 'check'] },
{ name: 'Chat金银湖大模型 副驾驶', values: ['dash', '带限制', 'check', 'check', 'check'] },
{ name: '项目', values: ['dash', 'dash', 'check', 'check', 'check'] },
{ name: '共享链路', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: '任务', values: ['dash', 'dash', 'check', 'check', 'check'] },
{ name: '数据分析', values: ['带限制', 'check', 'check', 'check', 'check'] },
{ name: '视觉', values: ['带限制', 'check', 'check', 'check', 'check'] },
{ name: '连接内部资源的浏览器', values: ['dash', 'check', 'check', 'check', 'check'] },
{ name: '公司知识库', values: ['dash', 'dash', 'dash', 'check', 'check'] },
{ name: '自定义 GCF由选定的开发者人员提供', values: ['dash', 'check', 'check', 'check', 'check'] },
{ name: 'Chat金银湖大模型 考试模式', values: ['dash', 'check', 'check', 'check', 'check'] },
{ name: '文件上传', values: ['带限制', 'check', 'check', 'check', 'check'] },
{ name: '发现并使用 金银湖大模型', values: ['dash', 'check', 'check', 'check', 'check'] },
{ name: '创建和共享 金银湖大模型', values: ['dash', 'check', 'check', 'check', 'check'] },
{ name: '与你的工作空间共享 金银湖大模型', values: ['dash', 'dash', 'check', 'check', 'check'] },
{ name: '测试新功能的机会', values: ['带限制', 'check', 'check', 'check', 'check'] },
{ name: '图像生成', values: ['带限制', 'check', 'check', 'check', 'check'] },
{ name: '交互式表格和图表', values: ['带限制', 'check', 'check', 'check', 'check'] },
]
},
]);
</script>
<style scoped>
/* ------------------------------------------- */
/* 样式保持一致性 */
/* ------------------------------------------- */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap');
.comparison-table-container {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
max-width: 1200px;
margin: 60px auto;
padding: 40px 20px;
background-color: #fff;
color: #000;
}
/* 主标题 */
.main-title {
text-align: center;
font-size: 1.75rem;
font-weight: 500;
margin-bottom: 60px;
letter-spacing: -0.01em;
}
/* 表格滚动容器 */
.table-scroll-wrapper {
overflow-x: auto;
}
.features-table {
width: 100%;
border-collapse: collapse;
min-width: 1000px;
font-size: 0.875rem;
}
/* --- 表头样式 --- */
.plan-col-header {
padding-bottom: 40px;
vertical-align: bottom;
min-width: 140px;
}
.header-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
}
.plan-name {
font-size: 1rem;
font-weight: 500;
color: #000;
}
/* 黑色圆角按钮 */
.get-plan-btn {
display: inline-flex;
align-items: center;
justify-content: center;
background-color: #BD2025;
color: #fff;
text-decoration: none;
padding: 8px 16px;
border-radius: 999px;
font-size: 0.875rem;
font-weight: 500;
white-space: nowrap;
transition: opacity 0.2s;
}
.arrow {
margin-left: 4px;
font-family: sans-serif;
font-size: 1.1em;
}
/* --- 类别标题行 (核心功能/模型/功能/隐私/安全) --- */
.category-row td {
padding-top: 40px;
padding-bottom: 10px;
border-bottom: none;
}
.category-title {
font-size: 22px;
font-weight: 500;
color: #000;
text-align: left;
min-width: 280px;
}
/* --- 数据行样式 --- */
.data-row td {
padding: 14px 0;
border-top: 1px solid #e5e5e5; /* 细灰线 */
font-size: 0.875rem;
color: #000;
font-weight: 400;
}
.feature-name {
text-align: left;
min-width: 280px;
padding-right: 20px;
vertical-align: top;
font-weight: 600 !important;
}
.feature-value {
text-align: center;
vertical-align: middle;
min-width: 140px;
}
/* 特殊符号和文本样式 */
.check-icon, .dash-icon {
font-size: 1rem;
color: #000;
font-weight: bold;
}
.value-text {
font-size: 0.875rem;
color: #000;
font-weight: 400;
}
/* 移除表格最底部的线 */
.features-table tbody tr:last-child td {
border-bottom: none;
}
/* 响应式调整 */
@media (max-width: 768px) {
.feature-name, .category-title {
min-width: 200px;
padding-left: 10px;
}
}
</style>

View File

@@ -0,0 +1,151 @@
<template>
<div class="faq-container">
<div class="footnotes">
<p class="footnote-item">*使用方式必须符合我们的政策</p>
<p class="footnote-item">**Enterprise Business 可以购买积分以获得更多使用权限</p>
</div>
<h2 class="main-title">常见问题解答</h2>
<div class="faq-list">
<div v-for="(item, index) in faqItems" :key="index" class="faq-item">
<button class="question-header" @click="toggleAnswer(index)">
<span class="question-text">{{ item.question }}</span>
<span class="toggle-icon">{{ activeIndex === index ? '—' : '+' }}</span>
</button>
<div v-show="activeIndex === index" class="answer-content">
<p>{{ item.answer }}</p>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
// 用于控制当前展开项的索引
const activeIndex = ref<number | null>(null);
// FAQ 数据
const faqItems = ref([
{
question: 'Chat金银湖大模型 如何定价?',
answer: '每个人均可使用 Chat金银湖大模型 的免费版。付费套餐Plus、Business 和 Enterprise 版本按每个用户每月计算。Plus 和 Business 版本提供月度套餐Business 和 Enterprise 版本提供年度套餐。',
},
{
question: 'Chat金银湖大模型 是否免费使用?',
answer: '是的Chat金银湖大模型 免费版是永久免费的,但具有使用限制。付费套餐提供更多功能和更快的访问速度。'
},
{
question: 'OpenAI 是否为教育机构提供 Chat金银湖大模型 套餐?',
answer: '请联系我们的销售团队或访问教育相关页面了解针对教育机构的专属折扣和套餐信息。'
},
{
question: 'OpenAI 是否为非盈利组织提供折扣?',
answer: '是的,我们为符合条件的非盈利组织提供特别折扣。请访问我们的非盈利组织页面了解更多详情和申请流程。'
},
{
question: '每个订阅套餐支持多少用户?',
answer: '免费版和 Plus 版是针对个人用户的。Business 和 Enterprise 版本则支持多用户管理,具体数量请参考套餐详情或联系销售。'
},
{
question: '有哪些付款方式?',
answer: '我们接受主流的信用卡付款。年度套餐和企业级套餐可能支持更多支付方式,请在结账页面查看详细信息。'
},
{
question: 'Chat金银湖大模型 的安全性如何?',
answer: 'Chat金银湖大模型 采取了严格的安全措施来保护用户数据和隐私。Business 和 Enterprise 版本提供了更高级别的安全和行政管理功能。'
},
{
question: 'Chat金银湖大模型 如何使用我的数据?',
answer: '在免费版和 Plus 版中您有权选择是否允许内容用于训练模型。Business 和 Enterprise 版本默认不会将您的数据用于模型训练。'
},
]);
// 切换手风琴项的函数
const toggleAnswer = (index: number) => {
activeIndex.value = activeIndex.value === index ? null : index;
};
</script>
<style scoped>
/* 字体保持一致性 */
.faq-container {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
max-width: 800px;
margin: 80px auto 100px; /* 增加上下边距 */
padding: 0 20px;
color: #0d0d0d;
}
/* 顶部脚注样式 */
.footnotes {
text-align: center;
margin-bottom: 40px;
line-height: 1.5;
}
.footnote-item {
font-size: 0.75rem; /* 字体非常小 */
color: #6e6e80;
}
/* 主标题 */
.main-title {
text-align: center;
font-size: 2rem;
font-weight: 500;
margin-bottom: 40px;
letter-spacing: -0.01em;
}
/* FAQ 列表容器 */
.faq-list {
border-top: 1px solid #e5e5e5; /* 顶部细线 */
}
.faq-item {
border-bottom: 1px solid #e5e5e5; /* 底部细线 */
}
/* 问题头部样式 */
.question-header {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
padding: 20px 0;
background: none;
border: none;
text-align: left;
cursor: pointer;
}
.question-text {
font-size: 1rem;
font-weight: 400;
color: #0d0d0d;
}
/* 展开/收起图标 */
.toggle-icon {
font-size: 1.5rem;
font-weight: 300;
width: 20px; /* 固定宽度,防止跳动 */
text-align: right;
line-height: 1;
}
/* 答案内容样式 */
.answer-content {
padding: 0 40px 20px 0; /* 左侧留空,底部填充 */
font-size: 0.95rem;
color: #353541;
line-height: 1.6;
max-height: 500px; /* 确保内容在可见范围内 */
overflow: hidden;
transition: max-height 0.3s ease-in-out;
}
</style>

View File

@@ -0,0 +1,421 @@
<template>
<div class="pricing">
<div class="pricing-container">
<div class="title-group text-center mb-16">
<div class="flex justify-center items-center mb-6">
<div class="title-arrow-left"></div>
<h2 class="text-[36px] md:text-[42px] font-bold text-[#1a1a1a] px-6 tracking-tight">
定价
</h2>
<div class="title-arrow-right"></div>
</div>
<p class="text-[#888] text-[16px] leading-relaxed max-w-4xl mx-auto font-light">
查看我们的个人Business Enterprise 套餐定价
</p>
</div>
<div class="pricing-grid">
<div
v-for="(plan, index) in plans"
:key="index"
class="plan-card"
>
<div class="card-header">
<h2 class="plan-name">{{ plan.name }}</h2>
<p class="plan-desc">{{ plan.description }}</p>
</div>
<div class="plan-price-wrapper">
<div class="price-line" v-if="plan.price !== null">
<span class="currency">US${{ plan.price }}</span>
<span class="unit" v-if="plan.unit">{{ plan.unit }}</span>
</div>
<div class="price-line" v-else>
<span class="contact-text"> &nbsp; </span>
</div>
</div>
<button class="action-btn">
{{ plan.buttonText }}
<span class="arrow-icon"></span>
</button>
<div class="features-list">
<p v-if="plan.featuresTitle" class="features-title">{{ plan.featuresTitle }}</p>
<ul>
<li v-for="(feature, fIndex) in plan.features" :key="fIndex" class="feature-item">
<svg class="check-icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20 6L9 17L4 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span v-html="feature"></span>
</li>
</ul>
</div>
<div class="card-footer" v-if="plan.footerLink">
<a href="#">{{ plan.footerLink }}</a>
</div>
</div>
</div>
<PricingComparisonTable />
<PricingFAQ />
<div class="page-footer-link">
<p>Have an existing plan? See <a href="#">billing help</a></p>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import PricingComparisonTable from './component/PricingComparisonTable.vue';
import PricingFAQ from './component/PricingFAQ.vue';
// 定义数据结构
interface Plan {
name: string;
description: string;
price: number | null; // null 用于企业版
unit?: string;
buttonText: string;
featuresTitle?: string;
features: string[];
footerLink?: string;
}
// 模拟数据:根据截图内容填充
const plans = ref<Plan[]>([
{
name: '免费版',
description: '日常任务的智能辅助方案',
price: 0,
unit: '/月',
buttonText: '获取免费版本',
features: [
'有限使用高级模型',
'判断和上传的数据有限',
'回答生成速度:标准速度',
'有限的记忆深入研究',
'记忆与上下文支持受限'
],
footerLink: '已有账号?登录以继续'
},
{
name: 'Plus',
description: '更多先进智能模型权限',
price: 20,
unit: '/月',
buttonText: '获取 Plus 版本',
featuresTitle: '免费版中的全部内容,以及:',
features: [
'使用 金银湖大模型-4, 金银湖大模型-4o, 金银湖大模型-4o mini',
'判断和上传的数据更高',
'图片生成DALL·E 3',
'更深入的记忆与高级数据分析功能',
'记忆与上下文支持增强',
'联网、语音和自定义 金银湖大模型',
'抢先体验新功能'
],
footerLink: '查看适用范围'
},
{
name: 'Pro',
description: '全面运用 Chat金银湖大模型 的最佳功能',
price: 200,
unit: '/月',
buttonText: '获取 Pro 版本',
featuresTitle: 'Plus 中的全部功能,以及:',
features: [
'使用 金银湖大模型-4o Pro 进行专业推理',
'判断和上传数据无上限',
'无限制的高级图片生成',
'深度思考和复杂任务的最大支持',
'最大记忆与上下文支持',
'扩展限制、任务和自定义 金银湖大模型',
'o1 (原 o1-preview) 的高级推理能力',
'扩展的代码解释器',
'更深层的研究浏览'
],
footerLink: '无限制、突发情况下的算力等,了解更多'
},
{
name: 'Business Free',
description: 'A secure way to try Chat金银湖大模型 at work',
price: 0,
unit: '/month',
buttonText: 'Get Business Free',
features: [
'Limited access to our best model for work',
'Privacy built in; data never used for training',
'Limited video and image creation',
'Tools for teams like projects, custom 金银湖大模型s',
'Unlimited collaborator invites',
'Integration with select business apps'
]
},
{
name: 'Business 版',
description: '一个安全、协作的工作空间,专为初创企业和成长中的企业而设计',
price: 25,
unit: '/每位用户/每月 (按年计费)',
buttonText: '购买订阅',
featuresTitle: '包含 Plus 版套餐中的所有功能,并含:',
features: [
'无限制使用 金银湖大模型-4o 模型功能,并扩大使用 金银湖大模型-4 Turbo以及对 金银湖大模型-4... 的访问',
'企业级环境,提供更长久的历史记录与 Slack, Google Drive... 等工具集成',
'安全的企业工作空间拥有基本的管理控制、SAML SSO 和 MFA',
'数据不会用于训练模型',
'分享聊天、记录模式、Canvas、共享快捷指令和自定义工作区 金银湖大模型 等业务功能'
],
footerLink: '无限制、团队协作功能等,了解更多'
},
{
name: '企业',
description: '企业级 AI安全与全面支持',
price: null, // 代表联系销售
buttonText: '联系销售人员',
featuresTitle: 'Business 中的全部功能,以及:',
features: [
'扩展的上下文窗口,支持更长的输入和更大的文件',
'企业级安全控制,包括 SCIM、EIKM、用户分级、域验证和更精细的权限控制',
'高级数据分析:支持自定义数据保留策略、日志与保留审计功能...',
'在多个地区支持数据驻留',
'7x24 小时的优先支持、服务等级协议 (SLA)...',
'按量计费,专属折扣'
]
}
]);
</script>
<style scoped>
/* 引入通用字体,模仿 OpenAI 风格 */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
.pricing {
width: 100%;
background-color: white;
}
.pricing-container {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
max-width: 1200px;
margin: 0 auto;
padding: 60px 20px;
color: #0d0d0d;
background-color: white;
}
/* 头部样式 */
.page-header {
text-align: center;
margin-bottom: 60px;
}
.page-title {
font-size: 3rem; /* 48px */
font-weight: 600; /* Semi-bold */
margin-bottom: 16px;
letter-spacing: -0.02em;
}
.page-subtitle {
font-size: 1.125rem;
color: #6e6e80; /* 次级文本颜色 */
}
/* 网格布局 */
.pricing-grid {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 3列 */
gap: 24px;
}
/* 响应式小于1024px变2列小于768px变1列 */
@media (max-width: 1024px) {
.pricing-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 768px) {
.pricing-grid {
grid-template-columns: 1fr;
}
}
/* 卡片样式 */
.plan-card {
border: 1px solid #e5e5e5;
border-radius: 12px;
padding: 24px;
display: flex;
flex-direction: column;
background-color: #fff;
transition: border-color 0.2s;
height: 100%;
}
.plan-card:hover {
border-color: #999;
}
/* 卡片头部 */
.card-header {
min-height: 80px; /* 保持对齐 */
margin-bottom: 10px;
}
.plan-name {
font-size: 1.25rem;
font-weight: 600;
margin: 0 0 8px 0;
}
.plan-desc {
font-size: 0.875rem;
color: #6e6e80;
line-height: 1.4;
margin: 0;
}
/* 价格区域 */
.plan-price-wrapper {
margin-bottom: 24px;
min-height: 42px; /* 保持对齐 */
}
.price-line {
display: flex;
align-items: baseline;
}
.currency {
font-size: 2rem;
font-weight: 600;
letter-spacing: -0.03em;
}
.unit {
font-size: 0.875rem;
color: #6e6e80;
margin-left: 4px;
}
/* 按钮样式 */
.action-btn {
width: 100%;
background-color: #BD2025;
color: #fff;
border: none;
padding: 12px 16px;
border-radius: 999px; /* 胶囊圆角 */
font-size: 1rem;
font-weight: 500;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
transition: background-color 0.2s;
margin-bottom: 32px;
}
.action-btn:hover {
background-color: #BD2025;
}
.arrow-icon {
margin-left: 6px;
font-size: 1.1em;
line-height: 1;
}
/* 功能列表 */
.features-list {
flex-grow: 1; /* 让内容撑开,使 footer 对齐底部 */
}
.features-title {
font-size: 0.875rem;
font-weight: 600;
margin-bottom: 12px;
color: #0d0d0d;
}
.features-list ul {
list-style: none;
padding: 0;
margin: 0;
}
.feature-item {
display: flex;
align-items: flex-start;
font-size: 0.875rem;
color: #0d0d0d;
margin-bottom: 12px;
line-height: 1.5;
}
.check-icon {
width: 16px;
height: 16px;
margin-right: 10px;
color: #0d0d0d;
flex-shrink: 0;
margin-top: 3px;
}
/* 底部链接 */
.card-footer {
margin-top: 24px;
font-size: 0.75rem;
padding-top: 16px;
border-top: 1px solid transparent; /* 占位,如果需要分隔线可改为 #e5e5e5 */
}
.card-footer a, .page-footer-link a {
color: #BD2025;
text-decoration: underline;
text-underline-offset: 2px;
}
.page-footer-link {
text-align: left;
margin-top: 40px;
font-size: 0.875rem;
color: #6e6e80;
}
/* 标题装饰三角形:严格对齐图片比例 */
.title-arrow-left {
width: 0;
height: 0;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
border-left: 14px solid #C8161D;
}
.title-arrow-right {
width: 0;
height: 0;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
border-right: 14px solid #C8161D;
}
/* 字体优化 */
h2, h3 {
font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
}
p {
font-family: "PingFang SC", sans-serif;
letter-spacing: 0.02em;
}
</style>

View File

@@ -0,0 +1,103 @@
<template>
<div class="mod-banner">
<div class="banner-container">
<div class="txt-content wow fadeInUp">
<h1 class="zh-title">全栈式开源安全检测<br/>与治理工具链</h1>
<p class="en-desc">
构建国家级开源安全数据底座聚合全球漏洞情报基于安全数据湖仓<br/>
实现全景风险实时感知
</p>
<a href="javascript:void(0);" class="action-btn">
了解研究方向
</a>
</div>
</div>
</div>
</template>
<script setup>
// 使用 script setup 语法
</script>
<style scoped lang="scss">
.mod-banner {
/* 背景图替换为 image_b14311.jpg使用 cover 确保全屏覆盖 */
background: #001529 url('@/assets/v3/bj11.png') no-repeat center center;
background-size: cover;
height: 520px; /* 增加高度以匹配大屏视觉 */
position: relative;
display: flex;
align-items: center; /* 垂直居中内容 */
overflow: hidden;
/* 增加一个深色遮罩,确保文字更清晰(可选) */
&::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: linear-gradient(90deg, rgba(0, 21, 41, 0.4) 0%, transparent 100%);
z-index: 1;
}
}
.banner-container {
width: 100%;
max-width: 1400px;
margin: 0 auto;
padding: 0 40px;
position: relative;
z-index: 2; /* 位于遮罩层上方 */
}
.txt-content {
max-width: 800px;
color: #ffffff;
text-align: left;
}
.zh-title {
font-size: 48px; /* 增大字号 */
font-weight: 700;
line-height: 1.3;
letter-spacing: 2px;
margin-bottom: 24px;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.en-desc {
font-size: 18px;
color: rgba(255, 255, 255, 0.85);
line-height: 1.6;
margin-bottom: 40px;
font-weight: 300;
letter-spacing: 0.5px;
}
/* 红色操作按钮:完全还原 image_932d00.jpg 风格 */
.action-btn {
display: inline-block;
background-color: #C8161D;
color: #ffffff;
padding: 12px 32px;
font-size: 16px;
font-weight: 500;
text-decoration: none;
border-radius: 4px;
transition: all 0.3s ease;
border: 1px solid transparent;
&:hover {
background-color: #A01218;
box-shadow: 0 4px 15px rgba(200, 22, 29, 0.4);
transform: translateY(-2px);
}
}
/* 响应式适配 */
@media (max-width: 768px) {
.mod-banner { height: 400px; }
.zh-title { font-size: 32px; }
.en-desc { font-size: 14px; }
.banner-container { padding: 0 20px; }
}
</style>

View File

@@ -0,0 +1,215 @@
<template>
<div class="product-section">
<div class="container">
<div class="product-grid">
<div
v-for="(item, index) in products"
:key="index"
class="product-card-wrapper"
>
<div class="badge-number">{{ index + 1 }}</div>
<d-card class="custom-product-card">
<template #title>
<div class="card-header">
<h3 class="product-title">{{ item.title }}</h3>
</div>
</template>
<template #content>
<div class="card-body">
<ul class="feature-list">
<li v-for="(feature, fIdx) in item.features" :key="fIdx">
<div class="feature-icon-wrapper">
<span v-if="feature.emoji" class="feature-emoji">{{ feature.emoji }}</span>
<div v-else class="icon-check-circle"></div>
</div>
<div class="feature-text">
<strong>{{ feature.label }}</strong>
<span>{{ feature.desc }}</span>
</div>
</li>
</ul>
</div>
</template>
<template #actions>
<div class="card-footer">
<d-button
variant="solid"
color="danger"
class="more-btn"
@click="goToDetail(index + 1)"
>
了解详情 >
</d-button>
</div>
</template>
</d-card>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
import { useRouter } from 'vue-router';
const router = useRouter();
// 编程式导航函数
const goToDetail = (id) => {
router.push(`/ProductServices/${id}`);
};
const products = ref([
{
title: '可信开源态势感知平台 (源感)',
features: [
{ emoji: '🕹️', label: '数据标签', desc: '基于机器学习与知识图谱技术,智能化为全量开源项目提供精准分类与多维度评分。' },
{ emoji: '🛡️', label: '风险感知', desc: '基于3D地球与热力图技术实时可视化展示全球开源漏洞、投毒攻击的爆发点及受影响行业分布。' },
{ emoji: '📊', label: '数据定制', desc: '提供情报订阅中心、深度分析报告、API数据对接等服务满足企业个性化威胁情报需求。' }
]
},
{
title: '金银湖安全大模型 (源鉴)',
features: [
{ emoji: '🔍', label: '漏洞检测', desc: '基于AST与CPG图构建结合静态分析、动态增量分析、AI语义理解检测准确率提升85%以上。' },
{ emoji: '🩹', label: '漏洞修复', desc: '基于多智能体协同修复技术自动生成修复方案并完成验证测试修复准确率提升75%以上。' },
{ emoji: '💬', label: '安全知识问答', desc: '基于漏洞知识图谱与RAG检索增强技术提供高质量、可解释的漏洞分析问答准确率达92%以上。' },
{ emoji: '🛠️', label: '安全工具调用', desc: '基于Function Calling技术智能调用第三方安全工具实现漏洞扫描、代码审计等自动化任务编排。' }
]
},
{
title: '软件供应链检测平台 (源链)',
features: [
{ emoji: '⚙️', label: '平台管理与数据服务', desc: '提供用户友好的Web界面和API确保数据准确性与时效性。' },
{ emoji: '📦', label: '包管理器成分分析', desc: '针对常见包管理器如npm、PyPI、Maven的依赖分析引擎自动识别组件及其版本。' },
{ emoji: '💻', label: 'C/C++/项目成分分析', desc: '专门处理C/C++项目的成分分析,识别第三方库和潜在风险。' },
{ emoji: '📑', label: '二进制文件成分分析', desc: '针对二进制文件的分析引擎,通过反编译和特征匹配识别成分和漏洞。' },
{ emoji: '🛡️', label: '供应测链安全检测', desc: '精准漏洞检测、恶意代码防护、合规性保障。' },
{ emoji: '⚖️', label: '合规性检测', desc: '分析软件组件的许可证信息,检查兼容性和合规性,避免法律冲突。' }
]
},
{
title: '智能终端安全监测平台 (源端)',
features: [
{ emoji: '🔍', label: '极速扫描服务', desc: '百万级样本秒级初筛能力支持海量应用快速筛查检测准确率高达99%。' },
{ emoji: '🔬', label: '深度分析服务', desc: '精准定位恶意逻辑核心可视化展示攻击路径分析准确率达88%以上。' },
{ emoji: '🛡️', label: '持续免疫服务', desc: '自适应进化检测模型,秒级响应恶意变种,支持跨平台识别演进。' },
{ emoji: '🌐', label: '威胁情报服务', desc: 'Zero-day预警能力已挖掘498个普通及31个高隐蔽性Zero-day恶意软件。' }
]
}
]);
</script>
<style lang="scss" scoped>
.product-section {
background-color: #f8faff;
padding: 80px 0;
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.product-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 40px;
@media (max-width: 992px) {
grid-template-columns: 1fr;
}
}
.product-card-wrapper {
position: relative;
transition: transform 0.3s ease;
&:hover { transform: translateY(-5px); }
}
.badge-number {
position: absolute;
top: 0; left: 0;
width: 44px; height: 44px;
background-color: #c8161d;
color: white;
display: flex; align-items: center; justify-content: center;
font-size: 20px; font-weight: bold;
border-bottom-right-radius: 20px;
z-index: 10;
}
.custom-product-card {
height: 100%;
min-height: 520px;
border: none !important;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05) !important;
border-radius: 8px !important;
overflow: visible !important;
background: white;
padding: 20px;
}
.product-title {
font-size: 18px;
color: #333;
font-weight: 600;
margin: 15px 0 25px 25px;
}
.feature-list {
list-style: none;
padding: 0; margin: 0;
li {
display: flex;
align-items: flex-start;
margin-bottom: 18px;
line-height: 1.6;
}
}
.feature-icon-wrapper {
margin-right: 12px;
margin-top: 2px;
min-width: 20px;
display: flex;
justify-content: center;
}
.feature-emoji {
font-size: 16px;
line-height: 1;
}
.feature-text {
font-size: 14px;
color: #666;
strong { color: #444; }
}
.card-footer {
position: absolute;
bottom: 25px;
right: 25px;
}
.more-btn {
background-color: #c8161d !important;
border-color: #c8161d !important;
border-radius: 4px !important;
padding: 0 20px !important;
height: 36px !important;
font-weight: bold !important;
cursor: pointer;
&:hover {
background-color: #a01218 !important;
}
}
</style>

View File

@@ -0,0 +1,494 @@
<template>
<div class="mod-tabs">
<ul class="tab-hd wow animated" style="visibility: visible;">
<li
v-for="(tab, index) in tabs"
:key="index"
:class="{ on: activeTab === index }"
@click="setActiveTab(index)"
>
{{ tab.title }}
</li>
</ul>
<div class="tab-con con1 wow animated" v-show="activeTab === 0" style="visibility: visible;">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">SBOM 自动化分析</h4>
<div class="l-desc">生成标准 CycloneDX/SPDX 物料清单透视组件资产 </div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>资产透明化</h6>
<p>自动解析项目依赖构建完整软件物料清单 (SBOM)涵盖开源第三方组件的名称版本和许可证信息</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>格式标准化</h6>
<p>支持生成 CycloneDX SPDX 等国际公认标准格式的 SBOM确保数据在不同安全工具和平台间的高效流通</p></div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item"><i class="ICO ico3"></i>
<div class="list-con"><h6>供应链追溯</h6>
<p>为软件组件提供唯一标识便于在发生安全事件时快速定位受影响的组件和版本大幅缩短应急响应时间</p></div>
</div>
</div>
</div>
</div>
<div class="tab-con con2 wow animated" v-show="activeTab === 1" style="visibility: visible;">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">供应链漏洞检测分析</h4>
<div class="l-desc">深度解析依赖树精准定位 CVE 漏洞与传播路径 </div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">检测机制</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>依赖关系解析</h6>
<p>构建项目的完整依赖关系图深入到间接依赖层级确保不遗漏任何潜在的漏洞组件</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>漏洞匹配与告警</h6>
<p>集成全球主流漏洞数据库 NVD将组件版本与已知 CVE 漏洞进行精确匹配并进行实时告警</p></div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">修复指导</h5>
<div class="list-item"><i class="ICO ico3"></i>
<div class="list-con"><h6>路径可视化</h6>
<p>提供漏洞传播路径的可视化帮助开发人员理解漏洞来源并给出最小成本的修复如版本升级或打补丁建议</p></div>
</div>
</div>
</div>
</div>
<div class="tab-con con3 wow animated" v-show="activeTab === 2" style="visibility: visible;">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">恶意代码投毒检测</h4>
<div class="l-desc">识别依赖混淆组件篡改及后门植入攻击</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">关键防御点</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>依赖混淆识别</h6>
<p>检测是否存在私有包与公共仓库包重名的情况防御攻击者利用依赖混淆发起的投毒攻击</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>组件篡改监测</h6>
<p>通过校验组件的哈希值或数字签名确保下载和部署的组件未被中间人或仓库恶意篡改</p></div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">主动拦截</h5>
<div class="list-item"><i class="ICO ico3"></i>
<div class="list-con"><h6>行为特征分析</h6>
<p>对新增/变更组件进行深度行为分析识别高风险的敏感操作如网络连接文件读写等主动拦截后门植入</p></div>
</div>
</div>
</div>
</div>
<div class="tab-con con4 wow animated" v-show="activeTab === 3" style="visibility: visible;">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">未知漏洞检测分析</h4>
<div class="l-desc">基于代码指纹与污点分析发现 0-Day 及未披露风险 </div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">技术手段</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>深度污点分析</h6>
<p>追踪不可信数据污点从源头到汇点在代码中的流向精准发现可能导致注入攻击和敏感信息泄露的路径</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>语义代码指纹</h6>
<p>提取代码的结构和语义特征作为指纹用于识别代码库中与已知高危漏洞相似的脆弱代码模式发现变种和未公开漏洞</p></div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">风险收益</h5>
<div class="list-item"><i class="ICO ico3"></i>
<div class="list-con"><h6>超前防御能力</h6>
<p>在漏洞被公开披露前发现并修复为企业提供了针对 0-Day 攻击的宝贵预警和防御时间保障业务连续性</p></div>
</div>
</div>
</div>
</div>
<div class="tab-con con5 wow animated" v-show="activeTab === 4" style="visibility: visible;">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">许可证合规性检测</h4>
<div class="l-desc">识别 GPL/MPL 等传染性协议规避法律合规风险</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">风险识别</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>传染性协议警报</h6>
<p>识别如 GPLv3 等强制要求用户公开源代码的传染性许可证帮助企业避免不必要的知识产权风险</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>兼容性评估</h6>
<p>评估项目所有组件的许可证组合是否相互兼容确保整体合规性</p></div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">治理支持</h5>
<div class="list-item"><i class="ICO ico3"></i>
<div class="list-con"><h6>定制化策略</h6>
<p>支持根据公司内部政策设置白名单和黑名单实现许可证使用的自动化审批和管理保障法律合规</p></div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref,watch } from 'vue';
const props = defineProps({
defaultTab: {
type: Number,
required: false,
default: 0
}
});
const tabs = ref([
{ title: 'SBOM 自动化分析' },
{ title: '供应链漏洞检测分析' },
{ title: '恶意代码投毒检测' },
{ title: '未知漏洞检测分析' },
{ title: '许可证合规性检测' },
]);
const activeTab = ref(props.defaultTab);
const setActiveTab = (index) => {
activeTab.value = index;
};
watch(
() => props.defaultTab,
(newVal) => {
activeTab.value = newVal;
},
{ immediate: true } // 立即执行,确保初始值生效
);
</script>
<style lang="scss" scoped>
.pg-evaluate .mod-tabs {
margin: 0 auto;
max-width: 1360px
}
.pg-evaluate .mod-tabs .tab-hd {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
padding: 40px 0 20px;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center
}
.pg-evaluate .mod-tabs .tab-hd li {
cursor: pointer;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 40px;
margin: 0 30px;
position: relative;
text-align: left;
-webkit-transition: all .4s ease-out;
transition: all .4s ease-out
}
.pg-evaluate .mod-tabs .tab-hd li:after {
background: #4bad52;
bottom: -5px;
content: "";
display: none;
height: 4px;
left: 0;
position: absolute;
right: 0
}
.pg-evaluate .mod-tabs .tab-hd li.on,.pg-evaluate .mod-tabs .tab-hd li:hover {
color: #4bad52
}
.pg-evaluate .mod-tabs .tab-hd li.on:after {
display: block
}
.pg-evaluate .mod-tabs .tab-hd.EN li {
font-size: 14px;
line-height: 1.5;
text-align: center
}
.pg-evaluate .mod-tabs .tab-con {
background: #fff;
border-radius: 12px;
-webkit-box-shadow: 0 2px 26px 7px rgba(50,50,50,.06);
box-shadow: 0 2px 26px 7px #3232320f;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
margin-bottom: 60px
}
.pg-evaluate .mod-tabs .tab-con .item-l {
position: relative;
-ms-flex-negative: 0;
flex-shrink: 0;
height: 584px;
width: 440px
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt {
color: #fff;
left: 57px;
position: absolute;
right: 76px;
top: 169px
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt .l-tit {
font-size: 28px;
font-style: normal;
font-weight: 400;
letter-spacing: 1px;
letter-spacing: 1.7px;
line-height: 40px;
text-align: left
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt .l-desc {
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
margin: 26px 0 0;
text-align: justify
}
.pg-evaluate .mod-tabs .tab-con .item-r {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
padding: 50px 0 0 83px;
text-align: justify
}
.pg-evaluate .mod-tabs .tab-con .item-r .item-list {
padding-right: 78px;
width: 50%
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-tit {
font-size: 22px;
font-style: normal;
font-weight: 400;
line-height: 25px;
margin: 0 0 20px;
text-align: left
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item {
margin: 0 0 40px;
padding: 0 0 0 60px;
position: relative
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item:last-child {
margin-bottom: 0
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item .ICO {
background-size: 100% auto;
height: 30px;
left: 0;
position: absolute;
top: 0;
width: 30px
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-con h6 {
color: #4bad52;
font-size: 18px;
font-style: normal;
font-weight: 400;
line-height: 25px;
margin: 0 0 10px;
text-align: left
}
.pg-evaluate .mod-tabs .con1 .item-l {
background: url(@/assets/v3/bg1.B9IGVx_y.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA0CAMAAAANBM47AAAAAXNSR0IArs4c6QAAAtZQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYHBwcHBwcFhYWGxsbGxsbGhoaGhoaHx8fGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaHBwcGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGRkZGhoaGRkZGhoaGhoaGQes7QAAAPF0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKistLi8vMDEyMjQ1Njg5Ojs8Pj9AQUJDREVGSUpLTE1OT1BSU1RVVldZWltdXl9gYWJjZGZnaWprbG5vcHFyc3R2d3h5ent9fn+AgIGDhIWFhoeIiYuMjY6PkJKVlpeYmZucnZ6foKGjpKWlpqeoqaqrrK2trq+wsbKztba3uLu8vb6/wMLDxMXGx8jJysvMzc7P0NHS09TV1tjZ2tzd3t7f4OHi4uPk5ebn6Onq6uvs7e7v7/Dx8vP09fb3+Pn6+/v8/f3+/jZlGfIAAARzSURBVBgZtcGJf84FAMfx77PjGRs2c2QUm6VoylFyLMdmmKOkiGooUY4cqSgVy1JKIoq2pMOoxCK1ImfMNCamaZjYxR5b6/n8B/1+z+/Zs2fHq9dGvd/6v4XqxgRltNcNeZUNuhGdSiFWN+BL4LC/rttI2A4zdb0aZZEZsI2CMDVMt66yPA/DFFXGGrn1i1A9tCq9cqtM4SWkSloK0XIZSrbqodlVFsn0GVcjJTXLZZ+vTKlkqD5SOOkjKQ4WyjQepsjQuozn9C8e6ipLPAyS7EfIDpTJ9h35LSU9jTNcloGxqmUwRbfIxe8sc6Vn4QFZelSwQtJ60mQZ4Kxoq5rCS0mWJW5tB7Ur5GtVegtnL6n3+i5y8T1Ijl21vAYD5bEORxdVCj1Puk0eU2GcamuSwwFV6g9LVGUSJKhS8EV2qC4PU2KXxfcAvw+Ztymj4BqUF/361ctHyQuRWxRl3eQlwC63+L5yS4Rr1LA/1ibL8D5yC7JJjU+f7aNqWk8/gsWZs+uT5G+Pl2M5sSBc1YwrTpOCCykapCo9NjqAv3OgaGELuQRNPQd/ngWc38SoyqQKDkmKKeJKvNw6pzjBuXVsIvzcXh4hWyA5fqMD2NZHbtPh1O0y9L2Eo6tMHVaVQ/6CcI2EbYHy4rMaZqrVMyeB1DtlGgOZ4XLpcY5hknxnFEPhwmDJfoxjoarGvoOC1lLAtLNQviRQ0hx+CZNb816Suu+Bq0tbyTAFhshyc6Qsnct4Q4aguRchK1byiW4kb9NKIe02uXzPDrmMz4H82b4yrSTPR6abksG5xF/VhG6CSxNtcmnj5AmZXsIlRaYYiJYl/hSkR8jLHZnwQ4TchkO4DD3L+XHYoFQYLYNfMdPlFvoFnB8gjwGXYYm/Kk2m3EeGF7jQXPI7xIcyZZAoj2kOHI/ILawYElVlHnkyJbNVhuXslWkn76vKZHDeK7exDhxT5PEkDpsMr3CmkaR0Nsh0mCR5jLoM8+Qx4DxsDJHbKAiToT9siopcDhNl8ClgltwClsGVcfLScTeciJUlAibItBKXNJsMfSBOlu574XgvVWNPAj5oIZf9bJbJb74DnG83kSmJy3aZGi8ug4+DVdPQU1AyO0CGOdBbLkHRMSFyaVfCezL4jP0NLiaoDk13A9kJflKTXPY0VjW2zymNkDTyILAhTHXpVMofwNHHgpQAH/nI2yJYLP/70zHFqE5bKG4/OB0oeLfvStjcTB7+78C2u17PA44+eorD/qrDCJgnadQeDBlZcDrBV5YRhyF3H4bMBD+NgRmqrVEWmQEydV92AUvJT2sWvbhq52Usxav722TYTkEb1TIf4uVmfzDlDDXkp05sKktUGWtUU4cSUuWt44QVhy7+hcFZkLF2cpRNVZKgn2r4lKuRqs3e9e5A1dIsl72+qiYOFqr+JsAUefM/Qnag6s+2i/yW8jILRqshelawQlXaFrJVDbOcinvksQ5HFzVM6HnSbXK7D06+2VAH4XFZfA9wffJC5DJi//V6Sv+BfwBIbvfBNZtweQAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA6CAMAAADMWVqUAAAAAXNSR0IArs4c6QAAAkNQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVFBQUICAgHh4eHBwcGhoaGBgYFxcXFRUVHx8fHR0dHBwcGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYFxcXHBwcHBwcGxsbGRkZGRkZGBgYHBwcHBwcGxsbGhoaGhoaGRkZHR0dGRkZGBgYHBwcGxsbGxsbGxsbGhoaGRkZGRkZGRkZHBwcGxsbGhoaGhoaGhoaGRkZGRkZGRkZGBgYGxsbGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGxsbGhoaGhoaHR0dGhoaGhoaHBwcGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaHBwcGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaZrZiaQAAAMB0Uk5TAAECAwQFBgcICQoMDRAREhQVFhgZGhsdHh8gISIjJCUmJygpKywtLi8zNDU2Nzg6Oz09Pj9AQUJDRUZHSEpMTU9QUVJTVFRVVldYWVpaXF1eX2BhYmJjZGRlZ2lqa21vcHJzdXd3ent8fn+AgYKCg4WJi42Oj5GSlZiZm5yfoaSnqKmqq6yvsbK0tba3uLq7vsDBwsPGyMvN0dLT1djZ3N3e3+Di4+Tl5+jq6+zt7vDx8vLz9PX29vf4+fr7/P3+nMc1QAAAAuJJREFUSMfVlulfTFEYx2fmtk1laDGtWqzTKksJES0itEipLJGxJEsoJEsSIilZsoUWoqQyg8bcaX5/mnvvuTPN5864nUkv+L2Z5znnfufznPM8zzlH4RtHIbVCqjhQaMUcYgXyERb/AYtTyCrpX8PW5ola4xbWZdu7R3OK+YcvdIX5aUT5TY95abWexIpttsD6bDPdltgV+0UIZKrSLUzZix8nUoreg42gxXQl+uONQD5nBhtwiQ7b1kv2aZLhvWZ00GCqRh4ZHzHgp4C1opsGuwAMFYZypQDs49xoI2oosHgrHmsE6zks9ZlVQ5hcRIG1YjyEWDH9JAFZFAnwMKLeZgdfHQU6UmjSHQrsmvY85zN0jaMDklwMz4TFA/E0mEdguKNbBIRNe2ptgEtMrf8M9J1k7ANNGLU7UTdYWLs3OmNMGymju97iQAKLJjs1LMxZypywGuDeps33gSPET+yDyR7zG0zWppYNgA2TYv1oU3It0o7h5IzSY1ceTAFnk0SVcicq94nWiAYJxiVJ6N2trg/nMWGVt/BQgi0AMvnfbNfYNxU/edupA5ghtHNTTCf6dKvzKuuaTcBlnahyoIT7JtKAWunaqrmay87pBI4Sf8lLWBNskz1gz2ccGIQpWop53yHhtCjFgUgjvxLxPwZJB+Q5p1ulfwsMHvKyD5wCq7HZ2utjQFeq65oM8lc6eGnAKodognzoSjkAyJlFB8wDts8CYyzQOxzsgRrK++0dWm1mxDUzLJ3pVFgDzDqR+iQkgC2iwcJMeEVup9cw1W3Y/wFm7iTLBXLlj9fDwNeDi5WKRKCYL/fvuKhQFJB2kNNpPjSTYQTjHrzbwtdNFpA109WR3kNKbkJFsCe0F1VUflV1HVDIr3UCZ9y6TV/AfG5dxQB+xbiFLfsohGrdSRKwJ1lWaeVbfMUz46YBeLre/ReeOsT/bx+GO5bLavf//DDcu1JWFXP7xJ4N5rOUQt5S6jcJyGZLl4Al1gAAAABJRU5ErkJggg==);
height: 29px;
width: 27px
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAMAAAAPzWOAAAAAAXNSR0IArs4c6QAAAuVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGxsbGhoaGhoaHBwcGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGxsbGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGxsbGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaMeyWdgAAAPZ0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLjAxMjM0Njc5Ojs8PkBBQkNFRkdJSktMTU5PUFFSU1RVVldYWVpbXF5fYGJjZGVnaGlqa2xtbm9wcnR1dnd4ent9fn+BgoOEh4iJio6PkZKTlJaXl5iZmpubnJ2en6ChoqOkpqeoqaqrrK2trq+xsrO0tbe4ubq7u7y9vb6+wMHCwsPExcbHx8jIycnKy8zNzs/R0tLT09TV1tfY2drb3Nzd3t/f4OHi4+Tl5efo6err7Ozt7u7v7/Dx8vLz9PX29/j4+fr7/P3+/H7PQAAABYhJREFUWMPtmGlYVGUUxw+IoCC4YEkpqAQpuKJSKi5pWmq2uJVLruReiguWCFJomUvu1qSpDZJWkKWm5lJauWQa5IaCQpg6EwjT4Mz8Pvdh7r0wwzCD2dOHns6n/32fO7/nveec95zzjogHC4+JkPs2Hfr/AKTHis8Whd8nZIYNKImTBhGfsjey0d9itLnL+XXFWH7DbkV7UwYF3ytkCsXBMhAHs+wYEXAvjDo7KPaWaFg7NO5z9sYNSdh4A6AwocYfVmvUZeC9IQcxBWmO9em+8BxgmOxTI0b4YaAAgBmO0XksCzgeXQPG8wY4GOefVMSFMVVC/OQxMPbzhPBKBtMEEREJdJVs3qNKsc50z/B+F860d5uxHS/BR37uGCsho56HtG/yPUxyA1kE6XU8nZ3oIiwdq2c8C3pHRquX5+Vwec7YNhVLYbmYe1XPiDRwNqjSc8TiS1q6XkqLsi82/gnrc24ccoSySj6N2GAFLJdvYci1ANb1USJS7zCMc+OQF2GsEoCElBFjS6D07YENRIdeAgcsMYJpgvjuhFluGHVzOeolIiIzLQCUzmtcybGN5hnh/Q8gxV2KvAbdRUSkq42ik3CjtVN0Wh4CWOvlhuGTx1a7SuZKQ3mLcj/nEPt+Afra7jbSD3qov0oX6QvNnCHxsM99RfmQ88pGZ2FN6LyfAudkG2bjpPty0qCcBEUG/wnABCdIn3IuNnV/8vqAWifa2oDSKfZ9hU7NJX9GS5HYOxS08lAC5nJTdftirLEdfO3eTjQDUJ7U/gbFnTzVkZ18rCauFibx2Q7WnK+zLWDC3NNjPbupuaQDqKUrEbLCRSQsA2yDPTJqw0uKHI1NOYWhZrK87fXuENZIj5AQeEqRCzmnqKlYwxXZzKTt1HVx1+l0ugzI1NntAkWKyuWk9tYZ8pXV9F8+UZTu6CmdTqfTRYvEUL1t1iDfuHmrm0iEXq/X74EDertdwqiofE5U2kmBsnqLq4raC/v0er2+rfrN0EfUrM9XJwMsYWpxLmOuIrNZoKhe0KKyYwJgmCJHYVVOWYtyMpQM3IJVKY++JuKVN4eAY2e4rXm/HQzUAoW+mYg02QJLlbXeEKuNDibHGO3S0lRyWKVmzy4wnT/9axnsUbtAKvneitzAEUfI6+SpMomb9dUylGyvlNYlKiPgmrYnyWNhlZbzqCLb2zTXiUTOzqdgbpT2PKviayJhgCOkoZnZql5DaWg1HbCJsSJ3xmNznsC2cFqVLczs93MJqZ2JpbX6cIw9ztn/AnQR7dCw2iUkjYoj1LUiKzTzL2Sb9rAKVvlVgdROg01ax1jPNd8qB3EmDO75gF377YZ9TZ0gTTLhkH+lIXV+1dNc7wZgS61rHx9XQ8m8wEqQgFlG2OQvIj61RMTrSwwhVSEB14GKLjm9HAqX9PUTHXrx7Z16DSwJXtI85YLN+vOCB0fBRBd1ZSS2cY9swFZfmwoATDmF/J5tAtjcWqS/yX76bxs47O0CksQpkTbwuLbS6c0rWs3IXxorIn3N3N0U/8p2G1hdDkuTKYuSBK172mtr50mJF7m6ID7WW0SksZG8KBGRrkbyXM5+zYsxn4fr/tXPbK9CjF0NhOEui+0zRgAOhVQLySJLbU7ZldLRwULHJw57By60rQ6SQ6oqt5LppvhPs2EYXcs15ATLVJmudUyXNqgUfnzCJWSdlunBJt5w28hijgPpHVxAJsIce9SWay6udvKaXgwcmdTCARI27iBA8sMikWthjceuGjzfAJC9csbTXTL4qkv/acvPAPzxA9w9e84G23xrcOsJHLnb5tzp9o0JCtpovw6m+dXwFhcydNm3Jcrv73y3YvhDIiLSempqysSwe7qVejVtl8mBdqFe///h8I9Doru1lX/F/gIjzb047a6x0QAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA2CAQAAAAxbjKfAAAAAXNSR0IArs4c6QAABsRJREFUeNrNWWlsFVUUHrayRgRt37vfmS6QlqIlIFSkkIKhwSJVUCRgWARSZTVGQRBBCCAoRUV2UIxFlIQlrLKLQhVFtEBAERQECRaBKmWrCKX1mntm5r3pvJnSVyhx7o/Ou9t377nfOee7U02rnKeKP9LXDNHJNbQ79aCOGCQ24R9ILv9iH00QsZUP+xxOm5D2ck282/CuSgPVa2O5AUTf02t4Eu38XTAcG3CNa4/o8ZUCm1yDchggV6SWbiEdH3HLX5UCjQ948g+TItxaaQCuq13fdoNTGsOuCNbENBAd/HGloCWkmHG797sXEqdQxwRpi4MmrfJpmFbFqBVLmGa3zvD4mlpVE7YVU2qgCTsEJaU4vcaARrSiGU2oCG9J9BMzsBFHUYAb7KWFOI1d2A+Jv/XaPH0i+/Dv1B9NRbrYyUsaZi5wAyT2hmfKpnoWzrt4aKCITWbPxZDiIulWBGPofLNtOCRKtOrlDH6iO/bYIE5iK2ZjjNgMiQs0UkzFClyFxHxz8kOQmBMcLjrzsvhk9Qzev16enXbliYzgJ3EC0YGW1yGRZ77/Boks8/0yJL1stxUDt+dFtFfv/vtvAipisd4EPUXz+W9X24R24F1BV8I3kFjpdKOYBvzeX73fxJfRCQUMVoDRcbWwVhnZcowQ4Dl8jtV48jfYOt3MlmjkQeKAuYiPIel42bAvoBgS1/G2Wqsvijk8sVQPO/AjfHZp6j2yHk4w9EqMwlxxERLFlGK4Hy5A0qwyoi4W8V7PUNtAzlFnE+cFnFwDZyFptXlEyQxtlatisDkik5eX4hkWsIMH7AuyD59CYr/DJjZgTcMktTNfI+NXZD0xFV/jEv2IbGpieQd+UCnEm1JLGHalFf443Sl3mVwWcKSfk192GVTtwezu63W2o9gcn9hpZCQAf+uygDWNZqk9I9Fj4qo4rLKTQcDQkJjBUXZPXK1SEBMhccU5xAnsi0IhJNZ57HcQb6in+24TcUlNFisc9dshsT2ktwNY0zCZjflo6MwxDfCnCj92O9pzag5z8MEQiEtOV3IH1mvjJCR+CZUC4PBD7ilR9OP1jnXWxwqu784/qjWurxMSRbL/YSyDxHk9gzpSCrXQExrX1zTxFPcd54BtxTGhmBOk80mK4AiTZ6Q2u5FoKE+2BftVFC6zFOJnzmBF9micFMFuVCDe4XnSnfsdzEOfNddYhzrSeGzlk6lI+SlIRTGVzdzfPIg9jtRHx43uOtFQmxy3SjF2IVu8ikzqpWeIDmhFTcRMSPxBup6gN9fbUEf0xmjMptXGYsX4QBRTwfYoWgaY3UJzeqqYgW020VKIL8QU9BZfQuIzFx8IIZdZ341HF/masZmtpCrpuD+LrkBigd3QS5UyCOTdXEz0t7Z0Ao4Ek3y5gFua8+zTqmOaobQ58qmtKYxCX12rb3VRbHY+glei4Yg41yHFi2EA3xuw2TrezHq+T/WgVWx0Bd/DMnQKm+I7QyWUfuLu9oo4XsCaphgiDpvg56J8gfpoTKciSJppGXqc0rvxNV2Dis5xuktYwMfUSeKMOjbnSKywZSilLijHI2nYFFO5gXMhsYjSUIK3XASGxA3zlDlvLHAH9rdmg7UMC/grzm8a9QwVsob0N6511bzow6buqDrqCWEBb4OkVR7z3ROgl8FCMxaHTtJVtUb6wwJeB0mbPfNyCSSLIV8j5u2b6ONa5rGpM0NbxBpWoG5jdjOr+3iUK2Ya0ZtXMB7fQuHLqp5w54ExzVAHij59fXXdCg1Urb6o0BahwuFptzF8CDvc5/PVVQKJRhqysxiShnqQ6wkDOCxybTQCpdsTX9NIkkbHc5A03kOkpYdK+ZsCK12+3MOdOBLqGUbHfZBY6gGcymS4Lyzgb70VtpGAzZyMueo+6GFqI9IkhwV80D2RataN47KpT6iXlzk1TY9nFnYKC/iUigseIVhZY0spHYk88UxpIc9psZYRQMIArsZkHeYqEZY5lCzLMFUuYAHaWd9ytAD1MKn8wCKGT/Exe12sEC/hgKXfotPtEfTpQINEPhZTL0uJcJLLDgOY6ag3N+wlUjEZe/kzhiqXMD0oDILn2Ua8xxdpq5zAUjGW9kCKnWEA9+Udj6RZ2M2fEU0lRzk0IKi2XBxcdMa8gOmDJQ876H0xBWPwPA0QPURn9VkJ+ZSGbugtBtEImiBmYC0OiRuOkVexgYbopJXv8ceJfmIhcvneVJFSjF+xFqOorftH1XI8UT6Rikxk0WocxCkUoMgFRn3hO4tj+FwspBH0OBIr5V8CSRF6QxHjT9Ifogf0+Eh/ZD2P6+f/8/kPaURwNOuwtMAAAAAASUVORK5CYII=)
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico5 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA2CAMAAAClUqpcAAAAAXNSR0IArs4c6QAAAfVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiHBwcGxsbFhYWFRUVGxsbGhoaFxcXFxcXHR0dHBwcGxsbGhoaGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGBgYGxsbGhoaGRkZGRkZHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGRkZGxsbGxsbGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoahQXVxQAAAKZ0Uk5TAAECAwQFBgcICQoLDA0ODxITFxgcHSEiIyUmJygqKywtLi8xMjQ1ODo8PUBDREVHSUpLTFBTVFVYXF1fYGFjZWZnaWxub3J1d3h9foCBiYqNjpGSlJeYmZqbnZ6foKKjpKWmqKqrrK2vsLG0tba3vL2+wMHDw8XGx8jMztLT1NXV1tfY2drc3t/h4uPk5eXm5ufo6err7fDx8fLz9PX29/j5+vz9/ud+XxgAAAIaSURBVHic7ZTpVxJRGIdHtJS0yELMNNtMaLPFLNuppKxIC8v2fU/KysJyKtvBpI3KqDAL5Pk7O3eGphEBGb54Ooffl+e+895nzl3mjCSly4yj3ba0zQxZMwiRFpNRbeYZIAq+amNeUwgCDTU+GGktzF6bdQXih8skyeQahr6F2Xobh+DVMnVceRui7qnZaNYuiLWb/5YFzjA8rp/Y2z5untULsbaSzJpNrOxA8so2DcHLpRk0U0sk9Vkop9VRms6r9sGvvUUpe+vF/axM2SpsHQFfjVYv7+zpPd+sfTnlZ4HjlvHegj4YdmnzLKdRcm+ONmNtEIKNSdoUdxTuVGr1tBfwuetSAH7M1R5ajgHnyvXekkcQdhb8e9AB7cXiciL06r7zFX74tEErS9pi4LXqXjQvTqc62gqbdY1Szyhcna0WxQ/EBc+v1eUQo/bE0E+3vlO7IwyhCkW0Yzgu9SCeGPW+VqlrNdU5HF844RCJclCgEfYLNsEewW2wRXA3rHPYzbpdv8Ot8De7BKZDs6ANGgTrYbHgaqgYe5F5MS/mxf9dXOXxRHjoEYlxV+AI3BI8BdcEL8IFwetw0uPUxH3G/lVenRh7/fF5v4j//TOFgbcK+geCKgffqAwOfB8jhqSsc2PyRFmWPxD/mXVifJNl2SxJRv//asqE2HPzqaHcv5wQnRNtKzmLJk3cWWQwdQkx51PNUazKKSbpDyfEdItE0oMXAAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con2 .item-l {
background: url(@/assets/v3/bg2.ED2KfGoJ.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABACAMAAABvC9RJAAAAAXNSR0IArs4c6QAAAoVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYHh4eFxcXHR0dHBwcHBwcGxsbGhoaGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGRkZGRkZHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGhoaGhoaHBwcGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoawUAFEAAAANZ0Uk5TAAECAwQFBgcICQoLDA0ODxARExQVFhcYGRobHB0eHyAiIiMkJSYnKCorLC0uLzIzNDY3ODo7PD0/QEFCQ0RGR0hJSktMTk9RU1VWV1lbXF1fYGJjZWdpamtsbG1vcHFzdHV2d3h5ent8fX5/gIGCg4aHiImKi4yNjo+QkZKTlJWWl5iam5yen6Gio6WnqKmqrK2usLKztLW2t7m7vL2/wMHCw8TFyMnKzM3Oz9HT1NXX2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fL09fb3+Pn6+/z9/kKeQQUAAAOySURBVHjarZb5X1RVGIe/ICiorBoGGSSlIUtkYxZFSWakhUtESFIhZmbZHgUFhYGtKKHYRlKZlCmoLGVZsgYoiwhc7vP39MPMwMw4M1w+n56f5v2e89x75j0z9x7JBwk3aE4s3NpoTtRnB1sW7v54GAD6ylKtzF++twOg5bn9FwBOF0b7nx+S0zAF9FfcISkg47MRYLzu4Xk+BVvVFcD4etN8Z7I49wRAd0mSt/mxHw0AnC9e5p7f+vrfAH1PR7rnCzZ/awCXD6zxcrHAB2rGgbHD6wOnszsrBwGTiRBfS37K3sFLb6yUpEVF5wDaXniZMZ/fchukvdkJ0JQXqHRgqHqt9Ix/JVTzsmqvAYuVDsWhkgVFUtQHDiVdVhXl/H9KRP5rBTFzUh65AkxsmYOSdhWjfRIzw4pi1NTU1NR0MJCihIs0WFGcVEp6ka7ZlU0/2hnmkKRSK4qTVzGKEnOvUWVdib4IQE+CdUWxjSacTJUUv79y981WFGn5ulWSVDgJjOdYUuxkmYycGsNcY135ij9iFN9NQ0rKXotKHy9JKnVslj8l0eZ4YPxOlaTaWZW0n8H4ZqkklTH5fPorUG2z2Wy2QF/Kil4A2sMl3WjfoHOuTyMvyidcy719n8keSYr7zmCqNk7+lQHeklTPT/ZyadIS95Z4UQYpknSQM96b6E05QUesUi9TYV3ZAOMdBqPJ/pRkWOuS5RnA0EYfhp6A+VoG2a7hLfBFpC9DuxmSgqbY6RrOh+0+DVXQIamZWutKM4cllYPhil1ZYXgFCiRl4cl2SYn4IFFSYD9n891YZVfK8z3Z0ctvkqR9mHddt+hEyLwu3AqPSZIi/qXJkhL6Dy2O12Uh5HmMRr0H74d5hO/Cg46Pwc2MrHQbTBoAOOv2u1emyZGZGWOcWegyGPQXk+1/wveuRmwn3S5/hQKon3mp6yHIlnbD6pls0Wmm1rteohrKZ6piBiVFw4aZGx+DXW7rDDoO70xXT2LES5mwbnq8Dg56dCP8VyhxFktGacvd2cMl52KD66AuyLPpEafgU2e6wwQYd+5M+HE46uUIGNkEDc6tePQXzB/ucRRxLfCl10NjyFFone7RwukOZvRAWYC8ElgOI1s8woA9Bsaz8sm2UTiwwDWJOga998sPyW1w3uUct7ETTsbJL2G1YLztuFHU52CWBmk2cvqh9V5J2twFF+6bVZAUcwQ4dNPqRjA/XGTFkPR4F1w1oDXDoiAprGQChndZP/NL0m21lTFzEvzyH16BnDy4upTwAAAAAElFTkSuQmCC);
background-size: 100% 100%;
height: 32px;
width: 25px
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA2CAMAAAChp3phAAAAAXNSR0IArs4c6QAAAfVQTFRFAAAAAAAAAAAAAAAAAAAAKysrJCQkHBwcGhoaFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGBgYHR0dHBwcGxsbGRkZGRkZFxcXHBwcHBwcGxsbGhoaGBgYFxcXHBwcGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaHR0dGRkZHBwcHBwcGxsbGxsbGxsbGRkZGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGRkZGxsbGRkZGxsbGxsbGxsbGhoaGhoaGxsbGRkZGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGBgYGhoaGhoaGxsbGRkZGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaY4gg2QAAAKZ0Uk5TAAECAwQGBwkKDA0ODxAREhMVGhscHh8hJCUmKCssLTAxMzQ1Njg6PT4/QEFCQ0ZMUVRWV1hZWltdXl9hZGVoaWprbG9wcnR3eHp6e3x9gIKDhIWGiImMj5CRkpOUlZaXl5ucn6KjqKmqq6yvsLS2uLm6u7y9v8DCw8XHyMnMzc/Q0tLT1NXW19jb3N3e3+Dh4uPk5ufo6+zt7vP19vj5+fr6+/z9/hUAYDEAAAJLSURBVHja7ZT5U9NAGIa3UhU1guJ9At7We0VRxKNFKd7iiUXRKpcKKFYBUUSJWm9AraC21pLk/TudbLYtaZPSrY4zjj6/9Psm3zOz+35JCbGncNkckhOregG8KcvB9CpgNOeJmi4NH6tcex4DXkHT8QpvCwkhznZE5oqpxQBlxTxgn93Q4m4rngM83VEMW05sJaQUNkw31JDNYzdTO5rS6EmogwimP27SuFqafo0dCfUZLlpcM/b71WZV1QDVANBU9V22amtaJkPZq8HDfr97P6Pef7pDRL1r6mv/AfWy0peVOn+nx+OhRePVq+g3qSv3ejzuzVNT1eoYW2C40lbNbzd2/Hq5WXVp0KLRKDBWbKfWAUo0GgNeOLm6AlgvSX58XkAIWRrGWUm6xdVtF6rZ7xl8kCTpE9qmEeI4CKyVpB+6upG/awE2JRuNOWF+UlTozezk9xpXjemnmdTdejMrqa4Gaih9YFzLMYTblPamqJcwQun27zimNyXAKUqVZExVwB2fz9cNlOsxfX0ynhCL6T6+Nfp8DYOIFJgSntLPz9E1ye6jKwnz5lDKXvNPdMmyfM87mRBS2ZBKrX7URdf6ZHng5pYJ/mAm4r/6R9QNwGhIGNPrL4qbkDXAlePCKH/rctbNEGaMq7km/AtqQZkV54EjrNgVQZvlxEK7GK5jmFc3EBQKMG8E9bwsB5aIqC5gEy9nxlAjotbhizNed+KhiPoejYn6ALSibJyKgM4jYCAQpwd4yYpzmdWTGTbZmVmlLQatLUni9dGU2Z8vQHe3JjoBkgAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAMAAABEH1h2AAAAAXNSR0IArs4c6QAAAk9QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGRkZGRkZICAgGBgYFxcXFxcXHBwcGxsbGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaHBwcGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGRkZGxsbGRkZGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGRkZGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGxsbGhoaGRkZGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoa7LJWmwAAAMR0Uk5TAAECAwQFBgcICQoLDA0OEhMUFRYXGBkaGxweHyAgISIlJigqKywtLjAxMjM0NTc4OTo8Pj9AQ0RKS01PUVNUVVdYWVpbXF1fYGFiY2RlZmhqa2xvcHFydHV2d3h6e3x+goOEhYaGh4iJiouMjo+TlZaZm5udo6SlpqeprKyur7Gys7e4ubu8vr/BwsLDxMbHyMvMzc/P0NHT1NXW2Nnc3N3e3+Hh4uPk5ebo6err7O3u7/Dw8fLz9PX29/f4+fr6+/z9/h/1AioAAAL8SURBVHja7Zb3UxNREMcXAqggIE0pig0VPRuggAURRUBARUVFBaUJKCLFw4Y99oqosYEUEQtEUBCICSYk3z/MyeUSknjx7jKOozN+f3l7b9/nbm/fvp1HJKhpDMMwUZzpF8swzHySpWyY1bacJtcbzdZzd3D0BR23GDJxLvgcIHMAV1fID96i9zgGpJK76sF5IMVdet6Y+bdPeshAvOPiAnlzkdaStlqrb0lcpBgeCqyzWIqnGNo5c/VdIJH3daFCOr4Q2ExEvl1g3cEzMT7FPNZB5Q6ej1FuLEP3H8N99NhmxU1fvhm+D49acc9h5IvuXAteBnPGEVjVb/EUAfGi+Fpg6JZSqXykA3RqGPoAfLimVCpbgRsSKuiAnv/oeOWkIqhpVYc1iofhgoBnnoNKLrWoVBro483xqon82oDXqic32V0OyxbbChVCOkg8TtMHhPwFdrjR4CgTBhQ2nPIAJ7/BEc9y+p9elNMEHgJsclow+Cvc24RsLo26d9zzV+yTjockbnD6nBqNyQsUkvA5d7jMbLVfPGKeGdwuAZ/Bp3mvPT5umSsUx89Bmzc7/A0a7OgYICs8vhljUaL4J5QRUS36gyfwE9D5E4UZkSGGBwHriWipCU22pQkmNJrHbpSK4SH8eT8DVHhbpla+xegs5/Mugge8AlRJXkRR1UaYUkkmTmEPAGg6zOdVk0ZS8Ylm5bO7l9stY9NckowHsGys1VYk5FceSg+yIVVsirSaF9dfjEdXOStDDp7wU2u6IAdf1uGsun8ndf9x6Xh9ukxpHHA39Ltw8nVHfCNlDhcLa4+lz3isceEvzlUQBWpdhqc7uz9tx9F21/EXEoUBIz2CGrfdrATdH8F1zntoEd7aqPLHn6Fvv5jsKejeAjBElAPEuKwOf4VL13W84FqzBjUkX9FG/sbBQhspHz8NTShnRGhwP0AunWtCCW8WAc+SZMGhNUDnVOtTKYCOy6xUnWrWAq0RE2/L6JRZ8PqGYPtovDZWX2mWqttsgfWS8wOVDhPNZXeUuAAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con3 .item-l {
background: url(@/assets/v3/bg3.DKgYKiLO.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA4CAMAAACbrRsRAAAAAXNSR0IArs4c6QAAAmRQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVJycnFBQUEhISIiIiICAgHh4eGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcGhoaGhoaGRkZGBgYGBgYHR0dFxcXHBwcHBwcGxsbGhoaGhoaGRkZHBwcGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZHBwcGxsbGxsbGhoaGhoaGhoaHBwcGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGxsbGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaM9yYTAAAAMt0Uk5TAAECAwQFBgcICQoMDQ0ODxARFRYXGBkaGxwdHh8gISIjJScoKSorLCwtLi8xMjM3Ojs9Pj9AQkNERUdISktMTU5PUFJUVVhZXF1eX2BhY2VmZ2lqa2xubm9xcnR1d3h6e3x9fn+Bg4WGh4iJiouMjY2Oj5CRkpOUlZeYmZqam5ydn6Olpqmqq62ys7S4ubq7vr6/wcLDx8fIycrLy8zN0dLT1NXW19jZ2tvc3d7f3+Dh4+Tl5ujp6uvr7e7v8PHy9fb39/j5+vv8/f7mLvP7AAADPklEQVR42r3W+V8McRgH8E8bSki6LJahcrOOxaZylVhX7jORW+5jkVtCypkz951io4RUrpBVn3/K6/vdZq9se3jx+WWe3X29Z78z8zwzgzC9DzGYTJ3RKnr6ltLIgCkfRf2BmrwueImwT6JbUz28JYXcSj6LCYz2yCJLuwdGkUmWaQOjWE6+6BkYxVLyZa/AKBaRFTq/qXGQyMZmvtP6Sx1Z9L9oxEg108lkv6gj8eTo1jRu24WC5aGimmrOAjDYbO4kV5t388xcTVs0rUEcyDMxW7l8AGAKKYZlmzzAS+0808h6fjpbTJ4CcIAPAUwmo4GxZHleCbnSM00nBwFb+DUY2K/SGGA3q8KA87zumWazBkASqRP0EYBJkhaxCMA6vvNM1/A9gPFkH2CfSmMFLbTv2CMVPyaSiqCPAUxsoUWS1npbsFFSs0q7A4WSrm6LLuNXjXpBzHwCYIKk+bwGcfosnuloclNUXAmrAexVqVbMd1OGdnwtCzzToGJbc8+X9Kmt57VAeKX8+ufQNrop+hzJxlWi3KNSMd8Jd0hWJ7fZw1BSjRGy6KaLBdBR1ytYfuybMqSlDZF8i7xrCGRyNsjFN6/wnxqaWbZjTyWtw/ym+awMByJrmOtOgxSnp5k8XLeUcpfYnGCJKw3Z8oUsT5G1JrOOfDNDlAcbrtppDbPFZjvLXOlJ23VNEnWOrc6Qf3HLGx1OFiSmv5Z9FPuLxUmTHrJeAxxXaYSi1HGnoijKUb5SlHAHXcjvIYCJzV3lkGuBMWR/QW/b6BrXJ/ViB13rNK+zyfZAgmycY96pbdQTVdpB9pxB0Dsq/ThvQbrRaDROW5BhdabZTqM+S9I4SY84aI3jMjW60lr7qM8kQyQdI+g9Z6rbvDnKnZrYFCsG3hoqb6B6II3sDRx2paPIAe5U18jS9XsbeAVAl3pWbdxaz3IIet8bxQp54j7Hi3pak6h/iOk65APFhPNvn+e1vCuMLKyynO4v71kXc52pvqKiX2vqJZ7P8L+lX+bY80vQKWSqj9S9EU2k6V9TTXuRgeQ4WWiAEeQI/94lDIG/hjjTaovlm9X6weJLqlypn7FTbY7I5Rs38nN8TG/8dX4D3Yb6f19FH58AAAAASUVORK5CYII=)
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABACAMAAABxwuT6AAAAAXNSR0IArs4c6QAAAtxQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaAklNYAAAAPN0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8hIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCREVGR0hJSktMTU5PUFFSU1RVVldYWltdXl9gYWJjZGVoaWprbG1ub3BxcnN0dXZ3eXp7fH1+f4CBgoOEhYaHiImLjI6Pj5CRkpOUlZaYmZqbnJ2en6Gio6SlpqeoqaqrrK2ur7Cxs7S1tre4ubq7vL2+wMHCw8TFxsfHyMnKysvMzc7Q0dLT1NXW19na29zd3t/g4eLi4+Tl5ufo6err7O3v8PHy8/T19vf4+fr7/P3+kWOxigAABYhJREFUeAGlwYtf1fUBx+HP4QAKqMecXGTesaHmLR2zxgrUHLZNl6tBbmOpqRW2spWmxiJza5QjlZxpXrAyZlhu4hR0W5tMWYkrFNwmigKFcj0czvsf2Ov7+3HwIAeh7XnUM8fQ0ZMnjnTpS7t96e7TjVjqTmxOjVafjVrzKV15i5a41BfDtngAzrzx9MI5M7/57bS1ey4DfL6qv3ozMLMR2oueitMNjpkbzgL//kmQbumhq+DeFKNuph4E/jFJPXNkgjcvTgEln4Tr89WTiP1QnqCeOBY14H1WgcWWQuEQ3cKUC7A7WAGElUBOsDpNWZ61/dCBLWvTh6tTVDHkKIC9sEo+M7Ir6VSyZrg6hObDo+pmNbyhDuPeBnBXnnj3QMklL9D88mDZIkppS9ZNvuulKFSW4I1tULd9Qbgs0YsPtELdItlGXaV2pLroV0FlpCy3HYaG9QPkZ9ROL2wMkiWxld3q4kmYI8vYzyA/WjeZdhYK+suShXe6/Ljq+L0srrPwokPduD6AXbK4ajksPxvwTpMR9AEsUSDOHfBzWTJgrjq5mnhLlrWwUT4RU+fNnuBUh9DjeJNlhJ7nuDotgUkyYhv5MEi2eQUtALXbJ8gWfZG/O2Q8DuPkc5RzsuTiHiPLsMP4eDaFyrII0mSMhPXqMMjDr2SM9fCaLHdchHPPzRw+Zk52PRwbJCPoNOccMk7xV3X4Dtwj4xnckTKiLtD+bIgsQ/Pg/SAZCyBBxlo8LtleotYp4wSHZHkX74Pq9Bo8JqPfNbJkTIW5suVzWEaMl2UyZkKWbnAWcXWAjH2ckeFs5QnZzpIjYx6MlpHL1Qj5SYA0GT+FcBllvC7bF6ySsZj2YBmXyVEXZeyRMQviZBwkXzYPS2U8T7UMF6TKuPNkwW0yNnNKRjx8S0YehbKEwSIZr3Naxu1wr4z3ktY9LmMdl2QMhgdlbOMvsjjhERkvUy4jFu6Xsbqg9B4Zv+RTGSMgRcZOjsnWRIaMDJpkONt4SpakibK8zxEZCTBFRj4FslXxCxkPwWAZRyiWv4HNPC9jAUTKOM4u2Y7ytowZcJ+M5ZAkP+tgoowsrjlk1LBetq18IiOomhwZYf+hfIg6faOFd2QpI0/GUEiTbRner8rI5aJDxkIoiVWHxBo+HyNjHKTJeBjGyxYPy2TcDwtleQFqnhgkSSNeddN2nyybcA+WsY/L8qnikAxnGf8MlmWlB1qL9+4vBWqTZYlzs0VGv2vsks8ruF0yvgfLZZteiM2TGyvbOzQOk5EC8+UzDZbKUkTz19Uh/pm3jny4bXG0OqyATFn2UhOiTse5FC4j/guqYhXQ7DZOhcu408uLuiERVsuS0k7ZWAWQUk/1CFkOU+uSn3zqI2VZCXWz1M3P2mm6S5a5kCF/4z1sky29Fc/mGHUx7Q9QNUOWsI85H6outsCjst19BRqy7pCPM2mXFz4aJlsepKqriNO0JcsW9Rs3UJ694oG77k198s1aoG5lqGxrIFc3G3mFurHqELenBT91L7nU4ftejoWom8RWKifLZ8APdla0Alw/80qSUz4/bKIiUgGke7m+QP6+MulrA+XHkQn1kxXQAw14n1PPIvZD+Xj1YEol/DFBgTlSz0HhEPUoqgjYF6cAZpUAOcG6hZAVV8C9Y364uoh6pBAoTVEvBr7QADTlp8eHyDJg+tPF7cCFHwepdzF/wtJWUVr8508uYcvpr74Y3czftpZzQ/vJX9fwcbD64nc0j5FiZy/fkPPmb1/NTL/bJT0MGeqDebBe3RylPka96vcZFWHqZlIbO9Sr1TBfAWRDonoxqpGDCmRQNaVO3dp+WuIU0I/gMd1keLa/9+Cj7B5U0bI1288GaTr/q2vShLIuLv6rrEfV58v8ndT/5b+wy5acLtE3wwAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 32px;
width: 30px
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA8CAMAAAAAPFkHAAAAAXNSR0IArs4c6QAAAk9QTFRFAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGhoaGhoaGBgYGBgYHBwcGxsbGxsbGhoaGhoaGRkZHR0dGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGhoaGhoaFxcXGhoaGhoaGRkZGRkZHBwcGRkZGxsbGBgYGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGRkZGxsbGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGxsbGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoa4vkYlwAAAMR0Uk5TAAECBAUGBwgJCgsNDg8QERITFBUWFxgbHB0eHyAhIiMkJScoKisuLzAxMjM0NDU3ODk6Ozw9Pj9AQkNFRkhJSk1OTk9QUVJTU1VVVldZW1xeX2BhYmNkZ2hpbG1vcHFydXl6e3t+f4CBhoePkJGSlZaWmZucnZ6goqOkpaipqqutrq+wsbK1t7i7vL+/wMHCxMXGycrLzM7P0dPW19na29zd3t/g4eLj5Ofo6uvs7e7u7/Dx8vLz9PX29/j5+fr7+/z9/hwDx/gAAAMQSURBVHja1db5X4xBAMfx2drY3EcRKmfESrnlyH0kFLlyE7mv3Lco5IxCtI4kZMtNrsq2nz/Ma55ntYfnyuvl9eL7y8wz+7x3duaZnWdEpDM40cJynASnLvWPKU2rW0EzA37vLDccjLBGh4Ez8LpPOdy0NuBQKiJPw3OnFToTZoY05Xrx3DlvkmNCZEJm6NdN/45pXmlTsbm+9IJhHuhSEW4yzI2SLtKkZvlvadH2VucKHxX6R/mq0NqqVuc1X/65Ge6cMClrwbh+jlZSW/KOCt90eK6vi7dObRmPgmezeJhFOqYM+HAqa3Rc2w4DU9de9YD3RC8rdK0H7s8O2J66rK8D91hTGnEIarLDgvvouKORhuUm1HYGbvf8fVom1MEKY7oVTms+jngXjeON6Dwv1+zaiyDWTV2sPm33kiddhU7GNlKgT/NglNBNHozUo1GfOKsvRbsaSvToBpoGKBX70Mnd/aTv1L5qZSUM0aElFCvl8vdAYQ+1McUFuFJkNfILW7RpVDOrZLlJXbhP2yvSo/4JFFvIXW26CORK7d9A6cjYTc3skY0u3Okx6W5c8mIpRGnSXGplkcM3+Y48QKUcJ6QLIdJBjjcRRmjSvdyTxS4q1B68diHSIEYIEQNpQojolrdiCC3gYkCvB3ks1x9k+HsNayJHkxZzThb9GigdFZfrZbdvrBm9MnxjFfWs0+m1zNespEqZ4eQm9WySLC86qr/hF/W/JPOpUSvL3gHnfeeJZLlJuRQpEloWqkJnwAz1cg3eNmotPHFSN/9qik/7ta+lQe8A6mw5hoyGKcIwO3kbrkltzzhqKG0vOCyC6ZIUNcf57DCi82GN79b9PhqQHCNaGXKCCaZve+jLaaGHH8dgf+b+4JSudFRRPdx/76CQj7dDto4MOwmTDUbjeEhzlvbsHoYjhvMfV03zYo32hBtQZBfGtgbyZCW/WnnI5dXKzpEPl9sIk8yBiUL5M1ySRS25Qt0fOplJkQKDA6hbpdlg/8t0YVJSUtIVbsniDftksc0i1c5fpZFDdWIzpdbzE3Z4x2LkwqSqAAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAAA+CAMAAAChgZ0aAAAAAXNSR0IArs4c6QAAAspQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGBgYGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaty+CnQAAAO10Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGRobHB0eHyAhIiMkJSYnKCkqKy0uLzAxMjM0NTY3OTs8PT4/QEFDREZHSElKS0xOUFFSU1RVVldYWVpbXF1eX2FiY2RlZmdoaWprbG1ub3BxcnN0dXh5e3x9fn+AgYKEhYaHiImKi4yNjo+QkZKTlJWXmJmam5ydnZ6foKGio6SmqKmqq6ytr7CxsrO0t7i7vL2+v8DBwsPExcbHyMrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4ePk5ebn6Onp6urr6+zt7u/w8fLz9PX29/j5+vr7/P3+lBpGjgAABH1JREFUGBmtwYl/zgUAx/Hv5jHP2OaYNYtoLETMNdcsQqzl6iBnUWIlcpvI0ZAZJaQtR6FSbQyJkjRjWHOFlmvGhrU9z+d/6Pk91zbz8uzZer9VLebWEX6qqUYbCuH26kDVSPcL2J3tqBoIPEvpiucHr7GQZVb1LcfaTzZxME/eatwivFXrtu3ad4j8h82y20mWvLWdMhNkN41iH3lpC2WmyW4+d+StVI7ERPfq0b1bl2wO+MrG9DsZ8lYK6XKYAMtMUp1kGCpvbWavnL6Dk8nrcmCbvLaJfXIK3ordxiB5bQMH5Bb79ckT2waqGtZzUP+DdRzS/yCZX1RVjfuPm/vB1BGRqiyJI6qSwMlppTicX9NND1jNUVWBaeIVbCwXcwoxbG+jClZyTJ41+xXYOzXCJCloUPJVKJ6o8hLJlEfd/oKMKLkFzCmAZJPKLCdLnjxzh9K3VEHz32CtyizlpDwIzuFOPz2g7k6Il9uHnJYHu7DGqZK6h7F0kMsicvRo0ZCghwi7wbXdP6TtyThw8OfDl/j3j6yTp878efbchUt5127kF9wpul+SO8VHLj9x3qyHicezb0PkEAnj5dCwX2xzlfG7zLnUlC8+3/jZJ2uTVq9a8dGyJYsXLpg/d/bMGdPfezd+yuQ398HFGNnNpshfhoB12KS3lNtCbpv1KLUSLFjm1ZLNIXbJUOcodgXhcukCA/RofS9Bepiku8TLsAASnwyZVEiG3IqYKg9Cd8PpYNWHYTKcJ0U2E6GFXLJZKk9837fwjlpDb9mEQKxsGsFQuaSTIo/a5DNfERAjmyArL8umKfSXy0HWy61tVF05Ne7zlFxibnK/o/xhpAzH2V9L0hIIlUsuCXJquQ+ujpLBZ9Zd+KaZ7EYXc2+EpOvMkmEs7B8+aBNskIv5PpPl0Pc6hjV+UtBODPmvSvJJgGu9ZPM9+2WXgl1mA7kMhC6ym1pKcXyf43CwacRx+LHT7GLYGmxOhexWMkzC2kR2Y05ZubjELLdPudyufYfIzl1T4UpPKWAr3C6CVSapUyZcPAR7GskuzMoCOQWFqZzQe7hZmskwrQTujZXBvNwKbPaT05cUPa6HWUWZYjm0mTMzXE4xublvyy38Pjt8VFl0CTt79ege1bVzxwWUyqNFsEiVPJFHXhM5vIFVHpl2w1wfVfT0GUqi5TQe5FmDLPiqocqLu4X1dbmMBV951jgNbs6oJ5eoNCgaJrfRYFIVmBItULhjQkzbpl1fWHwKyO6qMq+Bn6qk/S7KuTq5tsoZCf6qog5zDlsx3EoZUk8VvAL1VHUBrXoOiAxRJS9BoGpuONRXzQ2BhnILGTzqWbOqIQ6C5VR3tQXIHyfvxUKIHB7LxmGLvDYYQuWwFZLaB/XOgAny1iAIk10MzJGN714K/OWlgZC0dHniyo+TjpJfW4Ye0E9e6k+Z/bKrB2PkpV65OaezszKPHT3yN+dk1wZeVLWNhIEyJGJtomrzP0HeAMl3uoVk1UC3EshJvw65gaqJ7icw7ApVzZhHr9+24jlV8B9T0a94882ZyAAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con4 .item-l {
background: url(@/assets/v3/bg4.C7YndXK7.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA4CAMAAACBkfufAAAAAXNSR0IArs4c6QAAAjpQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWHx8fHR0dHBwcGxsbGRkZFxcXFxcXHR0dHBwcGxsbGhoaGhoaGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa67X1NQAAAL10Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcZGhscHyEiIyUmJygqLS4vMDEyMzQ1Nzg5Ojs8Pj9AQkNFRkdJSktMTU5PUFFSU1RVVldYXF1eX2JmZ2hrbG1ub3JzdXZ3eHp7fX5/gIKDhIaHiImKj5CRkpWWl5iam5yen6CipKWmqausra+ys7W5u72/wsPExcfJyszNzs/R1NfZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dy8/T19vf4+fr7/P3+eSKkTgAAAttJREFUeNrtlvlfTGEUxs9UktJiC61SokmkhEoIKVsSGWtCkZKKbJOiGU1IWZPQokWhzTRpaJ7/zae578x9Z+beWfj4zfPTuc8935n33nPueV/yV4qKIaZ4zlQwL5LzgkgJUa0WbJwzfZn3kPO2S2MT7mAHhX9u5rFqwbvIY+2Cl8kwpeCr+UWeEYJ8HtMJQdh/TA5rVpvVzRdAChsS8ppky92kyxWCbTqdj2S5Y1pF1RAvL2+byzIucQNJyjvt2ouBn7+GXtZm+JK7mlc0Iq5nvHiBe1TaRwDf7pcWFly69xnA4C53qEIj8GQLey5FshYwFbumzgNfdvBGah9Q7Yraa0JHuK217Blw1DkVoUfPEntzYQeMCU6xBhjiHN3wUTy2s0JPWZVDCSZckfo1FZBBmWJmBN9cOqrFaLAU5tuDJlLbzZKpSUEaxQDqpBdfBr1fHUvT2344ROvmDEklzq2SKcwe2wcsksYURhyTxU5gmkVRD5gsL74Pl2WxUgywaL3l4S0N8wo3ZTEVDCxa1cKUxIxesTIOWC4QItMHMzguiyUC6dJUPJBljw33C6r3GkaNNHYBBv8qljZkN4J0dAsjAVKUTxe0tl2yosyqfNoIlEhhBUA25YiZ0Xb3NZiMdqSWD6ONnGn1D3Q6NLPfW8wmO8XoMNAeamsFvwHOkgtVAJ9SeGNtJ4B6L1fcuVlAY50BsWoT8B644QqjnXPDsbfm5IE8VdU7AGOH5rcAlS65gJJJsUTTlSFEAW0ylbGV/+67XXrA8KFhf5DwWl4DKj4j6pGoChs2kG/rpZ0wHSGiInOiUnp/u9PI5v7mxka2v63sxmwe0W1xBD3VmtXvfDeNHIQxi4q02haP9m6K/YrpNI+3fKKECXxP8hyjlCmMrfEQK39+ndJnUP4n55I9V//6OJMdZZaGL0CF4J3msVbB2yR7nPlnh97AraKsAzOVMy0n8zjOW+z6a5DUb7XEj2EfmeDdAAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAA2CAMAAACycDqVAAAAAXNSR0IArs4c6QAAAg1QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVFBQUEhISICAgHh4eHBwcGxsbGhoaGBgYFxcXFRUVHR0dHBwcGxsbGhoaGRkZGBgYFxcXHR0dHBwcHBwcGxsbGRkZGBgYHBwcGRkZGBgYHBwcGxsbGhoaGRkZGBgYHBwcGxsbGRkZGRkZGRkZHBwcGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaHBwcGhoaGhoaGRkZGxsbGhoaGhoaGRkZGxsbGxsbGRkZGxsbGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaino4mQAAAK50Uk5TAAECAwQFBgcICQoMDQ4QERITFBUWGBobHB0fICEjJCUmKSstMzU3OTs8P0BCRkdISk5PUlVWV1laW1xfYGJmbG5vcXV2eHt8fH2AgYKEhIaIiYyNjpCSk5SWl5mZmpucnp+goaKkp6iqq66vs7S1tra3uLq7vL2+v8HDxcbJzM3Oz9DR0tTV19jZ29zd3uDi4+Xm5ufp6uvr7O7v8fLz8/T09fb3+Pn5+vv7/P3+pK9UKQAAAoNJREFUeNrt1utXTFEYx/HfyIyaSqSbRlNpIsklhCiUa8n9FlEk1xAq1yKXhESpUJIQRTPfv9GLuVTUzJlWyyvPq+esZ33OPnufvZ+1ZXUEFybJQXBhmSrZYPirir3EIaOR54+E2mcGSdZ+4e3ioMhGJ9C/ZHKyK9cX67xiiJ8eEzlazT05wSKPeET7Y64OuE1qgP8y4hH2Rioy3WZCkmH1RZhkG6bdrkYqlDlAR6hMo1Xrpkmmn/vaLjVSIWV2LTa4YmHyEIUF8yvdRNNFLDabxTAJt9m8aezqgw03/JJXdbtXzPY+hOScawMYCPFDkgFczaeyJEkVAHRXb7P6IXHFtX0AFEiKdUFbQVLgucxI2/MBeiQlAvQXhgQk4YdGgAFJpl7uD0NTegCS/QY+PuWeJNVwJ/UuOI9F+iHzq4Hzse85IEk7+TrTlN8DnWsmIyGF/dC6TCmwSpKywCFFVwI1CyYk6U0wtDdUyoMYSQofYbMkLW2Bb9vNkqRFRz7RUZIiSYosdcLdVEkqo9X9kkeckSRZigahOUOaU+05b0ctUk4n9OSbJEkPqHKTjIUmzxfY68BVnvQC+houPxyEuuQaoDLaUzenp0mSOT7ePDrR9d3wA8ojJCXchF/QkjlatsbH66/NH1XmgrPu3PQEvhdZAp+X6/R7d5vNxX4jR6yFS778OReNkHeU+PJqbhkb5YIvf2ZslCo6vI0l0clWI2Q5HPGsWD3DiYY6TC2cCJcUdw0OGWtK815Cb/3pe1/httlgH5t7xb3HnMdnGW99GaWf6dqXOn3d8j/5N2TLynERM4YkjS8dnuQ+lj2G7DB2hQtIzAl/RqgkxSRESVLEX1VNJX4DmRADv7Vqo6QAAAAASUVORK5CYII=)
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA2CAMAAAClUqpcAAAAAXNSR0IArs4c6QAAAZVQTFRFAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcFBQUEhISIiIiICAgHh4eGBgYFxcXFhYWFRUVHBwcGxsbGhoaFxcXHBwcGxsbGhoaGRkZGBgYGxsbHBwcGRkZGRkZGxsbGBgYHBwcGhoaGRkZGxsbGRkZGRkZGxsbGBgYGxsbGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGRkZGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGRkZGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoa3tD9qQAAAIZ0Uk5TAAECAwUGBwgJDQ4PEBEVFhcYGxwdISUmJykqLzc8PkJJSlBRVltdXl5gYWNlZmprbG5xcnZ3eHx9f4SFh4iJkJGUlZaXmJqbnJ6goKKjpKanqKmtrbGztbm8vb/Aw8TFxsrLzc7P0tbX2Nna3N3f4eLj5efp6uvu7/Hz9PX3+Pn6+/z8/f7+aEnfAAAB/ElEQVR42s2WaVfTQBRAp1AoYhVRRHEJirumtbhUcVesuNPihrhjRVRwX1CpYi33d3sySSbhMJ5mAni8X5I3yc3kvZeZE4GiIoxYgHgt41AyFzPy2BtfrI0YUAiJRpRDYnUoMhNzRIMcz0ux1Otww1yM0UdHrCimzMRYLKrYuF5La12xXd/wPUsnJi3LusszS1Hgm2VZqyIVp8i9IDjMVOSqxhYHuR8Eeb7UEdPX/UROMx4Mn1FBx0Gt2DTKc8/cBxv84ebXDHneJMe0Mx7CN5dPM77CHUwUYavvkdXnGJgH4GmnfP0S3J7nzSuOY8pvq6EfvmeXJXvewSM5d3vYk+LPML+hz72Uq0B1BjiXkvFVeDOq+DRnIbtc8B66+4cTzV5udMOyZrMq5nyOfIZud42crMHX97PwYLUcOAGvLg4EHFWblRBizQTk3Nbcgo89CbF2BN7KKqWG4UqDbkMOe+I4DK+U3chDOak1ldj0Unltv3jc4l3vg53CNwe0M+6oep7YT61D3VDmjvDMmW1aUXT6J2cZC244xaR3lrL0ORosq/9DbLFt+wkvbMVNpm3bXldX/Msut3fpRJHQEq04Rj8PUWjdrthkJHYFOQ/+M3FL2uGSFLPNUdkIm+UTClI0YhHEXQbkw6IJXQsQxx46fDAXgz6akM4oukVc/gDJXaMPEeEHHQAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAABACAMAAABm4HQzAAAAAXNSR0IArs4c6QAAArVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaHBwcGhoaGhoaGRkZGRkZGRkZGxsbGxsbHBwcGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaefXWRQAAAOZ0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ2Nzg5Ojs8PUBBQkRFR0hJSktMTU9QUVJTVFZXXF1fYGFiY2RlZmdpamttbnB0dXZ3eHl6e3x9foCBgoSFhoeIiYqKi4yNjo+QkZGSk5SVl5iZmpubnJ2en6GhoqOlpqeoqqusra6vsLKztLW2t7i5uru8vb6+v8DExcfIycrMzc3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6urr7O3u7/Dx8vP09fb3+Pn6+/z9/v6gHUxNAAAEWElEQVR42pXW6UNUZRTH8d8MKjFkijoTblGampiaqUkupS1ILpVbaWqZK6YilJrZohmmWKhJuZRFmeZuhSWYW9mYikCJbLLEcqfv39GLO+PMMKvn1TnnPp97n3ufu0mhIr5Pr1jdaYzc3wT1Xzx8R8jyJmY0z74TtQluLh2buqoBFkWvsuFIoiT1PgOLo1UfwSGbmTuidpaNXiXZi2BJNCwdDtu8pb0IXoys+hsct/k27L9TY4/ItlJ3v39nhBHFNMvIbt06zNFIygYzJUkxw194fqhVkrSG4kjMAeMlWeeWAhTPskh6napIzA7jpbgv3TcXn8dK86JiaYo7AIXP2B2pZ+Gb2GhYF5gQ9z3ktJOk2O2QH7uAykgsxiB9P2yxmKV1G+R/wh8RF+AM5ZBj9ZTWXKhjV0S2FNhq9dbWXGBSRNbhHxof8W1McPGzJSLT441UDPaWaU383TOykp72deObuJEcjTKde56p0alus9blHb1Y4sK46nRevlz2H0aJ88TuDbO7hTadF/9EyDi1pFNQFLewCjDOHchdnZWV+1Zm5sqVGRnvZq9YkZmTX2gAlfPvClSjr0HLvhmO4BNxTPvKgKsprfuzmmHfQz6NhGEJ7R/r4tNI/hoap/ur96FszO3KNiX3gouUZHDmzbj7dvvJcljlqxbCr909Rc+1lQCkJANwa3OSZ0vSGZjrVc8aHIt35zHz6oHCXSbbUwA0LPNci/YFtDzhUd1ruHKvO7/vR2jIGax+Jhuu/u/Vw1nPAbuWUOm5ap/y7yB32q8YDiZJXib12AM3RrgHDGtmvfsSGaxxNweV02J+mnyYNL2JuiHuIRtp6iVJ2kul+wZI+IvGCQpkGlXDdfftlVjLNkm6p5Gl7j3txZWqYEzjWjjpfnZXcytW0mToYzam+ixLK6ZX4WUzexSekrSDC2bdxklB21DMcoJy81Qs18iW9CfvmFumwViFYhps8JqZbeEXSQ2ehT/NSYVm+o5zZpJOmZQAE82VhCnh2EQYZi4HrrbqB3MkSS/hSgzH2tUzT5KUCV1lv0ZzmiRt55QC2MZF3iglT5LmwOl46cEyGsdKOsKOQOYflyRNdXHeIUnJN6kfKZ1nrQ8bByl9b7SKEqsmGzi7mkOGVFP3iipY4FVDq6nvpYBos7yF4tuPX8otKKzlYz81RlPT/WLzD0VXoKSvdy8DLgIc81cZwd57J3r4Hr3t9PwGfmutakp9w6B2R2rAR2Q51TH+qiDBb0ApWYFnq1EwNJzqC2lBWGwtH4ZRWkddxyBM66nvHFrFV7EpmNIDBm+HVFoBA4MybceoCaUGNrM7uFKXMkKpDkVUJIZgei6Ush0L+y+6+omgynEEMhUuMsDZWo0ugQ1hlSXLBTsH+LaS81wYb0T6Mxl5CTg4s7dZJc3+1gXXRyli2DKrAcqLDh06WwFQtaxjZCWp/dxTLs+DYhyf3yEqJEnqlJb+wc7P1i2Y1Dn49v8BUIfpizuTif0AAAAASUVORK5CYII=);
background-size: 100% 100%;
height: 32px;
width: 27px
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico5 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAABACAMAAABm4HQzAAAAAXNSR0IArs4c6QAAAuhQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dGxsbGhoaGRkZGRkZGBgYFxcXHR0dHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGhoaGRkZGRkZGRkZGxsbGxsbGhoaHBwcGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGhoa8hNQ3AAAAPd0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaHB0eHyAiIyUmJygpKissLS4vMTIzNDU2Nzg5Ojs8PT4/QEFCREZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV9hYmNkZWdpamtsbW5yc3V2d3h5ent8fX5/gYSFhoeIiYqKi4yNjo+QkZGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i4ubq7vL2+v8DBwsPExcbHyMnKy8zMzc3Oz9DR0tPU1NXW19jZ2tvc3d7f4OLj5OXm5ufo6erq6+zt7u/w8fLz9PX29/j5+vv8/f3+/vwH9BgAAATrSURBVEjHpVZ7UFRVGP+duwvrZQVCZeUlqPlEfEw5+QgqozJTEx0bzJpMRxudTJ2mJk3/k0zTBh+oNb4gQHECDS0UsVFSBx9TNI6jaKnxRoFdwJUfEyu3Py4Ly+XCXqdvZ+fe33fu73uc75zzHRN6EuvgZ5qf4CnlxewGsu5AzFORxBdUpXHx07C2keVrXp2xrp5caZy1lTwRAgDPXiE/Mcr6hvzJT323FZGrjLG2kLl+bhRslLfak6XyFnhnjXIy3+qpCP6TNcFeadtZO6SrZpLTQJj3uE2ryuUprcqswX6huA4AMD03VLlb3AYAV98Y6o1mBeoASIu/DANQtukHBaiHv5Ym6VQAkNNSwgAg8rv9FkDp/o2kl5+cOR/FcyKj5t3AwlSLaql36U/OlnPIZF8AsOwmsywrWOWNZnJydTaZ3G5fSiGzdvK61wIUsYxM7ohd2kXW8qCRtcXtHhlLu0gmeKUF3KdjgqdiVjMLhfdFOcXBinGdcGYD/4kysgVed7BivBu81cDSaGP71IM3oweWJuqI+CHh4aH+YcJV6YKAPFB6UtNSVVn919nyHmn9F86b3GMI17Iz7Ho0ecn6IOBJSVlljQsR1S4oUBAg18AUGho5zgTYkw61dLP2UgnZlPm+Td+XbWGGk7zVLZhFjWTGqN4mKvow6Xivq24jee9lbzM8rYxc76n4mLw4yHtlBl8hl3bC6U6eshqpqP95Nr3iBoNqeHOgsZUQ/jcr3bO2g/axRvvDxEZ+1T5FTm4w3o22sGEoIIDURPtYu+4ngcstAgICEtSn+D075Lr/gZUAAhxco284sIBauQqs5wMLzIjvg1/0N+yPsbjTqkCBgjYoUDDS+gjI2xAQdxbYyz/0WfnU5nyOWwFRwq0wIxa5AA695rgjICCEO42oYdiUZHa1H94uAGgDACVvxWSYEYZKAGMHDBiu9ff1xqjDm09a0i8dT4hfUt+xYUoRDnOQHx4CaEJFIRQoaiqKAgU390w9Yjs4IWr2bMdmcT7xpvtUr0WIj9kGBAOoRtFSrbfE7y3/flY5H86s4KRh5xLPt3sLh7AhuISNM4FMpmtZQQ0sjwOO8RiQUMd7AgX8FlhCXrJKtbOqfDPi9bqKABTAJw6FgEWCS4ECgXdTcGveYwDR5ayLS2dGN96CBjZ++AI5VVpHVsUCZ5ic4OSNcHV4QjXrLjNT5+JVytq1rLc838Ti4QDyebGJtzta+6QakgU6JY+6ONc2dxmwLCcIAC6TvDuic3h0MXlBb6m4e7QJAPAbeSayy/AFHkVESsoQYGBSft66QGDivv1WYPTeotOfysCc9N3AaeZqjuM0HsEYciL63ybJazLeJvsh2k6SxwVWshQ4xR2a3q2of4EPIlvTshAzX0Wr5MadJ/FmLBS1HkITvAKh1i4G55ZjXPRIFY1H6lqfB/KIC73fFAR88Bh4BF83akZrKyStt84gJdW+4hFyR5MQni9dvXVRu1HHmus0qcmtXVuOKXHmGFSo6H7MrF8HB+ChV28/KyFn8vq25KsoBzEF+1BVqPUmab1d/qgJqFtUoqKjnzcDt95xdEuiXfYzB1K/IDMA3zGjTABMfjIA+I6MAAAhCeAE93TLzSSLFmHpA4Fy9FVPIVlAwA6b+1Ty1Sn3dLuRa3tvF0Pj9KmDoHj/tT24gf8j/wFtkTXADxi+NgAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 32px;
width: 27px
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico6 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAA6CAMAAAA+5Q8xAAAAAXNSR0IArs4c6QAAAtBQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGRkZGhoaGRkZGhoaGRkZGxsbGhoaGxsbGhoaGxsbGhoaGxsbGhoaGRkZGxsbGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoa99eAlwAAAO90Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcYGRobHB0eHyAhIiMkJSYqKywtLi8wMTIzNDU3ODo7PD9AQkNERUZHSElKS0xNTk9QUVJTVFVXWVpbXl9gYWJjZGdoaGlqa25vb3Bxc3R1dnd4eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbn6ChoqSmp6ipqqusra+wsbKztLi5uru8vb6/wMHCwsPDxMTFxcbGx8fIyMnKysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9fb3+Pn6+/v8/f7U/243AAAEC0lEQVR42q2WfUwbZRzHv1faCohACxtmRaEDJ25DQNRoFBx/TA3DQIKbMrJsi4uR6HyLiv7nNLLEJRjjNkxkyWQZuswQjZnRVIcvS1QW+aPwB87h7Chv0t4XSZpNurXm7vpyK3ftrvWXyz2/33PPfZ57nt/Lc1lIIfll+YEQMpKHh/ykp3dtBghrLxXxtqTPOEKOP/1AS4+P/vYMGB8WSFrtGP2Pp8Ww9JMHsxR9bZoUy0fkoayo5XRTTIPyLnnYHDedbvoajDIeJPvN6g7nOY5lG4Qc4+/2a3u2kAZdlDvPFxL7zvKgzmizdrfDijHFz3WOq5PjsvprZaUxSA4gSoiul6RAmdz3JQAiTwdi0u4Oy3fbyTflYKsY6DElW7z+QwG2oUYMb3Fu3DmFrgOmCNiAbCTvsp0mu+VJ8gfIXtM7/MkYpJTc/h35SsTM/ph87xg/NQbJOs/z5KsxW6LM8S2D6zlA8jWVnX2U5N0GIbdO01Ou7thJHjGcgC0i3c642SnyrM14Gm9TUzpEjpamU5W2inRHKvSTIkdvQZKQ0pLKhopVpSX5qxCcuyoAeUUILlz2zi6MDS9cJ8TR2bpeb87QmS9OBFJDCrv25gDL5/70iSHcPCunUbjoyiIsxcW3VQGY2/fZlVROmSRn+9oKdQJ5x3GSP9+eFCG8LFJ8vyzZkHuGyIubkwww95G/1aTyWpuX/t36j3vIT+ypfV/tptist7Edh3Hy2SAsBYLcL0CrDU0BJV+XBx4d14Tc6bK6mwNAzffJPsNbDaDKlee5/5JWZeu2ijsCci1NJj7pNrEHZbu0CnVjM96+KCl+4IMzcnhI17Xti03T8uBvPm/rPiGunOJbjloVbYa6mz/IQ4pS5efrK5dTUY/9y4oqolgP4sCSokwMYttKyCYEXbFlF+lBihBdw1dwrl8BeQSuxagDUKAHsUk7JsuPl7A5ESI04nS07x+oUsf6RGPcyMmN+S7gQk0ixH4DZuIQR/y9Zxab6mKGXXoYkXmUJUJWA3/HQ0G1sablYDwgC1WQGaxJhBQj/qYPqgTqc4yMxox8FaQcq7MSC+IFeu+N6K3kTTrVhoyW/DfIwRUHef0UPbWK2kCWa0M66I+8uJc8pfGncd80J+9QMpGs04Y8x0lF2U0OF2ok4C/b/7WfekzSFuXFa4ldCZPc/b2Y2LqokYD4YddR28DIyAVYgfZKVSExxQrKJmQ/D8u6h0rwR7tPVU/W9ceLzo1rzNd5sF1eCkXnEJbqzTnV6ZyO2apfWgvMYeA4E+rGhqIwQkBYvstXCILSzv+VUGfqWwXZFbXIQPbQA1MYmYogu1jIBBFO+gtqQKSN7WxKcs6kajdAkIPtqYy/JDirdTQYaMPE/yL/AQn/nlzVMLtOAAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con5 .item-l {
background: url(@/assets/v3/bg5.EqAxWS0a.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAMAAAANIilAAAAAAXNSR0IArs4c6QAAAbNQTFRFAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcFRUVFBQUEhISIiIiICAgHh4eGxsbGhoaGBgYFxcXFhYWHx8fHBwcGxsbGhoaGRkZFxcXHR0dHBwcHBwcGhoaGRkZGBgYFxcXHBwcGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGRkZGBgYGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGhoaGhoaGhoaGRkZGhoaGRkZGxsbGhoaGRkZGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaYKSRzgAAAJB0Uk5TAAEDBAUHCAkMDQ4PEBETFBUWFxkbHB0eIiMkJSgpKiwuMTIzNDg5Ozw+P0FERkhJSktOT1FSU1RVVlhZWlxdXl9gYWJlZmtsbW93eHyBhIeIjpCRk5SVlpeZnZ6jp6mutrjCw8TFxsfIzNDR0dTV1tfY29vc3t7f4eLj5ufp6uvt7u/x8/T19vf4+fv7/P3+HFNa1wAAAi1JREFUSMft1vlbTFEcx/FPqQxG2m6MZQaNpGiUiazJVoRsyXIThWQZIaJl0rQwTNP7T/bD3CbPjOiebD/0+emc53tfz/O9555znyP9JLlWoEhmCdgxYOhKoXuacylJKrE61/gGzNxsrmnthmTYpT0MfVskSaFRpje6srnvGFnvjPfMcccVroZD6cltpvLd4IskPelJPexygzsZWJhY0OAG36VvYeKBYyv4z+BK27btQcbtdLqg17Zte82v8VEWy4Yl4Uc9b6Lve9J5GI0+7Xm5VPyj/sJ/Fa/aGd5sigPPgHvrjLBnCIAuI3yaueNFt6DcBF/llVQOIRPcSny7WmCrCbYm+ToKj3OMVrs+BkR8ht+5dIT7+cY7LMI1rWAX2NpU+G/OsxFe1g/QHPvOLpYC/T9ZGzLOXlVgnIll4/2WSdpTuMJosS58h/1hqaraKZwpkc47FzHvOck66RRqg9IRXyb2jyUaq6amU7qNSHEHvR5J8vbTbg3SkrqHxmPB5uSwLwsz+5k05iMLmBhpzEySLCz/BMTn224Dnsy3/Zx5K9UmYCyrbVXNwGyj80wHMFDi/BDeAu1OoXkOJoOZuHKKTxMkUnfM6zAEkUJJKh2ED3BZknQiyfgXYjsycNnr6Wr/WDQgSWpK9nra6M6TpIIHtHj7EwclScHYsC8Uf1GU2XbZbskfcLqr80gNealxwQHJu88pBH1STXHWO5tuklOVJun8DQfDHK8OGGfbN0W21rQF0iFVAAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAuCAMAAACvSe/GAAAAAXNSR0IArs4c6QAAAORQTFRFAAAAAAAAAAAAAAAAAAAAMzMzICAgGhoaFxcXFRUVFBQUHh4eHBwcHR0dGhoaGhoaGRkZGBgYHBwcHBwcGxsbGhoaGRkZGBgYGxsbGRkZGRkZGxsbGBgYGhoaGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGRkZGRkZGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaTYzvEwAAAEt0Uk5TAAECAwQFCAoLDA0REiMnKCkrLS4vMTM1OD0+QklPVGRtdnp7fH+DhImKi5CQlZydn6Cho6WnqaqusLK0t7e6vsHCy8/R3OLm6/D5JIZOigAAASJJREFUeNrt1VlPg0AUhuFDB9z3VlzQ1rpXxaVYtVqlo3X9/v//MQykAk0snKGpF76XkPMkc0IYIlXF5rVKUR/g9VUg4DIO0IgDu5S/nQCYcYI+ce7krBwBNvP0uC8Q2J7Pnx8HbMb+HooGFlqqAyLRGt7iILARLkYSWRn2tzkIrPiqUyLhD688gh1oA8sd1Qkb+FkiE1i6Ux2Nbwf/QIaByta6HuClvhFtoIvnavVCA3jtXyzjAh7RmQ3SW6LKBg5rYWfNq+ZlLZWTBNaix7048Gs3SeA4frEUA1CpnzCFKUqpjCRgpF9kzcvxt/qDwMS+FQL1Od78E9qWB2m4eGEJ5i3QvoZ0ATlNXOEN74CcYi4hEKAxHwka80Tmnt+YpJH0DZhq6TgD/Ay+AAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAA6CAMAAAA+5Q8xAAAAAXNSR0IArs4c6QAAAt9QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGRkZGhoaGRkZGhoaGRkZGxsbGhoaGxsbGhoaGxsbGhoaGxsbGhoaGxsbGRkZGxsbGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaU0yUGgAAAPR0Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcYGRobHB0eHyAhIiMkJSYoKissLS4vMDEyMzQ1Njc4Ojs8P0BCQ0RFRkdISUpLTE1OT1BRUlNUVVdZWltdXl9gYWJjZGdoaGlqa25vb3Bxc3R1dnd4eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbn6ChoqOkpqeoqaqrrK2vsLGys7S4ubq7vL2+v8DBwsLDw8TExcXGxsfHyMjJycrKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP19vf4+fr7+/z9/lcEE90AAARdSURBVHjarZdrTFtlGMf/pzcKQ6Bchs7q6NgG0zFgTGdMFMY08EHZmOhQYdGImWZL8BLjNRpNRoKJUwwmG5sBs1Uy1DgZH3TZhjo+zIVEQz906ibhMu500P7rCMXWD6eXQ3vOaSs+H/o+z/ue8zvvcznPe6pFFEnJSXF7sSKp7HaSYy3rZJZ0MSIMLRRlsip8Sd86N7orJsYX5O8vPlDVPE/nE2GMdpKu2tgYx1MBoPgKnXsjGLFQ9B3kEa2or1tO0beT58hwtAyjnTyqDVgWO13BG4R2sm0vudFO52OqkI/INkkCLHbOlwaMF9imqyETLPbhAjXGg2THsiRaBnnFGDAqdKghE2BRZaCTf6Uvn3mUlKaohkwI6Bp5RlIFWh3Lp85cRbnCExXq7nYDBsQ8l5iXrtoAAJfWb4gPkgTMAjAcfDUVwLV3vwPgQLICRMEdHwDA9O0HqQCQa23WqAVQeVGA6UwpLlSa8+pGcOCwxg+ObycaU3cRmnb3zV0/vb0bDR9rtCoYWTGT9T+Tr/tNo5X8tJNfK6RYQbRDHCLfCNpGKznLQ/FBcJjkmxLbeJLkvfEVGz75G85Oib1wAfjmcryNscpFuyVk7nPxNxPidAd4Ukqpc9FmRvwQ1Lpo93fop1203bF8taSpSRcqKTlZX5a72nxrShY8E/8IQHIGPNMLI+NTtnPT8nUZ+fLtq75LaXfei6e/dEeHpB1sTAQW/7g27fDitjHAB/gyluagz8zamA9g4r1TS9GSMkzOHNuTplDIz5wi2Z+vihBec9H12Vq1S7Z3k+MVKhfojpEDRdGytmeSzgbl5Wbyq/Toud9ip+sRpcDWHUHXfg/0qQIgAALkRu8IkH0+x/2QTRZS2GsYeNgNFPWpbWM0H8Cm3uShbTflmtJbBketG4BD1ZcZALA/i7XPye2krAeNnwPAqkm0XIRPrJCw8ZXyHvEQP1E9XyDztJ9oM4jaNBWD38WjorLJybcj3cktwaFFUXUgU7FtYl5U7FbURkJ2wvN90O0MJUhGMGI9sNwdAanE2Tm/OoI0JYgJs37tx5uoCIcIpTgfmJuXQgxPlYWMxCTc8KvusygKh6Qn4Hpgbg6SJnbgRvnWoJEOBLaLCeSEQ7KBqVApSAKrWfRoJN4EAguMYU04JAuhO2cgeYFazb/0B41UBN1BDlZrwxviKCfv8+vV5C0K3YYMtPx3yK6I8+aeCY4Vi2opmSMPqaPTf+NL5A8yXxr3T3FY7K2F5FZ5SCOHRaWB7JOtgx2zHNkFAHeSO+Qh7/NXAEj6kOyXBF/ypdRbf8JkvXxpEAbg8Q2SRqIJNpRyGF+GPq8sG39WzUje4ryOUNNZtSbWvw4LTm/gGYJziy6xAP9BjMaQrofOB5x0hPWNzZk+eAGv+At44YUgjpODYX1m224BKCSLsQLZzzFofFipCNAoHuoxik/1EzQO0fmA+p0q50y0cTME6AA8v+KdeMbljoY4Rp8D/4v8C2Rr2YaJzeY6AAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con6 .item-l {
background: url(@/assets/v3/bg6.hlVmcDno.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA0CAMAAADhcastAAAAAXNSR0IArs4c6QAAAtNQTFRFAAAAAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiHh4eGxsbGhoaGBgYFxcXFhYWFRUVFBQUHR0dHBwcGhoaEhISGRkZGRkZGBgYFxcXHh4eFxcXHR0dHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGhoaGRkZGBgYHBwcGBgYGxsbGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYGBgYGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGRkZGxsbGBgYGhoaGRkZGxsbGRkZGxsbGhoaGBgYGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGhoaGBgYGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGxsbHBwcGhoaGRkZHBwcGhoaGxsbGhoaGhoaGxsbGxsbGhoaGhoaGxsbGhoaGhoaGhoaGhoaHBwcGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaHBwcGxsbGRkZGhoaGhoaGRkZGhoaGhoaGxsbGhoaGhoaGRkZGRkZGRkZGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGRkZGhoaGxsbGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbHBwcGhoaGhoaGxsbGhoaGxsbGhoaGxsbGxsbGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGxsbGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGRkZGhoavoj1/gAAAPB0Uk5TAAECAwQFBwgJCgsMDQ4PERMUFRYXGBkaGx0dHh8gISIiIyUmKCkqKywtLjAxMzU2Njg5Ojs8P0BBQkNERUZHSElKTE1OUFFVV1hZWltcXV1eX2FjZWZnaGlqa3BxcnN0dHV3eXp7fH1+gIOEhYeIiYqLjY+QkZOUlZaam5yeoKGhoqOkpaWmpqenqqytrrCxsbKztLW1t7i5uru7vb6/v7/BwsLDxMXFx8nKzM3O0NHR0tPU1NXW1tbX2NnZ2tvc3d7f4OHh4+Pk5eXm5ufo6err7O3u7u/w8PHx8vLz9PX29/f4+Pn6+vv7/Pz9/f7+0IfVbQAAA+dJREFUeNqd1vt/W3Mcx/FPLWJh7S6oDd1GU9cwVlUUXeuyGcNqdZvbMJvLrJShC5u6TNvJ5s4uGGHMjKkapi6rYG4TMdpVl8qWNssie/0JHueW5iRNT+PzSx7fT87zkXPO953POSJ6HX1SchVKVrWS5IrPzfn/GJoOzAqv7DvrU73wYUH6QUP6gXmXNXV105jU2b8O/KWpxz0Y+6z2jJTe8F/UE33T1Lw2QuT2QlNtUg+7I7EeL7kez3rYtAx4x+PxzE7cqFI/abW9oT1p9ZuMVD46RBboneXDDF0QTLVd+VKdintoE5HnIPr6Rmg5ytCn3VfaVy9A8HCR82G+1nBruAVWiMiCOPfYHoDtZf3c09w47fkixRHip2ud2Rq+6h9VHxrnSpEZYaIz03HOj7hVyyLpwwVwk1PRxy2EI0WkZBt89WR9arUSurUsBt/U19dPM3Ah3C2KBvZVKt0xzVjU/SYsTj/09hK+5ArPK8eM8we8yeX7e+un7RADtnm93mAqluE3TB7mChAHIhVyQPLlbtB+rm7IhBvPUdbNaVitMuATiFWk2N/98H4iPRnwdDhRSUuy3gCd+fs9y0digR/nW1GzFikyWi8pVmQWFFjgR/W0wIt6Z6JmiyPExlrgUUFNf8xSvXM8XKplo9bqtNX9XiElUG102nh6qGIfE0usauWvWKWvHd9DqNtkM2Nx7kSJQ7hS5OqaSSNWa3ucbAfAMuph9wUTA4Qr1wP/wsJT5jwzRQaJ1XIF2Ad7lNmQPoKtsLj2Qufokzuokezxu9r+NvJF9vhyPRs97Mwez4QiLRvXZ4+dcLFqX5XssSPIrpd3g7rf2eDy8qEOPRvPK/stY6ceMlj8GoQCsHTOWz9fo+z33i3wR8XgsD5z3Ho2XN3q0jRbMmJlbpx9L5xlNFppqaoz60xYnTliC2hfi8hhMEOdDrFJVvhmPRshvMbdg9XabPk1zwIv5y9t5jDN2LMt2mxZrIzGgfF1REeKeW5os0VqaLdZ4GNh7VzzzFH1msVdvD3QNR/hEEd/c8N4ju2pFBnt6B8/we5VX8I6byRyV2rQW2hr2EFv0+dsPVdEfqDT5/P52hPYeB7lSO7BaWG2jRFx7Uik5ae+14pCmKfYjts202OXjPUI4cYGVX/NujvVukV5M7hQy0YxlGfGG2nS0lLRnIiQgpdp2SiJMy+jzYU1Wlo6NptwiEC+SHUUaqdnqioffCAiD8GfJgzviRTHrF4m1LScmXitSOD4rIsi1hZWTV1rwmK3j4uq3zxlH7hO2KUetsRutyXfjSlvRIi7xaqc30Hr/BFp/bzzJlhakYMmF5nW/wHDiRiDSjYLFgAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA+CAMAAACsn+1dAAAAAXNSR0IArs4c6QAAAotQTFRFAAAAAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaOCgURgAAANh0Uk5TAAECAwQFBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYoKSorLC0uLzAxMjM0NTY4OTo7PD1AQUJDREVGR0hJS0xNTk9RUlNVVldZWltcXl9gYWJlZ2hpamtsb3Bxc3V2d3h5ent9fn+AgoSGh4iJiouMjY6PkJGSk5SVlpeam5yfoKGjpKepqqutrq+wsbKztLW2t7i5vL2+v8DBwsPFxsfKy8zNzs/Q0dLT1NXW19ja293e3+Dh4uTl5+jp6uvt7u/w8PHy8/T19vf4+fr7/P3+fNOr7AAAA5JJREFUeAHVwYlb0wUAx+Ev2zhcQZgZTIEyCo9MsYgE80wEs8ikpDKPMqjMzDCLLgU0ZKWUmlGmIRSm0qGWRyqp6SRImMixz5/Tw/ihO20bTz1P76sbi0nPsCpyqduc0LMnUxEqbsetZ41JkZgLnesfnfvaH7BSEbjld46nS9KIfVzJUPhepvdBuY1qxa7w7aFJhs2cU/iOUSnDMlwWhe0QtTKsoUvhq+FsjAY0cFDhmwVlciuCFxQBO66NVslc2sX3ZkUg8QR0HWi8DI6xioi10kW/XcmK1OS12z4rn67/J/P08h3f7Tc01VXOj1VYZh/Bx9lihWGVCy7W1VQP2nkGqLYoVMuh/RmzPD3SAlUK0T09HE2Rj4TdME+h+YSeTPkZeZGfFZJhTt5WAIthgkIxDTIVwE3dLFMoFoGrLxB4U6FYQlAbFIpxS4LK0X9utsORpKGYBzYNRR7YNBR5YNNQ5IFNQ5EHNoVs1Irq2g/mW+QhD2zyNG39VvuqsQokankn/Q5N0HUfwmO6LvkL+vW9FSM/UTvAdaKxDboKZBhWBfS+apJh4iVw7j/cCz9Z5et52HuHFLXQwYXb5JZ5DP50QmOa3KJ/oKvEIiXWwEb5SOqgPkr9JnVjlyRTaTfY40d/A21Pql8pFMqtAle2vC2FdA14F2eclFIPbQslmUquwscJko7ytQZYHVTIWxUtMsyDe1XYCg2pcsv8FU7nyNJHqQxf0Shvdg7I8ABkx52m+xWTDMOqYJ/iYbEMW2iWt3U4LRrwLKQq95f75SH/RJr0F+/L8CO75G0mPCc3y0GOSzLLi1nSds7fKrdcFyvkzdTA5amSFL0BFiqgKT3UxUvS3b9x5mb5GNNB36bCnGXN8KmCeANaXno4f50T1wz5md7CgG2JCiK6vA+39qcVQEJlG3DkCd1ATpMLrtSmKLDo9Mm36x8kTsyI078hbvyMOYMeSlNASVlzBs26L0Gepu504ulU2XD5iF15GE+99Qs0KHYLfloL5CXzFH72jpBbTCM4Xs+9K23Q+AW10FcsD7lOaHhqUtqgO7NePAknR6rfJvg8Sd7yz3E1S9fYLtCxNEperBUuvo2SNMXFbvkZ18V+XfMRFMhPORRJstM2Wv5KIFuG4T3UyF/cMZol0yXeUQDR7ZTJUARjFEAxpCgZtq4O5BTbZVhL5+pANsBMTSKoJhk2E9QiTTwf1JcyvHc+qMf/BiaidyHImEZ5AAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAABOCAMAAABG1vXNAAAAAXNSR0IArs4c6QAAAqZQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXHR0dHBwcHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGBgYGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaJuXLtAAAAOF0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBobHB0eHyAiIyQlJigpKissLS4vMDEyMzQ2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlbXF1fYGNkZWZnaGlqbG1vcHN1dnd6e3x9f4CBgoOEhYeJiouMjY6PkJGTlJeYmZqcnZ+goaKkpaanqKipqqusrq+wsrO0tba3uLq7vL2+v8HCw8TFxsfJysvMzs/Q0tPV1tfY2drc3d7f4OHi4+Tl5ufo6err7O3u7/Dw8fHy8/T19vf4+fr7/P3+qN2dfQAABIBJREFUeNrdmPlfVFUYhy+LBIgigkKoWba4VCYpmGFmWCIKoWimpYaSkaQSFphGhVRuRRlRuFSYEBahljmhFqAi+xYEM8oyM89/0mdmmOGcOyvzY9+f3uU+nzvnvOe859xRFO8UF+8lOOGQ8cZ4r8ikBmhd4AUYWQwcm+zNOy9D3XPeDXSl/mCwl3Ok3O/RU+FLVo9qLMObftKAoMWek2v7wTt0Vj+6vbFRkTaN8xj9ib5HHCYmuiOjIdNhYlHv676u0aXwuMPE71A9xyWaCNEOE7N/haGce7xBFd+MPqixe/HCLKuOQq7Nmakq+GnaI9RoFg6VoH5ufapijxq7LfpXq+2xWL0OUAfKotsuNvP/jo4LmzEt1G+saFjKR+W3zTUx1H6fuzzIY1T3o0Gu6d0zHqH+J81Pd5TmbVm7YmXa9g/KdOZAtvu+8BdQmx/vNxoKWn2kHfglziU4rQo4b/+Mb+p1oMjFSbGoGf5McjyO9Gb4Y4YzctMA+kw/Z9nxhdDqpK+9Dd0uj4Mdwwyuc5R4Ba495HoOl3Vyd6F9OG6Qmknu5v/hbprsGsf0Frpmua96gp7fguSQzwWGn/WkNb8Bn8qRjbBTjgStyS8+d+LgqkAVexTDXNEPqOeyjxgIO6AbWb/9eaESOrmb71Q/Q1reCZ1AQ/nX5Y1A21J12xMCEzs4J2a36jEcn282Y4qMDG+SRtLAhVHvNVggT2NTrM17uo0h6Yr0Kjxpc6rQiOPspFlcrA+00zJB8EMGOGS174V3hNR7GGKl0T0DOaJ/hhar+TLEjCYCtXymKkgJ3eKhvBWsx81hbguVSZIHbtJTsFxwIw1kjJgXpdccoNFup3ewT/Q1thXVy24hXkrXWbMSFUVJsZg9FMkDqBxZH5AmxM9b+2C6Za1YVCaiedx02Nq/orPELNO2T7SYPRwW0V3WLj8PxGJk0+ajHmsvb4r+dvQWYy6IPTBRWqNmvQDLpE7DsMW4D1YIcb8milXoKep95B3QZTEmwQYx8S7IDTUNqQSKsp/6EauLvWIi5G8GfhiduLSyAWrkpvItFSNWNV/InVwPBTbvBAyqbl5XKRyxPqZFvrelgDFFUSKiw8xbzJioOl4sNTdpvTzFiqLoaQ0y3S6/VJQputF9YptgrA17qpH9cnLYvAvNqHKEBhV6VohUcF2N7rCh+9Ro6BDvi2fGYs/RDPHCGtxElQpt1Gg0Wv7RaDRtKjSk1bpvzNoGyTIqSkZzQDyy/K9xVTxYPywQJW3zKC0l6kru8eTIUXy+YfhBOVSBcY0naDbkq0JTb9I/zz2ZaqTS7ovlMS31Ue7IGC11EfbhF43cmu+aTNY6+Wk7DejWuSL3GNE+7ziV1IcxN9AZGFEMNx51lp1TB7c2O/xwCn6rF36e4vwnhZ8Grqyyu3YFbWkEfUGAy5lYdsl0LT2WLHxQh28uNd0OTs12u1w21JrW7Z3KT3Zte2lj+u7jF/Umv3qJJwvGP7H4jnyV7iiMUzxVQHx2yZU+I+i7Ln2e+YSvMlb5hHj9F4Jb/Qfbt6tIIlhQ6gAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 39px;
width: 29px
}
</style>

View File

@@ -0,0 +1,66 @@
<template>
<div class="mod-total"><h5>实验室已为超过 4000
家客户提供卓越的安全服务</h5><h6>即刻行动与实验室安全专家一同开启智能安全之旅</h6><a href="javascript:;" class="EASE btn">申请试用</a></div>
</template>
<script>
export default {
name: "ModTotal"
}
</script>
<style lang="scss" scoped>
.mod-total {
background-image: url(@/assets/v3/num-bg-wave.png);
background-position: 50%;
background-repeat: no-repeat;
background-size: 100% 100%;
min-height: 270px;
padding: 67px 0;
text-align: center
}
.mod-total h5 {
font-size: 28px;
letter-spacing: 1.7px;
line-height: 40px;
margin-bottom: 9px
}
.mod-total h5,.mod-total h6 {
color: #1a1a1a;
font-style: normal;
font-weight: 400
}
.mod-total h6 {
font-size: 16px;
letter-spacing: 1px;
line-height: 22px;
margin-bottom: 29px
}
.mod-total .btn {
background: #4bad52;
border: 1px solid #4bad52;
border-radius: 6px;
color: #fff;
display: inline-block;
font-size: 14px;
font-style: normal;
font-weight: 400;
height: 34px;
letter-spacing: .5px;
line-height: 32px;
margin: 0 30px;
padding: 0 20px;
text-align: center
}
.mod-total .btn:hover {
background-color: #7aba4a;
border-color: #7aba4a;
color: #fff
}
</style>

View File

@@ -0,0 +1,102 @@
<template>
<div class="mod-banner">
<div class="banner-container">
<div class="txt-content wow fadejinzhiInUp">
<h1 class="zh-title">可信开源态势感知平台 (源感)</h1>
<p class="en-desc">
全网态势一屏尽览
</p>
<a href="javascript:void(0);" class="action-btn">
了解研究方向
</a>
</div>
</div>
</div>
</template>
<script setup>
// 使用 script setup 语法
</script>
<style scoped lang="scss">
.mod-banner {
/* 背景图替换为 image_b14311.jpg使用 cover 确保全屏覆盖 */
background: #001529 url('@/assets/v3/bj11.png') no-repeat center center;
background-size: cover;
height: 520px; /* 增加高度以匹配大屏视觉 */
position: relative;
display: flex;
align-items: center; /* 垂直居中内容 */
overflow: hidden;
/* 增加一个深色遮罩,确保文字更清晰(可选) */
&::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: linear-gradient(90deg, rgba(0, 21, 41, 0.4) 0%, transparent 100%);
z-index: 1;
}
}
.banner-container {
width: 100%;
max-width: 1400px;
margin: 0 auto;
padding: 0 40px;
position: relative;
z-index: 2; /* 位于遮罩层上方 */
}
.txt-content {
max-width: 800px;
color: #ffffff;
text-align: left;
}
.zh-title {
font-size: 48px; /* 增大字号 */
font-weight: 700;
line-height: 1.3;
letter-spacing: 2px;
margin-bottom: 24px;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.en-desc {
font-size: 18px;
color: rgba(255, 255, 255, 0.85);
line-height: 1.6;
margin-bottom: 40px;
font-weight: 300;
letter-spacing: 0.5px;
}
/* 红色操作按钮:完全还原 image_932d00.jpg 风格 */
.action-btn {
display: inline-block;
background-color: #C8161D;
color: #ffffff;
padding: 12px 32px;
font-size: 16px;
font-weight: 500;
text-decoration: none;
border-radius: 4px;
transition: all 0.3s ease;
border: 1px solid transparent;
&:hover {
background-color: #A01218;
box-shadow: 0 4px 15px rgba(200, 22, 29, 0.4);
transform: translateY(-2px);
}
}
/* 响应式适配 */
@media (max-width: 768px) {
.mod-banner { height: 400px; }
.zh-title { font-size: 32px; }
.en-desc { font-size: 14px; }
.banner-container { padding: 0 20px; }
}
</style>

View File

@@ -0,0 +1,519 @@
<template>
<div class="mod-tabs">
<ul class="tab-hd wow animated" style="visibility: visible">
<li v-for="(tab, index) in tabs" :key="index" :class="{ on: activeTab === index }" @click="setActiveTab(index)">
{{ tab.title }}
</li>
</ul>
<!-- 数据标签服务标签页 -->
<div class="tab-con con1 wow animated" v-show="activeTab === 0" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">数据标签</h4>
<div class="l-desc">
基于<strong>机器学习与知识图谱</strong>技术融合行业属性技术领域开源贡献组件画像四大标签体系可智能化为全量开源项目提供精准分类与多维度评分
</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>多维标签体系</h6>
<p>
自动为开源项目提供行业属性技术领域开源贡献组件画像四大类标签体系覆盖金融能源政务等12大行业分类支持AI框架云原生大数据等技术栈分类
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>智能画像分析</h6>
<p>
支持公司地区维度的人才画像和贡献统计提供组件维护活跃度许可证合规性开发者信誉度供应链健康度等多维度评分
</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>精准标签定位</h6>
<p>
无需人工标注在全量开源项目中快速定位目标组件可根据行业属性和技术栈自动分类标签准确率达 90% 以上
</p>
</div>
</div>
</div>
</div>
</div>
<!-- 风险感知标签页 -->
<div class="tab-con con2 wow animated" v-show="activeTab === 1" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">风险感知</h4>
<div class="l-desc">
基于<strong>3D可视化与实时监控</strong>技术通过全网态势大屏实时情报推送攻击面管理等功能可全方位感知全球开源安全风险态势
</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>全网态势监控</h6>
<p>
基于3D地球与热力图技术实时可视化展示全球开源漏洞投毒攻击的爆发点及受影响行业分布提供全方位的安全态势
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>智能预警推送</h6>
<p>
支持通过 Webhook邮件短信等多渠道按需推送用户关注组件的风险动态基于 SBOM 清单自动映射威胁并生成受影响资产清单
</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>实时风险感知</h6>
<p>无需手动排查在安全事件发生时可快速定位受影响资产并推送预警信息响应速度提升 80% 以上</p>
</div>
</div>
</div>
</div>
</div>
<!-- 数据定制服务标签页 -->
<div class="tab-con con3 wow animated" v-show="activeTab === 2" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">数据定制</h4>
<div class="l-desc">
基于<strong>灵活订阅与API对接</strong>机制提供情报订阅中心深度分析报告API数据对接等服务可满足企业个性化威胁情报需求
</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>情报订阅中心</h6>
<p>
支持按 CVE 编号组件 PURL厂商名称等维度订阅专属情报流提供包含漏洞原理PoC 验证代码补丁对比的深度分析报告
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>API数据对接</h6>
<p>提供 RESTful API 接口支持企业将漏洞库投毒库数据集成至自研的 DevOps 或安全平台实现无缝数据对接</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>灵活数据集成</h6>
<p>
无需重复开发在现有安全平台基础上快速集成威胁情报可通过API实现自动化数据同步集成效率提升70% 以上
</p>
</div>
</div>
</div>
</div>
</div>
<!-- 安全预警与应急响应标签页 -->
<div class="tab-con con4 wow animated" v-show="activeTab === 3" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">安全预警与应急响应</h4>
<div class="l-desc">
基于<strong>智能分级与协同指挥</strong>机制提供智能分级预警应急处置指引行业协同指挥等功能可快速响应安全事件并形成闭环管理
</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>智能分级预警</h6>
<p>
结合漏洞危害程度与资产重要性自动生成红蓝四级预警信号提供"临时止血"WAF规则"根源修复"版本升级双重应对方案
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>协同应急指挥</h6>
<p>支持监管机构一键下发排查指令并接收企业端的处置反馈形成闭环管理实现行业级协同应急响应</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>高效应急响应</h6>
<p>
无需人工研判在安全事件发生后自动分级预警并提供处置方案可协助监管机构统一指挥应急响应时间缩短 60% 以上
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({
defaultTab: {
type: Number,
required: false,
default: 0
}
});
const tabs = ref([{ title: '数据标签' }, { title: '风险感知' }, { title: '数据定制' }, { title: '安全预警与应急响应' }]);
const activeTab = ref(props.defaultTab);
const setActiveTab = (index) => {
activeTab.value = index;
};
watch(
() => props.defaultTab,
(newVal) => {
activeTab.value = newVal;
},
{ immediate: true } // 立即执行,确保初始值生效
);
</script>
<style lang="scss" scoped>
.pg-evaluate .mod-tabs {
margin: 0 auto;
max-width: 1360px;
}
.pg-evaluate .mod-tabs .tab-hd {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
padding: 40px 0 20px;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
}
.pg-evaluate .mod-tabs .tab-hd li {
cursor: pointer;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 40px;
margin: 0 30px;
position: relative;
text-align: left;
-webkit-transition: all 0.4s ease-out;
transition: all 0.4s ease-out;
}
.pg-evaluate .mod-tabs .tab-hd li:after {
background: #4bad52;
bottom: -5px;
content: '';
display: none;
height: 4px;
left: 0;
position: absolute;
right: 0;
}
.pg-evaluate .mod-tabs .tab-hd li.on,
.pg-evaluate .mod-tabs .tab-hd li:hover {
color: #4bad52;
}
.pg-evaluate .mod-tabs .tab-hd li.on:after {
display: block;
}
.pg-evaluate .mod-tabs .tab-hd.EN li {
font-size: 14px;
line-height: 1.5;
text-align: center;
}
.pg-evaluate .mod-tabs .tab-con {
background: #fff;
border-radius: 12px;
-webkit-box-shadow: 0 2px 26px 7px rgba(50, 50, 50, 0.06);
box-shadow: 0 2px 26px 7px #3232320f;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
margin-bottom: 60px;
}
.pg-evaluate .mod-tabs .tab-con .item-l {
position: relative;
-ms-flex-negative: 0;
flex-shrink: 0;
height: 584px;
width: 440px;
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt {
color: #fff;
left: 57px;
position: absolute;
right: 76px;
top: 169px;
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt .l-tit {
font-size: 28px;
font-style: normal;
font-weight: 400;
letter-spacing: 1px;
letter-spacing: 1.7px;
line-height: 40px;
text-align: left;
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt .l-desc {
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
margin: 26px 0 0;
text-align: justify;
}
.pg-evaluate .mod-tabs .tab-con .item-r {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
padding: 50px 0 0 83px;
text-align: justify;
}
.pg-evaluate .mod-tabs .tab-con .item-r .item-list {
padding-right: 78px;
width: 50%;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-tit {
font-size: 22px;
font-style: normal;
font-weight: 400;
line-height: 25px;
margin: 0 0 20px;
text-align: left;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item {
margin: 0 0 40px;
padding: 0 0 0 60px;
position: relative;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item:last-child {
margin-bottom: 0;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item .ICO {
background-size: 100% auto;
height: 30px;
left: 0;
position: absolute;
top: 0;
width: 30px;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-con h6 {
color: #4bad52;
font-size: 18px;
font-style: normal;
font-weight: 400;
line-height: 25px;
margin: 0 0 10px;
text-align: left;
}
.pg-evaluate .mod-tabs .con1 .item-l {
background: url(@/assets/v3/bg1.B9IGVx_y.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA0CAMAAAANBM47AAAAAXNSR0IArs4c6QAAAtZQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYHBwcHBwcFhYWGxsbGxsbGhoaGhoaHx8fGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaHBwcGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGRkZGhoaGRkZGhoaGhoaGQes7QAAAPF0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKistLi8vMDEyMjQ1Njg5Ojs8Pj9AQUJDREVGSUpLTE1OT1BSU1RVVldZWltdXl9gYWJjZGZnaWprbG5vcHFyc3R2d3h5ent9fn+AgIGDhIWFhoeIiYuMjY6PkJKVlpeYmZucnZ6foKGjpKWlpqeoqaqrrK2trq+wsbKztba3uLu8vb6/wMLDxMXGx8jJysvMzc7P0NHS09TV1tjZ2tzd3t7f4OHi4uPk5ebn6Onq6uvs7e7v7/Dx8vP09fb3+Pn6+/v8/f3+/jZlGfIAAARzSURBVBgZtcGJf84FAMfx77PjGRs2c2QUm6VoylFyLMdmmKOkiGooUY4cqSgVy1JKIoq2pMOoxCK1ImfMNCamaZjYxR5b6/n8B/1+z+/Zs2fHq9dGvd/6v4XqxgRltNcNeZUNuhGdSiFWN+BL4LC/rttI2A4zdb0aZZEZsI2CMDVMt66yPA/DFFXGGrn1i1A9tCq9cqtM4SWkSloK0XIZSrbqodlVFsn0GVcjJTXLZZ+vTKlkqD5SOOkjKQ4WyjQepsjQuozn9C8e6ipLPAyS7EfIDpTJ9h35LSU9jTNcloGxqmUwRbfIxe8sc6Vn4QFZelSwQtJ60mQZ4Kxoq5rCS0mWJW5tB7Ur5GtVegtnL6n3+i5y8T1Ijl21vAYD5bEORxdVCj1Puk0eU2GcamuSwwFV6g9LVGUSJKhS8EV2qC4PU2KXxfcAvw+Ztymj4BqUF/361ctHyQuRWxRl3eQlwC63+L5yS4Rr1LA/1ibL8D5yC7JJjU+f7aNqWk8/gsWZs+uT5G+Pl2M5sSBc1YwrTpOCCykapCo9NjqAv3OgaGELuQRNPQd/ngWc38SoyqQKDkmKKeJKvNw6pzjBuXVsIvzcXh4hWyA5fqMD2NZHbtPh1O0y9L2Eo6tMHVaVQ/6CcI2EbYHy4rMaZqrVMyeB1DtlGgOZ4XLpcY5hknxnFEPhwmDJfoxjoarGvoOC1lLAtLNQviRQ0hx+CZNb816Suu+Bq0tbyTAFhshyc6Qsnct4Q4aguRchK1byiW4kb9NKIe02uXzPDrmMz4H82b4yrSTPR6abksG5xF/VhG6CSxNtcmnj5AmZXsIlRaYYiJYl/hSkR8jLHZnwQ4TchkO4DD3L+XHYoFQYLYNfMdPlFvoFnB8gjwGXYYm/Kk2m3EeGF7jQXPI7xIcyZZAoj2kOHI/ILawYElVlHnkyJbNVhuXslWkn76vKZHDeK7exDhxT5PEkDpsMr3CmkaR0Nsh0mCR5jLoM8+Qx4DxsDJHbKAiToT9siopcDhNl8ClgltwClsGVcfLScTeciJUlAibItBKXNJsMfSBOlu574XgvVWNPAj5oIZf9bJbJb74DnG83kSmJy3aZGi8ug4+DVdPQU1AyO0CGOdBbLkHRMSFyaVfCezL4jP0NLiaoDk13A9kJflKTXPY0VjW2zymNkDTyILAhTHXpVMofwNHHgpQAH/nI2yJYLP/70zHFqE5bKG4/OB0oeLfvStjcTB7+78C2u17PA44+eorD/qrDCJgnadQeDBlZcDrBV5YRhyF3H4bMBD+NgRmqrVEWmQEydV92AUvJT2sWvbhq52Usxav722TYTkEb1TIf4uVmfzDlDDXkp05sKktUGWtUU4cSUuWt44QVhy7+hcFZkLF2cpRNVZKgn2r4lKuRqs3e9e5A1dIsl72+qiYOFqr+JsAUefM/Qnag6s+2i/yW8jILRqshelawQlXaFrJVDbOcinvksQ5HFzVM6HnSbXK7D06+2VAH4XFZfA9wffJC5DJi//V6Sv+BfwBIbvfBNZtweQAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA6CAMAAADMWVqUAAAAAXNSR0IArs4c6QAAAkNQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVFBQUICAgHh4eHBwcGhoaGBgYFxcXFRUVHx8fHR0dHBwcGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYFxcXHBwcHBwcGxsbGRkZGRkZGBgYHBwcHBwcGxsbGhoaGhoaGRkZHR0dGRkZGBgYHBwcGxsbGxsbGxsbGhoaGRkZGRkZGRkZHBwcGxsbGhoaGhoaGhoaGRkZGRkZGRkZGBgYGxsbGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGxsbGhoaGhoaHR0dGhoaGhoaHBwcGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaHBwcGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaZrZiaQAAAMB0Uk5TAAECAwQFBgcICQoMDRAREhQVFhgZGhsdHh8gISIjJCUmJygpKywtLi8zNDU2Nzg6Oz09Pj9AQUJDRUZHSEpMTU9QUVJTVFRVVldYWVpaXF1eX2BhYmJjZGRlZ2lqa21vcHJzdXd3ent8fn+AgYKCg4WJi42Oj5GSlZiZm5yfoaSnqKmqq6yvsbK0tba3uLq7vsDBwsPGyMvN0dLT1djZ3N3e3+Di4+Tl5+jq6+zt7vDx8vLz9PX29vf4+fr7/P3+nMc1QAAAAuJJREFUSMfVlulfTFEYx2fmtk1laDGtWqzTKksJES0itEipLJGxJEsoJEsSIilZsoUWoqQyg8bcaX5/mnvvuTPN5864nUkv+L2Z5znnfufznPM8zzlH4RtHIbVCqjhQaMUcYgXyERb/AYtTyCrpX8PW5ola4xbWZdu7R3OK+YcvdIX5aUT5TY95abWexIpttsD6bDPdltgV+0UIZKrSLUzZix8nUoreg42gxXQl+uONQD5nBhtwiQ7b1kv2aZLhvWZ00GCqRh4ZHzHgp4C1opsGuwAMFYZypQDs49xoI2oosHgrHmsE6zks9ZlVQ5hcRIG1YjyEWDH9JAFZFAnwMKLeZgdfHQU6UmjSHQrsmvY85zN0jaMDklwMz4TFA/E0mEdguKNbBIRNe2ptgEtMrf8M9J1k7ANNGLU7UTdYWLs3OmNMGymju97iQAKLJjs1LMxZypywGuDeps33gSPET+yDyR7zG0zWppYNgA2TYv1oU3It0o7h5IzSY1ceTAFnk0SVcicq94nWiAYJxiVJ6N2trg/nMWGVt/BQgi0AMvnfbNfYNxU/edupA5ghtHNTTCf6dKvzKuuaTcBlnahyoIT7JtKAWunaqrmay87pBI4Sf8lLWBNskz1gz2ccGIQpWop53yHhtCjFgUgjvxLxPwZJB+Q5p1ulfwsMHvKyD5wCq7HZ2utjQFeq65oM8lc6eGnAKodognzoSjkAyJlFB8wDts8CYyzQOxzsgRrK++0dWm1mxDUzLJ3pVFgDzDqR+iQkgC2iwcJMeEVup9cw1W3Y/wFm7iTLBXLlj9fDwNeDi5WKRKCYL/fvuKhQFJB2kNNpPjSTYQTjHrzbwtdNFpA109WR3kNKbkJFsCe0F1VUflV1HVDIr3UCZ9y6TV/AfG5dxQB+xbiFLfsohGrdSRKwJ1lWaeVbfMUz46YBeLre/ReeOsT/bx+GO5bLavf//DDcu1JWFXP7xJ4N5rOUQt5S6jcJyGZLl4Al1gAAAABJRU5ErkJggg==);
height: 29px;
width: 27px;
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAMAAAAPzWOAAAAAAXNSR0IArs4c6QAAAuVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGxsbGhoaGhoaHBwcGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGxsbGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGxsbGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaMeyWdgAAAPZ0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLjAxMjM0Njc5Ojs8PkBBQkNFRkdJSktMTU5PUFFSU1RVVldYWVpbXF5fYGJjZGVnaGlqa2xtbm9wcnR1dnd4ent9fn+BgoOEh4iJio6PkZKTlJaXl5iZmpubnJ2en6ChoqOkpqeoqaqrrK2trq+xsrO0tbe4ubq7u7y9vb6+wMHCwsPExcbHx8jIycnKy8zNzs/R0tLT09TV1tfY2drb3Nzd3t/f4OHi4+Tl5efo6err7Ozt7u7v7/Dx8vLz9PX29/j4+fr7/P3+/H7PQAAABYhJREFUWMPtmGlYVGUUxw+IoCC4YEkpqAQpuKJSKi5pWmq2uJVLruReiguWCFJomUvu1qSpDZJWkKWm5lJauWQa5IaCQpg6EwjT4Mz8Pvdh7r0wwzCD2dOHns6n/32fO7/nveec95zzjogHC4+JkPs2Hfr/AKTHis8Whd8nZIYNKImTBhGfsjey0d9itLnL+XXFWH7DbkV7UwYF3ytkCsXBMhAHs+wYEXAvjDo7KPaWaFg7NO5z9sYNSdh4A6AwocYfVmvUZeC9IQcxBWmO9em+8BxgmOxTI0b4YaAAgBmO0XksCzgeXQPG8wY4GOefVMSFMVVC/OQxMPbzhPBKBtMEEREJdJVs3qNKsc50z/B+F860d5uxHS/BR37uGCsho56HtG/yPUxyA1kE6XU8nZ3oIiwdq2c8C3pHRquX5+Vwec7YNhVLYbmYe1XPiDRwNqjSc8TiS1q6XkqLsi82/gnrc24ccoSySj6N2GAFLJdvYci1ANb1USJS7zCMc+OQF2GsEoCElBFjS6D07YENRIdeAgcsMYJpgvjuhFluGHVzOeolIiIzLQCUzmtcybGN5hnh/Q8gxV2KvAbdRUSkq42ik3CjtVN0Wh4CWOvlhuGTx1a7SuZKQ3mLcj/nEPt+Afra7jbSD3qov0oX6QvNnCHxsM99RfmQ88pGZ2FN6LyfAudkG2bjpPty0qCcBEUG/wnABCdIn3IuNnV/8vqAWifa2oDSKfZ9hU7NJX9GS5HYOxS08lAC5nJTdftirLEdfO3eTjQDUJ7U/gbFnTzVkZ18rCauFibx2Q7WnK+zLWDC3NNjPbupuaQDqKUrEbLCRSQsA2yDPTJqw0uKHI1NOYWhZrK87fXuENZIj5AQeEqRCzmnqKlYwxXZzKTt1HVx1+l0ugzI1NntAkWKyuWk9tYZ8pXV9F8+UZTu6CmdTqfTRYvEUL1t1iDfuHmrm0iEXq/X74EDertdwqiofE5U2kmBsnqLq4raC/v0er2+rfrN0EfUrM9XJwMsYWpxLmOuIrNZoKhe0KKyYwJgmCJHYVVOWYtyMpQM3IJVKY++JuKVN4eAY2e4rXm/HQzUAoW+mYg02QJLlbXeEKuNDibHGO3S0lRyWKVmzy4wnT/9axnsUbtAKvneitzAEUfI6+SpMomb9dUylGyvlNYlKiPgmrYnyWNhlZbzqCLb2zTXiUTOzqdgbpT2PKviayJhgCOkoZnZql5DaWg1HbCJsSJ3xmNznsC2cFqVLczs93MJqZ2JpbX6cIw9ztn/AnQR7dCw2iUkjYoj1LUiKzTzL2Sb9rAKVvlVgdROg01ax1jPNd8qB3EmDO75gF377YZ9TZ0gTTLhkH+lIXV+1dNc7wZgS61rHx9XQ8m8wEqQgFlG2OQvIj61RMTrSwwhVSEB14GKLjm9HAqX9PUTHXrx7Z16DSwJXtI85YLN+vOCB0fBRBd1ZSS2cY9swFZfmwoATDmF/J5tAtjcWqS/yX76bxs47O0CksQpkTbwuLbS6c0rWs3IXxorIn3N3N0U/8p2G1hdDkuTKYuSBK172mtr50mJF7m6ID7WW0SksZG8KBGRrkbyXM5+zYsxn4fr/tXPbK9CjF0NhOEui+0zRgAOhVQLySJLbU7ZldLRwULHJw57By60rQ6SQ6oqt5LppvhPs2EYXcs15ATLVJmudUyXNqgUfnzCJWSdlunBJt5w28hijgPpHVxAJsIce9SWay6udvKaXgwcmdTCARI27iBA8sMikWthjceuGjzfAJC9csbTXTL4qkv/acvPAPzxA9w9e84G23xrcOsJHLnb5tzp9o0JCtpovw6m+dXwFhcydNm3Jcrv73y3YvhDIiLSempqysSwe7qVejVtl8mBdqFe///h8I9Doru1lX/F/gIjzb047a6x0QAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA2CAQAAAAxbjKfAAAAAXNSR0IArs4c6QAABsRJREFUeNrNWWlsFVUUHrayRgRt37vfmS6QlqIlIFSkkIKhwSJVUCRgWARSZTVGQRBBCCAoRUV2UIxFlIQlrLKLQhVFtEBAERQECRaBKmWrCKX1mntm5r3pvJnSVyhx7o/Ou9t377nfOee7U02rnKeKP9LXDNHJNbQ79aCOGCQ24R9ILv9iH00QsZUP+xxOm5D2ck282/CuSgPVa2O5AUTf02t4Eu38XTAcG3CNa4/o8ZUCm1yDchggV6SWbiEdH3HLX5UCjQ948g+TItxaaQCuq13fdoNTGsOuCNbENBAd/HGloCWkmHG797sXEqdQxwRpi4MmrfJpmFbFqBVLmGa3zvD4mlpVE7YVU2qgCTsEJaU4vcaARrSiGU2oCG9J9BMzsBFHUYAb7KWFOI1d2A+Jv/XaPH0i+/Dv1B9NRbrYyUsaZi5wAyT2hmfKpnoWzrt4aKCITWbPxZDiIulWBGPofLNtOCRKtOrlDH6iO/bYIE5iK2ZjjNgMiQs0UkzFClyFxHxz8kOQmBMcLjrzsvhk9Qzev16enXbliYzgJ3EC0YGW1yGRZ77/Boks8/0yJL1stxUDt+dFtFfv/vtvAipisd4EPUXz+W9X24R24F1BV8I3kFjpdKOYBvzeX73fxJfRCQUMVoDRcbWwVhnZcowQ4Dl8jtV48jfYOt3MlmjkQeKAuYiPIel42bAvoBgS1/G2Wqsvijk8sVQPO/AjfHZp6j2yHk4w9EqMwlxxERLFlGK4Hy5A0qwyoi4W8V7PUNtAzlFnE+cFnFwDZyFptXlEyQxtlatisDkik5eX4hkWsIMH7AuyD59CYr/DJjZgTcMktTNfI+NXZD0xFV/jEv2IbGpieQd+UCnEm1JLGHalFf443Sl3mVwWcKSfk192GVTtwezu63W2o9gcn9hpZCQAf+uygDWNZqk9I9Fj4qo4rLKTQcDQkJjBUXZPXK1SEBMhccU5xAnsi0IhJNZ57HcQb6in+24TcUlNFisc9dshsT2ktwNY0zCZjflo6MwxDfCnCj92O9pzag5z8MEQiEtOV3IH1mvjJCR+CZUC4PBD7ilR9OP1jnXWxwqu784/qjWurxMSRbL/YSyDxHk9gzpSCrXQExrX1zTxFPcd54BtxTGhmBOk80mK4AiTZ6Q2u5FoKE+2BftVFC6zFOJnzmBF9micFMFuVCDe4XnSnfsdzEOfNddYhzrSeGzlk6lI+SlIRTGVzdzfPIg9jtRHx43uOtFQmxy3SjF2IVu8ikzqpWeIDmhFTcRMSPxBup6gN9fbUEf0xmjMptXGYsX4QBRTwfYoWgaY3UJzeqqYgW020VKIL8QU9BZfQuIzFx8IIZdZ341HF/masZmtpCrpuD+LrkBigd3QS5UyCOTdXEz0t7Z0Ao4Ek3y5gFua8+zTqmOaobQ58qmtKYxCX12rb3VRbHY+glei4Yg41yHFi2EA3xuw2TrezHq+T/WgVWx0Bd/DMnQKm+I7QyWUfuLu9oo4XsCaphgiDpvg56J8gfpoTKciSJppGXqc0rvxNV2Dis5xuktYwMfUSeKMOjbnSKywZSilLijHI2nYFFO5gXMhsYjSUIK3XASGxA3zlDlvLHAH9rdmg7UMC/grzm8a9QwVsob0N6511bzow6buqDrqCWEBb4OkVR7z3ROgl8FCMxaHTtJVtUb6wwJeB0mbPfNyCSSLIV8j5u2b6ONa5rGpM0NbxBpWoG5jdjOr+3iUK2Ya0ZtXMB7fQuHLqp5w54ExzVAHij59fXXdCg1Urb6o0BahwuFptzF8CDvc5/PVVQKJRhqysxiShnqQ6wkDOCxybTQCpdsTX9NIkkbHc5A03kOkpYdK+ZsCK12+3MOdOBLqGUbHfZBY6gGcymS4Lyzgb70VtpGAzZyMueo+6GFqI9IkhwV80D2RataN47KpT6iXlzk1TY9nFnYKC/iUigseIVhZY0spHYk88UxpIc9psZYRQMIArsZkHeYqEZY5lCzLMFUuYAHaWd9ytAD1MKn8wCKGT/Exe12sEC/hgKXfotPtEfTpQINEPhZTL0uJcJLLDgOY6ag3N+wlUjEZe/kzhiqXMD0oDILn2Ua8xxdpq5zAUjGW9kCKnWEA9+Udj6RZ2M2fEU0lRzk0IKi2XBxcdMa8gOmDJQ876H0xBWPwPA0QPURn9VkJ+ZSGbugtBtEImiBmYC0OiRuOkVexgYbopJXv8ceJfmIhcvneVJFSjF+xFqOorftH1XI8UT6Rikxk0WocxCkUoMgFRn3hO4tj+FwspBH0OBIr5V8CSRF6QxHjT9Ifogf0+Eh/ZD2P6+f/8/kPaURwNOuwtMAAAAAASUVORK5CYII=);
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico5 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA2CAMAAAClUqpcAAAAAXNSR0IArs4c6QAAAfVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiHBwcGxsbFhYWFRUVGxsbGhoaFxcXFxcXHR0dHBwcGxsbGhoaGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGBgYGxsbGhoaGRkZGRkZHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGRkZGxsbGxsbGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoahQXVxQAAAKZ0Uk5TAAECAwQFBgcICQoLDA0ODxITFxgcHSEiIyUmJygqKywtLi8xMjQ1ODo8PUBDREVHSUpLTFBTVFVYXF1fYGFjZWZnaWxub3J1d3h9foCBiYqNjpGSlJeYmZqbnZ6foKKjpKWmqKqrrK2vsLG0tba3vL2+wMHDw8XGx8jMztLT1NXV1tfY2drc3t/h4uPk5eXm5ufo6err7fDx8fLz9PX29/j5+vz9/ud+XxgAAAIaSURBVHic7ZTpVxJRGIdHtJS0yELMNNtMaLPFLNuppKxIC8v2fU/KysJyKtvBpI3KqDAL5Pk7O3eGphEBGb54Ooffl+e+895nzl3mjCSly4yj3ba0zQxZMwiRFpNRbeYZIAq+amNeUwgCDTU+GGktzF6bdQXih8skyeQahr6F2Xobh+DVMnVceRui7qnZaNYuiLWb/5YFzjA8rp/Y2z5untULsbaSzJpNrOxA8so2DcHLpRk0U0sk9Vkop9VRms6r9sGvvUUpe+vF/axM2SpsHQFfjVYv7+zpPd+sfTnlZ4HjlvHegj4YdmnzLKdRcm+ONmNtEIKNSdoUdxTuVGr1tBfwuetSAH7M1R5ajgHnyvXekkcQdhb8e9AB7cXiciL06r7zFX74tEErS9pi4LXqXjQvTqc62gqbdY1Szyhcna0WxQ/EBc+v1eUQo/bE0E+3vlO7IwyhCkW0Yzgu9SCeGPW+VqlrNdU5HF844RCJclCgEfYLNsEewW2wRXA3rHPYzbpdv8Ot8De7BKZDs6ANGgTrYbHgaqgYe5F5MS/mxf9dXOXxRHjoEYlxV+AI3BI8BdcEL8IFwetw0uPUxH3G/lVenRh7/fF5v4j//TOFgbcK+geCKgffqAwOfB8jhqSsc2PyRFmWPxD/mXVifJNl2SxJRv//asqE2HPzqaHcv5wQnRNtKzmLJk3cWWQwdQkx51PNUazKKSbpDyfEdItE0oMXAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con2 .item-l {
background: url(@/assets/v3/bg2.ED2KfGoJ.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABACAMAAABvC9RJAAAAAXNSR0IArs4c6QAAAoVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYHh4eFxcXHR0dHBwcHBwcGxsbGhoaGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGRkZGRkZHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGhoaGhoaHBwcGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoawUAFEAAAANZ0Uk5TAAECAwQFBgcICQoLDA0ODxARExQVFhcYGRobHB0eHyAiIiMkJSYnKCorLC0uLzIzNDY3ODo7PD0/QEFCQ0RGR0hJSktMTk9RU1VWV1lbXF1fYGJjZWdpamtsbG1vcHFzdHV2d3h5ent8fX5/gIGCg4aHiImKi4yNjo+QkZKTlJWWl5iam5yen6Gio6WnqKmqrK2usLKztLW2t7m7vL2/wMHCw8TFyMnKzM3Oz9HT1NXX2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fL09fb3+Pn6+/z9/kKeQQUAAAOySURBVHjarZb5X1RVGIe/ICiorBoGGSSlIUtkYxZFSWakhUtESFIhZmbZHgUFhYGtKKHYRlKZlCmoLGVZsgYoiwhc7vP39MPMwMw4M1w+n56f5v2e89x75j0z9x7JBwk3aE4s3NpoTtRnB1sW7v54GAD6ylKtzF++twOg5bn9FwBOF0b7nx+S0zAF9FfcISkg47MRYLzu4Xk+BVvVFcD4etN8Z7I49wRAd0mSt/mxHw0AnC9e5p7f+vrfAH1PR7rnCzZ/awCXD6zxcrHAB2rGgbHD6wOnszsrBwGTiRBfS37K3sFLb6yUpEVF5wDaXniZMZ/fchukvdkJ0JQXqHRgqHqt9Ix/JVTzsmqvAYuVDsWhkgVFUtQHDiVdVhXl/H9KRP5rBTFzUh65AkxsmYOSdhWjfRIzw4pi1NTU1NR0MJCihIs0WFGcVEp6ka7ZlU0/2hnmkKRSK4qTVzGKEnOvUWVdib4IQE+CdUWxjSacTJUUv79y981WFGn5ulWSVDgJjOdYUuxkmYycGsNcY135ij9iFN9NQ0rKXotKHy9JKnVslj8l0eZ4YPxOlaTaWZW0n8H4ZqkklTH5fPorUG2z2Wy2QF/Kil4A2sMl3WjfoHOuTyMvyidcy719n8keSYr7zmCqNk7+lQHeklTPT/ZyadIS95Z4UQYpknSQM96b6E05QUesUi9TYV3ZAOMdBqPJ/pRkWOuS5RnA0EYfhp6A+VoG2a7hLfBFpC9DuxmSgqbY6RrOh+0+DVXQIamZWutKM4cllYPhil1ZYXgFCiRl4cl2SYn4IFFSYD9n891YZVfK8z3Z0ctvkqR9mHddt+hEyLwu3AqPSZIi/qXJkhL6Dy2O12Uh5HmMRr0H74d5hO/Cg46Pwc2MrHQbTBoAOOv2u1emyZGZGWOcWegyGPQXk+1/wveuRmwn3S5/hQKon3mp6yHIlnbD6pls0Wmm1rteohrKZ6piBiVFw4aZGx+DXW7rDDoO70xXT2LES5mwbnq8Dg56dCP8VyhxFktGacvd2cMl52KD66AuyLPpEafgU2e6wwQYd+5M+HE46uUIGNkEDc6tePQXzB/ucRRxLfCl10NjyFFone7RwukOZvRAWYC8ElgOI1s8woA9Bsaz8sm2UTiwwDWJOga998sPyW1w3uUct7ETTsbJL2G1YLztuFHU52CWBmk2cvqh9V5J2twFF+6bVZAUcwQ4dNPqRjA/XGTFkPR4F1w1oDXDoiAprGQChndZP/NL0m21lTFzEvzyH16BnDy4upTwAAAAAElFTkSuQmCC);
background-size: 100% 100%;
height: 32px;
width: 25px;
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA2CAMAAAChp3phAAAAAXNSR0IArs4c6QAAAfVQTFRFAAAAAAAAAAAAAAAAAAAAKysrJCQkHBwcGhoaFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGBgYHR0dHBwcGxsbGRkZGRkZFxcXHBwcHBwcGxsbGhoaGBgYFxcXHBwcGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaHR0dGRkZHBwcHBwcGxsbGxsbGxsbGRkZGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGRkZGxsbGRkZGxsbGxsbGxsbGhoaGhoaGxsbGRkZGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGBgYGhoaGhoaGxsbGRkZGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaY4gg2QAAAKZ0Uk5TAAECAwQGBwkKDA0ODxAREhMVGhscHh8hJCUmKCssLTAxMzQ1Njg6PT4/QEFCQ0ZMUVRWV1hZWltdXl9hZGVoaWprbG9wcnR3eHp6e3x9gIKDhIWGiImMj5CRkpOUlZaXl5ucn6KjqKmqq6yvsLS2uLm6u7y9v8DCw8XHyMnMzc/Q0tLT1NXW19jb3N3e3+Dh4uPk5ufo6+zt7vP19vj5+fr6+/z9/hUAYDEAAAJLSURBVHja7ZT5U9NAGIa3UhU1guJ9At7We0VRxKNFKd7iiUXRKpcKKFYBUUSJWm9AraC21pLk/TudbLYtaZPSrY4zjj6/9Psm3zOz+35JCbGncNkckhOregG8KcvB9CpgNOeJmi4NH6tcex4DXkHT8QpvCwkhznZE5oqpxQBlxTxgn93Q4m4rngM83VEMW05sJaQUNkw31JDNYzdTO5rS6EmogwimP27SuFqafo0dCfUZLlpcM/b71WZV1QDVANBU9V22amtaJkPZq8HDfr97P6Pef7pDRL1r6mv/AfWy0peVOn+nx+OhRePVq+g3qSv3ejzuzVNT1eoYW2C40lbNbzd2/Hq5WXVp0KLRKDBWbKfWAUo0GgNeOLm6AlgvSX58XkAIWRrGWUm6xdVtF6rZ7xl8kCTpE9qmEeI4CKyVpB+6upG/awE2JRuNOWF+UlTozezk9xpXjemnmdTdejMrqa4Gaih9YFzLMYTblPamqJcwQun27zimNyXAKUqVZExVwB2fz9cNlOsxfX0ynhCL6T6+Nfp8DYOIFJgSntLPz9E1ye6jKwnz5lDKXvNPdMmyfM87mRBS2ZBKrX7URdf6ZHng5pYJ/mAm4r/6R9QNwGhIGNPrL4qbkDXAlePCKH/rctbNEGaMq7km/AtqQZkV54EjrNgVQZvlxEK7GK5jmFc3EBQKMG8E9bwsB5aIqC5gEy9nxlAjotbhizNed+KhiPoejYn6ALSibJyKgM4jYCAQpwd4yYpzmdWTGTbZmVmlLQatLUni9dGU2Z8vQHe3JjoBkgAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAMAAABEH1h2AAAAAXNSR0IArs4c6QAAAk9QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGRkZGRkZICAgGBgYFxcXFxcXHBwcGxsbGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaHBwcGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGRkZGxsbGRkZGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGRkZGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGxsbGhoaGRkZGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoa7LJWmwAAAMR0Uk5TAAECAwQFBgcICQoLDA0OEhMUFRYXGBkaGxweHyAgISIlJigqKywtLjAxMjM0NTc4OTo8Pj9AQ0RKS01PUVNUVVdYWVpbXF1fYGFiY2RlZmhqa2xvcHFydHV2d3h6e3x+goOEhYaGh4iJiouMjo+TlZaZm5udo6SlpqeprKyur7Gys7e4ubu8vr/BwsLDxMbHyMvMzc/P0NHT1NXW2Nnc3N3e3+Hh4uPk5ebo6err7O3u7/Dw8fLz9PX29/f4+fr6+/z9/h/1AioAAAL8SURBVHja7Zb3UxNREMcXAqggIE0pig0VPRuggAURRUBARUVFBaUJKCLFw4Y99oqosYEUEQtEUBCICSYk3z/MyeUSknjx7jKOozN+f3l7b9/nbm/fvp1HJKhpDMMwUZzpF8swzHySpWyY1bacJtcbzdZzd3D0BR23GDJxLvgcIHMAV1fID96i9zgGpJK76sF5IMVdet6Y+bdPeshAvOPiAnlzkdaStlqrb0lcpBgeCqyzWIqnGNo5c/VdIJH3daFCOr4Q2ExEvl1g3cEzMT7FPNZB5Q6ej1FuLEP3H8N99NhmxU1fvhm+D49acc9h5IvuXAteBnPGEVjVb/EUAfGi+Fpg6JZSqXykA3RqGPoAfLimVCpbgRsSKuiAnv/oeOWkIqhpVYc1iofhgoBnnoNKLrWoVBro483xqon82oDXqic32V0OyxbbChVCOkg8TtMHhPwFdrjR4CgTBhQ2nPIAJ7/BEc9y+p9elNMEHgJsclow+Cvc24RsLo26d9zzV+yTjockbnD6nBqNyQsUkvA5d7jMbLVfPGKeGdwuAZ/Bp3mvPT5umSsUx89Bmzc7/A0a7OgYICs8vhljUaL4J5QRUS36gyfwE9D5E4UZkSGGBwHriWipCU22pQkmNJrHbpSK4SH8eT8DVHhbpla+xegs5/Mugge8AlRJXkRR1UaYUkkmTmEPAGg6zOdVk0ZS8Ylm5bO7l9stY9NckowHsGys1VYk5FceSg+yIVVsirSaF9dfjEdXOStDDp7wU2u6IAdf1uGsun8ndf9x6Xh9ukxpHHA39Ltw8nVHfCNlDhcLa4+lz3isceEvzlUQBWpdhqc7uz9tx9F21/EXEoUBIz2CGrfdrATdH8F1zntoEd7aqPLHn6Fvv5jsKejeAjBElAPEuKwOf4VL13W84FqzBjUkX9FG/sbBQhspHz8NTShnRGhwP0AunWtCCW8WAc+SZMGhNUDnVOtTKYCOy6xUnWrWAq0RE2/L6JRZ8PqGYPtovDZWX2mWqttsgfWS8wOVDhPNZXeUuAAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con3 .item-l {
background: url(@/assets/v3/bg3.DKgYKiLO.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA4CAMAAACbrRsRAAAAAXNSR0IArs4c6QAAAmRQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVJycnFBQUEhISIiIiICAgHh4eGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcGhoaGhoaGRkZGBgYGBgYHR0dFxcXHBwcHBwcGxsbGhoaGhoaGRkZHBwcGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZHBwcGxsbGxsbGhoaGhoaGhoaHBwcGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGxsbGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaM9yYTAAAAMt0Uk5TAAECAwQFBgcICQoMDQ0ODxARFRYXGBkaGxwdHh8gISIjJScoKSorLCwtLi8xMjM3Ojs9Pj9AQkNERUdISktMTU5PUFJUVVhZXF1eX2BhY2VmZ2lqa2xubm9xcnR1d3h6e3x9fn+Bg4WGh4iJiouMjY2Oj5CRkpOUlZeYmZqam5ydn6Olpqmqq62ys7S4ubq7vr6/wcLDx8fIycrLy8zN0dLT1NXW19jZ2tvc3d7f3+Dh4+Tl5ujp6uvr7e7v8PHy9fb39/j5+vv8/f7mLvP7AAADPklEQVR42r3W+V8McRgH8E8bSki6LJahcrOOxaZylVhX7jORW+5jkVtCypkz951io4RUrpBVn3/K6/vdZq9se3jx+WWe3X29Z78z8zwzgzC9DzGYTJ3RKnr6ltLIgCkfRf2BmrwueImwT6JbUz28JYXcSj6LCYz2yCJLuwdGkUmWaQOjWE6+6BkYxVLyZa/AKBaRFTq/qXGQyMZmvtP6Sx1Z9L9oxEg108lkv6gj8eTo1jRu24WC5aGimmrOAjDYbO4kV5t388xcTVs0rUEcyDMxW7l8AGAKKYZlmzzAS+0808h6fjpbTJ4CcIAPAUwmo4GxZHleCbnSM00nBwFb+DUY2K/SGGA3q8KA87zumWazBkASqRP0EYBJkhaxCMA6vvNM1/A9gPFkH2CfSmMFLbTv2CMVPyaSiqCPAUxsoUWS1npbsFFSs0q7A4WSrm6LLuNXjXpBzHwCYIKk+bwGcfosnuloclNUXAmrAexVqVbMd1OGdnwtCzzToGJbc8+X9Kmt57VAeKX8+ufQNrop+hzJxlWi3KNSMd8Jd0hWJ7fZw1BSjRGy6KaLBdBR1ytYfuybMqSlDZF8i7xrCGRyNsjFN6/wnxqaWbZjTyWtw/ym+awMByJrmOtOgxSnp5k8XLeUcpfYnGCJKw3Z8oUsT5G1JrOOfDNDlAcbrtppDbPFZjvLXOlJ23VNEnWOrc6Qf3HLGx1OFiSmv5Z9FPuLxUmTHrJeAxxXaYSi1HGnoijKUb5SlHAHXcjvIYCJzV3lkGuBMWR/QW/b6BrXJ/ViB13rNK+zyfZAgmycY96pbdQTVdpB9pxB0Dsq/ThvQbrRaDROW5BhdabZTqM+S9I4SY84aI3jMjW60lr7qM8kQyQdI+g9Z6rbvDnKnZrYFCsG3hoqb6B6II3sDRx2paPIAe5U18jS9XsbeAVAl3pWbdxaz3IIet8bxQp54j7Hi3pak6h/iOk65APFhPNvn+e1vCuMLKyynO4v71kXc52pvqKiX2vqJZ7P8L+lX+bY80vQKWSqj9S9EU2k6V9TTXuRgeQ4WWiAEeQI/94lDIG/hjjTaovlm9X6weJLqlypn7FTbY7I5Rs38nN8TG/8dX4D3Yb6f19FH58AAAAASUVORK5CYII=);
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABACAMAAABxwuT6AAAAAXNSR0IArs4c6QAAAtxQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaAklNYAAAAPN0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8hIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCREVGR0hJSktMTU5PUFFSU1RVVldYWltdXl9gYWJjZGVoaWprbG1ub3BxcnN0dXZ3eXp7fH1+f4CBgoOEhYaHiImLjI6Pj5CRkpOUlZaYmZqbnJ2en6Gio6SlpqeoqaqrrK2ur7Cxs7S1tre4ubq7vL2+wMHCw8TFxsfHyMnKysvMzc7Q0dLT1NXW19na29zd3t/g4eLi4+Tl5ufo6err7O3v8PHy8/T19vf4+fr7/P3+kWOxigAABYhJREFUeAGlwYtf1fUBx+HP4QAKqMecXGTesaHmLR2zxgrUHLZNl6tBbmOpqRW2spWmxiJza5QjlZxpXrAyZlhu4hR0W5tMWYkrFNwmigKFcj0czvsf2Ov7+3HwIAeh7XnUM8fQ0ZMnjnTpS7t96e7TjVjqTmxOjVafjVrzKV15i5a41BfDtngAzrzx9MI5M7/57bS1ey4DfL6qv3ozMLMR2oueitMNjpkbzgL//kmQbumhq+DeFKNuph4E/jFJPXNkgjcvTgEln4Tr89WTiP1QnqCeOBY14H1WgcWWQuEQ3cKUC7A7WAGElUBOsDpNWZ61/dCBLWvTh6tTVDHkKIC9sEo+M7Ir6VSyZrg6hObDo+pmNbyhDuPeBnBXnnj3QMklL9D88mDZIkppS9ZNvuulKFSW4I1tULd9Qbgs0YsPtELdItlGXaV2pLroV0FlpCy3HYaG9QPkZ9ROL2wMkiWxld3q4kmYI8vYzyA/WjeZdhYK+suShXe6/Ljq+L0srrPwokPduD6AXbK4ajksPxvwTpMR9AEsUSDOHfBzWTJgrjq5mnhLlrWwUT4RU+fNnuBUh9DjeJNlhJ7nuDotgUkyYhv5MEi2eQUtALXbJ8gWfZG/O2Q8DuPkc5RzsuTiHiPLsMP4eDaFyrII0mSMhPXqMMjDr2SM9fCaLHdchHPPzRw+Zk52PRwbJCPoNOccMk7xV3X4Dtwj4xnckTKiLtD+bIgsQ/Pg/SAZCyBBxlo8LtleotYp4wSHZHkX74Pq9Bo8JqPfNbJkTIW5suVzWEaMl2UyZkKWbnAWcXWAjH2ckeFs5QnZzpIjYx6MlpHL1Qj5SYA0GT+FcBllvC7bF6ySsZj2YBmXyVEXZeyRMQviZBwkXzYPS2U8T7UMF6TKuPNkwW0yNnNKRjx8S0YehbKEwSIZr3Naxu1wr4z3ktY9LmMdl2QMhgdlbOMvsjjhERkvUy4jFu6Xsbqg9B4Zv+RTGSMgRcZOjsnWRIaMDJpkONt4SpakibK8zxEZCTBFRj4FslXxCxkPwWAZRyiWv4HNPC9jAUTKOM4u2Y7ytowZcJ+M5ZAkP+tgoowsrjlk1LBetq18IiOomhwZYf+hfIg6faOFd2QpI0/GUEiTbRner8rI5aJDxkIoiVWHxBo+HyNjHKTJeBjGyxYPy2TcDwtleQFqnhgkSSNeddN2nyybcA+WsY/L8qnikAxnGf8MlmWlB1qL9+4vBWqTZYlzs0VGv2vsks8ruF0yvgfLZZteiM2TGyvbOzQOk5EC8+UzDZbKUkTz19Uh/pm3jny4bXG0OqyATFn2UhOiTse5FC4j/guqYhXQ7DZOhcu408uLuiERVsuS0k7ZWAWQUk/1CFkOU+uSn3zqI2VZCXWz1M3P2mm6S5a5kCF/4z1sky29Fc/mGHUx7Q9QNUOWsI85H6outsCjst19BRqy7pCPM2mXFz4aJlsepKqriNO0JcsW9Rs3UJ694oG77k198s1aoG5lqGxrIFc3G3mFurHqELenBT91L7nU4ftejoWom8RWKifLZ8APdla0Alw/80qSUz4/bKIiUgGke7m+QP6+MulrA+XHkQn1kxXQAw14n1PPIvZD+Xj1YEol/DFBgTlSz0HhEPUoqgjYF6cAZpUAOcG6hZAVV8C9Y364uoh6pBAoTVEvBr7QADTlp8eHyDJg+tPF7cCFHwepdzF/wtJWUVr8508uYcvpr74Y3czftpZzQ/vJX9fwcbD64nc0j5FiZy/fkPPmb1/NTL/bJT0MGeqDebBe3RylPka96vcZFWHqZlIbO9Sr1TBfAWRDonoxqpGDCmRQNaVO3dp+WuIU0I/gMd1keLa/9+Cj7B5U0bI1288GaTr/q2vShLIuLv6rrEfV58v8ndT/5b+wy5acLtE3wwAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 32px;
width: 30px;
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA8CAMAAAAAPFkHAAAAAXNSR0IArs4c6QAAAk9QTFRFAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGhoaGhoaGBgYGBgYHBwcGxsbGxsbGhoaGhoaGRkZHR0dGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGhoaGhoaFxcXGhoaGhoaGRkZGRkZHBwcGRkZGxsbGBgYGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGRkZGxsbGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGxsbGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoa4vkYlwAAAMR0Uk5TAAECBAUGBwgJCgsNDg8QERITFBUWFxgbHB0eHyAhIiMkJScoKisuLzAxMjM0NDU3ODk6Ozw9Pj9AQkNFRkhJSk1OTk9QUVJTU1VVVldZW1xeX2BhYmNkZ2hpbG1vcHFydXl6e3t+f4CBhoePkJGSlZaWmZucnZ6goqOkpaipqqutrq+wsbK1t7i7vL+/wMHCxMXGycrLzM7P0dPW19na29zd3t/g4eLj5Ofo6uvs7e7u7/Dx8vLz9PX29/j5+fr7+/z9/hwDx/gAAAMQSURBVHja1db5X4xBAMfx2drY3EcRKmfESrnlyH0kFLlyE7mv3Lco5IxCtI4kZMtNrsq2nz/Ma55ntYfnyuvl9eL7y8wz+7x3duaZnWdEpDM40cJynASnLvWPKU2rW0EzA37vLDccjLBGh4Ez8LpPOdy0NuBQKiJPw3OnFToTZoY05Xrx3DlvkmNCZEJm6NdN/45pXmlTsbm+9IJhHuhSEW4yzI2SLtKkZvlvadH2VucKHxX6R/mq0NqqVuc1X/65Ge6cMClrwbh+jlZSW/KOCt90eK6vi7dObRmPgmezeJhFOqYM+HAqa3Rc2w4DU9de9YD3RC8rdK0H7s8O2J66rK8D91hTGnEIarLDgvvouKORhuUm1HYGbvf8fVom1MEKY7oVTms+jngXjeON6Dwv1+zaiyDWTV2sPm33kiddhU7GNlKgT/NglNBNHozUo1GfOKsvRbsaSvToBpoGKBX70Mnd/aTv1L5qZSUM0aElFCvl8vdAYQ+1McUFuFJkNfILW7RpVDOrZLlJXbhP2yvSo/4JFFvIXW26CORK7d9A6cjYTc3skY0u3Okx6W5c8mIpRGnSXGplkcM3+Y48QKUcJ6QLIdJBjjcRRmjSvdyTxS4q1B68diHSIEYIEQNpQojolrdiCC3gYkCvB3ks1x9k+HsNayJHkxZzThb9GigdFZfrZbdvrBm9MnxjFfWs0+m1zNespEqZ4eQm9WySLC86qr/hF/W/JPOpUSvL3gHnfeeJZLlJuRQpEloWqkJnwAz1cg3eNmotPHFSN/9qik/7ta+lQe8A6mw5hoyGKcIwO3kbrkltzzhqKG0vOCyC6ZIUNcf57DCi82GN79b9PhqQHCNaGXKCCaZve+jLaaGHH8dgf+b+4JSudFRRPdx/76CQj7dDto4MOwmTDUbjeEhzlvbsHoYjhvMfV03zYo32hBtQZBfGtgbyZCW/WnnI5dXKzpEPl9sIk8yBiUL5M1ySRS25Qt0fOplJkQKDA6hbpdlg/8t0YVJSUtIVbsniDftksc0i1c5fpZFDdWIzpdbzE3Z4x2LkwqSqAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAAA+CAMAAAChgZ0aAAAAAXNSR0IArs4c6QAAAspQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGBgYGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaty+CnQAAAO10Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGRobHB0eHyAhIiMkJSYnKCkqKy0uLzAxMjM0NTY3OTs8PT4/QEFDREZHSElKS0xOUFFSU1RVVldYWVpbXF1eX2FiY2RlZmdoaWprbG1ub3BxcnN0dXh5e3x9fn+AgYKEhYaHiImKi4yNjo+QkZKTlJWXmJmam5ydnZ6foKGio6SmqKmqq6ytr7CxsrO0t7i7vL2+v8DBwsPExcbHyMrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4ePk5ebn6Onp6urr6+zt7u/w8fLz9PX29/j5+vr7/P3+lBpGjgAABH1JREFUGBmtwYl/zgUAx/Hv5jHP2OaYNYtoLETMNdcsQqzl6iBnUWIlcpvI0ZAZJaQtR6FSbQyJkjRjWHOFlmvGhrU9z+d/6Pk91zbz8uzZer9VLebWEX6qqUYbCuH26kDVSPcL2J3tqBoIPEvpiucHr7GQZVb1LcfaTzZxME/eatwivFXrtu3ad4j8h82y20mWvLWdMhNkN41iH3lpC2WmyW4+d+StVI7ERPfq0b1bl2wO+MrG9DsZ8lYK6XKYAMtMUp1kGCpvbWavnL6Dk8nrcmCbvLaJfXIK3ordxiB5bQMH5Bb79ckT2waqGtZzUP+DdRzS/yCZX1RVjfuPm/vB1BGRqiyJI6qSwMlppTicX9NND1jNUVWBaeIVbCwXcwoxbG+jClZyTJ41+xXYOzXCJCloUPJVKJ6o8hLJlEfd/oKMKLkFzCmAZJPKLCdLnjxzh9K3VEHz32CtyizlpDwIzuFOPz2g7k6Il9uHnJYHu7DGqZK6h7F0kMsicvRo0ZCghwi7wbXdP6TtyThw8OfDl/j3j6yTp878efbchUt5127kF9wpul+SO8VHLj9x3qyHicezb0PkEAnj5dCwX2xzlfG7zLnUlC8+3/jZJ2uTVq9a8dGyJYsXLpg/d/bMGdPfezd+yuQ398HFGNnNpshfhoB12KS3lNtCbpv1KLUSLFjm1ZLNIXbJUOcodgXhcukCA/RofS9Bepiku8TLsAASnwyZVEiG3IqYKg9Cd8PpYNWHYTKcJ0U2E6GFXLJZKk9837fwjlpDb9mEQKxsGsFQuaSTIo/a5DNfERAjmyArL8umKfSXy0HWy61tVF05Ne7zlFxibnK/o/xhpAzH2V9L0hIIlUsuCXJquQ+ujpLBZ9Zd+KaZ7EYXc2+EpOvMkmEs7B8+aBNskIv5PpPl0Pc6hjV+UtBODPmvSvJJgGu9ZPM9+2WXgl1mA7kMhC6ym1pKcXyf43CwacRx+LHT7GLYGmxOhexWMkzC2kR2Y05ZubjELLdPudyufYfIzl1T4UpPKWAr3C6CVSapUyZcPAR7GskuzMoCOQWFqZzQe7hZmskwrQTujZXBvNwKbPaT05cUPa6HWUWZYjm0mTMzXE4xublvyy38Pjt8VFl0CTt79ege1bVzxwWUyqNFsEiVPJFHXhM5vIFVHpl2w1wfVfT0GUqi5TQe5FmDLPiqocqLu4X1dbmMBV951jgNbs6oJ5eoNCgaJrfRYFIVmBItULhjQkzbpl1fWHwKyO6qMq+Bn6qk/S7KuTq5tsoZCf6qog5zDlsx3EoZUk8VvAL1VHUBrXoOiAxRJS9BoGpuONRXzQ2BhnILGTzqWbOqIQ6C5VR3tQXIHyfvxUKIHB7LxmGLvDYYQuWwFZLaB/XOgAny1iAIk10MzJGN714K/OWlgZC0dHniyo+TjpJfW4Ye0E9e6k+Z/bKrB2PkpV65OaezszKPHT3yN+dk1wZeVLWNhIEyJGJtomrzP0HeAMl3uoVk1UC3EshJvw65gaqJ7icw7ApVzZhHr9+24jlV8B9T0a94882ZyAAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con4 .item-l {
background: url(@/assets/v3/bg4.C7YndXK7.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA4CAMAAACBkfufAAAAAXNSR0IArs4c6QAAAjpQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWHx8fHR0dHBwcGxsbGRkZFxcXFxcXHR0dHBwcGxsbGhoaGhoaGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa67X1NQAAAL10Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcZGhscHyEiIyUmJygqLS4vMDEyMzQ1Nzg5Ojs8Pj9AQkNFRkdJSktMTU5PUFFSU1RVVldYXF1eX2JmZ2hrbG1ub3JzdXZ3eHp7fX5/gIKDhIaHiImKj5CRkpWWl5iam5yen6CipKWmqausra+ys7W5u72/wsPExcfJyszNzs/R1NfZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dy8/T19vf4+fr7/P3+eSKkTgAAAttJREFUeNrtlvlfTGEUxs9UktJiC61SokmkhEoIKVsSGWtCkZKKbJOiGU1IWZPQokWhzTRpaJ7/zae578x9Z+beWfj4zfPTuc8935n33nPueV/yV4qKIaZ4zlQwL5LzgkgJUa0WbJwzfZn3kPO2S2MT7mAHhX9u5rFqwbvIY+2Cl8kwpeCr+UWeEYJ8HtMJQdh/TA5rVpvVzRdAChsS8ppky92kyxWCbTqdj2S5Y1pF1RAvL2+byzIucQNJyjvt2ouBn7+GXtZm+JK7mlc0Iq5nvHiBe1TaRwDf7pcWFly69xnA4C53qEIj8GQLey5FshYwFbumzgNfdvBGah9Q7Yraa0JHuK217Blw1DkVoUfPEntzYQeMCU6xBhjiHN3wUTy2s0JPWZVDCSZckfo1FZBBmWJmBN9cOqrFaLAU5tuDJlLbzZKpSUEaxQDqpBdfBr1fHUvT2344ROvmDEklzq2SKcwe2wcsksYURhyTxU5gmkVRD5gsL74Pl2WxUgywaL3l4S0N8wo3ZTEVDCxa1cKUxIxesTIOWC4QItMHMzguiyUC6dJUPJBljw33C6r3GkaNNHYBBv8qljZkN4J0dAsjAVKUTxe0tl2yosyqfNoIlEhhBUA25YiZ0Xb3NZiMdqSWD6ONnGn1D3Q6NLPfW8wmO8XoMNAeamsFvwHOkgtVAJ9SeGNtJ4B6L1fcuVlAY50BsWoT8B644QqjnXPDsbfm5IE8VdU7AGOH5rcAlS65gJJJsUTTlSFEAW0ylbGV/+67XXrA8KFhf5DwWl4DKj4j6pGoChs2kG/rpZ0wHSGiInOiUnp/u9PI5v7mxka2v63sxmwe0W1xBD3VmtXvfDeNHIQxi4q02haP9m6K/YrpNI+3fKKECXxP8hyjlCmMrfEQK39+ndJnUP4n55I9V//6OJMdZZaGL0CF4J3msVbB2yR7nPlnh97AraKsAzOVMy0n8zjOW+z6a5DUb7XEj2EfmeDdAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAA2CAMAAACycDqVAAAAAXNSR0IArs4c6QAAAg1QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVFBQUEhISICAgHh4eHBwcGxsbGhoaGBgYFxcXFRUVHR0dHBwcGxsbGhoaGRkZGBgYFxcXHR0dHBwcHBwcGxsbGRkZGBgYHBwcGRkZGBgYHBwcGxsbGhoaGRkZGBgYHBwcGxsbGRkZGRkZGRkZHBwcGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaHBwcGhoaGhoaGRkZGxsbGhoaGhoaGRkZGxsbGxsbGRkZGxsbGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaino4mQAAAK50Uk5TAAECAwQFBgcICQoMDQ4QERITFBUWGBobHB0fICEjJCUmKSstMzU3OTs8P0BCRkdISk5PUlVWV1laW1xfYGJmbG5vcXV2eHt8fH2AgYKEhIaIiYyNjpCSk5SWl5mZmpucnp+goaKkp6iqq66vs7S1tra3uLq7vL2+v8HDxcbJzM3Oz9DR0tTV19jZ29zd3uDi4+Xm5ufp6uvr7O7v8fLz8/T09fb3+Pn5+vv7/P3+pK9UKQAAAoNJREFUeNrt1utXTFEYx/HfyIyaSqSbRlNpIsklhCiUa8n9FlEk1xAq1yKXhESpUJIQRTPfv9GLuVTUzJlWyyvPq+esZ33OPnufvZ+1ZXUEFybJQXBhmSrZYPirir3EIaOR54+E2mcGSdZ+4e3ioMhGJ9C/ZHKyK9cX67xiiJ8eEzlazT05wSKPeET7Y64OuE1qgP8y4hH2Rioy3WZCkmH1RZhkG6bdrkYqlDlAR6hMo1Xrpkmmn/vaLjVSIWV2LTa4YmHyEIUF8yvdRNNFLDabxTAJt9m8aezqgw03/JJXdbtXzPY+hOScawMYCPFDkgFczaeyJEkVAHRXb7P6IXHFtX0AFEiKdUFbQVLgucxI2/MBeiQlAvQXhgQk4YdGgAFJpl7uD0NTegCS/QY+PuWeJNVwJ/UuOI9F+iHzq4Hzse85IEk7+TrTlN8DnWsmIyGF/dC6TCmwSpKywCFFVwI1CyYk6U0wtDdUyoMYSQofYbMkLW2Bb9vNkqRFRz7RUZIiSYosdcLdVEkqo9X9kkeckSRZigahOUOaU+05b0ctUk4n9OSbJEkPqHKTjIUmzxfY68BVnvQC+houPxyEuuQaoDLaUzenp0mSOT7ePDrR9d3wA8ojJCXchF/QkjlatsbH66/NH1XmgrPu3PQEvhdZAp+X6/R7d5vNxX4jR6yFS778OReNkHeU+PJqbhkb5YIvf2ZslCo6vI0l0clWI2Q5HPGsWD3DiYY6TC2cCJcUdw0OGWtK815Cb/3pe1/httlgH5t7xb3HnMdnGW99GaWf6dqXOn3d8j/5N2TLynERM4YkjS8dnuQ+lj2G7DB2hQtIzAl/RqgkxSRESVLEX1VNJX4DmRADv7Vqo6QAAAAASUVORK5CYII=);
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA2CAMAAAClUqpcAAAAAXNSR0IArs4c6QAAAZVQTFRFAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcFBQUEhISIiIiICAgHh4eGBgYFxcXFhYWFRUVHBwcGxsbGhoaFxcXHBwcGxsbGhoaGRkZGBgYGxsbHBwcGRkZGRkZGxsbGBgYHBwcGhoaGRkZGxsbGRkZGRkZGxsbGBgYGxsbGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGRkZGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGRkZGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoa3tD9qQAAAIZ0Uk5TAAECAwUGBwgJDQ4PEBEVFhcYGxwdISUmJykqLzc8PkJJSlBRVltdXl5gYWNlZmprbG5xcnZ3eHx9f4SFh4iJkJGUlZaXmJqbnJ6goKKjpKanqKmtrbGztbm8vb/Aw8TFxsrLzc7P0tbX2Nna3N3f4eLj5efp6uvu7/Hz9PX3+Pn6+/z8/f7+aEnfAAAB/ElEQVR42s2WaVfTQBRAp1AoYhVRRHEJirumtbhUcVesuNPihrhjRVRwX1CpYi33d3sySSbhMJ5mAni8X5I3yc3kvZeZE4GiIoxYgHgt41AyFzPy2BtfrI0YUAiJRpRDYnUoMhNzRIMcz0ux1Otww1yM0UdHrCimzMRYLKrYuF5La12xXd/wPUsnJi3LusszS1Hgm2VZqyIVp8i9IDjMVOSqxhYHuR8Eeb7UEdPX/UROMx4Mn1FBx0Gt2DTKc8/cBxv84ebXDHneJMe0Mx7CN5dPM77CHUwUYavvkdXnGJgH4GmnfP0S3J7nzSuOY8pvq6EfvmeXJXvewSM5d3vYk+LPML+hz72Uq0B1BjiXkvFVeDOq+DRnIbtc8B66+4cTzV5udMOyZrMq5nyOfIZud42crMHX97PwYLUcOAGvLg4EHFWblRBizQTk3Nbcgo89CbF2BN7KKqWG4UqDbkMOe+I4DK+U3chDOak1ldj0Unltv3jc4l3vg53CNwe0M+6oep7YT61D3VDmjvDMmW1aUXT6J2cZC244xaR3lrL0ORosq/9DbLFt+wkvbMVNpm3bXldX/Msut3fpRJHQEq04Rj8PUWjdrthkJHYFOQ/+M3FL2uGSFLPNUdkIm+UTClI0YhHEXQbkw6IJXQsQxx46fDAXgz6akM4oukVc/gDJXaMPEeEHHQAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAABACAMAAABm4HQzAAAAAXNSR0IArs4c6QAAArVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaHBwcGhoaGhoaGRkZGRkZGRkZGxsbGxsbHBwcGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaefXWRQAAAOZ0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ2Nzg5Ojs8PUBBQkRFR0hJSktMTU9QUVJTVFZXXF1fYGFiY2RlZmdpamttbnB0dXZ3eHl6e3x9foCBgoSFhoeIiYqKi4yNjo+QkZGSk5SVl5iZmpubnJ2en6GhoqOlpqeoqqusra6vsLKztLW2t7i5uru8vb6+v8DExcfIycrMzc3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6urr7O3u7/Dx8vP09fb3+Pn6+/z9/v6gHUxNAAAEWElEQVR42pXW6UNUZRTH8d8MKjFkijoTblGampiaqUkupS1ILpVbaWqZK6YilJrZohmmWKhJuZRFmeZuhSWYW9mYikCJbLLEcqfv39GLO+PMMKvn1TnnPp97n3ufu0mhIr5Pr1jdaYzc3wT1Xzx8R8jyJmY0z74TtQluLh2buqoBFkWvsuFIoiT1PgOLo1UfwSGbmTuidpaNXiXZi2BJNCwdDtu8pb0IXoys+hsct/k27L9TY4/ItlJ3v39nhBHFNMvIbt06zNFIygYzJUkxw194fqhVkrSG4kjMAeMlWeeWAhTPskh6napIzA7jpbgv3TcXn8dK86JiaYo7AIXP2B2pZ+Gb2GhYF5gQ9z3ktJOk2O2QH7uAykgsxiB9P2yxmKV1G+R/wh8RF+AM5ZBj9ZTWXKhjV0S2FNhq9dbWXGBSRNbhHxof8W1McPGzJSLT441UDPaWaU383TOykp72deObuJEcjTKde56p0alus9blHb1Y4sK46nRevlz2H0aJ88TuDbO7hTadF/9EyDi1pFNQFLewCjDOHchdnZWV+1Zm5sqVGRnvZq9YkZmTX2gAlfPvClSjr0HLvhmO4BNxTPvKgKsprfuzmmHfQz6NhGEJ7R/r4tNI/hoap/ur96FszO3KNiX3gouUZHDmzbj7dvvJcljlqxbCr909Rc+1lQCkJANwa3OSZ0vSGZjrVc8aHIt35zHz6oHCXSbbUwA0LPNci/YFtDzhUd1ruHKvO7/vR2jIGax+Jhuu/u/Vw1nPAbuWUOm5ap/y7yB32q8YDiZJXib12AM3RrgHDGtmvfsSGaxxNweV02J+mnyYNL2JuiHuIRtp6iVJ2kul+wZI+IvGCQpkGlXDdfftlVjLNkm6p5Gl7j3txZWqYEzjWjjpfnZXcytW0mToYzam+ixLK6ZX4WUzexSekrSDC2bdxklB21DMcoJy81Qs18iW9CfvmFumwViFYhps8JqZbeEXSQ2ehT/NSYVm+o5zZpJOmZQAE82VhCnh2EQYZi4HrrbqB3MkSS/hSgzH2tUzT5KUCV1lv0ZzmiRt55QC2MZF3iglT5LmwOl46cEyGsdKOsKOQOYflyRNdXHeIUnJN6kfKZ1nrQ8bByl9b7SKEqsmGzi7mkOGVFP3iipY4FVDq6nvpYBos7yF4tuPX8otKKzlYz81RlPT/WLzD0VXoKSvdy8DLgIc81cZwd57J3r4Hr3t9PwGfmutakp9w6B2R2rAR2Q51TH+qiDBb0ApWYFnq1EwNJzqC2lBWGwtH4ZRWkddxyBM66nvHFrFV7EpmNIDBm+HVFoBA4MybceoCaUGNrM7uFKXMkKpDkVUJIZgei6Ush0L+y+6+omgynEEMhUuMsDZWo0ugQ1hlSXLBTsH+LaS81wYb0T6Mxl5CTg4s7dZJc3+1gXXRyli2DKrAcqLDh06WwFQtaxjZCWp/dxTLs+DYhyf3yEqJEnqlJb+wc7P1i2Y1Dn49v8BUIfpizuTif0AAAAASUVORK5CYII=);
background-size: 100% 100%;
height: 32px;
width: 27px;
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico5 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAABACAMAAABm4HQzAAAAAXNSR0IArs4c6QAAAuhQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dGxsbGhoaGRkZGRkZGBgYFxcXHR0dHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGhoaGRkZGRkZGRkZGxsbGxsbGhoaHBwcGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGhoa8hNQ3AAAAPd0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaHB0eHyAiIyUmJygpKissLS4vMTIzNDU2Nzg5Ojs8PT4/QEFCREZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV9hYmNkZWdpamtsbW5yc3V2d3h5ent8fX5/gYSFhoeIiYqKi4yNjo+QkZGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i4ubq7vL2+v8DBwsPExcbHyMnKy8zMzc3Oz9DR0tPU1NXW19jZ2tvc3d7f4OLj5OXm5ufo6erq6+zt7u/w8fLz9PX29/j5+vv8/f3+/vwH9BgAAATrSURBVEjHpVZ7UFRVGP+duwvrZQVCZeUlqPlEfEw5+QgqozJTEx0bzJpMRxudTJ2mJk3/k0zTBh+oNb4gQHECDS0UsVFSBx9TNI6jaKnxRoFdwJUfEyu3Py4Ly+XCXqdvZ+fe33fu73uc75zzHRN6EuvgZ5qf4CnlxewGsu5AzFORxBdUpXHx07C2keVrXp2xrp5caZy1lTwRAgDPXiE/Mcr6hvzJT323FZGrjLG2kLl+bhRslLfak6XyFnhnjXIy3+qpCP6TNcFeadtZO6SrZpLTQJj3uE2ryuUprcqswX6huA4AMD03VLlb3AYAV98Y6o1mBeoASIu/DANQtukHBaiHv5Ym6VQAkNNSwgAg8rv9FkDp/o2kl5+cOR/FcyKj5t3AwlSLaql36U/OlnPIZF8AsOwmsywrWOWNZnJydTaZ3G5fSiGzdvK61wIUsYxM7ohd2kXW8qCRtcXtHhlLu0gmeKUF3KdjgqdiVjMLhfdFOcXBinGdcGYD/4kysgVed7BivBu81cDSaGP71IM3oweWJuqI+CHh4aH+YcJV6YKAPFB6UtNSVVn919nyHmn9F86b3GMI17Iz7Ho0ecn6IOBJSVlljQsR1S4oUBAg18AUGho5zgTYkw61dLP2UgnZlPm+Td+XbWGGk7zVLZhFjWTGqN4mKvow6Xivq24jee9lbzM8rYxc76n4mLw4yHtlBl8hl3bC6U6eshqpqP95Nr3iBoNqeHOgsZUQ/jcr3bO2g/axRvvDxEZ+1T5FTm4w3o22sGEoIIDURPtYu+4ngcstAgICEtSn+D075Lr/gZUAAhxco284sIBauQqs5wMLzIjvg1/0N+yPsbjTqkCBgjYoUDDS+gjI2xAQdxbYyz/0WfnU5nyOWwFRwq0wIxa5AA695rgjICCEO42oYdiUZHa1H94uAGgDACVvxWSYEYZKAGMHDBiu9ff1xqjDm09a0i8dT4hfUt+xYUoRDnOQHx4CaEJFIRQoaiqKAgU390w9Yjs4IWr2bMdmcT7xpvtUr0WIj9kGBAOoRtFSrbfE7y3/flY5H86s4KRh5xLPt3sLh7AhuISNM4FMpmtZQQ0sjwOO8RiQUMd7AgX8FlhCXrJKtbOqfDPi9bqKABTAJw6FgEWCS4ECgXdTcGveYwDR5ayLS2dGN96CBjZ++AI5VVpHVsUCZ5ic4OSNcHV4QjXrLjNT5+JVytq1rLc838Ti4QDyebGJtzta+6QakgU6JY+6ONc2dxmwLCcIAC6TvDuic3h0MXlBb6m4e7QJAPAbeSayy/AFHkVESsoQYGBSft66QGDivv1WYPTeotOfysCc9N3AaeZqjuM0HsEYciL63ybJazLeJvsh2k6SxwVWshQ4xR2a3q2of4EPIlvTshAzX0Wr5MadJ/FmLBS1HkITvAKh1i4G55ZjXPRIFY1H6lqfB/KIC73fFAR88Bh4BF83akZrKyStt84gJdW+4hFyR5MQni9dvXVRu1HHmus0qcmtXVuOKXHmGFSo6H7MrF8HB+ChV28/KyFn8vq25KsoBzEF+1BVqPUmab1d/qgJqFtUoqKjnzcDt95xdEuiXfYzB1K/IDMA3zGjTABMfjIA+I6MAAAhCeAE93TLzSSLFmHpA4Fy9FVPIVlAwA6b+1Ty1Sn3dLuRa3tvF0Pj9KmDoHj/tT24gf8j/wFtkTXADxi+NgAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 32px;
width: 27px;
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico6 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAA6CAMAAAA+5Q8xAAAAAXNSR0IArs4c6QAAAtBQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGRkZGhoaGRkZGhoaGRkZGxsbGhoaGxsbGhoaGxsbGhoaGxsbGhoaGRkZGxsbGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoa99eAlwAAAO90Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcYGRobHB0eHyAhIiMkJSYqKywtLi8wMTIzNDU3ODo7PD9AQkNERUZHSElKS0xNTk9QUVJTVFVXWVpbXl9gYWJjZGdoaGlqa25vb3Bxc3R1dnd4eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbn6ChoqSmp6ipqqusra+wsbKztLi5uru8vb6/wMHCwsPDxMTFxcbGx8fIyMnKysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9fb3+Pn6+/v8/f7U/243AAAEC0lEQVR42q2WfUwbZRzHv1faCohACxtmRaEDJ25DQNRoFBx/TA3DQIKbMrJsi4uR6HyLiv7nNLLEJRjjNkxkyWQZuswQjZnRVIcvS1QW+aPwB87h7Chv0t4XSZpNurXm7vpyK3ftrvWXyz2/33PPfZ57nt/Lc1lIIfll+YEQMpKHh/ykp3dtBghrLxXxtqTPOEKOP/1AS4+P/vYMGB8WSFrtGP2Pp8Ww9JMHsxR9bZoUy0fkoayo5XRTTIPyLnnYHDedbvoajDIeJPvN6g7nOY5lG4Qc4+/2a3u2kAZdlDvPFxL7zvKgzmizdrfDijHFz3WOq5PjsvprZaUxSA4gSoiul6RAmdz3JQAiTwdi0u4Oy3fbyTflYKsY6DElW7z+QwG2oUYMb3Fu3DmFrgOmCNiAbCTvsp0mu+VJ8gfIXtM7/MkYpJTc/h35SsTM/ph87xg/NQbJOs/z5KsxW6LM8S2D6zlA8jWVnX2U5N0GIbdO01Ou7thJHjGcgC0i3c642SnyrM14Gm9TUzpEjpamU5W2inRHKvSTIkdvQZKQ0pLKhopVpSX5qxCcuyoAeUUILlz2zi6MDS9cJ8TR2bpeb87QmS9OBFJDCrv25gDL5/70iSHcPCunUbjoyiIsxcW3VQGY2/fZlVROmSRn+9oKdQJ5x3GSP9+eFCG8LFJ8vyzZkHuGyIubkwww95G/1aTyWpuX/t36j3vIT+ypfV/tptist7Edh3Hy2SAsBYLcL0CrDU0BJV+XBx4d14Tc6bK6mwNAzffJPsNbDaDKlee5/5JWZeu2ijsCci1NJj7pNrEHZbu0CnVjM96+KCl+4IMzcnhI17Xti03T8uBvPm/rPiGunOJbjloVbYa6mz/IQ4pS5efrK5dTUY/9y4oqolgP4sCSokwMYttKyCYEXbFlF+lBihBdw1dwrl8BeQSuxagDUKAHsUk7JsuPl7A5ESI04nS07x+oUsf6RGPcyMmN+S7gQk0ixH4DZuIQR/y9Zxab6mKGXXoYkXmUJUJWA3/HQ0G1sablYDwgC1WQGaxJhBQj/qYPqgTqc4yMxox8FaQcq7MSC+IFeu+N6K3kTTrVhoyW/DfIwRUHef0UPbWK2kCWa0M66I+8uJc8pfGncd80J+9QMpGs04Y8x0lF2U0OF2ok4C/b/7WfekzSFuXFa4ldCZPc/b2Y2LqokYD4YddR28DIyAVYgfZKVSExxQrKJmQ/D8u6h0rwR7tPVU/W9ceLzo1rzNd5sF1eCkXnEJbqzTnV6ZyO2apfWgvMYeA4E+rGhqIwQkBYvstXCILSzv+VUGfqWwXZFbXIQPbQA1MYmYogu1jIBBFO+gtqQKSN7WxKcs6kajdAkIPtqYy/JDirdTQYaMPE/yL/AQn/nlzVMLtOAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con5 .item-l {
background: url(@/assets/v3/bg5.EqAxWS0a.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAMAAAANIilAAAAAAXNSR0IArs4c6QAAAbNQTFRFAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcFRUVFBQUEhISIiIiICAgHh4eGxsbGhoaGBgYFxcXFhYWHx8fHBwcGxsbGhoaGRkZFxcXHR0dHBwcHBwcGhoaGRkZGBgYFxcXHBwcGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGRkZGBgYGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGhoaGhoaGhoaGRkZGhoaGRkZGxsbGhoaGRkZGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaYKSRzgAAAJB0Uk5TAAEDBAUHCAkMDQ4PEBETFBUWFxkbHB0eIiMkJSgpKiwuMTIzNDg5Ozw+P0FERkhJSktOT1FSU1RVVlhZWlxdXl9gYWJlZmtsbW93eHyBhIeIjpCRk5SVlpeZnZ6jp6mutrjCw8TFxsfIzNDR0dTV1tfY29vc3t7f4eLj5ufp6uvt7u/x8/T19vf4+fv7/P3+HFNa1wAAAi1JREFUSMft1vlbTFEcx/FPqQxG2m6MZQaNpGiUiazJVoRsyXIThWQZIaJl0rQwTNP7T/bD3CbPjOiebD/0+emc53tfz/O9555znyP9JLlWoEhmCdgxYOhKoXuacylJKrE61/gGzNxsrmnthmTYpT0MfVskSaFRpje6srnvGFnvjPfMcccVroZD6cltpvLd4IskPelJPexygzsZWJhY0OAG36VvYeKBYyv4z+BK27btQcbtdLqg17Zte82v8VEWy4Yl4Uc9b6Lve9J5GI0+7Xm5VPyj/sJ/Fa/aGd5sigPPgHvrjLBnCIAuI3yaueNFt6DcBF/llVQOIRPcSny7WmCrCbYm+ToKj3OMVrs+BkR8ht+5dIT7+cY7LMI1rWAX2NpU+G/OsxFe1g/QHPvOLpYC/T9ZGzLOXlVgnIll4/2WSdpTuMJosS58h/1hqaraKZwpkc47FzHvOck66RRqg9IRXyb2jyUaq6amU7qNSHEHvR5J8vbTbg3SkrqHxmPB5uSwLwsz+5k05iMLmBhpzEySLCz/BMTn224Dnsy3/Zx5K9UmYCyrbVXNwGyj80wHMFDi/BDeAu1OoXkOJoOZuHKKTxMkUnfM6zAEkUJJKh2ED3BZknQiyfgXYjsycNnr6Wr/WDQgSWpK9nra6M6TpIIHtHj7EwclScHYsC8Uf1GU2XbZbskfcLqr80gNealxwQHJu88pBH1STXHWO5tuklOVJun8DQfDHK8OGGfbN0W21rQF0iFVAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAuCAMAAACvSe/GAAAAAXNSR0IArs4c6QAAAORQTFRFAAAAAAAAAAAAAAAAAAAAMzMzICAgGhoaFxcXFRUVFBQUHh4eHBwcHR0dGhoaGhoaGRkZGBgYHBwcHBwcGxsbGhoaGRkZGBgYGxsbGRkZGRkZGxsbGBgYGhoaGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGRkZGRkZGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaTYzvEwAAAEt0Uk5TAAECAwQFCAoLDA0REiMnKCkrLS4vMTM1OD0+QklPVGRtdnp7fH+DhImKi5CQlZydn6Cho6WnqaqusLK0t7e6vsHCy8/R3OLm6/D5JIZOigAAASJJREFUeNrt1VlPg0AUhuFDB9z3VlzQ1rpXxaVYtVqlo3X9/v//MQykAk0snKGpF76XkPMkc0IYIlXF5rVKUR/g9VUg4DIO0IgDu5S/nQCYcYI+ce7krBwBNvP0uC8Q2J7Pnx8HbMb+HooGFlqqAyLRGt7iILARLkYSWRn2tzkIrPiqUyLhD688gh1oA8sd1Qkb+FkiE1i6Ux2Nbwf/QIaByta6HuClvhFtoIvnavVCA3jtXyzjAh7RmQ3SW6LKBg5rYWfNq+ZlLZWTBNaix7048Gs3SeA4frEUA1CpnzCFKUqpjCRgpF9kzcvxt/qDwMS+FQL1Od78E9qWB2m4eGEJ5i3QvoZ0ATlNXOEN74CcYi4hEKAxHwka80Tmnt+YpJH0DZhq6TgD/Ay+AAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAA6CAMAAAA+5Q8xAAAAAXNSR0IArs4c6QAAAt9QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGRkZGhoaGRkZGhoaGRkZGxsbGhoaGxsbGhoaGxsbGhoaGxsbGhoaGxsbGRkZGxsbGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaU0yUGgAAAPR0Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcYGRobHB0eHyAhIiMkJSYoKissLS4vMDEyMzQ1Njc4Ojs8P0BCQ0RFRkdISUpLTE1OT1BRUlNUVVdZWltdXl9gYWJjZGdoaGlqa25vb3Bxc3R1dnd4eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbn6ChoqOkpqeoqaqrrK2vsLGys7S4ubq7vL2+v8DBwsLDw8TExcXGxsfHyMjJycrKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP19vf4+fr7+/z9/lcEE90AAARdSURBVHjarZdrTFtlGMf/pzcKQ6Bchs7q6NgG0zFgTGdMFMY08EHZmOhQYdGImWZL8BLjNRpNRoKJUwwmG5sBs1Uy1DgZH3TZhjo+zIVEQz906ibhMu500P7rCMXWD6eXQ3vOaSs+H/o+z/ue8zvvcznPe6pFFEnJSXF7sSKp7HaSYy3rZJZ0MSIMLRRlsip8Sd86N7orJsYX5O8vPlDVPE/nE2GMdpKu2tgYx1MBoPgKnXsjGLFQ9B3kEa2or1tO0beT58hwtAyjnTyqDVgWO13BG4R2sm0vudFO52OqkI/INkkCLHbOlwaMF9imqyETLPbhAjXGg2THsiRaBnnFGDAqdKghE2BRZaCTf6Uvn3mUlKaohkwI6Bp5RlIFWh3Lp85cRbnCExXq7nYDBsQ8l5iXrtoAAJfWb4gPkgTMAjAcfDUVwLV3vwPgQLICRMEdHwDA9O0HqQCQa23WqAVQeVGA6UwpLlSa8+pGcOCwxg+ObycaU3cRmnb3zV0/vb0bDR9rtCoYWTGT9T+Tr/tNo5X8tJNfK6RYQbRDHCLfCNpGKznLQ/FBcJjkmxLbeJLkvfEVGz75G85Oib1wAfjmcryNscpFuyVk7nPxNxPidAd4Ukqpc9FmRvwQ1Lpo93fop1203bF8taSpSRcqKTlZX5a72nxrShY8E/8IQHIGPNMLI+NTtnPT8nUZ+fLtq75LaXfei6e/dEeHpB1sTAQW/7g27fDitjHAB/gyluagz8zamA9g4r1TS9GSMkzOHNuTplDIz5wi2Z+vihBec9H12Vq1S7Z3k+MVKhfojpEDRdGytmeSzgbl5Wbyq/Toud9ip+sRpcDWHUHXfg/0qQIgAALkRu8IkH0+x/2QTRZS2GsYeNgNFPWpbWM0H8Cm3uShbTflmtJbBketG4BD1ZcZALA/i7XPye2krAeNnwPAqkm0XIRPrJCw8ZXyHvEQP1E9XyDztJ9oM4jaNBWD38WjorLJybcj3cktwaFFUXUgU7FtYl5U7FbURkJ2wvN90O0MJUhGMGI9sNwdAanE2Tm/OoI0JYgJs37tx5uoCIcIpTgfmJuXQgxPlYWMxCTc8KvusygKh6Qn4Hpgbg6SJnbgRvnWoJEOBLaLCeSEQ7KBqVApSAKrWfRoJN4EAguMYU04JAuhO2cgeYFazb/0B41UBN1BDlZrwxviKCfv8+vV5C0K3YYMtPx3yK6I8+aeCY4Vi2opmSMPqaPTf+NL5A8yXxr3T3FY7K2F5FZ5SCOHRaWB7JOtgx2zHNkFAHeSO+Qh7/NXAEj6kOyXBF/ypdRbf8JkvXxpEAbg8Q2SRqIJNpRyGF+GPq8sG39WzUje4ryOUNNZtSbWvw4LTm/gGYJziy6xAP9BjMaQrofOB5x0hPWNzZk+eAGv+At44YUgjpODYX1m224BKCSLsQLZzzFofFipCNAoHuoxik/1EzQO0fmA+p0q50y0cTME6AA8v+KdeMbljoY4Rp8D/4v8C2Rr2YaJzeY6AAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con6 .item-l {
background: url(@/assets/v3/bg6.hlVmcDno.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA0CAMAAADhcastAAAAAXNSR0IArs4c6QAAAtNQTFRFAAAAAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiHh4eGxsbGhoaGBgYFxcXFhYWFRUVFBQUHR0dHBwcGhoaEhISGRkZGRkZGBgYFxcXHh4eFxcXHR0dHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGhoaGRkZGBgYHBwcGBgYGxsbGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYGBgYGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGRkZGxsbGBgYGhoaGRkZGxsbGRkZGxsbGhoaGBgYGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGhoaGBgYGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGxsbHBwcGhoaGRkZHBwcGhoaGxsbGhoaGhoaGxsbGxsbGhoaGhoaGxsbGhoaGhoaGhoaGhoaHBwcGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaHBwcGxsbGRkZGhoaGhoaGRkZGhoaGhoaGxsbGhoaGhoaGRkZGRkZGRkZGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGRkZGhoaGxsbGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbHBwcGhoaGhoaGxsbGhoaGxsbGhoaGxsbGxsbGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGxsbGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGRkZGhoavoj1/gAAAPB0Uk5TAAECAwQFBwgJCgsMDQ4PERMUFRYXGBkaGx0dHh8gISIiIyUmKCkqKywtLjAxMzU2Njg5Ojs8P0BBQkNERUZHSElKTE1OUFFVV1hZWltcXV1eX2FjZWZnaGlqa3BxcnN0dHV3eXp7fH1+gIOEhYeIiYqLjY+QkZOUlZaam5yeoKGhoqOkpaWmpqenqqytrrCxsbKztLW1t7i5uru7vb6/v7/BwsLDxMXFx8nKzM3O0NHR0tPU1NXW1tbX2NnZ2tvc3d7f4OHh4+Pk5eXm5ufo6err7O3u7u/w8PHx8vLz9PX29/f4+Pn6+vv7/Pz9/f7+0IfVbQAAA+dJREFUeNqd1vt/W3Mcx/FPLWJh7S6oDd1GU9cwVlUUXeuyGcNqdZvbMJvLrJShC5u6TNvJ5s4uGGHMjKkapi6rYG4TMdpVl8qWNssie/0JHueW5iRNT+PzSx7fT87zkXPO953POSJ6HX1SchVKVrWS5IrPzfn/GJoOzAqv7DvrU73wYUH6QUP6gXmXNXV105jU2b8O/KWpxz0Y+6z2jJTe8F/UE33T1Lw2QuT2QlNtUg+7I7EeL7kez3rYtAx4x+PxzE7cqFI/abW9oT1p9ZuMVD46RBboneXDDF0QTLVd+VKdintoE5HnIPr6Rmg5ytCn3VfaVy9A8HCR82G+1nBruAVWiMiCOPfYHoDtZf3c09w47fkixRHip2ud2Rq+6h9VHxrnSpEZYaIz03HOj7hVyyLpwwVwk1PRxy2EI0WkZBt89WR9arUSurUsBt/U19dPM3Ah3C2KBvZVKt0xzVjU/SYsTj/09hK+5ArPK8eM8we8yeX7e+un7RADtnm93mAqluE3TB7mChAHIhVyQPLlbtB+rm7IhBvPUdbNaVitMuATiFWk2N/98H4iPRnwdDhRSUuy3gCd+fs9y0digR/nW1GzFikyWi8pVmQWFFjgR/W0wIt6Z6JmiyPExlrgUUFNf8xSvXM8XKplo9bqtNX9XiElUG102nh6qGIfE0usauWvWKWvHd9DqNtkM2Nx7kSJQ7hS5OqaSSNWa3ucbAfAMuph9wUTA4Qr1wP/wsJT5jwzRQaJ1XIF2Ad7lNmQPoKtsLj2Qufokzuokezxu9r+NvJF9vhyPRs97Mwez4QiLRvXZ4+dcLFqX5XssSPIrpd3g7rf2eDy8qEOPRvPK/stY6ceMlj8GoQCsHTOWz9fo+z33i3wR8XgsD5z3Ho2XN3q0jRbMmJlbpx9L5xlNFppqaoz60xYnTliC2hfi8hhMEOdDrFJVvhmPRshvMbdg9XabPk1zwIv5y9t5jDN2LMt2mxZrIzGgfF1REeKeW5os0VqaLdZ4GNh7VzzzFH1msVdvD3QNR/hEEd/c8N4ju2pFBnt6B8/we5VX8I6byRyV2rQW2hr2EFv0+dsPVdEfqDT5/P52hPYeB7lSO7BaWG2jRFx7Uik5ae+14pCmKfYjts202OXjPUI4cYGVX/NujvVukV5M7hQy0YxlGfGG2nS0lLRnIiQgpdp2SiJMy+jzYU1Wlo6NptwiEC+SHUUaqdnqioffCAiD8GfJgzviRTHrF4m1LScmXitSOD4rIsi1hZWTV1rwmK3j4uq3zxlH7hO2KUetsRutyXfjSlvRIi7xaqc30Hr/BFp/bzzJlhakYMmF5nW/wHDiRiDSjYLFgAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA+CAMAAACsn+1dAAAAAXNSR0IArs4c6QAAAotQTFRFAAAAAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaOCgURgAAANh0Uk5TAAECAwQFBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYoKSorLC0uLzAxMjM0NTY4OTo7PD1AQUJDREVGR0hJS0xNTk9RUlNVVldZWltcXl9gYWJlZ2hpamtsb3Bxc3V2d3h5ent9fn+AgoSGh4iJiouMjY6PkJGSk5SVlpeam5yfoKGjpKepqqutrq+wsbKztLW2t7i5vL2+v8DBwsPFxsfKy8zNzs/Q0dLT1NXW19ja293e3+Dh4uTl5+jp6uvt7u/w8PHy8/T19vf4+fr7/P3+fNOr7AAAA5JJREFUeAHVwYlb0wUAx+Ev2zhcQZgZTIEyCo9MsYgE80wEs8ikpDKPMqjMzDCLLgU0ZKWUmlGmIRSm0qGWRyqp6SRImMixz5/Tw/ihO20bTz1P76sbi0nPsCpyqduc0LMnUxEqbsetZ41JkZgLnesfnfvaH7BSEbjld46nS9KIfVzJUPhepvdBuY1qxa7w7aFJhs2cU/iOUSnDMlwWhe0QtTKsoUvhq+FsjAY0cFDhmwVlciuCFxQBO66NVslc2sX3ZkUg8QR0HWi8DI6xioi10kW/XcmK1OS12z4rn67/J/P08h3f7Tc01VXOj1VYZh/Bx9lihWGVCy7W1VQP2nkGqLYoVMuh/RmzPD3SAlUK0T09HE2Rj4TdME+h+YSeTPkZeZGfFZJhTt5WAIthgkIxDTIVwE3dLFMoFoGrLxB4U6FYQlAbFIpxS4LK0X9utsORpKGYBzYNRR7YNBR5YNNQ5IFNQ5EHNoVs1Irq2g/mW+QhD2zyNG39VvuqsQokankn/Q5N0HUfwmO6LvkL+vW9FSM/UTvAdaKxDboKZBhWBfS+apJh4iVw7j/cCz9Z5et52HuHFLXQwYXb5JZ5DP50QmOa3KJ/oKvEIiXWwEb5SOqgPkr9JnVjlyRTaTfY40d/A21Pql8pFMqtAle2vC2FdA14F2eclFIPbQslmUquwscJko7ytQZYHVTIWxUtMsyDe1XYCg2pcsv8FU7nyNJHqQxf0Shvdg7I8ABkx52m+xWTDMOqYJ/iYbEMW2iWt3U4LRrwLKQq95f75SH/RJr0F+/L8CO75G0mPCc3y0GOSzLLi1nSds7fKrdcFyvkzdTA5amSFL0BFiqgKT3UxUvS3b9x5mb5GNNB36bCnGXN8KmCeANaXno4f50T1wz5md7CgG2JCiK6vA+39qcVQEJlG3DkCd1ATpMLrtSmKLDo9Mm36x8kTsyI078hbvyMOYMeSlNASVlzBs26L0Gepu504ulU2XD5iF15GE+99Qs0KHYLfloL5CXzFH72jpBbTCM4Xs+9K23Q+AW10FcsD7lOaHhqUtqgO7NePAknR6rfJvg8Sd7yz3E1S9fYLtCxNEperBUuvo2SNMXFbvkZ18V+XfMRFMhPORRJstM2Wv5KIFuG4T3UyF/cMZol0yXeUQDR7ZTJUARjFEAxpCgZtq4O5BTbZVhL5+pANsBMTSKoJhk2E9QiTTwf1JcyvHc+qMf/BiaidyHImEZ5AAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAABOCAMAAABG1vXNAAAAAXNSR0IArs4c6QAAAqZQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXHR0dHBwcHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGBgYGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaJuXLtAAAAOF0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBobHB0eHyAiIyQlJigpKissLS4vMDEyMzQ2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlbXF1fYGNkZWZnaGlqbG1vcHN1dnd6e3x9f4CBgoOEhYeJiouMjY6PkJGTlJeYmZqcnZ+goaKkpaanqKipqqusrq+wsrO0tba3uLq7vL2+v8HCw8TFxsfJysvMzs/Q0tPV1tfY2drc3d7f4OHi4+Tl5ufo6err7O3u7/Dw8fHy8/T19vf4+fr7/P3+qN2dfQAABIBJREFUeNrdmPlfVFUYhy+LBIgigkKoWba4VCYpmGFmWCIKoWimpYaSkaQSFphGhVRuRRlRuFSYEBahljmhFqAi+xYEM8oyM89/0mdmmOGcOyvzY9+f3uU+nzvnvOe859xRFO8UF+8lOOGQ8cZ4r8ikBmhd4AUYWQwcm+zNOy9D3XPeDXSl/mCwl3Ok3O/RU+FLVo9qLMObftKAoMWek2v7wTt0Vj+6vbFRkTaN8xj9ib5HHCYmuiOjIdNhYlHv676u0aXwuMPE71A9xyWaCNEOE7N/haGce7xBFd+MPqixe/HCLKuOQq7Nmakq+GnaI9RoFg6VoH5ufapijxq7LfpXq+2xWL0OUAfKotsuNvP/jo4LmzEt1G+saFjKR+W3zTUx1H6fuzzIY1T3o0Gu6d0zHqH+J81Pd5TmbVm7YmXa9g/KdOZAtvu+8BdQmx/vNxoKWn2kHfglziU4rQo4b/+Mb+p1oMjFSbGoGf5McjyO9Gb4Y4YzctMA+kw/Z9nxhdDqpK+9Dd0uj4Mdwwyuc5R4Ba495HoOl3Vyd6F9OG6Qmknu5v/hbprsGsf0Frpmua96gp7fguSQzwWGn/WkNb8Bn8qRjbBTjgStyS8+d+LgqkAVexTDXNEPqOeyjxgIO6AbWb/9eaESOrmb71Q/Q1reCZ1AQ/nX5Y1A21J12xMCEzs4J2a36jEcn282Y4qMDG+SRtLAhVHvNVggT2NTrM17uo0h6Yr0Kjxpc6rQiOPspFlcrA+00zJB8EMGOGS174V3hNR7GGKl0T0DOaJ/hhar+TLEjCYCtXymKkgJ3eKhvBWsx81hbguVSZIHbtJTsFxwIw1kjJgXpdccoNFup3ewT/Q1thXVy24hXkrXWbMSFUVJsZg9FMkDqBxZH5AmxM9b+2C6Za1YVCaiedx02Nq/orPELNO2T7SYPRwW0V3WLj8PxGJk0+ajHmsvb4r+dvQWYy6IPTBRWqNmvQDLpE7DsMW4D1YIcb8milXoKep95B3QZTEmwQYx8S7IDTUNqQSKsp/6EauLvWIi5G8GfhiduLSyAWrkpvItFSNWNV/InVwPBTbvBAyqbl5XKRyxPqZFvrelgDFFUSKiw8xbzJioOl4sNTdpvTzFiqLoaQ0y3S6/VJQputF9YptgrA17qpH9cnLYvAvNqHKEBhV6VohUcF2N7rCh+9Ro6BDvi2fGYs/RDPHCGtxElQpt1Gg0Wv7RaDRtKjSk1bpvzNoGyTIqSkZzQDyy/K9xVTxYPywQJW3zKC0l6kru8eTIUXy+YfhBOVSBcY0naDbkq0JTb9I/zz2ZaqTS7ovlMS31Ue7IGC11EfbhF43cmu+aTNY6+Wk7DejWuSL3GNE+7ziV1IcxN9AZGFEMNx51lp1TB7c2O/xwCn6rF36e4vwnhZ8Grqyyu3YFbWkEfUGAy5lYdsl0LT2WLHxQh28uNd0OTs12u1w21JrW7Z3KT3Zte2lj+u7jF/Umv3qJJwvGP7H4jnyV7iiMUzxVQHx2yZU+I+i7Ln2e+YSvMlb5hHj9F4Jb/Qfbt6tIIlhQ6gAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 39px;
width: 29px;
}
</style>

View File

@@ -0,0 +1,66 @@
<template>
<div class="mod-total"><h5>实验室已为超过 4000
家客户提供卓越的安全服务</h5><h6>即刻行动与实验室安全专家一同开启智能安全之旅</h6><a href="javascript:;" class="EASE btn">申请试用</a></div>
</template>
<script>
export default {
name: "ModTotal"
}
</script>
<style lang="scss" scoped>
.mod-total {
background-image: url(@/assets/v3/num-bg-wave.png);
background-position: 50%;
background-repeat: no-repeat;
background-size: 100% 100%;
min-height: 270px;
padding: 67px 0;
text-align: center
}
.mod-total h5 {
font-size: 28px;
letter-spacing: 1.7px;
line-height: 40px;
margin-bottom: 9px
}
.mod-total h5,.mod-total h6 {
color: #1a1a1a;
font-style: normal;
font-weight: 400
}
.mod-total h6 {
font-size: 16px;
letter-spacing: 1px;
line-height: 22px;
margin-bottom: 29px
}
.mod-total .btn {
background: #4bad52;
border: 1px solid #4bad52;
border-radius: 6px;
color: #fff;
display: inline-block;
font-size: 14px;
font-style: normal;
font-weight: 400;
height: 34px;
letter-spacing: .5px;
line-height: 32px;
margin: 0 30px;
padding: 0 20px;
text-align: center
}
.mod-total .btn:hover {
background-color: #7aba4a;
border-color: #7aba4a;
color: #fff
}
</style>

View File

@@ -0,0 +1,50 @@
<template>
<div class="secondEdition">
<div class="product-content pg-evaluate">
<ModBanner />
<div class="component-box">
<Product1 />
</div>
<ModTotal />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import ModBanner from './ModBanner.vue';
import ModTabs from './ModTabs.vue';
import ModTotal from './ModTotal.vue';
import Product1 from '@/views/Jyh/Home/component/ComProject/product1.vue'
import Product2 from '@/views/Jyh/Home/component/ComProject/product2.vue'
import Product3 from '@/views/Jyh/Home/component/ComProject/product3.vue'
import Product4 from '@/views/Jyh/Home/component/ComProject/product4.vue'
const activeTab = ref<string | number>('');
// 解析URL参数的方法
const getUrlParam = (paramName: string): string | null => {
// 获取当前URL的查询参数
const searchParams = new URLSearchParams(window.location.search);
// 返回指定参数的值
return searchParams.get(paramName);
};
onMounted(() => {
// 获取url中tab参数的值
const tabParam = getUrlParam('tab');
if (tabParam) {
activeTab.value = /^\d+$/.test(tabParam) ? Number(tabParam) : tabParam;
} else {
activeTab.value = 0;
}
});
</script>
<style lang="scss" scoped>
.product-content {
background-color: #fafafa;
color: #333;
}
</style>

View File

@@ -0,0 +1,41 @@
<template>
<div class="pg-evaluate">
<ModBanner />
<ModTabs :defaultTab="activeTab" />
<ModTotal />
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import ModBanner from './ModBanner.vue';
import ModTabs from './ModTabs.vue';
import ModTotal from './ModTotal.vue';
const activeTab = ref<string | number>('');
// 解析URL参数的方法
const getUrlParam = (paramName: string): string | null => {
// 获取当前URL的查询参数
const searchParams = new URLSearchParams(window.location.search);
// 返回指定参数的值
return searchParams.get(paramName);
};
onMounted(() => {
// 获取url中tab参数的值
const tabParam = getUrlParam('tab');
if (tabParam) {
activeTab.value = /^\d+$/.test(tabParam) ? Number(tabParam) : tabParam;
} else {
activeTab.value = 0;
}
});
</script>
<style lang="scss" scoped>
.pg-evaluate {
background-color: #fafafa;
color: #333;
}
</style>

View File

@@ -0,0 +1,102 @@
<template>
<div class="mod-banner">
<div class="banner-container">
<div class="txt-content wow fadejinzhiInUp">
<h1 class="zh-title">金银湖安全大模型 (源鉴)</h1>
<p class="en-desc">
懂代码更懂安全的 AI 专家
</p>
<a href="javascript:void(0);" class="action-btn">
了解研究方向
</a>
</div>
</div>
</div>
</template>
<script setup>
// 使用 script setup 语法
</script>
<style scoped lang="scss">
.mod-banner {
/* 背景图替换为 image_b14311.jpg使用 cover 确保全屏覆盖 */
background: #001529 url('@/assets/v3/bj11.png') no-repeat center center;
background-size: cover;
height: 520px; /* 增加高度以匹配大屏视觉 */
position: relative;
display: flex;
align-items: center; /* 垂直居中内容 */
overflow: hidden;
/* 增加一个深色遮罩,确保文字更清晰(可选) */
&::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: linear-gradient(90deg, rgba(0, 21, 41, 0.4) 0%, transparent 100%);
z-index: 1;
}
}
.banner-container {
width: 100%;
max-width: 1400px;
margin: 0 auto;
padding: 0 40px;
position: relative;
z-index: 2; /* 位于遮罩层上方 */
}
.txt-content {
max-width: 800px;
color: #ffffff;
text-align: left;
}
.zh-title {
font-size: 48px; /* 增大字号 */
font-weight: 700;
line-height: 1.3;
letter-spacing: 2px;
margin-bottom: 24px;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.en-desc {
font-size: 18px;
color: rgba(255, 255, 255, 0.85);
line-height: 1.6;
margin-bottom: 40px;
font-weight: 300;
letter-spacing: 0.5px;
}
/* 红色操作按钮:完全还原 image_932d00.jpg 风格 */
.action-btn {
display: inline-block;
background-color: #C8161D;
color: #ffffff;
padding: 12px 32px;
font-size: 16px;
font-weight: 500;
text-decoration: none;
border-radius: 4px;
transition: all 0.3s ease;
border: 1px solid transparent;
&:hover {
background-color: #A01218;
box-shadow: 0 4px 15px rgba(200, 22, 29, 0.4);
transform: translateY(-2px);
}
}
/* 响应式适配 */
@media (max-width: 768px) {
.mod-banner { height: 400px; }
.zh-title { font-size: 32px; }
.en-desc { font-size: 14px; }
.banner-container { padding: 0 20px; }
}
</style>

View File

@@ -0,0 +1,631 @@
<template>
<div class="mod-tabs">
<ul class="tab-hd wow animated" style="visibility: visible">
<li v-for="(tab, index) in tabs" :key="index" :class="{ on: activeTab === index }" @click="setActiveTab(index)">
{{ tab.title }}
</li>
</ul>
<div class="tab-con con1 wow animated" v-show="activeTab === 0" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">漏洞检测</h4>
<div class="l-desc">
基于 AST 语法树与 CPG 图构建技术结合静态分析动态增量分析AI语义理解等多种检测手段可自动化完成函数调用关系构建漏洞精准定位与去重
</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>函数调用图构建</h6>
<p>
基于AST语法树的函数调用图构建支持 RAG 知识库Agent 工作流AI
工具集等代码检索工具实现自底向上分析函数索引全格式化
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>项目 CPG 图构建</h6>
<p>
基于Joern的代码属性图构建通过 Joern 环境初始化CPG
图构建终端叶子节点获取高风险函数排序等流程提供完整的代码语义和控制流信息
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>漏洞扫描与验证</h6>
<p>
支持函数内嵌消除基于 CPG
图查询漏洞点污点风险点代码路径识别等功能结合Agent智能体实现代码片段索引污点分析可达性分析等深度检测提供大模型与形式化双重验证机制
</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>精准高效检测</h6>
<p>
无需人工逐行审计在代码提交或构建阶段自动完成漏洞检测可通过静态分析与大模型协同构建函数调用关系检测准确率提升 85% 以上
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>智能去重降噪</h6>
<p>
无需手动筛选重复告警在漏洞检测完成后自动识别并合并重复漏洞可将误报率降低 70%大幅提升安全团队工作效率
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>持续增量分析</h6>
<p>
无需全量重复扫描在代码变更时仅处理变更部分及影响范围可支持精准定位代码演进持续更新缩环快速迭代验证检测速度提升 60% 以上
</p>
</div>
</div>
</div>
</div>
</div>
<div class="tab-con con2 wow animated" v-show="activeTab === 1" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">漏洞修复</h4>
<div class="l-desc">
基于 NVD
数据库与多智能体协同修复技术结合高质量评估数据集测试环境构建RAG知识库等能力可自动化完成漏洞修复方案生成验证与测试
</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>评估数据集构建</h6>
<p>
基于NVD数据库构建高质量评估数据集涵盖漏洞项目漏洞补丁漏洞利用测试套件等维度支持测试环境构建漏洞利用测试补丁测试等全流程验证
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>多维漏洞知识提取与融合</h6>
<p>
通过软件漏洞特征多维漏洞知识提取与融合技术整合全网函数信息级代码级函数级技术级等多层次知识基于自注意力机制的漏洞行定位技术保证漏洞知识相关性与可解释性
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>多智能体协同修复</h6>
<p>
基于RAG知识库的多智能体协同修复系统包含漏洞修复智能体供应链修复智能体验证智能体测试智能体等支持记忆/决策工具集石线搜索工具动态执行工具等协同工作
</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>智能修复建议</h6>
<p>
无需人工编写修复代码在漏洞检测完成后自动生成修复方案可基于多维知识融合与大模型推理修复准确率提升75%以上
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>自动化验证测试</h6>
<p>
无需手动构建测试环境在修复方案生成后自动完成漏洞利用测试与补丁验证可确保修复方案不引入新问题测试覆盖率达 90% 以上
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>可解释性保障</h6>
<p>
无需担心黑盒修复风险在修复过程中提供完整的知识溯源与决策路径可清晰展示修复依据与影响范围提升安全团队信任度
</p>
</div>
</div>
</div>
</div>
</div>
<div class="tab-con con3 wow animated" v-show="activeTab === 2" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">安全知识问答</h4>
<div class="l-desc">
基于漏洞知识图谱构建与RAG检索增强技术结合多Agent漏洞语义增强系统与COT指令集训练可智能化回答安全领域专业问题提供高质量可解释的漏洞分析与修复建议
</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>漏洞数据实时更新</h6>
<p>直接提问这段 Go 语言代码是否存在 SQL 注入风险即时获得分析结果安全建议与修复示例</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>漏洞知识图谱构建</h6>
<p>
针对每种漏洞类型结合专业静态分析的漏洞底层知识提取技术提取漏洞知识并构建知识图谱基于大模型获取漏洞之间以及变量与补丁之间的联系构建变量类型知识图谱
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>知识图谱增强检测</h6>
<p>
通过知识图谱的双阶段检测机制分阶段检索知识图谱获得漏洞与补丁知识增强大模型漏洞检测能力支持一阶段检测漏洞节点补丁节点和二阶段检测一阶段检测结果补丁节点知识图谱
</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>专业知识支撑</h6>
<p>
无需人工查阅大量文档在遇到安全问题时可快速获取专业知识与修复建议可基于知识图谱提供准确的漏洞分析问答准确率达 92% 以上
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>可解释性保障</h6>
<p>
无需担心黑盒推理风险在回答问题时提供完整的推理链路与知识溯源可清晰展示答案依据与相关漏洞知识提升安全团队信任度
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>持续学习更新</h6>
<p>
无需手动维护知识库在漏洞数据更新后自动增强知识图谱与模型能力可持续跟踪最新安全威胁知识覆盖率提升85%以上
</p>
</div>
</div>
</div>
</div>
</div>
<div class="tab-con con4 wow animated" v-show="activeTab === 3" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">安全工具调用</h4>
<div class="l-desc">
基于上下文构建项目 CPG 图构建漏洞扫描与分析验证等技术流程结合 Agent 智能体与多种安全分析工具可自动化完成代码安全检测漏洞定位与修复验证
</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>上下文构建</h6>
<p>
基于用户问题驱动的上下文环境构建通过用户查询理解Agent记忆检索相关代码文件提取上下文环境构建等流程为后续分析提供完整的代码上下文信息
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>项目 CPG 图构建</h6>
<p>
基于Joern的代码属性图构建技术通过Joern环境初始化CPG 图构建终端叶子节点获取高风险函数排序等步骤提供完整的代码语义和控制流信息
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>漏洞扫描与多工具协同</h6>
<p>
支持函数内嵌消除基于 CPG 图查询漏洞点污点风险点及漏洞路径识别等功能集成静态分析工具动态测试工具符号执行工具等多种安全工具支持工具链自动编排与结果融合
</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>自动化工具编排</h6>
<p>
无需手动调用多个工具在检测任务启动后自动选择合适的工具组合并编排执行流程可根据代码特征智能调度工具检测效率提升 70% 以上
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>调用链追踪分析能力</h6>
<p>
无需人工构建分析环境在代码提交后自动完成 CPG 图构建污点分析可达性分析等深度检测可精准定位漏洞路径与风险点分析准确率达 88% 以上
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>智能结果融合</h6>
<p>
无需手动整合多工具结果在检测完成后自动融合各工具输出并去重降噪可生成统一的漏洞报告与修复建议结果可用性提升 80% 以上
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({
defaultTab: {
type: Number,
required: false,
default: 0
}
});
const tabs = ref([{ title: '漏洞检测' }, { title: '漏洞修复' }, { title: '安全知识问答' }, { title: '安全工具调用' }]);
const activeTab = ref(props.defaultTab);
const setActiveTab = (index) => {
activeTab.value = index;
};
watch(
() => props.defaultTab,
(newVal) => {
activeTab.value = newVal;
},
{ immediate: true } // 立即执行,确保初始值生效
);
</script>
<style lang="scss" scoped>
.pg-evaluate .mod-tabs {
margin: 0 auto;
max-width: 1360px;
}
.pg-evaluate .mod-tabs .tab-hd {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
padding: 40px 0 20px;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
}
.pg-evaluate .mod-tabs .tab-hd li {
cursor: pointer;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 40px;
margin: 0 30px;
position: relative;
text-align: left;
-webkit-transition: all 0.4s ease-out;
transition: all 0.4s ease-out;
}
.pg-evaluate .mod-tabs .tab-hd li:after {
background: #4bad52;
bottom: -5px;
content: '';
display: none;
height: 4px;
left: 0;
position: absolute;
right: 0;
}
.pg-evaluate .mod-tabs .tab-hd li.on,
.pg-evaluate .mod-tabs .tab-hd li:hover {
color: #4bad52;
}
.pg-evaluate .mod-tabs .tab-hd li.on:after {
display: block;
}
.pg-evaluate .mod-tabs .tab-hd.EN li {
font-size: 14px;
line-height: 1.5;
text-align: center;
}
.pg-evaluate .mod-tabs .tab-con {
background: #fff;
border-radius: 12px;
-webkit-box-shadow: 0 2px 26px 7px rgba(50, 50, 50, 0.06);
box-shadow: 0 2px 26px 7px #3232320f;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
margin-bottom: 60px;
}
.pg-evaluate .mod-tabs .tab-con .item-l {
position: relative;
-ms-flex-negative: 0;
flex-shrink: 0;
height: 584px;
width: 440px;
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt {
color: #fff;
left: 57px;
position: absolute;
right: 76px;
top: 169px;
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt .l-tit {
font-size: 28px;
font-style: normal;
font-weight: 400;
letter-spacing: 1px;
letter-spacing: 1.7px;
line-height: 40px;
text-align: left;
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt .l-desc {
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
margin: 26px 0 0;
text-align: justify;
}
.pg-evaluate .mod-tabs .tab-con .item-r {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
padding: 50px 0 0 83px;
text-align: justify;
}
.pg-evaluate .mod-tabs .tab-con .item-r .item-list {
padding-right: 78px;
width: 50%;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-tit {
font-size: 22px;
font-style: normal;
font-weight: 400;
line-height: 25px;
margin: 0 0 20px;
text-align: left;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item {
margin: 0 0 40px;
padding: 0 0 0 60px;
position: relative;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item:last-child {
margin-bottom: 0;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item .ICO {
background-size: 100% auto;
height: 30px;
left: 0;
position: absolute;
top: 0;
width: 30px;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-con h6 {
color: #4bad52;
font-size: 18px;
font-style: normal;
font-weight: 400;
line-height: 25px;
margin: 0 0 10px;
text-align: left;
}
.pg-evaluate .mod-tabs .con1 .item-l {
background: url(@/assets/v3/bg1.B9IGVx_y.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA0CAMAAAANBM47AAAAAXNSR0IArs4c6QAAAtZQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYHBwcHBwcFhYWGxsbGxsbGhoaGhoaHx8fGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaHBwcGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGRkZGhoaGRkZGhoaGhoaGQes7QAAAPF0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKistLi8vMDEyMjQ1Njg5Ojs8Pj9AQUJDREVGSUpLTE1OT1BSU1RVVldZWltdXl9gYWJjZGZnaWprbG5vcHFyc3R2d3h5ent9fn+AgIGDhIWFhoeIiYuMjY6PkJKVlpeYmZucnZ6foKGjpKWlpqeoqaqrrK2trq+wsbKztba3uLu8vb6/wMLDxMXGx8jJysvMzc7P0NHS09TV1tjZ2tzd3t7f4OHi4uPk5ebn6Onq6uvs7e7v7/Dx8vP09fb3+Pn6+/v8/f3+/jZlGfIAAARzSURBVBgZtcGJf84FAMfx77PjGRs2c2QUm6VoylFyLMdmmKOkiGooUY4cqSgVy1JKIoq2pMOoxCK1ImfMNCamaZjYxR5b6/n8B/1+z+/Zs2fHq9dGvd/6v4XqxgRltNcNeZUNuhGdSiFWN+BL4LC/rttI2A4zdb0aZZEZsI2CMDVMt66yPA/DFFXGGrn1i1A9tCq9cqtM4SWkSloK0XIZSrbqodlVFsn0GVcjJTXLZZ+vTKlkqD5SOOkjKQ4WyjQepsjQuozn9C8e6ipLPAyS7EfIDpTJ9h35LSU9jTNcloGxqmUwRbfIxe8sc6Vn4QFZelSwQtJ60mQZ4Kxoq5rCS0mWJW5tB7Ur5GtVegtnL6n3+i5y8T1Ijl21vAYD5bEORxdVCj1Puk0eU2GcamuSwwFV6g9LVGUSJKhS8EV2qC4PU2KXxfcAvw+Ztymj4BqUF/361ctHyQuRWxRl3eQlwC63+L5yS4Rr1LA/1ibL8D5yC7JJjU+f7aNqWk8/gsWZs+uT5G+Pl2M5sSBc1YwrTpOCCykapCo9NjqAv3OgaGELuQRNPQd/ngWc38SoyqQKDkmKKeJKvNw6pzjBuXVsIvzcXh4hWyA5fqMD2NZHbtPh1O0y9L2Eo6tMHVaVQ/6CcI2EbYHy4rMaZqrVMyeB1DtlGgOZ4XLpcY5hknxnFEPhwmDJfoxjoarGvoOC1lLAtLNQviRQ0hx+CZNb816Suu+Bq0tbyTAFhshyc6Qsnct4Q4aguRchK1byiW4kb9NKIe02uXzPDrmMz4H82b4yrSTPR6abksG5xF/VhG6CSxNtcmnj5AmZXsIlRaYYiJYl/hSkR8jLHZnwQ4TchkO4DD3L+XHYoFQYLYNfMdPlFvoFnB8gjwGXYYm/Kk2m3EeGF7jQXPI7xIcyZZAoj2kOHI/ILawYElVlHnkyJbNVhuXslWkn76vKZHDeK7exDhxT5PEkDpsMr3CmkaR0Nsh0mCR5jLoM8+Qx4DxsDJHbKAiToT9siopcDhNl8ClgltwClsGVcfLScTeciJUlAibItBKXNJsMfSBOlu574XgvVWNPAj5oIZf9bJbJb74DnG83kSmJy3aZGi8ug4+DVdPQU1AyO0CGOdBbLkHRMSFyaVfCezL4jP0NLiaoDk13A9kJflKTXPY0VjW2zymNkDTyILAhTHXpVMofwNHHgpQAH/nI2yJYLP/70zHFqE5bKG4/OB0oeLfvStjcTB7+78C2u17PA44+eorD/qrDCJgnadQeDBlZcDrBV5YRhyF3H4bMBD+NgRmqrVEWmQEydV92AUvJT2sWvbhq52Usxav722TYTkEb1TIf4uVmfzDlDDXkp05sKktUGWtUU4cSUuWt44QVhy7+hcFZkLF2cpRNVZKgn2r4lKuRqs3e9e5A1dIsl72+qiYOFqr+JsAUefM/Qnag6s+2i/yW8jILRqshelawQlXaFrJVDbOcinvksQ5HFzVM6HnSbXK7D06+2VAH4XFZfA9wffJC5DJi//V6Sv+BfwBIbvfBNZtweQAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA6CAMAAADMWVqUAAAAAXNSR0IArs4c6QAAAkNQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVFBQUICAgHh4eHBwcGhoaGBgYFxcXFRUVHx8fHR0dHBwcGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYFxcXHBwcHBwcGxsbGRkZGRkZGBgYHBwcHBwcGxsbGhoaGhoaGRkZHR0dGRkZGBgYHBwcGxsbGxsbGxsbGhoaGRkZGRkZGRkZHBwcGxsbGhoaGhoaGhoaGRkZGRkZGRkZGBgYGxsbGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGxsbGhoaGhoaHR0dGhoaGhoaHBwcGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaHBwcGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaZrZiaQAAAMB0Uk5TAAECAwQFBgcICQoMDRAREhQVFhgZGhsdHh8gISIjJCUmJygpKywtLi8zNDU2Nzg6Oz09Pj9AQUJDRUZHSEpMTU9QUVJTVFRVVldYWVpaXF1eX2BhYmJjZGRlZ2lqa21vcHJzdXd3ent8fn+AgYKCg4WJi42Oj5GSlZiZm5yfoaSnqKmqq6yvsbK0tba3uLq7vsDBwsPGyMvN0dLT1djZ3N3e3+Di4+Tl5+jq6+zt7vDx8vLz9PX29vf4+fr7/P3+nMc1QAAAAuJJREFUSMfVlulfTFEYx2fmtk1laDGtWqzTKksJES0itEipLJGxJEsoJEsSIilZsoUWoqQyg8bcaX5/mnvvuTPN5864nUkv+L2Z5znnfufznPM8zzlH4RtHIbVCqjhQaMUcYgXyERb/AYtTyCrpX8PW5ola4xbWZdu7R3OK+YcvdIX5aUT5TY95abWexIpttsD6bDPdltgV+0UIZKrSLUzZix8nUoreg42gxXQl+uONQD5nBhtwiQ7b1kv2aZLhvWZ00GCqRh4ZHzHgp4C1opsGuwAMFYZypQDs49xoI2oosHgrHmsE6zks9ZlVQ5hcRIG1YjyEWDH9JAFZFAnwMKLeZgdfHQU6UmjSHQrsmvY85zN0jaMDklwMz4TFA/E0mEdguKNbBIRNe2ptgEtMrf8M9J1k7ANNGLU7UTdYWLs3OmNMGymju97iQAKLJjs1LMxZypywGuDeps33gSPET+yDyR7zG0zWppYNgA2TYv1oU3It0o7h5IzSY1ceTAFnk0SVcicq94nWiAYJxiVJ6N2trg/nMWGVt/BQgi0AMvnfbNfYNxU/edupA5ghtHNTTCf6dKvzKuuaTcBlnahyoIT7JtKAWunaqrmay87pBI4Sf8lLWBNskz1gz2ccGIQpWop53yHhtCjFgUgjvxLxPwZJB+Q5p1ulfwsMHvKyD5wCq7HZ2utjQFeq65oM8lc6eGnAKodognzoSjkAyJlFB8wDts8CYyzQOxzsgRrK++0dWm1mxDUzLJ3pVFgDzDqR+iQkgC2iwcJMeEVup9cw1W3Y/wFm7iTLBXLlj9fDwNeDi5WKRKCYL/fvuKhQFJB2kNNpPjSTYQTjHrzbwtdNFpA109WR3kNKbkJFsCe0F1VUflV1HVDIr3UCZ9y6TV/AfG5dxQB+xbiFLfsohGrdSRKwJ1lWaeVbfMUz46YBeLre/ReeOsT/bx+GO5bLavf//DDcu1JWFXP7xJ4N5rOUQt5S6jcJyGZLl4Al1gAAAABJRU5ErkJggg==);
height: 29px;
width: 27px;
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAMAAAAPzWOAAAAAAXNSR0IArs4c6QAAAuVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGxsbGhoaGhoaHBwcGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGxsbGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGxsbGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaMeyWdgAAAPZ0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLjAxMjM0Njc5Ojs8PkBBQkNFRkdJSktMTU5PUFFSU1RVVldYWVpbXF5fYGJjZGVnaGlqa2xtbm9wcnR1dnd4ent9fn+BgoOEh4iJio6PkZKTlJaXl5iZmpubnJ2en6ChoqOkpqeoqaqrrK2trq+xsrO0tbe4ubq7u7y9vb6+wMHCwsPExcbHx8jIycnKy8zNzs/R0tLT09TV1tfY2drb3Nzd3t/f4OHi4+Tl5efo6err7Ozt7u7v7/Dx8vLz9PX29/j4+fr7/P3+/H7PQAAABYhJREFUWMPtmGlYVGUUxw+IoCC4YEkpqAQpuKJSKi5pWmq2uJVLruReiguWCFJomUvu1qSpDZJWkKWm5lJauWQa5IaCQpg6EwjT4Mz8Pvdh7r0wwzCD2dOHns6n/32fO7/nveec95zzjogHC4+JkPs2Hfr/AKTHis8Whd8nZIYNKImTBhGfsjey0d9itLnL+XXFWH7DbkV7UwYF3ytkCsXBMhAHs+wYEXAvjDo7KPaWaFg7NO5z9sYNSdh4A6AwocYfVmvUZeC9IQcxBWmO9em+8BxgmOxTI0b4YaAAgBmO0XksCzgeXQPG8wY4GOefVMSFMVVC/OQxMPbzhPBKBtMEEREJdJVs3qNKsc50z/B+F860d5uxHS/BR37uGCsho56HtG/yPUxyA1kE6XU8nZ3oIiwdq2c8C3pHRquX5+Vwec7YNhVLYbmYe1XPiDRwNqjSc8TiS1q6XkqLsi82/gnrc24ccoSySj6N2GAFLJdvYci1ANb1USJS7zCMc+OQF2GsEoCElBFjS6D07YENRIdeAgcsMYJpgvjuhFluGHVzOeolIiIzLQCUzmtcybGN5hnh/Q8gxV2KvAbdRUSkq42ik3CjtVN0Wh4CWOvlhuGTx1a7SuZKQ3mLcj/nEPt+Afra7jbSD3qov0oX6QvNnCHxsM99RfmQ88pGZ2FN6LyfAudkG2bjpPty0qCcBEUG/wnABCdIn3IuNnV/8vqAWifa2oDSKfZ9hU7NJX9GS5HYOxS08lAC5nJTdftirLEdfO3eTjQDUJ7U/gbFnTzVkZ18rCauFibx2Q7WnK+zLWDC3NNjPbupuaQDqKUrEbLCRSQsA2yDPTJqw0uKHI1NOYWhZrK87fXuENZIj5AQeEqRCzmnqKlYwxXZzKTt1HVx1+l0ugzI1NntAkWKyuWk9tYZ8pXV9F8+UZTu6CmdTqfTRYvEUL1t1iDfuHmrm0iEXq/X74EDertdwqiofE5U2kmBsnqLq4raC/v0er2+rfrN0EfUrM9XJwMsYWpxLmOuIrNZoKhe0KKyYwJgmCJHYVVOWYtyMpQM3IJVKY++JuKVN4eAY2e4rXm/HQzUAoW+mYg02QJLlbXeEKuNDibHGO3S0lRyWKVmzy4wnT/9axnsUbtAKvneitzAEUfI6+SpMomb9dUylGyvlNYlKiPgmrYnyWNhlZbzqCLb2zTXiUTOzqdgbpT2PKviayJhgCOkoZnZql5DaWg1HbCJsSJ3xmNznsC2cFqVLczs93MJqZ2JpbX6cIw9ztn/AnQR7dCw2iUkjYoj1LUiKzTzL2Sb9rAKVvlVgdROg01ax1jPNd8qB3EmDO75gF377YZ9TZ0gTTLhkH+lIXV+1dNc7wZgS61rHx9XQ8m8wEqQgFlG2OQvIj61RMTrSwwhVSEB14GKLjm9HAqX9PUTHXrx7Z16DSwJXtI85YLN+vOCB0fBRBd1ZSS2cY9swFZfmwoATDmF/J5tAtjcWqS/yX76bxs47O0CksQpkTbwuLbS6c0rWs3IXxorIn3N3N0U/8p2G1hdDkuTKYuSBK172mtr50mJF7m6ID7WW0SksZG8KBGRrkbyXM5+zYsxn4fr/tXPbK9CjF0NhOEui+0zRgAOhVQLySJLbU7ZldLRwULHJw57By60rQ6SQ6oqt5LppvhPs2EYXcs15ATLVJmudUyXNqgUfnzCJWSdlunBJt5w28hijgPpHVxAJsIce9SWay6udvKaXgwcmdTCARI27iBA8sMikWthjceuGjzfAJC9csbTXTL4qkv/acvPAPzxA9w9e84G23xrcOsJHLnb5tzp9o0JCtpovw6m+dXwFhcydNm3Jcrv73y3YvhDIiLSempqysSwe7qVejVtl8mBdqFe///h8I9Doru1lX/F/gIjzb047a6x0QAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA2CAQAAAAxbjKfAAAAAXNSR0IArs4c6QAABsRJREFUeNrNWWlsFVUUHrayRgRt37vfmS6QlqIlIFSkkIKhwSJVUCRgWARSZTVGQRBBCCAoRUV2UIxFlIQlrLKLQhVFtEBAERQECRaBKmWrCKX1mntm5r3pvJnSVyhx7o/Ou9t377nfOee7U02rnKeKP9LXDNHJNbQ79aCOGCQ24R9ILv9iH00QsZUP+xxOm5D2ck282/CuSgPVa2O5AUTf02t4Eu38XTAcG3CNa4/o8ZUCm1yDchggV6SWbiEdH3HLX5UCjQ948g+TItxaaQCuq13fdoNTGsOuCNbENBAd/HGloCWkmHG797sXEqdQxwRpi4MmrfJpmFbFqBVLmGa3zvD4mlpVE7YVU2qgCTsEJaU4vcaARrSiGU2oCG9J9BMzsBFHUYAb7KWFOI1d2A+Jv/XaPH0i+/Dv1B9NRbrYyUsaZi5wAyT2hmfKpnoWzrt4aKCITWbPxZDiIulWBGPofLNtOCRKtOrlDH6iO/bYIE5iK2ZjjNgMiQs0UkzFClyFxHxz8kOQmBMcLjrzsvhk9Qzev16enXbliYzgJ3EC0YGW1yGRZ77/Boks8/0yJL1stxUDt+dFtFfv/vtvAipisd4EPUXz+W9X24R24F1BV8I3kFjpdKOYBvzeX73fxJfRCQUMVoDRcbWwVhnZcowQ4Dl8jtV48jfYOt3MlmjkQeKAuYiPIel42bAvoBgS1/G2Wqsvijk8sVQPO/AjfHZp6j2yHk4w9EqMwlxxERLFlGK4Hy5A0qwyoi4W8V7PUNtAzlFnE+cFnFwDZyFptXlEyQxtlatisDkik5eX4hkWsIMH7AuyD59CYr/DJjZgTcMktTNfI+NXZD0xFV/jEv2IbGpieQd+UCnEm1JLGHalFf443Sl3mVwWcKSfk192GVTtwezu63W2o9gcn9hpZCQAf+uygDWNZqk9I9Fj4qo4rLKTQcDQkJjBUXZPXK1SEBMhccU5xAnsi0IhJNZ57HcQb6in+24TcUlNFisc9dshsT2ktwNY0zCZjflo6MwxDfCnCj92O9pzag5z8MEQiEtOV3IH1mvjJCR+CZUC4PBD7ilR9OP1jnXWxwqu784/qjWurxMSRbL/YSyDxHk9gzpSCrXQExrX1zTxFPcd54BtxTGhmBOk80mK4AiTZ6Q2u5FoKE+2BftVFC6zFOJnzmBF9micFMFuVCDe4XnSnfsdzEOfNddYhzrSeGzlk6lI+SlIRTGVzdzfPIg9jtRHx43uOtFQmxy3SjF2IVu8ikzqpWeIDmhFTcRMSPxBup6gN9fbUEf0xmjMptXGYsX4QBRTwfYoWgaY3UJzeqqYgW020VKIL8QU9BZfQuIzFx8IIZdZ341HF/masZmtpCrpuD+LrkBigd3QS5UyCOTdXEz0t7Z0Ao4Ek3y5gFua8+zTqmOaobQ58qmtKYxCX12rb3VRbHY+glei4Yg41yHFi2EA3xuw2TrezHq+T/WgVWx0Bd/DMnQKm+I7QyWUfuLu9oo4XsCaphgiDpvg56J8gfpoTKciSJppGXqc0rvxNV2Dis5xuktYwMfUSeKMOjbnSKywZSilLijHI2nYFFO5gXMhsYjSUIK3XASGxA3zlDlvLHAH9rdmg7UMC/grzm8a9QwVsob0N6511bzow6buqDrqCWEBb4OkVR7z3ROgl8FCMxaHTtJVtUb6wwJeB0mbPfNyCSSLIV8j5u2b6ONa5rGpM0NbxBpWoG5jdjOr+3iUK2Ya0ZtXMB7fQuHLqp5w54ExzVAHij59fXXdCg1Urb6o0BahwuFptzF8CDvc5/PVVQKJRhqysxiShnqQ6wkDOCxybTQCpdsTX9NIkkbHc5A03kOkpYdK+ZsCK12+3MOdOBLqGUbHfZBY6gGcymS4Lyzgb70VtpGAzZyMueo+6GFqI9IkhwV80D2RataN47KpT6iXlzk1TY9nFnYKC/iUigseIVhZY0spHYk88UxpIc9psZYRQMIArsZkHeYqEZY5lCzLMFUuYAHaWd9ytAD1MKn8wCKGT/Exe12sEC/hgKXfotPtEfTpQINEPhZTL0uJcJLLDgOY6ag3N+wlUjEZe/kzhiqXMD0oDILn2Ua8xxdpq5zAUjGW9kCKnWEA9+Udj6RZ2M2fEU0lRzk0IKi2XBxcdMa8gOmDJQ876H0xBWPwPA0QPURn9VkJ+ZSGbugtBtEImiBmYC0OiRuOkVexgYbopJXv8ceJfmIhcvneVJFSjF+xFqOorftH1XI8UT6Rikxk0WocxCkUoMgFRn3hO4tj+FwspBH0OBIr5V8CSRF6QxHjT9Ifogf0+Eh/ZD2P6+f/8/kPaURwNOuwtMAAAAAASUVORK5CYII=);
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico5 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA2CAMAAAClUqpcAAAAAXNSR0IArs4c6QAAAfVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiHBwcGxsbFhYWFRUVGxsbGhoaFxcXFxcXHR0dHBwcGxsbGhoaGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGBgYGxsbGhoaGRkZGRkZHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGRkZGxsbGxsbGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoahQXVxQAAAKZ0Uk5TAAECAwQFBgcICQoLDA0ODxITFxgcHSEiIyUmJygqKywtLi8xMjQ1ODo8PUBDREVHSUpLTFBTVFVYXF1fYGFjZWZnaWxub3J1d3h9foCBiYqNjpGSlJeYmZqbnZ6foKKjpKWmqKqrrK2vsLG0tba3vL2+wMHDw8XGx8jMztLT1NXV1tfY2drc3t/h4uPk5eXm5ufo6err7fDx8fLz9PX29/j5+vz9/ud+XxgAAAIaSURBVHic7ZTpVxJRGIdHtJS0yELMNNtMaLPFLNuppKxIC8v2fU/KysJyKtvBpI3KqDAL5Pk7O3eGphEBGb54Ooffl+e+895nzl3mjCSly4yj3ba0zQxZMwiRFpNRbeYZIAq+amNeUwgCDTU+GGktzF6bdQXih8skyeQahr6F2Xobh+DVMnVceRui7qnZaNYuiLWb/5YFzjA8rp/Y2z5untULsbaSzJpNrOxA8so2DcHLpRk0U0sk9Vkop9VRms6r9sGvvUUpe+vF/axM2SpsHQFfjVYv7+zpPd+sfTnlZ4HjlvHegj4YdmnzLKdRcm+ONmNtEIKNSdoUdxTuVGr1tBfwuetSAH7M1R5ajgHnyvXekkcQdhb8e9AB7cXiciL06r7zFX74tEErS9pi4LXqXjQvTqc62gqbdY1Szyhcna0WxQ/EBc+v1eUQo/bE0E+3vlO7IwyhCkW0Yzgu9SCeGPW+VqlrNdU5HF844RCJclCgEfYLNsEewW2wRXA3rHPYzbpdv8Ot8De7BKZDs6ANGgTrYbHgaqgYe5F5MS/mxf9dXOXxRHjoEYlxV+AI3BI8BdcEL8IFwetw0uPUxH3G/lVenRh7/fF5v4j//TOFgbcK+geCKgffqAwOfB8jhqSsc2PyRFmWPxD/mXVifJNl2SxJRv//asqE2HPzqaHcv5wQnRNtKzmLJk3cWWQwdQkx51PNUazKKSbpDyfEdItE0oMXAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con2 .item-l {
background: url(@/assets/v3/bg2.ED2KfGoJ.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABACAMAAABvC9RJAAAAAXNSR0IArs4c6QAAAoVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYHh4eFxcXHR0dHBwcHBwcGxsbGhoaGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGRkZGRkZHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGhoaGhoaHBwcGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoawUAFEAAAANZ0Uk5TAAECAwQFBgcICQoLDA0ODxARExQVFhcYGRobHB0eHyAiIiMkJSYnKCorLC0uLzIzNDY3ODo7PD0/QEFCQ0RGR0hJSktMTk9RU1VWV1lbXF1fYGJjZWdpamtsbG1vcHFzdHV2d3h5ent8fX5/gIGCg4aHiImKi4yNjo+QkZKTlJWWl5iam5yen6Gio6WnqKmqrK2usLKztLW2t7m7vL2/wMHCw8TFyMnKzM3Oz9HT1NXX2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fL09fb3+Pn6+/z9/kKeQQUAAAOySURBVHjarZb5X1RVGIe/ICiorBoGGSSlIUtkYxZFSWakhUtESFIhZmbZHgUFhYGtKKHYRlKZlCmoLGVZsgYoiwhc7vP39MPMwMw4M1w+n56f5v2e89x75j0z9x7JBwk3aE4s3NpoTtRnB1sW7v54GAD6ylKtzF++twOg5bn9FwBOF0b7nx+S0zAF9FfcISkg47MRYLzu4Xk+BVvVFcD4etN8Z7I49wRAd0mSt/mxHw0AnC9e5p7f+vrfAH1PR7rnCzZ/awCXD6zxcrHAB2rGgbHD6wOnszsrBwGTiRBfS37K3sFLb6yUpEVF5wDaXniZMZ/fchukvdkJ0JQXqHRgqHqt9Ix/JVTzsmqvAYuVDsWhkgVFUtQHDiVdVhXl/H9KRP5rBTFzUh65AkxsmYOSdhWjfRIzw4pi1NTU1NR0MJCihIs0WFGcVEp6ka7ZlU0/2hnmkKRSK4qTVzGKEnOvUWVdib4IQE+CdUWxjSacTJUUv79y981WFGn5ulWSVDgJjOdYUuxkmYycGsNcY135ij9iFN9NQ0rKXotKHy9JKnVslj8l0eZ4YPxOlaTaWZW0n8H4ZqkklTH5fPorUG2z2Wy2QF/Kil4A2sMl3WjfoHOuTyMvyidcy719n8keSYr7zmCqNk7+lQHeklTPT/ZyadIS95Z4UQYpknSQM96b6E05QUesUi9TYV3ZAOMdBqPJ/pRkWOuS5RnA0EYfhp6A+VoG2a7hLfBFpC9DuxmSgqbY6RrOh+0+DVXQIamZWutKM4cllYPhil1ZYXgFCiRl4cl2SYn4IFFSYD9n891YZVfK8z3Z0ctvkqR9mHddt+hEyLwu3AqPSZIi/qXJkhL6Dy2O12Uh5HmMRr0H74d5hO/Cg46Pwc2MrHQbTBoAOOv2u1emyZGZGWOcWegyGPQXk+1/wveuRmwn3S5/hQKon3mp6yHIlnbD6pls0Wmm1rteohrKZ6piBiVFw4aZGx+DXW7rDDoO70xXT2LES5mwbnq8Dg56dCP8VyhxFktGacvd2cMl52KD66AuyLPpEafgU2e6wwQYd+5M+HE46uUIGNkEDc6tePQXzB/ucRRxLfCl10NjyFFone7RwukOZvRAWYC8ElgOI1s8woA9Bsaz8sm2UTiwwDWJOga998sPyW1w3uUct7ETTsbJL2G1YLztuFHU52CWBmk2cvqh9V5J2twFF+6bVZAUcwQ4dNPqRjA/XGTFkPR4F1w1oDXDoiAprGQChndZP/NL0m21lTFzEvzyH16BnDy4upTwAAAAAElFTkSuQmCC);
background-size: 100% 100%;
height: 32px;
width: 25px;
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA2CAMAAAChp3phAAAAAXNSR0IArs4c6QAAAfVQTFRFAAAAAAAAAAAAAAAAAAAAKysrJCQkHBwcGhoaFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGBgYHR0dHBwcGxsbGRkZGRkZFxcXHBwcHBwcGxsbGhoaGBgYFxcXHBwcGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaHR0dGRkZHBwcHBwcGxsbGxsbGxsbGRkZGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGRkZGxsbGRkZGxsbGxsbGxsbGhoaGhoaGxsbGRkZGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGBgYGhoaGhoaGxsbGRkZGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaY4gg2QAAAKZ0Uk5TAAECAwQGBwkKDA0ODxAREhMVGhscHh8hJCUmKCssLTAxMzQ1Njg6PT4/QEFCQ0ZMUVRWV1hZWltdXl9hZGVoaWprbG9wcnR3eHp6e3x9gIKDhIWGiImMj5CRkpOUlZaXl5ucn6KjqKmqq6yvsLS2uLm6u7y9v8DCw8XHyMnMzc/Q0tLT1NXW19jb3N3e3+Dh4uPk5ufo6+zt7vP19vj5+fr6+/z9/hUAYDEAAAJLSURBVHja7ZT5U9NAGIa3UhU1guJ9At7We0VRxKNFKd7iiUXRKpcKKFYBUUSJWm9AraC21pLk/TudbLYtaZPSrY4zjj6/9Psm3zOz+35JCbGncNkckhOregG8KcvB9CpgNOeJmi4NH6tcex4DXkHT8QpvCwkhznZE5oqpxQBlxTxgn93Q4m4rngM83VEMW05sJaQUNkw31JDNYzdTO5rS6EmogwimP27SuFqafo0dCfUZLlpcM/b71WZV1QDVANBU9V22amtaJkPZq8HDfr97P6Pef7pDRL1r6mv/AfWy0peVOn+nx+OhRePVq+g3qSv3ejzuzVNT1eoYW2C40lbNbzd2/Hq5WXVp0KLRKDBWbKfWAUo0GgNeOLm6AlgvSX58XkAIWRrGWUm6xdVtF6rZ7xl8kCTpE9qmEeI4CKyVpB+6upG/awE2JRuNOWF+UlTozezk9xpXjemnmdTdejMrqa4Gaih9YFzLMYTblPamqJcwQun27zimNyXAKUqVZExVwB2fz9cNlOsxfX0ynhCL6T6+Nfp8DYOIFJgSntLPz9E1ye6jKwnz5lDKXvNPdMmyfM87mRBS2ZBKrX7URdf6ZHng5pYJ/mAm4r/6R9QNwGhIGNPrL4qbkDXAlePCKH/rctbNEGaMq7km/AtqQZkV54EjrNgVQZvlxEK7GK5jmFc3EBQKMG8E9bwsB5aIqC5gEy9nxlAjotbhizNed+KhiPoejYn6ALSibJyKgM4jYCAQpwd4yYpzmdWTGTbZmVmlLQatLUni9dGU2Z8vQHe3JjoBkgAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAMAAABEH1h2AAAAAXNSR0IArs4c6QAAAk9QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGRkZGRkZICAgGBgYFxcXFxcXHBwcGxsbGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaHBwcGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGRkZGxsbGRkZGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGRkZGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGxsbGhoaGRkZGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoa7LJWmwAAAMR0Uk5TAAECAwQFBgcICQoLDA0OEhMUFRYXGBkaGxweHyAgISIlJigqKywtLjAxMjM0NTc4OTo8Pj9AQ0RKS01PUVNUVVdYWVpbXF1fYGFiY2RlZmhqa2xvcHFydHV2d3h6e3x+goOEhYaGh4iJiouMjo+TlZaZm5udo6SlpqeprKyur7Gys7e4ubu8vr/BwsLDxMbHyMvMzc/P0NHT1NXW2Nnc3N3e3+Hh4uPk5ebo6err7O3u7/Dw8fLz9PX29/f4+fr6+/z9/h/1AioAAAL8SURBVHja7Zb3UxNREMcXAqggIE0pig0VPRuggAURRUBARUVFBaUJKCLFw4Y99oqosYEUEQtEUBCICSYk3z/MyeUSknjx7jKOozN+f3l7b9/nbm/fvp1HJKhpDMMwUZzpF8swzHySpWyY1bacJtcbzdZzd3D0BR23GDJxLvgcIHMAV1fID96i9zgGpJK76sF5IMVdet6Y+bdPeshAvOPiAnlzkdaStlqrb0lcpBgeCqyzWIqnGNo5c/VdIJH3daFCOr4Q2ExEvl1g3cEzMT7FPNZB5Q6ej1FuLEP3H8N99NhmxU1fvhm+D49acc9h5IvuXAteBnPGEVjVb/EUAfGi+Fpg6JZSqXykA3RqGPoAfLimVCpbgRsSKuiAnv/oeOWkIqhpVYc1iofhgoBnnoNKLrWoVBro483xqon82oDXqic32V0OyxbbChVCOkg8TtMHhPwFdrjR4CgTBhQ2nPIAJ7/BEc9y+p9elNMEHgJsclow+Cvc24RsLo26d9zzV+yTjockbnD6nBqNyQsUkvA5d7jMbLVfPGKeGdwuAZ/Bp3mvPT5umSsUx89Bmzc7/A0a7OgYICs8vhljUaL4J5QRUS36gyfwE9D5E4UZkSGGBwHriWipCU22pQkmNJrHbpSK4SH8eT8DVHhbpla+xegs5/Mugge8AlRJXkRR1UaYUkkmTmEPAGg6zOdVk0ZS8Ylm5bO7l9stY9NckowHsGys1VYk5FceSg+yIVVsirSaF9dfjEdXOStDDp7wU2u6IAdf1uGsun8ndf9x6Xh9ukxpHHA39Ltw8nVHfCNlDhcLa4+lz3isceEvzlUQBWpdhqc7uz9tx9F21/EXEoUBIz2CGrfdrATdH8F1zntoEd7aqPLHn6Fvv5jsKejeAjBElAPEuKwOf4VL13W84FqzBjUkX9FG/sbBQhspHz8NTShnRGhwP0AunWtCCW8WAc+SZMGhNUDnVOtTKYCOy6xUnWrWAq0RE2/L6JRZ8PqGYPtovDZWX2mWqttsgfWS8wOVDhPNZXeUuAAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con3 .item-l {
background: url(@/assets/v3/bg3.DKgYKiLO.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA4CAMAAACbrRsRAAAAAXNSR0IArs4c6QAAAmRQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVJycnFBQUEhISIiIiICAgHh4eGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcGhoaGhoaGRkZGBgYGBgYHR0dFxcXHBwcHBwcGxsbGhoaGhoaGRkZHBwcGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZHBwcGxsbGxsbGhoaGhoaGhoaHBwcGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGxsbGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaM9yYTAAAAMt0Uk5TAAECAwQFBgcICQoMDQ0ODxARFRYXGBkaGxwdHh8gISIjJScoKSorLCwtLi8xMjM3Ojs9Pj9AQkNERUdISktMTU5PUFJUVVhZXF1eX2BhY2VmZ2lqa2xubm9xcnR1d3h6e3x9fn+Bg4WGh4iJiouMjY2Oj5CRkpOUlZeYmZqam5ydn6Olpqmqq62ys7S4ubq7vr6/wcLDx8fIycrLy8zN0dLT1NXW19jZ2tvc3d7f3+Dh4+Tl5ujp6uvr7e7v8PHy9fb39/j5+vv8/f7mLvP7AAADPklEQVR42r3W+V8McRgH8E8bSki6LJahcrOOxaZylVhX7jORW+5jkVtCypkz951io4RUrpBVn3/K6/vdZq9se3jx+WWe3X29Z78z8zwzgzC9DzGYTJ3RKnr6ltLIgCkfRf2BmrwueImwT6JbUz28JYXcSj6LCYz2yCJLuwdGkUmWaQOjWE6+6BkYxVLyZa/AKBaRFTq/qXGQyMZmvtP6Sx1Z9L9oxEg108lkv6gj8eTo1jRu24WC5aGimmrOAjDYbO4kV5t388xcTVs0rUEcyDMxW7l8AGAKKYZlmzzAS+0808h6fjpbTJ4CcIAPAUwmo4GxZHleCbnSM00nBwFb+DUY2K/SGGA3q8KA87zumWazBkASqRP0EYBJkhaxCMA6vvNM1/A9gPFkH2CfSmMFLbTv2CMVPyaSiqCPAUxsoUWS1npbsFFSs0q7A4WSrm6LLuNXjXpBzHwCYIKk+bwGcfosnuloclNUXAmrAexVqVbMd1OGdnwtCzzToGJbc8+X9Kmt57VAeKX8+ufQNrop+hzJxlWi3KNSMd8Jd0hWJ7fZw1BSjRGy6KaLBdBR1ytYfuybMqSlDZF8i7xrCGRyNsjFN6/wnxqaWbZjTyWtw/ym+awMByJrmOtOgxSnp5k8XLeUcpfYnGCJKw3Z8oUsT5G1JrOOfDNDlAcbrtppDbPFZjvLXOlJ23VNEnWOrc6Qf3HLGx1OFiSmv5Z9FPuLxUmTHrJeAxxXaYSi1HGnoijKUb5SlHAHXcjvIYCJzV3lkGuBMWR/QW/b6BrXJ/ViB13rNK+zyfZAgmycY96pbdQTVdpB9pxB0Dsq/ThvQbrRaDROW5BhdabZTqM+S9I4SY84aI3jMjW60lr7qM8kQyQdI+g9Z6rbvDnKnZrYFCsG3hoqb6B6II3sDRx2paPIAe5U18jS9XsbeAVAl3pWbdxaz3IIet8bxQp54j7Hi3pak6h/iOk65APFhPNvn+e1vCuMLKyynO4v71kXc52pvqKiX2vqJZ7P8L+lX+bY80vQKWSqj9S9EU2k6V9TTXuRgeQ4WWiAEeQI/94lDIG/hjjTaovlm9X6weJLqlypn7FTbY7I5Rs38nN8TG/8dX4D3Yb6f19FH58AAAAASUVORK5CYII=);
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABACAMAAABxwuT6AAAAAXNSR0IArs4c6QAAAtxQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaAklNYAAAAPN0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8hIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCREVGR0hJSktMTU5PUFFSU1RVVldYWltdXl9gYWJjZGVoaWprbG1ub3BxcnN0dXZ3eXp7fH1+f4CBgoOEhYaHiImLjI6Pj5CRkpOUlZaYmZqbnJ2en6Gio6SlpqeoqaqrrK2ur7Cxs7S1tre4ubq7vL2+wMHCw8TFxsfHyMnKysvMzc7Q0dLT1NXW19na29zd3t/g4eLi4+Tl5ufo6err7O3v8PHy8/T19vf4+fr7/P3+kWOxigAABYhJREFUeAGlwYtf1fUBx+HP4QAKqMecXGTesaHmLR2zxgrUHLZNl6tBbmOpqRW2spWmxiJza5QjlZxpXrAyZlhu4hR0W5tMWYkrFNwmigKFcj0czvsf2Ov7+3HwIAeh7XnUM8fQ0ZMnjnTpS7t96e7TjVjqTmxOjVafjVrzKV15i5a41BfDtngAzrzx9MI5M7/57bS1ey4DfL6qv3ozMLMR2oueitMNjpkbzgL//kmQbumhq+DeFKNuph4E/jFJPXNkgjcvTgEln4Tr89WTiP1QnqCeOBY14H1WgcWWQuEQ3cKUC7A7WAGElUBOsDpNWZ61/dCBLWvTh6tTVDHkKIC9sEo+M7Ir6VSyZrg6hObDo+pmNbyhDuPeBnBXnnj3QMklL9D88mDZIkppS9ZNvuulKFSW4I1tULd9Qbgs0YsPtELdItlGXaV2pLroV0FlpCy3HYaG9QPkZ9ROL2wMkiWxld3q4kmYI8vYzyA/WjeZdhYK+suShXe6/Ljq+L0srrPwokPduD6AXbK4ajksPxvwTpMR9AEsUSDOHfBzWTJgrjq5mnhLlrWwUT4RU+fNnuBUh9DjeJNlhJ7nuDotgUkyYhv5MEi2eQUtALXbJ8gWfZG/O2Q8DuPkc5RzsuTiHiPLsMP4eDaFyrII0mSMhPXqMMjDr2SM9fCaLHdchHPPzRw+Zk52PRwbJCPoNOccMk7xV3X4Dtwj4xnckTKiLtD+bIgsQ/Pg/SAZCyBBxlo8LtleotYp4wSHZHkX74Pq9Bo8JqPfNbJkTIW5suVzWEaMl2UyZkKWbnAWcXWAjH2ckeFs5QnZzpIjYx6MlpHL1Qj5SYA0GT+FcBllvC7bF6ySsZj2YBmXyVEXZeyRMQviZBwkXzYPS2U8T7UMF6TKuPNkwW0yNnNKRjx8S0YehbKEwSIZr3Naxu1wr4z3ktY9LmMdl2QMhgdlbOMvsjjhERkvUy4jFu6Xsbqg9B4Zv+RTGSMgRcZOjsnWRIaMDJpkONt4SpakibK8zxEZCTBFRj4FslXxCxkPwWAZRyiWv4HNPC9jAUTKOM4u2Y7ytowZcJ+M5ZAkP+tgoowsrjlk1LBetq18IiOomhwZYf+hfIg6faOFd2QpI0/GUEiTbRner8rI5aJDxkIoiVWHxBo+HyNjHKTJeBjGyxYPy2TcDwtleQFqnhgkSSNeddN2nyybcA+WsY/L8qnikAxnGf8MlmWlB1qL9+4vBWqTZYlzs0VGv2vsks8ruF0yvgfLZZteiM2TGyvbOzQOk5EC8+UzDZbKUkTz19Uh/pm3jny4bXG0OqyATFn2UhOiTse5FC4j/guqYhXQ7DZOhcu408uLuiERVsuS0k7ZWAWQUk/1CFkOU+uSn3zqI2VZCXWz1M3P2mm6S5a5kCF/4z1sky29Fc/mGHUx7Q9QNUOWsI85H6outsCjst19BRqy7pCPM2mXFz4aJlsepKqriNO0JcsW9Rs3UJ694oG77k198s1aoG5lqGxrIFc3G3mFurHqELenBT91L7nU4ftejoWom8RWKifLZ8APdla0Alw/80qSUz4/bKIiUgGke7m+QP6+MulrA+XHkQn1kxXQAw14n1PPIvZD+Xj1YEol/DFBgTlSz0HhEPUoqgjYF6cAZpUAOcG6hZAVV8C9Y364uoh6pBAoTVEvBr7QADTlp8eHyDJg+tPF7cCFHwepdzF/wtJWUVr8508uYcvpr74Y3czftpZzQ/vJX9fwcbD64nc0j5FiZy/fkPPmb1/NTL/bJT0MGeqDebBe3RylPka96vcZFWHqZlIbO9Sr1TBfAWRDonoxqpGDCmRQNaVO3dp+WuIU0I/gMd1keLa/9+Cj7B5U0bI1288GaTr/q2vShLIuLv6rrEfV58v8ndT/5b+wy5acLtE3wwAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 32px;
width: 30px;
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA8CAMAAAAAPFkHAAAAAXNSR0IArs4c6QAAAk9QTFRFAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGhoaGhoaGBgYGBgYHBwcGxsbGxsbGhoaGhoaGRkZHR0dGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGhoaGhoaFxcXGhoaGhoaGRkZGRkZHBwcGRkZGxsbGBgYGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGRkZGxsbGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGxsbGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoa4vkYlwAAAMR0Uk5TAAECBAUGBwgJCgsNDg8QERITFBUWFxgbHB0eHyAhIiMkJScoKisuLzAxMjM0NDU3ODk6Ozw9Pj9AQkNFRkhJSk1OTk9QUVJTU1VVVldZW1xeX2BhYmNkZ2hpbG1vcHFydXl6e3t+f4CBhoePkJGSlZaWmZucnZ6goqOkpaipqqutrq+wsbK1t7i7vL+/wMHCxMXGycrLzM7P0dPW19na29zd3t/g4eLj5Ofo6uvs7e7u7/Dx8vLz9PX29/j5+fr7+/z9/hwDx/gAAAMQSURBVHja1db5X4xBAMfx2drY3EcRKmfESrnlyH0kFLlyE7mv3Lco5IxCtI4kZMtNrsq2nz/Ma55ntYfnyuvl9eL7y8wz+7x3duaZnWdEpDM40cJynASnLvWPKU2rW0EzA37vLDccjLBGh4Ez8LpPOdy0NuBQKiJPw3OnFToTZoY05Xrx3DlvkmNCZEJm6NdN/45pXmlTsbm+9IJhHuhSEW4yzI2SLtKkZvlvadH2VucKHxX6R/mq0NqqVuc1X/65Ge6cMClrwbh+jlZSW/KOCt90eK6vi7dObRmPgmezeJhFOqYM+HAqa3Rc2w4DU9de9YD3RC8rdK0H7s8O2J66rK8D91hTGnEIarLDgvvouKORhuUm1HYGbvf8fVom1MEKY7oVTms+jngXjeON6Dwv1+zaiyDWTV2sPm33kiddhU7GNlKgT/NglNBNHozUo1GfOKsvRbsaSvToBpoGKBX70Mnd/aTv1L5qZSUM0aElFCvl8vdAYQ+1McUFuFJkNfILW7RpVDOrZLlJXbhP2yvSo/4JFFvIXW26CORK7d9A6cjYTc3skY0u3Okx6W5c8mIpRGnSXGplkcM3+Y48QKUcJ6QLIdJBjjcRRmjSvdyTxS4q1B68diHSIEYIEQNpQojolrdiCC3gYkCvB3ks1x9k+HsNayJHkxZzThb9GigdFZfrZbdvrBm9MnxjFfWs0+m1zNespEqZ4eQm9WySLC86qr/hF/W/JPOpUSvL3gHnfeeJZLlJuRQpEloWqkJnwAz1cg3eNmotPHFSN/9qik/7ta+lQe8A6mw5hoyGKcIwO3kbrkltzzhqKG0vOCyC6ZIUNcf57DCi82GN79b9PhqQHCNaGXKCCaZve+jLaaGHH8dgf+b+4JSudFRRPdx/76CQj7dDto4MOwmTDUbjeEhzlvbsHoYjhvMfV03zYo32hBtQZBfGtgbyZCW/WnnI5dXKzpEPl9sIk8yBiUL5M1ySRS25Qt0fOplJkQKDA6hbpdlg/8t0YVJSUtIVbsniDftksc0i1c5fpZFDdWIzpdbzE3Z4x2LkwqSqAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAAA+CAMAAAChgZ0aAAAAAXNSR0IArs4c6QAAAspQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGBgYGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaty+CnQAAAO10Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGRobHB0eHyAhIiMkJSYnKCkqKy0uLzAxMjM0NTY3OTs8PT4/QEFDREZHSElKS0xOUFFSU1RVVldYWVpbXF1eX2FiY2RlZmdoaWprbG1ub3BxcnN0dXh5e3x9fn+AgYKEhYaHiImKi4yNjo+QkZKTlJWXmJmam5ydnZ6foKGio6SmqKmqq6ytr7CxsrO0t7i7vL2+v8DBwsPExcbHyMrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4ePk5ebn6Onp6urr6+zt7u/w8fLz9PX29/j5+vr7/P3+lBpGjgAABH1JREFUGBmtwYl/zgUAx/Hv5jHP2OaYNYtoLETMNdcsQqzl6iBnUWIlcpvI0ZAZJaQtR6FSbQyJkjRjWHOFlmvGhrU9z+d/6Pk91zbz8uzZer9VLebWEX6qqUYbCuH26kDVSPcL2J3tqBoIPEvpiucHr7GQZVb1LcfaTzZxME/eatwivFXrtu3ad4j8h82y20mWvLWdMhNkN41iH3lpC2WmyW4+d+StVI7ERPfq0b1bl2wO+MrG9DsZ8lYK6XKYAMtMUp1kGCpvbWavnL6Dk8nrcmCbvLaJfXIK3ordxiB5bQMH5Bb79ckT2waqGtZzUP+DdRzS/yCZX1RVjfuPm/vB1BGRqiyJI6qSwMlppTicX9NND1jNUVWBaeIVbCwXcwoxbG+jClZyTJ41+xXYOzXCJCloUPJVKJ6o8hLJlEfd/oKMKLkFzCmAZJPKLCdLnjxzh9K3VEHz32CtyizlpDwIzuFOPz2g7k6Il9uHnJYHu7DGqZK6h7F0kMsicvRo0ZCghwi7wbXdP6TtyThw8OfDl/j3j6yTp878efbchUt5127kF9wpul+SO8VHLj9x3qyHicezb0PkEAnj5dCwX2xzlfG7zLnUlC8+3/jZJ2uTVq9a8dGyJYsXLpg/d/bMGdPfezd+yuQ398HFGNnNpshfhoB12KS3lNtCbpv1KLUSLFjm1ZLNIXbJUOcodgXhcukCA/RofS9Bepiku8TLsAASnwyZVEiG3IqYKg9Cd8PpYNWHYTKcJ0U2E6GFXLJZKk9837fwjlpDb9mEQKxsGsFQuaSTIo/a5DNfERAjmyArL8umKfSXy0HWy61tVF05Ne7zlFxibnK/o/xhpAzH2V9L0hIIlUsuCXJquQ+ujpLBZ9Zd+KaZ7EYXc2+EpOvMkmEs7B8+aBNskIv5PpPl0Pc6hjV+UtBODPmvSvJJgGu9ZPM9+2WXgl1mA7kMhC6ym1pKcXyf43CwacRx+LHT7GLYGmxOhexWMkzC2kR2Y05ZubjELLdPudyufYfIzl1T4UpPKWAr3C6CVSapUyZcPAR7GskuzMoCOQWFqZzQe7hZmskwrQTujZXBvNwKbPaT05cUPa6HWUWZYjm0mTMzXE4xublvyy38Pjt8VFl0CTt79ege1bVzxwWUyqNFsEiVPJFHXhM5vIFVHpl2w1wfVfT0GUqi5TQe5FmDLPiqocqLu4X1dbmMBV951jgNbs6oJ5eoNCgaJrfRYFIVmBItULhjQkzbpl1fWHwKyO6qMq+Bn6qk/S7KuTq5tsoZCf6qog5zDlsx3EoZUk8VvAL1VHUBrXoOiAxRJS9BoGpuONRXzQ2BhnILGTzqWbOqIQ6C5VR3tQXIHyfvxUKIHB7LxmGLvDYYQuWwFZLaB/XOgAny1iAIk10MzJGN714K/OWlgZC0dHniyo+TjpJfW4Ye0E9e6k+Z/bKrB2PkpV65OaezszKPHT3yN+dk1wZeVLWNhIEyJGJtomrzP0HeAMl3uoVk1UC3EshJvw65gaqJ7icw7ApVzZhHr9+24jlV8B9T0a94882ZyAAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con4 .item-l {
background: url(@/assets/v3/bg4.C7YndXK7.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA4CAMAAACBkfufAAAAAXNSR0IArs4c6QAAAjpQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWHx8fHR0dHBwcGxsbGRkZFxcXFxcXHR0dHBwcGxsbGhoaGhoaGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa67X1NQAAAL10Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcZGhscHyEiIyUmJygqLS4vMDEyMzQ1Nzg5Ojs8Pj9AQkNFRkdJSktMTU5PUFFSU1RVVldYXF1eX2JmZ2hrbG1ub3JzdXZ3eHp7fX5/gIKDhIaHiImKj5CRkpWWl5iam5yen6CipKWmqausra+ys7W5u72/wsPExcfJyszNzs/R1NfZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dy8/T19vf4+fr7/P3+eSKkTgAAAttJREFUeNrtlvlfTGEUxs9UktJiC61SokmkhEoIKVsSGWtCkZKKbJOiGU1IWZPQokWhzTRpaJ7/zae578x9Z+beWfj4zfPTuc8935n33nPueV/yV4qKIaZ4zlQwL5LzgkgJUa0WbJwzfZn3kPO2S2MT7mAHhX9u5rFqwbvIY+2Cl8kwpeCr+UWeEYJ8HtMJQdh/TA5rVpvVzRdAChsS8ppky92kyxWCbTqdj2S5Y1pF1RAvL2+byzIucQNJyjvt2ouBn7+GXtZm+JK7mlc0Iq5nvHiBe1TaRwDf7pcWFly69xnA4C53qEIj8GQLey5FshYwFbumzgNfdvBGah9Q7Yraa0JHuK217Blw1DkVoUfPEntzYQeMCU6xBhjiHN3wUTy2s0JPWZVDCSZckfo1FZBBmWJmBN9cOqrFaLAU5tuDJlLbzZKpSUEaxQDqpBdfBr1fHUvT2344ROvmDEklzq2SKcwe2wcsksYURhyTxU5gmkVRD5gsL74Pl2WxUgywaL3l4S0N8wo3ZTEVDCxa1cKUxIxesTIOWC4QItMHMzguiyUC6dJUPJBljw33C6r3GkaNNHYBBv8qljZkN4J0dAsjAVKUTxe0tl2yosyqfNoIlEhhBUA25YiZ0Xb3NZiMdqSWD6ONnGn1D3Q6NLPfW8wmO8XoMNAeamsFvwHOkgtVAJ9SeGNtJ4B6L1fcuVlAY50BsWoT8B644QqjnXPDsbfm5IE8VdU7AGOH5rcAlS65gJJJsUTTlSFEAW0ylbGV/+67XXrA8KFhf5DwWl4DKj4j6pGoChs2kG/rpZ0wHSGiInOiUnp/u9PI5v7mxka2v63sxmwe0W1xBD3VmtXvfDeNHIQxi4q02haP9m6K/YrpNI+3fKKECXxP8hyjlCmMrfEQK39+ndJnUP4n55I9V//6OJMdZZaGL0CF4J3msVbB2yR7nPlnh97AraKsAzOVMy0n8zjOW+z6a5DUb7XEj2EfmeDdAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAA2CAMAAACycDqVAAAAAXNSR0IArs4c6QAAAg1QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVFBQUEhISICAgHh4eHBwcGxsbGhoaGBgYFxcXFRUVHR0dHBwcGxsbGhoaGRkZGBgYFxcXHR0dHBwcHBwcGxsbGRkZGBgYHBwcGRkZGBgYHBwcGxsbGhoaGRkZGBgYHBwcGxsbGRkZGRkZGRkZHBwcGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaHBwcGhoaGhoaGRkZGxsbGhoaGhoaGRkZGxsbGxsbGRkZGxsbGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaino4mQAAAK50Uk5TAAECAwQFBgcICQoMDQ4QERITFBUWGBobHB0fICEjJCUmKSstMzU3OTs8P0BCRkdISk5PUlVWV1laW1xfYGJmbG5vcXV2eHt8fH2AgYKEhIaIiYyNjpCSk5SWl5mZmpucnp+goaKkp6iqq66vs7S1tra3uLq7vL2+v8HDxcbJzM3Oz9DR0tTV19jZ29zd3uDi4+Xm5ufp6uvr7O7v8fLz8/T09fb3+Pn5+vv7/P3+pK9UKQAAAoNJREFUeNrt1utXTFEYx/HfyIyaSqSbRlNpIsklhCiUa8n9FlEk1xAq1yKXhESpUJIQRTPfv9GLuVTUzJlWyyvPq+esZ33OPnufvZ+1ZXUEFybJQXBhmSrZYPirir3EIaOR54+E2mcGSdZ+4e3ioMhGJ9C/ZHKyK9cX67xiiJ8eEzlazT05wSKPeET7Y64OuE1qgP8y4hH2Rioy3WZCkmH1RZhkG6bdrkYqlDlAR6hMo1Xrpkmmn/vaLjVSIWV2LTa4YmHyEIUF8yvdRNNFLDabxTAJt9m8aezqgw03/JJXdbtXzPY+hOScawMYCPFDkgFczaeyJEkVAHRXb7P6IXHFtX0AFEiKdUFbQVLgucxI2/MBeiQlAvQXhgQk4YdGgAFJpl7uD0NTegCS/QY+PuWeJNVwJ/UuOI9F+iHzq4Hzse85IEk7+TrTlN8DnWsmIyGF/dC6TCmwSpKywCFFVwI1CyYk6U0wtDdUyoMYSQofYbMkLW2Bb9vNkqRFRz7RUZIiSYosdcLdVEkqo9X9kkeckSRZigahOUOaU+05b0ctUk4n9OSbJEkPqHKTjIUmzxfY68BVnvQC+houPxyEuuQaoDLaUzenp0mSOT7ePDrR9d3wA8ojJCXchF/QkjlatsbH66/NH1XmgrPu3PQEvhdZAp+X6/R7d5vNxX4jR6yFS778OReNkHeU+PJqbhkb5YIvf2ZslCo6vI0l0clWI2Q5HPGsWD3DiYY6TC2cCJcUdw0OGWtK815Cb/3pe1/httlgH5t7xb3HnMdnGW99GaWf6dqXOn3d8j/5N2TLynERM4YkjS8dnuQ+lj2G7DB2hQtIzAl/RqgkxSRESVLEX1VNJX4DmRADv7Vqo6QAAAAASUVORK5CYII=);
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA2CAMAAAClUqpcAAAAAXNSR0IArs4c6QAAAZVQTFRFAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcFBQUEhISIiIiICAgHh4eGBgYFxcXFhYWFRUVHBwcGxsbGhoaFxcXHBwcGxsbGhoaGRkZGBgYGxsbHBwcGRkZGRkZGxsbGBgYHBwcGhoaGRkZGxsbGRkZGRkZGxsbGBgYGxsbGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGRkZGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGRkZGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoa3tD9qQAAAIZ0Uk5TAAECAwUGBwgJDQ4PEBEVFhcYGxwdISUmJykqLzc8PkJJSlBRVltdXl5gYWNlZmprbG5xcnZ3eHx9f4SFh4iJkJGUlZaXmJqbnJ6goKKjpKanqKmtrbGztbm8vb/Aw8TFxsrLzc7P0tbX2Nna3N3f4eLj5efp6uvu7/Hz9PX3+Pn6+/z8/f7+aEnfAAAB/ElEQVR42s2WaVfTQBRAp1AoYhVRRHEJirumtbhUcVesuNPihrhjRVRwX1CpYi33d3sySSbhMJ5mAni8X5I3yc3kvZeZE4GiIoxYgHgt41AyFzPy2BtfrI0YUAiJRpRDYnUoMhNzRIMcz0ux1Otww1yM0UdHrCimzMRYLKrYuF5La12xXd/wPUsnJi3LusszS1Hgm2VZqyIVp8i9IDjMVOSqxhYHuR8Eeb7UEdPX/UROMx4Mn1FBx0Gt2DTKc8/cBxv84ebXDHneJMe0Mx7CN5dPM77CHUwUYavvkdXnGJgH4GmnfP0S3J7nzSuOY8pvq6EfvmeXJXvewSM5d3vYk+LPML+hz72Uq0B1BjiXkvFVeDOq+DRnIbtc8B66+4cTzV5udMOyZrMq5nyOfIZud42crMHX97PwYLUcOAGvLg4EHFWblRBizQTk3Nbcgo89CbF2BN7KKqWG4UqDbkMOe+I4DK+U3chDOak1ldj0Unltv3jc4l3vg53CNwe0M+6oep7YT61D3VDmjvDMmW1aUXT6J2cZC244xaR3lrL0ORosq/9DbLFt+wkvbMVNpm3bXldX/Msut3fpRJHQEq04Rj8PUWjdrthkJHYFOQ/+M3FL2uGSFLPNUdkIm+UTClI0YhHEXQbkw6IJXQsQxx46fDAXgz6akM4oukVc/gDJXaMPEeEHHQAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAABACAMAAABm4HQzAAAAAXNSR0IArs4c6QAAArVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaHBwcGhoaGhoaGRkZGRkZGRkZGxsbGxsbHBwcGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaefXWRQAAAOZ0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ2Nzg5Ojs8PUBBQkRFR0hJSktMTU9QUVJTVFZXXF1fYGFiY2RlZmdpamttbnB0dXZ3eHl6e3x9foCBgoSFhoeIiYqKi4yNjo+QkZGSk5SVl5iZmpubnJ2en6GhoqOlpqeoqqusra6vsLKztLW2t7i5uru8vb6+v8DExcfIycrMzc3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6urr7O3u7/Dx8vP09fb3+Pn6+/z9/v6gHUxNAAAEWElEQVR42pXW6UNUZRTH8d8MKjFkijoTblGampiaqUkupS1ILpVbaWqZK6YilJrZohmmWKhJuZRFmeZuhSWYW9mYikCJbLLEcqfv39GLO+PMMKvn1TnnPp97n3ufu0mhIr5Pr1jdaYzc3wT1Xzx8R8jyJmY0z74TtQluLh2buqoBFkWvsuFIoiT1PgOLo1UfwSGbmTuidpaNXiXZi2BJNCwdDtu8pb0IXoys+hsct/k27L9TY4/ItlJ3v39nhBHFNMvIbt06zNFIygYzJUkxw194fqhVkrSG4kjMAeMlWeeWAhTPskh6napIzA7jpbgv3TcXn8dK86JiaYo7AIXP2B2pZ+Gb2GhYF5gQ9z3ktJOk2O2QH7uAykgsxiB9P2yxmKV1G+R/wh8RF+AM5ZBj9ZTWXKhjV0S2FNhq9dbWXGBSRNbhHxof8W1McPGzJSLT441UDPaWaU383TOykp72deObuJEcjTKde56p0alus9blHb1Y4sK46nRevlz2H0aJ88TuDbO7hTadF/9EyDi1pFNQFLewCjDOHchdnZWV+1Zm5sqVGRnvZq9YkZmTX2gAlfPvClSjr0HLvhmO4BNxTPvKgKsprfuzmmHfQz6NhGEJ7R/r4tNI/hoap/ur96FszO3KNiX3gouUZHDmzbj7dvvJcljlqxbCr909Rc+1lQCkJANwa3OSZ0vSGZjrVc8aHIt35zHz6oHCXSbbUwA0LPNci/YFtDzhUd1ruHKvO7/vR2jIGax+Jhuu/u/Vw1nPAbuWUOm5ap/y7yB32q8YDiZJXib12AM3RrgHDGtmvfsSGaxxNweV02J+mnyYNL2JuiHuIRtp6iVJ2kul+wZI+IvGCQpkGlXDdfftlVjLNkm6p5Gl7j3txZWqYEzjWjjpfnZXcytW0mToYzam+ixLK6ZX4WUzexSekrSDC2bdxklB21DMcoJy81Qs18iW9CfvmFumwViFYhps8JqZbeEXSQ2ehT/NSYVm+o5zZpJOmZQAE82VhCnh2EQYZi4HrrbqB3MkSS/hSgzH2tUzT5KUCV1lv0ZzmiRt55QC2MZF3iglT5LmwOl46cEyGsdKOsKOQOYflyRNdXHeIUnJN6kfKZ1nrQ8bByl9b7SKEqsmGzi7mkOGVFP3iipY4FVDq6nvpYBos7yF4tuPX8otKKzlYz81RlPT/WLzD0VXoKSvdy8DLgIc81cZwd57J3r4Hr3t9PwGfmutakp9w6B2R2rAR2Q51TH+qiDBb0ApWYFnq1EwNJzqC2lBWGwtH4ZRWkddxyBM66nvHFrFV7EpmNIDBm+HVFoBA4MybceoCaUGNrM7uFKXMkKpDkVUJIZgei6Ush0L+y+6+omgynEEMhUuMsDZWo0ugQ1hlSXLBTsH+LaS81wYb0T6Mxl5CTg4s7dZJc3+1gXXRyli2DKrAcqLDh06WwFQtaxjZCWp/dxTLs+DYhyf3yEqJEnqlJb+wc7P1i2Y1Dn49v8BUIfpizuTif0AAAAASUVORK5CYII=);
background-size: 100% 100%;
height: 32px;
width: 27px;
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico5 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAABACAMAAABm4HQzAAAAAXNSR0IArs4c6QAAAuhQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dGxsbGhoaGRkZGRkZGBgYFxcXHR0dHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGhoaGRkZGRkZGRkZGxsbGxsbGhoaHBwcGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGhoa8hNQ3AAAAPd0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaHB0eHyAiIyUmJygpKissLS4vMTIzNDU2Nzg5Ojs8PT4/QEFCREZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV9hYmNkZWdpamtsbW5yc3V2d3h5ent8fX5/gYSFhoeIiYqKi4yNjo+QkZGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i4ubq7vL2+v8DBwsPExcbHyMnKy8zMzc3Oz9DR0tPU1NXW19jZ2tvc3d7f4OLj5OXm5ufo6erq6+zt7u/w8fLz9PX29/j5+vv8/f3+/vwH9BgAAATrSURBVEjHpVZ7UFRVGP+duwvrZQVCZeUlqPlEfEw5+QgqozJTEx0bzJpMRxudTJ2mJk3/k0zTBh+oNb4gQHECDS0UsVFSBx9TNI6jaKnxRoFdwJUfEyu3Py4Ly+XCXqdvZ+fe33fu73uc75zzHRN6EuvgZ5qf4CnlxewGsu5AzFORxBdUpXHx07C2keVrXp2xrp5caZy1lTwRAgDPXiE/Mcr6hvzJT323FZGrjLG2kLl+bhRslLfak6XyFnhnjXIy3+qpCP6TNcFeadtZO6SrZpLTQJj3uE2ryuUprcqswX6huA4AMD03VLlb3AYAV98Y6o1mBeoASIu/DANQtukHBaiHv5Ym6VQAkNNSwgAg8rv9FkDp/o2kl5+cOR/FcyKj5t3AwlSLaql36U/OlnPIZF8AsOwmsywrWOWNZnJydTaZ3G5fSiGzdvK61wIUsYxM7ohd2kXW8qCRtcXtHhlLu0gmeKUF3KdjgqdiVjMLhfdFOcXBinGdcGYD/4kysgVed7BivBu81cDSaGP71IM3oweWJuqI+CHh4aH+YcJV6YKAPFB6UtNSVVn919nyHmn9F86b3GMI17Iz7Ho0ecn6IOBJSVlljQsR1S4oUBAg18AUGho5zgTYkw61dLP2UgnZlPm+Td+XbWGGk7zVLZhFjWTGqN4mKvow6Xivq24jee9lbzM8rYxc76n4mLw4yHtlBl8hl3bC6U6eshqpqP95Nr3iBoNqeHOgsZUQ/jcr3bO2g/axRvvDxEZ+1T5FTm4w3o22sGEoIIDURPtYu+4ngcstAgICEtSn+D075Lr/gZUAAhxco284sIBauQqs5wMLzIjvg1/0N+yPsbjTqkCBgjYoUDDS+gjI2xAQdxbYyz/0WfnU5nyOWwFRwq0wIxa5AA695rgjICCEO42oYdiUZHa1H94uAGgDACVvxWSYEYZKAGMHDBiu9ff1xqjDm09a0i8dT4hfUt+xYUoRDnOQHx4CaEJFIRQoaiqKAgU390w9Yjs4IWr2bMdmcT7xpvtUr0WIj9kGBAOoRtFSrbfE7y3/flY5H86s4KRh5xLPt3sLh7AhuISNM4FMpmtZQQ0sjwOO8RiQUMd7AgX8FlhCXrJKtbOqfDPi9bqKABTAJw6FgEWCS4ECgXdTcGveYwDR5ayLS2dGN96CBjZ++AI5VVpHVsUCZ5ic4OSNcHV4QjXrLjNT5+JVytq1rLc838Ti4QDyebGJtzta+6QakgU6JY+6ONc2dxmwLCcIAC6TvDuic3h0MXlBb6m4e7QJAPAbeSayy/AFHkVESsoQYGBSft66QGDivv1WYPTeotOfysCc9N3AaeZqjuM0HsEYciL63ybJazLeJvsh2k6SxwVWshQ4xR2a3q2of4EPIlvTshAzX0Wr5MadJ/FmLBS1HkITvAKh1i4G55ZjXPRIFY1H6lqfB/KIC73fFAR88Bh4BF83akZrKyStt84gJdW+4hFyR5MQni9dvXVRu1HHmus0qcmtXVuOKXHmGFSo6H7MrF8HB+ChV28/KyFn8vq25KsoBzEF+1BVqPUmab1d/qgJqFtUoqKjnzcDt95xdEuiXfYzB1K/IDMA3zGjTABMfjIA+I6MAAAhCeAE93TLzSSLFmHpA4Fy9FVPIVlAwA6b+1Ty1Sn3dLuRa3tvF0Pj9KmDoHj/tT24gf8j/wFtkTXADxi+NgAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 32px;
width: 27px;
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico6 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAA6CAMAAAA+5Q8xAAAAAXNSR0IArs4c6QAAAtBQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGRkZGhoaGRkZGhoaGRkZGxsbGhoaGxsbGhoaGxsbGhoaGxsbGhoaGRkZGxsbGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoa99eAlwAAAO90Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcYGRobHB0eHyAhIiMkJSYqKywtLi8wMTIzNDU3ODo7PD9AQkNERUZHSElKS0xNTk9QUVJTVFVXWVpbXl9gYWJjZGdoaGlqa25vb3Bxc3R1dnd4eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbn6ChoqSmp6ipqqusra+wsbKztLi5uru8vb6/wMHCwsPDxMTFxcbGx8fIyMnKysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9fb3+Pn6+/v8/f7U/243AAAEC0lEQVR42q2WfUwbZRzHv1faCohACxtmRaEDJ25DQNRoFBx/TA3DQIKbMrJsi4uR6HyLiv7nNLLEJRjjNkxkyWQZuswQjZnRVIcvS1QW+aPwB87h7Chv0t4XSZpNurXm7vpyK3ftrvWXyz2/33PPfZ57nt/Lc1lIIfll+YEQMpKHh/ykp3dtBghrLxXxtqTPOEKOP/1AS4+P/vYMGB8WSFrtGP2Pp8Ww9JMHsxR9bZoUy0fkoayo5XRTTIPyLnnYHDedbvoajDIeJPvN6g7nOY5lG4Qc4+/2a3u2kAZdlDvPFxL7zvKgzmizdrfDijHFz3WOq5PjsvprZaUxSA4gSoiul6RAmdz3JQAiTwdi0u4Oy3fbyTflYKsY6DElW7z+QwG2oUYMb3Fu3DmFrgOmCNiAbCTvsp0mu+VJ8gfIXtM7/MkYpJTc/h35SsTM/ph87xg/NQbJOs/z5KsxW6LM8S2D6zlA8jWVnX2U5N0GIbdO01Ou7thJHjGcgC0i3c642SnyrM14Gm9TUzpEjpamU5W2inRHKvSTIkdvQZKQ0pLKhopVpSX5qxCcuyoAeUUILlz2zi6MDS9cJ8TR2bpeb87QmS9OBFJDCrv25gDL5/70iSHcPCunUbjoyiIsxcW3VQGY2/fZlVROmSRn+9oKdQJ5x3GSP9+eFCG8LFJ8vyzZkHuGyIubkwww95G/1aTyWpuX/t36j3vIT+ypfV/tptist7Edh3Hy2SAsBYLcL0CrDU0BJV+XBx4d14Tc6bK6mwNAzffJPsNbDaDKlee5/5JWZeu2ijsCci1NJj7pNrEHZbu0CnVjM96+KCl+4IMzcnhI17Xti03T8uBvPm/rPiGunOJbjloVbYa6mz/IQ4pS5efrK5dTUY/9y4oqolgP4sCSokwMYttKyCYEXbFlF+lBihBdw1dwrl8BeQSuxagDUKAHsUk7JsuPl7A5ESI04nS07x+oUsf6RGPcyMmN+S7gQk0ixH4DZuIQR/y9Zxab6mKGXXoYkXmUJUJWA3/HQ0G1sablYDwgC1WQGaxJhBQj/qYPqgTqc4yMxox8FaQcq7MSC+IFeu+N6K3kTTrVhoyW/DfIwRUHef0UPbWK2kCWa0M66I+8uJc8pfGncd80J+9QMpGs04Y8x0lF2U0OF2ok4C/b/7WfekzSFuXFa4ldCZPc/b2Y2LqokYD4YddR28DIyAVYgfZKVSExxQrKJmQ/D8u6h0rwR7tPVU/W9ceLzo1rzNd5sF1eCkXnEJbqzTnV6ZyO2apfWgvMYeA4E+rGhqIwQkBYvstXCILSzv+VUGfqWwXZFbXIQPbQA1MYmYogu1jIBBFO+gtqQKSN7WxKcs6kajdAkIPtqYy/JDirdTQYaMPE/yL/AQn/nlzVMLtOAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con5 .item-l {
background: url(@/assets/v3/bg5.EqAxWS0a.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAMAAAANIilAAAAAAXNSR0IArs4c6QAAAbNQTFRFAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcFRUVFBQUEhISIiIiICAgHh4eGxsbGhoaGBgYFxcXFhYWHx8fHBwcGxsbGhoaGRkZFxcXHR0dHBwcHBwcGhoaGRkZGBgYFxcXHBwcGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGRkZGBgYGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGhoaGhoaGhoaGRkZGhoaGRkZGxsbGhoaGRkZGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaYKSRzgAAAJB0Uk5TAAEDBAUHCAkMDQ4PEBETFBUWFxkbHB0eIiMkJSgpKiwuMTIzNDg5Ozw+P0FERkhJSktOT1FSU1RVVlhZWlxdXl9gYWJlZmtsbW93eHyBhIeIjpCRk5SVlpeZnZ6jp6mutrjCw8TFxsfIzNDR0dTV1tfY29vc3t7f4eLj5ufp6uvt7u/x8/T19vf4+fv7/P3+HFNa1wAAAi1JREFUSMft1vlbTFEcx/FPqQxG2m6MZQaNpGiUiazJVoRsyXIThWQZIaJl0rQwTNP7T/bD3CbPjOiebD/0+emc53tfz/O9555znyP9JLlWoEhmCdgxYOhKoXuacylJKrE61/gGzNxsrmnthmTYpT0MfVskSaFRpje6srnvGFnvjPfMcccVroZD6cltpvLd4IskPelJPexygzsZWJhY0OAG36VvYeKBYyv4z+BK27btQcbtdLqg17Zte82v8VEWy4Yl4Uc9b6Lve9J5GI0+7Xm5VPyj/sJ/Fa/aGd5sigPPgHvrjLBnCIAuI3yaueNFt6DcBF/llVQOIRPcSny7WmCrCbYm+ToKj3OMVrs+BkR8ht+5dIT7+cY7LMI1rWAX2NpU+G/OsxFe1g/QHPvOLpYC/T9ZGzLOXlVgnIll4/2WSdpTuMJosS58h/1hqaraKZwpkc47FzHvOck66RRqg9IRXyb2jyUaq6amU7qNSHEHvR5J8vbTbg3SkrqHxmPB5uSwLwsz+5k05iMLmBhpzEySLCz/BMTn224Dnsy3/Zx5K9UmYCyrbVXNwGyj80wHMFDi/BDeAu1OoXkOJoOZuHKKTxMkUnfM6zAEkUJJKh2ED3BZknQiyfgXYjsycNnr6Wr/WDQgSWpK9nra6M6TpIIHtHj7EwclScHYsC8Uf1GU2XbZbskfcLqr80gNealxwQHJu88pBH1STXHWO5tuklOVJun8DQfDHK8OGGfbN0W21rQF0iFVAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAuCAMAAACvSe/GAAAAAXNSR0IArs4c6QAAAORQTFRFAAAAAAAAAAAAAAAAAAAAMzMzICAgGhoaFxcXFRUVFBQUHh4eHBwcHR0dGhoaGhoaGRkZGBgYHBwcHBwcGxsbGhoaGRkZGBgYGxsbGRkZGRkZGxsbGBgYGhoaGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGRkZGRkZGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaTYzvEwAAAEt0Uk5TAAECAwQFCAoLDA0REiMnKCkrLS4vMTM1OD0+QklPVGRtdnp7fH+DhImKi5CQlZydn6Cho6WnqaqusLK0t7e6vsHCy8/R3OLm6/D5JIZOigAAASJJREFUeNrt1VlPg0AUhuFDB9z3VlzQ1rpXxaVYtVqlo3X9/v//MQykAk0snKGpF76XkPMkc0IYIlXF5rVKUR/g9VUg4DIO0IgDu5S/nQCYcYI+ce7krBwBNvP0uC8Q2J7Pnx8HbMb+HooGFlqqAyLRGt7iILARLkYSWRn2tzkIrPiqUyLhD688gh1oA8sd1Qkb+FkiE1i6Ux2Nbwf/QIaByta6HuClvhFtoIvnavVCA3jtXyzjAh7RmQ3SW6LKBg5rYWfNq+ZlLZWTBNaix7048Gs3SeA4frEUA1CpnzCFKUqpjCRgpF9kzcvxt/qDwMS+FQL1Od78E9qWB2m4eGEJ5i3QvoZ0ATlNXOEN74CcYi4hEKAxHwka80Tmnt+YpJH0DZhq6TgD/Ay+AAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAA6CAMAAAA+5Q8xAAAAAXNSR0IArs4c6QAAAt9QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGRkZGhoaGRkZGhoaGRkZGxsbGhoaGxsbGhoaGxsbGhoaGxsbGhoaGxsbGRkZGxsbGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaU0yUGgAAAPR0Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcYGRobHB0eHyAhIiMkJSYoKissLS4vMDEyMzQ1Njc4Ojs8P0BCQ0RFRkdISUpLTE1OT1BRUlNUVVdZWltdXl9gYWJjZGdoaGlqa25vb3Bxc3R1dnd4eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbn6ChoqOkpqeoqaqrrK2vsLGys7S4ubq7vL2+v8DBwsLDw8TExcXGxsfHyMjJycrKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP19vf4+fr7+/z9/lcEE90AAARdSURBVHjarZdrTFtlGMf/pzcKQ6Bchs7q6NgG0zFgTGdMFMY08EHZmOhQYdGImWZL8BLjNRpNRoKJUwwmG5sBs1Uy1DgZH3TZhjo+zIVEQz906ibhMu500P7rCMXWD6eXQ3vOaSs+H/o+z/ue8zvvcznPe6pFFEnJSXF7sSKp7HaSYy3rZJZ0MSIMLRRlsip8Sd86N7orJsYX5O8vPlDVPE/nE2GMdpKu2tgYx1MBoPgKnXsjGLFQ9B3kEa2or1tO0beT58hwtAyjnTyqDVgWO13BG4R2sm0vudFO52OqkI/INkkCLHbOlwaMF9imqyETLPbhAjXGg2THsiRaBnnFGDAqdKghE2BRZaCTf6Uvn3mUlKaohkwI6Bp5RlIFWh3Lp85cRbnCExXq7nYDBsQ8l5iXrtoAAJfWb4gPkgTMAjAcfDUVwLV3vwPgQLICRMEdHwDA9O0HqQCQa23WqAVQeVGA6UwpLlSa8+pGcOCwxg+ObycaU3cRmnb3zV0/vb0bDR9rtCoYWTGT9T+Tr/tNo5X8tJNfK6RYQbRDHCLfCNpGKznLQ/FBcJjkmxLbeJLkvfEVGz75G85Oib1wAfjmcryNscpFuyVk7nPxNxPidAd4Ukqpc9FmRvwQ1Lpo93fop1203bF8taSpSRcqKTlZX5a72nxrShY8E/8IQHIGPNMLI+NTtnPT8nUZ+fLtq75LaXfei6e/dEeHpB1sTAQW/7g27fDitjHAB/gyluagz8zamA9g4r1TS9GSMkzOHNuTplDIz5wi2Z+vihBec9H12Vq1S7Z3k+MVKhfojpEDRdGytmeSzgbl5Wbyq/Toud9ip+sRpcDWHUHXfg/0qQIgAALkRu8IkH0+x/2QTRZS2GsYeNgNFPWpbWM0H8Cm3uShbTflmtJbBketG4BD1ZcZALA/i7XPye2krAeNnwPAqkm0XIRPrJCw8ZXyHvEQP1E9XyDztJ9oM4jaNBWD38WjorLJybcj3cktwaFFUXUgU7FtYl5U7FbURkJ2wvN90O0MJUhGMGI9sNwdAanE2Tm/OoI0JYgJs37tx5uoCIcIpTgfmJuXQgxPlYWMxCTc8KvusygKh6Qn4Hpgbg6SJnbgRvnWoJEOBLaLCeSEQ7KBqVApSAKrWfRoJN4EAguMYU04JAuhO2cgeYFazb/0B41UBN1BDlZrwxviKCfv8+vV5C0K3YYMtPx3yK6I8+aeCY4Vi2opmSMPqaPTf+NL5A8yXxr3T3FY7K2F5FZ5SCOHRaWB7JOtgx2zHNkFAHeSO+Qh7/NXAEj6kOyXBF/ypdRbf8JkvXxpEAbg8Q2SRqIJNpRyGF+GPq8sG39WzUje4ryOUNNZtSbWvw4LTm/gGYJziy6xAP9BjMaQrofOB5x0hPWNzZk+eAGv+At44YUgjpODYX1m224BKCSLsQLZzzFofFipCNAoHuoxik/1EzQO0fmA+p0q50y0cTME6AA8v+KdeMbljoY4Rp8D/4v8C2Rr2YaJzeY6AAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con6 .item-l {
background: url(@/assets/v3/bg6.hlVmcDno.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA0CAMAAADhcastAAAAAXNSR0IArs4c6QAAAtNQTFRFAAAAAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiHh4eGxsbGhoaGBgYFxcXFhYWFRUVFBQUHR0dHBwcGhoaEhISGRkZGRkZGBgYFxcXHh4eFxcXHR0dHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGhoaGRkZGBgYHBwcGBgYGxsbGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYGBgYGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGRkZGxsbGBgYGhoaGRkZGxsbGRkZGxsbGhoaGBgYGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGhoaGBgYGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGxsbHBwcGhoaGRkZHBwcGhoaGxsbGhoaGhoaGxsbGxsbGhoaGhoaGxsbGhoaGhoaGhoaGhoaHBwcGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaHBwcGxsbGRkZGhoaGhoaGRkZGhoaGhoaGxsbGhoaGhoaGRkZGRkZGRkZGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGRkZGhoaGxsbGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbHBwcGhoaGhoaGxsbGhoaGxsbGhoaGxsbGxsbGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGxsbGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGRkZGhoavoj1/gAAAPB0Uk5TAAECAwQFBwgJCgsMDQ4PERMUFRYXGBkaGx0dHh8gISIiIyUmKCkqKywtLjAxMzU2Njg5Ojs8P0BBQkNERUZHSElKTE1OUFFVV1hZWltcXV1eX2FjZWZnaGlqa3BxcnN0dHV3eXp7fH1+gIOEhYeIiYqLjY+QkZOUlZaam5yeoKGhoqOkpaWmpqenqqytrrCxsbKztLW1t7i5uru7vb6/v7/BwsLDxMXFx8nKzM3O0NHR0tPU1NXW1tbX2NnZ2tvc3d7f4OHh4+Pk5eXm5ufo6err7O3u7u/w8PHx8vLz9PX29/f4+Pn6+vv7/Pz9/f7+0IfVbQAAA+dJREFUeNqd1vt/W3Mcx/FPLWJh7S6oDd1GU9cwVlUUXeuyGcNqdZvbMJvLrJShC5u6TNvJ5s4uGGHMjKkapi6rYG4TMdpVl8qWNssie/0JHueW5iRNT+PzSx7fT87zkXPO953POSJ6HX1SchVKVrWS5IrPzfn/GJoOzAqv7DvrU73wYUH6QUP6gXmXNXV105jU2b8O/KWpxz0Y+6z2jJTe8F/UE33T1Lw2QuT2QlNtUg+7I7EeL7kez3rYtAx4x+PxzE7cqFI/abW9oT1p9ZuMVD46RBboneXDDF0QTLVd+VKdintoE5HnIPr6Rmg5ytCn3VfaVy9A8HCR82G+1nBruAVWiMiCOPfYHoDtZf3c09w47fkixRHip2ud2Rq+6h9VHxrnSpEZYaIz03HOj7hVyyLpwwVwk1PRxy2EI0WkZBt89WR9arUSurUsBt/U19dPM3Ah3C2KBvZVKt0xzVjU/SYsTj/09hK+5ArPK8eM8we8yeX7e+un7RADtnm93mAqluE3TB7mChAHIhVyQPLlbtB+rm7IhBvPUdbNaVitMuATiFWk2N/98H4iPRnwdDhRSUuy3gCd+fs9y0digR/nW1GzFikyWi8pVmQWFFjgR/W0wIt6Z6JmiyPExlrgUUFNf8xSvXM8XKplo9bqtNX9XiElUG102nh6qGIfE0usauWvWKWvHd9DqNtkM2Nx7kSJQ7hS5OqaSSNWa3ucbAfAMuph9wUTA4Qr1wP/wsJT5jwzRQaJ1XIF2Ad7lNmQPoKtsLj2Qufokzuokezxu9r+NvJF9vhyPRs97Mwez4QiLRvXZ4+dcLFqX5XssSPIrpd3g7rf2eDy8qEOPRvPK/stY6ceMlj8GoQCsHTOWz9fo+z33i3wR8XgsD5z3Ho2XN3q0jRbMmJlbpx9L5xlNFppqaoz60xYnTliC2hfi8hhMEOdDrFJVvhmPRshvMbdg9XabPk1zwIv5y9t5jDN2LMt2mxZrIzGgfF1REeKeW5os0VqaLdZ4GNh7VzzzFH1msVdvD3QNR/hEEd/c8N4ju2pFBnt6B8/we5VX8I6byRyV2rQW2hr2EFv0+dsPVdEfqDT5/P52hPYeB7lSO7BaWG2jRFx7Uik5ae+14pCmKfYjts202OXjPUI4cYGVX/NujvVukV5M7hQy0YxlGfGG2nS0lLRnIiQgpdp2SiJMy+jzYU1Wlo6NptwiEC+SHUUaqdnqioffCAiD8GfJgzviRTHrF4m1LScmXitSOD4rIsi1hZWTV1rwmK3j4uq3zxlH7hO2KUetsRutyXfjSlvRIi7xaqc30Hr/BFp/bzzJlhakYMmF5nW/wHDiRiDSjYLFgAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA+CAMAAACsn+1dAAAAAXNSR0IArs4c6QAAAotQTFRFAAAAAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaOCgURgAAANh0Uk5TAAECAwQFBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYoKSorLC0uLzAxMjM0NTY4OTo7PD1AQUJDREVGR0hJS0xNTk9RUlNVVldZWltcXl9gYWJlZ2hpamtsb3Bxc3V2d3h5ent9fn+AgoSGh4iJiouMjY6PkJGSk5SVlpeam5yfoKGjpKepqqutrq+wsbKztLW2t7i5vL2+v8DBwsPFxsfKy8zNzs/Q0dLT1NXW19ja293e3+Dh4uTl5+jp6uvt7u/w8PHy8/T19vf4+fr7/P3+fNOr7AAAA5JJREFUeAHVwYlb0wUAx+Ev2zhcQZgZTIEyCo9MsYgE80wEs8ikpDKPMqjMzDCLLgU0ZKWUmlGmIRSm0qGWRyqp6SRImMixz5/Tw/ihO20bTz1P76sbi0nPsCpyqduc0LMnUxEqbsetZ41JkZgLnesfnfvaH7BSEbjld46nS9KIfVzJUPhepvdBuY1qxa7w7aFJhs2cU/iOUSnDMlwWhe0QtTKsoUvhq+FsjAY0cFDhmwVlciuCFxQBO66NVslc2sX3ZkUg8QR0HWi8DI6xioi10kW/XcmK1OS12z4rn67/J/P08h3f7Tc01VXOj1VYZh/Bx9lihWGVCy7W1VQP2nkGqLYoVMuh/RmzPD3SAlUK0T09HE2Rj4TdME+h+YSeTPkZeZGfFZJhTt5WAIthgkIxDTIVwE3dLFMoFoGrLxB4U6FYQlAbFIpxS4LK0X9utsORpKGYBzYNRR7YNBR5YNNQ5IFNQ5EHNoVs1Irq2g/mW+QhD2zyNG39VvuqsQokankn/Q5N0HUfwmO6LvkL+vW9FSM/UTvAdaKxDboKZBhWBfS+apJh4iVw7j/cCz9Z5et52HuHFLXQwYXb5JZ5DP50QmOa3KJ/oKvEIiXWwEb5SOqgPkr9JnVjlyRTaTfY40d/A21Pql8pFMqtAle2vC2FdA14F2eclFIPbQslmUquwscJko7ytQZYHVTIWxUtMsyDe1XYCg2pcsv8FU7nyNJHqQxf0Shvdg7I8ABkx52m+xWTDMOqYJ/iYbEMW2iWt3U4LRrwLKQq95f75SH/RJr0F+/L8CO75G0mPCc3y0GOSzLLi1nSds7fKrdcFyvkzdTA5amSFL0BFiqgKT3UxUvS3b9x5mb5GNNB36bCnGXN8KmCeANaXno4f50T1wz5md7CgG2JCiK6vA+39qcVQEJlG3DkCd1ATpMLrtSmKLDo9Mm36x8kTsyI078hbvyMOYMeSlNASVlzBs26L0Gepu504ulU2XD5iF15GE+99Qs0KHYLfloL5CXzFH72jpBbTCM4Xs+9K23Q+AW10FcsD7lOaHhqUtqgO7NePAknR6rfJvg8Sd7yz3E1S9fYLtCxNEperBUuvo2SNMXFbvkZ18V+XfMRFMhPORRJstM2Wv5KIFuG4T3UyF/cMZol0yXeUQDR7ZTJUARjFEAxpCgZtq4O5BTbZVhL5+pANsBMTSKoJhk2E9QiTTwf1JcyvHc+qMf/BiaidyHImEZ5AAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAABOCAMAAABG1vXNAAAAAXNSR0IArs4c6QAAAqZQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXHR0dHBwcHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGBgYGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaJuXLtAAAAOF0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBobHB0eHyAiIyQlJigpKissLS4vMDEyMzQ2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlbXF1fYGNkZWZnaGlqbG1vcHN1dnd6e3x9f4CBgoOEhYeJiouMjY6PkJGTlJeYmZqcnZ+goaKkpaanqKipqqusrq+wsrO0tba3uLq7vL2+v8HCw8TFxsfJysvMzs/Q0tPV1tfY2drc3d7f4OHi4+Tl5ufo6err7O3u7/Dw8fHy8/T19vf4+fr7/P3+qN2dfQAABIBJREFUeNrdmPlfVFUYhy+LBIgigkKoWba4VCYpmGFmWCIKoWimpYaSkaQSFphGhVRuRRlRuFSYEBahljmhFqAi+xYEM8oyM89/0mdmmOGcOyvzY9+f3uU+nzvnvOe859xRFO8UF+8lOOGQ8cZ4r8ikBmhd4AUYWQwcm+zNOy9D3XPeDXSl/mCwl3Ok3O/RU+FLVo9qLMObftKAoMWek2v7wTt0Vj+6vbFRkTaN8xj9ib5HHCYmuiOjIdNhYlHv676u0aXwuMPE71A9xyWaCNEOE7N/haGce7xBFd+MPqixe/HCLKuOQq7Nmakq+GnaI9RoFg6VoH5ufapijxq7LfpXq+2xWL0OUAfKotsuNvP/jo4LmzEt1G+saFjKR+W3zTUx1H6fuzzIY1T3o0Gu6d0zHqH+J81Pd5TmbVm7YmXa9g/KdOZAtvu+8BdQmx/vNxoKWn2kHfglziU4rQo4b/+Mb+p1oMjFSbGoGf5McjyO9Gb4Y4YzctMA+kw/Z9nxhdDqpK+9Dd0uj4Mdwwyuc5R4Ba495HoOl3Vyd6F9OG6Qmknu5v/hbprsGsf0Frpmua96gp7fguSQzwWGn/WkNb8Bn8qRjbBTjgStyS8+d+LgqkAVexTDXNEPqOeyjxgIO6AbWb/9eaESOrmb71Q/Q1reCZ1AQ/nX5Y1A21J12xMCEzs4J2a36jEcn282Y4qMDG+SRtLAhVHvNVggT2NTrM17uo0h6Yr0Kjxpc6rQiOPspFlcrA+00zJB8EMGOGS174V3hNR7GGKl0T0DOaJ/hhar+TLEjCYCtXymKkgJ3eKhvBWsx81hbguVSZIHbtJTsFxwIw1kjJgXpdccoNFup3ewT/Q1thXVy24hXkrXWbMSFUVJsZg9FMkDqBxZH5AmxM9b+2C6Za1YVCaiedx02Nq/orPELNO2T7SYPRwW0V3WLj8PxGJk0+ajHmsvb4r+dvQWYy6IPTBRWqNmvQDLpE7DsMW4D1YIcb8milXoKep95B3QZTEmwQYx8S7IDTUNqQSKsp/6EauLvWIi5G8GfhiduLSyAWrkpvItFSNWNV/InVwPBTbvBAyqbl5XKRyxPqZFvrelgDFFUSKiw8xbzJioOl4sNTdpvTzFiqLoaQ0y3S6/VJQputF9YptgrA17qpH9cnLYvAvNqHKEBhV6VohUcF2N7rCh+9Ro6BDvi2fGYs/RDPHCGtxElQpt1Gg0Wv7RaDRtKjSk1bpvzNoGyTIqSkZzQDyy/K9xVTxYPywQJW3zKC0l6kru8eTIUXy+YfhBOVSBcY0naDbkq0JTb9I/zz2ZaqTS7ovlMS31Ue7IGC11EfbhF43cmu+aTNY6+Wk7DejWuSL3GNE+7ziV1IcxN9AZGFEMNx51lp1TB7c2O/xwCn6rF36e4vwnhZ8Grqyyu3YFbWkEfUGAy5lYdsl0LT2WLHxQh28uNd0OTs12u1w21JrW7Z3KT3Zte2lj+u7jF/Umv3qJJwvGP7H4jnyV7iiMUzxVQHx2yZU+I+i7Ln2e+YSvMlb5hHj9F4Jb/Qfbt6tIIlhQ6gAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 39px;
width: 29px;
}
</style>

View File

@@ -0,0 +1,66 @@
<template>
<div class="mod-total"><h5>实验室已为超过 4000
家客户提供卓越的安全服务</h5><h6>即刻行动与实验室安全专家一同开启智能安全之旅</h6><a href="javascript:;" class="EASE btn">申请试用</a></div>
</template>
<script>
export default {
name: "ModTotal"
}
</script>
<style lang="scss" scoped>
.mod-total {
background-image: url(@/assets/v3/num-bg-wave.png);
background-position: 50%;
background-repeat: no-repeat;
background-size: 100% 100%;
min-height: 270px;
padding: 67px 0;
text-align: center
}
.mod-total h5 {
font-size: 28px;
letter-spacing: 1.7px;
line-height: 40px;
margin-bottom: 9px
}
.mod-total h5,.mod-total h6 {
color: #1a1a1a;
font-style: normal;
font-weight: 400
}
.mod-total h6 {
font-size: 16px;
letter-spacing: 1px;
line-height: 22px;
margin-bottom: 29px
}
.mod-total .btn {
background: #4bad52;
border: 1px solid #4bad52;
border-radius: 6px;
color: #fff;
display: inline-block;
font-size: 14px;
font-style: normal;
font-weight: 400;
height: 34px;
letter-spacing: .5px;
line-height: 32px;
margin: 0 30px;
padding: 0 20px;
text-align: center
}
.mod-total .btn:hover {
background-color: #7aba4a;
border-color: #7aba4a;
color: #fff
}
</style>

View File

@@ -0,0 +1,50 @@
<template>
<div class="secondEdition">
<div class="product-content pg-evaluate">
<ModBanner />
<div class="component-box">
<Product2 />
</div>
<ModTotal />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import ModBanner from './ModBanner.vue';
import ModTabs from './ModTabs.vue';
import ModTotal from './ModTotal.vue';
import Product1 from '@/views/Jyh/Home/component/ComProject/product1.vue'
import Product2 from '@/views/Jyh/Home/component/ComProject/product2.vue'
import Product3 from '@/views/Jyh/Home/component/ComProject/product3.vue'
import Product4 from '@/views/Jyh/Home/component/ComProject/product4.vue'
const activeTab = ref<string | number>('');
// 解析URL参数的方法
const getUrlParam = (paramName: string): string | null => {
// 获取当前URL的查询参数
const searchParams = new URLSearchParams(window.location.search);
// 返回指定参数的值
return searchParams.get(paramName);
};
onMounted(() => {
// 获取url中tab参数的值
const tabParam = getUrlParam('tab');
if (tabParam) {
activeTab.value = /^\d+$/.test(tabParam) ? Number(tabParam) : tabParam;
} else {
activeTab.value = 0;
}
});
</script>
<style lang="scss" scoped>
.product-content {
background-color: #fafafa;
color: #333;
}
</style>

View File

@@ -0,0 +1,41 @@
<template>
<div class="pg-evaluate">
<ModBanner />
<ModTabs :defaultTab="activeTab" />
<ModTotal />
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import ModBanner from './ModBanner.vue';
import ModTabs from './ModTabs.vue';
import ModTotal from './ModTotal.vue';
const activeTab = ref<string | number>('');
// 解析URL参数的方法
const getUrlParam = (paramName: string): string | null => {
// 获取当前URL的查询参数
const searchParams = new URLSearchParams(window.location.search);
// 返回指定参数的值
return searchParams.get(paramName);
};
onMounted(() => {
// 获取url中tab参数的值
const tabParam = getUrlParam('tab');
if (tabParam) {
activeTab.value = /^\d+$/.test(tabParam) ? Number(tabParam) : tabParam;
} else {
activeTab.value = 0;
}
});
</script>
<style lang="scss" scoped>
.pg-evaluate {
background-color: #fafafa;
color: #333;
}
</style>

View File

@@ -0,0 +1,102 @@
<template>
<div class="mod-banner">
<div class="banner-container">
<div class="txt-content wow fadejinzhiInUp">
<h1 class="zh-title">软件供应链检测平台 (源链)</h1>
<p class="en-desc">
透视黑盒溯源无忧
</p>
<a href="javascript:void(0);" class="action-btn">
了解研究方向
</a>
</div>
</div>
</div>
</template>
<script setup>
// 使用 script setup 语法
</script>
<style scoped lang="scss">
.mod-banner {
/* 背景图替换为 image_b14311.jpg使用 cover 确保全屏覆盖 */
background: #001529 url('@/assets/v3/bj11.png') no-repeat center center;
background-size: cover;
height: 520px; /* 增加高度以匹配大屏视觉 */
position: relative;
display: flex;
align-items: center; /* 垂直居中内容 */
overflow: hidden;
/* 增加一个深色遮罩,确保文字更清晰(可选) */
&::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: linear-gradient(90deg, rgba(0, 21, 41, 0.4) 0%, transparent 100%);
z-index: 1;
}
}
.banner-container {
width: 100%;
max-width: 1400px;
margin: 0 auto;
padding: 0 40px;
position: relative;
z-index: 2; /* 位于遮罩层上方 */
}
.txt-content {
max-width: 800px;
color: #ffffff;
text-align: left;
}
.zh-title {
font-size: 48px; /* 增大字号 */
font-weight: 700;
line-height: 1.3;
letter-spacing: 2px;
margin-bottom: 24px;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.en-desc {
font-size: 18px;
color: rgba(255, 255, 255, 0.85);
line-height: 1.6;
margin-bottom: 40px;
font-weight: 300;
letter-spacing: 0.5px;
}
/* 红色操作按钮:完全还原 image_932d00.jpg 风格 */
.action-btn {
display: inline-block;
background-color: #C8161D;
color: #ffffff;
padding: 12px 32px;
font-size: 16px;
font-weight: 500;
text-decoration: none;
border-radius: 4px;
transition: all 0.3s ease;
border: 1px solid transparent;
&:hover {
background-color: #A01218;
box-shadow: 0 4px 15px rgba(200, 22, 29, 0.4);
transform: translateY(-2px);
}
}
/* 响应式适配 */
@media (max-width: 768px) {
.mod-banner { height: 400px; }
.zh-title { font-size: 32px; }
.en-desc { font-size: 14px; }
.banner-container { padding: 0 20px; }
}
</style>

View File

@@ -0,0 +1,502 @@
<template>
<div class="mod-tabs">
<ul class="tab-hd wow animated" style="visibility: visible">
<li v-for="(tab, index) in tabs" :key="index" :class="{ on: activeTab === index }" @click="setActiveTab(index)">
{{ tab.title }}
</li>
</ul>
<div class="tab-con con1 wow animated" v-show="activeTab === 0" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">平台服务</h4>
<div class="l-desc">提供用户友好的 Web 界面和 API支持项目管理扫描任务配置结果可视化和自定义报告</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>平台展示及用户交互</h6>
<p>
提供用户友好的 Web 界面和 API支持项目管理扫描任务配置结果可视化和自定义报告包括仪表盘图表和交互式元素帮助用户快速理解供应链风险
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>数据管理</h6>
<p>
负责内部和外部数据的采集存储清洗和更新包括漏洞数据组件信息许可证文本和恶意代码特征支持数据版本控制和一致性检查确保数据准确性与时效性
</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>高效管理</h6>
<p>通过直观的界面和强大的 API实现项目的高效管理和数据的准确维护提升整体工作效率</p>
</div>
</div>
</div>
</div>
</div>
<div class="tab-con con2 wow animated" v-show="activeTab === 1" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">成分分析</h4>
<div class="l-desc">
覆盖主流包管理器npmPyPIMaven等C/C++项目及二进制文件全面识别组件版本及潜在风险输出标准化 SBOM 报告
</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>全面成分识别</h6>
<p>
支持包管理器C/C++项目及二进制文件的成分分析通过依赖引擎代码相似度检测反编译与特征匹配等技术自动识别组件版本及潜在风险
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>特征检索与版本推断</h6>
<p>
基于 TF-IDF 特征检索技术通过特征签名和组件召回模型全面匹配从复杂依赖关系中精准定位版本来源输出标准化 SBOM 格式化报告
</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>深度依赖分析</h6>
<p>支持多层级依赖关系分析完整呈现软件供应链全貌帮助企业快速定位潜在安全隐患与合规风险</p>
</div>
</div>
</div>
</div>
</div>
<div class="tab-con con5 wow animated" v-show="activeTab === 2" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">安全检测</h4>
<div class="l-desc">综合多个数据源和引擎结果检测供应链中的安全漏洞并提供修复建议和优先级排序</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>供应链漏洞检测</h6>
<p>
综合多个数据源和引擎结果检测供应链中的安全漏洞并提供修复建议和优先级排序支持漏洞影响范围分析与风险评估
</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>恶意代码检测</h6>
<p>集成恶意代码扫描功能通过特征码和行为分析识别供应链中的恶意组件支持投毒攻击检测与异常行为分析</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico3"></i>
<div class="list-con">
<h6>精准漏洞检测</h6>
<p>在成分分析完成后自动匹配已知漏洞并评估风险等级可提供修复建议与优先级排序漏洞检出率提升 90% 以上</p>
</div>
</div>
<div class="list-item">
<i class="ICO ico4"></i>
<div class="list-con">
<h6>恶意代码防护</h6>
<p>在组件引入前自动检测恶意代码与异常行为可识别后门木马等安全威胁恶意组件检出率提升 85% 以上</p>
</div>
</div>
</div>
</div>
</div>
<div class="tab-con con6 wow animated" v-show="activeTab === 3" style="visibility: visible">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">许可证合规</h4>
<div class="l-desc">分析软件组件的许可证信息检查兼容性和合规性避免法律冲突</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item">
<i class="ICO ico1"></i>
<div class="list-con">
<h6>许可证兼容性检测</h6>
<p>分析软件组件的许可证信息检查兼容性和合规性避免法律冲突支持多种开源许可证识别与冲突检测</p>
</div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item">
<i class="ICO ico2"></i>
<div class="list-con">
<h6>合规性保障</h6>
<p>
在组件识别后自动检测许可证兼容性与合规性问题可避免法律风险与开源协议冲突合规检测覆盖率达 98% 以上
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({
defaultTab: {
type: Number,
required: false,
default: 0
}
});
const tabs = ref([{ title: '平台服务' }, { title: '成分分析' }, { title: '安全检测' }, { title: '许可证合规' }]);
const activeTab = ref(props.defaultTab);
const setActiveTab = (index) => {
activeTab.value = index;
};
watch(
() => props.defaultTab,
(newVal) => {
activeTab.value = newVal;
},
{ immediate: true } // 立即执行,确保初始值生效
);
</script>
<style lang="scss" scoped>
.pg-evaluate .mod-tabs {
margin: 0 auto;
max-width: 1360px;
}
.pg-evaluate .mod-tabs .tab-hd {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
padding: 40px 0 20px;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
}
.pg-evaluate .mod-tabs .tab-hd li {
cursor: pointer;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 40px;
margin: 0 30px;
position: relative;
text-align: left;
-webkit-transition: all 0.4s ease-out;
transition: all 0.4s ease-out;
}
.pg-evaluate .mod-tabs .tab-hd li:after {
background: #4bad52;
bottom: -5px;
content: '';
display: none;
height: 4px;
left: 0;
position: absolute;
right: 0;
}
.pg-evaluate .mod-tabs .tab-hd li.on,
.pg-evaluate .mod-tabs .tab-hd li:hover {
color: #4bad52;
}
.pg-evaluate .mod-tabs .tab-hd li.on:after {
display: block;
}
.pg-evaluate .mod-tabs .tab-hd.EN li {
font-size: 14px;
line-height: 1.5;
text-align: center;
}
.pg-evaluate .mod-tabs .tab-con {
background: #fff;
border-radius: 12px;
-webkit-box-shadow: 0 2px 26px 7px rgba(50, 50, 50, 0.06);
box-shadow: 0 2px 26px 7px #3232320f;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
margin-bottom: 60px;
}
.pg-evaluate .mod-tabs .tab-con .item-l {
position: relative;
-ms-flex-negative: 0;
flex-shrink: 0;
height: 584px;
width: 440px;
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt {
color: #fff;
left: 57px;
position: absolute;
right: 76px;
top: 169px;
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt .l-tit {
font-size: 28px;
font-style: normal;
font-weight: 400;
letter-spacing: 1px;
letter-spacing: 1.7px;
line-height: 40px;
text-align: left;
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt .l-desc {
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
margin: 26px 0 0;
text-align: justify;
}
.pg-evaluate .mod-tabs .tab-con .item-r {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
padding: 50px 0 0 83px;
text-align: justify;
}
.pg-evaluate .mod-tabs .tab-con .item-r .item-list {
padding-right: 78px;
width: 50%;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-tit {
font-size: 22px;
font-style: normal;
font-weight: 400;
line-height: 25px;
margin: 0 0 20px;
text-align: left;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item {
margin: 0 0 40px;
padding: 0 0 0 60px;
position: relative;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item:last-child {
margin-bottom: 0;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item .ICO {
background-size: 100% auto;
height: 30px;
left: 0;
position: absolute;
top: 0;
width: 30px;
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-con h6 {
color: #4bad52;
font-size: 18px;
font-style: normal;
font-weight: 400;
line-height: 25px;
margin: 0 0 10px;
text-align: left;
}
.pg-evaluate .mod-tabs .con1 .item-l {
background: url(@/assets/v3/bg1.B9IGVx_y.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA0CAMAAAANBM47AAAAAXNSR0IArs4c6QAAAtZQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYHBwcHBwcFhYWGxsbGxsbGhoaGhoaHx8fGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaHBwcGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGRkZGhoaGRkZGhoaGhoaGQes7QAAAPF0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKistLi8vMDEyMjQ1Njg5Ojs8Pj9AQUJDREVGSUpLTE1OT1BSU1RVVldZWltdXl9gYWJjZGZnaWprbG5vcHFyc3R2d3h5ent9fn+AgIGDhIWFhoeIiYuMjY6PkJKVlpeYmZucnZ6foKGjpKWlpqeoqaqrrK2trq+wsbKztba3uLu8vb6/wMLDxMXGx8jJysvMzc7P0NHS09TV1tjZ2tzd3t7f4OHi4uPk5ebn6Onq6uvs7e7v7/Dx8vP09fb3+Pn6+/v8/f3+/jZlGfIAAARzSURBVBgZtcGJf84FAMfx77PjGRs2c2QUm6VoylFyLMdmmKOkiGooUY4cqSgVy1JKIoq2pMOoxCK1ImfMNCamaZjYxR5b6/n8B/1+z+/Zs2fHq9dGvd/6v4XqxgRltNcNeZUNuhGdSiFWN+BL4LC/rttI2A4zdb0aZZEZsI2CMDVMt66yPA/DFFXGGrn1i1A9tCq9cqtM4SWkSloK0XIZSrbqodlVFsn0GVcjJTXLZZ+vTKlkqD5SOOkjKQ4WyjQepsjQuozn9C8e6ipLPAyS7EfIDpTJ9h35LSU9jTNcloGxqmUwRbfIxe8sc6Vn4QFZelSwQtJ60mQZ4Kxoq5rCS0mWJW5tB7Ur5GtVegtnL6n3+i5y8T1Ijl21vAYD5bEORxdVCj1Puk0eU2GcamuSwwFV6g9LVGUSJKhS8EV2qC4PU2KXxfcAvw+Ztymj4BqUF/361ctHyQuRWxRl3eQlwC63+L5yS4Rr1LA/1ibL8D5yC7JJjU+f7aNqWk8/gsWZs+uT5G+Pl2M5sSBc1YwrTpOCCykapCo9NjqAv3OgaGELuQRNPQd/ngWc38SoyqQKDkmKKeJKvNw6pzjBuXVsIvzcXh4hWyA5fqMD2NZHbtPh1O0y9L2Eo6tMHVaVQ/6CcI2EbYHy4rMaZqrVMyeB1DtlGgOZ4XLpcY5hknxnFEPhwmDJfoxjoarGvoOC1lLAtLNQviRQ0hx+CZNb816Suu+Bq0tbyTAFhshyc6Qsnct4Q4aguRchK1byiW4kb9NKIe02uXzPDrmMz4H82b4yrSTPR6abksG5xF/VhG6CSxNtcmnj5AmZXsIlRaYYiJYl/hSkR8jLHZnwQ4TchkO4DD3L+XHYoFQYLYNfMdPlFvoFnB8gjwGXYYm/Kk2m3EeGF7jQXPI7xIcyZZAoj2kOHI/ILawYElVlHnkyJbNVhuXslWkn76vKZHDeK7exDhxT5PEkDpsMr3CmkaR0Nsh0mCR5jLoM8+Qx4DxsDJHbKAiToT9siopcDhNl8ClgltwClsGVcfLScTeciJUlAibItBKXNJsMfSBOlu574XgvVWNPAj5oIZf9bJbJb74DnG83kSmJy3aZGi8ug4+DVdPQU1AyO0CGOdBbLkHRMSFyaVfCezL4jP0NLiaoDk13A9kJflKTXPY0VjW2zymNkDTyILAhTHXpVMofwNHHgpQAH/nI2yJYLP/70zHFqE5bKG4/OB0oeLfvStjcTB7+78C2u17PA44+eorD/qrDCJgnadQeDBlZcDrBV5YRhyF3H4bMBD+NgRmqrVEWmQEydV92AUvJT2sWvbhq52Usxav722TYTkEb1TIf4uVmfzDlDDXkp05sKktUGWtUU4cSUuWt44QVhy7+hcFZkLF2cpRNVZKgn2r4lKuRqs3e9e5A1dIsl72+qiYOFqr+JsAUefM/Qnag6s+2i/yW8jILRqshelawQlXaFrJVDbOcinvksQ5HFzVM6HnSbXK7D06+2VAH4XFZfA9wffJC5DJi//V6Sv+BfwBIbvfBNZtweQAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA6CAMAAADMWVqUAAAAAXNSR0IArs4c6QAAAkNQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVFBQUICAgHh4eHBwcGhoaGBgYFxcXFRUVHx8fHR0dHBwcGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYFxcXHBwcHBwcGxsbGRkZGRkZGBgYHBwcHBwcGxsbGhoaGhoaGRkZHR0dGRkZGBgYHBwcGxsbGxsbGxsbGhoaGRkZGRkZGRkZHBwcGxsbGhoaGhoaGhoaGRkZGRkZGRkZGBgYGxsbGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGxsbGhoaGhoaHR0dGhoaGhoaHBwcGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaHBwcGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaZrZiaQAAAMB0Uk5TAAECAwQFBgcICQoMDRAREhQVFhgZGhsdHh8gISIjJCUmJygpKywtLi8zNDU2Nzg6Oz09Pj9AQUJDRUZHSEpMTU9QUVJTVFRVVldYWVpaXF1eX2BhYmJjZGRlZ2lqa21vcHJzdXd3ent8fn+AgYKCg4WJi42Oj5GSlZiZm5yfoaSnqKmqq6yvsbK0tba3uLq7vsDBwsPGyMvN0dLT1djZ3N3e3+Di4+Tl5+jq6+zt7vDx8vLz9PX29vf4+fr7/P3+nMc1QAAAAuJJREFUSMfVlulfTFEYx2fmtk1laDGtWqzTKksJES0itEipLJGxJEsoJEsSIilZsoUWoqQyg8bcaX5/mnvvuTPN5864nUkv+L2Z5znnfufznPM8zzlH4RtHIbVCqjhQaMUcYgXyERb/AYtTyCrpX8PW5ola4xbWZdu7R3OK+YcvdIX5aUT5TY95abWexIpttsD6bDPdltgV+0UIZKrSLUzZix8nUoreg42gxXQl+uONQD5nBhtwiQ7b1kv2aZLhvWZ00GCqRh4ZHzHgp4C1opsGuwAMFYZypQDs49xoI2oosHgrHmsE6zks9ZlVQ5hcRIG1YjyEWDH9JAFZFAnwMKLeZgdfHQU6UmjSHQrsmvY85zN0jaMDklwMz4TFA/E0mEdguKNbBIRNe2ptgEtMrf8M9J1k7ANNGLU7UTdYWLs3OmNMGymju97iQAKLJjs1LMxZypywGuDeps33gSPET+yDyR7zG0zWppYNgA2TYv1oU3It0o7h5IzSY1ceTAFnk0SVcicq94nWiAYJxiVJ6N2trg/nMWGVt/BQgi0AMvnfbNfYNxU/edupA5ghtHNTTCf6dKvzKuuaTcBlnahyoIT7JtKAWunaqrmay87pBI4Sf8lLWBNskz1gz2ccGIQpWop53yHhtCjFgUgjvxLxPwZJB+Q5p1ulfwsMHvKyD5wCq7HZ2utjQFeq65oM8lc6eGnAKodognzoSjkAyJlFB8wDts8CYyzQOxzsgRrK++0dWm1mxDUzLJ3pVFgDzDqR+iQkgC2iwcJMeEVup9cw1W3Y/wFm7iTLBXLlj9fDwNeDi5WKRKCYL/fvuKhQFJB2kNNpPjSTYQTjHrzbwtdNFpA109WR3kNKbkJFsCe0F1VUflV1HVDIr3UCZ9y6TV/AfG5dxQB+xbiFLfsohGrdSRKwJ1lWaeVbfMUz46YBeLre/ReeOsT/bx+GO5bLavf//DDcu1JWFXP7xJ4N5rOUQt5S6jcJyGZLl4Al1gAAAABJRU5ErkJggg==);
height: 29px;
width: 27px;
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAMAAAAPzWOAAAAAAXNSR0IArs4c6QAAAuVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGxsbGhoaGhoaHBwcGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGxsbGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGxsbGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaMeyWdgAAAPZ0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLjAxMjM0Njc5Ojs8PkBBQkNFRkdJSktMTU5PUFFSU1RVVldYWVpbXF5fYGJjZGVnaGlqa2xtbm9wcnR1dnd4ent9fn+BgoOEh4iJio6PkZKTlJaXl5iZmpubnJ2en6ChoqOkpqeoqaqrrK2trq+xsrO0tbe4ubq7u7y9vb6+wMHCwsPExcbHx8jIycnKy8zNzs/R0tLT09TV1tfY2drb3Nzd3t/f4OHi4+Tl5efo6err7Ozt7u7v7/Dx8vLz9PX29/j4+fr7/P3+/H7PQAAABYhJREFUWMPtmGlYVGUUxw+IoCC4YEkpqAQpuKJSKi5pWmq2uJVLruReiguWCFJomUvu1qSpDZJWkKWm5lJauWQa5IaCQpg6EwjT4Mz8Pvdh7r0wwzCD2dOHns6n/32fO7/nveec95zzjogHC4+JkPs2Hfr/AKTHis8Whd8nZIYNKImTBhGfsjey0d9itLnL+XXFWH7DbkV7UwYF3ytkCsXBMhAHs+wYEXAvjDo7KPaWaFg7NO5z9sYNSdh4A6AwocYfVmvUZeC9IQcxBWmO9em+8BxgmOxTI0b4YaAAgBmO0XksCzgeXQPG8wY4GOefVMSFMVVC/OQxMPbzhPBKBtMEEREJdJVs3qNKsc50z/B+F860d5uxHS/BR37uGCsho56HtG/yPUxyA1kE6XU8nZ3oIiwdq2c8C3pHRquX5+Vwec7YNhVLYbmYe1XPiDRwNqjSc8TiS1q6XkqLsi82/gnrc24ccoSySj6N2GAFLJdvYci1ANb1USJS7zCMc+OQF2GsEoCElBFjS6D07YENRIdeAgcsMYJpgvjuhFluGHVzOeolIiIzLQCUzmtcybGN5hnh/Q8gxV2KvAbdRUSkq42ik3CjtVN0Wh4CWOvlhuGTx1a7SuZKQ3mLcj/nEPt+Afra7jbSD3qov0oX6QvNnCHxsM99RfmQ88pGZ2FN6LyfAudkG2bjpPty0qCcBEUG/wnABCdIn3IuNnV/8vqAWifa2oDSKfZ9hU7NJX9GS5HYOxS08lAC5nJTdftirLEdfO3eTjQDUJ7U/gbFnTzVkZ18rCauFibx2Q7WnK+zLWDC3NNjPbupuaQDqKUrEbLCRSQsA2yDPTJqw0uKHI1NOYWhZrK87fXuENZIj5AQeEqRCzmnqKlYwxXZzKTt1HVx1+l0ugzI1NntAkWKyuWk9tYZ8pXV9F8+UZTu6CmdTqfTRYvEUL1t1iDfuHmrm0iEXq/X74EDertdwqiofE5U2kmBsnqLq4raC/v0er2+rfrN0EfUrM9XJwMsYWpxLmOuIrNZoKhe0KKyYwJgmCJHYVVOWYtyMpQM3IJVKY++JuKVN4eAY2e4rXm/HQzUAoW+mYg02QJLlbXeEKuNDibHGO3S0lRyWKVmzy4wnT/9axnsUbtAKvneitzAEUfI6+SpMomb9dUylGyvlNYlKiPgmrYnyWNhlZbzqCLb2zTXiUTOzqdgbpT2PKviayJhgCOkoZnZql5DaWg1HbCJsSJ3xmNznsC2cFqVLczs93MJqZ2JpbX6cIw9ztn/AnQR7dCw2iUkjYoj1LUiKzTzL2Sb9rAKVvlVgdROg01ax1jPNd8qB3EmDO75gF377YZ9TZ0gTTLhkH+lIXV+1dNc7wZgS61rHx9XQ8m8wEqQgFlG2OQvIj61RMTrSwwhVSEB14GKLjm9HAqX9PUTHXrx7Z16DSwJXtI85YLN+vOCB0fBRBd1ZSS2cY9swFZfmwoATDmF/J5tAtjcWqS/yX76bxs47O0CksQpkTbwuLbS6c0rWs3IXxorIn3N3N0U/8p2G1hdDkuTKYuSBK172mtr50mJF7m6ID7WW0SksZG8KBGRrkbyXM5+zYsxn4fr/tXPbK9CjF0NhOEui+0zRgAOhVQLySJLbU7ZldLRwULHJw57By60rQ6SQ6oqt5LppvhPs2EYXcs15ATLVJmudUyXNqgUfnzCJWSdlunBJt5w28hijgPpHVxAJsIce9SWay6udvKaXgwcmdTCARI27iBA8sMikWthjceuGjzfAJC9csbTXTL4qkv/acvPAPzxA9w9e84G23xrcOsJHLnb5tzp9o0JCtpovw6m+dXwFhcydNm3Jcrv73y3YvhDIiLSempqysSwe7qVejVtl8mBdqFe///h8I9Doru1lX/F/gIjzb047a6x0QAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA2CAQAAAAxbjKfAAAAAXNSR0IArs4c6QAABsRJREFUeNrNWWlsFVUUHrayRgRt37vfmS6QlqIlIFSkkIKhwSJVUCRgWARSZTVGQRBBCCAoRUV2UIxFlIQlrLKLQhVFtEBAERQECRaBKmWrCKX1mntm5r3pvJnSVyhx7o/Ou9t377nfOee7U02rnKeKP9LXDNHJNbQ79aCOGCQ24R9ILv9iH00QsZUP+xxOm5D2ck282/CuSgPVa2O5AUTf02t4Eu38XTAcG3CNa4/o8ZUCm1yDchggV6SWbiEdH3HLX5UCjQ948g+TItxaaQCuq13fdoNTGsOuCNbENBAd/HGloCWkmHG797sXEqdQxwRpi4MmrfJpmFbFqBVLmGa3zvD4mlpVE7YVU2qgCTsEJaU4vcaARrSiGU2oCG9J9BMzsBFHUYAb7KWFOI1d2A+Jv/XaPH0i+/Dv1B9NRbrYyUsaZi5wAyT2hmfKpnoWzrt4aKCITWbPxZDiIulWBGPofLNtOCRKtOrlDH6iO/bYIE5iK2ZjjNgMiQs0UkzFClyFxHxz8kOQmBMcLjrzsvhk9Qzev16enXbliYzgJ3EC0YGW1yGRZ77/Boks8/0yJL1stxUDt+dFtFfv/vtvAipisd4EPUXz+W9X24R24F1BV8I3kFjpdKOYBvzeX73fxJfRCQUMVoDRcbWwVhnZcowQ4Dl8jtV48jfYOt3MlmjkQeKAuYiPIel42bAvoBgS1/G2Wqsvijk8sVQPO/AjfHZp6j2yHk4w9EqMwlxxERLFlGK4Hy5A0qwyoi4W8V7PUNtAzlFnE+cFnFwDZyFptXlEyQxtlatisDkik5eX4hkWsIMH7AuyD59CYr/DJjZgTcMktTNfI+NXZD0xFV/jEv2IbGpieQd+UCnEm1JLGHalFf443Sl3mVwWcKSfk192GVTtwezu63W2o9gcn9hpZCQAf+uygDWNZqk9I9Fj4qo4rLKTQcDQkJjBUXZPXK1SEBMhccU5xAnsi0IhJNZ57HcQb6in+24TcUlNFisc9dshsT2ktwNY0zCZjflo6MwxDfCnCj92O9pzag5z8MEQiEtOV3IH1mvjJCR+CZUC4PBD7ilR9OP1jnXWxwqu784/qjWurxMSRbL/YSyDxHk9gzpSCrXQExrX1zTxFPcd54BtxTGhmBOk80mK4AiTZ6Q2u5FoKE+2BftVFC6zFOJnzmBF9micFMFuVCDe4XnSnfsdzEOfNddYhzrSeGzlk6lI+SlIRTGVzdzfPIg9jtRHx43uOtFQmxy3SjF2IVu8ikzqpWeIDmhFTcRMSPxBup6gN9fbUEf0xmjMptXGYsX4QBRTwfYoWgaY3UJzeqqYgW020VKIL8QU9BZfQuIzFx8IIZdZ341HF/masZmtpCrpuD+LrkBigd3QS5UyCOTdXEz0t7Z0Ao4Ek3y5gFua8+zTqmOaobQ58qmtKYxCX12rb3VRbHY+glei4Yg41yHFi2EA3xuw2TrezHq+T/WgVWx0Bd/DMnQKm+I7QyWUfuLu9oo4XsCaphgiDpvg56J8gfpoTKciSJppGXqc0rvxNV2Dis5xuktYwMfUSeKMOjbnSKywZSilLijHI2nYFFO5gXMhsYjSUIK3XASGxA3zlDlvLHAH9rdmg7UMC/grzm8a9QwVsob0N6511bzow6buqDrqCWEBb4OkVR7z3ROgl8FCMxaHTtJVtUb6wwJeB0mbPfNyCSSLIV8j5u2b6ONa5rGpM0NbxBpWoG5jdjOr+3iUK2Ya0ZtXMB7fQuHLqp5w54ExzVAHij59fXXdCg1Urb6o0BahwuFptzF8CDvc5/PVVQKJRhqysxiShnqQ6wkDOCxybTQCpdsTX9NIkkbHc5A03kOkpYdK+ZsCK12+3MOdOBLqGUbHfZBY6gGcymS4Lyzgb70VtpGAzZyMueo+6GFqI9IkhwV80D2RataN47KpT6iXlzk1TY9nFnYKC/iUigseIVhZY0spHYk88UxpIc9psZYRQMIArsZkHeYqEZY5lCzLMFUuYAHaWd9ytAD1MKn8wCKGT/Exe12sEC/hgKXfotPtEfTpQINEPhZTL0uJcJLLDgOY6ag3N+wlUjEZe/kzhiqXMD0oDILn2Ua8xxdpq5zAUjGW9kCKnWEA9+Udj6RZ2M2fEU0lRzk0IKi2XBxcdMa8gOmDJQ876H0xBWPwPA0QPURn9VkJ+ZSGbugtBtEImiBmYC0OiRuOkVexgYbopJXv8ceJfmIhcvneVJFSjF+xFqOorftH1XI8UT6Rikxk0WocxCkUoMgFRn3hO4tj+FwspBH0OBIr5V8CSRF6QxHjT9Ifogf0+Eh/ZD2P6+f/8/kPaURwNOuwtMAAAAAASUVORK5CYII=);
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico5 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA2CAMAAAClUqpcAAAAAXNSR0IArs4c6QAAAfVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiHBwcGxsbFhYWFRUVGxsbGhoaFxcXFxcXHR0dHBwcGxsbGhoaGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGBgYGxsbGhoaGRkZGRkZHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGRkZGxsbGxsbGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoahQXVxQAAAKZ0Uk5TAAECAwQFBgcICQoLDA0ODxITFxgcHSEiIyUmJygqKywtLi8xMjQ1ODo8PUBDREVHSUpLTFBTVFVYXF1fYGFjZWZnaWxub3J1d3h9foCBiYqNjpGSlJeYmZqbnZ6foKKjpKWmqKqrrK2vsLG0tba3vL2+wMHDw8XGx8jMztLT1NXV1tfY2drc3t/h4uPk5eXm5ufo6err7fDx8fLz9PX29/j5+vz9/ud+XxgAAAIaSURBVHic7ZTpVxJRGIdHtJS0yELMNNtMaLPFLNuppKxIC8v2fU/KysJyKtvBpI3KqDAL5Pk7O3eGphEBGb54Ooffl+e+895nzl3mjCSly4yj3ba0zQxZMwiRFpNRbeYZIAq+amNeUwgCDTU+GGktzF6bdQXih8skyeQahr6F2Xobh+DVMnVceRui7qnZaNYuiLWb/5YFzjA8rp/Y2z5untULsbaSzJpNrOxA8so2DcHLpRk0U0sk9Vkop9VRms6r9sGvvUUpe+vF/axM2SpsHQFfjVYv7+zpPd+sfTnlZ4HjlvHegj4YdmnzLKdRcm+ONmNtEIKNSdoUdxTuVGr1tBfwuetSAH7M1R5ajgHnyvXekkcQdhb8e9AB7cXiciL06r7zFX74tEErS9pi4LXqXjQvTqc62gqbdY1Szyhcna0WxQ/EBc+v1eUQo/bE0E+3vlO7IwyhCkW0Yzgu9SCeGPW+VqlrNdU5HF844RCJclCgEfYLNsEewW2wRXA3rHPYzbpdv8Ot8De7BKZDs6ANGgTrYbHgaqgYe5F5MS/mxf9dXOXxRHjoEYlxV+AI3BI8BdcEL8IFwetw0uPUxH3G/lVenRh7/fF5v4j//TOFgbcK+geCKgffqAwOfB8jhqSsc2PyRFmWPxD/mXVifJNl2SxJRv//asqE2HPzqaHcv5wQnRNtKzmLJk3cWWQwdQkx51PNUazKKSbpDyfEdItE0oMXAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con2 .item-l {
background: url(@/assets/v3/bg2.ED2KfGoJ.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABACAMAAABvC9RJAAAAAXNSR0IArs4c6QAAAoVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYHh4eFxcXHR0dHBwcHBwcGxsbGhoaGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGRkZGRkZHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGhoaGhoaHBwcGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoawUAFEAAAANZ0Uk5TAAECAwQFBgcICQoLDA0ODxARExQVFhcYGRobHB0eHyAiIiMkJSYnKCorLC0uLzIzNDY3ODo7PD0/QEFCQ0RGR0hJSktMTk9RU1VWV1lbXF1fYGJjZWdpamtsbG1vcHFzdHV2d3h5ent8fX5/gIGCg4aHiImKi4yNjo+QkZKTlJWWl5iam5yen6Gio6WnqKmqrK2usLKztLW2t7m7vL2/wMHCw8TFyMnKzM3Oz9HT1NXX2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fL09fb3+Pn6+/z9/kKeQQUAAAOySURBVHjarZb5X1RVGIe/ICiorBoGGSSlIUtkYxZFSWakhUtESFIhZmbZHgUFhYGtKKHYRlKZlCmoLGVZsgYoiwhc7vP39MPMwMw4M1w+n56f5v2e89x75j0z9x7JBwk3aE4s3NpoTtRnB1sW7v54GAD6ylKtzF++twOg5bn9FwBOF0b7nx+S0zAF9FfcISkg47MRYLzu4Xk+BVvVFcD4etN8Z7I49wRAd0mSt/mxHw0AnC9e5p7f+vrfAH1PR7rnCzZ/awCXD6zxcrHAB2rGgbHD6wOnszsrBwGTiRBfS37K3sFLb6yUpEVF5wDaXniZMZ/fchukvdkJ0JQXqHRgqHqt9Ix/JVTzsmqvAYuVDsWhkgVFUtQHDiVdVhXl/H9KRP5rBTFzUh65AkxsmYOSdhWjfRIzw4pi1NTU1NR0MJCihIs0WFGcVEp6ka7ZlU0/2hnmkKRSK4qTVzGKEnOvUWVdib4IQE+CdUWxjSacTJUUv79y981WFGn5ulWSVDgJjOdYUuxkmYycGsNcY135ij9iFN9NQ0rKXotKHy9JKnVslj8l0eZ4YPxOlaTaWZW0n8H4ZqkklTH5fPorUG2z2Wy2QF/Kil4A2sMl3WjfoHOuTyMvyidcy719n8keSYr7zmCqNk7+lQHeklTPT/ZyadIS95Z4UQYpknSQM96b6E05QUesUi9TYV3ZAOMdBqPJ/pRkWOuS5RnA0EYfhp6A+VoG2a7hLfBFpC9DuxmSgqbY6RrOh+0+DVXQIamZWutKM4cllYPhil1ZYXgFCiRl4cl2SYn4IFFSYD9n891YZVfK8z3Z0ctvkqR9mHddt+hEyLwu3AqPSZIi/qXJkhL6Dy2O12Uh5HmMRr0H74d5hO/Cg46Pwc2MrHQbTBoAOOv2u1emyZGZGWOcWegyGPQXk+1/wveuRmwn3S5/hQKon3mp6yHIlnbD6pls0Wmm1rteohrKZ6piBiVFw4aZGx+DXW7rDDoO70xXT2LES5mwbnq8Dg56dCP8VyhxFktGacvd2cMl52KD66AuyLPpEafgU2e6wwQYd+5M+HE46uUIGNkEDc6tePQXzB/ucRRxLfCl10NjyFFone7RwukOZvRAWYC8ElgOI1s8woA9Bsaz8sm2UTiwwDWJOga998sPyW1w3uUct7ETTsbJL2G1YLztuFHU52CWBmk2cvqh9V5J2twFF+6bVZAUcwQ4dNPqRjA/XGTFkPR4F1w1oDXDoiAprGQChndZP/NL0m21lTFzEvzyH16BnDy4upTwAAAAAElFTkSuQmCC);
background-size: 100% 100%;
height: 32px;
width: 25px;
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA2CAMAAAChp3phAAAAAXNSR0IArs4c6QAAAfVQTFRFAAAAAAAAAAAAAAAAAAAAKysrJCQkHBwcGhoaFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGBgYHR0dHBwcGxsbGRkZGRkZFxcXHBwcHBwcGxsbGhoaGBgYFxcXHBwcGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaHR0dGRkZHBwcHBwcGxsbGxsbGxsbGRkZGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGRkZGxsbGRkZGxsbGxsbGxsbGhoaGhoaGxsbGRkZGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGBgYGhoaGhoaGxsbGRkZGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaY4gg2QAAAKZ0Uk5TAAECAwQGBwkKDA0ODxAREhMVGhscHh8hJCUmKCssLTAxMzQ1Njg6PT4/QEFCQ0ZMUVRWV1hZWltdXl9hZGVoaWprbG9wcnR3eHp6e3x9gIKDhIWGiImMj5CRkpOUlZaXl5ucn6KjqKmqq6yvsLS2uLm6u7y9v8DCw8XHyMnMzc/Q0tLT1NXW19jb3N3e3+Dh4uPk5ufo6+zt7vP19vj5+fr6+/z9/hUAYDEAAAJLSURBVHja7ZT5U9NAGIa3UhU1guJ9At7We0VRxKNFKd7iiUXRKpcKKFYBUUSJWm9AraC21pLk/TudbLYtaZPSrY4zjj6/9Psm3zOz+35JCbGncNkckhOregG8KcvB9CpgNOeJmi4NH6tcex4DXkHT8QpvCwkhznZE5oqpxQBlxTxgn93Q4m4rngM83VEMW05sJaQUNkw31JDNYzdTO5rS6EmogwimP27SuFqafo0dCfUZLlpcM/b71WZV1QDVANBU9V22amtaJkPZq8HDfr97P6Pef7pDRL1r6mv/AfWy0peVOn+nx+OhRePVq+g3qSv3ejzuzVNT1eoYW2C40lbNbzd2/Hq5WXVp0KLRKDBWbKfWAUo0GgNeOLm6AlgvSX58XkAIWRrGWUm6xdVtF6rZ7xl8kCTpE9qmEeI4CKyVpB+6upG/awE2JRuNOWF+UlTozezk9xpXjemnmdTdejMrqa4Gaih9YFzLMYTblPamqJcwQun27zimNyXAKUqVZExVwB2fz9cNlOsxfX0ynhCL6T6+Nfp8DYOIFJgSntLPz9E1ye6jKwnz5lDKXvNPdMmyfM87mRBS2ZBKrX7URdf6ZHng5pYJ/mAm4r/6R9QNwGhIGNPrL4qbkDXAlePCKH/rctbNEGaMq7km/AtqQZkV54EjrNgVQZvlxEK7GK5jmFc3EBQKMG8E9bwsB5aIqC5gEy9nxlAjotbhizNed+KhiPoejYn6ALSibJyKgM4jYCAQpwd4yYpzmdWTGTbZmVmlLQatLUni9dGU2Z8vQHe3JjoBkgAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAMAAABEH1h2AAAAAXNSR0IArs4c6QAAAk9QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGRkZGRkZICAgGBgYFxcXFxcXHBwcGxsbGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaHBwcGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGRkZGxsbGRkZGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGRkZGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGxsbGhoaGRkZGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoa7LJWmwAAAMR0Uk5TAAECAwQFBgcICQoLDA0OEhMUFRYXGBkaGxweHyAgISIlJigqKywtLjAxMjM0NTc4OTo8Pj9AQ0RKS01PUVNUVVdYWVpbXF1fYGFiY2RlZmhqa2xvcHFydHV2d3h6e3x+goOEhYaGh4iJiouMjo+TlZaZm5udo6SlpqeprKyur7Gys7e4ubu8vr/BwsLDxMbHyMvMzc/P0NHT1NXW2Nnc3N3e3+Hh4uPk5ebo6err7O3u7/Dw8fLz9PX29/f4+fr6+/z9/h/1AioAAAL8SURBVHja7Zb3UxNREMcXAqggIE0pig0VPRuggAURRUBARUVFBaUJKCLFw4Y99oqosYEUEQtEUBCICSYk3z/MyeUSknjx7jKOozN+f3l7b9/nbm/fvp1HJKhpDMMwUZzpF8swzHySpWyY1bacJtcbzdZzd3D0BR23GDJxLvgcIHMAV1fID96i9zgGpJK76sF5IMVdet6Y+bdPeshAvOPiAnlzkdaStlqrb0lcpBgeCqyzWIqnGNo5c/VdIJH3daFCOr4Q2ExEvl1g3cEzMT7FPNZB5Q6ej1FuLEP3H8N99NhmxU1fvhm+D49acc9h5IvuXAteBnPGEVjVb/EUAfGi+Fpg6JZSqXykA3RqGPoAfLimVCpbgRsSKuiAnv/oeOWkIqhpVYc1iofhgoBnnoNKLrWoVBro483xqon82oDXqic32V0OyxbbChVCOkg8TtMHhPwFdrjR4CgTBhQ2nPIAJ7/BEc9y+p9elNMEHgJsclow+Cvc24RsLo26d9zzV+yTjockbnD6nBqNyQsUkvA5d7jMbLVfPGKeGdwuAZ/Bp3mvPT5umSsUx89Bmzc7/A0a7OgYICs8vhljUaL4J5QRUS36gyfwE9D5E4UZkSGGBwHriWipCU22pQkmNJrHbpSK4SH8eT8DVHhbpla+xegs5/Mugge8AlRJXkRR1UaYUkkmTmEPAGg6zOdVk0ZS8Ylm5bO7l9stY9NckowHsGys1VYk5FceSg+yIVVsirSaF9dfjEdXOStDDp7wU2u6IAdf1uGsun8ndf9x6Xh9ukxpHHA39Ltw8nVHfCNlDhcLa4+lz3isceEvzlUQBWpdhqc7uz9tx9F21/EXEoUBIz2CGrfdrATdH8F1zntoEd7aqPLHn6Fvv5jsKejeAjBElAPEuKwOf4VL13W84FqzBjUkX9FG/sbBQhspHz8NTShnRGhwP0AunWtCCW8WAc+SZMGhNUDnVOtTKYCOy6xUnWrWAq0RE2/L6JRZ8PqGYPtovDZWX2mWqttsgfWS8wOVDhPNZXeUuAAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con3 .item-l {
background: url(@/assets/v3/bg3.DKgYKiLO.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA4CAMAAACbrRsRAAAAAXNSR0IArs4c6QAAAmRQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVJycnFBQUEhISIiIiICAgHh4eGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcGhoaGhoaGRkZGBgYGBgYHR0dFxcXHBwcHBwcGxsbGhoaGhoaGRkZHBwcGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZHBwcGxsbGxsbGhoaGhoaGhoaHBwcGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGxsbGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaM9yYTAAAAMt0Uk5TAAECAwQFBgcICQoMDQ0ODxARFRYXGBkaGxwdHh8gISIjJScoKSorLCwtLi8xMjM3Ojs9Pj9AQkNERUdISktMTU5PUFJUVVhZXF1eX2BhY2VmZ2lqa2xubm9xcnR1d3h6e3x9fn+Bg4WGh4iJiouMjY2Oj5CRkpOUlZeYmZqam5ydn6Olpqmqq62ys7S4ubq7vr6/wcLDx8fIycrLy8zN0dLT1NXW19jZ2tvc3d7f3+Dh4+Tl5ujp6uvr7e7v8PHy9fb39/j5+vv8/f7mLvP7AAADPklEQVR42r3W+V8McRgH8E8bSki6LJahcrOOxaZylVhX7jORW+5jkVtCypkz951io4RUrpBVn3/K6/vdZq9se3jx+WWe3X29Z78z8zwzgzC9DzGYTJ3RKnr6ltLIgCkfRf2BmrwueImwT6JbUz28JYXcSj6LCYz2yCJLuwdGkUmWaQOjWE6+6BkYxVLyZa/AKBaRFTq/qXGQyMZmvtP6Sx1Z9L9oxEg108lkv6gj8eTo1jRu24WC5aGimmrOAjDYbO4kV5t388xcTVs0rUEcyDMxW7l8AGAKKYZlmzzAS+0808h6fjpbTJ4CcIAPAUwmo4GxZHleCbnSM00nBwFb+DUY2K/SGGA3q8KA87zumWazBkASqRP0EYBJkhaxCMA6vvNM1/A9gPFkH2CfSmMFLbTv2CMVPyaSiqCPAUxsoUWS1npbsFFSs0q7A4WSrm6LLuNXjXpBzHwCYIKk+bwGcfosnuloclNUXAmrAexVqVbMd1OGdnwtCzzToGJbc8+X9Kmt57VAeKX8+ufQNrop+hzJxlWi3KNSMd8Jd0hWJ7fZw1BSjRGy6KaLBdBR1ytYfuybMqSlDZF8i7xrCGRyNsjFN6/wnxqaWbZjTyWtw/ym+awMByJrmOtOgxSnp5k8XLeUcpfYnGCJKw3Z8oUsT5G1JrOOfDNDlAcbrtppDbPFZjvLXOlJ23VNEnWOrc6Qf3HLGx1OFiSmv5Z9FPuLxUmTHrJeAxxXaYSi1HGnoijKUb5SlHAHXcjvIYCJzV3lkGuBMWR/QW/b6BrXJ/ViB13rNK+zyfZAgmycY96pbdQTVdpB9pxB0Dsq/ThvQbrRaDROW5BhdabZTqM+S9I4SY84aI3jMjW60lr7qM8kQyQdI+g9Z6rbvDnKnZrYFCsG3hoqb6B6II3sDRx2paPIAe5U18jS9XsbeAVAl3pWbdxaz3IIet8bxQp54j7Hi3pak6h/iOk65APFhPNvn+e1vCuMLKyynO4v71kXc52pvqKiX2vqJZ7P8L+lX+bY80vQKWSqj9S9EU2k6V9TTXuRgeQ4WWiAEeQI/94lDIG/hjjTaovlm9X6weJLqlypn7FTbY7I5Rs38nN8TG/8dX4D3Yb6f19FH58AAAAASUVORK5CYII=);
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABACAMAAABxwuT6AAAAAXNSR0IArs4c6QAAAtxQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaAklNYAAAAPN0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8hIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCREVGR0hJSktMTU5PUFFSU1RVVldYWltdXl9gYWJjZGVoaWprbG1ub3BxcnN0dXZ3eXp7fH1+f4CBgoOEhYaHiImLjI6Pj5CRkpOUlZaYmZqbnJ2en6Gio6SlpqeoqaqrrK2ur7Cxs7S1tre4ubq7vL2+wMHCw8TFxsfHyMnKysvMzc7Q0dLT1NXW19na29zd3t/g4eLi4+Tl5ufo6err7O3v8PHy8/T19vf4+fr7/P3+kWOxigAABYhJREFUeAGlwYtf1fUBx+HP4QAKqMecXGTesaHmLR2zxgrUHLZNl6tBbmOpqRW2spWmxiJza5QjlZxpXrAyZlhu4hR0W5tMWYkrFNwmigKFcj0czvsf2Ov7+3HwIAeh7XnUM8fQ0ZMnjnTpS7t96e7TjVjqTmxOjVafjVrzKV15i5a41BfDtngAzrzx9MI5M7/57bS1ey4DfL6qv3ozMLMR2oueitMNjpkbzgL//kmQbumhq+DeFKNuph4E/jFJPXNkgjcvTgEln4Tr89WTiP1QnqCeOBY14H1WgcWWQuEQ3cKUC7A7WAGElUBOsDpNWZ61/dCBLWvTh6tTVDHkKIC9sEo+M7Ir6VSyZrg6hObDo+pmNbyhDuPeBnBXnnj3QMklL9D88mDZIkppS9ZNvuulKFSW4I1tULd9Qbgs0YsPtELdItlGXaV2pLroV0FlpCy3HYaG9QPkZ9ROL2wMkiWxld3q4kmYI8vYzyA/WjeZdhYK+suShXe6/Ljq+L0srrPwokPduD6AXbK4ajksPxvwTpMR9AEsUSDOHfBzWTJgrjq5mnhLlrWwUT4RU+fNnuBUh9DjeJNlhJ7nuDotgUkyYhv5MEi2eQUtALXbJ8gWfZG/O2Q8DuPkc5RzsuTiHiPLsMP4eDaFyrII0mSMhPXqMMjDr2SM9fCaLHdchHPPzRw+Zk52PRwbJCPoNOccMk7xV3X4Dtwj4xnckTKiLtD+bIgsQ/Pg/SAZCyBBxlo8LtleotYp4wSHZHkX74Pq9Bo8JqPfNbJkTIW5suVzWEaMl2UyZkKWbnAWcXWAjH2ckeFs5QnZzpIjYx6MlpHL1Qj5SYA0GT+FcBllvC7bF6ySsZj2YBmXyVEXZeyRMQviZBwkXzYPS2U8T7UMF6TKuPNkwW0yNnNKRjx8S0YehbKEwSIZr3Naxu1wr4z3ktY9LmMdl2QMhgdlbOMvsjjhERkvUy4jFu6Xsbqg9B4Zv+RTGSMgRcZOjsnWRIaMDJpkONt4SpakibK8zxEZCTBFRj4FslXxCxkPwWAZRyiWv4HNPC9jAUTKOM4u2Y7ytowZcJ+M5ZAkP+tgoowsrjlk1LBetq18IiOomhwZYf+hfIg6faOFd2QpI0/GUEiTbRner8rI5aJDxkIoiVWHxBo+HyNjHKTJeBjGyxYPy2TcDwtleQFqnhgkSSNeddN2nyybcA+WsY/L8qnikAxnGf8MlmWlB1qL9+4vBWqTZYlzs0VGv2vsks8ruF0yvgfLZZteiM2TGyvbOzQOk5EC8+UzDZbKUkTz19Uh/pm3jny4bXG0OqyATFn2UhOiTse5FC4j/guqYhXQ7DZOhcu408uLuiERVsuS0k7ZWAWQUk/1CFkOU+uSn3zqI2VZCXWz1M3P2mm6S5a5kCF/4z1sky29Fc/mGHUx7Q9QNUOWsI85H6outsCjst19BRqy7pCPM2mXFz4aJlsepKqriNO0JcsW9Rs3UJ694oG77k198s1aoG5lqGxrIFc3G3mFurHqELenBT91L7nU4ftejoWom8RWKifLZ8APdla0Alw/80qSUz4/bKIiUgGke7m+QP6+MulrA+XHkQn1kxXQAw14n1PPIvZD+Xj1YEol/DFBgTlSz0HhEPUoqgjYF6cAZpUAOcG6hZAVV8C9Y364uoh6pBAoTVEvBr7QADTlp8eHyDJg+tPF7cCFHwepdzF/wtJWUVr8508uYcvpr74Y3czftpZzQ/vJX9fwcbD64nc0j5FiZy/fkPPmb1/NTL/bJT0MGeqDebBe3RylPka96vcZFWHqZlIbO9Sr1TBfAWRDonoxqpGDCmRQNaVO3dp+WuIU0I/gMd1keLa/9+Cj7B5U0bI1288GaTr/q2vShLIuLv6rrEfV58v8ndT/5b+wy5acLtE3wwAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 32px;
width: 30px;
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA8CAMAAAAAPFkHAAAAAXNSR0IArs4c6QAAAk9QTFRFAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGhoaGhoaGBgYGBgYHBwcGxsbGxsbGhoaGhoaGRkZHR0dGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGhoaGhoaFxcXGhoaGhoaGRkZGRkZHBwcGRkZGxsbGBgYGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGRkZGxsbGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGxsbGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoa4vkYlwAAAMR0Uk5TAAECBAUGBwgJCgsNDg8QERITFBUWFxgbHB0eHyAhIiMkJScoKisuLzAxMjM0NDU3ODk6Ozw9Pj9AQkNFRkhJSk1OTk9QUVJTU1VVVldZW1xeX2BhYmNkZ2hpbG1vcHFydXl6e3t+f4CBhoePkJGSlZaWmZucnZ6goqOkpaipqqutrq+wsbK1t7i7vL+/wMHCxMXGycrLzM7P0dPW19na29zd3t/g4eLj5Ofo6uvs7e7u7/Dx8vLz9PX29/j5+fr7+/z9/hwDx/gAAAMQSURBVHja1db5X4xBAMfx2drY3EcRKmfESrnlyH0kFLlyE7mv3Lco5IxCtI4kZMtNrsq2nz/Ma55ntYfnyuvl9eL7y8wz+7x3duaZnWdEpDM40cJynASnLvWPKU2rW0EzA37vLDccjLBGh4Ez8LpPOdy0NuBQKiJPw3OnFToTZoY05Xrx3DlvkmNCZEJm6NdN/45pXmlTsbm+9IJhHuhSEW4yzI2SLtKkZvlvadH2VucKHxX6R/mq0NqqVuc1X/65Ge6cMClrwbh+jlZSW/KOCt90eK6vi7dObRmPgmezeJhFOqYM+HAqa3Rc2w4DU9de9YD3RC8rdK0H7s8O2J66rK8D91hTGnEIarLDgvvouKORhuUm1HYGbvf8fVom1MEKY7oVTms+jngXjeON6Dwv1+zaiyDWTV2sPm33kiddhU7GNlKgT/NglNBNHozUo1GfOKsvRbsaSvToBpoGKBX70Mnd/aTv1L5qZSUM0aElFCvl8vdAYQ+1McUFuFJkNfILW7RpVDOrZLlJXbhP2yvSo/4JFFvIXW26CORK7d9A6cjYTc3skY0u3Okx6W5c8mIpRGnSXGplkcM3+Y48QKUcJ6QLIdJBjjcRRmjSvdyTxS4q1B68diHSIEYIEQNpQojolrdiCC3gYkCvB3ks1x9k+HsNayJHkxZzThb9GigdFZfrZbdvrBm9MnxjFfWs0+m1zNespEqZ4eQm9WySLC86qr/hF/W/JPOpUSvL3gHnfeeJZLlJuRQpEloWqkJnwAz1cg3eNmotPHFSN/9qik/7ta+lQe8A6mw5hoyGKcIwO3kbrkltzzhqKG0vOCyC6ZIUNcf57DCi82GN79b9PhqQHCNaGXKCCaZve+jLaaGHH8dgf+b+4JSudFRRPdx/76CQj7dDto4MOwmTDUbjeEhzlvbsHoYjhvMfV03zYo32hBtQZBfGtgbyZCW/WnnI5dXKzpEPl9sIk8yBiUL5M1ySRS25Qt0fOplJkQKDA6hbpdlg/8t0YVJSUtIVbsniDftksc0i1c5fpZFDdWIzpdbzE3Z4x2LkwqSqAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAAA+CAMAAAChgZ0aAAAAAXNSR0IArs4c6QAAAspQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGBgYGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaty+CnQAAAO10Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGRobHB0eHyAhIiMkJSYnKCkqKy0uLzAxMjM0NTY3OTs8PT4/QEFDREZHSElKS0xOUFFSU1RVVldYWVpbXF1eX2FiY2RlZmdoaWprbG1ub3BxcnN0dXh5e3x9fn+AgYKEhYaHiImKi4yNjo+QkZKTlJWXmJmam5ydnZ6foKGio6SmqKmqq6ytr7CxsrO0t7i7vL2+v8DBwsPExcbHyMrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4ePk5ebn6Onp6urr6+zt7u/w8fLz9PX29/j5+vr7/P3+lBpGjgAABH1JREFUGBmtwYl/zgUAx/Hv5jHP2OaYNYtoLETMNdcsQqzl6iBnUWIlcpvI0ZAZJaQtR6FSbQyJkjRjWHOFlmvGhrU9z+d/6Pk91zbz8uzZer9VLebWEX6qqUYbCuH26kDVSPcL2J3tqBoIPEvpiucHr7GQZVb1LcfaTzZxME/eatwivFXrtu3ad4j8h82y20mWvLWdMhNkN41iH3lpC2WmyW4+d+StVI7ERPfq0b1bl2wO+MrG9DsZ8lYK6XKYAMtMUp1kGCpvbWavnL6Dk8nrcmCbvLaJfXIK3ordxiB5bQMH5Bb79ckT2waqGtZzUP+DdRzS/yCZX1RVjfuPm/vB1BGRqiyJI6qSwMlppTicX9NND1jNUVWBaeIVbCwXcwoxbG+jClZyTJ41+xXYOzXCJCloUPJVKJ6o8hLJlEfd/oKMKLkFzCmAZJPKLCdLnjxzh9K3VEHz32CtyizlpDwIzuFOPz2g7k6Il9uHnJYHu7DGqZK6h7F0kMsicvRo0ZCghwi7wbXdP6TtyThw8OfDl/j3j6yTp878efbchUt5127kF9wpul+SO8VHLj9x3qyHicezb0PkEAnj5dCwX2xzlfG7zLnUlC8+3/jZJ2uTVq9a8dGyJYsXLpg/d/bMGdPfezd+yuQ398HFGNnNpshfhoB12KS3lNtCbpv1KLUSLFjm1ZLNIXbJUOcodgXhcukCA/RofS9Bepiku8TLsAASnwyZVEiG3IqYKg9Cd8PpYNWHYTKcJ0U2E6GFXLJZKk9837fwjlpDb9mEQKxsGsFQuaSTIo/a5DNfERAjmyArL8umKfSXy0HWy61tVF05Ne7zlFxibnK/o/xhpAzH2V9L0hIIlUsuCXJquQ+ujpLBZ9Zd+KaZ7EYXc2+EpOvMkmEs7B8+aBNskIv5PpPl0Pc6hjV+UtBODPmvSvJJgGu9ZPM9+2WXgl1mA7kMhC6ym1pKcXyf43CwacRx+LHT7GLYGmxOhexWMkzC2kR2Y05ZubjELLdPudyufYfIzl1T4UpPKWAr3C6CVSapUyZcPAR7GskuzMoCOQWFqZzQe7hZmskwrQTujZXBvNwKbPaT05cUPa6HWUWZYjm0mTMzXE4xublvyy38Pjt8VFl0CTt79ege1bVzxwWUyqNFsEiVPJFHXhM5vIFVHpl2w1wfVfT0GUqi5TQe5FmDLPiqocqLu4X1dbmMBV951jgNbs6oJ5eoNCgaJrfRYFIVmBItULhjQkzbpl1fWHwKyO6qMq+Bn6qk/S7KuTq5tsoZCf6qog5zDlsx3EoZUk8VvAL1VHUBrXoOiAxRJS9BoGpuONRXzQ2BhnILGTzqWbOqIQ6C5VR3tQXIHyfvxUKIHB7LxmGLvDYYQuWwFZLaB/XOgAny1iAIk10MzJGN714K/OWlgZC0dHniyo+TjpJfW4Ye0E9e6k+Z/bKrB2PkpV65OaezszKPHT3yN+dk1wZeVLWNhIEyJGJtomrzP0HeAMl3uoVk1UC3EshJvw65gaqJ7icw7ApVzZhHr9+24jlV8B9T0a94882ZyAAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con4 .item-l {
background: url(@/assets/v3/bg4.C7YndXK7.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA4CAMAAACBkfufAAAAAXNSR0IArs4c6QAAAjpQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWHx8fHR0dHBwcGxsbGRkZFxcXFxcXHR0dHBwcGxsbGhoaGhoaGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa67X1NQAAAL10Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcZGhscHyEiIyUmJygqLS4vMDEyMzQ1Nzg5Ojs8Pj9AQkNFRkdJSktMTU5PUFFSU1RVVldYXF1eX2JmZ2hrbG1ub3JzdXZ3eHp7fX5/gIKDhIaHiImKj5CRkpWWl5iam5yen6CipKWmqausra+ys7W5u72/wsPExcfJyszNzs/R1NfZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dy8/T19vf4+fr7/P3+eSKkTgAAAttJREFUeNrtlvlfTGEUxs9UktJiC61SokmkhEoIKVsSGWtCkZKKbJOiGU1IWZPQokWhzTRpaJ7/zae578x9Z+beWfj4zfPTuc8935n33nPueV/yV4qKIaZ4zlQwL5LzgkgJUa0WbJwzfZn3kPO2S2MT7mAHhX9u5rFqwbvIY+2Cl8kwpeCr+UWeEYJ8HtMJQdh/TA5rVpvVzRdAChsS8ppky92kyxWCbTqdj2S5Y1pF1RAvL2+byzIucQNJyjvt2ouBn7+GXtZm+JK7mlc0Iq5nvHiBe1TaRwDf7pcWFly69xnA4C53qEIj8GQLey5FshYwFbumzgNfdvBGah9Q7Yraa0JHuK217Blw1DkVoUfPEntzYQeMCU6xBhjiHN3wUTy2s0JPWZVDCSZckfo1FZBBmWJmBN9cOqrFaLAU5tuDJlLbzZKpSUEaxQDqpBdfBr1fHUvT2344ROvmDEklzq2SKcwe2wcsksYURhyTxU5gmkVRD5gsL74Pl2WxUgywaL3l4S0N8wo3ZTEVDCxa1cKUxIxesTIOWC4QItMHMzguiyUC6dJUPJBljw33C6r3GkaNNHYBBv8qljZkN4J0dAsjAVKUTxe0tl2yosyqfNoIlEhhBUA25YiZ0Xb3NZiMdqSWD6ONnGn1D3Q6NLPfW8wmO8XoMNAeamsFvwHOkgtVAJ9SeGNtJ4B6L1fcuVlAY50BsWoT8B644QqjnXPDsbfm5IE8VdU7AGOH5rcAlS65gJJJsUTTlSFEAW0ylbGV/+67XXrA8KFhf5DwWl4DKj4j6pGoChs2kG/rpZ0wHSGiInOiUnp/u9PI5v7mxka2v63sxmwe0W1xBD3VmtXvfDeNHIQxi4q02haP9m6K/YrpNI+3fKKECXxP8hyjlCmMrfEQK39+ndJnUP4n55I9V//6OJMdZZaGL0CF4J3msVbB2yR7nPlnh97AraKsAzOVMy0n8zjOW+z6a5DUb7XEj2EfmeDdAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAA2CAMAAACycDqVAAAAAXNSR0IArs4c6QAAAg1QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVFBQUEhISICAgHh4eHBwcGxsbGhoaGBgYFxcXFRUVHR0dHBwcGxsbGhoaGRkZGBgYFxcXHR0dHBwcHBwcGxsbGRkZGBgYHBwcGRkZGBgYHBwcGxsbGhoaGRkZGBgYHBwcGxsbGRkZGRkZGRkZHBwcGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaHBwcGhoaGhoaGRkZGxsbGhoaGhoaGRkZGxsbGxsbGRkZGxsbGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaino4mQAAAK50Uk5TAAECAwQFBgcICQoMDQ4QERITFBUWGBobHB0fICEjJCUmKSstMzU3OTs8P0BCRkdISk5PUlVWV1laW1xfYGJmbG5vcXV2eHt8fH2AgYKEhIaIiYyNjpCSk5SWl5mZmpucnp+goaKkp6iqq66vs7S1tra3uLq7vL2+v8HDxcbJzM3Oz9DR0tTV19jZ29zd3uDi4+Xm5ufp6uvr7O7v8fLz8/T09fb3+Pn5+vv7/P3+pK9UKQAAAoNJREFUeNrt1utXTFEYx/HfyIyaSqSbRlNpIsklhCiUa8n9FlEk1xAq1yKXhESpUJIQRTPfv9GLuVTUzJlWyyvPq+esZ33OPnufvZ+1ZXUEFybJQXBhmSrZYPirir3EIaOR54+E2mcGSdZ+4e3ioMhGJ9C/ZHKyK9cX67xiiJ8eEzlazT05wSKPeET7Y64OuE1qgP8y4hH2Rioy3WZCkmH1RZhkG6bdrkYqlDlAR6hMo1Xrpkmmn/vaLjVSIWV2LTa4YmHyEIUF8yvdRNNFLDabxTAJt9m8aezqgw03/JJXdbtXzPY+hOScawMYCPFDkgFczaeyJEkVAHRXb7P6IXHFtX0AFEiKdUFbQVLgucxI2/MBeiQlAvQXhgQk4YdGgAFJpl7uD0NTegCS/QY+PuWeJNVwJ/UuOI9F+iHzq4Hzse85IEk7+TrTlN8DnWsmIyGF/dC6TCmwSpKywCFFVwI1CyYk6U0wtDdUyoMYSQofYbMkLW2Bb9vNkqRFRz7RUZIiSYosdcLdVEkqo9X9kkeckSRZigahOUOaU+05b0ctUk4n9OSbJEkPqHKTjIUmzxfY68BVnvQC+houPxyEuuQaoDLaUzenp0mSOT7ePDrR9d3wA8ojJCXchF/QkjlatsbH66/NH1XmgrPu3PQEvhdZAp+X6/R7d5vNxX4jR6yFS778OReNkHeU+PJqbhkb5YIvf2ZslCo6vI0l0clWI2Q5HPGsWD3DiYY6TC2cCJcUdw0OGWtK815Cb/3pe1/httlgH5t7xb3HnMdnGW99GaWf6dqXOn3d8j/5N2TLynERM4YkjS8dnuQ+lj2G7DB2hQtIzAl/RqgkxSRESVLEX1VNJX4DmRADv7Vqo6QAAAAASUVORK5CYII=);
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA2CAMAAAClUqpcAAAAAXNSR0IArs4c6QAAAZVQTFRFAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcFBQUEhISIiIiICAgHh4eGBgYFxcXFhYWFRUVHBwcGxsbGhoaFxcXHBwcGxsbGhoaGRkZGBgYGxsbHBwcGRkZGRkZGxsbGBgYHBwcGhoaGRkZGxsbGRkZGRkZGxsbGBgYGxsbGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGRkZGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGRkZGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoa3tD9qQAAAIZ0Uk5TAAECAwUGBwgJDQ4PEBEVFhcYGxwdISUmJykqLzc8PkJJSlBRVltdXl5gYWNlZmprbG5xcnZ3eHx9f4SFh4iJkJGUlZaXmJqbnJ6goKKjpKanqKmtrbGztbm8vb/Aw8TFxsrLzc7P0tbX2Nna3N3f4eLj5efp6uvu7/Hz9PX3+Pn6+/z8/f7+aEnfAAAB/ElEQVR42s2WaVfTQBRAp1AoYhVRRHEJirumtbhUcVesuNPihrhjRVRwX1CpYi33d3sySSbhMJ5mAni8X5I3yc3kvZeZE4GiIoxYgHgt41AyFzPy2BtfrI0YUAiJRpRDYnUoMhNzRIMcz0ux1Otww1yM0UdHrCimzMRYLKrYuF5La12xXd/wPUsnJi3LusszS1Hgm2VZqyIVp8i9IDjMVOSqxhYHuR8Eeb7UEdPX/UROMx4Mn1FBx0Gt2DTKc8/cBxv84ebXDHneJMe0Mx7CN5dPM77CHUwUYavvkdXnGJgH4GmnfP0S3J7nzSuOY8pvq6EfvmeXJXvewSM5d3vYk+LPML+hz72Uq0B1BjiXkvFVeDOq+DRnIbtc8B66+4cTzV5udMOyZrMq5nyOfIZud42crMHX97PwYLUcOAGvLg4EHFWblRBizQTk3Nbcgo89CbF2BN7KKqWG4UqDbkMOe+I4DK+U3chDOak1ldj0Unltv3jc4l3vg53CNwe0M+6oep7YT61D3VDmjvDMmW1aUXT6J2cZC244xaR3lrL0ORosq/9DbLFt+wkvbMVNpm3bXldX/Msut3fpRJHQEq04Rj8PUWjdrthkJHYFOQ/+M3FL2uGSFLPNUdkIm+UTClI0YhHEXQbkw6IJXQsQxx46fDAXgz6akM4oukVc/gDJXaMPEeEHHQAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAABACAMAAABm4HQzAAAAAXNSR0IArs4c6QAAArVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaHBwcGhoaGhoaGRkZGRkZGRkZGxsbGxsbHBwcGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaefXWRQAAAOZ0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ2Nzg5Ojs8PUBBQkRFR0hJSktMTU9QUVJTVFZXXF1fYGFiY2RlZmdpamttbnB0dXZ3eHl6e3x9foCBgoSFhoeIiYqKi4yNjo+QkZGSk5SVl5iZmpubnJ2en6GhoqOlpqeoqqusra6vsLKztLW2t7i5uru8vb6+v8DExcfIycrMzc3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6urr7O3u7/Dx8vP09fb3+Pn6+/z9/v6gHUxNAAAEWElEQVR42pXW6UNUZRTH8d8MKjFkijoTblGampiaqUkupS1ILpVbaWqZK6YilJrZohmmWKhJuZRFmeZuhSWYW9mYikCJbLLEcqfv39GLO+PMMKvn1TnnPp97n3ufu0mhIr5Pr1jdaYzc3wT1Xzx8R8jyJmY0z74TtQluLh2buqoBFkWvsuFIoiT1PgOLo1UfwSGbmTuidpaNXiXZi2BJNCwdDtu8pb0IXoys+hsct/k27L9TY4/ItlJ3v39nhBHFNMvIbt06zNFIygYzJUkxw194fqhVkrSG4kjMAeMlWeeWAhTPskh6napIzA7jpbgv3TcXn8dK86JiaYo7AIXP2B2pZ+Gb2GhYF5gQ9z3ktJOk2O2QH7uAykgsxiB9P2yxmKV1G+R/wh8RF+AM5ZBj9ZTWXKhjV0S2FNhq9dbWXGBSRNbhHxof8W1McPGzJSLT441UDPaWaU383TOykp72deObuJEcjTKde56p0alus9blHb1Y4sK46nRevlz2H0aJ88TuDbO7hTadF/9EyDi1pFNQFLewCjDOHchdnZWV+1Zm5sqVGRnvZq9YkZmTX2gAlfPvClSjr0HLvhmO4BNxTPvKgKsprfuzmmHfQz6NhGEJ7R/r4tNI/hoap/ur96FszO3KNiX3gouUZHDmzbj7dvvJcljlqxbCr909Rc+1lQCkJANwa3OSZ0vSGZjrVc8aHIt35zHz6oHCXSbbUwA0LPNci/YFtDzhUd1ruHKvO7/vR2jIGax+Jhuu/u/Vw1nPAbuWUOm5ap/y7yB32q8YDiZJXib12AM3RrgHDGtmvfsSGaxxNweV02J+mnyYNL2JuiHuIRtp6iVJ2kul+wZI+IvGCQpkGlXDdfftlVjLNkm6p5Gl7j3txZWqYEzjWjjpfnZXcytW0mToYzam+ixLK6ZX4WUzexSekrSDC2bdxklB21DMcoJy81Qs18iW9CfvmFumwViFYhps8JqZbeEXSQ2ehT/NSYVm+o5zZpJOmZQAE82VhCnh2EQYZi4HrrbqB3MkSS/hSgzH2tUzT5KUCV1lv0ZzmiRt55QC2MZF3iglT5LmwOl46cEyGsdKOsKOQOYflyRNdXHeIUnJN6kfKZ1nrQ8bByl9b7SKEqsmGzi7mkOGVFP3iipY4FVDq6nvpYBos7yF4tuPX8otKKzlYz81RlPT/WLzD0VXoKSvdy8DLgIc81cZwd57J3r4Hr3t9PwGfmutakp9w6B2R2rAR2Q51TH+qiDBb0ApWYFnq1EwNJzqC2lBWGwtH4ZRWkddxyBM66nvHFrFV7EpmNIDBm+HVFoBA4MybceoCaUGNrM7uFKXMkKpDkVUJIZgei6Ush0L+y+6+omgynEEMhUuMsDZWo0ugQ1hlSXLBTsH+LaS81wYb0T6Mxl5CTg4s7dZJc3+1gXXRyli2DKrAcqLDh06WwFQtaxjZCWp/dxTLs+DYhyf3yEqJEnqlJb+wc7P1i2Y1Dn49v8BUIfpizuTif0AAAAASUVORK5CYII=);
background-size: 100% 100%;
height: 32px;
width: 27px;
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico5 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAABACAMAAABm4HQzAAAAAXNSR0IArs4c6QAAAuhQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dGxsbGhoaGRkZGRkZGBgYFxcXHR0dHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGhoaGRkZGRkZGRkZGxsbGxsbGhoaHBwcGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGhoa8hNQ3AAAAPd0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaHB0eHyAiIyUmJygpKissLS4vMTIzNDU2Nzg5Ojs8PT4/QEFCREZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV9hYmNkZWdpamtsbW5yc3V2d3h5ent8fX5/gYSFhoeIiYqKi4yNjo+QkZGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i4ubq7vL2+v8DBwsPExcbHyMnKy8zMzc3Oz9DR0tPU1NXW19jZ2tvc3d7f4OLj5OXm5ufo6erq6+zt7u/w8fLz9PX29/j5+vv8/f3+/vwH9BgAAATrSURBVEjHpVZ7UFRVGP+duwvrZQVCZeUlqPlEfEw5+QgqozJTEx0bzJpMRxudTJ2mJk3/k0zTBh+oNb4gQHECDS0UsVFSBx9TNI6jaKnxRoFdwJUfEyu3Py4Ly+XCXqdvZ+fe33fu73uc75zzHRN6EuvgZ5qf4CnlxewGsu5AzFORxBdUpXHx07C2keVrXp2xrp5caZy1lTwRAgDPXiE/Mcr6hvzJT323FZGrjLG2kLl+bhRslLfak6XyFnhnjXIy3+qpCP6TNcFeadtZO6SrZpLTQJj3uE2ryuUprcqswX6huA4AMD03VLlb3AYAV98Y6o1mBeoASIu/DANQtukHBaiHv5Ym6VQAkNNSwgAg8rv9FkDp/o2kl5+cOR/FcyKj5t3AwlSLaql36U/OlnPIZF8AsOwmsywrWOWNZnJydTaZ3G5fSiGzdvK61wIUsYxM7ohd2kXW8qCRtcXtHhlLu0gmeKUF3KdjgqdiVjMLhfdFOcXBinGdcGYD/4kysgVed7BivBu81cDSaGP71IM3oweWJuqI+CHh4aH+YcJV6YKAPFB6UtNSVVn919nyHmn9F86b3GMI17Iz7Ho0ecn6IOBJSVlljQsR1S4oUBAg18AUGho5zgTYkw61dLP2UgnZlPm+Td+XbWGGk7zVLZhFjWTGqN4mKvow6Xivq24jee9lbzM8rYxc76n4mLw4yHtlBl8hl3bC6U6eshqpqP95Nr3iBoNqeHOgsZUQ/jcr3bO2g/axRvvDxEZ+1T5FTm4w3o22sGEoIIDURPtYu+4ngcstAgICEtSn+D075Lr/gZUAAhxco284sIBauQqs5wMLzIjvg1/0N+yPsbjTqkCBgjYoUDDS+gjI2xAQdxbYyz/0WfnU5nyOWwFRwq0wIxa5AA695rgjICCEO42oYdiUZHa1H94uAGgDACVvxWSYEYZKAGMHDBiu9ff1xqjDm09a0i8dT4hfUt+xYUoRDnOQHx4CaEJFIRQoaiqKAgU390w9Yjs4IWr2bMdmcT7xpvtUr0WIj9kGBAOoRtFSrbfE7y3/flY5H86s4KRh5xLPt3sLh7AhuISNM4FMpmtZQQ0sjwOO8RiQUMd7AgX8FlhCXrJKtbOqfDPi9bqKABTAJw6FgEWCS4ECgXdTcGveYwDR5ayLS2dGN96CBjZ++AI5VVpHVsUCZ5ic4OSNcHV4QjXrLjNT5+JVytq1rLc838Ti4QDyebGJtzta+6QakgU6JY+6ONc2dxmwLCcIAC6TvDuic3h0MXlBb6m4e7QJAPAbeSayy/AFHkVESsoQYGBSft66QGDivv1WYPTeotOfysCc9N3AaeZqjuM0HsEYciL63ybJazLeJvsh2k6SxwVWshQ4xR2a3q2of4EPIlvTshAzX0Wr5MadJ/FmLBS1HkITvAKh1i4G55ZjXPRIFY1H6lqfB/KIC73fFAR88Bh4BF83akZrKyStt84gJdW+4hFyR5MQni9dvXVRu1HHmus0qcmtXVuOKXHmGFSo6H7MrF8HB+ChV28/KyFn8vq25KsoBzEF+1BVqPUmab1d/qgJqFtUoqKjnzcDt95xdEuiXfYzB1K/IDMA3zGjTABMfjIA+I6MAAAhCeAE93TLzSSLFmHpA4Fy9FVPIVlAwA6b+1Ty1Sn3dLuRa3tvF0Pj9KmDoHj/tT24gf8j/wFtkTXADxi+NgAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 32px;
width: 27px;
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico6 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAA6CAMAAAA+5Q8xAAAAAXNSR0IArs4c6QAAAtBQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGRkZGhoaGRkZGhoaGRkZGxsbGhoaGxsbGhoaGxsbGhoaGxsbGhoaGRkZGxsbGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoa99eAlwAAAO90Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcYGRobHB0eHyAhIiMkJSYqKywtLi8wMTIzNDU3ODo7PD9AQkNERUZHSElKS0xNTk9QUVJTVFVXWVpbXl9gYWJjZGdoaGlqa25vb3Bxc3R1dnd4eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbn6ChoqSmp6ipqqusra+wsbKztLi5uru8vb6/wMHCwsPDxMTFxcbGx8fIyMnKysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9fb3+Pn6+/v8/f7U/243AAAEC0lEQVR42q2WfUwbZRzHv1faCohACxtmRaEDJ25DQNRoFBx/TA3DQIKbMrJsi4uR6HyLiv7nNLLEJRjjNkxkyWQZuswQjZnRVIcvS1QW+aPwB87h7Chv0t4XSZpNurXm7vpyK3ftrvWXyz2/33PPfZ57nt/Lc1lIIfll+YEQMpKHh/ykp3dtBghrLxXxtqTPOEKOP/1AS4+P/vYMGB8WSFrtGP2Pp8Ww9JMHsxR9bZoUy0fkoayo5XRTTIPyLnnYHDedbvoajDIeJPvN6g7nOY5lG4Qc4+/2a3u2kAZdlDvPFxL7zvKgzmizdrfDijHFz3WOq5PjsvprZaUxSA4gSoiul6RAmdz3JQAiTwdi0u4Oy3fbyTflYKsY6DElW7z+QwG2oUYMb3Fu3DmFrgOmCNiAbCTvsp0mu+VJ8gfIXtM7/MkYpJTc/h35SsTM/ph87xg/NQbJOs/z5KsxW6LM8S2D6zlA8jWVnX2U5N0GIbdO01Ou7thJHjGcgC0i3c642SnyrM14Gm9TUzpEjpamU5W2inRHKvSTIkdvQZKQ0pLKhopVpSX5qxCcuyoAeUUILlz2zi6MDS9cJ8TR2bpeb87QmS9OBFJDCrv25gDL5/70iSHcPCunUbjoyiIsxcW3VQGY2/fZlVROmSRn+9oKdQJ5x3GSP9+eFCG8LFJ8vyzZkHuGyIubkwww95G/1aTyWpuX/t36j3vIT+ypfV/tptist7Edh3Hy2SAsBYLcL0CrDU0BJV+XBx4d14Tc6bK6mwNAzffJPsNbDaDKlee5/5JWZeu2ijsCci1NJj7pNrEHZbu0CnVjM96+KCl+4IMzcnhI17Xti03T8uBvPm/rPiGunOJbjloVbYa6mz/IQ4pS5efrK5dTUY/9y4oqolgP4sCSokwMYttKyCYEXbFlF+lBihBdw1dwrl8BeQSuxagDUKAHsUk7JsuPl7A5ESI04nS07x+oUsf6RGPcyMmN+S7gQk0ixH4DZuIQR/y9Zxab6mKGXXoYkXmUJUJWA3/HQ0G1sablYDwgC1WQGaxJhBQj/qYPqgTqc4yMxox8FaQcq7MSC+IFeu+N6K3kTTrVhoyW/DfIwRUHef0UPbWK2kCWa0M66I+8uJc8pfGncd80J+9QMpGs04Y8x0lF2U0OF2ok4C/b/7WfekzSFuXFa4ldCZPc/b2Y2LqokYD4YddR28DIyAVYgfZKVSExxQrKJmQ/D8u6h0rwR7tPVU/W9ceLzo1rzNd5sF1eCkXnEJbqzTnV6ZyO2apfWgvMYeA4E+rGhqIwQkBYvstXCILSzv+VUGfqWwXZFbXIQPbQA1MYmYogu1jIBBFO+gtqQKSN7WxKcs6kajdAkIPtqYy/JDirdTQYaMPE/yL/AQn/nlzVMLtOAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con5 .item-l {
background: url(@/assets/v3/bg5.EqAxWS0a.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAMAAAANIilAAAAAAXNSR0IArs4c6QAAAbNQTFRFAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcFRUVFBQUEhISIiIiICAgHh4eGxsbGhoaGBgYFxcXFhYWHx8fHBwcGxsbGhoaGRkZFxcXHR0dHBwcHBwcGhoaGRkZGBgYFxcXHBwcGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGRkZGBgYGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGhoaGhoaGhoaGRkZGhoaGRkZGxsbGhoaGRkZGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaYKSRzgAAAJB0Uk5TAAEDBAUHCAkMDQ4PEBETFBUWFxkbHB0eIiMkJSgpKiwuMTIzNDg5Ozw+P0FERkhJSktOT1FSU1RVVlhZWlxdXl9gYWJlZmtsbW93eHyBhIeIjpCRk5SVlpeZnZ6jp6mutrjCw8TFxsfIzNDR0dTV1tfY29vc3t7f4eLj5ufp6uvt7u/x8/T19vf4+fv7/P3+HFNa1wAAAi1JREFUSMft1vlbTFEcx/FPqQxG2m6MZQaNpGiUiazJVoRsyXIThWQZIaJl0rQwTNP7T/bD3CbPjOiebD/0+emc53tfz/O9555znyP9JLlWoEhmCdgxYOhKoXuacylJKrE61/gGzNxsrmnthmTYpT0MfVskSaFRpje6srnvGFnvjPfMcccVroZD6cltpvLd4IskPelJPexygzsZWJhY0OAG36VvYeKBYyv4z+BK27btQcbtdLqg17Zte82v8VEWy4Yl4Uc9b6Lve9J5GI0+7Xm5VPyj/sJ/Fa/aGd5sigPPgHvrjLBnCIAuI3yaueNFt6DcBF/llVQOIRPcSny7WmCrCbYm+ToKj3OMVrs+BkR8ht+5dIT7+cY7LMI1rWAX2NpU+G/OsxFe1g/QHPvOLpYC/T9ZGzLOXlVgnIll4/2WSdpTuMJosS58h/1hqaraKZwpkc47FzHvOck66RRqg9IRXyb2jyUaq6amU7qNSHEHvR5J8vbTbg3SkrqHxmPB5uSwLwsz+5k05iMLmBhpzEySLCz/BMTn224Dnsy3/Zx5K9UmYCyrbVXNwGyj80wHMFDi/BDeAu1OoXkOJoOZuHKKTxMkUnfM6zAEkUJJKh2ED3BZknQiyfgXYjsycNnr6Wr/WDQgSWpK9nra6M6TpIIHtHj7EwclScHYsC8Uf1GU2XbZbskfcLqr80gNealxwQHJu88pBH1STXHWO5tuklOVJun8DQfDHK8OGGfbN0W21rQF0iFVAAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAuCAMAAACvSe/GAAAAAXNSR0IArs4c6QAAAORQTFRFAAAAAAAAAAAAAAAAAAAAMzMzICAgGhoaFxcXFRUVFBQUHh4eHBwcHR0dGhoaGhoaGRkZGBgYHBwcHBwcGxsbGhoaGRkZGBgYGxsbGRkZGRkZGxsbGBgYGhoaGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGRkZGRkZGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaTYzvEwAAAEt0Uk5TAAECAwQFCAoLDA0REiMnKCkrLS4vMTM1OD0+QklPVGRtdnp7fH+DhImKi5CQlZydn6Cho6WnqaqusLK0t7e6vsHCy8/R3OLm6/D5JIZOigAAASJJREFUeNrt1VlPg0AUhuFDB9z3VlzQ1rpXxaVYtVqlo3X9/v//MQykAk0snKGpF76XkPMkc0IYIlXF5rVKUR/g9VUg4DIO0IgDu5S/nQCYcYI+ce7krBwBNvP0uC8Q2J7Pnx8HbMb+HooGFlqqAyLRGt7iILARLkYSWRn2tzkIrPiqUyLhD688gh1oA8sd1Qkb+FkiE1i6Ux2Nbwf/QIaByta6HuClvhFtoIvnavVCA3jtXyzjAh7RmQ3SW6LKBg5rYWfNq+ZlLZWTBNaix7048Gs3SeA4frEUA1CpnzCFKUqpjCRgpF9kzcvxt/qDwMS+FQL1Od78E9qWB2m4eGEJ5i3QvoZ0ATlNXOEN74CcYi4hEKAxHwka80Tmnt+YpJH0DZhq6TgD/Ay+AAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAA6CAMAAAA+5Q8xAAAAAXNSR0IArs4c6QAAAt9QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGRkZGhoaGRkZGhoaGRkZGxsbGhoaGxsbGhoaGxsbGhoaGxsbGhoaGxsbGRkZGxsbGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaU0yUGgAAAPR0Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcYGRobHB0eHyAhIiMkJSYoKissLS4vMDEyMzQ1Njc4Ojs8P0BCQ0RFRkdISUpLTE1OT1BRUlNUVVdZWltdXl9gYWJjZGdoaGlqa25vb3Bxc3R1dnd4eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbn6ChoqOkpqeoqaqrrK2vsLGys7S4ubq7vL2+v8DBwsLDw8TExcXGxsfHyMjJycrKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP19vf4+fr7+/z9/lcEE90AAARdSURBVHjarZdrTFtlGMf/pzcKQ6Bchs7q6NgG0zFgTGdMFMY08EHZmOhQYdGImWZL8BLjNRpNRoKJUwwmG5sBs1Uy1DgZH3TZhjo+zIVEQz906ibhMu500P7rCMXWD6eXQ3vOaSs+H/o+z/ue8zvvcznPe6pFFEnJSXF7sSKp7HaSYy3rZJZ0MSIMLRRlsip8Sd86N7orJsYX5O8vPlDVPE/nE2GMdpKu2tgYx1MBoPgKnXsjGLFQ9B3kEa2or1tO0beT58hwtAyjnTyqDVgWO13BG4R2sm0vudFO52OqkI/INkkCLHbOlwaMF9imqyETLPbhAjXGg2THsiRaBnnFGDAqdKghE2BRZaCTf6Uvn3mUlKaohkwI6Bp5RlIFWh3Lp85cRbnCExXq7nYDBsQ8l5iXrtoAAJfWb4gPkgTMAjAcfDUVwLV3vwPgQLICRMEdHwDA9O0HqQCQa23WqAVQeVGA6UwpLlSa8+pGcOCwxg+ObycaU3cRmnb3zV0/vb0bDR9rtCoYWTGT9T+Tr/tNo5X8tJNfK6RYQbRDHCLfCNpGKznLQ/FBcJjkmxLbeJLkvfEVGz75G85Oib1wAfjmcryNscpFuyVk7nPxNxPidAd4Ukqpc9FmRvwQ1Lpo93fop1203bF8taSpSRcqKTlZX5a72nxrShY8E/8IQHIGPNMLI+NTtnPT8nUZ+fLtq75LaXfei6e/dEeHpB1sTAQW/7g27fDitjHAB/gyluagz8zamA9g4r1TS9GSMkzOHNuTplDIz5wi2Z+vihBec9H12Vq1S7Z3k+MVKhfojpEDRdGytmeSzgbl5Wbyq/Toud9ip+sRpcDWHUHXfg/0qQIgAALkRu8IkH0+x/2QTRZS2GsYeNgNFPWpbWM0H8Cm3uShbTflmtJbBketG4BD1ZcZALA/i7XPye2krAeNnwPAqkm0XIRPrJCw8ZXyHvEQP1E9XyDztJ9oM4jaNBWD38WjorLJybcj3cktwaFFUXUgU7FtYl5U7FbURkJ2wvN90O0MJUhGMGI9sNwdAanE2Tm/OoI0JYgJs37tx5uoCIcIpTgfmJuXQgxPlYWMxCTc8KvusygKh6Qn4Hpgbg6SJnbgRvnWoJEOBLaLCeSEQ7KBqVApSAKrWfRoJN4EAguMYU04JAuhO2cgeYFazb/0B41UBN1BDlZrwxviKCfv8+vV5C0K3YYMtPx3yK6I8+aeCY4Vi2opmSMPqaPTf+NL5A8yXxr3T3FY7K2F5FZ5SCOHRaWB7JOtgx2zHNkFAHeSO+Qh7/NXAEj6kOyXBF/ypdRbf8JkvXxpEAbg8Q2SRqIJNpRyGF+GPq8sG39WzUje4ryOUNNZtSbWvw4LTm/gGYJziy6xAP9BjMaQrofOB5x0hPWNzZk+eAGv+At44YUgjpODYX1m224BKCSLsQLZzzFofFipCNAoHuoxik/1EzQO0fmA+p0q50y0cTME6AA8v+KdeMbljoY4Rp8D/4v8C2Rr2YaJzeY6AAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con6 .item-l {
background: url(@/assets/v3/bg6.hlVmcDno.png) no-repeat 50%;
background-size: 100% 100%;
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA0CAMAAADhcastAAAAAXNSR0IArs4c6QAAAtNQTFRFAAAAAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiHh4eGxsbGhoaGBgYFxcXFhYWFRUVFBQUHR0dHBwcGhoaEhISGRkZGRkZGBgYFxcXHh4eFxcXHR0dHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGhoaGRkZGBgYHBwcGBgYGxsbGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYGBgYGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGRkZGxsbGBgYGhoaGRkZGxsbGRkZGxsbGhoaGBgYGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGhoaGBgYGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGxsbHBwcGhoaGRkZHBwcGhoaGxsbGhoaGhoaGxsbGxsbGhoaGhoaGxsbGhoaGhoaGhoaGhoaHBwcGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaHBwcGxsbGRkZGhoaGhoaGRkZGhoaGhoaGxsbGhoaGhoaGRkZGRkZGRkZGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGRkZGhoaGxsbGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbHBwcGhoaGhoaGxsbGhoaGxsbGhoaGxsbGxsbGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGxsbGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGRkZGhoavoj1/gAAAPB0Uk5TAAECAwQFBwgJCgsMDQ4PERMUFRYXGBkaGx0dHh8gISIiIyUmKCkqKywtLjAxMzU2Njg5Ojs8P0BBQkNERUZHSElKTE1OUFFVV1hZWltcXV1eX2FjZWZnaGlqa3BxcnN0dHV3eXp7fH1+gIOEhYeIiYqLjY+QkZOUlZaam5yeoKGhoqOkpaWmpqenqqytrrCxsbKztLW1t7i5uru7vb6/v7/BwsLDxMXFx8nKzM3O0NHR0tPU1NXW1tbX2NnZ2tvc3d7f4OHh4+Pk5eXm5ufo6err7O3u7u/w8PHx8vLz9PX29/f4+Pn6+vv7/Pz9/f7+0IfVbQAAA+dJREFUeNqd1vt/W3Mcx/FPLWJh7S6oDd1GU9cwVlUUXeuyGcNqdZvbMJvLrJShC5u6TNvJ5s4uGGHMjKkapi6rYG4TMdpVl8qWNssie/0JHueW5iRNT+PzSx7fT87zkXPO953POSJ6HX1SchVKVrWS5IrPzfn/GJoOzAqv7DvrU73wYUH6QUP6gXmXNXV105jU2b8O/KWpxz0Y+6z2jJTe8F/UE33T1Lw2QuT2QlNtUg+7I7EeL7kez3rYtAx4x+PxzE7cqFI/abW9oT1p9ZuMVD46RBboneXDDF0QTLVd+VKdintoE5HnIPr6Rmg5ytCn3VfaVy9A8HCR82G+1nBruAVWiMiCOPfYHoDtZf3c09w47fkixRHip2ud2Rq+6h9VHxrnSpEZYaIz03HOj7hVyyLpwwVwk1PRxy2EI0WkZBt89WR9arUSurUsBt/U19dPM3Ah3C2KBvZVKt0xzVjU/SYsTj/09hK+5ArPK8eM8we8yeX7e+un7RADtnm93mAqluE3TB7mChAHIhVyQPLlbtB+rm7IhBvPUdbNaVitMuATiFWk2N/98H4iPRnwdDhRSUuy3gCd+fs9y0digR/nW1GzFikyWi8pVmQWFFjgR/W0wIt6Z6JmiyPExlrgUUFNf8xSvXM8XKplo9bqtNX9XiElUG102nh6qGIfE0usauWvWKWvHd9DqNtkM2Nx7kSJQ7hS5OqaSSNWa3ucbAfAMuph9wUTA4Qr1wP/wsJT5jwzRQaJ1XIF2Ad7lNmQPoKtsLj2Qufokzuokezxu9r+NvJF9vhyPRs97Mwez4QiLRvXZ4+dcLFqX5XssSPIrpd3g7rf2eDy8qEOPRvPK/stY6ceMlj8GoQCsHTOWz9fo+z33i3wR8XgsD5z3Ho2XN3q0jRbMmJlbpx9L5xlNFppqaoz60xYnTliC2hfi8hhMEOdDrFJVvhmPRshvMbdg9XabPk1zwIv5y9t5jDN2LMt2mxZrIzGgfF1REeKeW5os0VqaLdZ4GNh7VzzzFH1msVdvD3QNR/hEEd/c8N4ju2pFBnt6B8/we5VX8I6byRyV2rQW2hr2EFv0+dsPVdEfqDT5/P52hPYeB7lSO7BaWG2jRFx7Uik5ae+14pCmKfYjts202OXjPUI4cYGVX/NujvVukV5M7hQy0YxlGfGG2nS0lLRnIiQgpdp2SiJMy+jzYU1Wlo6NptwiEC+SHUUaqdnqioffCAiD8GfJgzviRTHrF4m1LScmXitSOD4rIsi1hZWTV1rwmK3j4uq3zxlH7hO2KUetsRutyXfjSlvRIi7xaqc30Hr/BFp/bzzJlhakYMmF5nW/wHDiRiDSjYLFgAAAABJRU5ErkJggg==);
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA+CAMAAACsn+1dAAAAAXNSR0IArs4c6QAAAotQTFRFAAAAAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaOCgURgAAANh0Uk5TAAECAwQFBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYoKSorLC0uLzAxMjM0NTY4OTo7PD1AQUJDREVGR0hJS0xNTk9RUlNVVldZWltcXl9gYWJlZ2hpamtsb3Bxc3V2d3h5ent9fn+AgoSGh4iJiouMjY6PkJGSk5SVlpeam5yfoKGjpKepqqutrq+wsbKztLW2t7i5vL2+v8DBwsPFxsfKy8zNzs/Q0dLT1NXW19ja293e3+Dh4uTl5+jp6uvt7u/w8PHy8/T19vf4+fr7/P3+fNOr7AAAA5JJREFUeAHVwYlb0wUAx+Ev2zhcQZgZTIEyCo9MsYgE80wEs8ikpDKPMqjMzDCLLgU0ZKWUmlGmIRSm0qGWRyqp6SRImMixz5/Tw/ihO20bTz1P76sbi0nPsCpyqduc0LMnUxEqbsetZ41JkZgLnesfnfvaH7BSEbjld46nS9KIfVzJUPhepvdBuY1qxa7w7aFJhs2cU/iOUSnDMlwWhe0QtTKsoUvhq+FsjAY0cFDhmwVlciuCFxQBO66NVslc2sX3ZkUg8QR0HWi8DI6xioi10kW/XcmK1OS12z4rn67/J/P08h3f7Tc01VXOj1VYZh/Bx9lihWGVCy7W1VQP2nkGqLYoVMuh/RmzPD3SAlUK0T09HE2Rj4TdME+h+YSeTPkZeZGfFZJhTt5WAIthgkIxDTIVwE3dLFMoFoGrLxB4U6FYQlAbFIpxS4LK0X9utsORpKGYBzYNRR7YNBR5YNNQ5IFNQ5EHNoVs1Irq2g/mW+QhD2zyNG39VvuqsQokankn/Q5N0HUfwmO6LvkL+vW9FSM/UTvAdaKxDboKZBhWBfS+apJh4iVw7j/cCz9Z5et52HuHFLXQwYXb5JZ5DP50QmOa3KJ/oKvEIiXWwEb5SOqgPkr9JnVjlyRTaTfY40d/A21Pql8pFMqtAle2vC2FdA14F2eclFIPbQslmUquwscJko7ytQZYHVTIWxUtMsyDe1XYCg2pcsv8FU7nyNJHqQxf0Shvdg7I8ABkx52m+xWTDMOqYJ/iYbEMW2iWt3U4LRrwLKQq95f75SH/RJr0F+/L8CO75G0mPCc3y0GOSzLLi1nSds7fKrdcFyvkzdTA5amSFL0BFiqgKT3UxUvS3b9x5mb5GNNB36bCnGXN8KmCeANaXno4f50T1wz5md7CgG2JCiK6vA+39qcVQEJlG3DkCd1ATpMLrtSmKLDo9Mm36x8kTsyI078hbvyMOYMeSlNASVlzBs26L0Gepu504ulU2XD5iF15GE+99Qs0KHYLfloL5CXzFH72jpBbTCM4Xs+9K23Q+AW10FcsD7lOaHhqUtqgO7NePAknR6rfJvg8Sd7yz3E1S9fYLtCxNEperBUuvo2SNMXFbvkZ18V+XfMRFMhPORRJstM2Wv5KIFuG4T3UyF/cMZol0yXeUQDR7ZTJUARjFEAxpCgZtq4O5BTbZVhL5+pANsBMTSKoJhk2E9QiTTwf1JcyvHc+qMf/BiaidyHImEZ5AAAAAElFTkSuQmCC);
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAABOCAMAAABG1vXNAAAAAXNSR0IArs4c6QAAAqZQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXHR0dHBwcHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGBgYGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaJuXLtAAAAOF0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBobHB0eHyAiIyQlJigpKissLS4vMDEyMzQ2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlbXF1fYGNkZWZnaGlqbG1vcHN1dnd6e3x9f4CBgoOEhYeJiouMjY6PkJGTlJeYmZqcnZ+goaKkpaanqKipqqusrq+wsrO0tba3uLq7vL2+v8HCw8TFxsfJysvMzs/Q0tPV1tfY2drc3d7f4OHi4+Tl5ufo6err7O3u7/Dw8fHy8/T19vf4+fr7/P3+qN2dfQAABIBJREFUeNrdmPlfVFUYhy+LBIgigkKoWba4VCYpmGFmWCIKoWimpYaSkaQSFphGhVRuRRlRuFSYEBahljmhFqAi+xYEM8oyM89/0mdmmOGcOyvzY9+f3uU+nzvnvOe859xRFO8UF+8lOOGQ8cZ4r8ikBmhd4AUYWQwcm+zNOy9D3XPeDXSl/mCwl3Ok3O/RU+FLVo9qLMObftKAoMWek2v7wTt0Vj+6vbFRkTaN8xj9ib5HHCYmuiOjIdNhYlHv676u0aXwuMPE71A9xyWaCNEOE7N/haGce7xBFd+MPqixe/HCLKuOQq7Nmakq+GnaI9RoFg6VoH5ufapijxq7LfpXq+2xWL0OUAfKotsuNvP/jo4LmzEt1G+saFjKR+W3zTUx1H6fuzzIY1T3o0Gu6d0zHqH+J81Pd5TmbVm7YmXa9g/KdOZAtvu+8BdQmx/vNxoKWn2kHfglziU4rQo4b/+Mb+p1oMjFSbGoGf5McjyO9Gb4Y4YzctMA+kw/Z9nxhdDqpK+9Dd0uj4Mdwwyuc5R4Ba495HoOl3Vyd6F9OG6Qmknu5v/hbprsGsf0Frpmua96gp7fguSQzwWGn/WkNb8Bn8qRjbBTjgStyS8+d+LgqkAVexTDXNEPqOeyjxgIO6AbWb/9eaESOrmb71Q/Q1reCZ1AQ/nX5Y1A21J12xMCEzs4J2a36jEcn282Y4qMDG+SRtLAhVHvNVggT2NTrM17uo0h6Yr0Kjxpc6rQiOPspFlcrA+00zJB8EMGOGS174V3hNR7GGKl0T0DOaJ/hhar+TLEjCYCtXymKkgJ3eKhvBWsx81hbguVSZIHbtJTsFxwIw1kjJgXpdccoNFup3ewT/Q1thXVy24hXkrXWbMSFUVJsZg9FMkDqBxZH5AmxM9b+2C6Za1YVCaiedx02Nq/orPELNO2T7SYPRwW0V3WLj8PxGJk0+ajHmsvb4r+dvQWYy6IPTBRWqNmvQDLpE7DsMW4D1YIcb8milXoKep95B3QZTEmwQYx8S7IDTUNqQSKsp/6EauLvWIi5G8GfhiduLSyAWrkpvItFSNWNV/InVwPBTbvBAyqbl5XKRyxPqZFvrelgDFFUSKiw8xbzJioOl4sNTdpvTzFiqLoaQ0y3S6/VJQputF9YptgrA17qpH9cnLYvAvNqHKEBhV6VohUcF2N7rCh+9Ro6BDvi2fGYs/RDPHCGtxElQpt1Gg0Wv7RaDRtKjSk1bpvzNoGyTIqSkZzQDyy/K9xVTxYPywQJW3zKC0l6kru8eTIUXy+YfhBOVSBcY0naDbkq0JTb9I/zz2ZaqTS7ovlMS31Ue7IGC11EfbhF43cmu+aTNY6+Wk7DejWuSL3GNE+7ziV1IcxN9AZGFEMNx51lp1TB7c2O/xwCn6rF36e4vwnhZ8Grqyyu3YFbWkEfUGAy5lYdsl0LT2WLHxQh28uNd0OTs12u1w21JrW7Z3KT3Zte2lj+u7jF/Umv3qJJwvGP7H4jnyV7iiMUzxVQHx2yZU+I+i7Ln2e+YSvMlb5hHj9F4Jb/Qfbt6tIIlhQ6gAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 39px;
width: 29px;
}
</style>

View File

@@ -0,0 +1,66 @@
<template>
<div class="mod-total"><h5>实验室已为超过 4000
家客户提供卓越的安全服务</h5><h6>即刻行动与实验室安全专家一同开启智能安全之旅</h6><a href="javascript:;" class="EASE btn">申请试用</a></div>
</template>
<script>
export default {
name: "ModTotal"
}
</script>
<style lang="scss" scoped>
.mod-total {
background-image: url(@/assets/v3/num-bg-wave.png);
background-position: 50%;
background-repeat: no-repeat;
background-size: 100% 100%;
min-height: 270px;
padding: 67px 0;
text-align: center
}
.mod-total h5 {
font-size: 28px;
letter-spacing: 1.7px;
line-height: 40px;
margin-bottom: 9px
}
.mod-total h5,.mod-total h6 {
color: #1a1a1a;
font-style: normal;
font-weight: 400
}
.mod-total h6 {
font-size: 16px;
letter-spacing: 1px;
line-height: 22px;
margin-bottom: 29px
}
.mod-total .btn {
background: #4bad52;
border: 1px solid #4bad52;
border-radius: 6px;
color: #fff;
display: inline-block;
font-size: 14px;
font-style: normal;
font-weight: 400;
height: 34px;
letter-spacing: .5px;
line-height: 32px;
margin: 0 30px;
padding: 0 20px;
text-align: center
}
.mod-total .btn:hover {
background-color: #7aba4a;
border-color: #7aba4a;
color: #fff
}
</style>

View File

@@ -0,0 +1,50 @@
<template>
<div class="secondEdition">
<div class="product-content pg-evaluate">
<ModBanner />
<div class="component-box">
<Product3 />
</div>
<ModTotal />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import ModBanner from './ModBanner.vue';
import ModTabs from './ModTabs.vue';
import ModTotal from './ModTotal.vue';
import Product1 from '@/views/Jyh/Home/component/ComProject/product1.vue'
import Product2 from '@/views/Jyh/Home/component/ComProject/product2.vue'
import Product3 from '@/views/Jyh/Home/component/ComProject/product3.vue'
import Product4 from '@/views/Jyh/Home/component/ComProject/product4.vue'
const activeTab = ref<string | number>('');
// 解析URL参数的方法
const getUrlParam = (paramName: string): string | null => {
// 获取当前URL的查询参数
const searchParams = new URLSearchParams(window.location.search);
// 返回指定参数的值
return searchParams.get(paramName);
};
onMounted(() => {
// 获取url中tab参数的值
const tabParam = getUrlParam('tab');
if (tabParam) {
activeTab.value = /^\d+$/.test(tabParam) ? Number(tabParam) : tabParam;
} else {
activeTab.value = 0;
}
});
</script>
<style lang="scss" scoped>
.product-content {
background-color: #fafafa;
color: #333;
}
</style>

View File

@@ -0,0 +1,41 @@
<template>
<div class="pg-evaluate">
<ModBanner />
<ModTabs :defaultTab="activeTab" />
<ModTotal />
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import ModBanner from './ModBanner.vue';
import ModTabs from './ModTabs.vue';
import ModTotal from './ModTotal.vue';
const activeTab = ref<string | number>('');
// 解析URL参数的方法
const getUrlParam = (paramName: string): string | null => {
// 获取当前URL的查询参数
const searchParams = new URLSearchParams(window.location.search);
// 返回指定参数的值
return searchParams.get(paramName);
};
onMounted(() => {
// 获取url中tab参数的值
const tabParam = getUrlParam('tab');
if (tabParam) {
activeTab.value = /^\d+$/.test(tabParam) ? Number(tabParam) : tabParam;
} else {
activeTab.value = 0;
}
});
</script>
<style lang="scss" scoped>
.pg-evaluate {
background-color: #fafafa;
color: #333;
}
</style>

View File

@@ -0,0 +1,102 @@
<template>
<div class="mod-banner">
<div class="banner-container">
<div class="txt-content wow fadejinzhiInUp">
<h1 class="zh-title">智能终端安全监测平台 (源端)</h1>
<p class="en-desc">
守护终端运行无界
</p>
<a href="javascript:void(0);" class="action-btn">
了解研究方向
</a>
</div>
</div>
</div>
</template>
<script setup>
// 使用 script setup 语法
</script>
<style scoped lang="scss">
.mod-banner {
/* 背景图替换为 image_b14311.jpg使用 cover 确保全屏覆盖 */
background: #001529 url('@/assets/v3/bj11.png') no-repeat center center;
background-size: cover;
height: 520px; /* 增加高度以匹配大屏视觉 */
position: relative;
display: flex;
align-items: center; /* 垂直居中内容 */
overflow: hidden;
/* 增加一个深色遮罩,确保文字更清晰(可选) */
&::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: linear-gradient(90deg, rgba(0, 21, 41, 0.4) 0%, transparent 100%);
z-index: 1;
}
}
.banner-container {
width: 100%;
max-width: 1400px;
margin: 0 auto;
padding: 0 40px;
position: relative;
z-index: 2; /* 位于遮罩层上方 */
}
.txt-content {
max-width: 800px;
color: #ffffff;
text-align: left;
}
.zh-title {
font-size: 48px; /* 增大字号 */
font-weight: 700;
line-height: 1.3;
letter-spacing: 2px;
margin-bottom: 24px;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.en-desc {
font-size: 18px;
color: rgba(255, 255, 255, 0.85);
line-height: 1.6;
margin-bottom: 40px;
font-weight: 300;
letter-spacing: 0.5px;
}
/* 红色操作按钮:完全还原 image_932d00.jpg 风格 */
.action-btn {
display: inline-block;
background-color: #C8161D;
color: #ffffff;
padding: 12px 32px;
font-size: 16px;
font-weight: 500;
text-decoration: none;
border-radius: 4px;
transition: all 0.3s ease;
border: 1px solid transparent;
&:hover {
background-color: #A01218;
box-shadow: 0 4px 15px rgba(200, 22, 29, 0.4);
transform: translateY(-2px);
}
}
/* 响应式适配 */
@media (max-width: 768px) {
.mod-banner { height: 400px; }
.zh-title { font-size: 32px; }
.en-desc { font-size: 14px; }
.banner-container { padding: 0 20px; }
}
</style>

View File

@@ -0,0 +1,491 @@
<template>
<div class="mod-tabs">
<ul class="tab-hd wow animated" style="visibility: visible;">
<li
v-for="(tab, index) in tabs"
:key="index"
:class="{ on: activeTab === index }"
@click="setActiveTab(index)"
>
{{ tab.title }}
</li>
</ul>
<div class="tab-con con1 wow animated" v-show="activeTab === 0" style="visibility: visible;">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">运行态监测</h4>
<div class="l-desc">实时监控终端设备运行状态识别异常行为与潜在威胁</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>静态语义分析</h6>
<p>无需人工预筛查干预即可适应新型变种技术架构无缝支持多种系统</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>合规性检测</h6>
<p>自动检测应用是否符合安全规范要求快速识别违规行为</p></div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>精准高效检测</h6>
<p>无需人工预筛查干预在代码混淆等恶劣环境均可实现高精度检测检测准确率高达 99%</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>极速处理能力</h6>
<p>静态分析与动态级协同检测成倍增加效率检测速度提升 6 倍以上</p></div>
</div>
</div>
</div>
</div>
<div class="tab-con con2 wow animated" v-show="activeTab === 1" style="visibility: visible;">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">调用链追踪分析</h4>
<div class="l-desc">精准定位恶意逻辑核心可视化展示攻击路径分析准确率达88% 以上</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>隐蔽行为挖掘</h6>
<p>专门针对"正常软件包含少量恶意代码"通过图算法剥离伪装精准定位恶意逻辑</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>程序逻辑分析</h6>
<p>可视化展示软件函数调用等语义关系辅助分析人员定位恶意逻辑核心</p></div>
</div>
<div class="list-item"><i class="ICO ico3"></i>
<div class="list-con"><h6>伪装检测</h6>
<p>识别恶意代码的伪装手段揭示隐藏的攻击行为</p></div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>调用链追踪分析能力</h6>
<p>无需全盘扫描分析在复杂混淆代码中精准定位恶意逻辑核心分析准确率达 88% 以上</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>可视化辅助</h6>
<p>通过可视化语义关系图辅助分析人员快速理解攻击路径分析效率提升70%</p></div>
</div>
</div>
</div>
</div>
<div class="tab-con con3 wow animated" v-show="activeTab === 2" style="visibility: visible;">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">持续免疫</h4>
<div class="l-desc">自适应进化检测模型秒级响应恶意变种支持跨平台识别演进</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>增量模型训练</h6>
<p>系统自动融入新发现的样本特征模型实时迭代无需人工干预</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>跨平台检测</h6>
<p>支持AndroidIoT等多种检测能力广泛覆盖各类终端设备</p></div>
</div>
<div class="list-item"><i class="ICO ico3"></i>
<div class="list-con"><h6>概念漂移变种识别</h6>
<p>有效防止长期威胁识别同家族的恶意软件变种</p></div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>持续防御能力</h6>
<p>无需全盘重装引擎在代码变更前识别恶意变种仅需秒级响应时间可支持跨平台识别演进</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>自适应进化</h6>
<p>持续更新演化构建可抵抗概念漂移等持续演化威胁的检测框架检测速度提升 6 倍以上</p></div>
</div>
</div>
</div>
</div>
<div class="tab-con con4 wow animated" v-show="activeTab === 3" style="visibility: visible;">
<div class="item-l">
<div class="l-txt">
<h4 class="l-tit">态势可视化</h4>
<div class="l-desc">强调Zero-day预警家族溯源全球态势498+31 个恶意软件挖掘实绩</div>
</div>
</div>
<div class="item-r">
<div class="item-list">
<h5 class="list-tit">核心能力</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>Zero-day预警</h6>
<p>发现未知威胁立即触发高危告警领先行业披露新型威胁</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>家族溯源分析</h6>
<p>分析恶意软件的同源性追踪攻击演化路径揭示攻击组织关联</p></div>
</div>
<div class="list-item"><i class="ICO ico3"></i>
<div class="list-con"><h6>全球态势大屏</h6>
<p>实时展示全球威胁态势提供宏观安全视角</p></div>
</div>
</div>
<div class="item-list">
<h5 class="list-tit">价值体现</h5>
<div class="list-item"><i class="ICO ico1"></i>
<div class="list-con"><h6>实战验证能力</h6>
<p>已在 Google Play 实战中挖掘出 498 个普通 Zero-day 恶意软件及31个高隐蔽性Zero-day恶意软件具备真正的未知威胁感知能力</p></div>
</div>
<div class="list-item"><i class="ICO ico2"></i>
<div class="list-con"><h6>智能预警体系</h6>
<p>无需等待传统漏洞库更新在威胁出现时立即预警并溯源分析可领先行业披露 Zero-day 威胁</p></div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref,watch } from 'vue';
const props = defineProps({
defaultTab: {
type: Number,
required: false,
default: 0
}
});
const tabs = ref([
{ title: '运行态监测' },
{ title: '调用链追踪分析' },
{ title: '持续免疫' },
{ title: '态势可视化' },
]);
const activeTab = ref(props.defaultTab);
const setActiveTab = (index) => {
activeTab.value = index;
};
watch(
() => props.defaultTab,
(newVal) => {
activeTab.value = newVal;
},
{ immediate: true } // 立即执行,确保初始值生效
);
</script>
<style lang="scss" scoped>
.pg-evaluate .mod-tabs {
margin: 0 auto;
max-width: 1360px
}
.pg-evaluate .mod-tabs .tab-hd {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
padding: 40px 0 20px;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center
}
.pg-evaluate .mod-tabs .tab-hd li {
cursor: pointer;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 40px;
margin: 0 30px;
position: relative;
text-align: left;
-webkit-transition: all .4s ease-out;
transition: all .4s ease-out
}
.pg-evaluate .mod-tabs .tab-hd li:after {
background: #4bad52;
bottom: -5px;
content: "";
display: none;
height: 4px;
left: 0;
position: absolute;
right: 0
}
.pg-evaluate .mod-tabs .tab-hd li.on,.pg-evaluate .mod-tabs .tab-hd li:hover {
color: #4bad52
}
.pg-evaluate .mod-tabs .tab-hd li.on:after {
display: block
}
.pg-evaluate .mod-tabs .tab-hd.EN li {
font-size: 14px;
line-height: 1.5;
text-align: center
}
.pg-evaluate .mod-tabs .tab-con {
background: #fff;
border-radius: 12px;
-webkit-box-shadow: 0 2px 26px 7px rgba(50,50,50,.06);
box-shadow: 0 2px 26px 7px #3232320f;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
margin-bottom: 60px
}
.pg-evaluate .mod-tabs .tab-con .item-l {
position: relative;
-ms-flex-negative: 0;
flex-shrink: 0;
height: 584px;
width: 440px
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt {
color: #fff;
left: 57px;
position: absolute;
right: 76px;
top: 169px
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt .l-tit {
font-size: 28px;
font-style: normal;
font-weight: 400;
letter-spacing: 1px;
letter-spacing: 1.7px;
line-height: 40px;
text-align: left
}
.pg-evaluate .mod-tabs .tab-con .item-l .l-txt .l-desc {
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
margin: 26px 0 0;
text-align: justify
}
.pg-evaluate .mod-tabs .tab-con .item-r {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
padding: 50px 0 0 83px;
text-align: justify
}
.pg-evaluate .mod-tabs .tab-con .item-r .item-list {
padding-right: 78px;
width: 50%
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-tit {
font-size: 22px;
font-style: normal;
font-weight: 400;
line-height: 25px;
margin: 0 0 20px;
text-align: left
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item {
margin: 0 0 40px;
padding: 0 0 0 60px;
position: relative
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item:last-child {
margin-bottom: 0
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-item .ICO {
background-size: 100% auto;
height: 30px;
left: 0;
position: absolute;
top: 0;
width: 30px
}
.pg-evaluate .mod-tabs .tab-con .item-r .list-con h6 {
color: #4bad52;
font-size: 18px;
font-style: normal;
font-weight: 400;
line-height: 25px;
margin: 0 0 10px;
text-align: left
}
.pg-evaluate .mod-tabs .con1 .item-l {
background: url(@/assets/v3/bg1.B9IGVx_y.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA0CAMAAAANBM47AAAAAXNSR0IArs4c6QAAAtZQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYHBwcHBwcFhYWGxsbGxsbGhoaGhoaHx8fGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaHBwcGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGRkZGhoaGRkZGhoaGhoaGQes7QAAAPF0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKistLi8vMDEyMjQ1Njg5Ojs8Pj9AQUJDREVGSUpLTE1OT1BSU1RVVldZWltdXl9gYWJjZGZnaWprbG5vcHFyc3R2d3h5ent9fn+AgIGDhIWFhoeIiYuMjY6PkJKVlpeYmZucnZ6foKGjpKWlpqeoqaqrrK2trq+wsbKztba3uLu8vb6/wMLDxMXGx8jJysvMzc7P0NHS09TV1tjZ2tzd3t7f4OHi4uPk5ebn6Onq6uvs7e7v7/Dx8vP09fb3+Pn6+/v8/f3+/jZlGfIAAARzSURBVBgZtcGJf84FAMfx77PjGRs2c2QUm6VoylFyLMdmmKOkiGooUY4cqSgVy1JKIoq2pMOoxCK1ImfMNCamaZjYxR5b6/n8B/1+z+/Zs2fHq9dGvd/6v4XqxgRltNcNeZUNuhGdSiFWN+BL4LC/rttI2A4zdb0aZZEZsI2CMDVMt66yPA/DFFXGGrn1i1A9tCq9cqtM4SWkSloK0XIZSrbqodlVFsn0GVcjJTXLZZ+vTKlkqD5SOOkjKQ4WyjQepsjQuozn9C8e6ipLPAyS7EfIDpTJ9h35LSU9jTNcloGxqmUwRbfIxe8sc6Vn4QFZelSwQtJ60mQZ4Kxoq5rCS0mWJW5tB7Ur5GtVegtnL6n3+i5y8T1Ijl21vAYD5bEORxdVCj1Puk0eU2GcamuSwwFV6g9LVGUSJKhS8EV2qC4PU2KXxfcAvw+Ztymj4BqUF/361ctHyQuRWxRl3eQlwC63+L5yS4Rr1LA/1ibL8D5yC7JJjU+f7aNqWk8/gsWZs+uT5G+Pl2M5sSBc1YwrTpOCCykapCo9NjqAv3OgaGELuQRNPQd/ngWc38SoyqQKDkmKKeJKvNw6pzjBuXVsIvzcXh4hWyA5fqMD2NZHbtPh1O0y9L2Eo6tMHVaVQ/6CcI2EbYHy4rMaZqrVMyeB1DtlGgOZ4XLpcY5hknxnFEPhwmDJfoxjoarGvoOC1lLAtLNQviRQ0hx+CZNb816Suu+Bq0tbyTAFhshyc6Qsnct4Q4aguRchK1byiW4kb9NKIe02uXzPDrmMz4H82b4yrSTPR6abksG5xF/VhG6CSxNtcmnj5AmZXsIlRaYYiJYl/hSkR8jLHZnwQ4TchkO4DD3L+XHYoFQYLYNfMdPlFvoFnB8gjwGXYYm/Kk2m3EeGF7jQXPI7xIcyZZAoj2kOHI/ILawYElVlHnkyJbNVhuXslWkn76vKZHDeK7exDhxT5PEkDpsMr3CmkaR0Nsh0mCR5jLoM8+Qx4DxsDJHbKAiToT9siopcDhNl8ClgltwClsGVcfLScTeciJUlAibItBKXNJsMfSBOlu574XgvVWNPAj5oIZf9bJbJb74DnG83kSmJy3aZGi8ug4+DVdPQU1AyO0CGOdBbLkHRMSFyaVfCezL4jP0NLiaoDk13A9kJflKTXPY0VjW2zymNkDTyILAhTHXpVMofwNHHgpQAH/nI2yJYLP/70zHFqE5bKG4/OB0oeLfvStjcTB7+78C2u17PA44+eorD/qrDCJgnadQeDBlZcDrBV5YRhyF3H4bMBD+NgRmqrVEWmQEydV92AUvJT2sWvbhq52Usxav722TYTkEb1TIf4uVmfzDlDDXkp05sKktUGWtUU4cSUuWt44QVhy7+hcFZkLF2cpRNVZKgn2r4lKuRqs3e9e5A1dIsl72+qiYOFqr+JsAUefM/Qnag6s+2i/yW8jILRqshelawQlXaFrJVDbOcinvksQ5HFzVM6HnSbXK7D06+2VAH4XFZfA9wffJC5DJi//V6Sv+BfwBIbvfBNZtweQAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA6CAMAAADMWVqUAAAAAXNSR0IArs4c6QAAAkNQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVFBQUICAgHh4eHBwcGhoaGBgYFxcXFRUVHx8fHR0dHBwcGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYFxcXHBwcHBwcGxsbGRkZGRkZGBgYHBwcHBwcGxsbGhoaGhoaGRkZHR0dGRkZGBgYHBwcGxsbGxsbGxsbGhoaGRkZGRkZGRkZHBwcGxsbGhoaGhoaGhoaGRkZGRkZGRkZGBgYGxsbGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGxsbGhoaGhoaHR0dGhoaGhoaHBwcGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaHBwcGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaZrZiaQAAAMB0Uk5TAAECAwQFBgcICQoMDRAREhQVFhgZGhsdHh8gISIjJCUmJygpKywtLi8zNDU2Nzg6Oz09Pj9AQUJDRUZHSEpMTU9QUVJTVFRVVldYWVpaXF1eX2BhYmJjZGRlZ2lqa21vcHJzdXd3ent8fn+AgYKCg4WJi42Oj5GSlZiZm5yfoaSnqKmqq6yvsbK0tba3uLq7vsDBwsPGyMvN0dLT1djZ3N3e3+Di4+Tl5+jq6+zt7vDx8vLz9PX29vf4+fr7/P3+nMc1QAAAAuJJREFUSMfVlulfTFEYx2fmtk1laDGtWqzTKksJES0itEipLJGxJEsoJEsSIilZsoUWoqQyg8bcaX5/mnvvuTPN5864nUkv+L2Z5znnfufznPM8zzlH4RtHIbVCqjhQaMUcYgXyERb/AYtTyCrpX8PW5ola4xbWZdu7R3OK+YcvdIX5aUT5TY95abWexIpttsD6bDPdltgV+0UIZKrSLUzZix8nUoreg42gxXQl+uONQD5nBhtwiQ7b1kv2aZLhvWZ00GCqRh4ZHzHgp4C1opsGuwAMFYZypQDs49xoI2oosHgrHmsE6zks9ZlVQ5hcRIG1YjyEWDH9JAFZFAnwMKLeZgdfHQU6UmjSHQrsmvY85zN0jaMDklwMz4TFA/E0mEdguKNbBIRNe2ptgEtMrf8M9J1k7ANNGLU7UTdYWLs3OmNMGymju97iQAKLJjs1LMxZypywGuDeps33gSPET+yDyR7zG0zWppYNgA2TYv1oU3It0o7h5IzSY1ceTAFnk0SVcicq94nWiAYJxiVJ6N2trg/nMWGVt/BQgi0AMvnfbNfYNxU/edupA5ghtHNTTCf6dKvzKuuaTcBlnahyoIT7JtKAWunaqrmay87pBI4Sf8lLWBNskz1gz2ccGIQpWop53yHhtCjFgUgjvxLxPwZJB+Q5p1ulfwsMHvKyD5wCq7HZ2utjQFeq65oM8lc6eGnAKodognzoSjkAyJlFB8wDts8CYyzQOxzsgRrK++0dWm1mxDUzLJ3pVFgDzDqR+iQkgC2iwcJMeEVup9cw1W3Y/wFm7iTLBXLlj9fDwNeDi5WKRKCYL/fvuKhQFJB2kNNpPjSTYQTjHrzbwtdNFpA109WR3kNKbkJFsCe0F1VUflV1HVDIr3UCZ9y6TV/AfG5dxQB+xbiFLfsohGrdSRKwJ1lWaeVbfMUz46YBeLre/ReeOsT/bx+GO5bLavf//DDcu1JWFXP7xJ4N5rOUQt5S6jcJyGZLl4Al1gAAAABJRU5ErkJggg==);
height: 29px;
width: 27px
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAMAAAAPzWOAAAAAAXNSR0IArs4c6QAAAuVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGxsbGhoaGhoaHBwcGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGxsbGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGxsbGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaMeyWdgAAAPZ0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLjAxMjM0Njc5Ojs8PkBBQkNFRkdJSktMTU5PUFFSU1RVVldYWVpbXF5fYGJjZGVnaGlqa2xtbm9wcnR1dnd4ent9fn+BgoOEh4iJio6PkZKTlJaXl5iZmpubnJ2en6ChoqOkpqeoqaqrrK2trq+xsrO0tbe4ubq7u7y9vb6+wMHCwsPExcbHx8jIycnKy8zNzs/R0tLT09TV1tfY2drb3Nzd3t/f4OHi4+Tl5efo6err7Ozt7u7v7/Dx8vLz9PX29/j4+fr7/P3+/H7PQAAABYhJREFUWMPtmGlYVGUUxw+IoCC4YEkpqAQpuKJSKi5pWmq2uJVLruReiguWCFJomUvu1qSpDZJWkKWm5lJauWQa5IaCQpg6EwjT4Mz8Pvdh7r0wwzCD2dOHns6n/32fO7/nveec95zzjogHC4+JkPs2Hfr/AKTHis8Whd8nZIYNKImTBhGfsjey0d9itLnL+XXFWH7DbkV7UwYF3ytkCsXBMhAHs+wYEXAvjDo7KPaWaFg7NO5z9sYNSdh4A6AwocYfVmvUZeC9IQcxBWmO9em+8BxgmOxTI0b4YaAAgBmO0XksCzgeXQPG8wY4GOefVMSFMVVC/OQxMPbzhPBKBtMEEREJdJVs3qNKsc50z/B+F860d5uxHS/BR37uGCsho56HtG/yPUxyA1kE6XU8nZ3oIiwdq2c8C3pHRquX5+Vwec7YNhVLYbmYe1XPiDRwNqjSc8TiS1q6XkqLsi82/gnrc24ccoSySj6N2GAFLJdvYci1ANb1USJS7zCMc+OQF2GsEoCElBFjS6D07YENRIdeAgcsMYJpgvjuhFluGHVzOeolIiIzLQCUzmtcybGN5hnh/Q8gxV2KvAbdRUSkq42ik3CjtVN0Wh4CWOvlhuGTx1a7SuZKQ3mLcj/nEPt+Afra7jbSD3qov0oX6QvNnCHxsM99RfmQ88pGZ2FN6LyfAudkG2bjpPty0qCcBEUG/wnABCdIn3IuNnV/8vqAWifa2oDSKfZ9hU7NJX9GS5HYOxS08lAC5nJTdftirLEdfO3eTjQDUJ7U/gbFnTzVkZ18rCauFibx2Q7WnK+zLWDC3NNjPbupuaQDqKUrEbLCRSQsA2yDPTJqw0uKHI1NOYWhZrK87fXuENZIj5AQeEqRCzmnqKlYwxXZzKTt1HVx1+l0ugzI1NntAkWKyuWk9tYZ8pXV9F8+UZTu6CmdTqfTRYvEUL1t1iDfuHmrm0iEXq/X74EDertdwqiofE5U2kmBsnqLq4raC/v0er2+rfrN0EfUrM9XJwMsYWpxLmOuIrNZoKhe0KKyYwJgmCJHYVVOWYtyMpQM3IJVKY++JuKVN4eAY2e4rXm/HQzUAoW+mYg02QJLlbXeEKuNDibHGO3S0lRyWKVmzy4wnT/9axnsUbtAKvneitzAEUfI6+SpMomb9dUylGyvlNYlKiPgmrYnyWNhlZbzqCLb2zTXiUTOzqdgbpT2PKviayJhgCOkoZnZql5DaWg1HbCJsSJ3xmNznsC2cFqVLczs93MJqZ2JpbX6cIw9ztn/AnQR7dCw2iUkjYoj1LUiKzTzL2Sb9rAKVvlVgdROg01ax1jPNd8qB3EmDO75gF377YZ9TZ0gTTLhkH+lIXV+1dNc7wZgS61rHx9XQ8m8wEqQgFlG2OQvIj61RMTrSwwhVSEB14GKLjm9HAqX9PUTHXrx7Z16DSwJXtI85YLN+vOCB0fBRBd1ZSS2cY9swFZfmwoATDmF/J5tAtjcWqS/yX76bxs47O0CksQpkTbwuLbS6c0rWs3IXxorIn3N3N0U/8p2G1hdDkuTKYuSBK172mtr50mJF7m6ID7WW0SksZG8KBGRrkbyXM5+zYsxn4fr/tXPbK9CjF0NhOEui+0zRgAOhVQLySJLbU7ZldLRwULHJw57By60rQ6SQ6oqt5LppvhPs2EYXcs15ATLVJmudUyXNqgUfnzCJWSdlunBJt5w28hijgPpHVxAJsIce9SWay6udvKaXgwcmdTCARI27iBA8sMikWthjceuGjzfAJC9csbTXTL4qkv/acvPAPzxA9w9e84G23xrcOsJHLnb5tzp9o0JCtpovw6m+dXwFhcydNm3Jcrv73y3YvhDIiLSempqysSwe7qVejVtl8mBdqFe///h8I9Doru1lX/F/gIjzb047a6x0QAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA2CAQAAAAxbjKfAAAAAXNSR0IArs4c6QAABsRJREFUeNrNWWlsFVUUHrayRgRt37vfmS6QlqIlIFSkkIKhwSJVUCRgWARSZTVGQRBBCCAoRUV2UIxFlIQlrLKLQhVFtEBAERQECRaBKmWrCKX1mntm5r3pvJnSVyhx7o/Ou9t377nfOee7U02rnKeKP9LXDNHJNbQ79aCOGCQ24R9ILv9iH00QsZUP+xxOm5D2ck282/CuSgPVa2O5AUTf02t4Eu38XTAcG3CNa4/o8ZUCm1yDchggV6SWbiEdH3HLX5UCjQ948g+TItxaaQCuq13fdoNTGsOuCNbENBAd/HGloCWkmHG797sXEqdQxwRpi4MmrfJpmFbFqBVLmGa3zvD4mlpVE7YVU2qgCTsEJaU4vcaARrSiGU2oCG9J9BMzsBFHUYAb7KWFOI1d2A+Jv/XaPH0i+/Dv1B9NRbrYyUsaZi5wAyT2hmfKpnoWzrt4aKCITWbPxZDiIulWBGPofLNtOCRKtOrlDH6iO/bYIE5iK2ZjjNgMiQs0UkzFClyFxHxz8kOQmBMcLjrzsvhk9Qzev16enXbliYzgJ3EC0YGW1yGRZ77/Boks8/0yJL1stxUDt+dFtFfv/vtvAipisd4EPUXz+W9X24R24F1BV8I3kFjpdKOYBvzeX73fxJfRCQUMVoDRcbWwVhnZcowQ4Dl8jtV48jfYOt3MlmjkQeKAuYiPIel42bAvoBgS1/G2Wqsvijk8sVQPO/AjfHZp6j2yHk4w9EqMwlxxERLFlGK4Hy5A0qwyoi4W8V7PUNtAzlFnE+cFnFwDZyFptXlEyQxtlatisDkik5eX4hkWsIMH7AuyD59CYr/DJjZgTcMktTNfI+NXZD0xFV/jEv2IbGpieQd+UCnEm1JLGHalFf443Sl3mVwWcKSfk192GVTtwezu63W2o9gcn9hpZCQAf+uygDWNZqk9I9Fj4qo4rLKTQcDQkJjBUXZPXK1SEBMhccU5xAnsi0IhJNZ57HcQb6in+24TcUlNFisc9dshsT2ktwNY0zCZjflo6MwxDfCnCj92O9pzag5z8MEQiEtOV3IH1mvjJCR+CZUC4PBD7ilR9OP1jnXWxwqu784/qjWurxMSRbL/YSyDxHk9gzpSCrXQExrX1zTxFPcd54BtxTGhmBOk80mK4AiTZ6Q2u5FoKE+2BftVFC6zFOJnzmBF9micFMFuVCDe4XnSnfsdzEOfNddYhzrSeGzlk6lI+SlIRTGVzdzfPIg9jtRHx43uOtFQmxy3SjF2IVu8ikzqpWeIDmhFTcRMSPxBup6gN9fbUEf0xmjMptXGYsX4QBRTwfYoWgaY3UJzeqqYgW020VKIL8QU9BZfQuIzFx8IIZdZ341HF/masZmtpCrpuD+LrkBigd3QS5UyCOTdXEz0t7Z0Ao4Ek3y5gFua8+zTqmOaobQ58qmtKYxCX12rb3VRbHY+glei4Yg41yHFi2EA3xuw2TrezHq+T/WgVWx0Bd/DMnQKm+I7QyWUfuLu9oo4XsCaphgiDpvg56J8gfpoTKciSJppGXqc0rvxNV2Dis5xuktYwMfUSeKMOjbnSKywZSilLijHI2nYFFO5gXMhsYjSUIK3XASGxA3zlDlvLHAH9rdmg7UMC/grzm8a9QwVsob0N6511bzow6buqDrqCWEBb4OkVR7z3ROgl8FCMxaHTtJVtUb6wwJeB0mbPfNyCSSLIV8j5u2b6ONa5rGpM0NbxBpWoG5jdjOr+3iUK2Ya0ZtXMB7fQuHLqp5w54ExzVAHij59fXXdCg1Urb6o0BahwuFptzF8CDvc5/PVVQKJRhqysxiShnqQ6wkDOCxybTQCpdsTX9NIkkbHc5A03kOkpYdK+ZsCK12+3MOdOBLqGUbHfZBY6gGcymS4Lyzgb70VtpGAzZyMueo+6GFqI9IkhwV80D2RataN47KpT6iXlzk1TY9nFnYKC/iUigseIVhZY0spHYk88UxpIc9psZYRQMIArsZkHeYqEZY5lCzLMFUuYAHaWd9ytAD1MKn8wCKGT/Exe12sEC/hgKXfotPtEfTpQINEPhZTL0uJcJLLDgOY6ag3N+wlUjEZe/kzhiqXMD0oDILn2Ua8xxdpq5zAUjGW9kCKnWEA9+Udj6RZ2M2fEU0lRzk0IKi2XBxcdMa8gOmDJQ876H0xBWPwPA0QPURn9VkJ+ZSGbugtBtEImiBmYC0OiRuOkVexgYbopJXv8ceJfmIhcvneVJFSjF+xFqOorftH1XI8UT6Rikxk0WocxCkUoMgFRn3hO4tj+FwspBH0OBIr5V8CSRF6QxHjT9Ifogf0+Eh/ZD2P6+f/8/kPaURwNOuwtMAAAAAASUVORK5CYII=)
}
.pg-evaluate .mod-tabs .con1 .item-r .list-item .ico5 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA2CAMAAAClUqpcAAAAAXNSR0IArs4c6QAAAfVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiHBwcGxsbFhYWFRUVGxsbGhoaFxcXFxcXHR0dHBwcGxsbGhoaGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGBgYGxsbGhoaGRkZGRkZHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGRkZGxsbGxsbGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoahQXVxQAAAKZ0Uk5TAAECAwQFBgcICQoLDA0ODxITFxgcHSEiIyUmJygqKywtLi8xMjQ1ODo8PUBDREVHSUpLTFBTVFVYXF1fYGFjZWZnaWxub3J1d3h9foCBiYqNjpGSlJeYmZqbnZ6foKKjpKWmqKqrrK2vsLG0tba3vL2+wMHDw8XGx8jMztLT1NXV1tfY2drc3t/h4uPk5eXm5ufo6err7fDx8fLz9PX29/j5+vz9/ud+XxgAAAIaSURBVHic7ZTpVxJRGIdHtJS0yELMNNtMaLPFLNuppKxIC8v2fU/KysJyKtvBpI3KqDAL5Pk7O3eGphEBGb54Ooffl+e+895nzl3mjCSly4yj3ba0zQxZMwiRFpNRbeYZIAq+amNeUwgCDTU+GGktzF6bdQXih8skyeQahr6F2Xobh+DVMnVceRui7qnZaNYuiLWb/5YFzjA8rp/Y2z5untULsbaSzJpNrOxA8so2DcHLpRk0U0sk9Vkop9VRms6r9sGvvUUpe+vF/axM2SpsHQFfjVYv7+zpPd+sfTnlZ4HjlvHegj4YdmnzLKdRcm+ONmNtEIKNSdoUdxTuVGr1tBfwuetSAH7M1R5ajgHnyvXekkcQdhb8e9AB7cXiciL06r7zFX74tEErS9pi4LXqXjQvTqc62gqbdY1Szyhcna0WxQ/EBc+v1eUQo/bE0E+3vlO7IwyhCkW0Yzgu9SCeGPW+VqlrNdU5HF844RCJclCgEfYLNsEewW2wRXA3rHPYzbpdv8Ot8De7BKZDs6ANGgTrYbHgaqgYe5F5MS/mxf9dXOXxRHjoEYlxV+AI3BI8BdcEL8IFwetw0uPUxH3G/lVenRh7/fF5v4j//TOFgbcK+geCKgffqAwOfB8jhqSsc2PyRFmWPxD/mXVifJNl2SxJRv//asqE2HPzqaHcv5wQnRNtKzmLJk3cWWQwdQkx51PNUazKKSbpDyfEdItE0oMXAAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con2 .item-l {
background: url(@/assets/v3/bg2.ED2KfGoJ.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABACAMAAABvC9RJAAAAAXNSR0IArs4c6QAAAoVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYHh4eFxcXHR0dHBwcHBwcGxsbGhoaGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGRkZGRkZHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGhoaGhoaHBwcGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoawUAFEAAAANZ0Uk5TAAECAwQFBgcICQoLDA0ODxARExQVFhcYGRobHB0eHyAiIiMkJSYnKCorLC0uLzIzNDY3ODo7PD0/QEFCQ0RGR0hJSktMTk9RU1VWV1lbXF1fYGJjZWdpamtsbG1vcHFzdHV2d3h5ent8fX5/gIGCg4aHiImKi4yNjo+QkZKTlJWWl5iam5yen6Gio6WnqKmqrK2usLKztLW2t7m7vL2/wMHCw8TFyMnKzM3Oz9HT1NXX2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fL09fb3+Pn6+/z9/kKeQQUAAAOySURBVHjarZb5X1RVGIe/ICiorBoGGSSlIUtkYxZFSWakhUtESFIhZmbZHgUFhYGtKKHYRlKZlCmoLGVZsgYoiwhc7vP39MPMwMw4M1w+n56f5v2e89x75j0z9x7JBwk3aE4s3NpoTtRnB1sW7v54GAD6ylKtzF++twOg5bn9FwBOF0b7nx+S0zAF9FfcISkg47MRYLzu4Xk+BVvVFcD4etN8Z7I49wRAd0mSt/mxHw0AnC9e5p7f+vrfAH1PR7rnCzZ/awCXD6zxcrHAB2rGgbHD6wOnszsrBwGTiRBfS37K3sFLb6yUpEVF5wDaXniZMZ/fchukvdkJ0JQXqHRgqHqt9Ix/JVTzsmqvAYuVDsWhkgVFUtQHDiVdVhXl/H9KRP5rBTFzUh65AkxsmYOSdhWjfRIzw4pi1NTU1NR0MJCihIs0WFGcVEp6ka7ZlU0/2hnmkKRSK4qTVzGKEnOvUWVdib4IQE+CdUWxjSacTJUUv79y981WFGn5ulWSVDgJjOdYUuxkmYycGsNcY135ij9iFN9NQ0rKXotKHy9JKnVslj8l0eZ4YPxOlaTaWZW0n8H4ZqkklTH5fPorUG2z2Wy2QF/Kil4A2sMl3WjfoHOuTyMvyidcy719n8keSYr7zmCqNk7+lQHeklTPT/ZyadIS95Z4UQYpknSQM96b6E05QUesUi9TYV3ZAOMdBqPJ/pRkWOuS5RnA0EYfhp6A+VoG2a7hLfBFpC9DuxmSgqbY6RrOh+0+DVXQIamZWutKM4cllYPhil1ZYXgFCiRl4cl2SYn4IFFSYD9n891YZVfK8z3Z0ctvkqR9mHddt+hEyLwu3AqPSZIi/qXJkhL6Dy2O12Uh5HmMRr0H74d5hO/Cg46Pwc2MrHQbTBoAOOv2u1emyZGZGWOcWegyGPQXk+1/wveuRmwn3S5/hQKon3mp6yHIlnbD6pls0Wmm1rteohrKZ6piBiVFw4aZGx+DXW7rDDoO70xXT2LES5mwbnq8Dg56dCP8VyhxFktGacvd2cMl52KD66AuyLPpEafgU2e6wwQYd+5M+HE46uUIGNkEDc6tePQXzB/ucRRxLfCl10NjyFFone7RwukOZvRAWYC8ElgOI1s8woA9Bsaz8sm2UTiwwDWJOga998sPyW1w3uUct7ETTsbJL2G1YLztuFHU52CWBmk2cvqh9V5J2twFF+6bVZAUcwQ4dNPqRjA/XGTFkPR4F1w1oDXDoiAprGQChndZP/NL0m21lTFzEvzyH16BnDy4upTwAAAAAElFTkSuQmCC);
background-size: 100% 100%;
height: 32px;
width: 25px
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA2CAMAAAChp3phAAAAAXNSR0IArs4c6QAAAfVQTFRFAAAAAAAAAAAAAAAAAAAAKysrJCQkHBwcGhoaFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGBgYHR0dHBwcGxsbGRkZGRkZFxcXHBwcHBwcGxsbGhoaGBgYFxcXHBwcGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaHR0dGRkZHBwcHBwcGxsbGxsbGxsbGRkZGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGRkZGxsbGRkZGxsbGxsbGxsbGhoaGhoaGxsbGRkZGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGBgYGhoaGhoaGxsbGRkZGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaY4gg2QAAAKZ0Uk5TAAECAwQGBwkKDA0ODxAREhMVGhscHh8hJCUmKCssLTAxMzQ1Njg6PT4/QEFCQ0ZMUVRWV1hZWltdXl9hZGVoaWprbG9wcnR3eHp6e3x9gIKDhIWGiImMj5CRkpOUlZaXl5ucn6KjqKmqq6yvsLS2uLm6u7y9v8DCw8XHyMnMzc/Q0tLT1NXW19jb3N3e3+Dh4uPk5ufo6+zt7vP19vj5+fr6+/z9/hUAYDEAAAJLSURBVHja7ZT5U9NAGIa3UhU1guJ9At7We0VRxKNFKd7iiUXRKpcKKFYBUUSJWm9AraC21pLk/TudbLYtaZPSrY4zjj6/9Psm3zOz+35JCbGncNkckhOregG8KcvB9CpgNOeJmi4NH6tcex4DXkHT8QpvCwkhznZE5oqpxQBlxTxgn93Q4m4rngM83VEMW05sJaQUNkw31JDNYzdTO5rS6EmogwimP27SuFqafo0dCfUZLlpcM/b71WZV1QDVANBU9V22amtaJkPZq8HDfr97P6Pef7pDRL1r6mv/AfWy0peVOn+nx+OhRePVq+g3qSv3ejzuzVNT1eoYW2C40lbNbzd2/Hq5WXVp0KLRKDBWbKfWAUo0GgNeOLm6AlgvSX58XkAIWRrGWUm6xdVtF6rZ7xl8kCTpE9qmEeI4CKyVpB+6upG/awE2JRuNOWF+UlTozezk9xpXjemnmdTdejMrqa4Gaih9YFzLMYTblPamqJcwQun27zimNyXAKUqVZExVwB2fz9cNlOsxfX0ynhCL6T6+Nfp8DYOIFJgSntLPz9E1ye6jKwnz5lDKXvNPdMmyfM87mRBS2ZBKrX7URdf6ZHng5pYJ/mAm4r/6R9QNwGhIGNPrL4qbkDXAlePCKH/rctbNEGaMq7km/AtqQZkV54EjrNgVQZvlxEK7GK5jmFc3EBQKMG8E9bwsB5aIqC5gEy9nxlAjotbhizNed+KhiPoejYn6ALSibJyKgM4jYCAQpwd4yYpzmdWTGTbZmVmlLQatLUni9dGU2Z8vQHe3JjoBkgAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con2 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAMAAABEH1h2AAAAAXNSR0IArs4c6QAAAk9QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGRkZGRkZICAgGBgYFxcXFxcXHBwcGxsbGhoaGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaHBwcGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGRkZGxsbGRkZGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGRkZGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGxsbGhoaGRkZGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoa7LJWmwAAAMR0Uk5TAAECAwQFBgcICQoLDA0OEhMUFRYXGBkaGxweHyAgISIlJigqKywtLjAxMjM0NTc4OTo8Pj9AQ0RKS01PUVNUVVdYWVpbXF1fYGFiY2RlZmhqa2xvcHFydHV2d3h6e3x+goOEhYaGh4iJiouMjo+TlZaZm5udo6SlpqeprKyur7Gys7e4ubu8vr/BwsLDxMbHyMvMzc/P0NHT1NXW2Nnc3N3e3+Hh4uPk5ebo6err7O3u7/Dw8fLz9PX29/f4+fr6+/z9/h/1AioAAAL8SURBVHja7Zb3UxNREMcXAqggIE0pig0VPRuggAURRUBARUVFBaUJKCLFw4Y99oqosYEUEQtEUBCICSYk3z/MyeUSknjx7jKOozN+f3l7b9/nbm/fvp1HJKhpDMMwUZzpF8swzHySpWyY1bacJtcbzdZzd3D0BR23GDJxLvgcIHMAV1fID96i9zgGpJK76sF5IMVdet6Y+bdPeshAvOPiAnlzkdaStlqrb0lcpBgeCqyzWIqnGNo5c/VdIJH3daFCOr4Q2ExEvl1g3cEzMT7FPNZB5Q6ej1FuLEP3H8N99NhmxU1fvhm+D49acc9h5IvuXAteBnPGEVjVb/EUAfGi+Fpg6JZSqXykA3RqGPoAfLimVCpbgRsSKuiAnv/oeOWkIqhpVYc1iofhgoBnnoNKLrWoVBro483xqon82oDXqic32V0OyxbbChVCOkg8TtMHhPwFdrjR4CgTBhQ2nPIAJ7/BEc9y+p9elNMEHgJsclow+Cvc24RsLo26d9zzV+yTjockbnD6nBqNyQsUkvA5d7jMbLVfPGKeGdwuAZ/Bp3mvPT5umSsUx89Bmzc7/A0a7OgYICs8vhljUaL4J5QRUS36gyfwE9D5E4UZkSGGBwHriWipCU22pQkmNJrHbpSK4SH8eT8DVHhbpla+xegs5/Mugge8AlRJXkRR1UaYUkkmTmEPAGg6zOdVk0ZS8Ylm5bO7l9stY9NckowHsGys1VYk5FceSg+yIVVsirSaF9dfjEdXOStDDp7wU2u6IAdf1uGsun8ndf9x6Xh9ukxpHHA39Ltw8nVHfCNlDhcLa4+lz3isceEvzlUQBWpdhqc7uz9tx9F21/EXEoUBIz2CGrfdrATdH8F1zntoEd7aqPLHn6Fvv5jsKejeAjBElAPEuKwOf4VL13W84FqzBjUkX9FG/sbBQhspHz8NTShnRGhwP0AunWtCCW8WAc+SZMGhNUDnVOtTKYCOy6xUnWrWAq0RE2/L6JRZ8PqGYPtovDZWX2mWqttsgfWS8wOVDhPNZXeUuAAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con3 .item-l {
background: url(@/assets/v3/bg3.DKgYKiLO.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA4CAMAAACbrRsRAAAAAXNSR0IArs4c6QAAAmRQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVJycnFBQUEhISIiIiICAgHh4eGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcGhoaGhoaGRkZGBgYGBgYHR0dFxcXHBwcHBwcGxsbGhoaGhoaGRkZHBwcGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZHBwcGxsbGxsbGhoaGhoaGhoaHBwcGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGxsbGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaM9yYTAAAAMt0Uk5TAAECAwQFBgcICQoMDQ0ODxARFRYXGBkaGxwdHh8gISIjJScoKSorLCwtLi8xMjM3Ojs9Pj9AQkNERUdISktMTU5PUFJUVVhZXF1eX2BhY2VmZ2lqa2xubm9xcnR1d3h6e3x9fn+Bg4WGh4iJiouMjY2Oj5CRkpOUlZeYmZqam5ydn6Olpqmqq62ys7S4ubq7vr6/wcLDx8fIycrLy8zN0dLT1NXW19jZ2tvc3d7f3+Dh4+Tl5ujp6uvr7e7v8PHy9fb39/j5+vv8/f7mLvP7AAADPklEQVR42r3W+V8McRgH8E8bSki6LJahcrOOxaZylVhX7jORW+5jkVtCypkz951io4RUrpBVn3/K6/vdZq9se3jx+WWe3X29Z78z8zwzgzC9DzGYTJ3RKnr6ltLIgCkfRf2BmrwueImwT6JbUz28JYXcSj6LCYz2yCJLuwdGkUmWaQOjWE6+6BkYxVLyZa/AKBaRFTq/qXGQyMZmvtP6Sx1Z9L9oxEg108lkv6gj8eTo1jRu24WC5aGimmrOAjDYbO4kV5t388xcTVs0rUEcyDMxW7l8AGAKKYZlmzzAS+0808h6fjpbTJ4CcIAPAUwmo4GxZHleCbnSM00nBwFb+DUY2K/SGGA3q8KA87zumWazBkASqRP0EYBJkhaxCMA6vvNM1/A9gPFkH2CfSmMFLbTv2CMVPyaSiqCPAUxsoUWS1npbsFFSs0q7A4WSrm6LLuNXjXpBzHwCYIKk+bwGcfosnuloclNUXAmrAexVqVbMd1OGdnwtCzzToGJbc8+X9Kmt57VAeKX8+ufQNrop+hzJxlWi3KNSMd8Jd0hWJ7fZw1BSjRGy6KaLBdBR1ytYfuybMqSlDZF8i7xrCGRyNsjFN6/wnxqaWbZjTyWtw/ym+awMByJrmOtOgxSnp5k8XLeUcpfYnGCJKw3Z8oUsT5G1JrOOfDNDlAcbrtppDbPFZjvLXOlJ23VNEnWOrc6Qf3HLGx1OFiSmv5Z9FPuLxUmTHrJeAxxXaYSi1HGnoijKUb5SlHAHXcjvIYCJzV3lkGuBMWR/QW/b6BrXJ/ViB13rNK+zyfZAgmycY96pbdQTVdpB9pxB0Dsq/ThvQbrRaDROW5BhdabZTqM+S9I4SY84aI3jMjW60lr7qM8kQyQdI+g9Z6rbvDnKnZrYFCsG3hoqb6B6II3sDRx2paPIAe5U18jS9XsbeAVAl3pWbdxaz3IIet8bxQp54j7Hi3pak6h/iOk65APFhPNvn+e1vCuMLKyynO4v71kXc52pvqKiX2vqJZ7P8L+lX+bY80vQKWSqj9S9EU2k6V9TTXuRgeQ4WWiAEeQI/94lDIG/hjjTaovlm9X6weJLqlypn7FTbY7I5Rs38nN8TG/8dX4D3Yb6f19FH58AAAAASUVORK5CYII=)
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABACAMAAABxwuT6AAAAAXNSR0IArs4c6QAAAtxQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaAklNYAAAAPN0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8hIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCREVGR0hJSktMTU5PUFFSU1RVVldYWltdXl9gYWJjZGVoaWprbG1ub3BxcnN0dXZ3eXp7fH1+f4CBgoOEhYaHiImLjI6Pj5CRkpOUlZaYmZqbnJ2en6Gio6SlpqeoqaqrrK2ur7Cxs7S1tre4ubq7vL2+wMHCw8TFxsfHyMnKysvMzc7Q0dLT1NXW19na29zd3t/g4eLi4+Tl5ufo6err7O3v8PHy8/T19vf4+fr7/P3+kWOxigAABYhJREFUeAGlwYtf1fUBx+HP4QAKqMecXGTesaHmLR2zxgrUHLZNl6tBbmOpqRW2spWmxiJza5QjlZxpXrAyZlhu4hR0W5tMWYkrFNwmigKFcj0czvsf2Ov7+3HwIAeh7XnUM8fQ0ZMnjnTpS7t96e7TjVjqTmxOjVafjVrzKV15i5a41BfDtngAzrzx9MI5M7/57bS1ey4DfL6qv3ozMLMR2oueitMNjpkbzgL//kmQbumhq+DeFKNuph4E/jFJPXNkgjcvTgEln4Tr89WTiP1QnqCeOBY14H1WgcWWQuEQ3cKUC7A7WAGElUBOsDpNWZ61/dCBLWvTh6tTVDHkKIC9sEo+M7Ir6VSyZrg6hObDo+pmNbyhDuPeBnBXnnj3QMklL9D88mDZIkppS9ZNvuulKFSW4I1tULd9Qbgs0YsPtELdItlGXaV2pLroV0FlpCy3HYaG9QPkZ9ROL2wMkiWxld3q4kmYI8vYzyA/WjeZdhYK+suShXe6/Ljq+L0srrPwokPduD6AXbK4ajksPxvwTpMR9AEsUSDOHfBzWTJgrjq5mnhLlrWwUT4RU+fNnuBUh9DjeJNlhJ7nuDotgUkyYhv5MEi2eQUtALXbJ8gWfZG/O2Q8DuPkc5RzsuTiHiPLsMP4eDaFyrII0mSMhPXqMMjDr2SM9fCaLHdchHPPzRw+Zk52PRwbJCPoNOccMk7xV3X4Dtwj4xnckTKiLtD+bIgsQ/Pg/SAZCyBBxlo8LtleotYp4wSHZHkX74Pq9Bo8JqPfNbJkTIW5suVzWEaMl2UyZkKWbnAWcXWAjH2ckeFs5QnZzpIjYx6MlpHL1Qj5SYA0GT+FcBllvC7bF6ySsZj2YBmXyVEXZeyRMQviZBwkXzYPS2U8T7UMF6TKuPNkwW0yNnNKRjx8S0YehbKEwSIZr3Naxu1wr4z3ktY9LmMdl2QMhgdlbOMvsjjhERkvUy4jFu6Xsbqg9B4Zv+RTGSMgRcZOjsnWRIaMDJpkONt4SpakibK8zxEZCTBFRj4FslXxCxkPwWAZRyiWv4HNPC9jAUTKOM4u2Y7ytowZcJ+M5ZAkP+tgoowsrjlk1LBetq18IiOomhwZYf+hfIg6faOFd2QpI0/GUEiTbRner8rI5aJDxkIoiVWHxBo+HyNjHKTJeBjGyxYPy2TcDwtleQFqnhgkSSNeddN2nyybcA+WsY/L8qnikAxnGf8MlmWlB1qL9+4vBWqTZYlzs0VGv2vsks8ruF0yvgfLZZteiM2TGyvbOzQOk5EC8+UzDZbKUkTz19Uh/pm3jny4bXG0OqyATFn2UhOiTse5FC4j/guqYhXQ7DZOhcu408uLuiERVsuS0k7ZWAWQUk/1CFkOU+uSn3zqI2VZCXWz1M3P2mm6S5a5kCF/4z1sky29Fc/mGHUx7Q9QNUOWsI85H6outsCjst19BRqy7pCPM2mXFz4aJlsepKqriNO0JcsW9Rs3UJ694oG77k198s1aoG5lqGxrIFc3G3mFurHqELenBT91L7nU4ftejoWom8RWKifLZ8APdla0Alw/80qSUz4/bKIiUgGke7m+QP6+MulrA+XHkQn1kxXQAw14n1PPIvZD+Xj1YEol/DFBgTlSz0HhEPUoqgjYF6cAZpUAOcG6hZAVV8C9Y364uoh6pBAoTVEvBr7QADTlp8eHyDJg+tPF7cCFHwepdzF/wtJWUVr8508uYcvpr74Y3czftpZzQ/vJX9fwcbD64nc0j5FiZy/fkPPmb1/NTL/bJT0MGeqDebBe3RylPka96vcZFWHqZlIbO9Sr1TBfAWRDonoxqpGDCmRQNaVO3dp+WuIU0I/gMd1keLa/9+Cj7B5U0bI1288GaTr/q2vShLIuLv6rrEfV58v8ndT/5b+wy5acLtE3wwAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 32px;
width: 30px
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA8CAMAAAAAPFkHAAAAAXNSR0IArs4c6QAAAk9QTFRFAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGhoaGhoaGBgYGBgYHBwcGxsbGxsbGhoaGhoaGRkZHR0dGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGhoaGhoaFxcXGhoaGhoaGRkZGRkZHBwcGRkZGxsbGBgYGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGRkZGxsbGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGxsbGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGRkZGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoa4vkYlwAAAMR0Uk5TAAECBAUGBwgJCgsNDg8QERITFBUWFxgbHB0eHyAhIiMkJScoKisuLzAxMjM0NDU3ODk6Ozw9Pj9AQkNFRkhJSk1OTk9QUVJTU1VVVldZW1xeX2BhYmNkZ2hpbG1vcHFydXl6e3t+f4CBhoePkJGSlZaWmZucnZ6goqOkpaipqqutrq+wsbK1t7i7vL+/wMHCxMXGycrLzM7P0dPW19na29zd3t/g4eLj5Ofo6uvs7e7u7/Dx8vLz9PX29/j5+fr7+/z9/hwDx/gAAAMQSURBVHja1db5X4xBAMfx2drY3EcRKmfESrnlyH0kFLlyE7mv3Lco5IxCtI4kZMtNrsq2nz/Ma55ntYfnyuvl9eL7y8wz+7x3duaZnWdEpDM40cJynASnLvWPKU2rW0EzA37vLDccjLBGh4Ez8LpPOdy0NuBQKiJPw3OnFToTZoY05Xrx3DlvkmNCZEJm6NdN/45pXmlTsbm+9IJhHuhSEW4yzI2SLtKkZvlvadH2VucKHxX6R/mq0NqqVuc1X/65Ge6cMClrwbh+jlZSW/KOCt90eK6vi7dObRmPgmezeJhFOqYM+HAqa3Rc2w4DU9de9YD3RC8rdK0H7s8O2J66rK8D91hTGnEIarLDgvvouKORhuUm1HYGbvf8fVom1MEKY7oVTms+jngXjeON6Dwv1+zaiyDWTV2sPm33kiddhU7GNlKgT/NglNBNHozUo1GfOKsvRbsaSvToBpoGKBX70Mnd/aTv1L5qZSUM0aElFCvl8vdAYQ+1McUFuFJkNfILW7RpVDOrZLlJXbhP2yvSo/4JFFvIXW26CORK7d9A6cjYTc3skY0u3Okx6W5c8mIpRGnSXGplkcM3+Y48QKUcJ6QLIdJBjjcRRmjSvdyTxS4q1B68diHSIEYIEQNpQojolrdiCC3gYkCvB3ks1x9k+HsNayJHkxZzThb9GigdFZfrZbdvrBm9MnxjFfWs0+m1zNespEqZ4eQm9WySLC86qr/hF/W/JPOpUSvL3gHnfeeJZLlJuRQpEloWqkJnwAz1cg3eNmotPHFSN/9qik/7ta+lQe8A6mw5hoyGKcIwO3kbrkltzzhqKG0vOCyC6ZIUNcf57DCi82GN79b9PhqQHCNaGXKCCaZve+jLaaGHH8dgf+b+4JSudFRRPdx/76CQj7dDto4MOwmTDUbjeEhzlvbsHoYjhvMfV03zYo32hBtQZBfGtgbyZCW/WnnI5dXKzpEPl9sIk8yBiUL5M1ySRS25Qt0fOplJkQKDA6hbpdlg/8t0YVJSUtIVbsniDftksc0i1c5fpZFDdWIzpdbzE3Z4x2LkwqSqAAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con3 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAAA+CAMAAAChgZ0aAAAAAXNSR0IArs4c6QAAAspQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGBgYGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaty+CnQAAAO10Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGRobHB0eHyAhIiMkJSYnKCkqKy0uLzAxMjM0NTY3OTs8PT4/QEFDREZHSElKS0xOUFFSU1RVVldYWVpbXF1eX2FiY2RlZmdoaWprbG1ub3BxcnN0dXh5e3x9fn+AgYKEhYaHiImKi4yNjo+QkZKTlJWXmJmam5ydnZ6foKGio6SmqKmqq6ytr7CxsrO0t7i7vL2+v8DBwsPExcbHyMrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4ePk5ebn6Onp6urr6+zt7u/w8fLz9PX29/j5+vr7/P3+lBpGjgAABH1JREFUGBmtwYl/zgUAx/Hv5jHP2OaYNYtoLETMNdcsQqzl6iBnUWIlcpvI0ZAZJaQtR6FSbQyJkjRjWHOFlmvGhrU9z+d/6Pk91zbz8uzZer9VLebWEX6qqUYbCuH26kDVSPcL2J3tqBoIPEvpiucHr7GQZVb1LcfaTzZxME/eatwivFXrtu3ad4j8h82y20mWvLWdMhNkN41iH3lpC2WmyW4+d+StVI7ERPfq0b1bl2wO+MrG9DsZ8lYK6XKYAMtMUp1kGCpvbWavnL6Dk8nrcmCbvLaJfXIK3ordxiB5bQMH5Bb79ckT2waqGtZzUP+DdRzS/yCZX1RVjfuPm/vB1BGRqiyJI6qSwMlppTicX9NND1jNUVWBaeIVbCwXcwoxbG+jClZyTJ41+xXYOzXCJCloUPJVKJ6o8hLJlEfd/oKMKLkFzCmAZJPKLCdLnjxzh9K3VEHz32CtyizlpDwIzuFOPz2g7k6Il9uHnJYHu7DGqZK6h7F0kMsicvRo0ZCghwi7wbXdP6TtyThw8OfDl/j3j6yTp878efbchUt5127kF9wpul+SO8VHLj9x3qyHicezb0PkEAnj5dCwX2xzlfG7zLnUlC8+3/jZJ2uTVq9a8dGyJYsXLpg/d/bMGdPfezd+yuQ398HFGNnNpshfhoB12KS3lNtCbpv1KLUSLFjm1ZLNIXbJUOcodgXhcukCA/RofS9Bepiku8TLsAASnwyZVEiG3IqYKg9Cd8PpYNWHYTKcJ0U2E6GFXLJZKk9837fwjlpDb9mEQKxsGsFQuaSTIo/a5DNfERAjmyArL8umKfSXy0HWy61tVF05Ne7zlFxibnK/o/xhpAzH2V9L0hIIlUsuCXJquQ+ujpLBZ9Zd+KaZ7EYXc2+EpOvMkmEs7B8+aBNskIv5PpPl0Pc6hjV+UtBODPmvSvJJgGu9ZPM9+2WXgl1mA7kMhC6ym1pKcXyf43CwacRx+LHT7GLYGmxOhexWMkzC2kR2Y05ZubjELLdPudyufYfIzl1T4UpPKWAr3C6CVSapUyZcPAR7GskuzMoCOQWFqZzQe7hZmskwrQTujZXBvNwKbPaT05cUPa6HWUWZYjm0mTMzXE4xublvyy38Pjt8VFl0CTt79ege1bVzxwWUyqNFsEiVPJFHXhM5vIFVHpl2w1wfVfT0GUqi5TQe5FmDLPiqocqLu4X1dbmMBV951jgNbs6oJ5eoNCgaJrfRYFIVmBItULhjQkzbpl1fWHwKyO6qMq+Bn6qk/S7KuTq5tsoZCf6qog5zDlsx3EoZUk8VvAL1VHUBrXoOiAxRJS9BoGpuONRXzQ2BhnILGTzqWbOqIQ6C5VR3tQXIHyfvxUKIHB7LxmGLvDYYQuWwFZLaB/XOgAny1iAIk10MzJGN714K/OWlgZC0dHniyo+TjpJfW4Ye0E9e6k+Z/bKrB2PkpV65OaezszKPHT3yN+dk1wZeVLWNhIEyJGJtomrzP0HeAMl3uoVk1UC3EshJvw65gaqJ7icw7ApVzZhHr9+24jlV8B9T0a94882ZyAAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con4 .item-l {
background: url(@/assets/v3/bg4.C7YndXK7.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA4CAMAAACBkfufAAAAAXNSR0IArs4c6QAAAjpQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWHx8fHR0dHBwcGxsbGRkZFxcXFxcXHR0dHBwcGxsbGhoaGhoaGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa67X1NQAAAL10Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcZGhscHyEiIyUmJygqLS4vMDEyMzQ1Nzg5Ojs8Pj9AQkNFRkdJSktMTU5PUFFSU1RVVldYXF1eX2JmZ2hrbG1ub3JzdXZ3eHp7fX5/gIKDhIaHiImKj5CRkpWWl5iam5yen6CipKWmqausra+ys7W5u72/wsPExcfJyszNzs/R1NfZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dy8/T19vf4+fr7/P3+eSKkTgAAAttJREFUeNrtlvlfTGEUxs9UktJiC61SokmkhEoIKVsSGWtCkZKKbJOiGU1IWZPQokWhzTRpaJ7/zae578x9Z+beWfj4zfPTuc8935n33nPueV/yV4qKIaZ4zlQwL5LzgkgJUa0WbJwzfZn3kPO2S2MT7mAHhX9u5rFqwbvIY+2Cl8kwpeCr+UWeEYJ8HtMJQdh/TA5rVpvVzRdAChsS8ppky92kyxWCbTqdj2S5Y1pF1RAvL2+byzIucQNJyjvt2ouBn7+GXtZm+JK7mlc0Iq5nvHiBe1TaRwDf7pcWFly69xnA4C53qEIj8GQLey5FshYwFbumzgNfdvBGah9Q7Yraa0JHuK217Blw1DkVoUfPEntzYQeMCU6xBhjiHN3wUTy2s0JPWZVDCSZckfo1FZBBmWJmBN9cOqrFaLAU5tuDJlLbzZKpSUEaxQDqpBdfBr1fHUvT2344ROvmDEklzq2SKcwe2wcsksYURhyTxU5gmkVRD5gsL74Pl2WxUgywaL3l4S0N8wo3ZTEVDCxa1cKUxIxesTIOWC4QItMHMzguiyUC6dJUPJBljw33C6r3GkaNNHYBBv8qljZkN4J0dAsjAVKUTxe0tl2yosyqfNoIlEhhBUA25YiZ0Xb3NZiMdqSWD6ONnGn1D3Q6NLPfW8wmO8XoMNAeamsFvwHOkgtVAJ9SeGNtJ4B6L1fcuVlAY50BsWoT8B644QqjnXPDsbfm5IE8VdU7AGOH5rcAlS65gJJJsUTTlSFEAW0ylbGV/+67XXrA8KFhf5DwWl4DKj4j6pGoChs2kG/rpZ0wHSGiInOiUnp/u9PI5v7mxka2v63sxmwe0W1xBD3VmtXvfDeNHIQxi4q02haP9m6K/YrpNI+3fKKECXxP8hyjlCmMrfEQK39+ndJnUP4n55I9V//6OJMdZZaGL0CF4J3msVbB2yR7nPlnh97AraKsAzOVMy0n8zjOW+z6a5DUb7XEj2EfmeDdAAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAA2CAMAAACycDqVAAAAAXNSR0IArs4c6QAAAg1QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFRUVFBQUEhISICAgHh4eHBwcGxsbGhoaGBgYFxcXFRUVHR0dHBwcGxsbGhoaGRkZGBgYFxcXHR0dHBwcHBwcGxsbGRkZGBgYHBwcGRkZGBgYHBwcGxsbGhoaGRkZGBgYHBwcGxsbGRkZGRkZGRkZHBwcGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaHBwcGhoaGhoaGRkZGxsbGhoaGhoaGRkZGxsbGxsbGRkZGxsbGhoaGhoaGhoaGxsbGRkZGxsbGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaino4mQAAAK50Uk5TAAECAwQFBgcICQoMDQ4QERITFBUWGBobHB0fICEjJCUmKSstMzU3OTs8P0BCRkdISk5PUlVWV1laW1xfYGJmbG5vcXV2eHt8fH2AgYKEhIaIiYyNjpCSk5SWl5mZmpucnp+goaKkp6iqq66vs7S1tra3uLq7vL2+v8HDxcbJzM3Oz9DR0tTV19jZ29zd3uDi4+Xm5ufp6uvr7O7v8fLz8/T09fb3+Pn5+vv7/P3+pK9UKQAAAoNJREFUeNrt1utXTFEYx/HfyIyaSqSbRlNpIsklhCiUa8n9FlEk1xAq1yKXhESpUJIQRTPfv9GLuVTUzJlWyyvPq+esZ33OPnufvZ+1ZXUEFybJQXBhmSrZYPirir3EIaOR54+E2mcGSdZ+4e3ioMhGJ9C/ZHKyK9cX67xiiJ8eEzlazT05wSKPeET7Y64OuE1qgP8y4hH2Rioy3WZCkmH1RZhkG6bdrkYqlDlAR6hMo1Xrpkmmn/vaLjVSIWV2LTa4YmHyEIUF8yvdRNNFLDabxTAJt9m8aezqgw03/JJXdbtXzPY+hOScawMYCPFDkgFczaeyJEkVAHRXb7P6IXHFtX0AFEiKdUFbQVLgucxI2/MBeiQlAvQXhgQk4YdGgAFJpl7uD0NTegCS/QY+PuWeJNVwJ/UuOI9F+iHzq4Hzse85IEk7+TrTlN8DnWsmIyGF/dC6TCmwSpKywCFFVwI1CyYk6U0wtDdUyoMYSQofYbMkLW2Bb9vNkqRFRz7RUZIiSYosdcLdVEkqo9X9kkeckSRZigahOUOaU+05b0ctUk4n9OSbJEkPqHKTjIUmzxfY68BVnvQC+houPxyEuuQaoDLaUzenp0mSOT7ePDrR9d3wA8ojJCXchF/QkjlatsbH66/NH1XmgrPu3PQEvhdZAp+X6/R7d5vNxX4jR6yFS778OReNkHeU+PJqbhkb5YIvf2ZslCo6vI0l0clWI2Q5HPGsWD3DiYY6TC2cCJcUdw0OGWtK815Cb/3pe1/httlgH5t7xb3HnMdnGW99GaWf6dqXOn3d8j/5N2TLynERM4YkjS8dnuQ+lj2G7DB2hQtIzAl/RqgkxSRESVLEX1VNJX4DmRADv7Vqo6QAAAAASUVORK5CYII=)
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA2CAMAAAClUqpcAAAAAXNSR0IArs4c6QAAAZVQTFRFAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcFBQUEhISIiIiICAgHh4eGBgYFxcXFhYWFRUVHBwcGxsbGhoaFxcXHBwcGxsbGhoaGRkZGBgYGxsbHBwcGRkZGRkZGxsbGBgYHBwcGhoaGRkZGxsbGRkZGRkZGxsbGBgYGxsbGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGRkZGxsbGxsbGhoaGRkZGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGRkZGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGRkZGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoa3tD9qQAAAIZ0Uk5TAAECAwUGBwgJDQ4PEBEVFhcYGxwdISUmJykqLzc8PkJJSlBRVltdXl5gYWNlZmprbG5xcnZ3eHx9f4SFh4iJkJGUlZaXmJqbnJ6goKKjpKanqKmtrbGztbm8vb/Aw8TFxsrLzc7P0tbX2Nna3N3f4eLj5efp6uvu7/Hz9PX3+Pn6+/z8/f7+aEnfAAAB/ElEQVR42s2WaVfTQBRAp1AoYhVRRHEJirumtbhUcVesuNPihrhjRVRwX1CpYi33d3sySSbhMJ5mAni8X5I3yc3kvZeZE4GiIoxYgHgt41AyFzPy2BtfrI0YUAiJRpRDYnUoMhNzRIMcz0ux1Otww1yM0UdHrCimzMRYLKrYuF5La12xXd/wPUsnJi3LusszS1Hgm2VZqyIVp8i9IDjMVOSqxhYHuR8Eeb7UEdPX/UROMx4Mn1FBx0Gt2DTKc8/cBxv84ebXDHneJMe0Mx7CN5dPM77CHUwUYavvkdXnGJgH4GmnfP0S3J7nzSuOY8pvq6EfvmeXJXvewSM5d3vYk+LPML+hz72Uq0B1BjiXkvFVeDOq+DRnIbtc8B66+4cTzV5udMOyZrMq5nyOfIZud42crMHX97PwYLUcOAGvLg4EHFWblRBizQTk3Nbcgo89CbF2BN7KKqWG4UqDbkMOe+I4DK+U3chDOak1ldj0Unltv3jc4l3vg53CNwe0M+6oep7YT61D3VDmjvDMmW1aUXT6J2cZC244xaR3lrL0ORosq/9DbLFt+wkvbMVNpm3bXldX/Msut3fpRJHQEq04Rj8PUWjdrthkJHYFOQ/+M3FL2uGSFLPNUdkIm+UTClI0YhHEXQbkw6IJXQsQxx46fDAXgz6akM4oukVc/gDJXaMPEeEHHQAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico4 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAABACAMAAABm4HQzAAAAAXNSR0IArs4c6QAAArVQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaHBwcGhoaGhoaGRkZGRkZGRkZGxsbGxsbHBwcGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGxsbGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaefXWRQAAAOZ0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ2Nzg5Ojs8PUBBQkRFR0hJSktMTU9QUVJTVFZXXF1fYGFiY2RlZmdpamttbnB0dXZ3eHl6e3x9foCBgoSFhoeIiYqKi4yNjo+QkZGSk5SVl5iZmpubnJ2en6GhoqOlpqeoqqusra6vsLKztLW2t7i5uru8vb6+v8DExcfIycrMzc3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6urr7O3u7/Dx8vP09fb3+Pn6+/z9/v6gHUxNAAAEWElEQVR42pXW6UNUZRTH8d8MKjFkijoTblGampiaqUkupS1ILpVbaWqZK6YilJrZohmmWKhJuZRFmeZuhSWYW9mYikCJbLLEcqfv39GLO+PMMKvn1TnnPp97n3ufu0mhIr5Pr1jdaYzc3wT1Xzx8R8jyJmY0z74TtQluLh2buqoBFkWvsuFIoiT1PgOLo1UfwSGbmTuidpaNXiXZi2BJNCwdDtu8pb0IXoys+hsct/k27L9TY4/ItlJ3v39nhBHFNMvIbt06zNFIygYzJUkxw194fqhVkrSG4kjMAeMlWeeWAhTPskh6napIzA7jpbgv3TcXn8dK86JiaYo7AIXP2B2pZ+Gb2GhYF5gQ9z3ktJOk2O2QH7uAykgsxiB9P2yxmKV1G+R/wh8RF+AM5ZBj9ZTWXKhjV0S2FNhq9dbWXGBSRNbhHxof8W1McPGzJSLT441UDPaWaU383TOykp72deObuJEcjTKde56p0alus9blHb1Y4sK46nRevlz2H0aJ88TuDbO7hTadF/9EyDi1pFNQFLewCjDOHchdnZWV+1Zm5sqVGRnvZq9YkZmTX2gAlfPvClSjr0HLvhmO4BNxTPvKgKsprfuzmmHfQz6NhGEJ7R/r4tNI/hoap/ur96FszO3KNiX3gouUZHDmzbj7dvvJcljlqxbCr909Rc+1lQCkJANwa3OSZ0vSGZjrVc8aHIt35zHz6oHCXSbbUwA0LPNci/YFtDzhUd1ruHKvO7/vR2jIGax+Jhuu/u/Vw1nPAbuWUOm5ap/y7yB32q8YDiZJXib12AM3RrgHDGtmvfsSGaxxNweV02J+mnyYNL2JuiHuIRtp6iVJ2kul+wZI+IvGCQpkGlXDdfftlVjLNkm6p5Gl7j3txZWqYEzjWjjpfnZXcytW0mToYzam+ixLK6ZX4WUzexSekrSDC2bdxklB21DMcoJy81Qs18iW9CfvmFumwViFYhps8JqZbeEXSQ2ehT/NSYVm+o5zZpJOmZQAE82VhCnh2EQYZi4HrrbqB3MkSS/hSgzH2tUzT5KUCV1lv0ZzmiRt55QC2MZF3iglT5LmwOl46cEyGsdKOsKOQOYflyRNdXHeIUnJN6kfKZ1nrQ8bByl9b7SKEqsmGzi7mkOGVFP3iipY4FVDq6nvpYBos7yF4tuPX8otKKzlYz81RlPT/WLzD0VXoKSvdy8DLgIc81cZwd57J3r4Hr3t9PwGfmutakp9w6B2R2rAR2Q51TH+qiDBb0ApWYFnq1EwNJzqC2lBWGwtH4ZRWkddxyBM66nvHFrFV7EpmNIDBm+HVFoBA4MybceoCaUGNrM7uFKXMkKpDkVUJIZgei6Ush0L+y+6+omgynEEMhUuMsDZWo0ugQ1hlSXLBTsH+LaS81wYb0T6Mxl5CTg4s7dZJc3+1gXXRyli2DKrAcqLDh06WwFQtaxjZCWp/dxTLs+DYhyf3yEqJEnqlJb+wc7P1i2Y1Dn49v8BUIfpizuTif0AAAAASUVORK5CYII=);
background-size: 100% 100%;
height: 32px;
width: 27px
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico5 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAABACAMAAABm4HQzAAAAAXNSR0IArs4c6QAAAuhQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dGxsbGhoaGRkZGRkZGBgYFxcXHR0dHBwcGxsbGhoaGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGhoaGRkZGRkZGRkZGxsbGxsbGhoaHBwcGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGRkZGhoaGhoa8hNQ3AAAAPd0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaHB0eHyAiIyUmJygpKissLS4vMTIzNDU2Nzg5Ojs8PT4/QEFCREZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV9hYmNkZWdpamtsbW5yc3V2d3h5ent8fX5/gYSFhoeIiYqKi4yNjo+QkZGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i4ubq7vL2+v8DBwsPExcbHyMnKy8zMzc3Oz9DR0tPU1NXW19jZ2tvc3d7f4OLj5OXm5ufo6erq6+zt7u/w8fLz9PX29/j5+vv8/f3+/vwH9BgAAATrSURBVEjHpVZ7UFRVGP+duwvrZQVCZeUlqPlEfEw5+QgqozJTEx0bzJpMRxudTJ2mJk3/k0zTBh+oNb4gQHECDS0UsVFSBx9TNI6jaKnxRoFdwJUfEyu3Py4Ly+XCXqdvZ+fe33fu73uc75zzHRN6EuvgZ5qf4CnlxewGsu5AzFORxBdUpXHx07C2keVrXp2xrp5caZy1lTwRAgDPXiE/Mcr6hvzJT323FZGrjLG2kLl+bhRslLfak6XyFnhnjXIy3+qpCP6TNcFeadtZO6SrZpLTQJj3uE2ryuUprcqswX6huA4AMD03VLlb3AYAV98Y6o1mBeoASIu/DANQtukHBaiHv5Ym6VQAkNNSwgAg8rv9FkDp/o2kl5+cOR/FcyKj5t3AwlSLaql36U/OlnPIZF8AsOwmsywrWOWNZnJydTaZ3G5fSiGzdvK61wIUsYxM7ohd2kXW8qCRtcXtHhlLu0gmeKUF3KdjgqdiVjMLhfdFOcXBinGdcGYD/4kysgVed7BivBu81cDSaGP71IM3oweWJuqI+CHh4aH+YcJV6YKAPFB6UtNSVVn919nyHmn9F86b3GMI17Iz7Ho0ecn6IOBJSVlljQsR1S4oUBAg18AUGho5zgTYkw61dLP2UgnZlPm+Td+XbWGGk7zVLZhFjWTGqN4mKvow6Xivq24jee9lbzM8rYxc76n4mLw4yHtlBl8hl3bC6U6eshqpqP95Nr3iBoNqeHOgsZUQ/jcr3bO2g/axRvvDxEZ+1T5FTm4w3o22sGEoIIDURPtYu+4ngcstAgICEtSn+D075Lr/gZUAAhxco284sIBauQqs5wMLzIjvg1/0N+yPsbjTqkCBgjYoUDDS+gjI2xAQdxbYyz/0WfnU5nyOWwFRwq0wIxa5AA695rgjICCEO42oYdiUZHa1H94uAGgDACVvxWSYEYZKAGMHDBiu9ff1xqjDm09a0i8dT4hfUt+xYUoRDnOQHx4CaEJFIRQoaiqKAgU390w9Yjs4IWr2bMdmcT7xpvtUr0WIj9kGBAOoRtFSrbfE7y3/flY5H86s4KRh5xLPt3sLh7AhuISNM4FMpmtZQQ0sjwOO8RiQUMd7AgX8FlhCXrJKtbOqfDPi9bqKABTAJw6FgEWCS4ECgXdTcGveYwDR5ayLS2dGN96CBjZ++AI5VVpHVsUCZ5ic4OSNcHV4QjXrLjNT5+JVytq1rLc838Ti4QDyebGJtzta+6QakgU6JY+6ONc2dxmwLCcIAC6TvDuic3h0MXlBb6m4e7QJAPAbeSayy/AFHkVESsoQYGBSft66QGDivv1WYPTeotOfysCc9N3AaeZqjuM0HsEYciL63ybJazLeJvsh2k6SxwVWshQ4xR2a3q2of4EPIlvTshAzX0Wr5MadJ/FmLBS1HkITvAKh1i4G55ZjXPRIFY1H6lqfB/KIC73fFAR88Bh4BF83akZrKyStt84gJdW+4hFyR5MQni9dvXVRu1HHmus0qcmtXVuOKXHmGFSo6H7MrF8HB+ChV28/KyFn8vq25KsoBzEF+1BVqPUmab1d/qgJqFtUoqKjnzcDt95xdEuiXfYzB1K/IDMA3zGjTABMfjIA+I6MAAAhCeAE93TLzSSLFmHpA4Fy9FVPIVlAwA6b+1Ty1Sn3dLuRa3tvF0Pj9KmDoHj/tT24gf8j/wFtkTXADxi+NgAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 32px;
width: 27px
}
.pg-evaluate .mod-tabs .con4 .item-r .list-item .ico6 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAA6CAMAAAA+5Q8xAAAAAXNSR0IArs4c6QAAAtBQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGRkZGhoaGRkZGhoaGRkZGxsbGhoaGxsbGhoaGxsbGhoaGxsbGhoaGRkZGxsbGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoa99eAlwAAAO90Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcYGRobHB0eHyAhIiMkJSYqKywtLi8wMTIzNDU3ODo7PD9AQkNERUZHSElKS0xNTk9QUVJTVFVXWVpbXl9gYWJjZGdoaGlqa25vb3Bxc3R1dnd4eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbn6ChoqSmp6ipqqusra+wsbKztLi5uru8vb6/wMHCwsPDxMTFxcbGx8fIyMnKysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9fb3+Pn6+/v8/f7U/243AAAEC0lEQVR42q2WfUwbZRzHv1faCohACxtmRaEDJ25DQNRoFBx/TA3DQIKbMrJsi4uR6HyLiv7nNLLEJRjjNkxkyWQZuswQjZnRVIcvS1QW+aPwB87h7Chv0t4XSZpNurXm7vpyK3ftrvWXyz2/33PPfZ57nt/Lc1lIIfll+YEQMpKHh/ykp3dtBghrLxXxtqTPOEKOP/1AS4+P/vYMGB8WSFrtGP2Pp8Ww9JMHsxR9bZoUy0fkoayo5XRTTIPyLnnYHDedbvoajDIeJPvN6g7nOY5lG4Qc4+/2a3u2kAZdlDvPFxL7zvKgzmizdrfDijHFz3WOq5PjsvprZaUxSA4gSoiul6RAmdz3JQAiTwdi0u4Oy3fbyTflYKsY6DElW7z+QwG2oUYMb3Fu3DmFrgOmCNiAbCTvsp0mu+VJ8gfIXtM7/MkYpJTc/h35SsTM/ph87xg/NQbJOs/z5KsxW6LM8S2D6zlA8jWVnX2U5N0GIbdO01Ou7thJHjGcgC0i3c642SnyrM14Gm9TUzpEjpamU5W2inRHKvSTIkdvQZKQ0pLKhopVpSX5qxCcuyoAeUUILlz2zi6MDS9cJ8TR2bpeb87QmS9OBFJDCrv25gDL5/70iSHcPCunUbjoyiIsxcW3VQGY2/fZlVROmSRn+9oKdQJ5x3GSP9+eFCG8LFJ8vyzZkHuGyIubkwww95G/1aTyWpuX/t36j3vIT+ypfV/tptist7Edh3Hy2SAsBYLcL0CrDU0BJV+XBx4d14Tc6bK6mwNAzffJPsNbDaDKlee5/5JWZeu2ijsCci1NJj7pNrEHZbu0CnVjM96+KCl+4IMzcnhI17Xti03T8uBvPm/rPiGunOJbjloVbYa6mz/IQ4pS5efrK5dTUY/9y4oqolgP4sCSokwMYttKyCYEXbFlF+lBihBdw1dwrl8BeQSuxagDUKAHsUk7JsuPl7A5ESI04nS07x+oUsf6RGPcyMmN+S7gQk0ixH4DZuIQR/y9Zxab6mKGXXoYkXmUJUJWA3/HQ0G1sablYDwgC1WQGaxJhBQj/qYPqgTqc4yMxox8FaQcq7MSC+IFeu+N6K3kTTrVhoyW/DfIwRUHef0UPbWK2kCWa0M66I+8uJc8pfGncd80J+9QMpGs04Y8x0lF2U0OF2ok4C/b/7WfekzSFuXFa4ldCZPc/b2Y2LqokYD4YddR28DIyAVYgfZKVSExxQrKJmQ/D8u6h0rwR7tPVU/W9ceLzo1rzNd5sF1eCkXnEJbqzTnV6ZyO2apfWgvMYeA4E+rGhqIwQkBYvstXCILSzv+VUGfqWwXZFbXIQPbQA1MYmYogu1jIBBFO+gtqQKSN7WxKcs6kajdAkIPtqYy/JDirdTQYaMPE/yL/AQn/nlzVMLtOAAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con5 .item-l {
background: url(@/assets/v3/bg5.EqAxWS0a.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAMAAAANIilAAAAAAXNSR0IArs4c6QAAAbNQTFRFAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcFRUVFBQUEhISIiIiICAgHh4eGxsbGhoaGBgYFxcXFhYWHx8fHBwcGxsbGhoaGRkZFxcXHR0dHBwcHBwcGhoaGRkZGBgYFxcXHBwcGhoaGhoaGRkZGRkZGxsbGxsbGhoaGRkZGRkZGBgYGxsbGhoaGRkZGRkZGBgYHBwcGxsbGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGhoaGhoaGhoaGRkZGhoaGRkZGxsbGhoaGRkZGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGxsbGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaYKSRzgAAAJB0Uk5TAAEDBAUHCAkMDQ4PEBETFBUWFxkbHB0eIiMkJSgpKiwuMTIzNDg5Ozw+P0FERkhJSktOT1FSU1RVVlhZWlxdXl9gYWJlZmtsbW93eHyBhIeIjpCRk5SVlpeZnZ6jp6mutrjCw8TFxsfIzNDR0dTV1tfY29vc3t7f4eLj5ufp6uvt7u/x8/T19vf4+fv7/P3+HFNa1wAAAi1JREFUSMft1vlbTFEcx/FPqQxG2m6MZQaNpGiUiazJVoRsyXIThWQZIaJl0rQwTNP7T/bD3CbPjOiebD/0+emc53tfz/O9555znyP9JLlWoEhmCdgxYOhKoXuacylJKrE61/gGzNxsrmnthmTYpT0MfVskSaFRpje6srnvGFnvjPfMcccVroZD6cltpvLd4IskPelJPexygzsZWJhY0OAG36VvYeKBYyv4z+BK27btQcbtdLqg17Zte82v8VEWy4Yl4Uc9b6Lve9J5GI0+7Xm5VPyj/sJ/Fa/aGd5sigPPgHvrjLBnCIAuI3yaueNFt6DcBF/llVQOIRPcSny7WmCrCbYm+ToKj3OMVrs+BkR8ht+5dIT7+cY7LMI1rWAX2NpU+G/OsxFe1g/QHPvOLpYC/T9ZGzLOXlVgnIll4/2WSdpTuMJosS58h/1hqaraKZwpkc47FzHvOck66RRqg9IRXyb2jyUaq6amU7qNSHEHvR5J8vbTbg3SkrqHxmPB5uSwLwsz+5k05iMLmBhpzEySLCz/BMTn224Dnsy3/Zx5K9UmYCyrbVXNwGyj80wHMFDi/BDeAu1OoXkOJoOZuHKKTxMkUnfM6zAEkUJJKh2ED3BZknQiyfgXYjsycNnr6Wr/WDQgSWpK9nra6M6TpIIHtHj7EwclScHYsC8Uf1GU2XbZbskfcLqr80gNealxwQHJu88pBH1STXHWO5tuklOVJun8DQfDHK8OGGfbN0W21rQF0iFVAAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAuCAMAAACvSe/GAAAAAXNSR0IArs4c6QAAAORQTFRFAAAAAAAAAAAAAAAAAAAAMzMzICAgGhoaFxcXFRUVFBQUHh4eHBwcHR0dGhoaGhoaGRkZGBgYHBwcHBwcGxsbGhoaGRkZGBgYGxsbGRkZGRkZGxsbGBgYGhoaGxsbGhoaGhoaGhoaGRkZGxsbGxsbGhoaGRkZGRkZGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaTYzvEwAAAEt0Uk5TAAECAwQFCAoLDA0REiMnKCkrLS4vMTM1OD0+QklPVGRtdnp7fH+DhImKi5CQlZydn6Cho6WnqaqusLK0t7e6vsHCy8/R3OLm6/D5JIZOigAAASJJREFUeNrt1VlPg0AUhuFDB9z3VlzQ1rpXxaVYtVqlo3X9/v//MQykAk0snKGpF76XkPMkc0IYIlXF5rVKUR/g9VUg4DIO0IgDu5S/nQCYcYI+ce7krBwBNvP0uC8Q2J7Pnx8HbMb+HooGFlqqAyLRGt7iILARLkYSWRn2tzkIrPiqUyLhD688gh1oA8sd1Qkb+FkiE1i6Ux2Nbwf/QIaByta6HuClvhFtoIvnavVCA3jtXyzjAh7RmQ3SW6LKBg5rYWfNq+ZlLZWTBNaix7048Gs3SeA4frEUA1CpnzCFKUqpjCRgpF9kzcvxt/qDwMS+FQL1Od78E9qWB2m4eGEJ5i3QvoZ0ATlNXOEN74CcYi4hEKAxHwka80Tmnt+YpJH0DZhq6TgD/Ay+AAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con5 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAA6CAMAAAA+5Q8xAAAAAXNSR0IArs4c6QAAAt9QTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcHBwcGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGxsbGxsbGRkZGxsbGhoaGhoaGhoaHBwcGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaHBwcGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGRkZGhoaGRkZGhoaGRkZGxsbGhoaGxsbGhoaGxsbGhoaGxsbGhoaGxsbGRkZGxsbGRkZGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaU0yUGgAAAPR0Uk5TAAECAwQFBgcICQoLDA0ODxASExQVFhcYGRobHB0eHyAhIiMkJSYoKissLS4vMDEyMzQ1Njc4Ojs8P0BCQ0RFRkdISUpLTE1OT1BRUlNUVVdZWltdXl9gYWJjZGdoaGlqa25vb3Bxc3R1dnd4eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbn6ChoqOkpqeoqaqrrK2vsLGys7S4ubq7vL2+v8DBwsLDw8TExcXGxsfHyMjJycrKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP19vf4+fr7+/z9/lcEE90AAARdSURBVHjarZdrTFtlGMf/pzcKQ6Bchs7q6NgG0zFgTGdMFMY08EHZmOhQYdGImWZL8BLjNRpNRoKJUwwmG5sBs1Uy1DgZH3TZhjo+zIVEQz906ibhMu500P7rCMXWD6eXQ3vOaSs+H/o+z/ue8zvvcznPe6pFFEnJSXF7sSKp7HaSYy3rZJZ0MSIMLRRlsip8Sd86N7orJsYX5O8vPlDVPE/nE2GMdpKu2tgYx1MBoPgKnXsjGLFQ9B3kEa2or1tO0beT58hwtAyjnTyqDVgWO13BG4R2sm0vudFO52OqkI/INkkCLHbOlwaMF9imqyETLPbhAjXGg2THsiRaBnnFGDAqdKghE2BRZaCTf6Uvn3mUlKaohkwI6Bp5RlIFWh3Lp85cRbnCExXq7nYDBsQ8l5iXrtoAAJfWb4gPkgTMAjAcfDUVwLV3vwPgQLICRMEdHwDA9O0HqQCQa23WqAVQeVGA6UwpLlSa8+pGcOCwxg+ObycaU3cRmnb3zV0/vb0bDR9rtCoYWTGT9T+Tr/tNo5X8tJNfK6RYQbRDHCLfCNpGKznLQ/FBcJjkmxLbeJLkvfEVGz75G85Oib1wAfjmcryNscpFuyVk7nPxNxPidAd4Ukqpc9FmRvwQ1Lpo93fop1203bF8taSpSRcqKTlZX5a72nxrShY8E/8IQHIGPNMLI+NTtnPT8nUZ+fLtq75LaXfei6e/dEeHpB1sTAQW/7g27fDitjHAB/gyluagz8zamA9g4r1TS9GSMkzOHNuTplDIz5wi2Z+vihBec9H12Vq1S7Z3k+MVKhfojpEDRdGytmeSzgbl5Wbyq/Toud9ip+sRpcDWHUHXfg/0qQIgAALkRu8IkH0+x/2QTRZS2GsYeNgNFPWpbWM0H8Cm3uShbTflmtJbBketG4BD1ZcZALA/i7XPye2krAeNnwPAqkm0XIRPrJCw8ZXyHvEQP1E9XyDztJ9oM4jaNBWD38WjorLJybcj3cktwaFFUXUgU7FtYl5U7FbURkJ2wvN90O0MJUhGMGI9sNwdAanE2Tm/OoI0JYgJs37tx5uoCIcIpTgfmJuXQgxPlYWMxCTc8KvusygKh6Qn4Hpgbg6SJnbgRvnWoJEOBLaLCeSEQ7KBqVApSAKrWfRoJN4EAguMYU04JAuhO2cgeYFazb/0B41UBN1BDlZrwxviKCfv8+vV5C0K3YYMtPx3yK6I8+aeCY4Vi2opmSMPqaPTf+NL5A8yXxr3T3FY7K2F5FZ5SCOHRaWB7JOtgx2zHNkFAHeSO+Qh7/NXAEj6kOyXBF/ypdRbf8JkvXxpEAbg8Q2SRqIJNpRyGF+GPq8sG39WzUje4ryOUNNZtSbWvw4LTm/gGYJziy6xAP9BjMaQrofOB5x0hPWNzZk+eAGv+At44YUgjpODYX1m224BKCSLsQLZzzFofFipCNAoHuoxik/1EzQO0fmA+p0q50y0cTME6AA8v+KdeMbljoY4Rp8D/4v8C2Rr2YaJzeY6AAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con6 .item-l {
background: url(@/assets/v3/bg6.hlVmcDno.png) no-repeat 50%;
background-size: 100% 100%
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico1 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA0CAMAAADhcastAAAAAXNSR0IArs4c6QAAAtNQTFRFAAAAAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiHh4eGxsbGhoaGBgYFxcXFhYWFRUVFBQUHR0dHBwcGhoaEhISGRkZGRkZGBgYFxcXHh4eFxcXHR0dHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGhoaGRkZGBgYHBwcGBgYGxsbGxsbGhoaGhoaGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYGBgYGxsbGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGRkZGxsbGBgYGhoaGRkZGxsbGRkZGxsbGhoaGBgYGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGhoaGBgYGhoaGhoaGhoaGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGxsbGxsbHBwcGhoaGRkZHBwcGhoaGxsbGhoaGhoaGxsbGxsbGhoaGhoaGxsbGhoaGhoaGhoaGhoaHBwcGxsbGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaHBwcGxsbGRkZGhoaGhoaGRkZGhoaGhoaGxsbGhoaGhoaGRkZGRkZGRkZGhoaGhoaGhoaGxsbGhoaGhoaGxsbGhoaGRkZGhoaGxsbGhoaGRkZGhoaGhoaGxsbGhoaGhoaGhoaGhoaGxsbHBwcGhoaGhoaGxsbGhoaGxsbGhoaGxsbGxsbGhoaGxsbGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGxsbGRkZGhoaGRkZGhoaGRkZGhoaGhoaGhoaGhoaGxsbGhoaGxsbGhoaGhoaGxsbGhoaGhoaGRkZGhoaGRkZGhoaGRkZGhoaGRkZGhoavoj1/gAAAPB0Uk5TAAECAwQFBwgJCgsMDQ4PERMUFRYXGBkaGx0dHh8gISIiIyUmKCkqKywtLjAxMzU2Njg5Ojs8P0BBQkNERUZHSElKTE1OUFFVV1hZWltcXV1eX2FjZWZnaGlqa3BxcnN0dHV3eXp7fH1+gIOEhYeIiYqLjY+QkZOUlZaam5yeoKGhoqOkpaWmpqenqqytrrCxsbKztLW1t7i5uru7vb6/v7/BwsLDxMXFx8nKzM3O0NHR0tPU1NXW1tbX2NnZ2tvc3d7f4OHh4+Pk5eXm5ufo6err7O3u7u/w8PHx8vLz9PX29/f4+Pn6+vv7/Pz9/f7+0IfVbQAAA+dJREFUeNqd1vt/W3Mcx/FPLWJh7S6oDd1GU9cwVlUUXeuyGcNqdZvbMJvLrJShC5u6TNvJ5s4uGGHMjKkapi6rYG4TMdpVl8qWNssie/0JHueW5iRNT+PzSx7fT87zkXPO953POSJ6HX1SchVKVrWS5IrPzfn/GJoOzAqv7DvrU73wYUH6QUP6gXmXNXV105jU2b8O/KWpxz0Y+6z2jJTe8F/UE33T1Lw2QuT2QlNtUg+7I7EeL7kez3rYtAx4x+PxzE7cqFI/abW9oT1p9ZuMVD46RBboneXDDF0QTLVd+VKdintoE5HnIPr6Rmg5ytCn3VfaVy9A8HCR82G+1nBruAVWiMiCOPfYHoDtZf3c09w47fkixRHip2ud2Rq+6h9VHxrnSpEZYaIz03HOj7hVyyLpwwVwk1PRxy2EI0WkZBt89WR9arUSurUsBt/U19dPM3Ah3C2KBvZVKt0xzVjU/SYsTj/09hK+5ArPK8eM8we8yeX7e+un7RADtnm93mAqluE3TB7mChAHIhVyQPLlbtB+rm7IhBvPUdbNaVitMuATiFWk2N/98H4iPRnwdDhRSUuy3gCd+fs9y0digR/nW1GzFikyWi8pVmQWFFjgR/W0wIt6Z6JmiyPExlrgUUFNf8xSvXM8XKplo9bqtNX9XiElUG102nh6qGIfE0usauWvWKWvHd9DqNtkM2Nx7kSJQ7hS5OqaSSNWa3ucbAfAMuph9wUTA4Qr1wP/wsJT5jwzRQaJ1XIF2Ad7lNmQPoKtsLj2Qufokzuokezxu9r+NvJF9vhyPRs97Mwez4QiLRvXZ4+dcLFqX5XssSPIrpd3g7rf2eDy8qEOPRvPK/stY6ceMlj8GoQCsHTOWz9fo+z33i3wR8XgsD5z3Ho2XN3q0jRbMmJlbpx9L5xlNFppqaoz60xYnTliC2hfi8hhMEOdDrFJVvhmPRshvMbdg9XabPk1zwIv5y9t5jDN2LMt2mxZrIzGgfF1REeKeW5os0VqaLdZ4GNh7VzzzFH1msVdvD3QNR/hEEd/c8N4ju2pFBnt6B8/we5VX8I6byRyV2rQW2hr2EFv0+dsPVdEfqDT5/P52hPYeB7lSO7BaWG2jRFx7Uik5ae+14pCmKfYjts202OXjPUI4cYGVX/NujvVukV5M7hQy0YxlGfGG2nS0lLRnIiQgpdp2SiJMy+jzYU1Wlo6NptwiEC+SHUUaqdnqioffCAiD8GfJgzviRTHrF4m1LScmXitSOD4rIsi1hZWTV1rwmK3j4uq3zxlH7hO2KUetsRutyXfjSlvRIi7xaqc30Hr/BFp/bzzJlhakYMmF5nW/wHDiRiDSjYLFgAAAABJRU5ErkJggg==)
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico2 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA+CAMAAACsn+1dAAAAAXNSR0IArs4c6QAAAotQTFRFAAAAAAAAAAAAAAAAAAAAMzMzJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHx8fHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXFxcXHR0dHBwcHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaOCgURgAAANh0Uk5TAAECAwQFBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYoKSorLC0uLzAxMjM0NTY4OTo7PD1AQUJDREVGR0hJS0xNTk9RUlNVVldZWltcXl9gYWJlZ2hpamtsb3Bxc3V2d3h5ent9fn+AgoSGh4iJiouMjY6PkJGSk5SVlpeam5yfoKGjpKepqqutrq+wsbKztLW2t7i5vL2+v8DBwsPFxsfKy8zNzs/Q0dLT1NXW19ja293e3+Dh4uTl5+jp6uvt7u/w8PHy8/T19vf4+fr7/P3+fNOr7AAAA5JJREFUeAHVwYlb0wUAx+Ev2zhcQZgZTIEyCo9MsYgE80wEs8ikpDKPMqjMzDCLLgU0ZKWUmlGmIRSm0qGWRyqp6SRImMixz5/Tw/ihO20bTz1P76sbi0nPsCpyqduc0LMnUxEqbsetZ41JkZgLnesfnfvaH7BSEbjld46nS9KIfVzJUPhepvdBuY1qxa7w7aFJhs2cU/iOUSnDMlwWhe0QtTKsoUvhq+FsjAY0cFDhmwVlciuCFxQBO66NVslc2sX3ZkUg8QR0HWi8DI6xioi10kW/XcmK1OS12z4rn67/J/P08h3f7Tc01VXOj1VYZh/Bx9lihWGVCy7W1VQP2nkGqLYoVMuh/RmzPD3SAlUK0T09HE2Rj4TdME+h+YSeTPkZeZGfFZJhTt5WAIthgkIxDTIVwE3dLFMoFoGrLxB4U6FYQlAbFIpxS4LK0X9utsORpKGYBzYNRR7YNBR5YNNQ5IFNQ5EHNoVs1Irq2g/mW+QhD2zyNG39VvuqsQokankn/Q5N0HUfwmO6LvkL+vW9FSM/UTvAdaKxDboKZBhWBfS+apJh4iVw7j/cCz9Z5et52HuHFLXQwYXb5JZ5DP50QmOa3KJ/oKvEIiXWwEb5SOqgPkr9JnVjlyRTaTfY40d/A21Pql8pFMqtAle2vC2FdA14F2eclFIPbQslmUquwscJko7ytQZYHVTIWxUtMsyDe1XYCg2pcsv8FU7nyNJHqQxf0Shvdg7I8ABkx52m+xWTDMOqYJ/iYbEMW2iWt3U4LRrwLKQq95f75SH/RJr0F+/L8CO75G0mPCc3y0GOSzLLi1nSds7fKrdcFyvkzdTA5amSFL0BFiqgKT3UxUvS3b9x5mb5GNNB36bCnGXN8KmCeANaXno4f50T1wz5md7CgG2JCiK6vA+39qcVQEJlG3DkCd1ATpMLrtSmKLDo9Mm36x8kTsyI078hbvyMOYMeSlNASVlzBs26L0Gepu504ulU2XD5iF15GE+99Qs0KHYLfloL5CXzFH72jpBbTCM4Xs+9K23Q+AW10FcsD7lOaHhqUtqgO7NePAknR6rfJvg8Sd7yz3E1S9fYLtCxNEperBUuvo2SNMXFbvkZ18V+XfMRFMhPORRJstM2Wv5KIFuG4T3UyF/cMZol0yXeUQDR7ZTJUARjFEAxpCgZtq4O5BTbZVhL5+pANsBMTSKoJhk2E9QiTTwf1JcyvHc+qMf/BiaidyHImEZ5AAAAAElFTkSuQmCC)
}
.pg-evaluate .mod-tabs .con6 .item-r .list-item .ico3 {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAABOCAMAAABG1vXNAAAAAXNSR0IArs4c6QAAAqZQTFRFAAAAAAAAAAAAAAAAAAAAMzMzKysrJCQkICAgHBwcGhoaFxcXFRUVFBQUEhISIiIiICAgHh4eHBwcGxsbGhoaGBgYFxcXFhYWFRUVHR0dHBwcGxsbGhoaGRkZGRkZGBgYFxcXHR0dHBwcHBwcGxsbGhoaGRkZGBgYGBgYFxcXHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZHBwcHBwcGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGxsbGhoaGhoaGRkZGRkZGRkZGBgYHBwcGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGRkZGRkZGxsbGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGRkZGxsbGxsbGxsbGhoaGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGRkZGRkZGRkZGxsbGxsbGhoaGhoaGhoaGRkZGRkZGxsbGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGBgYGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGRkZGhoaGhoaGhoaGhoaGhoaGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGRkZGxsbGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGxsbGRkZGhoaGRkZGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaJuXLtAAAAOF0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBobHB0eHyAiIyQlJigpKissLS4vMDEyMzQ2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlbXF1fYGNkZWZnaGlqbG1vcHN1dnd6e3x9f4CBgoOEhYeJiouMjY6PkJGTlJeYmZqcnZ+goaKkpaanqKipqqusrq+wsrO0tba3uLq7vL2+v8HCw8TFxsfJysvMzs/Q0tPV1tfY2drc3d7f4OHi4+Tl5ufo6err7O3u7/Dw8fHy8/T19vf4+fr7/P3+qN2dfQAABIBJREFUeNrdmPlfVFUYhy+LBIgigkKoWba4VCYpmGFmWCIKoWimpYaSkaQSFphGhVRuRRlRuFSYEBahljmhFqAi+xYEM8oyM89/0mdmmOGcOyvzY9+f3uU+nzvnvOe859xRFO8UF+8lOOGQ8cZ4r8ikBmhd4AUYWQwcm+zNOy9D3XPeDXSl/mCwl3Ok3O/RU+FLVo9qLMObftKAoMWek2v7wTt0Vj+6vbFRkTaN8xj9ib5HHCYmuiOjIdNhYlHv676u0aXwuMPE71A9xyWaCNEOE7N/haGce7xBFd+MPqixe/HCLKuOQq7Nmakq+GnaI9RoFg6VoH5ufapijxq7LfpXq+2xWL0OUAfKotsuNvP/jo4LmzEt1G+saFjKR+W3zTUx1H6fuzzIY1T3o0Gu6d0zHqH+J81Pd5TmbVm7YmXa9g/KdOZAtvu+8BdQmx/vNxoKWn2kHfglziU4rQo4b/+Mb+p1oMjFSbGoGf5McjyO9Gb4Y4YzctMA+kw/Z9nxhdDqpK+9Dd0uj4Mdwwyuc5R4Ba495HoOl3Vyd6F9OG6Qmknu5v/hbprsGsf0Frpmua96gp7fguSQzwWGn/WkNb8Bn8qRjbBTjgStyS8+d+LgqkAVexTDXNEPqOeyjxgIO6AbWb/9eaESOrmb71Q/Q1reCZ1AQ/nX5Y1A21J12xMCEzs4J2a36jEcn282Y4qMDG+SRtLAhVHvNVggT2NTrM17uo0h6Yr0Kjxpc6rQiOPspFlcrA+00zJB8EMGOGS174V3hNR7GGKl0T0DOaJ/hhar+TLEjCYCtXymKkgJ3eKhvBWsx81hbguVSZIHbtJTsFxwIw1kjJgXpdccoNFup3ewT/Q1thXVy24hXkrXWbMSFUVJsZg9FMkDqBxZH5AmxM9b+2C6Za1YVCaiedx02Nq/orPELNO2T7SYPRwW0V3WLj8PxGJk0+ajHmsvb4r+dvQWYy6IPTBRWqNmvQDLpE7DsMW4D1YIcb8milXoKep95B3QZTEmwQYx8S7IDTUNqQSKsp/6EauLvWIi5G8GfhiduLSyAWrkpvItFSNWNV/InVwPBTbvBAyqbl5XKRyxPqZFvrelgDFFUSKiw8xbzJioOl4sNTdpvTzFiqLoaQ0y3S6/VJQputF9YptgrA17qpH9cnLYvAvNqHKEBhV6VohUcF2N7rCh+9Ro6BDvi2fGYs/RDPHCGtxElQpt1Gg0Wv7RaDRtKjSk1bpvzNoGyTIqSkZzQDyy/K9xVTxYPywQJW3zKC0l6kru8eTIUXy+YfhBOVSBcY0naDbkq0JTb9I/zz2ZaqTS7ovlMS31Ue7IGC11EfbhF43cmu+aTNY6+Wk7DejWuSL3GNE+7ziV1IcxN9AZGFEMNx51lp1TB7c2O/xwCn6rF36e4vwnhZ8Grqyyu3YFbWkEfUGAy5lYdsl0LT2WLHxQh28uNd0OTs12u1w21JrW7Z3KT3Zte2lj+u7jF/Umv3qJJwvGP7H4jnyV7iiMUzxVQHx2yZU+I+i7Ln2e+YSvMlb5hHj9F4Jb/Qfbt6tIIlhQ6gAAAABJRU5ErkJggg==);
background-size: 100% 100%;
height: 39px;
width: 29px
}
</style>

View File

@@ -0,0 +1,66 @@
<template>
<div class="mod-total"><h5>实验室已为超过 4000
家客户提供卓越的安全服务</h5><h6>即刻行动与实验室安全专家一同开启智能安全之旅</h6><a href="javascript:;" class="EASE btn">申请试用</a></div>
</template>
<script>
export default {
name: "ModTotal"
}
</script>
<style lang="scss" scoped>
.mod-total {
background-image: url(@/assets/v3/num-bg-wave.png);
background-position: 50%;
background-repeat: no-repeat;
background-size: 100% 100%;
min-height: 270px;
padding: 67px 0;
text-align: center
}
.mod-total h5 {
font-size: 28px;
letter-spacing: 1.7px;
line-height: 40px;
margin-bottom: 9px
}
.mod-total h5,.mod-total h6 {
color: #1a1a1a;
font-style: normal;
font-weight: 400
}
.mod-total h6 {
font-size: 16px;
letter-spacing: 1px;
line-height: 22px;
margin-bottom: 29px
}
.mod-total .btn {
background: #4bad52;
border: 1px solid #4bad52;
border-radius: 6px;
color: #fff;
display: inline-block;
font-size: 14px;
font-style: normal;
font-weight: 400;
height: 34px;
letter-spacing: .5px;
line-height: 32px;
margin: 0 30px;
padding: 0 20px;
text-align: center
}
.mod-total .btn:hover {
background-color: #7aba4a;
border-color: #7aba4a;
color: #fff
}
</style>

View File

@@ -0,0 +1,50 @@
<template>
<div class="secondEdition">
<div class="product-content pg-evaluate">
<ModBanner />
<div class="component-box">
<Product4 />
</div>
<ModTotal />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import ModBanner from './ModBanner.vue';
import ModTabs from './ModTabs.vue';
import ModTotal from './ModTotal.vue';
import Product1 from '@/views/Jyh/Home/component/ComProject/product1.vue'
import Product2 from '@/views/Jyh/Home/component/ComProject/product2.vue'
import Product3 from '@/views/Jyh/Home/component/ComProject/product3.vue'
import Product4 from '@/views/Jyh/Home/component/ComProject/product4.vue'
const activeTab = ref<string | number>('');
// 解析URL参数的方法
const getUrlParam = (paramName: string): string | null => {
// 获取当前URL的查询参数
const searchParams = new URLSearchParams(window.location.search);
// 返回指定参数的值
return searchParams.get(paramName);
};
onMounted(() => {
// 获取url中tab参数的值
const tabParam = getUrlParam('tab');
if (tabParam) {
activeTab.value = /^\d+$/.test(tabParam) ? Number(tabParam) : tabParam;
} else {
activeTab.value = 0;
}
});
</script>
<style lang="scss" scoped>
.product-content {
background-color: #fafafa;
color: #333;
}
</style>

View File

@@ -0,0 +1,41 @@
<template>
<div class="pg-evaluate">
<ModBanner />
<ModTabs :defaultTab="activeTab" />
<ModTotal />
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import ModBanner from './ModBanner.vue';
import ModTabs from './ModTabs.vue';
import ModTotal from './ModTotal.vue';
const activeTab = ref<string | number>('');
// 解析URL参数的方法
const getUrlParam = (paramName: string): string | null => {
// 获取当前URL的查询参数
const searchParams = new URLSearchParams(window.location.search);
// 返回指定参数的值
return searchParams.get(paramName);
};
onMounted(() => {
// 获取url中tab参数的值
const tabParam = getUrlParam('tab');
if (tabParam) {
activeTab.value = /^\d+$/.test(tabParam) ? Number(tabParam) : tabParam;
} else {
activeTab.value = 0;
}
});
</script>
<style lang="scss" scoped>
.pg-evaluate {
background-color: #fafafa;
color: #333;
}
</style>

View File

@@ -0,0 +1,22 @@
<template>
<div class="pg-evaluate">
<ModBanner />
<ModContent />
<ModTotal />
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import ModBanner from './ModBanner.vue';
import ModContent from './ModContent.vue';
import ModTotal from './ModTotal.vue';
</script>
<style lang="scss" scoped>
.pg-evaluate {
background-color: #fafafa;
color: #333;
}
</style>

View File

@@ -0,0 +1,41 @@
<template>
<div class="pg-evaluate">
<ModBanner />
<ModTabs :defaultTab="activeTab" />
<ModTotal />
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import ModBanner from './ModBanner.vue';
import ModTabs from './ModTabs.vue';
import ModTotal from './ModTotal.vue';
const activeTab = ref<string | number>('');
// 解析URL参数的方法
const getUrlParam = (paramName: string): string | null => {
// 获取当前URL的查询参数
const searchParams = new URLSearchParams(window.location.search);
// 返回指定参数的值
return searchParams.get(paramName);
};
onMounted(() => {
// 获取url中tab参数的值
const tabParam = getUrlParam('tab');
if (tabParam) {
activeTab.value = /^\d+$/.test(tabParam) ? Number(tabParam) : tabParam;
} else {
activeTab.value = '1';
}
});
</script>
<style lang="scss" scoped>
.pg-evaluate {
background-color: #fafafa;
color: #333;
}
</style>

View File

@@ -0,0 +1,217 @@
<template>
<div class="situation-main-container">
<header class="header-section">
<div class="title-wrapper">
<h1 class="main-title">态势感知中心</h1>
<div class="sub-title-container">
<div class="title-line left"></div>
<p class="sub-title">连接全球风险数据与开源生态价值的双模态视图</p>
<div class="title-line right"></div>
</div>
</div>
</header>
<div ref="sentinelRef" class="sentinel"></div>
<nav class="tabs-nav" :class="{ 'is-fixed': isFixed }">
<div
v-for="tab in tabs"
:key="tab.id"
class="tab-item"
:class="{ active: activeTab === tab.id }"
@click="activeTab = tab.id"
>
<span class="tab-icon"><i :class="tab.icon"></i></span>
<span class="tab-text">{{ tab.label }}</span>
<div class="active-bar"></div>
</div>
</nav>
<main class="content-wrapper">
<transition name="fade-scale" mode="out-in">
<RiskMonitor v-if="activeTab === 'risk'" />
<EcoValuePan v-else-if="activeTab === 'eco'" />
<Community v-else-if="activeTab === 'whky'" />
</transition>
</main>
</div>
</template>
<script setup>
import { ref,onMounted,onUnmounted } from 'vue';
import RiskMonitor from '@/views/Jyh/security/index.vue';
import EcoValuePan from '@/views/Jyh/ecosystem/index.vue';
import Community from '@/views/Jyh/Community/index.vue';
const activeTab = ref('risk');
const tabs = [
{ id: 'risk', label: '全球开源风险态势感知监控中心', icon: 'fas fa-shield-virus' },
{ id: 'eco', label: '开源生态与贡献价值全景', icon: 'fas fa-chart-network' },
{ id: 'whky', label: '武汉市开源生态建设', icon: 'fas fa-chart-network' },
];
const isFixed = ref(false);
const sentinelRef = ref(null);
let observer = null;
onMounted(() => {
// 交叉观察者逻辑
observer = new IntersectionObserver(([entry]) => {
// entry.boundingClientRect.top < 0 表示哨兵已经滚到了视口上方以外
// !entry.isIntersecting 表示哨兵不再可见
isFixed.value = !entry.isIntersecting && entry.boundingClientRect.top < 0;
}, {
threshold: [0, 1],
rootMargin: '-1px 0px 0px 0px' // 触发微调
});
if (sentinelRef.value) {
observer.observe(sentinelRef.value);
}
});
onUnmounted(() => {
if (observer) observer.disconnect();
});
</script>
<style lang="scss" scoped>
.situation-main-container {
min-height: 100vh;
background: #020617; /* 深蓝黑底色 */
color: #fff;
padding: 20px;
display: block;
flex-direction: column;
}
/* 头部标题样式 */
.header-section {
text-align: center;
margin-bottom: 30px;
.main-title {
font-size: 2.5rem;
font-weight: 800;
letter-spacing: 4px;
background: linear-gradient(to bottom, #fff 30%, #38bdf8 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 10px;
}
.sub-title-container {
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
.sub-title {
font-size: 1rem;
color: #94a3b8;
text-transform: uppercase;
letter-spacing: 2px;
}
.title-line {
width: 100px;
height: 1px;
background: linear-gradient(to right, transparent, #38bdf8, transparent);
&.left { transform: rotate(0deg); }
&.right { transform: rotate(0deg); }
}
}
}
.sentinel {
height: 1px;
width: 100%;
visibility: hidden;
}
.nav-placeholder {
height: 60px; /* 需与你的 tabs-nav 实际高度一致 */
}
/* 科技 Tabs 样式 */
.tabs-nav {
display: flex;
justify-content: center;
gap: 40px;
border-bottom: 1px solid rgba(56, 189, 248, 0.1);
background: #020617;
transition: all 0.3s;
height: 60px; /* 固定高度方便占位 */
&.is-fixed {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 2000;
padding: 0 20px;
background: rgba(2, 6, 23, 0.95);
backdrop-filter: blur(10px);
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
border-bottom: 1px solid rgba(56, 189, 248, 0.3);
animation: slideDown 0.4s ease-out; /* 可选:增加下滑动效 */
}
.tab-item {
position: relative;
padding: 15px 30px;
cursor: pointer;
transition: all 0.3s;
color: #64748b;
display: flex;
align-items: center;
gap: 10px;
&:hover {
color: #38bdf8;
}
&.active {
color: #fff;
text-shadow: 0 0 10px rgba(56, 189, 248, 0.5);
.active-bar {
width: 100%;
opacity: 1;
}
}
.active-bar {
position: absolute;
bottom: -1px;
left: 0;
width: 0;
height: 3px;
background: #38bdf8;
box-shadow: 0 0 15px #38bdf8;
transition: all 0.4s ease;
opacity: 0;
}
.tab-text {
font-weight: 600;
font-size: 1.1rem;
}
}
}
.content-wrapper {
flex: 1;
position: relative;
}
/* 切换动画 */
.fade-scale-enter-active, .fade-scale-leave-active {
transition: all 0.4s ease;
}
.fade-scale-enter-from {
opacity: 0;
transform: scale(0.98);
}
.fade-scale-leave-to {
opacity: 0;
transform: scale(1.02);
}
</style>

View File

@@ -0,0 +1,180 @@
<template>
<div class="partner-swiper-container">
<swiper
class="swiper"
:modules="modules"
:slides-per-view="1"
:effect="'fade'"
:fadeEffect="{ crossFade: true }"
:loop="false"
:autoplay="{ delay: 3000, disableOnInteraction: false }"
:speed="3000"
>
<swiper-slide class="slide bigscreen3" @click="handleSlideClick('kxky')">
<!-- <div class="slide-content">-->
<!-- <h2>可信开源态势感知中心</h2>-->
<!-- <p>携手共建安全新生态</p>-->
<!-- </div>-->
<iframe src="http://222.20.126.217:10010/bigScreen/#/kxky" style="height: 100%;width: 100%" loading="lazy"></iframe>
</swiper-slide>
<swiper-slide class="slide bigscreen2" @click="handleSlideClick('page1')">
<!-- <div class="slide-content">-->
<!-- <h2>全球开源风险态势感知监控中心</h2>-->
<!-- <p>金银湖实验室与您共同成长</p>-->
<!-- </div>-->
<iframe src="http://222.20.126.217:10010/bigScreen/#/security-situation-awareness" style="height: 100%;width: 100%" loading="lazy"></iframe>
</swiper-slide>
<swiper-slide class="slide bigscreen1" @click="handleSlideClick('page2')">
<!-- <div class="slide-content">-->
<!-- <h2>开源生态与贡献价值全景</h2>-->
<!-- <p>携手共建安全新生态</p>-->
<!-- </div>-->
<iframe src="http://222.20.126.217:10010/bigScreen/#/ecosystem-and-contribution" style="height: 100%;width: 100%" loading="lazy"></iframe>
</swiper-slide>
</swiper>
</div>
</template>
<script setup>
import { ref,onMounted,onUnmounted } from 'vue';
import { Swiper, SwiperSlide } from "swiper/vue";
import { Autoplay, EffectFade } from 'swiper/modules';
import { useRouter } from 'vue-router';
import "swiper/css";
import "swiper/css/autoplay";
import 'swiper/css/effect-fade'; // 渐变效果样式
const swiperRef = ref(null); // Swiper实例引用
let autoplayTimer = null; // 自定义自动轮播定时器
const modules = [Autoplay, EffectFade];
const router = useRouter();
const handleSlideClick = (pageType) => {
switch(pageType) {
case 'page1':
window.open('http://222.20.126.217:10010/bigScreen/#/security-situation-awareness');
break;
case 'page2':
window.open('http://222.20.126.217:10010/bigScreen/#/ecosystem-and-contribution');
break;
case 'kxky':
window.open('http://222.20.126.217:10010/bigScreen/#/kxky');
break;
default:
break;
}
};
const iframeSrcs = {
kxky: 'http://localhost:8080/#/kxky',
page1: 'http://localhost:8080/#/security-situation-awareness',
page2: 'http://localhost:8080/#/ecosystem-and-contribution'
};
// 标记iframe是否已加载用于延迟加载
const iframeLoaded = ref({
kxky: false, // 初始加载第一个
page1: false,
page2: false
});
// 监听slide切换加载对应iframe
const onSlideChange = () => {
const swiper = swiperRef.value.swiper;
const activeIndex = swiper.activeIndex;
const keys = Object.keys(iframeLoaded.value);
iframeLoaded.value[keys[activeIndex]] = true; // 切换时加载
};
// 自定义循环轮播替代Swiper的loop
const initCustomLoop = () => {
// 清除原有定时器
if (autoplayTimer) clearInterval(autoplayTimer);
const swiper = swiperRef.value.swiper;
const maxIndex = swiper.slides.length - 1;
// 3000ms轮播一次和原autoplay.delay一致
autoplayTimer = setInterval(() => {
let nextIndex = swiper.activeIndex + 1;
if (nextIndex > maxIndex) nextIndex = 0; // 切回第一张
swiper.slideTo(nextIndex, 800); // 800ms切换速度和Swiper的speed一致
}, 3000);
};
onMounted(() => {
// 初始加载第一个iframe
iframeLoaded.value.kxky = true;
// 等待Swiper初始化完成后启动自定义循环
setTimeout(() => {
initCustomLoop();
}, 100);
});
onUnmounted(() => {
// 组件销毁时清除定时器
if (autoplayTimer) clearInterval(autoplayTimer);
});
</script>
<style scoped>
.partner-swiper-container {
/*width: 100vw;*/
/*height: 100vh;*/
width: 100%;
height: 100%;
background: #0f172a;
overflow: hidden;
position: relative;
}
.swiper {
width: 100%;
height: 100%;
}
.slide {
display: flex;
align-items: center;
justify-content: center;
/*background: url(@/assets/v3/bigscreen/bigscreen1.png) center/cover no-repeat;*/
cursor: pointer;
}
.bigscreen1 {
background: url(@/assets/v3/bigscreen/bigscreen1.png) center/cover no-repeat;
}
.bigscreen2 {
background: url(@/assets/v3/bigscreen/bigscreen2.png) center/cover no-repeat;
}
.bigscreen3 {
background: url(@/assets/v3/bigscreen/bigscreen3.png) center/cover no-repeat;
}
.slide-content {
text-align: center;
color: #fff;
padding: 2rem;
}
.slide-content h2 {
font-size: 3rem;
margin-bottom: 1rem;
position: relative;
}
.slide-content h2::after {
content: "";
display: block;
width: 5rem;
height: 2px;
background: #38bdf8;
margin: 0.5rem auto 0;
}
.slide-content p {
font-size: 1.2rem;
color: rgba(255, 255, 255, 0.8);
}
</style>

View File

@@ -0,0 +1,581 @@
<template>
<div class="report-detail">
<!-- 报告头部信息 -->
<div class="report-header">
<div class="risk-level">
<d-tag :color="getRiskColor(reportData.riskLevel)" size="lg">
{{ reportData.riskLevel || '无风险' }}
</d-tag>
</div>
<div class="report-title">
<h2>安全检测报告 - {{ reportData.target }}</h2>
<p class="report-time">生成时间{{ formatTime(reportData.completeTime) }}</p>
</div>
<div class="report-actions">
<d-button variant="text" @click="copyReportLink">
<i class="fa fa-link mr-1"></i> 复制报告链接
</d-button>
<d-button variant="text" @click="downloadReport">
<i class="fa fa-download mr-1"></i> 下载报告
</d-button>
</div>
</div>
<!-- 基本信息卡片 -->
<d-card class="report-card mt-4">
<div slot="header" class="card-header">基本信息</div>
<d-descriptions column="2" bordered>
<d-description-item term="任务ID">{{ reportData.taskId || '--' }}</d-description-item>
<d-description-item term="检测类型">{{ getTypeText(reportData.type) }}</d-description-item>
<d-description-item term="检测目标">{{ reportData.target || '--' }}</d-description-item>
<d-description-item term="文件大小" v-if="reportData.type === 'file'">
{{ reportData.fileSize ? formatFileSize(reportData.fileSize) : '--' }}
</d-description-item>
<d-description-item term="开始时间">{{ formatTime(reportData.startTime) || '--' }}</d-description-item>
<d-description-item term="完成时间">{{ formatTime(reportData.completeTime) || '--' }}</d-description-item>
<d-description-item term="检测时长">{{ formatDuration(reportData.duration) || '--' }}</d-description-item>
<d-description-item term="检测项总数">{{ reportData.totalChecks || 0 }} </d-description-item>
</d-descriptions>
</d-card>
<!-- 风险概览卡片 -->
<d-card class="report-card mt-4">
<div slot="header" class="card-header">风险概览</div>
<div class="risk-overview">
<div class="risk-stats">
<div class="risk-stat-item">
<div class="stat-value">{{ reportData.riskStats?.critical || 0 }}</div>
<div class="stat-label">
<d-tag color="#c7000b" size="sm">致命漏洞</d-tag>
</div>
</div>
<div class="risk-stat-item">
<div class="stat-value">{{ reportData.riskStats?.high || 0 }}</div>
<div class="stat-label">
<d-tag color="#f66f6a" size="sm">高危漏洞</d-tag>
</div>
</div>
<div class="risk-stat-item">
<div class="stat-value">{{ reportData.riskStats?.medium || 0 }}</div>
<div class="stat-label">
<d-tag color="#fac20a" size="sm">中危漏洞</d-tag>
</div>
</div>
<div class="risk-stat-item">
<div class="stat-value">{{ reportData.riskStats?.low || 0 }}</div>
<div class="stat-label">
<d-tag color="#5e7ce0" size="sm">低危漏洞</d-tag>
</div>
</div>
</div>
<div class="risk-chart">
<!-- 使用 DChart 组件实现饼图 -->
<d-chart :option="riskChartOption" style="width: 100%; height: 200px"></d-chart>
</div>
</div>
</d-card>
<!-- 漏洞详情卡片 -->
<d-card class="report-card mt-4">
<div slot="header" class="card-header">漏洞详情</div>
<d-table
:data="vulnerabilities"
:show-loading="loading"
table-layout="auto"
>
<d-column field="vulnId" header="漏洞编号" :width="160"></d-column>
<d-column field="vulnName" header="漏洞名称"></d-column>
<d-column field="severity" header="风险等级">
<template #default="scope">
<d-tag :color="getSeverityColor(scope.row.severity)">{{ getSeverityText(scope.row.severity) }}</d-tag>
</template>
</d-column>
<d-column field="affectedComponents" header="受影响组件" :width="200">
<template #default="scope">
<div class="affected-components">
<span v-for="(comp, idx) in scope.row.affectedComponents" :key="idx">
{{ comp.name }}@{{ comp.version }}
<template v-if="idx < scope.row.affectedComponents.length - 1">, </template>
</span>
</div>
</template>
</d-column>
<d-column header="操作" :width="120">
<template #default="scope">
<d-button
variant="text"
size="sm"
@click="showVulnDetail(scope.row)"
>
详情
</d-button>
</template>
</d-column>
</d-table>
</d-card>
<!-- 修复建议卡片 -->
<d-card class="report-card mt-4">
<div slot="header" class="card-header">修复建议</div>
<div class="fix-suggestions">
<div v-if="reportData.fixSuggestions && reportData.fixSuggestions.length">
<div class="suggestion-item" v-for="(item, idx) in reportData.fixSuggestions" :key="idx">
<h4 class="suggestion-title">
<i class="fa fa-lightbulb-o text-warning mr-2"></i>
建议 {{ idx + 1 }}: {{ item.title }}
</h4>
<p class="suggestion-content">{{ item.content }}</p>
<a
v-if="item.reference"
:href="item.reference"
target="_blank"
class="suggestion-link"
>
查看详细指南 <i class="fa fa-external-link ml-1"></i>
</a>
</div>
</div>
<div v-else class="no-suggestions">
未发现需要修复的问题或暂无具体修复建议
</div>
</div>
</d-card>
<!-- 底部操作区 -->
<div class="report-footer mt-6">
<d-button @click="$emit('close')" variant="secondary">关闭</d-button>
<d-button @click="rescan" class="ml-2">重新检测</d-button>
</div>
<!-- 漏洞详情弹窗 -->
<d-modal
v-model="vulnDetailVisible"
title="漏洞详情"
:width="700"
>
<div v-if="currentVuln" class="vuln-detail-modal">
<div class="vuln-detail-header">
<h3>{{ currentVuln.vulnName }}</h3>
<d-tag :color="getSeverityColor(currentVuln.severity)">{{ getSeverityText(currentVuln.severity) }}</d-tag>
</div>
<div class="vuln-detail-content mt-4">
<div class="vuln-section">
<h4 class="section-title">漏洞描述</h4>
<p class="section-content">{{ currentVuln.description || '无详细描述' }}</p>
</div>
<div class="vuln-section mt-3">
<h4 class="section-title">受影响组件</h4>
<ul class="section-list">
<li v-for="(comp, idx) in currentVuln.affectedComponents" :key="idx">
{{ comp.name }} (版本: {{ comp.version }}) - 路径: {{ comp.path || '未知' }}
</li>
</ul>
</div>
<div class="vuln-section mt-3">
<h4 class="section-title">修复建议</h4>
<p class="section-content">{{ currentVuln.fixSuggestion || '暂无具体修复建议' }}</p>
</div>
<div class="vuln-section mt-3">
<h4 class="section-title">参考信息</h4>
<div class="section-content">
<p v-if="currentVuln.cveId">CVE: {{ currentVuln.cveId }}</p>
<p v-if="currentVuln.cnnvdId">CNNVD: {{ currentVuln.cnnvdId }}</p>
<a
v-if="currentVuln.referenceUrl"
:href="currentVuln.referenceUrl"
target="_blank"
class="reference-link"
>
官方漏洞详情 <i class="fa fa-external-link ml-1"></i>
</a>
</div>
</div>
</div>
</div>
</d-modal>
</div>
</template>
<script setup lang="ts">
import { ref, computed, onMounted, watch } from 'vue';
import dayjs from 'dayjs';
import duration from 'dayjs/plugin/duration';
// import { useToast } from 'devui';
import { DChart } from 'vue-devui/echarts'; // 引入 DChart 组件
// 引入dayjs duration插件
dayjs.extend(duration);
// 接收父组件传入的报告数据
const props = defineProps({
reportData: {
type: Object,
required: true
}
});
// 组件内部状态
const loading = ref(false);
const vulnDetailVisible = ref(false);
const currentVuln = ref(null);
const toast = useToast();
// 漏洞列表数据(从报告数据中提取)
const vulnerabilities = ref(props.reportData.vulnerabilities || []);
// 显示漏洞详情
const showVulnDetail = (vuln) => {
currentVuln.value = vuln;
vulnDetailVisible.value = true;
};
// 重新检测
const rescan = () => {
$emit('close');
$emit('rescan', props.reportData);
};
// 复制报告链接
const copyReportLink = () => {
const dummyLink = `${window.location.origin}/scan/report/${props.reportData.taskId}`;
navigator.clipboard.writeText(dummyLink).then(() => {
toast.success({ content: '报告链接已复制到剪贴板', duration: 2000 });
}).catch(() => {
toast.error({ content: '复制失败,请手动复制', duration: 2000 });
});
};
// 下载报告
const downloadReport = () => {
toast.info({ content: '准备下载报告...', duration: 2000 });
};
// 格式化时间
const formatTime = (time) => {
return time ? dayjs(time).format('YYYY-MM-DD HH:mm:ss') : '--';
};
// 格式化文件大小
const formatFileSize = (bytes) => {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
};
// 格式化时长
const formatDuration = (ms) => {
if (!ms) return '--';
const d = dayjs.duration(ms, 'milliseconds');
return `${d.minutes()}${d.seconds()}`;
};
// 风险等级颜色映射
const getRiskColor = (level) => {
const colorMap = {
'致命': '#c7000b',
'高危': '#f66f6a',
'中危': '#fac20a',
'低危': '#5e7ce0',
'无风险': '#00b42a'
};
return colorMap[level] || 'default';
};
// 检测类型文本映射
const getTypeText = (type) => {
const typeMap = {
'file': '文件上传',
'url': 'URL地址',
'sbom': 'SBOM内容'
};
return typeMap[type] || type;
};
// 漏洞严重程度文本映射
const getSeverityText = (severity) => {
const severityMap = {
'critical': '致命',
'high': '高危',
'medium': '中危',
'low': '低危'
};
return severityMap[severity] || severity;
};
// 漏洞严重程度颜色映射
const getSeverityColor = (severity) => {
const colorMap = {
'critical': '#c7000b',
'high': '#f66f6a',
'medium': '#fac20a',
'low': '#5e7ce0'
};
return colorMap[severity] || 'default';
};
// 风险图表配置(基于 echarts 格式)
const riskChartOption = computed(() => {
const riskStats = props.reportData.riskStats || {
critical: 0,
high: 0,
medium: 0,
low: 0
};
// 转换为 echarts 所需的数据格式
const chartData = [
{ name: '致命漏洞', value: riskStats.critical, itemStyle: { color: '#c7000b' } },
{ name: '高危漏洞', value: riskStats.high, itemStyle: { color: '#f66f6a' } },
{ name: '中危漏洞', value: riskStats.medium, itemStyle: { color: '#fac20a' } },
{ name: '低危漏洞', value: riskStats.low, itemStyle: { color: '#5e7ce0' } }
].filter(item => item.value > 0); // 过滤掉数量为0的项
return {
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b}: {c} ({d}%)'
},
legend: {
orient: 'vertical',
right: 10,
top: 'center',
textStyle: {
fontSize: 12
}
},
series: [
{
name: '漏洞数量',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 4,
borderColor: '#fff',
borderWidth: 2
},
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: 16,
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: chartData
}
]
};
});
// 监听报告数据变化,更新漏洞列表
watch(() => props.reportData, () => {
vulnerabilities.value = props.reportData.vulnerabilities || [];
});
// 定义组件输出事件
const emit = defineEmits(['close', 'rescan']);
</script>
<style scoped lang="scss">
@import 'devui-theme/styles-var/devui-var.scss';
.report-detail {
padding: 16px;
max-height: 80vh;
overflow-y: auto;
}
.report-header {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 16px;
}
.risk-level {
padding: 4px 0;
}
.report-title {
flex: 1;
min-width: 200px;
.report-time {
color: var(--devui-text-secondary);
margin-top: 4px;
font-size: 14px;
}
}
.report-actions {
display: flex;
gap: 8px;
}
.report-card {
--devui-card-padding: 16px;
}
.card-header {
font-size: 16px;
font-weight: 600;
color: var(--devui-text-primary);
}
.risk-overview {
display: flex;
flex-wrap: wrap;
gap: 20px;
align-items: center;
padding: 10px 0;
.risk-stats {
display: flex;
gap: 24px;
flex-wrap: wrap;
flex: 1;
min-width: 300px;
.risk-stat-item {
text-align: center;
.stat-value {
font-size: 28px;
font-weight: bold;
color: var(--devui-text-primary);
line-height: 1.2;
}
.stat-label {
margin-top: 8px;
}
}
}
.risk-chart {
flex: 1;
min-width: 300px;
height: 200px;
}
}
.affected-components {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.fix-suggestions {
padding: 8px 0;
.suggestion-item {
margin-bottom: 16px;
padding-bottom: 16px;
border-bottom: 1px dashed var(--devui-border);
&:last-child {
border-bottom: none;
margin-bottom: 0;
padding-bottom: 0;
}
.suggestion-title {
font-weight: 600;
color: var(--devui-text-primary);
margin-bottom: 8px;
}
.suggestion-content {
color: var(--devui-text-secondary);
line-height: 1.6;
margin-bottom: 8px;
}
.suggestion-link {
color: var(--devui-primary);
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
.no-suggestions {
color: var(--devui-text-secondary);
text-align: center;
padding: 20px 0;
}
}
.report-footer {
display: flex;
justify-content: flex-end;
}
.vuln-detail-modal {
max-height: 500px;
overflow-y: auto;
padding-right: 8px;
}
.vuln-detail-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
}
.vuln-section {
padding: 8px 0;
.section-title {
font-weight: 600;
margin-bottom: 8px;
color: var(--devui-text-primary);
display: flex;
align-items: center;
}
.section-content {
color: var(--devui-text-secondary);
line-height: 1.6;
}
.section-list {
color: var(--devui-text-secondary);
padding-left: 20px;
li {
margin-bottom: 4px;
line-height: 1.5;
}
}
.reference-link {
color: var(--devui-primary);
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
::v-deep .devui-descriptions {
margin-top: 8px;
}
::v-deep .devui-table {
margin-top: 8px;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,568 @@
<template>
<div class="threat-page">
<header class="page-header">
<div class="header-content">
<h1 class="page-title">威胁情报库</h1>
<div class="main-search-wrapper">
<div class="search-input-group">
<input
v-model="mainKeyword"
type="text"
placeholder="搜索关键字IP地址 域名 恶意文件哈希"
class="main-search-input"
/>
<button class="search-icon-btn">
<i class="icon-search d-icon icon-search"></i>
</button>
</div>
</div>
</div>
<div class="header-illustration">
<div class="shield-graphic"></div>
</div>
</header>
<main class="main-container">
<div class="content-layout">
<div class="list-column">
<div class="threat-list">
<div
v-for="(item, index) in threatList"
:key="index"
class="threat-card vuln-card"
:class="getCardBorderClass(item.severity)"
>
<div class="card-top">
<h3 class="threat-title vuln-title">{{ item.title }}</h3>
<div class="threat-icon-wrapper vuln-icon-wrapper" :class="item.iconType">
<i class="d-icon" :class="item.iconClass"></i>
</div>
</div>
<div class="card-meta">
<span class="indicator-tag cnnvd-tag">
{{ item.indicatorType }}{{ item.indicatorValue }}
</span>
<span
v-if="item.severity"
class="severity-tag level-tag"
:class="getLevelClass(item.severity)"
>
{{ item.severity }}
</span>
</div>
<div class="card-footer">
<span class="date-item">首次发现{{ item.firstSeen }}</span>
<span class="date-item">最后活动{{ item.lastActivity }}</span>
</div>
</div>
</div>
<div class="pagination-wrapper">
<d-pagination
:total="125678"
:page-size="10"
:page-index="1"
show-page-selector
></d-pagination>
</div>
</div>
<div class="sidebar-column">
<div class="filter-card">
<div class="filter-header">高级筛选</div>
<div class="filter-body-expanded">
<div class="filter-item">
<label>威胁等级</label>
<d-select v-model="filter.severity" placeholder="请选择" :options="severityOptions"></d-select>
</div>
<div class="filter-item">
<label>情报类型</label>
<d-select v-model="filter.type" placeholder="请选择" :options="threatTypeOptions"></d-select>
</div>
<div v-if="!isFilterCollapsed" class="filter-item">
<label>所属组织</label>
<d-input v-model="filter.organization" placeholder="APT组织名称"></d-input>
</div>
<div class="filter-item">
<label>活动时间</label>
<d-select v-model="filter.dateType" placeholder="时间类型" :options="dateTypeOptions"></d-select>
</div>
<div v-if="!isFilterCollapsed" class="filter-item">
<label>查询时间</label>
<div class="date-range-mock">
<input placeholder="开始日期" class="date-input"/>
<span class="separator">-</span>
<input placeholder="结束日期" class="date-input"/>
</div>
</div>
<div class="filter-actions">
<d-button variant="solid" color="primary" class="confirm-btn">查询</d-button>
<d-button class="reset-btn">重置</d-button>
</div>
</div>
<div class="collapse-link">
<a href="#" @click.prevent="isFilterCollapsed = !isFilterCollapsed">
{{ isFilterCollapsed ? '展开' : '收起' }}
<i class="d-icon" :class="isFilterCollapsed ? 'icon-chevron-down-2' : 'icon-chevron-up-2'"></i>
</a>
</div>
</div>
<d-button class="download-btn" variant="solid" color="primary" icon="icon-download">
<i class="d-icon icon-download"></i> 导出情报数据
</d-button>
</div>
</div>
</main>
</div>
</template>
<script setup>
import {ref} from 'vue';
const mainKeyword = ref('');
const isFilterCollapsed = ref(false);
// 模拟威胁情报数据
const threatList = ref([
{
title: '针对金融行业的钓鱼活动C2: 192.168.1.1',
severity: '危急',
indicatorType: 'IP',
indicatorValue: '192.168.1.1',
firstSeen: '2025-11-20',
lastActivity: '2025-12-04',
iconType: 'red',
iconClass: 'icon-lock-private', // 模拟一个红色锁图标
},
{
title: 'APT-XYZ组织最新使用的恶意域名',
severity: '高危',
indicatorType: 'Domain',
indicatorValue: 'evil-updates.com',
firstSeen: '2025-12-01',
lastActivity: '2025-12-05',
iconType: 'orange',
iconClass: 'icon-lock-private',
},
{
title: '新型勒索软件变种Ransom.VariantA',
severity: '中危',
indicatorType: 'Hash',
indicatorValue: 'A1B2C3D4E5F67890',
firstSeen: '2025-12-03',
lastActivity: '2025-12-05',
iconType: 'yellow',
iconClass: 'icon-lock-private',
},
{
title: '僵尸网络C&C服务器更新',
severity: '中危',
indicatorType: 'IP',
indicatorValue: '203.0.113.44',
firstSeen: '2025-12-04',
lastActivity: '2025-12-04',
iconType: 'yellow',
iconClass: 'icon-lock-private',
},
{
title: '普通信息泄漏警告',
severity: '低危',
indicatorType: 'URL',
indicatorValue: 'example.com/login',
firstSeen: '2025-12-05',
lastActivity: '2025-12-05',
iconType: 'blue',
iconClass: 'icon-lock-private',
},
]);
// 筛选表单数据
const filter = ref({
severity: '',
type: '',
organization: '',
dateType: '首次发现',
});
const severityOptions = [
{label: '危急', value: 'critical'},
{label: '高危', value: 'high'},
{label: '中危', value: 'medium'},
{label: '低危', value: 'low'}
];
const threatTypeOptions = [
{label: '恶意IP', value: 'ip'},
{label: '恶意域名', value: 'domain'},
{label: '恶意文件哈希', value: 'hash'}
];
const dateTypeOptions = [
{label: '首次发现', value: 'first'},
{label: '最后活动', value: 'last'}
];
// 辅助函数:获取标签颜色类
const getLevelClass = (severity) => {
if (severity === '危急') return 'tag-critical';
if (severity === '高危') return 'tag-high';
if (severity === '中危') return 'tag-medium';
return 'tag-low';
};
// 辅助函数:获取卡片左边框颜色类
const getCardBorderClass = (severity) => {
if (severity === '危急') return 'border-critical';
if (severity === '高危') return 'border-high';
if (severity === '中危') return 'border-medium';
return 'border-low';
};
const highlightKeyword = (text) => {
return text;
};
</script>
<style lang="scss" scoped>
.threat-page {
background-color: #f0f2f5;
min-height: 100vh;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
color: #333;
}
.page-header {
background-color: #0f1724;
padding: 60px 0 100px;
position: relative;
overflow: hidden;
text-align: center;
/* 假设背景图路径正确 */
background-image: url(@/assets/v3/louDong_back.4bfd0a5.png);
}
.page-title {
color: #fff;
font-size: 36px;
font-weight: 500;
margin-bottom: 30px;
letter-spacing: 2px;
}
.main-search-wrapper {
max-width: 800px;
margin: 0 auto;
}
.search-input-group {
display: flex;
background-color: #fff;
border-radius: 4px;
overflow: hidden;
height: 50px;
}
.main-search-input {
flex: 1;
border: none;
outline: none;
padding: 0 20px;
font-size: 14px;
color: #333;
}
.search-icon-btn {
width: 50px;
background: none;
border: none;
cursor: pointer;
color: #3d7fff;
font-size: 18px;
display: flex;
align-items: center;
justify-content: center;
}
.header-illustration {
position: absolute;
top: 0;
right: 0;
height: 100%;
width: 400px;
background: radial-gradient(circle at 70% 50%, rgba(61, 127, 255, 0.1), transparent 60%);
pointer-events: none;
z-index: 1;
}
.main-container {
max-width: 1300px;
margin: 40px auto;
position: relative;
z-index: 10;
padding: 0 20px;
}
.content-layout {
display: flex;
gap: 20px;
align-items: flex-start;
}
.list-column {
flex: 1;
}
.sidebar-column {
width: 320px;
flex-shrink: 0;
}
.threat-card {
background-color: #fff;
margin-bottom: 16px;
padding: 20px;
border-radius: 4px;
transition: all 0.3s ease;
cursor: pointer;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.04);
}
.threat-card:hover {
transform: translateY(-5px);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
}
.threat-card.border-low {
border-left: 4px solid #3d7fff;
}
/* 蓝色 (低危) */
.threat-card.border-medium {
border-left: 4px solid #feca57;
}
/* 黄色 (中危) */
.threat-card.border-high {
border-left: 4px solid #ff9f43;
}
/* 橙色 (高危) */
.threat-card.border-critical {
border-left: 4px solid #ff4757;
}
/* 红色 (危急) */
.card-top {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 10px;
}
.threat-title {
font-size: 16px;
font-weight: 600;
color: #333;
margin: 0;
line-height: 1.4;
}
.threat-title:hover {
color: #3d7fff;
}
.threat-icon-wrapper {
width: 32px;
height: 32px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-left: 15px;
flex-shrink: 0;
}
.threat-icon-wrapper.blue {
background-color: #e6f7ff;
color: #1890ff;
}
.threat-icon-wrapper.yellow {
background-color: #fffbe6;
color: #faad14;
}
.threat-icon-wrapper.orange {
background-color: #fff2e8;
color: #fa541c;
}
.threat-icon-wrapper.red {
background-color: #ffe6e6;
color: #ff4757;
}
/* 新增红色图标背景 */
.card-meta {
display: flex;
align-items: center;
margin-bottom: 15px;
}
.indicator-tag {
background-color: #eff6ff;
color: #3d7fff;
font-size: 12px;
padding: 4px 8px;
border-radius: 2px;
margin-right: 10px;
}
.severity-tag {
font-size: 12px;
padding: 4px 12px;
border-radius: 2px;
color: #fff;
}
.tag-low {
background-color: #1890ff;
}
.tag-medium {
background-color: #feca57;
color: #fff;
}
.tag-high {
background-color: #ff9f43;
}
.tag-critical {
background-color: #ff4757;
}
/* 红色 */
.card-footer {
font-size: 12px;
color: #999;
}
.date-item {
margin-right: 30px;
}
.pagination-wrapper {
margin-top: 20px;
display: flex;
justify-content: flex-end;
}
.filter-card {
background-color: #fff;
border-radius: 4px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.04);
padding: 20px;
margin-bottom: 20px;
}
.filter-header {
font-size: 16px;
font-weight: 600;
margin-bottom: 20px;
color: #333;
}
.filter-body-expanded {
transition: max-height 0.3s ease-in-out;
overflow: hidden;
}
.filter-item {
margin-bottom: 15px;
}
.filter-item label {
display: block;
font-size: 13px;
color: #666;
margin-bottom: 8px;
}
:deep(.devui-select), :deep(.devui-input__inner) {
width: 100%;
}
.date-range-mock {
display: flex;
align-items: center;
gap: 5px;
}
.date-input {
flex: 1;
border: 1px solid #dcdfe6;
border-radius: 2px;
height: 32px;
padding: 0 10px;
font-size: 12px;
color: #666;
width: 100%;
}
.filter-actions {
display: flex;
gap: 10px;
margin-top: 25px;
justify-content: center;
}
.confirm-btn {
background-color: #3d7fff !important;
border-color: #3d7fff !important;
}
.reset-btn {
border: 1px solid #dcdfe6;
color: #666;
}
.collapse-link {
text-align: right;
margin-top: 10px;
padding-top: 10px;
border-top: 1px solid #eee;
}
.collapse-link a {
color: #3d7fff;
font-size: 12px;
text-decoration: none;
}
.collapse-link .d-icon {
margin-left: 5px;
}
.download-btn {
width: 100%;
background-color: #3d7fff !important;
border-color: #3d7fff !important;
height: 40px;
font-size: 14px;
}
</style>

View File

@@ -0,0 +1,526 @@
<template>
<div class="vuln-page">
<header class="page-header">
<div class="header-content">
<h1 class="page-title">漏洞数据库</h1>
<div class="main-search-wrapper">
<div class="search-input-group">
<input
v-model="mainKeyword"
type="text"
placeholder="搜索关键字CNNVD编号 CVE编号"
class="main-search-input"
/>
<button class="search-icon-btn">
<i class="icon-search d-icon icon-search"></i>
</button>
</div>
</div>
</div>
<div class="header-illustration">
<div class="shield-graphic"></div>
</div>
</header>
<main class="main-container">
<div class="content-layout">
<div class="list-column">
<div class="vuln-list">
<div
v-for="(item, index) in vulnList"
:key="index"
class="vuln-card"
:class="getCardBorderClass(item.level)"
>
<div class="card-top">
<h3 class="vuln-title" v-html="highlightKeyword(item.title)"></h3>
<div class="vuln-icon-wrapper" :class="item.iconType">
<i class="d-icon" :class="item.iconClass"></i>
</div>
</div>
<div class="card-meta">
<span class="cnnvd-tag">CNNVD编号{{ item.cnnvd }}</span>
<span
v-if="item.level"
class="level-tag"
:class="getLevelClass(item.level)"
>
{{ item.level }}
</span>
</div>
<div class="card-footer">
<span class="date-item">收录时间{{ item.createTime }}</span>
<span class="date-item">更新时间{{ item.updateTime }}</span>
</div>
</div>
</div>
<div class="pagination-wrapper">
<d-pagination
:total="317483"
:page-size="10"
:page-index="1"
show-page-selector
></d-pagination>
</div>
</div>
<div class="sidebar-column">
<div class="filter-card">
<div class="filter-header">高级搜索</div>
<div class="filter-body-expanded">
<div class="filter-item">
<label>危害等级</label>
<d-select v-model="filter.level" placeholder="请选择" :options="levelOptions"></d-select>
</div>
<div class="filter-item">
<label>漏洞类型</label>
<d-select v-model="filter.type" placeholder="请选择" :options="typeOptions"></d-select>
</div>
<div v-if="!isFilterCollapsed" class="filter-item">
<label>厂商</label>
<d-input v-model="filter.vendor" placeholder="请输入厂商"></d-input>
</div>
<div v-if="!isFilterCollapsed" class="filter-item">
<label>时间类型</label>
<d-select v-model="filter.dateType" placeholder="时间类型" :options="dateTypeOptions"></d-select>
</div>
<div class="filter-item">
<label>查询时间</label>
<div class="date-range-mock">
<input placeholder="开始日期" class="date-input"/>
<span class="separator">-</span>
<input placeholder="结束日期" class="date-input"/>
</div>
</div>
<div class="filter-actions">
<d-button icon="search" variant="solid" color="primary" class="confirm-btn">确认</d-button>
<d-button icon="refresh" class="reset-btn">取消</d-button>
</div>
</div>
<div class="collapse-link">
<a href="#" @click.prevent="isFilterCollapsed = !isFilterCollapsed">
{{ isFilterCollapsed ? '展开' : '收起' }}
<i class="d-icon" :class="isFilterCollapsed ? 'icon-chevron-down-2' : 'icon-chevron-up-2'"></i>
</a>
</div>
</div>
<d-button class="download-btn" variant="solid" color="primary" icon="icon-download">
<i class="d-icon icon-download"></i> 下载漏洞数据
</d-button>
</div>
</div>
</main>
</div>
</template>
<script setup>
import {ref} from 'vue';
// 假设已安装 vue-devui部分组件需要按需引入或全局注册
// import { DButton, DSelect, DInput, DPagination } from 'vue-devui';
const mainKeyword = ref('');
const isFilterCollapsed = ref(true); // 【新增:控制高级搜索的展开/收起】
// 模拟漏洞数据 (保持不变)
const vulnList = ref([
{
title: 'FreePBX SQL注入漏洞',
cnnvd: 'CNNVD-202512-423',
level: '低危',
createTime: '2025-12-04',
updateTime: '2025-12-04',
iconType: 'blue',
iconClass: 'icon-bug'
},
{
title: 'WordPress Plugin CSSIgniter Shortcodes 跨站脚本漏洞',
cnnvd: 'CNNVD-202512-422',
level: '中危',
createTime: '2025-12-03',
updateTime: '2025-12-04',
iconType: 'yellow',
iconClass: 'icon-bug'
},
{
title: 'WordPress Plugin Modula Image Gallery 路径遍历漏洞',
cnnvd: 'CNNVD-202512-421',
level: '高危',
createTime: '2025-12-03',
updateTime: '2025-12-04',
iconType: 'orange',
iconClass: 'icon-bug'
},
{
title: 'WordPress Plugin Modula Image Gallery 代码问题漏洞',
cnnvd: 'CNNVD-202512-420',
level: '高危',
createTime: '2025-12-03',
updateTime: '2025-12-04',
iconType: 'orange',
iconClass: 'icon-bug'
},
{
title: 'WordPress Plugin MXChat 信息泄露漏洞',
cnnvd: 'CNNVD-202512-419',
level: '中危',
createTime: '2025-12-03',
updateTime: '2025-12-04',
iconType: 'yellow',
iconClass: 'icon-bug'
},
]);
// 筛选表单数据 (保持不变)
const filter = ref({
level: '',
type: '',
vendor: '',
dateType: '收录时间',
});
const levelOptions = [{label: '高危', value: 'high'}, {label: '中危', value: 'medium'}, {label: '低危', value: 'low'}];
const typeOptions = [{label: 'SQL注入', value: 'sql'}, {label: 'XSS', value: 'xss'}];
const dateTypeOptions = [{label: '收录时间', value: 'create'}, {label: '更新时间', value: 'update'}];
// 辅助函数 (保持不变)
const getLevelClass = (level) => {
if (level === '高危') return 'tag-high';
if (level === '中危') return 'tag-medium';
return 'tag-low';
};
const getCardBorderClass = (level) => {
if (level === '高危') return 'border-high';
if (level === '中危') return 'border-medium';
return 'border-low';
};
const highlightKeyword = (text) => {
return text;
};
</script>
<style lang="scss" scoped>
/* 全局重置 */
.vuln-page {
//background-color: #f0f2f5;
min-height: 100vh;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
color: #333;
}
.page-header {
background-color: #0f1724;
padding: 60px 0 100px;
position: relative;
overflow: hidden;
text-align: center;
background-image: url(@/assets/v3/louDong_back.4bfd0a5.png);
}
.page-title {
color: #fff;
font-size: 36px;
font-weight: 500;
margin-bottom: 30px;
letter-spacing: 2px;
}
.main-search-wrapper {
max-width: 800px;
margin: 0 auto;
}
.search-input-group {
display: flex;
background-color: #fff;
border-radius: 4px;
overflow: hidden;
height: 50px;
}
.main-search-input {
flex: 1;
border: none;
outline: none;
padding: 0 20px;
font-size: 14px;
color: #333;
}
.search-icon-btn {
width: 50px;
background: none;
border: none;
cursor: pointer;
color: #3d7fff;
font-size: 18px;
display: flex;
align-items: center;
justify-content: center;
}
.header-illustration {
position: absolute;
top: 0;
right: 0;
height: 100%;
width: 400px;
background: radial-gradient(circle at 70% 50%, rgba(61, 127, 255, 0.1), transparent 60%);
pointer-events: none;
z-index: 1;
}
.main-container {
max-width: 1300px;
margin: 40px auto;
position: relative;
z-index: 10;
padding: 0 20px;
}
.content-layout {
display: flex;
gap: 20px;
align-items: flex-start;
}
.list-column {
flex: 1;
}
.sidebar-column {
width: 320px;
flex-shrink: 0;
}
.vuln-card {
background-color: #fff;
margin-bottom: 16px;
padding: 20px;
border-radius: 4px;
transition: all 0.3s ease;
cursor: pointer;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.04);
}
.vuln-card:hover {
transform: translateY(-5px);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
}
.vuln-card.border-low {
border-left: 4px solid #3d7fff;
}
.vuln-card.border-medium {
border-left: 4px solid #feca57;
}
.vuln-card.border-high {
border-left: 4px solid #ff9f43;
}
.card-top {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 10px;
}
.vuln-title {
font-size: 16px;
font-weight: 600;
color: #333;
margin: 0;
line-height: 1.4;
}
.vuln-title:hover {
color: #3d7fff;
}
.vuln-icon-wrapper {
width: 32px;
height: 32px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-left: 15px;
flex-shrink: 0;
}
.vuln-icon-wrapper.blue {
background-color: #e6f7ff;
color: #1890ff;
}
.vuln-icon-wrapper.yellow {
background-color: #fffbe6;
color: #faad14;
}
.vuln-icon-wrapper.orange {
background-color: #fff2e8;
color: #fa541c;
}
.card-meta {
display: flex;
align-items: center;
margin-bottom: 15px;
}
.cnnvd-tag {
background-color: #eff6ff;
color: #3d7fff;
font-size: 12px;
padding: 4px 8px;
border-radius: 2px;
margin-right: 10px;
}
.level-tag {
font-size: 12px;
padding: 4px 12px;
border-radius: 2px;
color: #fff;
}
.tag-low {
background-color: #1890ff;
}
.tag-medium {
background-color: #feca57;
color: #fff;
}
.tag-high {
background-color: #ff9f43;
}
.card-footer {
font-size: 12px;
color: #999;
}
.date-item {
margin-right: 30px;
}
.pagination-wrapper {
margin-top: 20px;
display: flex;
justify-content: flex-end;
}
.filter-card {
background-color: #fff;
border-radius: 4px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.04);
padding: 20px;
margin-bottom: 20px;
}
.filter-header {
font-size: 16px;
font-weight: 600;
margin-bottom: 20px; /* 展开时有间距 */
color: #333;
}
// 展开状态下的表单容器
.filter-body-expanded {
transition: max-height 0.3s ease-in-out;
overflow: hidden;
}
.filter-item {
margin-bottom: 15px;
}
.filter-item label {
display: block;
font-size: 13px;
color: #666;
margin-bottom: 8px;
}
/* DevUI 组件样式覆盖 */
:deep(.devui-select), :deep(.devui-input__inner) {
width: 100%;
}
.date-range-mock {
display: flex;
align-items: center;
gap: 5px;
}
.date-input {
flex: 1;
border: 1px solid #dcdfe6;
border-radius: 2px;
height: 32px;
padding: 0 10px;
font-size: 12px;
color: #666;
width: 100%;
}
.filter-actions {
display: flex;
gap: 10px;
margin-top: 25px;
justify-content: center;
}
.confirm-btn {
background-color: #3d7fff !important;
border-color: #3d7fff !important;
}
.reset-btn {
border: 1px solid #dcdfe6;
color: #666;
}
.collapse-link {
text-align: right;
margin-top: 10px;
padding-top: 10px;
border-top: 1px solid #eee; /* 增加分隔线 */
}
.collapse-link a {
color: #3d7fff;
font-size: 12px;
text-decoration: none;
.d-icon {
margin-left: 5px;
}
}
.download-btn {
width: 100%;
background-color: #3d7fff !important;
border-color: #3d7fff !important;
height: 40px;
font-size: 14px;
}
</style>

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,347 @@
<template>
<div class="map-container">
<div id="talentMapChart" class="chart"></div>
<!-- 右侧排行榜 -->
<div class="map-rank-panel">
<div class="panel-title">🏆 开源人才数量排行 TOP 5</div>
<div class="rank-list">
<div class="rank-item" v-for="(item, index) in topRegions" :key="index">
<span :class="['rank-num', 'rank-' + (index + 1)]">{{ index + 1 }}</span>
<span class="rank-name">{{ item.name }}</span>
<span class="rank-score">{{ item.score }} 万人</span>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import {onMounted, ref, onBeforeUnmount, computed} from 'vue';
// 初始化中国开源人才密度地图
import * as echarts from "echarts";
import geoJson from './json/china.json';
const talentMapChart = ref()
// 中国开源人才密度地图数据
const talentMapData = ref([
{ name: '北京市', value: [116.4074, 39.9042, 141.15, 231.47] },
{ name: '上海市', value: [121.4737, 31.2304, 269.83, 169.99] },
{ name: '浙江省', value: [120.1551, 30.2794, 8.94, 90.98] },
{ name: '广东省', value: [113.2644, 23.1291, 7.5, 149.76] },
{ name: '台湾省', value: [121.5090, 25.0443, 32.75, 117.88] },
{ name: '四川省', value: [104.0657, 30.6595, 1.01, 48.7] },
{ name: '江苏省', value: [118.7780, 32.0472, 5.25, 56.28] },
{ name: '湖北省', value: [114.3053, 30.5928, 1.84, 34.09] },
{ name: '福建省', value: [119.3062, 26.0747, 1.39, 16.79] },
{ name: '陕西省', value: [108.9480, 34.2632, 1.04, 21.38] },
{ name: '重庆市', value: [106.5049, 29.5332, 1.61, 13.24] },
{ name: '山东省', value: [120.3331, 36.0670, 1.02, 16.02] },
{ name: '湖南省', value: [112.9822, 28.1944, 0.68, 14.25] },
{ name: '安徽省', value: [117.2830, 31.8611, 0.93, 12.92] },
{ name: '辽宁省', value: [123.4321, 41.8007, 0.77, 11.37] },
{ name: '云南省', value: [102.7123, 25.0406, 0.1, 3.68] },
{ name: '天津市', value: [117.1901, 39.1258, 7.79, 9.34] },
{ name: '河南省', value: [113.6654, 34.7579, 0.55, 9.07] },
{ name: '吉林省', value: [125.3245, 43.8171, 0.15, 2.7] },
{ name: '江西省', value: [115.8581, 28.6820, 0.25, 4.17] },
{ name: '广西壮族自治区', value: [108.3200, 22.8241, 0.14, 3.15] },
{ name: '黑龙江省', value: [126.5349, 45.8038, 0.11, 5.13] },
{ name: '澳门特别行政区', value: [113.5490, 22.1987, 737.5, 2.36] },
{ name: '河北省', value: [114.5024, 38.0454, 0.26, 4.74] },
{ name: '山西省', value: [112.5489, 37.8570, 0.25, 3.78] },
{ name: '贵州省', value: [106.7135, 26.5783, 0.11, 1.93] },
{ name: '内蒙古自治区', value: [111.6708, 40.8183, 0.01, 0.96] },
{ name: '香港特别行政区', value: [114.1095, 22.3964, 1797.7, 197.75] },
{ name: '新疆维吾尔自治区', value: [87.6168, 43.7928, 0.01, 0.77] },
{ name: '甘肃省', value: [103.8235, 36.0580, 0.04, 1.46] },
{ name: '海南省', value: [110.3312, 20.0319, 0.36, 1.25] },
{ name: '宁夏回族自治区', value: [106.2782, 38.4664, 0.05, 0.27] },
{ name: '西藏自治区', value: [91.1175, 29.6469, 0.01, 0.14] },
{ name: '青海省', value: [101.7782, 36.6172, 0.01, 0.18] }
]);
// 计算 TOP 5 地区
const topRegions = computed(() => {
const sorted = [...talentMapData.value]
.map(item => ({
name: item.name,
score: item.value[3],
density: item.value[2]
}))
.sort((a, b) => b.score - a.score);
return sorted.slice(0, 5);
});
// 挂载时初始化
onMounted(() => {
setTimeout(() => {
initTalentMapChart()
}, 100);
});
const initTalentMapChart = () => {
const el = document.getElementById('talentMapChart');
if (!el) return;
if (talentMapChart.value) {
talentMapChart.value.dispose();
}
const myChart = echarts.init(el);
talentMapChart.value = myChart;
// --- 修改后的加载逻辑:直接获取 JSON ---
// 这里可以换成你本地项目的路径,例如:'/maps/china.json'
const MAP_JSON_URL = 'https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json';
// 1. 注册地图数据
echarts.registerMap('china', geoJson);
// 2. 调用渲染函数
renderMap();
// 渲染地图的函数 (配置保持原有的科技感风格)
function renderMap() {
myChart.setOption({
tooltip: {
trigger: 'item',
backgroundColor: 'rgba(17, 54, 122, 0.95)',
borderColor: '#00A0FF',
borderWidth: 1,
borderRadius: 8,
padding: 16,
textStyle: { color: '#6dd0e3', fontSize: 14 },
formatter: (params: any) => {
if (params.seriesType === 'scatter') {
const data = params.data.value;
const density = data[2];
const total = data[3];
// 内部辅助函数获取等级
const getLevel = (d: number) => {
if(d > 500) return '人才极高密度区';
if(d > 100) return '人才高密度区';
return '人才稳步增长区';
};
return `
<div style="line-height: 2;">
<div style="font-weight: bold; color: #00F2FF; font-size: 16px; margin-bottom: 10px;">${params.name}</div>
<div><span style="color: #6dd0e3;">人才密度:</span><span style="color: #00C0FF; font-weight: 700;">${density}</span> 人/km²</div>
<div><span style="color: #6dd0e3;">人才总量:</span><span style="color: #00C0FF; font-weight: 700;">${total}</span> 万人</div>
<div style="margin-top: 8px; padding: 4px 10px; background: rgba(0, 242, 255, 0.2); border-radius: 6px; color: #00F2FF; font-size: 12px;">${getLevel(density)}</div>
</div>
`;
}
return '';
}
},
visualMap: {
show: false,
min: 0,
max: 500,
inRange: {
color: ['#00A0FF', '#0063D0', '#004190'],
symbolSize: [10, 60]
}
},
geo: {
map: 'china',
roam: true,
scaleLimit: { min: 0.8, max: 4 },
zoom: 2.6, // 调整为 standard zoom
center: [104.5, 37.5],
label: {
show: true,
fontSize: 10,
color: '#CEF4FD'
},
itemStyle: {
areaColor: 'rgba(0, 30, 80, 0.6)',
borderColor: 'rgba(0, 160, 255, 0.5)',
borderWidth: 1.5,
shadowBlur: 10,
shadowColor: 'rgba(0, 160, 255, 0.3)'
},
emphasis: {
itemStyle: {
areaColor: 'rgba(0, 50, 120, 0.8)',
borderColor: '#00C0FF'
}
}
},
series: [
{
name: '开源人才密度',
type: 'scatter',
coordinateSystem: 'geo',
data: talentMapData.value,
symbolSize: (val: any) => Math.sqrt(val[2]) * 2 + 8,
itemStyle: {
color: (params: any) => {
const density = params.value[2];
if (density >= 500) return '#FF4900';
if (density >= 100) return '#FFAB00';
return '#00C0FF';
},
shadowBlur: 20,
shadowColor: 'rgba(0, 242, 255, 0.6)'
}
}
]
});
}
};
</script>
<style lang="scss" scoped>
.map-container {
display: flex;
gap: 2rem;
align-items: stretch;
position: relative;
min-height: 600px;
}
.map-container .chart {
flex: 1;
min-height: 600px;
background: linear-gradient(135deg,
rgba(0, 20, 60, 0.4) 0%,
rgba(0, 40, 100, 0.3) 100%);
border-radius: 1rem;
border: 2px solid rgba(0, 192, 255, 0.3);
box-shadow: 0 8px 24px rgba(0, 192, 255, 0.2);
padding: 1rem;
}
.map-rank-panel {
width: 300px;
border-radius: 1rem;
border: 2px solid rgba(0, 192, 255, 0.3);
padding: 1.5rem;
box-shadow: 0 8px 32px rgba(0, 192, 255, 0.2);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
display: flex;
flex-direction: column;
gap: 1rem;
}
.panel-title {
font-size: 1.2rem;
font-weight: 700;
color: black;
text-align: center;
padding-bottom: 1rem;
margin-bottom: 0.5rem;
border-bottom: 2px solid rgba(0, 242, 255, 0.3);
}
.rank-list {
display: flex;
flex-direction: column;
gap: 0.75rem;
max-height: 400px;
overflow-y: auto;
padding-right: 5px;
}
.rank-item {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.85rem 1rem;
background: rgba(0, 192, 255, 0.08);
border-radius: 0.75rem;
border: 1px solid rgba(0, 192, 255, 0.2);
border-left: 3px solid #00A0FF;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
margin-bottom: 0.75rem;
}
.rank-item::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(0, 242, 255, 0.15), transparent);
transition: left 0.5s;
}
.rank-item:hover::before {
left: 100%;
}
.rank-item:hover {
background: rgba(0, 192, 255, 0.2);
border-color: #00F2FF;
border-left-color: #00F2FF;
box-shadow: 0 6px 16px rgba(0, 242, 255, 0.3);
transform: translateX(5px) scale(1.02);
}
.rank-num {
width: 32px;
height: 32px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-weight: 700;
flex-shrink: 0;
font-family: 'DIN Alternate', 'Arial', sans-serif;
}
.rank-num.rank-1 {
background: linear-gradient(135deg, #FFD700, #FFA500);
color: #1a1a1a;
box-shadow: 0 4px 12px rgba(255, 215, 0, 0.6);
border: 2px solid rgba(255, 255, 255, 0.3);
}
.rank-num.rank-2 {
background: linear-gradient(135deg, #E8E8E8, #C0C0C0);
color: #1a1a1a;
box-shadow: 0 4px 12px rgba(192, 192, 192, 0.6);
border: 2px solid rgba(255, 255, 255, 0.3);
}
.rank-num.rank-3 {
background: linear-gradient(135deg, #CD7F32, #B8733C);
color: white;
box-shadow: 0 4px 12px rgba(205, 127, 50, 0.6);
border: 2px solid rgba(255, 255, 255, 0.3);
}
.rank-num.rank-4,
.rank-num.rank-5 {
background: rgba(0, 192, 255, 0.2);
color: #00C0FF;
font-weight: bold;
border: 2px solid rgba(0, 192, 255, 0.4);
}
.rank-name {
flex: 1;
font-size: 14px;
font-weight: 600;
color: #000000;
}
.rank-score {
font-size: 14px;
font-weight: 700;
color: #00F2FF;
font-family: 'DIN Alternate', 'Arial', sans-serif;
text-shadow: 0 0 8px rgba(0, 242, 255, 0.5);
}
</style>

View File

@@ -0,0 +1,468 @@
<template>
<div class="china-security-map">
<div ref="chartDiv" class="map-chart"></div>
<!-- 左侧省份威胁排行 -->
<div class="info-panel panel-left">
<div class="panel-title">🏛 省份威胁排行</div>
<div class="province-ranking">
<div class="rank-item" v-for="(item, index) in provinceRanking" :key="index">
<div class="rank-badge" :class="'rank-' + (index + 1)">{{ index + 1 }}</div>
<div class="rank-info">
<div class="rank-province">{{ item.province }}</div>
<div class="rank-threats">{{ item.threats.toLocaleString() }} 威胁</div>
</div>
<div class="rank-indicator" :style="{ background: item.riskLevel === 'high' ? '#ef4444' : item.riskLevel === 'medium' ? '#f59e0b' : '#10b981' }"></div>
</div>
</div>
</div>
<!-- 右侧安全态势面板 -->
<div class="info-panel panel-right">
<div class="panel-title">📈 安全态势分析</div>
<div class="security-stats">
<div class="stat-item" v-for="(stat, index) in securityStats" :key="index">
<div class="stat-icon" :style="{ color: stat.color }">{{ stat.icon }}</div>
<div class="stat-content">
<div class="stat-value" :style="{ color: stat.color }">{{ stat.value }}</div>
<div class="stat-label">{{ stat.label }}</div>
<div class="stat-trend" :class="stat.trend">
{{ stat.trend === 'up' ? '↗' : stat.trend === 'down' ? '↘' : '→' }} {{ stat.change }}%
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
import * as echarts from 'echarts'
// 响应式数据
const chartDiv = ref(null)
const myChart = ref(null)
// 省份威胁排行
const provinceRanking = ref([
{ province: '北京', threats: 8420, riskLevel: 'high' },
{ province: '上海', threats: 7350, riskLevel: 'high' },
{ province: '广东', threats: 6870, riskLevel: 'high' },
{ province: '浙江', threats: 5540, riskLevel: 'medium' },
{ province: '江苏', threats: 4320, riskLevel: 'medium' },
{ province: '山东', threats: 3890, riskLevel: 'medium' },
{ province: '四川', threats: 2650, riskLevel: 'low' }
])
// 安全态势统计
const securityStats = ref([
{ icon: '🔥', label: '活跃攻击', value: '2,847', color: '#ef4444', trend: 'up', change: 15 },
{ icon: '🛡️', label: '防护成功', value: '15,692', color: '#10b981', trend: 'up', change: 8 },
{ icon: '⚠️', label: '高危漏洞', value: '156', color: '#f59e0b', trend: 'down', change: 12 },
{ icon: '🎯', label: '精准拦截', value: '98.7%', color: '#8b5cf6', trend: 'up', change: 2 }
])
// 主要城市坐标映射
const geoCoordMap = {
'北京': [116.4074, 39.9042],
'上海': [121.4737, 31.2304],
'广州': [113.2644, 23.1291],
'深圳': [114.0579, 22.5431],
'杭州': [120.1551, 30.2741],
'南京': [118.7969, 32.0603],
'武汉': [114.3054, 30.5931],
'成都': [104.0665, 30.5723],
'西安': [108.9398, 34.3416],
'重庆': [106.5516, 29.5630],
'天津': [117.2008, 39.0842],
'沈阳': [123.4315, 41.8057],
'长沙': [112.9388, 28.2282],
'郑州': [113.6254, 34.7466],
'济南': [117.1205, 36.6519],
'哈尔滨': [126.5358, 45.8023],
'长春': [125.3245, 43.8868],
'石家庄': [114.5149, 38.0428],
'太原': [112.5489, 37.8706],
'呼和浩特': [111.7519, 40.8414]
}
import { loadChinaMap } from '@/utils/mapLoader'
// 初始化图表
const initChart = () => {
if (!chartDiv.value) return
// 省份威胁热力数据
const provinceData = [
{ name: '北京', value: 100 },
{ name: '上海', value: 95 },
{ name: '广东', value: 90 },
{ name: '浙江', value: 75 },
{ name: '江苏', value: 70 },
{ name: '山东', value: 65 },
{ name: '四川', value: 60 },
{ name: '湖北', value: 55 },
{ name: '河南', value: 50 },
{ name: '湖南', value: 45 },
{ name: '安徽', value: 40 },
{ name: '河北', value: 38 },
{ name: '福建', value: 35 },
{ name: '江西', value: 32 },
{ name: '重庆', value: 30 },
{ name: '陕西', value: 28 },
{ name: '辽宁', value: 25 },
{ name: '天津', value: 22 },
{ name: '山西', value: 20 },
{ name: '吉林', value: 18 },
{ name: '黑龙江', value: 15 },
{ name: '内蒙古', value: 12 },
{ name: '广西', value: 25 },
{ name: '海南', value: 10 },
{ name: '贵州', value: 15 },
{ name: '云南', value: 20 },
{ name: '西藏', value: 5 },
{ name: '甘肃', value: 8 },
{ name: '青海', value: 3 },
{ name: '宁夏', value: 6 },
{ name: '新疆', value: 10 },
{ name: '台湾', value: 30 },
{ name: '香港', value: 25 },
{ name: '澳门', value: 15 }
]
// 安全监控节点
const securityNodes = [
{ name: '北京安全中心', value: [...geoCoordMap['北京'], 100] },
{ name: '上海监控点', value: [...geoCoordMap['上海'], 85] },
{ name: '广州分析中心', value: [...geoCoordMap['广州'], 75] },
{ name: '深圳预警站', value: [...geoCoordMap['深圳'], 70] },
{ name: '杭州情报点', value: [...geoCoordMap['杭州'], 65] },
{ name: '南京监测站', value: [...geoCoordMap['南京'], 60] },
{ name: '武汉防护点', value: [...geoCoordMap['武汉'], 55] },
{ name: '成都安全站', value: [...geoCoordMap['成都'], 50] }
]
// 攻击路径数据
const attackPaths = [
{ coords: [geoCoordMap['北京'], geoCoordMap['上海']] },
{ coords: [geoCoordMap['广州'], geoCoordMap['深圳']] },
{ coords: [geoCoordMap['杭州'], geoCoordMap['南京']] },
{ coords: [geoCoordMap['武汉'], geoCoordMap['成都']] }
]
const option = {
backgroundColor: 'transparent',
// 视觉映射组件
visualMap: {
min: 0,
max: 100,
left: '20',
bottom: '20',
text: ['高风险', '低风险'],
textStyle: { color: '#64748b', fontSize: 10 },
calculable: true,
inRange: {
color: ['#e0f2fe', '#bae6fd', '#7dd3fc', '#38bdf8', '#0ea5e9']
}
},
tooltip: {
trigger: 'item',
backgroundColor: 'rgba(255,255,255,0.95)',
borderColor: '#e2e8f0',
textStyle: { color: '#1f2937' },
formatter: function(params) {
if(params.seriesType === 'effectScatter') {
return `${params.marker} ${params.name}<br/>安全指数: ${params.value[2]}`
}
if(!params.value) return params.name + ': 无数据'
return `${params.name}<br/>威胁等级: ${params.value}`
}
},
geo: {
map: 'china',
roam: true,
zoom: 1.2,
label: {
show: true,
fontSize: 10,
color: '#64748b'
},
itemStyle: {
areaColor: '#f8fafc',
borderColor: '#cbd5e1',
borderWidth: 1
},
emphasis: {
label: {
show: true,
color: '#1f2937'
},
itemStyle: {
areaColor: '#0ea5e9',
shadowBlur: 10,
shadowColor: 'rgba(14, 165, 233, 0.3)'
}
}
},
series: [
// 省份威胁热力图
{
name: '威胁分布',
type: 'map',
geoIndex: 0,
data: provinceData
},
// 安全监控节点
{
name: '安全节点',
type: 'effectScatter',
coordinateSystem: 'geo',
data: securityNodes,
symbolSize: function (val) {
return val[2] / 8
},
showEffectOn: 'render',
rippleEffect: {
brushType: 'stroke',
scale: 2.5
},
label: {
show: true,
formatter: '{b}',
position: 'right',
color: '#1f2937',
fontSize: 9,
textBorderColor: '#fff',
textBorderWidth: 1
},
itemStyle: {
color: '#10b981',
shadowBlur: 10,
shadowColor: '#10b981'
},
zlevel: 2
},
// 攻击路径 (红色飞线)
{
type: 'lines',
zlevel: 1,
effect: {
show: true,
period: 4,
trailLength: 0.7,
color: '#ef4444',
symbolSize: 3
},
lineStyle: {
color: '#ef4444',
width: 0,
curveness: 0.2
},
data: attackPaths
},
// 静态连线背景
{
type: 'lines',
zlevel: 0,
symbol: ['none', 'arrow'],
symbolSize: 6,
effect: { show: false },
lineStyle: {
color: '#ef4444',
width: 1,
opacity: 0.3,
curveness: 0.2
},
data: attackPaths
}
]
}
myChart.value = echarts.init(chartDiv.value)
myChart.value.setOption(option)
}
// 组件挂载
onMounted(async () => {
await loadChinaMap()
initChart()
window.addEventListener('resize', () => {
myChart.value && myChart.value.resize()
})
})
// 组件卸载
onUnmounted(() => {
if (myChart.value) {
myChart.value.dispose()
}
window.removeEventListener('resize', () => {
myChart.value && myChart.value.resize()
})
})
</script>
<style lang="scss" scoped>
.china-security-map {
position: relative;
width: 100%;
height: 100%;
background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);
border-radius: 0.5rem;
overflow: hidden;
}
.map-chart {
width: 100%;
height: 100%;
}
/* 信息面板通用样式 */
.info-panel {
position: absolute;
top: 20px;
width: 260px;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(8px);
border: 1px solid rgba(14, 165, 233, 0.2);
border-radius: 0.5rem;
padding: 16px;
z-index: 10;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
.panel-title {
font-size: 14px;
font-weight: 600;
color: #0ea5e9;
margin-bottom: 12px;
border-bottom: 1px solid rgba(14, 165, 233, 0.2);
padding-bottom: 8px;
}
}
.panel-left { left: 20px; }
.panel-right { right: 20px; }
/* 省份威胁排行 */
.province-ranking {
.rank-item {
display: flex;
align-items: center;
margin-bottom: 10px;
padding: 8px;
border-radius: 6px;
transition: background-color 0.2s;
&:hover {
background: rgba(14, 165, 233, 0.05);
}
.rank-badge {
width: 20px;
height: 20px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 10px;
font-weight: 700;
color: white;
margin-right: 12px;
&.rank-1 { background: #ef4444; }
&.rank-2 { background: #f97316; }
&.rank-3 { background: #eab308; }
&.rank-4, &.rank-5, &.rank-6, &.rank-7 { background: #6b7280; }
}
.rank-info {
flex: 1;
.rank-province {
font-size: 12px;
font-weight: 600;
color: #1f2937;
margin-bottom: 2px;
}
.rank-threats {
font-size: 10px;
color: #6b7280;
}
}
.rank-indicator {
width: 8px;
height: 8px;
border-radius: 50%;
}
}
}
/* 安全态势统计 */
.security-stats {
.stat-item {
display: flex;
align-items: center;
margin-bottom: 12px;
padding: 8px;
border-radius: 6px;
transition: background-color 0.2s;
&:hover {
background: rgba(14, 165, 233, 0.05);
}
.stat-icon {
font-size: 20px;
margin-right: 12px;
}
.stat-content {
flex: 1;
.stat-value {
font-size: 16px;
font-weight: 700;
margin-bottom: 2px;
}
.stat-label {
font-size: 11px;
color: #6b7280;
margin-bottom: 2px;
}
.stat-trend {
font-size: 10px;
font-weight: 600;
&.up { color: #ef4444; }
&.down { color: #10b981; }
&.stable { color: #6b7280; }
}
}
}
}
/* 响应式适配 */
@media (max-width: 768px) {
.info-panel {
width: 220px;
padding: 12px;
top: 15px;
}
.panel-left { left: 15px; }
.panel-right { right: 15px; }
}
</style>

View File

@@ -0,0 +1,371 @@
Vue 3 项目中直接搬运 Vue 2 代码不生效主要原因有三点生命周期钩子的变化Ref 获取方式的变化以及 全局变量挂载时机
以下是针对 Vue 3 组合式 API (Composition API) 优化后的代码建议直接替换
核心修改说明
ref 声明Vue 3 需要使用 const chartDiv = ref(null) 来声明模板引用
生命周期mounted 变为 onMountedbeforeDestroy 变为 onBeforeUnmount
挂载时机确保在 import world.js 之前window.echarts 已经被赋值否则 world.js 执行时依然会因为找不到 echarts 而报错
Vue 3 适配版代码
代码段
<template>
<div class="dashboard-container">
<div ref="chartDiv" class="global-map"></div>
<div class="panel panel-left">
<div class="panel-title">🛡 漏洞类型分布 (Top 5)</div>
<div class="stat-list">
<div class="stat-item" v-for="(item, index) in vulnStats" :key="index">
<div class="stat-label">
<span>{{ item.name }}</span>
<span class="stat-value">{{ item.value }}%</span>
</div>
<div class="progress-bar">
<div class="progress-fill" :style="{ width: item.value + '%', background: item.color }"></div>
</div>
</div>
</div>
</div>
<div class="panel panel-right">
<div class="panel-title">🌍 威胁情报地域排行</div>
<div class="rank-list">
<div class="rank-item" v-for="(item, index) in regionStats" :key="index">
<span class="rank-num" :class="'top-' + (index + 1)">{{ index + 1 }}</span>
<span class="rank-name">{{ item.name }}</span>
<span class="rank-score">{{ item.score.toLocaleString() }} </span>
</div>
</div>
</div>
<transition name="fade-slide">
<div v-if="currentAlert" class="alert-card">
<div class="alert-header">
<span class="alert-icon"></span> 实时情报监测
</div>
<div class="alert-content">
<div class="alert-title">{{ currentAlert.title }}</div>
<div class="alert-desc">{{ currentAlert.desc }}</div>
</div>
</div>
</transition>
</div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount, nextTick } from 'vue';
import * as echarts from 'echarts';
import worldJson from './world.json';
// 响应式数据
const chartDiv = ref(null);
let myChart = null;
let timer = null;
const vulnStats = ref([
{ name: 'XSS 跨站脚本', value: 32.1, color: '#ef4444' },
{ name: 'SQL 注入', value: 11.9, color: '#f97316' },
{ name: '内存缓冲区溢出', value: 10.9, color: '#eab308' },
{ name: '输入验证不当', value: 9.3, color: '#3b82f6' },
{ name: '信息泄露', value: 8.0, color: '#10b981' },
]);
const regionStats = ref([
{ name: 'United States', score: 435202 },
{ name: 'India', score: 252054 },
{ name: 'China (中国)', score: 184085 },
{ name: 'Brazil', score: 174811 },
{ name: 'Germany', score: 126397 },
]);
const alerts = [
{ title: "高危漏洞通告", desc: "Apache Log4j2 远程代码执行漏洞复现" },
{ title: "僵尸网络活动", desc: "Mirai 变种正在扫描 IoT 设备端口 23" },
{ title: "APT 组织活动", desc: "OceanLotus 组织针对金融行业的钓鱼攻击" },
];
const currentAlert = ref(null);
let alertIndex = 0;
const geoCoordMap = {
'Beijing': [116.407395, 39.904211],
'Shanghai': [121.473701, 31.230416],
'Guangzhou': [113.264385, 23.129112],
'Chengdu': [104.066541, 30.572269],
'Washington': [-77.036871, 38.907192],
'Moscow': [37.6173, 55.7558],
};
// 逻辑方法
const startAlertRotation = () => {
currentAlert.value = alerts[0];
timer = setInterval(() => {
alertIndex = (alertIndex + 1) % alerts.length;
currentAlert.value = null;
setTimeout(() => {
currentAlert.value = alerts[alertIndex];
}, 500);
}, 3500);
};
const setChart = () => {
if (!chartDiv.value) return;
echarts.registerMap('world', worldJson);
const mapData = [
{ name: 'China', value: 100 },
{ name: 'United States', value: 80 },
{ name: 'Russia', value: 60 },
{ name: 'Brazil', value: 40 },
{ name: 'Canada', value: 30 },
{ name: 'Australia', value: 20 },
{ name: 'India', value: 50 },
{ name: 'Germany', value: 45 },
{ name: 'United Kingdom', value: 40 },
{ name: 'France', value: 35 },
];
const scatterData = [
{ name: '北京中心', value: [...geoCoordMap['Beijing'], 100] },
{ name: '上海节点', value: [...geoCoordMap['Shanghai'], 80] },
{ name: '广州节点', value: [...geoCoordMap['Guangzhou'], 70] },
{ name: '成都节点', value: [...geoCoordMap['Chengdu'], 60] },
{ name: '威胁源-US', value: [...geoCoordMap['Washington'], 90] },
{ name: '威胁源-RU', value: [...geoCoordMap['Moscow'], 85] },
];
const option = {
backgroundColor: 'transparent',
visualMap: {
min: 0,
max: 100,
left: '30',
bottom: '30',
text: ['高风险', '低风险'],
textStyle: { color: '#fff' },
calculable: true,
inRange: {
color: ['#1e3c72', '#2a5298', '#24b6d8', '#facc15', '#ef4444']
}
},
tooltip: {
trigger: 'item',
backgroundColor: 'rgba(0,0,0,0.8)',
borderColor: '#415A77',
textStyle: { color: '#fff' },
formatter: (params) => {
if (params.seriesType === 'effectScatter') {
return `${params.marker} ${params.name}<br/>威胁指数: ${params.value[2]}`;
}
if (!params.value) return params.name + ': 无数据';
return `${params.name}<br/>受影响程度: ${params.value}`;
}
},
geo: {
map: 'world',
roam: true,
zoom: 1.2,
label: { show: false },
itemStyle: {
areaColor: '#0f172a',
borderColor: '#1e293b',
borderWidth: 1
},
emphasis: {
label: { show: false },
itemStyle: {
areaColor: '#3b82f6',
}
}
},
series: [
{
name: 'Threat Distribution',
type: 'map',
geoIndex: 0,
data: mapData
},
{
name: 'Key Nodes',
type: 'effectScatter',
coordinateSystem: 'geo',
data: scatterData,
symbolSize: (val) => val[2] / 5,
showEffectOn: 'render',
rippleEffect: {
brushType: 'stroke',
scale: 3
},
label: {
show: true,
formatter: '{b}',
position: 'right',
color: '#fff',
fontSize: 10,
textBorderColor: '#000',
textBorderWidth: 2
},
itemStyle: {
color: '#facc15',
shadowBlur: 10,
shadowColor: '#facc15'
},
zlevel: 1
}
]
};
myChart = echarts.init(chartDiv.value);
myChart.setOption(option);
};
// 生命周期钩子
onMounted(async () => {
await nextTick(); // 确保 DOM 已渲染
setChart();
startAlertRotation();
window.addEventListener('resize', handleResize);
});
onBeforeUnmount(() => {
if (timer) clearInterval(timer);
window.removeEventListener('resize', handleResize);
if (myChart) {
myChart.dispose();
}
});
const handleResize = () => {
myChart && myChart.resize();
};
</script>
<style lang="scss" scoped>
.dashboard-container {
position: relative;
width: 100%;
height: 100%;
// 背景:深邃的科技蓝黑渐变
background: radial-gradient(circle at center, #1e293b 0%, #020617 100%);
overflow: hidden;
font-family: 'Arial', sans-serif;
color: #fff;
}
.global-map {
width: 100%;
height: 100%;
}
/* --- 侧边面板通用样式 --- */
.panel {
position: absolute;
top: 20px;
width: 260px;
background: rgba(15, 23, 42, 0.8); /* 半透明深色背景 */
backdrop-filter: blur(8px);
border: 1px solid rgba(56, 189, 248, 0.2); /* 科技蓝边框 */
border-radius: 8px;
padding: 15px;
z-index: 10;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
.panel-title {
font-size: 14px;
font-weight: bold;
color: #38bdf8;
margin-bottom: 15px;
border-bottom: 1px solid rgba(56, 189, 248, 0.2);
padding-bottom: 8px;
}
}
.panel-left { left: 20px; }
.panel-right { right: 20px; }
/* 左侧:统计列表 */
.stat-item {
margin-bottom: 12px;
.stat-label {
display: flex;
justify-content: space-between;
font-size: 12px;
color: #cbd5e1;
margin-bottom: 4px;
}
.progress-bar {
height: 6px;
background: rgba(255, 255, 255, 0.1);
border-radius: 3px;
overflow: hidden;
.progress-fill {
height: 100%;
border-radius: 3px;
transition: width 1s ease;
}
}
}
/* 右侧:排行列表 */
.rank-item {
display: flex;
align-items: center;
margin-bottom: 10px;
font-size: 12px;
.rank-num {
width: 20px;
height: 20px;
line-height: 20px;
text-align: center;
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
margin-right: 10px;
color: #94a3b8;
font-weight: bold;
&.top-1 { background: #ef4444; color: white; }
&.top-2 { background: #f97316; color: white; }
&.top-3 { background: #eab308; color: white; }
}
.rank-name { flex: 1; color: #e2e8f0; }
.rank-score { color: #38bdf8; font-weight: bold; }
}
/* 底部告警卡片 (保持原有风格) */
.alert-card {
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%); /* 居中显示 */
width: 400px;
background: rgba(17, 25, 40, 0.9);
border: 1px solid #ef4444;
border-radius: 8px;
padding: 12px 20px;
display: flex;
align-items: center;
gap: 15px;
box-shadow: 0 0 20px rgba(239, 68, 68, 0.3);
z-index: 10;
.alert-icon { font-size: 20px; animation: pulse 1.5s infinite; }
.alert-content {
.alert-title { color: #ef4444; font-weight: bold; font-size: 14px; margin-bottom: 2px; }
.alert-desc { color: #fff; font-size: 12px; }
}
}
@keyframes pulse {
0% { transform: scale(1); opacity: 1; }
50% { transform: scale(1.2); opacity: 0.8; }
100% { transform: scale(1); opacity: 1; }
}
.fade-slide-enter-active, .fade-slide-leave-active { transition: all 0.5s ease; }
.fade-slide-enter-from, .fade-slide-leave-to { opacity: 0; transform: translate(-50%, 20px); }
</style>

Some files were not shown because too many files have changed in this diff Show More