This commit is contained in:
Savalet
2023-05-21 17:45:43 +02:00
parent 046251dbec
commit f7d514d2ce
1284 changed files with 17191 additions and 17421 deletions

4
api/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
node_modules
package-lock.json
pnpm-lock.yaml
config.json

2
api/logs/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -12,6 +12,7 @@
"@devnote-dev/pterojs": "^1.2.0",
"bcrypt": "^5.0.1",
"body-parser": "^1.19.2",
"cookie-parser": "^1.4.6",
"cross-fetch": "^3.1.5",
"crypto": "^1.0.1",
"express": "^4.17.3",
@@ -27,6 +28,7 @@
"readline": "^1.3.0",
"request": "^2.88.2",
"uuid": "^8.3.2",
"ws": "^8.12.1",
"xterm": "^4.19.0",
"xterm-addon-fit": "^0.5.0"
}

View File

@@ -1,27 +1,34 @@
var router = require('express').Router();
let router = require('express').Router();
const server = require('../server.js')
const route_name = "/"
server.logger(" [INFO] /api" + route_name + " route loaded !")
function getRandomInt(max, min) {
return Math.floor(Math.random() * (max - min)) + min;
}
router.get('', (req, res) => {
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
const start = process.hrtime()
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
if (err) { logger(" [ERROR] Database error\n " + err) }
if (result.length === 0) {
res.status(401);
return res.json({ 'error': true, 'code': 401 })
} else {
if (result[0].token === req.query.token) {
var sql = `SELECT * FROM users WHERE uuid = '${req.query.uuid}'`;
if (result[0].token === req.cookies.token) {
let sql = `SELECT * FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result1) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
var sql = `SELECT * FROM roles WHERE id = '${result1[0].role}'`;
if (err) { server.logger(" [ERROR] Database error\n " + err) }
let sql = `SELECT * FROM roles WHERE id = '${result1[0].role}'`;
server.con.query(sql, function (err, result2) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
var activity = []
if (err) { server.logger(" [ERROR] Database error\n " + err) }
let activity = []
activity.push({
"name": "Maintenance Serveur PVE-1",
"date": "17 FEV 15:59"
@@ -34,8 +41,8 @@ router.get('', (req, res) => {
"name": "Maintenance DNS",
"date": "15 JUN 11:00"
})
var cpu = []
var ram = []
let cpu = []
let ram = []
for (let i = 0; i < 24; i++) {
cpu.push(getRandomInt(80, 10))
}
@@ -86,10 +93,15 @@ router.get('', (req, res) => {
})
})
} else {
return res.json({ 'error': true, 'code': 403 })
res.status(401);
return res.json({ 'error': true, 'code': 401 })
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
});
module.exports = router;

View File

@@ -1,6 +1,6 @@
var router = require('express').Router({ mergeParams: true });
let router = require('express').Router({ mergeParams: true });
const server = require('../../../server.js')
var jsonParser = server.parser.json()
let jsonParser = server.parser.json()
const route_name = "/products/:product_id"
const permissions_manager = require("../../../utils/permissions-manager.js")
server.logger(" [INFO] /api" + route_name + " route loaded !")
@@ -9,27 +9,34 @@ server.logger(" [INFO] /api" + route_name + " route loaded !")
// GET INFOS //
router.get('', function (req, res) {
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
const start = process.hrtime()
server.ip(req);
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
if (result.length === 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token == req.query.token) {
permissions_manager.has_permission(req.query.uuid, "LISTPRODUCTS").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTPRODUCTS").then(function (result) {
if (result) {
var id = req.params.product_id
if (id == undefined) { return res.json({ 'error': true, 'msg': "Id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Id params is required", "code": 102 }) }
var sql = `SELECT * FROM products WHERE id = '${id}'`;
let id = req.params.product_id
if (id === undefined) { return res.json({ 'error': true, 'msg': "Id params is required", "code": 101 }) }
if (id === "") { return res.json({ 'error': true, 'msg': "Id params is required", "code": 102 }) }
let sql = `SELECT * FROM products WHERE id = '${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (err) { server.logger(" [ERROR] Database error\n " + err) }
let configuration;
let env_json;
if (result.length > 0) {
if (result[0].category == 'pterodactyl') {
var env = []
if (result[0].category === 'pterodactyl') {
let env = []
configuration = JSON.parse(result[0].configuration)
env_json = configuration.env
Object.keys(env_json).forEach((key) => {
@@ -51,10 +58,11 @@ router.get('', function (req, res) {
'io': configuration.io,
'egg': configuration.egg,
'startup_command': configuration.startup_command,
'env': env
'env': env,
'upgrades': result[0].available_upgrades
}
})
} else if (result[0].category == 'proxmox') {
} else if (result[0].category === 'proxmox') {
configuration = JSON.parse(result[0].configuration)
return res.json({
'error': false,
@@ -70,7 +78,8 @@ router.get('', function (req, res) {
'ram': configuration.ram,
'storage': configuration.storage,
'disk_size': configuration.disk_size,
'add_conf': configuration.add_conf
'add_conf': configuration.add_conf,
'upgrades': result[0].available_upgrades
}
})
}
@@ -95,30 +104,37 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// EDIT PRODUCT //
router.put('', jsonParser, function (req, res) {
ipInfo = server.ip(req);
var response = "OK"
var error = false
var IP = req.socket.remoteAddress;
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
const start = process.hrtime()
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
if (result.length === 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
var id = req.params.product_id
if (id == undefined) { return res.json({ 'error': true, 'msg': "Id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Id params is required", "code": 102 }) }
permissions_manager.has_permission(req.query.uuid, "EDITPRODUCT").then(function (result) {
if (result[0].token === req.cookies.token) {
let id = req.params.product_id
if (id === undefined) { return res.json({ 'error': true, 'msg': "Id params is required", "code": 101 }) }
if (id === "") { return res.json({ 'error': true, 'msg': "Id params is required", "code": 102 }) }
permissions_manager.has_permission(req.cookies.uuid, "EDITPRODUCT").then(function (result) {
if (result) {
var configuration = {}
if (req.body.category == "pterodactyl") {
let configuration = {}
if (req.body.category === "pterodactyl") {
configuration = {
'cpu': req.body.cpu,
'cpu_pinning': req.body.cpu_pinning,
@@ -131,7 +147,7 @@ router.put('', jsonParser, function (req, res) {
'env': JSON.parse(req.body.env)
}
}
if (req.body.category == "proxmox") {
if (req.body.category === "proxmox") {
configuration = {
'node': req.body.node,
'template_vmid': req.body.template_vm,
@@ -142,9 +158,9 @@ router.put('', jsonParser, function (req, res) {
'add_conf': req.body.add_conf
}
}
var sql = `UPDATE products SET name = '${req.body.name}', description = '${req.body.description}', price = '${req.body.price}', configuration = '${JSON.stringify(configuration)}' WHERE id = '${id}';`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err); return res.json({ "error": true, "msg": "Database error : " + err }) };
let sql = `UPDATE products SET name = '${req.body.name}', description = '${req.body.description}', price = '${req.body.price}', configuration = '${JSON.stringify(configuration)}', available_upgrades = '${req.body.upgrades}' WHERE id = '${id}';`;
server.con.query(sql, function (err) {
if (err) { server.logger(" [ERROR] Database error\n " + err); return res.json({ "error": true, "msg": "Database error : " + err }) }
});
server.logger(" [DEBUG] Product " + req.body.name + " updated from " + IP + " !")
return res.json({ "error": false, "response": "OK" });
@@ -160,34 +176,41 @@ router.put('', jsonParser, function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// DELETE PRODUCT //
router.delete('', jsonParser, function (req, res) {
ipInfo = server.ip(req);
var response = "OK"
var error = false
var IP = req.socket.remoteAddress;
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
const start = process.hrtime()
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
if (result.length === 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
var id = req.params.product_id
if (id == undefined) { return res.json({ 'error': true, 'msg': "Id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Id params is required", "code": 102 }) }
permissions_manager.has_permission(req.query.uuid, "DELETEPRODUCT").then(function (result) {
if (result[0].token === req.cookies.token) {
let id = req.params.product_id
if (id === undefined) { return res.json({ 'error': true, 'msg': "Id params is required", "code": 101 }) }
if (id === "") { return res.json({ 'error': true, 'msg': "Id params is required", "code": 102 }) }
permissions_manager.has_permission(req.cookies.uuid, "DELETEPRODUCT").then(function (result) {
if (result) {
var sql = `DELETE FROM products WHERE id='${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err), error = true, response = "Database error" };
let sql = `DELETE FROM products WHERE id='${id}'`;
server.con.query(sql, function (err) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
});
server.logger(" [DEBUG] Product " + id + " deleted from " + IP + " !")
return res.json({ "error": error, "response": response });
return res.json({ "error": true, "msg": "Database error" })
} else {
return res.json({
"error": true,
@@ -200,6 +223,10 @@ router.delete('', jsonParser, function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,4 +1,4 @@
var router = require('express').Router();
let router = require('express').Router();
const server = require('../../../../server.js')
const config = require('../../../../config.json');
const { response } = require('express');
@@ -7,17 +7,22 @@ const route_name = "/products/proxmox/nodes"
server.logger(" [INFO] /api" + route_name + " route loaded !")
router.get('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "LISTPRODUCTS").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTPRODUCTS").then(function (result) {
if (result) {
server.fetch(`${config.proxmox_url}/api2/json/nodes`, {
"method": "GET",
@@ -48,6 +53,10 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,4 +1,4 @@
var router = require('express').Router();
let router = require('express').Router();
const server = require('../../../../server.js')
const config = require('../../../../config.json');
const { response } = require('express');
@@ -7,17 +7,22 @@ const route_name = "/products/proxmox/qemu"
server.logger(" [INFO] /api" + route_name + " route loaded !")
router.get('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "LISTPRODUCTS").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTPRODUCTS").then(function (result) {
if (result) {
server.fetch(`${config.proxmox_url}/api2/json/nodes/${req.query.node}/qemu`, {
"method": "GET",
@@ -48,6 +53,10 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,4 +1,4 @@
var router = require('express').Router();
let router = require('express').Router();
const server = require('../../../../server.js')
const config = require('../../../../config.json');
const { response } = require('express');
@@ -7,17 +7,22 @@ const route_name = "/products/proxmox/storage"
server.logger(" [INFO] /api" + route_name + " route loaded !")
router.get('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "LISTPRODUCTS").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTPRODUCTS").then(function (result) {
if (result) {
server.fetch(`${config.proxmox_url}/api2/json/nodes/${req.query.node}/storage`, {
"method": "GET",
@@ -48,6 +53,10 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,6 +1,6 @@
var router = require('express').Router();
const router = require('express').Router()
const server = require('../../server.js')
var jsonParser = server.parser.json()
const jsonParser = server.parser.json()
const route_name = "/products"
const permissions_manager = require("../../utils/permissions-manager.js")
server.logger(" [INFO] /api" + route_name + " route loaded !")
@@ -8,45 +8,81 @@ server.logger(" [INFO] /api" + route_name + " route loaded !")
// GET LIST //
router.get('', function (req, res) {
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP)
var sql = `SELECT * FROM products`;
const start = process.hrtime()
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
const sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
products = []
for (var i = 0; i < result.length; i++) {
products.push({
"id": result[i].id,
"category": result[i].category,
"name": result[i].name,
"description": result[i].description,
"price": result[i].price,
"configuration": JSON.parse(result[i].configuration)
})
if (err) { server.logger(" [ERROR] Database error\n " + err) }
if (result.length === 0) {
res.status(401);
return res.json({ 'error': true, 'code': 401 })
} else {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTPRODUCTS").then(function (result) {
if (result) {
const sql = `SELECT * FROM products`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
let products = []
for (let i = 0; i < result.length; i++) {
products.push({
"id": result[i].id,
"category": result[i].category,
"name": result[i].name,
"description": result[i].description,
"price": result[i].price,
"configuration": JSON.parse(result[i].configuration)
})
}
return res.json({ 'error': false, 'data': products })
});
} else {
res.status(403);
return res.json({
"error": true,
"code": 403
})
}
})
} else {
res.status(401);
return res.json({ 'error': true, 'code': 401 })
}
}
return res.json({ 'error': false, 'data': products })
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// POST NEW PRODUCT //
// CREATE NEW PRODUCT //
router.post('', jsonParser, function (req, res) {
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] POST /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
const start = process.hrtime()
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
server.logger(' [DEBUG] POST /api' + route_name + ' from ' + IP + ` with uuid ${req.cookies.uuid}`)
const sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
if (result.length === 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "CREATEPRODUCT").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "CREATEPRODUCT").then(function (result) {
if (result) {
if (req.body.category == "pterodactyl") {
configuration = {
if (req.body.category === "pterodactyl") {
const configuration = {
'cpu': req.body.cpu,
'cpu_pinning': req.body.cpu_pinning,
'ram': req.body.ram,
@@ -55,27 +91,32 @@ router.post('', jsonParser, function (req, res) {
'io': req.body.io,
'egg': req.body.egg,
'startup_command': req.body.startup_command,
'ipv6': req.body.ipv6,
'ipv4': req.body.ipv4,
'env': JSON.parse(req.body.env)
}
var sql = `INSERT INTO products (id, category, name, description, price, configuration) VALUES('${server.crypto.randomBytes(3).toString('hex')}', 'pterodactyl', '${req.body.name}', '${req.body.description}', '${req.body.price}', '${JSON.stringify(configuration)}')`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
const sql = `INSERT INTO products (id, category, name, description, price, configuration, available_upgrades) VALUES('${server.crypto.randomBytes(3).toString('hex')}', 'pterodactyl', '${req.body.name}', '${req.body.description}', '${req.body.price}', '${JSON.stringify(configuration)}', '${req.body.upgrades}')`;
server.con.query(sql, function (err) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
});
server.logger(" [DEBUG] Product " + req.body.name + " created from " + IP + " !")
return res.json({ "error": false, "response": "OK" });
} else if (req.body.category == "proxmox") {
configuration = {
} else if (req.body.category === "proxmox") {
const configuration = {
'node': req.body.node,
'template_vmid': req.body.template_vm,
'cores': req.body.cores,
'ram': req.body.ram,
'storage': req.body.storage,
'disk_size': req.body.disk_size,
'sup_bkp': req.body.sup_bkp,
'ipv6': req.body.ipv6,
'ipv4': req.body.ipv4,
'add_conf': req.body.add_conf
}
var sql = `INSERT INTO products (id, category, name, description, price, configuration) VALUES('${server.crypto.randomBytes(3).toString('hex')}', 'proxmox', '${req.body.name}', '${req.body.description}', '${req.body.price}', '${JSON.stringify(configuration)}')`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
const sql = `INSERT INTO products (id, category, name, description, price, configuration, available_upgrades) VALUES('${server.crypto.randomBytes(3).toString('hex')}', 'proxmox', '${req.body.name}', '${req.body.description}', '${req.body.price}', '${JSON.stringify(configuration)}', '${req.body.available_upgrades}')`;
server.con.query(sql, function (err) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
});
server.logger(" [DEBUG] Product " + req.body.name + " created from " + IP + " !")
return res.json({ "error": false, "response": "OK" });
@@ -92,6 +133,10 @@ router.post('', jsonParser, function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -0,0 +1,110 @@
const router = require('express').Router()
const server = require('../../../server.js')
const jsonParser = server.parser.json()
const route_name = "/products/upgrades"
const permissions_manager = require("../../../utils/permissions-manager.js")
server.logger(" [INFO] /api" + route_name + " route loaded !")
// GET LIST //
router.get('', function (req, res) {
const start = process.hrtime()
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
const sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
if (result.length === 0) {
res.status(401)
return res.json({ 'error': true, 'code': 401 })
} else {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTPRODUCTS").then(function (result) {
if (result) {
const sql = `SELECT * FROM upgrades`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
let upgrades = []
for (let i = 0; i < result.length; i++) {
upgrades.push({
"id": result[i].id,
"category": result[i].category,
"name": result[i].name,
"description": result[i].description,
"price": result[i].price,
"param": result[i].param,
"value": result[i].value
})
}
return res.json({ 'error': false, 'data': upgrades })
})
} else {
res.status(403);
return res.json({
"error": true,
"code": 403
})
}
})
} else {
res.status(401);
return res.json({ 'error': true, 'code': 401 })
}
}
})
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// CREATE NEW UPGRADES //
router.post('', jsonParser, function (req, res) {
const start = process.hrtime()
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
server.logger(' [DEBUG] POST /api' + route_name + ' from ' + IP + ` with uuid ${req.cookies.uuid}`)
const sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
if (result.length === 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "CREATEPRODUCT").then(function (result) {
if (result) {
const sql = `INSERT INTO upgrades (id, category, name, description, price, param, value) VALUES('${server.crypto.randomBytes(3).toString('hex')}', '${req.body.category}', '${req.body.name}', '${req.body.description}', '${req.body.price}', '${req.body.param}', '${req.body.value}')`;
server.con.query(sql, function (err) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
})
server.logger(" [DEBUG] Upgrade " + req.body.name + " created from " + IP + " !")
return res.json({ "error": false, "response": "OK" })
} else {
return res.json({
"error": true,
"code": 403
})
}
})
} else {
return res.json({ 'error': true, 'code': 403 })
}
}
})
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,6 +1,6 @@
var router = require('express').Router({ mergeParams: true });
let router = require('express').Router({ mergeParams: true });
const server = require('../../../server.js')
var jsonParser = server.parser.json()
let jsonParser = server.parser.json()
const route_name = "/roles/:role_id"
const permissions_manager = require("../../../utils/permissions-manager")
server.logger(" [INFO] /api" + route_name + " route loaded !")
@@ -8,23 +8,27 @@ server.logger(" [INFO] /api" + route_name + " route loaded !")
// GET INFOS //
router.get('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "LISTROLES").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTROLES").then(function (result) {
if (result) {
var id = req.params.role_id
let id = req.params.role_id
if (id == undefined) { return res.json({ 'error': true, 'msg': "Role id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Role id params is required", "code": 102 }) }
var sql = `SELECT * FROM roles WHERE id = '${id}'`;
let sql = `SELECT * FROM roles WHERE id = '${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length > 0) {
@@ -55,37 +59,46 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// EDIT ROLE //
router.put('', jsonParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
var id = req.params.role_id
if (result[0].token === req.cookies.token) {
let id = req.params.role_id
if (id == undefined) { return res.json({ 'error': true, 'msg': "Role id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Role id params is required", "code": 102 }) }
permissions_manager.has_permission(req.query.uuid, "EDITROLE").then(function (result) {
permissions_manager.has_permission(req.cookies.uuid, "EDITROLE").then(function (result) {
if (result) {
var permissions = ''
let permissions = ''
if (req.body.permissions.length < 1) {
permissions = "NONE"
} else {
permissions = req.body.permissions
}
var sql = `UPDATE roles SET name = '${req.body.name}', permissions = '${permissions}' WHERE id = '${id}';`;
let sql = `UPDATE roles SET name = '${req.body.name}', permissions = '${permissions}' WHERE id = '${id}';`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err); return res.json({ "error": true, "msg": "Database error : " + err }) };
});
server.logger(" [DEBUG] Role " + req.body.name + " updated from " + IP + " with uuid " + req.query.uuid + " !")
server.logger(" [DEBUG] Role " + req.body.name + " updated from " + IP + " with uuid " + req.cookies.uuid + " !")
return res.json({ "error": false, "response": "OK" });
} else {
return res.json({
@@ -105,24 +118,29 @@ router.put('', jsonParser, function (req, res) {
// DELETE ROLE //
router.delete('', jsonParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var response = "OK"
var error = false
var IP = req.socket.remoteAddress;
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let response = "OK"
let error = false
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
var id = req.params.role_id
if (result[0].token === req.cookies.token) {
let id = req.params.role_id
if (id == undefined) { return res.json({ 'error': true, 'msg': "Role id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Role id params is required", "code": 102 }) }
permissions_manager.has_permission(req.query.uuid, "DELETEROLE").then(function (result) {
permissions_manager.has_permission(req.cookies.uuid, "DELETEROLE").then(function (result) {
if (result) {
var sql = `DELETE FROM roles WHERE id='${id}'`;
let sql = `DELETE FROM roles WHERE id='${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err), error = true, response = "Database error" };
});
@@ -140,6 +158,10 @@ router.delete('', jsonParser, function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,6 +1,6 @@
var router = require('express').Router();
let router = require('express').Router();
const server = require('../../server.js')
var jsonParser = server.parser.json()
let jsonParser = server.parser.json()
const route_name = "/roles"
const permissions_manager = require("../../utils/permissions-manager")
server.logger(" [INFO] /api" + route_name + " route loaded !")
@@ -9,24 +9,28 @@ server.logger(" [INFO] /api" + route_name + " route loaded !")
// GET LIST //
router.get('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "LISTROLES").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTROLES").then(function (result) {
if (result) {
var sql = `SELECT * FROM roles`;
let sql = `SELECT * FROM roles`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
roles = []
for (var i = 0; i < result.length; i++) {
for (let i = 0; i < result.length; i++) {
roles.push({
"id": result[i].id,
"name": result[i].name
@@ -46,31 +50,40 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// POST ROLE //
router.post('', jsonParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "CREATEROLE").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "CREATEROLE").then(function (result) {
if (result) {
var permissions = ''
let permissions = ''
if (req.body.permissions.length < 1) {
permissions = "NONE"
} else {
permissions = req.body.permissions
}
var sql = `INSERT INTO roles (id, name, permissions) VALUES('${server.crypto.randomBytes(3).toString('hex')}', '${req.body.name}', '${permissions}')`;
let sql = `INSERT INTO roles (id, name, permissions) VALUES('${server.crypto.randomBytes(3).toString('hex')}', '${req.body.name}', '${permissions}')`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
});
@@ -88,6 +101,10 @@ router.post('', jsonParser, function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,4 +1,4 @@
var router = require('express').Router({ mergeParams: true });
let router = require('express').Router({ mergeParams: true });
const server = require('../../../../server')
const route_name = "/services/files/delete"
const jsonParser = server.parser.json()
@@ -10,30 +10,35 @@ server.logger(" [INFO] /api" + route_name + " route loaded !")
// DELETE FILES //
router.post('', jsonParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
var id = req.params.service_name
if (result[0].token === req.cookies.token) {
let id = req.params.service_name
if (id == undefined) { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 102 }) }
var root = req.body.root
let root = req.body.root
if (root == undefined) { return res.json({ 'error': true, 'msg': "Root params is required in the json body", "code": 101 }) }
if (root == "") { return res.json({ 'error': true, 'msg': "Root params is required", "code": 102 }) }
var files = req.body.files
let files = req.body.files
if (files == undefined) { return res.json({ 'error': true, 'msg': "Root params is required in the json body", "code": 101 }) }
if (files == "") { return res.json({ 'error': true, 'msg': "Root params is required", "code": 102 }) }
var sql = `SELECT * FROM services WHERE id = '${id}'`;
let sql = `SELECT * FROM services WHERE id = '${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length > 0) {
if (result[0].uuid == req.query.uuid) {
if (result[0].uuid == req.cookies.uuid) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
let body = {
@@ -55,7 +60,7 @@ router.post('', jsonParser, function (req, res) {
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 500, "msg": "Pterodactyl API error : " + err }) })
}
} else {
permissions_manager.has_permission(req.query.uuid, "LISTSERVICES").then(function (result_perm) {
permissions_manager.has_permission(req.cookies.uuid, "LISTSERVICES").then(function (result_perm) {
if (result_perm) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
@@ -98,6 +103,10 @@ router.post('', jsonParser, function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,7 +1,8 @@
var router = require('express').Router({ mergeParams: true });
let router = require('express').Router({ mergeParams: true });
const server = require('../../../../server')
const route_name = "/services/file"
const textParser = server.parser.text()
const jsonParser = server.parser.json()
const permissions_manager = require("../../../../utils/permissions-manager")
const config = require('../../../../config.json')
server.logger(" [INFO] /api" + route_name + " route loaded !")
@@ -10,27 +11,32 @@ server.logger(" [INFO] /api" + route_name + " route loaded !")
// GET CONTENT //
router.get('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
var id = req.params.service_name
if (result[0].token === req.cookies.token) {
let id = req.params.service_name
if (id == undefined) { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 102 }) }
var path = req.query.path
let path = req.query.path
if (path == undefined) { return res.json({ 'error': true, 'msg': "Path query is required", "code": 101 }) }
if (path == "") { return res.json({ 'error': true, 'msg': "Path query is required", "code": 102 }) }
var sql = `SELECT * FROM services WHERE id = '${id}'`;
let sql = `SELECT * FROM services WHERE id = '${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length > 0) {
if (result[0].uuid == req.query.uuid) {
if (result[0].uuid == req.cookies.uuid) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
if (path.endsWith(".png") || path.endsWith(".jpg") || path.endsWith(".jpeg") || path.endsWith(".pdf")) {
@@ -62,7 +68,7 @@ router.get('', function (req, res) {
}
}
} else {
permissions_manager.has_permission(req.query.uuid, "LISTSERVICES").then(function (result_perm) {
permissions_manager.has_permission(req.cookies.uuid, "LISTSERVICES").then(function (result_perm) {
if (result_perm) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
@@ -115,32 +121,41 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// SAVE CONTENT //
router.put('', textParser, function (req, res) {
router.post('', textParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
var id = req.params.service_name
if (result[0].token === req.cookies.token) {
let id = req.params.service_name
if (id == undefined) { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 102 }) }
var path = req.query.path
let path = req.query.path
if (path == undefined) { return res.json({ 'error': true, 'msg': "Path query is required", "code": 101 }) }
if (path == "") { return res.json({ 'error': true, 'msg': "Path query is required", "code": 102 }) }
var sql = `SELECT * FROM services WHERE id = '${id}'`;
let sql = `SELECT * FROM services WHERE id = '${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length > 0) {
if (result[0].uuid == req.query.uuid) {
if (result[0].uuid == req.cookies.uuid) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
server.fetch(config.pterodactyl_url + "/api/client/servers/" + service_config.identifier + "/files/write?file=" + path, {
@@ -160,7 +175,7 @@ router.put('', textParser, function (req, res) {
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
}
} else {
permissions_manager.has_permission(req.query.uuid, "LISTSERVICES").then(function (result_perm) {
permissions_manager.has_permission(req.cookies.uuid, "EDITSERVICE").then(function (result_perm) {
if (result_perm) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
@@ -201,6 +216,131 @@ router.put('', textParser, function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// RENAME FILE //
router.put('', jsonParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.cookies.token) {
let id = req.params.service_name
if (id == undefined) { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 102 }) }
let root = req.body.root
if (root == undefined) { return res.json({ 'error': true, 'msg': "Root params is required in the body", "code": 101 }) }
if (root == "") { return res.json({ 'error': true, 'msg': "Root params is required in the body", "code": 102 }) }
let from = req.body.from
if (from == undefined) { return res.json({ 'error': true, 'msg': "From params is required", "code": 101 }) }
if (from == "") { return res.json({ 'error': true, 'msg': "Path params is required in the body", "code": 102 }) }
let to = req.body.to
if (to == undefined) { return res.json({ 'error': true, 'msg': "To params is required in the body", "code": 101 }) }
if (to == "") { return res.json({ 'error': true, 'msg': "To params is required in the body", "code": 102 }) }
let sql = `SELECT * FROM services WHERE id = '${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length > 0) {
if (result[0].uuid == req.cookies.uuid) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
let body = {
"root": root,
"files": [
{
"from": from,
"to": to
}
]
}
server.fetch(config.pterodactyl_url + "/api/client/servers/" + service_config.identifier + "/files/rename", {
"method": "PUT",
"headers": {
"Accept": "application/json",
"Authorization": `Bearer ${config.pterodactyl_user_api_key}`,
},
"body": body.toString()
}).then(response => {
return response.text()
}).then(data => {
console.log(data)
return res.json({
'error': false,
'data': "OK"
})
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
}
} else {
permissions_manager.has_permission(req.cookies.uuid, "EDITSERVICE").then(function (result_perm) {
if (result_perm) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
let body = {
"root": root,
"files": [
{
"from": from,
"to": to
}
]
}
server.fetch(config.pterodactyl_url + "/api/client/servers/" + service_config.identifier + "/files/rename", {
"method": "PUT",
"headers": {
"Accept": "application/json",
"Authorization": `Bearer ${config.pterodactyl_user_api_key}`,
},
"body": body.toString()
}).then(response => {
return response.text()
}).then(data => {
console.log(data)
return res.json({
'error': false,
'data': "OK"
})
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
}
} else {
return res.json({
"error": true,
"code": 403
})
}
})
}
} else {
return res.json({
'error': false, 'data': {
'id': 404
}
})
}
})
} else {
return res.json({ 'error': true, 'code': 403 })
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,4 +1,4 @@
var router = require('express').Router({ mergeParams: true });
let router = require('express').Router({ mergeParams: true });
const server = require('../../../../server')
const route_name = "/services/files"
const jsonParser = server.parser.json()
@@ -10,27 +10,32 @@ server.logger(" [INFO] /api" + route_name + " route loaded !")
// GET FILES //
router.get('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
var id = req.params.service_name
if (result[0].token === req.cookies.token) {
let id = req.params.service_name
if (id == undefined) { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 102 }) }
var directory = req.query.directory
let directory = req.query.directory
if (directory == undefined) { return res.json({ 'error': true, 'msg': "Directory query is required", "code": 101 }) }
if (directory == "") { return res.json({ 'error': true, 'msg': "Directory query is required", "code": 102 }) }
var sql = `SELECT * FROM services WHERE id = '${id}'`;
let sql = `SELECT * FROM services WHERE id = '${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length > 0) {
if (result[0].uuid == req.query.uuid) {
if (result[0].uuid == req.cookies.uuid) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
server.fetch(config.pterodactyl_url + "/api/client/servers/" + service_config.identifier + "/files/list?directory=" + directory, {
@@ -70,7 +75,7 @@ router.get('', function (req, res) {
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
}
} else {
permissions_manager.has_permission(req.query.uuid, "LISTSERVICES").then(function (result_perm) {
permissions_manager.has_permission(req.cookies.uuid, "LISTSERVICES").then(function (result_perm) {
if (result_perm) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
@@ -131,32 +136,41 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// UPLOAD FILE //
router.post('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
var id = req.params.service_name
if (result[0].token === req.cookies.token) {
let id = req.params.service_name
if (id == undefined) { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 102 }) }
var directory = req.query.directory
let directory = req.query.directory
if (directory == undefined) { return res.json({ 'error': true, 'msg': "Directory query is required", "code": 101 }) }
if (directory == "") { return res.json({ 'error': true, 'msg': "Directory query is required", "code": 102 }) }
var sql = `SELECT * FROM services WHERE id = '${id}'`;
let sql = `SELECT * FROM services WHERE id = '${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length > 0) {
if (result[0].uuid == req.query.uuid) {
if (result[0].uuid == req.cookies.uuid) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
server.fetch(config.pterodactyl_url + "/api/client/servers/" + service_config.identifier + "/files/upload", {
@@ -175,7 +189,7 @@ router.post('', function (req, res) {
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
}
} else {
permissions_manager.has_permission(req.query.uuid, "LISTSERVICES").then(function (result_perm) {
permissions_manager.has_permission(req.cookies.uuid, "LISTSERVICES").then(function (result_perm) {
if (result_perm) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
@@ -215,6 +229,10 @@ router.post('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -0,0 +1,68 @@
const router = require('express').Router({ mergeParams: true });
const server = require('../../../../../server')
const config = require('../../../../../config.json');
const { response } = require('express');
const permissions_manager = require("../../../../../utils/permissions-manager")
const route_name = "/services/:service_name/proxmox/vnc/ticket"
server.logger(" [INFO] /api" + route_name + " route loaded !")
router.get('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTPRODUCTS").then(function (result) {
if (result) {
let id = req.params.service_name
if (id == undefined) { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 102 }) }
server.fetch(`${config.proxmox_url}/api2/json/nodes/pve-1/qemu/10012/termproxy`, {
"method": "POST",
"headers": {
"CSRFPreventionToken": server.proxmox_CSRFPreventionToken,
"Cookie": "PVEAuthCookie=" + server.proxmox_ticket
},
"agent": server.httpsAgent
}).then(response => {
return response.json()
})
.then(data => {
console.log(data)
data.data.pveticket = server.proxmox_ticket
data.data.socket_url = "wss://r1-access.mercurycloud.fr:8006/api2/json/nodes/pve-1/qemu/10012/vncwebsocket?port=5900&vncticket=" + encodeURIComponent(data.data.ticket)
return res.json({ 'error': false, 'data': data.data })
})
.catch(err => {
server.logger(" [ERROR] Proxmox API Error " + err)
return res.json({ "error": true, "code": 1000, "msg": err })
});
} else {
return res.json({
"error": true,
"code": 403
})
}
})
} else {
return res.json({ 'error': true, 'code': 403 })
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -0,0 +1,45 @@
const router = require('express').Router({ mergeParams: true });
const server = require('../../../../../server')
const config = require('../../../../../config.json');
const { response } = require('express');
const permissions_manager = require("../../../../../utils/permissions-manager")
const route_name = "/services/:service_name/proxmox/vnc/websocket"
server.logger(" [INFO] /api" + route_name + " route loaded !")
router.get('', function(req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function(err, result) {
if (err) {
server.logger(" [ERROR] Database error\n " + err)
};
if (result.length == 0) {
return res.json({
'error': true,
'code': 404
})
} else {
if (result[0].token === req.cookies.token) {
} else {
return res.json({
'error': true,
'code': 403
})
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,4 +1,4 @@
var router = require('express').Router({ mergeParams: true });
let router = require('express').Router({ mergeParams: true });
const server = require('../../../server')
const route_name = "/services/:service_name"
const jsonParser = server.parser.json()
@@ -7,27 +7,29 @@ const config = require('../../../config.json')
server.logger(" [INFO] /api" + route_name + " route loaded !")
router.get('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
var id = req.params.service_name
if (result[0].token === req.cookies.token) {
let id = req.params.service_name
if (id == undefined) { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 102 }) }
var sql = `SELECT * FROM services WHERE id = '${id}'`;
let sql = `SELECT * FROM services WHERE id = '${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length > 0) {
if (result[0].uuid == req.query.uuid) {
if (result[0].uuid == req.cookies.uuid) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
server.fetch(config.pterodactyl_url + "/api/client/servers/" + service_config.identifier + "/resources", {
@@ -60,10 +62,20 @@ router.get('', function (req, res) {
}).then(response => {
return response.json()
}).then(data2 => {
var sql = `SELECT * FROM services_logs WHERE service_id = '${id}' ORDER BY timestamp DESC`;
server.fetch(config.pterodactyl_url + "/api/application/servers/" + service_config.id, {
"method": "GET",
"headers": {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": `Bearer ${config.pterodactyl_user_api_key}`,
}
}).then(response => {
return response.json()
}).then(data3 => {
let sql = `SELECT * FROM services_logs WHERE service_id = '${id}' ORDER BY timestamp DESC`;
server.con.query(sql, function (err, result1) {
let ii = 0
var service_logs = []
let service_logs = []
for (let i = 0; i < result1.length; i++) {
ii++
if (ii <= 25) {
@@ -84,6 +96,8 @@ router.get('', function (req, res) {
'price': result[0].price,
'category': result[0].category,
'configuration': service_config,
'environment': data3.attributes.container.environment,
'limits': data3.attributes.limits,
'statut': result[0].statut,
'resources': data.attributes,
'feature_limits': data2.feature_limits,
@@ -96,12 +110,67 @@ router.get('', function (req, res) {
}, 'logs': service_logs
})
})
})
})
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
} else if (result[0].category == 'proxmox') {
service_config = JSON.parse(result[0].configuration)
server.fetch(`${config.proxmox_url}/api2/json/nodes/${service_config.node}/qemu/${service_config.vmid}/status/current`, {
"method": "GET",
"headers": {
"CSRFPreventionToken": server.proxmox_CSRFPreventionToken,
"Cookie": "PVEAuthCookie=" + server.proxmox_ticket
},
"agent": server.httpsAgent
}).then(response => {
return response.json()
}).then(data => {
let sql = `SELECT * FROM services_logs WHERE service_id = '${id}' ORDER BY timestamp DESC`;
server.con.query(sql, function (err, result1) {
let ii = 0
let service_logs = []
for (let i = 0; i < result1.length; i++) {
ii++
if (ii <= 25) {
service_logs.push({
'timestamp': result1[i].timestamp,
'uuid': result1[i].uuid,
'ip': result1[i].ip,
'action': result1[i].action
})
}
}
return res.json({
'error': false, 'data': {
'id': result[0].id,
'uuid': result[0].uuid,
'name': result[0].name,
'product_id': result[0].product_id,
'price': result[0].price,
'category': result[0].category,
'statut': result[0].statut,
'server_status': data.data.status,
'cpus': data.data.cpus,
'maxdisk': data.data.maxdisk,
'maxmem': data.data.maxmem,
'cpu_usage': data.data.cpu,
'mem_usage': data.data.mem,
'net_in': data.data.netin,
'net_out': data.data.netout,
'disk_read': data.data.diskread,
'disk_write': data.data.diskwrite,
'uptime': data.data.uptime
},'logs': service_logs
})
})
}).catch(err => {
server.logger(" [ERROR] Proxmox API Error " + err)
return res.json({ "error": true, "code": 1000, "msg": err })
});
}
} else {
permissions_manager.has_permission(req.query.uuid, "LISTSERVICES").then(function (result_perm) {
permissions_manager.has_permission(req.cookies.uuid, "LISTSERVICES").then(function (result_perm) {
if (result_perm) {
if (result[0].category == 'pterodactyl') {
service_config = JSON.parse(result[0].configuration)
@@ -125,43 +194,122 @@ router.get('', function (req, res) {
}).then(response => {
return response.json()
}).then(data1 => {
var sql = `SELECT * FROM services_logs WHERE service_id = '${id}' ORDER BY timestamp DESC`;
server.con.query(sql, function (err, result1) {
let ii = 0
var service_logs = []
for (let i = 0; i < result1.length; i++) {
ii++
if (ii <= 25) {
service_logs.push({
'timestamp': result1[i].timestamp,
'uuid': result1[i].uuid,
'ip': result1[i].ip,
'action': result1[i].action
})
}
server.fetch(config.pterodactyl_url + "/api/client/servers/" + service_config.identifier, {
"method": "GET",
"headers": {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": `Bearer ${config.pterodactyl_user_api_key}`,
}
return res.json({
'error': false, 'data': {
'id': result[0].id,
'uuid': result[0].uuid,
'name': result[0].name,
'product_id': result[0].product_id,
'price': result[0].price,
'category': result[0].category,
'configuration': service_config,
'statut': result[0].statut,
'resources': data.attributes,
'feature_limits': data.feature_limits,
'allocations': data.relationships,
'websocket': {
'websocket_url': data1.data.socket,
'websocket_token': data1.data.token
}).then(response => {
return response.json()
}).then(data2 => {
server.fetch(config.pterodactyl_url + "/api/application/servers/" + service_config.id, {
"method": "GET",
"headers": {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": `Bearer ${config.pterodactyl_user_api_key}`,
}
}).then(response => {
return response.json()
}).then(data3 => {
let sql = `SELECT * FROM services_logs WHERE service_id = '${id}' ORDER BY timestamp DESC`;
server.con.query(sql, function (err, result1) {
let ii = 0
let service_logs = []
for (let i = 0; i < result1.length; i++) {
ii++
if (ii <= 25) {
service_logs.push({
'timestamp': result1[i].timestamp,
'uuid': result1[i].uuid,
'ip': result1[i].ip,
'action': result1[i].action
})
}
}, 'logs': service_logs
}
return res.json({
'error': false, 'data': {
'id': result[0].id,
'uuid': result[0].uuid,
'name': result[0].name,
'product_id': result[0].product_id,
'price': result[0].price,
'category': result[0].category,
'configuration': service_config,
'environment': data3.attributes.container.environment,
'limits': data3.attributes.limits,
'statut': result[0].statut,
'resources': data.attributes,
'feature_limits': data2.feature_limits,
'allocations': data2.attributes.relationships.allocations.data,
'sftp_details': data2.attributes.sftp_details,
'websocket': {
'websocket_url': data1.data.socket,
'websocket_token': data1.data.token
}
}, 'logs': service_logs
})
})
})
})
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
} else if (result[0].category == 'proxmox') {
service_config = JSON.parse(result[0].configuration)
server.fetch(`${config.proxmox_url}/api2/json/nodes/${service_config.node}/qemu/${service_config.vmid}/status/current`, {
"method": "GET",
"headers": {
"CSRFPreventionToken": server.proxmox_CSRFPreventionToken,
"Cookie": "PVEAuthCookie=" + server.proxmox_ticket
},
"agent": server.httpsAgent
}).then(response => {
return response.json()
}).then(data => {
let sql = `SELECT * FROM services_logs WHERE service_id = '${id}' ORDER BY timestamp DESC`;
server.con.query(sql, function (err, result1) {
let ii = 0
let service_logs = []
for (let i = 0; i < result1.length; i++) {
ii++
if (ii <= 25) {
service_logs.push({
'timestamp': result1[i].timestamp,
'uuid': result1[i].uuid,
'ip': result1[i].ip,
'action': result1[i].action
})
}
}
return res.json({
'error': false, 'data': {
'id': result[0].id,
'uuid': result[0].uuid,
'name': result[0].name,
'product_id': result[0].product_id,
'price': result[0].price,
'category': result[0].category,
'statut': result[0].statut,
'server_status': data.data.status,
'cpus': data.data.cpus,
'maxdisk': data.data.maxdisk,
'maxmem': data.data.maxmem,
'cpu_usage': data.data.cpu,
'mem_usage': data.data.mem,
'net_in': data.data.netin,
'net_out': data.data.netout,
'disk_read': data.data.diskread,
'disk_write': data.data.diskwrite,
'uptime': data.data.uptime
},'logs': service_logs
})
})
}).catch(err => {
server.logger(" [ERROR] Proxmox API Error " + err)
return res.json({ "error": true, "code": 1000, "msg": err })
});
}
} else {
return res.json({
@@ -184,40 +332,47 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// EDIT //
router.put('', jsonParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "EDITSERVICE").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "EDITSERVICE").then(function (result) {
if (result) {
var id = req.params.service_name
let id = req.params.service_name
if (id == undefined) { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 102 }) }
var sql = `SELECT * FROM services WHERE id = '${id}'`;
let sql = `SELECT * FROM services WHERE id = '${id}'`;
server.con.query(sql, function (err, result) {
var sql = `UPDATE services SET uuid = '${req.body.uuid}', name = '${req.body.name}', product_id = '${req.body.product_id}', price = '${req.body.price}', statut = '${req.body.statut}' WHERE id = '${req.body.id}';`;
let sql = `UPDATE services SET uuid = '${req.body.uuid}', name = '${req.body.name}', product_id = '${req.body.product_id}', price = '${req.body.price}', statut = '${req.body.statut}' WHERE id = '${req.body.id}';`;
server.con.query(sql, function (err) {
if (err) { server.logger(" [ERROR] Database error\n " + err); return res.json({ "error": true, "msg": "Database error : " + err }) };
});
server.logger(" [DEBUG] Service " + req.body.name + " updated from " + IP + " with uuid " + req.query.uuid + " !")
if (result[0].name != req.body.name) { server.services_action_logger(req.body.id, req.query.uuid, IP, "Modification du nom du service " + result[0].name + " vers " + req.body.name) }
if (result[0].uuid != req.body.uuid) { server.services_action_logger(req.body.id, req.query.uuid, IP, "Modification du propriétaire du service " + result[0].name + " passant de " + result[0].uuid + " à " + req.body.uuid) }
if (result[0].product_id != req.body.product_id) { server.services_action_logger(req.body.id, req.query.uuid, IP, "Modification du produit du service " + result[0].name + " passant de " + result[0].product_id + " à " + req.body.product_id) }
if (result[0].price != req.body.price) { server.services_action_logger(req.body.id, req.query.uuid, IP, "Modification du prix du service " + result[0].name + " passant de " + result[0].price + " à " + req.body.price) }
if (result[0].statut != req.body.statut) { server.services_action_logger(req.body.id, req.query.uuid, IP, "Modification du status du service " + result[0].name + " passant de " + result[0].statut + " à " + req.body.statut) }
server.logger(" [DEBUG] Service " + req.body.name + " updated from " + IP + " with uuid " + req.cookies.uuid + " !")
if (result[0].name != req.body.name) { server.services_action_logger(req.body.id, req.cookies.uuid, IP, "Modification du nom du service " + result[0].name + " vers " + req.body.name) }
if (result[0].uuid != req.body.uuid) { server.services_action_logger(req.body.id, req.cookies.uuid, IP, "Modification du propriétaire du service " + result[0].name + " passant de " + result[0].uuid + " à " + req.body.uuid) }
if (result[0].product_id != req.body.product_id) { server.services_action_logger(req.body.id, req.cookies.uuid, IP, "Modification du produit du service " + result[0].name + " passant de " + result[0].product_id + " à " + req.body.product_id) }
if (result[0].price != req.body.price) { server.services_action_logger(req.body.id, req.cookies.uuid, IP, "Modification du prix du service " + result[0].name + " passant de " + result[0].price + " à " + req.body.price) }
if (result[0].statut != req.body.statut) { server.services_action_logger(req.body.id, req.cookies.uuid, IP, "Modification du status du service " + result[0].name + " passant de " + result[0].statut + " à " + req.body.statut) }
return res.json({ "error": false, "response": "OK" });
})
} else {
@@ -233,31 +388,40 @@ router.put('', jsonParser, function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// DELETE //
router.delete('', jsonParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var response = "OK"
var error = false
let response = "OK"
let error = false
var IP = req.socket.remoteAddress;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "DELETESERVICE").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "DELETESERVICE").then(function (result) {
if (result) {
var id = req.params.service_name
let id = req.params.service_name
if (id == undefined) { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "Service id params is required", "code": 102 }) }
var sql = `SELECT * FROM services WHERE id = '${id}'`;
let sql = `SELECT * FROM services WHERE id = '${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err), error = true, response = "Database error" };
if (result[0].category == 'pterodactyl') {
@@ -271,7 +435,7 @@ router.delete('', jsonParser, function (req, res) {
}
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
}
var sql = `DELETE FROM services WHERE id='${id}'`;
let sql = `DELETE FROM services WHERE id='${id}'`;
server.con.query(sql, function (err) {
if (err) { server.logger(" [ERROR] Database error\n " + err), error = true, response = "Database error" };
});
@@ -290,6 +454,10 @@ router.delete('', jsonParser, function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,27 +1,32 @@
var router = require('express').Router();
const router = require('express').Router();
const server = require('../../server.js')
var jsonParser = server.parser.json()
const jsonParser = server.parser.json()
const route_name = "/services"
const permissions_manager = require("../../utils/permissions-manager")
const config = require('../../config.json')
server.logger(" [INFO] /api" + route_name + " route loaded !")
router.get('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
const sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "LISTSERVICES").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTSERVICES").then(function (result) {
if (result) {
var sql = `SELECT * FROM services;`;
const sql = `SELECT * FROM services;`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (err) { server.logger(" [ERROR] Database error\n " + err) }
server.fetch(config.pterodactyl_url + "/api/application/servers", {
"method": "GET",
"headers": {
@@ -32,7 +37,7 @@ router.get('', function (req, res) {
}).then(response => {
return response.json()
}).then(data => {
var servers = []
let servers = []
for (let i = 0; i < data.data.length; i++) {
for (let ii = 0; ii < result.length; ii++) {
const configuration = JSON.parse(result[ii].configuration)
@@ -44,32 +49,44 @@ router.get('', function (req, res) {
}
}
}
var services = []
let services = []
for (let i = 0; i < result.length; i++) {
if (data.data[servers[i].ptero_i].attributes.suspended == true) {
statut = "suspended"
} else if (data.data[servers[i].ptero_i].attributes.container.installed == false) {
statut = "installing"
} else {
statut = "active"
if (result[i].category == "pterodactyl") {
if (data.data[servers[i].ptero_i].attributes.suspended == true) {
statut = "suspended"
} else if (data.data[servers[i].ptero_i].attributes.container.installed == false) {
statut = "installing"
} else {
statut = "active"
}
services.push({
"id": result[i].id,
"uuid": result[i].uuid,
"name": result[i].name,
"product_id": result[i].product_id,
"price": result[i].price,
"category": result[i].category,
"statut": statut
})
} else if (result[i].category == "proxmox") {
services.push({
"id": result[i].id,
"uuid": result[i].uuid,
"name": result[i].name,
"product_id": result[i].product_id,
"price": result[i].price,
"category": result[i].category,
"statut": result[i].statut
})
}
services.push({
"id": result[i].id,
"uuid": result[i].uuid,
"name": result[i].name,
"product_id": result[i].product_id,
"price": result[i].price,
"category": result[i].category,
"statut": statut
})
}
return res.json({ 'error': false, 'data': services })
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
});
} else {
var sql = `SELECT * FROM services WHERE uuid = '${req.query.uuid}';`;
const sql = `SELECT * FROM services WHERE uuid = '${req.cookies.uuid}';`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (err) { server.logger(" [ERROR] Database error\n " + err) }
server.fetch(config.pterodactyl_url + "/api/application/servers", {
"method": "GET",
"headers": {
@@ -80,7 +97,7 @@ router.get('', function (req, res) {
}).then(response => {
return response.json()
}).then(data => {
var servers = []
let servers = []
for (let i = 0; i < data.data.length; i++) {
for (let ii = 0; ii < result.length; ii++) {
const configuration = JSON.parse(result[ii].configuration)
@@ -92,9 +109,39 @@ router.get('', function (req, res) {
}
}
}
console.log(servers)
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return req.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
return res.json({ 'error': false, 'data': result })
let services = []
for (let i = 0; i < result.length; i++) {
if (result[i].category == "pterodactyl") {
if (data.data[servers[i].ptero_i].attributes.suspended == true) {
statut = "suspended"
} else if (data.data[servers[i].ptero_i].attributes.container.installed == false) {
statut = "installing"
} else {
statut = "active"
}
services.push({
"id": result[i].id,
"uuid": result[i].uuid,
"name": result[i].name,
"product_id": result[i].product_id,
"price": result[i].price,
"category": result[i].category,
"statut": statut
})
} else if (result[i].category == "proxmox") {
services.push({
"id": result[i].id,
"uuid": result[i].uuid,
"name": result[i].name,
"product_id": result[i].product_id,
"price": result[i].price,
"category": result[i].category,
"statut": result[i].statut
})
}
}
return res.json({ 'error': false, 'data': services })
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
});
}
})
@@ -103,23 +150,33 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
router.post('', jsonParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
const sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
var sql = `SELECT * FROM products WHERE id = '${req.body.product_id}'`;
if (result[0].token === req.cookies.token) {
const sql = `SELECT * FROM products WHERE id = '${req.body.product_id}'`;
server.con.query(sql, async function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result[0].category == "pterodactyl") {
var docker_img = "ghcr.io/pterodactyl/yolks:java_17"
const docker_img = "ghcr.io/pterodactyl/yolks:java_17"
configuration = JSON.parse(result[0].configuration)
let body = {
'name': result[0].name + " " + req.body.srv_info.srv_name,
@@ -176,13 +233,13 @@ router.post('', jsonParser, function (req, res) {
'uuid': data.attributes.uuid
}
service_id = server.crypto.randomBytes(3).toString('hex')
var sql = `INSERT INTO services (id, uuid, name, product_id, price, category, configuration, statut) VALUES('${service_id}', '${req.query.uuid}', '${req.body.srv_info.srv_name}', '${req.body.product_id}', '${result[0].price}', 'pterodactyl', '${JSON.stringify(service_configuration)}', 'installing')`;
const sql = `INSERT INTO services (id, uuid, name, product_id, price, category, configuration, statut) VALUES('${service_id}', '${req.cookies.uuid}', '${req.body.srv_info.srv_name}', '${req.body.product_id}', '${result[0].price}', 'pterodactyl', '${JSON.stringify(service_configuration)}', 'installing')`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
});
server.logger(" [DEBUG] Email to " + req.body.user_info.mail + " from " + config.smtp_username + " sent !")
server.logger(" [DEBUG] New service : " + req.body.srv_info.srv_name + " !")
server.services_action_logger(service_id, req.query.uuid, IP, "Création du service " + req.body.srv_info.srv_name)
server.services_action_logger(service_id, req.cookies.uuid, IP, "Création du service " + req.body.srv_info.srv_name)
return res.json({ "error": false, "response": "OK" });
}).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return req.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) })
} else if (result[0].category == "proxmox") {
@@ -196,8 +253,10 @@ router.post('', jsonParser, function (req, res) {
}
}
})
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,6 +1,6 @@
var router = require('express').Router({ mergeParams: true });
let router = require('express').Router({ mergeParams: true });
const server = require('../../../server.js')
var jsonParser = server.parser.json()
let jsonParser = server.parser.json()
const route_name = "/users/:user_uuid"
const permissions_manager = require("../../../utils/permissions-manager")
server.logger(" [INFO] /api" + route_name + " route loaded !")
@@ -8,30 +8,33 @@ server.logger(" [INFO] /api" + route_name + " route loaded !")
// GET INFOS //
router.get('', function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (err) { server.logger(" [ERROR] Database error\n " + err) }
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token == req.query.token) {
permissions_manager.has_permission(req.query.uuid, "LISTUSERS").then(function (result) {
if (result[0].token == req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTUSERS").then(function (result) {
if (result) {
var id = req.params.user_uuid
let id = req.params.user_uuid
if (id == undefined) { return res.json({ 'error': true, 'msg': "User id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "User id params is required", "code": 102 }) }
var sql = `SELECT * FROM users WHERE uuid = '${id}'`;
let sql = `SELECT * FROM users WHERE uuid = '${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (err) { server.logger(" [ERROR] Database error\n " + err) }
if (result.length > 0) {
var sql = `SELECT * FROM roles WHERE id = '${result[0].role}'`;
let sql = `SELECT * FROM roles WHERE id = '${result[0].role}'`;
server.con.query(sql, function (err, result1) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (err) { server.logger(" [ERROR] Database error\n " + err) }
return res.json({
'error': false,
'data': {
@@ -74,44 +77,51 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// EDIT //
router.put('', jsonParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var response = "OK"
var error = false
var IP = req.socket.remoteAddress;
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let response = "OK"
let error = false
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (err) { server.logger(" [ERROR] Database error\n " + err) }
if (result.length == 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "EDITUSER").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "EDITUSER").then(function (result) {
if (result) {
var id = req.params.user_uuid
let id = req.params.user_uuid
if (id == undefined) { return res.json({ 'error': true, 'msg': "User id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "User id params is required", "code": 102 }) }
if (req.body.password != "Q@4%738r$7") {
server.bcrypt.hash(req.body.password, 10, function (err, hash) {
var sql = `UPDATE users SET username = '${req.body.username}', token = '${server.crypto.randomBytes(20).toString('hex')}', password = '${hash}', role = '${req.body.role}', mail = '${req.body.mail}', first_name = '${req.body.first_name}', last_name = '${req.body.last_name}', tel = '${req.body.tel}', address_1 = '${req.body.address_1}', address_2 = '${req.body.address_2}', city = '${req.body.city}', zip = '${req.body.zip}', country = '${req.body.country}', state = '${req.body.state}' WHERE uuid = '${id}';`;
let sql = `UPDATE users SET username = '${req.body.username}', token = '${server.crypto.randomBytes(20).toString('hex')}', password = '${hash}', role = '${req.body.role}', mail = '${req.body.mail}', first_name = '${req.body.first_name}', last_name = '${req.body.last_name}', tel = '${req.body.tel}', address_1 = '${req.body.address_1}', address_2 = '${req.body.address_2}', city = '${req.body.city}', zip = '${req.body.zip}', country = '${req.body.country}', state = '${req.body.state}' WHERE uuid = '${id}';`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err); return res.json({ "error": true, "msg": "Database error : " + err }) };
if (err) { server.logger(" [ERROR] Database error\n " + err); return res.json({ "error": true, "msg": "Database error : " + err }) }
});
server.logger(" [DEBUG] User " + req.body.username + " updated !")
return res.json({ "error": false, "response": "OK" });
})
} else {
var sql = `UPDATE users SET username = '${req.body.username}', role = '${req.body.role}', mail = '${req.body.mail.toLowerCase()}', first_name = '${req.body.first_name}', last_name = '${req.body.last_name}', tel = '${req.body.tel}', address_1 = '${req.body.address_1}', address_2 = '${req.body.address_2}', city = '${req.body.city}', zip = '${req.body.zip}', country = '${req.body.country}', state = '${req.body.state}' WHERE uuid = '${id}';`;
let sql = `UPDATE users SET username = '${req.body.username}', role = '${req.body.role}', mail = '${req.body.mail.toLowerCase()}', first_name = '${req.body.first_name}', last_name = '${req.body.last_name}', tel = '${req.body.tel}', address_1 = '${req.body.address_1}', address_2 = '${req.body.address_2}', city = '${req.body.city}', zip = '${req.body.zip}', country = '${req.body.country}', state = '${req.body.state}' WHERE uuid = '${id}';`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err); return res.json({ "error": true, "msg": "Database error : " + err }) };
if (err) { server.logger(" [ERROR] Database error\n " + err); return res.json({ "error": true, "msg": "Database error : " + err }) }
});
server.logger(" [DEBUG] User " + req.body.username + " updated !")
return res.json({ "error": false, "response": "OK" });
@@ -128,33 +138,43 @@ router.put('', jsonParser, function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// DELETE //
router.delete('', jsonParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
var response = "OK"
var error = false
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let response = "OK"
let error = false
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
var IP = req.socket.remoteAddress;
if (err) { server.logger(" [ERROR] Database error\n " + err) };
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
if (err) { server.logger(" [ERROR] Database error\n " + err) }
if (result.length == 0) {
returnres.json({ 'error': true, 'code': 404 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "DELETEUSER").then(function (result) {
var id = req.params.user_uuid
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "DELETEUSER").then(function (result) {
let id = req.params.user_uuid
if (id == undefined) { return res.json({ 'error': true, 'msg': "User id params is required", "code": 101 }) }
if (id == "") { return res.json({ 'error': true, 'msg': "User id params is required", "code": 102 }) }
if (result) {
var sql = `DELETE FROM users WHERE uuid='${id}'`;
let sql = `DELETE FROM users WHERE uuid='${id}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err), error = true, response = "Database error" };
if (err) { server.logger(" [ERROR] Database error\n " + err), error = true, response = "Database error" }
});
server.logger(" [DEBUG] User " + id + " deleted by " + req.query.uuid + " from " + IP + " !")
server.logger(" [DEBUG] User " + id + " deleted by " + req.cookies.uuid + " from " + IP + " !")
return res.json({ "error": error, "response": response });
} else {
return res.json({
@@ -168,6 +188,10 @@ router.delete('', jsonParser, function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,38 +1,45 @@
var router = require('express').Router({ mergeParams: true });
const router = require('express').Router({ mergeParams: true });
const server = require('../../../server.js')
var jsonParser = server.parser.json()
const jsonParser = server.parser.json()
const route_name = "/users/login/:user_mail"
server.logger(" [INFO] /api" + route_name + " route loaded !")
router.post('', jsonParser, function (req, res) {
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
var mail = req.params.user_mail
if (mail == undefined) { return res.json({ 'error': true, 'msg': "User mail params is required", "code": 101 }) }
if (mail == "") { return res.json({ 'error': true, 'msg': "User mail params is required", "code": 102 }) }
var sql = `SELECT password FROM users WHERE mail = '${mail}'`;
const start = process.hrtime()
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let mail = req.params.user_mail
if (mail === undefined) { return res.json({ 'error': true, 'msg': "User mail params is required", "code": 101 }) }
if (mail === "") { return res.json({ 'error': true, 'msg': "User mail params is required", "code": 102 }) }
let sql = `SELECT password FROM users WHERE mail = '${mail}'`;
server.con.query(sql, function (err, result) {
if (err) throw err;
if (result.length == 0) {
if (result.length === 0) {
return res.json({ 'error': true, 'code': 404 })
} else {
server.bcrypt.compare(req.body.password, result[0].password, function (err, result) {
if (result === true) {
var sql = `SELECT * FROM users WHERE mail = '${mail}'`;
const sql = `SELECT * FROM users WHERE mail = '${mail}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (err) { server.logger(" [ERROR] Database error\n " + err) }
res.json({ 'error': false, 'uuid': result[0].uuid, 'token': result[0].token })
return server.logger(' [DEBUG] User ' + mail + ' successful login from ' + IP)
return server.logger(' [INFO] User ' + mail + ' successful logged in from ' + IP)
});
} else {
res.json({ 'error': true, 'code': 403 })
return server.logger(' [DEBUG] User ' + mail + ' unsuccessful login from ' + IP + '!')
return server.logger(' [INFO] User ' + mail + ' unsuccessful logged in from ' + IP + '!')
}
});
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -1,6 +1,6 @@
var router = require('express').Router();
let router = require('express').Router();
const server = require('../../server.js')
var jsonParser = server.parser.json()
let jsonParser = server.parser.json()
const route_name = "/users"
const permissions_manager = require("../../utils/permissions-manager")
server.logger(" [INFO] /api" + route_name + " route loaded !")
@@ -9,24 +9,27 @@ server.logger(" [INFO] /api" + route_name + " route loaded !")
// USERS LIST //
router.get('', function (req, res) {
ipInfo = server.ip(req);
var IP = req.socket.remoteAddress;
server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
const start = process.hrtime()
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
const sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length == 0) {
return res.json({ 'error': true, 'code': 401 })
} else {
if (result[0].token === req.query.token) {
permissions_manager.has_permission(req.query.uuid, "LISTUSERS").then(function (result) {
if (result[0].token === req.cookies.token) {
permissions_manager.has_permission(req.cookies.uuid, "LISTUSERS").then(function (result) {
if (result) {
var sql = `SELECT * FROM users`;
let sql = `SELECT * FROM users`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
users = []
for (var i = 0; i < result.length; i++) {
for (let i = 0; i < result.length; i++) {
users.push({
"uuid": result[i].uuid,
"username": result[i].username,
@@ -53,27 +56,37 @@ router.get('', function (req, res) {
}
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
// CREATE //
router.post('', jsonParser, function (req, res) {
var IP = req.socket.remoteAddress;
var sql = `SELECT mail FROM users WHERE mail = '${req.body.mail.toLowerCase()}'`;
const start = process.hrtime()
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
let sql = `SELECT mail FROM users WHERE mail = '${req.body.mail.toLowerCase()}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length > 0) {
return res.json({ "error": true, "msg": "Mail already used" })
} else {
var sql = `SELECT username FROM users WHERE username = '${req.body.username}'`;
let sql = `SELECT username FROM users WHERE username = '${req.body.username}'`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
if (result.length > 0) {
return res.json({ "error": true, "msg": "Username already exist" })
} else {
server.bcrypt.hash(req.body.password, 10, function (err, hash) {
var sql = `INSERT INTO users (uuid, username, role, mail, token, password, first_name, last_name, tel, address_1, address_2, city, zip, country, state, balance, tickets, services, suspend_services, alerts) VALUES('${server.uuid.v4()}', '${req.body.username}', '${req.body.role}', '${req.body.mail.toLowerCase()}', '${server.crypto.randomBytes(20).toString('hex')}', '${hash}', '${req.body.first_name}', '${req.body.last_name}', '${req.body.tel}', '${req.body.address_1}', '${req.body.address_2}', '${req.body.city}', '${req.body.zip}', '${req.body.country}', '${req.body.state}', 0, 0, 0, 0, 0)`;
let sql = `INSERT INTO users (uuid, username, role, mail, token, password, first_name, last_name, tel, address_1, address_2, city, zip, country, state, balance, tickets, services, suspend_services, alerts) VALUES('${server.uuid.v4()}', '${req.body.username}', '${req.body.role}', '${req.body.mail.toLowerCase()}', '${server.crypto.randomBytes(20).toString('hex')}', '${hash}', '${req.body.first_name}', '${req.body.last_name}', '${req.body.tel}', '${req.body.address_1}', '${req.body.address_2}', '${req.body.city}', '${req.body.zip}', '${req.body.country}', '${req.body.state}', 0, 0, 0, 0, 0)`;
server.con.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err); return res.json({ "error": true, "msg": "Database error " + err }) };
});
@@ -84,6 +97,10 @@ router.post('', jsonParser, function (req, res) {
});
}
});
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds(start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})

View File

@@ -1,20 +1,20 @@
var router = require('express').Router();
let router = require('express').Router();
const server = require('../../server.js')
var jsonParser = server.parser.json()
let jsonParser = server.parser.json()
const config = require('../../config.json');
const route_name = "/utils/send-mail"
server.logger(" [INFO] /api" + route_name + " route loaded !")
router.post('', jsonParser, function (req, res) {
const start = process.hrtime()
ipInfo = server.ip(req);
server.logger(' [DEBUG] GET from : ' + ipInfo.clientIp.split("::ffff:")[1] + `, ${req.query.uuid}`)
var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`;
let sql = `SELECT token FROM users WHERE uuid = '${req.cookies.uuid}'`;
server.con.query(sql, function (err, result) {
if (err) {server.logger(" [ERROR] Database error\n " + err)};
if (result.length == 0) {
return res.json({'error': true, 'code': 404})
} else {
if (result[0].token === req.query.token) {
if (result[0].token === req.cookies.token) {
server.mail_transporter.sendMail({
from: config.smtp_username,
to: req.body.to,
@@ -28,6 +28,10 @@ router.post('', jsonParser, function (req, res) {
}
}
})
res.on('finish', () => {
const durationInMilliseconds = server.getDurationInMilliseconds (start)
server.logger(` [DEBUG] ${req.method} ${route_name} [FINISHED] [FROM ${IP}] in ${durationInMilliseconds.toLocaleString()} ms`)
})
})
module.exports = router;

View File

@@ -0,0 +1,93 @@
const WebSocket = require('ws');
// Créer un serveur WebSocket
const wss = new WebSocket.Server({
port: 8080
});
// Stocker les sessions et leurs requêtes
const sessions = new Map();
// Définir la requête par défaut pour une session
const defaultRequest = {
url: 'http://localhost:8000',
headers: {}
};
// Fonction pour traiter les messages reçus
wss.on('connection', (ws) => {
let session = null;
ws.on('message', (message) => {
try {
const data = JSON.parse(message);
if (data.session) {
// Si la session existe déjà, récupérer la requête stockée
session = sessions.get(data.session);
} else {
// Sinon, créer une nouvelle session et une requête par défaut
session = {
id: Math.random().toString(36).substr(2, 9),
request: defaultRequest
};
sessions.set(session.id, session);
}
} catch (error) {
console.error(error);
return;
}
});
// Envoyer les données mises à jour toutes les secondes
setInterval(() => {
if (session) {
// Envoyer la requête stockée pour la session
const requestOptions = {
url: session.request.url,
headers: session.request.headers
};
// Effectuer une requête HTTP et renvoyer les résultats
makeRequest(requestOptions, (result) => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify(result));
}
});
}
}, 1000);
});
// Fonction pour effectuer une requête HTTP
function makeRequest(options, callback) {
// Utiliser la bibliothèque "request" pour effectuer une requête HTTP
const request = require('request');
request(options, (error, response, body) => {
if (error) {
console.error(error);
return;
}
const result = JSON.parse(body);
callback(result);
});
}
// Lancer le serveur Express pour l'API
app.get('/', (req, res) => {
// Vérifier les paramètres de la requête et récupérer la session
const session = sessions.get(req.query.session);
if (!session) {
res.status(400).send('Session invalide');
return;
}
// Récupérer les paramètres de la requête et les stocker pour la session
const request = {
url: req.query.url,
headers: req.query.headers
};
session.request = request;
// Répondre avec un message de confirmation
res.send('Requête mise à jour pour la session ' + session.id);
});
// Démarrer le serveur Express pour l'API
app.listen(port, () => {
console.log(`Serveur API lancé sur http://localhost:${port}`);
});

View File

@@ -1,8 +1,9 @@
const https = require('https');
const express = require('express');
var getIP = require('ipware')().get_ip;
const getIP = require('ipware')().get_ip;
const fs = require('fs')
var crypto = require("crypto");
const crypto = require("crypto");
const cookieParser = require('cookie-parser');
const uuid = require('uuid');
const bodyParser = require('body-parser')
const bcrypt = require('bcrypt')
@@ -13,12 +14,12 @@ const fetch = require('node-fetch');
const httpsAgent = new https.Agent({
rejectUnauthorized: false,
});
var server_opt = {
const server_opt = {
cert: fs.readFileSync(config.api_ssl_cert_path),
key: fs.readFileSync(config.api_ssl_privkey_path)
}
let start_date = new Date();;
let start_date = new Date();
let date = ("0" + start_date.getDate()).slice(-2);
let month = ("0" + (start_date.getMonth() + 1)).slice(-2);
let year = start_date.getFullYear();
@@ -39,15 +40,23 @@ function logger(msg) {
if (seconds < 10) { seconds = "0" + seconds }
if (hours < 10) { hours = "0" + hours }
if (minutes < 10) { minutes = "0" + minutes }
console.log('[' + year + "-" + month + "-" + date + " " + hours + ":" + minutes + ":" + seconds + '] ' + msg)
fs.appendFileSync('logs/' + start_time + '.log', '[' + year + "-" + month + "-" + date + " " + hours + ":" + minutes + ":" + seconds + '] ' + msg + '\n')
fs.appendFileSync('logs/latest.log', '[' + year + "-" + month + "-" + date + " " + hours + ":" + minutes + ":" + seconds + '] ' + msg + '\n')
console.log('[' + year + "-" + month + "-" + date + " " + hours + ":" + minutes + ":" + seconds + ']' + msg)
fs.appendFileSync('logs/' + start_time + '.log', '[' + year + "-" + month + "-" + date + " " + hours + ":" + minutes + ":" + seconds + ']' + msg + '\n')
fs.appendFileSync('logs/latest.log', '[' + year + "-" + month + "-" + date + " " + hours + ":" + minutes + ":" + seconds + ']' + msg + '\n')
}
const getDurationInMilliseconds = (start) => {
const NS_PER_SEC = 1e9
const NS_TO_MS = 1e6
const diff = process.hrtime(start)
return (diff[0] * NS_PER_SEC + diff[1]) / NS_TO_MS
}
logger(" [INFO] The API is starting...")
var mysql = require('mysql');
var connection = mysql.createConnection({
const mysql = require('mysql');
const connection = mysql.createConnection({
host: config.mysql_host,
user: config.mysql_usr,
password: config.mysql_passwd,
@@ -63,6 +72,7 @@ exports.logger = logger
exports.con = connection
exports.ip = getIP
exports.httpsAgent = httpsAgent
exports.getDurationInMilliseconds = getDurationInMilliseconds
logger(`
@@ -79,12 +89,12 @@ connection.connect(function (err) {
logger(` [ERROR] Database error !\n ${err.stack}`);
process.exit(1);
}
logger(` [INFO] Database succefull connected ! (${connection.threadId})`);
logger(` [INFO] Database successfully connected ! (${connection.threadId})`);
function services_action_logger(service_id, uuid, ip, action) {
var sql = `INSERT INTO services_logs (service_id, timestamp, uuid, ip, action) VALUES('${service_id}', '${Date.now()}', '${uuid}', '${ip}', '${action}')`;
connection.query(sql, function (err, result) {
if (err) { server.logger(" [ERROR] Database error\n " + err) };
let sql = `INSERT INTO services_logs (service_id, timestamp, uuid, ip, action) VALUES('${service_id}', '${Date.now()}', '${uuid}', '${ip}', '${action}')`;
connection.query(sql, function (err) {
if (err) { server.logger(" [ERROR] Database error\n " + err) }
});
}
exports.services_action_logger = services_action_logger
@@ -103,7 +113,7 @@ connection.connect(function (err) {
exports.proxmox_ticket = proxmox_ticket
exports.proxmox_CSRFPreventionToken = proxmox_CSRFPreventionToken
logger(" [INFO] Proxmox API loaded ! (" + data.data.username + ")");
let mail_transporter = nodemailer.createTransport({
exports.mail_transporter = nodemailer.createTransport({
host: config.smtp_host,
port: config.smtp_port,
secure: config.smtp_ssl,
@@ -112,16 +122,16 @@ connection.connect(function (err) {
pass: config.smtp_pswd
}
})
exports.mail_transporter = mail_transporter
logger(" [INFO] SMTP Client loaded ! (" + config.smtp_host + ":" + config.smtp_port + ")");
app.use((req, res, next) => {
res.append('Access-Control-Allow-Origin', ['*']);
res.append('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.append('Access-Control-Allow-Headers', 'Content-Type');
res.append("Access-Control-Allow-Headers", "auth-uuid, auth-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
next();
bodyParser.json();
});
app.use(require('./utils/rate-limit'));
app.use(cookieParser());
// app.use(require('./utils/sql-injection'));
// index //
@@ -150,16 +160,25 @@ connection.connect(function (err) {
app.use('/api/services/:service_name/files', require('./routes/services/infos/files/service-files'));
app.use('/api/services/:service_name/files/delete', require('./routes/services/infos/files/delete-files'));
app.use('/api/services/:service_name/file', require('./routes/services/infos/files/service-file'));
app.use('/api/services/:service_name/proxmox/vnc/ticket', require('./routes/services/infos/proxmox/vnc/ticket'));
app.use('/api/services/:service_name/proxmox/vnc/websocket', require('./routes/services/infos/proxmox/vnc/websocket'));
// upgrades //
app.use('/api/upgrades', require('./routes/products/upgrades/upgrades'));
// utils //
app.use('/api/utils/send-mail', require('./routes/utils/send-mail'));
https.createServer(server_opt, app).listen(config.api_port, config.api_bind_address, function () {
logger(` [INFO] MercuryCloud API v${config.api_version} listening on ${config.api_url + ":" + config.api_port} !`)
logger(` [INFO] MercuryCloud API v${config.api_version} listening on ${config.api_url} !`)
});
}).catch((error) => {
logger(" [ERROR] Proxmox API error : " + error);
if (error.toString().includes("null (reading 'ticket')")) {
logger(" [ERROR] Proxmox API error : Wrong user password or username !");
} else {
logger(" [ERROR] Proxmox API error : " + error);
}
process.exit(1);
});
});
});

View File

@@ -1,15 +1,15 @@
const server = require('../server.js')
function has_permission(uuid, permission) {
var sql = `SELECT role FROM users WHERE uuid = '${uuid}'`;
let sql = `SELECT role FROM users WHERE uuid = '${uuid}'`;
return new Promise(function(resolve, reject) {
server.con.query(sql, function (err, result) {
if (err) {reject(err)}
if (result[0].role.length > 0) {
var sql = `SELECT permissions FROM roles WHERE id = '${result[0].role}'`;
let sql = `SELECT permissions FROM roles WHERE id = '${result[0].role}'`;
server.con.query(sql, function (err, result) {
if (err) {reject(err)}
permissions = result[0].permissions.split(",")
let permissions = result[0].permissions.split(",")
if (permissions.includes("ADMIN")) {
resolve(true)
} else if (permissions.includes(permission)) {
@@ -25,4 +25,4 @@ function has_permission(uuid, permission) {
})
}
exports.has_permission = has_permission
exports.has_permission = has_permission

View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -4,7 +4,12 @@ const config = require('../config.json')
// fs.readdirSync('utils/rate-limit-windows/').forEach(f => fs.rmSync(`${'utils/rate-limit-windows/'}/${f}`))
function middleware(req, res, next) {
var IP = req.socket.remoteAddress;
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
if (fs.existsSync('utils/rate-limit-windows/' + IP + '.json')) {
fs.readFile('utils/rate-limit-windows/' + IP + '.json', 'utf8', (err, data) => {
data_parsed = JSON.parse(data)
@@ -16,7 +21,7 @@ function middleware(req, res, next) {
} else {
if (data_parsed.rate >= config.rate_limit_max_rate) {
server.logger(" [DEBUG] " + IP + " rate limit !")
return res.json({ "error": true, "code": 429, "msg": "Your IP has been rate limit! This incident will be reported to the administrators." })
return res.json({ "error": true, "code": 429, "msg": "Your IP has been blocked for rate limit! This incident will be reported to the administrators." })
} else {
data_parsed.rate++
fs.writeFileSync('utils/rate-limit-windows/' + IP + '.json', JSON.stringify(data_parsed))

View File

@@ -1,41 +1,29 @@
const rawbody = require('raw-body');
const server = require('../server')
function hasSql(value) {
function validateInput(data) {
// Échappez tous les caractères spéciaux et les commentaires
// data = data.replace(/[-'`~!@#$%^&*()_|+=?;:'",.<>\{\}\[\]\\\/]/gi, '');
// data = data.replace(/\/\*[\s\S]*?\*\//g, '');
if (value === null || value === undefined) {
return false;
}
var sql_meta = new RegExp('(%27)|(\')|(--)|(%23)|(#)', 'i');
if (sql_meta.test(value)) {
return true;
}
var sql_meta2 = new RegExp('((%3D)|(=))[^\n]*((%27)|(\')|(--)|(%3B)|(;))', 'i');
if (sql_meta2.test(value)) {
return true;
}
var sql_typical = new RegExp('w*((%27)|(\'))((%6F)|o|(%4F))((%72)|r|(%52))', 'i');
if (sql_typical.test(value)) {
return true;
}
var sql_union = new RegExp('((%27)|(\'))union', 'i');
if (sql_union.test(value)) {
return true;
// Vérifiez si la chaîne contient des mots-clés SQL
const sqlKeywords = ['SELECT', 'FROM', 'WHERE', 'AND', 'OR', 'INSERT', 'UPDATE', 'DELETE', 'CREATE', 'DROP', 'ALTER', 'TABLE'];
const normalizedData = data.toUpperCase();
for (const keyword of sqlKeywords) {
if (normalizedData.includes(keyword)) {
return true;
}
}
// Si aucune erreur n'a été levée jusqu'à présent, cela signifie que les données sont valides
return false;
}
function middleware(req, res, next) {
var containsSql = false;
if (req.originalUrl !== null && req.originalUrl !== undefined) {
if (hasSql(req.originalUrl) === true) {
if (validateInput(req.originalUrl) === true) {
containsSql = true;
}
}
@@ -43,7 +31,7 @@ function middleware(req, res, next) {
if (containsSql === false) {
rawbody(req, {
encoding: 'utf8'
}, function(err, body) {
}, function (err, body) {
if (err) {
return next(err);
@@ -55,40 +43,40 @@ function middleware(req, res, next) {
body = JSON.stringify(body);
}
if (hasSql(body) === true) {
if (validateInput(body) === true) {
containsSql = true;
}
}
if (containsSql === true) {
var forwardedIpsStr = req.header('x-forwarded-for');
var IP = '';
if (forwardedIpsStr) {
IP = forwardedIps = forwardedIpsStr.split(',')[0];
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
server.logger(" [DEBUG] SQL injection from " + IP)
return res.status(403).json({
server.logger(" [DEBUG] Request body or params is not secure! [FROM " + IP + "] Body: " + body)
return res.status(500).json({
'error': true,
'code': 403,
'msg': 'SQL injection in the request! This incident will be reported to the administrators.'
'code': 500,
'msg': 'Request body or params is not secure! This incident will be reported to the administrators.'
});
} else {
next();
}
});
} else {
var forwardedIpsStr = req.header('x-forwarded-for');
var IP = '';
if (forwardedIpsStr) {
IP = forwardedIps = forwardedIpsStr.split(',')[0];
let IP = ""
if (req.headers['x-forwarded-for'] == undefined) {
IP = req.socket.remoteAddress.replace("::ffff:", "")
} else {
IP = req.headers['x-forwarded-for'].split(',')[0]
}
server.logger(" [DEBUG] SQL injection from " + IP)
return res.status(403).json({
server.logger(" [DEBUG] Request body or params is not secure! [FROM " + IP + "] URL: " + req.originalUrl)
return res.status(500).json({
'error': true,
'code': 403,
'msg': 'SQL injection in the request! This incident will be reported to the administrators.'
'code': 500,
'msg': 'Request body or params is not secure! This incident will be reported to the administrators.'
});
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,424 +0,0 @@
(function () {
"use strict";
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}
const url = new URL(window.location.href);
if (url.searchParams.get('id')) {
fetch(`https://dash.mercurycloud.fr:8000/api/products/${url.searchParams.get('id')}?uuid=${getCookie("uuid")}&token=${getCookie("token")}`)
.then(function (response) {
return response.json();
})
.then(function (json) {
console.log(json)
if (json.error === false) {
if (json.data.id == 404) {
window.location.replace("/dashboard/errors/error404.html");
}
} else {
window.location.replace("/dashboard/errors/error500.html");
}
})
} else {
window.location.replace("/dashboard/errors/error404.html");
}
async function postData(url = '', data = {}) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
return response.json()
}
var form1
var form2
var form
/*---------------------------------------------------------------------
Fieldset
-----------------------------------------------------------------------*/
let currentTab = 0;
const ActiveTab = (n) => {
if (n == 0) {
document.getElementById("account").classList.add("active");
document.getElementById("account").classList.remove("done");
document.getElementById("personal").classList.remove("done");
document.getElementById("personal").classList.remove("active");
}
if (n == 1) {
form1 = {
"cycle": document.getElementById("cycle-fac").value,
"srv_name": document.getElementById("srv-name").value,
"srv_type": 1,
"srv_nest": 2,
"db_sup": document.getElementById("db-sup").value,
"bkp_sup": document.getElementById("bkp-sup").value
}
fetch(`https://dash.mercurycloud.fr:8000/api/users/${getCookie('uuid')}?uuid=${getCookie('uuid')}&token=${getCookie('token')}&id=${getCookie('uuid')}`)
.then(function (response) {
return response.json();
})
.then(function (json) {
console.log(json)
if (json.error === false) {
document.getElementById("first-name").value = json.data.first_name
document.getElementById("last-name").value = json.data.last_name
document.getElementById("mail").value = json.data.mail
document.getElementById("tel").value = json.data.tel
document.getElementById("address-1").value = json.data.address_1
document.getElementById("address-2").value = json.data.address_2
document.getElementById("city").value = json.data.city
document.getElementById("zip").value = json.data.zip
document.getElementById("country").value = json.data.country
document.getElementById("state").value = json.data.state
}
document.getElementById("account").classList.add("done");
document.getElementById("personal").classList.add("active");
document.getElementById("personal").classList.remove("done");
document.getElementById("payment").classList.remove("active");
document.getElementById("payment").classList.remove("done");
document.getElementById("confirm").classList.remove("done");
document.getElementById("confirm").classList.remove("active");
if (document.getElementById("first-name").value.length > 2) {
document.getElementById("first-name").classList.remove('is-invalid')
document.getElementById("first-name").classList.add('is-valid')
} else {
document.getElementById("first-name").classList.remove('is-valid')
document.getElementById("first-name").classList.add('is-invalid')
document.getElementById("first-name").value = ""
}
if (document.getElementById("last-name").value.length > 2) {
document.getElementById("last-name").classList.remove('is-invalid')
document.getElementById("last-name").classList.add('is-valid')
} else {
document.getElementById("last-name").classList.remove('is-valid')
document.getElementById("last-name").classList.add('is-invalid')
document.getElementById("last-name").value = ""
}
if (document.getElementById("mail").value.length > 2) {
document.getElementById("mail").classList.remove('is-invalid')
document.getElementById("mail").classList.add('is-valid')
} else {
document.getElementById("mail").classList.remove('is-valid')
document.getElementById("mail").classList.add('is-invalid')
document.getElementById("mail").value = ""
}
if (document.getElementById("tel").value.length == 12 && document.getElementById("tel").value.match(/[0-9]/gi) != null && document.getElementById("tel").value.includes("+", 0) == true) {
document.getElementById("tel").classList.remove('is-invalid')
document.getElementById("tel").classList.add('is-valid')
} else {
document.getElementById("tel").classList.remove('is-valid')
document.getElementById("tel").classList.add('is-invalid')
document.getElementById("tel").value = ""
}
if (document.getElementById("address-1").value.length > 2) {
document.getElementById("address-1").classList.remove('is-invalid')
document.getElementById("address-1").classList.add('is-valid')
} else {
document.getElementById("address-1").classList.remove('is-valid')
document.getElementById("address-1").classList.add('is-invalid')
document.getElementById("address-1").value = ""
}
if (document.getElementById("city").value.length > 2) {
document.getElementById("city").classList.remove('is-invalid')
document.getElementById("city").classList.add('is-valid')
} else {
document.getElementById("city").classList.remove('is-valid')
document.getElementById("city").classList.add('is-invalid')
document.getElementById("city").value = ""
}
if (document.getElementById("zip").value.length == 5 && /^\d+$/.test(document.getElementById("zip").value) == true) {
document.getElementById("zip").classList.remove('is-invalid')
document.getElementById("zip").classList.add('is-valid')
} else {
document.getElementById("zip").classList.remove('is-valid')
document.getElementById("zip").classList.add('is-invalid')
document.getElementById("zip").value = ""
}
if (document.getElementById("country").value > 0) {
document.getElementById("country").classList.remove('is-invalid')
document.getElementById("country").classList.add('is-valid')
} else {
document.getElementById("country").classList.remove('is-valid')
document.getElementById("country").classList.add('is-invalid')
document.getElementById("country").value = ""
}
if (document.getElementById("state").value.length > 2) {
document.getElementById("state").classList.remove('is-invalid')
document.getElementById("state").classList.add('is-valid')
} else {
document.getElementById("state").classList.remove('is-valid')
document.getElementById("state").classList.add('is-invalid')
document.getElementById("state").value = ""
}
})
}
if (n == 2) {
form2 = {
"first_name": document.getElementById("first-name").value,
"last_name": document.getElementById("last-name").value,
"mail": document.getElementById("mail").value,
"tel": document.getElementById("tel").value,
"address_1": document.getElementById("address-1").value,
"address_2": document.getElementById("address-2").value,
"city": document.getElementById("city").value,
"zip": document.getElementById("zip").value,
"country": document.getElementById("country").value,
"state": document.getElementById("state").value
}
document.getElementById("account").classList.add("done");
document.getElementById("personal").classList.add("done");
document.getElementById("payment").classList.add("active");
document.getElementById("payment").classList.remove("done");
document.getElementById("confirm").classList.remove("done");
document.getElementById("confirm").classList.remove("active");
}
if (n == 3) {
document.getElementById("account").classList.add("done");
document.getElementById("personal").classList.add("done");
document.getElementById("payment").classList.add("done");
document.getElementById("confirm").classList.add("active");
document.getElementById("confirm").classList.remove("done");
}
}
const showTab = (n) => {
var x = document.getElementsByTagName("fieldset");
x[n].style.display = "block";
console.log(n);
ActiveTab(n);
}
const nextBtnFunction = (n) => {
var x = document.getElementsByTagName("fieldset");
x[currentTab].style.display = "none";
currentTab = currentTab + n;
showTab(currentTab);
}
const nextbtn = document.querySelectorAll('.next')
Array.from(nextbtn, (nbtn) => {
nbtn.addEventListener('click', function () {
console.log("tab " + currentTab)
if (currentTab == 0) {
var ok = 0
var no = 0
if (document.getElementById('cycle-fac').value > 0) {
document.getElementById('cycle-fac').classList.remove('is-invalid')
document.getElementById('cycle-fac').classList.add('is-valid')
ok++
} else {
document.getElementById('cycle-fac').classList.remove('is-valid')
document.getElementById('cycle-fac').classList.add('is-invalid')
document.getElementById('cycle-fac').value = "0"
no++
}
if (document.getElementById('srv-name').value.length > 2) {
document.getElementById('srv-name').classList.remove('is-invalid')
document.getElementById('srv-name').classList.add('is-valid')
ok++
} else {
document.getElementById('srv-name').classList.remove('is-valid')
document.getElementById('srv-name').classList.add('is-invalid')
document.getElementById('srv-name').value = ""
no++
}
if (ok == 2 && no == 0) {
nextBtnFunction(1);
}
}
if (currentTab == 1) {
var ok = 0
var no = 0
if (document.getElementById("first-name").value.length > 2) {
document.getElementById("first-name").classList.remove('is-invalid')
document.getElementById("first-name").classList.add('is-valid')
ok++
} else {
document.getElementById("first-name").classList.remove('is-valid')
document.getElementById("first-name").classList.add('is-invalid')
document.getElementById("first-name").value = ""
no++
}
if (document.getElementById("last-name").value.length > 2) {
document.getElementById("last-name").classList.remove('is-invalid')
document.getElementById("last-name").classList.add('is-valid')
ok++
} else {
document.getElementById("last-name").classList.remove('is-valid')
document.getElementById("last-name").classList.add('is-invalid')
document.getElementById("last-name").value = ""
no++
}
if (document.getElementById("mail").value.length > 2) {
document.getElementById("mail").classList.remove('is-invalid')
document.getElementById("mail").classList.add('is-valid')
ok++
} else {
document.getElementById("mail").classList.remove('is-valid')
document.getElementById("mail").classList.add('is-invalid')
document.getElementById("mail").value = ""
no++
}
if (document.getElementById("tel").value.length == 12 && document.getElementById("tel").value.match(/[0-9]/gi) != null && document.getElementById("tel").value.includes("+", 0) == true) {
document.getElementById("tel").classList.remove('is-invalid')
document.getElementById("tel").classList.add('is-valid')
ok++
} else {
document.getElementById("tel").classList.remove('is-valid')
document.getElementById("tel").classList.add('is-invalid')
document.getElementById("tel").value = ""
no++
}
if (document.getElementById("address-1").value.length > 2) {
document.getElementById("address-1").classList.remove('is-invalid')
document.getElementById("address-1").classList.add('is-valid')
ok++
} else {
document.getElementById("address-1").classList.remove('is-valid')
document.getElementById("address-1").classList.add('is-invalid')
document.getElementById("address-1").value = ""
no++
}
if (document.getElementById("city").value.length > 2) {
document.getElementById("city").classList.remove('is-invalid')
document.getElementById("city").classList.add('is-valid')
ok++
} else {
document.getElementById("city").classList.remove('is-valid')
document.getElementById("city").classList.add('is-invalid')
document.getElementById("city").value = ""
no++
}
if (document.getElementById("zip").value.length == 5 && /^\d+$/.test(document.getElementById("zip").value) == true) {
document.getElementById("zip").classList.remove('is-invalid')
document.getElementById("zip").classList.add('is-valid')
ok++
} else {
document.getElementById("zip").classList.remove('is-valid')
document.getElementById("zip").classList.add('is-invalid')
document.getElementById("zip").value = ""
no++
}
if (document.getElementById("country").value > 0) {
document.getElementById("country").classList.remove('is-invalid')
document.getElementById("country").classList.add('is-valid')
ok++
} else {
document.getElementById("country").classList.remove('is-valid')
document.getElementById("country").classList.add('is-invalid')
document.getElementById("country").value = ""
no++
}
if (document.getElementById("state").value.length > 2) {
document.getElementById("state").classList.remove('is-invalid')
document.getElementById("state").classList.add('is-valid')
ok++
} else {
document.getElementById("state").classList.remove('is-valid')
document.getElementById("state").classList.add('is-invalid')
document.getElementById("state").value = ""
no++
}
if (ok > 2 && no == 0) {
nextBtnFunction(1);
}
}
if (currentTab == 2) {
form = { "product_id": url.searchParams.get('id'), "srv_info": form1, "user_info": form2 }
console.log(form)
postData(`https://dash.mercurycloud.fr:8000/api/services?uuid=${getCookie("uuid")}&token=${getCookie("token")}`, form).then(data => {
console.log(data)
if (data.error == false) {
nextBtnFunction(1);
} else {
if (data.code == 403) {
console.log('[ERROR] ' + data);
window.location.replace("/dashboard/auth/sign-in.html");
} else {
if (data.code == 404) {
console.log('[ERROR] ' + data);
window.location.replace("/dashboard/auth/sign-in.html");
} else {
window.location.replace("/dashboard/errors/error500.html");
}
}
}
})
}
})
});
const prebtn = document.querySelectorAll('.previous')
Array.from(prebtn, (pbtn) => {
pbtn.addEventListener('click', function () {
nextBtnFunction(-1);
})
});
})()

View File

@@ -1,191 +0,0 @@
async function postData(url = '', data = {}) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
return response.json()
}
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}
fetch(`https://dash.mercurycloud.fr:8000/api/products/proxmox/nodes?uuid=${getCookie("uuid")}&token=${getCookie("token")}`)
.then(function (response) {
return response.json();
})
.then(function (json) {
let nodes_html = ``
for (var i = 0; i < json.nodes.length; i++) {
nodes_html = nodes_html + `
<option value="${json.nodes[i].node}">${json.nodes[i].node}</option>
`
}
document.getElementById('nodes').innerHTML = '<option value="0">Veuillez choisir un noeud</option>' + nodes_html
})
function update_node() {
fetch(`https://dash.mercurycloud.fr:8000/api/products/proxmox/qemu?uuid=${getCookie("uuid")}&token=${getCookie("token")}&node=${document.getElementById('nodes').value}`)
.then(function (response) {
return response.json();
})
.then(function (json) {
let template_vm_html = ``
for (var i = 0; i < json.vms.length; i++) {
template_vm_html = template_vm_html + `
<option value="${json.vms[i].vmid}">${json.vms[i].name}</option>
`
}
document.getElementById('template_vm').innerHTML = template_vm_html
})
fetch(`https://dash.mercurycloud.fr:8000/api/products/proxmox/storage?uuid=${getCookie("uuid")}&token=${getCookie("token")}&node=${document.getElementById('nodes').value}`)
.then(function (response) {
return response.json();
})
.then(function (json) {
let storage_html = ``
for (var i = 0; i < json.storage.length; i++) {
storage_html = storage_html + `
<option value="${json.storage[i].storage}">${json.storage[i].storage}</option>
`
}
document.getElementById('storage').innerHTML = storage_html
})
}
function create_product() {
var ok = 0
var no = 0
if (document.getElementById('name').value.length > 0) {
document.getElementById('name').classList.remove('is-invalid')
document.getElementById('name').classList.add('is-valid')
ok++
} else {
document.getElementById('name').classList.remove('is-valid')
document.getElementById('name').classList.add('is-invalid')
document.getElementById('name').value = ""
no++
}
if (document.getElementById('description').value.length > 0) {
document.getElementById('description').classList.remove('is-invalid')
document.getElementById('description').classList.add('is-valid')
ok++
} else {
document.getElementById('description').classList.remove('is-valid')
document.getElementById('description').classList.add('is-invalid')
document.getElementById('description').value = ""
no++
}
if (document.getElementById('price').value.length > 0) {
document.getElementById('price').classList.remove('is-invalid')
document.getElementById('price').classList.add('is-valid')
ok++
} else {
document.getElementById('price').classList.remove('is-valid')
document.getElementById('price').classList.add('is-invalid')
document.getElementById('price').value = ""
no++
}
if (document.getElementById('nodes').value != 0) {
document.getElementById('nodes').classList.remove('is-invalid')
document.getElementById('nodes').classList.add('is-valid')
ok++
} else {
document.getElementById('nodes').classList.remove('is-valid')
document.getElementById('nodes').classList.add('is-invalid')
no++
}
if (document.getElementById('template_vm').value != 0) {
document.getElementById('template_vm').classList.remove('is-invalid')
document.getElementById('template_vm').classList.add('is-valid')
ok++
} else {
document.getElementById('template_vm').classList.remove('is-valid')
document.getElementById('template_vm').classList.add('is-invalid')
no++
}
if (document.getElementById('cores').value.length > 0) {
document.getElementById('cores').classList.remove('is-invalid')
document.getElementById('cores').classList.add('is-valid')
ok++
} else {
document.getElementById('cores').classList.remove('is-valid')
document.getElementById('cores').classList.add('is-invalid')
document.getElementById('cores').value = ""
no++
}
if (document.getElementById('ram').value.length > 0) {
document.getElementById('ram').classList.remove('is-invalid')
document.getElementById('ram').classList.add('is-valid')
ok++
} else {
document.getElementById('ram').classList.remove('is-valid')
document.getElementById('ram').classList.add('is-invalid')
document.getElementById('ram').value = ""
no++
}
if (document.getElementById('storage').value != 0) {
document.getElementById('storage').classList.remove('is-invalid')
document.getElementById('storage').classList.add('is-valid')
ok++
} else {
document.getElementById('storage').classList.remove('is-valid')
document.getElementById('storage').classList.add('is-invalid')
no++
}
if (document.getElementById('disk_size').value.length > 0) {
document.getElementById('disk_size').classList.remove('is-invalid')
document.getElementById('disk_size').classList.add('is-valid')
ok++
} else {
document.getElementById('disk_size').classList.remove('is-valid')
document.getElementById('disk_size').classList.add('is-invalid')
document.getElementById('disk_size').value = ""
no++
}
if (ok == 9 && no == 0) {
body = {
"name": document.getElementById("name").value,
"description": document.getElementById("description").value,
"price": document.getElementById("price").value,
"category": "proxmox",
"node": document.getElementById("nodes").value,
"template_vm": document.getElementById("template_vm").value,
"cores": document.getElementById("cores").value,
"ram": document.getElementById("ram").value,
"storage": document.getElementById("storage").value,
"disk_size": document.getElementById("disk_size").value,
"add_conf": document.getElementById("add_conf").value
}
postData(`https://dash.mercurycloud.fr:8000/api/products?uuid=${getCookie("uuid")}&token=${getCookie("token")}`, body).then(data => {
console.log(data)
if (data.error == false) {
window.location.replace("/dashboard/products/proxmox-products-list.html")
} else {
console.log('[ERROR] Code : ' + data.code + ' Message : ' + data.msg);
if (data.code == 403) {
location.href = "../errors/error403.html"
} else {
location.href = "../errors/error500.html"
}
}
})
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,106 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Responsive Bootstrap 5 Admin Dashboard Template</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../../assets/css/rtl.min.css"/>
</head>
<body class=" " data-bs-spy="scroll" data-bs-target="#elements-section" data-bs-offset="0" tabindex="0">
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<div class="wrapper">
<section class="login-content">
<div class="row m-0 align-items-center bg-white vh-100">
<div class="col-md-6 p-0">
<div class="card card-transparent auth-card shadow-none d-flex justify-content-center mb-0">
<div class="card-body">
<a href="../../dashboard/index.html" class="navbar-brand d-flex align-items-center mb-3">
<!--Logo start-->
<svg width="30" class="" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"/>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"/>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"/>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"/>
</svg>
<!--logo End--> <h4 class="logo-title ms-3">Mercury Cloud</h4>
</a>
<img src="../../assets/images/auth/mail.png" class="img-fluid" width="80" alt="">
<h2 class="mt-3 mb-0">Success !</h2>
<p class="cnf-mail mb-1">A email has been send to youremail@domain.com. Please check for an
email from company and click
on the included link to reset your password.</p>
<div class="d-inline-block w-100">
<a href="../../dashboard/index.html" class="btn btn-primary mt-3">Back to Home</a>
</div>
</div>
</div>
</div>
<div class="col-md-6 d-md-block d-none bg-primary p-0 mt-n1 vh-100 overflow-hidden">
<img src="../../assets/images/auth/03.png" class="img-fluid gradient-main animated-scaleX" alt="images">
</div>
</div>
</section>
</div>
<!-- Library Bundle Script -->
<script src="../../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../../assets/js/charts/vectore-chart.js"></script>
<script src="../../assets/js/charts/dashboard.js" ></script>
<!-- fslightbox Script -->
<script src="../../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1,122 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Responsive Bootstrap 5 Admin Dashboard Template</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../../assets/css/rtl.min.css"/>
</head>
<body class=" " data-bs-spy="scroll" data-bs-target="#elements-section" data-bs-offset="0" tabindex="0">
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<div class="wrapper">
<section class="login-content">
<div class="row m-0 align-items-center bg-white vh-100">
<div class="col-md-6 p-0">
<div class="card card-transparent auth-card shadow-none d-flex justify-content-center mb-0">
<div class="card-body">
<a href="../../dashboard/index.html" class="navbar-brand d-flex align-items-center mb-3">
<!--Logo start-->
<svg width="30" class="" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"/>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"/>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"/>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"/>
</svg>
<!--logo End--> <h4 class="logo-title ms-3">Mercury Cloud</h4>
</a>
<img src="../../assets/images/avatars/01.png" class="rounded avatar-80 mb-3" alt="">
<h2 class="mb-2">Hi ! Ruben Dokidis</h2>
<p>Enter your password to access the admin.</p>
<form>
<div class="row">
<div class="col-lg-12">
<div class="floating-label form-group">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control" id="password" aria-describedby="password" placeholder=" ">
</div>
</div>
</div>
<button type="submit" class="btn btn-primary">Login</button>
</form>
</div>
</div>
<div class="sign-bg">
<svg width="280" height="230" viewBox="0 0 431 398" fill="none" xmlns="http://www.w3.org/2000/svg">
<g opacity="0.05">
<rect x="-157.085" y="193.773" width="543" height="77.5714" rx="38.7857" transform="rotate(-45 -157.085 193.773)" fill="#3B8AFF"></rect>
<rect x="7.46875" y="358.327" width="543" height="77.5714" rx="38.7857" transform="rotate(-45 7.46875 358.327)" fill="#3B8AFF"></rect>
<rect x="61.9355" y="138.545" width="310.286" height="77.5714" rx="38.7857" transform="rotate(45 61.9355 138.545)" fill="#3B8AFF"></rect>
<rect x="62.3154" y="-190.173" width="543" height="77.5714" rx="38.7857" transform="rotate(45 62.3154 -190.173)" fill="#3B8AFF"></rect>
</g>
</svg>
</div>
</div>
<div class="col-md-6 d-md-block d-none bg-primary p-0 mt-n1 vh-100 overflow-hidden">
<img src="../../assets/images/auth/04.png" class="img-fluid gradient-main animated-scaleX" alt="images">
</div>
</div>
</section>
</div>
<!-- Library Bundle Script -->
<script src="../../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../../assets/js/charts/vectore-chart.js"></script>
<script src="../../assets/js/charts/dashboard.js" ></script>
<!-- fslightbox Script -->
<script src="../../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1,121 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Responsive Bootstrap 5 Admin Dashboard Template</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../../assets/css/rtl.min.css"/>
</head>
<body class=" " data-bs-spy="scroll" data-bs-target="#elements-section" data-bs-offset="0" tabindex="0">
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<div class="wrapper">
<section class="login-content">
<div class="row m-0 align-items-center bg-white vh-100">
<div class="col-md-6 d-md-block d-none bg-primary p-0 mt-n1 vh-100 overflow-hidden">
<img src="../../assets/images/auth/02.png" class="img-fluid gradient-main animated-scaleX" alt="images">
</div>
<div class="col-md-6 p-0">
<div class="card card-transparent auth-card shadow-none d-flex justify-content-center mb-0">
<div class="card-body">
<a href="../../dashboard/index.html" class="navbar-brand d-flex align-items-center mb-3">
<!--Logo start-->
<svg width="30" class="" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"/>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"/>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"/>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"/>
</svg>
<!--logo End--> <h4 class="logo-title ms-3">Mercury Cloud</h4>
</a>
<h2 class="mb-2">Reset Password</h2>
<p>Enter your email address and we'll send you an email with instructions to reset your password.</p>
<form>
<div class="row">
<div class="col-lg-12">
<div class="floating-label form-group">
<label for="email" class="form-label">Email</label>
<input type="email" class="form-control" id="email" aria-describedby="email" placeholder=" ">
</div>
</div>
</div>
<button type="submit" class="btn btn-primary">Reset</button>
</form>
</div>
</div>
<div class="sign-bg sign-bg-right">
<svg width="280" height="230" viewBox="0 0 431 398" fill="none" xmlns="http://www.w3.org/2000/svg">
<g opacity="0.05">
<rect x="-157.085" y="193.773" width="543" height="77.5714" rx="38.7857" transform="rotate(-45 -157.085 193.773)" fill="#3B8AFF"/>
<rect x="7.46875" y="358.327" width="543" height="77.5714" rx="38.7857" transform="rotate(-45 7.46875 358.327)" fill="#3B8AFF"/>
<rect x="61.9355" y="138.545" width="310.286" height="77.5714" rx="38.7857" transform="rotate(45 61.9355 138.545)" fill="#3B8AFF"/>
<rect x="62.3154" y="-190.173" width="543" height="77.5714" rx="38.7857" transform="rotate(45 62.3154 -190.173)" fill="#3B8AFF"/>
</g>
</svg>
</div>
</div>
</div>
</section>
</div>
<!-- Library Bundle Script -->
<script src="../../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../../assets/js/charts/vectore-chart.js"></script>
<script src="../../assets/js/charts/dashboard.js" ></script>
<!-- fslightbox Script -->
<script src="../../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1,98 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Erreur 403</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../../assets/css/rtl.min.css"/>
</head>
<body class=" " data-bs-spy="scroll" data-bs-target="#elements-section" data-bs-offset="0" tabindex="0">
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<div class="wrapper">
<script src="http://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/TweenMax.min.js"></script>
<div class="gradient">
<div class="container">
<img src="../../assets/images/error/403.png" class="img-fluid mb-4 w-50" alt="">
<h2 class="mb-0 mt-4 text-white">Oops! Vous n'avez pas accès à cette page.</h2>
<p class="mt-2 text-white">Retourne d'où tu vient avec le bouton si dessous.</p>
<a class="btn bg-white text-primary d-inline-flex align-items-center" href="../index.html">Retour à l'accueil</a>
<p class="mt-4 text-white">Cela ne se fait pas de fouiner partout =)</p>
<p class="mt-4 text-white">Si tu veux aider le développement du panel envoie moi un mail:</p>
<p class="mt-4 text-white">contact@mercurycloud.fr ou Savalet#8888 sur Discord.</p>
</div>
<div class="box">
<div class="c xl-circle">
<div class="c lg-circle">
<div class="c md-circle">
<div class="c sm-circle">
<div class="c xs-circle">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Library Bundle Script -->
<script src="../../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../../assets/js/charts/vectore-chart.js"></script>
<!-- fslightbox Script -->
<script src="../../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1,95 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Erreur 404</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../../assets/css/rtl.min.css"/>
</head>
<body class=" " data-bs-spy="scroll" data-bs-target="#elements-section" data-bs-offset="0" tabindex="0">
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<div class="wrapper">
<script src="http://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/TweenMax.min.js"></script>
<div class="gradient">
<div class="container">
<img src="../../assets/images/error/404.png" class="img-fluid mb-4 w-50" alt="">
<h2 class="mb-0 mt-4 text-white">Oops! Cette page est introuvable.</h2>
<p class="mt-2 text-white">La page demandée n'existe pas.</p>
<a class="btn bg-white text-primary d-inline-flex align-items-center" href="../index.html">Retour à l'accueil</a>
</div>
<div class="box">
<div class="c xl-circle">
<div class="c lg-circle">
<div class="c md-circle">
<div class="c sm-circle">
<div class="c xs-circle">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Library Bundle Script -->
<script src="../../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../../assets/js/charts/vectore-chart.js"></script>
<!-- fslightbox Script -->
<script src="../../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1,95 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Erreur 429</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../../assets/css/rtl.min.css"/>
</head>
<body class=" " data-bs-spy="scroll" data-bs-target="#elements-section" data-bs-offset="0" tabindex="0">
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<div class="wrapper">
<script src="http://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/TweenMax.min.js"></script>
<div class="gradient">
<div class="container">
<h1 class="mb-0 mt-4 text-white">429</h2>
<h2 class="mb-0 mt-4 text-white">Oops! Votre IP a été bloquée car vous faites trop de requètes.</h2>
<p class="mt-2 text-white">Cet incident sera reporté aux administrateurs.</p>
<a class="btn bg-white text-primary d-inline-flex align-items-center" href="../index.html">Retour à l'accueil</a>
</div>
<div class="box">
<div class="c xl-circle">
<div class="c lg-circle">
<div class="c md-circle">
<div class="c sm-circle">
<div class="c xs-circle">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Library Bundle Script -->
<script src="../../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../../assets/js/charts/vectore-chart.js"></script>
<!-- fslightbox Script -->
<script src="../../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1,94 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Erreur 500</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../../assets/css/rtl.min.css"/>
</head>
<body class=" " data-bs-spy="scroll" data-bs-target="#elements-section" data-bs-offset="0" tabindex="0">
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<div class="wrapper">
<div class="gradient">
<div class="container">
<img src="../../assets/images/error/500.png" class="img-fluid mb-4 w-50" alt="">
<h2 class="mb-0 mt-4 text-white">Oops! Une erreur serveur est survenue</h2>
<p class="mt-2 text-white">Nous sommes désolé pour la gène occasionnée</p>
<a class="btn bg-white text-primary d-inline-flex align-items-center" href="../index.html ">Retour à l'acceuil</a>
</div>
<div class="box">
<div class="c xl-circle">
<div class="c lg-circle">
<div class="c md-circle">
<div class="c sm-circle">
<div class="c xs-circle">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Library Bundle Script -->
<script src="../../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../../assets/js/charts/vectore-chart.js"></script>
<script>document.querySelector('body').classList.add('dark')</script>
<!-- fslightbox Script -->
<script src="../../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1,130 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Responsive Bootstrap 5 Admin Dashboard Template</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../../assets/css/rtl.min.css"/>
</head>
<body class=" " data-bs-spy="scroll" data-bs-target="#elements-section" data-bs-offset="0" tabindex="0">
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<div class="wrapper">
<div class="container-fluid p-0">
<div class="iq-maintenance text-center">
<img src="../../assets/images/error/01.png" class="img-fluid mb-4" alt="">
<div class="maintenance-bottom text-white pb-0">
<div class="bg-primary" style="background: transparent; height: 320px;">
<div class="gradient-bottom">
<div class="bottom-text general-zindex">
<h1 class="mb-2 text-white">Hang on! We are under maintenance</h1>
<p>It will not take a long time till we get the error fiked. We wii live again in</p>
<ul class="countdown d-flex justify-content-center align-items-center list-inline" data-date="Feb 02 2022 20:20:22">
<li>
<span data-days>0</span>Days
</li>
<li>
<span data-hours>0</span>Hours
</li>
<li>
<span data-minutes>0</span>Minutes
</li>
<li>
<span data-seconds>0</span>Seconds
</li>
</ul>
<div class="w-50 mx-auto mt-2">
<div class="input-group search-input search-input">
<input type="text" class="form-control" placeholder="Enter your mail">
<a href="#" class="btn bg-white text-primary ms-2 rounded">Notify Me</a>
</div>
</div>
</div>
<div class="c xl-circle">
<div class="c lg-circle">
<div class="c md-circle">
<div class="c sm-circle">
<div class="c xs-circle"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sign-bg">
<svg width="280" height="230" viewBox="0 0 431 398" fill="none" xmlns="http://www.w3.org/2000/svg">
<g opacity="0.05">
<rect x="-157.085" y="193.773" width="543" height="77.5714" rx="38.7857" transform="rotate(-45 -157.085 193.773)" fill="#3B8AFF"/>
<rect x="7.46875" y="358.327" width="543" height="77.5714" rx="38.7857" transform="rotate(-45 7.46875 358.327)" fill="#3B8AFF"/>
<rect x="61.9355" y="138.545" width="310.286" height="77.5714" rx="38.7857" transform="rotate(45 61.9355 138.545)" fill="#3B8AFF"/>
<rect x="62.3154" y="-190.173" width="543" height="77.5714" rx="38.7857" transform="rotate(45 62.3154 -190.173)" fill="#3B8AFF"/>
</g>
</svg>
</div>
</div>
</div>
<!-- Library Bundle Script -->
<script src="../../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../../assets/js/charts/vectore-chart.js"></script>
<script src="../../assets/js/charts/dashboard.js" ></script>
<!-- fslightbox Script -->
<script src="../../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../../assets/js/main-lib.js" defer></script>
<script src="../../assets/js/plugins/countdown.js"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,902 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Responsive Bootstrap 5 Admin Dashboard Template</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../assets/css/rtl.min.css"/>
</head>
<body class=" boxed-fancy">
<div class="boxed-inner">
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<span class="screen-darken"></span>
<main class="main-content">
<!--Nav Start-->
<nav class="nav navbar navbar-expand-lg navbar-light iq-navbar">
<div class="container-fluid navbar-inner">
<button data-trigger="navbar_main" class="d-lg-none btn btn-primary rounded-pill p-1 pt-0" type="button">
<svg width="20px" height="20px" viewBox="0 0 24 24">
<path fill="currentColor" d="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z"></path>
</svg>
</button>
<a href="../dashboard/index.html" class="logo-center navbar-brand col-md-3 col-lg-3 ms-0">
<!--Logo start-->
<svg width="30" class="text-primary" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"/>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"/>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"/>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"/>
</svg>
<!--logo End--> <h4 class="logo-title">Mercury Cloud</h4>
</a>
<!-- Horizontal Menu Start -->
<nav id="navbar_main" class="mobile-offcanvas nav navbar navbar-expand-xl hover-nav horizontal-nav mx-md-auto">
<div class="container-fluid">
<div class="offcanvas-header px-0">
<div class="navbar-brand ms-0">
<!--Logo start-->
<svg width="30" class="text-primary" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"/>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"/>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"/>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"/>
</svg>
<!--logo End--> <h4 class="logo-title">Mercury Cloud</h4>
</div>
<button class="btn-close float-end"></button>
</div>
<ul class="navbar-nav">
<li class="nav-item"><a class="nav-link " href="../dashboard/index-horizontal.html"> Horizontal </a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-dual-horizontal.html"> Dual Horizontal </a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-dual-compact.html"><span class="item-name">Dual Compact</span></a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-boxed.html"> Boxed Horizontal </a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-boxed-fancy.html"> Boxed Fancy</a></li>
</ul>
</div> <!-- container-fluid.// -->
</nav>
<!-- Sidebar Menu End --> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon">
<span class="navbar-toggler-bar bar1 mt-2"></span>
<span class="navbar-toggler-bar bar2"></span>
<span class="navbar-toggler-bar bar3"></span>
</span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item dropdown">
<a href="#" class="search-toggle nav-link" id="dropdownMenuButton2" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<img src="../assets/images/Flag/flag001.png" class="img-fluid rounded-circle" alt="user" style="height: 30px; min-width: 30px; width: 30px;">
<span class="bg-primary"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="dropdownMenuButton2">
<div class="card shadow-none m-0 border-0">
<div class=" p-0 ">
<ul class="list-group list-group-flush">
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-03.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>Spanish</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-04.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>Italian</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-02.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>French</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-05.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>German</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-06.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>Japanese</a></li>
</ul>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link" id="notification-drop" data-bs-toggle="dropdown" >
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.7695 11.6453C19.039 10.7923 18.7071 10.0531 18.7071 8.79716V8.37013C18.7071 6.73354 18.3304 5.67907 17.5115 4.62459C16.2493 2.98699 14.1244 2 12.0442 2H11.9558C9.91935 2 7.86106 2.94167 6.577 4.5128C5.71333 5.58842 5.29293 6.68822 5.29293 8.37013V8.79716C5.29293 10.0531 4.98284 10.7923 4.23049 11.6453C3.67691 12.2738 3.5 13.0815 3.5 13.9557C3.5 14.8309 3.78723 15.6598 4.36367 16.3336C5.11602 17.1413 6.17846 17.6569 7.26375 17.7466C8.83505 17.9258 10.4063 17.9933 12.0005 17.9933C13.5937 17.9933 15.165 17.8805 16.7372 17.7466C17.8215 17.6569 18.884 17.1413 19.6363 16.3336C20.2118 15.6598 20.5 14.8309 20.5 13.9557C20.5 13.0815 20.3231 12.2738 19.7695 11.6453Z" fill="currentColor"></path>
<path opacity="0.4" d="M14.0088 19.2283C13.5088 19.1215 10.4627 19.1215 9.96275 19.2283C9.53539 19.327 9.07324 19.5566 9.07324 20.0602C9.09809 20.5406 9.37935 20.9646 9.76895 21.2335L9.76795 21.2345C10.2718 21.6273 10.8632 21.877 11.4824 21.9667C11.8123 22.012 12.1482 22.01 12.4901 21.9667C13.1083 21.877 13.6997 21.6273 14.2036 21.2345L14.2026 21.2335C14.5922 20.9646 14.8734 20.5406 14.8983 20.0602C14.8983 19.5566 14.4361 19.327 14.0088 19.2283Z" fill="currentColor"></path>
</svg>
<span class="bg-danger dots"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="notification-drop">
<div class="card shadow-none m-0">
<div class="card-header d-flex justify-content-between bg-primary py-3">
<div class="header-title">
<h5 class="mb-0 text-white">All Notifications</h5>
</div>
</div>
<div class="card-body p-0">
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/01.png" alt="">
<div class="ms-3 w-100">
<h6 class="mb-0 ">Emma Watson Bni</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">95 MB</p>
<small class="float-right font-size-12">Just Now</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/02.png" alt="">
</div>
<div class="ms-3 w-100">
<h6 class="mb-0 ">New customer is join</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-right font-size-12">5 days ago</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/03.png" alt="">
<div class="ms-3 w-100">
<h6 class="mb-0 ">Two customer is left</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-right font-size-12">2 days ago</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/04.png" alt="">
<div class="w-100 ms-3">
<h6 class="mb-0 ">New Mail from Fenny</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-right font-size-12">3 days ago</small>
</div>
</div>
</div>
</a>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link" id="mail-drop" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.4" d="M22 15.94C22 18.73 19.76 20.99 16.97 21H16.96H7.05C4.27 21 2 18.75 2 15.96V15.95C2 15.95 2.006 11.524 2.014 9.298C2.015 8.88 2.495 8.646 2.822 8.906C5.198 10.791 9.447 14.228 9.5 14.273C10.21 14.842 11.11 15.163 12.03 15.163C12.95 15.163 13.85 14.842 14.56 14.262C14.613 14.227 18.767 10.893 21.179 8.977C21.507 8.716 21.989 8.95 21.99 9.367C22 11.576 22 15.94 22 15.94Z" fill="currentColor"></path>
<path d="M21.4759 5.67351C20.6099 4.04151 18.9059 2.99951 17.0299 2.99951H7.04988C5.17388 2.99951 3.46988 4.04151 2.60388 5.67351C2.40988 6.03851 2.50188 6.49351 2.82488 6.75151L10.2499 12.6905C10.7699 13.1105 11.3999 13.3195 12.0299 13.3195C12.0339 13.3195 12.0369 13.3195 12.0399 13.3195C12.0429 13.3195 12.0469 13.3195 12.0499 13.3195C12.6799 13.3195 13.3099 13.1105 13.8299 12.6905L21.2549 6.75151C21.5779 6.49351 21.6699 6.03851 21.4759 5.67351Z" fill="currentColor"></path>
</svg>
<span class="bg-primary count-mail"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="mail-drop">
<div class="card shadow-none m-0">
<div class="card-header d-flex justify-content-between bg-primary py-3">
<div class="header-title">
<h5 class="mb-0 text-white">All Message</h5>
</div>
</div>
<div class="card-body p-0 ">
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/01.png" alt="">
</div>
<div class=" w-100 ms-3">
<h6 class="mb-0 ">Bni Emma Watson</h6>
<small class="float-left font-size-12">13 Jun</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/02.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Lorem Ipsum Watson</h6>
<small class="float-left font-size-12">20 Apr</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/03.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Why do we use it?</h6>
<small class="float-left font-size-12">30 Jun</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/04.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Variations Passages</h6>
<small class="float-left font-size-12">12 Sep</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/05.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Lorem Ipsum generators</h6>
<small class="float-left font-size-12">5 Dec</small>
</div>
</div>
</a>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a class="nav-link py-0 d-flex align-items-center" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<img src="../assets/images/avatars/01.png" alt="User-Profile" class="theme-color-default-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_1.png" alt="User-Profile" class="theme-color-purple-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_2.png" alt="User-Profile" class="theme-color-blue-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_4.png" alt="User-Profile" class="theme-color-green-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_5.png" alt="User-Profile" class="theme-color-yellow-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_3.png" alt="User-Profile" class="theme-color-pink-img img-fluid avatar avatar-50 avatar-rounded">
<div class="caption ms-3 ">
<h6 class="mb-0 caption-title">Austin Robertson</h6>
<p class="mb-0 caption-sub-title">Marketing Administrator</p>
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="../dashboard/app/user-profile.html">Profile</a></li>
<li><a class="dropdown-item" href="../dashboard/app/user-privacy-setting.html">Privacy Setting</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="../dashboard/auth/sign-in.html">Logout</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav> <!--Nav End-->
<div class="conatiner-fluid content-inner pb-0">
<div class="row">
<div class="col-md-12 col-lg-12">
<div class="row row-cols-1">
<div class="d-slider1 overflow-hidden ">
<ul class="swiper-wrapper list-inline m-0 p-0 mb-2">
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-01" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="90" data-type="percent">
<svg class="card-slie-arrow " width="24" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Sales</p>
<h4 class="counter">$560K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-02" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="80" data-type="percent">
<svg class="card-slie-arrow " width="24" height="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Profit</p>
<h4 class="counter">$185K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-03" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="70" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Cost</p>
<h4 class="counter">$375K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-04" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="60" data-type="percent">
<svg class="card-slie-arrow " width="24px" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Revenue</p>
<h4 class="counter">$742K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-05" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="50" data-type="percent">
<svg class="card-slie-arrow " width="24px" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Net Income</p>
<h4 class="counter">$150K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-06" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="40" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Today</p>
<h4 class="counter">$4600</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-07" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="30" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Members</p>
<h4 class="counter">11.2M</h4>
</div>
</div>
</div>
</li>
</ul>
<div class="swiper-button swiper-button-next"></div>
<div class="swiper-button swiper-button-prev"></div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-8">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">$855.8K</h4>
<p class="mb-0">Gross Sales</p>
</div>
<div class="d-flex align-items-center align-self-center">
<div class="d-flex align-items-center text-primary">
<svg xmlns="http://www.w3.org/2000/svg" width="12" viewBox="0 0 24 24" fill="currentColor">
<circle cx="12" cy="12" r="8" fill="currentColor"></circle>
</svg>
<div class="ms-2">
<span class="text-secondary">Sales</span>
</div>
</div>
<div class="d-flex align-items-center ms-3 text-info">
<svg xmlns="http://www.w3.org/2000/svg" width="12" viewBox="0 0 24 24" fill="currentColor">
<circle cx="12" cy="12" r="8" fill="currentColor"></circle>
</svg>
<div class="ms-2">
<span class="text-secondary">Cost</span>
</div>
</div>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton22" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton22">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div id="d-main" class="d-main"></div>
</div>
</div>
</div>
<div class="col-md-12 col-xl-6">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">Earnings</h4>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton1">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div class="d-flex flex-wrap align-items-center justify-content-between">
<div id="myChart" class="col-md-8 col-lg-8 myChart"></div>
<div class="d-grid gap col-md-4 col-lg-4">
<div class="d-flex align-items-start">
<svg class="mt-2" xmlns="http://www.w3.org/2000/svg" width="14" viewBox="0 0 24 24" fill="#3a57e8">
<circle cx="12" cy="12" r="8" fill="#3a57e8"></circle>
</svg>
<div class="ms-3">
<span class="text-secondary">Fashion</span>
<h6>251K</h6>
</div>
</div>
<div class="d-flex align-items-start">
<svg class="mt-2" xmlns="http://www.w3.org/2000/svg" width="14" viewBox="0 0 24 24" fill="#4bc7d2">
<circle cx="12" cy="12" r="8" fill="#4bc7d2"></circle>
</svg>
<div class="ms-3">
<span class="text-secondary">Accessories</span>
<h6>176K</h6>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-xl-6">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">Conversions</h4>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton3" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton3">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div id="d-activity" class="d-activity"></div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12">
<div class="card overflow-hidden">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title mb-2">Enterprise Clients</h4>
<p class="mb-0">
<svg class ="me-2" width="24" height="24" viewBox="0 0 24 24">
<path fill="#3a57e8" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" />
</svg>
15 new acquired this month
</p>
</div>
<div class="dropdown">
<span class="dropdown-toggle" id="dropdownMenuButton7" data-bs-toggle="dropdown" aria-expanded="false" role="button">
</span>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton7">
<a class="dropdown-item " href="javascript:void(0);">Action</a>
<a class="dropdown-item " href="javascript:void(0);">Another action</a>
<a class="dropdown-item " href="javascript:void(0);">Something else here</a>
</div>
</div>
</div>
<div class="card-body p-0">
<div class="table-responsive mt-4">
<table id="basic-table" class="table table-striped mb-0" role="grid">
<thead>
<tr>
<th>COMPANIES</th>
<th>CONTACTS</th>
<th>ORDER</th>
<th>COMPLETION</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/01.png" alt="profile">
<h6>Addidis Sportwear</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
</div>
</td>
<td>$14,000</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>60%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/05.png" alt="profile">
<h6>Netflixer Platforms</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
</div>
</td>
<td>$30,000</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>25%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/02.png" alt="profile">
<h6>Shopifi Stores</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">TP</div>
</a>
</div>
</td>
<td>$8,500</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>100%</h6>
</div>
<div class="progress bg-soft-success shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-success" data-toggle="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/03.png" alt="profile">
<h6>Bootstrap Technologies</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">TP</div>
</a>
</div>
</td>
<td>$20,500</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>100%</h6>
</div>
<div class="progress bg-soft-success shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-success" data-toggle="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/04.png" alt="profile">
<h6>Community First</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
</div>
</td>
<td>$9,800</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>75%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-4">
<div class="row">
<div class="col-md-12 col-lg-12">
<div class="card credit-card-widget">
<div class="card-header pb-4 border-0">
<div class="p-4 primary-gradient-card rounded border border-white">
<div class="d-flex justify-content-between align-items-center">
<div>
<h5 class="font-weight-bold">VISA </h5>
<P class="mb-0">PREMIUM ACCOUNT</P>
</div>
<div class="master-card-content">
<svg class="master-card-1" width="60" height="60" viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>
<svg class="master-card-2" width="60" height="60" viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>
</div>
</div>
<div class="my-4">
<div class="card-number">
<span class="fs-5 me-2">5789</span>
<span class="fs-5 me-2">****</span>
<span class="fs-5 me-2">****</span>
<span class="fs-5">2847</span>
</div>
</div>
<div class="d-flex align-items-center mb-2 justify-content-between">
<p class="mb-0">Card holder</p>
<p class="mb-0">Expire Date</p>
</div>
<div class="d-flex align-items-center justify-content-between">
<h6>Mike Smith</h6>
<h6 class="ms-5">06/11</h6>
</div>
</div>
</div>
<div class="card-body">
<div class="d-flex align-itmes-center flex-wrap mb-4">
<div class="d-flex align-itmes-center me-0 me-md-4">
<div>
<div class="p-3 mb-2 rounded bg-soft-primary">
<svg width="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.9303 7C16.9621 6.92913 16.977 6.85189 16.9739 6.77432H17C16.8882 4.10591 14.6849 2 12.0049 2C9.325 2 7.12172 4.10591 7.00989 6.77432C6.9967 6.84898 6.9967 6.92535 7.00989 7H6.93171C5.65022 7 4.28034 7.84597 3.88264 10.1201L3.1049 16.3147C2.46858 20.8629 4.81062 22 7.86853 22H16.1585C19.2075 22 21.4789 20.3535 20.9133 16.3147L20.1444 10.1201C19.676 7.90964 18.3503 7 17.0865 7H16.9303ZM15.4932 7C15.4654 6.92794 15.4506 6.85153 15.4497 6.77432C15.4497 4.85682 13.8899 3.30238 11.9657 3.30238C10.0416 3.30238 8.48184 4.85682 8.48184 6.77432C8.49502 6.84898 8.49502 6.92535 8.48184 7H15.4932ZM9.097 12.1486C8.60889 12.1486 8.21321 11.7413 8.21321 11.2389C8.21321 10.7366 8.60889 10.3293 9.097 10.3293C9.5851 10.3293 9.98079 10.7366 9.98079 11.2389C9.98079 11.7413 9.5851 12.1486 9.097 12.1486ZM14.002 11.2389C14.002 11.7413 14.3977 12.1486 14.8858 12.1486C15.3739 12.1486 15.7696 11.7413 15.7696 11.2389C15.7696 10.7366 15.3739 10.3293 14.8858 10.3293C14.3977 10.3293 14.002 10.7366 14.002 11.2389Z" fill="currentColor"></path>
</svg>
</div>
</div>
<div class="ms-3">
<h5>1153</h5>
<small class="mb-0">Products</small>
</div>
</div>
<div class="d-flex align-itmes-center">
<div>
<div class="p-3 mb-2 rounded bg-soft-info">
<svg width="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.1213 11.2331H16.8891C17.3088 11.2331 17.6386 10.8861 17.6386 10.4677C17.6386 10.0391 17.3088 9.70236 16.8891 9.70236H14.1213C13.7016 9.70236 13.3719 10.0391 13.3719 10.4677C13.3719 10.8861 13.7016 11.2331 14.1213 11.2331ZM20.1766 5.92749C20.7861 5.92749 21.1858 6.1418 21.5855 6.61123C21.9852 7.08067 22.0551 7.7542 21.9652 8.36549L21.0159 15.06C20.8361 16.3469 19.7569 17.2949 18.4879 17.2949H7.58639C6.25742 17.2949 5.15828 16.255 5.04837 14.908L4.12908 3.7834L2.62026 3.51807C2.22057 3.44664 1.94079 3.04864 2.01073 2.64043C2.08068 2.22305 2.47038 1.94649 2.88006 2.00874L5.2632 2.3751C5.60293 2.43735 5.85274 2.72207 5.88272 3.06905L6.07257 5.35499C6.10254 5.68257 6.36234 5.92749 6.68209 5.92749H20.1766ZM7.42631 18.9079C6.58697 18.9079 5.9075 19.6018 5.9075 20.459C5.9075 21.3061 6.58697 22 7.42631 22C8.25567 22 8.93514 21.3061 8.93514 20.459C8.93514 19.6018 8.25567 18.9079 7.42631 18.9079ZM18.6676 18.9079C17.8282 18.9079 17.1487 19.6018 17.1487 20.459C17.1487 21.3061 17.8282 22 18.6676 22C19.4969 22 20.1764 21.3061 20.1764 20.459C20.1764 19.6018 19.4969 18.9079 18.6676 18.9079Z" fill="currentColor"></path>
</svg>
</div>
</div>
<div class="ms-3">
<h5>81K</h5>
<small class="mb-0">Order Served</small>
</div>
</div>
</div>
<div class="mb-4">
<div class="d-flex justify-content-between flex-wrap">
<h2 class="mb-2">$405,012,300</h2>
<div>
<span class="badge bg-success rounded-pill">YoY 24%</span>
</div>
</div>
<p class="text-info">Life time sales</p>
</div>
<div class="d-grid grid-cols-2 gap">
<button class="btn btn-primary text-uppercase">SUMMARY</button>
<button class="btn btn-info text-uppercase">ANALYTICS</button>
</div>
</div>
</div>
<div class="card">
<div class="card-body d-flex justify-content-around text-center">
<div>
<h2 class="mb-2">750<small>K</small></h2>
<p class="mb-0 text-secondary">Website Visitors</p>
</div>
<hr class="hr-vertial">
<div>
<h2 class="mb-2">7,500</h2>
<p class="mb-0 text-secondary">New Customers</p>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title mb-2">Activity overview</h4>
<p class="mb-0">
<svg class ="me-2" width="24" height="24" viewBox="0 0 24 24">
<path fill="#17904b" d="M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z" />
</svg>
16% this month
</p>
</div>
</div>
<div class="card-body">
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">$2400, Purchase</h6>
<span class="mb-0">11 JUL 8:10 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">New order #8744152</h6>
<span class="mb-0">11 JUL 11 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">Affiliate Payout</h6>
<span class="mb-0">11 JUL 7:64 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">New user added</h6>
<span class="mb-0">11 JUL 1:21 AM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-1">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">Product added</h6>
<span class="mb-0">11 JUL 4:50 AM</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="btn-download">
<a class="btn btn-danger px-3 py-2" href="https://iqonic.design/product/admin-templates/hope-ui-admin-free-open-source-bootstrap-admin-template/" target="_blank" >
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.4" fill-rule="evenodd" clip-rule="evenodd" d="M5.91064 20.5886C5.91064 19.7486 6.59064 19.0686 7.43064 19.0686C8.26064 19.0686 8.94064 19.7486 8.94064 20.5886C8.94064 21.4186 8.26064 22.0986 7.43064 22.0986C6.59064 22.0986 5.91064 21.4186 5.91064 20.5886ZM17.1606 20.5886C17.1606 19.7486 17.8406 19.0686 18.6806 19.0686C19.5106 19.0686 20.1906 19.7486 20.1906 20.5886C20.1906 21.4186 19.5106 22.0986 18.6806 22.0986C17.8406 22.0986 17.1606 21.4186 17.1606 20.5886Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1907 6.34909C20.8007 6.34909 21.2007 6.55909 21.6007 7.01909C22.0007 7.47909 22.0707 8.13909 21.9807 8.73809L21.0307 15.2981C20.8507 16.5591 19.7707 17.4881 18.5007 17.4881H7.59074C6.26074 17.4881 5.16074 16.4681 5.05074 15.1491L4.13074 4.24809L2.62074 3.98809C2.22074 3.91809 1.94074 3.52809 2.01074 3.12809C2.08074 2.71809 2.47074 2.44809 2.88074 2.50809L5.26574 2.86809C5.60574 2.92909 5.85574 3.20809 5.88574 3.54809L6.07574 5.78809C6.10574 6.10909 6.36574 6.34909 6.68574 6.34909H20.1907ZM14.1307 11.5481H16.9007C17.3207 11.5481 17.6507 11.2081 17.6507 10.7981C17.6507 10.3781 17.3207 10.0481 16.9007 10.0481H14.1307C13.7107 10.0481 13.3807 10.3781 13.3807 10.7981C13.3807 11.2081 13.7107 11.5481 14.1307 11.5481Z" fill="currentColor"></path>
</svg>
</a>
</div>
<!-- Footer Section Start -->
<footer class="footer">
<div class="footer-body">
<ul class="left-panel list-inline mb-0 p-0">
<li class="list-inline-item"><a href="../dashboard/extra/privacy-policy.html">Privacy Policy</a></li>
<li class="list-inline-item"><a href="../dashboard/extra/terms-of-service.html">Terms of Use</a></li>
</ul>
<div class="right-panel">
©<script>document.write(new Date().getFullYear())</script> Mercury Cloud, Made with
<span class="text-gray">
<svg width="15" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.85 2.50065C16.481 2.50065 17.111 2.58965 17.71 2.79065C21.401 3.99065 22.731 8.04065 21.62 11.5806C20.99 13.3896 19.96 15.0406 18.611 16.3896C16.68 18.2596 14.561 19.9196 12.28 21.3496L12.03 21.5006L11.77 21.3396C9.48102 19.9196 7.35002 18.2596 5.40102 16.3796C4.06102 15.0306 3.03002 13.3896 2.39002 11.5806C1.26002 8.04065 2.59002 3.99065 6.32102 2.76965C6.61102 2.66965 6.91002 2.59965 7.21002 2.56065H7.33002C7.61102 2.51965 7.89002 2.50065 8.17002 2.50065H8.28002C8.91002 2.51965 9.52002 2.62965 10.111 2.83065H10.17C10.21 2.84965 10.24 2.87065 10.26 2.88965C10.481 2.96065 10.69 3.04065 10.89 3.15065L11.27 3.32065C11.3618 3.36962 11.4649 3.44445 11.554 3.50912C11.6104 3.55009 11.6612 3.58699 11.7 3.61065C11.7163 3.62028 11.7329 3.62996 11.7496 3.63972C11.8354 3.68977 11.9247 3.74191 12 3.79965C13.111 2.95065 14.46 2.49065 15.85 2.50065ZM18.51 9.70065C18.92 9.68965 19.27 9.36065 19.3 8.93965V8.82065C19.33 7.41965 18.481 6.15065 17.19 5.66065C16.78 5.51965 16.33 5.74065 16.18 6.16065C16.04 6.58065 16.26 7.04065 16.68 7.18965C17.321 7.42965 17.75 8.06065 17.75 8.75965V8.79065C17.731 9.01965 17.8 9.24065 17.94 9.41065C18.08 9.58065 18.29 9.67965 18.51 9.70065Z" fill="currentColor"></path>
</svg>
</span> by <a href="https://iqonic.design/">IQONIC Design</a>.
</div>
</div>
</footer>
<!-- Footer Section End --> </main>
<!-- Wrapper End-->
</div>
<!-- Library Bundle Script -->
<script src="../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../assets/js/charts/vectore-chart.js"></script>
<script src="../assets/js/charts/dashboard.js" ></script>
<!-- fslightbox Script -->
<script src="../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1,902 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Responsive Bootstrap 5 Admin Dashboard Template</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../assets/css/rtl.min.css"/>
</head>
<body class=" boxed">
<div class="boxed-inner">
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<span class="screen-darken"></span>
<main class="main-content">
<!--Nav Start-->
<nav class="nav navbar navbar-expand-lg navbar-light iq-navbar">
<div class="container-fluid navbar-inner">
<button data-trigger="navbar_main" class="d-lg-none btn btn-primary rounded-pill p-1 pt-0" type="button">
<svg width="20px" height="20px" viewBox="0 0 24 24">
<path fill="currentColor" d="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z"></path>
</svg>
</button>
<a href="../dashboard/index.html" class="logo-center navbar-brand col-md-3 col-lg-3 ms-0">
<!--Logo start-->
<svg width="30" class="text-primary" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"/>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"/>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"/>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"/>
</svg>
<!--logo End--> <h4 class="logo-title">Mercury Cloud</h4>
</a>
<!-- Horizontal Menu Start -->
<nav id="navbar_main" class="mobile-offcanvas nav navbar navbar-expand-xl hover-nav horizontal-nav mx-md-auto">
<div class="container-fluid">
<div class="offcanvas-header px-0">
<div class="navbar-brand ms-0">
<!--Logo start-->
<svg width="30" class="text-primary" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"/>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"/>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"/>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"/>
</svg>
<!--logo End--> <h4 class="logo-title">Mercury Cloud</h4>
</div>
<button class="btn-close float-end"></button>
</div>
<ul class="navbar-nav">
<li class="nav-item"><a class="nav-link " href="../dashboard/index-horizontal.html"> Horizontal </a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-dual-horizontal.html"> Dual Horizontal </a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-dual-compact.html"><span class="item-name">Dual Compact</span></a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-boxed.html"> Boxed Horizontal </a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-boxed-fancy.html"> Boxed Fancy</a></li>
</ul>
</div> <!-- container-fluid.// -->
</nav>
<!-- Sidebar Menu End --> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon">
<span class="navbar-toggler-bar bar1 mt-2"></span>
<span class="navbar-toggler-bar bar2"></span>
<span class="navbar-toggler-bar bar3"></span>
</span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item dropdown">
<a href="#" class="search-toggle nav-link" id="dropdownMenuButton2" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<img src="../assets/images/Flag/flag001.png" class="img-fluid rounded-circle" alt="user" style="height: 30px; min-width: 30px; width: 30px;">
<span class="bg-primary"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="dropdownMenuButton2">
<div class="card shadow-none m-0 border-0">
<div class=" p-0 ">
<ul class="list-group list-group-flush">
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-03.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>Spanish</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-04.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>Italian</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-02.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>French</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-05.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>German</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-06.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>Japanese</a></li>
</ul>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link" id="notification-drop" data-bs-toggle="dropdown" >
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.7695 11.6453C19.039 10.7923 18.7071 10.0531 18.7071 8.79716V8.37013C18.7071 6.73354 18.3304 5.67907 17.5115 4.62459C16.2493 2.98699 14.1244 2 12.0442 2H11.9558C9.91935 2 7.86106 2.94167 6.577 4.5128C5.71333 5.58842 5.29293 6.68822 5.29293 8.37013V8.79716C5.29293 10.0531 4.98284 10.7923 4.23049 11.6453C3.67691 12.2738 3.5 13.0815 3.5 13.9557C3.5 14.8309 3.78723 15.6598 4.36367 16.3336C5.11602 17.1413 6.17846 17.6569 7.26375 17.7466C8.83505 17.9258 10.4063 17.9933 12.0005 17.9933C13.5937 17.9933 15.165 17.8805 16.7372 17.7466C17.8215 17.6569 18.884 17.1413 19.6363 16.3336C20.2118 15.6598 20.5 14.8309 20.5 13.9557C20.5 13.0815 20.3231 12.2738 19.7695 11.6453Z" fill="currentColor"></path>
<path opacity="0.4" d="M14.0088 19.2283C13.5088 19.1215 10.4627 19.1215 9.96275 19.2283C9.53539 19.327 9.07324 19.5566 9.07324 20.0602C9.09809 20.5406 9.37935 20.9646 9.76895 21.2335L9.76795 21.2345C10.2718 21.6273 10.8632 21.877 11.4824 21.9667C11.8123 22.012 12.1482 22.01 12.4901 21.9667C13.1083 21.877 13.6997 21.6273 14.2036 21.2345L14.2026 21.2335C14.5922 20.9646 14.8734 20.5406 14.8983 20.0602C14.8983 19.5566 14.4361 19.327 14.0088 19.2283Z" fill="currentColor"></path>
</svg>
<span class="bg-danger dots"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="notification-drop">
<div class="card shadow-none m-0">
<div class="card-header d-flex justify-content-between bg-primary py-3">
<div class="header-title">
<h5 class="mb-0 text-white">All Notifications</h5>
</div>
</div>
<div class="card-body p-0">
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/01.png" alt="">
<div class="ms-3 w-100">
<h6 class="mb-0 ">Emma Watson Bni</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">95 MB</p>
<small class="float-right font-size-12">Just Now</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/02.png" alt="">
</div>
<div class="ms-3 w-100">
<h6 class="mb-0 ">New customer is join</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-right font-size-12">5 days ago</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/03.png" alt="">
<div class="ms-3 w-100">
<h6 class="mb-0 ">Two customer is left</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-right font-size-12">2 days ago</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/04.png" alt="">
<div class="w-100 ms-3">
<h6 class="mb-0 ">New Mail from Fenny</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-right font-size-12">3 days ago</small>
</div>
</div>
</div>
</a>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link" id="mail-drop" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.4" d="M22 15.94C22 18.73 19.76 20.99 16.97 21H16.96H7.05C4.27 21 2 18.75 2 15.96V15.95C2 15.95 2.006 11.524 2.014 9.298C2.015 8.88 2.495 8.646 2.822 8.906C5.198 10.791 9.447 14.228 9.5 14.273C10.21 14.842 11.11 15.163 12.03 15.163C12.95 15.163 13.85 14.842 14.56 14.262C14.613 14.227 18.767 10.893 21.179 8.977C21.507 8.716 21.989 8.95 21.99 9.367C22 11.576 22 15.94 22 15.94Z" fill="currentColor"></path>
<path d="M21.4759 5.67351C20.6099 4.04151 18.9059 2.99951 17.0299 2.99951H7.04988C5.17388 2.99951 3.46988 4.04151 2.60388 5.67351C2.40988 6.03851 2.50188 6.49351 2.82488 6.75151L10.2499 12.6905C10.7699 13.1105 11.3999 13.3195 12.0299 13.3195C12.0339 13.3195 12.0369 13.3195 12.0399 13.3195C12.0429 13.3195 12.0469 13.3195 12.0499 13.3195C12.6799 13.3195 13.3099 13.1105 13.8299 12.6905L21.2549 6.75151C21.5779 6.49351 21.6699 6.03851 21.4759 5.67351Z" fill="currentColor"></path>
</svg>
<span class="bg-primary count-mail"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="mail-drop">
<div class="card shadow-none m-0">
<div class="card-header d-flex justify-content-between bg-primary py-3">
<div class="header-title">
<h5 class="mb-0 text-white">All Message</h5>
</div>
</div>
<div class="card-body p-0 ">
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/01.png" alt="">
</div>
<div class=" w-100 ms-3">
<h6 class="mb-0 ">Bni Emma Watson</h6>
<small class="float-left font-size-12">13 Jun</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/02.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Lorem Ipsum Watson</h6>
<small class="float-left font-size-12">20 Apr</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/03.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Why do we use it?</h6>
<small class="float-left font-size-12">30 Jun</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/04.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Variations Passages</h6>
<small class="float-left font-size-12">12 Sep</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/05.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Lorem Ipsum generators</h6>
<small class="float-left font-size-12">5 Dec</small>
</div>
</div>
</a>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a class="nav-link py-0 d-flex align-items-center" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<img src="../assets/images/avatars/01.png" alt="User-Profile" class="theme-color-default-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_1.png" alt="User-Profile" class="theme-color-purple-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_2.png" alt="User-Profile" class="theme-color-blue-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_4.png" alt="User-Profile" class="theme-color-green-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_5.png" alt="User-Profile" class="theme-color-yellow-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_3.png" alt="User-Profile" class="theme-color-pink-img img-fluid avatar avatar-50 avatar-rounded">
<div class="caption ms-3 ">
<h6 class="mb-0 caption-title">Austin Robertson</h6>
<p class="mb-0 caption-sub-title">Marketing Administrator</p>
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="../dashboard/app/user-profile.html">Profile</a></li>
<li><a class="dropdown-item" href="../dashboard/app/user-privacy-setting.html">Privacy Setting</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="../dashboard/auth/sign-in.html">Logout</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav> <!--Nav End-->
<div class="conatiner-fluid content-inner pb-0">
<div class="row">
<div class="col-md-12 col-lg-12">
<div class="row row-cols-1">
<div class="d-slider1 overflow-hidden ">
<ul class="swiper-wrapper list-inline m-0 p-0 mb-2">
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-01" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="90" data-type="percent">
<svg class="card-slie-arrow " width="24" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Sales</p>
<h4 class="counter">$560K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-02" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="80" data-type="percent">
<svg class="card-slie-arrow " width="24" height="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Profit</p>
<h4 class="counter">$185K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-03" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="70" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Cost</p>
<h4 class="counter">$375K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-04" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="60" data-type="percent">
<svg class="card-slie-arrow " width="24px" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Revenue</p>
<h4 class="counter">$742K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-05" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="50" data-type="percent">
<svg class="card-slie-arrow " width="24px" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Net Income</p>
<h4 class="counter">$150K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-06" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="40" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Today</p>
<h4 class="counter">$4600</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-07" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="30" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Members</p>
<h4 class="counter">11.2M</h4>
</div>
</div>
</div>
</li>
</ul>
<div class="swiper-button swiper-button-next"></div>
<div class="swiper-button swiper-button-prev"></div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-8">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">$855.8K</h4>
<p class="mb-0">Gross Sales</p>
</div>
<div class="d-flex align-items-center align-self-center">
<div class="d-flex align-items-center text-primary">
<svg xmlns="http://www.w3.org/2000/svg" width="12" viewBox="0 0 24 24" fill="currentColor">
<circle cx="12" cy="12" r="8" fill="currentColor"></circle>
</svg>
<div class="ms-2">
<span class="text-secondary">Sales</span>
</div>
</div>
<div class="d-flex align-items-center ms-3 text-info">
<svg xmlns="http://www.w3.org/2000/svg" width="12" viewBox="0 0 24 24" fill="currentColor">
<circle cx="12" cy="12" r="8" fill="currentColor"></circle>
</svg>
<div class="ms-2">
<span class="text-secondary">Cost</span>
</div>
</div>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton22" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton22">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div id="d-main" class="d-main"></div>
</div>
</div>
</div>
<div class="col-md-12 col-xl-6">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">Earnings</h4>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton1">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div class="d-flex flex-wrap align-items-center justify-content-between">
<div id="myChart" class="col-md-8 col-lg-8 myChart"></div>
<div class="d-grid gap col-md-4 col-lg-4">
<div class="d-flex align-items-start">
<svg class="mt-2" xmlns="http://www.w3.org/2000/svg" width="14" viewBox="0 0 24 24" fill="#3a57e8">
<circle cx="12" cy="12" r="8" fill="#3a57e8"></circle>
</svg>
<div class="ms-3">
<span class="text-secondary">Fashion</span>
<h6>251K</h6>
</div>
</div>
<div class="d-flex align-items-start">
<svg class="mt-2" xmlns="http://www.w3.org/2000/svg" width="14" viewBox="0 0 24 24" fill="#4bc7d2">
<circle cx="12" cy="12" r="8" fill="#4bc7d2"></circle>
</svg>
<div class="ms-3">
<span class="text-secondary">Accessories</span>
<h6>176K</h6>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-xl-6">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">Conversions</h4>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton3" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton3">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div id="d-activity" class="d-activity"></div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12">
<div class="card overflow-hidden">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title mb-2">Enterprise Clients</h4>
<p class="mb-0">
<svg class ="me-2" width="24" height="24" viewBox="0 0 24 24">
<path fill="#3a57e8" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" />
</svg>
15 new acquired this month
</p>
</div>
<div class="dropdown">
<span class="dropdown-toggle" id="dropdownMenuButton7" data-bs-toggle="dropdown" aria-expanded="false" role="button">
</span>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton7">
<a class="dropdown-item " href="javascript:void(0);">Action</a>
<a class="dropdown-item " href="javascript:void(0);">Another action</a>
<a class="dropdown-item " href="javascript:void(0);">Something else here</a>
</div>
</div>
</div>
<div class="card-body p-0">
<div class="table-responsive mt-4">
<table id="basic-table" class="table table-striped mb-0" role="grid">
<thead>
<tr>
<th>COMPANIES</th>
<th>CONTACTS</th>
<th>ORDER</th>
<th>COMPLETION</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/01.png" alt="profile">
<h6>Addidis Sportwear</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
</div>
</td>
<td>$14,000</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>60%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/05.png" alt="profile">
<h6>Netflixer Platforms</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
</div>
</td>
<td>$30,000</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>25%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/02.png" alt="profile">
<h6>Shopifi Stores</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">TP</div>
</a>
</div>
</td>
<td>$8,500</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>100%</h6>
</div>
<div class="progress bg-soft-success shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-success" data-toggle="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/03.png" alt="profile">
<h6>Bootstrap Technologies</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">TP</div>
</a>
</div>
</td>
<td>$20,500</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>100%</h6>
</div>
<div class="progress bg-soft-success shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-success" data-toggle="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/04.png" alt="profile">
<h6>Community First</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
</div>
</td>
<td>$9,800</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>75%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-4">
<div class="row">
<div class="col-md-12 col-lg-12">
<div class="card credit-card-widget">
<div class="card-header pb-4 border-0">
<div class="p-4 primary-gradient-card rounded border border-white">
<div class="d-flex justify-content-between align-items-center">
<div>
<h5 class="font-weight-bold">VISA </h5>
<P class="mb-0">PREMIUM ACCOUNT</P>
</div>
<div class="master-card-content">
<svg class="master-card-1" width="60" height="60" viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>
<svg class="master-card-2" width="60" height="60" viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>
</div>
</div>
<div class="my-4">
<div class="card-number">
<span class="fs-5 me-2">5789</span>
<span class="fs-5 me-2">****</span>
<span class="fs-5 me-2">****</span>
<span class="fs-5">2847</span>
</div>
</div>
<div class="d-flex align-items-center mb-2 justify-content-between">
<p class="mb-0">Card holder</p>
<p class="mb-0">Expire Date</p>
</div>
<div class="d-flex align-items-center justify-content-between">
<h6>Mike Smith</h6>
<h6 class="ms-5">06/11</h6>
</div>
</div>
</div>
<div class="card-body">
<div class="d-flex align-itmes-center flex-wrap mb-4">
<div class="d-flex align-itmes-center me-0 me-md-4">
<div>
<div class="p-3 mb-2 rounded bg-soft-primary">
<svg width="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.9303 7C16.9621 6.92913 16.977 6.85189 16.9739 6.77432H17C16.8882 4.10591 14.6849 2 12.0049 2C9.325 2 7.12172 4.10591 7.00989 6.77432C6.9967 6.84898 6.9967 6.92535 7.00989 7H6.93171C5.65022 7 4.28034 7.84597 3.88264 10.1201L3.1049 16.3147C2.46858 20.8629 4.81062 22 7.86853 22H16.1585C19.2075 22 21.4789 20.3535 20.9133 16.3147L20.1444 10.1201C19.676 7.90964 18.3503 7 17.0865 7H16.9303ZM15.4932 7C15.4654 6.92794 15.4506 6.85153 15.4497 6.77432C15.4497 4.85682 13.8899 3.30238 11.9657 3.30238C10.0416 3.30238 8.48184 4.85682 8.48184 6.77432C8.49502 6.84898 8.49502 6.92535 8.48184 7H15.4932ZM9.097 12.1486C8.60889 12.1486 8.21321 11.7413 8.21321 11.2389C8.21321 10.7366 8.60889 10.3293 9.097 10.3293C9.5851 10.3293 9.98079 10.7366 9.98079 11.2389C9.98079 11.7413 9.5851 12.1486 9.097 12.1486ZM14.002 11.2389C14.002 11.7413 14.3977 12.1486 14.8858 12.1486C15.3739 12.1486 15.7696 11.7413 15.7696 11.2389C15.7696 10.7366 15.3739 10.3293 14.8858 10.3293C14.3977 10.3293 14.002 10.7366 14.002 11.2389Z" fill="currentColor"></path>
</svg>
</div>
</div>
<div class="ms-3">
<h5>1153</h5>
<small class="mb-0">Products</small>
</div>
</div>
<div class="d-flex align-itmes-center">
<div>
<div class="p-3 mb-2 rounded bg-soft-info">
<svg width="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.1213 11.2331H16.8891C17.3088 11.2331 17.6386 10.8861 17.6386 10.4677C17.6386 10.0391 17.3088 9.70236 16.8891 9.70236H14.1213C13.7016 9.70236 13.3719 10.0391 13.3719 10.4677C13.3719 10.8861 13.7016 11.2331 14.1213 11.2331ZM20.1766 5.92749C20.7861 5.92749 21.1858 6.1418 21.5855 6.61123C21.9852 7.08067 22.0551 7.7542 21.9652 8.36549L21.0159 15.06C20.8361 16.3469 19.7569 17.2949 18.4879 17.2949H7.58639C6.25742 17.2949 5.15828 16.255 5.04837 14.908L4.12908 3.7834L2.62026 3.51807C2.22057 3.44664 1.94079 3.04864 2.01073 2.64043C2.08068 2.22305 2.47038 1.94649 2.88006 2.00874L5.2632 2.3751C5.60293 2.43735 5.85274 2.72207 5.88272 3.06905L6.07257 5.35499C6.10254 5.68257 6.36234 5.92749 6.68209 5.92749H20.1766ZM7.42631 18.9079C6.58697 18.9079 5.9075 19.6018 5.9075 20.459C5.9075 21.3061 6.58697 22 7.42631 22C8.25567 22 8.93514 21.3061 8.93514 20.459C8.93514 19.6018 8.25567 18.9079 7.42631 18.9079ZM18.6676 18.9079C17.8282 18.9079 17.1487 19.6018 17.1487 20.459C17.1487 21.3061 17.8282 22 18.6676 22C19.4969 22 20.1764 21.3061 20.1764 20.459C20.1764 19.6018 19.4969 18.9079 18.6676 18.9079Z" fill="currentColor"></path>
</svg>
</div>
</div>
<div class="ms-3">
<h5>81K</h5>
<small class="mb-0">Order Served</small>
</div>
</div>
</div>
<div class="mb-4">
<div class="d-flex justify-content-between flex-wrap">
<h2 class="mb-2">$405,012,300</h2>
<div>
<span class="badge bg-success rounded-pill">YoY 24%</span>
</div>
</div>
<p class="text-info">Life time sales</p>
</div>
<div class="d-grid grid-cols-2 gap">
<button class="btn btn-primary text-uppercase">SUMMARY</button>
<button class="btn btn-info text-uppercase">ANALYTICS</button>
</div>
</div>
</div>
<div class="card">
<div class="card-body d-flex justify-content-around text-center">
<div>
<h2 class="mb-2">750<small>K</small></h2>
<p class="mb-0 text-secondary">Website Visitors</p>
</div>
<hr class="hr-vertial">
<div>
<h2 class="mb-2">7,500</h2>
<p class="mb-0 text-secondary">New Customers</p>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title mb-2">Activity overview</h4>
<p class="mb-0">
<svg class ="me-2" width="24" height="24" viewBox="0 0 24 24">
<path fill="#17904b" d="M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z" />
</svg>
16% this month
</p>
</div>
</div>
<div class="card-body">
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">$2400, Purchase</h6>
<span class="mb-0">11 JUL 8:10 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">New order #8744152</h6>
<span class="mb-0">11 JUL 11 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">Affiliate Payout</h6>
<span class="mb-0">11 JUL 7:64 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">New user added</h6>
<span class="mb-0">11 JUL 1:21 AM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-1">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">Product added</h6>
<span class="mb-0">11 JUL 4:50 AM</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="btn-download">
<a class="btn btn-danger px-3 py-2" href="https://iqonic.design/product/admin-templates/hope-ui-admin-free-open-source-bootstrap-admin-template/" target="_blank" >
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.4" fill-rule="evenodd" clip-rule="evenodd" d="M5.91064 20.5886C5.91064 19.7486 6.59064 19.0686 7.43064 19.0686C8.26064 19.0686 8.94064 19.7486 8.94064 20.5886C8.94064 21.4186 8.26064 22.0986 7.43064 22.0986C6.59064 22.0986 5.91064 21.4186 5.91064 20.5886ZM17.1606 20.5886C17.1606 19.7486 17.8406 19.0686 18.6806 19.0686C19.5106 19.0686 20.1906 19.7486 20.1906 20.5886C20.1906 21.4186 19.5106 22.0986 18.6806 22.0986C17.8406 22.0986 17.1606 21.4186 17.1606 20.5886Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1907 6.34909C20.8007 6.34909 21.2007 6.55909 21.6007 7.01909C22.0007 7.47909 22.0707 8.13909 21.9807 8.73809L21.0307 15.2981C20.8507 16.5591 19.7707 17.4881 18.5007 17.4881H7.59074C6.26074 17.4881 5.16074 16.4681 5.05074 15.1491L4.13074 4.24809L2.62074 3.98809C2.22074 3.91809 1.94074 3.52809 2.01074 3.12809C2.08074 2.71809 2.47074 2.44809 2.88074 2.50809L5.26574 2.86809C5.60574 2.92909 5.85574 3.20809 5.88574 3.54809L6.07574 5.78809C6.10574 6.10909 6.36574 6.34909 6.68574 6.34909H20.1907ZM14.1307 11.5481H16.9007C17.3207 11.5481 17.6507 11.2081 17.6507 10.7981C17.6507 10.3781 17.3207 10.0481 16.9007 10.0481H14.1307C13.7107 10.0481 13.3807 10.3781 13.3807 10.7981C13.3807 11.2081 13.7107 11.5481 14.1307 11.5481Z" fill="currentColor"></path>
</svg>
</a>
</div>
<!-- Footer Section Start -->
<footer class="footer">
<div class="footer-body">
<ul class="left-panel list-inline mb-0 p-0">
<li class="list-inline-item"><a href="../dashboard/extra/privacy-policy.html">Privacy Policy</a></li>
<li class="list-inline-item"><a href="../dashboard/extra/terms-of-service.html">Terms of Use</a></li>
</ul>
<div class="right-panel">
©<script>document.write(new Date().getFullYear())</script> Mercury Cloud, Made with
<span class="text-gray">
<svg width="15" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.85 2.50065C16.481 2.50065 17.111 2.58965 17.71 2.79065C21.401 3.99065 22.731 8.04065 21.62 11.5806C20.99 13.3896 19.96 15.0406 18.611 16.3896C16.68 18.2596 14.561 19.9196 12.28 21.3496L12.03 21.5006L11.77 21.3396C9.48102 19.9196 7.35002 18.2596 5.40102 16.3796C4.06102 15.0306 3.03002 13.3896 2.39002 11.5806C1.26002 8.04065 2.59002 3.99065 6.32102 2.76965C6.61102 2.66965 6.91002 2.59965 7.21002 2.56065H7.33002C7.61102 2.51965 7.89002 2.50065 8.17002 2.50065H8.28002C8.91002 2.51965 9.52002 2.62965 10.111 2.83065H10.17C10.21 2.84965 10.24 2.87065 10.26 2.88965C10.481 2.96065 10.69 3.04065 10.89 3.15065L11.27 3.32065C11.3618 3.36962 11.4649 3.44445 11.554 3.50912C11.6104 3.55009 11.6612 3.58699 11.7 3.61065C11.7163 3.62028 11.7329 3.62996 11.7496 3.63972C11.8354 3.68977 11.9247 3.74191 12 3.79965C13.111 2.95065 14.46 2.49065 15.85 2.50065ZM18.51 9.70065C18.92 9.68965 19.27 9.36065 19.3 8.93965V8.82065C19.33 7.41965 18.481 6.15065 17.19 5.66065C16.78 5.51965 16.33 5.74065 16.18 6.16065C16.04 6.58065 16.26 7.04065 16.68 7.18965C17.321 7.42965 17.75 8.06065 17.75 8.75965V8.79065C17.731 9.01965 17.8 9.24065 17.94 9.41065C18.08 9.58065 18.29 9.67965 18.51 9.70065Z" fill="currentColor"></path>
</svg>
</span> by <a href="https://iqonic.design/">IQONIC Design</a>.
</div>
</div>
</footer>
<!-- Footer Section End --> </main>
<!-- Wrapper End-->
</div>
<!-- Library Bundle Script -->
<script src="../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../assets/js/charts/vectore-chart.js"></script>
<script src="../assets/js/charts/dashboard.js" ></script>
<!-- fslightbox Script -->
<script src="../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1,732 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Responsive Bootstrap 5 Admin Dashboard Template</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../assets/css/rtl.min.css"/>
</head>
<body class=" dual-compact">
<span class="screen-darken"></span>
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<main class="main-content">
<!--Nav Start-->
<nav class="navbar navbar-expand-lg fixed-top navbar-dark bg-dark iq-navbar" aria-label="Main navigation">
<div class="container-fluid">
<a href="../dashboard/index.html" class="navbar-brand d-flex align-items-center">
<!--Logo start-->
<svg width="30" class="" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"/>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"/>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"/>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"/>
</svg>
<!--logo End--> <h4 class="logo-title text-light ms-3 mb-0">Mercury Cloud</h4>
</a>
<button class="navbar-toggler p-0 border-0" type="button" id="navbarSideCollapse" aria-label="Toggle navigation">
<span class="navbar-toggler-icon">
<span class="navbar-toggler-bar bar1 mt-2"></span>
<span class="navbar-toggler-bar bar2"></span>
<span class="navbar-toggler-bar bar3"></span>
</span>
</button>
<div class="navbar-collapse offcanvas-collapse" id="navbarsExampleDefault">
<ul class="navbar-nav me-auto mb-2 mb-lg-0 align-items-center">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Dashboard</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Notifications</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Profile</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-bs-toggle="dropdown" aria-expanded="false">Settings</a>
<ul class="dropdown-menu" aria-labelledby="dropdown01">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</li>
</ul>
<form class="d-flex">
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-primary" type="submit">Search</button>
</form>
</div>
</div>
</nav>
<div class="nav-scroller bg-body shadow-sm">
<nav class="nav nav-underline" aria-label="Secondary navigation">
<a class="nav-link active" aria-current="page" href="#">Dashboard</a>
<a class="nav-link" href="#">
Friends
<span class="badge bg-light text-dark rounded-pill align-text-bottom">27</span>
</a>
<a class="nav-link" href="#">Explore</a>
<a class="nav-link" href="#">Suggestions</a>
<a class="nav-link" href="#">Link</a>
<a class="nav-link" href="#">Link</a>
<a class="nav-link" href="#">Link</a>
<a class="nav-link" href="#">Link</a>
<a class="nav-link" href="#">Link</a>
</nav>
</div> <!--Nav End-->
<div class="conatiner-fluid content-inner pb-0">
<div class="row">
<div class="col-md-12 col-lg-12">
<div class="row row-cols-1">
<div class="d-slider1 overflow-hidden ">
<ul class="swiper-wrapper list-inline m-0 p-0 mb-2">
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-01" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="90" data-type="percent">
<svg class="card-slie-arrow " width="24" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Sales</p>
<h4 class="counter">$560K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-02" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="80" data-type="percent">
<svg class="card-slie-arrow " width="24" height="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Profit</p>
<h4 class="counter">$185K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-03" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="70" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Cost</p>
<h4 class="counter">$375K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-04" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="60" data-type="percent">
<svg class="card-slie-arrow " width="24px" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Revenue</p>
<h4 class="counter">$742K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-05" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="50" data-type="percent">
<svg class="card-slie-arrow " width="24px" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Net Income</p>
<h4 class="counter">$150K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-06" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="40" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Today</p>
<h4 class="counter">$4600</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-07" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="30" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Members</p>
<h4 class="counter">11.2M</h4>
</div>
</div>
</div>
</li>
</ul>
<div class="swiper-button swiper-button-next"></div>
<div class="swiper-button swiper-button-prev"></div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-8">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">$855.8K</h4>
<p class="mb-0">Gross Sales</p>
</div>
<div class="d-flex align-items-center align-self-center">
<div class="d-flex align-items-center text-primary">
<svg xmlns="http://www.w3.org/2000/svg" width="12" viewBox="0 0 24 24" fill="currentColor">
<g>
<circle cx="12" cy="12" r="8" fill="currentColor"></circle>
</g>
</svg>
<div class="ms-2">
<span class="text-secondary">Sales</span>
</div>
</div>
<div class="d-flex align-items-center ms-3 text-info">
<svg xmlns="http://www.w3.org/2000/svg" width="12" viewBox="0 0 24 24" fill="currentColor">
<g>
<circle cx="12" cy="12" r="8" fill="currentColor"></circle>
</g>
</svg>
<div class="ms-2">
<span class="text-secondary">Cost</span>
</div>
</div>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton22" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton22">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div id="d-main" class="d-main"></div>
</div>
</div>
</div>
<div class="col-md-12 col-xl-6">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">Earnings</h4>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton1">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div class="d-flex flex-wrap align-items-center justify-content-between">
<div id="myChart" class="col-md-8 col-lg-8 myChart"></div>
<div class="d-grid gap col-md-4 col-lg-4">
<div class="d-flex align-items-start">
<svg class="mt-2" xmlns="http://www.w3.org/2000/svg" width="14" viewBox="0 0 24 24" fill="#3a57e8">
<g>
<circle cx="12" cy="12" r="8" fill="#3a57e8"></circle>
</g>
</svg>
<div class="ms-3">
<span class="text-secondary">Fashion</span>
<h6>251K</h6>
</div>
</div>
<div class="d-flex align-items-start">
<svg class="mt-2" xmlns="http://www.w3.org/2000/svg" width="14" viewBox="0 0 24 24" fill="#4bc7d2">
<g>
<circle cx="12" cy="12" r="8" fill="#4bc7d2"></circle>
</g>
</svg>
<div class="ms-3">
<span class="text-secondary">Accessories</span>
<h6>176K</h6>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-xl-6">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">Conversions</h4>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton3" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton3">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div id="d-activity" class="d-activity"></div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12">
<div class="card overflow-hidden">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title mb-2">Enterprise Clients</h4>
<p class="mb-0">
<svg class ="me-2" width="24" height="24" viewBox="0 0 24 24">
<path fill="#3a57e8" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" />
</svg>
15 new acquired this month
</p>
</div>
<div class="dropdown">
<span class="dropdown-toggle" id="dropdownMenuButton7" data-bs-toggle="dropdown" aria-expanded="false" role="button">
</span>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton7">
<a class="dropdown-item " href="javascript:void(0);">Action</a>
<a class="dropdown-item " href="javascript:void(0);">Another action</a>
<a class="dropdown-item " href="javascript:void(0);">Something else here</a>
</div>
</div>
</div>
<div class="card-body p-0">
<div class="table-responsive mt-4">
<table id="basic-table" class="table table-striped mb-0" role="grid">
<thead>
<tr>
<th>COMPANIES</th>
<th>CONTACTS</th>
<th>ORDER</th>
<th>COMPLETION</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/01.png" alt="profile">
<h6>Addidis Sportwear</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
</div>
</td>
<td>$14,000</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>60%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/05.png" alt="profile">
<h6>Netflixer Platforms</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
</div>
</td>
<td>$30,000</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>25%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/02.png" alt="profile">
<h6>Shopifi Stores</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">TP</div>
</a>
</div>
</td>
<td>$8,500</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>100%</h6>
</div>
<div class="progress bg-soft-success shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-success" data-toggle="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/03.png" alt="profile">
<h6>Bootstrap Technologies</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">TP</div>
</a>
</div>
</td>
<td>$20,500</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>100%</h6>
</div>
<div class="progress bg-soft-success shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-success" data-toggle="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/04.png" alt="profile">
<h6>Community First</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
</div>
</td>
<td>$9,800</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>75%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-4">
<div class="row">
<div class="col-md-12 col-lg-12">
<div class="card credit-card-widget">
<div class="card-header pb-4 border-0">
<div class="p-4 primary-gradient-card rounded border border-white">
<div class="d-flex justify-content-between align-items-center">
<div>
<h5 class="font-weight-bold">VISA </h5>
<P class="mb-0">PREMIUM ACCOUNT</P>
</div>
<div class="master-card-content">
<svg class="master-card-1" width="60" height="60" viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>
<svg class="master-card-2" width="60" height="60" viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>
</div>
</div>
<div class="my-4">
<div class="card-number">
<span class="fs-5 me-2">5789</span>
<span class="fs-5 me-2">****</span>
<span class="fs-5 me-2">****</span>
<span class="fs-5">2847</span>
</div>
</div>
<div class="d-flex align-items-center mb-2 justify-content-between">
<p class="mb-0">Card holder</p>
<p class="mb-0">Expire Date</p>
</div>
<div class="d-flex align-items-center justify-content-between">
<h6>Mike Smith</h6>
<h6 class="ms-5">06/11</h6>
</div>
</div>
</div>
<div class="card-body">
<div class="d-flex align-itmes-center flex-wrap mb-4">
<div class="d-flex align-itmes-center me-0 me-md-4">
<div>
<div class="p-3 mb-2 rounded bg-soft-primary">
<svg width="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.9303 7C16.9621 6.92913 16.977 6.85189 16.9739 6.77432H17C16.8882 4.10591 14.6849 2 12.0049 2C9.325 2 7.12172 4.10591 7.00989 6.77432C6.9967 6.84898 6.9967 6.92535 7.00989 7H6.93171C5.65022 7 4.28034 7.84597 3.88264 10.1201L3.1049 16.3147C2.46858 20.8629 4.81062 22 7.86853 22H16.1585C19.2075 22 21.4789 20.3535 20.9133 16.3147L20.1444 10.1201C19.676 7.90964 18.3503 7 17.0865 7H16.9303ZM15.4932 7C15.4654 6.92794 15.4506 6.85153 15.4497 6.77432C15.4497 4.85682 13.8899 3.30238 11.9657 3.30238C10.0416 3.30238 8.48184 4.85682 8.48184 6.77432C8.49502 6.84898 8.49502 6.92535 8.48184 7H15.4932ZM9.097 12.1486C8.60889 12.1486 8.21321 11.7413 8.21321 11.2389C8.21321 10.7366 8.60889 10.3293 9.097 10.3293C9.5851 10.3293 9.98079 10.7366 9.98079 11.2389C9.98079 11.7413 9.5851 12.1486 9.097 12.1486ZM14.002 11.2389C14.002 11.7413 14.3977 12.1486 14.8858 12.1486C15.3739 12.1486 15.7696 11.7413 15.7696 11.2389C15.7696 10.7366 15.3739 10.3293 14.8858 10.3293C14.3977 10.3293 14.002 10.7366 14.002 11.2389Z" fill="currentColor"></path>
</svg>
</div>
</div>
<div class="ms-3">
<h5>1153</h5>
<small class="mb-0">Products</small>
</div>
</div>
<div class="d-flex align-itmes-center">
<div>
<div class="p-3 mb-2 rounded bg-soft-info">
<svg width="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.1213 11.2331H16.8891C17.3088 11.2331 17.6386 10.8861 17.6386 10.4677C17.6386 10.0391 17.3088 9.70236 16.8891 9.70236H14.1213C13.7016 9.70236 13.3719 10.0391 13.3719 10.4677C13.3719 10.8861 13.7016 11.2331 14.1213 11.2331ZM20.1766 5.92749C20.7861 5.92749 21.1858 6.1418 21.5855 6.61123C21.9852 7.08067 22.0551 7.7542 21.9652 8.36549L21.0159 15.06C20.8361 16.3469 19.7569 17.2949 18.4879 17.2949H7.58639C6.25742 17.2949 5.15828 16.255 5.04837 14.908L4.12908 3.7834L2.62026 3.51807C2.22057 3.44664 1.94079 3.04864 2.01073 2.64043C2.08068 2.22305 2.47038 1.94649 2.88006 2.00874L5.2632 2.3751C5.60293 2.43735 5.85274 2.72207 5.88272 3.06905L6.07257 5.35499C6.10254 5.68257 6.36234 5.92749 6.68209 5.92749H20.1766ZM7.42631 18.9079C6.58697 18.9079 5.9075 19.6018 5.9075 20.459C5.9075 21.3061 6.58697 22 7.42631 22C8.25567 22 8.93514 21.3061 8.93514 20.459C8.93514 19.6018 8.25567 18.9079 7.42631 18.9079ZM18.6676 18.9079C17.8282 18.9079 17.1487 19.6018 17.1487 20.459C17.1487 21.3061 17.8282 22 18.6676 22C19.4969 22 20.1764 21.3061 20.1764 20.459C20.1764 19.6018 19.4969 18.9079 18.6676 18.9079Z" fill="currentColor"></path>
</svg>
</div>
</div>
<div class="ms-3">
<h5>81K</h5>
<small class="mb-0">Order Served</small>
</div>
</div>
</div>
<div class="mb-4">
<div class="d-flex justify-content-between flex-wrap">
<h2 class="mb-2">$405,012,300</h2>
<div>
<span class="badge bg-success rounded-pill">YoY 24%</span>
</div>
</div>
<p class="text-info">Life time sales</p>
</div>
<div class="d-grid grid-cols-2 gap">
<button class="btn btn-primary text-uppercase">SUMMARY</button>
<button class="btn btn-info text-uppercase">ANALYTICS</button>
</div>
</div>
</div>
<div class="card">
<div class="card-body d-flex justify-content-around text-center">
<div>
<h2 class="mb-2">750<small>K</small></h2>
<p class="mb-0 text-secondary">Website Visitors</p>
</div>
<hr class="hr-vertial">
<div>
<h2 class="mb-2">7,500</h2>
<p class="mb-0 text-secondary">New Customers</p>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title mb-2">Activity overview</h4>
<p class="mb-0">
<svg class ="me-2" width="24" height="24" viewBox="0 0 24 24">
<path fill="#17904b" d="M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z" />
</svg>
16% this month
</p>
</div>
</div>
<div class="card-body">
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">$2400, Purchase</h6>
<span class="mb-0">11 JUL 8:10 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">New order #8744152</h6>
<span class="mb-0">11 JUL 11 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">Affiliate Payout</h6>
<span class="mb-0">11 JUL 7:64 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">New user added</h6>
<span class="mb-0">11 JUL 1:21 AM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-1">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">Product added</h6>
<span class="mb-0">11 JUL 4:50 AM</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="btn-download">
<a class="btn btn-danger px-3 py-2" href="https://iqonic.design/product/admin-templates/hope-ui-admin-free-open-source-bootstrap-admin-template/" target="_blank" >
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.4" fill-rule="evenodd" clip-rule="evenodd" d="M5.91064 20.5886C5.91064 19.7486 6.59064 19.0686 7.43064 19.0686C8.26064 19.0686 8.94064 19.7486 8.94064 20.5886C8.94064 21.4186 8.26064 22.0986 7.43064 22.0986C6.59064 22.0986 5.91064 21.4186 5.91064 20.5886ZM17.1606 20.5886C17.1606 19.7486 17.8406 19.0686 18.6806 19.0686C19.5106 19.0686 20.1906 19.7486 20.1906 20.5886C20.1906 21.4186 19.5106 22.0986 18.6806 22.0986C17.8406 22.0986 17.1606 21.4186 17.1606 20.5886Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1907 6.34909C20.8007 6.34909 21.2007 6.55909 21.6007 7.01909C22.0007 7.47909 22.0707 8.13909 21.9807 8.73809L21.0307 15.2981C20.8507 16.5591 19.7707 17.4881 18.5007 17.4881H7.59074C6.26074 17.4881 5.16074 16.4681 5.05074 15.1491L4.13074 4.24809L2.62074 3.98809C2.22074 3.91809 1.94074 3.52809 2.01074 3.12809C2.08074 2.71809 2.47074 2.44809 2.88074 2.50809L5.26574 2.86809C5.60574 2.92909 5.85574 3.20809 5.88574 3.54809L6.07574 5.78809C6.10574 6.10909 6.36574 6.34909 6.68574 6.34909H20.1907ZM14.1307 11.5481H16.9007C17.3207 11.5481 17.6507 11.2081 17.6507 10.7981C17.6507 10.3781 17.3207 10.0481 16.9007 10.0481H14.1307C13.7107 10.0481 13.3807 10.3781 13.3807 10.7981C13.3807 11.2081 13.7107 11.5481 14.1307 11.5481Z" fill="currentColor"></path>
</svg>
</a>
</div>
<!-- Footer Section Start -->
<footer class="footer">
<div class="footer-body">
<ul class="left-panel list-inline mb-0 p-0">
<li class="list-inline-item"><a href="../dashboard/extra/privacy-policy.html">Privacy Policy</a></li>
<li class="list-inline-item"><a href="../dashboard/extra/terms-of-service.html">Terms of Use</a></li>
</ul>
<div class="right-panel">
©<script>document.write(new Date().getFullYear())</script> Mercury Cloud, Made with
<span class="text-gray">
<svg width="15" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.85 2.50065C16.481 2.50065 17.111 2.58965 17.71 2.79065C21.401 3.99065 22.731 8.04065 21.62 11.5806C20.99 13.3896 19.96 15.0406 18.611 16.3896C16.68 18.2596 14.561 19.9196 12.28 21.3496L12.03 21.5006L11.77 21.3396C9.48102 19.9196 7.35002 18.2596 5.40102 16.3796C4.06102 15.0306 3.03002 13.3896 2.39002 11.5806C1.26002 8.04065 2.59002 3.99065 6.32102 2.76965C6.61102 2.66965 6.91002 2.59965 7.21002 2.56065H7.33002C7.61102 2.51965 7.89002 2.50065 8.17002 2.50065H8.28002C8.91002 2.51965 9.52002 2.62965 10.111 2.83065H10.17C10.21 2.84965 10.24 2.87065 10.26 2.88965C10.481 2.96065 10.69 3.04065 10.89 3.15065L11.27 3.32065C11.3618 3.36962 11.4649 3.44445 11.554 3.50912C11.6104 3.55009 11.6612 3.58699 11.7 3.61065C11.7163 3.62028 11.7329 3.62996 11.7496 3.63972C11.8354 3.68977 11.9247 3.74191 12 3.79965C13.111 2.95065 14.46 2.49065 15.85 2.50065ZM18.51 9.70065C18.92 9.68965 19.27 9.36065 19.3 8.93965V8.82065C19.33 7.41965 18.481 6.15065 17.19 5.66065C16.78 5.51965 16.33 5.74065 16.18 6.16065C16.04 6.58065 16.26 7.04065 16.68 7.18965C17.321 7.42965 17.75 8.06065 17.75 8.75965V8.79065C17.731 9.01965 17.8 9.24065 17.94 9.41065C18.08 9.58065 18.29 9.67965 18.51 9.70065Z" fill="currentColor"></path>
</svg>
</span> by <a href="https://iqonic.design/">IQONIC Design</a>.
</div>
</div>
</footer>
<!-- Footer Section End --> </main>
<!-- Wrapper End-->
<!-- Library Bundle Script -->
<script src="../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../assets/js/charts/vectore-chart.js"></script>
<script src="../assets/js/charts/dashboard.js" ></script>
<!-- fslightbox Script -->
<script src="../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1,921 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Responsive Bootstrap 5 Admin Dashboard Template</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../assets/css/rtl.min.css"/>
</head>
<body class=" ">
<span class="screen-darken"></span>
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<main class="main-content">
<!--Nav Start-->
<nav class="nav navbar navbar-expand-lg navbar-light iq-navbar">
<div class="container-fluid navbar-inner">
<a href="../dashboard/index.html" class="navbar-brand">
<!--Logo start-->
<svg width="30" class="text-primary" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"></rect>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"></rect>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"></rect>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"></rect>
</svg>
<!--logo End--> <h4 class="logo-title">Mercury Cloud</h4>
</a>
<div class="sidebar-toggle" data-toggle="sidebar" data-active="true">
<i class="icon">
<svg width="20px" height="20px" viewBox="0 0 24 24">
<path fill="currentColor" d="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z"></path>
</svg>
</i>
</div>
<div class="input-group search-input">
<span class="input-group-text" id="search-input">
<svg width="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="11.7669" cy="11.7666" r="8.98856" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></circle>
<path d="M18.0186 18.4851L21.5426 22" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</span>
<input type="search" class="form-control" placeholder="Search...">
</div>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon">
<span class="navbar-toggler-bar bar1 mt-2"></span>
<span class="navbar-toggler-bar bar2"></span>
<span class="navbar-toggler-bar bar3"></span>
</span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ms-auto navbar-list mb-2 mb-lg-0">
<li class="nav-item dropdown">
<a href="#" class="search-toggle nav-link" id="dropdownMenuButton2" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<img src="../assets/images/Flag/flag001.png" class="img-fluid rounded-circle" alt="user" style="height: 30px; min-width: 30px; width: 30px;">
<span class="bg-primary"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="dropdownMenuButton2">
<div class="card shadow-none m-0 border-0">
<div class=" p-0 ">
<ul class="list-group list-group-flush p-0">
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-03.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;">Spanish</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-04.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;">Italian</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-02.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;">French</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-05.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;">German</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-06.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;">Japanese</a></li>
</ul>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link" id="notification-drop" data-bs-toggle="dropdown">
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.7695 11.6453C19.039 10.7923 18.7071 10.0531 18.7071 8.79716V8.37013C18.7071 6.73354 18.3304 5.67907 17.5115 4.62459C16.2493 2.98699 14.1244 2 12.0442 2H11.9558C9.91935 2 7.86106 2.94167 6.577 4.5128C5.71333 5.58842 5.29293 6.68822 5.29293 8.37013V8.79716C5.29293 10.0531 4.98284 10.7923 4.23049 11.6453C3.67691 12.2738 3.5 13.0815 3.5 13.9557C3.5 14.8309 3.78723 15.6598 4.36367 16.3336C5.11602 17.1413 6.17846 17.6569 7.26375 17.7466C8.83505 17.9258 10.4063 17.9933 12.0005 17.9933C13.5937 17.9933 15.165 17.8805 16.7372 17.7466C17.8215 17.6569 18.884 17.1413 19.6363 16.3336C20.2118 15.6598 20.5 14.8309 20.5 13.9557C20.5 13.0815 20.3231 12.2738 19.7695 11.6453Z" fill="currentColor"></path>
<path opacity="0.4" d="M14.0088 19.2283C13.5088 19.1215 10.4627 19.1215 9.96275 19.2283C9.53539 19.327 9.07324 19.5566 9.07324 20.0602C9.09809 20.5406 9.37935 20.9646 9.76895 21.2335L9.76795 21.2345C10.2718 21.6273 10.8632 21.877 11.4824 21.9667C11.8123 22.012 12.1482 22.01 12.4901 21.9667C13.1083 21.877 13.6997 21.6273 14.2036 21.2345L14.2026 21.2335C14.5922 20.9646 14.8734 20.5406 14.8983 20.0602C14.8983 19.5566 14.4361 19.327 14.0088 19.2283Z" fill="currentColor"></path>
</svg>
<span class="bg-danger dots"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="notification-drop">
<div class="card shadow-none m-0">
<div class="card-header d-flex justify-content-between bg-primary py-3">
<div class="header-title">
<h5 class="mb-0 text-white">All Notifications</h5>
</div>
</div>
<div class="card-body p-0">
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/01.png" alt="">
<div class="ms-3 w-100">
<h6 class="mb-0 ">Emma Watson Bni</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">95 MB</p>
<small class="float-end font-size-12">Just Now</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/02.png" alt="">
</div>
<div class="ms-3 w-100">
<h6 class="mb-0 ">New customer is join</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-end font-size-12">5 days ago</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/03.png" alt="">
<div class="ms-3 w-100">
<h6 class="mb-0 ">Two customer is left</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-end font-size-12">2 days ago</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/04.png" alt="">
<div class="w-100 ms-3">
<h6 class="mb-0 ">New Mail from Fenny</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-end font-size-12">3 days ago</small>
</div>
</div>
</div>
</a>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link" id="mail-drop" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.4" d="M22 15.94C22 18.73 19.76 20.99 16.97 21H16.96H7.05C4.27 21 2 18.75 2 15.96V15.95C2 15.95 2.006 11.524 2.014 9.298C2.015 8.88 2.495 8.646 2.822 8.906C5.198 10.791 9.447 14.228 9.5 14.273C10.21 14.842 11.11 15.163 12.03 15.163C12.95 15.163 13.85 14.842 14.56 14.262C14.613 14.227 18.767 10.893 21.179 8.977C21.507 8.716 21.989 8.95 21.99 9.367C22 11.576 22 15.94 22 15.94Z" fill="currentColor"></path>
<path d="M21.4759 5.67351C20.6099 4.04151 18.9059 2.99951 17.0299 2.99951H7.04988C5.17388 2.99951 3.46988 4.04151 2.60388 5.67351C2.40988 6.03851 2.50188 6.49351 2.82488 6.75151L10.2499 12.6905C10.7699 13.1105 11.3999 13.3195 12.0299 13.3195C12.0339 13.3195 12.0369 13.3195 12.0399 13.3195C12.0429 13.3195 12.0469 13.3195 12.0499 13.3195C12.6799 13.3195 13.3099 13.1105 13.8299 12.6905L21.2549 6.75151C21.5779 6.49351 21.6699 6.03851 21.4759 5.67351Z" fill="currentColor"></path>
</svg>
<span class="bg-primary count-mail"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="mail-drop">
<div class="card shadow-none m-0">
<div class="card-header d-flex justify-content-between bg-primary py-3">
<div class="header-title">
<h5 class="mb-0 text-white">All Message</h5>
</div>
</div>
<div class="card-body p-0 ">
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/01.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Bni Emma Watson</h6>
<small class="float-start font-size-12">13 Jun</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/02.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Lorem Ipsum Watson</h6>
<small class="float-start font-size-12">20 Apr</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/03.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Why do we use it?</h6>
<small class="float-start font-size-12">30 Jun</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/04.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Variations Passages</h6>
<small class="float-start font-size-12">12 Sep</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/05.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Lorem Ipsum generators</h6>
<small class="float-start font-size-12">5 Dec</small>
</div>
</div>
</a>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a class="nav-link py-0 d-flex align-items-center" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<img src="../assets/images/avatars/01.png" alt="User-Profile" class="theme-color-default-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_1.png" alt="User-Profile" class="theme-color-purple-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_2.png" alt="User-Profile" class="theme-color-blue-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_4.png" alt="User-Profile" class="theme-color-green-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_5.png" alt="User-Profile" class="theme-color-yellow-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_3.png" alt="User-Profile" class="theme-color-pink-img img-fluid avatar avatar-50 avatar-rounded">
<div class="caption ms-3 d-none d-md-block ">
<h6 class="mb-0 caption-title">Austin Robertson</h6>
<p class="mb-0 caption-sub-title">Marketing Administrator</p>
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="../dashboard/app/user-profile.html">Profile</a></li>
<li><a class="dropdown-item" href="../dashboard/app/user-privacy-setting.html">Privacy Setting</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="../dashboard/auth/sign-in.html">Logout</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<div class="navbar dual-horizontal">
<!-- Horizontal Menu Start -->
<nav id="navbar_main" class="mobile-offcanvas nav navbar navbar-expand-xl hover-nav horizontal-nav mx-md-auto">
<div class="container-fluid">
<div class="offcanvas-header px-0">
<div class="navbar-brand ms-0">
<!--Logo start-->
<svg width="30" class="text-primary" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"/>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"/>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"/>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"/>
</svg>
<!--logo End--> <h4 class="logo-title">Mercury Cloud</h4>
</div>
<button class="btn-close float-end"></button>
</div>
<ul class="navbar-nav">
<li class="nav-item"><a class="nav-link " href="../dashboard/index-horizontal.html"> Horizontal </a></li>
<li class="nav-item"><a class="nav-link active" href="../dashboard/index-dual-horizontal.html"> Dual Horizontal </a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-dual-compact.html"><span class="item-name">Dual Compact</span></a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-boxed.html"> Boxed Horizontal </a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-boxed-fancy.html"> Boxed Fancy</a></li>
</ul>
</div> <!-- container-fluid.// -->
</nav>
<!-- Sidebar Menu End --></div> <!--Nav End-->
<div class="conatiner-fluid content-inner pb-0">
<div class="row">
<div class="col-md-12 col-lg-12">
<div class="row row-cols-1">
<div class="d-slider1 overflow-hidden ">
<ul class="swiper-wrapper list-inline m-0 p-0 mb-2">
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-01" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="90" data-type="percent">
<svg class="card-slie-arrow " width="24" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Sales</p>
<h4 class="counter">$560K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-02" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="80" data-type="percent">
<svg class="card-slie-arrow " width="24" height="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Profit</p>
<h4 class="counter">$185K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-03" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="70" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Cost</p>
<h4 class="counter">$375K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-04" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="60" data-type="percent">
<svg class="card-slie-arrow " width="24px" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Revenue</p>
<h4 class="counter">$742K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-05" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="50" data-type="percent">
<svg class="card-slie-arrow " width="24px" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Net Income</p>
<h4 class="counter">$150K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-06" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="40" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Today</p>
<h4 class="counter">$4600</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-07" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="30" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Members</p>
<h4 class="counter">11.2M</h4>
</div>
</div>
</div>
</li>
</ul>
<div class="swiper-button swiper-button-next"></div>
<div class="swiper-button swiper-button-prev"></div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-8">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">$855.8K</h4>
<p class="mb-0">Gross Sales</p>
</div>
<div class="d-flex align-items-center align-self-center">
<div class="d-flex align-items-center text-primary">
<svg xmlns="http://www.w3.org/2000/svg" width="12" viewBox="0 0 24 24" fill="currentColor">
<g>
<circle cx="12" cy="12" r="8" fill="currentColor"></circle>
</g>
</svg>
<div class="ms-2">
<span class="text-secondary">Sales</span>
</div>
</div>
<div class="d-flex align-items-center ms-3 text-info">
<svg xmlns="http://www.w3.org/2000/svg" width="12" viewBox="0 0 24 24" fill="currentColor">
<g>
<circle cx="12" cy="12" r="8" fill="currentColor"></circle>
</g>
</svg>
<div class="ms-2">
<span class="text-secondary">Cost</span>
</div>
</div>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton22" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton22">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div id="d-main" class="d-main"></div>
</div>
</div>
</div>
<div class="col-md-12 col-xl-6">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">Earnings</h4>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton1">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div class="d-flex flex-wrap align-items-center justify-content-between">
<div id="myChart" class="col-md-8 col-lg-8 myChart"></div>
<div class="d-grid gap col-md-4 col-lg-4">
<div class="d-flex align-items-start">
<svg class="mt-2" xmlns="http://www.w3.org/2000/svg" width="14" viewBox="0 0 24 24" fill="#3a57e8">
<g>
<circle cx="12" cy="12" r="8" fill="#3a57e8"></circle>
</g>
</svg>
<div class="ms-3">
<span class="text-secondary">Fashion</span>
<h6>251K</h6>
</div>
</div>
<div class="d-flex align-items-start">
<svg class="mt-2" xmlns="http://www.w3.org/2000/svg" width="14" viewBox="0 0 24 24" fill="#4bc7d2">
<g>
<circle cx="12" cy="12" r="8" fill="#4bc7d2"></circle>
</g>
</svg>
<div class="ms-3">
<span class="text-secondary">Accessories</span>
<h6>176K</h6>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-xl-6">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">Conversions</h4>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton3" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton3">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div id="d-activity" class="d-activity"></div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12">
<div class="card overflow-hidden">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title mb-2">Enterprise Clients</h4>
<p class="mb-0">
<svg class ="me-2" width="24" height="24" viewBox="0 0 24 24">
<path fill="#3a57e8" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" />
</svg>
15 new acquired this month
</p>
</div>
<div class="dropdown">
<span class="dropdown-toggle" id="dropdownMenuButton7" data-bs-toggle="dropdown" aria-expanded="false" role="button">
</span>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton7">
<a class="dropdown-item " href="javascript:void(0);">Action</a>
<a class="dropdown-item " href="javascript:void(0);">Another action</a>
<a class="dropdown-item " href="javascript:void(0);">Something else here</a>
</div>
</div>
</div>
<div class="card-body p-0">
<div class="table-responsive mt-4">
<table id="basic-table" class="table table-striped mb-0" role="grid">
<thead>
<tr>
<th>COMPANIES</th>
<th>CONTACTS</th>
<th>ORDER</th>
<th>COMPLETION</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/01.png" alt="profile">
<h6>Addidis Sportwear</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
</div>
</td>
<td>$14,000</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>60%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/05.png" alt="profile">
<h6>Netflixer Platforms</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
</div>
</td>
<td>$30,000</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>25%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/02.png" alt="profile">
<h6>Shopifi Stores</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">TP</div>
</a>
</div>
</td>
<td>$8,500</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>100%</h6>
</div>
<div class="progress bg-soft-success shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-success" data-toggle="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/03.png" alt="profile">
<h6>Bootstrap Technologies</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">TP</div>
</a>
</div>
</td>
<td>$20,500</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>100%</h6>
</div>
<div class="progress bg-soft-success shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-success" data-toggle="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/04.png" alt="profile">
<h6>Community First</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
</div>
</td>
<td>$9,800</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>75%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-4">
<div class="row">
<div class="col-md-12 col-lg-12">
<div class="card credit-card-widget">
<div class="card-header pb-4 border-0">
<div class="p-4 primary-gradient-card rounded border border-white">
<div class="d-flex justify-content-between align-items-center">
<div>
<h5 class="font-weight-bold">VISA </h5>
<P class="mb-0">PREMIUM ACCOUNT</P>
</div>
<div class="master-card-content">
<svg class="master-card-1" width="60" height="60" viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>
<svg class="master-card-2" width="60" height="60" viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>
</div>
</div>
<div class="my-4">
<div class="card-number">
<span class="fs-5 me-2">5789</span>
<span class="fs-5 me-2">****</span>
<span class="fs-5 me-2">****</span>
<span class="fs-5">2847</span>
</div>
</div>
<div class="d-flex align-items-center mb-2 justify-content-between">
<p class="mb-0">Card holder</p>
<p class="mb-0">Expire Date</p>
</div>
<div class="d-flex align-items-center justify-content-between">
<h6>Mike Smith</h6>
<h6 class="ms-5">06/11</h6>
</div>
</div>
</div>
<div class="card-body">
<div class="d-flex align-itmes-center flex-wrap mb-4">
<div class="d-flex align-itmes-center me-0 me-md-4">
<div>
<div class="p-3 mb-2 rounded bg-soft-primary">
<svg width="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.9303 7C16.9621 6.92913 16.977 6.85189 16.9739 6.77432H17C16.8882 4.10591 14.6849 2 12.0049 2C9.325 2 7.12172 4.10591 7.00989 6.77432C6.9967 6.84898 6.9967 6.92535 7.00989 7H6.93171C5.65022 7 4.28034 7.84597 3.88264 10.1201L3.1049 16.3147C2.46858 20.8629 4.81062 22 7.86853 22H16.1585C19.2075 22 21.4789 20.3535 20.9133 16.3147L20.1444 10.1201C19.676 7.90964 18.3503 7 17.0865 7H16.9303ZM15.4932 7C15.4654 6.92794 15.4506 6.85153 15.4497 6.77432C15.4497 4.85682 13.8899 3.30238 11.9657 3.30238C10.0416 3.30238 8.48184 4.85682 8.48184 6.77432C8.49502 6.84898 8.49502 6.92535 8.48184 7H15.4932ZM9.097 12.1486C8.60889 12.1486 8.21321 11.7413 8.21321 11.2389C8.21321 10.7366 8.60889 10.3293 9.097 10.3293C9.5851 10.3293 9.98079 10.7366 9.98079 11.2389C9.98079 11.7413 9.5851 12.1486 9.097 12.1486ZM14.002 11.2389C14.002 11.7413 14.3977 12.1486 14.8858 12.1486C15.3739 12.1486 15.7696 11.7413 15.7696 11.2389C15.7696 10.7366 15.3739 10.3293 14.8858 10.3293C14.3977 10.3293 14.002 10.7366 14.002 11.2389Z" fill="currentColor"></path>
</svg>
</div>
</div>
<div class="ms-3">
<h5>1153</h5>
<small class="mb-0">Products</small>
</div>
</div>
<div class="d-flex align-itmes-center">
<div>
<div class="p-3 mb-2 rounded bg-soft-info">
<svg width="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.1213 11.2331H16.8891C17.3088 11.2331 17.6386 10.8861 17.6386 10.4677C17.6386 10.0391 17.3088 9.70236 16.8891 9.70236H14.1213C13.7016 9.70236 13.3719 10.0391 13.3719 10.4677C13.3719 10.8861 13.7016 11.2331 14.1213 11.2331ZM20.1766 5.92749C20.7861 5.92749 21.1858 6.1418 21.5855 6.61123C21.9852 7.08067 22.0551 7.7542 21.9652 8.36549L21.0159 15.06C20.8361 16.3469 19.7569 17.2949 18.4879 17.2949H7.58639C6.25742 17.2949 5.15828 16.255 5.04837 14.908L4.12908 3.7834L2.62026 3.51807C2.22057 3.44664 1.94079 3.04864 2.01073 2.64043C2.08068 2.22305 2.47038 1.94649 2.88006 2.00874L5.2632 2.3751C5.60293 2.43735 5.85274 2.72207 5.88272 3.06905L6.07257 5.35499C6.10254 5.68257 6.36234 5.92749 6.68209 5.92749H20.1766ZM7.42631 18.9079C6.58697 18.9079 5.9075 19.6018 5.9075 20.459C5.9075 21.3061 6.58697 22 7.42631 22C8.25567 22 8.93514 21.3061 8.93514 20.459C8.93514 19.6018 8.25567 18.9079 7.42631 18.9079ZM18.6676 18.9079C17.8282 18.9079 17.1487 19.6018 17.1487 20.459C17.1487 21.3061 17.8282 22 18.6676 22C19.4969 22 20.1764 21.3061 20.1764 20.459C20.1764 19.6018 19.4969 18.9079 18.6676 18.9079Z" fill="currentColor"></path>
</svg>
</div>
</div>
<div class="ms-3">
<h5>81K</h5>
<small class="mb-0">Order Served</small>
</div>
</div>
</div>
<div class="mb-4">
<div class="d-flex justify-content-between flex-wrap">
<h2 class="mb-2">$405,012,300</h2>
<div>
<span class="badge bg-success rounded-pill">YoY 24%</span>
</div>
</div>
<p class="text-info">Life time sales</p>
</div>
<div class="d-grid grid-cols-2 gap">
<button class="btn btn-primary text-uppercase">SUMMARY</button>
<button class="btn btn-info text-uppercase">ANALYTICS</button>
</div>
</div>
</div>
<div class="card">
<div class="card-body d-flex justify-content-around text-center">
<div>
<h2 class="mb-2">750<small>K</small></h2>
<p class="mb-0 text-secondary">Website Visitors</p>
</div>
<hr class="hr-vertial">
<div>
<h2 class="mb-2">7,500</h2>
<p class="mb-0 text-secondary">New Customers</p>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title mb-2">Activity overview</h4>
<p class="mb-0">
<svg class ="me-2" width="24" height="24" viewBox="0 0 24 24">
<path fill="#17904b" d="M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z" />
</svg>
16% this month
</p>
</div>
</div>
<div class="card-body">
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">$2400, Purchase</h6>
<span class="mb-0">11 JUL 8:10 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">New order #8744152</h6>
<span class="mb-0">11 JUL 11 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">Affiliate Payout</h6>
<span class="mb-0">11 JUL 7:64 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">New user added</h6>
<span class="mb-0">11 JUL 1:21 AM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-1">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">Product added</h6>
<span class="mb-0">11 JUL 4:50 AM</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="btn-download">
<a class="btn btn-danger px-3 py-2" href="https://iqonic.design/product/admin-templates/hope-ui-admin-free-open-source-bootstrap-admin-template/" target="_blank" >
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.4" fill-rule="evenodd" clip-rule="evenodd" d="M5.91064 20.5886C5.91064 19.7486 6.59064 19.0686 7.43064 19.0686C8.26064 19.0686 8.94064 19.7486 8.94064 20.5886C8.94064 21.4186 8.26064 22.0986 7.43064 22.0986C6.59064 22.0986 5.91064 21.4186 5.91064 20.5886ZM17.1606 20.5886C17.1606 19.7486 17.8406 19.0686 18.6806 19.0686C19.5106 19.0686 20.1906 19.7486 20.1906 20.5886C20.1906 21.4186 19.5106 22.0986 18.6806 22.0986C17.8406 22.0986 17.1606 21.4186 17.1606 20.5886Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1907 6.34909C20.8007 6.34909 21.2007 6.55909 21.6007 7.01909C22.0007 7.47909 22.0707 8.13909 21.9807 8.73809L21.0307 15.2981C20.8507 16.5591 19.7707 17.4881 18.5007 17.4881H7.59074C6.26074 17.4881 5.16074 16.4681 5.05074 15.1491L4.13074 4.24809L2.62074 3.98809C2.22074 3.91809 1.94074 3.52809 2.01074 3.12809C2.08074 2.71809 2.47074 2.44809 2.88074 2.50809L5.26574 2.86809C5.60574 2.92909 5.85574 3.20809 5.88574 3.54809L6.07574 5.78809C6.10574 6.10909 6.36574 6.34909 6.68574 6.34909H20.1907ZM14.1307 11.5481H16.9007C17.3207 11.5481 17.6507 11.2081 17.6507 10.7981C17.6507 10.3781 17.3207 10.0481 16.9007 10.0481H14.1307C13.7107 10.0481 13.3807 10.3781 13.3807 10.7981C13.3807 11.2081 13.7107 11.5481 14.1307 11.5481Z" fill="currentColor"></path>
</svg>
</a>
</div>
<!-- Footer Section Start -->
<footer class="footer">
<div class="footer-body">
<ul class="left-panel list-inline mb-0 p-0">
<li class="list-inline-item"><a href="../dashboard/extra/privacy-policy.html">Privacy Policy</a></li>
<li class="list-inline-item"><a href="../dashboard/extra/terms-of-service.html">Terms of Use</a></li>
</ul>
<div class="right-panel">
©<script>document.write(new Date().getFullYear())</script> Mercury Cloud, Made with
<span class="text-gray">
<svg width="15" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.85 2.50065C16.481 2.50065 17.111 2.58965 17.71 2.79065C21.401 3.99065 22.731 8.04065 21.62 11.5806C20.99 13.3896 19.96 15.0406 18.611 16.3896C16.68 18.2596 14.561 19.9196 12.28 21.3496L12.03 21.5006L11.77 21.3396C9.48102 19.9196 7.35002 18.2596 5.40102 16.3796C4.06102 15.0306 3.03002 13.3896 2.39002 11.5806C1.26002 8.04065 2.59002 3.99065 6.32102 2.76965C6.61102 2.66965 6.91002 2.59965 7.21002 2.56065H7.33002C7.61102 2.51965 7.89002 2.50065 8.17002 2.50065H8.28002C8.91002 2.51965 9.52002 2.62965 10.111 2.83065H10.17C10.21 2.84965 10.24 2.87065 10.26 2.88965C10.481 2.96065 10.69 3.04065 10.89 3.15065L11.27 3.32065C11.3618 3.36962 11.4649 3.44445 11.554 3.50912C11.6104 3.55009 11.6612 3.58699 11.7 3.61065C11.7163 3.62028 11.7329 3.62996 11.7496 3.63972C11.8354 3.68977 11.9247 3.74191 12 3.79965C13.111 2.95065 14.46 2.49065 15.85 2.50065ZM18.51 9.70065C18.92 9.68965 19.27 9.36065 19.3 8.93965V8.82065C19.33 7.41965 18.481 6.15065 17.19 5.66065C16.78 5.51965 16.33 5.74065 16.18 6.16065C16.04 6.58065 16.26 7.04065 16.68 7.18965C17.321 7.42965 17.75 8.06065 17.75 8.75965V8.79065C17.731 9.01965 17.8 9.24065 17.94 9.41065C18.08 9.58065 18.29 9.67965 18.51 9.70065Z" fill="currentColor"></path>
</svg>
</span> by <a href="https://iqonic.design/">IQONIC Design</a>.
</div>
</div>
</footer>
<!-- Footer Section End --> </main>
<!-- Wrapper End-->
<!-- Library Bundle Script -->
<script src="../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../assets/js/charts/vectore-chart.js"></script>
<script src="../assets/js/charts/dashboard.js" ></script>
<!-- fslightbox Script -->
<script src="../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1,910 +0,0 @@
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Mercury Cloud | Responsive Bootstrap 5 Admin Dashboard Template</title>
<!-- Favicon -->
<link rel="shortcut icon" href="../assets/images/favicon.ico" />
<!-- Library / Plugin Css Build -->
<link rel="stylesheet" href="../assets/css/core/libs.min.css" />
<!-- Mercury Cloud Design System Css -->
<link rel="stylesheet" href="../assets/css/dashboard.css?v=1.2.0" />
<!-- Custom Css -->
<link rel="stylesheet" href="../assets/css/custom.min.css?v=1.2.0" />
<!-- Dark Css -->
<link rel="stylesheet" href="../assets/css/dark.min.css"/>
<!-- Customizer Css -->
<link rel="stylesheet" href="../assets/css/customizer.min.css" />
<!-- RTL Css -->
<link rel="stylesheet" href="../assets/css/rtl.min.css"/>
</head>
<body class=" ">
<span class="screen-darken"></span>
<!-- loader Start -->
<div id="loading">
<div class="loader simple-loader">
<div class="loader-body"></div>
</div> </div>
<!-- loader END -->
<main class="main-content">
<!--Nav Start-->
<nav class="nav navbar navbar-expand-xl navbar-light iq-navbar">
<div class="container-fluid navbar-inner">
<button data-trigger="navbar_main" class="d-xl-none btn btn-primary rounded-pill p-1 pt-0" type="button">
<svg width="20px" height="20px" viewBox="0 0 24 24">
<path fill="currentColor" d="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z"></path>
</svg>
</button>
<div class="col-lg-2 col-lg-3 navbar-brand">
<a href="../dashboard/index.html" class="d-flex">
<!--Logo start-->
<svg width="30" class="" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"/>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"/>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"/>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"/>
</svg>
<!--logo End--> <h4 class="logo-title">Mercury Cloud</h4>
</a>
</div>
<!-- Horizontal Menu Start -->
<nav id="navbar_main" class="mobile-offcanvas nav navbar navbar-expand-xl hover-nav horizontal-nav mx-md-auto">
<div class="container-fluid">
<div class="offcanvas-header px-0">
<div class="navbar-brand ms-0">
<!--Logo start-->
<svg width="30" class="text-primary" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="-0.757324" y="19.2427" width="28" height="4" rx="2" transform="rotate(-45 -0.757324 19.2427)" fill="currentColor"/>
<rect x="7.72803" y="27.728" width="28" height="4" rx="2" transform="rotate(-45 7.72803 27.728)" fill="currentColor"/>
<rect x="10.5366" y="16.3945" width="16" height="4" rx="2" transform="rotate(45 10.5366 16.3945)" fill="currentColor"/>
<rect x="10.5562" y="-0.556152" width="28" height="4" rx="2" transform="rotate(45 10.5562 -0.556152)" fill="currentColor"/>
</svg>
<!--logo End--> <h4 class="logo-title">Mercury Cloud</h4>
</div>
<button class="btn-close float-end"></button>
</div>
<ul class="navbar-nav">
<li class="nav-item"><a class="nav-link active" href="../dashboard/index-horizontal.html"> Horizontal </a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-dual-horizontal.html"> Dual Horizontal </a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-dual-compact.html"><span class="item-name">Dual Compact</span></a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-boxed.html"> Boxed Horizontal </a></li>
<li class="nav-item"><a class="nav-link " href="../dashboard/index-boxed-fancy.html"> Boxed Fancy</a></li>
</ul>
</div> <!-- container-fluid.// -->
</nav>
<!-- Sidebar Menu End --> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon">
<span class="navbar-toggler-bar bar1 mt-2"></span>
<span class="navbar-toggler-bar bar2"></span>
<span class="navbar-toggler-bar bar3"></span>
</span>
</button>
<div class="collapse navbar-collapse col-md-2" id="navbarSupportedContent">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item dropdown">
<a href="#" class="search-toggle nav-link" id="dropdownMenuButton2" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<img src="../assets/images/Flag/flag001.png" class="img-fluid rounded-circle" alt="user" style="height: 30px; min-width: 30px; width: 30px;">
<span class="bg-primary"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="dropdownMenuButton2">
<div class="card shadow-none m-0 border-0">
<div class=" p-0 ">
<ul class="list-group list-group-flush">
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-03.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>Spanish</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-04.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>Italian</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-02.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>French</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-05.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>German</a></li>
<li class="iq-sub-card list-group-item"><a class="p-0" href="#"><img src="../assets/images/Flag/flag-06.png" alt="img-flaf" class="img-fluid me-2" style="width: 15px;height: 15px;min-width: 15px;"/>Japanese</a></li>
</ul>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link" id="notification-drop" data-bs-toggle="dropdown" >
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.7695 11.6453C19.039 10.7923 18.7071 10.0531 18.7071 8.79716V8.37013C18.7071 6.73354 18.3304 5.67907 17.5115 4.62459C16.2493 2.98699 14.1244 2 12.0442 2H11.9558C9.91935 2 7.86106 2.94167 6.577 4.5128C5.71333 5.58842 5.29293 6.68822 5.29293 8.37013V8.79716C5.29293 10.0531 4.98284 10.7923 4.23049 11.6453C3.67691 12.2738 3.5 13.0815 3.5 13.9557C3.5 14.8309 3.78723 15.6598 4.36367 16.3336C5.11602 17.1413 6.17846 17.6569 7.26375 17.7466C8.83505 17.9258 10.4063 17.9933 12.0005 17.9933C13.5937 17.9933 15.165 17.8805 16.7372 17.7466C17.8215 17.6569 18.884 17.1413 19.6363 16.3336C20.2118 15.6598 20.5 14.8309 20.5 13.9557C20.5 13.0815 20.3231 12.2738 19.7695 11.6453Z" fill="currentColor"></path>
<path opacity="0.4" d="M14.0088 19.2283C13.5088 19.1215 10.4627 19.1215 9.96275 19.2283C9.53539 19.327 9.07324 19.5566 9.07324 20.0602C9.09809 20.5406 9.37935 20.9646 9.76895 21.2335L9.76795 21.2345C10.2718 21.6273 10.8632 21.877 11.4824 21.9667C11.8123 22.012 12.1482 22.01 12.4901 21.9667C13.1083 21.877 13.6997 21.6273 14.2036 21.2345L14.2026 21.2335C14.5922 20.9646 14.8734 20.5406 14.8983 20.0602C14.8983 19.5566 14.4361 19.327 14.0088 19.2283Z" fill="currentColor"></path>
</svg>
<span class="bg-danger dots"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="notification-drop">
<div class="card shadow-none m-0">
<div class="card-header d-flex justify-content-between bg-primary py-3">
<div class="header-title">
<h5 class="mb-0 text-white">All Notifications</h5>
</div>
</div>
<div class="card-body p-0">
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/01.png" alt="">
<div class="ms-3 w-100">
<h6 class="mb-0 ">Emma Watson Bni</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">95 MB</p>
<small class="float-right font-size-12">Just Now</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/02.png" alt="">
</div>
<div class="ms-3 w-100">
<h6 class="mb-0 ">New customer is join</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-right font-size-12">5 days ago</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/03.png" alt="">
<div class="ms-3 w-100">
<h6 class="mb-0 ">Two customer is left</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-right font-size-12">2 days ago</small>
</div>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/04.png" alt="">
<div class="w-100 ms-3">
<h6 class="mb-0 ">New Mail from Fenny</h6>
<div class="d-flex justify-content-between align-items-center">
<p class="mb-0">Cyst Bni</p>
<small class="float-right font-size-12">3 days ago</small>
</div>
</div>
</div>
</a>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link" id="mail-drop" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.4" d="M22 15.94C22 18.73 19.76 20.99 16.97 21H16.96H7.05C4.27 21 2 18.75 2 15.96V15.95C2 15.95 2.006 11.524 2.014 9.298C2.015 8.88 2.495 8.646 2.822 8.906C5.198 10.791 9.447 14.228 9.5 14.273C10.21 14.842 11.11 15.163 12.03 15.163C12.95 15.163 13.85 14.842 14.56 14.262C14.613 14.227 18.767 10.893 21.179 8.977C21.507 8.716 21.989 8.95 21.99 9.367C22 11.576 22 15.94 22 15.94Z" fill="currentColor"></path>
<path d="M21.4759 5.67351C20.6099 4.04151 18.9059 2.99951 17.0299 2.99951H7.04988C5.17388 2.99951 3.46988 4.04151 2.60388 5.67351C2.40988 6.03851 2.50188 6.49351 2.82488 6.75151L10.2499 12.6905C10.7699 13.1105 11.3999 13.3195 12.0299 13.3195C12.0339 13.3195 12.0369 13.3195 12.0399 13.3195C12.0429 13.3195 12.0469 13.3195 12.0499 13.3195C12.6799 13.3195 13.3099 13.1105 13.8299 12.6905L21.2549 6.75151C21.5779 6.49351 21.6699 6.03851 21.4759 5.67351Z" fill="currentColor"></path>
</svg>
<span class="bg-primary count-mail"></span>
</a>
<div class="sub-drop dropdown-menu dropdown-menu-end p-0" aria-labelledby="mail-drop">
<div class="card shadow-none m-0">
<div class="card-header d-flex justify-content-between bg-primary py-3">
<div class="header-title">
<h5 class="mb-0 text-white">All Message</h5>
</div>
</div>
<div class="card-body p-0 ">
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/01.png" alt="">
</div>
<div class=" w-100 ms-3">
<h6 class="mb-0 ">Bni Emma Watson</h6>
<small class="float-left font-size-12">13 Jun</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/02.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Lorem Ipsum Watson</h6>
<small class="float-left font-size-12">20 Apr</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/03.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Why do we use it?</h6>
<small class="float-left font-size-12">30 Jun</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/04.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Variations Passages</h6>
<small class="float-left font-size-12">12 Sep</small>
</div>
</div>
</a>
<a href="#" class="iq-sub-card">
<div class="d-flex align-items-center">
<div class="">
<img class="avatar-40 rounded-pill bg-soft-primary p-1" src="../assets/images/shapes/05.png" alt="">
</div>
<div class="ms-3">
<h6 class="mb-0 ">Lorem Ipsum generators</h6>
<small class="float-left font-size-12">5 Dec</small>
</div>
</div>
</a>
</div>
</div>
</div>
</li>
<li class="nav-item dropdown">
<a class="nav-link py-0 d-flex align-items-center" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<img src="../assets/images/avatars/01.png" alt="User-Profile" class="theme-color-default-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_1.png" alt="User-Profile" class="theme-color-purple-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_2.png" alt="User-Profile" class="theme-color-blue-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_4.png" alt="User-Profile" class="theme-color-green-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_5.png" alt="User-Profile" class="theme-color-yellow-img img-fluid avatar avatar-50 avatar-rounded">
<img src="../assets/images/avatars/avtar_3.png" alt="User-Profile" class="theme-color-pink-img img-fluid avatar avatar-50 avatar-rounded">
<div class="caption ms-3 ">
<h6 class="mb-0 caption-title">Austin Robertson</h6>
<p class="mb-0 caption-sub-title">Marketing Administrator</p>
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="../dashboard/app/user-profile.html">Profile</a></li>
<li><a class="dropdown-item" href="../dashboard/app/user-privacy-setting.html">Privacy Setting</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="../dashboard/auth/sign-in.html">Logout</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav> <!--Nav End-->
<div class="conatiner-fluid content-inner pb-0">
<div class="row">
<div class="col-md-12 col-lg-12">
<div class="row row-cols-1">
<div class="d-slider1 overflow-hidden ">
<ul class="swiper-wrapper list-inline m-0 p-0 mb-2">
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-01" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="90" data-type="percent">
<svg class="card-slie-arrow " width="24" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Sales</p>
<h4 class="counter">$560K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-02" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="80" data-type="percent">
<svg class="card-slie-arrow " width="24" height="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Profit</p>
<h4 class="counter">$185K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-03" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="70" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Total Cost</p>
<h4 class="counter">$375K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-04" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="60" data-type="percent">
<svg class="card-slie-arrow " width="24px" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Revenue</p>
<h4 class="counter">$742K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-05" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="50" data-type="percent">
<svg class="card-slie-arrow " width="24px" height="24px" viewBox="0 0 24 24">
<path fill="currentColor" d="M5,17.59L15.59,7H9V5H19V15H17V8.41L6.41,19L5,17.59Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Net Income</p>
<h4 class="counter">$150K</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-06" class="circle-progress-01 circle-progress circle-progress-info text-center" data-min-value="0" data-max-value="100" data-value="40" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Today</p>
<h4 class="counter">$4600</h4>
</div>
</div>
</div>
</li>
<li class="swiper-slide card card-slide">
<div class="card-body">
<div class="progress-widget">
<div id="circle-progress-07" class="circle-progress-01 circle-progress circle-progress-primary text-center" data-min-value="0" data-max-value="100" data-value="30" data-type="percent">
<svg class="card-slie-arrow " width="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M19,6.41L17.59,5L7,15.59V9H5V19H15V17H8.41L19,6.41Z" />
</svg>
</div>
<div class="progress-detail">
<p class="mb-2">Members</p>
<h4 class="counter">11.2M</h4>
</div>
</div>
</div>
</li>
</ul>
<div class="swiper-button swiper-button-next"></div>
<div class="swiper-button swiper-button-prev"></div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-8">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">$855.8K</h4>
<p class="mb-0">Gross Sales</p>
</div>
<div class="d-flex align-items-center align-self-center">
<div class="d-flex align-items-center text-primary">
<svg xmlns="http://www.w3.org/2000/svg" width="12" viewBox="0 0 24 24" fill="currentColor">
<g>
<circle cx="12" cy="12" r="8" fill="currentColor"></circle>
</g>
</svg>
<div class="ms-2">
<span class="text-secondary">Sales</span>
</div>
</div>
<div class="d-flex align-items-center ms-3 text-info">
<svg xmlns="http://www.w3.org/2000/svg" width="12" viewBox="0 0 24 24" fill="currentColor">
<g>
<circle cx="12" cy="12" r="8" fill="currentColor"></circle>
</g>
</svg>
<div class="ms-2">
<span class="text-secondary">Cost</span>
</div>
</div>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton22" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton22">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div id="d-main" class="d-main"></div>
</div>
</div>
</div>
<div class="col-md-12 col-xl-6">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">Earnings</h4>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton1">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div class="d-flex flex-wrap align-items-center justify-content-between">
<div id="myChart" class="col-md-8 col-lg-8 myChart"></div>
<div class="d-grid gap col-md-4 col-lg-4">
<div class="d-flex align-items-start">
<svg class="mt-2" xmlns="http://www.w3.org/2000/svg" width="14" viewBox="0 0 24 24" fill="#3a57e8">
<g>
<circle cx="12" cy="12" r="8" fill="#3a57e8"></circle>
</g>
</svg>
<div class="ms-3">
<span class="text-secondary">Fashion</span>
<h6>251K</h6>
</div>
</div>
<div class="d-flex align-items-start">
<svg class="mt-2" xmlns="http://www.w3.org/2000/svg" width="14" viewBox="0 0 24 24" fill="#4bc7d2">
<g>
<circle cx="12" cy="12" r="8" fill="#4bc7d2"></circle>
</g>
</svg>
<div class="ms-3">
<span class="text-secondary">Accessories</span>
<h6>176K</h6>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-xl-6">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title">Conversions</h4>
</div>
<div class="dropdown">
<a href="#" class="text-secondary dropdown-toggle" id="dropdownMenuButton3" data-bs-toggle="dropdown" aria-expanded="false">
This Week
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton3">
<li><a class="dropdown-item" href="#">This Week</a></li>
<li><a class="dropdown-item" href="#">This Month</a></li>
<li><a class="dropdown-item" href="#">This Year</a></li>
</ul>
</div>
</div>
<div class="card-body">
<div id="d-activity" class="d-activity"></div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12">
<div class="card overflow-hidden">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title mb-2">Enterprise Clients</h4>
<p class="mb-0">
<svg class ="me-2" width="24" height="24" viewBox="0 0 24 24">
<path fill="#3a57e8" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" />
</svg>
15 new acquired this month
</p>
</div>
<div class="dropdown">
<span class="dropdown-toggle" id="dropdownMenuButton7" data-bs-toggle="dropdown" aria-expanded="false" role="button">
</span>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuButton7">
<a class="dropdown-item " href="javascript:void(0);">Action</a>
<a class="dropdown-item " href="javascript:void(0);">Another action</a>
<a class="dropdown-item " href="javascript:void(0);">Something else here</a>
</div>
</div>
</div>
<div class="card-body p-0">
<div class="table-responsive mt-4">
<table id="basic-table" class="table table-striped mb-0" role="grid">
<thead>
<tr>
<th>COMPANIES</th>
<th>CONTACTS</th>
<th>ORDER</th>
<th>COMPLETION</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/01.png" alt="profile">
<h6>Addidis Sportwear</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
</div>
</td>
<td>$14,000</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>60%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/05.png" alt="profile">
<h6>Netflixer Platforms</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
</div>
</td>
<td>$30,000</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>25%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/02.png" alt="profile">
<h6>Shopifi Stores</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">TP</div>
</a>
</div>
</td>
<td>$8,500</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>100%</h6>
</div>
<div class="progress bg-soft-success shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-success" data-toggle="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/03.png" alt="profile">
<h6>Bootstrap Technologies</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">SP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">PP</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">TP</div>
</a>
</div>
</td>
<td>$20,500</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>100%</h6>
</div>
<div class="progress bg-soft-success shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-success" data-toggle="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<img class="bg-soft-primary rounded img-fluid avatar-40 me-3" src="../assets/images/shapes/04.png" alt="profile">
<h6>Community First</h6>
</div>
</td>
<td>
<div class="iq-media-group iq-media-group-1">
<a href="#" class="iq-media-1">
<div class="icon iq-icon-box-3 rounded-pill">MM</div>
</a>
</div>
</td>
<td>$9,800</td>
<td>
<div class="d-flex align-items-center mb-2">
<h6>75%</h6>
</div>
<div class="progress bg-soft-primary shadow-none w-100" style="height: 4px">
<div class="progress-bar bg-primary" data-toggle="progress-bar" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-4">
<div class="row">
<div class="col-md-12 col-lg-12">
<div class="card credit-card-widget">
<div class="card-header pb-4 border-0">
<div class="p-4 primary-gradient-card rounded border border-white">
<div class="d-flex justify-content-between align-items-center">
<div>
<h5 class="font-weight-bold">VISA </h5>
<P class="mb-0">PREMIUM ACCOUNT</P>
</div>
<div class="master-card-content">
<svg class="master-card-1" width="60" height="60" viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>
<svg class="master-card-2" width="60" height="60" viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>
</div>
</div>
<div class="my-4">
<div class="card-number">
<span class="fs-5 me-2">5789</span>
<span class="fs-5 me-2">****</span>
<span class="fs-5 me-2">****</span>
<span class="fs-5">2847</span>
</div>
</div>
<div class="d-flex align-items-center mb-2 justify-content-between">
<p class="mb-0">Card holder</p>
<p class="mb-0">Expire Date</p>
</div>
<div class="d-flex align-items-center justify-content-between">
<h6>Mike Smith</h6>
<h6 class="ms-5">06/11</h6>
</div>
</div>
</div>
<div class="card-body">
<div class="d-flex align-itmes-center flex-wrap mb-4">
<div class="d-flex align-itmes-center me-0 me-md-4">
<div>
<div class="p-3 mb-2 rounded bg-soft-primary">
<svg width="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.9303 7C16.9621 6.92913 16.977 6.85189 16.9739 6.77432H17C16.8882 4.10591 14.6849 2 12.0049 2C9.325 2 7.12172 4.10591 7.00989 6.77432C6.9967 6.84898 6.9967 6.92535 7.00989 7H6.93171C5.65022 7 4.28034 7.84597 3.88264 10.1201L3.1049 16.3147C2.46858 20.8629 4.81062 22 7.86853 22H16.1585C19.2075 22 21.4789 20.3535 20.9133 16.3147L20.1444 10.1201C19.676 7.90964 18.3503 7 17.0865 7H16.9303ZM15.4932 7C15.4654 6.92794 15.4506 6.85153 15.4497 6.77432C15.4497 4.85682 13.8899 3.30238 11.9657 3.30238C10.0416 3.30238 8.48184 4.85682 8.48184 6.77432C8.49502 6.84898 8.49502 6.92535 8.48184 7H15.4932ZM9.097 12.1486C8.60889 12.1486 8.21321 11.7413 8.21321 11.2389C8.21321 10.7366 8.60889 10.3293 9.097 10.3293C9.5851 10.3293 9.98079 10.7366 9.98079 11.2389C9.98079 11.7413 9.5851 12.1486 9.097 12.1486ZM14.002 11.2389C14.002 11.7413 14.3977 12.1486 14.8858 12.1486C15.3739 12.1486 15.7696 11.7413 15.7696 11.2389C15.7696 10.7366 15.3739 10.3293 14.8858 10.3293C14.3977 10.3293 14.002 10.7366 14.002 11.2389Z" fill="currentColor"></path>
</svg>
</div>
</div>
<div class="ms-3">
<h5>1153</h5>
<small class="mb-0">Products</small>
</div>
</div>
<div class="d-flex align-itmes-center">
<div>
<div class="p-3 mb-2 rounded bg-soft-info creadit-card-menu">
<svg width="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.1213 11.2331H16.8891C17.3088 11.2331 17.6386 10.8861 17.6386 10.4677C17.6386 10.0391 17.3088 9.70236 16.8891 9.70236H14.1213C13.7016 9.70236 13.3719 10.0391 13.3719 10.4677C13.3719 10.8861 13.7016 11.2331 14.1213 11.2331ZM20.1766 5.92749C20.7861 5.92749 21.1858 6.1418 21.5855 6.61123C21.9852 7.08067 22.0551 7.7542 21.9652 8.36549L21.0159 15.06C20.8361 16.3469 19.7569 17.2949 18.4879 17.2949H7.58639C6.25742 17.2949 5.15828 16.255 5.04837 14.908L4.12908 3.7834L2.62026 3.51807C2.22057 3.44664 1.94079 3.04864 2.01073 2.64043C2.08068 2.22305 2.47038 1.94649 2.88006 2.00874L5.2632 2.3751C5.60293 2.43735 5.85274 2.72207 5.88272 3.06905L6.07257 5.35499C6.10254 5.68257 6.36234 5.92749 6.68209 5.92749H20.1766ZM7.42631 18.9079C6.58697 18.9079 5.9075 19.6018 5.9075 20.459C5.9075 21.3061 6.58697 22 7.42631 22C8.25567 22 8.93514 21.3061 8.93514 20.459C8.93514 19.6018 8.25567 18.9079 7.42631 18.9079ZM18.6676 18.9079C17.8282 18.9079 17.1487 19.6018 17.1487 20.459C17.1487 21.3061 17.8282 22 18.6676 22C19.4969 22 20.1764 21.3061 20.1764 20.459C20.1764 19.6018 19.4969 18.9079 18.6676 18.9079Z" fill="currentColor"></path>
</svg>
</div>
</div>
<div class="ms-3">
<h5>81K</h5>
<small class="mb-0">Order Served</small>
</div>
</div>
</div>
<div class="mb-4">
<div class="d-flex justify-content-between flex-wrap">
<h2 class="mb-2">$405,012,300</h2>
<div>
<span class="badge bg-success rounded-pill">YoY 24%</span>
</div>
</div>
<p class="text-info">Life time sales</p>
</div>
<div class="d-grid grid-cols-2 gap">
<button class="btn btn-primary text-uppercase">SUMMARY</button>
<button class="btn btn-info text-uppercase">ANALYTICS</button>
</div>
</div>
</div>
<div class="card">
<div class="card-body d-flex justify-content-around text-center">
<div>
<h2 class="mb-2">750<small>K</small></h2>
<p class="mb-0 text-secondary">Website Visitors</p>
</div>
<hr class="hr-vertial">
<div>
<h2 class="mb-2">7,500</h2>
<p class="mb-0 text-secondary">New Customers</p>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-lg-12">
<div class="card">
<div class="card-header d-flex justify-content-between flex-wrap">
<div class="header-title">
<h4 class="card-title mb-2">Activity overview</h4>
<p class="mb-0">
<svg class ="me-2" width="24" height="24" viewBox="0 0 24 24">
<path fill="#17904b" d="M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z" />
</svg>
16% this month
</p>
</div>
</div>
<div class="card-body">
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">$2400, Purchase</h6>
<span class="mb-0">11 JUL 8:10 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">New order #8744152</h6>
<span class="mb-0">11 JUL 11 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">Affiliate Payout</h6>
<span class="mb-0">11 JUL 7:64 PM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-2">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">New user added</h6>
<span class="mb-0">11 JUL 1:21 AM</span>
</div>
</div>
<div class=" d-flex profile-media align-items-top mb-1">
<div class="profile-dots-pills border-primary mt-1"></div>
<div class="ms-4">
<h6 class=" mb-1">Product added</h6>
<span class="mb-0">11 JUL 4:50 AM</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="btn-download">
<a class="btn btn-danger px-3 py-2" href="https://iqonic.design/product/admin-templates/hope-ui-admin-free-open-source-bootstrap-admin-template/" target="_blank" >
<svg width="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.4" fill-rule="evenodd" clip-rule="evenodd" d="M5.91064 20.5886C5.91064 19.7486 6.59064 19.0686 7.43064 19.0686C8.26064 19.0686 8.94064 19.7486 8.94064 20.5886C8.94064 21.4186 8.26064 22.0986 7.43064 22.0986C6.59064 22.0986 5.91064 21.4186 5.91064 20.5886ZM17.1606 20.5886C17.1606 19.7486 17.8406 19.0686 18.6806 19.0686C19.5106 19.0686 20.1906 19.7486 20.1906 20.5886C20.1906 21.4186 19.5106 22.0986 18.6806 22.0986C17.8406 22.0986 17.1606 21.4186 17.1606 20.5886Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1907 6.34909C20.8007 6.34909 21.2007 6.55909 21.6007 7.01909C22.0007 7.47909 22.0707 8.13909 21.9807 8.73809L21.0307 15.2981C20.8507 16.5591 19.7707 17.4881 18.5007 17.4881H7.59074C6.26074 17.4881 5.16074 16.4681 5.05074 15.1491L4.13074 4.24809L2.62074 3.98809C2.22074 3.91809 1.94074 3.52809 2.01074 3.12809C2.08074 2.71809 2.47074 2.44809 2.88074 2.50809L5.26574 2.86809C5.60574 2.92909 5.85574 3.20809 5.88574 3.54809L6.07574 5.78809C6.10574 6.10909 6.36574 6.34909 6.68574 6.34909H20.1907ZM14.1307 11.5481H16.9007C17.3207 11.5481 17.6507 11.2081 17.6507 10.7981C17.6507 10.3781 17.3207 10.0481 16.9007 10.0481H14.1307C13.7107 10.0481 13.3807 10.3781 13.3807 10.7981C13.3807 11.2081 13.7107 11.5481 14.1307 11.5481Z" fill="currentColor"></path>
</svg>
</a>
</div>
<!-- Footer Section Start -->
<footer class="footer">
<div class="footer-body">
<ul class="left-panel list-inline mb-0 p-0">
<li class="list-inline-item"><a href="../dashboard/extra/privacy-policy.html">Privacy Policy</a></li>
<li class="list-inline-item"><a href="../dashboard/extra/terms-of-service.html">Terms of Use</a></li>
</ul>
<div class="right-panel">
©<script>document.write(new Date().getFullYear())</script> Mercury Cloud, Made with
<span class="text-gray">
<svg width="15" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.85 2.50065C16.481 2.50065 17.111 2.58965 17.71 2.79065C21.401 3.99065 22.731 8.04065 21.62 11.5806C20.99 13.3896 19.96 15.0406 18.611 16.3896C16.68 18.2596 14.561 19.9196 12.28 21.3496L12.03 21.5006L11.77 21.3396C9.48102 19.9196 7.35002 18.2596 5.40102 16.3796C4.06102 15.0306 3.03002 13.3896 2.39002 11.5806C1.26002 8.04065 2.59002 3.99065 6.32102 2.76965C6.61102 2.66965 6.91002 2.59965 7.21002 2.56065H7.33002C7.61102 2.51965 7.89002 2.50065 8.17002 2.50065H8.28002C8.91002 2.51965 9.52002 2.62965 10.111 2.83065H10.17C10.21 2.84965 10.24 2.87065 10.26 2.88965C10.481 2.96065 10.69 3.04065 10.89 3.15065L11.27 3.32065C11.3618 3.36962 11.4649 3.44445 11.554 3.50912C11.6104 3.55009 11.6612 3.58699 11.7 3.61065C11.7163 3.62028 11.7329 3.62996 11.7496 3.63972C11.8354 3.68977 11.9247 3.74191 12 3.79965C13.111 2.95065 14.46 2.49065 15.85 2.50065ZM18.51 9.70065C18.92 9.68965 19.27 9.36065 19.3 8.93965V8.82065C19.33 7.41965 18.481 6.15065 17.19 5.66065C16.78 5.51965 16.33 5.74065 16.18 6.16065C16.04 6.58065 16.26 7.04065 16.68 7.18965C17.321 7.42965 17.75 8.06065 17.75 8.75965V8.79065C17.731 9.01965 17.8 9.24065 17.94 9.41065C18.08 9.58065 18.29 9.67965 18.51 9.70065Z" fill="currentColor"></path>
</svg>
</span> by <a href="https://iqonic.design/">IQONIC Design</a>.
</div>
</div>
</footer>
<!-- Footer Section End --> </main>
<!-- Wrapper End-->
<!-- Library Bundle Script -->
<script src="../assets/js/core/libs.min.js"></script>
<!-- External Library Bundle Script -->
<script src="../assets/js/core/external.min.js"></script>
<!-- Widgetchart Script -->
<script src="../assets/js/charts/widgetcharts.js"></script>
<!-- mapchart Script -->
<script src="../assets/js/charts/vectore-chart.js"></script>
<script src="../assets/js/charts/dashboard.js" ></script>
<!-- fslightbox Script -->
<script src="../assets/js/plugins/fslightbox.js"></script>
<!-- Settings Script -->
<script src="../assets/js/plugins/setting.js"></script>
<!-- Slider-tab Script -->
<script src="../assets/js/plugins/slider-tabs.js"></script>
<!-- Form Wizard Script -->
<script src="../assets/js/plugins/form-wizard.js"></script>
<!-- AOS Animation Plugin-->
<!-- App Script -->
<script src="../assets/js/main-lib.js" defer></script>
</body>
</html>

View File

@@ -1 +0,0 @@
<h1>Le panel est actuellement en maintenance !</h1>

View File

@@ -1,3 +1,3 @@
<!-- <body onload="window.location.replace('https://dash.mercurycloud.fr/dashboard/')">-->
<h1>Le panel est actuellement en maintenance !</h1>
<h1>La configuration de votre serveur web est mauvaise !</h1>
<h2>Vous devez changer la configuration de votre serveur web pour qu'il pointe sur le dossier public/</h2>
<h2>Si vous ne le faites pas votre fichier de configuration et toutes l'api est accessible !</h2>

View File

@@ -72,8 +72,7 @@
}
::-webkit-scrollbar-track {
box-shadow: inset 0 0 1px grey;
border-radius: 6px;
background-color: #151827;
}
::-webkit-scrollbar-thumb {
@@ -15817,22 +15816,22 @@ fieldset:disabled .btn {
.btn-primary {
color: #fff;
background-color: #3a57e8;
border-color: #3a57e8;
background-color: #0052C1;
border-color: #0052C1;
-webkit-box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0);
box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0);
}
.btn-primary:hover {
color: #fff;
background-color: #314ac5;
border-color: #2e46ba;
background-color: #0052C1;
border-color: #0052C1;
}
.btn-check:focus+.btn-primary,
.btn-primary:focus {
color: #fff;
background-color: #314ac5;
background-color: #0052C1;
border-color: #2e46ba;
-webkit-box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0), 0 0 0 0rem rgba(88, 112, 235, 0.5);
box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0), 0 0 0 0rem rgba(88, 112, 235, 0.5);
@@ -28779,4 +28778,68 @@ input.disabled {
background: #ff4754;
transition: width 0.4s ease;
}
ion-icon {
font-size: 26px;
position: center;
display: grid;
}
#refresh-button {
background-color: #366AF0;
border-color: #366AF0;
}
#refresh-button:hover {
background-color: #284DAD;
border-color: #284DAD;
}
#refresh-ion-icon {
color: white;
}
.form-popup {
display: none;
position: fixed;
left: 37.5%;
top: -13%;
width: 30%;
min-width: 210px;
max-width: 502px;
transform: translate(50%, 50%);
z-index: 2000;
}
#popupBtn {
width: 100%;
}
#popupCard {
background-color: #151827;
}
#popupTitle {
background-color: #151827;
}
.upgrades-list {
max-height: 250px;
overflow: auto;
width: 255.27px;
}
.upgrades-checkbox {
padding-right: 10px;
padding-left: 10px;
}
.add-upgrades-btn {
padding-top: 5px;
}
.stop-scrolling {
height: 100%;
overflow: hidden;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 428 B

After

Width:  |  Height:  |  Size: 428 B

View File

Before

Width:  |  Height:  |  Size: 270 B

After

Width:  |  Height:  |  Size: 270 B

View File

Before

Width:  |  Height:  |  Size: 471 B

After

Width:  |  Height:  |  Size: 471 B

View File

Before

Width:  |  Height:  |  Size: 500 B

After

Width:  |  Height:  |  Size: 500 B

View File

Before

Width:  |  Height:  |  Size: 209 B

After

Width:  |  Height:  |  Size: 209 B

View File

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 249 B

View File

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

Before

Width:  |  Height:  |  Size: 733 KiB

After

Width:  |  Height:  |  Size: 733 KiB

View File

Before

Width:  |  Height:  |  Size: 1000 KiB

After

Width:  |  Height:  |  Size: 1000 KiB

View File

Before

Width:  |  Height:  |  Size: 992 KiB

After

Width:  |  Height:  |  Size: 992 KiB

View File

Before

Width:  |  Height:  |  Size: 1018 KiB

After

Width:  |  Height:  |  Size: 1018 KiB

View File

Before

Width:  |  Height:  |  Size: 743 KiB

After

Width:  |  Height:  |  Size: 743 KiB

View File

Before

Width:  |  Height:  |  Size: 673 KiB

After

Width:  |  Height:  |  Size: 673 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 MiB

After

Width:  |  Height:  |  Size: 2.4 MiB

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

Before

Width:  |  Height:  |  Size: 127 KiB

After

Width:  |  Height:  |  Size: 127 KiB

View File

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 128 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 367 B

After

Width:  |  Height:  |  Size: 367 B

View File

Before

Width:  |  Height:  |  Size: 511 B

After

Width:  |  Height:  |  Size: 511 B

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 622 B

After

Width:  |  Height:  |  Size: 622 B

View File

Before

Width:  |  Height:  |  Size: 658 B

After

Width:  |  Height:  |  Size: 658 B

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

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