1. <!DOCTYPE html>
  2. <html lang="en">
  3.  
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>gn-math</title>
  8. <!-- Google Fonts & FontAwesome -->
  9. <link rel="preconnect" href="https://fonts.googleapis.com">;
  10. <link rel="preconnect" href="https://fonts.gstatic.com"; crossorigin>
  11.  
  12. <style>
  13. :root {
  14. --bg-color: #0a0c10;
  15. --glass-bg: rgba(22, 27, 34, 0.55);
  16. --glass-card: rgba(255, 255, 255, 0.03);
  17. --glass-card-hover: rgba(255, 255, 255, 0.07);
  18. --glass-border: rgba(255, 255, 255, 0.08);
  19. --glass-border-focus: rgba(99, 102, 241, 0.5);
  20. --accent-glow: rgba(99, 102, 241, 0.25);
  21. --accent-primary: #6366f1;
  22. --accent-hover: #4f46e5;
  23. --text-primary: #f3f4f6;
  24. --text-secondary: #9ca3af;
  25. --shadow-glow: 0 8px 32px 0 rgba(0, 0, 0, 0.37);
  26. }
  27.  
  28. body:not(.dark-mode) {
  29. --bg-color: #f1f5f9;
  30. --glass-bg: rgba(255, 255, 255, 0.65);
  31. --glass-card: rgba(255, 255, 255, 0.7);
  32. --glass-card-hover: rgba(255, 255, 255, 0.9);
  33. --glass-border: rgba(0, 0, 0, 0.08);
  34. --glass-border-focus: rgba(99, 102, 241, 0.5);
  35. --accent-glow: rgba(99, 102, 241, 0.15);
  36. --text-primary: #0f172a;
  37. --text-secondary: #64748b;
  38. }
  39.  
  40. * {
  41. box-sizing: border-box;
  42. margin: 0;
  43. padding: 0;
  44. transition: background 0.3s ease, border-color 0.3s ease, color 0.3s ease, transform 0.2s cubic-bezier(0.16, 1, 0.3, 1);
  45. }
  46.  
  47. body {
  48. font-family: 'Plus Jakarta Sans', sans-serif;
  49. background-color: var(--bg-color);
  50. color: var(--text-primary);
  51. min-height: 100vh;
  52. padding: 40px 20px;
  53. position: relative;
  54. overflow-x: hidden;
  55. }
  56.  
  57. /* Glassmorphism ambient background glow circles */
  58. body::before, body::after {
  59. content: '';
  60. position: fixed;
  61. width: 450px;
  62. height: 450px;
  63. border-radius: 50%;
  64. background: radial-gradient(circle, var(--accent-glow) 0%, rgba(0,0,0,0) 70%);
  65. z-index: -1;
  66. pointer-events: none;
  67. animation: float 12s infinite alternate ease-in-out;
  68. }
  69. body::before { top: -100px; left: -100px; }
  70. body::after { bottom: -100px; right: -100px; animation-delay: -6s; }
  71.  
  72. @keyframes float {
  73. 0% { transform: translate(0, 0) scale(1); }
  74. 100% { transform: translate(60px, 40px) scale(1.1); }
  75. }
  76.  
  77. h1 {
  78. text-align: center;
  79. font-size: 2.5rem;
  80. font-weight: 700;
  81. letter-spacing: -0.025em;
  82. margin-bottom: 25px;
  83. background: linear-gradient(135deg, var(--text-primary) 30%, var(--accent-primary));
  84. -webkit-background-clip: text;
  85. -webkit-text-fill-color: transparent;
  86. }
  87.  
  88. /* Glass Search Bar */
  89. .search-wrapper {
  90. position: relative;
  91. max-width: 800px;
  92. margin: 0 auto 20px auto;
  93. }
  94.  
  95. .search-wrapper i {
  96. position: absolute;
  97. left: 18px;
  98. top: 50%;
  99. transform: translateY(-50%);
  100. color: var(--text-secondary);
  101. font-size: 1.1rem;
  102. }
  103.  
  104. #searchBar {
  105. width: 100%;
  106. padding: 14px 20px 14px 48px;
  107. border: 1px solid var(--glass-border);
  108. border-radius: 14px;
  109. font-size: 15px;
  110. background: var(--glass-bg);
  111. backdrop-filter: blur(16px);
  112. -webkit-backdrop-filter: blur(16px);
  113. color: var(--text-primary);
  114. outline: none;
  115. box-shadow: var(--shadow-glow);
  116. }
  117.  
  118. #searchBar:focus {
  119. border-color: var(--glass-border-focus);
  120. box-shadow: 0 0 20px var(--accent-glow);
  121. }
  122.  
  123. /* Top Controls Bar */
  124. #topControls {
  125. display: flex;
  126. justify-content: space-between;
  127. align-items: center;
  128. margin: 0 auto 25px auto;
  129. max-width: 800px;
  130. gap: 15px;
  131. flex-wrap: wrap;
  132. }
  133.  
  134. #dataButtons {
  135. display: flex;
  136. gap: 10px;
  137. }
  138.  
  139. .btn-glass {
  140. display: inline-flex;
  141. align-items: center;
  142. gap: 8px;
  143. padding: 10px 18px;
  144. border: 1px solid var(--glass-border);
  145. border-radius: 12px;
  146. background: var(--glass-bg);
  147. backdrop-filter: blur(12px);
  148. -webkit-backdrop-filter: blur(12px);
  149. color: var(--text-primary);
  150. font-size: 14px;
  151. font-weight: 500;
  152. cursor: pointer;
  153. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  154. }
  155.  
  156. .btn-glass:hover {
  157. background: var(--glass-card-hover);
  158. transform: translateY(-2px);
  159. border-color: var(--glass-border-focus);
  160. }
  161.  
  162. .btn-accent {
  163. background: var(--accent-primary);
  164. border-color: transparent;
  165. color: #ffffff;
  166. }
  167.  
  168. .btn-accent:hover {
  169. background: var(--accent-hover);
  170. box-shadow: 0 6px 20px var(--accent-glow);
  171. }
  172.  
  173. /* Custom Select Dropdown */
  174. .select-wrapper {
  175. position: relative;
  176. }
  177.  
  178. #sortOptions {
  179. padding: 10px 36px 10px 16px;
  180. border: 1px solid var(--glass-border);
  181. border-radius: 12px;
  182. font-size: 14px;
  183. font-weight: 500;
  184. appearance: none;
  185. background: var(--glass-bg);
  186. backdrop-filter: blur(12px);
  187. -webkit-backdrop-filter: blur(12px);
  188. color: var(--text-primary);
  189. cursor: pointer;
  190. outline: none;
  191. }
  192.  
  193. .select-wrapper::after {
  194. content: "\f078";
  195. font-family: "Font Awesome 6 Free";
  196. font-weight: 900;
  197. font-size: 11px;
  198. position: absolute;
  199. right: 14px;
  200. top: 50%;
  201. transform: translateY(-50%);
  202. color: var(--text-secondary);
  203. pointer-events: none;
  204. }
  205.  
  206. /* Container & Cards */
  207. .zone-wrapper {
  208. max-width: 1000px;
  209. margin: 0 auto;
  210. }
  211.  
  212. .zone-count {
  213. text-align: center;
  214. font-size: 14px;
  215. font-weight: 500;
  216. margin-bottom: 20px;
  217. color: var(--text-secondary);
  218. }
  219.  
  220. #container {
  221. display: grid;
  222. grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  223. gap: 20px;
  224. }
  225.  
  226. .zone-item {
  227. background: var(--glass-card);
  228. border: 1px solid var(--glass-border);
  229. backdrop-filter: blur(16px);
  230. -webkit-backdrop-filter: blur(16px);
  231. border-radius: 16px;
  232. overflow: hidden;
  233. text-align: center;
  234. cursor: pointer;
  235. box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
  236. display: flex;
  237. flex-direction: column;
  238. opacity: 0;
  239. animation: fadeIn 0.4s ease forwards;
  240. }
  241.  
  242. @keyframes fadeIn {
  243. to { opacity: 1; transform: translateY(0); }
  244. from { opacity: 0; transform: translateY(10px); }
  245. }
  246.  
  247. .zone-item:hover {
  248. transform: translateY(-6px) scale(1.02);
  249. background: var(--glass-card-hover);
  250. border-color: var(--glass-border-focus);
  251. box-shadow: 0 12px 30px var(--accent-glow);
  252. }
  253.  
  254. .img-container {
  255. width: 100%;
  256. height: 120px;
  257. overflow: hidden;
  258. background: rgba(0, 0, 0, 0.2);
  259. position: relative;
  260. }
  261.  
  262. .zone-item img {
  263. width: 100%;
  264. height: 100%;
  265. object-fit: cover;
  266. transition: transform 0.4s ease;
  267. }
  268.  
  269. .zone-item:hover img {
  270. transform: scale(1.08);
  271. }
  272.  
  273. .zone-item button {
  274. width: 100%;
  275. padding: 12px 10px;
  276. border: none;
  277. background: transparent;
  278. color: var(--text-primary);
  279. font-size: 14px;
  280. font-weight: 600;
  281. cursor: pointer;
  282. margin-top: auto;
  283. text-overflow: ellipsis;
  284. white-space: nowrap;
  285. overflow: hidden;
  286. }
  287.  
  288. /* Spinner & Loading State */
  289. .loading-spinner {
  290. grid-column: 1 / -1;
  291. display: flex;
  292. flex-direction: column;
  293. align-items: center;
  294. justify-content: center;
  295. padding: 60px 0;
  296. color: var(--text-secondary);
  297. gap: 15px;
  298. }
  299.  
  300. .spinner {
  301. width: 40px;
  302. height: 40px;
  303. border: 3px solid var(--glass-border);
  304. border-top: 3px solid var(--accent-primary);
  305. border-radius: 50%;
  306. animation: spin 0.8s linear infinite;
  307. }
  308.  
  309. @keyframes spin {
  310. to { transform: rotate(360deg); }
  311. }
  312.  
  313. /* Modal Overlay & Popup Window */
  314. #modalOverlay {
  315. display: none;
  316. position: fixed;
  317. top: 0;
  318. left: 0;
  319. width: 100vw;
  320. height: 100vh;
  321. background: rgba(0, 0, 0, 0.6);
  322. backdrop-filter: blur(8px);
  323. -webkit-backdrop-filter: blur(8px);
  324. z-index: 999;
  325. opacity: 0;
  326. transition: opacity 0.3s ease;
  327. }
  328.  
  329. #zoneViewer {
  330. display: none;
  331. position: fixed;
  332. top: 50%;
  333. left: 50%;
  334. transform: translate(-50%, -45%) scale(0.95);
  335. width: 85%;
  336. height: 85%;
  337. max-width: 1200px;
  338. background: var(--glass-bg);
  339. backdrop-filter: blur(24px);
  340. -webkit-backdrop-filter: blur(24px);
  341. border: 1px solid var(--glass-border);
  342. border-radius: 20px;
  343. z-index: 1000;
  344. box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
  345. flex-direction: column;
  346. overflow: hidden;
  347. opacity: 0;
  348. transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.3s ease;
  349. }
  350.  
  351. #zoneViewer.active {
  352. display: flex;
  353. opacity: 1;
  354. transform: translate(-50%, -50%) scale(1);
  355. }
  356.  
  357. #modalOverlay.active {
  358. display: block;
  359. opacity: 1;
  360. }
  361.  
  362. #zoneInfo {
  363. display: flex;
  364. justify-content: space-between;
  365. align-items: center;
  366. padding: 16px 24px;
  367. background: rgba(255, 255, 255, 0.03);
  368. border-bottom: 1px solid var(--glass-border);
  369. }
  370.  
  371. #zoneTitle {
  372. font-weight: 600;
  373. font-size: 1.1rem;
  374. display: flex;
  375. align-items: center;
  376. gap: 10px;
  377. }
  378.  
  379. #zoneId {
  380. font-size: 0.85rem;
  381. color: var(--text-secondary);
  382. background: var(--glass-card);
  383. padding: 2px 8px;
  384. border-radius: 6px;
  385. border: 1px solid var(--glass-border);
  386. }
  387.  
  388. #controls {
  389. display: flex;
  390. gap: 8px;
  391. }
  392.  
  393. #zoneFrame {
  394. width: 100%;
  395. flex-grow: 1;
  396. border: none;
  397. background: transparent;
  398. }
  399.  
  400. /* Floating Theme Toggle */
  401. #darkModeToggle {
  402. position: fixed;
  403. bottom: 24px;
  404. right: 24px;
  405. width: 50px;
  406. height: 50px;
  407. border-radius: 50%;
  408. padding: 0;
  409. display: flex;
  410. align-items: center;
  411. justify-content: center;
  412. font-size: 1.2rem;
  413. z-index: 100;
  414. }
  415.  
  416. /* ==========================================================================
  417. HIGH-PERFORMANCE GAME MODE OVERRIDES
  418. Disables heavy rendering effects while playing to ensure maximum FPS
  419. ========================================================================== */
  420. .zone-item, #zoneViewer, body::before, body::after {
  421. will-change: transform, opacity;
  422. }
  423.  
  424. body.game-active::before,
  425. body.game-active::after {
  426. animation-play-state: paused !important;
  427. display: none !important;
  428. }
  429.  
  430. body.game-active .search-wrapper #searchBar,
  431. body.game-active .btn-glass,
  432. body.game-active .zone-item {
  433. backdrop-filter: none !important;
  434. -webkit-backdrop-filter: none !important;
  435. }
  436.  
  437. body.game-active #container {
  438. visibility: hidden;
  439. }
  440.  
  441. body.game-active #modalOverlay {
  442. backdrop-filter: none !important;
  443. -webkit-backdrop-filter: none !important;
  444. background: rgba(0, 0, 0, 0.85);
  445. }
  446.  
  447. body.game-active #zoneViewer {
  448. backdrop-filter: none !important;
  449. -webkit-backdrop-filter: none !important;
  450. background: #11141a;
  451. }
  452. </style>
  453. </head>
  454.  
  455. <body class="dark-mode">
  456. <h1><i class="fa-solid fa-shapes"></i> gn-math</h1>
  457.  
  458. <div class="search-wrapper">
  459. <i class="fa-solid fa-magnifying-glass"></i>
  460. <input type="text" id="searchBar" placeholder="Search zones..." onkeyup="filterZones()">
  461. </div>
  462.  
  463. <div id="topControls">
  464. <div id="dataButtons">
  465. <button class="btn-glass" onclick="saveData()">
  466. <i class="fa-solid fa-download"></i> Save Data
  467. </button>
  468. <button class="btn-glass" onclick="document.getElementById('file').click()">
  469. <i class="fa-solid fa-upload"></i> Load Data
  470. </button>
  471. <input type="file" id="file" style="display:none" onchange="loadData(event)" />
  472. </div>
  473. <div class="select-wrapper">
  474. <select id="sortOptions" onchange="sortZones()">
  475. <option value="name">Sort by Name</option>
  476. <option value="id">Sort by ID</option>
  477. <option value="popular">Sort by Popularity</option>
  478. </select>
  479. </div>
  480. </div>
  481.  
  482. <div class="zone-wrapper">
  483. <div id="zoneCount" class="zone-count"></div>
  484. <div id="container">
  485. <div class="loading-spinner">
  486. <div class="spinner"></div>
  487. <span>Fetching zones...</span>
  488. </div>
  489. </div>
  490. </div>
  491.  
  492. <!-- Glass Modal Window -->
  493. <div id="modalOverlay" onclick="closeZone()"></div>
  494. <div id="zoneViewer">
  495. <div id="zoneInfo">
  496. <div id="zoneTitle">
  497. <span id="zoneName"></span>
  498. <span id="zoneId"></span>
  499. </div>
  500. <div id="controls">
  501. <button class="btn-glass" onclick="fullscreenZone()"><i class="fa-solid fa-expand"></i> Fullscreen</button>
  502. <button class="btn-glass" onclick="aboutBlank()"><i class="fa-solid fa-up-right-from-square"></i> about:blank</button>
  503. <button class="btn-glass btn-accent" onclick="closeZone()"><i class="fa-solid fa-xmark"></i> Close</button>
  504. </div>
  505. </div>
  506. <iframe id="zoneFrame"></iframe>
  507. </div>
  508.  
  509. <button id="darkModeToggle" class="btn-glass">
  510. <i class="fa-solid fa-moon"></i>
  511. </button>
  512.  
  513. <script>
  514. const container = document.getElementById('container');
  515. const zoneViewer = document.getElementById('zoneViewer');
  516. const modalOverlay = document.getElementById('modalOverlay');
  517. let zoneFrame = document.getElementById('zoneFrame');
  518. const searchBar = document.getElementById('searchBar');
  519. const sortOptions = document.getElementById('sortOptions');
  520.  
  521.  
  522. let zones = [];
  523. let popularityData = {};
  524.  
  525. async function listZones() {
  526. try {
  527. const response = await fetch(zonesURL);
  528. const json = await response.json();
  529. zones = json;
  530. await fetchPopularity();
  531. sortZones();
  532.  
  533. const search = new URLSearchParams(window.location.search);
  534. const id = search.get('id');
  535. if (id) {
  536. const zone = zones.find(zone => zone.id + '' == id + '');
  537. if (zone) openZone(zone);
  538. }
  539. } catch (error) {
  540. container.innerHTML = `<div class="loading-spinner"><i class="fa-solid fa-triangle-exclamation" style="font-size:2rem;color:#ef4444;"></i><span>Error loading zones: ${error.message}</span></div>`;
  541. }
  542. }
  543.  
  544. async function fetchPopularity() {
  545. try {
  546. const data = await response.json();
  547. data.forEach(file => {
  548. const idMatch = file.name.match(/\/(\d+)\.html$/);
  549. if (idMatch) {
  550. const id = parseInt(idMatch[1]);
  551. popularityData[id] = file.hits.total;
  552. }
  553. });
  554. } catch (error) {
  555. popularityData[0] = 0;
  556. }
  557. }
  558.  
  559. function sortZones() {
  560. const sortBy = sortOptions.value;
  561. if (sortBy === 'name') {
  562. zones.sort((a, b) => a.name.localeCompare(b.name));
  563. } else if (sortBy === 'id') {
  564. zones.sort((a, b) => a.id - b.id);
  565. } else if (sortBy === 'popular') {
  566. zones.sort((a, b) => (popularityData[b.id] || 0) - (popularityData[a.id] || 0));
  567. }
  568. zones.sort((a, b) => (a.id === -1 ? -1 : b.id === -1 ? 1 : 0));
  569. displayZones(zones);
  570. }
  571.  
  572. function displayZones(zones) {
  573. container.innerHTML = "";
  574. zones.forEach(file => {
  575. const zoneItem = document.createElement("div");
  576. zoneItem.className = "zone-item";
  577. zoneItem.onclick = () => openZone(file);
  578.  
  579. const imgWrapper = document.createElement("div");
  580. imgWrapper.className = "img-container";
  581.  
  582. const img = document.createElement("img");
  583. img.loading = "lazy";
  584. img.src = file.cover.replace("{COVER_URL}", coverURL).replace("{HTML_URL}", htmlURL);
  585. imgWrapper.appendChild(img);
  586. zoneItem.appendChild(imgWrapper);
  587.  
  588. const button = document.createElement("button");
  589. button.textContent = file.name;
  590. button.onclick = (event) => {
  591. event.stopPropagation();
  592. openZone(file);
  593. };
  594. zoneItem.appendChild(button);
  595. container.appendChild(zoneItem);
  596. });
  597.  
  598. if (zones.length === 0) {
  599. container.innerHTML = `<div class="loading-spinner"><i class="fa-solid fa-magnifying-glass" style="font-size:2rem;"></i><span>No zones found.</span></div>`;
  600. document.getElementById("zoneCount").textContent = ``;
  601. } else {
  602. document.getElementById("zoneCount").textContent = `Loaded ${zones.length} Zones`;
  603. }
  604. }
  605.  
  606. function filterZones() {
  607. const query = searchBar.value.toLowerCase();
  608. const filteredZones = zones.filter(zone => zone.name.toLowerCase().includes(query));
  609. displayZones(filteredZones);
  610. }
  611.  
  612. function openZone(file) {
  613. if (file.url.startsWith("http")) {
  614. window.location.href = file.url;
  615. } else {
  616. const url = file.url.replace("{COVER_URL}", coverURL).replace("{HTML_URL}", htmlURL);
  617. fetch(url).then(response => response.text()).then(html => {
  618. if (zoneFrame.contentDocument === null) {
  619. zoneFrame = document.createElement("iframe");
  620. zoneFrame.id = "zoneFrame";
  621. zoneViewer.appendChild(zoneFrame);
  622. }
  623. zoneFrame.contentDocument.open();
  624. zoneFrame.contentDocument.write(html);
  625. zoneFrame.contentDocument.close();
  626.  
  627. document.getElementById('zoneName').textContent = file.name;
  628. document.getElementById('zoneId').textContent = `#${file.id}`;
  629.  
  630. // Enable high performance game mode
  631. document.body.classList.add('game-active');
  632. modalOverlay.classList.add('active');
  633. zoneViewer.classList.add('active');
  634. }).catch(error => alert("Failed to load zone: " + error));
  635. }
  636. }
  637.  
  638. function aboutBlank() {
  639. const newWindow = window.open("about:blank", "_blank");
  640. const cleanId = document.getElementById('zoneId').textContent.replace('#', '');
  641. let zone = zones.find(zone => zone.id + '' === cleanId).url.replace("{COVER_URL}", coverURL).replace("{HTML_URL}", htmlURL);
  642. fetch(zone).then(response => response.text()).then(html => {
  643. if (newWindow) {
  644. newWindow.document.open();
  645. newWindow.document.write(html);
  646. newWindow.document.close();
  647. }
  648. })
  649. }
  650.  
  651. function closeZone() {
  652. zoneViewer.classList.remove('active');
  653. modalOverlay.classList.remove('active');
  654.  
  655. // Disable high performance game mode & restore UI effects
  656. document.body.classList.remove('game-active');
  657.  
  658. setTimeout(() => {
  659. if (zoneFrame && zoneFrame.parentNode) {
  660. zoneViewer.removeChild(zoneFrame);
  661. }
  662. }, 300);
  663. }
  664.  
  665. function fullscreenZone() {
  666. if (zoneFrame.requestFullscreen) {
  667. zoneFrame.requestFullscreen();
  668. } else if (zoneFrame.mozRequestFullScreen) {
  669. zoneFrame.mozRequestFullScreen();
  670. } else if (zoneFrame.webkitRequestFullscreen) {
  671. zoneFrame.webkitRequestFullscreen();
  672. } else if (zoneFrame.msRequestFullscreen) {
  673. zoneFrame.msRequestFullscreen();
  674. }
  675. }
  676.  
  677. function saveData() {
  678. let data = JSON.stringify(localStorage) + "\n\n|\n\n" + document.cookie;
  679. const link = document.createElement("a");
  680. link.href = URL.createObjectURL(new Blob([data], { type: "text/plain" }));
  681. link.download = `${Date.now()}.data`;
  682. document.body.appendChild(link);
  683. link.click();
  684. document.body.removeChild(link);
  685. }
  686.  
  687. function loadData(event) {
  688. const file = event.target.files[0];
  689. if (!file) return;
  690. const reader = new FileReader();
  691. reader.onload = function (e) {
  692. const content = e.target.result;
  693. const [localStorageData, cookieData] = content.split("\n\n|\n\n");
  694. try {
  695. const parsedData = JSON.parse(localStorageData);
  696. for (let key in parsedData) {
  697. localStorage.setItem(key, parsedData[key]);
  698. }
  699. } catch (error) {
  700. console.error(error);
  701. }
  702. if (cookieData) {
  703. const cookies = cookieData.split("; ");
  704. cookies.forEach(cookie => {
  705. document.cookie = cookie;
  706. });
  707. }
  708. alert("Data successfully loaded!");
  709. };
  710. reader.readAsText(file);
  711. }
  712.  
  713. const darkModeToggle = document.getElementById('darkModeToggle');
  714. darkModeToggle.addEventListener('click', () => {
  715. document.body.classList.toggle('dark-mode');
  716. const icon = darkModeToggle.querySelector('i');
  717. if (document.body.classList.contains('dark-mode')) {
  718. icon.className = 'fa-solid fa-moon';
  719. } else {
  720. icon.className = 'fa-solid fa-sun';
  721. }
  722. });
  723.  
  724. listZones();
  725. </script>
  726. </body>
  727.  
  728. </html>