{"id":8715,"date":"2026-01-20T16:35:16","date_gmt":"2026-01-20T21:35:16","guid":{"rendered":"https:\/\/www.ezcalculatoronline.com\/?page_id=8715"},"modified":"2026-05-09T22:28:57","modified_gmt":"2026-05-10T03:28:57","slug":"werewolf-game-moderator","status":"publish","type":"page","link":"https:\/\/www.ezcalculatoronline.com\/online-tools\/werewolf-game-moderator\/","title":{"rendered":"Werewolf Game Moderator"},"content":{"rendered":"<div id=\"tdi_1\" class=\"tdc-zone\"><div class=\"tdc_zone tdi_2  wpb_row td-pb-row\"  >\n<style scoped>\n\n\/* custom css *\/\n.tdi_2{\r\n                    min-height: 0;\r\n                }\n<\/style><div id=\"tdi_3\" class=\"tdc-row\"><div class=\"vc_row tdi_4  wpb_row td-pb-row\" >\n<style scoped>\n\n\/* custom css *\/\n.tdi_4,\r\n                .tdi_4 .tdc-columns{\r\n                    min-height: 0;\r\n                }.tdi_4,\r\n\t\t\t\t.tdi_4 .tdc-columns{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_4 .tdc-columns{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n<\/style><div class=\"vc_column tdi_6  wpb_column vc_column_container tdc-column td-pb-span12\">\n<style scoped>\n\n\/* custom css *\/\n.tdi_6{\r\n                    vertical-align: baseline;\r\n                }.tdi_6 > .wpb_wrapper,\r\n\t\t\t\t.tdi_6 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper > .vc_row_inner{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t    height: auto;\r\n\t\t\t\t}\n<\/style><div class=\"wpb_wrapper\" ><div class=\"wpb_wrapper td_block_wrap vc_raw_html tdi_8 \"><div class=\"td-fix-index\"><div id=\"ww-app-root\">\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Roboto:wght@400;500;700;900&family=Merriweather:wght@700&display=swap\" rel=\"stylesheet\">\n    <style>\n        \/* --- CORE CSS --- *\/\n        #ww-app-root {\n            background-color: #0f172a; \n            background-image: radial-gradient(at 0% 0%, #1e1b4b 0px, transparent 50%), \n                              radial-gradient(at 100% 100%, #312e81 0px, transparent 50%);\n            color: #ffffff !important;\n            font-family: 'Roboto', sans-serif;\n            padding: 25px;\n            border-radius: 20px;\n            box-shadow: 0 15px 50px rgba(0,0,0,0.7);\n            max-width: 900px; \/* R\u1ed9ng h\u01a1n \u0111\u1ec3 ch\u1ee9a th\u1ebb to *\/\n            margin: 20px auto;\n            position: relative;\n            z-index: 1;\n            line-height: 1.5;\n            border: 1px solid rgba(255,255,255,0.08);\n            overflow: visible; \/* Cho ph\u00e9p d\u00e3n chi\u1ec1u cao t\u1ef1 nhi\u00ean *\/\n        }\n\n        #ww-app-root h1, #ww-app-root h2, #ww-app-root h3, \n        #ww-app-root p, #ww-app-root span, #ww-app-root div, \n        #ww-app-root label, #ww-app-root li, #ww-app-root option {\n            color: #ffffff !important;\n        }\n\n        .ww-text-dim { color: #94a3b8 !important; }\n        .ww-text-accent { color: #a78bfa !important; }\n        .ww-text-gold { color: #fcd34d !important; }\n        .ww-hidden { display: none !important; }\n        #ww-app-root * { box-sizing: border-box; }\n\n        \/* Panels *\/\n        .ww-panel {\n            background: rgba(30, 41, 59, 0.6);\n            border: 1px solid rgba(255, 255, 255, 0.08);\n            border-radius: 16px; padding: 25px; margin-bottom: 25px;\n            backdrop-filter: blur(10px);\n        }\n\n        \/* HEADER *\/\n        .ww-header-bar {\n            display: flex; justify-content: space-between; align-items: center;\n            margin-bottom: 30px; padding-bottom: 15px; border-bottom: 1px solid rgba(255,255,255,0.1);\n        }\n        .ww-app-title {\n            font-family: 'Merriweather', serif; font-size: 1.8em; margin: 0;\n            letter-spacing: 1px; text-shadow: 0 2px 10px rgba(167, 139, 250, 0.5);\n            color: #a78bfa !important;\n        }\n        .ww-controls-group { display: flex; gap: 10px; }\n        .ww-icon-btn {\n            background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.1);\n            color: #cbd5e1 !important; width: 44px; height: 44px; border-radius: 12px;\n            cursor: pointer; display: flex; align-items: center; justify-content: center;\n            font-size: 16px; font-weight: bold; transition: 0.2s;\n        }\n        .ww-icon-btn:hover { background: rgba(139, 92, 246, 0.5); color: white !important; }\n        #btn-lang { width: auto; padding: 0 15px; }\n\n        \/* Inputs *\/\n        #ww-app-root textarea, #ww-app-root select, #ww-app-root input {\n            width: 100%; \n            background: rgba(0,0,0,0.4) !important;\n            border: 1px solid rgba(255,255,255,0.2) !important;\n            color: #fff !important;\n            padding: 15px; border-radius: 12px; font-size: 16px; margin-bottom: 15px;\n        }\n        #ww-app-root option { background: #1f2937; color: white !important; }\n\n        \/* Buttons *\/\n        .ww-btn {\n            width: 100%; padding: 18px; border: none; border-radius: 14px;\n            font-weight: 800; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 10px;\n            transition: 0.2s; text-transform: uppercase; font-size: 16px; margin-top: 15px; letter-spacing: 0.5px;\n            color: white !important;\n        }\n        .ww-btn:hover { opacity: 0.95; transform: translateY(-2px); }\n        .ww-btn-primary { background: linear-gradient(135deg, #8b5cf6, #6d28d9); box-shadow: 0 8px 20px rgba(139, 92, 246, 0.3); }\n        .ww-btn-danger { background: linear-gradient(135deg, #ef4444, #b91c1c); }\n        .ww-btn-success { background: linear-gradient(135deg, #10b981, #059669); }\n        .ww-btn-ghost { background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.2); }\n        .ww-btn-info { background: transparent; border: 1px solid rgba(255,255,255,0.3); color: #cbd5e1 !important; width: 34px; height: 34px; border-radius: 50%; padding: 0; }\n\n        \/* Roles List *\/\n        .ww-role-row { display: flex; justify-content: space-between; align-items: center; padding: 15px; border-bottom: 1px solid rgba(255,255,255,0.05); }\n        .ww-counter { display: flex; align-items: center; gap: 10px; }\n        .ww-counter button { width: 36px; height: 36px; border-radius: 8px; border: none; font-weight: bold; cursor: pointer; }\n\n        \/* --- BIGGER GRID SYSTEM --- *\/\n        .ww-grid { \n            display: grid; \n            \/* Min 160px ensures cards are wide enough on mobile (2 columns) and desktop *\/\n            grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); \n            gap: 20px; \n        }\n        \n        .ww-card {\n            background: rgba(31, 41, 55, 0.6); \n            padding: 25px 15px; \/* T\u0103ng padding *\/\n            border-radius: 18px; \n            border: 1px solid rgba(255,255,255,0.1);\n            text-align: center; position: relative; cursor: pointer; transition: 0.3s;\n            display: flex; flex-direction: column; justify-content: center; align-items: center;\n            min-height: 180px; \/* Th\u1ebb cao h\u01a1n *\/\n        }\n        .ww-card.active { border-color: #8b5cf6; box-shadow: 0 0 25px rgba(139, 92, 246, 0.3); transform: translateY(-5px); background: rgba(31, 41, 55, 0.9); }\n        .ww-card.dead { background: rgba(20, 0, 0, 0.6); border: 1px solid #ef4444; opacity: 0.7; }\n        .ww-card.dead .ww-card-icon { filter: grayscale(1); opacity: 0.5; }\n        \n        .ww-card-icon { font-size: 4.5em; margin-bottom: 15px; display: block; line-height: 1; transition: 0.3s; }\n        .ww-card-name { font-weight: 900; font-size: 1.3em; word-break: break-word; text-shadow: 0 2px 4px rgba(0,0,0,0.8); line-height: 1.2; }\n        .ww-badge { position: absolute; top: 12px; right: 12px; font-size: 12px; padding: 5px 10px; border-radius: 8px; font-weight: bold; background: rgba(255,255,255,0.15); }\n\n        \/* --- BIGGER FLIP CARD --- *\/\n        .ww-flip-container { \n            perspective: 1000px; \n            width: 300px; \/* R\u1ed9ng h\u01a1n *\/\n            height: 480px; \/* Cao h\u01a1n nhi\u1ec1u *\/\n            margin: 0 auto 20px; \n            max-width: 90vw; \/* Responsive tr\u00ean m\u00e0n h\u00ecnh nh\u1ecf *\/\n        }\n        .ww-flip-inner { position: relative; width: 100%; height: 100%; transition: transform 0.8s; transform-style: preserve-3d; }\n        .ww-flip-inner.flipped { transform: rotateY(180deg); }\n        .ww-flip-face {\n            position: absolute; width: 100%; height: 100%; backface-visibility: hidden;\n            display: flex; flex-direction: column; align-items: center; justify-content: center;\n            border-radius: 24px; border: 3px solid rgba(255,255,255,0.2); \n            box-shadow: 0 20px 60px rgba(0,0,0,0.6);\n            color: white !important;\n            padding: 20px;\n        }\n        .ww-front { background: linear-gradient(135deg, #1e1b4b, #0f172a); cursor: pointer; }\n        .ww-back { background: linear-gradient(135deg, #4c1d95, #312e81); transform: rotateY(180deg); border-color: #8b5cf6; }\n\n        #rev-name { color: #a78bfa !important; font-size: 2.5em !important; font-weight: 900 !important; text-shadow: 0 4px 15px rgba(0,0,0,0.6); margin: 20px 0 !important; }\n        #rev-role { color: #ffffff !important; font-size: 2.8em !important; font-weight: 900 !important; margin: 15px 0 !important; text-shadow: 0 4px 20px rgba(0,0,0,0.8); }\n        #rev-desc { \n            color: #f3f4f6 !important; font-size: 1.1em !important; line-height: 1.6 !important; \n            background: rgba(0,0,0,0.4); padding: 20px; border-radius: 16px; margin-top: 20px; \n            border: 1px solid rgba(255,255,255,0.1);\n        }\n        #rev-icon { font-size: 6em; filter: drop-shadow(0 0 20px rgba(255,255,255,0.2)); }\n\n        \/* Modals *\/\n        .ww-modal-overlay {\n            position: fixed; top: 0; left: 0; width: 100%; height: 100%;\n            background: rgba(0,0,0,0.9); z-index: 9999; backdrop-filter: blur(10px);\n            display: flex; align-items: center; justify-content: center;\n            opacity: 0; visibility: hidden; transition: 0.3s;\n        }\n        .ww-modal-overlay.show { opacity: 1; visibility: visible; }\n        .ww-modal {\n            background: #1e293b; width: 90%; max-width: 500px;\n            padding: 30px; border-radius: 24px; border: 1px solid rgba(255,255,255,0.15);\n            text-align: center; box-shadow: 0 30px 80px rgba(0, 0, 0, 0.9);\n            transform: scale(0.95); transition: 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n            max-height: 90vh; overflow-y: auto;\n        }\n        .ww-modal-overlay.show .ww-modal { transform: scale(1); }\n\n        \/* Settings *\/\n        .ww-toggle-row { display: flex; justify-content: space-between; align-items: center; padding: 20px 0; border-bottom: 1px solid rgba(255,255,255,0.1); text-align: left; }\n        #txt-settings-title { color: #fcd34d !important; text-transform: uppercase; font-weight: 900; letter-spacing: 2px; font-size: 1.8em; }\n\n        \/* Win Screen *\/\n        #mod-win .ww-modal { border: 3px solid #fcd34d; background: linear-gradient(145deg, #1e1b4b, #000); }\n        #win-icon { font-size: 6em; margin-bottom: 20px; display: block; }\n    <\/style>\n\n    <div class=\"ww-header-bar\">\n        <h2 class=\"ww-app-title\">Werewolf Moderator <\/h2>\n        <div class=\"ww-controls-group\">\n            <button class=\"ww-icon-btn active\" id=\"btn-lang\" onclick=\"app.toggleLang()\">EN<\/button>\n            <button class=\"ww-icon-btn\" onclick=\"app.openSettings()\">\u2699\ufe0f<\/button>\n        <\/div>\n    <\/div>\n\n    <div id=\"scr-setup\">\n        <p id=\"txt-subtitle\" class=\"ww-text-dim\" style=\"text-align:center; margin-bottom:30px; font-size:1.1em; letter-spacing: 1px;\">Office Edition \u2022 Big Cards<\/p>\n        \n        <div class=\"ww-panel\">\n            <h3 id=\"txt-input-title\" class=\"ww-text-gold\" style=\"text-align:left; font-size:1.3em; margin-bottom:20px; font-weight: 800;\">1. Enter Players<\/h3>\n            <textarea id=\"inp-names\" rows=\"5\" placeholder=\"Enter names...\"><\/textarea>\n            <button class=\"ww-btn ww-btn-ghost\" onclick=\"app.autoConfig()\" id=\"btn-auto-config\">\u2699\ufe0f Auto Config<\/button>\n        <\/div>\n\n        <div class=\"ww-panel\">\n            <h3 id=\"txt-role-title\" class=\"ww-text-gold\" style=\"text-align:left; font-size:1.3em; margin-bottom:20px; font-weight: 800;\">2. Special Roles<\/h3>\n            <div id=\"list-roles\"><\/div>\n        <\/div>\n\n        <div style=\"text-align:center; margin-bottom:20px; font-size:1.1em\" class=\"ww-text-dim\">\n            <span id=\"st-p\" style=\"color:white; font-weight:bold\">0<\/span> <span id=\"txt-p-count\">players<\/span> \/ \n            <span id=\"st-c\" style=\"color:white; font-weight:bold\">0<\/span> <span id=\"txt-c-count\">cards<\/span>\n        <\/div>\n\n        <button class=\"ww-btn ww-btn-primary\" id=\"btn-next\" onclick=\"app.goDistribute()\" disabled>DISTRIBUTE CARDS \u2794<\/button>\n    <\/div>\n\n    <div id=\"scr-distribute\" class=\"ww-hidden\">\n        <h2 id=\"txt-dist-title\" class=\"ww-text-gold\" style=\"font-size: 2em; margin-bottom: 10px;\">\ud83c\udfb4 SECRET DEAL<\/h2>\n        <p id=\"txt-dist-desc\" class=\"ww-text-dim\" style=\"text-align:center; margin-bottom:30px; font-size: 1.1em;\">Pass the phone to reveal roles.<\/p>\n        <div id=\"grid-distribute\" class=\"ww-grid\"><\/div>\n        <div style=\"margin-top:30px\">\n            <button class=\"ww-btn ww-btn-success ww-hidden\" id=\"btn-start\" onclick=\"app.startGame()\">\ud83d\udc51 START GAME<\/button>\n            <button class=\"ww-btn ww-btn-ghost\" onclick=\"app.backSetup()\" id=\"btn-back\">\u2190 Back<\/button>\n        <\/div>\n    <\/div>\n\n    <div id=\"scr-manager\" class=\"ww-hidden\">\n        <div class=\"ww-panel\" style=\"padding: 20px; display:flex; justify-content:space-between; align-items:center; margin-bottom:25px; flex-wrap: wrap; gap: 15px;\">\n            <div>\n                <h3 id=\"txt-day\" class=\"ww-text-gold\" style=\"margin:0; text-align:left; font-size:1.5em; font-weight: 900;\">\ud83c\udf1e Day Phase<\/h3>\n                <span class=\"ww-text-dim\" style=\"font-size:1em\"><span id=\"txt-round\">Round<\/span> <span id=\"val-round\">1<\/span><\/span>\n            <\/div>\n            <button class=\"ww-btn ww-btn-ghost\" style=\"width:auto; padding:10px 20px; margin:0\" onclick=\"app.showLog()\" id=\"btn-log\">\ud83d\udcdc Log<\/button>\n        <\/div>\n\n        <button class=\"ww-btn ww-btn-primary\" style=\"margin-bottom:30px; font-size:1.2em; padding: 20px;\" onclick=\"app.startNight()\" id=\"btn-night\">\ud83c\udf19 START NIGHT<\/button>\n\n        <div id=\"grid-manager\" class=\"ww-grid\"><\/div>\n\n        <button class=\"ww-btn ww-btn-danger\" style=\"margin-top:40px\" onclick=\"app.confirmEnd()\" id=\"btn-end\">\ud83c\udfc1 End Game<\/button>\n    <\/div>\n\n    <div id=\"mod-confirm\" class=\"ww-modal-overlay\">\n        <div class=\"ww-modal\">\n            <h3 id=\"conf-title\" class=\"ww-text-gold\" style=\"font-size:1.8em; margin-bottom:15px\">Confirm<\/h3>\n            <p id=\"conf-msg\" style=\"margin-bottom:30px; font-size:1.2em;\">Are you sure?<\/p>\n            <div style=\"display:flex; gap:15px; justify-content:center;\">\n                <button class=\"ww-btn ww-btn-ghost\" onclick=\"app.closeModal('mod-confirm')\" id=\"conf-cancel\">Cancel<\/button>\n                <button class=\"ww-btn ww-btn-danger\" id=\"conf-ok\">Yes<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div id=\"mod-win\" class=\"ww-modal-overlay\">\n        <div class=\"ww-modal\" id=\"win-content\">\n            <div id=\"win-icon\">\ud83c\udfc6<\/div>\n            <h2 id=\"win-title\" style=\"font-size:2.5em; text-transform:uppercase; margin-bottom:15px; color:#fcd34d !important; text-shadow:0 0 20px rgba(252,211,77,0.5)\">VICTORY<\/h2>\n            <p id=\"win-desc\" style=\"font-size:1.4em; margin-bottom:40px; color:#fff !important; font-weight: bold;\">The Village Wins!<\/p>\n            <button class=\"ww-btn ww-btn-primary\" onclick=\"location.reload()\">\ud83d\udd04 NEW GAME<\/button>\n        <\/div>\n    <\/div>\n\n    <div id=\"mod-settings\" class=\"ww-modal-overlay\">\n        <div class=\"ww-modal\">\n            <h3 id=\"txt-settings-title\" style=\"margin-bottom:30px\">Settings<\/h3>\n            <div class=\"ww-toggle-row\">\n                <div><div id=\"lbl-blind\" class=\"ww-text-accent\" style=\"font-weight:bold; font-size: 1.1em;\">Blind Manager<\/div><div id=\"desc-blind\" class=\"ww-text-dim\" style=\"font-size:0.9em\">Hide roles on manager screen.<\/div><\/div>\n                <button class=\"ww-icon-btn\" id=\"tog-blind\" onclick=\"app.toggleSetting('blindMode')\" style=\"width:50px; height:30px; border-radius:15px; font-size:12px\">OFF<\/button>\n            <\/div>\n            <div class=\"ww-toggle-row\">\n                <div><div id=\"lbl-dead\" class=\"ww-text-accent\" style=\"font-weight:bold; font-size: 1.1em;\">Hide Dead<\/div><div id=\"desc-dead\" class=\"ww-text-dim\" style=\"font-size:0.9em\">Remove dead players from grid.<\/div><\/div>\n                <button class=\"ww-icon-btn\" id=\"tog-dead\" onclick=\"app.toggleSetting('hideDead')\" style=\"width:50px; height:30px; border-radius:15px; font-size:12px\">OFF<\/button>\n            <\/div>\n            <button class=\"ww-btn ww-btn-primary\" style=\"margin-top:30px\" onclick=\"app.closeModal('mod-settings')\">OK<\/button>\n        <\/div>\n    <\/div>\n\n    <div id=\"mod-reveal\" class=\"ww-modal-overlay\">\n        <div style=\"width:100%; height:100%; display:flex; align-items:center; justify-content:center;\">\n            <div class=\"ww-modal\" style=\"background:transparent; border:none; box-shadow:none; padding:0; overflow: visible;\">\n                <div class=\"ww-flip-container\" onclick=\"app.flipCard()\">\n                    <div class=\"ww-flip-inner\" id=\"card-inner\">\n                        <div class=\"ww-flip-face ww-front\">\n                            <div style=\"font-size:5em; margin-bottom:20px\">\ud83d\udd75\ufe0f<\/div>\n                            <h3 id=\"txt-rev-ask\" class=\"ww-text-dim\" style=\"margin:0; font-weight:normal; font-size: 1.2em;\">Are you<\/h3>\n                            <h1 id=\"rev-name\" class=\"ww-text-accent\" style=\"margin:15px 0; font-size:2.2em\">Name<\/h1>\n                            <p id=\"txt-rev-tap\" class=\"ww-text-dim\" style=\"font-size:1em; margin-top:30px; animation: pulse 2s infinite\">Tap to reveal<\/p>\n                        <\/div>\n                        <div class=\"ww-flip-face ww-back\">\n                            <div id=\"rev-icon\">\ud83d\udc3a<\/div>\n                            <h2 id=\"rev-role\">Role<\/h2>\n                            <p id=\"rev-desc\">Desc<\/p>\n                        <\/div>\n                    <\/div>\n                <\/div>\n                <button class=\"ww-btn ww-btn-success\" id=\"btn-seen\" style=\"display:none; box-shadow: 0 10px 40px rgba(0,0,0,0.8); width: 80%; margin: 20px auto;\" onclick=\"app.confirmSeen()\">OK<\/button>\n                <button class=\"ww-btn ww-btn-ghost\" id=\"btn-cancel-rev\" style=\"background:rgba(0,0,0,0.6); width: 80%; margin: 20px auto;\" onclick=\"app.closeModal('mod-reveal')\">Cancel<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div id=\"mod-guide\" class=\"ww-modal-overlay\">\n        <div class=\"ww-modal\">\n            <div id=\"gd-icon\" style=\"font-size:5em; margin-bottom:15px\"><\/div>\n            <h3 id=\"gd-title\" class=\"ww-text-accent\" style=\"font-size:1.8em; margin-bottom: 20px;\">Role<\/h3>\n            <div id=\"gd-content\" style=\"text-align: left; font-size: 1.1em; color: #fff; line-height: 1.6; margin-top:15px; background: rgba(0,0,0,0.2); padding: 15px; border-radius: 12px;\"><\/div>\n            <button class=\"ww-btn ww-btn-primary\" style=\"margin-top:25px\" onclick=\"app.closeModal('mod-guide')\" id=\"btn-guide-ok\">Got it<\/button>\n        <\/div>\n    <\/div>\n\n    <div id=\"mod-night\" class=\"ww-modal-overlay\">\n        <div class=\"ww-modal\">\n            <div id=\"ni-icon\" style=\"font-size:5em; margin-bottom:10px\">\ud83d\udc3a<\/div>\n            <h3 id=\"ni-title\" style=\"margin-bottom:5px; font-size:1.8em\">Ma S\u00f3i<\/h3>\n            <p id=\"ni-desc\" class=\"ww-text-dim\" style=\"font-size:1em; margin-bottom:25px\"><\/p>\n            <div id=\"ni-body\" style=\"text-align:left; margin-bottom:20px; font-size: 1.1em;\"><\/div>\n            <div id=\"ni-controls\"><\/div>\n            <button class=\"ww-btn ww-btn-primary\" id=\"ni-next\" style=\"margin-top:25px\">NEXT<\/button>\n        <\/div>\n    <\/div>\n\n    <div id=\"mod-alert\" class=\"ww-modal-overlay\">\n        <div class=\"ww-modal\">\n            <h3 id=\"al-title\" style=\"color: #fcd34d !important; font-size: 1.5em; margin-bottom: 15px;\">Notification<\/h3>\n            <div id=\"al-body\" style=\"color:#fff; margin-bottom:25px; font-size:1.2em; line-height:1.6\"><\/div>\n            <button class=\"ww-btn ww-btn-primary\" onclick=\"app.closeModal('mod-alert')\" id=\"btn-alert-close\">Close<\/button>\n        <\/div>\n    <\/div>\n\n    <script>\n        \/\/ --- TRANSLATIONS ---\n        const LANG = {\n            vi: {\n                subtitle: \"EzCalculatorOnline.com\", inputTitle: \"1. Nh\u1eadp danh s\u00e1ch\", inputPlace: \"Nh\u1eadp t\u00ean ng\u01b0\u1eddi ch\u01a1i...\", roleTitle: \"2. Vai tr\u00f2 \u0111\u1eb7c bi\u1ec7t\", btnAuto: \"\u2699\ufe0f \u0110\u1ec1 xu\u1ea5t nhanh\", txtPlayer: \"ng\u01b0\u1eddi\", txtCard: \"th\u1ebb\", btnNext: \"TI\u1ebeP THEO: PH\u00c1T B\u00c0I \u2794\", distTitle: \"\ud83c\udfb4 CHIA B\u00c0I B\u00cd M\u1eacT\", distDesc: \"Chuy\u1ec1n \u0111i\u1ec7n tho\u1ea1i cho ng\u01b0\u1eddi c\u00f3 t\u00ean \u0111\u1ec3 xem vai tr\u00f2.\", btnStart: \"\ud83d\udc51 B\u1eaeT \u0110\u1ea6U QU\u1ea2N TR\u00d2\", btnBack: \"\u2190 Quay l\u1ea1i\", txtDay: \"\ud83c\udf1e Ban Ng\u00e0y\", txtRound: \"Hi\u1ec7p\", btnLog: \"\ud83d\udcdc Nh\u1eadt k\u00fd\", btnNight: \"\ud83c\udf19 V\u00c0O \u0110\u00caM (AUTO)\", btnEnd: \"\ud83c\udfc1 K\u1ebft th\u00fac game\", btnKill: \"\u2620\ufe0f TREO C\u1ed4\", txtSeen: \"\u0110\u00e3 xem\", txtTap: \"Ch\u1ea1m \u0111\u1ec3 xem\", revAsk: \"B\u1ea1n c\u00f3 ph\u1ea3i l\u00e0\", revTap: \"Ch\u1ea1m \u0111\u1ec3 l\u1eadt b\u00e0i\", btnSeen: \"\u0110\u00e3 nh\u1edb vai tr\u00f2, \u00dap b\u00e0i!\", btnCancel: \"Kh\u00f4ng ph\u1ea3i t\u00f4i\", btnGuideOk: \"\u0110\u00e3 hi\u1ec3u\", alertTitle: \"Th\u00f4ng b\u00e1o\", btnClose: \"\u0110\u00f3ng\", alertMin: \"C\u1ea7n \u00edt nh\u1ea5t 3 ng\u01b0\u1eddi ch\u01a1i!\", alertNightEmpty: \"\u0110\u00eam nay kh\u00f4ng c\u00f2n ai th\u1ee9c!\", alertEnd: \"B\u1ea1n c\u00f3 ch\u1eafc ch\u1eafn mu\u1ed1n k\u1ebft th\u00fac game?\", alertLost: \"M\u1ea5t d\u1eef li\u1ec7u b\u00e0i \u0111\u00e3 chia?\", msgKill: \"X\u00e1c nh\u1eadn treo c\u1ed5\", msgDay: \"TR\u1edcI S\u00c1NG! \u2600\ufe0f\", msgDead: \"Ng\u01b0\u1eddi ch\u1ebft:\", msgSafe: \"\u0110\u00eam b\u00ecnh y\u00ean! Kh\u00f4ng ai ch\u1ebft.\", wolfPick: \"\u0110\u00e0n S\u00f3i ch\u1ecdn con m\u1ed3i:\", whitePick: \"S\u00f3i Tuy\u1ebft ch\u1ecdn gi\u1ebft:\", skPick: \"S\u00e1t th\u1ee7 ch\u1ecdn m\u1ee5c ti\u00eau:\", seerPick: \"Soi vai tr\u00f2:\", guardPick: \"B\u1ea3o v\u1ec7 ai?\", witchMsg: \"S\u00f3i c\u1eafn:\", witchHeal: \"\ud83d\udc8a D\u00f9ng thu\u1ed1c C\u1ee8U\", witchPoison: \"D\u00f9ng \u0110\u1ed8C:\", cupidPick: \"Ch\u1ecdn 2 ng\u01b0\u1eddi \u0111\u1ec3 gh\u00e9p \u0111\u00f4i:\", piperMsg: \"Ch\u1ecdn 2 ng\u01b0\u1eddi \u0111\u1ec3 th\u00f4i mi\u00ean (Qu\u1ea3n tr\u00f2 t\u1ef1 nh\u1edb):\", resBad: \"\u00c1C \ud83d\ude08\", resNeu: \"PHE 3 \ud83e\udd21\", resGood: \"THI\u1ec6N \ud83d\ude07\", logGuard: \"\ud83d\udee1\ufe0f B\u1ea3o v\u1ec7 \u0111\u1ee1 cho\", logHeal: \"\ud83e\uddd9 Ph\u00f9 th\u1ee7y c\u1ee9u\", logWolf: \"\ud83d\udc3a S\u00f3i c\u1eafn ch\u1ebft\", logPoison: \"\ud83e\uddea Ph\u00f9 th\u1ee7y \u0111\u1ed9c ch\u1ebft\", logWhite: \"\u2744\ufe0f S\u00f3i tuy\u1ebft gi\u1ebft\", logSk: \"\ud83d\udd2a S\u00e1t th\u1ee7 gi\u1ebft\", logCub: \"\u26a0\ufe0f S\u00f3i Con ch\u1ebft! \u0110\u00eam sau S\u00f3i \u0111\u01b0\u1ee3c c\u1eafn 2 ng\u01b0\u1eddi.\", setSet: \"C\u00c0I \u0110\u1eb6T\", setBlind: \"Ch\u1ebf \u0111\u1ed9 \u1ea8n Danh\", setDescBlind: \"\u1ea8n vai tr\u00f2 tr\u00ean m\u00e0n h\u00ecnh qu\u1ea3n tr\u00f2 (???).\", setDead: \"\u1ea8n Ng\u01b0\u1eddi Ch\u1ebft\", setDescDead: \"X\u00f3a th\u1ebb ng\u01b0\u1eddi ch\u1ebft kh\u1ecfi m\u00e0n h\u00ecnh.\", confirmYes: \"\u0110\u1ed3ng \u00fd\", confirmNo: \"H\u1ee7y\",\n                winVillager: \"D\u00c2N L\u00c0NG CHI\u1ebeN TH\u1eaeNG!\", winWolf: \"PHE S\u00d3I CHI\u1ebeN TH\u1eaeNG!\", winTanner: \"K\u1eba CH\u00c1N \u0110\u1edcI TH\u1eaeNG!\", winWhite: \"S\u00d3I TUY\u1ebeT TH\u1eaeNG!\", winSK: \"S\u00c1T TH\u1ee6 TH\u1eaeNG!\"\n            },\n            en: {\n                subtitle: \"EzCalculatorOnline.com\", inputTitle: \"1. Enter Players\", inputPlace: \"Enter names...\", roleTitle: \"2. Special Roles\", btnAuto: \"\u2699\ufe0f Auto Config\", txtPlayer: \"players\", txtCard: \"cards\", btnNext: \"NEXT: DISTRIBUTE \u2794\", distTitle: \"\ud83c\udfb4 SECRET DEAL\", distDesc: \"Pass the phone to reveal roles.\", btnStart: \"\ud83d\udc51 START MANAGER\", btnBack: \"\u2190 Back\", txtDay: \"\ud83c\udf1e Day Phase\", txtRound: \"Round\", btnLog: \"\ud83d\udcdc Log\", btnNight: \"\ud83c\udf19 START NIGHT (AUTO)\", btnEnd: \"\ud83c\udfc1 End Game\", btnKill: \"\u2620\ufe0f EXECUTE\", txtSeen: \"Seen\", txtTap: \"Tap to view\", revAsk: \"Are you\", revTap: \"Tap to reveal\", btnSeen: \"Memorized, Hide Card!\", btnCancel: \"Not me\", btnGuideOk: \"Got it\", alertTitle: \"Notification\", btnClose: \"Close\", alertMin: \"Need at least 3 players!\", alertNightEmpty: \"No active roles tonight!\", alertEnd: \"Are you sure you want to end?\", alertLost: \"Lost current game data?\", msgKill: \"Confirm execution of\", msgDay: \"SUNRISE! \u2600\ufe0f\", msgDead: \"Dead:\", msgSafe: \"Safe night! No one died.\", wolfPick: \"Wolves choose victim:\", whitePick: \"White Wolf kills:\", skPick: \"Serial Killer target:\", seerPick: \"Check role:\", guardPick: \"Protect who?\", witchMsg: \"Wolf attacked:\", witchHeal: \"\ud83d\udc8a Use HEAL\", witchPoison: \"Use POISON:\", cupidPick: \"Link 2 lovers:\", piperMsg: \"Charm 2 players:\", resBad: \"EVIL \ud83d\ude08\", resNeu: \"NEUTRAL \ud83e\udd21\", resGood: \"GOOD \ud83d\ude07\", logGuard: \"\ud83d\udee1\ufe0f Guard saved\", logHeal: \"\ud83e\uddd9 Witch saved\", logWolf: \"\ud83d\udc3a Wolf killed\", logPoison: \"\ud83e\uddea Witch poisoned\", logWhite: \"\u2744\ufe0f White Wolf killed\", logSk: \"\ud83d\udd2a SK killed\", logCub: \"\u26a0\ufe0f Wolf Cub died! Wolves kill 2 next night.\", setSet: \"SETTINGS\", setBlind: \"Blind Manager\", setDescBlind: \"Hide roles on manager screen.\", setDead: \"Hide Dead Players\", setDescDead: \"Remove dead players from grid.\", confirmYes: \"Yes\", confirmNo: \"Cancel\",\n                winVillager: \"VILLAGERS WIN!\", winWolf: \"WEREWOLVES WIN!\", winTanner: \"TANNER WINS!\", winWhite: \"WHITE WOLF WINS!\", winSK: \"SERIAL KILLER WINS!\"\n            }\n        };\n\n        const ROLES_DATA = {\n            wolf: { icon: '\ud83d\udc3a', type: 'bad', p: 2, vi: { name: 'Ma S\u00f3i', desc: 'Ch\u1ecdn 1 ng\u01b0\u1eddi \u0111\u1ec3 gi\u1ebft m\u1ed7i \u0111\u00eam.', guide: 'Gi\u1ebft h\u1ebft d\u00e2n l\u00e0ng.' }, en: { name: 'Werewolf', desc: 'Choose a victim every night.', guide: 'Kill all villagers.' } },\n            white_wolf: { icon: '\u2744\ufe0f', type: 'bad', p: 6, vi: { name: 'S\u00f3i Tuy\u1ebft', desc: 'M\u1ed7i 2 \u0111\u00eam gi\u1ebft th\u00eam 1 ng\u01b0\u1eddi. Th\u1eafng m\u1ed9t m\u00ecnh.', guide: 'Phe: Solo.' }, en: { name: 'White Wolf', desc: 'Kills extra person every 2 nights. Wins alone.', guide: 'Team: Solo.' } },\n            wolf_cub: { icon: '\ud83d\udc3e', type: 'bad', p: 2, vi: { name: 'S\u00f3i Con', desc: 'N\u1ebfu ch\u1ebft, \u0111\u00eam sau \u0111\u00e0n S\u00f3i gi\u1ebft 2 ng\u01b0\u1eddi.', guide: 'Hy sinh \u0111\u1ec3 buff team.' }, en: { name: 'Wolf Cub', desc: 'If dies, wolves kill 2 next night.', guide: 'Sacrifice for team.' } },\n            tanner: { icon: '\ud83e\udd21', type: 'neu', p: 0, vi: { name: 'K\u1ebb Ch\u00e1n \u0110\u1eddi', desc: 'M\u1ee5c ti\u00eau: B\u1ecb treo c\u1ed5.', guide: 'Th\u1eafng ngay n\u1ebfu b\u1ecb vote ch\u1ebft.' }, en: { name: 'Tanner', desc: 'Goal: Get executed.', guide: 'Wins instantly if voted out.' } },\n            serial_killer: { icon: '\ud83d\udd2a', type: 'neu', p: 5, vi: { name: 'S\u00e1t Th\u1ee7', desc: 'M\u1ed7i \u0111\u00eam gi\u1ebft 1 ng\u01b0\u1eddi. Th\u1eafng m\u1ed9t m\u00ecnh.', guide: 'Phe: Solo.' }, en: { name: 'Serial Killer', desc: 'Kills one person every night.', guide: 'Team: Solo.' } },\n            piper: { icon: '\ud83c\udfb6', type: 'neu', p: 0.5, vi: { name: 'Th\u1ed5i S\u00e1o', desc: 'M\u1ed7i \u0111\u00eam th\u00f4i mi\u00ean 2 ng\u01b0\u1eddi.', guide: 'Th\u1eafng khi m\u1ecdi ng\u01b0\u1eddi b\u1ecb th\u00f4i mi\u00ean.' }, en: { name: 'Piper', desc: 'Charms 2 people every night.', guide: 'Wins when all alive charmed.' } },\n            seer: { icon: '\ud83d\udd2e', type: 'good', p: 3, vi: { name: 'Ti\u00ean Tri', desc: 'Soi 1 ng\u01b0\u1eddi bi\u1ebft Thi\u1ec7n\/\u00c1c.', guide: 'T\u00ecm ra s\u00f3i.' }, en: { name: 'Seer', desc: 'Check alignment each night.', guide: 'Find the wolves.' } },\n            guard: { icon: '\ud83d\udee1\ufe0f', type: 'good', p: 4, vi: { name: 'B\u1ea3o V\u1ec7', desc: 'B\u1ea3o v\u1ec7 1 ng\u01b0\u1eddi. Kh\u00f4ng tr\u00f9ng 2 \u0111\u00eam.', guide: 'B\u1ea3o v\u1ec7 phe ta.' }, en: { name: 'Bodyguard', desc: 'Protect one player each night.', guide: 'Protect villagers.' } },\n            witch: { icon: '\ud83e\uddd9', type: 'good', p: 5, vi: { name: 'Ph\u00f9 Th\u1ee7y', desc: 'C\u00f3 1 b\u00ecnh C\u1ee9u v\u00e0 1 b\u00ecnh \u0110\u1ed9c.', guide: 'D\u00f9ng thu\u1ed1c kh\u00f4n ngoan.' }, en: { name: 'Witch', desc: 'Has 1 Heal and 1 Poison potion.', guide: 'Use potions wisely.' } },\n            hunter: { icon: '\ud83c\udff9', type: 'good', p: 0, vi: { name: 'Th\u1ee3 S\u0103n', desc: 'Khi ch\u1ebft k\u00e9o theo 1 ng\u01b0\u1eddi.', guide: '' }, en: { name: 'Hunter', desc: 'Shoot someone upon death.', guide: '' } },\n            cupid: { icon: '\ud83d\udc98', type: 'good', p: 1, vi: { name: 'Cupid', desc: 'Gh\u00e9p \u0111\u00f4i 2 ng\u01b0\u1eddi y\u00eau nhau.', guide: 'H\u1ecd s\u1ed1ng ch\u1ebft c\u00f9ng nhau.' }, en: { name: 'Cupid', desc: 'Link 2 lovers first night.', guide: 'They live\/die together.' } },\n            minion: { icon: '\ud83d\udc7a', type: 'bad', p: 0, vi: { name: 'Ph\u1ea3n B\u1ed9i', desc: 'Phe S\u00f3i nh\u01b0ng kh\u00f4ng c\u1eafn. Ti\u00ean tri soi ra D\u00e2n.', guide: 'Gi\u00fap S\u00f3i.' }, en: { name: 'Minion', desc: 'Team Wolf, no kill. Seer sees Good.', guide: 'Help Wolves.' } },\n            villager: { icon: '\ud83d\udc68\u200d\ud83c\udf3e', type: 'good', p: 0, vi: { name: 'D\u00e2n L\u00e0ng', desc: 'Kh\u00f4ng ch\u1ee9c n\u0103ng.', guide: 'T\u00ecm ra S\u00f3i.' }, en: { name: 'Villager', desc: 'No ability.', guide: 'Find Wolves.' } }\n        };\n\n        const app = {\n            lang: 'en', players: [], roles: [], viewId: null, round: 1, logs: [],\n            night: { step: 0, active: [], data: {} },\n            settings: { blindMode: false, hideDead: false },\n\n            init: () => {\n                document.getElementById('inp-names').addEventListener('input', app.updateStats);\n                app.setLang('en');\n            },\n\n            \/\/ --- CORE FUNCTIONS ---\n            t: (k) => LANG[app.lang][k],\n\n            setLang: (l) => {\n                app.lang = l;\n                document.getElementById('btn-lang').innerText = l==='vi' ? 'VI' : 'EN';\n                \n                const t = LANG[l];\n                \/\/ Map texts\n                const mapping = {\n                    'txt-subtitle': 'subtitle', 'txt-input-title': 'inputTitle', 'inp-names': 'inputPlace',\n                    'txt-role-title': 'roleTitle', 'btn-auto-config': 'btnAuto', 'txt-p-count': 'txtPlayer',\n                    'txt-c-count': 'txtCard', 'txt-dist-title': 'distTitle', 'txt-dist-desc': 'distDesc',\n                    'btn-start': 'btnStart', 'btn-back': 'btnBack', 'txt-day': 'txtDay', 'txt-round': 'txtRound',\n                    'btn-log': 'btnLog', 'btn-night': 'btnNight', 'btn-end': 'btnEnd', 'txt-rev-ask': 'revAsk',\n                    'txt-rev-tap': 'revTap', 'btn-seen': 'btnSeen', 'btn-cancel-rev': 'btnCancel',\n                    'btn-guide-ok': 'btnGuideOk', 'al-title': 'alertTitle', 'btn-alert-close': 'btnClose',\n                    'txt-settings-title': 'setSet', 'lbl-blind': 'setBlind', 'desc-blind': 'setDescBlind',\n                    'lbl-dead': 'setDead', 'desc-dead': 'setDescDead'\n                };\n\n                for (const [id, key] of Object.entries(mapping)) {\n                    const el = document.getElementById(id);\n                    if (el) {\n                        if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') el.placeholder = t[key];\n                        else el.innerText = t[key];\n                    }\n                }\n\n                app.initRoles(); \n                app.updateStats(); \n                if(app.players.length > 0) app.renderManager();\n            },\n\n            toggleLang: () => app.setLang(app.lang === 'en' ? 'vi' : 'en'),\n\n            initRoles: () => {\n                const ids = Object.keys(ROLES_DATA);\n                if(app.roles.length === 0) {\n                    app.roles = ids.map(id => ({ id, count: (id==='wolf'?1:0), ...ROLES_DATA[id] }));\n                }\n                app.renderRoles();\n            },\n\n            renderRoles: () => {\n                const el = document.getElementById('list-roles');\n                el.innerHTML = app.roles.map((r, i) => {\n                    let roleColor = '#fff';\n                    if (r.type === 'bad') roleColor = '#ef4444';\n                    else if (r.type === 'neu') roleColor = '#facc15';\n                    else roleColor = '#4ade80';\n                    return `\n                    <div class=\"ww-role-row\">\n                        <div style=\"display:flex; align-items:center; gap:10px; flex:1\">\n                            <div class=\"ww-card-icon\" style=\"font-size:2em; margin:0\">${r.icon}<\/div>\n                            <div>\n                                <div style=\"font-weight:bold; font-size:1.1em; color:${roleColor} !important\">${r[app.lang].name}<\/div>\n                                <div style=\"font-size:0.8em; color:#9ca3af !important;\">${r[app.lang].desc.substring(0,35)}...<\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"ww-counter\">\n                            <button class=\"ww-btn-info\" onclick=\"app.showGuide(${i})\">i<\/button>\n                            <button class=\"ww-btn-ghost\" style=\"padding:0; width:36px; height:36px\" onclick=\"app.modRole(${i}, -1)\">-<\/button>\n                            <span style=\"font-weight:bold; min-width:20px; text-align:center; font-size:1.1em\">${r.count}<\/span>\n                            <button class=\"ww-btn-primary\" style=\"padding:0; width:36px; height:36px; margin:0\" onclick=\"app.modRole(${i}, 1)\">+<\/button>\n                        <\/div>\n                    <\/div>\n                `}).join('');\n                app.updateStats();\n            },\n\n            modRole: (i, d) => { if(app.roles[i].count + d >= 0) { app.roles[i].count += d; app.renderRoles(); } },\n            \n            showGuide: (i) => {\n                const r = app.roles[i];\n                document.getElementById('gd-icon').innerText = r.icon;\n                document.getElementById('gd-title').innerText = r[app.lang].name;\n                let color = '#fff';\n                if (r.type === 'bad') color = '#ef4444';\n                else if (r.type === 'neu') color = '#facc15';\n                else color = '#4ade80';\n                document.getElementById('gd-title').style.color = color + \" !important\";\n                document.getElementById('gd-content').innerHTML = `<p style=\"font-weight:bold; color:#fff !important; font-size:1.1em\">${r[app.lang].desc}<\/p><hr style=\"border-color:rgba(255,255,255,0.1); margin:15px 0\"><p style=\"color:#d1d5db !important\">${r[app.lang].guide}<\/p>`;\n                document.getElementById('mod-guide').classList.add('show');\n            },\n\n            updateStats: () => {\n                const txt = document.getElementById('inp-names').value.trim();\n                const pCount = txt ? txt.split('\\n').filter(n=>n.trim()).length : 0;\n                const rCount = app.roles.reduce((a,b)=>a+b.count,0);\n                document.getElementById('st-p').innerText = pCount;\n                document.getElementById('st-c').innerText = rCount;\n                const btn = document.getElementById('btn-next');\n                btn.disabled = (pCount < 3 || pCount !== rCount);\n                btn.innerHTML = (pCount !== rCount) ? `(${pCount} ${app.t('txtPlayer')} \/ ${rCount} ${app.t('txtCard')})` : app.t('btnNext');\n            },\n\n            autoConfig: () => {\n                const txt = document.getElementById('inp-names').value.trim();\n                const names = txt ? txt.split('\\n').filter(n=>n.trim()) : [];\n                if(names.length < 3) return app.alert(app.t('alertMin'));\n                app.roles.forEach(r => r.count = 0);\n                let count = names.length;\n                let wolves = Math.max(1, Math.floor(count \/ 3.5));\n                app.roles.find(r=>r.id==='wolf').count = wolves;\n                if(count >= 5) app.roles.find(r=>r.id==='seer').count = 1;\n                if(count >= 6) app.roles.find(r=>r.id==='guard').count = 1;\n                if(count >= 7) app.roles.find(r=>r.id==='witch').count = 1;\n                if(count >= 8) app.roles.find(r=>r.id==='hunter').count = 1;\n                if(count >= 9) app.roles.find(r=>r.id==='tanner').count = 1;\n                let used = app.roles.reduce((a,b)=>a+b.count,0);\n                app.roles.find(r=>r.id==='villager').count = Math.max(0, count - used);\n                app.renderRoles();\n            },\n\n            goDistribute: () => {\n                const names = document.getElementById('inp-names').value.trim().split('\\n').filter(n=>n.trim());\n                let deck = [];\n                app.roles.forEach(r => { for(let i=0; i<r.count; i++) deck.push({...r}); });\n                deck.sort(() => Math.random() - 0.5);\n                app.players = names.map((n, i) => ({ id: i, name: n, role: deck[i], alive: true, seen: false }));\n                app.switchScr('scr-distribute');\n                app.renderDistribute();\n            },\n\n            renderDistribute: () => {\n                const el = document.getElementById('grid-distribute');\n                const allSeen = app.players.every(p => p.seen);\n                el.innerHTML = app.players.map(p => `\n                    <div class=\"ww-card ${p.seen ? 'dead' : 'active'}\" onclick=\"${p.seen ? '' : `app.openReveal(${p.id})`}\">\n                        <div class=\"ww-card-icon\">${p.seen ? '\u2705' : '\ud83c\udccf'}<\/div>\n                        <div class=\"ww-card-name\" style=\"color:#fff !important\">${p.name}<\/div>\n                        <span class=\"ww-badge bg-neu\">${p.seen ? app.t('txtSeen') : app.t('txtTap')}<\/span>\n                    <\/div>\n                `).join('');\n                if(allSeen) document.getElementById('btn-start').classList.remove('ww-hidden');\n            },\n\n            openReveal: (id) => {\n                app.viewId = id;\n                document.getElementById('rev-name').innerText = app.players[id].name;\n                document.getElementById('card-inner').classList.remove('flipped');\n                document.getElementById('btn-seen').style.display = 'none';\n                document.getElementById('btn-cancel-rev').style.display = 'inline-block';\n                document.getElementById('mod-reveal').classList.add('show');\n            },\n\n            flipCard: () => {\n                const p = app.players[app.viewId];\n                document.getElementById('rev-icon').innerText = p.role.icon;\n                document.getElementById('rev-role').innerText = p.role[app.lang].name;\n                let color = '#fff';\n                if(p.role.type === 'bad') color = '#ef4444';\n                else if(p.role.type === 'neu') color = '#facc15';\n                else color = '#4ade80';\n                document.getElementById('rev-role').style.color = color + ' !important';\n                document.getElementById('rev-role').setAttribute('style', `color: ${color} !important; margin:15px 0; font-size:2.8em; font-weight:900;`);\n                document.getElementById('rev-desc').innerText = p.role[app.lang].desc;\n                document.getElementById('card-inner').classList.add('flipped');\n                document.getElementById('btn-seen').style.display = 'inline-block';\n                document.getElementById('btn-cancel-rev').style.display = 'none';\n            },\n\n            confirmSeen: () => { app.players[app.viewId].seen = true; app.closeModal('mod-reveal'); app.renderDistribute(); },\n            startGame: () => { app.switchScr('scr-manager'); app.log(\"\ud83c\udfc1 START!\"); app.renderManager(); },\n\n            openSettings: () => { document.getElementById('mod-settings').classList.add('show'); app.renderSettings(); },\n            toggleSetting: (key) => { app.settings[key] = !app.settings[key]; app.renderSettings(); if(app.players.length > 0) app.renderManager(); },\n            renderSettings: () => {\n                const updateBtn = (id, val) => {\n                    const btn = document.getElementById(id);\n                    btn.innerText = val ? 'ON' : 'OFF';\n                    btn.style.background = val ? '#8b5cf6' : 'rgba(255,255,255,0.1)';\n                    btn.style.color = val ? 'white' : '#9ca3af';\n                };\n                updateBtn('tog-blind', app.settings.blindMode);\n                updateBtn('tog-dead', app.settings.hideDead);\n            },\n\n            renderManager: () => {\n                const el = document.getElementById('grid-manager');\n                const isBlind = app.settings.blindMode;\n                const hideDead = app.settings.hideDead;\n                el.innerHTML = app.players\n                    .filter(p => !hideDead || p.alive)\n                    .map(p => {\n                        const isDead = !p.alive;\n                        const showRole = isDead || !isBlind;\n                        const roleName = showRole ? p.role[app.lang].name : \"???\";\n                        const roleIcon = showRole ? p.role.icon : \"\u2753\";\n                        let roleColor = '#9ca3af';\n                        if (showRole) {\n                            if (p.role.type === 'bad') roleColor = '#fca5a5';\n                            else if (p.role.type === 'neu') roleColor = '#fcd34d';\n                            else roleColor = '#6ee7b7';\n                        }\n                        return `\n                        <div class=\"ww-card ${isDead ? 'dead' : ''}\">\n                            ${isDead ? '<div class=\"ww-dead-badge\">DEAD<\/div>' : ''}\n                            <div class=\"ww-card-icon\">${roleIcon}<\/div>\n                            <div class=\"ww-card-name\" style=\"margin-bottom:5px; color:#fff !important\">${p.name}<\/div>\n                            <div style=\"font-size:0.9em; color:${roleColor} !important; font-weight:bold\">${roleName}<\/div>\n                            ${!isDead ? `<button class=\"ww-btn ww-btn-danger\" style=\"margin-top:15px; font-size:0.8em; padding:8px\" onclick=\"app.kill(${p.id})\">${app.t('btnKill')}<\/button>` : ''}\n                        <\/div>\n                    `}).join('');\n            },\n\n            confirmAction: (msg, onConfirm) => {\n                document.getElementById('conf-title').innerText = app.t('alertTitle');\n                document.getElementById('conf-msg').innerText = msg;\n                document.getElementById('conf-ok').innerText = app.t('confirmYes');\n                document.getElementById('conf-cancel').innerText = app.t('confirmNo');\n                document.getElementById('mod-confirm').classList.add('show');\n                const newOk = document.getElementById('conf-ok').cloneNode(true);\n                document.getElementById('conf-ok').replaceWith(newOk);\n                newOk.onclick = () => { app.closeModal('mod-confirm'); onConfirm(); };\n            },\n\n            kill: (id) => {\n                app.confirmAction(`${app.t('msgKill')} ${app.players[id].name}?`, () => {\n                    app.players[id].alive = false;\n                    app.log(`\ud83c\udf1e <b>${app.players[id].name}<\/b> ${app.t('msgKill')}`);\n                    if(app.players[id].role.id === 'tanner') { return app.showWin(app.t('winTanner'), `${app.players[id].name} wins!`); }\n                    app.checkWinCondition();\n                    app.renderManager();\n                });\n            },\n\n            confirmEnd: () => { app.confirmAction(app.t('alertEnd'), () => { location.reload(); }); },\n            backSetup: () => { app.confirmAction(app.t('alertLost'), () => { app.switchScr('scr-setup'); }); },\n\n            checkWinCondition: () => {\n                const alive = app.players.filter(p => p.alive);\n                const wolves = alive.filter(p => p.role.type === 'bad' && p.role.id !== 'minion');\n                const others = alive.filter(p => p.role.type !== 'bad' || p.role.id === 'minion');\n                const total = alive.length;\n                if (total === 1 && alive[0].role.id === 'white_wolf') return app.showWin(app.t('winWhite'), alive[0].name);\n                if (total === 1 && alive[0].role.id === 'serial_killer') return app.showWin(app.t('winSK'), alive[0].name);\n                if (wolves.length === 0) return app.showWin(app.t('winVillager'), \"\");\n                if (wolves.length >= others.length) return app.showWin(app.t('winWolf'), \"\");\n            },\n\n            showWin: (title, desc) => {\n                document.getElementById('win-title').innerText = title;\n                document.getElementById('win-desc').innerText = desc;\n                let color = '#10b981';\n                if(title.includes('WOLF') || title.includes('S\u00d3I')) color = '#ef4444';\n                if(title.includes('TANNER') || title.includes('SK') || title.includes('WHITE')) color = '#facc15';\n                document.getElementById('win-title').style.color = color + \" !important\";\n                document.getElementById('mod-win').classList.add('show');\n            },\n\n            startNight: () => {\n                app.night = { step: 0, active: [], data: { wolfTarget: null, guardTarget: null, heal: true, poison: true, witchAct: null, whiteWolfKill: null, killerTarget: null, piperTargets: [] } };\n                const allRoles = app.players.filter(p => p.alive && p.role.p > 0).map(p => p.role.id);\n                if(app.round === 1 && app.players.some(p => p.alive && p.role.id === 'cupid')) allRoles.push('cupid');\n                if(app.round % 2 === 0 && app.players.some(p => p.alive && p.role.id === 'white_wolf')) allRoles.push('white_wolf');\n                if(app.players.some(p => p.alive && (p.role.id === 'wolf' || p.role.id === 'wolf_cub' || p.role.id === 'white_wolf'))) { if(!allRoles.includes('wolf')) allRoles.push('wolf'); }\n                app.night.active = [...new Set(allRoles)].sort((a,b) => app.roles.find(r=>r.id===a).p - app.roles.find(r=>r.id===b).p);\n                if(app.night.active.length === 0) return app.alert(app.t('alertNightEmpty'));\n                document.getElementById('mod-night').classList.add('show');\n                app.processNightStep();\n            },\n\n            processNightStep: () => {\n                const rId = app.night.active[app.night.step];\n                let rInfo = app.roles.find(r=>r.id===rId);\n                const alive = app.players.filter(p=>p.alive);\n                document.getElementById('ni-icon').innerText = rInfo.icon;\n                document.getElementById('ni-title').innerText = rInfo[app.lang].name;\n                document.getElementById('ni-desc').innerText = rInfo[app.lang].desc;\n                const body = document.getElementById('ni-body');\n                const controls = document.getElementById('ni-controls');\n                controls.innerHTML = ''; body.innerHTML = '';\n                let nextCallback = () => true;\n\n                if(rId === 'wolf') {\n                    body.innerHTML = app.t('wolfPick');\n                    controls.innerHTML = `<select id=\"wolf-pick\"><option value=\"\">--<\/option>${alive.filter(p=>!['wolf','white_wolf','wolf_cub'].includes(p.role.id)).map(p=>`<option value=\"${p.id}\">${p.name}<\/option>`).join('')}<\/select>`;\n                    nextCallback = () => { const v = document.getElementById('wolf-pick').value; if(v) app.night.data.wolfTarget = parseInt(v); return true; }\n                } \n                else if(rId === 'seer') {\n                    body.innerHTML = app.t('seerPick');\n                    controls.innerHTML = `<select onchange=\"app.seerReveal(this.value)\"><option value=\"\">--<\/option>${alive.map(p=>`<option value=\"${p.id}\">${p.name}<\/option>`).join('')}<\/select><div id=\"seer-res\" style=\"margin-top:10px; font-weight:bold; color:#fcd34d; font-size:1.2em\"><\/div>`;\n                }\n                else if(rId === 'guard') {\n                    body.innerHTML = app.t('guardPick');\n                    controls.innerHTML = `<select id=\"guard-pick\"><option value=\"-1\">--<\/option>${alive.map(p => p.id === app.night.data.lastGuard ? `<option value=\"${p.id}\" disabled>${p.name}<\/option>` : `<option value=\"${p.id}\">${p.name}<\/option>`).join('')}<\/select>`;\n                    nextCallback = () => { const v = document.getElementById('guard-pick').value; app.night.data.guardTarget = v == -1 ? null : parseInt(v); return true; }\n                }\n                else if(rId === 'witch') {\n                    const victim = app.night.data.wolfTarget !== null ? app.players[app.night.data.wolfTarget].name : \"---\";\n                    body.innerHTML = `<div style=\"background:rgba(239,68,68,0.2); padding:15px; border-radius:10px; border:1px solid #ef4444\">${app.t('witchMsg')} <b style=\"font-size:1.2em\">${victim}<\/b><\/div>`;\n                    let html = '';\n                    if(app.night.data.wolfTarget !== null && app.night.data.heal) html += `<button class=\"ww-btn ww-btn-success\" onclick=\"this.innerText='OK'; this.disabled=true; window.tmpHeal=true;\">${app.t('witchHeal')}<\/button>`;\n                    if(app.night.data.poison) html += `<div style=\"margin-top:15px\"><label>${app.t('witchPoison')}<\/label><select id=\"w-poison\"><option value=\"\">--<\/option>${alive.map(p=>`<option value=\"${p.id}\">${p.name}<\/option>`).join('')}<\/select><\/div>`;\n                    controls.innerHTML = html;\n                    nextCallback = () => {\n                        if(window.tmpHeal) { app.night.data.witchAct = 'heal'; app.night.data.heal = false; window.tmpHeal = false; }\n                        const pv = document.getElementById('w-poison')?.value;\n                        if(pv) { app.night.data.witchAct = 'poison'; app.night.data.poisonTarget = parseInt(pv); app.night.data.poison = false; }\n                        return true;\n                    }\n                }\n                else if(rId === 'white_wolf') {\n                    body.innerHTML = app.t('whitePick');\n                    controls.innerHTML = `<select id=\"ww-pick\"><option value=\"\">--<\/option>${alive.map(p=>`<option value=\"${p.id}\">${p.name}<\/option>`).join('')}<\/select>`;\n                    nextCallback = () => { const v = document.getElementById('ww-pick').value; if(v) app.night.data.whiteWolfKill = parseInt(v); return true; }\n                }\n                else if(rId === 'serial_killer') {\n                    body.innerHTML = app.t('skPick');\n                    controls.innerHTML = `<select id=\"sk-pick\"><option value=\"\">--<\/option>${alive.map(p=>`<option value=\"${p.id}\">${p.name}<\/option>`).join('')}<\/select>`;\n                    nextCallback = () => { const v = document.getElementById('sk-pick').value; if(v) app.night.data.killerTarget = parseInt(v); return true; }\n                }\n                else if(rId === 'cupid') {\n                    body.innerHTML = app.t('cupidPick');\n                    controls.innerHTML = `<select id=\"cp1\"><option>1<\/option>${alive.map(p=>`<option value=\"${p.id}\">${p.name}<\/option>`).join('')}<\/select><select id=\"cp2\" style=\"margin-top:10px\"><option>2<\/option>${alive.map(p=>`<option value=\"${p.id}\">${p.name}<\/option>`).join('')}<\/select>`;\n                }\n                else { controls.innerHTML = `<p class=\"ww-text-dim\">Action...<\/p>`; }\n\n                document.getElementById('ni-next').onclick = () => {\n                    if(nextCallback()) {\n                        app.night.step++;\n                        if(app.night.step >= app.night.active.length) { app.closeModal('mod-night'); app.endNight(); } \n                        else { app.processNightStep(); }\n                    }\n                };\n            },\n\n            seerReveal: (id) => {\n                if(!id) return; const p = app.players[id];\n                const type = p.role.type === 'bad' ? app.t('resBad') : p.role.type === 'neu' ? app.t('resNeu') : app.t('resGood');\n                const color = p.role.type === 'bad' ? '#ef4444' : p.role.type === 'neu' ? '#f59e0b' : '#10b981';\n                document.getElementById('seer-res').innerHTML = `${p.name}: <span style=\"color:${color}\">${type}<\/span>`;\n            },\n\n            endNight: () => {\n                let deaths = [], logs = [];\n                if(app.night.data.wolfTarget !== null) {\n                    let victim = app.night.data.wolfTarget;\n                    let saved = false;\n                    if(app.night.data.guardTarget === victim) { saved = true; logs.push(`${app.t('logGuard')} ${app.players[victim].name}`); }\n                    if(app.night.data.witchAct === 'heal') { saved = true; logs.push(`${app.t('logHeal')} ${app.players[victim].name}`); }\n                    if(!saved) {\n                        deaths.push(victim); logs.push(`${app.t('logWolf')} ${app.players[victim].name}`);\n                        if(app.players[victim].role.id === 'wolf_cub') logs.push(app.t('logCub'));\n                    }\n                }\n                if(app.night.data.poisonTarget) { deaths.push(app.night.data.poisonTarget); logs.push(`${app.t('logPoison')} ${app.players[app.night.data.poisonTarget].name}`); }\n                if(app.night.data.whiteWolfKill) { deaths.push(app.night.data.whiteWolfKill); logs.push(`${app.t('logWhite')} ${app.players[app.night.data.whiteWolfKill].name}`); }\n                if(app.night.data.killerTarget) { deaths.push(app.night.data.killerTarget); logs.push(`${app.t('logSk')} ${app.players[app.night.data.killerTarget].name}`); }\n\n                [...new Set(deaths)].forEach(id => app.players[id].alive = false);\n                app.night.data.lastGuard = app.night.data.guardTarget;\n                app.round++;\n                document.getElementById('val-round').innerText = app.round;\n                logs.forEach(l => app.log(l));\n                app.checkWinCondition();\n                app.renderManager();\n\n                const dNames = [...new Set(deaths)].map(i=>app.players[i].name).join(', ');\n                const msg = dNames ? `<span style=\"color:#ef4444\">${app.t('msgDead')}<\/span><br><b>${dNames}<\/b>` : `<span style=\"color:#10b981\">${app.t('msgSafe')}<\/span>`;\n                app.alert(`<h3>${app.t('msgDay')}<\/h3><br>${msg}`);\n            },\n\n            switchScr: (id) => { ['scr-setup', 'scr-distribute', 'scr-manager'].forEach(s => document.getElementById(s).classList.add('ww-hidden')); document.getElementById(id).classList.remove('ww-hidden'); },\n            closeModal: (id) => document.getElementById(id).classList.remove('show'),\n            alert: (msg) => { document.getElementById('al-body').innerHTML = msg; document.getElementById('mod-alert').classList.add('show'); },\n            log: (msg) => app.logs.unshift(`<div style=\"margin-bottom:5px; border-bottom:1px solid rgba(255,255,255,0.1); padding-bottom:5px\">${msg}<\/div>`),\n            showLog: () => app.alert(`<div style=\"text-align:left; font-size:0.9em; max-height:250px; overflow-y:auto\">${app.logs.join('')}<\/div>`),\n            backSetup: () => { app.confirmAction(app.t('alertLost'), () => { app.switchScr('scr-setup'); }); }\n        };\n\n        app.init();\n    <\/script>\n<\/div><\/div><\/div><div class=\"wpb_wrapper td_block_wrap vc_raw_html tdi_10 \">\n<style scoped>\n\n\/* inline tdc_css att *\/\n\n.tdi_10{\njustify-content:center !important;\ntext-align:center !important;\n}\n\n<\/style><div class=\"td-fix-index\"><script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-7396755811986582\"\n     crossorigin=\"anonymous\"><\/script>\n<!-- 980x120 -->\n<ins class=\"adsbygoogle\"\n     style=\"display:inline-block;width:980px;height:120px\"\n     data-ad-client=\"ca-pub-7396755811986582\"\n     data-ad-slot=\"5970608912\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script><\/div><\/div><div class=\"wpb_wrapper wpb_text_column td_block_wrap td_block_wrap vc_column_text tdi_11  tagdiv-type td-pb-border-top td_block_template_1\"  data-td-block-uid=\"tdi_11\" ><div class=\"td-block-title-wrap\"><\/div><div class=\"td-fix-index\"><h2 data-path-to-node=\"3\"><b data-path-to-node=\"3\" data-index-in-node=\"10\">Werewolf &#8211; Play Mafia\/Werewolf Without Cards!<\/b><\/h2>\n<p data-path-to-node=\"4\">Want to spice up your lunch break with a thrilling game of Werewolf (Mafia) but <b data-path-to-node=\"4\" data-index-in-node=\"80\">forgot the cards<\/b>? Dreading the role of the Moderator because the rules and night phases are too complicated to remember?<\/p>\n<p data-path-to-node=\"6\">This is a <b data-path-to-node=\"6\" data-index-in-node=\"10\">web-based Game Manager &#038; Role Dealer<\/b> designed specifically for casual groups and office breaks. No installation required\u2014just open it on a phone and play!<\/p>\n<p data-path-to-node=\"6\"><img decoding=\"async\" class=\"aligncenter wp-image-8747 size-large\" src=\"https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2026\/01\/Werewolf-Moderator-1024x512.jpg\" alt=\"\" width=\"1024\" height=\"512\" srcset=\"https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2026\/01\/Werewolf-Moderator-1024x512.jpg 1024w, https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2026\/01\/Werewolf-Moderator-300x150.jpg 300w, https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2026\/01\/Werewolf-Moderator-768x384.jpg 768w, https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2026\/01\/Werewolf-Moderator-1536x768.jpg 1536w, https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2026\/01\/Werewolf-Moderator-150x75.jpg 150w, https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2026\/01\/Werewolf-Moderator-696x348.jpg 696w, https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2026\/01\/Werewolf-Moderator-1068x534.jpg 1068w, https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2026\/01\/Werewolf-Moderator-1920x960.jpg 1920w, https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2026\/01\/Werewolf-Moderator.jpg 2000w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h2 data-path-to-node=\"6\"><strong>USER GUIDE<\/strong><\/h2>\n<h3 data-path-to-node=\"13\">STEP 1: SETUP<\/h3>\n<ol start=\"1\" data-path-to-node=\"14\">\n<li>\n<p data-path-to-node=\"14,0,0\"><b data-path-to-node=\"14,0,0\" data-index-in-node=\"0\">Enter Names:<\/b> Type the names of all players into the text box (one name per line).\n<\/li>\n<li>\n<p data-path-to-node=\"14,1,0\"><b data-path-to-node=\"14,1,0\" data-index-in-node=\"0\">Configure Roles:<\/b><\/p>\n<ul data-path-to-node=\"14,1,1\">\n<li>\n<p data-path-to-node=\"14,1,1,0,0\">Click <b data-path-to-node=\"14,1,1,0,0\" data-index-in-node=\"6\">&#8220;\u2699\ufe0f Auto Config&#8221;<\/b> to let the system recommend a balanced setup.\n<\/li>\n<li>\n<p data-path-to-node=\"14,1,1,1,0\">Or manually adjust the number of Seers, Wolves, Witches, etc., in the <i data-path-to-node=\"14,1,1,1,0\" data-index-in-node=\"70\">Special Roles<\/i> section.\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p data-path-to-node=\"14,2,0\">Click <b data-path-to-node=\"14,2,0\" data-index-in-node=\"6\">&#8220;DISTRIBUTE CARDS&#8221;<\/b> to proceed.\n<\/li>\n<\/ol>\n<h3 data-path-to-node=\"15\">STEP 2: SECRET DEAL (Pass the Phone)<\/h3>\n<p data-path-to-node=\"16\"><i data-path-to-node=\"16\" data-index-in-node=\"0\">This replaces physical cards.<\/i><\/p>\n<ol start=\"1\" data-path-to-node=\"17\">\n<li>\n<p data-path-to-node=\"17,0,0\">The Host hands the phone to the player whose name appears on the screen.\n<\/li>\n<li>\n<p data-path-to-node=\"17,1,0\">The player ensures no one is peeking, then taps the card to <b data-path-to-node=\"17,1,0\" data-index-in-node=\"60\">Reveal Role<\/b>.\n<\/li>\n<li>\n<p data-path-to-node=\"17,2,0\">After memorizing their role (e.g., &#8220;You are a Werewolf&#8221;), they click <b data-path-to-node=\"17,2,0\" data-index-in-node=\"69\">&#8220;OK&#8221;<\/b> to hide it.\n<\/li>\n<li>\n<p data-path-to-node=\"17,3,0\">Pass the phone to the next person on the list.\n<\/li>\n<li>\n<p data-path-to-node=\"17,4,0\">Once everyone has seen their role, the Host takes the phone back and clicks <b data-path-to-node=\"17,4,0\" data-index-in-node=\"76\">&#8220;\ud83d\udc51 START GAME&#8221;<\/b>.\n<\/li>\n<\/ol>\n<h3 data-path-to-node=\"18\">STEP 3: GAME MANAGER (The Host)<\/h3>\n<p data-path-to-node=\"19\">The interface now switches to the Manager Dashboard.<\/p>\n<p data-path-to-node=\"20\"><b data-path-to-node=\"20\" data-index-in-node=\"0\">\ud83c\udf1e DAY PHASE:<\/b><\/p>\n<ul data-path-to-node=\"21\">\n<li>\n<p data-path-to-node=\"21,0,0\">Players discuss to find the Wolves.\n<\/li>\n<li>\n<p data-path-to-node=\"21,1,0\">If the village votes to eliminate someone, the Host clicks the <b data-path-to-node=\"21,1,0\" data-index-in-node=\"63\">&#8220;\u2620\ufe0f EXECUTE&#8221;<\/b> button on that player&#8217;s card.\n<\/li>\n<li>\n<p data-path-to-node=\"21,2,0\">The dead player&#8217;s card will turn dark and show a &#8220;DEAD&#8221; stamp.\n<\/li>\n<\/ul>\n<p data-path-to-node=\"22\"><b data-path-to-node=\"22\" data-index-in-node=\"0\">\ud83c\udf19 NIGHT PHASE:<\/b><\/p>\n<ol start=\"1\" data-path-to-node=\"23\">\n<li>\n<p data-path-to-node=\"23,0,0\">The Host clicks <b data-path-to-node=\"23,0,0\" data-index-in-node=\"16\">&#8220;\ud83c\udf19 START NIGHT&#8221;<\/b>.\n<\/li>\n<li>\n<p data-path-to-node=\"23,1,0\">The app guides the Host through each active role via popup dialogs:<\/p>\n<ul data-path-to-node=\"23,1,1\">\n<li>\n<p data-path-to-node=\"23,1,1,0,0\"><b data-path-to-node=\"23,1,1,0,0\" data-index-in-node=\"0\">Wolves:<\/b> Ask &#8220;Who do you want to kill?&#8221; -> Select target -> Click Next.\n<\/li>\n<li>\n<p data-path-to-node=\"23,1,1,1,0\"><b data-path-to-node=\"23,1,1,1,0\" data-index-in-node=\"0\">Seer:<\/b> Select a player to check -> App reveals if they are &#8220;GOOD&#8221; or &#8220;EVIL&#8221; -> Signal the Seer silently.\n<\/li>\n<li>\n<p data-path-to-node=\"23,1,1,2,0\"><b data-path-to-node=\"23,1,1,2,0\" data-index-in-node=\"0\">Witch\/Guard:<\/b> Select targets for potions or protection.\n<\/li>\n<li>\n<p data-path-to-node=\"23,1,1,3,0\"><i data-path-to-node=\"23,1,1,3,0\" data-index-in-node=\"0\">Note:<\/i> The app skips roles that are dead or not in the game.\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p data-path-to-node=\"23,2,0\">Once the night sequence ends, a <b data-path-to-node=\"23,2,0\" data-index-in-node=\"32\">&#8220;SUNRISE&#8221;<\/b> screen appears with the results (Who died, who survived). Read this aloud to the village.\n<\/li>\n<\/ol>\n<h3 data-path-to-node=\"24\">\ud83d\udca1 TIPS<\/h3>\n<ul data-path-to-node=\"25\">\n<li>\n<p data-path-to-node=\"25,0,0\"><b data-path-to-node=\"25,0,0\" data-index-in-node=\"0\">Settings (Gear Icon):<\/b> Enable <b data-path-to-node=\"25,0,0\" data-index-in-node=\"29\">&#8220;Blind Manager Mode&#8221;<\/b> if the Host wants to play along! Roles on the manager screen will be hidden as <code data-path-to-node=\"25,0,0\" data-index-in-node=\"129\">???<\/code> (only revealed when a player dies).\n<\/li>\n<li>\n<p data-path-to-node=\"25,1,0\"><b data-path-to-node=\"25,1,0\" data-index-in-node=\"0\">Game Log:<\/b> Click <b data-path-to-node=\"25,1,0\" data-index-in-node=\"16\">&#8220;\ud83d\udcdc Log&#8221;<\/b> to see a history of events (who killed whom, who saved whom) in case you forget.\n<\/li>\n<\/ul>\n<\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":8747,"parent":4298,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-8715","page","type-page","status-publish","has-post-thumbnail"],"rankMath":{"parentDomain":"ezcalculatoronline.com","noFollowDomains":[],"noFollowExcludeDomains":[],"noFollowExternalLinks":false,"featuredImageNotice":"The featured image should be at least 200 by 200 pixels to be picked up by Facebook and other social media sites.","pluginReviewed":false,"postSettings":{"linkSuggestions":true,"useFocusKeyword":false},"frontEndScore":false,"postName":"werewolf-game-moderator","permalinkFormat":"https:\/\/www.ezcalculatoronline.com\/%pagename%\/","showLockModifiedDate":true,"assessor":{"focusKeywordLink":"https:\/\/www.ezcalculatoronline.com\/wp-admin\/edit.php?focus_keyword=%focus_keyword%&post_type=%post_type%","hasTOCPlugin":false,"primaryTaxonomy":false,"serpData":{"title":"Werewolf Game Manager - Auto Moderator &amp; Role Dealer","description":"The ultimate Werewolf moderator tool. Features pass-and-play secret roles, automated night sequence, and win detection. Play for free on any device.","focusKeywords":"Werewolf","pillarContent":false,"canonicalUrl":"","breadcrumbTitle":"","advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":"","facebookHasOverlay":false,"facebookImageOverlay":"","facebookAuthor":"","twitterCardType":"","twitterUseFacebook":true,"twitterTitle":"","twitterDescription":"","twitterImage":"","twitterImageID":"","twitterHasOverlay":false,"twitterImageOverlay":"","twitterPlayerUrl":"","twitterPlayerSize":"","twitterPlayerStream":"","twitterPlayerStreamCtype":"","twitterAppDescription":"","twitterAppIphoneName":"","twitterAppIphoneID":"","twitterAppIphoneUrl":"","twitterAppIpadName":"","twitterAppIpadID":"","twitterAppIpadUrl":"","twitterAppGoogleplayName":"","twitterAppGoogleplayID":"","twitterAppGoogleplayUrl":"","twitterAppCountry":"","robots":{"index":true},"twitterAuthor":"username","primaryTerm":0,"authorName":"Thien Nguyen","titleTemplate":"%title% %sep% %sitename%","descriptionTemplate":"%excerpt%","showScoreFrontend":true,"lockModifiedDate":false},"powerWords":["a cut above","absolute","absolutely","absolutely lowest","absurd","abuse","accurate","accuse","achieve","actionable","adaptable","adequate","admit","adorable","advantage","advice","affordable","aggravate","aggressive","agitated","agonizing","agony","alarmed","alarming","alienated","aligned","alive","all-inclusive","alluring","always","amazing","amp","animated","annihilate","announcing","anonymous","antagonistic","anxious","apocalypse","appalled","approved","approving","argumentative","armageddon","arrogant","ass kicking","assault","assured","astonishing","astounded","astounding","at ease","atrocious","attack","attractive","audacity","authentic","authoritative","authority","avoid","aware","awe-inspiring","awesome","awkward","backbone","backdoor","backed","backlash","backstabbing","badass","balanced","banned","bargain","barrage","basic","battle","beaming","beat down","beating","beautiful","beauty","begging","behind the scenes","belief","belong","best","best-selling","better","beware","big","billion","black market","blacklisted","blast","blessed","blinded","blissful","blood","bloodbath","bloodcurdling","bloody","blunder","blushing","bold","bomb","bona","bona fide","bonanza","bonus","bootleg","bottom line","bountiful","brave","bravery","brazen","break","breaking","breakthrough","breathtaking","bright","brilliant","broke","brutal","budget","buffoon","bullshit","bully","bumbling","buy","cadaver","calm","cancel anytime","capable","captivate","captivating","carefree","case study","cash","cataclysmic","catapult","catastrophe","caution","censored","centered","certain","certainly","certified","challenge","charming","cheap","cheat","cheat-sheet","cheer","cheerful","child-like","clarity","classified","clear","clueless","collapse","colorful","colossal","comfortable","compare","competitive","complete","completely","completeness","comprehensive","compromise","compulsive","concealed","conclusive","condemning","condescending","confess","confession","confessions","confident","confidential","conquer","conscientious","constructive","content","contrary","controlling","controversial","convenient","convert","cool","cooperative","copy","corpse","corrupt","corrupting","courage","courageous","cover-up","covert","coward","cowardly","crammed","crave","crazy","create","creative","cringeworthy","cripple","crisis","critical","crooked","crush","crushing","damaging","danger","dangerous","daring","dazzling","dead","deadline","deadly","death","decadent","deceived","deceptive","deep","defiance","definitely","definitive","defying","dejected","delicious","delight","delighted","delightful","delirious","delivered","demoralizing","deplorable","depraved","desire","desperate","despicable","destiny","destroy","detailed","devastating","devoted","diagnosed","direct","dirty","disadvantages","disastrous","discount","discover","disdainful","disempowered","disgusted","disgusting","dishonest","disillusioned","disoriented","distracted","distraught","distressed","distrustful","divulge","document","dollar","dominate","doomed","double","doubtful","download","dreadful","dreamy","drive","drowning","dumb","dynamic","eager","earnest","easily","easy","economical","ecstatic","edge","effective","efficient","effortless","elated","eliminate","elite","embarrass","embarrassed","embarrassing","emergency","emerging","emphasize","empowered","enchant","encouraged","endorsed","energetic","energy","enormous","enraged","enthusiastic","envy","epic","epidemic","essential","ethical","euphoric","evil","exactly","exasperated","excellent","excited","excitement","exciting","exclusive","exclusivity","excruciating","exhilarated","expensive","expert","explode","exploit","explosive","exposed","exquisite","extra","extraordinary","extremely","exuberant","eye-opening","fail","fail-proof","failure","faith","famous","fantasy","fascinating","fatigued","faux","faux pas","fearless","feast","feeble","festive","fide","fierce","fight","final","fine","fired","first","first ever","flirt","fluid","focus","focused","fool","fooled","foolish","forbidden","force-fed","forever","forgiving","forgotten","formula","fortune","foul","frantic","free","freebie","freedom","frenzied","frenzy","frightening","frisky","frugal","frustrated","fulfill","fulfilled","full","fully","fun","fun-loving","fundamentals","funniest","funny","furious","gambling","gargantuan","genius","genuine","gift","gigantic","giveaway","glamorous","gleeful","glorious","glowing","goddamn","gorgeous","graceful","grateful","gratified","gravity","great","greatest","greatness","greed","greedy","gripping","grit","grounded","growth","guaranteed","guilt","guilt-free","gullible","guts","hack","happiness","happy","harmful","harsh","hate","have you heard","havoc","hazardous","healthy","heart","heartbreaking","heartwarming","heavenly","hell","helpful","helplessness","hero","hesitant","hidden","high tech","highest","highly effective","hilarious","hoak","hoax","honest","honored","hope","hopeful","horribly","horrific","horrifying","horror","hostile","how to","huge","humility","humor","hurricane","hurry","hypnotic","idiot","ignite","illegal","illusive","imagination","immediately","imminently","impatience","impatient","impenetrable","important","impressive","improved","in the zone","incapable","incapacitated","incompetent","inconsiderate","increase","incredible","indecisive","indulgence","indulgent","inexpensive","inferior","informative","infuriated","ingredients","innocent","innovative","insane","insecure","insider","insidious","inspired","inspiring","instant savings","instantly","instructive","insult","intel","intelligent","intense","interesting","intriguing","introducing","invasion","investment","iron-clad","ironclad","irresistible","irs","is here","jackpot","jail","jaw-dropping","jealous","jeopardy","jittery","jovial","joyous","jubilant","judgmental","jumpstart","just arrived","keen","kickass","kickstart","kill","killed","killing","kills","know it all","lame","largest","lascivious","last","last chance","last minute","latest","laugh","laughing","launch","launching","lavishly","lawsuit","lazy","left behind","legendary","legitimate","liberal","liberated","lick","lies","life-changing","lifetime","light","lighthearted","likely","limited","literally","little-known","loathsome","lonely","looming","loser","lost","love","lucrative","lunatic","lurking","lust","luxurious","luxury","lying","magic","magical","magnificent","mainstream","malicious","mammoth","manipulative","marked down","massive","master","masterclass","maul","mediocre","meditative","meltdown","memorability","memorable","menacing","mesmerizing","meticulous","mind-blowing","minimalist","miracle","mired","mischievous","misgiving","missing out","mistake","monetize","money","moneyback","moneygrubbing","monumental","most important","motivated","mouth-watering","murder","mystery","nail","naked","natural","naughty","nazi","nest egg","never","new","nightmare","no good","no obligation","no one talks about","no questions asked","no risk","no strings attached","non-controlling","noted","novelty","now","obnoxious","obsessed","obsession","obvious","odd","off-kilter","off-limits","off-the record","offensive","official","okay","on-demand","open-minded","opportunities","optimistic","ordeal","outlawed","outrageousness","outstanding","overcome","overjoyed","overnight","overwhelmed","packed","painful","painless","painstaking","pale","panic","panicked","paralyzed","pas","passionate","pathetic","pay zero","payback","perfect","peril","perplexed","perspective","pessimistic","pioneering","piranha","pitfall","pitiful","placid","plague","played","playful","pleased","pluck","plummet","plunge","poison","poisonous","polarizing","poor","popular","portfolio","pound","powerful","powerless","practical","preposterous","prestige","price","priceless","pride","prison","privacy","private","privileged","prize","problem","productive","professional","profit","profitable","profound","promiscuous","promising","promote","protect","protected","proven","provocative","provoke","psychological","pummel","punch","punish","pus","quadruple","quality","quarrelsome","quick","quick-start","quickly","quiet","radiant","rare","ravenous","rebellious","recession-proof","reckoning","recognized","recommend","recreate","reduced","reflective","refugee","refund","refundable","reject","relaxed","release","relentless","reliable","remarkable","replicate","report","reprimanding","repulsed","repulsive","research","resentful","resourceful","responsible","responsive","rested","restricted","results","retaliating","reveal","revealing","revenge","revengeful","revisited","revolting","revolutionary","reward","rich","ridiculous","risky","riveting","rookie","rowdy","ruin","rules","ruthless","sabotaging","sacred","sadistic","sadly","sadness","safe","safety","sale","sampler","sarcastic","satisfied","savage","savagery","save","savings","savvy","scam","scandal","scandalous","scarce","scared","scary","scornful","scream","searing","secret","secret agenda","secret plot","secrets","secure","security","seductive","seething","seize","selected","self-hating","self-sufficient","sensational","senseless","sensual","serene","seriously","severe","sex","sexy","shaking","shameful","shameless","shaming","shatter","shellacking","shocking","should","shrewd","sick and tired","signs","silly","simple","simplicity","simplified","simplistic","sincere","sinful","sins","six-figure","sizable","sizzle","sizzled","sizzles","sizzling","sizzlingly","skill","skyrocket","slaughter","slave","sleazy","sleeping","sly","smash","smiling","smug","smuggle","smuggled","sneak-peek","sneaky","sniveling","snob","snooty","snotty","soar","soaring","solid","solution","spank","special","spectacular","speedy","spell-binding","spine","spirit","spirited","spiteful","spoiler","spontaneous","spotlight","spunky","squirming","stable","staggering","startling","steady","steal","stealthy","steamy","step-by-step","still","stoic","stop","strange","strangle","strategy","stressed","strong","strongly suggest","struggle","stuck up","studies","stunning","stupid","stupid-simple","sturdy","sublime","succeed","success","successful","suck","suddenly","suffer","sunny","super","super-human","superb","supercharge","superior","supported","supportive","sure","sure fire","surefire","surge","surging","surprise","surprised","surprising","survival","survive","suspicious","sweaty","swoon","swoon-worthy","tailspin","tank","tantalizing","targeted","tawdry","tease","technology","teetering","tempting","tenacious","tense","terrible","terrific","terrified","terrifying","terror","terrorist","tested","thankful","the truth","threaten","threatened","thrilled","thrilling","thug","ticked off","tickled","timely","today","torture","toxic","track record","trade secret","tragedy","tragic","transform","transparency","trap","trapped","trauma","traumatized","treacherous","treasure","tremendous","trend","tricks","triggers","triple","triumph","truly","trusting","trustworthy","truth","truthful","turbo-charge","turbocharges","tweaks","twitching","ultimate","unadulterated","unassuming","unauthorized","unbelievable","unburdened","uncaring","uncensored","uncertain","uncomfortable","unconditional","uncontrollable","unconventional","uncovered","undeniable","under priced","undercover","underground","underhanded","underused","unexpected","unforgettable","unheard of","unhurried","uninterested","unique","unjustified","unknowingly","unleashed","unlimited","unlock","unparalleled","unpopular","unreliable","unresponsive","unseen","unstable","unstoppable","unsure","unsurpassed","untapped","unusual","up-sell","upbeat","uplifted","uplifting","urge","urgent","useful","useless","validate","valor","valuable","value","vanquish","vaporize","venomous","verify","vibrant","vicious","victim","victory","vigorous","vilified","vindictive","violated","violent","volatile","vulnerable","waiting","wanted","wanton","warning","waste","weak","wealth","weird","what no one tells you","whip","whopping","wicked","wild","willpower","withheld","wonderful","wondrous","woozy","world","worry","worst","worthwhile","wounded","wreaking","youthful","zen","zinger"],"diacritics":{"A":"[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]","AA":"[\\uA732]","AE":"[\\u00C6\\u01FC\\u01E2]","AO":"[\\uA734]","AU":"[\\uA736]","AV":"[\\uA738\\uA73A]","AY":"[\\uA73C]","B":"[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]","C":"[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]","D":"[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]","DZ":"[\\u01F1\\u01C4]","Dz":"[\\u01F2\\u01C5]","E":"[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]","F":"[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]","G":"[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]","H":"[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]","I":"[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]","J":"[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]","K":"[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]","L":"[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]","LJ":"[\\u01C7]","Lj":"[\\u01C8]","M":"[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]","N":"[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]","NJ":"[\\u01CA]","Nj":"[\\u01CB]","O":"[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]","OI":"[\\u01A2]","OO":"[\\uA74E]","OU":"[\\u0222]","P":"[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]","Q":"[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]","R":"[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]","S":"[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]","T":"[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]","TZ":"[\\uA728]","U":"[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]","V":"[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]","VY":"[\\uA760]","W":"[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]","X":"[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]","Y":"[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]","Z":"[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]","a":"[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]","aa":"[\\uA733]","ae":"[\\u00E6\\u01FD\\u01E3]","ao":"[\\uA735]","au":"[\\uA737]","av":"[\\uA739\\uA73B]","ay":"[\\uA73D]","b":"[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]","c":"[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]","d":"[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]","dz":"[\\u01F3\\u01C6]","e":"[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]","f":"[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]","g":"[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]","h":"[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]","hv":"[\\u0195]","i":"[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]","j":"[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]","k":"[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]","l":"[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]","lj":"[\\u01C9]","m":"[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]","n":"[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]","nj":"[\\u01CC]","o":"[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]","oi":"[\\u01A3]","ou":"[\\u0223]","oo":"[\\uA74F]","p":"[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]","q":"[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]","r":"[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]","s":"[\\u0073\\u24E2\\uFF53\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]","ss":"[\\u00DF]","t":"[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]","tz":"[\\uA729]","u":"[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]","v":"[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]","vy":"[\\uA761]","w":"[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]","x":"[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]","y":"[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]","z":"[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]"},"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasRedirection":true,"hasBreadcrumb":true},"homeUrl":"https:\/\/www.ezcalculatoronline.com","objectID":8715,"objectType":"post","locale":"en","localeFull":"en_US","overlayImages":{"play":{"name":"Play icon","url":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","path":"\/home\/dh_7btfqe\/ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","position":"middle_center"},"gif":{"name":"GIF icon","url":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","path":"\/home\/dh_7btfqe\/ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","position":"middle_center"}},"defautOgImage":"https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2025\/11\/EZCALCULATORONLINE-LOGO-2.png","customPermalinks":true,"isUserRegistered":false,"autoSuggestKeywords":false,"connectSiteUrl":"https:\/\/rankmath.com\/auth?site=https%3A%2F%2Fwww.ezcalculatoronline.com&r=https%3A%2F%2Fwww.ezcalculatoronline.com%2Fpl%2Fwp-json%2Fwp%2Fv2%2Fpages%2F8715%3Fnonce%3D06fb8472c0","maxTags":5,"trendsIcon":"<svg viewBox=\"0 0 610 610\"><path d=\"M18.85,446,174.32,290.48l58.08,58.08L76.93,504a14.54,14.54,0,0,1-20.55,0L18.83,466.48a14.54,14.54,0,0,1,0-20.55Z\" style=\"fill:#4285f4\"\/><path d=\"M242.65,242.66,377.59,377.6l-47.75,47.75a14.54,14.54,0,0,1-20.55,0L174.37,290.43l47.75-47.75A14.52,14.52,0,0,1,242.65,242.66Z\" style=\"fill:#ea4335\"\/><polygon points=\"319.53 319.53 479.26 159.8 537.34 217.88 377.61 377.62 319.53 319.53\" style=\"fill:#fabb05\"\/><path d=\"M594.26,262.73V118.61h0a16.94,16.94,0,0,0-16.94-16.94H433.2a16.94,16.94,0,0,0-12,28.92L565.34,274.71h0a16.94,16.94,0,0,0,28.92-12Z\" style=\"fill:#34a853\"\/><rect width=\"610\" height=\"610\" style=\"fill:none\"\/><\/svg>","showScore":true,"siteFavIcon":"https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2025\/05\/cropped-ezcaculator-32x32.webp","canUser":{"general":false,"advanced":false,"snippet":false,"social":false,"analysis":false,"analytics":false,"content_ai":false},"showKeywordIntent":true,"isPro":false,"is_front_page":false,"trendsUpgradeLink":"https:\/\/rankmath.com\/pricing\/?utm_source=Plugin&utm_medium=CE%20General%20Tab%20Trends&utm_campaign=WP","trendsUpgradeLabel":"Upgrade","trendsPreviewImage":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/trends-preview.jpg","currentEditor":false,"homepageData":{"assessor":{"powerWords":["a cut above","absolute","absolutely","absolutely lowest","absurd","abuse","accurate","accuse","achieve","actionable","adaptable","adequate","admit","adorable","advantage","advice","affordable","aggravate","aggressive","agitated","agonizing","agony","alarmed","alarming","alienated","aligned","alive","all-inclusive","alluring","always","amazing","amp","animated","annihilate","announcing","anonymous","antagonistic","anxious","apocalypse","appalled","approved","approving","argumentative","armageddon","arrogant","ass kicking","assault","assured","astonishing","astounded","astounding","at ease","atrocious","attack","attractive","audacity","authentic","authoritative","authority","avoid","aware","awe-inspiring","awesome","awkward","backbone","backdoor","backed","backlash","backstabbing","badass","balanced","banned","bargain","barrage","basic","battle","beaming","beat down","beating","beautiful","beauty","begging","behind the scenes","belief","belong","best","best-selling","better","beware","big","billion","black market","blacklisted","blast","blessed","blinded","blissful","blood","bloodbath","bloodcurdling","bloody","blunder","blushing","bold","bomb","bona","bona fide","bonanza","bonus","bootleg","bottom line","bountiful","brave","bravery","brazen","break","breaking","breakthrough","breathtaking","bright","brilliant","broke","brutal","budget","buffoon","bullshit","bully","bumbling","buy","cadaver","calm","cancel anytime","capable","captivate","captivating","carefree","case study","cash","cataclysmic","catapult","catastrophe","caution","censored","centered","certain","certainly","certified","challenge","charming","cheap","cheat","cheat-sheet","cheer","cheerful","child-like","clarity","classified","clear","clueless","collapse","colorful","colossal","comfortable","compare","competitive","complete","completely","completeness","comprehensive","compromise","compulsive","concealed","conclusive","condemning","condescending","confess","confession","confessions","confident","confidential","conquer","conscientious","constructive","content","contrary","controlling","controversial","convenient","convert","cool","cooperative","copy","corpse","corrupt","corrupting","courage","courageous","cover-up","covert","coward","cowardly","crammed","crave","crazy","create","creative","cringeworthy","cripple","crisis","critical","crooked","crush","crushing","damaging","danger","dangerous","daring","dazzling","dead","deadline","deadly","death","decadent","deceived","deceptive","deep","defiance","definitely","definitive","defying","dejected","delicious","delight","delighted","delightful","delirious","delivered","demoralizing","deplorable","depraved","desire","desperate","despicable","destiny","destroy","detailed","devastating","devoted","diagnosed","direct","dirty","disadvantages","disastrous","discount","discover","disdainful","disempowered","disgusted","disgusting","dishonest","disillusioned","disoriented","distracted","distraught","distressed","distrustful","divulge","document","dollar","dominate","doomed","double","doubtful","download","dreadful","dreamy","drive","drowning","dumb","dynamic","eager","earnest","easily","easy","economical","ecstatic","edge","effective","efficient","effortless","elated","eliminate","elite","embarrass","embarrassed","embarrassing","emergency","emerging","emphasize","empowered","enchant","encouraged","endorsed","energetic","energy","enormous","enraged","enthusiastic","envy","epic","epidemic","essential","ethical","euphoric","evil","exactly","exasperated","excellent","excited","excitement","exciting","exclusive","exclusivity","excruciating","exhilarated","expensive","expert","explode","exploit","explosive","exposed","exquisite","extra","extraordinary","extremely","exuberant","eye-opening","fail","fail-proof","failure","faith","famous","fantasy","fascinating","fatigued","faux","faux pas","fearless","feast","feeble","festive","fide","fierce","fight","final","fine","fired","first","first ever","flirt","fluid","focus","focused","fool","fooled","foolish","forbidden","force-fed","forever","forgiving","forgotten","formula","fortune","foul","frantic","free","freebie","freedom","frenzied","frenzy","frightening","frisky","frugal","frustrated","fulfill","fulfilled","full","fully","fun","fun-loving","fundamentals","funniest","funny","furious","gambling","gargantuan","genius","genuine","gift","gigantic","giveaway","glamorous","gleeful","glorious","glowing","goddamn","gorgeous","graceful","grateful","gratified","gravity","great","greatest","greatness","greed","greedy","gripping","grit","grounded","growth","guaranteed","guilt","guilt-free","gullible","guts","hack","happiness","happy","harmful","harsh","hate","have you heard","havoc","hazardous","healthy","heart","heartbreaking","heartwarming","heavenly","hell","helpful","helplessness","hero","hesitant","hidden","high tech","highest","highly effective","hilarious","hoak","hoax","honest","honored","hope","hopeful","horribly","horrific","horrifying","horror","hostile","how to","huge","humility","humor","hurricane","hurry","hypnotic","idiot","ignite","illegal","illusive","imagination","immediately","imminently","impatience","impatient","impenetrable","important","impressive","improved","in the zone","incapable","incapacitated","incompetent","inconsiderate","increase","incredible","indecisive","indulgence","indulgent","inexpensive","inferior","informative","infuriated","ingredients","innocent","innovative","insane","insecure","insider","insidious","inspired","inspiring","instant savings","instantly","instructive","insult","intel","intelligent","intense","interesting","intriguing","introducing","invasion","investment","iron-clad","ironclad","irresistible","irs","is here","jackpot","jail","jaw-dropping","jealous","jeopardy","jittery","jovial","joyous","jubilant","judgmental","jumpstart","just arrived","keen","kickass","kickstart","kill","killed","killing","kills","know it all","lame","largest","lascivious","last","last chance","last minute","latest","laugh","laughing","launch","launching","lavishly","lawsuit","lazy","left behind","legendary","legitimate","liberal","liberated","lick","lies","life-changing","lifetime","light","lighthearted","likely","limited","literally","little-known","loathsome","lonely","looming","loser","lost","love","lucrative","lunatic","lurking","lust","luxurious","luxury","lying","magic","magical","magnificent","mainstream","malicious","mammoth","manipulative","marked down","massive","master","masterclass","maul","mediocre","meditative","meltdown","memorability","memorable","menacing","mesmerizing","meticulous","mind-blowing","minimalist","miracle","mired","mischievous","misgiving","missing out","mistake","monetize","money","moneyback","moneygrubbing","monumental","most important","motivated","mouth-watering","murder","mystery","nail","naked","natural","naughty","nazi","nest egg","never","new","nightmare","no good","no obligation","no one talks about","no questions asked","no risk","no strings attached","non-controlling","noted","novelty","now","obnoxious","obsessed","obsession","obvious","odd","off-kilter","off-limits","off-the record","offensive","official","okay","on-demand","open-minded","opportunities","optimistic","ordeal","outlawed","outrageousness","outstanding","overcome","overjoyed","overnight","overwhelmed","packed","painful","painless","painstaking","pale","panic","panicked","paralyzed","pas","passionate","pathetic","pay zero","payback","perfect","peril","perplexed","perspective","pessimistic","pioneering","piranha","pitfall","pitiful","placid","plague","played","playful","pleased","pluck","plummet","plunge","poison","poisonous","polarizing","poor","popular","portfolio","pound","powerful","powerless","practical","preposterous","prestige","price","priceless","pride","prison","privacy","private","privileged","prize","problem","productive","professional","profit","profitable","profound","promiscuous","promising","promote","protect","protected","proven","provocative","provoke","psychological","pummel","punch","punish","pus","quadruple","quality","quarrelsome","quick","quick-start","quickly","quiet","radiant","rare","ravenous","rebellious","recession-proof","reckoning","recognized","recommend","recreate","reduced","reflective","refugee","refund","refundable","reject","relaxed","release","relentless","reliable","remarkable","replicate","report","reprimanding","repulsed","repulsive","research","resentful","resourceful","responsible","responsive","rested","restricted","results","retaliating","reveal","revealing","revenge","revengeful","revisited","revolting","revolutionary","reward","rich","ridiculous","risky","riveting","rookie","rowdy","ruin","rules","ruthless","sabotaging","sacred","sadistic","sadly","sadness","safe","safety","sale","sampler","sarcastic","satisfied","savage","savagery","save","savings","savvy","scam","scandal","scandalous","scarce","scared","scary","scornful","scream","searing","secret","secret agenda","secret plot","secrets","secure","security","seductive","seething","seize","selected","self-hating","self-sufficient","sensational","senseless","sensual","serene","seriously","severe","sex","sexy","shaking","shameful","shameless","shaming","shatter","shellacking","shocking","should","shrewd","sick and tired","signs","silly","simple","simplicity","simplified","simplistic","sincere","sinful","sins","six-figure","sizable","sizzle","sizzled","sizzles","sizzling","sizzlingly","skill","skyrocket","slaughter","slave","sleazy","sleeping","sly","smash","smiling","smug","smuggle","smuggled","sneak-peek","sneaky","sniveling","snob","snooty","snotty","soar","soaring","solid","solution","spank","special","spectacular","speedy","spell-binding","spine","spirit","spirited","spiteful","spoiler","spontaneous","spotlight","spunky","squirming","stable","staggering","startling","steady","steal","stealthy","steamy","step-by-step","still","stoic","stop","strange","strangle","strategy","stressed","strong","strongly suggest","struggle","stuck up","studies","stunning","stupid","stupid-simple","sturdy","sublime","succeed","success","successful","suck","suddenly","suffer","sunny","super","super-human","superb","supercharge","superior","supported","supportive","sure","sure fire","surefire","surge","surging","surprise","surprised","surprising","survival","survive","suspicious","sweaty","swoon","swoon-worthy","tailspin","tank","tantalizing","targeted","tawdry","tease","technology","teetering","tempting","tenacious","tense","terrible","terrific","terrified","terrifying","terror","terrorist","tested","thankful","the truth","threaten","threatened","thrilled","thrilling","thug","ticked off","tickled","timely","today","torture","toxic","track record","trade secret","tragedy","tragic","transform","transparency","trap","trapped","trauma","traumatized","treacherous","treasure","tremendous","trend","tricks","triggers","triple","triumph","truly","trusting","trustworthy","truth","truthful","turbo-charge","turbocharges","tweaks","twitching","ultimate","unadulterated","unassuming","unauthorized","unbelievable","unburdened","uncaring","uncensored","uncertain","uncomfortable","unconditional","uncontrollable","unconventional","uncovered","undeniable","under priced","undercover","underground","underhanded","underused","unexpected","unforgettable","unheard of","unhurried","uninterested","unique","unjustified","unknowingly","unleashed","unlimited","unlock","unparalleled","unpopular","unreliable","unresponsive","unseen","unstable","unstoppable","unsure","unsurpassed","untapped","unusual","up-sell","upbeat","uplifted","uplifting","urge","urgent","useful","useless","validate","valor","valuable","value","vanquish","vaporize","venomous","verify","vibrant","vicious","victim","victory","vigorous","vilified","vindictive","violated","violent","volatile","vulnerable","waiting","wanted","wanton","warning","waste","weak","wealth","weird","what no one tells you","whip","whopping","wicked","wild","willpower","withheld","wonderful","wondrous","woozy","world","worry","worst","worthwhile","wounded","wreaking","youthful","zen","zinger"],"diacritics":true,"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasBreadcrumb":true,"serpData":{"title":"%sitename% %sep% %sitedesc%","description":"%sitedesc%","titleTemplate":"%sitename% %page% %sep% %sitedesc%","descriptionTemplate":"","focusKeywords":"","breadcrumbTitle":"Home","robots":{"index":true},"advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":""}}},"tocTitle":"Table of Contents","tocExcludeHeadings":[],"listStyle":"ul"},"_links":{"self":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/8715","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/comments?post=8715"}],"version-history":[{"count":10,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/8715\/revisions"}],"predecessor-version":[{"id":9631,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/8715\/revisions\/9631"}],"up":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/4298"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/media\/8747"}],"wp:attachment":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/media?parent=8715"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}