{"id":54,"date":"2026-01-15T21:03:05","date_gmt":"2026-01-16T00:03:05","guid":{"rendered":"https:\/\/cwsp.com.br\/trofeueficiencia\/?p=54"},"modified":"2026-01-16T01:02:56","modified_gmt":"2026-01-16T04:02:56","slug":"calculadora","status":"publish","type":"post","link":"https:\/\/cwsp.com.br\/trofeueficiencia\/2026\/01\/15\/calculadora\/","title":{"rendered":"Calculadora"},"content":{"rendered":"<p>&nbsp;<\/p>\n<style>\n        \/* =============================================<br \/>\n           TR\u00d3FEU EFICI\u00caNCIA EM CW - ESTILOS CSS<br \/>\n           Baseado no estilo visual do CWSP<br \/>\n           ============================================= *\/<\/p>\n<p>        \/* Vari\u00e1veis CSS - Estilo CWSP - CORES CORRIGIDAS PARA MELHOR CONTRASTE *\/<br \/>\n        :root {<br \/>\n            \/* Cores prim\u00e1rias - Tons escuros para melhor legibilidade *\/<br \/>\n            --primary-color: #0a2540;<br \/>\n            --primary-dark: #061525;<br \/>\n            --secondary-color: #1a365d;<\/p>\n<p>            \/* Cor de destaque - Azul mais vibrante e vis\u00edvel *\/<br \/>\n            --accent-color: #2563eb;<br \/>\n            --accent-hover: #1d4ed8;<br \/>\n            --accent-light: #dbeafe;<\/p>\n<p>            \/* Cores de texto - Contraste adequado (WCAG 4.5:1) *\/<br \/>\n            --text-color: #1a1a1a;<br \/>\n            --text-medium: #4a5568;<br \/>\n            --text-light: #5a6578;<\/p>\n<p>            \/* Cores de fundo *\/<br \/>\n            --bg-light: #f1f5f9;<br \/>\n            --bg-card: #ffffff;<br \/>\n            --bg-dark: #0f172a;<\/p>\n<p>            \/* Cores de borda *\/<br \/>\n            --border-color: #cbd5e1;<\/p>\n<p>            \/* Cores especiais *\/<br \/>\n            --gold-color: #b45309;<br \/>\n            --success-color: #16a34a;<br \/>\n            --warning-color: #ca8a04;<br \/>\n            --danger-color: #dc2626;<\/p>\n<p>            \/* Outras vari\u00e1veis *\/<br \/>\n            --border-radius: 6px;<br \/>\n            --max-width: 1100px;<br \/>\n            --shadow: 0 2px 8px rgba(0,0,0,0.1);<br \/>\n            --shadow-hover: 0 4px 16px rgba(0,0,0,0.15);<br \/>\n            --transition: all 0.3s ease;<br \/>\n        }<\/p>\n<p>        \/* Reset b\u00e1sico *\/<br \/>\n        * {<br \/>\n            margin: 0;<br \/>\n            padding: 0;<br \/>\n            box-sizing: border-box;<br \/>\n        }<\/p>\n<p>        body {<br \/>\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;<br \/>\n            background-color: var(--bg-light);<br \/>\n            color: var(--text-color);<br \/>\n            line-height: 1.6;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           HEADER<br \/>\n           ============================================= *\/<br \/>\n        .header {<br \/>\n            background: linear-gradient(180deg, var(--primary-color) 0%, var(--secondary-color) 100%);<br \/>\n            color: white;<br \/>\n            padding: 25px 15px;<br \/>\n            border-bottom: 4px solid var(--accent-color);<br \/>\n        }<\/p>\n<p>        .header-content {<br \/>\n            max-width: var(--max-width);<br \/>\n            margin: 0 auto;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 20px;<br \/>\n        }<\/p>\n<p>        .header-logo {<br \/>\n            width: 70px;<br \/>\n            height: 70px;<br \/>\n            background: var(--accent-color);<br \/>\n            border-radius: 50%;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            justify-content: center;<br \/>\n            font-size: 2rem;<br \/>\n            flex-shrink: 0;<br \/>\n        }<\/p>\n<p>        .header-text {<br \/>\n            flex: 1;<br \/>\n        }<\/p>\n<p>        .header h1 {<br \/>\n            font-size: 1.8rem;<br \/>\n            font-weight: 600;<br \/>\n            margin-bottom: 5px;<br \/>\n        }<\/p>\n<p>        .header .subtitle {<br \/>\n            font-size: 0.95rem;<br \/>\n            opacity: 0.95;<br \/>\n            color: #e2e8f0;<br \/>\n        }<\/p>\n<p>        .header .subtitle strong {<br \/>\n            color: #93c5fd;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           CONTAINER PRINCIPAL<br \/>\n           ============================================= *\/<br \/>\n        .container {<br \/>\n            max-width: var(--max-width);<br \/>\n            margin: 0 auto;<br \/>\n            padding: 30px 15px;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           SE\u00c7\u00d5ES GERAIS<br \/>\n           ============================================= *\/<br \/>\n        .section {<br \/>\n            background: var(--bg-card);<br \/>\n            border: 1px solid var(--border-color);<br \/>\n            border-radius: var(--border-radius);<br \/>\n            padding: 22px;<br \/>\n            margin-bottom: 20px;<br \/>\n            box-shadow: var(--shadow);<br \/>\n        }<\/p>\n<p>        .section-header {<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 12px;<br \/>\n            margin-bottom: 18px;<br \/>\n            padding-bottom: 12px;<br \/>\n            border-bottom: 2px solid var(--accent-color);<br \/>\n        }<\/p>\n<p>        .section-header h2 {<br \/>\n            color: var(--primary-color);<br \/>\n            font-size: 1.3rem;<br \/>\n            font-weight: 600;<br \/>\n        }<\/p>\n<p>        .section-icon {<br \/>\n            width: 38px;<br \/>\n            height: 38px;<br \/>\n            background: var(--accent-color);<br \/>\n            border-radius: 6px;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            justify-content: center;<br \/>\n            color: var(--primary-color);<br \/>\n            font-size: 1.1rem;<br \/>\n            font-weight: bold;<br \/>\n        }<\/p>\n<p>        .section p {<br \/>\n            color: var(--text-medium);<br \/>\n            margin-bottom: 12px;<br \/>\n            font-size: 0.95rem;<br \/>\n            line-height: 1.7;<br \/>\n        }<\/p>\n<p>        .section p strong {<br \/>\n            color: var(--primary-color);<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           F\u00d3RMULA DE C\u00c1LCULO<br \/>\n           ============================================= *\/<br \/>\n        .formula-section {<br \/>\n            background: #f8fafc;<br \/>\n            border: 1px solid var(--border-color);<br \/>\n            border-left: 4px solid var(--accent-color);<br \/>\n            padding: 16px;<br \/>\n            margin: 16px 0;<br \/>\n            border-radius: 0 6px 6px 0;<br \/>\n        }<\/p>\n<p>        .formula-section h4 {<br \/>\n            color: var(--primary-color);<br \/>\n            margin-bottom: 10px;<br \/>\n            font-size: 1rem;<br \/>\n        }<\/p>\n<p>        .formula {<br \/>\n            font-family: 'Courier New', 'Consolas', monospace;<br \/>\n            font-size: 1.2rem;<br \/>\n            color: var(--primary-color);<br \/>\n            background: #f1f5f9;<br \/>\n            padding: 14px;<br \/>\n            border-radius: 4px;<br \/>\n            text-align: center;<br \/>\n            margin: 12px 0;<br \/>\n            border: 1px solid var(--border-color);<br \/>\n            letter-spacing: 1px;<br \/>\n            font-weight: 600;<br \/>\n        }<\/p>\n<p>        .formula-description {<br \/>\n            color: var(--text-medium);<br \/>\n            font-size: 0.9rem;<br \/>\n            line-height: 1.7;<br \/>\n        }<\/p>\n<p>        .formula-description strong {<br \/>\n            color: var(--primary-color);<br \/>\n        }<\/p>\n<p>        \/* Se\u00e7\u00e3o de pr\u00eamio especial *\/<br \/>\n        .formula-section.award-section {<br \/>\n            background: #f0fdf4;<br \/>\n            border-left-color: var(--success-color);<br \/>\n            border-left-width: 4px;<br \/>\n        }<\/p>\n<p>        .formula-section.award-section h4 {<br \/>\n            color: var(--primary-color);<br \/>\n        }<\/p>\n<p>        .formula-section.award-section p {<br \/>\n            color: var(--text-medium);<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           LISTA DE REQUISITOS<br \/>\n           ============================================= *\/<br \/>\n        .requirements-list {<br \/>\n            list-style: none;<br \/>\n            padding: 0;<br \/>\n            margin: 16px 0;<br \/>\n        }<\/p>\n<p>        .requirements-list li {<br \/>\n            padding: 12px 15px;<br \/>\n            padding-left: 40px;<br \/>\n            position: relative;<br \/>\n            border-bottom: 1px solid #eee;<br \/>\n            font-size: 0.9rem;<br \/>\n            transition: var(--transition);<br \/>\n        }<\/p>\n<p>        .requirements-list li:last-child {<br \/>\n            border-bottom: none;<br \/>\n        }<\/p>\n<p>        .requirements-list li:hover {<br \/>\n            background: #fafafa;<br \/>\n            padding-left: 45px;<br \/>\n        }<\/p>\n<p>        .requirements-list li::before {<br \/>\n            content: '\u2713';<br \/>\n            position: absolute;<br \/>\n            left: 12px;<br \/>\n            color: var(--success-color);<br \/>\n            font-weight: bold;<br \/>\n            font-size: 1rem;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           INFORMA\u00c7\u00d5ES DE B\u00d4NUS<br \/>\n           ============================================= *\/<br \/>\n        .bonus-info {<br \/>\n            background: #fffbeb;<br \/>\n            border: 1px solid #fcd34d;<br \/>\n            border-radius: 6px;<br \/>\n            padding: 16px;<br \/>\n            margin: 16px 0;<br \/>\n        }<\/p>\n<p>        .bonus-info h4 {<br \/>\n            color: var(--primary-color);<br \/>\n            margin-bottom: 12px;<br \/>\n            font-size: 1rem;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 8px;<br \/>\n        }<\/p>\n<p>        .bonus-info ul {<br \/>\n            list-style: none;<br \/>\n            padding: 0;<br \/>\n        }<\/p>\n<p>        .bonus-info li {<br \/>\n            color: var(--text-medium);<br \/>\n            padding: 8px 0;<br \/>\n            font-size: 0.9rem;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 10px;<br \/>\n        }<\/p>\n<p>        .bonus-badge {<br \/>\n            background: var(--accent-color);<br \/>\n            color: white;<br \/>\n            padding: 3px 10px;<br \/>\n            border-radius: 12px;<br \/>\n            font-weight: bold;<br \/>\n            font-size: 0.8rem;<br \/>\n            white-space: nowrap;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           GRID DE CONTESTS POR M\u00caS<br \/>\n           ============================================= *\/<br \/>\n        .contests-grid {<br \/>\n            display: grid;<br \/>\n            grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));<br \/>\n            gap: 15px;<br \/>\n            margin-top: 20px;<br \/>\n        }<\/p>\n<p>        .month-card {<br \/>\n            background: var(--bg-card);<br \/>\n            border-radius: var(--border-radius);<br \/>\n            overflow: hidden;<br \/>\n            box-shadow: var(--shadow);<br \/>\n            transition: var(--transition);<br \/>\n            border: 1px solid var(--border-color);<br \/>\n        }<\/p>\n<p>        .month-card:hover {<br \/>\n            transform: translateY(-3px);<br \/>\n            box-shadow: var(--shadow-hover);<br \/>\n            border-color: var(--accent-color);<br \/>\n        }<\/p>\n<p>        .month-header {<br \/>\n            background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);<br \/>\n            color: white;<br \/>\n            padding: 12px 15px;<br \/>\n            font-weight: 600;<br \/>\n            font-size: 0.95rem;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 8px;<br \/>\n            border-bottom: 3px solid var(--accent-color);<br \/>\n        }<\/p>\n<p>        .month-icon {<br \/>\n            font-size: 1.1rem;<br \/>\n        }<\/p>\n<p>        .contest-list {<br \/>\n            padding: 5px 0;<br \/>\n        }<\/p>\n<p>        .contest-item {<br \/>\n            display: flex;<br \/>\n            justify-content: space-between;<br \/>\n            align-items: center;<br \/>\n            padding: 8px 15px;<br \/>\n            border-bottom: 1px solid #f0f0f0;<br \/>\n            transition: var(--transition);<br \/>\n        }<\/p>\n<p>        .contest-item:last-child {<br \/>\n            border-bottom: none;<br \/>\n        }<\/p>\n<p>        .contest-item:hover {<br \/>\n            background: #f8fafc;<br \/>\n            padding-left: 20px;<br \/>\n        }<\/p>\n<p>        .contest-name {<br \/>\n            font-weight: 600;<br \/>\n            color: var(--secondary-color);<br \/>\n            font-size: 0.9rem;<br \/>\n            text-decoration: none;<br \/>\n            transition: var(--transition);<br \/>\n        }<\/p>\n<p>        .contest-name:hover {<br \/>\n            color: var(--accent-color);<br \/>\n            text-decoration: underline;<br \/>\n        }<\/p>\n<p>        .contest-count {<br \/>\n            background: var(--accent-color);<br \/>\n            color: white;<br \/>\n            padding: 2px 8px;<br \/>\n            border-radius: 10px;<br \/>\n            font-size: 0.75rem;<br \/>\n            font-weight: 600;<br \/>\n        }<\/p>\n<p>        .contest-date {<br \/>\n            background: var(--accent-color);<br \/>\n            color: white;<br \/>\n            padding: 3px 10px;<br \/>\n            border-radius: 15px;<br \/>\n            font-size: 0.75rem;<br \/>\n            font-weight: 600;<br \/>\n            min-width: 55px;<br \/>\n            text-align: center;<br \/>\n        }<\/p>\n<p>        .contest-date.passed {<br \/>\n            background: #9ca3af;<br \/>\n            color: white;<br \/>\n        }<\/p>\n<p>        .contest-date.current-month {<br \/>\n            background: var(--success-color);<br \/>\n            color: white;<br \/>\n        }<\/p>\n<p>        .contest-date.future {<br \/>\n            background: var(--accent-color);<br \/>\n            color: white;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           SE\u00c7\u00c3O DO FORMUL\u00c1RIO<br \/>\n           ============================================= *\/<br \/>\n        .form-section {<br \/>\n            background: var(--bg-card);<br \/>\n            border: 1px solid var(--border-color);<br \/>\n            border-radius: var(--border-radius);<br \/>\n            padding: 22px;<br \/>\n            margin-top: 20px;<br \/>\n            box-shadow: var(--shadow);<br \/>\n        }<\/p>\n<p>        .form-section h2 {<br \/>\n            color: var(--primary-color);<br \/>\n            margin-bottom: 20px;<br \/>\n            padding-bottom: 12px;<br \/>\n            border-bottom: 2px solid var(--accent-color);<br \/>\n            font-size: 1.3rem;<br \/>\n        }<\/p>\n<p>        \/* Informa\u00e7\u00f5es do participante *\/<br \/>\n        .participant-info {<br \/>\n            background: #f8fafc;<br \/>\n            padding: 18px;<br \/>\n            border-radius: var(--border-radius);<br \/>\n            margin-bottom: 20px;<br \/>\n            border: 1px solid var(--border-color);<br \/>\n        }<\/p>\n<p>        .participant-info h3 {<br \/>\n            color: var(--primary-color);<br \/>\n            margin-bottom: 18px;<br \/>\n            font-size: 1.2rem;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 10px;<br \/>\n            padding-bottom: 12px;<br \/>\n            border-bottom: 2px solid var(--accent-color);<br \/>\n        }<\/p>\n<p>        \/* Novos estilos para formul\u00e1rio *\/<br \/>\n        .form-row {<br \/>\n            margin-bottom: 18px;<br \/>\n        }<\/p>\n<p>        .form-row:last-of-type {<br \/>\n            margin-bottom: 20px;<br \/>\n        }<\/p>\n<p>        .form-group.full-width {<br \/>\n            width: 100%;<br \/>\n        }<\/p>\n<p>        \/* Dados do Participante em linha (3 campos lado a lado com tamanhos iguais) *\/<br \/>\n        .participant-info .form-row {<br \/>\n            display: grid;<br \/>\n            grid-template-columns: repeat(3, 1fr);<br \/>\n            gap: 20px;<br \/>\n            width: 100%;<br \/>\n            margin-bottom: 18px;<br \/>\n        }<\/p>\n<p>        .participant-info .form-group {<br \/>\n            width: 100%;<br \/>\n        }<\/p>\n<p>        .participant-info .form-group input {<br \/>\n            width: 100%;<br \/>\n            box-sizing: border-box;<br \/>\n            padding: 12px;<br \/>\n        }<\/p>\n<p>        \/* Estilos para formul\u00e1rio do Contest Participado *\/<br \/>\n        .contest-section .form-row {<br \/>\n            display: grid;<br \/>\n            grid-template-columns: 1fr 1fr;<br \/>\n            gap: 20px;<br \/>\n            width: 100%;<br \/>\n            margin-bottom: 18px;<br \/>\n        }<\/p>\n<p>        \/* Layout com 3 colunas *\/<br \/>\n        .contest-section .form-row.form-row-3 {<br \/>\n            grid-template-columns: 1fr 1fr 1fr;<br \/>\n        }<\/p>\n<p>        \/* Layout com 4 colunas *\/<br \/>\n        .contest-section .form-row.form-row-4 {<br \/>\n            grid-template-columns: 1fr 1fr 1fr 1fr;<br \/>\n        }<\/p>\n<p>        .contest-section .form-row .full-width {<br \/>\n            grid-column: 1 \/ -1;<br \/>\n        }<\/p>\n<p>        .contest-section .form-group {<br \/>\n            width: 100%;<br \/>\n        }<\/p>\n<p>        .contest-section .form-group input,<br \/>\n        .contest-section .form-group select {<br \/>\n            width: 100%;<br \/>\n            box-sizing: border-box;<br \/>\n            padding: 12px;<br \/>\n        }<\/p>\n<p>        .contest-section .radio-group {<br \/>\n            display: flex;<br \/>\n            gap: 20px;<br \/>\n            padding: 12px 0;<br \/>\n        }<\/p>\n<p>        \/* Estilo para campos desabilitados (salvos) *\/<br \/>\n        .participant-info input:disabled,<br \/>\n        .participant-info select:disabled {<br \/>\n            background-color: #e2e8f0;<br \/>\n            color: var(--text-color);<br \/>\n            font-weight: 600;<br \/>\n            cursor: not-allowed;<br \/>\n            border-color: #94a3b8;<br \/>\n        }<\/p>\n<p>        \/* Campos da se\u00e7\u00e3o Contest Participado quando salvos *\/<br \/>\n        .contest-section input:disabled,<br \/>\n        .contest-section select:disabled {<br \/>\n            background-color: #e2e8f0;<br \/>\n            color: var(--text-color);<br \/>\n            font-weight: 600;<br \/>\n            cursor: not-allowed;<br \/>\n            border-color: #94a3b8;<br \/>\n        }<\/p>\n<p>        .contest-section input[type=\"radio\"]:disabled + span {<br \/>\n            opacity: 0.6;<br \/>\n            cursor: not-allowed;<br \/>\n        }<\/p>\n<p>        \/* Indicador visual de que os dados foram salvos *\/<br \/>\n        .saved-indicator {<br \/>\n            display: none;<br \/>\n            background: var(--success-color);<br \/>\n            color: white;<br \/>\n            padding: 4px 12px;<br \/>\n            border-radius: 12px;<br \/>\n            font-size: 0.75rem;<br \/>\n            margin-left: 10px;<br \/>\n            font-weight: 500;<br \/>\n        }<\/p>\n<p>        .participant-info.saved .saved-indicator,<br \/>\n        .contest-section.saved .saved-indicator {<br \/>\n            display: inline-block;<br \/>\n        }<\/p>\n<p>        .radio-group {<br \/>\n            display: flex;<br \/>\n            gap: 20px;<br \/>\n            padding: 10px 0;<br \/>\n        }<\/p>\n<p>        .radio-label {<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 8px;<br \/>\n            cursor: pointer;<br \/>\n            font-weight: 500;<br \/>\n            color: var(--text-color);<br \/>\n        }<\/p>\n<p>        .radio-label input[type=\"radio\"] {<br \/>\n            width: 18px;<br \/>\n            height: 18px;<br \/>\n            accent-color: var(--accent-color);<br \/>\n            cursor: pointer;<br \/>\n        }<\/p>\n<p>        .participant-save-section {<br \/>\n            margin-top: 20px;<br \/>\n            padding-top: 18px;<br \/>\n            border-top: 1px solid var(--border-color);<br \/>\n            display: flex;<br \/>\n            justify-content: center;<br \/>\n        }<\/p>\n<p>        .participant-save-section .btn {<br \/>\n            min-width: 280px;<br \/>\n            justify-content: center;<br \/>\n            font-size: 1rem;<br \/>\n            padding: 14px 28px;<br \/>\n        }<\/p>\n<p>        \/* Se\u00e7\u00e3o Contest Participado *\/<br \/>\n        .contest-section {<br \/>\n            background: var(--bg-card);<br \/>\n            border: 1px solid var(--border-color);<br \/>\n            border-radius: var(--border-radius);<br \/>\n            padding: 22px;<br \/>\n            margin-top: 20px;<br \/>\n            box-shadow: var(--shadow);<br \/>\n            animation: fadeIn 0.5s ease;<br \/>\n        }<\/p>\n<p>        .contest-section .contest-entry {<br \/>\n            background: #f8fafc;<br \/>\n            border-radius: var(--border-radius);<br \/>\n            padding: 18px;<br \/>\n            border: 1px solid var(--border-color);<br \/>\n            margin-bottom: 15px;<br \/>\n        }<\/p>\n<p>        .contest-section .contest-entry h3 {<br \/>\n            color: var(--primary-color);<br \/>\n            margin-bottom: 15px;<br \/>\n            font-size: 1.1rem;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 8px;<br \/>\n        }<\/p>\n<p>        \/* Grid do formul\u00e1rio *\/<br \/>\n        .form-grid {<br \/>\n            display: grid;<br \/>\n            grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));<br \/>\n            gap: 15px;<br \/>\n            margin-bottom: 20px;<br \/>\n        }<\/p>\n<p>        .form-group {<br \/>\n            margin-bottom: 5px;<br \/>\n        }<\/p>\n<p>        .form-group label {<br \/>\n            display: block;<br \/>\n            margin-bottom: 6px;<br \/>\n            font-weight: 600;<br \/>\n            color: var(--primary-color);<br \/>\n            font-size: 0.85rem;<br \/>\n        }<\/p>\n<p>        .form-group input,<br \/>\n        .form-group select {<br \/>\n            width: 100%;<br \/>\n            padding: 10px 12px;<br \/>\n            border: 2px solid var(--border-color);<br \/>\n            border-radius: 4px;<br \/>\n            font-size: 0.9rem;<br \/>\n            transition: var(--transition);<br \/>\n            background: white;<br \/>\n            color: var(--text-color);<br \/>\n        }<\/p>\n<p>        .form-group input:focus,<br \/>\n        .form-group select:focus {<br \/>\n            outline: none;<br \/>\n            border-color: var(--accent-color);<br \/>\n            background: white;<br \/>\n            box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);<br \/>\n        }<\/p>\n<p>        .form-group input::placeholder {<br \/>\n            color: #94a3b8;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           ENTRADA DE CONTEST<br \/>\n           ============================================= *\/<br \/>\n        .contest-entry {<br \/>\n            background: #f8fafc;<br \/>\n            border-radius: var(--border-radius);<br \/>\n            padding: 18px;<br \/>\n            margin-bottom: 15px;<br \/>\n            border: 1px solid var(--border-color);<br \/>\n            transition: var(--transition);<br \/>\n        }<\/p>\n<p>        .contest-entry:hover {<br \/>\n            border-color: var(--accent-color);<br \/>\n        }<\/p>\n<p>        .contest-entry h3 {<br \/>\n            color: var(--primary-color);<br \/>\n            margin-bottom: 15px;<br \/>\n            font-size: 1rem;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 8px;<br \/>\n        }<\/p>\n<p>        .contest-entry-number {<br \/>\n            background: var(--accent-color);<br \/>\n            color: white;<br \/>\n            width: 26px;<br \/>\n            height: 26px;<br \/>\n            border-radius: 50%;<br \/>\n            display: inline-flex;<br \/>\n            align-items: center;<br \/>\n            justify-content: center;<br \/>\n            font-weight: bold;<br \/>\n            font-size: 0.85rem;<br \/>\n            user-select: none;<br \/>\n            cursor: default;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           BOT\u00d5ES<br \/>\n           ============================================= *\/<br \/>\n        .btn {<br \/>\n            background: var(--accent-color);<br \/>\n            color: white;<br \/>\n            padding: 12px 22px;<br \/>\n            border: none;<br \/>\n            border-radius: 4px;<br \/>\n            font-size: 0.9rem;<br \/>\n            font-weight: 600;<br \/>\n            cursor: pointer;<br \/>\n            transition: var(--transition);<br \/>\n            display: inline-flex;<br \/>\n            align-items: center;<br \/>\n            gap: 6px;<br \/>\n            margin-right: 8px;<br \/>\n            margin-bottom: 8px;<br \/>\n            text-decoration: none;<br \/>\n        }<\/p>\n<p>        .btn:hover {<br \/>\n            background: var(--accent-hover);<br \/>\n            transform: translateY(-1px);<br \/>\n            color: white;<br \/>\n        }<\/p>\n<p>        .btn:active {<br \/>\n            transform: translateY(0);<br \/>\n        }<\/p>\n<p>        .btn-secondary {<br \/>\n            background: var(--secondary-color);<br \/>\n            color: white;<br \/>\n        }<\/p>\n<p>        .btn-secondary:hover {<br \/>\n            background: var(--primary-color);<br \/>\n            color: white;<br \/>\n        }<\/p>\n<p>        .btn-primary {<br \/>\n            min-width: 250px;<br \/>\n            justify-content: center;<br \/>\n            font-size: 0.95rem;<br \/>\n        }<\/p>\n<p>        .form-actions {<br \/>\n            margin-top: 20px;<br \/>\n            display: flex;<br \/>\n            flex-wrap: wrap;<br \/>\n            gap: 10px;<br \/>\n        }<\/p>\n<p>        .submit-buttons {<br \/>\n            margin-top: 25px;<br \/>\n            display: flex;<br \/>\n            justify-content: center;<br \/>\n            flex-wrap: wrap;<br \/>\n            gap: 10px;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           BARRA DE PROGRESSO<br \/>\n           ============================================= *\/<br \/>\n        .progress-container {<br \/>\n            background: #e2e8f0;<br \/>\n            border-radius: 6px;<br \/>\n            padding: 14px;<br \/>\n            margin: 16px 0;<br \/>\n        }<\/p>\n<p>        .progress-label {<br \/>\n            display: flex;<br \/>\n            justify-content: space-between;<br \/>\n            margin-bottom: 8px;<br \/>\n            font-size: 0.8rem;<br \/>\n            color: var(--text-medium);<br \/>\n        }<\/p>\n<p>        .progress-bar {<br \/>\n            height: 8px;<br \/>\n            background: #cbd5e1;<br \/>\n            border-radius: 4px;<br \/>\n            overflow: hidden;<br \/>\n        }<\/p>\n<p>        .progress-fill {<br \/>\n            height: 100%;<br \/>\n            background: var(--accent-color);<br \/>\n            border-radius: 4px;<br \/>\n            transition: width 0.5s ease;<br \/>\n        }<\/p>\n<p>        .result-display {<br \/>\n            background: white;<br \/>\n            color: var(--text-color);<br \/>\n            border-radius: var(--border-radius);<br \/>\n            padding: 25px;<br \/>\n            margin-top: 25px;<br \/>\n            display: none;<br \/>\n            animation: fadeIn 0.5s ease;<br \/>\n            border: 2px solid var(--border-color);<br \/>\n        }<\/p>\n<p>        @keyframes fadeIn {<br \/>\n            from { opacity: 0; transform: translateY(15px); }<br \/>\n            to { opacity: 1; transform: translateY(0); }<br \/>\n        }<\/p>\n<p>        .result-display h2 {<br \/>\n            color: var(--primary-color);<br \/>\n            margin-bottom: 18px;<br \/>\n            font-size: 1.3rem;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 10px;<br \/>\n            padding-bottom: 12px;<br \/>\n            border-bottom: 3px solid var(--accent-color);<br \/>\n        }<\/p>\n<p>        .result-header {<br \/>\n            background: var(--primary-color);<br \/>\n            color: white;<br \/>\n            padding: 18px;<br \/>\n            border-radius: 6px;<br \/>\n            margin-bottom: 20px;<br \/>\n        }<\/p>\n<p>        .result-header-grid {<br \/>\n            display: flex;<br \/>\n            justify-content: space-between;<br \/>\n            flex-wrap: wrap;<br \/>\n            gap: 12px;<br \/>\n        }<\/p>\n<p>        .result-item {<br \/>\n            padding: 10px 0;<br \/>\n            border-bottom: 1px solid rgba(255,255,255,0.15);<br \/>\n        }<\/p>\n<p>        .result-item:last-child {<br \/>\n            border-bottom: none;<br \/>\n        }<\/p>\n<p>        .result-item strong {<br \/>\n            color: #93c5fd;<br \/>\n        }<\/p>\n<p>        .result-contest {<br \/>\n            background: #f8fafc;<br \/>\n            padding: 16px;<br \/>\n            border-radius: 6px;<br \/>\n            margin: 12px 0;<br \/>\n            border-left: 5px solid var(--accent-color);<br \/>\n            box-shadow: 0 2px 6px rgba(0,0,0,0.08);<br \/>\n        }<\/p>\n<p>        .result-contest-name {<br \/>\n            font-size: 1rem;<br \/>\n            font-weight: 600;<br \/>\n            margin-bottom: 12px;<br \/>\n            color: var(--primary-color);<br \/>\n        }<\/p>\n<p>        .result-contest-details {<br \/>\n            display: grid;<br \/>\n            grid-template-columns: repeat(auto-fit, minmax(90px, 1fr));<br \/>\n            gap: 10px;<br \/>\n        }<\/p>\n<p>        .result-detail {<br \/>\n            text-align: center;<br \/>\n            padding: 8px;<br \/>\n            background: #e2e8f0;<br \/>\n            border-radius: 4px;<br \/>\n            border: 1px solid var(--border-color);<br \/>\n        }<\/p>\n<p>        .result-detail-value {<br \/>\n            font-size: 1.1rem;<br \/>\n            font-weight: bold;<br \/>\n            color: var(--primary-color);<br \/>\n        }<\/p>\n<p>        .result-detail-label {<br \/>\n            font-size: 0.7rem;<br \/>\n            color: var(--text-medium);<br \/>\n            margin-top: 3px;<br \/>\n            text-transform: uppercase;<br \/>\n            letter-spacing: 0.5px;<br \/>\n            font-weight: 600;<br \/>\n        }<\/p>\n<p>        .result-bonus {<br \/>\n            display: inline-flex;<br \/>\n            align-items: center;<br \/>\n            gap: 5px;<br \/>\n            background: #dbeafe;<br \/>\n            color: var(--primary-color);<br \/>\n            padding: 4px 10px;<br \/>\n            border-radius: 12px;<br \/>\n            font-size: 0.75rem;<br \/>\n            margin-top: 10px;<br \/>\n            font-weight: 500;<br \/>\n        }<\/p>\n<p>        .result-total {<br \/>\n            background: var(--primary-color);<br \/>\n            border-radius: 8px;<br \/>\n            padding: 22px;<br \/>\n            margin-top: 20px;<br \/>\n            text-align: center;<br \/>\n            color: white;<br \/>\n            border: 2px solid var(--accent-color);<br \/>\n        }<\/p>\n<p>        .result-total-score {<br \/>\n            font-size: 2.4rem;<br \/>\n            font-weight: bold;<br \/>\n            background: linear-gradient(135deg, #60a5fa, #3b82f6);<br \/>\n            -webkit-background-clip: text;<br \/>\n            -webkit-text-fill-color: transparent;<br \/>\n            background-clip: text;<br \/>\n            margin: 8px 0;<br \/>\n        }<\/p>\n<p>        .result-total-label {<br \/>\n            font-size: 0.85rem;<br \/>\n            opacity: 0.95;<br \/>\n            color: white;<br \/>\n            font-weight: 500;<br \/>\n        }<\/p>\n<p>        .result-contact {<br \/>\n            margin-top: 20px;<br \/>\n            text-align: center;<br \/>\n            color: var(--primary-color);<br \/>\n            font-size: 0.9rem;<br \/>\n            font-weight: 500;<br \/>\n        }<\/p>\n<p>        .result-actions {<br \/>\n            margin-top: 18px;<br \/>\n            padding-top: 16px;<br \/>\n            border-top: 2px solid var(--border-color);<br \/>\n            text-align: center;<br \/>\n            display: flex;<br \/>\n            justify-content: center;<br \/>\n            flex-wrap: wrap;<br \/>\n            gap: 10px;<br \/>\n        }<\/p>\n<p>        .result-actions .btn {<br \/>\n            background: var(--primary-color);<br \/>\n            border: 1px solid var(--secondary-color);<br \/>\n        }<\/p>\n<p>        .result-actions .btn:hover {<br \/>\n            background: var(--secondary-color);<br \/>\n        }<\/p>\n<p>        .result-actions .btn-secondary {<br \/>\n            background: var(--accent-color);<br \/>\n        }<\/p>\n<p>        .result-actions .btn-secondary:hover {<br \/>\n            background: var(--accent-hover);<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           BARRA DE ESTAT\u00cdSTICAS<br \/>\n           ============================================= *\/<br \/>\n        .stats-bar {<br \/>\n            display: flex;<br \/>\n            justify-content: space-around;<br \/>\n            background: rgba(255,255,255,0.15);<br \/>\n            padding: 14px;<br \/>\n            border-radius: 4px;<br \/>\n            margin-top: 14px;<br \/>\n            flex-wrap: wrap;<br \/>\n            gap: 12px;<br \/>\n        }<\/p>\n<p>        .stat-item {<br \/>\n            text-align: center;<br \/>\n        }<\/p>\n<p>        .stat-value {<br \/>\n            font-size: 1.4rem;<br \/>\n            font-weight: bold;<br \/>\n            color: white;<br \/>\n        }<\/p>\n<p>        .stat-label {<br \/>\n            font-size: 0.75rem;<br \/>\n            color: #e2e8f0;<br \/>\n            opacity: 0.9;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           ALERTAS<br \/>\n           ============================================= *\/<br \/>\n        .alert {<br \/>\n            padding: 12px 15px;<br \/>\n            border-radius: 4px;<br \/>\n            margin: 12px 0;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 10px;<br \/>\n            font-size: 0.85rem;<br \/>\n        }<\/p>\n<p>        .alert-info {<br \/>\n            background: #eff6ff;<br \/>\n            border: 1px solid #93c5fd;<br \/>\n            color: var(--primary-color);<br \/>\n        }<\/p>\n<p>        .alert-warning {<br \/>\n            background: #fffbeb;<br \/>\n            border: 1px solid #fcd34d;<br \/>\n            color: #92400e;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           RODAP\u00c9<br \/>\n           ============================================= *\/<br \/>\n        footer {<br \/>\n            background: var(--primary-color);<br \/>\n            color: white;<br \/>\n            text-align: center;<br \/>\n            padding: 25px 15px;<br \/>\n            margin-top: 35px;<br \/>\n            border-top: 4px solid var(--accent-color);<br \/>\n        }<\/p>\n<p>        .footer-content {<br \/>\n            max-width: var(--max-width);<br \/>\n            margin: 0 auto;<br \/>\n        }<\/p>\n<p>        .footer-title {<br \/>\n            font-size: 1.1rem;<br \/>\n            margin-bottom: 12px;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            justify-content: center;<br \/>\n            gap: 10px;<br \/>\n            color: white;<br \/>\n        }<\/p>\n<p>        .footer-info {<br \/>\n            font-size: 0.85rem;<br \/>\n            color: #e2e8f0;<br \/>\n            margin-bottom: 6px;<br \/>\n        }<\/p>\n<p>        .footer-contact {<br \/>\n            margin-top: 18px;<br \/>\n            padding-top: 18px;<br \/>\n            border-top: 1px solid rgba(255,255,255,0.2);<br \/>\n        }<\/p>\n<p>        .footer-email {<br \/>\n            background: rgba(255,255,255,0.1);<br \/>\n            padding: 8px 18px;<br \/>\n            border-radius: 15px;<br \/>\n            display: inline-block;<br \/>\n            margin-top: 10px;<br \/>\n            color: white;<br \/>\n            font-weight: 500;<br \/>\n        }<\/p>\n<p>        .footer-link {<br \/>\n            color: #93c5fd;<br \/>\n            text-decoration: none;<br \/>\n        }<\/p>\n<p>        .footer-link:hover {<br \/>\n            text-decoration: underline;<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           BOX DE RESULTADOS SALVOS<br \/>\n           ============================================= *\/<br \/>\n        .main-form-container {<br \/>\n            background: var(--bg-card);<br \/>\n            border: 1px solid var(--border-color);<br \/>\n            border-radius: var(--border-radius);<br \/>\n            padding: 22px;<br \/>\n            margin-bottom: 20px;<br \/>\n            box-shadow: var(--shadow);<br \/>\n        }<\/p>\n<p>        .saved-results-box {<br \/>\n            background: white;<br \/>\n            border: 1px solid var(--border-color);<br \/>\n            border-radius: var(--border-radius);<br \/>\n            padding: 22px;<br \/>\n            margin-top: 20px;<br \/>\n            box-shadow: var(--shadow);<br \/>\n            animation: fadeIn 0.5s ease;<br \/>\n            border-left: 4px solid var(--accent-color);<br \/>\n        }<\/p>\n<p>        @keyframes fadeIn {<br \/>\n            from { opacity: 0; transform: translateY(15px); }<br \/>\n            to { opacity: 1; transform: translateY(0); }<br \/>\n        }<\/p>\n<p>        .saved-participant-info {<br \/>\n            background: #f8fafc;<br \/>\n            border-radius: var(--border-radius);<br \/>\n            padding: 18px;<br \/>\n            margin-bottom: 18px;<br \/>\n            border: 1px solid var(--border-color);<br \/>\n        }<\/p>\n<p>        .saved-participant-info h4 {<br \/>\n            color: var(--primary-color);<br \/>\n            margin-bottom: 14px;<br \/>\n            font-size: 1rem;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 8px;<br \/>\n        }<\/p>\n<p>        .saved-info-grid {<br \/>\n            display: grid;<br \/>\n            grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));<br \/>\n            gap: 12px;<br \/>\n        }<\/p>\n<p>        .saved-info-item {<br \/>\n            display: flex;<br \/>\n            flex-direction: column;<br \/>\n            gap: 4px;<br \/>\n        }<\/p>\n<p>        .saved-info-label {<br \/>\n            font-size: 0.8rem;<br \/>\n            color: var(--text-medium);<br \/>\n            font-weight: 500;<br \/>\n        }<\/p>\n<p>        .saved-info-value {<br \/>\n            font-size: 0.95rem;<br \/>\n            color: var(--primary-color);<br \/>\n            font-weight: 600;<br \/>\n        }<\/p>\n<p>        .saved-contests-summary {<br \/>\n            background: #f8fafc;<br \/>\n            border-radius: var(--border-radius);<br \/>\n            padding: 18px;<br \/>\n            margin-bottom: 18px;<br \/>\n            border: 1px solid var(--border-color);<br \/>\n        }<\/p>\n<p>        .saved-contests-summary h4 {<br \/>\n            color: var(--primary-color);<br \/>\n            margin-bottom: 14px;<br \/>\n            font-size: 1rem;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 8px;<br \/>\n        }<\/p>\n<p>        .saved-contests-list {<br \/>\n            display: flex;<br \/>\n            flex-direction: column;<br \/>\n            gap: 10px;<br \/>\n            margin-bottom: 15px;<br \/>\n        }<\/p>\n<p>        .saved-contest-item {<br \/>\n            display: flex;<br \/>\n            justify-content: space-between;<br \/>\n            align-items: center;<br \/>\n            padding: 12px 15px;<br \/>\n            background: #f8fafc;<br \/>\n            border-radius: 4px;<br \/>\n            border: 1px solid var(--border-color);<br \/>\n            transition: var(--transition);<br \/>\n        }<\/p>\n<p>        .saved-contest-item:hover {<br \/>\n            border-color: var(--accent-color);<br \/>\n            background: white;<br \/>\n        }<\/p>\n<p>        .saved-contest-number {<br \/>\n            background: var(--accent-color);<br \/>\n            color: white;<br \/>\n            width: 24px;<br \/>\n            height: 24px;<br \/>\n            border-radius: 50%;<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            justify-content: center;<br \/>\n            font-weight: bold;<br \/>\n            font-size: 0.8rem;<br \/>\n            margin-right: 12px;<br \/>\n        }<\/p>\n<p>        .saved-contest-details {<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 15px;<br \/>\n            flex: 1;<br \/>\n        }<\/p>\n<p>        .saved-contest-name {<br \/>\n            font-weight: 600;<br \/>\n            color: var(--primary-color);<br \/>\n        }<\/p>\n<p>        .saved-contest-stats {<br \/>\n            display: flex;<br \/>\n            gap: 12px;<br \/>\n            font-size: 0.85rem;<br \/>\n            color: var(--text-medium);<br \/>\n        }<\/p>\n<p>        .saved-contest-stat {<br \/>\n            display: flex;<br \/>\n            align-items: center;<br \/>\n            gap: 4px;<br \/>\n        }<\/p>\n<p>        .saved-contest-actions {<br \/>\n            display: flex;<br \/>\n            gap: 8px;<br \/>\n            margin-left: 15px;<br \/>\n        }<\/p>\n<p>        .btn-small {<br \/>\n            padding: 6px 12px;<br \/>\n            font-size: 0.8rem;<br \/>\n            border-radius: 4px;<br \/>\n        }<\/p>\n<p>        .btn-edit {<br \/>\n            background: var(--secondary-color);<br \/>\n        }<\/p>\n<p>        .btn-edit:hover {<br \/>\n            background: var(--primary-color);<br \/>\n        }<\/p>\n<p>        .btn-delete {<br \/>\n            background: var(--danger-color);<br \/>\n        }<\/p>\n<p>        .btn-delete:hover {<br \/>\n            background: #b91c1c;<br \/>\n        }<\/p>\n<p>        .saved-total {<br \/>\n            display: flex;<br \/>\n            justify-content: space-between;<br \/>\n            align-items: center;<br \/>\n            padding-top: 12px;<br \/>\n            border-top: 1px solid var(--border-color);<br \/>\n            margin-top: 8px;<br \/>\n        }<\/p>\n<p>        .saved-total-label {<br \/>\n            font-weight: 600;<br \/>\n            color: var(--primary-color);<br \/>\n        }<\/p>\n<p>        .saved-total-value {<br \/>\n            font-size: 1.1rem;<br \/>\n            font-weight: bold;<br \/>\n            color: var(--accent-color);<br \/>\n        }<\/p>\n<p>        .saved-actions {<br \/>\n            display: flex;<br \/>\n            justify-content: center;<br \/>\n            gap: 12px;<br \/>\n            margin-top: 18px;<br \/>\n            padding-top: 18px;<br \/>\n            border-top: 1px solid var(--border-color);<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           RESPONSIVIDADE<br \/>\n           ============================================= *\/<br \/>\n        @media (max-width: 768px) {<br \/>\n            .header-content {<br \/>\n                flex-direction: column;<br \/>\n                text-align: center;<br \/>\n            }<\/p>\n<p>            .header h1 {<br \/>\n                font-size: 1.5rem;<br \/>\n            }<\/p>\n<p>            .header-logo {<br \/>\n                width: 60px;<br \/>\n                height: 60px;<br \/>\n                font-size: 1.6rem;<br \/>\n            }<\/p>\n<p>            .section {<br \/>\n                padding: 18px;<br \/>\n            }<\/p>\n<p>            .contests-grid {<br \/>\n                grid-template-columns: 1fr;<br \/>\n            }<\/p>\n<p>            .form-grid {<br \/>\n                grid-template-columns: 1fr;<br \/>\n            }<\/p>\n<p>            .btn {<br \/>\n                width: 100%;<br \/>\n                justify-content: center;<br \/>\n            }<\/p>\n<p>            .submit-buttons {<br \/>\n                flex-direction: column;<br \/>\n            }<\/p>\n<p>            .btn-primary {<br \/>\n                min-width: auto;<br \/>\n            }<\/p>\n<p>            .result-total-score {<br \/>\n                font-size: 1.8rem;<br \/>\n            }<\/p>\n<p>            .result-header-grid {<br \/>\n                flex-direction: column;<br \/>\n            }<\/p>\n<p>            .stats-bar {<br \/>\n                flex-direction: column;<br \/>\n            }<\/p>\n<p>            .stat-item {<br \/>\n                padding: 6px 0;<br \/>\n            }<\/p>\n<p>            .saved-info-grid {<br \/>\n                grid-template-columns: 1fr;<br \/>\n            }<\/p>\n<p>            .saved-contest-item {<br \/>\n                flex-direction: column;<br \/>\n                gap: 10px;<br \/>\n                align-items: flex-start;<br \/>\n            }<\/p>\n<p>            .saved-contest-details {<br \/>\n                flex-direction: column;<br \/>\n                align-items: flex-start;<br \/>\n                gap: 8px;<br \/>\n            }<\/p>\n<p>            .saved-contest-stats {<br \/>\n                flex-wrap: wrap;<br \/>\n            }<\/p>\n<p>            .saved-actions {<br \/>\n                flex-direction: column;<br \/>\n            }<\/p>\n<p>            .saved-actions .btn {<br \/>\n                width: 100%;<br \/>\n                justify-content: center;<br \/>\n            }<\/p>\n<p>            \/* Responsividade para formularios *\/<br \/>\n            .participant-info .form-row {<br \/>\n                grid-template-columns: 1fr;<br \/>\n            }<\/p>\n<p>            .contest-section .form-row {<br \/>\n                grid-template-columns: 1fr;<br \/>\n            }<\/p>\n<p>            .contest-section .form-row .full-width {<br \/>\n                grid-column: auto;<br \/>\n            }<\/p>\n<p>            \/* Responsividade para contests salvos *\/<br \/>\n            .saved-contest-item {<br \/>\n                flex-direction: column;<br \/>\n                gap: 12px;<br \/>\n            }<\/p>\n<p>            .saved-contest-details {<br \/>\n                flex-direction: column;<br \/>\n                align-items: flex-start;<br \/>\n                gap: 10px;<br \/>\n                width: 100%;<br \/>\n            }<\/p>\n<p>            .saved-contest-stats {<br \/>\n                flex-wrap: wrap;<br \/>\n                gap: 8px;<br \/>\n            }<\/p>\n<p>            .saved-contest-actions {<br \/>\n                margin-left: 0;<br \/>\n                width: 100%;<br \/>\n                justify-content: center;<br \/>\n            }<\/p>\n<p>            .saved-contest-actions .btn-small {<br \/>\n                flex: 1;<br \/>\n                justify-content: center;<br \/>\n                max-width: 120px;<br \/>\n            }<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           SCROLLBAR ESTILIZADA<br \/>\n           ============================================= *\/<br \/>\n        ::-webkit-scrollbar {<br \/>\n            width: 8px;<br \/>\n        }<\/p>\n<p>        ::-webkit-scrollbar-track {<br \/>\n            background: #f0f0f0;<br \/>\n        }<\/p>\n<p>        ::-webkit-scrollbar-thumb {<br \/>\n            background: var(--accent-color);<br \/>\n            border-radius: 4px;<br \/>\n        }<\/p>\n<p>        ::-webkit-scrollbar-thumb:hover {<br \/>\n            background: var(--accent-hover);<br \/>\n        }<\/p>\n<p>        \/* =============================================<br \/>\n           ESTILOS DE IMPRESS\u00c3O<br \/>\n           ============================================= *\/<br \/>\n        @media print {<br \/>\n            .header {<br \/>\n                padding: 15px;<br \/>\n                background: var(--primary-color) !important;<br \/>\n            }<\/p>\n<p>            .header h1 {<br \/>\n                font-size: 1.4rem;<br \/>\n            }<\/p>\n<p>            .header-logo,<br \/>\n            .header-stats {<br \/>\n                display: none;<br \/>\n            }<\/p>\n<p>            .section, .form-section {<br \/>\n                box-shadow: none;<br \/>\n                border: 1px solid #ccc;<br \/>\n                page-break-inside: avoid;<br \/>\n            }<\/p>\n<p>            .btn {<br \/>\n                display: none !important;<br \/>\n            }<\/p>\n<p>            .form-actions, .submit-buttons {<br \/>\n                display: none !important;<br \/>\n            }<\/p>\n<p>            .result-display {<br \/>\n                display: block !important;<br \/>\n                background: #bdc3c7 !important;<br \/>\n                color: #1a252f !important;<br \/>\n                border: 2px solid #2c3e50 !important;<br \/>\n                page-break-inside: avoid;<br \/>\n            }<\/p>\n<p>            .result-display h2 {<br \/>\n                color: #1a252f;<br \/>\n                border-bottom-color: #2c3e50;<br \/>\n            }<\/p>\n<p>            .result-total {<br \/>\n                background: #2c3e50 !important;<br \/>\n                color: white !important;<br \/>\n                border-color: #5dade2 !important;<br \/>\n            }<\/p>\n<p>            .result-total-score {<br \/>\n                -webkit-text-fill-color: #5dade2;<br \/>\n            }<\/p>\n<p>            footer {<br \/>\n                margin-top: 15px;<br \/>\n                padding: 15px;<br \/>\n                background: var(--primary-color) !important;<br \/>\n            }<\/p>\n<p>            .progress-container {<br \/>\n                display: none;<br \/>\n            }<br \/>\n        }<br \/>\n    <\/style>\n<p><!-- Header --><\/p>\n<header class=\"header\">\n<div class=\"header-content\">\n<div class=\"header-logo\">\ud83c\udfc6<\/div>\n<div class=\"header-text\">\n<h1>Tr\u00f3feu Efici\u00eancia em CW<\/h1>\n<p class=\"subtitle\">Cat\u00e1logo Oficial de Contests V\u00e1lidos &#8211; <strong>Per\u00edodo de Apura\u00e7\u00e3o: Janeiro a Dezembro<\/strong><\/p>\n<\/div>\n<\/div>\n<\/header>\n<div class=\"container\"><!-- About Section --><\/p>\n<section class=\"section\">\n<div class=\"section-header\">\n<div class=\"section-icon\">\ud83d\udccb<\/div>\n<h2>Sobre o Trof\u00e9u<\/h2>\n<\/div>\n<p>O <strong>Tr\u00f3feu Efici\u00eancia em CW<\/strong> \u00e9 um pr\u00eamio concedido pelo <strong>CWSP &#8211; Grupo de CW de S\u00e3o Paulo<\/strong>, que reconhece a participa\u00e7\u00e3o e o desempenho de Radioamadores brasileiros em Contestes Nacionais e Internacionais, exclusivamente em modo CW.<\/p>\n<p>Este trof\u00e9u foi reformulado para lan\u00e7amento nas celebra\u00e7\u00f5es do cinquenten\u00e1rio de funda\u00e7\u00e3o do CWSP, representando meio s\u00e9culo de promo\u00e7\u00e3o e desenvolvimento do telegrafismo no Brasil.<\/p>\n<div class=\"formula-section\">\n<h4>\ud83c\udfaf Objetivo Principal<\/h4>\n<p style=\"margin-top: 8px;\">Estimular o desenvolvimento do desempenho por meio da competi\u00e7\u00e3o entre Radioamadores, ao mesmo tempo em que <strong>prestigia preferencialmente os Contestes Nacionais<\/strong> no modo CW, fortalecendo a comunidade radioamador\u00edstica brasileira.<\/p>\n<\/div>\n<div class=\"alert alert-info\">\u2139\ufe0f<br \/>\nO per\u00edodo para apura\u00e7\u00e3o \u00e9 <strong>anual<\/strong>, de <strong>janeiro a dezembro<\/strong> de cada ano, come\u00e7ando em <strong>2026<\/strong>.<\/div>\n<\/section>\n<p><!-- Requirements Section --><\/p>\n<section class=\"section\">\n<div class=\"section-header\">\n<div class=\"section-icon\">\ud83d\udcdd<\/div>\n<h2>Requisitos de Participa\u00e7\u00e3o<\/h2>\n<\/div>\n<p>Para participar do Tr\u00f3feu Efici\u00eancia em CW, os radioamadores devem cumprir os seguintes requisitos:<\/p>\n<ul class=\"requirements-list\">\n<li><strong>Envio de Print:<\/strong> Captura de tela com o Resultado Final Oficial de cada Conteste V\u00e1lido<\/li>\n<li><strong>Informa\u00e7\u00f5es Obrigat\u00f3rias:<\/strong> Deve constar a classifica\u00e7\u00e3o e o n\u00famero de participantes na Categoria<\/li>\n<li><strong>Men\u00e7\u00e3o do CWSP como Club:<\/strong> Opcional, oferece b\u00f4nus de 15% quando indicado no Log<\/li>\n<li><strong>Prazo de Envio:<\/strong> M\u00e1ximo de <strong>7 dias<\/strong> ap\u00f3s a publica\u00e7\u00e3o do Resultado Final<\/li>\n<li><strong>E-mail para Envio:<\/strong> <strong><a class=\"__cf_email__\" href=\"\/cdn-cgi\/l\/email-protection\" data-cfemail=\"3c484e535a59497c5f4b4f4c125f5351125e4e\"><span class=\"__cf_email__\" data-cfemail=\"691d1b060f0c1c290a1e1a19470a0604470b1b\"><span class=\"__cf_email__\" data-cfemail=\"1460667b72716154776367643a777b793a7666\">trofeu@cwsp.com.br<\/span><\/span><\/a><\/strong><\/li>\n<li><strong>Aceite do Regulamento:<\/strong> Ao enviar, declara estar de acordo com todas as regras<\/li>\n<\/ul>\n<div class=\"alert alert-warning\">\u26a0\ufe0f<br \/>\n<strong>Nota para Estrangeiros:<\/strong> Membros CWSP estrangeiros receber\u00e3o pontos equivalentes \u00e0 m\u00e9dia dos brasileiros nos contests exclusivos (CBNR, FRP, 2 de Julho).<\/div>\n<\/section>\n<p><!-- Scoring Section --><\/p>\n<section class=\"section\">\n<div class=\"section-header\">\n<div class=\"section-icon\">\ud83d\udcca<\/div>\n<h2>Sistema de Pontua\u00e7\u00e3o<\/h2>\n<\/div>\n<p>O Escore ser\u00e1 apurado considerando a classifica\u00e7\u00e3o alcan\u00e7ada pelo operador na categoria em que se inscreveu em cada Conteste durante o ano.<\/p>\n<div class=\"formula-section\">\n<h4>\ud83d\udcd0 F\u00f3rmula de C\u00e1lculo<\/h4>\n<div class=\"formula\">E = P-(C &#8211; 1)<\/div>\n<div class=\"formula-description\">\n<p><strong>Onde:<\/strong><\/p>\n<p><strong>E<\/strong> = Escore na Categoria | <strong>P<\/strong> = Participantes na Categoria | <strong>C<\/strong> = Classifica\u00e7\u00e3o<\/p>\n<\/div>\n<\/div>\n<p style=\"margin-top: 12px;\">O <strong>Escore Final<\/strong> \u00e9 a soma de todos os escores mensais. O CWSP publicar\u00e1 mensalmente os Escores em <strong>www.portal.cwsp.com.br<\/strong>.<\/p>\n<div class=\"bonus-info\">\n<h4>\ud83c\udf81 B\u00f4nus Especiais<\/h4>\n<ul>\n<li><span class=\"bonus-badge\">+15%<\/span> Ao indicar o <strong>CWSP como Clube<\/strong> no Log<\/li>\n<li><span class=\"bonus-badge\">+50%<\/span> Para participantes do <strong>SACW<\/strong><\/li>\n<\/ul>\n<\/div>\n<\/section>\n<p><!-- Awards Section --><\/p>\n<section class=\"section\">\n<div class=\"section-header\">\n<div class=\"section-icon\">\ud83c\udfc5<\/div>\n<h2>Premia\u00e7\u00e3o<\/h2>\n<\/div>\n<p>Ser\u00e1 premierado como <strong>Vencedor<\/strong>, recebendo o <strong>Tr\u00f3feu Efici\u00eancia em CW<\/strong>, o Radioamador que alcan\u00e7ar o maior Escore Final no per\u00edodo anual.<\/p>\n<div class=\"formula-section award-section\">\n<h4>\ud83c\udfc6 Grande Pr\u00eamio<\/h4>\n<p style=\"margin-top: 6px;\">O vencedor ter\u00e1 seu indicativo gravado no trof\u00e9u e receber\u00e1 reconhecimento especial junto \u00e0 comunidade de radioamadores.<\/p>\n<\/div>\n<p style=\"margin-top: 10px;\">A data, local e condi\u00e7\u00e3o da entrega ser\u00e3o comunicados no site do CWSP.<\/p>\n<\/section>\n<p><!-- Calendar Section --><\/p>\n<section class=\"section\">\n<div class=\"section-header\">\n<div class=\"section-icon\">\ud83d\udcc5<\/div>\n<h2>Calend\u00e1rio de Contests V\u00e1lidos<\/h2>\n<\/div>\n<p>Lista completa dos contests v\u00e1lidos para o Tr\u00f3feu Efici\u00eancia em CW, organizados por m\u00eas:<\/p>\n<div id=\"contestsGrid\" class=\"contests-grid\"><!-- Os contests ser\u00e3o inseridos via JavaScript --><\/div>\n<\/section>\n<p><!-- Registration Form Section --><\/p>\n<section id=\"registration\" class=\"form-section\">\n<div class=\"section-header\">\n<div class=\"section-icon\">\ud83d\udcdd<\/div>\n<h2>Registro de Resultados dos Contests<\/h2>\n<\/div>\n<p>Preencha os dados abaixo para calcular sua pontua\u00e7\u00e3o no Tr\u00f3feu Efici\u00eancia em CW.<\/p>\n<form id=\"contestForm\"><!-- Formul\u00e1rio Principal: Dados do Participante --><\/p>\n<div class=\"main-form-container\"><!-- Dados do Participante --><\/p>\n<div class=\"participant-info\">\n<h3>\ud83d\udc64 Dados do Participante<\/h3>\n<p><!-- Linha com 3 campos: Indicativo, Nome e E-mail --><\/p>\n<div class=\"form-row\">\n<div class=\"form-group\"><label for=\"callsign\">\ud83d\udce1 Indicativo<\/label><br \/>\n<input id=\"callsign\" name=\"callsign\" pattern=\"[A-Za-z0-9]+\" required=\"\" type=\"text\" placeholder=\"Ex: PY1ABC\" \/><\/div>\n<div class=\"form-group\"><label for=\"name\">\ud83d\udc64 Nome Completo<\/label><br \/>\n<input id=\"name\" name=\"name\" required=\"\" type=\"text\" placeholder=\"Seu nome completo\" \/><\/div>\n<div class=\"form-group\"><label for=\"email\">\ud83d\udce7 E-mail<\/label><br \/>\n<input id=\"email\" name=\"email\" required=\"\" type=\"email\" placeholder=\"seu@email.com\" \/><\/div>\n<\/div>\n<p><!-- Linha com 3 campos: Categoria, Ano e Membro CWSP --><\/p>\n<div class=\"form-row\">\n<div class=\"form-group\"><label for=\"category\">\ud83c\udfc6 Categoria \u00danica<\/label><br \/>\n<select id=\"category\" name=\"category\" required=\"\"><option value=\"single-op\">Single Operator<\/option><\/select><\/div>\n<div class=\"form-group\"><label for=\"year\">\ud83d\udcc5 Ano<\/label><br \/>\n<select id=\"year\" name=\"year\" required=\"\"><option value=\"2026\">2026<\/option><option value=\"2027\">2027<\/option><option value=\"2028\">2028<\/option><\/select><\/div>\n<div class=\"form-group\"><label>\ud83c\udf96\ufe0f Membro CWSP?<\/label><\/p>\n<div class=\"radio-group\"><label class=\"radio-label\"><br \/>\n<input name=\"cwsp-member\" type=\"radio\" value=\"sim\" \/><br \/>\nSim<br \/>\n<\/label><br \/>\n<label class=\"radio-label\"><br \/>\n<input name=\"cwsp-member\" type=\"radio\" value=\"nao\" \/><br \/>\nN\u00e3o<br \/>\n<\/label><\/div>\n<\/div>\n<\/div>\n<p><!-- Bot\u00e3o Salvar Dados do Participante --><\/p>\n<div class=\"participant-save-section\"><button id=\"saveParticipantBtn\" class=\"btn btn-primary\" type=\"button\"><br \/>\n\ud83d\udcbe Salvar Dados do Participante<br \/>\n<\/button><\/div>\n<\/div>\n<\/div>\n<p><!-- Se\u00e7\u00e3o Contest Participado (aparece ap\u00f3s salvar participante) --><\/p>\n<div id=\"contestSection\" class=\"contest-section\" style=\"display: none;\">\n<div class=\"contest-entry\">\n<h3>\ud83c\udfc6 Contest Participado<\/h3>\n<p><!-- Linha 1: Contest, Participantes e Coloca\u00e7\u00e3o (3 colunas) --><\/p>\n<div class=\"form-row form-row-3\">\n<div class=\"form-group\"><label for=\"contest1\">\ud83c\udfc6 Contest<\/label><br \/>\n<select name=\"contest1\"><option value=\"\">Selecione o contest<\/option><optgroup label=\"Janeiro\"><option value=\"HADX\">HADX<\/option><option value=\"REFCW\">REFCW<\/option><\/optgroup><br \/>\n<\/select><br \/>\n<select name=\"contest1\"><optgroup label=\"Fevereiro\"><option value=\"EUDXC\">EUDXC<\/option><option value=\"ARRLDXCW\">ARRLDXCW<\/option><\/optgroup><br \/>\n<\/select><br \/>\n<select name=\"contest1\"><optgroup label=\"Mar\u00e7o\"><option value=\"SA10_SA\">SA10_SA<\/option><option value=\"RUSSIAN_DX\">RUSSIAN_DX<\/option><\/optgroup><br \/>\n<\/select><br \/>\n<select name=\"contest1\"><optgroup label=\"Abril\"><option value=\"CQMM_DX\">CQMM_DX<\/option><option value=\"CBJ\">CBJ<\/option><\/optgroup><br \/>\n<\/select><br \/>\n<select name=\"contest1\"><optgroup label=\"Maio\"><option value=\"CQM\">CQM<\/option><option value=\"KINGEACW\">KINGEACW<\/option><option value=\"CQWPX\">CQWPX<\/option><\/optgroup><br \/>\n<\/select><br \/>\n<select name=\"contest1\"><optgroup label=\"Junho\"><option value=\"GACW\">GACW<\/option><option value=\"CNBR\">CNBR<\/option><\/optgroup><br \/>\n<\/select><br \/>\n<select name=\"contest1\"><optgroup label=\"Julho\"><option value=\"IARU\">IARU<\/option><option value=\"LABRE_BA\">LABRE_BA<\/option><\/optgroup><br \/>\n<\/select><br \/>\n<select name=\"contest1\"><optgroup label=\"Agosto\"><option value=\"WAE_CW\">WAE_CW<\/option><option value=\"CVA_CW\">CVA_CW<\/option><\/optgroup><br \/>\n<\/select><br \/>\n<select name=\"contest1\"><optgroup label=\"Setembro\"><option value=\"YO_DX_HF\">YO_DX_HF<\/option><option value=\"SAC_CW\">SAC_CW<\/option><\/optgroup><br \/>\n<\/select><br \/>\n<select name=\"contest1\"><optgroup label=\"Outubro\"><option value=\"WAG\">WAG<\/option><option value=\"OCEANIA_CW\">OCEANIA_CW<\/option><\/optgroup><br \/>\n<\/select><br \/>\n<select name=\"contest1\"><optgroup label=\"Novembro\"><option value=\"SACW\">SACW<\/option><option value=\"CQWW_CW\">CQWW_CW<\/option><\/optgroup><br \/>\n<\/select><br \/>\n<select name=\"contest1\"><optgroup label=\"Dezembro\"><option value=\"ARRL_10M\">ARRL_10M<\/option><option value=\"9A_CW\">9A_CW<\/option><\/optgroup><br \/>\n<\/select><\/div>\n<div class=\"form-group\"><label for=\"participants1\">\ud83d\udc65 Participantes<\/label><br \/>\n<input id=\"participants1\" min=\"1\" name=\"participants1\" type=\"number\" placeholder=\"Ex: 150\" \/><\/div>\n<div class=\"form-group\"><label for=\"position1\">\ud83c\udfc5 Coloca\u00e7\u00e3o<\/label><br \/>\n<input id=\"position1\" min=\"1\" name=\"position1\" type=\"number\" placeholder=\"Ex: 25\" \/><\/div>\n<\/div>\n<p><!-- Linha 2: M\u00eas, Score, Total de QSO's e CWSP Club (4 colunas) --><\/p>\n<div class=\"form-row form-row-4\">\n<div class=\"form-group\"><label for=\"month1\">\ud83d\udcc6 M\u00eas<\/label><br \/>\n<select id=\"month1\" name=\"month1\"><option value=\"1\">Janeiro<\/option><option value=\"2\">Fevereiro<\/option><option value=\"3\">Mar\u00e7o<\/option><option value=\"4\">Abril<\/option><option value=\"5\">Maio<\/option><option value=\"6\">Junho<\/option><option value=\"7\">Julho<\/option><option value=\"8\">Agosto<\/option><option value=\"9\">Setembro<\/option><option value=\"10\">Outubro<\/option><option value=\"11\">Novembro<\/option><option value=\"12\">Dezembro<\/option><\/select><\/div>\n<div class=\"form-group\"><label for=\"score1\">\ud83d\udcca Score<\/label><br \/>\n<input id=\"score1\" min=\"0\" name=\"score1\" step=\"0.01\" type=\"number\" placeholder=\"Ex: 85.5\" \/><\/div>\n<div class=\"form-group\"><label for=\"qso1\">\ud83d\udce1 Total de QSO&#8217;s<\/label><br \/>\n<input id=\"qso1\" min=\"0\" name=\"qso1\" type=\"number\" placeholder=\"Ex: 120\" \/><\/div>\n<div class=\"form-group\"><label for=\"cwsp-club1\">\ud83c\udf96\ufe0f CWSP Club?<\/label><br \/>\n<select id=\"cwsp-club1\" name=\"cwsp-club1\"><option value=\"nao\">N\u00e3o<\/option><option value=\"sim\">Sim (+15%)<\/option><\/select><\/div>\n<\/div>\n<\/div>\n<p><!-- Bot\u00e3o Adicionar Contest --><\/p>\n<div class=\"form-actions\"><button id=\"addContestBtn\" class=\"btn\" type=\"button\">\u2795 Adicionar Contest<\/button><\/div>\n<p><!-- Progress Indicator --><\/p>\n<div class=\"progress-container\">\n<div class=\"progress-label\">Contests adicionados<br \/>\n<span id=\"progressText\">Nenhum contest<\/span><\/div>\n<div class=\"progress-bar\">\n<div id=\"progressFill\" class=\"progress-fill\" style=\"width: 0%;\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><!-- Submit Buttons --><\/p>\n<div class=\"submit-buttons\"><button id=\"calculateBtn\" class=\"btn btn-primary\" type=\"submit\"><br \/>\n\ud83d\udcca Calcular Resultado<br \/>\n<\/button><br \/>\n<button id=\"saveProgressBtn\" class=\"btn btn-secondary\" type=\"button\"><br \/>\n\ud83d\udcbe Salvar<br \/>\n<\/button><br \/>\n<button id=\"loadProgressBtn\" class=\"btn btn-secondary\" type=\"button\"><br \/>\n\ud83d\udcc2 Carregar<br \/>\n<\/button><br \/>\n<button id=\"exportResultsBtn\" class=\"btn btn-secondary\" type=\"button\"><br \/>\n\ud83d\udce4 Exportar<br \/>\n<\/button><\/div>\n<\/form>\n<p><!-- Box de Resultados Salvos (informa\u00e7\u00f5es fixas exibidas ap\u00f3s salvar) --><\/p>\n<div id=\"savedResultsBox\" class=\"saved-results-box\" style=\"display: none;\">\n<div class=\"section-header\">\n<div class=\"section-icon\">\ud83d\udccb<\/div>\n<h2>Resumo dos Dados Salvos<\/h2>\n<\/div>\n<div class=\"saved-participant-info\">\n<h4>\ud83d\udce1 Dados do Participante<\/h4>\n<div class=\"saved-info-grid\">\n<div class=\"saved-info-item\"><span class=\"saved-info-label\">Indicativo:<\/span><br \/>\n<span id=\"savedCallsign\" class=\"saved-info-value\">&#8211;<\/span><\/div>\n<div class=\"saved-info-item\"><span class=\"saved-info-label\">Nome:<\/span><br \/>\n<span id=\"savedName\" class=\"saved-info-value\">&#8211;<\/span><\/div>\n<div class=\"saved-info-item\"><span class=\"saved-info-label\">E-mail:<\/span><br \/>\n<span id=\"savedEmail\" class=\"saved-info-value\">&#8211;<\/span><\/div>\n<div class=\"saved-info-item\"><span class=\"saved-info-label\">Categoria \u00danica:<\/span><br \/>\n<span id=\"savedCategory\" class=\"saved-info-value\">&#8211;<\/span><\/div>\n<div class=\"saved-info-item\"><span class=\"saved-info-label\">Ano:<\/span><br \/>\n<span id=\"savedYear\" class=\"saved-info-value\">&#8211;<\/span><\/div>\n<div class=\"saved-info-item\"><span class=\"saved-info-label\">Membro CWSP:<\/span><br \/>\n<span id=\"savedCwspMember\" class=\"saved-info-value\">&#8211;<\/span><\/div>\n<\/div>\n<\/div>\n<div class=\"saved-contests-summary\">\n<h4>\ud83d\udcca Contests Participados<\/h4>\n<div id=\"savedContestsList\" class=\"saved-contests-list\"><!-- Lista de contests salvos ser\u00e1 inserida aqui --><\/div>\n<div class=\"saved-total\"><span class=\"saved-total-label\">Total de Contests:<\/span><br \/>\n<span id=\"savedTotalContests\" class=\"saved-total-value\">0<\/span><\/div>\n<\/div>\n<div class=\"saved-actions\"><button class=\"btn\" type=\"button\">\u270f\ufe0f Editar Dados<\/button><br \/>\n<button class=\"btn btn-primary\" type=\"button\">\ud83d\udcca Calcular Resultado<\/button><\/div>\n<\/div>\n<p><!-- Result Display --><\/p>\n<div id=\"resultDisplay\" class=\"result-display\" style=\"display: none;\">\n<h2>\ud83d\udcca Resultado Final<\/h2>\n<div class=\"result-header\">\n<div class=\"result-header-grid\">\n<div><strong>\ud83d\udce1 Indicativo:<\/strong> <span id=\"resultCallsign\"><\/span><\/div>\n<div><strong>\ud83d\udc64 Participante:<\/strong> <span id=\"resultName\"><\/span><\/div>\n<div><strong>\ud83c\udfc6 Categoria:<\/strong> <span id=\"resultCategory\"><\/span><\/div>\n<div><strong>\ud83d\udcc5 Ano:<\/strong> <span id=\"resultYear\"><\/span><\/div>\n<\/div>\n<\/div>\n<div id=\"resultContent\">\n<p style=\"text-align: center; padding: 30px; color: var(--text-light);\">\ud83d\udccb Adicione contests e clique em &#8220;Calcular Resultado&#8221; para ver sua pontua\u00e7\u00e3o.<\/p>\n<\/div>\n<div class=\"result-total\">\n<div class=\"result-total-label\">\ud83c\udfaf ESCORE FINAL TOTAL<\/div>\n<div id=\"totalScore\" class=\"result-total-score\">0.00<\/div>\n<div>Pontos<\/div>\n<\/div>\n<div class=\"stats-bar\">\n<div class=\"stat-item\">\n<div id=\"totalContests\" class=\"stat-value\">0<\/div>\n<div class=\"stat-label\">Contests<\/div>\n<\/div>\n<div class=\"stat-item\">\n<div id=\"totalParticipants\" class=\"stat-value\">0<\/div>\n<div class=\"stat-label\">Participantes<\/div>\n<\/div>\n<div class=\"stat-item\">\n<div id=\"averagePosition\" class=\"stat-value\">0<\/div>\n<div class=\"stat-label\">M\u00e9dia Coloca\u00e7\u00e3o<\/div>\n<\/div>\n<div class=\"stat-item\">\n<div id=\"totalBonuses\" class=\"stat-value\">0<\/div>\n<div class=\"stat-label\">B\u00f4nus<\/div>\n<\/div>\n<\/div>\n<div class=\"result-contact\">\n<p style=\"margin-bottom: 10px; opacity: 0.9;\">\ud83d\udce7 Envie este resultado com prints para:<\/p>\n<div class=\"footer-email\"><a class=\"__cf_email__\" href=\"\/cdn-cgi\/l\/email-protection\" data-cfemail=\"dca8aeb3bab9a99cbfabafacf2bfb3b1f2beae\"><span class=\"__cf_email__\" data-cfemail=\"dfabadb0b9baaa9fbca8acaff1bcb0b2f1bdad\"><span class=\"__cf_email__\" data-cfemail=\"fe8a8c91989b8bbe9d898d8ed09d9193d09c8c\">trofeu@cwsp.com.br<\/span><\/span><\/a><\/div>\n<\/div>\n<div class=\"result-actions\"><button class=\"btn\" type=\"button\">\ud83d\udda8\ufe0f Imprimir<\/button><br \/>\n<button class=\"btn btn-secondary\" type=\"button\">\ud83d\udccb Copiar<\/button><\/div>\n<\/div>\n<\/section>\n<\/div>\n<p><!-- Footer --><\/p>\n<footer>\n<div class=\"footer-content\">\n<div class=\"footer-title\">\ud83c\udfc6 TR\u00d3FEU EFICI\u00caNCIA EM CW &#8211; CWSP<\/div>\n<p class=\"footer-info\">Grupo de CW de S\u00e3o Paulo &#8211; Promovendo o telegrafismo desde 1976<\/p>\n<p class=\"footer-info\">50 anos de excel\u00eancia em CW<\/p>\n<div class=\"footer-contact\">\n<p>\ud83d\udce7 Resultados: <a class=\"__cf_email__\" href=\"\/cdn-cgi\/l\/email-protection\" data-cfemail=\"7206001d14170732110501025c111d1f5c1000\"><span class=\"__cf_email__\" data-cfemail=\"dca8aeb3bab9a99cbfabafacf2bfb3b1f2beae\"><span class=\"__cf_email__\" data-cfemail=\"ccb8bea3aaa9b98cafbbbfbce2afa3a1e2aebe\">trofeu@cwsp.com.br<\/span><\/span><\/a><\/p>\n<p style=\"margin-top: 8px; opacity: 0.8;\">\u23f0 Prazo: 7 dias ap\u00f3s resultados oficiais<\/p>\n<p style=\"margin-top: 6px; opacity: 0.8;\">\ud83c\udf10 <a class=\"footer-link\" href=\"https:\/\/www.portal.cwsp.com.br\">www.portal.cwsp.com.br<\/a><\/p>\n<\/div>\n<\/div>\n<\/footer>\n<p><script data-cfasync=\"false\" src=\"\/cdn-cgi\/scripts\/5c5dd728\/cloudflare-static\/email-decode.min.js\"><\/script><script data-cfasync=\"false\" src=\"\/cdn-cgi\/scripts\/5c5dd728\/cloudflare-static\/email-decode.min.js\"><\/script><script data-cfasync=\"false\" src=\"\/cdn-cgi\/scripts\/5c5dd728\/cloudflare-static\/email-decode.min.js\"><\/script><script>\n        \/**\n         * =============================================\n         * TR\u00d3FEU EFICI\u00caNCIA EM CW - JAVASCRIPT\n         * =============================================\n         *\/<\/p>\n<p>        \/\/ Vari\u00e1veis globais\n        let contestCount = 0;\n        const maxContests = 50;<\/p>\n<p>        \/\/ Nomes dos meses\n        const monthNames = ['', 'Janeiro', 'Fevereiro', 'Mar\u00e7o', 'Abril', 'Maio', 'Junho', \n                            'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];<\/p>\n<p>        \/\/ Mapeamento de contests para meses\n        const contestMonthMapping = {\n            'REF_CW': 1,\n            'EU_DXC': 2, 'ARRL_DX_CW': 2,\n            'SA10_SA': 3, 'RUSSIAN_DX': 3,\n            'CQMM_DX': 4, 'CBJ_DX_CW': 4,\n            'KINGEACW': 5, 'CQWPX': 5,\n            'WWSA_DX': 6, 'QRS_10': 6, 'CNBR': 6,\n            '2_DE_JULHO': 7, 'IARU_HF_CW': 7, 'IOTA_CW': 7,\n            'WAE_CW': 8, 'CVADX_CW': 8,\n            'FRP_CW': 9,\n            'OC_DX_CW': 10,\n            'SACW': 11, 'CQWW_CW': 11,\n            'ARRL_10M': 12, 'MQRS10': 12\n        };<\/p>\n<p>        \/\/ Dados dos contests por m\u00eas com datas e URLs\n        const contestsByMonth = {\n            1: [\n                { name: 'REF_CW', date: '25\/01', url: 'https:\/\/concours.r-e-f.org\/contest\/' }\n            ],\n            2: [\n                { name: 'EU_DXC', date: '08\/02', url: 'https:\/\/www.eudx-contest.com\/' }, \n                { name: 'ARRL_DX_CW', date: '22\/02', url: 'https:\/\/www.arrl.org\/arrl-dx' }\n            ],\n            3: [\n                { name: 'SA10_SA', date: '15\/03', url: 'https:\/\/sa10m.com.ar\/wp\/' }, \n                { name: 'RUSSIAN_DX', date: '22\/03', url: 'https:\/\/www.rdxc.org\/rules_eng' }\n            ],\n            4: [\n                { name: 'CQMM_DX', date: '19\/04', url: 'http:\/\/www.cqmmdx.com\/rules' }, \n                { name: 'CBJ_DX_CW', date: '26\/04', url: 'https:\/\/hampass.com\/cbjdx' }\n            ],\n            5: [\n                { name: 'KINGEACW', date: '17\/05', url: 'https:\/\/concursos.ure.es\/en\/s-m-el-rey-de-espana-cw\/bases\/' }, \n                { name: 'CQWPX', date: '31\/05', url: 'https:\/\/cqwpx.com\/' }\n            ],\n            6: [\n                { name: 'WWSA_DX', date: '14\/06', url: 'https:\/\/gacw.ar\/' }, \n                { name: 'QRS_10', date: '21\/06', url: 'https:\/\/www.labre.org.br\/concurso-qrs-10-2025\/' }, \n                { name: 'CNBR', date: '28\/06', url: 'https:\/\/contestbr.org\/' }\n            ],\n            7: [\n                { name: '2_DE_JULHO', date: '05\/07', url: 'https:\/\/labre-ba.org.br\/concurso-2-de-julho-3\/' }, \n                { name: 'IARU_HF_CW', date: '12\/07', url: 'https:\/\/www.arrl.org\/iaru-hf-world-championship' }, \n                { name: 'IOTA_CW', date: '26\/07', url: 'https:\/\/www.rsgbcc.org\/hf\/rules\/2025\/riota.shtml' }\n            ],\n            8: [\n                { name: 'WAE_CW', date: '09\/08', url: 'https:\/\/www.darc.de\/der-club\/referate\/conteste\/wae-dx-contest\/en\/' }, \n                { name: 'CVADX_CW', date: '16\/08', url: 'https:\/\/cvadx.org\/' }\n            ],\n            9: [\n                { name: 'FRP_CW', date: '20\/09', url: 'https:\/\/hampass.com\/farroupilha' }\n            ],\n            10: [\n                { name: 'OC_DX_CW', date: '18\/10', url: 'https:\/\/www.oceaniadxcontest.com\/' }\n            ],\n            11: [\n                { name: 'SACW', date: '08\/11', url: 'https:\/\/sacw.cwsp.com.br\/' }, \n                { name: 'CQWW_CW', date: '22\/11', url: 'https:\/\/cqww.com\/' }\n            ],\n            12: [\n                { name: 'ARRL_10M', date: '06\/12', url: 'https:\/\/www.arrl.org\/10-meter' }, \n                { name: 'MQRS10', date: '20\/12', url: 'https:\/\/www.599dxgroup.com.br\/mqrs10' }\n            ]\n        };<\/p>\n<p>        \/\/ Labels para meses\n        const monthLabels = {\n            1: 'Janeiro', 2: 'Fevereiro', 3: 'Mar\u00e7o', 4: 'Abril',\n            5: 'Maio', 6: 'Junho', 7: 'Julho', 8: 'Agosto',\n            9: 'Setembro', 10: 'Outubro', 11: 'Novembro', 12: 'Dezembro'\n        };<\/p>\n<p>        \/\/ \u00cdcones para os meses\n        const monthIcons = {\n            1: '\ud83d\uddd3\ufe0f', 2: '\ud83d\uddd3\ufe0f', 3: '\ud83d\uddd3\ufe0f', 4: '\ud83d\uddd3\ufe0f', 5: '\ud83d\uddd3\ufe0f', 6: '\ud83d\uddd3\ufe0f',\n            7: '\ud83d\uddd3\ufe0f', 8: '\ud83d\uddd3\ufe0f', 9: '\ud83d\uddd3\ufe0f', 10: '\ud83d\uddd3\ufe0f', 11: '\ud83d\uddd3\ufe0f', 12: '\ud83d\uddd3\ufe0f'\n        };<\/p>\n<p>        \/\/ Op\u00e7\u00f5es do select de contests\n        const contestSelectOptions = `<option value=\"\">Selecione o contest<\/option><optgroup label=\"Janeiro\"><option value=\"REF_CW\">REF_CW<\/option><\/optgroup>\n            <optgroup label=\"Fevereiro\"><option value=\"EU_DXC\">EU_DXC<\/option><option value=\"ARRL_DX_CW\">ARRL_DX_CW<\/option><\/optgroup>\n            <optgroup label=\"Mar\u00e7o\"><option value=\"SA10_SA\">SA10_SA<\/option><option value=\"RUSSIAN_DX\">RUSSIAN_DX<\/option><\/optgroup>\n            <optgroup label=\"Abril\"><option value=\"CQMM_DX\">CQMM_DX<\/option><option value=\"CBJ_DX_CW\">CBJ_DX_CW<\/option><\/optgroup>\n            <optgroup label=\"Maio\"><option value=\"KINGEACW\">KINGEACW<\/option><option value=\"CQWPX\">CQWPX<\/option><\/optgroup>\n            <optgroup label=\"Junho\"><option value=\"WWSA_DX\">WWSA_DX<\/option><option value=\"QRS_10\">QRS_10<\/option><option value=\"CNBR\">CNBR<\/option><\/optgroup>\n            <optgroup label=\"Julho\"><option value=\"2_DE_JULHO\">2_DE_JULHO<\/option><option value=\"IARU_HF_CW\">IARU_HF_CW<\/option><option value=\"IOTA_CW\">IOTA_CW<\/option><\/optgroup>\n            <optgroup label=\"Agosto\"><option value=\"WAE_CW\">WAE_CW<\/option><option value=\"CVADX_CW\">CVADX_CW<\/option><\/optgroup>\n            <optgroup label=\"Setembro\"><option value=\"FRP_CW\">FRP_CW<\/option><\/optgroup>\n            <optgroup label=\"Outubro\"><option value=\"OC_DX_CW\">OC_DX_CW<\/option><\/optgroup>\n            <optgroup label=\"Novembro\"><option value=\"SACW\">SACW<\/option><option value=\"CQWW_CW\">CQWW_CW<\/option><\/optgroup>\n            <optgroup label=\"Dezembro\"><option value=\"ARRL_10M\">ARRL_10M<\/option><option value=\"MQRS10\">MQRS10<\/option><\/optgroup>\n        `;<\/p>\n<p>        \/\/ =============================================\n        \/\/ INICIALIZA\u00c7\u00c3O\n        \/\/ =============================================\n        let initializationCount = 0;\n        document.addEventListener('DOMContentLoaded', function() {\n            initializationCount++;\n            console.log('DOMContentLoaded fired, count:', initializationCount);\n            initializeContestsGrid();\n            \/\/ N\u00e3o inicializa nenhum contest automaticamente - p\u00e1gina come\u00e7a limpa\n            initializeEventListeners();\n            updateProgress();\n        });<\/p>\n<p>        \/**\n         * Inicializa a grade de contests do calend\u00e1rio\n         *\/\n        function initializeContestsGrid() {\n            const grid = document.getElementById('contestsGrid');\n            if (!grid) return;<\/p>\n<p>            \/\/ Obter data atual\n            const now = new Date();\n            const currentMonth = now.getMonth() + 1; \/\/ getMonth() retorna 0-11\n            const currentDay = now.getDate();<\/p>\n<p>            let html = '';\n            for (let month = 1; month <= 12; month++) {\n                const contests = contestsByMonth[month];\n                if (!contests) continue;\n\n                html += `\n                    <\/p>\n<div class=\"month-card\">\n<div class=\"month-header\">\n                            <span class=\"month-icon\">${monthIcons[month]}<\/span>\n                            ${monthLabels[month]}\n                        <\/div>\n<\/p>\n<div class=\"contest-list\">\n<p>\n                `;<\/p>\n<p>                contests.forEach(contest => {\n                    \/\/ Determinar a classe de cor baseada no status do contest\n                    let dateClass = 'future';\n                    let statusText = '';<\/p>\n<p>                    if (month < currentMonth) {\n                        \/\/ Contest j\u00e1 passou (m\u00eas anterior ao atual)\n                        dateClass = 'passed';\n                    } else if (month === currentMonth) {\n                        \/\/ Contest no m\u00eas atual - verificar o dia\n                        const contestDay = parseInt(contest.date.split('\/')[0]);\n                        if (contestDay < currentDay) {\n                            dateClass = 'passed';\n                        } else {\n                            dateClass = 'current-month';\n                        }\n                    } else {\n                        \/\/ Contest ainda vai acontecer (m\u00eas futuro)\n                        dateClass = 'future';\n                    }\n\n                    html += `\n                        <\/p>\n<div class=\"contest-item\">\n                            <a href=\"${contest.url}\" target=\"_blank\" class=\"contest-name\" title=\"Ver regulamento do contest\">${contest.name}<\/a>\n                            <span class=\"contest-date ${dateClass}\">${contest.date}<\/span>\n                        <\/div>\n<p>\n                    `;\n                });<\/p>\n<p>                html += `<\/p><\/div>\n<\/div>\n<p>`;\n            }\n            grid.innerHTML = html;\n        }<\/p>\n<p>        \/**\n         * Inicializa o primeiro contest no formul\u00e1rio\n         *\/\n        function initializeFirstContest() {\n            const container = document.getElementById('contestsContainer');\n            if (!container) return;\n            contestCount = 1;\n            container.innerHTML = createContestHTMLString();\n            renumberContests();\n        }<\/p>\n<p>        \/**\n         * Cria o HTML para uma entrada de contest (retorna string)\n         *\/\n        function createContestHTMLString() {\n            const html = `<\/p>\n<div class=\"contest-entry\">\n<h3><span class=\"contest-entry-number\"><\/span> Contest Participado<\/h3>\n<\/p>\n<div class=\"form-grid\">\n<div class=\"form-group\">\n            <label for=\"contest${contestCount}\">\ud83c\udfc6 Contest<\/label>\n            <select id=\"contest${contestCount}\" name=\"contest${contestCount}\" onchange=\"updateContestInfo(${contestCount})\">\n${contestSelectOptions.split('\\n').map(line => '                ' + line).join('\\n')}\n            <\/select>\n        <\/div>\n<\/p>\n<div class=\"form-group\">\n            <label for=\"participants${contestCount}\">\ud83d\udc65 Participantes<\/label>\n            <input type=\"number\" id=\"participants${contestCount}\" name=\"participants${contestCount}\" placeholder=\"Ex: 150\" min=\"1\">\n        <\/div>\n<\/p>\n<div class=\"form-group\">\n            <label for=\"position${contestCount}\">\ud83c\udfc5 Coloca\u00e7\u00e3o<\/label>\n            <input type=\"number\" id=\"position${contestCount}\" name=\"position${contestCount}\" placeholder=\"Ex: 25\" min=\"1\">\n        <\/div>\n<\/p>\n<div class=\"form-group\">\n            <label for=\"month${contestCount}\">\ud83d\udcc6 M\u00eas<\/label>\n            <select id=\"month${contestCount}\" name=\"month${contestCount}\"><option value=\"1\">Janeiro<\/option><option value=\"2\">Fevereiro<\/option><option value=\"3\">Mar\u00e7o<\/option><option value=\"4\">Abril<\/option><option value=\"5\">Maio<\/option><option value=\"6\">Junho<\/option><option value=\"7\">Julho<\/option><option value=\"8\">Agosto<\/option><option value=\"9\">Setembro<\/option><option value=\"10\">Outubro<\/option><option value=\"11\">Novembro<\/option><option value=\"12\">Dezembro<\/option><\/select>\n        <\/div>\n<\/p>\n<div class=\"form-group\">\n            <label for=\"cwsp-club${contestCount}\">\ud83c\udf96\ufe0f CWSP Club?<\/label>\n            <select id=\"cwsp-club${contestCount}\" name=\"cwsp-club${contestCount}\"><option value=\"nao\">N\u00e3o<\/option><option value=\"sim\">Sim (+15%)<\/option><\/select>\n        <\/div>\n<\/div>\n<\/div>\n<p>`;\n            return html;\n        }<\/p>\n<p>        \/**\n         * Cria o elemento DOM para uma entrada de contest\n         *\/\n        function createContestElement() {\n            try {\n                \/\/ Create container div\n                const entryDiv = document.createElement('div');\n                entryDiv.className = 'contest-entry';<\/p>\n<p>                \/\/ Create h3 with number span\n                const h3 = document.createElement('h3');\n                const numberSpan = document.createElement('span');\n                numberSpan.className = 'contest-entry-number';\n                h3.appendChild(numberSpan);\n                h3.appendChild(document.createTextNode(' Contest Participado'));\n                entryDiv.appendChild(h3);<\/p>\n<p>                \/\/ Create form grid\n                const formGrid = document.createElement('div');\n                formGrid.className = 'form-grid';<\/p>\n<p>                \/\/ Contest select\n                const contestGroup = document.createElement('div');\n                contestGroup.className = 'form-group';\n                const contestLabel = document.createElement('label');\n                contestLabel.htmlFor = 'contest' + contestCount;\n                contestLabel.textContent = '\ud83c\udfc6 Contest';\n                const contestSelect = document.createElement('select');\n                contestSelect.id = 'contest' + contestCount;\n                contestSelect.name = 'contest' + contestCount;\n                contestSelect.onchange = function() { updateContestInfo(contestCount); };<\/p>\n<p>                \/\/ Add options to contest select\n                const defaultOption = document.createElement('option');\n                defaultOption.value = '';\n                defaultOption.textContent = 'Selecione o contest';\n                contestSelect.appendChild(defaultOption);<\/p>\n<p>                \/\/ Add optgroups from contestSelectOptions\n                const tempDiv = document.createElement('div');\n                tempDiv.innerHTML = contestSelectOptions;\n                const optgroups = tempDiv.querySelectorAll('optgroup');\n                optgroups.forEach(og => {\n                    const newOg = document.createElement('optgroup');\n                    newOg.label = og.label;\n                    const options = og.querySelectorAll('option');\n                    options.forEach(opt => {\n                        const newOpt = document.createElement('option');\n                        newOpt.value = opt.value;\n                        newOpt.textContent = opt.textContent;\n                        newOg.appendChild(newOpt);\n                    });\n                    contestSelect.appendChild(newOg);\n                });<\/p>\n<p>                contestGroup.appendChild(contestLabel);\n                contestGroup.appendChild(contestSelect);\n                formGrid.appendChild(contestGroup);<\/p>\n<p>                \/\/ Participants input\n                const participantsGroup = document.createElement('div');\n                participantsGroup.className = 'form-group';\n                const participantsLabel = document.createElement('label');\n                participantsLabel.htmlFor = 'participants' + contestCount;\n                participantsLabel.textContent = '\ud83d\udc65 Participantes';\n                const participantsInput = document.createElement('input');\n                participantsInput.type = 'number';\n                participantsInput.id = 'participants' + contestCount;\n                participantsInput.name = 'participants' + contestCount;\n                participantsInput.placeholder = 'Ex: 150';\n                participantsInput.min = '1';\n                participantsGroup.appendChild(participantsLabel);\n                participantsGroup.appendChild(participantsInput);\n                formGrid.appendChild(participantsGroup);<\/p>\n<p>                \/\/ Position input\n                const positionGroup = document.createElement('div');\n                positionGroup.className = 'form-group';\n                const positionLabel = document.createElement('label');\n                positionLabel.htmlFor = 'position' + contestCount;\n                positionLabel.textContent = '\ud83c\udfc5 Coloca\u00e7\u00e3o';\n                const positionInput = document.createElement('input');\n                positionInput.type = 'number';\n                positionInput.id = 'position' + contestCount;\n                positionInput.name = 'position' + contestCount;\n                positionInput.placeholder = 'Ex: 25';\n                positionInput.min = '1';\n                positionGroup.appendChild(positionLabel);\n                positionGroup.appendChild(positionInput);\n                formGrid.appendChild(positionGroup);<\/p>\n<p>                \/\/ Month select\n                const monthGroup = document.createElement('div');\n                monthGroup.className = 'form-group';\n                const monthLabel = document.createElement('label');\n                monthLabel.htmlFor = 'month' + contestCount;\n                monthLabel.textContent = '\ud83d\udcc6 M\u00eas';\n                const monthSelect = document.createElement('select');\n                monthSelect.id = 'month' + contestCount;\n                monthSelect.name = 'month' + contestCount;\n                const months = ['Janeiro', 'Fevereiro', 'Mar\u00e7o', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];\n                months.forEach((m, i) => {\n                    const opt = document.createElement('option');\n                    opt.value = (i + 1).toString();\n                    opt.textContent = m;\n                    monthSelect.appendChild(opt);\n                });\n                monthGroup.appendChild(monthLabel);\n                monthGroup.appendChild(monthSelect);\n                formGrid.appendChild(monthGroup);<\/p>\n<p>                \/\/ CWSP Club select\n                const cwspGroup = document.createElement('div');\n                cwspGroup.className = 'form-group';\n                const cwspLabel = document.createElement('label');\n                cwspLabel.htmlFor = 'cwsp-club' + contestCount;\n                cwspLabel.textContent = '\ud83c\udf96\ufe0f CWSP Club?';\n                const cwspSelect = document.createElement('select');\n                cwspSelect.id = 'cwsp-club' + contestCount;\n                cwspSelect.name = 'cwsp-club' + contestCount;\n                const noOpt = document.createElement('option');\n                noOpt.value = 'nao';\n                noOpt.textContent = 'N\u00e3o';\n                const yesOpt = document.createElement('option');\n                yesOpt.value = 'sim';\n                yesOpt.textContent = 'Sim (+15%)';\n                cwspSelect.appendChild(noOpt);\n                cwspSelect.appendChild(yesOpt);\n                cwspGroup.appendChild(cwspLabel);\n                cwspGroup.appendChild(cwspSelect);\n                formGrid.appendChild(cwspGroup);<\/p>\n<p>                entryDiv.appendChild(formGrid);<\/p>\n<p>                console.log('createContestElement completed successfully');\n                return entryDiv;\n            } catch (error) {\n                console.error('Error in createContestElement:', error);\n                throw error;\n            }\n        }<\/p>\n<p>        \/**\n         * Inicializa os event listeners\n         *\/\n        function initializeEventListeners() {\n            const addBtn = document.getElementById('addContestBtn');\n            const removeBtn = document.getElementById('removeContestBtn');\n            const form = document.getElementById('contestForm');\n            const saveBtn = document.getElementById('saveProgressBtn');\n            const loadBtn = document.getElementById('loadProgressBtn');\n            const exportBtn = document.getElementById('exportResultsBtn');\n            const saveParticipantBtn = document.getElementById('saveParticipantBtn');<\/p>\n<p>            if (addBtn) addBtn.addEventListener('click', addContest);\n            if (removeBtn) removeBtn.addEventListener('click', removeContest);\n            if (form) form.addEventListener('submit', handleFormSubmit);\n            if (saveBtn) saveBtn.addEventListener('click', saveProgress);\n            if (loadBtn) loadBtn.addEventListener('click', loadProgress);\n            if (exportBtn) exportBtn.addEventListener('click', exportResults);\n            if (saveParticipantBtn) saveParticipantBtn.addEventListener('click', saveParticipantData);\n        }<\/p>\n<p>        \/**\n         * Salva os dados do participante e exibe a se\u00e7\u00e3o de Contest\n         *\/\n        function saveParticipantData() {\n            \/\/ Valida os campos obrigat\u00f3rios\n            const callsign = document.getElementById('callsign').value;\n            const name = document.getElementById('name').value;\n            const email = document.getElementById('email').value;<\/p>\n<p>            if (!callsign || !name || !email) {\n                alert('Por favor, preencha todos os campos obrigat\u00f3rios: Indicativo, Nome e E-mail.');\n                return;\n            }<\/p>\n<p>            \/\/ L\u00ea os valores dos campos\n            const category = document.getElementById('category').value;\n            const year = document.getElementById('year').value;\n            const cwspMemberEl = document.querySelector('input[name=\"cwsp-member\"]:checked');\n            const cwspMember = cwspMemberEl ? cwspMemberEl.value : 'nao';<\/p>\n<p>            \/\/ Salva os dados no localStorage\n            const data = {\n                callsign: callsign,\n                name: name,\n                email: email,\n                category: category,\n                year: year,\n                cwspMember: cwspMember,\n                contestCount: 0,\n                contests: []\n            };<\/p>\n<p>            localStorage.setItem('trofeuCWSP_Data', JSON.stringify(data));<\/p>\n<p>            \/\/ Exibe a se\u00e7\u00e3o de Contest Participado\n            const contestSection = document.getElementById('contestSection');\n            contestSection.style.display = 'block';\n            contestSection.scrollIntoView({ behavior: 'smooth', block: 'start' });<\/p>\n<p>            \/\/ Atualiza o box de resultados salvos\n            populateSavedResultsBox(data);\n            document.getElementById('savedResultsBox').style.display = 'block';<\/p>\n<p>            \/\/ Desabilita a edi\u00e7\u00e3o dos dados do participante com estilo visual\n            disableParticipantFields();<\/p>\n<p>            \/\/ Adiciona indicador visual de salvo\n            document.querySelector('.participant-info').classList.add('saved');<\/p>\n<p>            alert('Dados do participante salvos com sucesso! Agora adicione seus contests.');\n        }<\/p>\n<p>        \/**\n         * Desabilita a edi\u00e7\u00e3o dos campos do participante ap\u00f3s salvar (com estilo visual)\n         *\/\n        function disableParticipantFields() {\n            const fields = ['callsign', 'name', 'email'];\n            fields.forEach(id => {\n                const el = document.getElementById(id);\n                if (el) {\n                    el.disabled = true;\n                    el.style.backgroundColor = '#e8eaed';\n                    el.style.fontWeight = '600';\n                    el.style.cursor = 'not-allowed';\n                }\n            });<\/p>\n<p>            \/\/ Desabilita o campo de categoria\n            const categoryEl = document.getElementById('category');\n            if (categoryEl) {\n                categoryEl.disabled = true;\n                categoryEl.style.backgroundColor = '#e8eaed';\n                categoryEl.style.cursor = 'not-allowed';\n            }<\/p>\n<p>            const saveBtn = document.getElementById('saveParticipantBtn');\n            if (saveBtn) {\n                saveBtn.textContent = '\u2705 Salvo';\n                saveBtn.disabled = true;\n                saveBtn.style.opacity = '0.7';\n            }\n        }<\/p>\n<p>        \/\/ =============================================\n        \/\/ FUN\u00c7\u00d5ES DE CONTESTS\n        \/\/ =============================================\n        function addContest() {\n            const currentContestIndex = 1; \/\/ Agora s\u00f3 temos um formul\u00e1rio de contest<\/p>\n<p>            const contestSelect = document.getElementById('contest' + currentContestIndex);\n            const participantsInput = document.getElementById('participants' + currentContestIndex);<\/p>\n<p>            \/\/ Verifica se o contest foi preenchido\n            if (!contestSelect || !contestSelect.value) {\n                alert('Por favor, selecione um contest antes de adicionar.');\n                return;\n            }<\/p>\n<p>            if (!participantsInput || !participantsInput.value) {\n                alert('Por favor, preencha o n\u00famero de participantes.');\n                return;\n            }<\/p>\n<p>            \/\/ Salva o contest no localStorage\n            autoSaveContest(currentContestIndex);<\/p>\n<p>            \/\/ N\u00c3O limpa mais os campos de configura\u00e7\u00e3o - eles ficam vis\u00edveis\n            \/\/ Os campos do contest s\u00e3o limpos para nova entrada\n            clearContestFields(currentContestIndex);<\/p>\n<p>            \/\/ Atualiza o box de resultados salvos\n            updateSavedResultsBox();<\/p>\n<p>            \/\/ Atualiza a barra de progresso\n            updateProgress();<\/p>\n<p>            \/\/ Exibe mensagem de sucesso\n            const contestName = contestSelect.options[contestSelect.selectedIndex].text;\n            alert(`\u2705 Contest \"${contestName}\" adicionado com sucesso!\\nPreencha o pr\u00f3ximo contest.`);\n        }<\/p>\n<p>        \/**\n         * Desabilita os campos de configura\u00e7\u00e3o (mas mant\u00e9m vis\u00edveis)\n         *\/\n        function disableContestConfigFields() {\n            \/\/ Os campos ficam vis\u00edveis mas n\u00e3o edit\u00e1veis ap\u00f3s salvar\n            const categoryEl = document.getElementById('category');\n            const yearEl = document.getElementById('year');\n            const cwspRadios = document.querySelectorAll('input[name=\"cwsp-member\"]');<\/p>\n<p>            if (categoryEl) {\n                categoryEl.disabled = true;\n                categoryEl.style.backgroundColor = '#e8eaed';\n                categoryEl.style.cursor = 'not-allowed';\n            }\n            if (yearEl) {\n                yearEl.disabled = true;\n                yearEl.style.backgroundColor = '#e8eaed';\n                yearEl.style.cursor = 'not-allowed';\n            }\n            cwspRadios.forEach(radio => {\n                radio.disabled = true;\n                radio.style.cursor = 'not-allowed';\n            });\n        }<\/p>\n<p>        \/**\n         * Limpa os campos do contest\n         *\/\n        function clearContestFields(index) {\n            const contestSelect = document.getElementById('contest' + index);\n            const participantsInput = document.getElementById('participants' + index);\n            const positionInput = document.getElementById('position' + index);\n            const monthSelect = document.getElementById('month' + index);\n            const cwspSelect = document.getElementById('cwsp-club' + index);<\/p>\n<p>            if (contestSelect) contestSelect.value = '';\n            if (participantsInput) participantsInput.value = '';\n            if (positionInput) positionInput.value = '';\n            if (monthSelect) monthSelect.value = '1';\n            if (cwspSelect) cwspSelect.value = 'nao';\n        }<\/p>\n<p>        \/**\n         * Salva um contest espec\u00edfico no localStorage\n         *\/\n        function autoSaveContest(index) {\n            const savedData = localStorage.getItem('trofeuCWSP_Data');\n            let data = savedData ? JSON.parse(savedData) : {\n                callsign: '',\n                name: '',\n                email: '',\n                category: '',\n                year: '2026',\n                cwspMember: 'nao',\n                contestCount: 0,\n                contests: []\n            };<\/p>\n<p>            \/\/ Salva Categoria, Ano e Membro CWSP do Contest Participado\n            const categoryEl = document.getElementById('category');\n            const yearEl = document.getElementById('year');\n            const cwspMemberEl = document.querySelector('input[name=\"cwsp-member\"]:checked');<\/p>\n<p>            if (categoryEl) data.category = categoryEl.value;\n            if (yearEl) data.year = yearEl.value;\n            if (cwspMemberEl) data.cwspMember = cwspMemberEl.value;<\/p>\n<p>            \/\/ Verifica se este contest j\u00e1 existe (para atualizar)\n            const existingIndex = data.contests.findIndex(c => \n                c.contest === (document.getElementById('contest' + index)?.value || '')\n            );<\/p>\n<p>            const newContest = {\n                contest: document.getElementById('contest' + index)?.value || '',\n                participants: document.getElementById('participants' + index)?.value || '',\n                position: document.getElementById('position' + index)?.value || '',\n                month: document.getElementById('month' + index)?.value || '',\n                score: document.getElementById('score' + index)?.value || '',\n                qso: document.getElementById('qso' + index)?.value || '',\n                cwspClub: document.getElementById('cwsp-club' + index)?.value || 'nao'\n            };<\/p>\n<p>            if (existingIndex >= 0) {\n                \/\/ Atualiza o contest existente\n                data.contests[existingIndex] = newContest;\n            } else {\n                \/\/ Adiciona novo contest\n                data.contests.push(newContest);\n            }<\/p>\n<p>            data.contestCount = data.contests.length;\n            localStorage.setItem('trofeuCWSP_Data', JSON.stringify(data));\n        }<\/p>\n<p>        \/**\n         * Atualiza o box de resultados salvos\n         *\/\n        function updateSavedResultsBox() {\n            const savedData = localStorage.getItem('trofeuCWSP_Data');\n            if (savedData) {\n                try {\n                    const data = JSON.parse(savedData);\n                    populateSavedResultsBox(data);\n                } catch (e) {\n                    console.error('Erro ao atualizar resultados salvos:', e);\n                }\n            }\n        }<\/p>\n<p>        \/**\n         * Edita um contest salvo (carrega os dados de volta no formul\u00e1rio)\n         *\/\n        function editContest(index) {\n            const savedData = localStorage.getItem('trofeuCWSP_Data');\n            if (!savedData) {\n                alert('Nenhum dados encontrado.');\n                return;\n            }<\/p>\n<p>            const data = JSON.parse(savedData);\n            const contests = data.contests.filter(c => c.contest && c.participants);<\/p>\n<p>            if (index >= 0 && index < contests.length) { const contest = contests[index]; \/\/ Preenche os campos do formul\u00e1rio com os dados do contest document.getElementById('contest1').value = contest.contest; document.getElementById('participants1').value = contest.participants; document.getElementById('position1').value = contest.position; document.getElementById('month1').value = contest.month; document.getElementById('score1').value = contest.score || ''; document.getElementById('qso1').value = contest.qso || ''; document.getElementById('cwsp-club1').value = contest.cwspClub || 'nao'; \/\/ Remove o contest antigo da lista deleteContestFromStorage(index); \/\/ Rola at\u00e9 o formul\u00e1rio document.getElementById('contestSection').scrollIntoView({ behavior: 'smooth', block: 'start' }); alert(`Editando contest: ${contest.contest}\\n\\nModifique os dados e clique em \"Adicionar Contest\" para salvar.`); } } \/** * Apaga um contest salvo do storage *\/ function deleteContest(index) { if (!confirm('Tem certeza que deseja apagar este contest?')) { return; } const savedData = localStorage.getItem('trofeuCWSP_Data'); if (!savedData) { alert('Nenhum dados encontrado.'); return; } const data = JSON.parse(savedData); const validContests = data.contests.filter(c => c.contest && c.participants);<\/p>\n<p>            if (index >= 0 && index < validContests.length) { \/\/ Remove o contest da lista validContests.splice(index, 1); \/\/ Atualiza o data.contests mantendo a estrutura original data.contests = validContests; data.contestCount = validContests.length; \/\/ Salva os dados atualizados localStorage.setItem('trofeuCWSP_Data', JSON.stringify(data)); \/\/ Atualiza a visualiza\u00e7\u00e3o populateSavedResultsBox(data); updateProgress(); alert('Contest apagado com sucesso!'); } } \/** * Apaga um contest espec\u00edfico do storage pelo \u00edndice *\/ function deleteContestFromStorage(index) { const savedData = localStorage.getItem('trofeuCWSP_Data'); if (!savedData) return; const data = JSON.parse(savedData); const validContests = data.contests.filter(c => c.contest && c.participants);<\/p>\n<p>            if (index >= 0 && index < validContests.length) {\n                validContests.splice(index, 1);\n                data.contests = validContests;\n                data.contestCount = validContests.length;\n                localStorage.setItem('trofeuCWSP_Data', JSON.stringify(data));\n            }\n        }\n\n        function removeContest() {\n            if (contestCount <= 0) { alert('Nenhum contest para remover!'); return; } const container = document.getElementById('contestsContainer'); const contests = container.querySelectorAll('.contest-entry'); if (contests.length > 0) {\n                contests[contests.length - 1].remove();\n                contestCount--;\n                renumberContests();\n                updateProgress();\n            }\n        }<\/p>\n<p>        \/**\n         * Renumera todos os contests com base na ordem atual\n         *\/\n        function renumberContests() {\n            const container = document.getElementById('contestsContainer');\n            if (!container) return;<\/p>\n<p>            const contests = container.querySelectorAll('.contest-entry');\n            console.log('renumberContests called, found contests:', contests.length);\n            contests.forEach((c, i) => {\n                console.log(`  Contest ${i}:`, c.outerHTML.substring(0, 100));\n            });\n            contestCount = contests.length;<\/p>\n<p>            contests.forEach((contest, index) => {\n                const newNumber = index + 1;\n                const numberSpan = contest.querySelector('.contest-entry-number');\n                if (numberSpan) {\n                    numberSpan.textContent = newNumber;\n                }<\/p>\n<p>                \/\/ Atualiza IDs dos elementos dentro do contest\n                const selectContest = contest.querySelector('select[name^=\"contest\"]');\n                const inputParticipants = contest.querySelector('input[name^=\"participants\"]');\n                const inputPosition = contest.querySelector('input[name^=\"position\"]');\n                const selectMonth = contest.querySelector('select[name^=\"month\"]');\n                const selectCwsp = contest.querySelector('select[name^=\"cwsp-club\"]');<\/p>\n<p>                if (selectContest) {\n                    selectContest.id = 'contest' + newNumber;\n                    selectContest.name = 'contest' + newNumber;\n                    selectContest.onchange = function() { updateContestInfo(newNumber); };\n                    selectContest.previousElementSibling.htmlFor = 'contest' + newNumber;\n                }\n                if (inputParticipants) {\n                    inputParticipants.id = 'participants' + newNumber;\n                    inputParticipants.name = 'participants' + newNumber;\n                    inputParticipants.previousElementSibling.htmlFor = 'participants' + newNumber;\n                }\n                if (inputPosition) {\n                    inputPosition.id = 'position' + newNumber;\n                    inputPosition.name = 'position' + newNumber;\n                    inputPosition.previousElementSibling.htmlFor = 'position' + newNumber;\n                }\n                if (selectMonth) {\n                    selectMonth.id = 'month' + newNumber;\n                    selectMonth.name = 'month' + newNumber;\n                    selectMonth.previousElementSibling.htmlFor = 'month' + newNumber;\n                }\n                if (selectCwsp) {\n                    selectCwsp.id = 'cwsp-club' + newNumber;\n                    selectCwsp.name = 'cwsp-club' + newNumber;\n                    selectCwsp.previousElementSibling.htmlFor = 'cwsp-club' + newNumber;\n                }\n            });\n        }<\/p>\n<p>        function updateContestInfo(id) {\n            const contestSelect = document.getElementById('contest' + id);\n            if (!contestSelect) return;<\/p>\n<p>            const contestName = contestSelect.value;\n            if (contestMonthMapping[contestName]) {\n                const month = contestMonthMapping[contestName];\n                const monthSelect = document.getElementById('month' + id);\n                if (monthSelect && month <= 12) { monthSelect.value = month; } } } function updateProgress() { const progressFill = document.getElementById('progressFill'); const progressText = document.getElementById('progressText'); if (progressFill) { const progress = Math.min((contestCount \/ 10) * 100, 100); progressFill.style.width = progress + '%'; } if (progressText) { if (contestCount === 0) { progressText.textContent = 'Nenhum contest'; } else { const word = contestCount > 1 ? 'contests' : 'contest';\n                    progressText.textContent = contestCount + ' ' + word;\n                }\n            }\n        }<\/p>\n<p>        \/\/ =============================================\n        \/\/ C\u00c1LCULO DE PONTUA\u00c7\u00c3O\n        \/\/ =============================================\n        function calculateScore(participants, position, hasBonus, isSACW) {\n            if (!participants || !position || participants < 1 || position < 1 || position > participants) {\n                return 0;\n            }<\/p>\n<p>            let score = ((participants - position + 1) \/ participants) * 100;<\/p>\n<p>            if (hasBonus) {\n                score *= 1.15;\n            }<\/p>\n<p>            if (isSACW) {\n                score *= 1.50;\n            }<\/p>\n<p>            return score;\n        }<\/p>\n<p>        function getCategoryDisplay(value) {\n            const categories = {\n                'single-op-assisted': 'Single Operator Assisted',\n                'single-op': 'Single Operator',\n                'single-op-qrp': 'Single Operator QRP',\n                'single-op-low-power': 'Single Operator Low Power',\n                'single-op-high-power': 'Single Operator High Power',\n                'multi-op': 'Multi Operator',\n                'multi-op-two': 'Multi Operator Two Transmitters',\n                'multi-multi': 'Multi Multi',\n                'checklog': 'Checklog'\n            };\n            return categories[value] || value;\n        }<\/p>\n<p>        \/\/ =============================================\n        \/\/ FORMUL\u00c1RIO\n        \/\/ =============================================\n        function handleFormSubmit(e) {\n            e.preventDefault();<\/p>\n<p>            const callsign = document.getElementById('callsign').value.toUpperCase();\n            const name = document.getElementById('name').value;\n            const category = document.getElementById('category').value;\n            const year = document.getElementById('year').value;<\/p>\n<p>            let totalScore = 0;\n            let contestsData = [];\n            let totalParticipants = 0;\n            let totalPositions = 0;\n            let totalQSO = 0;\n            let bonusCount = 0;<\/p>\n<p>            \/\/ L\u00ea os dados diretamente do localStorage\n            const savedData = localStorage.getItem('trofeuCWSP_Data');\n            if (savedData) {\n                const data = JSON.parse(savedData);\n                const validContests = data.contests.filter(c => c.contest && c.participants);<\/p>\n<p>                validContests.forEach((contest) => {\n                    const participants = parseInt(contest.participants) || 0;\n                    const position = parseInt(contest.position) || 0;\n                    const month = parseInt(contest.month) || 0;\n                    const qso = parseInt(contest.qso) || 0;\n                    const hasCwspClub = contest.cwspClub === 'sim';\n                    const isSACW = contest.contest === 'SACW';<\/p>\n<p>                    if (participants > 0 && position > 0) {\n                        \/\/ Calcula score usando a f\u00f3rmula: E = (P - C + 1) \/ P \u00d7 100\n                        let score = ((participants - position + 1) \/ participants) * 100;<\/p>\n<p>                        \/\/ Aplica b\u00f4nus\n                        if (hasCwspClub) {\n                            score *= 1.15; \/\/ +15% CWSP Club\n                        }\n                        if (isSACW) {\n                            score *= 1.50; \/\/ +50% SACW\n                        }<\/p>\n<p>                        totalScore += score;\n                        totalParticipants += participants;\n                        totalPositions += position;\n                        totalQSO += qso;\n                        if (hasCwspClub) bonusCount++;<\/p>\n<p>                        contestsData.push({\n                            name: contest.contest,\n                            participants: participants,\n                            position: position,\n                            month: month,\n                            qso: qso,\n                            bonus: hasCwspClub,\n                            isSACW: isSACW,\n                            score: score\n                        });\n                    }\n                });\n            }<\/p>\n<p>            \/\/ Atualiza resultados no header\n            document.getElementById('resultCallsign').textContent = callsign;\n            document.getElementById('resultName').textContent = name;\n            document.getElementById('resultCategory').textContent = getCategoryDisplay(category);\n            document.getElementById('resultYear').textContent = year;<\/p>\n<p>            \/\/ Gera HTML dos contests\n            let resultHTML = '';\n            contestsData.sort((a, b) => b.score - a.score);<\/p>\n<p>            const monthNames = ['', 'Janeiro', 'Fevereiro', 'Mar\u00e7o', 'Abril', 'Maio', 'Junho', \n                                'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];<\/p>\n<p>            if (contestsData.length === 0) {\n                resultHTML = '<\/p>\n<p style=\"text-align: center; padding: 15px;\">Nenhum contest preenchido. Adicione contests primeiro.<\/p>\n<p>';\n            } else {\n                contestsData.forEach((contest, index) => {\n                    let bonusText = [];\n                    if (contest.bonus) bonusText.push('CWSP Club (+15%)');\n                    if (contest.isSACW) bonusText.push('SACW (+50%)');\n                    if (bonusText.length === 0) bonusText.push('Sem b\u00f4nus');<\/p>\n<p>                    resultHTML += `\n                        <\/p>\n<div class=\"result-contest\">\n<div class=\"result-contest-name\">${index + 1}. ${contest.name}<\/div>\n<\/p>\n<div class=\"result-contest-details\">\n<div class=\"result-detail\">\n<div class=\"result-detail-value\">${contest.participants}<\/div>\n<\/p>\n<div class=\"result-detail-label\">Participantes<\/div>\n<\/div>\n<\/p>\n<div class=\"result-detail\">\n<div class=\"result-detail-value\">${contest.position}\u00ba<\/div>\n<\/p>\n<div class=\"result-detail-label\">Coloca\u00e7\u00e3o<\/div>\n<\/div>\n<\/p>\n<div class=\"result-detail\">\n<div class=\"result-detail-value\">${contest.qso}<\/div>\n<\/p>\n<div class=\"result-detail-label\">QSO's<\/div>\n<\/div>\n<\/p>\n<div class=\"result-detail\">\n<div class=\"result-detail-value\">${monthNames[contest.month]}<\/div>\n<\/p>\n<div class=\"result-detail-label\">M\u00eas<\/div>\n<\/div>\n<\/p>\n<div class=\"result-detail\">\n<div class=\"result-detail-value\">${contest.score.toFixed(2)}<\/div>\n<\/p>\n<div class=\"result-detail-label\">Pontos<\/div>\n<\/div>\n<\/div>\n<\/p>\n<div class=\"result-bonus\">${bonusText.join(' \u2022 ')}<\/div>\n<\/div>\n<p>\n                    `;\n                });\n            }<\/p>\n<p>            const resultContent = document.getElementById('resultContent');\n            if (resultContent) {\n                resultContent.innerHTML = resultHTML;\n            }<\/p>\n<p>            \/\/ Atualiza totais\n            document.getElementById('totalScore').textContent = totalScore.toFixed(2);\n            document.getElementById('totalContests').textContent = contestsData.length;\n            document.getElementById('totalParticipants').textContent = totalParticipants;\n            document.getElementById('averagePosition').textContent = contestsData.length > 0 ? (totalPositions \/ contestsData.length).toFixed(1) : '0';\n            document.getElementById('totalBonuses').textContent = bonusCount;<\/p>\n<p>            \/\/ Exibe a se\u00e7\u00e3o de resultados\n            const resultDisplay = document.getElementById('resultDisplay');\n            if (resultDisplay) {\n                resultDisplay.style.display = 'block';\n                resultDisplay.scrollIntoView({ behavior: 'smooth', block: 'start' });\n            }\n        }<\/p>\n<p>        \/\/ =============================================\n        \/\/ PERSIST\u00caNCIA\n        \/\/ =============================================\n        function saveProgress() {\n            \/\/ Salva os dados do contest atual se preenchido\n            const contestSelect = document.getElementById('contest1');\n            const participantsInput = document.getElementById('participants1');<\/p>\n<p>            if (contestSelect && contestSelect.value && participantsInput && participantsInput.value) {\n                autoSaveContest(1);\n            }<\/p>\n<p>            \/\/ Atualiza o box de resultados salvos\n            updateSavedResultsBox();\n            document.getElementById('savedResultsBox').style.display = 'block';\n            document.getElementById('savedResultsBox').scrollIntoView({ behavior: 'smooth', block: 'start' });<\/p>\n<p>            alert('Progresso salvo com sucesso!');\n        }<\/p>\n<p>        \/**\n         * Calcula o score usando a f\u00f3rmula: E = (P - C + 1) \/ P \u00d7 100\n         *\/\n        function calculateEfficiencyScore(participants, position) {\n            if (!participants || !position || participants < 1 || position < 1 || position > participants) {\n                return 0;\n            }\n            return ((participants - position + 1) \/ participants) * 100;\n        }<\/p>\n<p>        \/**\n         * Popula o box de resultados salvos com os dados\n         *\/\n        function populateSavedResultsBox(data) {\n            \/\/ Preenche informa\u00e7\u00f5es do participante\n            document.getElementById('savedCallsign').textContent = data.callsign || '-';\n            document.getElementById('savedName').textContent = data.name || '-';\n            document.getElementById('savedEmail').textContent = data.email || '-';\n            document.getElementById('savedCategory').textContent = getCategoryDisplay(data.category) || '-';\n            document.getElementById('savedYear').textContent = data.year || '-';\n            document.getElementById('savedCwspMember').textContent = data.cwspMember === 'sim' ? 'Sim' : 'N\u00e3o';<\/p>\n<p>            \/\/ Preenche lista de contests\n            const contestsList = document.getElementById('savedContestsList');\n            contestsList.innerHTML = '';<\/p>\n<p>            const validContests = data.contests.filter(c => c.contest && c.participants);<\/p>\n<p>            \/\/ Calcula scores e total\n            let calculatedContests = [];\n            let totalScore = 0;\n            let totalQSO = 0;<\/p>\n<p>            if (validContests.length === 0) {\n                contestsList.innerHTML = '<\/p>\n<p style=\"text-align: center; color: var(--text-light); padding: 15px;\">Nenhum contest preenchido.<\/p>\n<p>';\n            } else {\n                validContests.forEach((contest, index) => {\n                    const monthNames = ['', 'Janeiro', 'Fevereiro', 'Mar\u00e7o', 'Abril', 'Maio', 'Junho', \n                                        'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];<\/p>\n<p>                    \/\/ Calcula o score usando a f\u00f3rmula: E = (P - C + 1) \/ P \u00d7 100\n                    const participants = parseInt(contest.participants) || 0;\n                    const position = parseInt(contest.position) || 0;\n                    const calculatedScore = calculateEfficiencyScore(participants, position);<\/p>\n<p>                    \/\/ Aplica b\u00f4nus se aplic\u00e1vel\n                    let finalScore = calculatedScore;\n                    if (contest.cwspClub === 'sim') {\n                        finalScore *= 1.15; \/\/ +15% CWSP Club\n                    }\n                    if (contest.contest === 'SACW') {\n                        finalScore *= 1.50; \/\/ +50% SACW\n                    }<\/p>\n<p>                    totalScore += finalScore;\n                    totalQSO += parseInt(contest.qso) || 0;<\/p>\n<p>                    const cwspClubText = contest.cwspClub === 'sim' ? 'Sim (+15%)' : 'N\u00e3o';\n                    const sacwBonus = contest.contest === 'SACW' ? ' (+50% SACW)' : '';<\/p>\n<p>                    const contestHtml = `\n                        <\/p>\n<div class=\"saved-contest-item\">\n<div class=\"saved-contest-details\">\n<p>\n                                <span class=\"saved-contest-number\">${index + 1}<\/span>\n                                <span class=\"saved-contest-name\">${contest.contest}<\/span>\n                                <\/p>\n<div class=\"saved-contest-stats\">\n                                    <span class=\"saved-contest-stat\">\ud83d\udcc6 ${monthNames[parseInt(contest.month) || 0]}<\/span>\n                                    <span class=\"saved-contest-stat\">\ud83d\udc65 ${contest.participants} part.<\/span>\n                                    <span class=\"saved-contest-stat\">\ud83d\udce1 ${contest.qso || '-'} QSO's<\/span>\n                                    <span class=\"saved-contest-stat\">\ud83d\udcca ${finalScore.toFixed(2)}<\/span>\n                                    <span class=\"saved-contest-stat\">\ud83c\udfc5 ${contest.position}\u00ba<\/span>\n                                    <span class=\"saved-contest-stat\">\ud83c\udf96\ufe0f ${cwspClubText}<\/span>\n                                <\/div>\n<\/div>\n<\/p>\n<div class=\"saved-contest-actions\">\n                                <button type=\"button\" class=\"btn btn-small btn-edit\" onclick=\"editContest(${index})\" title=\"Editar Contest\">\u270f\ufe0f Editar<\/button>\n                                <button type=\"button\" class=\"btn btn-small btn-delete\" onclick=\"deleteContest(${index})\" title=\"Apagar Contest\">\ud83d\uddd1\ufe0f Apagar<\/button>\n                            <\/div>\n<\/div>\n<p>\n                    `;\n                    contestsList.innerHTML += contestHtml;\n                });\n            }<\/p>\n<p>            \/\/ Atualiza total de contests\n            document.getElementById('savedTotalContests').textContent = validContests.length;<\/p>\n<p>            \/\/ Adiciona linha de total score se houver contests\n            if (validContests.length > 0) {\n                const totalRow = document.createElement('div');\n                totalRow.className = 'saved-total';\n                totalRow.innerHTML = `\n                    <span class=\"saved-total-label\">\ud83d\udcca Total Score: ${totalScore.toFixed(2)} pontos | \ud83d\udce1 Total QSO's: ${totalQSO}<\/span>\n                `;\n                contestsList.appendChild(totalRow);\n            }\n        }<\/p>\n<p>        \/**\n         * Permite editar os dados salvos (oculta o box e volta ao formul\u00e1rio)\n         *\/\n        function editSavedData() {\n            document.getElementById('savedResultsBox').style.display = 'none';\n            document.getElementById('contestForm').scrollIntoView({ behavior: 'smooth', block: 'start' });\n        }<\/p>\n<p>        \/**\n         * Calcula o resultado a partir dos dados salvos\n         *\/\n        function calculateFromSaved() {\n            \/\/ Dispara o c\u00e1lculo do formul\u00e1rio\n            handleFormSubmit(new Event('submit'));\n        }<\/p>\n<p>        function loadProgress() {\n            const savedData = localStorage.getItem('trofeuCWSP_Data');\n            if (!savedData) {\n                alert('Nenhum progresso salvo.');\n                return;\n            }<\/p>\n<p>            try {\n                const data = JSON.parse(savedData);<\/p>\n<p>                \/\/ Preenche campos do participante\n                document.getElementById('callsign').value = data.callsign || '';\n                document.getElementById('name').value = data.name || '';\n                document.getElementById('email').value = data.email || '';<\/p>\n<p>                \/\/ Aplica estilos de salvo aos campos do participante\n                const participantFields = ['callsign', 'name', 'email'];\n                participantFields.forEach(id => {\n                    const el = document.getElementById(id);\n                    if (el) {\n                        el.disabled = true;\n                        el.style.backgroundColor = '#e8eaed';\n                        el.style.fontWeight = '600';\n                        el.style.cursor = 'not-allowed';\n                    }\n                });<\/p>\n<p>                \/\/ Atualiza o bot\u00e3o Salvar\n                const saveBtn = document.getElementById('saveParticipantBtn');\n                if (saveBtn) {\n                    saveBtn.textContent = '\u2705 Salvo';\n                    saveBtn.disabled = true;\n                    saveBtn.style.opacity = '0.7';\n                }<\/p>\n<p>                \/\/ Exibe a se\u00e7\u00e3o de Contest Participado\n                const contestSection = document.getElementById('contestSection');\n                contestSection.style.display = 'block';\n                contestSection.classList.add('saved');<\/p>\n<p>                \/\/ Preenche campos do contest\n                if (data.category) document.getElementById('category').value = data.category;\n                if (data.year) document.getElementById('year').value = data.year;<\/p>\n<p>                \/\/ Seleciona o radio button correto para Membro CWSP\n                const cwspRadios = document.querySelectorAll('input[name=\"cwsp-member\"]');\n                cwspRadios.forEach(radio => {\n                    radio.checked = (radio.value === data.cwspMember);\n                    if (radio.checked) {\n                        radio.disabled = true;\n                        radio.style.cursor = 'not-allowed';\n                    }\n                });<\/p>\n<p>                \/\/ Aplica estilos aos campos de configura\u00e7\u00e3o\n                disableContestConfigFields();<\/p>\n<p>                \/\/ Carrega os contests\n                const contestsList = document.getElementById('savedContestsList');\n                contestsList.innerHTML = '';<\/p>\n<p>                const validContests = data.contests.filter(c => c.contest && c.participants);<\/p>\n<p>                if (validContests.length === 0) {\n                    contestsList.innerHTML = '<\/p>\n<p style=\"text-align: center; color: var(--text-light); padding: 15px;\">Nenhum contest preenchido.<\/p>\n<p>';\n                } else {\n                    validContests.forEach((contest, index) => {\n                        const monthNames = ['', 'Janeiro', 'Fevereiro', 'Mar\u00e7o', 'Abril', 'Maio', 'Junho', \n                                            'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];<\/p>\n<p>                        const cwspClubText = contest.cwspClub === 'sim' ? 'Sim (+15%)' : 'N\u00e3o';\n                        const participants = parseInt(contest.participants) || 0;\n                        const position = parseInt(contest.position) || 0;\n                        const calculatedScore = calculateEfficiencyScore(participants, position);\n                        let finalScore = calculatedScore;\n                        if (contest.cwspClub === 'sim') {\n                            finalScore *= 1.15;\n                        }\n                        if (contest.contest === 'SACW') {\n                            finalScore *= 1.50;\n                        }\n                        const qsoText = contest.qso ? contest.qso : '-';<\/p>\n<p>                        const contestHtml = `\n                            <\/p>\n<div class=\"saved-contest-item\">\n<div class=\"saved-contest-details\">\n<p>\n                                    <span class=\"saved-contest-number\">${index + 1}<\/span>\n                                    <span class=\"saved-contest-name\">${contest.contest}<\/span>\n                                    <\/p>\n<div class=\"saved-contest-stats\">\n                                        <span class=\"saved-contest-stat\">\ud83d\udcc6 ${monthNames[parseInt(contest.month) || 0]}<\/span>\n                                        <span class=\"saved-contest-stat\">\ud83d\udc65 ${contest.participants} part.<\/span>\n                                        <span class=\"saved-contest-stat\">\ud83d\udce1 ${contest.qso || '-'} QSO's<\/span>\n                                        <span class=\"saved-contest-stat\">\ud83d\udcca ${finalScore.toFixed(2)}<\/span>\n                                        <span class=\"saved-contest-stat\">\ud83c\udfc5 ${contest.position}\u00ba<\/span>\n                                        <span class=\"saved-contest-stat\">\ud83c\udf96\ufe0f ${cwspClubText}<\/span>\n                                    <\/div>\n<\/div>\n<\/p>\n<div class=\"saved-contest-actions\">\n                                    <button type=\"button\" class=\"btn btn-small btn-edit\" onclick=\"editContest(${index})\" title=\"Editar Contest\">\u270f\ufe0f Editar<\/button>\n                                    <button type=\"button\" class=\"btn btn-small btn-delete\" onclick=\"deleteContest(${index})\" title=\"Apagar Contest\">\ud83d\uddd1\ufe0f Apagar<\/button>\n                                <\/div>\n<\/div>\n<p>\n                        `;\n                        contestsList.innerHTML += contestHtml;\n                    });\n                }<\/p>\n<p>                \/\/ Atualiza total\n                document.getElementById('savedTotalContests').textContent = validContests.length;<\/p>\n<p>                \/\/ Atualiza barra de progresso\n                updateProgress();<\/p>\n<p>                \/\/ Atualiza e exibe o box de resultados salvos\n                populateSavedResultsBox(data);\n                document.getElementById('savedResultsBox').style.display = 'block';<\/p>\n<p>                \/\/ Adiciona indicador visual de salvo\n                document.querySelector('.participant-info').classList.add('saved');<\/p>\n<p>                alert('Progresso carregado!');\n            } catch (e) {\n                console.error('Erro ao carregar:', e);\n                alert('Erro ao carregar.');\n            }\n        }<\/p>\n<p>        function exportResults() {\n            const callsign = document.getElementById('callsign').value.toUpperCase();\n            const name = document.getElementById('name').value;\n            const year = document.getElementById('year').value;\n            const totalScore = document.getElementById('totalScore').textContent;<\/p>\n<p>            let exportText = `TR\u00d3FEU EFICI\u00caNCIA EM CW\\n${'='.repeat(40)}\\n\\n`;\n            exportText += `\ud83d\udce1 Indicativo: ${callsign}\\n`;\n            exportText += `\ud83d\udc64 Participante: ${name}\\n`;\n            exportText += `\ud83d\udcc5 Ano: ${year}\\n`;\n            exportText += `\ud83c\udfaf Escore Final: ${totalScore} pontos\\n\\n`;\n            exportText += `\ud83d\udce7 trofeu@cwsp.com.br\\n`;<\/p>\n<p>            const blob = new Blob([exportText], { type: 'text\/plain;charset=utf-8' });\n            const link = document.createElement('a');\n            link.href = URL.createObjectURL(blob);\n            link.download = `trofeu_${callsign}_${year}.txt`;\n            link.click();\n            URL.revokeObjectURL(link.href);\n        }<\/p>\n<p>        function printResults() {\n            window.print();\n        }<\/p>\n<p>        function copyResultsToClipboard() {\n            const callsign = document.getElementById('callsign').value.toUpperCase();\n            const name = document.getElementById('name').value;\n            const year = document.getElementById('year').value;\n            const totalScore = document.getElementById('totalScore').textContent;<\/p>\n<p>            const text = `\ud83c\udfc6 TR\u00d3FEU EFICI\u00caNCIA EM CW\\n\\n\ud83d\udce1 ${callsign}\\n\ud83d\udc64 ${name}\\n\ud83d\udcc5 ${year}\\n\ud83c\udfaf ${totalScore} pontos\\n\\n\ud83d\udce7 trofeu@cwsp.com.br`;<\/p>\n<p>            if (navigator.clipboard && navigator.clipboard.writeText) {\n                navigator.clipboard.writeText(text).then(() => alert('Copiado!')).catch(() => fallbackCopy(text));\n            } else {\n                fallbackCopy(text);\n            }\n        }<\/p>\n<p>        function fallbackCopy(text) {\n            try {\n                const ta = document.createElement('textarea');\n                ta.value = text;\n                ta.style.position = 'fixed';\n                ta.style.left = '-9999px';\n                document.body.appendChild(ta);\n                ta.select();\n                document.execCommand('copy');\n                document.body.removeChild(ta);\n                alert('Copiado!');\n            } catch (e) {\n                alert('Copie manualmente:\\n\\n' + text);\n            }\n        }\n    <\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; \ud83c\udfc6 Tr\u00f3feu Efici\u00eancia em CW Cat\u00e1logo Oficial de Contests V\u00e1lidos &#8211; Per\u00edodo de Apura\u00e7\u00e3o: Janeiro a Dezembro \ud83d\udccb Sobre o Trof\u00e9u O Tr\u00f3feu Efici\u00eancia em CW \u00e9 um pr\u00eamio concedido pelo CWSP &#8211; Grupo de CW de S\u00e3o Paulo, que reconhece a participa\u00e7\u00e3o e o desempenho de Radioamadores brasileiros em Contestes Nacionais e Internacionais, &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/cwsp.com.br\/trofeueficiencia\/2026\/01\/15\/calculadora\/\" class=\"more-link\">Leia mais<span class=\"screen-reader-text\"> &#8220;Calculadora&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,7],"tags":[],"class_list":["post-54","post","type-post","status-publish","format-standard","hentry","category-trofeu-eficiencia","category-utilidades"],"_links":{"self":[{"href":"https:\/\/cwsp.com.br\/trofeueficiencia\/wp-json\/wp\/v2\/posts\/54","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cwsp.com.br\/trofeueficiencia\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cwsp.com.br\/trofeueficiencia\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cwsp.com.br\/trofeueficiencia\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cwsp.com.br\/trofeueficiencia\/wp-json\/wp\/v2\/comments?post=54"}],"version-history":[{"count":7,"href":"https:\/\/cwsp.com.br\/trofeueficiencia\/wp-json\/wp\/v2\/posts\/54\/revisions"}],"predecessor-version":[{"id":71,"href":"https:\/\/cwsp.com.br\/trofeueficiencia\/wp-json\/wp\/v2\/posts\/54\/revisions\/71"}],"wp:attachment":[{"href":"https:\/\/cwsp.com.br\/trofeueficiencia\/wp-json\/wp\/v2\/media?parent=54"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cwsp.com.br\/trofeueficiencia\/wp-json\/wp\/v2\/categories?post=54"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cwsp.com.br\/trofeueficiencia\/wp-json\/wp\/v2\/tags?post=54"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}