consulta_horario.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. <?php
  2. require_once("./include/constantes.php");
  3. require_once("./include/util.php");
  4. require_once("./include/bd_pdo.php");
  5. require_once("./include/xTemplate/xtemplate.class.php");
  6. //define("PAG", "http://200.13.89.48");
  7. define("PAG", "http://200.13.89.27");
  8. if(isset($_GET["nivel"])){
  9. $nivel = filter_input(INPUT_GET, "nivel", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  10. $stmt = $pdo->prepare('Select "Periodo_id", "Periodo_desc" from "Periodo" WHERE "Nivel_id" = :nivel AND "EstadoPeriodo_id" != 2 AND "Periodo_calendario_activo" = true');
  11. $stmt->bindParam(":nivel", $nivel);
  12. if(!$stmt->execute()){
  13. echo "Error al obtener los periodos activos.";
  14. exit();
  15. }else{
  16. $periodo_rs = $stmt->fetch();
  17. if(!is_array($periodo_rs) || count($periodo_rs) == 0){
  18. unset($periodo_rs);
  19. }
  20. }
  21. $stmt->closeCursor();
  22. //Obtiene grupos del periodo
  23. if(isset($periodo_rs)){
  24. $stmt = $pdo->prepare('Select * from fs_grupo(NULL, :periodo)');
  25. $stmt->bindParam(":periodo", $periodo_rs["Periodo_id"]);
  26. if(!$stmt->execute()){
  27. echo "Error al obtener los grupos.";
  28. exit();
  29. }else{
  30. $grupos_rs = $stmt->fetchAll();
  31. }
  32. $stmt->closeCursor();
  33. }
  34. $pendiente = "<em>Pendiente</em>";
  35. if(isset($periodo_rs) && isset($_POST["grupo"]) && is_numeric($_POST["grupo"]) && $_POST["grupo"] != ""){
  36. $filter_grupo = filter_input(INPUT_POST, "grupo", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  37. if(isset($_POST["filter_fecha"]) && $_POST["filter_fecha"]!= "")
  38. $filter_fecha = fechaGuion(trim(filter_input(INPUT_POST, "filter_fecha", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW))));//limpia texto
  39. $stmt = $pdo->prepare('Select * from fs_grupo(:grupo, :periodo)');
  40. $stmt->bindParam(":periodo", $periodo_rs["Periodo_id"]);
  41. $stmt->bindParam(":grupo", $filter_grupo);
  42. if(!$stmt->execute()){
  43. $errorDesc = "Ocurrió un error al cargar el grupo.";
  44. }else{
  45. $grupo_actual_rs = $stmt->fetch();
  46. if(!is_array($grupo_actual_rs) || count($grupo_actual_rs) == 0){
  47. $stmt->closeCursor();
  48. header("Location: consulta_horario.php");
  49. exit();
  50. }
  51. }
  52. $stmt->closeCursor();
  53. //Obtiene horario del grupo
  54. $stmt = $pdo->prepare('Select * from fs_horariogrupo(:gpo, NULL, false)');
  55. $stmt->bindParam(":gpo", $filter_grupo);
  56. if(!$stmt->execute()){
  57. //header("Location: materias.php?error=2");
  58. $errorDesc = "Error al cargar el horario del grupo";
  59. print_r($stmt->errorInfo());
  60. exit();
  61. }else{
  62. $horario_rs = $stmt->fetchAll();
  63. $horaMin = horaMin($horario_rs);
  64. $horaMax = horaMax($horario_rs);
  65. }
  66. $stmt->closeCursor();
  67. }
  68. }else{//no existe nivel
  69. $stmt = $pdo->prepare('Select * from fs_nivel(NULL)');
  70. if(!$stmt->execute()){
  71. echo "Error al obtener los niveles.";
  72. exit();
  73. }else{
  74. $nivel_rs = $stmt->fetchAll();
  75. }
  76. $stmt->closeCursor();
  77. }
  78. ?>
  79. <!DOCTYPE html>
  80. <html lang="es" prefix="og: http://ogp.me/ns#">
  81. <head>
  82. <title>Horarios - Facultad de Ingeniería</title>
  83. <meta charset="utf-8">
  84. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  85. <link rel="stylesheet" href="<?php echo PAG;?>/css/bootstrap-ulsa.min.css" type="text/css">
  86. <link rel="stylesheet" href="<?php echo PAG;?>/css/indivisa.css" type="text/css">
  87. <link rel="stylesheet" href="<?php echo PAG;?>/css/sgi.css" type="text/css">
  88. <link rel="stylesheet" href="<?php echo PAG;?>/css/fa_all.css" type="text/css">
  89. <link rel="stylesheet" href="<?php echo PAG;?>/apsa/css/horario_alumnos.css" type="text/css">
  90. <script src="<?php echo PAG;?>/js/util.js"></script>
  91. </head>
  92. <body>
  93. <div>
  94. <div class="container content marco">
  95. <img src="img/horarios.jpg" alt="horarios" class="img-fluid"/>
  96. <?php if(!isset($_GET["nivel"])){ //no existe el nivel?>
  97. <!-- Filtro -->
  98. <div class="row justify-content-md-center my-3" style="height: 50px;">
  99. <div class="col-12 col-md-8">
  100. <?php if(isset($nivel_rs)){ ?>
  101. <form action="consulta_horario.php" method="get">
  102. <div class="form-box">
  103. <div class="form-group row">
  104. <label for="filter_nivel" class="col-3 col-form-label text-right font-weight-bold">Nivel</label>
  105. <div class="col-6">
  106. <select id="filter_nivel" name="nivel" class="form-control">
  107. <option value="">Selecciona un nivel</option>
  108. <?php foreach($nivel_rs as $nivel) { ?>
  109. <option value="<?php echo $nivel["Nivel_id"];?>" ><?php echo $nivel["Nivel_desc"];?></option>
  110. <?php } ?>
  111. </select>
  112. </div>
  113. <div class="col-3">
  114. <button type="submit" class="btn btn-secondary"><?php echo $ICO["buscar"]; ?> Ver grupos</button>
  115. </div>
  116. </div>
  117. </div>
  118. </form>
  119. <?php }else{//fin hay periodos con horario para mostrar ?>
  120. <h3>No hay horarios para mostrar.</h3>
  121. <?php } ?>
  122. </div>
  123. </div>
  124. <?php }else { //si existe
  125. if($nivel == 1) $nivel_nombre = "Licenciatura";
  126. else $nivel_nombre = "Posgrado";
  127. ?>
  128. <h1 class="subtitle">Horarios de <?php echo $nivel_nombre;?> <?php if(isset($periodo_rs)){?> <small><span class="fas fa-angle-double-right"></span> <?php echo $periodo_rs["Periodo_desc"];?></small><?php } ?></h1>
  129. <!-- Filtro -->
  130. <div class="row justify-content-md-center my-3" style="height: 50px;">
  131. <div class="col-12 col-md-8">
  132. <?php if(isset($periodo_rs)){ ?>
  133. <form action="consulta_horario.php?nivel=<?php echo $nivel?>" method="post">
  134. <div class="form-box">
  135. <div class="form-group row">
  136. <label for="filter_grupo" class="col-3 col-form-label text-right font-weight-bold">Grupo</label>
  137. <div class="col-6">
  138. <select id="filter_grupo" name="grupo" class="form-control">
  139. <option value="">Selecciona un grupo</option>
  140. <?php foreach($grupos_rs as $grupo) {
  141. $nombre = "";
  142. if($nivel == 1)
  143. $nombre = $grupo["Grupo_desc"]." ".$grupo["Carrera_prefijo"];
  144. else
  145. $nombre = $grupo["Grupo_desc"]." - ".$grupo["Carrera_desc"];
  146. ?>
  147. <option value="<?php echo $grupo["Grupo_id"];?>" <?php if(isset($filter_grupo) && $filter_grupo == $grupo["Grupo_id"]){echo "selected='selected'";}?> ><?php echo $nombre;?></option>
  148. <?php } ?>
  149. </select>
  150. </div>
  151. <div class="col-3">
  152. <button type="submit" class="btn btn-secondary"><?php echo $ICO["buscar"]; ?> Ver horario</button>
  153. </div>
  154. </div>
  155. </div>
  156. </form>
  157. <?php }else{//fin hay periodos con horario para mostrar ?>
  158. <h3>No hay horarios para mostrar.</h3>
  159. <?php } ?>
  160. </div>
  161. </div>
  162. </div>
  163. <main class="container-fluid content marco-wide">
  164. <?php
  165. if(isset($grupo_actual_rs) && isset($horario_rs)){//Si existe grupo seleccionado carga horario
  166. ?>
  167. <?php
  168. $stmt = $pdo->prepare('Select * from fs_dia(NULL)');
  169. if(!$stmt->execute()){
  170. echo "Error al obtener los días";
  171. print_r($stmt->errorInfo());
  172. }
  173. $dias_rs = $stmt->fetchAll();
  174. $stmt->closeCursor();
  175. $stmt = null;
  176. $horas_dif = intval(date('H', strtotime($horaMax))) - intval(date('H', strtotime($horaMin)));
  177. $hora_ini = date('H', strtotime($horaMin));
  178. $hora_fin = date('H', strtotime($horaMax));
  179. if(intval(date('i', strtotime($horaMax))) != 0)
  180. $hora_fin++;
  181. /* Definidas en constantes.php
  182. HORA_INICIO = 7;
  183. HORA_FINAL = 22;
  184. FRACCION_HORA = 4;*/
  185. ?>
  186. <ul class="nav nav-tabs d-print-none mb-4" id="myTab" role="tablist">
  187. <li class="nav-item">
  188. <a class="nav-link active" id="tab1-tab" data-toggle="tab" href="#tab1" role="tab" aria-controls="calendario" aria-selected="true">Horario</a>
  189. </li>
  190. <li class="nav-item">
  191. <a class="nav-link" id="tab2-tab" data-toggle="tab" href="#tab2" role="tab" aria-controls="lista" aria-selected="false">Listado por materia</a>
  192. </li>
  193. </ul>
  194. <div class="tab-content" id="horariosTabContent">
  195. <div class="tab-pane fade show active" id="tab1" role="tabpanel" aria-labelledby="tab1-tab">
  196. <?php // ---- Como horario ---- ?>
  197. <div class="row justify-content-md-center">
  198. <div class="col-md-auto no-gutters px-0">
  199. <table class="table table-sm table-responsive table-borderless calendario" id="tabla-horario" data-hora-inicio="<?php echo $hora_ini;?>" data-fracciones = "<?php echo FRACCION_HORA; ?>">
  200. <thead class="thead-dark">
  201. <tr>
  202. <th>Hora</th>
  203. <?php foreach($dias_rs as $dia){
  204. echo "<th data='dia_".$dia["Dia_id"]."'>".$dia["Dia_desc"]."</th>";
  205. } ?>
  206. </tr>
  207. </thead>
  208. <tbody id="calendario-body">
  209. <?php
  210. $biccell = false;
  211. //for($h = HORA_INICIO, $i=0; $h < HORA_FINAL; $h++, $i++){
  212. for($h = $hora_ini, $i=0; $h < $hora_fin; $h++, $i++){
  213. ?>
  214. <tr>
  215. <td data-hora="<?php echo $h;?>" data-index="<?php echo $i;?>" class="hora" ><?php echo $h;?>:00 </td>
  216. <?php
  217. if(!$biccell){
  218. $biccell = true;
  219. ?>
  220. <td colspan='<?php echo count($dias_rs); ?>' rowspan='<?php echo ($hora_fin-$hora_ini)+1; ?>'>
  221. <div class='area-horario'>
  222. <table class="table table-borderless ">
  223. <tbody>
  224. <?php
  225. for($h2 = $hora_ini; $h2 < $hora_fin; $h2++){
  226. for($f = 0; $f < FRACCION_HORA; $f++){
  227. echo "<tr class='dia'>";
  228. foreach($dias_rs as $dia){
  229. echo "<td title='".$h2.":".sprintf("%02d", ($f*(60/FRACCION_HORA)))."' data-dia='".$dia["Dia_id"]."' data-hora='".$h2."' data-fraccion='".($f*(60/FRACCION_HORA))."' class='crea-horario fraccion '></td>";
  230. }
  231. echo "</tr>";
  232. }
  233. }
  234. ?>
  235. </tbody>
  236. </table>
  237. <div id="bloque-horarios"></div>
  238. </div>
  239. </td>
  240. <?php
  241. } ?>
  242. </tr>
  243. <?php } ?>
  244. </tbody>
  245. </table>
  246. </div>
  247. </div>
  248. </div>
  249. <div class="tab-pane fade" id="tab2" role="tabpanel" aria-labelledby="tab2-tab">
  250. <?php
  251. // --- Como listado ----
  252. $stmt = $pdo->prepare('Select * from fs_horariogrupo(:gpo, NULL, false) order by "Materia_desc", "Dia_id", "Horario_hora"');
  253. $stmt->bindParam(":gpo", $filter_grupo);
  254. if(!$stmt->execute()){
  255. //header("Location: materias.php?error=2");
  256. $errorDesc = "Error al cargar el horario del grupo";
  257. print_r($stmt->errorInfo());
  258. exit();
  259. }
  260. $horario_materia_rs = $stmt->fetchAll();
  261. $stmt->closeCursor();
  262. $materia_old = -1;
  263. $xtpl = new XTemplate('./tpl/horariolista_reporte.tpl.html');
  264. foreach($horario_materia_rs as $horario){
  265. if(intval($horario["Materia_id"]) != $materia_old && $materia_old != -1){
  266. if((isset($filter_fecha) && strtotime($filter_fecha) >= strtotime($horario["fecha_inicial"]) && strtotime($filter_fecha) <= strtotime($horario["fecha_final"]) ) || !isset($filter_fecha)){
  267. $xtpl->parse("main.table");
  268. }
  269. }
  270. $materia_old = intval($horario["Materia_id"]);
  271. $xtpl->assign("MATERIA", $horario["Materia_desc"]);
  272. $xtpl->assign("CLAVE", $horario["Materia_clave"]);
  273. //----- Carga profesores ----
  274. if($horario["TipoSubmateria_id"] == 0){
  275. $stmt = $pdo->prepare('Select * from fs_profesorhorariogrupo(:id)');
  276. $stmt->bindParam(":id", $horario["HorarioGrupo_id"]);
  277. if(!$stmt->execute()){
  278. $t = $stmt->errorInfo();
  279. $errorDesc = "Ocurrió un error al obtener los datos de los profesores ".$t[2];
  280. break;
  281. }
  282. $profesores_rs = $stmt->fetchAll();
  283. $stmt->closeCursor();
  284. $prof_nombre = "";
  285. if(isset($profesores_rs) && count($profesores_rs) > 0){
  286. $profesores_all = "";
  287. foreach($profesores_rs as $profesor){
  288. $prof_nombre = $profesor["Usuario_apellidos"]." ".$profesor["Usuario_nombre"];
  289. $profesores_all .= $prof_nombre."<br>";
  290. }
  291. }else{
  292. $profesores_all = $pendiente;
  293. }
  294. $xtpl->assign("PROFESOR", $profesores_all);
  295. }else{//Con submaterias
  296. //----- Carga submaterias ----
  297. $stmt = $pdo->prepare('Select * from fs_submateriahorariogrupo(:id)');
  298. $stmt->bindParam(":id", $horario["HorarioGrupo_id"]);
  299. if(!$stmt->execute()){
  300. $t = $stmt->errorInfo();
  301. $errorDesc = "Ocurrió un error al obtener los datos de los profesores ".$t[2];
  302. break;
  303. }
  304. $submaterias_rs = $stmt->fetchAll();
  305. $stmt->closeCursor();
  306. $sub_prof_num = 0;
  307. $profesores_all = "";
  308. if(count($submaterias_rs) > 0){
  309. foreach($submaterias_rs as $submateria){
  310. //---
  311. $stmt = $pdo->prepare('Select * from fs_submateriahorariogrupoprofesor(:id,:sub)');
  312. $stmt->bindParam(":id", $horario["HorarioGrupo_id"]);
  313. $stmt->bindParam(":sub", $submateria["Submateria_id"]);
  314. if(!$stmt->execute()){
  315. $t = $stmt->errorInfo();
  316. $errorDesc = "Ocurrió un error al obtener los datos de los profesores ".$t[2];
  317. break;
  318. }
  319. $profesores_rs = $stmt->fetchAll();
  320. $stmt->closeCursor();
  321. $sub_prof_num += count($profesores_rs);
  322. if(isset($profesores_rs) && count($profesores_rs) > 0){
  323. foreach($profesores_rs as $profesor){
  324. $prof_nombre = $profesor["Usuario_apellidos"]." ".$profesor["Usuario_nombre"];
  325. $profesores_all .= $prof_nombre."<br>";
  326. }
  327. //$xtpl->assign("PROFESOR", $profesores_all);
  328. }/*else{
  329. $xtpl->assign("PROFESOR", $pendiente);
  330. }*/
  331. }
  332. if($sub_prof_num > 0)
  333. $xtpl->assign("PROFESOR", $profesores_all);
  334. else
  335. $xtpl->assign("PROFESOR", $pendiente);
  336. }
  337. unset($profesores_rs);
  338. }//fin con submaterias
  339. $xtpl->assign("DIA", ucfirst(diaNombre($horario["Dia_id"])));
  340. $xtpl->assign("HORAI", date('H:i', strtotime($horario["Horario_hora"])));
  341. $xtpl->assign("HORAF", date('H:i', strtotime($horario["Horario_hora_final"])));
  342. if($horario["Salon_desc"]!= ""){
  343. if($horario["Salon_desc_larga"] != "")
  344. $xtpl->assign("SALON", $horario["Salon_desc"]." (".$horario["Salon_desc_larga"].")");
  345. else
  346. $xtpl->assign("SALON", $horario["Salon_desc"]);
  347. }else
  348. $xtpl->assign("SALON", $pendiente);
  349. $xtpl->parse("main.table.row");
  350. }//for each materias
  351. if($materia_old != -1){
  352. if((isset($filter_fecha) && strtotime($filter_fecha) >= strtotime($horario["fecha_inicial"]) && strtotime($filter_fecha) <= strtotime($horario["fecha_final"]) ) || !isset($filter_fecha))
  353. $xtpl->parse("main.table");
  354. }
  355. $xtpl->parse("main");
  356. $xtpl->out("main");
  357. ?>
  358. </div>
  359. </div><!-- End tabs-->
  360. <div class="row justify-content-md-center mt-4 d-none" id="electivasBlock">
  361. <div class="col-md-auto">
  362. <h3>Electivas</h3>
  363. <table class="table table-sm table-hover table-responsive text-80" id="tabla-horario" data-hora-inicio="<?php echo $hora_ini;?>" data-fracciones = "<?php echo FRACCION_HORA; ?>">
  364. <thead class="thead-light">
  365. <tr><th scope="col">Materia</th><th scope="col">Horario</th><th scope="col">Profesores</th><th scope="col">Salón</th></tr>
  366. </thead>
  367. <tbody>
  368. <?php
  369. foreach($horario_rs as $horario){
  370. if($horario["TipoSubmateria_id"] != 0){
  371. //----- Carga submaterias ----
  372. $stmt = $pdo->prepare('Select * from fs_submateriahorariogrupo(:id)');
  373. $stmt->bindParam(":id", $horario["HorarioGrupo_id"]);
  374. if(!$stmt->execute()){
  375. $t = $stmt->errorInfo();
  376. $errorDesc = "Ocurrió un error al obtener los datos de los profesores ".$t[2];
  377. break;
  378. }
  379. $submaterias_rs = $stmt->fetchAll();
  380. $stmt->closeCursor();
  381. $sub_prof_num = 0;
  382. $nombre_impreso = false;
  383. if(count($submaterias_rs) > 0){
  384. $tiene_submaterias = true;
  385. foreach($submaterias_rs as $submateria){
  386. $submateria_text = $submateria["Submateria_desc"];
  387. $dia_hora_text = ucfirst(diaNombre($horario["Dia_id"]))." ".date('H:i', strtotime($horario["Horario_hora"]));
  388. $profesores_all = "";
  389. $salon_text = "";
  390. //---
  391. $stmt = $pdo->prepare('Select * from fs_submateriahorariogrupoprofesor(:id,:sub)');
  392. $stmt->bindParam(":id",$horario["HorarioGrupo_id"]);
  393. $stmt->bindParam(":sub", $submateria["Submateria_id"]);
  394. if(!$stmt->execute()){
  395. $t = $stmt->errorInfo();
  396. $errorDesc = "Ocurrió un error al obtener los datos de los profesores ".$t[2];
  397. break;
  398. }
  399. $profesores_rs = $stmt->fetchAll();
  400. $stmt->closeCursor();
  401. $sub_prof_num += count($profesores_rs);
  402. if(isset($profesores_rs) && count($profesores_rs) > 0){
  403. foreach($profesores_rs as $profesor){
  404. $prof_nombre = '<span class="fas fa-user-graduate fa-fw mx-1"></span> '.$profesor["Usuario_apellidos"]." ".$profesor["Usuario_nombre"];
  405. $profesores_all .= $prof_nombre."<br>";
  406. }
  407. //$xtpl->assign("PROFESOR_SUB", $profesores_all);
  408. if($submateria["Salon_desc"]){
  409. $salon_text = $submateria["Salon_desc"];
  410. }else{
  411. $salon_text = $pendiente;
  412. }
  413. ?>
  414. <tr>
  415. <td class="align-middle"><?php echo $submateria_text;?> </td>
  416. <td class="text-center align-middle"><?php echo $dia_hora_text;?></td>
  417. <td class="align-middle"><?php echo $profesores_all;?></td>
  418. <td class="text-center align-middle"><?php echo $salon_text;?></td>
  419. </tr>
  420. <?php
  421. //$xtpl->parse("main.submaterias_block.row");
  422. }//se pinta sólo si tiene profesor
  423. }
  424. }//hay submaterias
  425. }//fin if
  426. }
  427. unset($profesores_rs);
  428. ?>
  429. </tbody>
  430. </table>
  431. </div>
  432. </div>
  433. <?php }//end if existe grupo_actual_rs ?>
  434. <?php }//hay nivel ?>
  435. </main>
  436. <script src="http://200.13.89.48/js/jquery.min.js"></script>
  437. <script src="http://200.13.89.48/js/bootstrap/popper.min.js"></script>
  438. <script src="http://200.13.89.48/js/bootstrap/bootstrap.min.js"></script>
  439. <?php if(isset($grupo_actual_rs)){ ?>
  440. <script>
  441. var _w = 208, _h = 25;//tamaño de bloques
  442. var _tab_size = 25; //espaciado por cada elemento que colisiona
  443. var _frac = parseInt($('#tabla-horario').data('fracciones'));
  444. var _reloadOnClose = false;
  445. var id_obj = 0; //id de objeto actual
  446. var _hora_min = parseInt($('#tabla-horario').data('hora-inicio'));
  447. var clasesObj = [];
  448. //al imprimir pone horarios lado a lado, sólo soporta 2
  449. function imprime(){
  450. _tab_size = _w/2;
  451. loadHorario();
  452. setTimeout(function() {
  453. window.print()
  454. }, 250);
  455. setTimeout(function() {
  456. _tab_size = 25;
  457. loadHorario();
  458. }, 500);
  459. //window.print();
  460. }
  461. </script>
  462. <script src="http://200.13.89.48/apsa/js/horario.js"></script>
  463. <script src="./js/consulta_horario.js?v=1.1"></script>
  464. <?php } ?>
  465. </body>
  466. </html>