Création ''sale'' des pages des 2 niveaux d'authentification 'warehouse' et 'admin'
This commit is contained in:
parent
493325537c
commit
5e31cfbc47
|
@ -42,7 +42,7 @@
|
|||
// box-shadow: 0 0 1px #b7b7b7;
|
||||
|
||||
background: #fff url('/f/svg/search/st/sub-menu-side/b1b1b1') .5em center no-repeat;
|
||||
background-size: 1em;
|
||||
background-size: 1em;
|
||||
|
||||
transition: border .4s ease-in-out;
|
||||
|
||||
|
@ -122,7 +122,7 @@
|
|||
margin: 1em;
|
||||
color: #333;
|
||||
white-space: nowrap;
|
||||
|
||||
|
||||
// svg (icone)
|
||||
svg{
|
||||
display: inline-block;
|
||||
|
@ -137,7 +137,7 @@
|
|||
|
||||
path{
|
||||
fill: #333 !important;
|
||||
|
||||
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
@ -152,7 +152,7 @@
|
|||
margin: 1em;
|
||||
color: #333;
|
||||
white-space: nowrap;
|
||||
|
||||
|
||||
// svg (icone)
|
||||
svg{
|
||||
display: inline-block;
|
||||
|
@ -255,7 +255,7 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* [3] Formulaires
|
||||
|
@ -274,7 +274,7 @@
|
|||
background-color: #fff;
|
||||
|
||||
transform: translateX(-50%);
|
||||
|
||||
|
||||
|
||||
|
||||
&.valid{
|
||||
|
@ -404,7 +404,7 @@
|
|||
|
||||
// Boutons valides
|
||||
button.valid,
|
||||
&.valid > button{
|
||||
&.valid > button{
|
||||
border-color: $form-valid-color;
|
||||
|
||||
background-color: $form-valid-color;
|
||||
|
@ -419,7 +419,7 @@
|
|||
|
||||
// Boutons neutres
|
||||
button.neutral,
|
||||
&.neutral > button{
|
||||
&.neutral > button{
|
||||
border-color: $form-neutral-color;
|
||||
|
||||
background-color: $form-neutral-color;
|
||||
|
@ -434,7 +434,7 @@
|
|||
|
||||
// Boutons recherche
|
||||
button.search,
|
||||
&.search > button{
|
||||
&.search > button{
|
||||
border-color: $form-search-color;
|
||||
|
||||
background-color: $form-search-color;
|
||||
|
@ -492,7 +492,7 @@
|
|||
top: 50%;
|
||||
left: 50%;
|
||||
padding: 0 1em;
|
||||
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
color: $form-invalid-color;
|
||||
|
@ -533,4 +533,4 @@
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
71
index.php
71
index.php
|
@ -23,27 +23,16 @@
|
|||
|
||||
|
||||
|
||||
/* [3] Gestion des authentifications et des droits
|
||||
/* [1] Gestion des authentifications et des droits
|
||||
=========================================================*/
|
||||
\manager\Authentification::check();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* [1] Gestion de l'authentification
|
||||
=========================================================*/
|
||||
|
||||
|
||||
|
||||
|
||||
/* (1) On met à jour l'authentification et les permissions */
|
||||
Authentification::check();
|
||||
$auth = Authentification::auth();
|
||||
|
||||
/* (2) On définit la page d'accueil */
|
||||
if( $auth == 2 ) $root_page = 'dashboard'; // Connecté -> Accès
|
||||
elseif( $auth == 1 ) $root_page = 'admin'; // Pas identifié -> Identification
|
||||
else $root_page = 'warehouse'; // Pas localisé -> Localisation
|
||||
|
||||
|
||||
|
||||
|
@ -56,29 +45,33 @@
|
|||
---------------------------------------------------------*/
|
||||
$R = new Router( $_GET['url'] );
|
||||
|
||||
/* (2) Dispatcher */
|
||||
$R->get('f(?:/([\w-]+))*/?', function(){ new ResourceDispatcher($_GET['url'], true); });
|
||||
|
||||
/* (2) On cree les regles de routage
|
||||
|
||||
/* (3) On cree les regles de routage QUAND ON EST CONNECTE
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Racine -> page d'accueil */
|
||||
$R->get('/?', function(){ header('Location: /dashboard/'); });
|
||||
|
||||
/* (2) Liste des pages du site */
|
||||
$page_list = [
|
||||
'dashboard',
|
||||
'profile',
|
||||
'machines',
|
||||
'users',
|
||||
'groups',
|
||||
'analytics',
|
||||
'settings'
|
||||
];
|
||||
|
||||
// nomPage/arg1/arg2 -> inclusion de la page
|
||||
$R->get('(?:'.implode('|', $page_list).')(?:/[\w-]+)*/?', function(){ include __ROOT__.'/view.php'; });
|
||||
$R->get('/?', function(){ header("Location: /$root_page/"); });
|
||||
|
||||
|
||||
/* (2) Si on est connecté */
|
||||
if( $auth == 2 ){
|
||||
|
||||
// Liste des pages du site
|
||||
$page_list = [ 'dashboard', 'profile', 'machines', 'users', 'groups', 'analytics', 'settings' ];
|
||||
|
||||
// nomPage/arg1/arg2 -> inclusion de la page
|
||||
$R->get('(?:'.implode('|', $page_list).')(?:/[\w-]+)*/?', function(){ include __ROOT__.'/view/view.php'; });
|
||||
|
||||
|
||||
/* (3) Si on est pas identifié */
|
||||
}else if( $auth == 1 )
|
||||
$R->get('.+', function(){ include __ROOT__.'/view/admin.php'; });
|
||||
else
|
||||
$R->get('.+', function(){ include __ROOT__.'/view/warehouse.php'; });
|
||||
|
||||
|
||||
/* (3) Dispatcher */
|
||||
$R->get('f(?:/([\w-]+))*/?', function(){ new ResourceDispatcher($_GET['url'], true); });
|
||||
|
||||
|
||||
/* (4) api/module/method -> Api */
|
||||
|
@ -93,8 +86,8 @@
|
|||
|
||||
|
||||
/* (5) N'importe -> page d'accueil */
|
||||
$R->get('.+', function(){ header('Location: /dashboard/'); });
|
||||
$R->post('.+', function(){ header('Location: /dashboard/'); });
|
||||
$R->get('.+', function(){ header("Location: /$root_page/"); });
|
||||
$R->post('.+', function(){ header("Location: /$root_page/"); });
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -21,6 +21,12 @@
|
|||
public static function warehouse($params){
|
||||
extract($params);
|
||||
|
||||
|
||||
/* [0] Par défaut, on déconnecte
|
||||
=========================================================*/
|
||||
$_SESSION['AUTH'] = [];
|
||||
|
||||
|
||||
/* [1] On recherche un entrepot avec ce nom
|
||||
=========================================================*/
|
||||
$getName = new Repo('warehouse/getByName', [$name]);
|
||||
|
@ -67,6 +73,12 @@
|
|||
public static function admin($params){
|
||||
extract($params);
|
||||
|
||||
|
||||
/* [0] Par défaut, on déconnecte l'administrateur
|
||||
=========================================================*/
|
||||
$_SESSION['AUTH'][1] = '';
|
||||
|
||||
|
||||
/* [1] On recherche un entrepot avec ce nom
|
||||
=========================================================*/
|
||||
$getUsername = new Repo('admin/getByUsername', [$username]);
|
||||
|
|
|
@ -11,8 +11,21 @@
|
|||
/*************************/
|
||||
/* SECURE SHA1 ALGORITHM */
|
||||
/*************************/
|
||||
public static function secure_hash($data){
|
||||
return hash('sha256', '">\[..|{@#))'.hash('sha256', $data.'_)Q@#((%*_$%(@#') );
|
||||
public static function secure_hash($data, $depth=1){
|
||||
/* [1] On hash @depth fois
|
||||
=========================================================*/
|
||||
$hash = $data;
|
||||
$c = 0;
|
||||
|
||||
for( $h = 0 ; $h < $depth ; $h++ ){
|
||||
$hash = hash('sha256', '">\[..|{@#))'.hash('sha256', $hash.'_)Q@#((%*_$%(@#') );
|
||||
$c++;
|
||||
}
|
||||
|
||||
|
||||
/* [2] On renvoie le résultat
|
||||
=========================================================*/
|
||||
return $hash;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -7,24 +7,10 @@
|
|||
|
||||
|
||||
$hash = 'password';
|
||||
$hashes = [];
|
||||
|
||||
var_dump( sessionManager::secure_hash($hash, 1000) );
|
||||
|
||||
|
||||
for( $i = 0 ; $i < 1000 ; $i++ ){
|
||||
$hash = sessionManager::secure_hash($hash);
|
||||
|
||||
if( isset($hashes[$hash]) )
|
||||
var_dump('already');
|
||||
|
||||
$hashes[$hash] = null;
|
||||
var_dump($hash);
|
||||
}
|
||||
|
||||
|
||||
|
||||
var_dump( count($hashes) );
|
||||
|
||||
|
||||
|
||||
?>
|
||||
|
|
|
@ -0,0 +1,168 @@
|
|||
<?php use \manager\ResourceDispatcher; ?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Authentification</title>
|
||||
|
||||
<!-- Informations de la page -->
|
||||
<meta name='Content-Type' content='text/html; charset=utf-8'>
|
||||
<meta charset='utf-8'>
|
||||
<meta name='author' content='Adrien MARQUÈS alias {xdrm};'>
|
||||
<meta name='desctiption' content="Système de gestion des véhicules pour STEF.">
|
||||
|
||||
<!-- Dépendences CSS -->
|
||||
<link type='text/css' rel='stylesheet' href='/f/css/reset/css' /> <!-- Reset du css natif des browsers -->
|
||||
|
||||
|
||||
<!-- Dépendences Javascript -->
|
||||
<script type='text/javascript' src='/f/js/input-checker/js/lib' ></script> <!-- Gestion dynamique des saisies -->
|
||||
<script type='text/javascript' src='/f/js/reset/js/lib' ></script> <!-- Corrections Javascript natif (ajouts) -->
|
||||
<script type='text/javascript' src='/f/js/api/js/lib' ></script> <!-- Gestion des transactions avec le serveur -->
|
||||
<script type='text/javascript' src='/f/js/page-manager/js/lib' ></script> <!-- Gestion des transactions avec le serveur -->
|
||||
|
||||
</head>
|
||||
<style type='text/css'>
|
||||
body{
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
background: #933024;
|
||||
|
||||
font-family: "Roboto";
|
||||
}
|
||||
|
||||
#FORM{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
width: 30em;
|
||||
min-height: 22em;
|
||||
|
||||
border-radius: 5px;
|
||||
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#FORM > input{
|
||||
width: calc( 80% - 2*2em );
|
||||
height: calc( 4em - 2*1em );
|
||||
padding: 1em 2em;
|
||||
|
||||
border-radius: 3px;
|
||||
border: 0;
|
||||
|
||||
background: #F1F2F4;
|
||||
|
||||
color: #444;
|
||||
font-family: "Open Sans";
|
||||
|
||||
box-shadow: inset -1px 1px 5px #ddd;
|
||||
}
|
||||
|
||||
#FORM > input[type='button']{
|
||||
width: 80%;
|
||||
height: 4em;
|
||||
|
||||
background: #00CD6A;
|
||||
color: #fff;
|
||||
|
||||
box-shadow: 0 2px 0 0 #00B65B;
|
||||
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#FORM > input[type='button']:hover{
|
||||
box-shadow: 0 3px 0 0 #00B65B;
|
||||
}
|
||||
|
||||
#FORM > #err-box{
|
||||
color: #F64247;
|
||||
}
|
||||
|
||||
</style>
|
||||
<body>
|
||||
|
||||
|
||||
|
||||
<!-- CORPS DE LA PAGE -->
|
||||
<div id='FORM'>
|
||||
<span>Authentification</span>
|
||||
<input type='text' placeholder='Identifiant' id='admin-name'>
|
||||
<input type='password' placeholder="Mot de passe" id='admin-password'>
|
||||
|
||||
<input type='button' value='AUTHENTIFICATION' id='admin-submit'>
|
||||
<span id='err-box'></span>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- Dépendences Javascript après chargement des éléments -->
|
||||
<script type='text/javascript'>
|
||||
var api = new APIClass('/api/');
|
||||
|
||||
/* [0] Récupération des éléments utiles du DOM
|
||||
=========================================================*/
|
||||
var aForm = document.getElementById('FORM');
|
||||
var aName = document.getElementById('admin-name');
|
||||
var aPassword = document.getElementById('admin-password');
|
||||
var aSubmit = document.getElementById('admin-submit');
|
||||
var errBox = document.getElementById('err-box');
|
||||
|
||||
|
||||
/* [1] Gestion de l'évènement
|
||||
=========================================================*/
|
||||
function handler(e){
|
||||
/* (1) Si clavier : si pas touche 'Enter', on ne fais rien */
|
||||
if( e instanceof KeyboardEvent && e.keyCode != 13 )
|
||||
return false;
|
||||
|
||||
/* (2) On effectue la requête pour voir si tout fonctionne bien */
|
||||
var request = {
|
||||
path: 'authentificationDefault/admin',
|
||||
username: aName.value,
|
||||
password: aPassword.value
|
||||
};
|
||||
|
||||
api.send(request, function(response){
|
||||
|
||||
// Si erreur de module
|
||||
if( response.ModuleError != 0 ){
|
||||
errBox.innerHTML = 'Erreur interne! Contactez le webmaster.';
|
||||
aPassword.value = '';
|
||||
return false;
|
||||
}
|
||||
|
||||
// Si identifiant/mot de passe incorrect
|
||||
if( !response.status ){
|
||||
errBox.innerHTML = 'Combinaison incorrecte.';
|
||||
aPassword.value = '';
|
||||
return false;
|
||||
|
||||
// Si correct, on recharge la page
|
||||
}else
|
||||
document.location = '';
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* [2] Lancement des 'listeners'
|
||||
=========================================================*/
|
||||
aSubmit.addEventListener('click', handler, false);
|
||||
aForm.addEventListener('keypress', handler, false);
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -16,7 +16,7 @@
|
|||
<link type='text/css' rel='stylesheet' href='/f/css/layout/css' /> <!-- Positionnement global des pages -->
|
||||
<link type='text/css' rel='stylesheet' href='/f/css/header/css' /> <!-- Gestion du header -->
|
||||
<link type='text/css' rel='stylesheet' href='/f/css/menu-side/css' /> <!-- Gestion du menu -->
|
||||
<link type='text/css' rel='stylesheet' href='/f/css/submenu-side/css'/> <!-- Gestion du sous-menu -->
|
||||
<link type='text/css' rel='stylesheet' href='/f/css/submenu-side/css'/> <!-- Gestion du sous-menu -->
|
||||
<link type='text/css' rel='stylesheet' href='/f/css/container/css' /> <!-- Gestion du container -->
|
||||
<link type='text/css' rel='stylesheet' href='/f/css/global/css' /> <!-- Style global -->
|
||||
|
||||
|
@ -34,7 +34,7 @@
|
|||
|
||||
<!-- CORPS DE LA PAGE -->
|
||||
<div id='WRAPPER'>
|
||||
|
||||
|
||||
<!-- HEADER DE LA PAGE -->
|
||||
<div id='HEADER'>
|
||||
<div class='icon'></div>
|
||||
|
@ -44,11 +44,11 @@
|
|||
<!-- MENU DE LA PAGE -->
|
||||
<nav id='MENU-SIDE'>
|
||||
<span data-link='profile' data-desc='Profil' class='mb' ><?php echo ResourceDispatcher::getResource('f/svg/profile/st/menu-side'); ?></span>
|
||||
|
||||
|
||||
|
||||
<span data-link='dashboard' data-desc='Tableau de bord' class='apart' ><?php echo ResourceDispatcher::getResource('f/svg/dashboard/st/menu-side/777777'); ?></span>
|
||||
<span data-link='machines' data-desc='Véhicules' ><?php echo ResourceDispatcher::getResource('f/svg/machines/st/menu-side/777777' ); ?></span>
|
||||
<span data-link='users' data-desc='Utilisateurs' ><?php echo ResourceDispatcher::getResource('f/svg/users/st/menu-side/777777' ); ?></span>
|
||||
<span data-link='users' data-desc='Utilisateurs' ><?php echo ResourceDispatcher::getResource('f/svg/users/st/menu-side/777777' ); ?></span>
|
||||
<span data-link='groups' data-desc='Gestion des groupes' ><?php echo ResourceDispatcher::getResource('f/svg/groups/st/menu-side/777777'); ?></span>
|
||||
<span data-link='analytics' data-desc='Statistiques et suivi' ><?php echo ResourceDispatcher::getResource('f/svg/analytics/st/menu-side/777777'); ?></span>
|
||||
|
||||
|
@ -60,11 +60,11 @@
|
|||
<div id='CONTAINER'></div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Dépendences Javascript après chargement des éléments -->
|
||||
<script type='text/javascript' src='/f/js/action-script/js'></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
|
@ -0,0 +1,168 @@
|
|||
<?php use \manager\ResourceDispatcher; ?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Connexion au Parc</title>
|
||||
|
||||
<!-- Informations de la page -->
|
||||
<meta name='Content-Type' content='text/html; charset=utf-8'>
|
||||
<meta charset='utf-8'>
|
||||
<meta name='author' content='Adrien MARQUÈS alias {xdrm};'>
|
||||
<meta name='desctiption' content="Système de gestion des véhicules pour STEF.">
|
||||
|
||||
<!-- Dépendences CSS -->
|
||||
<link type='text/css' rel='stylesheet' href='/f/css/reset/css' /> <!-- Reset du css natif des browsers -->
|
||||
|
||||
|
||||
<!-- Dépendences Javascript -->
|
||||
<script type='text/javascript' src='/f/js/input-checker/js/lib' ></script> <!-- Gestion dynamique des saisies -->
|
||||
<script type='text/javascript' src='/f/js/reset/js/lib' ></script> <!-- Corrections Javascript natif (ajouts) -->
|
||||
<script type='text/javascript' src='/f/js/api/js/lib' ></script> <!-- Gestion des transactions avec le serveur -->
|
||||
<script type='text/javascript' src='/f/js/page-manager/js/lib' ></script> <!-- Gestion des transactions avec le serveur -->
|
||||
|
||||
</head>
|
||||
<style type='text/css'>
|
||||
body{
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
background: #1E3C50;
|
||||
|
||||
font-family: "Roboto";
|
||||
}
|
||||
|
||||
#FORM{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
width: 30em;
|
||||
min-height: 22em;
|
||||
|
||||
border-radius: 5px;
|
||||
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#FORM > input{
|
||||
width: calc( 80% - 2*2em );
|
||||
height: calc( 4em - 2*1em );
|
||||
padding: 1em 2em;
|
||||
|
||||
border-radius: 3px;
|
||||
border: 0;
|
||||
|
||||
background: #F1F2F4;
|
||||
|
||||
color: #444;
|
||||
font-family: "Open Sans";
|
||||
|
||||
box-shadow: inset -1px 1px 5px #ddd;
|
||||
}
|
||||
|
||||
#FORM > input[type='button']{
|
||||
width: 80%;
|
||||
height: 4em;
|
||||
|
||||
background: #00CD6A;
|
||||
color: #fff;
|
||||
|
||||
box-shadow: 0 2px 0 0 #00B65B;
|
||||
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#FORM > input[type='button']:hover{
|
||||
box-shadow: 0 3px 0 0 #00B65B;
|
||||
}
|
||||
|
||||
#FORM > #err-box{
|
||||
color: #F64247;
|
||||
}
|
||||
|
||||
</style>
|
||||
<body>
|
||||
|
||||
|
||||
|
||||
<!-- CORPS DE LA PAGE -->
|
||||
<div id='FORM'>
|
||||
<span>Connexion au Parc</span>
|
||||
<input type='text' placeholder='Identifiant' id='warehouse-name'>
|
||||
<input type='password' placeholder="Code d'accès" id='warehouse-password'>
|
||||
|
||||
<input type='button' value='CONNEXION' id='warehouse-submit'>
|
||||
<span id='err-box'></span>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- Dépendences Javascript après chargement des éléments -->
|
||||
<script type='text/javascript'>
|
||||
var api = new APIClass('/api/');
|
||||
|
||||
/* [0] Récupération des éléments utiles du DOM
|
||||
=========================================================*/
|
||||
var wForm = document.getElementById('FORM');
|
||||
var wName = document.getElementById('warehouse-name');
|
||||
var wPassword = document.getElementById('warehouse-password');
|
||||
var wSubmit = document.getElementById('warehouse-submit');
|
||||
var errBox = document.getElementById('err-box');
|
||||
|
||||
|
||||
/* [1] Gestion de l'évènement
|
||||
=========================================================*/
|
||||
function handler(e){
|
||||
/* (1) Si clavier : si pas touche 'Enter', on ne fais rien */
|
||||
if( e instanceof KeyboardEvent && e.keyCode != 13 )
|
||||
return false;
|
||||
|
||||
/* (2) On effectue la requête pour voir si tout fonctionne bien */
|
||||
var request = {
|
||||
path: 'authentificationDefault/warehouse',
|
||||
name: wName.value,
|
||||
password: wPassword.value
|
||||
};
|
||||
|
||||
api.send(request, function(response){
|
||||
|
||||
// Si erreur de module
|
||||
if( response.ModuleError != 0 ){
|
||||
errBox.innerHTML = 'Erreur interne! Contactez le webmaster.';
|
||||
wPassword.value = '';
|
||||
return false;
|
||||
}
|
||||
|
||||
// Si identifiant/mot de passe incorrect
|
||||
if( !response.status ){
|
||||
errBox.innerHTML = 'Combinaison incorrecte.';
|
||||
wPassword.value = '';
|
||||
return false;
|
||||
|
||||
// Si correct, on recharge la page
|
||||
}else
|
||||
document.location = '';
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* [2] Lancement des 'listeners'
|
||||
=========================================================*/
|
||||
wSubmit.addEventListener('click', handler, false);
|
||||
wForm.addEventListener('keypress', handler, false);
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue