#!/usr/bin/env python3
import sys
uamIP=sys.argv[1] if len(sys.argv)>1 else ""
uamPort=sys.argv[2] if len(sys.argv)>2 else "3990"
uiPort=sys.argv[3] if len(sys.argv)>3 else "4990"
html='HTTP/1.0 200 OK\nContent-Type: text/html; charset=utf-8\nCache: none\n\n<!DOCTYPE html>\n<html lang="en">\n<head>\n    <meta charset="UTF-8">\n    <meta name="viewport" content="width=device-width, initial-scale=1.0">\n    <title>Welcome - Captive Portal</title>\n    <style>\n        * { margin: 0; padding: 0; box-sizing: border-box; }\n        body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; display: flex; align-items: center; justify-content: center; color: #333; }\n        .container { background: white; border-radius: 16px; padding: 40px; width: 90%; max-width: 420px; box-shadow: 0 20px 60px rgba(0,0,0,0.3); text-align: center; position: relative; }\n        h1 { font-size: 26px; margin-bottom: 6px; color: #333; }\n        .subtitle { color: #888; margin-bottom: 24px; font-size: 14px; }\n        .hello-emoji { font-size: 48px; margin-bottom: 12px; }\n        .lang-switcher { position: absolute; top: 12px; right: 12px; }\n        .lang-switcher select { padding: 4px 8px; border-radius: 6px; border: 1px solid #ddd; font-size: 12px; cursor: pointer; background: white; color: #555; }\n        .toggle-wrap { display: flex; background: #f0f0f0; border-radius: 10px; padding: 4px; margin-bottom: 28px; gap: 4px; }\n        .toggle-btn { flex: 1; padding: 10px; border: none; border-radius: 8px; font-size: 13px; font-weight: 600; cursor: pointer; background: transparent; color: #888; transition: all 0.25s; }\n        .toggle-btn.active { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; box-shadow: 0 2px 8px rgba(102,126,234,0.4); }\n        .form-section { display: none; }\n        .form-section.active { display: block; }\n        .form-group { margin-bottom: 16px; text-align: left; }\n        label { display: block; margin-bottom: 6px; font-weight: 600; font-size: 13px; color: #555; }\n        input[type="text"], input[type="password"], input[type="email"], input[type="number"] { width: 100%; padding: 12px 16px; border: 2px solid #e0e0e0; border-radius: 8px; font-size: 15px; transition: border-color 0.3s; outline: none; -webkit-appearance: none; }\n        input:focus { border-color: #667eea; }\n        input.error { border-color: #e74c3c; }\n        .field-error { font-size: 12px; color: #e74c3c; margin-top: 4px; display: none; text-align: left; }\n        .field-error.show { display: block; }\n        button.submit-btn { width: 100%; padding: 14px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: 8px; font-size: 15px; font-weight: 600; cursor: pointer; margin-top: 8px; transition: opacity 0.3s; }\n        button.submit-btn:hover { opacity: 0.9; }\n        button.submit-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n        #statusMsg { margin-top: 16px; padding: 10px; border-radius: 8px; font-size: 14px; display: none; }\n        .error-msg { background: #fee; color: #c00; display: block !important; }\n        .success-msg { background: #efe; color: #080; display: block !important; }\n        .info-msg { background: #eef; color: #008; display: block !important; }\n        #logoutSection { display: none; }\n        .disconnect-btn { width: 100%; padding: 14px; background: #e74c3c; color: white; border: none; border-radius: 8px; font-size: 15px; font-weight: 600; cursor: pointer; margin-top: 8px; }\n        input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; }\n        input[type=number] { -moz-appearance: textfield; }\n    </style>\n</head>\n<body>\n<div class="container">\n    <div class="lang-switcher">\n        <select onchange="changeLang(this.value)" id="lang-select">\n            <option value="en">&#127468;&#127463; English</option>\n            <option value="ar">&#127466;&#127468; &#1575;&#1604;&#1593;&#1585;&#1576;&#1610;&#1577;</option>\n            <option value="fr">&#127467;&#127479; Fran&#231;ais</option>\n            <option value="de">&#127465;&#127466; Deutsch</option>\n            <option value="es">&#127466;&#127480; Espa&#241;ol</option>\n            <option value="it">&#127470;&#127481; Italiano</option>\n            <option value="ru">&#127479;&#127482; &#1056;&#1091;&#1089;&#1089;&#1082;&#1080;&#1081;</option>\n            <option value="zh">&#127464;&#127475; &#20013;&#25991;</option>\n            <option value="tr">&#127481;&#127479; T&#252;rk&#231;e</option>\n            <option value="he">&#127470;&#127473; &#1506;&#1489;&#1512;&#1497;&#1514;</option>\n            <option value="pt">&#127477;&#127481; Portugu&#234;s</option>\n        </select>\n    </div>\n    <div class="hello-emoji">&#128075;</div>\n    <h1 id="page-title">Welcome!</h1>\n    <p class="subtitle" id="page-subtitle">Connect to the internet using your account.</p>\n    <div id="loginSection">\n        <div class="toggle-wrap">\n            <button class="toggle-btn active" id="btn-guest" onclick="switchMode(\'guest\')">Guest In House</button>\n            <button class="toggle-btn" id="btn-user" onclick="switchMode(\'user\')">Users</button>\n        </div>\n        <div class="form-section active" id="form-guest">\n            <div class="form-group">\n                <label for="g-room" id="lbl-room">Room Number</label>\n                <input type="number" id="g-room" placeholder="e.g. 204" autocomplete="off">\n                <div class="field-error" id="err-room">Please enter your room number.</div>\n            </div>\n            <div class="form-group">\n                <label for="g-name" id="lbl-name">First Name</label>\n                <input type="text" id="g-name" placeholder="e.g. Ahmed" autocomplete="given-name">\n                <div class="field-error" id="err-name">Please enter your first name.</div>\n            </div>\n            <div class="form-group">\n                <label for="g-email" id="lbl-email">Email Address</label>\n                <input type="email" id="g-email" placeholder="e.g. ahmed@email.com" autocomplete="email">\n                <div class="field-error" id="err-email">Please enter a valid email.</div>\n            </div>\n            <button class="submit-btn" id="guest-btn" onclick="submitGuest()">Connect</button>\n        </div>\n        <div class="form-section" id="form-user">\n            <div class="form-group">\n                <label for="u-user" id="lbl-uuser">Username</label>\n                <input type="text" id="u-user" placeholder="Enter username" autocomplete="username">\n                <div class="field-error" id="err-uuser">Please enter your username.</div>\n            </div>\n            <div class="form-group">\n                <label for="u-pass" id="lbl-upass">Password</label>\n                <input type="password" id="u-pass" placeholder="Enter password" autocomplete="current-password">\n                <div class="field-error" id="err-upass">Please enter your password.</div>\n            </div>\n            <button class="submit-btn" id="user-btn" onclick="submitUser()">Connect</button>\n        </div>\n    </div>\n    <div id="logoutSection">\n        <p style="font-size:18px;color:#080;margin-bottom:12px;" id="connected-text">&#9989; You are connected!</p>\n        <p style="color:#888;margin-bottom:20px;" id="enjoy-text">Enjoy your internet access.</p>\n        <button class="disconnect-btn" id="disconnect-btn" onclick="doLogout()">Disconnect</button>\n    </div>\n    <div id="statusMsg"></div>\n</div>\n<script>\nvar uamIP="__UAMIP__";\nvar uamPort=__UAMPORT__;\nvar uiPort=__UIPORT__;\nvar translations = {\n    en: { title:"Welcome!", subtitle:"Connect to the internet using your account.", guestBtn:"Guest In House", userBtn:"Users", roomLabel:"Room Number", roomPlaceholder:"e.g. 204", roomError:"Please enter your room number.", nameLabel:"First Name", namePlaceholder:"e.g. Ahmed", nameError:"Please enter your first name.", emailLabel:"Email Address", emailPlaceholder:"e.g. ahmed@email.com", emailError:"Please enter a valid email.", connectBtn:"Connect", userLabel:"Username", userPlaceholder:"Enter username", userError:"Please enter your username.", passLabel:"Password", passPlaceholder:"Enter password", passError:"Please enter your password.", connected:"&#9989; You are connected!", enjoy:"Enjoy your internet access.", disconnect:"Disconnect", connecting:"Connecting...", connectedMsg:"Connected! You now have internet access.", invalidCreds:"Invalid credentials. Please try again.", connError:"Connection error. Please try again.", timedOut:"Login timed out. Please try again.", disconnected:"Disconnected." },\n    ar: { title:"\\u0645\\u0631\\u062d\\u0628\\u0627\\u064b!", subtitle:"\\u0627\\u062a\\u0635\\u0644 \\u0628\\u0627\\u0644\\u0625\\u0646\\u062a\\u0631\\u0646\\u062a \\u0628\\u0627\\u0633\\u062a\\u062e\\u062f\\u0627\\u0645 \\u062d\\u0633\\u0627\\u0628\\u0643.", guestBtn:"\\u0646\\u0632\\u064a\\u0644 \\u0627\\u0644\\u0641\\u0646\\u062f\\u0642", userBtn:"\\u0627\\u0644\\u0645\\u0633\\u062a\\u062e\\u062f\\u0645\\u0648\\u0646", roomLabel:"\\u0631\\u0642\\u0645 \\u0627\\u0644\\u063a\\u0631\\u0641\\u0629", roomPlaceholder:"\\u0645\\u062b\\u0627\\u0644: 204", roomError:"\\u0627\\u0644\\u0631\\u062c\\u0627\\u0621 \\u0625\\u062f\\u062e\\u0627\\u0644 \\u0631\\u0642\\u0645 \\u0627\\u0644\\u063a\\u0631\\u0641\\u0629.", nameLabel:"\\u0627\\u0644\\u0627\\u0633\\u0645 \\u0627\\u0644\\u0623\\u0648\\u0644", namePlaceholder:"\\u0645\\u062b\\u0627\\u0644: \\u0623\\u062d\\u0645\\u062f", nameError:"\\u0627\\u0644\\u0631\\u062c\\u0627\\u0621 \\u0625\\u062f\\u062e\\u0627\\u0644 \\u0627\\u0633\\u0645\\u0643 \\u0627\\u0644\\u0623\\u0648\\u0644.", emailLabel:"\\u0627\\u0644\\u0628\\u0631\\u064a\\u062f \\u0627\\u0644\\u0625\\u0644\\u0643\\u062a\\u0631\\u0648\\u0646\\u064a", emailPlaceholder:"\\u0645\\u062b\\u0627\\u0644: ahmed@email.com", emailError:"\\u0627\\u0644\\u0631\\u062c\\u0627\\u0621 \\u0625\\u062f\\u062e\\u0627\\u0644 \\u0628\\u0631\\u064a\\u062f \\u0625\\u0644\\u0643\\u062a\\u0631\\u0648\\u0646\\u064a \\u0635\\u062d\\u064a\\u062d.", connectBtn:"\\u0627\\u062a\\u0635\\u0627\\u0644", userLabel:"\\u0627\\u0633\\u0645 \\u0627\\u0644\\u0645\\u0633\\u062a\\u062e\\u062f\\u0645", userPlaceholder:"\\u0623\\u062f\\u062e\\u0644 \\u0627\\u0633\\u0645 \\u0627\\u0644\\u0645\\u0633\\u062a\\u062e\\u062f\\u0645", userError:"\\u0627\\u0644\\u0631\\u062c\\u0627\\u0621 \\u0625\\u062f\\u062e\\u0627\\u0644 \\u0627\\u0633\\u0645 \\u0627\\u0644\\u0645\\u0633\\u062a\\u062e\\u062f\\u0645.", passLabel:"\\u0643\\u0644\\u0645\\u0629 \\u0627\\u0644\\u0645\\u0631\\u0648\\u0631", passPlaceholder:"\\u0623\\u062f\\u062e\\u0644 \\u0643\\u0644\\u0645\\u0629 \\u0627\\u0644\\u0645\\u0631\\u0648\\u0631", passError:"\\u0627\\u0644\\u0631\\u062c\\u0627\\u0621 \\u0625\\u062f\\u062e\\u0627\\u0644 \\u0643\\u0644\\u0645\\u0629 \\u0627\\u0644\\u0645\\u0631\\u0648\\u0631.", connected:"&#9989; \\u0623\\u0646\\u062a \\u0645\\u062a\\u0635\\u0644!", enjoy:"\\u0627\\u0633\\u062a\\u0645\\u062a\\u0639 \\u0628\\u0627\\u0644\\u0625\\u0646\\u062a\\u0631\\u0646\\u062a.", disconnect:"\\u0642\\u0637\\u0639 \\u0627\\u0644\\u0627\\u062a\\u0635\\u0627\\u0644", connecting:"\\u062c\\u0627\\u0631\\u064a \\u0627\\u0644\\u0627\\u062a\\u0635\\u0627\\u0644...", connectedMsg:"\\u0645\\u062a\\u0635\\u0644! \\u064a\\u0645\\u0643\\u0646\\u0643 \\u0627\\u0644\\u0622\\u0646 \\u062a\\u0635\\u0641\\u062d \\u0627\\u0644\\u0625\\u0646\\u062a\\u0631\\u0646\\u062a.", invalidCreds:"\\u0628\\u064a\\u0627\\u0646\\u0627\\u062a \\u063a\\u064a\\u0631 \\u0635\\u062d\\u064a\\u062d\\u0629. \\u062d\\u0627\\u0648\\u0644 \\u0645\\u0631\\u0629 \\u0623\\u062e\\u0631\\u0649.", connError:"\\u062e\\u0637\\u0623 \\u0641\\u064a \\u0627\\u0644\\u0627\\u062a\\u0635\\u0627\\u0644. \\u062d\\u0627\\u0648\\u0644 \\u0645\\u0631\\u0629 \\u0623\\u062e\\u0631\\u0649.", timedOut:"\\u0627\\u0646\\u062a\\u0647\\u062a \\u0645\\u0647\\u0644\\u0629 \\u062a\\u0633\\u062c\\u064a\\u0644 \\u0627\\u0644\\u062f\\u062e\\u0648\\u0644. \\u062d\\u0627\\u0648\\u0644 \\u0645\\u0631\\u0629 \\u0623\\u062e\\u0631\\u0649.", disconnected:"\\u062a\\u0645 \\u0642\\u0637\\u0639 \\u0627\\u0644\\u0627\\u062a\\u0635\\u0627\\u0644." },\n    fr: { title:"Bienvenue!", subtitle:"Connectez-vous \\u00e0 Internet avec votre compte.", guestBtn:"Client H\\u00f4tel", userBtn:"Utilisateurs", roomLabel:"Num\\u00e9ro de chambre", roomPlaceholder:"ex: 204", roomError:"Veuillez entrer votre num\\u00e9ro de chambre.", nameLabel:"Pr\\u00e9nom", namePlaceholder:"ex: Jean", nameError:"Veuillez entrer votre pr\\u00e9nom.", emailLabel:"Adresse e-mail", emailPlaceholder:"ex: jean@email.com", emailError:"Veuillez entrer un e-mail valide.", connectBtn:"Connecter", userLabel:"Nom d\'utilisateur", userPlaceholder:"Entrez le nom d\'utilisateur", userError:"Veuillez entrer votre nom d\'utilisateur.", passLabel:"Mot de passe", passPlaceholder:"Entrez le mot de passe", passError:"Veuillez entrer votre mot de passe.", connected:"&#9989; Vous \\u00eates connect\\u00e9!", enjoy:"Profitez d\'Internet.", disconnect:"D\\u00e9connecter", connecting:"Connexion...", connectedMsg:"Connect\\u00e9! Vous avez acc\\u00e8s \\u00e0 Internet.", invalidCreds:"Identifiants invalides. R\\u00e9essayez.", connError:"Erreur de connexion. R\\u00e9essayez.", timedOut:"D\\u00e9lai d\\u00e9pass\\u00e9. R\\u00e9essayez.", disconnected:"D\\u00e9connect\\u00e9." },\n    de: { title:"Willkommen!", subtitle:"Verbinden Sie sich mit Ihrem Konto.", guestBtn:"Hotelgast", userBtn:"Benutzer", roomLabel:"Zimmernummer", roomPlaceholder:"z.B. 204", roomError:"Bitte geben Sie Ihre Zimmernummer ein.", nameLabel:"Vorname", namePlaceholder:"z.B. Hans", nameError:"Bitte geben Sie Ihren Vornamen ein.", emailLabel:"E-Mail-Adresse", emailPlaceholder:"z.B. hans@email.com", emailError:"Bitte geben Sie eine g\\u00fcltige E-Mail ein.", connectBtn:"Verbinden", userLabel:"Benutzername", userPlaceholder:"Benutzername eingeben", userError:"Bitte geben Sie Ihren Benutzernamen ein.", passLabel:"Passwort", passPlaceholder:"Passwort eingeben", passError:"Bitte geben Sie Ihr Passwort ein.", connected:"&#9989; Sie sind verbunden!", enjoy:"Genie\\u00dfen Sie das Internet.", disconnect:"Trennen", connecting:"Verbinde...", connectedMsg:"Verbunden! Sie haben jetzt Internetzugang.", invalidCreds:"Ung\\u00fcltige Anmeldedaten. Erneut versuchen.", connError:"Verbindungsfehler. Erneut versuchen.", timedOut:"Zeit\\u00fcberschreitung. Erneut versuchen.", disconnected:"Getrennt." },\n    es: { title:"Bienvenido!", subtitle:"Con\\u00e9ctate a Internet con tu cuenta.", guestBtn:"Hu\\u00e9sped del Hotel", userBtn:"Usuarios", roomLabel:"N\\u00famero de habitaci\\u00f3n", roomPlaceholder:"ej: 204", roomError:"Por favor ingrese su n\\u00famero de habitaci\\u00f3n.", nameLabel:"Nombre", namePlaceholder:"ej: Carlos", nameError:"Por favor ingrese su nombre.", emailLabel:"Correo electr\\u00f3nico", emailPlaceholder:"ej: carlos@email.com", emailError:"Por favor ingrese un correo v\\u00e1lido.", connectBtn:"Conectar", userLabel:"Usuario", userPlaceholder:"Ingrese usuario", userError:"Por favor ingrese su usuario.", passLabel:"Contrase\\u00f1a", passPlaceholder:"Ingrese contrase\\u00f1a", passError:"Por favor ingrese su contrase\\u00f1a.", connected:"&#9989; Est\\u00e1s conectado!", enjoy:"Disfruta de Internet.", disconnect:"Desconectar", connecting:"Conectando...", connectedMsg:"Conectado! Ahora tienes acceso a Internet.", invalidCreds:"Credenciales inv\\u00e1lidas. Int\\u00e9ntalo de nuevo.", connError:"Error de conexi\\u00f3n. Int\\u00e9ntalo de nuevo.", timedOut:"Tiempo agotado. Int\\u00e9ntalo de nuevo.", disconnected:"Desconectado." },\n    it: { title:"Benvenuto!", subtitle:"Connettiti a Internet con il tuo account.", guestBtn:"Ospite Hotel", userBtn:"Utenti", roomLabel:"Numero camera", roomPlaceholder:"es: 204", roomError:"Inserisci il numero della camera.", nameLabel:"Nome", namePlaceholder:"es: Marco", nameError:"Inserisci il tuo nome.", emailLabel:"Indirizzo email", emailPlaceholder:"es: marco@email.com", emailError:"Inserisci un\'email valida.", connectBtn:"Connetti", userLabel:"Nome utente", userPlaceholder:"Inserisci nome utente", userError:"Inserisci il nome utente.", passLabel:"Password", passPlaceholder:"Inserisci password", passError:"Inserisci la password.", connected:"&#9989; Sei connesso!", enjoy:"Goditi Internet.", disconnect:"Disconnetti", connecting:"Connessione...", connectedMsg:"Connesso! Ora hai accesso a Internet.", invalidCreds:"Credenziali non valide. Riprova.", connError:"Errore di connessione. Riprova.", timedOut:"Timeout. Riprova.", disconnected:"Disconnesso." },\n    ru: { title:"\\u0414\\u043e\\u0431\\u0440\\u043e \\u043f\\u043e\\u0436\\u0430\\u043b\\u043e\\u0432\\u0430\\u0442\\u044c!", subtitle:"\\u041f\\u043e\\u0434\\u043a\\u043b\\u044e\\u0447\\u0438\\u0442\\u0435\\u0441\\u044c \\u043a \\u0438\\u043d\\u0442\\u0435\\u0440\\u043d\\u0435\\u0442\\u0443 \\u0447\\u0435\\u0440\\u0435\\u0437 \\u0441\\u0432\\u043e\\u0439 \\u0430\\u043a\\u043a\\u0430\\u0443\\u043d\\u0442.", guestBtn:"\\u0413\\u043e\\u0441\\u0442\\u044c \\u043e\\u0442\\u0435\\u043b\\u044f", userBtn:"\\u041f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u0438", roomLabel:"\\u041d\\u043e\\u043c\\u0435\\u0440 \\u043a\\u043e\\u043c\\u043d\\u0430\\u0442\\u044b", roomPlaceholder:"\\u043d\\u0430\\u043f\\u0440. 204", roomError:"\\u0412\\u0432\\u0435\\u0434\\u0438\\u0442\\u0435 \\u043d\\u043e\\u043c\\u0435\\u0440 \\u043a\\u043e\\u043c\\u043d\\u0430\\u0442\\u044b.", nameLabel:"\\u0418\\u043c\\u044f", namePlaceholder:"\\u043d\\u0430\\u043f\\u0440. \\u0418\\u0432\\u0430\\u043d", nameError:"\\u0412\\u0432\\u0435\\u0434\\u0438\\u0442\\u0435 \\u0432\\u0430\\u0448\\u0435 \\u0438\\u043c\\u044f.", emailLabel:"Email \\u0430\\u0434\\u0440\\u0435\\u0441", emailPlaceholder:"\\u043d\\u0430\\u043f\\u0440. ivan@email.com", emailError:"\\u0412\\u0432\\u0435\\u0434\\u0438\\u0442\\u0435 \\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u0442\\u0435\\u043b\\u044c\\u043d\\u044b\\u0439 email.", connectBtn:"\\u041f\\u043e\\u0434\\u043a\\u043b\\u044e\\u0447\\u0438\\u0442\\u044c\\u0441\\u044f", userLabel:"\\u0418\\u043c\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f", userPlaceholder:"\\u0412\\u0432\\u0435\\u0434\\u0438\\u0442\\u0435 \\u0438\\u043c\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f", userError:"\\u0412\\u0432\\u0435\\u0434\\u0438\\u0442\\u0435 \\u0438\\u043c\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f.", passLabel:"\\u041f\\u0430\\u0440\\u043e\\u043b\\u044c", passPlaceholder:"\\u0412\\u0432\\u0435\\u0434\\u0438\\u0442\\u0435 \\u043f\\u0430\\u0440\\u043e\\u043b\\u044c", passError:"\\u0412\\u0432\\u0435\\u0434\\u0438\\u0442\\u0435 \\u043f\\u0430\\u0440\\u043e\\u043b\\u044c.", connected:"&#9989; \\u0412\\u044b \\u043f\\u043e\\u0434\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u044b!", enjoy:"\\u041d\\u0430\\u0441\\u043b\\u0430\\u0436\\u0434\\u0430\\u0439\\u0442\\u0435\\u0441\\u044c \\u0438\\u043d\\u0442\\u0435\\u0440\\u043d\\u0435\\u0442\\u043e\\u043c.", disconnect:"\\u041e\\u0442\\u043a\\u043b\\u044e\\u0447\\u0438\\u0442\\u044c\\u0441\\u044f", connecting:"\\u041f\\u043e\\u0434\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u0438\\u0435...", connectedMsg:"\\u041f\\u043e\\u0434\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u043e! \\u0423 \\u0432\\u0430\\u0441 \\u0435\\u0441\\u0442\\u044c \\u0434\\u043e\\u0441\\u0442\\u0443\\u043f \\u043a \\u0438\\u043d\\u0442\\u0435\\u0440\\u043d\\u0435\\u0442\\u0443.", invalidCreds:"\\u041d\\u0435\\u0432\\u0435\\u0440\\u043d\\u044b\\u0435 \\u0434\\u0430\\u043d\\u043d\\u044b\\u0435. \\u041f\\u043e\\u043f\\u0440\\u043e\\u0431\\u0443\\u0439\\u0442\\u0435 \\u0441\\u043d\\u043e\\u0432\\u0430.", connError:"\\u041e\\u0448\\u0438\\u0431\\u043a\\u0430 \\u043f\\u043e\\u0434\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u0438\\u044f. \\u041f\\u043e\\u043f\\u0440\\u043e\\u0431\\u0443\\u0439\\u0442\\u0435 \\u0441\\u043d\\u043e\\u0432\\u0430.", timedOut:"\\u0412\\u0440\\u0435\\u043c\\u044f \\u043e\\u0436\\u0438\\u0434\\u0430\\u043d\\u0438\\u044f \\u0438\\u0441\\u0442\\u0435\\u043a\\u043b\\u043e. \\u041f\\u043e\\u043f\\u0440\\u043e\\u0431\\u0443\\u0439\\u0442\\u0435 \\u0441\\u043d\\u043e\\u0432\\u0430.", disconnected:"\\u041e\\u0442\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u043e." },\n    zh: { title:"\\u6b22\\u8fce!", subtitle:"\\u4f7f\\u7528\\u60a8\\u7684\\u8d26\\u6237\\u8fde\\u63a5\\u5230\\u4e92\\u8054\\u7f51\\u3002", guestBtn:"\\u9152\\u5e97\\u5ba2\\u4eba", userBtn:"\\u7528\\u6237", roomLabel:"\\u623f\\u95f4\\u53f7", roomPlaceholder:"\\u4f8b\\u5982: 204", roomError:"\\u8bf7\\u8f93\\u5165\\u60a8\\u7684\\u623f\\u95f4\\u53f7\\u3002", nameLabel:"\\u540d\\u5b57", namePlaceholder:"\\u4f8b\\u5982: \\u5f20\\u4f1f", nameError:"\\u8bf7\\u8f93\\u5165\\u60a8\\u7684\\u540d\\u5b57\\u3002", emailLabel:"\\u7535\\u5b50\\u90ae\\u4ef6", emailPlaceholder:"\\u4f8b\\u5982: zhang@email.com", emailError:"\\u8bf7\\u8f93\\u5165\\u6709\\u6548\\u7684\\u7535\\u5b50\\u90ae\\u4ef6\\u3002", connectBtn:"\\u8fde\\u63a5", userLabel:"\\u7528\\u6237\\u540d", userPlaceholder:"\\u8f93\\u5165\\u7528\\u6237\\u540d", userError:"\\u8bf7\\u8f93\\u5165\\u60a8\\u7684\\u7528\\u6237\\u540d\\u3002", passLabel:"\\u5bc6\\u7801", passPlaceholder:"\\u8f93\\u5165\\u5bc6\\u7801", passError:"\\u8bf7\\u8f93\\u5165\\u60a8\\u7684\\u5bc6\\u7801\\u3002", connected:"&#9989; \\u60a8\\u5df2\\u8fde\\u63a5!", enjoy:"\\u4eab\\u53d7\\u4e92\\u8054\\u7f51\\u3002", disconnect:"\\u65ad\\u5f00\\u8fde\\u63a5", connecting:"\\u8fde\\u63a5\\u4e2d...", connectedMsg:"\\u5df2\\u8fde\\u63a5\\uff01\\u60a8\\u73b0\\u5728\\u53ef\\u4ee5\\u4e0a\\u7f51\\u4e86\\u3002", invalidCreds:"\\u51ed\\u636e\\u65e0\\u6548\\u3002\\u8bf7\\u91cd\\u8bd5\\u3002", connError:"\\u8fde\\u63a5\\u9519\\u8bef\\u3002\\u8bf7\\u91cd\\u8bd5\\u3002", timedOut:"\\u767b\\u5f55\\u8d85\\u65f6\\u3002\\u8bf7\\u91cd\\u8bd5\\u3002", disconnected:"\\u5df2\\u65ad\\u5f00\\u8fde\\u63a5\\u3002" },\n    tr: { title:"Ho\\u015f Geldiniz!", subtitle:"Hesab\\u0131n\\u0131zla internete ba\\u011flan\\u0131n.", guestBtn:"Otel Misafiri", userBtn:"Kullan\\u0131c\\u0131lar", roomLabel:"Oda Numara\\u015f\\u0131", roomPlaceholder:"\\u00f6rn: 204", roomError:"L\\u00fctfen oda numaran\\u0131z\\u0131 girin.", nameLabel:"Ad", namePlaceholder:"\\u00f6rn: Ahmet", nameError:"L\\u00fctfen ad\\u0131n\\u0131z\\u0131 girin.", emailLabel:"E-posta Adresi", emailPlaceholder:"\\u00f6rn: ahmet@email.com", emailError:"L\\u00fctfen ge\\u00e7erli bir e-posta girin.", connectBtn:"Ba\\u011flan", userLabel:"Kullan\\u0131c\\u0131 Ad\\u0131", userPlaceholder:"Kullan\\u0131c\\u0131 ad\\u0131n\\u0131 girin", userError:"L\\u00fctfen kullan\\u0131c\\u0131 ad\\u0131n\\u0131z\\u0131 girin.", passLabel:"\\u015eifre", passPlaceholder:"\\u015eifreyi girin", passError:"L\\u00fctfen \\u015fifrenizi girin.", connected:"&#9989; Ba\\u011fland\\u0131n\\u0131z!", enjoy:"\\u0130nternetin tad\\u0131n\\u0131 \\u00e7\\u0131kar\\u0131n.", disconnect:"Ba\\u011flant\\u0131y\\u0131 Kes", connecting:"Ba\\u011flan\\u0131yor...", connectedMsg:"Ba\\u011fland\\u0131! Art\\u0131k internete eri\\u015fiminiz var.", invalidCreds:"Ge\\u00e7ersiz bilgiler. Tekrar deneyin.", connError:"Ba\\u011flant\\u0131 hatas\\u0131. Tekrar deneyin.", timedOut:"Zaman a\\u015f\\u0131m\\u0131. Tekrar deneyin.", disconnected:"Ba\\u011flant\\u0131 kesildi." },\n    he: { title:"\\u05d1\\u05e8\\u05d5\\u05db\\u05d9\\u05dd \\u05d4\\u05d1\\u05d0\\u05d9\\u05dd!", subtitle:"\\u05d4\\u05ea\\u05d7\\u05d1\\u05e8 \\u05dc\\u05d0\\u05d9\\u05e0\\u05d8\\u05e8\\u05e0\\u05d8 \\u05e2\\u05dd \\u05d4\\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05e9\\u05dc\\u05da.", guestBtn:"\\u05d0\\u05d5\\u05e8\\u05d7 \\u05de\\u05dc\\u05d5\\u05df", userBtn:"\\u05de\\u05e9\\u05ea\\u05de\\u05e9\\u05d9\\u05dd", roomLabel:"\\u05de\\u05e1\\u05e4\\u05e8 \\u05d7\\u05d3\\u05e8", roomPlaceholder:"\\u05dc\\u05d3\\u05d5\\u05d2\\u05de\\u05d4: 204", roomError:"\\u05d0\\u05e0\\u05d0 \\u05d4\\u05d6\\u05df \\u05d0\\u05ea \\u05de\\u05e1\\u05e4\\u05e8 \\u05d4\\u05d7\\u05d3\\u05e8 \\u05e9\\u05dc\\u05da.", nameLabel:"\\u05e9\\u05dd \\u05e4\\u05e8\\u05d8\\u05d9", namePlaceholder:"\\u05dc\\u05d3\\u05d5\\u05d2\\u05de\\u05d4: \\u05d9\\u05d5\\u05e1\\u05d9", nameError:"\\u05d0\\u05e0\\u05d0 \\u05d4\\u05d6\\u05df \\u05d0\\u05ea \\u05e9\\u05de\\u05da \\u05d4\\u05e4\\u05e8\\u05d8\\u05d9.", emailLabel:"\\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc", emailPlaceholder:"\\u05dc\\u05d3\\u05d5\\u05d2\\u05de\\u05d4: yossi@email.com", emailError:"\\u05d0\\u05e0\\u05d0 \\u05d4\\u05d6\\u05df \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05ea\\u05e7\\u05d9\\u05df.", connectBtn:"\\u05d4\\u05ea\\u05d7\\u05d1\\u05e8", userLabel:"\\u05e9\\u05dd \\u05de\\u05e9\\u05ea\\u05de\\u05e9", userPlaceholder:"\\u05d4\\u05d6\\u05df \\u05e9\\u05dd \\u05de\\u05e9\\u05ea\\u05de\\u05e9", userError:"\\u05d0\\u05e0\\u05d0 \\u05d4\\u05d6\\u05df \\u05d0\\u05ea \\u05e9\\u05dd \\u05d4\\u05de\\u05e9\\u05ea\\u05de\\u05e9 \\u05e9\\u05dc\\u05da.", passLabel:"\\u05e1\\u05d9\\u05e1\\u05de\\u05d4", passPlaceholder:"\\u05d4\\u05d6\\u05df \\u05e1\\u05d9\\u05e1\\u05de\\u05d4", passError:"\\u05d0\\u05e0\\u05d0 \\u05d4\\u05d6\\u05df \\u05d0\\u05ea \\u05d4\\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05e9\\u05dc\\u05da.", connected:"&#9989; \\u05d0\\u05ea\\u05d4 \\u05de\\u05d7\\u05d5\\u05d1\\u05e8!", enjoy:"\\u05ea\\u05d4\\u05e0\\u05d4 \\u05de\\u05d4\\u05d0\\u05d9\\u05e0\\u05d8\\u05e8\\u05e0\\u05d8.", disconnect:"\\u05d4\\u05ea\\u05e0\\u05ea\\u05e7", connecting:"\\u05de\\u05ea\\u05d7\\u05d1\\u05e8...", connectedMsg:"\\u05de\\u05d7\\u05d5\\u05d1\\u05e8! \\u05d9\\u05e9 \\u05dc\\u05da \\u05d2\\u05d9\\u05e9\\u05d4 \\u05dc\\u05d0\\u05d9\\u05e0\\u05d8\\u05e8\\u05e0\\u05d8.", invalidCreds:"\\u05e4\\u05e8\\u05d8\\u05d9\\u05dd \\u05e9\\u05d2\\u05d5\\u05d9\\u05d9\\u05dd. \\u05e0\\u05e1\\u05d4 \\u05e9\\u05d5\\u05d1.", connError:"\\u05e9\\u05d2\\u05d9\\u05d0\\u05ea \\u05d7\\u05d9\\u05d1\\u05d5\\u05e8. \\u05e0\\u05e1\\u05d4 \\u05e9\\u05d5\\u05d1.", timedOut:"\\u05e4\\u05d2 \\u05ea\\u05d5\\u05e7\\u05e3. \\u05e0\\u05e1\\u05d4 \\u05e9\\u05d5\\u05d1.", disconnected:"\\u05d4\\u05ea\\u05e0\\u05ea\\u05e7\\u05ea." },\n    pt: { title:"Bem-vindo!", subtitle:"Conecte-se \\u00e0 internet com sua conta.", guestBtn:"H\\u00f3spede do Hotel", userBtn:"Usu\\u00e1rios", roomLabel:"N\\u00famero do Quarto", roomPlaceholder:"ex: 204", roomError:"Por favor insira o n\\u00famero do quarto.", nameLabel:"Nome", namePlaceholder:"ex: Jo\\u00e3o", nameError:"Por favor insira seu nome.", emailLabel:"Endere\\u00e7o de Email", emailPlaceholder:"ex: joao@email.com", emailError:"Por favor insira um email v\\u00e1lido.", connectBtn:"Conectar", userLabel:"Nome de Usu\\u00e1rio", userPlaceholder:"Digite o nome de usu\\u00e1rio", userError:"Por favor insira seu nome de usu\\u00e1rio.", passLabel:"Senha", passPlaceholder:"Digite a senha", passError:"Por favor insira sua senha.", connected:"&#9989; Voc\\u00ea est\\u00e1 conectado!", enjoy:"Aproveite a internet.", disconnect:"Desconectar", connecting:"Conectando...", connectedMsg:"Conectado! Agora voc\\u00ea tem acesso \\u00e0 internet.", invalidCreds:"Credenciais inv\\u00e1lidas. Tente novamente.", connError:"Erro de conex\\u00e3o. Tente novamente.", timedOut:"Tempo esgotado. Tente novamente.", disconnected:"Desconectado." }\n};\n\nvar currentLang = \'en\';\nfunction changeLang(lang) {\n    if (!translations[lang]) return;\n    currentLang = lang;\n    var t = translations[lang];\n    var isRTL = (lang === \'ar\' || lang === \'he\');\n    document.body.setAttribute(\'dir\', isRTL ? \'rtl\' : \'ltr\');\n    document.getElementById(\'page-title\').innerHTML = t.title;\n    document.getElementById(\'page-subtitle\').innerHTML = t.subtitle;\n    document.getElementById(\'btn-guest\').innerHTML = t.guestBtn;\n    document.getElementById(\'btn-user\').innerHTML = t.userBtn;\n    document.getElementById(\'lbl-room\').innerHTML = t.roomLabel;\n    document.getElementById(\'g-room\').placeholder = t.roomPlaceholder;\n    document.getElementById(\'err-room\').innerHTML = t.roomError;\n    document.getElementById(\'lbl-name\').innerHTML = t.nameLabel;\n    document.getElementById(\'g-name\').placeholder = t.namePlaceholder;\n    document.getElementById(\'err-name\').innerHTML = t.nameError;\n    document.getElementById(\'lbl-email\').innerHTML = t.emailLabel;\n    document.getElementById(\'g-email\').placeholder = t.emailPlaceholder;\n    document.getElementById(\'err-email\').innerHTML = t.emailError;\n    document.getElementById(\'guest-btn\').innerHTML = t.connectBtn;\n    document.getElementById(\'lbl-uuser\').innerHTML = t.userLabel;\n    document.getElementById(\'u-user\').placeholder = t.userPlaceholder;\n    document.getElementById(\'err-uuser\').innerHTML = t.userError;\n    document.getElementById(\'lbl-upass\').innerHTML = t.passLabel;\n    document.getElementById(\'u-pass\').placeholder = t.passPlaceholder;\n    document.getElementById(\'err-upass\').innerHTML = t.passError;\n    document.getElementById(\'user-btn\').innerHTML = t.connectBtn;\n    document.getElementById(\'connected-text\').innerHTML = t.connected;\n    document.getElementById(\'enjoy-text\').innerHTML = t.enjoy;\n    document.getElementById(\'disconnect-btn\').innerHTML = t.disconnect;\n    document.getElementById(\'lang-select\').value = lang;\n    try { localStorage.setItem(\'portalLang\', lang); } catch(e) {}\n}\nfunction switchMode(mode) {\n    document.getElementById(\'form-guest\').classList.toggle(\'active\', mode === \'guest\');\n    document.getElementById(\'form-user\').classList.toggle(\'active\', mode === \'user\');\n    document.getElementById(\'btn-guest\').classList.toggle(\'active\', mode === \'guest\');\n    document.getElementById(\'btn-user\').classList.toggle(\'active\', mode === \'user\');\n    clearErrors(); hideStatus();\n}\nfunction showStatus(msg, type) { var el = document.getElementById("statusMsg"); el.innerHTML = msg; el.className = type; el.style.display = "block"; }\nfunction hideStatus() { var el = document.getElementById("statusMsg"); el.style.display = "none"; el.className = ""; }\nfunction clearErrors() { document.querySelectorAll(\'.field-error\').forEach(function(e){ e.classList.remove(\'show\'); }); document.querySelectorAll(\'input\').forEach(function(e){ e.classList.remove(\'error\'); }); }\nfunction showFieldError(inputId, errId) { document.getElementById(inputId).classList.add(\'error\'); document.getElementById(errId).classList.add(\'show\'); }\nfunction isValidEmail(e) { return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(e); }\nfunction getParam(name) { var match = RegExp("[?&]" + name + "=([^&]*)").exec(window.location.search); return match && decodeURIComponent(match[1]); }\nfunction safeEncode(str) { return encodeURIComponent(str).replace(/%40/g, \'@\'); }\nvar clientIP = getParam("ip") || getParam("uamip") || "";\nfunction submitGuest() {\n    clearErrors(); hideStatus();\n    var room = document.getElementById(\'g-room\').value.trim();\n    var name = document.getElementById(\'g-name\').value.trim();\n    var email = document.getElementById(\'g-email\').value.trim();\n    var valid = true; var t = translations[currentLang];\n    if (!room) { showFieldError(\'g-room\',\'err-room\'); valid = false; }\n    if (!name) { showFieldError(\'g-name\',\'err-name\'); valid = false; }\n    if (!email || !isValidEmail(email)) { showFieldError(\'g-email\',\'err-email\'); valid = false; }\n    if (!valid) return;\n    document.getElementById(\'guest-btn\').disabled = true;\n    showStatus(t.connecting, "info-msg");\n    authenticate(room, name + "&" + email, \'guest-btn\');\n}\nfunction submitUser() {\n    clearErrors(); hideStatus();\n    var user = document.getElementById(\'u-user\').value.trim();\n    var pass = document.getElementById(\'u-pass\').value;\n    var valid = true; var t = translations[currentLang];\n    if (!user) { showFieldError(\'u-user\',\'err-uuser\'); valid = false; }\n    if (!pass) { showFieldError(\'u-pass\',\'err-upass\'); valid = false; }\n    if (!valid) return;\n    document.getElementById(\'user-btn\').disabled = true;\n    showStatus(t.connecting, "info-msg");\n    authenticate(user, pass, \'user-btn\');\n}\nfunction authenticate(username, password, btnId) {\n    if (!clientIP) { getClientIP(function(ip) { clientIP = ip; callAuth(username, password, clientIP, btnId); }); }\n    else { callAuth(username, password, clientIP, btnId); }\n}\nfunction getClientIP(cb) {\n    var cbName = "_ipcb" + Math.floor(Math.random()*1000000);\n    window[cbName] = function(data) { delete window[cbName]; cb(data && data.session ? data.session.ipAddress : ""); };\n    var s = document.createElement("script"); s.src = "http://" + uamIP + ":" + uamPort + "/json/status?callback=" + cbName;\n    s.onerror = function() { cb(""); }; document.head.appendChild(s);\n    setTimeout(function() { if (window[cbName]) { delete window[cbName]; cb(""); } }, 3000);\n}\nfunction callAuth(username, password, ip, btnId) {\n    var t = translations[currentLang];\n    var cbName = "_authcb" + Math.floor(Math.random()*1000000);\n    var timer = setTimeout(function() { if (window[cbName]) { delete window[cbName]; showStatus(t.timedOut,"error-msg"); document.getElementById(btnId).disabled=false; } }, 15000);\n    window[cbName] = function(data) {\n        clearTimeout(timer); delete window[cbName];\n        if (data && data.result==="success") { showStatus(t.connectedMsg,"success-msg"); document.getElementById("loginSection").style.display="none"; document.getElementById("logoutSection").style.display="block"; }\n        else if (data && data.result==="fail") { showStatus(t.invalidCreds,"error-msg"); document.getElementById(btnId).disabled=false; }\n        else { showStatus(t.connError,"error-msg"); document.getElementById(btnId).disabled=false; }\n    };\n    var s = document.createElement("script");\n    s.src = "http://" + uamIP + ":" + uiPort + "/www/auth.chi?username=" + safeEncode(username) + "&password=" + safeEncode(password) + "&ip=" + encodeURIComponent(ip) + "&callback=" + cbName;\n    s.onerror = function() { clearTimeout(timer); showStatus(t.connError,"error-msg"); document.getElementById(btnId).disabled=false; };\n    document.head.appendChild(s);\n}\nfunction doLogout() {\n    var t = translations[currentLang];\n    var cbName = "_locb" + Math.floor(Math.random()*1000000);\n    window[cbName] = function() { delete window[cbName]; };\n    var s = document.createElement("script"); s.src = "http://" + uamIP + ":" + uamPort + "/json/logoff?callback=" + cbName;\n    document.head.appendChild(s);\n    document.getElementById("loginSection").style.display="block"; document.getElementById("logoutSection").style.display="none";\n    showStatus(t.disconnected,"info-msg");\n}\nwindow.addEventListener(\'load\', function() {\n    var saved=\'en\'; try { saved=localStorage.getItem(\'portalLang\')||\'en\'; } catch(e) {}\n    changeLang(saved);\n});\n</script>\n</body>\n</html>'
html=html.replace("__UAMIP__",uamIP).replace("__UAMPORT__",uamPort).replace("__UIPORT__",uiPort)
import sys
sys.stdout.write(html)