{"id":1972,"date":"2025-12-08T21:08:17","date_gmt":"2025-12-08T13:08:17","guid":{"rendered":"https:\/\/www.funpt.cn\/?page_id=1972"},"modified":"2025-12-11T17:03:21","modified_gmt":"2025-12-11T09:03:21","slug":"elementor-1972","status":"publish","type":"page","link":"https:\/\/www.funpt.cn\/?page_id=1972","title":{"rendered":"SFMA\u6d4b\u8bd5\u7cfb\u7edf\u3010\u8c03\u8bd5\u4e2d\u3011"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1972\" class=\"elementor elementor-1972\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-be9b0ef e-flex e-con-boxed e-con e-parent\" data-id=\"be9b0ef\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f96ef92 elementor-widget elementor-widget-html\" data-id=\"f96ef92\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>SFMA\uff08\u9009\u62e9\u6027\u529f\u80fd\u52a8\u4f5c\u8bc4\u4f30\uff09\u5b8c\u6574\u6d41\u7a0b\u56fe\u7cfb\u7edf 2019\u7248<\/title>\r\n    <style>\r\n        :root {\r\n            --fn-color: #27ae60;\r\n            --dn-color: #f39c12;\r\n            --dp-color: #e74c3c;\r\n            --fp-color: #c0392b;\r\n            --primary-color: #3498db;\r\n            --secondary-color: #2c3e50;\r\n            --light-bg: #f8f9fa;\r\n            --border-color: #e9ecef;\r\n            --flowchart-bg: #f0f7ff;\r\n        }\r\n        \r\n        * {\r\n            box-sizing: border-box;\r\n            margin: 0;\r\n            padding: 0;\r\n        }\r\n        \r\n        body {\r\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\r\n            line-height: 1.6;\r\n            color: #333;\r\n            background-color: #f5f5f5;\r\n            padding: 20px;\r\n        }\r\n        \r\n        .container {\r\n            max-width: 1400px;\r\n            margin: 0 auto;\r\n            background-color: white;\r\n            border-radius: 10px;\r\n            box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);\r\n            overflow: hidden;\r\n        }\r\n        \r\n        header {\r\n            background: linear-gradient(135deg, var(--secondary-color), var(--primary-color));\r\n            color: white;\r\n            padding: 25px 30px;\r\n        }\r\n        \r\n        .header-content {\r\n            display: flex;\r\n            justify-content: space-between;\r\n            align-items: center;\r\n            flex-wrap: wrap;\r\n        }\r\n        \r\n        h1 {\r\n            font-size: 2.2rem;\r\n            margin-bottom: 5px;\r\n        }\r\n        \r\n        .subtitle {\r\n            font-size: 1.1rem;\r\n            opacity: 0.9;\r\n        }\r\n        \r\n        .scoring-system {\r\n            background-color: rgba(255, 255, 255, 0.1);\r\n            padding: 15px;\r\n            border-radius: 6px;\r\n            margin-top: 15px;\r\n        }\r\n        \r\n        .scoring-grid {\r\n            display: grid;\r\n            grid-template-columns: repeat(4, 1fr);\r\n            gap: 10px;\r\n            margin-top: 10px;\r\n        }\r\n        \r\n        .score-item {\r\n            text-align: center;\r\n            padding: 8px;\r\n            border-radius: 4px;\r\n            font-weight: 600;\r\n        }\r\n        \r\n        .score-fn { background-color: var(--fn-color); }\r\n        .score-dn { background-color: var(--dn-color); }\r\n        .score-dp { background-color: var(--dp-color); }\r\n        .score-fp { background-color: var(--fp-color); }\r\n        \r\n        .main-content {\r\n            display: flex;\r\n            min-height: 800px;\r\n        }\r\n        \r\n        .sidebar {\r\n            width: 320px;\r\n            background-color: var(--light-bg);\r\n            border-right: 1px solid var(--border-color);\r\n            padding: 20px;\r\n            overflow-y: auto;\r\n        }\r\n        \r\n        .assessment-steps {\r\n            margin-bottom: 25px;\r\n        }\r\n        \r\n        .step-title {\r\n            font-size: 1.1rem;\r\n            font-weight: 600;\r\n            color: var(--secondary-color);\r\n            margin-bottom: 10px;\r\n            padding-bottom: 5px;\r\n            border-bottom: 2px solid var(--primary-color);\r\n        }\r\n        \r\n        .step-list {\r\n            list-style: none;\r\n        }\r\n        \r\n        .step-item {\r\n            padding: 12px 15px;\r\n            margin-bottom: 8px;\r\n            background-color: white;\r\n            border-left: 4px solid var(--primary-color);\r\n            border-radius: 4px;\r\n            cursor: pointer;\r\n            transition: all 0.2s ease;\r\n            font-size: 0.95rem;\r\n            position: relative;\r\n        }\r\n        \r\n        .step-item:hover {\r\n            background-color: #e3f2fd;\r\n            transform: translateX(3px);\r\n        }\r\n        \r\n        .step-item.active {\r\n            background-color: var(--primary-color);\r\n            color: white;\r\n            border-left-color: var(--secondary-color);\r\n        }\r\n        \r\n        .step-item.completed {\r\n            border-left-color: var(--fn-color);\r\n        }\r\n        \r\n        .step-item.pain {\r\n            border-left-color: var(--dp-color);\r\n        }\r\n        \r\n        .step-item.dysfunction {\r\n            border-left-color: var(--dn-color);\r\n        }\r\n        \r\n        .step-item.breakout-active {\r\n            border-left-color: #9b59b6;\r\n            background-color: #f5e8ff;\r\n        }\r\n        \r\n        .test-content {\r\n            flex: 1;\r\n            padding: 30px;\r\n            overflow-y: auto;\r\n        }\r\n        \r\n        .test-section {\r\n            display: none;\r\n        }\r\n        \r\n        .test-section.active {\r\n            display: block;\r\n            animation: fadeIn 0.5s ease;\r\n        }\r\n        \r\n        @keyframes fadeIn {\r\n            from { opacity: 0; transform: translateY(10px); }\r\n            to { opacity: 1; transform: translateY(0); }\r\n        }\r\n        \r\n        .test-header {\r\n            display: flex;\r\n            justify-content: space-between;\r\n            align-items: center;\r\n            margin-bottom: 20px;\r\n            padding-bottom: 10px;\r\n            border-bottom: 2px solid var(--primary-color);\r\n        }\r\n        \r\n        .test-title {\r\n            font-size: 1.8rem;\r\n            color: var(--secondary-color);\r\n            margin: 0;\r\n        }\r\n        \r\n        .test-instruction {\r\n            background-color: var(--light-bg);\r\n            padding: 20px;\r\n            border-radius: 8px;\r\n            margin-bottom: 25px;\r\n            border-left: 4px solid var(--primary-color);\r\n        }\r\n        \r\n        .criteria-section {\r\n            background-color: #fff3cd;\r\n            border: 1px solid #ffeaa7;\r\n            border-radius: 8px;\r\n            padding: 20px;\r\n            margin-bottom: 25px;\r\n        }\r\n        \r\n        .criteria-title {\r\n            color: #856404;\r\n            margin-bottom: 15px;\r\n            font-size: 1.2rem;\r\n        }\r\n        \r\n        .criteria-grid {\r\n            display: grid;\r\n            grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\r\n            gap: 10px;\r\n        }\r\n        \r\n        .criteria-item {\r\n            display: flex;\r\n            align-items: center;\r\n            padding: 8px;\r\n            background-color: white;\r\n            border-radius: 4px;\r\n        }\r\n        \r\n        .criteria-checkbox {\r\n            margin-right: 10px;\r\n        }\r\n        \r\n        .scoring-options {\r\n            display: grid;\r\n            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\r\n            gap: 15px;\r\n            margin-bottom: 30px;\r\n        }\r\n        \r\n        .score-option {\r\n            padding: 20px;\r\n            border: none;\r\n            border-radius: 8px;\r\n            font-size: 1.1rem;\r\n            font-weight: 600;\r\n            cursor: pointer;\r\n            transition: all 0.3s ease;\r\n            text-align: center;\r\n            display: flex;\r\n            flex-direction: column;\r\n            align-items: center;\r\n            justify-content: center;\r\n        }\r\n        \r\n        .score-option:hover {\r\n            transform: translateY(-3px);\r\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);\r\n        }\r\n        \r\n        .breakout-section {\r\n            background-color: var(--flowchart-bg);\r\n            border: 2px solid var(--primary-color);\r\n            border-radius: 8px;\r\n            padding: 25px;\r\n            margin-top: 30px;\r\n            display: none;\r\n        }\r\n        \r\n        .breakout-section.active {\r\n            display: block;\r\n            animation: slideIn 0.5s ease;\r\n        }\r\n        \r\n        @keyframes slideIn {\r\n            from { opacity: 0; transform: translateY(-10px); }\r\n            to { opacity: 1; transform: translateY(0); }\r\n        }\r\n        \r\n        .breakout-header {\r\n            display: flex;\r\n            justify-content: space-between;\r\n            align-items: center;\r\n            margin-bottom: 20px;\r\n        }\r\n        \r\n        .breakout-title {\r\n            color: var(--secondary-color);\r\n            font-size: 1.5rem;\r\n            margin: 0;\r\n        }\r\n        \r\n        .breakout-status {\r\n            background-color: var(--primary-color);\r\n            color: white;\r\n            padding: 5px 15px;\r\n            border-radius: 20px;\r\n            font-size: 0.9rem;\r\n        }\r\n        \r\n        .flowchart-container {\r\n            background-color: white;\r\n            border-radius: 8px;\r\n            padding: 20px;\r\n            margin-bottom: 20px;\r\n            border: 1px solid var(--border-color);\r\n            max-height: 500px;\r\n            overflow-y: auto;\r\n        }\r\n        \r\n        .flowchart-step {\r\n            margin-bottom: 20px;\r\n            padding: 20px;\r\n            background-color: #f8f9fa;\r\n            border-radius: 8px;\r\n            border-left: 4px solid var(--primary-color);\r\n            position: relative;\r\n        }\r\n        \r\n        .flowchart-step.current {\r\n            background-color: #e3f2fd;\r\n            border-left-color: #2980b9;\r\n            box-shadow: 0 4px 12px rgba(41, 128, 185, 0.2);\r\n        }\r\n        \r\n        .flowchart-step.completed {\r\n            background-color: #e8f6f3;\r\n            border-left-color: var(--fn-color);\r\n        }\r\n        \r\n        .flowchart-step-header {\r\n            display: flex;\r\n            align-items: center;\r\n            margin-bottom: 15px;\r\n        }\r\n        \r\n        .flow-step-number {\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: center;\r\n            width: 32px;\r\n            height: 32px;\r\n            background-color: var(--primary-color);\r\n            color: white;\r\n            border-radius: 50%;\r\n            margin-right: 15px;\r\n            font-weight: 600;\r\n        }\r\n        \r\n        .flow-step-title {\r\n            font-size: 1.3rem;\r\n            color: var(--secondary-color);\r\n            margin: 0;\r\n        }\r\n        \r\n        .flow-step-instruction {\r\n            background-color: white;\r\n            padding: 15px;\r\n            border-radius: 6px;\r\n            margin-bottom: 20px;\r\n            border: 1px solid var(--border-color);\r\n        }\r\n        \r\n        .flow-step-options {\r\n            display: grid;\r\n            grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));\r\n            gap: 12px;\r\n            margin-bottom: 20px;\r\n        }\r\n        \r\n        .flow-option {\r\n            padding: 15px;\r\n            border: 2px solid var(--border-color);\r\n            border-radius: 8px;\r\n            background-color: white;\r\n            cursor: pointer;\r\n            transition: all 0.2s ease;\r\n            text-align: center;\r\n            font-weight: 600;\r\n            font-size: 1.1rem;\r\n        }\r\n        \r\n        .flow-option:hover {\r\n            border-color: var(--primary-color);\r\n            transform: translateY(-2px);\r\n            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\r\n        }\r\n        \r\n        .flow-option.selected {\r\n            border-color: var(--primary-color);\r\n            background-color: #e3f2fd;\r\n            box-shadow: 0 4px 12px rgba(52, 152, 219, 0.3);\r\n        }\r\n        \r\n        .flow-option.fn.selected { border-color: var(--fn-color); background-color: #d5f4e6; }\r\n        .flow-option.dn.selected { border-color: var(--dn-color); background-color: #fdf3e6; }\r\n        .flow-option.dp.selected { border-color: var(--dp-color); background-color: #fdeaea; }\r\n        .flow-option.fp.selected { border-color: var(--fp-color); background-color: #f9e6e6; }\r\n        \r\n        .flow-step-result {\r\n            background-color: #e8f6f3;\r\n            border-left: 4px solid var(--fn-color);\r\n            padding: 15px;\r\n            margin-top: 15px;\r\n            border-radius: 6px;\r\n            display: none;\r\n        }\r\n        \r\n        .flow-step-result.active {\r\n            display: block;\r\n            animation: fadeIn 0.5s ease;\r\n        }\r\n        \r\n        .result-section {\r\n            margin-top: 30px;\r\n            padding: 20px;\r\n            background-color: var(--light-bg);\r\n            border-radius: 8px;\r\n            display: none;\r\n        }\r\n        \r\n        .result-section.active {\r\n            display: block;\r\n        }\r\n        \r\n        .result-title {\r\n            color: var(--secondary-color);\r\n            margin-bottom: 15px;\r\n            font-size: 1.3rem;\r\n        }\r\n        \r\n        .result-summary {\r\n            display: grid;\r\n            grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\r\n            gap: 15px;\r\n            margin-bottom: 20px;\r\n        }\r\n        \r\n        .result-card {\r\n            background-color: white;\r\n            padding: 20px;\r\n            border-radius: 6px;\r\n            border-left: 4px solid var(--primary-color);\r\n        }\r\n        \r\n        .result-card.pain {\r\n            border-left-color: var(--dp-color);\r\n            background-color: #ffeaea;\r\n        }\r\n        \r\n        .result-card.dysfunction {\r\n            border-left-color: var(--dn-color);\r\n            background-color: #fff3cd;\r\n        }\r\n        \r\n        .result-card.normal {\r\n            border-left-color: var(--fn-color);\r\n            background-color: #e8f6f3;\r\n        }\r\n        \r\n        .result-card.smcd {\r\n            border-left-color: #9b59b6;\r\n            background-color: #f5e8ff;\r\n        }\r\n        \r\n        .navigation {\r\n            display: flex;\r\n            justify-content: space-between;\r\n            margin-top: 30px;\r\n            padding-top: 20px;\r\n            border-top: 1px solid var(--border-color);\r\n        }\r\n        \r\n        .nav-btn {\r\n            padding: 12px 25px;\r\n            border: none;\r\n            border-radius: 6px;\r\n            background-color: var(--primary-color);\r\n            color: white;\r\n            font-size: 1rem;\r\n            cursor: pointer;\r\n            transition: background-color 0.3s ease;\r\n        }\r\n        \r\n        .nav-btn:hover {\r\n            background-color: #2980b9;\r\n        }\r\n        \r\n        .nav-btn:disabled {\r\n            background-color: #bdc3c7;\r\n            cursor: not-allowed;\r\n        }\r\n        \r\n        .nav-btn.secondary {\r\n            background-color: #6c757d;\r\n        }\r\n        \r\n        .nav-btn.secondary:hover {\r\n            background-color: #5a6268;\r\n        }\r\n        \r\n        .summary-section {\r\n            padding: 30px;\r\n        }\r\n        \r\n        .summary-grid {\r\n            display: grid;\r\n            grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\r\n            gap: 20px;\r\n            margin-bottom: 30px;\r\n        }\r\n        \r\n        .summary-card {\r\n            background-color: white;\r\n            padding: 20px;\r\n            border-radius: 8px;\r\n            box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);\r\n        }\r\n        \r\n        .progress-bar {\r\n            height: 10px;\r\n            background-color: #ecf0f1;\r\n            border-radius: 5px;\r\n            margin: 20px 0;\r\n            overflow: hidden;\r\n        }\r\n        \r\n        .progress-fill {\r\n            height: 100%;\r\n            background-color: var(--fn-color);\r\n            width: 0%;\r\n            transition: width 0.5s ease;\r\n        }\r\n        \r\n        .progress-info {\r\n            display: flex;\r\n            justify-content: space-between;\r\n            margin-top: 5px;\r\n            font-size: 0.9rem;\r\n            color: #666;\r\n        }\r\n        \r\n        .patient-info-display {\r\n            background-color: rgba(255, 255, 255, 0.1);\r\n            padding: 15px;\r\n            border-radius: 6px;\r\n            margin-top: 10px;\r\n            display: none;\r\n        }\r\n        \r\n        .side-selector {\r\n            display: flex;\r\n            gap: 15px;\r\n            margin-bottom: 20px;\r\n        }\r\n        \r\n        .side-btn {\r\n            padding: 10px 20px;\r\n            border: 2px solid var(--border-color);\r\n            background-color: white;\r\n            border-radius: 6px;\r\n            cursor: pointer;\r\n            transition: all 0.2s ease;\r\n            font-weight: 600;\r\n        }\r\n        \r\n        .side-btn.active {\r\n            border-color: var(--primary-color);\r\n            background-color: #e3f2fd;\r\n        }\r\n        \r\n        .test-visual {\r\n            background-color: #f0f0f0;\r\n            padding: 15px;\r\n            border-radius: 8px;\r\n            margin-bottom: 20px;\r\n            text-align: center;\r\n            font-style: italic;\r\n            color: #666;\r\n        }\r\n        \r\n        .flowchart-connections {\r\n            display: flex;\r\n            justify-content: center;\r\n            align-items: center;\r\n            margin: 10px 0;\r\n            height: 30px;\r\n        }\r\n        \r\n        .flowchart-arrow {\r\n            width: 0;\r\n            height: 0;\r\n            border-left: 10px solid transparent;\r\n            border-right: 10px solid transparent;\r\n            border-top: 15px solid var(--primary-color);\r\n        }\r\n        \r\n        .diagnosis-result {\r\n            background-color: #fff3cd;\r\n            border: 2px solid #f39c12;\r\n            border-radius: 8px;\r\n            padding: 20px;\r\n            margin-top: 20px;\r\n            font-weight: 600;\r\n            color: #856404;\r\n            display: none;\r\n        }\r\n        \r\n        .diagnosis-result.active {\r\n            display: block;\r\n        }\r\n        \r\n        footer {\r\n            text-align: center;\r\n            padding: 20px;\r\n            background-color: var(--secondary-color);\r\n            color: white;\r\n            margin-top: 30px;\r\n        }\r\n        \r\n        @media (max-width: 1024px) {\r\n            .main-content {\r\n                flex-direction: column;\r\n            }\r\n            \r\n            .sidebar {\r\n                width: 100%;\r\n                max-height: 350px;\r\n            }\r\n            \r\n            .scoring-options {\r\n                grid-template-columns: repeat(2, 1fr);\r\n            }\r\n        }\r\n        \r\n        @media (max-width: 768px) {\r\n            .scoring-options {\r\n                grid-template-columns: 1fr;\r\n            }\r\n            \r\n            .header-content {\r\n                flex-direction: column;\r\n                align-items: flex-start;\r\n            }\r\n            \r\n            .scoring-grid {\r\n                grid-template-columns: repeat(2, 1fr);\r\n            }\r\n            \r\n            .criteria-grid {\r\n                grid-template-columns: 1fr;\r\n            }\r\n            \r\n            .result-summary {\r\n                grid-template-columns: 1fr;\r\n            }\r\n            \r\n            .flow-step-options {\r\n                grid-template-columns: repeat(2, 1fr);\r\n            }\r\n        }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n    <div class=\"container\">\r\n        <header>\r\n            <div class=\"header-content\">\r\n                <div>\r\n                    <h1>SFMA\uff08\u9009\u62e9\u6027\u529f\u80fd\u52a8\u4f5c\u8bc4\u4f30\uff092019\u7248<\/h1>\r\n                    <p class=\"subtitle\">\u5b8c\u6574\u6d41\u7a0b\u56fe\u7cfb\u7edf - \u57fa\u4e8eSFMA Flowcharts 2019<\/p>\r\n                <\/div>\r\n                <div class=\"patient-info-display\" id=\"patientInfoDisplay\">\r\n                    <div><strong>\u60a3\u8005\uff1a<\/strong><span id=\"displayPatientName\"><\/span><\/div>\r\n                    <div><strong>\u8bc4\u4f30\u65e5\u671f\uff1a<\/strong><span id=\"displayAssessmentDate\"><\/span><\/div>\r\n                <\/div>\r\n            <\/div>\r\n            \r\n            <div class=\"scoring-system\">\r\n                <p><strong>\u8bc4\u5206\u7cfb\u7edf\uff1a<\/strong><\/p>\r\n                <div class=\"scoring-grid\">\r\n                    <div class=\"score-item score-fn\">FN - \u529f\u80fd\u6027\u6b63\u5e38<\/div>\r\n                    <div class=\"score-item score-dn\">DN - \u529f\u80fd\u969c\u788d\u6027\u65e0\u75db<\/div>\r\n                    <div class=\"score-item score-dp\">DP - \u529f\u80fd\u969c\u788d\u6027\u75bc\u75db<\/div>\r\n                    <div class=\"score-item score-fp\">FP - \u529f\u80fd\u6027\u75bc\u75db<\/div>\r\n                <\/div>\r\n            <\/div>\r\n            \r\n            <div class=\"progress-bar\">\r\n                <div class=\"progress-fill\" id=\"progressFill\"><\/div>\r\n            <\/div>\r\n            <div class=\"progress-info\">\r\n                <span id=\"progressText\">\u8fdb\u5ea6\uff1a0%<\/span>\r\n                <span id=\"currentStep\">\u6b65\u9aa4 1\/14<\/span>\r\n            <\/div>\r\n        <\/header>\r\n        \r\n        <div class=\"main-content\">\r\n            <div class=\"sidebar\">\r\n                <div class=\"assessment-steps\">\r\n                    <h3 class=\"step-title\">\u8bc4\u4f30\u6d41\u7a0b<\/h3>\r\n                    <ul class=\"step-list\" id=\"stepList\">\r\n                        <!-- \u6b65\u9aa4\u5c06\u901a\u8fc7JavaScript\u52a8\u6001\u751f\u6210 -->\r\n                    <\/ul>\r\n                <\/div>\r\n                <div class=\"assessment-steps\">\r\n                    <h3 class=\"step-title\">\u7ed3\u679c<\/h3>\r\n                    <ul class=\"step-list\">\r\n                        <li class=\"step-item\" id=\"summaryNav\" data-section=\"summary\">\u7ed3\u679c\u6c47\u603b\u4e0e\u62a5\u544a<\/li>\r\n                    <\/ul>\r\n                <\/div>\r\n            <\/div>\r\n            \r\n            <div class=\"test-content\">\r\n                <!-- \u60a3\u8005\u4fe1\u606f -->\r\n                <div class=\"test-section active\" id=\"section-patient\">\r\n                    <div class=\"test-header\">\r\n                        <h2 class=\"test-title\">\u60a3\u8005\u4fe1\u606f\u767b\u8bb0<\/h2>\r\n                    <\/div>\r\n                    <div class=\"test-instruction\">\r\n                        <p>\u8bf7\u586b\u5199\u60a3\u8005\u57fa\u672c\u4fe1\u606f\uff0c\u6240\u6709\u5e26*\u7684\u5b57\u6bb5\u4e3a\u5fc5\u586b\u9879\u3002<\/p>\r\n                    <\/div>\r\n                    <div style=\"max-width: 700px;\">\r\n                        <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-bottom: 30px;\">\r\n                            <div>\r\n                                <label style=\"display: block; margin-bottom: 8px; font-weight: 600;\">\u59d3\u540d *<\/label>\r\n                                <input type=\"text\" id=\"patientName\" style=\"width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 1rem;\">\r\n                            <\/div>\r\n                            <div>\r\n                                <label style=\"display: block; margin-bottom: 8px; font-weight: 600;\">\u5e74\u9f84 *<\/label>\r\n                                <input type=\"number\" id=\"patientAge\" min=\"1\" max=\"120\" style=\"width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 1rem;\">\r\n                            <\/div>\r\n                            <div>\r\n                                <label style=\"display: block; margin-bottom: 8px; font-weight: 600;\">\u6027\u522b *<\/label>\r\n                                <select id=\"patientGender\" style=\"width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 1rem;\">\r\n                                    <option value=\"\">\u8bf7\u9009\u62e9<\/option>\r\n                                    <option value=\"male\">\u7537<\/option>\r\n                                    <option value=\"female\">\u5973<\/option>\r\n                                <\/select>\r\n                            <\/div>\r\n                            <div>\r\n                                <label style=\"display: block; margin-bottom: 8px; font-weight: 600;\">\u8bc4\u4f30\u65e5\u671f *<\/label>\r\n                                <input type=\"date\" id=\"assessmentDate\" style=\"width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 1rem;\">\r\n                            <\/div>\r\n                        <\/div>\r\n                        <div style=\"margin-bottom: 30px;\">\r\n                            <label style=\"display: block; margin-bottom: 8px; font-weight: 600;\">\u4e3b\u8bc9\/\u8bc4\u4f30\u539f\u56e0<\/label>\r\n                            <textarea id=\"patientComplaint\" rows=\"4\" style=\"width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 1rem;\" placeholder=\"\u63cf\u8ff0\u60a3\u8005\u7684\u4e3b\u8981\u95ee\u9898\u6216\u8bc4\u4f30\u76ee\u7684\"><\/textarea>\r\n                        <\/div>\r\n                    <\/div>\r\n                    <div class=\"navigation\">\r\n                        <button class=\"nav-btn\" id=\"nextPatient\">\u5f00\u59cb\u8bc4\u4f30<\/button>\r\n                    <\/div>\r\n                <\/div>\r\n                \r\n                <!-- \u6d4b\u8bd5\u533a\u57df\u5c06\u52a8\u6001\u751f\u6210 -->\r\n                \r\n                <!-- \u7ed3\u679c\u6c47\u603b -->\r\n                <div class=\"test-section\" id=\"section-summary\">\r\n                    <div class=\"test-header\">\r\n                        <h2 class=\"test-title\">\u8bc4\u4f30\u7ed3\u679c\u6c47\u603b\u4e0e\u62a5\u544a<\/h2>\r\n                    <\/div>\r\n                    <div class=\"summary-section\" id=\"summaryResults\">\r\n                        <!-- \u7ed3\u679c\u5c06\u901a\u8fc7JavaScript\u52a8\u6001\u751f\u6210 -->\r\n                    <\/div>\r\n                    <div class=\"navigation\">\r\n                        <button class=\"nav-btn secondary\" id=\"prevSummary\">\u8fd4\u56de\u8bc4\u4f30<\/button>\r\n                        <button class=\"nav-btn\" id=\"exportReport\">\u5bfc\u51fa\u62a5\u544a<\/button>\r\n                        <button class=\"nav-btn\" id=\"printReport\">\u6253\u5370\u62a5\u544a<\/button>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n        \r\n        <footer>\r\n            <p>SFMA 2019\u5b8c\u6574\u6d41\u7a0b\u56fe\u7cfb\u7edf | \u57fa\u4e8eSFMA-Flowcharts-2019.pdf<\/p>\r\n            <p style=\"font-size: 0.9rem; margin-top: 5px; opacity: 0.8;\">\u4ec5\u4f9b\u4e13\u4e1a\u533b\u7597\u4eba\u5458\u4f7f\u7528\uff0c\u8bc4\u4f30\u7ed3\u679c\u9700\u7531\u4e13\u4e1a\u533b\u7597\u4eba\u5458\u89e3\u91ca<\/p>\r\n        <\/footer>\r\n    <\/div>\r\n\r\n    <script>\r\n        \/\/ SFMA\u8bc4\u4f30\u6d41\u7a0b\u6570\u636e - \u57fa\u4e8ePDF\u4e2d\u7684\u5b8c\u6574\u6d41\u7a0b\u56fe\r\n        const assessmentSteps = [\r\n            {\r\n                id: 'patient',\r\n                name: '\u60a3\u8005\u4fe1\u606f',\r\n                type: 'info',\r\n                next: 'cervical_flexion'\r\n            },\r\n            {\r\n                id: 'cervical_flexion',\r\n                name: '\u9888\u690e\u5c48\u66f2',\r\n                instruction: '\u8bf7\u60a3\u8005\u4e3b\u52a8\u505a\u9888\u690e\u5c48\u66f2\u52a8\u4f5c\uff08\u4e0b\u5df4\u9760\u8fd1\u80f8\u90e8\uff09\u3002\u89c2\u5bdf\u8fd0\u52a8\u8303\u56f4\u3001\u5bf9\u79f0\u6027\u548c\u662f\u5426\u6709\u75bc\u75db\u53cd\u5e94\u3002',\r\n                criteria: [\r\n                    { id: 'painful', text: '\u75bc\u75db (Painful)' },\r\n                    { id: 'cant_touch', text: '\u4e0b\u5df4\u65e0\u6cd5\u89e6\u53ca\u80f8\u9aa8' },\r\n                    { id: 'non_uniform', text: '\u810a\u67f1\u66f2\u7ebf\u4e0d\u5747\u5300' },\r\n                    { id: 'excessive_effort', text: '\u8fc7\u5ea6\u7528\u529b\u6216\u7f3a\u4e4f\u8fd0\u52a8\u63a7\u5236' }\r\n                ],\r\n                breakout: {\r\n                    required: ['DN', 'DP', 'FP'],\r\n                    flowchart: [\r\n                        {\r\n                            id: 'active_supine_flexion',\r\n                            title: '\u4ef0\u5367\u4e3b\u52a8\u9888\u690e\u5c48\u66f2\u6d4b\u8bd5 (\u4e0b\u5df4\u8d34\u80f8)',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\uff0c\u4e3b\u52a8\u505a\u4e0b\u5df4\u8d34\u80f8\u52a8\u4f5c\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u5982\u679c\u88ab\u52a8\u6d4b\u8bd5\u6b63\u5e38\uff0c\u5219\u4e3a\u59ff\u52bf\u6027SMCD'\r\n                                },\r\n                                'DN': { next: 'passive_supine_flexion' },\r\n                                'DP': { next: 'passive_supine_flexion' },\r\n                                'FP': { next: 'passive_supine_flexion' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_supine_flexion',\r\n                            title: '\u4ef0\u5367\u88ab\u52a8\u9888\u690e\u5c48\u66f2\u6d4b\u8bd5 (PSCF)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u4e3a\u60a3\u8005\u505a\u9888\u690e\u5c48\u66f2\u52a8\u4f5c\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u4e3b\u52a8\u5f02\u5e38\u4f46\u88ab\u52a8\u6b63\u5e38 = \u9888\u690e\u5c48\u66f2SMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'PSCF = DN \u2192 \u9888\u690e\u5c48\u66f2MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'PSCF = DP \u2192 \u9888\u690e\u5c48\u66f2MD'\r\n                                },\r\n                                'FP': {\r\n                                    next: 'active_oa_flexion',\r\n                                    diagnosis: 'PSCF = FP \u2192 \u53ef\u80fd\u4e3aSMCD\uff0c\u9700\u8fdb\u4e00\u6b65\u6d4b\u8bd5'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_oa_flexion',\r\n                            title: '\u4ef0\u5367\u4e3b\u52a8OA\u9888\u690e\u5c48\u66f2\u6d4b\u8bd5 (20\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\uff0c\u4e3b\u52a8\u505a\u6795\u5bf0\u5173\u8282\u5c48\u66f220\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'c1c2_rotation' },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'OA\/\u4e0a\u4f4d\u9888\u690e\u5c48\u66f2MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'OA\/\u4e0a\u4f4d\u9888\u690e\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'OA\/\u4e0a\u4f4d\u9888\u690e\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'c1c2_rotation',\r\n                            title: 'C1-C2\u9888\u690e\u65cb\u8f6c\u6d4b\u8bd5 (40\u00b0)',\r\n                            instruction: '\u6d4b\u8bd5C1-C2\u8282\u6bb5\u65cb\u8f6c\u529f\u80fd\uff0c\u76ee\u680740\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_supine_rotation' },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'C1-C2 MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'C1-C2\u9888\u690e\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'C1-C2\u9888\u690e\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_supine_rotation',\r\n                            title: '\u4ef0\u5367\u4e3b\u52a8\u9888\u690e\u65cb\u8f6c\u6d4b\u8bd5 (80\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\uff0c\u4e3b\u52a8\u505a\u9888\u690e\u65cb\u8f6c\u81f380\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u59ff\u52bf\u6027SMCD\u5f71\u54cd\u9888\u690e\u65cb\u8f6c'\r\n                                },\r\n                                'DN': { next: 'passive_supine_rotation' },\r\n                                'DP': { next: 'passive_supine_rotation' },\r\n                                'FP': { next: 'passive_supine_rotation' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_supine_rotation',\r\n                            title: '\u4ef0\u5367\u88ab\u52a8\u9888\u690e\u65cb\u8f6c\u6d4b\u8bd5 (PSCR, 80\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u4e3a\u60a3\u8005\u505a\u9888\u690e\u65cb\u8f6c\u81f380\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u4e3b\u52a8\u5f02\u5e38\u4f46\u88ab\u52a8\u6b63\u5e38 = \u4e0b\u4f4d\u9888\u690e\u65cb\u8f6cSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'PSCR = DN \u2192 \u4e0b\u4f4d\u9888\u690e\u65cb\u8f6cMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'PSCR = DP \u2192 \u4e0b\u4f4d\u9888\u690e\u65cb\u8f6cMD'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u53ef\u80fd\u4e3aSMCD\uff0c\u9700\u8fdb\u884c\u8282\u6bb5\u6d4b\u8bd5\u548c\u8f6f\u7ec4\u7ec7\u8bc4\u4f30'\r\n                                }\r\n                            }\r\n                        }\r\n                    ]\r\n                }\r\n            },\r\n            {\r\n                id: 'cervical_extension',\r\n                name: '\u9888\u690e\u4f38\u5c55',\r\n                instruction: '\u8bf7\u60a3\u8005\u4e3b\u52a8\u505a\u9888\u690e\u4f38\u5c55\u52a8\u4f5c\uff08\u62ac\u5934\u770b\u5411\u5929\u82b1\u677f\uff09\u3002\u89c2\u5bdf\u662f\u5426\u5728\u5e73\u884c\u7ebf10\u5ea6\u5185\u3001\u810a\u67f1\u66f2\u7ebf\u5747\u5300\u6027\u548c\u662f\u5426\u6709\u75bc\u75db\u53cd\u5e94\u3002',\r\n                criteria: [\r\n                    { id: 'painful', text: '\u75bc\u75db (Painful)' },\r\n                    { id: 'not_within_10', text: '\u4e0d\u5728\u5e73\u884c\u7ebf10\u5ea6\u5185' },\r\n                    { id: 'non_uniform', text: '\u810a\u67f1\u66f2\u7ebf\u4e0d\u5747\u5300' },\r\n                    { id: 'excessive_effort', text: '\u8fc7\u5ea6\u7528\u529b\u6216\u7f3a\u4e4f\u8fd0\u52a8\u63a7\u5236' }\r\n                ],\r\n                breakout: {\r\n                    required: ['DN', 'DP', 'FP'],\r\n                    flowchart: [\r\n                        {\r\n                            id: 'supine_extension',\r\n                            title: '\u4ef0\u5367\u9888\u690e\u4f38\u5c55\u6d4b\u8bd5',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\uff0c\u4e3b\u52a8\/\u88ab\u52a8\u505a\u9888\u690e\u4f38\u5c55\u3002\u89c2\u5bdf\u662f\u5426\u8fbe\u5230\u5e73\u884c\u7ebf10\u5ea6\u5185\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u4e3b\u52a8\u5f02\u5e38\u4f46\u88ab\u52a8\u6b63\u5e38 = \u59ff\u52bf\u6027\u9888\u690e\u4f38\u5c55SMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u4ef0\u5367\u9888\u690e\u4f38\u5c55 = DN \u2192 \u9888\u690e\u4f38\u5c55MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9888\u690e\u4f38\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9888\u690e\u4f38\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        }\r\n                    ]\r\n                }\r\n            },\r\n            {\r\n                id: 'cervical_rotation',\r\n                name: '\u9888\u690e\u65cb\u8f6c',\r\n                bilateral: true,\r\n                instruction: '\u8bf7\u60a3\u8005\u4e3b\u52a8\u505a\u9888\u690e\u65cb\u8f6c\u52a8\u4f5c\uff08\u5de6\u53f3\u5206\u522b\u6d4b\u8bd5\uff09\u3002\u89c2\u5bdf\u4e0b\u5df4\/\u9f3b\u5b50\u4e0e\u9501\u9aa8\u4e2d\u7ebf\u7684\u5bf9\u9f50\u60c5\u51b5\u3002',\r\n                criteria: [\r\n                    { id: 'painful', text: '\u75bc\u75db' },\r\n                    { id: 'limited', text: '\u6d3b\u52a8\u53d7\u9650' },\r\n                    { id: 'chin_not_line', text: '\u4e0b\u5df4\/\u9f3b\u5b50\u672a\u4e0e\u9501\u9aa8\u4e2d\u7ebf\u5bf9\u9f50' },\r\n                    { id: 'excessive_effort', text: '\u8fc7\u5ea6\u7528\u529b\u3001\u4e0d\u5bf9\u79f0\u6216\u7f3a\u4e4f\u8fd0\u52a8\u63a7\u5236' }\r\n                ],\r\n                breakout: {\r\n                    required: ['DN', 'DP', 'FP'],\r\n                    flowchart: [\r\n                        {\r\n                            id: 'active_supine_rotation',\r\n                            title: '\u4ef0\u5367\u4e3b\u52a8\u9888\u690e\u65cb\u8f6c\u6d4b\u8bd5 (80\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\uff0c\u4e3b\u52a8\u505a\u9888\u690e\u65cb\u8f6c\u81f380\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u59ff\u52bf\u6027SMCD\u5f71\u54cd\u9888\u690e\u65cb\u8f6c'\r\n                                },\r\n                                'DN': { next: 'passive_supine_rotation' },\r\n                                'DP': { next: 'passive_supine_rotation' },\r\n                                'FP': { next: 'passive_supine_rotation' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_supine_rotation',\r\n                            title: '\u4ef0\u5367\u88ab\u52a8\u9888\u690e\u65cb\u8f6c\u6d4b\u8bd5 (PSCR, 80\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u4e3a\u60a3\u8005\u505a\u9888\u690e\u65cb\u8f6c\u81f380\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u4e3b\u52a8\u5f02\u5e38\u4f46\u88ab\u52a8\u6b63\u5e38 = \u4e3b\u52a8\u9888\u690e\u65cb\u8f6cSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'PSCR = DN \u2192 \u4e0b\u4f4d\u9888\u690e\u65cb\u8f6cMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'PSCR = DP \u2192 \u4e0b\u4f4d\u9888\u690e\u65cb\u8f6cMD'\r\n                                },\r\n                                'FP': {\r\n                                    next: 'c1c2_rotation_test',\r\n                                    diagnosis: 'PSCR = FP \u2192 \u53ef\u80fd\u4e3aSMCD\uff0c\u9700\u8fdb\u4e00\u6b65\u6d4b\u8bd5'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'c1c2_rotation_test',\r\n                            title: 'C1-C2\u9888\u690e\u65cb\u8f6c\u6d4b\u8bd5 (40\u00b0)',\r\n                            instruction: '\u6d4b\u8bd5C1-C2\u8282\u6bb5\u65cb\u8f6c\u529f\u80fd\uff0c\u76ee\u680740\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u5982\u679cPSCR=FP\u4e14C1-C2\u6b63\u5e38\uff0c\u5219\u4e3a\u59ff\u52bf\u6027SMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'C1-C2 MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'C1-C2\u9888\u690e\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: 'C1-C2\u9888\u690e\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        }\r\n                    ]\r\n                }\r\n            },\r\n            {\r\n                id: 'ue_pattern1',\r\n                name: '\u4e0a\u80a2\u6a21\u5f0f1 (MRE)',\r\n                bilateral: true,\r\n                instruction: '\u60a3\u8005\u4fef\u5367\u4f4d\uff0c\u6d4b\u8bd5\u4e0a\u80a2\u6a21\u5f0f1 (MRE)\u3002\u89c2\u5bdf\u662f\u5426\u80fd\u89e6\u53ca\u80a9\u80db\u4e0b\u89d2\u3002',\r\n                criteria: [\r\n                    { id: 'painful', text: '\u75bc\u75db' },\r\n                    { id: 'not_reach', text: '\u672a\u89e6\u53ca\u80a9\u80db\u4e0b\u89d2' },\r\n                    { id: 'excessive_effort', text: '\u8fc7\u5ea6\u7528\u529b\u3001\u4e0d\u5bf9\u79f0\u6216\u7f3a\u4e4f\u8fd0\u52a8\u63a7\u5236' }\r\n                ],\r\n                breakout: {\r\n                    required: ['DN', 'DP', 'FP'],\r\n                    flowchart: [\r\n                        {\r\n                            id: 'active_prone_ue1',\r\n                            title: '\u4fef\u5367\u4e3b\u52a8\u4e0a\u80a2\u6a21\u5f0f1\u6d4b\u8bd5',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u4e3b\u52a8\u5b8c\u6210\u4e0a\u80a2\u6a21\u5f0f1\u52a8\u4f5c\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_lumbar_locked' },\r\n                                'DN': { next: 'passive_prone_ue1' },\r\n                                'DP': { next: 'passive_prone_ue1' },\r\n                                'FP': { next: 'passive_prone_ue1' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_lumbar_locked',\r\n                            title: '\u4e3b\u52a8\u8170\u690e\u9501\u5b9a\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (50\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u8170\u690e\u9501\u5b9a\u72b6\u6001\u4e0b\u4e3b\u52a8\u4f38\u5c55\/\u65cb\u8f6c50\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u5982\u679c\u80f8\u690e\u6b63\u5e38\uff0c\u5219\u4e3a\u59ff\u52bf\u6027\/\u80a9\u80db\u5e26SMCD'\r\n                                },\r\n                                'DN': { next: 'passive_lumbar_locked' },\r\n                                'DP': { next: 'passive_lumbar_locked' },\r\n                                'FP': { next: 'passive_lumbar_locked' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_lumbar_locked',\r\n                            title: '\u88ab\u52a8\u8170\u690e\u9501\u5b9a\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (50\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u5728\u8170\u690e\u9501\u5b9a\u72b6\u6001\u4e0b\u88ab\u52a8\u4f38\u5c55\/\u65cb\u8f6c50\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6cSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6cMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_ue1',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u4e0a\u80a2\u6a21\u5f0f1\u6d4b\u8bd5',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u4e0a\u80a2\u6a21\u5f0f1\u52a8\u4f5c\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_prone_shoulder_ir' },\r\n                                'DN': { next: 'active_prone_shoulder_ir' },\r\n                                'DP': { next: 'active_prone_shoulder_ir' },\r\n                                'FP': { next: 'active_prone_shoulder_ir' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_prone_shoulder_ir',\r\n                            title: '\u4fef\u5367\u4e3b\u52a8\u80a9\u5173\u8282\u5185\u65cb\u6d4b\u8bd5 (60\u00b0\/150\u00b0\u5f27)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u4e3b\u52a8\u5b8c\u6210\u80a9\u5173\u8282\u5185\u65cb\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'passive_prone_shoulder_ir' },\r\n                                'DN': { next: 'passive_prone_shoulder_ir' },\r\n                                'DP': { next: 'passive_prone_shoulder_ir' },\r\n                                'FP': { next: 'passive_prone_shoulder_ir' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_shoulder_ir',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u80a9\u5173\u8282\u5185\u65cb\u6d4b\u8bd5 (60\u00b0\/150\u00b0\u5f27)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u80a9\u5173\u8282\u5185\u65cb\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'active_prone_shoulder_extension',\r\n                                    diagnosis: '\u4e3b\u52a8\u5f02\u5e38\u4f46\u88ab\u52a8\u6b63\u5e38 = \u80a9\u5173\u8282\u5185\u65cbSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5185\u65cbMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5185\u65cb\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5185\u65cb\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_prone_shoulder_extension',\r\n                            title: '\u4fef\u5367\u4e3b\u52a8\u80a9\u5173\u8282\u4f38\u5c55\u6d4b\u8bd5 (50\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u4e3b\u52a8\u5b8c\u6210\u80a9\u5173\u8282\u4f38\u5c5550\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'passive_prone_shoulder_extension' },\r\n                                'DN': { next: 'passive_prone_shoulder_extension' },\r\n                                'DP': { next: 'passive_prone_shoulder_extension' },\r\n                                'FP': { next: 'passive_prone_shoulder_extension' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_shoulder_extension',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u80a9\u5173\u8282\u4f38\u5c55\u6d4b\u8bd5 (50\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u80a9\u5173\u8282\u4f38\u5c5550\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'active_prone_elbow_flexion',\r\n                                    diagnosis: '\u4e3b\u52a8\u5f02\u5e38\u4f46\u88ab\u52a8\u6b63\u5e38 = \u80a9\u5173\u8282\u4f38\u5c55SMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u4f38\u5c55MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u4f38\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u4f38\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_prone_elbow_flexion',\r\n                            title: '\u4fef\u5367\u4e3b\u52a8\u8098\u5173\u8282\u5c48\u66f2\u6d4b\u8bd5 (\u4f38\u5c55\u4f4d)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u4e3b\u52a8\u5b8c\u6210\u8098\u5173\u8282\u5c48\u66f2\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8098\u5173\u8282\u6b63\u5e38\u3002\u5982\u679c\u65e0\u5176\u4ed6\u53d1\u73b0\uff0c\u8003\u8651\u4e3a\u8054\u5408\u4e0a\u80a2\u6a21\u5f0f1\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'DN': { next: 'passive_prone_elbow_flexion' },\r\n                                'DP': { next: 'passive_prone_elbow_flexion' },\r\n                                'FP': { next: 'passive_prone_elbow_flexion' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_elbow_flexion',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u8098\u5173\u8282\u5c48\u66f2\u6d4b\u8bd5 (\u4f38\u5c55\u4f4d)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u8098\u5173\u8282\u5c48\u66f2\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u4e3b\u52a8\u5f02\u5e38\u4f46\u88ab\u52a8\u6b63\u5e38 = \u8098\u5173\u8282\u5c48\u66f2SMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8098\u5173\u8282\u5c48\u66f2MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8098\u5173\u8282\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8098\u5173\u8282\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        }\r\n                    ]\r\n                }\r\n            },\r\n            {\r\n                id: 'ue_pattern2',\r\n                name: '\u4e0a\u80a2\u6a21\u5f0f2 (LRF)',\r\n                bilateral: true,\r\n                instruction: '\u60a3\u8005\u4fef\u5367\u4f4d\uff0c\u6d4b\u8bd5\u4e0a\u80a2\u6a21\u5f0f2 (LRF)\u3002\u89c2\u5bdf\u662f\u5426\u80fd\u89e6\u53ca\u80a9\u80db\u5188\u3002',\r\n                criteria: [\r\n                    { id: 'painful', text: '\u75bc\u75db' },\r\n                    { id: 'not_reach', text: '\u672a\u89e6\u53ca\u80a9\u80db\u5188' },\r\n                    { id: 'excessive_effort', text: '\u8fc7\u5ea6\u7528\u529b\u3001\u4e0d\u5bf9\u79f0\u6216\u7f3a\u4e4f\u8fd0\u52a8\u63a7\u5236' }\r\n                ],\r\n                breakout: {\r\n                    required: ['DN', 'DP', 'FP'],\r\n                    flowchart: [\r\n                        {\r\n                            id: 'active_prone_ue2',\r\n                            title: '\u4fef\u5367\u4e3b\u52a8\u4e0a\u80a2\u6a21\u5f0f2\u6d4b\u8bd5',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u4e3b\u52a8\u5b8c\u6210\u4e0a\u80a2\u6a21\u5f0f2\u52a8\u4f5c\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_lumbar_locked_ue2' },\r\n                                'DN': { next: 'passive_prone_ue2' },\r\n                                'DP': { next: 'passive_prone_ue2' },\r\n                                'FP': { next: 'passive_prone_ue2' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_lumbar_locked_ue2',\r\n                            title: '\u4e3b\u52a8\u8170\u690e\u9501\u5b9a\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (50\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u8170\u690e\u9501\u5b9a\u72b6\u6001\u4e0b\u4e3b\u52a8\u4f38\u5c55\/\u65cb\u8f6c50\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'passive_lumbar_locked_ue2' },\r\n                                'DN': { next: 'passive_lumbar_locked_ue2' },\r\n                                'DP': { next: 'passive_lumbar_locked_ue2' },\r\n                                'FP': { next: 'passive_lumbar_locked_ue2' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_lumbar_locked_ue2',\r\n                            title: '\u88ab\u52a8\u8170\u690e\u9501\u5b9a\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (50\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u5728\u8170\u690e\u9501\u5b9a\u72b6\u6001\u4e0b\u88ab\u52a8\u4f38\u5c55\/\u65cb\u8f6c50\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6cSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6cMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_ue2',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u4e0a\u80a2\u6a21\u5f0f2\u6d4b\u8bd5',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u4e0a\u80a2\u6a21\u5f0f2\u52a8\u4f5c\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_prone_shoulder_er' },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5916\u65cb\/\u5c48\u66f2\/\u5916\u5c55MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5916\u65cb\/\u5c48\u66f2\/\u5916\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5916\u65cb\/\u5c48\u66f2\/\u5916\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_prone_shoulder_er',\r\n                            title: '\u4fef\u5367\u4e3b\u52a8\u80a9\u5173\u8282\u5916\u65cb\u6d4b\u8bd5 (90\u00b0\/150\u00b0\u5f27)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u4e3b\u52a8\u5b8c\u6210\u80a9\u5173\u8282\u5916\u65cb\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_prone_shoulder_flexion' },\r\n                                'DN': { next: 'passive_prone_shoulder_er' },\r\n                                'DP': { next: 'passive_prone_shoulder_er' },\r\n                                'FP': { next: 'passive_prone_shoulder_er' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_shoulder_er',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u80a9\u5173\u8282\u5916\u65cb\u6d4b\u8bd5 (90\u00b0\/150\u00b0\u5f27)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u80a9\u5173\u8282\u5916\u65cb\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u4e3b\u52a8\u5f02\u5e38\u4f46\u88ab\u52a8\u6b63\u5e38 = \u80a9\u5173\u8282\u5916\u65cbSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5916\u65cbMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5916\u65cb\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5916\u65cb\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_prone_shoulder_flexion',\r\n                            title: '\u4fef\u5367\u4e3b\u52a8\u80a9\u5173\u8282\u5c48\u66f2\/\u5916\u5c55\u6d4b\u8bd5 (170\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u4e3b\u52a8\u5b8c\u6210\u80a9\u5173\u8282\u5c48\u66f2\/\u5916\u5c55170\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'passive_prone_shoulder_flexion' },\r\n                                'DN': { next: 'passive_prone_shoulder_flexion' },\r\n                                'DP': { next: 'passive_prone_shoulder_flexion' },\r\n                                'FP': { next: 'passive_prone_shoulder_flexion' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_shoulder_flexion',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u80a9\u5173\u8282\u5c48\u66f2\/\u5916\u5c55\u6d4b\u8bd5 (170\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u80a9\u5173\u8282\u5c48\u66f2\/\u5916\u5c55170\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'active_prone_elbow_flexion_flex',\r\n                                    diagnosis: '\u4e3b\u52a8\u5f02\u5e38\u4f46\u88ab\u52a8\u6b63\u5e38 = \u80a9\u5173\u8282\u5c48\u66f2\/\u5916\u5c55SMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5c48\u66f2\/\u5916\u5c55MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5c48\u66f2\/\u5916\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u5173\u8282\u5c48\u66f2\/\u5916\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_prone_elbow_flexion_flex',\r\n                            title: '\u4fef\u5367\u4e3b\u52a8\u8098\u5173\u8282\u5c48\u66f2\u6d4b\u8bd5 (\u5c48\u66f2\u4f4d)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u4e3b\u52a8\u5b8c\u6210\u8098\u5173\u8282\u5c48\u66f2\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8098\u5173\u8282\u6b63\u5e38\u3002\u5982\u679c\u65e0\u5176\u4ed6\u53d1\u73b0\uff0c\u8003\u8651\u4e3a\u8054\u5408\u4e0a\u80a2\u6a21\u5f0f2\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'DN': { next: 'passive_prone_elbow_flexion_flex' },\r\n                                'DP': { next: 'passive_prone_elbow_flexion_flex' },\r\n                                'FP': { next: 'passive_prone_elbow_flexion_flex' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_elbow_flexion_flex',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u8098\u5173\u8282\u5c48\u66f2\u6d4b\u8bd5 (\u5c48\u66f2\u4f4d)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u8098\u5173\u8282\u5c48\u66f2\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u4e3b\u52a8\u5f02\u5e38\u4f46\u88ab\u52a8\u6b63\u5e38 = \u8098\u5173\u8282\u5c48\u66f2SMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8098\u5173\u8282\u5c48\u66f2MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8098\u5173\u8282\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8098\u5173\u8282\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        }\r\n                    ]\r\n                }\r\n            },\r\n            {\r\n                id: 'multi_flexion',\r\n                name: '\u591a\u8282\u6bb5\u5c48\u66f2',\r\n                instruction: '\u8bf7\u60a3\u8005\u7ad9\u7acb\u4f4d\u505a\u524d\u5c48\u52a8\u4f5c\uff08\u624b\u591f\u811a\u8dbe\uff09\u3002\u89c2\u5bdf\u810a\u67f1\u66f2\u7ebf\u5747\u5300\u6027\u3001\u9ab6\u9aa8\u89d2\u5ea6\u3001\u540e\u4fa7\u91cd\u91cf\u8f6c\u79fb\u548c\u662f\u5426\u6709\u75bc\u75db\u53cd\u5e94\u3002',\r\n                criteria: [\r\n                    { id: 'painful', text: '\u75bc\u75db' },\r\n                    { id: 'cannot_touch', text: '\u65e0\u6cd5\u89e6\u53ca\u811a\u8dbe' },\r\n                    { id: 'sacral_angle', text: '\u9ab6\u9aa8\u89d2\u5ea6 <70\u5ea6' },\r\n                    { id: 'non_uniform', text: '\u810a\u67f1\u66f2\u7ebf\u4e0d\u5747\u5300' },\r\n                    { id: 'no_weight_shift', text: '\u7f3a\u4e4f\u540e\u4fa7\u91cd\u91cf\u8f6c\u79fb' },\r\n                    { id: 'excessive_effort', text: '\u8fc7\u5ea6\u7528\u529b\u3001\u4e0d\u5bf9\u79f0\u6216\u7f3a\u4e4f\u8fd0\u52a8\u63a7\u5236' }\r\n                ],\r\n                breakout: {\r\n                    required: ['DN', 'DP', 'FP'],\r\n                    flowchart: [\r\n                        {\r\n                            id: 'long_sitting_test',\r\n                            title: '\u957f\u5750\u4f4d\u6d4b\u8bd5',\r\n                            instruction: '\u60a3\u8005\u957f\u5750\u4f4d\uff0c\u89c2\u5bdf\u810a\u67f1\u66f2\u7ebf\u548c\u6d3b\u52a8\u8303\u56f4\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u627f\u91cd\u9acb\u5c48\u66f2\u6a21\u5f0fSMCD'\r\n                                },\r\n                                'DN': { next: 'active_slr_test' },\r\n                                'DP': { next: 'active_slr_test' },\r\n                                'FP': { next: 'active_slr_test' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_slr_test',\r\n                            title: '\u4e3b\u52a8\u76f4\u817f\u62ac\u9ad8\u6d4b\u8bd5 (70\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\uff0c\u4e3b\u52a8\u76f4\u817f\u62ac\u9ad870\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'stabilized_aslr_test' },\r\n                                'DN': { next: 'passive_slr_test' },\r\n                                'DP': { next: 'passive_slr_test' },\r\n                                'FP': { next: 'passive_slr_test' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'stabilized_aslr_test',\r\n                            title: '\u7a33\u5b9a\u5316\u4e3b\u52a8\u76f4\u817f\u62ac\u9ad8\u6d4b\u8bd5 (70\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\uff0c\u9aa8\u76c6\u7a33\u5b9a\u4e0b\u4e3b\u52a8\u76f4\u817f\u62ac\u9ad870\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u6838\u5fc3\uff08\u9aa8\u76c6\u5b9a\u5411\uff09SMCD'\r\n                                },\r\n                                'DN': { next: 'passive_slr_test' },\r\n                                'DP': { next: 'passive_slr_test' },\r\n                                'FP': { next: 'passive_slr_test' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_slr_test',\r\n                            title: '\u88ab\u52a8\u76f4\u817f\u62ac\u9ad8\u6d4b\u8bd5 (80\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u4e3a\u60a3\u8005\u505a\u88ab\u52a8\u76f4\u817f\u62ac\u9ad880\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'prone_rocking_test',\r\n                                    diagnosis: '\u4e3b\u52a8\u5f02\u5e38\u4f46\u88ab\u52a8\u6b63\u5e38 = \u4e3b\u52a8\u9acb\u5c48\u66f2SMCD\u6216\u540e\u4fa7\u94fe\u53c2\u4e0e\u95ee\u9898'\r\n                                },\r\n                                'DN': {\r\n                                    next: 'prone_rocking_test',\r\n                                    diagnosis: '\u540e\u4fa7\u94feMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: 'prone_rocking_test',\r\n                                    diagnosis: '\u53ef\u80fd\u4e3a\u4e3b\u52a8\u9acb\u5c48\u66f2SMCD'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'prone_rocking_test',\r\n                            title: '\u4fef\u5367\u6447\u52a8\u6d4b\u8bd5',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\u4f4d\uff0c\u8fdb\u884c\u9aa8\u76c6\u524d\u540e\u6447\u52a8\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'supine_knee_chest',\r\n                                    diagnosis: '\u5982\u679c\u810a\u67f1\u5728\u4efb\u4f55\u5148\u524d\u6d4b\u8bd5\u4e2d\u6709\u4e0d\u5747\u5300\u66f2\u7ebf\uff0c\u5219\u4e3a\u627f\u91cd\u810a\u67f1\u5c48\u66f2SMCD'\r\n                                },\r\n                                'DN': { next: 'supine_knee_chest' },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u810a\u67f1\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': { next: 'supine_knee_chest' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'supine_knee_chest',\r\n                            title: '\u4ef0\u5367\u62b1\u819d\u6d4b\u8bd5 (120\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\uff0c\u62b1\u819d\u81f3\u80f8\u524d\u6d4b\u8bd5\u810a\u67f1\u5c48\u66f2\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u810a\u67f1\u5c48\u66f2\u6b63\u5e38\u3002\u5982\u679c\u65e0\u5176\u4ed6\u53d1\u73b0\uff0c\u8003\u8651\u4e3a\u8dd6\u5c48\u529f\u80fd\u969c\u788d\u6216\u672c\u4f53\u611f\u89c9\u7f3a\u9677'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u810a\u67f1\u5c48\u66f2MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u810a\u67f1\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u810a\u67f1\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        }\r\n                    ]\r\n                }\r\n            },\r\n            {\r\n                id: 'multi_extension',\r\n                name: '\u591a\u8282\u6bb5\u4f38\u5c55',\r\n                instruction: '\u8bf7\u60a3\u8005\u505a\u4f38\u5c55\u52a8\u4f5c\u3002\u89c2\u5bdf\u4e0a\u80a2\u662f\u5426\u80fd\u8fbe\u5230\u6216\u7ef4\u6301170\u5ea6\u3001ASIS\u662f\u5426\u8d85\u8fc7\u811a\u8dbe\u3001\u80a9\u80db\u5188\u662f\u5426\u8d85\u8fc7\u811a\u8ddf\u3001\u810a\u67f1\u66f2\u7ebf\u5747\u5300\u6027\u3002',\r\n                criteria: [\r\n                    { id: 'painful', text: '\u75bc\u75db' },\r\n                    { id: 'ue_not_170', text: '\u4e0a\u80a2\u672a\u8fbe\u5230\u6216\u7ef4\u6301170\u5ea6' },\r\n                    { id: 'asis_not_clear', text: 'ASIS\u672a\u8d85\u8fc7\u811a\u8dbe' },\r\n                    { id: 'scapula_not_clear', text: '\u80a9\u80db\u5188\u672a\u8d85\u8fc7\u811a\u8ddf' },\r\n                    { id: 'non_uniform', text: '\u810a\u67f1\u66f2\u7ebf\u4e0d\u5747\u5300' },\r\n                    { id: 'excessive_effort', text: '\u8fc7\u5ea6\u7528\u529b\u6216\u7f3a\u4e4f\u8fd0\u52a8\u63a7\u5236' }\r\n                ],\r\n                breakout: {\r\n                    required: ['DN', 'DP', 'FP'],\r\n                    flowchart: [\r\n                        {\r\n                            id: 'prone_press_up',\r\n                            title: '\u4fef\u5367\u6491\u8d77\u6d4b\u8bd5',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\u4f4d\uff0c\u53cc\u624b\u6491\u8d77\u4e0a\u8eab\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_prone_elbow' },\r\n                                'DN': { next: 'active_prone_elbow' },\r\n                                'DP': { next: 'active_prone_elbow' },\r\n                                'FP': { next: 'active_prone_elbow' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_prone_elbow',\r\n                            title: '\u4fef\u5367\u8098\u652f\u6491\u4e3b\u52a8\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (30\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\u8098\u652f\u6491\u4f4d\uff0c\u4e3b\u52a8\u4f38\u5c55\/\u65cb\u8f6c30\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'passive_lumbar_locked_ext' },\r\n                                'DN': { next: 'passive_prone_elbow' },\r\n                                'DP': { next: 'passive_prone_elbow' },\r\n                                'FP': { next: 'passive_prone_elbow' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_elbow',\r\n                            title: '\u4fef\u5367\u8098\u652f\u6491\u88ab\u52a8\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (30\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u5728\u4fef\u5367\u8098\u652f\u6491\u4f4d\u88ab\u52a8\u4f38\u5c55\/\u65cb\u8f6c30\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8170\u690e\u4f38\u5c55\/\u65cb\u8f6cSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8170\u690e\u4f38\u5c55\/\u65cb\u8f6cMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8170\u690e\u4f38\u5c55\/\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8170\u690e\u4f38\u5c55\/\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_lumbar_locked_ext',\r\n                            title: '\u88ab\u52a8\u8170\u690e\u9501\u5b9a\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (50\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u5728\u8170\u690e\u9501\u5b9a\u72b6\u6001\u4e0b\u88ab\u52a8\u4f38\u5c55\/\u65cb\u8f6c50\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'active_lumbar_locked_ext',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6cSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6cMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6cSMCD\u4f34\u75bc\u75db'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_lumbar_locked_ext',\r\n                            title: '\u4e3b\u52a8\u8170\u690e\u9501\u5b9a\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (50\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u8170\u690e\u9501\u5b9a\u72b6\u6001\u4e0b\u4e3b\u52a8\u4f38\u5c55\/\u65cb\u8f6c50\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'passive_prone_shoulder_flexion' },\r\n                                'DN': { next: 'passive_prone_shoulder_flexion' },\r\n                                'DP': { next: 'passive_prone_shoulder_flexion' },\r\n                                'FP': { next: 'passive_prone_shoulder_flexion' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_shoulder_flexion',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u80a9\u80db\u5e26\u5c48\u66f2\u6d4b\u8bd5 (170\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u80a9\u80db\u5e26\u5c48\u66f2170\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'faber_test' },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u80db\u5e26\u5c48\u66f2MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u80db\u5e26\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u80a9\u80db\u5e26\u5c48\u66f2SMCD'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'faber_test',\r\n                            title: 'FABER\u6d4b\u8bd5',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\u4f4d\uff0c\u8fdb\u884cFABER\u6d4b\u8bd5\uff08\u5c48\u66f2\u3001\u5916\u5c55\u3001\u5916\u65cb\uff09\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'modified_thomas' },\r\n                                'DN': { next: 'stabilized_faber' },\r\n                                'DP': { next: 'stabilized_faber' },\r\n                                'FP': { next: 'stabilized_faber' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'stabilized_faber',\r\n                            title: '\u7a33\u5b9a\u5316FABER\u6d4b\u8bd5',\r\n                            instruction: '\u5728\u9aa8\u76c6\u7a33\u5b9a\u4e0b\u8fdb\u884cFABER\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'modified_thomas',\r\n                                    diagnosis: '\u6838\u5fc3\uff08\u9aa8\u76c6\u5b9a\u5411\uff09SMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\/\u9ab6\u9ac2\u5173\u8282MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u4f38\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u4f38\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'modified_thomas',\r\n                            title: '\u6539\u826f\u6258\u9a6c\u65af\u6d4b\u8bd5',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\uff0c\u8fdb\u884c\u6539\u826f\u6258\u9a6c\u65af\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_prone_hip_extension' },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u5c48\u808c\u7d27\u5f20 \u2192 \u9acb\u4f38\u5c55MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u4f38\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u4f38\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_prone_hip_extension',\r\n                            title: '\u4fef\u5367\u4e3b\u52a8\u9acb\u4f38\u5c55\u6d4b\u8bd5 (10\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u4e3b\u52a8\u9acb\u4f38\u5c5510\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'passive_prone_hip_extension' },\r\n                                'DN': { next: 'passive_prone_hip_extension' },\r\n                                'DP': { next: 'passive_prone_hip_extension' },\r\n                                'FP': { next: 'passive_prone_hip_extension' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_hip_extension',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u9acb\u4f38\u5c55\u6d4b\u8bd5 (10\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u9acb\u4f38\u5c5510\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u6838\u5fc3SMCD\u548c\/\u6216\u4e3b\u52a8\u9acb\u4f38\u5c55SMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u4f38\u5c55MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u4f38\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u4f38\u5c55\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        }\r\n                    ]\r\n                }\r\n            },\r\n            {\r\n                id: 'multi_rotation',\r\n                name: '\u591a\u8282\u6bb5\u65cb\u8f6c',\r\n                bilateral: true,\r\n                instruction: '\u8bf7\u60a3\u8005\u505a\u65cb\u8f6c\u52a8\u4f5c\uff08\u5de6\u53f3\u5206\u522b\u6d4b\u8bd5\uff09\u3002\u89c2\u5bdf\u9aa8\u76c6\u548c\u8eaf\u5e72\u65cb\u8f6c\u89d2\u5ea6\u3002',\r\n                criteria: [\r\n                    { id: 'painful', text: '\u75bc\u75db' },\r\n                    { id: 'pelvis_rotation', text: '\u9aa8\u76c6\u65cb\u8f6c <50\u5ea6' },\r\n                    { id: 'torso_rotation', text: '\u8eaf\u5e72\u65cb\u8f6c <50\u5ea6' },\r\n                    { id: 'excessive_effort', text: '\u8fc7\u5ea6\u7528\u529b\u3001\u4e0d\u5bf9\u79f0\u6216\u7f3a\u4e4f\u8fd0\u52a8\u63a7\u5236' }\r\n                ],\r\n                breakout: {\r\n                    required: ['DN', 'DP', 'FP'],\r\n                    flowchart: [\r\n                        {\r\n                            id: 'seated_torso_rotation',\r\n                            title: '\u5750\u4f4d\u8eaf\u5e72\u65cb\u8f6c\u6d4b\u8bd5 (50\u00b0)',\r\n                            instruction: '\u60a3\u8005\u5750\u4f4d\uff0c\u4e3b\u52a8\u65cb\u8f6c\u8eaf\u5e72\u81f350\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_lumbar_locked_rot' },\r\n                                'DN': { next: 'lower_quarter_external_rotation' },\r\n                                'DP': { next: 'lower_quarter_external_rotation' },\r\n                                'FP': { next: 'lower_quarter_external_rotation' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_lumbar_locked_rot',\r\n                            title: '\u4e3b\u52a8\u8170\u690e\u9501\u5b9a\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (50\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\uff0c\u8170\u690e\u9501\u5b9a\u72b6\u6001\u4e0b\u4e3b\u52a8\u4f38\u5c55\/\u65cb\u8f6c50\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'passive_lumbar_locked_rot' },\r\n                                'DN': { next: 'passive_lumbar_locked_rot' },\r\n                                'DP': { next: 'passive_lumbar_locked_rot' },\r\n                                'FP': { next: 'passive_lumbar_locked_rot' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_lumbar_locked_rot',\r\n                            title: '\u88ab\u52a8\u8170\u690e\u9501\u5b9a\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (50\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u5728\u8170\u690e\u9501\u5b9a\u72b6\u6001\u4e0b\u88ab\u52a8\u4f38\u5c55\/\u65cb\u8f6c50\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'active_prone_elbow_rot',\r\n                                    diagnosis: '\u5982\u679c\u4e3b\u52a8\u8170\u690e\u9501\u5b9a\u548c\u4e3b\u52a8\u4fef\u5367\u8098\u652f\u6491\u90fd\u6b63\u5e38\uff0c\u5219\u4e3a\u627f\u91cd\u810a\u67f1\u4f38\u5c55\/\u65cb\u8f6cSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: 'lower_quarter_external_rotation',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6cMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: 'lower_quarter_external_rotation',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: 'active_prone_elbow_rot',\r\n                                    diagnosis: '\u80f8\u690e\u4f38\u5c55\/\u65cb\u8f6cSMCD\u4f34\u75bc\u75db'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_prone_elbow_rot',\r\n                            title: '\u4fef\u5367\u8098\u652f\u6491\u4e3b\u52a8\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (30\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4fef\u5367\u8098\u652f\u6491\u4f4d\uff0c\u4e3b\u52a8\u4f38\u5c55\/\u65cb\u8f6c30\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u5982\u679c\u88ab\u52a8\u4fef\u5367\u8098\u652f\u6491\u6b63\u5e38\uff0c\u5219\u4e3a\u8170\u690e\u4f38\u5c55\/\u65cb\u8f6cSMCD'\r\n                                },\r\n                                'DN': { next: 'passive_prone_elbow_rot' },\r\n                                'DP': { next: 'passive_prone_elbow_rot' },\r\n                                'FP': { next: 'passive_prone_elbow_rot' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_elbow_rot',\r\n                            title: '\u4fef\u5367\u8098\u652f\u6491\u88ab\u52a8\u4f38\u5c55\/\u65cb\u8f6c\u6d4b\u8bd5 (30\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u5728\u4fef\u5367\u8098\u652f\u6491\u4f4d\u88ab\u52a8\u4f38\u5c55\/\u65cb\u8f6c30\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8170\u690e\u4f38\u5c55\/\u65cb\u8f6cSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: 'lower_quarter_external_rotation',\r\n                                    diagnosis: '\u8170\u690e\u4f38\u5c55\/\u65cb\u8f6cMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: 'lower_quarter_external_rotation',\r\n                                    diagnosis: '\u8170\u690e\u4f38\u5c55\/\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: 'lower_quarter_external_rotation',\r\n                                    diagnosis: '\u8170\u690e\u4f38\u5c55\/\u65cb\u8f6c\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'lower_quarter_external_rotation',\r\n                            title: '\u4e0b\u80a2\u5916\u65cb\u6d41\u7a0b\u56fe',\r\n                            instruction: '\u8f6c\u5230\u4e0b\u80a2\u5916\u65cb\u6d41\u7a0b\u56fe\u8fdb\u884c\u8fdb\u4e00\u6b65\u8bc4\u4f30\u3002',\r\n                            type: 'info',\r\n                            diagnosis: '\u9700\u8981\u8fdb\u884c\u4e0b\u80a2\u5916\u65cb\u6d41\u7a0b\u56fe\u8bc4\u4f30'\r\n                        }\r\n                    ]\r\n                }\r\n            },\r\n            {\r\n                id: 'single_leg_stance',\r\n                name: '\u5355\u817f\u7ad9\u7acb',\r\n                bilateral: true,\r\n                instruction: '\u8bf7\u60a3\u8005\u5355\u817f\u7ad9\u7acb\uff0c\u5148\u7741\u773c\u540e\u95ed\u773c\uff08\u5de6\u53f3\u5206\u522b\u6d4b\u8bd5\uff09\u3002\u89c2\u5bdf\u5e73\u8861\u80fd\u529b\u3001\u59ff\u52bf\u63a7\u5236\u548c\u662f\u5426\u6709\u75bc\u75db\u53cd\u5e94\u3002',\r\n                criteria: [\r\n                    { id: 'painful', text: '\u75bc\u75db' },\r\n                    { id: 'eyes_open', text: '\u7741\u773c <10\u79d2' },\r\n                    { id: 'eyes_closed', text: '\u95ed\u773c <10\u79d2' },\r\n                    { id: 'loss_height', text: '\u8eab\u9ad8\u964d\u4f4e' },\r\n                    { id: 'excessive_effort', text: '\u8fc7\u5ea6\u7528\u529b\u3001\u4e0d\u5bf9\u79f0\u6216\u7f3a\u4e4f\u8fd0\u52a8\u63a7\u5236' }\r\n                ],\r\n                breakout: {\r\n                    required: ['DN', 'DP', 'FP'],\r\n                    flowchart: [\r\n                        {\r\n                            id: 'ctsib_static',\r\n                            title: 'CTSIB\u6d4b\u8bd5 (\u9759\u6001\u5934\u90e8)',\r\n                            instruction: '\u60a3\u8005\u7ad9\u7acb\uff0c\u5934\u90e8\u4fdd\u6301\u9759\u6001\uff0c\u6d4b\u8bd5\u5e73\u8861\u80fd\u529b\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'half_kneeling_narrow' },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u627f\u91cd\u810a\u67f1\u548c\/\u6216\u6838\u5fc3SMCD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u627f\u91cd\u810a\u67f1\u548c\/\u6216\u6838\u5fc3SMCD'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u627f\u91cd\u810a\u67f1\u548c\/\u6216\u6838\u5fc3SMCD'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'half_kneeling_narrow',\r\n                            title: '\u534a\u8dea\u7a84\u57fa\u6d4b\u8bd5',\r\n                            instruction: '\u60a3\u8005\u534a\u8dea\u4f4d\uff0c\u7a84\u57fa\u7ad9\u7acb\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'ctsib_dynamic' },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u627f\u91cd\u9acb\u548c\/\u6216\u6838\u5fc3SMCD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u627f\u91cd\u9acb\u548c\/\u6216\u6838\u5fc3SMCD'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u627f\u91cd\u9acb\u548c\/\u6216\u6838\u5fc3SMCD'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'ctsib_dynamic',\r\n                            title: 'CTSIB\u6d4b\u8bd5 (\u52a8\u6001\u5934\u90e8\u8fd0\u52a8)',\r\n                            instruction: '\u60a3\u8005\u7ad9\u7acb\uff0c\u5934\u90e8\u8fdb\u884c\u52a8\u6001\u8fd0\u52a8\uff0c\u6d4b\u8bd5\u5e73\u8861\u80fd\u529b\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'quadruped_diagonals' },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u53ef\u80fd\u52a8\u6001\u524d\u5ead\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u53ef\u80fd\u52a8\u6001\u524d\u5ead\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u53ef\u80fd\u52a8\u6001\u524d\u5ead\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'quadruped_diagonals',\r\n                            title: '\u56db\u70b9\u8dea\u4f4d\u5bf9\u89d2\u7ebf\u6d4b\u8bd5',\r\n                            instruction: '\u60a3\u8005\u56db\u70b9\u8dea\u4f4d\uff0c\u8fdb\u884c\u5bf9\u89d2\u7ebf\u8fd0\u52a8\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8f6c\u81f3\u5355\u817f\u7ad9\u7acb\u8e1d\u5173\u8282\u6d41\u7a0b\u56fe'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u56db\u70b9\u8dea\u4f4d\u7a33\u5b9a\u6027\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u56db\u70b9\u8dea\u4f4d\u7a33\u5b9a\u6027\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u56db\u70b9\u8dea\u4f4d\u7a33\u5b9a\u6027\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        }\r\n                    ]\r\n                }\r\n            },\r\n            {\r\n                id: 'arms_down_squat',\r\n                name: '\u5f92\u624b\u6df1\u8e72',\r\n                instruction: '\u8bf7\u60a3\u8005\u505a\u5f92\u624b\u6df1\u8e72\u52a8\u4f5c\uff08\u624b\u81c2\u81ea\u7136\u4e0b\u5782\uff09\u3002\u89c2\u5bdf\u9acb\u90e8\u662f\u5426\u4f4e\u4e8e\u5e73\u884c\u7ebf\u3001\u62f3\u5934\u662f\u5426\u80fd\u89e6\u53ca\u5730\u9762\u3001\u77e2\u72b6\u9762\u5bf9\u9f50\u662f\u5426\u4e27\u5931\u3002',\r\n                criteria: [\r\n                    { id: 'painful', text: '\u75bc\u75db' },\r\n                    { id: 'hips_not_parallel', text: '\u9acb\u90e8\u672a\u4f4e\u4e8e\u5e73\u884c\u7ebf' },\r\n                    { id: 'cannot_reach', text: '\u65e0\u6cd5\u89e6\u53ca\u5730\u9762' },\r\n                    { id: 'loss_alignment', text: '\u4e27\u5931\u77e2\u72b6\u9762\u5bf9\u9f50' },\r\n                    { id: 'excessive_effort', text: '\u8fc7\u5ea6\u7528\u529b\u3001\u91cd\u91cf\u8f6c\u79fb\u6216\u8fd0\u52a8\u63a7\u5236\u95ee\u9898' }\r\n                ],\r\n                breakout: {\r\n                    required: ['DN', 'DP', 'FP'],\r\n                    flowchart: [\r\n                        {\r\n                            id: 'supine_knees_shins',\r\n                            title: '\u4ef0\u5367\u62b1\u819d\u6d4b\u8bd5 (\u62b1\u5c0f\u817f, 120\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\uff0c\u62b1\u5c0f\u817f\u81f3\u80f8\u524d\u6d4b\u8bd5\u819d\u5173\u8282\u5c48\u66f2\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'supine_knees_thighs' },\r\n                                'DN': { next: 'supine_knees_thighs' },\r\n                                'DP': { next: 'supine_knees_thighs' },\r\n                                'FP': { next: 'supine_knees_thighs' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'supine_knees_thighs',\r\n                            title: '\u4ef0\u5367\u62b1\u819d\u6d4b\u8bd5 (\u62b1\u5927\u817f, 120\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4ef0\u5367\uff0c\u62b1\u5927\u817f\u81f3\u80f8\u524d\u6d4b\u8bd5\u9acb\u5173\u8282\u5c48\u66f2\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'active_tandem_dorsiflexion',\r\n                                    diagnosis: '\u819d\u5173\u8282\u5c48\u66f2\u6b63\u5e38'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u819d\u5173\u8282\u5c48\u66f2MD\u6216\u9acb\u5c48\u66f2MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u5c48\u66f2\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_tandem_dorsiflexion',\r\n                            title: '\u4e3b\u52a8\u8e1d\u80cc\u5c48\u6d4b\u8bd5 (\u819d\u5173\u8282\u4f38\u76f4, 40\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4e3b\u52a8\u505a\u8e1d\u80cc\u5c48\u81f340\u5ea6\uff0c\u819d\u5173\u8282\u4f38\u76f4\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_tandem_dorsiflexion_knee_flexed' },\r\n                                'DN': { next: 'passive_prone_dorsiflexion' },\r\n                                'DP': { next: 'passive_prone_dorsiflexion' },\r\n                                'FP': { next: 'passive_prone_dorsiflexion' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_dorsiflexion',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u8e1d\u80cc\u5c48\u6d4b\u8bd5 (\u819d\u5173\u8282\u4f38\u76f4, 20\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u8e1d\u80cc\u5c4820\u5ea6\uff0c\u819d\u5173\u8282\u4f38\u76f4\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'active_tandem_dorsiflexion_knee_flexed',\r\n                                    diagnosis: '\u8e1d\u80cc\u5c48SMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8e1d\u80cc\u5c48MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8e1d\u80cc\u5c48\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8e1d\u80cc\u5c48\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_tandem_dorsiflexion_knee_flexed',\r\n                            title: '\u4e3b\u52a8\u8e1d\u80cc\u5c48\u6d4b\u8bd5 (\u819d\u5173\u8282\u5c48\u66f2, 40\u00b0)',\r\n                            instruction: '\u60a3\u8005\u4e3b\u52a8\u505a\u8e1d\u80cc\u5c48\u81f340\u5ea6\uff0c\u819d\u5173\u8282\u5c48\u66f2\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_seated_ankle_inversion' },\r\n                                'DN': { next: 'passive_prone_dorsiflexion_knee_flexed' },\r\n                                'DP': { next: 'passive_prone_dorsiflexion_knee_flexed' },\r\n                                'FP': { next: 'passive_prone_dorsiflexion_knee_flexed' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_prone_dorsiflexion_knee_flexed',\r\n                            title: '\u4fef\u5367\u88ab\u52a8\u8e1d\u80cc\u5c48\u6d4b\u8bd5 (\u819d\u5173\u8282\u5c48\u66f2, 30\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u8e1d\u80cc\u5c4830\u5ea6\uff0c\u819d\u5173\u8282\u5c48\u66f2\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'active_seated_ankle_inversion',\r\n                                    diagnosis: '\u8e1d\u80cc\u5c48SMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8e1d\u80cc\u5c48MD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8e1d\u80cc\u5c48\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8e1d\u80cc\u5c48\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_seated_ankle_inversion',\r\n                            title: '\u5750\u4f4d\u4e3b\u52a8\u8e1d\u5185\u7ffb\/\u5916\u7ffb\u6d4b\u8bd5',\r\n                            instruction: '\u60a3\u8005\u5750\u4f4d\uff0c\u4e3b\u52a8\u5b8c\u6210\u8e1d\u5185\u7ffb\/\u5916\u7ffb\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_seated_internal_hip_rotation' },\r\n                                'DN': { next: 'passive_ankle_inversion_eversion' },\r\n                                'DP': { next: 'passive_ankle_inversion_eversion' },\r\n                                'FP': { next: 'passive_ankle_inversion_eversion' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_ankle_inversion_eversion',\r\n                            title: '\u88ab\u52a8\u8e1d\u5185\u7ffb\/\u5916\u7ffb\u6d4b\u8bd5',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u8e1d\u5185\u7ffb\/\u5916\u7ffb\u6d4b\u8bd5\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'active_seated_internal_hip_rotation',\r\n                                    diagnosis: '\u8e1d\u5185\u7ffb\/\u5916\u7ffbSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8e1d\u5185\u7ffb\/\u5916\u7ffbMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8e1d\u5185\u7ffb\/\u5916\u7ffb\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u8e1d\u5185\u7ffb\/\u5916\u7ffb\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_seated_internal_hip_rotation',\r\n                            title: '\u5750\u4f4d\u4e3b\u52a8\u9acb\u5185\u65cb\u6d4b\u8bd5 (30\u00b0)',\r\n                            instruction: '\u60a3\u8005\u5750\u4f4d\uff0c\u4e3b\u52a8\u5b8c\u6210\u9acb\u5185\u65cb30\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': { next: 'active_seated_external_hip_rotation' },\r\n                                'DN': { next: 'passive_seated_internal_hip_rotation' },\r\n                                'DP': { next: 'passive_seated_internal_hip_rotation' },\r\n                                'FP': { next: 'passive_seated_internal_hip_rotation' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_seated_internal_hip_rotation',\r\n                            title: '\u5750\u4f4d\u88ab\u52a8\u9acb\u5185\u65cb\u6d4b\u8bd5 (30\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u9acb\u5185\u65cb30\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: 'active_seated_external_hip_rotation',\r\n                                    diagnosis: '\u9acb\u5c48\u66f2\u65f6\u4e3b\u52a8\u9acb\u5185\u65cbSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u5c48\u66f2\u65f6\u9acb\u5185\u65cbMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u5185\u65cb\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u5185\u65cb\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'active_seated_external_hip_rotation',\r\n                            title: '\u5750\u4f4d\u4e3b\u52a8\u9acb\u5916\u65cb\u6d4b\u8bd5 (40\u00b0)',\r\n                            instruction: '\u60a3\u8005\u5750\u4f4d\uff0c\u4e3b\u52a8\u5b8c\u6210\u9acb\u5916\u65cb40\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u5982\u679c\u65e0\u5176\u4ed6\u53d1\u73b0\uff0c\u5219\u4e3a\u627f\u91cd\u8e1d\u3001\u819d\u548c\/\u6216\u9acbSMCD\u548c\/\u6216\u6b63\u5e38\u89e3\u5256\u53d8\u5f02'\r\n                                },\r\n                                'DN': { next: 'passive_seated_external_hip_rotation' },\r\n                                'DP': { next: 'passive_seated_external_hip_rotation' },\r\n                                'FP': { next: 'passive_seated_external_hip_rotation' }\r\n                            }\r\n                        },\r\n                        {\r\n                            id: 'passive_seated_external_hip_rotation',\r\n                            title: '\u5750\u4f4d\u88ab\u52a8\u9acb\u5916\u65cb\u6d4b\u8bd5 (40\u00b0)',\r\n                            instruction: '\u6cbb\u7597\u5e08\u88ab\u52a8\u5b8c\u6210\u9acb\u5916\u65cb40\u5ea6\u3002',\r\n                            options: ['FN', 'DN', 'DP', 'FP'],\r\n                            logic: {\r\n                                'FN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u5c48\u66f2\u65f6\u4e3b\u52a8\u9acb\u5916\u65cbSMCD'\r\n                                },\r\n                                'DN': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u5c48\u66f2\u65f6\u9acb\u5916\u65cbMD'\r\n                                },\r\n                                'DP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u5916\u65cb\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                },\r\n                                'FP': {\r\n                                    next: '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5',\r\n                                    diagnosis: '\u9acb\u5916\u65cb\u75bc\u75db\/\u529f\u80fd\u969c\u788d'\r\n                                }\r\n                            }\r\n                        }\r\n                    ]\r\n                }\r\n            }\r\n        ];\r\n\r\n        \/\/ \u5e94\u7528\u7a0b\u5e8f\u72b6\u6001\r\n        let appState = {\r\n            currentStepIndex: 0,\r\n            currentSide: 'right', \/\/ \u7528\u4e8e\u53cc\u4fa7\u6d4b\u8bd5\u7684\u5f53\u524d\u4fa7\r\n            testResults: {},\r\n            criteriaResults: {},\r\n            breakoutResults: {},\r\n            flowchartStates: {},\r\n            patientInfo: {}\r\n        };\r\n\r\n        \/\/ DOM\u5143\u7d20\r\n        const testContent = document.querySelector('.test-content');\r\n        const stepList = document.getElementById('stepList');\r\n        const progressFill = document.getElementById('progressFill');\r\n        const progressText = document.getElementById('progressText');\r\n        const currentStep = document.getElementById('currentStep');\r\n        const patientInfoDisplay = document.getElementById('patientInfoDisplay');\r\n        const displayPatientName = document.getElementById('displayPatientName');\r\n        const displayAssessmentDate = document.getElementById('displayAssessmentDate');\r\n\r\n        \/\/ \u521d\u59cb\u5316\r\n        document.addEventListener('DOMContentLoaded', function() {\r\n            \/\/ \u8bbe\u7f6e\u9ed8\u8ba4\u8bc4\u4f30\u65e5\u671f\u4e3a\u4eca\u5929\r\n            const today = new Date().toISOString().split('T')[0];\r\n            document.getElementById('assessmentDate').value = today;\r\n            \r\n            \/\/ \u751f\u6210\u6b65\u9aa4\u5217\u8868\r\n            generateStepList();\r\n            \r\n            \/\/ \u7ed1\u5b9a\u4e8b\u4ef6\r\n            document.getElementById('nextPatient').addEventListener('click', startAssessment);\r\n            document.getElementById('prevSummary').addEventListener('click', goToPrevious);\r\n            document.getElementById('exportReport').addEventListener('click', exportReport);\r\n            document.getElementById('printReport').addEventListener('click', printReport);\r\n            document.getElementById('summaryNav').addEventListener('click', showSummary);\r\n            \r\n            \/\/ \u521d\u59cb\u5316\u8fdb\u5ea6\r\n            updateProgress();\r\n        });\r\n\r\n        \/\/ \u751f\u6210\u6b65\u9aa4\u5217\u8868\r\n        function generateStepList() {\r\n            stepList.innerHTML = '';\r\n            \r\n            assessmentSteps.forEach((step, index) => {\r\n                if (step.id === 'patient') return; \/\/ \u8df3\u8fc7\u60a3\u8005\u4fe1\u606f\u6b65\u9aa4\r\n                \r\n                const li = document.createElement('li');\r\n                li.className = 'step-item';\r\n                \r\n                \/\/ \u5982\u679c\u6709\u53cc\u4fa7\u6d4b\u8bd5\uff0c\u6dfb\u52a0\u4fa7\u522b\u6807\u8bc6\r\n                if (step.bilateral) {\r\n                    li.textContent = `${index}. ${step.name} (\u53cc\u4fa7)`;\r\n                } else {\r\n                    li.textContent = `${index}. ${step.name}`;\r\n                }\r\n                \r\n                li.dataset.stepId = step.id;\r\n                li.dataset.index = index;\r\n                \r\n                li.addEventListener('click', function() {\r\n                    const stepIndex = parseInt(this.dataset.index);\r\n                    goToStep(stepIndex);\r\n                });\r\n                \r\n                stepList.appendChild(li);\r\n            });\r\n        }\r\n\r\n        \/\/ \u5f00\u59cb\u8bc4\u4f30\r\n        function startAssessment() {\r\n            \/\/ \u6536\u96c6\u60a3\u8005\u4fe1\u606f\r\n            const patientName = document.getElementById('patientName').value;\r\n            const patientAge = document.getElementById('patientAge').value;\r\n            const patientGender = document.getElementById('patientGender').value;\r\n            const assessmentDate = document.getElementById('assessmentDate').value;\r\n            const patientComplaint = document.getElementById('patientComplaint').value;\r\n            \r\n            if (!patientName || !patientAge || !patientGender || !assessmentDate) {\r\n                alert('\u8bf7\u586b\u5199\u6240\u6709\u5fc5\u586b\u5b57\u6bb5\uff08\u59d3\u540d\u3001\u5e74\u9f84\u3001\u6027\u522b\u3001\u8bc4\u4f30\u65e5\u671f\uff09');\r\n                return;\r\n            }\r\n            \r\n            appState.patientInfo = {\r\n                name: patientName,\r\n                age: patientAge,\r\n                gender: patientGender,\r\n                date: assessmentDate,\r\n                complaint: patientComplaint,\r\n                assessmentDate: new Date().toLocaleDateString('zh-CN')\r\n            };\r\n            \r\n            \/\/ \u663e\u793a\u60a3\u8005\u4fe1\u606f\r\n            displayPatientName.textContent = patientName;\r\n            displayAssessmentDate.textContent = assessmentDate;\r\n            patientInfoDisplay.style.display = 'block';\r\n            \r\n            \/\/ \u8f6c\u5230\u7b2c\u4e00\u4e2a\u6d4b\u8bd5\u6b65\u9aa4\r\n            goToStep(1); \/\/ 1\u5bf9\u5e94cervical_flexion\r\n        }\r\n\r\n        \/\/ \u8df3\u8f6c\u5230\u6307\u5b9a\u6b65\u9aa4\r\n        function goToStep(index) {\r\n            appState.currentStepIndex = index;\r\n            updateStepListHighlight();\r\n            renderStep(index);\r\n            updateProgress();\r\n        }\r\n\r\n        \/\/ \u66f4\u65b0\u6b65\u9aa4\u5217\u8868\u9ad8\u4eae\r\n        function updateStepListHighlight() {\r\n            const stepItems = document.querySelectorAll('.step-item');\r\n            stepItems.forEach((item, index) => {\r\n                item.classList.remove('active', 'completed', 'pain', 'dysfunction', 'breakout-active');\r\n                \r\n                if (item.dataset.index) {\r\n                    const itemIndex = parseInt(item.dataset.index);\r\n                    \r\n                    if (itemIndex === appState.currentStepIndex) {\r\n                        item.classList.add('active');\r\n                    }\r\n                    \r\n                    const stepId = assessmentSteps[itemIndex]?.id;\r\n                    if (stepId) {\r\n                        const testResultKey = getTestResultKey(stepId);\r\n                        if (appState.testResults[testResultKey]) {\r\n                            item.classList.add('completed');\r\n                            \r\n                            \/\/ \u6839\u636e\u6d4b\u8bd5\u7ed3\u679c\u6dfb\u52a0\u989c\u8272\u6807\u8bc6\r\n                            const result = appState.testResults[testResultKey];\r\n                            if (result === 'DP' || result === 'FP') {\r\n                                item.classList.add('pain');\r\n                            } else if (result === 'DN') {\r\n                                item.classList.add('dysfunction');\r\n                            }\r\n                            \r\n                            \/\/ \u68c0\u67e5\u662f\u5426\u6709Breakout\u6d41\u7a0b\r\n                            const step = assessmentSteps[itemIndex];\r\n                            if (step.breakout && appState.breakoutResults[testResultKey]) {\r\n                                const breakoutResults = appState.breakoutResults[testResultKey];\r\n                                if (Object.keys(breakoutResults).length > 0) {\r\n                                    item.classList.add('breakout-active');\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n        }\r\n\r\n        \/\/ \u83b7\u53d6\u6d4b\u8bd5\u7ed3\u679c\u952e\r\n        function getTestResultKey(stepId) {\r\n            const step = assessmentSteps.find(s => s.id === stepId);\r\n            if (!step) return stepId;\r\n            \r\n            if (step.bilateral) {\r\n                return `${stepId}_${appState.currentSide}`;\r\n            }\r\n            return stepId;\r\n        }\r\n\r\n        \/\/ \u6e32\u67d3\u6b65\u9aa4\r\n        function renderStep(index) {\r\n            const step = assessmentSteps[index];\r\n            if (!step) return;\r\n            \r\n            \/\/ \u79fb\u9664\u73b0\u6709\u7684\u6b65\u9aa4\u90e8\u5206\r\n            const existingSections = document.querySelectorAll('.test-section.dynamic');\r\n            existingSections.forEach(section => section.remove());\r\n            \r\n            \/\/ \u521b\u5efa\u6b65\u9aa4\u90e8\u5206\r\n            const section = document.createElement('div');\r\n            section.className = 'test-section dynamic active';\r\n            section.id = `section-${step.id}`;\r\n            \r\n            \/\/ \u6b65\u9aa4\u6807\u9898\r\n            const header = document.createElement('div');\r\n            header.className = 'test-header';\r\n            \r\n            const title = document.createElement('h2');\r\n            title.className = 'test-title';\r\n            \r\n            if (step.bilateral) {\r\n                title.textContent = `${step.name} (${appState.currentSide === 'right' ? '\u53f3\u4fa7' : '\u5de6\u4fa7'})`;\r\n            } else {\r\n                title.textContent = step.name;\r\n            }\r\n            \r\n            header.appendChild(title);\r\n            section.appendChild(header);\r\n            \r\n            \/\/ \u6b65\u9aa4\u8bf4\u660e\r\n            const instruction = document.createElement('div');\r\n            instruction.className = 'test-instruction';\r\n            instruction.innerHTML = `<p>${step.instruction}<\/p>`;\r\n            \r\n            if (step.bilateral) {\r\n                instruction.innerHTML = `<p><strong>\u6ce8\u610f\uff1a\u6b64\u6d4b\u8bd5\u9700\u8981\u5206\u522b\u8bc4\u4f30\u5de6\u53f3\u4e24\u4fa7<\/strong><\/p><p>${step.instruction}<\/p>`;\r\n                \r\n                \/\/ \u6dfb\u52a0\u4fa7\u522b\u9009\u62e9\u5668\r\n                const sideSelector = document.createElement('div');\r\n                sideSelector.className = 'side-selector';\r\n                \r\n                const sides = [\r\n                    { text: '\u53f3\u4fa7', value: 'right' },\r\n                    { text: '\u5de6\u4fa7', value: 'left' }\r\n                ];\r\n                \r\n                sides.forEach(side => {\r\n                    const sideBtn = document.createElement('button');\r\n                    sideBtn.className = 'side-btn';\r\n                    if (appState.currentSide === side.value) {\r\n                        sideBtn.classList.add('active');\r\n                    }\r\n                    sideBtn.textContent = side.text;\r\n                    sideBtn.dataset.side = side.value;\r\n                    \r\n                    sideBtn.addEventListener('click', function() {\r\n                        appState.currentSide = this.dataset.side;\r\n                        document.querySelectorAll('.side-btn').forEach(btn => {\r\n                            btn.classList.remove('active');\r\n                        });\r\n                        this.classList.add('active');\r\n                        \r\n                        \/\/ \u91cd\u65b0\u6e32\u67d3\u6b65\u9aa4\r\n                        renderStep(index);\r\n                    });\r\n                    \r\n                    sideSelector.appendChild(sideBtn);\r\n                });\r\n                \r\n                section.appendChild(sideSelector);\r\n            }\r\n            \r\n            section.appendChild(instruction);\r\n            \r\n            \/\/ \u8bc4\u4f30\u6807\u51c6\r\n            if (step.criteria) {\r\n                const criteriaSection = document.createElement('div');\r\n                criteriaSection.className = 'criteria-section';\r\n                \r\n                const criteriaTitle = document.createElement('h3');\r\n                criteriaTitle.className = 'criteria-title';\r\n                criteriaTitle.textContent = '\u8bc4\u4f30\u6807\u51c6\uff08\u52fe\u9009\u6240\u6709\u89c2\u5bdf\u5230\u7684\u9879\u76ee\uff09';\r\n                criteriaSection.appendChild(criteriaTitle);\r\n                \r\n                const criteriaGrid = document.createElement('div');\r\n                criteriaGrid.className = 'criteria-grid';\r\n                \r\n                step.criteria.forEach(criterion => {\r\n                    const criterionItem = document.createElement('div');\r\n                    criterionItem.className = 'criteria-item';\r\n                    \r\n                    const checkbox = document.createElement('input');\r\n                    checkbox.type = 'checkbox';\r\n                    checkbox.className = 'criteria-checkbox';\r\n                    checkbox.id = `criteria-${step.id}-${criterion.id}`;\r\n                    checkbox.dataset.criterionId = criterion.id;\r\n                    \r\n                    \/\/ \u5982\u679c\u4e4b\u524d\u5df2\u9009\u62e9\uff0c\u5219\u52fe\u9009\r\n                    const testResultKey = getTestResultKey(step.id);\r\n                    if (appState.criteriaResults[testResultKey] && \r\n                        appState.criteriaResults[testResultKey].includes(criterion.id)) {\r\n                        checkbox.checked = true;\r\n                    }\r\n                    \r\n                    checkbox.addEventListener('change', function() {\r\n                        recordCriteria(step.id, criterion.id, this.checked);\r\n                    });\r\n                    \r\n                    const label = document.createElement('label');\r\n                    label.htmlFor = `criteria-${step.id}-${criterion.id}`;\r\n                    label.textContent = criterion.text;\r\n                    label.style.cursor = 'pointer';\r\n                    label.style.marginLeft = '8px';\r\n                    label.style.flex = '1';\r\n                    \r\n                    criterionItem.appendChild(checkbox);\r\n                    criterionItem.appendChild(label);\r\n                    criteriaGrid.appendChild(criterionItem);\r\n                });\r\n                \r\n                criteriaSection.appendChild(criteriaGrid);\r\n                section.appendChild(criteriaSection);\r\n            }\r\n            \r\n            \/\/ \u8bc4\u5206\u9009\u9879\r\n            const scoringOptions = document.createElement('div');\r\n            scoringOptions.className = 'scoring-options';\r\n            \r\n            const scores = [\r\n                { code: 'FN', label: '\u529f\u80fd\u6027\u6b63\u5e38 (FN)', color: 'fn' },\r\n                { code: 'DN', label: '\u529f\u80fd\u969c\u788d\u6027\u65e0\u75db (DN)', color: 'dn' },\r\n                { code: 'DP', label: '\u529f\u80fd\u969c\u788d\u6027\u75bc\u75db (DP)', color: 'dp' },\r\n                { code: 'FP', label: '\u529f\u80fd\u6027\u75bc\u75db (FP)', color: 'fp' }\r\n            ];\r\n            \r\n            scores.forEach(score => {\r\n                const option = document.createElement('button');\r\n                option.className = `score-option option-${score.color}`;\r\n                option.style.backgroundColor = getScoreColor(score.code);\r\n                option.innerHTML = `<strong style=\"font-size: 1.3rem;\">${score.code}<\/strong><br>${score.label}`;\r\n                option.dataset.score = score.code;\r\n                \r\n                option.addEventListener('click', function() {\r\n                    selectScore(step.id, score.code, index);\r\n                });\r\n                \r\n                scoringOptions.appendChild(option);\r\n            });\r\n            \r\n            section.appendChild(scoringOptions);\r\n            \r\n            \/\/ Breakout\u90e8\u5206\r\n            const breakoutSection = document.createElement('div');\r\n            breakoutSection.className = 'breakout-section';\r\n            breakoutSection.id = `breakout-${step.id}`;\r\n            section.appendChild(breakoutSection);\r\n            \r\n            \/\/ \u7ed3\u679c\u90e8\u5206\r\n            const resultSection = document.createElement('div');\r\n            resultSection.className = 'result-section';\r\n            resultSection.id = `result-${step.id}`;\r\n            section.appendChild(resultSection);\r\n            \r\n            \/\/ \u5bfc\u822a\u6309\u94ae\r\n            const navDiv = document.createElement('div');\r\n            navDiv.className = 'navigation';\r\n            \r\n            const prevButton = document.createElement('button');\r\n            prevButton.className = 'nav-btn secondary';\r\n            prevButton.textContent = '\u4e0a\u4e00\u6b65';\r\n            prevButton.id = `prev-${step.id}`;\r\n            prevButton.addEventListener('click', goToPreviousStep);\r\n            \r\n            const nextButton = document.createElement('button');\r\n            nextButton.className = 'nav-btn';\r\n            \r\n            if (step.bilateral) {\r\n                if (appState.currentSide === 'right') {\r\n                    nextButton.textContent = '\u8bc4\u4f30\u5de6\u4fa7';\r\n                    nextButton.disabled = !appState.testResults[`${step.id}_right`];\r\n                } else {\r\n                    nextButton.textContent = '\u4e0b\u4e00\u6b65';\r\n                    nextButton.disabled = !appState.testResults[`${step.id}_left`];\r\n                }\r\n            } else {\r\n                nextButton.textContent = '\u4e0b\u4e00\u6b65';\r\n                nextButton.disabled = !appState.testResults[step.id];\r\n            }\r\n            \r\n            nextButton.id = `next-${step.id}`;\r\n            nextButton.addEventListener('click', function() {\r\n                if (step.bilateral && appState.currentSide === 'right') {\r\n                    \/\/ \u5207\u6362\u5230\u5de6\u4fa7\r\n                    appState.currentSide = 'left';\r\n                    renderStep(index);\r\n                } else {\r\n                    goToNextStep();\r\n                }\r\n            });\r\n            \r\n            navDiv.appendChild(prevButton);\r\n            navDiv.appendChild(nextButton);\r\n            section.appendChild(navDiv);\r\n            \r\n            \/\/ \u6dfb\u52a0\u5230\u9875\u9762\r\n            testContent.appendChild(section);\r\n            \r\n            \/\/ \u9690\u85cf\u5176\u4ed6\u90e8\u5206\r\n            document.getElementById('section-patient').classList.remove('active');\r\n            document.getElementById('section-summary').classList.remove('active');\r\n            \r\n            \/\/ \u5982\u679c\u5df2\u6709\u7ed3\u679c\uff0c\u663e\u793a\u7ed3\u679c\r\n            const testResultKey = getTestResultKey(step.id);\r\n            if (appState.testResults[testResultKey]) {\r\n                showTestResult(step.id);\r\n                \r\n                \/\/ \u5982\u679c\u9700\u8981breakout\u6d4b\u8bd5\uff0c\u663e\u793abreakout\u6d41\u7a0b\u56fe\r\n                if (step.breakout && step.breakout.required.includes(appState.testResults[testResultKey])) {\r\n                    showBreakoutFlowchart(step);\r\n                }\r\n            }\r\n        }\r\n\r\n        \/\/ \u8bb0\u5f55\u8bc4\u4f30\u6807\u51c6\r\n        function recordCriteria(stepId, criterionId, checked) {\r\n            const testResultKey = getTestResultKey(stepId);\r\n            \r\n            if (!appState.criteriaResults[testResultKey]) {\r\n                appState.criteriaResults[testResultKey] = [];\r\n            }\r\n            \r\n            if (checked) {\r\n                if (!appState.criteriaResults[testResultKey].includes(criterionId)) {\r\n                    appState.criteriaResults[testResultKey].push(criterionId);\r\n                }\r\n            } else {\r\n                const index = appState.criteriaResults[testResultKey].indexOf(criterionId);\r\n                if (index > -1) {\r\n                    appState.criteriaResults[testResultKey].splice(index, 1);\r\n                }\r\n            }\r\n        }\r\n\r\n        \/\/ \u9009\u62e9\u8bc4\u5206\r\n        function selectScore(stepId, score, stepIndex) {\r\n            const testResultKey = getTestResultKey(stepId);\r\n            \r\n            \/\/ \u4fdd\u5b58\u7ed3\u679c\r\n            appState.testResults[testResultKey] = score;\r\n            \r\n            \/\/ \u542f\u7528\u4e0b\u4e00\u6b65\u6309\u94ae\r\n            const nextButton = document.getElementById(`next-${stepId}`);\r\n            if (nextButton) {\r\n                nextButton.disabled = false;\r\n            }\r\n            \r\n            \/\/ \u663e\u793a\u7ed3\u679c\r\n            showTestResult(stepId);\r\n            \r\n            \/\/ \u5982\u679c\u9700\u8981breakout\u6d4b\u8bd5\uff0c\u663e\u793abreakout\u6d41\u7a0b\u56fe\r\n            const step = assessmentSteps[stepIndex];\r\n            if (step.breakout && step.breakout.required.includes(score)) {\r\n                showBreakoutFlowchart(step);\r\n            } else {\r\n                \/\/ \u9690\u85cfbreakout\u90e8\u5206\r\n                const breakoutSection = document.getElementById(`breakout-${stepId}`);\r\n                if (breakoutSection) {\r\n                    breakoutSection.classList.remove('active');\r\n                }\r\n            }\r\n            \r\n            \/\/ \u66f4\u65b0\u6b65\u9aa4\u5217\u8868\r\n            updateStepListHighlight();\r\n            updateProgress();\r\n        }\r\n\r\n        \/\/ \u663e\u793aBreakout\u6d41\u7a0b\u56fe\r\n        function showBreakoutFlowchart(step) {\r\n            const breakoutSection = document.getElementById(`breakout-${step.id}`);\r\n            if (!breakoutSection) return;\r\n            \r\n            breakoutSection.innerHTML = '';\r\n            breakoutSection.classList.add('active');\r\n            \r\n            \/\/ Breakout\u6807\u9898\r\n            const breakoutHeader = document.createElement('div');\r\n            breakoutHeader.className = 'breakout-header';\r\n            \r\n            const breakoutTitle = document.createElement('h3');\r\n            breakoutTitle.className = 'breakout-title';\r\n            breakoutTitle.textContent = `${step.name} Breakout\u6d41\u7a0b\u56fe`;\r\n            breakoutHeader.appendChild(breakoutTitle);\r\n            \r\n            const breakoutStatus = document.createElement('div');\r\n            breakoutStatus.className = 'breakout-status';\r\n            breakoutStatus.textContent = '\u8fdb\u884c\u4e2d';\r\n            breakoutHeader.appendChild(breakoutStatus);\r\n            \r\n            breakoutSection.appendChild(breakoutHeader);\r\n            \r\n            \/\/ \u6d41\u7a0b\u56fe\u5bb9\u5668\r\n            const flowchartContainer = document.createElement('div');\r\n            flowchartContainer.className = 'flowchart-container';\r\n            \r\n            \/\/ \u521d\u59cb\u5316\u6d41\u7a0b\u56fe\u72b6\u6001\r\n            const flowStateKey = getTestResultKey(step.id);\r\n            if (!appState.flowchartStates[flowStateKey]) {\r\n                appState.flowchartStates[flowStateKey] = {\r\n                    currentStepIndex: 0,\r\n                    stepResults: {}\r\n                };\r\n            }\r\n            \r\n            const flowState = appState.flowchartStates[flowStateKey];\r\n            \r\n            \/\/ \u663e\u793a\u6240\u6709\u6b65\u9aa4\r\n            step.breakout.flowchart.forEach((flowStep, index) => {\r\n                const flowchartStep = document.createElement('div');\r\n                flowchartStep.className = 'flowchart-step';\r\n                \r\n                if (index === flowState.currentStepIndex) {\r\n                    flowchartStep.classList.add('current');\r\n                } else if (index < flowState.currentStepIndex) {\r\n                    flowchartStep.classList.add('completed');\r\n                }\r\n                \r\n                \/\/ \u6b65\u9aa4\u5934\u90e8\r\n                const stepHeader = document.createElement('div');\r\n                stepHeader.className = 'flowchart-step-header';\r\n                \r\n                const stepNumber = document.createElement('div');\r\n                stepNumber.className = 'flow-step-number';\r\n                stepNumber.textContent = index + 1;\r\n                stepHeader.appendChild(stepNumber);\r\n                \r\n                const stepTitle = document.createElement('h4');\r\n                stepTitle.className = 'flow-step-title';\r\n                stepTitle.textContent = flowStep.title;\r\n                stepHeader.appendChild(stepTitle);\r\n                \r\n                flowchartStep.appendChild(stepHeader);\r\n                \r\n                \/\/ \u6b65\u9aa4\u8bf4\u660e\r\n                if (flowStep.instruction) {\r\n                    const stepInstruction = document.createElement('div');\r\n                    stepInstruction.className = 'flow-step-instruction';\r\n                    stepInstruction.textContent = flowStep.instruction;\r\n                    flowchartStep.appendChild(stepInstruction);\r\n                }\r\n                \r\n                \/\/ \u6b65\u9aa4\u9009\u9879\uff08\u4ec5\u5f53\u524d\u6b65\u9aa4\u663e\u793a\uff09\r\n                if (index === flowState.currentStepIndex && flowStep.options) {\r\n                    const stepOptions = document.createElement('div');\r\n                    stepOptions.className = 'flow-step-options';\r\n                    \r\n                    flowStep.options.forEach(option => {\r\n                        const flowOption = document.createElement('div');\r\n                        flowOption.className = `flow-option ${option.toLowerCase()}`;\r\n                        \r\n                        \/\/ \u5982\u679c\u5df2\u9009\u62e9\uff0c\u6dfb\u52a0selected\u7c7b\r\n                        if (flowState.stepResults[flowStep.id] === option) {\r\n                            flowOption.classList.add('selected');\r\n                        }\r\n                        \r\n                        flowOption.textContent = option;\r\n                        flowOption.dataset.option = option;\r\n                        \r\n                        flowOption.addEventListener('click', function() {\r\n                            \/\/ \u8bb0\u5f55\u9009\u62e9\r\n                            flowState.stepResults[flowStep.id] = option;\r\n                            \r\n                            \/\/ \u66f4\u65b0UI\r\n                            stepOptions.querySelectorAll('.flow-option').forEach(opt => {\r\n                                opt.classList.remove('selected');\r\n                            });\r\n                            this.classList.add('selected');\r\n                            \r\n                            \/\/ \u4fdd\u5b58breakout\u7ed3\u679c\r\n                            saveBreakoutResult(step.id, flowStep.id, option);\r\n                            \r\n                            \/\/ \u663e\u793a\u7ed3\u679c\u548c\u8bca\u65ad\r\n                            if (flowStep.logic && flowStep.logic[option]) {\r\n                                const logic = flowStep.logic[option];\r\n                                \r\n                                \/\/ \u79fb\u9664\u4e4b\u524d\u7684\u7ed3\u679c\r\n                                const existingResult = flowchartStep.querySelector('.flow-step-result');\r\n                                if (existingResult) {\r\n                                    existingResult.remove();\r\n                                }\r\n                                \r\n                                const stepResult = document.createElement('div');\r\n                                stepResult.className = 'flow-step-result active';\r\n                                \r\n                                let resultHTML = '';\r\n                                if (logic.diagnosis) {\r\n                                    resultHTML += `<strong>\u8bca\u65ad\uff1a<\/strong> ${logic.diagnosis}<br>`;\r\n                                }\r\n                                if (logic.next && logic.next !== '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5') {\r\n                                    resultHTML += `<strong>\u4e0b\u4e00\u6b65\uff1a<\/strong> ${logic.next}`;\r\n                                }\r\n                                \r\n                                stepResult.innerHTML = resultHTML;\r\n                                flowchartStep.appendChild(stepResult);\r\n                                \r\n                                \/\/ \u5982\u679c\u6709\u4e0b\u4e00\u6b65\u4e14\u4e0d\u662f\"\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5\"\uff0c\u663e\u793a\u7ee7\u7eed\u6309\u94ae\r\n                                if (logic.next && logic.next !== '\u65e0\u8fdb\u4e00\u6b65\u6d4b\u8bd5' && index < step.breakout.flowchart.length - 1) {\r\n                                    const continueButton = document.createElement('button');\r\n                                    continueButton.className = 'nav-btn';\r\n                                    continueButton.textContent = '\u7ee7\u7eed\u4e0b\u4e00\u6b65';\r\n                                    continueButton.style.marginTop = '15px';\r\n                                    \r\n                                    continueButton.addEventListener('click', function() {\r\n                                        flowState.currentStepIndex = index + 1;\r\n                                        showBreakoutFlowchart(step);\r\n                                    });\r\n                                    \r\n                                    flowchartStep.appendChild(continueButton);\r\n                                }\r\n                            }\r\n                        });\r\n                        \r\n                        stepOptions.appendChild(flowOption);\r\n                    });\r\n                    \r\n                    flowchartStep.appendChild(stepOptions);\r\n                }\r\n                \r\n                \/\/ \u5982\u679c\u6b65\u9aa4\u5df2\u5b8c\u6210\uff0c\u663e\u793a\u7ed3\u679c\r\n                if (index < flowState.currentStepIndex && flowState.stepResults[flowStep.id]) {\r\n                    const selectedOption = flowState.stepResults[flowStep.id];\r\n                    if (flowStep.logic && flowStep.logic[selectedOption]) {\r\n                        const logic = flowStep.logic[selectedOption];\r\n                        \r\n                        const stepResult = document.createElement('div');\r\n                        stepResult.className = 'flow-step-result active';\r\n                        \r\n                        let resultHTML = `<strong>\u9009\u62e9\uff1a<\/strong> ${selectedOption}<br>`;\r\n                        if (logic.diagnosis) {\r\n                            resultHTML += `<strong>\u8bca\u65ad\uff1a<\/strong> ${logic.diagnosis}`;\r\n                        }\r\n                        \r\n                        stepResult.innerHTML = resultHTML;\r\n                        flowchartStep.appendChild(stepResult);\r\n                    }\r\n                }\r\n                \r\n                flowchartContainer.appendChild(flowchartStep);\r\n                \r\n                \/\/ \u5982\u679c\u4e0d\u662f\u6700\u540e\u4e00\u6b65\uff0c\u6dfb\u52a0\u7bad\u5934\r\n                if (index < step.breakout.flowchart.length - 1) {\r\n                    const arrowDiv = document.createElement('div');\r\n                    arrowDiv.className = 'flowchart-connections';\r\n                    const arrow = document.createElement('div');\r\n                    arrow.className = 'flowchart-arrow';\r\n                    arrowDiv.appendChild(arrow);\r\n                    flowchartContainer.appendChild(arrowDiv);\r\n                }\r\n            });\r\n            \r\n            breakoutSection.appendChild(flowchartContainer);\r\n            \r\n            \/\/ \u663e\u793a\u6700\u7ec8\u8bca\u65ad\u7ed3\u679c\uff08\u5982\u679c\u6240\u6709\u6b65\u9aa4\u90fd\u5df2\u5b8c\u6210\uff09\r\n            if (flowState.currentStepIndex >= step.breakout.flowchart.length) {\r\n                const diagnosisResult = document.createElement('div');\r\n                diagnosisResult.className = 'diagnosis-result active';\r\n                diagnosisResult.innerHTML = `<strong>\u6700\u7ec8\u8bca\u65ad\uff1a<\/strong> ${getBreakoutDiagnosis(step, flowState)}`;\r\n                breakoutSection.appendChild(diagnosisResult);\r\n            }\r\n        }\r\n\r\n        \/\/ \u4fdd\u5b58breakout\u7ed3\u679c\r\n        function saveBreakoutResult(stepId, breakoutStepId, result) {\r\n            const testResultKey = getTestResultKey(stepId);\r\n            \r\n            if (!appState.breakoutResults[testResultKey]) {\r\n                appState.breakoutResults[testResultKey] = {};\r\n            }\r\n            \r\n            appState.breakoutResults[testResultKey][breakoutStepId] = result;\r\n        }\r\n\r\n        \/\/ \u83b7\u53d6breakout\u8bca\u65ad\r\n        function getBreakoutDiagnosis(step, flowState) {\r\n            \/\/ \u8fd9\u91cc\u53ef\u4ee5\u66f4\u590d\u6742\u5730\u5206\u6790\u6240\u6709\u6b65\u9aa4\u7684\u7ed3\u679c\u6765\u751f\u6210\u6700\u7ec8\u8bca\u65ad\r\n            \/\/ \u73b0\u5728\u5148\u7b80\u5355\u8fd4\u56de\u6700\u540e\u4e00\u4e2a\u6b65\u9aa4\u7684\u8bca\u65ad\r\n            const lastStep = step.breakout.flowchart[step.breakout.flowchart.length - 1];\r\n            if (lastStep && flowState.stepResults[lastStep.id] && lastStep.logic) {\r\n                const selectedOption = flowState.stepResults[lastStep.id];\r\n                const logic = lastStep.logic[selectedOption];\r\n                return logic.diagnosis || '\u8bca\u65ad\u5f85\u786e\u5b9a';\r\n            }\r\n            return '\u8bca\u65ad\u5f85\u786e\u5b9a';\r\n        }\r\n\r\n        \/\/ \u663e\u793a\u6d4b\u8bd5\u7ed3\u679c\r\n        function showTestResult(stepId) {\r\n            const resultSection = document.getElementById(`result-${stepId}`);\r\n            if (!resultSection) return;\r\n            \r\n            resultSection.innerHTML = '';\r\n            resultSection.classList.add('active');\r\n            \r\n            const testResultKey = getTestResultKey(stepId);\r\n            const mainResult = appState.testResults[testResultKey];\r\n            if (!mainResult) return;\r\n            \r\n            const step = assessmentSteps.find(s => s.id === stepId);\r\n            \r\n            const resultTitle = document.createElement('h3');\r\n            resultTitle.className = 'result-title';\r\n            \r\n            if (step.bilateral) {\r\n                resultTitle.textContent = `${step.name} (${appState.currentSide === 'right' ? '\u53f3\u4fa7' : '\u5de6\u4fa7'}) \u7ed3\u679c`;\r\n            } else {\r\n                resultTitle.textContent = `${step.name} \u7ed3\u679c`;\r\n            }\r\n            \r\n            resultSection.appendChild(resultTitle);\r\n            \r\n            const resultSummary = document.createElement('div');\r\n            resultSummary.className = 'result-summary';\r\n            \r\n            const resultCard = document.createElement('div');\r\n            resultCard.className = 'result-card';\r\n            \r\n            let priorityClass = '';\r\n            let priorityText = '';\r\n            \r\n            if (mainResult === 'FN') {\r\n                priorityClass = 'normal';\r\n                priorityText = '\u4f4e\u4f18\u5148\u7ea7 (\u6b63\u5e38)';\r\n            } else if (mainResult === 'DN') {\r\n                priorityClass = 'dysfunction';\r\n                priorityText = '\u4e2d\u4f18\u5148\u7ea7 (\u529f\u80fd\u969c\u788d)';\r\n            } else if (mainResult === 'DP' || mainResult === 'FP') {\r\n                priorityClass = 'pain';\r\n                priorityText = '\u9ad8\u4f18\u5148\u7ea7 (\u75bc\u75db\u76f8\u5173)';\r\n            }\r\n            \r\n            resultCard.classList.add(priorityClass);\r\n            \r\n            let resultHTML = `<div style=\"display: flex; align-items: center; margin-bottom: 15px;\">\r\n                <div style=\"width: 30px; height: 30px; background-color: ${getScoreColor(mainResult)}; border-radius: 4px; margin-right: 10px;\"><\/div>\r\n                <div>\r\n                    <strong style=\"font-size: 1.2rem;\">\u8bc4\u5206\uff1a${mainResult}<\/strong><br>\r\n                    <span>${priorityText}<\/span>\r\n                <\/div>\r\n            <\/div>`;\r\n            \r\n            \/\/ \u6dfb\u52a0\u89c2\u5bdf\u5230\u7684\u6807\u51c6\r\n            if (appState.criteriaResults[testResultKey] && appState.criteriaResults[testResultKey].length > 0) {\r\n                resultHTML += `<p><strong>\u89c2\u5bdf\u5230\u7684\u6807\u51c6\uff1a<\/strong><\/p><ul style=\"margin-left: 20px; margin-top: 10px;\">`;\r\n                appState.criteriaResults[testResultKey].forEach(criterionId => {\r\n                    const criterion = step.criteria.find(c => c.id === criterionId);\r\n                    if (criterion) {\r\n                        resultHTML += `<li>${criterion.text}<\/li>`;\r\n                    }\r\n                });\r\n                resultHTML += `<\/ul>`;\r\n            }\r\n            \r\n            \/\/ \u6dfb\u52a0Breakout\u7ed3\u679c\r\n            const breakoutResults = appState.breakoutResults[testResultKey];\r\n            if (breakoutResults && Object.keys(breakoutResults).length > 0) {\r\n                resultHTML += `<p style=\"margin-top: 15px;\"><strong>Breakout\u6d4b\u8bd5\u7ed3\u679c\uff1a<\/strong><\/p>`;\r\n                Object.keys(breakoutResults).forEach(breakoutId => {\r\n                    const breakoutStep = step.breakout?.flowchart.find(fs => fs.id === breakoutId);\r\n                    const stepName = breakoutStep ? breakoutStep.title : breakoutId;\r\n                    resultHTML += `<div style=\"margin-top: 5px;\">\r\n                        <span style=\"font-weight: 600;\">${stepName}\uff1a<\/span>\r\n                        <span>${breakoutResults[breakoutId]}<\/span>\r\n                    <\/div>`;\r\n                });\r\n            }\r\n            \r\n            resultCard.innerHTML = resultHTML;\r\n            resultSummary.appendChild(resultCard);\r\n            resultSection.appendChild(resultSummary);\r\n        }\r\n\r\n        \/\/ \u4e0a\u4e00\u6b65\r\n        function goToPreviousStep() {\r\n            if (appState.currentStepIndex > 1) { \/\/ 1\u5bf9\u5e94\u7b2c\u4e00\u4e2a\u6d4b\u8bd5\u6b65\u9aa4\r\n                \/\/ \u91cd\u7f6e\u4fa7\u522b\r\n                appState.currentSide = 'right';\r\n                goToStep(appState.currentStepIndex - 1);\r\n            } else {\r\n                \/\/ \u56de\u5230\u60a3\u8005\u4fe1\u606f\r\n                document.getElementById('section-patient').classList.add('active');\r\n                document.querySelectorAll('.test-section.dynamic').forEach(section => {\r\n                    section.classList.remove('active');\r\n                });\r\n                document.getElementById('section-summary').classList.remove('active');\r\n                updateStepListHighlight();\r\n            }\r\n        }\r\n\r\n        \/\/ \u4e0b\u4e00\u6b65\r\n        function goToNextStep() {\r\n            \/\/ \u91cd\u7f6e\u4fa7\u522b\r\n            appState.currentSide = 'right';\r\n            \r\n            if (appState.currentStepIndex < assessmentSteps.length - 1) {\r\n                goToStep(appState.currentStepIndex + 1);\r\n            } else {\r\n                \/\/ \u663e\u793a\u7ed3\u679c\u6c47\u603b\r\n                showSummary();\r\n            }\r\n        }\r\n\r\n        \/\/ \u663e\u793a\u7ed3\u679c\u6c47\u603b\r\n        function showSummary() {\r\n            \/\/ \u79fb\u9664\u73b0\u6709\u7684\u6d4b\u8bd5\u90e8\u5206\r\n            const existingSections = document.querySelectorAll('.test-section.dynamic');\r\n            existingSections.forEach(section => section.remove());\r\n            \r\n            \/\/ \u9690\u85cf\u60a3\u8005\u4fe1\u606f\u90e8\u5206\r\n            document.getElementById('section-patient').classList.remove('active');\r\n            \r\n            \/\/ \u663e\u793a\u6c47\u603b\u90e8\u5206\r\n            document.getElementById('section-summary').classList.add('active');\r\n            \r\n            \/\/ \u66f4\u65b0\u6b65\u9aa4\u5217\u8868\u9ad8\u4eae\r\n            const stepItems = document.querySelectorAll('.step-item');\r\n            stepItems.forEach(item => {\r\n                item.classList.remove('active');\r\n            });\r\n            document.getElementById('summaryNav').classList.add('active');\r\n            \r\n            \/\/ \u751f\u6210\u6c47\u603b\u5185\u5bb9\r\n            const summaryResults = document.getElementById('summaryResults');\r\n            summaryResults.innerHTML = '';\r\n            \r\n            \/\/ \u60a3\u8005\u4fe1\u606f\r\n            const patientSection = document.createElement('div');\r\n            patientSection.className = 'summary-card';\r\n            patientSection.innerHTML = `\r\n                <h3 style=\"margin-bottom: 15px; color: var(--secondary-color);\">\u60a3\u8005\u4fe1\u606f<\/h3>\r\n                <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 15px;\">\r\n                    <div>\r\n                        <p><strong>\u59d3\u540d\uff1a<\/strong>${appState.patientInfo.name}<\/p>\r\n                        <p><strong>\u5e74\u9f84\uff1a<\/strong>${appState.patientInfo.age}\u5c81<\/p>\r\n                        <p><strong>\u6027\u522b\uff1a<\/strong>${appState.patientInfo.gender === 'male' ? '\u7537' : '\u5973'}<\/p>\r\n                    <\/div>\r\n                    <div>\r\n                        <p><strong>\u8bc4\u4f30\u65e5\u671f\uff1a<\/strong>${appState.patientInfo.date}<\/p>\r\n                        <p><strong>\u5b8c\u6210\u65e5\u671f\uff1a<\/strong>${appState.patientInfo.assessmentDate}<\/p>\r\n                    <\/div>\r\n                <\/div>\r\n                <p><strong>\u4e3b\u8bc9\/\u8bc4\u4f30\u539f\u56e0\uff1a<\/strong>${appState.patientInfo.complaint || '\u65e0\u8bb0\u5f55'}<\/p>\r\n            `;\r\n            summaryResults.appendChild(patientSection);\r\n            \r\n            \/\/ \u6d4b\u8bd5\u7ed3\u679c\u6c47\u603b\r\n            const resultsSection = document.createElement('div');\r\n            resultsSection.className = 'summary-card';\r\n            resultsSection.innerHTML = '<h3 style=\"margin-bottom: 15px; color: var(--secondary-color);\">SFMA Top-Tier \u8bc4\u4f30\u7ed3\u679c<\/h3>';\r\n            \r\n            assessmentSteps.forEach(step => {\r\n                if (step.id === 'patient') return;\r\n                \r\n                if (step.bilateral) {\r\n                    \/\/ \u53cc\u4fa7\u6d4b\u8bd5\r\n                    const rightResult = appState.testResults[`${step.id}_right`];\r\n                    const leftResult = appState.testResults[`${step.id}_left`];\r\n                    \r\n                    if (rightResult || leftResult) {\r\n                        const resultDiv = document.createElement('div');\r\n                        resultDiv.style.padding = '15px';\r\n                        resultDiv.style.marginBottom = '15px';\r\n                        resultDiv.style.borderRadius = '6px';\r\n                        resultDiv.style.backgroundColor = '#f8f9fa';\r\n                        \r\n                        let resultHTML = `<strong>${step.name}\uff1a<\/strong><br>`;\r\n                        \r\n                        if (rightResult) {\r\n                            const color = getScoreColor(rightResult);\r\n                            resultHTML += `<span style=\"color: ${color}; font-weight: bold;\">\u53f3\u4fa7\uff1a${rightResult}<\/span>`;\r\n                            \r\n                            \/\/ \u68c0\u67e5\u662f\u5426\u6709Breakout\u7ed3\u679c\r\n                            const rightBreakout = appState.breakoutResults[`${step.id}_right`];\r\n                            if (rightBreakout && Object.keys(rightBreakout).length > 0) {\r\n                                resultHTML += ' <span style=\"color: #9b59b6; font-size: 0.9em;\">(\u6709Breakout\u6d4b\u8bd5)<\/span>';\r\n                            }\r\n                        } else {\r\n                            resultHTML += '\u53f3\u4fa7\uff1a\u672a\u8bc4\u4f30<br>';\r\n                        }\r\n                        \r\n                        if (leftResult) {\r\n                            const color = getScoreColor(leftResult);\r\n                            resultHTML += `<br><span style=\"color: ${color}; font-weight: bold;\">\u5de6\u4fa7\uff1a${leftResult}<\/span>`;\r\n                            \r\n                            \/\/ \u68c0\u67e5\u662f\u5426\u6709Breakout\u7ed3\u679c\r\n                            const leftBreakout = appState.breakoutResults[`${step.id}_left`];\r\n                            if (leftBreakout && Object.keys(leftBreakout).length > 0) {\r\n                                resultHTML += ' <span style=\"color: #9b59b6; font-size: 0.9em;\">(\u6709Breakout\u6d4b\u8bd5)<\/span>';\r\n                            }\r\n                        } else {\r\n                            resultHTML += '<br>\u5de6\u4fa7\uff1a\u672a\u8bc4\u4f30';\r\n                        }\r\n                        \r\n                        resultDiv.innerHTML = resultHTML;\r\n                        resultsSection.appendChild(resultDiv);\r\n                    }\r\n                } else {\r\n                    \/\/ \u5355\u4fa7\u6d4b\u8bd5\r\n                    const result = appState.testResults[step.id];\r\n                    if (result) {\r\n                        const resultDiv = document.createElement('div');\r\n                        resultDiv.style.padding = '15px';\r\n                        resultDiv.style.marginBottom = '15px';\r\n                        resultDiv.style.borderRadius = '6px';\r\n                        resultDiv.style.backgroundColor = '#f8f9fa';\r\n                        \r\n                        const color = getScoreColor(result);\r\n                        let resultHTML = `<strong>${step.name}\uff1a<\/strong> <span style=\"color: ${color}; font-weight: bold;\">${result}<\/span>`;\r\n                        \r\n                        \/\/ \u68c0\u67e5\u662f\u5426\u6709Breakout\u7ed3\u679c\r\n                        const breakoutResults = appState.breakoutResults[step.id];\r\n                        if (breakoutResults && Object.keys(breakoutResults).length > 0) {\r\n                            resultHTML += ' <span style=\"color: #9b59b6; font-size: 0.9em;\">(\u6709Breakout\u6d4b\u8bd5)<\/span>';\r\n                        }\r\n                        \r\n                        resultDiv.innerHTML = resultHTML;\r\n                        resultsSection.appendChild(resultDiv);\r\n                    }\r\n                }\r\n            });\r\n            \r\n            summaryResults.appendChild(resultsSection);\r\n            \r\n            \/\/ Breakout\u7ed3\u679c\u8be6\u60c5\r\n            const breakoutResultsSection = document.createElement('div');\r\n            breakoutResultsSection.className = 'summary-card';\r\n            breakoutResultsSection.innerHTML = '<h3 style=\"margin-bottom: 15px; color: var(--secondary-color);\">Breakout\u6d4b\u8bd5\u7ed3\u679c\u8be6\u60c5<\/h3>';\r\n            \r\n            let hasBreakoutResults = false;\r\n            \r\n            assessmentSteps.forEach(step => {\r\n                if (step.id === 'patient') return;\r\n                \r\n                if (step.bilateral) {\r\n                    const rightBreakout = appState.breakoutResults[`${step.id}_right`];\r\n                    const leftBreakout = appState.breakoutResults[`${step.id}_left`];\r\n                    \r\n                    if (rightBreakout && Object.keys(rightBreakout).length > 0) {\r\n                        hasBreakoutResults = true;\r\n                        const breakoutDiv = document.createElement('div');\r\n                        breakoutDiv.style.padding = '15px';\r\n                        breakoutDiv.style.marginBottom = '15px';\r\n                        breakoutDiv.style.borderRadius = '6px';\r\n                        breakoutDiv.style.backgroundColor = '#f0f7ff';\r\n                        \r\n                        let breakoutHTML = `<strong>${step.name} (\u53f3\u4fa7) Breakout\u7ed3\u679c\uff1a<\/strong><br>`;\r\n                        \r\n                        Object.keys(rightBreakout).forEach(breakoutId => {\r\n                            const breakoutStep = step.breakout?.flowchart.find(fs => fs.id === breakoutId);\r\n                            const stepName = breakoutStep ? breakoutStep.title : breakoutId;\r\n                            breakoutHTML += `<div style=\"margin-top: 5px;\">\r\n                                <span style=\"font-weight: 600;\">${stepName}\uff1a<\/span>\r\n                                <span>${rightBreakout[breakoutId]}<\/span>\r\n                            <\/div>`;\r\n                        });\r\n                        \r\n                        breakoutDiv.innerHTML = breakoutHTML;\r\n                        breakoutResultsSection.appendChild(breakoutDiv);\r\n                    }\r\n                    \r\n                    if (leftBreakout && Object.keys(leftBreakout).length > 0) {\r\n                        hasBreakoutResults = true;\r\n                        const breakoutDiv = document.createElement('div');\r\n                        breakoutDiv.style.padding = '15px';\r\n                        breakoutDiv.style.marginBottom = '15px';\r\n                        breakoutDiv.style.borderRadius = '6px';\r\n                        breakoutDiv.style.backgroundColor = '#f0f7ff';\r\n                        \r\n                        let breakoutHTML = `<strong>${step.name} (\u5de6\u4fa7) Breakout\u7ed3\u679c\uff1a<\/strong><br>`;\r\n                        \r\n                        Object.keys(leftBreakout).forEach(breakoutId => {\r\n                            const breakoutStep = step.breakout?.flowchart.find(fs => fs.id === breakoutId);\r\n                            const stepName = breakoutStep ? breakoutStep.title : breakoutId;\r\n                            breakoutHTML += `<div style=\"margin-top: 5px;\">\r\n                                <span style=\"font-weight: 600;\">${stepName}\uff1a<\/span>\r\n                                <span>${leftBreakout[breakoutId]}<\/span>\r\n                            <\/div>`;\r\n                        });\r\n                        \r\n                        breakoutDiv.innerHTML = breakoutHTML;\r\n                        breakoutResultsSection.appendChild(breakoutDiv);\r\n                    }\r\n                } else {\r\n                    const breakoutResults = appState.breakoutResults[step.id];\r\n                    if (breakoutResults && Object.keys(breakoutResults).length > 0) {\r\n                        hasBreakoutResults = true;\r\n                        const breakoutDiv = document.createElement('div');\r\n                        breakoutDiv.style.padding = '15px';\r\n                        breakoutDiv.style.marginBottom = '15px';\r\n                        breakoutDiv.style.borderRadius = '6px';\r\n                        breakoutDiv.style.backgroundColor = '#f0f7ff';\r\n                        \r\n                        let breakoutHTML = `<strong>${step.name} Breakout\u7ed3\u679c\uff1a<\/strong><br>`;\r\n                        \r\n                        Object.keys(breakoutResults).forEach(breakoutId => {\r\n                            const breakoutStep = step.breakout?.flowchart.find(fs => fs.id === breakoutId);\r\n                            const stepName = breakoutStep ? breakoutStep.title : breakoutId;\r\n                            breakoutHTML += `<div style=\"margin-top: 5px;\">\r\n                                <span style=\"font-weight: 600;\">${stepName}\uff1a<\/span>\r\n                                <span>${breakoutResults[breakoutId]}<\/span>\r\n                            <\/div>`;\r\n                        });\r\n                        \r\n                        breakoutDiv.innerHTML = breakoutHTML;\r\n                        breakoutResultsSection.appendChild(breakoutDiv);\r\n                    }\r\n                }\r\n            });\r\n            \r\n            if (hasBreakoutResults) {\r\n                summaryResults.appendChild(breakoutResultsSection);\r\n            }\r\n            \r\n            \/\/ \u4f18\u5148\u7ea7\u5206\u6790\r\n            const prioritySection = document.createElement('div');\r\n            prioritySection.className = 'summary-card';\r\n            prioritySection.innerHTML = '<h3 style=\"margin-bottom: 15px; color: var(--secondary-color);\">\u4f18\u5148\u7ea7\u5206\u6790\u4e0e\u5efa\u8bae<\/h3>';\r\n            \r\n            \/\/ \u7edf\u8ba1\u5404\u7c7b\u7ed3\u679c\r\n            let painCount = 0;\r\n            let dysfunctionCount = 0;\r\n            let normalCount = 0;\r\n            let smcdCount = 0;\r\n            \r\n            Object.values(appState.testResults).forEach(result => {\r\n                if (result === 'DP' || result === 'FP') {\r\n                    painCount++;\r\n                } else if (result === 'DN') {\r\n                    dysfunctionCount++;\r\n                } else if (result === 'FN') {\r\n                    normalCount++;\r\n                }\r\n            });\r\n            \r\n            \/\/ \u7edf\u8ba1Breakout\u4e2d\u7684SMCD\r\n            Object.keys(appState.breakoutResults).forEach(key => {\r\n                const breakoutResults = appState.breakoutResults[key];\r\n                Object.values(breakoutResults).forEach(result => {\r\n                    if (typeof result === 'string' && result.includes('SMCD')) {\r\n                        smcdCount++;\r\n                    }\r\n                });\r\n            });\r\n            \r\n            let priorityHTML = '';\r\n            \r\n            if (painCount > 0) {\r\n                priorityHTML += `\r\n                    <div class=\"result-card pain\" style=\"margin-bottom: 15px;\">\r\n                        <strong>\u9ad8\u4f18\u5148\u7ea7\uff1a\u53d1\u73b0${painCount}\u9879\u75bc\u75db\u76f8\u5173\u529f\u80fd\u969c\u788d<\/strong><br>\r\n                        <p style=\"margin-top: 10px;\">\u9700\u8981\u4f18\u5148\u8fdb\u884c\u75bc\u75db\u7ba1\u7406\u548c\u533b\u5b66\u8bc4\u4f30\u3002<\/p>\r\n                    <\/div>\r\n                `;\r\n            }\r\n            \r\n            if (dysfunctionCount > 0 && painCount === 0) {\r\n                priorityHTML += `\r\n                    <div class=\"result-card dysfunction\" style=\"margin-bottom: 15px;\">\r\n                        <strong>\u4e2d\u4f18\u5148\u7ea7\uff1a\u53d1\u73b0${dysfunctionCount}\u9879\u6d3b\u52a8\u6027\u529f\u80fd\u969c\u788d (MD)<\/strong><br>\r\n                        <p style=\"margin-top: 10px;\">\u9700\u8981\u8fdb\u884c\u5173\u8282\u677e\u52a8\u3001\u8f6f\u7ec4\u7ec7\u677e\u89e3\u548c\u62c9\u4f38\u8bad\u7ec3\u3002<\/p>\r\n                    <\/div>\r\n                `;\r\n            }\r\n            \r\n            if (smcdCount > 0) {\r\n                priorityHTML += `\r\n                    <div class=\"result-card smcd\" style=\"margin-bottom: 15px;\">\r\n                        <strong>\u53d1\u73b0${smcdCount}\u9879\u611f\u89c9\u8fd0\u52a8\u63a7\u5236\u529f\u80fd\u969c\u788d (SMCD)<\/strong><br>\r\n                        <p style=\"margin-top: 10px;\">\u9700\u8981\u8fdb\u884c\u795e\u7ecf\u808c\u8089\u63a7\u5236\u3001\u534f\u8c03\u6027\u548c\u7a33\u5b9a\u6027\u8bad\u7ec3\u3002<\/p>\r\n                    <\/div>\r\n                `;\r\n            }\r\n            \r\n            if (normalCount > 0 && painCount === 0 && dysfunctionCount === 0 && smcdCount === 0) {\r\n                priorityHTML += `\r\n                    <div class=\"result-card normal\" style=\"margin-bottom: 15px;\">\r\n                        <strong>\u6240\u6709\u6d4b\u8bd5\u7ed3\u679c\u6b63\u5e38<\/strong><br>\r\n                        <p style=\"margin-top: 10px;\">\u672a\u53d1\u73b0\u660e\u663e\u529f\u80fd\u969c\u788d\uff0c\u5efa\u8bae\u7ef4\u6301\u5f53\u524d\u8fd0\u52a8\u6a21\u5f0f\uff0c\u5b9a\u671f\u8fdb\u884c\u9884\u9632\u6027\u7b5b\u67e5\u3002<\/p>\r\n                    <\/div>\r\n                `;\r\n            }\r\n            \r\n            prioritySection.innerHTML += priorityHTML;\r\n            summaryResults.appendChild(prioritySection);\r\n            \r\n            \/\/ \u603b\u4f53\u5efa\u8bae\r\n            const recommendationSection = document.createElement('div');\r\n            recommendationSection.className = 'summary-card';\r\n            recommendationSection.innerHTML = `\r\n                <h3 style=\"margin-bottom: 15px; color: var(--secondary-color);\">\u603b\u4f53\u5eb7\u590d\u5efa\u8bae<\/h3>\r\n                <ol style=\"margin-left: 20px;\">\r\n                    <li>\u6839\u636e\u4e0a\u8ff0\u4f18\u5148\u7ea7\u5236\u5b9a\u4e2a\u6027\u5316\u5eb7\u590d\u8ba1\u5212<\/li>\r\n                    <li>\u75bc\u75db\u7ba1\u7406\u4f18\u5148\u4e8e\u5176\u4ed6\u5e72\u9884\u63aa\u65bd<\/li>\r\n                    <li>\u6d3b\u52a8\u6027\u8bad\u7ec3\u5e94\u5faa\u5e8f\u6e10\u8fdb\uff0c\u907f\u514d\u5f15\u8d77\u75bc\u75db<\/li>\r\n                    <li>\u9488\u5bf9SMCD\u8fdb\u884c\u795e\u7ecf\u808c\u8089\u63a7\u5236\u548c\u7a33\u5b9a\u6027\u8bad\u7ec3<\/li>\r\n                    <li>\u529f\u80fd\u8bad\u7ec3\u5e94\u6a21\u62df\u65e5\u5e38\u6d3b\u52a8\u6216\u8fd0\u52a8\u4e13\u9879\u52a8\u4f5c<\/li>\r\n                    <li>\u5b9a\u671f\u91cd\u65b0\u8bc4\u4f30\u4ee5\u76d1\u6d4b\u8fdb\u5c55\u5e76\u8c03\u6574\u8ba1\u5212<\/li>\r\n                    <li>\u5efa\u8bae\u968f\u8bbf\u9891\u7387\uff1a\u6bcf2-4\u5468\u91cd\u65b0\u8bc4\u4f30\u4e00\u6b21<\/li>\r\n                <\/ol>\r\n            `;\r\n            summaryResults.appendChild(recommendationSection);\r\n            \r\n            updateProgress();\r\n        }\r\n\r\n        \/\/ \u5bfc\u51fa\u62a5\u544a\r\n        function exportReport() {\r\n            const reportContent = generateReportContent();\r\n            \r\n            \/\/ \u521b\u5efa\u4e0b\u8f7d\u94fe\u63a5\r\n            const blob = new Blob([reportContent], { type: 'text\/plain;charset=utf-8' });\r\n            const url = URL.createObjectURL(blob);\r\n            const a = document.createElement('a');\r\n            a.href = url;\r\n            a.download = `SFMA\u8bc4\u4f30\u62a5\u544a_${appState.patientInfo.name}_${appState.patientInfo.date}.txt`;\r\n            document.body.appendChild(a);\r\n            a.click();\r\n            document.body.removeChild(a);\r\n            URL.revokeObjectURL(url);\r\n            \r\n            alert(`\u62a5\u544a\u5df2\u5bfc\u51fa\u4e3a\u6587\u672c\u6587\u4ef6\uff1aSFMA\u8bc4\u4f30\u62a5\u544a_${appState.patientInfo.name}_${appState.patientInfo.date}.txt`);\r\n        }\r\n\r\n        \/\/ \u751f\u6210\u62a5\u544a\u5185\u5bb9\r\n        function generateReportContent() {\r\n            return `\r\nSFMA\uff08\u9009\u62e9\u6027\u529f\u80fd\u52a8\u4f5c\u8bc4\u4f30\uff09\u62a5\u544a\r\n===================================\r\n\r\n\u60a3\u8005\u4fe1\u606f\uff1a\r\n-----------\r\n\u59d3\u540d\uff1a${appState.patientInfo.name}\r\n\u5e74\u9f84\uff1a${appState.patientInfo.age}\r\n\u6027\u522b\uff1a${appState.patientInfo.gender === 'male' ? '\u7537' : '\u5973'}\r\n\u8bc4\u4f30\u65e5\u671f\uff1a${appState.patientInfo.date}\r\n\u5b8c\u6210\u65e5\u671f\uff1a${appState.patientInfo.assessmentDate}\r\n\u4e3b\u8bc9\/\u8bc4\u4f30\u539f\u56e0\uff1a${appState.patientInfo.complaint || '\u65e0\u8bb0\u5f55'}\r\n\r\nTop-Tier\u8bc4\u4f30\u7ed3\u679c\uff1a\r\n-----------\r\n${assessmentSteps.filter(step => step.id !== 'patient').map(step => {\r\n    if (step.bilateral) {\r\n        const rightResult = appState.testResults[`${step.id}_right`];\r\n        const leftResult = appState.testResults[`${step.id}_left`];\r\n        \r\n        if (rightResult || leftResult) {\r\n            let resultText = `${step.name}\uff1a\\n`;\r\n            \r\n            if (rightResult) {\r\n                resultText += `  \u53f3\u4fa7\uff1a${rightResult}\\n`;\r\n            }\r\n            \r\n            if (leftResult) {\r\n                resultText += `  \u5de6\u4fa7\uff1a${leftResult}\\n`;\r\n            }\r\n            \r\n            return resultText;\r\n        }\r\n    } else {\r\n        const result = appState.testResults[step.id];\r\n        if (result) {\r\n            return `${step.name}\uff1a${result}\\n`;\r\n        }\r\n    }\r\n    return null;\r\n}).filter(item => item !== null).join('\\n')}\r\n\r\nBreakout\u6d4b\u8bd5\u7ed3\u679c\uff1a\r\n-----------------\r\n${Object.keys(appState.breakoutResults).map(testResultKey => {\r\n    const stepId = testResultKey.split('_')[0];\r\n    const step = assessmentSteps.find(s => s.id === stepId);\r\n    if (!step) return null;\r\n    \r\n    const breakoutData = appState.breakoutResults[testResultKey];\r\n    if (Object.keys(breakoutData).length === 0) return null;\r\n    \r\n    let resultText = `${step.name}`;\r\n    if (testResultKey.includes('_right')) {\r\n        resultText += ' (\u53f3\u4fa7)';\r\n    } else if (testResultKey.includes('_left')) {\r\n        resultText += ' (\u5de6\u4fa7)';\r\n    }\r\n    \r\n    resultText += ' Breakout\u7ed3\u679c\uff1a\\n';\r\n    \r\n    Object.keys(breakoutData).forEach(breakoutId => {\r\n        const breakoutStep = step.breakout?.flowchart.find(fs => fs.id === breakoutId);\r\n        const stepName = breakoutStep ? breakoutStep.title : breakoutId;\r\n        resultText += `  \u2022 ${stepName}: ${breakoutData[breakoutId]}\\n`;\r\n    });\r\n    \r\n    return resultText;\r\n}).filter(item => item !== null).join('\\n\\n')}\r\n\r\n\u603b\u7ed3\u4e0e\u5efa\u8bae\uff1a\r\n------------\r\n${generateRecommendations()}\r\n\r\n\u8bc4\u4f30\u8005\uff1a____________________\r\n\u8bc4\u4f30\u673a\u6784\uff1a__________________\r\n\u65e5\u671f\uff1a${new Date().toLocaleDateString('zh-CN')}\r\n\r\n\u6ce8\u610f\uff1a\u672c\u62a5\u544a\u4ec5\u4e3a\u529f\u80fd\u52a8\u4f5c\u8bc4\u4f30\u7ed3\u679c\uff0c\u4e0d\u80fd\u66ff\u4ee3\u533b\u5b66\u8bca\u65ad\u3002\u5982\u6709\u533b\u7597\u95ee\u9898\uff0c\u8bf7\u54a8\u8be2\u4e13\u4e1a\u533b\u7597\u4eba\u5458\u3002\r\n            `;\r\n        }\r\n\r\n        \/\/ \u6253\u5370\u62a5\u544a\r\n        function printReport() {\r\n            const printWindow = window.open('', '_blank');\r\n            printWindow.document.write(`\r\n                <!DOCTYPE html>\r\n                <html>\r\n                <head>\r\n                    <title>SFMA\u8bc4\u4f30\u62a5\u544a - ${appState.patientInfo.name}<\/title>\r\n                    <style>\r\n                        body { font-family: Arial, sans-serif; line-height: 1.6; margin: 20px; }\r\n                        h1 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; }\r\n                        h2 { color: #2c3e50; margin-top: 25px; }\r\n                        .section { margin-bottom: 25px; }\r\n                        .result-item { background-color: #f8f9fa; padding: 10px; margin-bottom: 10px; border-left: 4px solid #3498db; }\r\n                        .footer { margin-top: 50px; border-top: 1px solid #ccc; padding-top: 20px; }\r\n                        @media print {\r\n                            body { font-size: 12pt; }\r\n                            .no-print { display: none; }\r\n                        }\r\n                    <\/style>\r\n                <\/head>\r\n                <body>\r\n                    <h1>SFMA\uff08\u9009\u62e9\u6027\u529f\u80fd\u52a8\u4f5c\u8bc4\u4f30\uff09\u62a5\u544a<\/h1>\r\n                    ${generatePrintReport()}\r\n                    <div class=\"footer\">\r\n                        <p><strong>\u8bc4\u4f30\u8005\uff1a<\/strong>____________________<\/p>\r\n                        <p><strong>\u8bc4\u4f30\u673a\u6784\uff1a<\/strong>__________________<\/p>\r\n                        <p><strong>\u65e5\u671f\uff1a<\/strong>${new Date().toLocaleDateString('zh-CN')}<\/p>\r\n                        <p><em>\u6ce8\u610f\uff1a\u672c\u62a5\u544a\u4ec5\u4e3a\u529f\u80fd\u52a8\u4f5c\u8bc4\u4f30\u7ed3\u679c\uff0c\u4e0d\u80fd\u66ff\u4ee3\u533b\u5b66\u8bca\u65ad\u3002\u5982\u6709\u533b\u7597\u95ee\u9898\uff0c\u8bf7\u54a8\u8be2\u4e13\u4e1a\u533b\u7597\u4eba\u5458\u3002<\/em><\/p>\r\n                    <\/div>\r\n                    <div class=\"no-print\">\r\n                        <button onclick=\"window.print()\">\u6253\u5370\u62a5\u544a<\/button>\r\n                        <button onclick=\"window.close()\">\u5173\u95ed\u7a97\u53e3<\/button>\r\n                    <\/div>\r\n                <\/body>\r\n                <\/html>\r\n            `);\r\n            \r\n            printWindow.document.close();\r\n        }\r\n\r\n        \/\/ \u751f\u6210\u6253\u5370\u62a5\u544a\u5185\u5bb9\r\n        function generatePrintReport() {\r\n            let html = '';\r\n            \r\n            \/\/ \u60a3\u8005\u4fe1\u606f\r\n            html += `\r\n                <div class=\"section\">\r\n                    <h2>\u60a3\u8005\u4fe1\u606f<\/h2>\r\n                    <p><strong>\u59d3\u540d\uff1a<\/strong>${appState.patientInfo.name}<\/p>\r\n                    <p><strong>\u5e74\u9f84\uff1a<\/strong>${appState.patientInfo.age}\u5c81<\/p>\r\n                    <p><strong>\u6027\u522b\uff1a<\/strong>${appState.patientInfo.gender === 'male' ? '\u7537' : '\u5973'}<\/p>\r\n                    <p><strong>\u8bc4\u4f30\u65e5\u671f\uff1a<\/strong>${appState.patientInfo.date}<\/p>\r\n                <\/div>\r\n            `;\r\n            \r\n            \/\/ \u8bc4\u4f30\u7ed3\u679c\r\n            html += `<div class=\"section\"><h2>\u8bc4\u4f30\u7ed3\u679c<\/h2>`;\r\n            \r\n            assessmentSteps.forEach(step => {\r\n                if (step.id === 'patient') return;\r\n                \r\n                if (step.bilateral) {\r\n                    const rightResult = appState.testResults[`${step.id}_right`];\r\n                    const leftResult = appState.testResults[`${step.id}_left`];\r\n                    \r\n                    if (rightResult || leftResult) {\r\n                        html += `<h3>${step.name}<\/h3>`;\r\n                        \r\n                        if (rightResult) {\r\n                            html += `<p><strong>\u53f3\u4fa7\uff1a<\/strong>${rightResult}<\/p>`;\r\n                        }\r\n                        \r\n                        if (leftResult) {\r\n                            html += `<p><strong>\u5de6\u4fa7\uff1a<\/strong>${leftResult}<\/p>`;\r\n                        }\r\n                    }\r\n                } else {\r\n                    const result = appState.testResults[step.id];\r\n                    if (result) {\r\n                        html += `<h3>${step.name}<\/h3><p>${result}<\/p>`;\r\n                    }\r\n                }\r\n            });\r\n            \r\n            html += `<\/div>`;\r\n            \r\n            \/\/ \u5efa\u8bae\r\n            html += `\r\n                <div class=\"section\">\r\n                    <h2>\u5efa\u8bae<\/h2>\r\n                    ${generatePrintRecommendations()}\r\n                <\/div>\r\n            `;\r\n            \r\n            return html;\r\n        }\r\n\r\n        \/\/ \u751f\u6210\u5efa\u8bae\r\n        function generateRecommendations() {\r\n            \/\/ \u7edf\u8ba1\u5404\u7c7b\u7ed3\u679c\r\n            let painCount = 0;\r\n            let dysfunctionCount = 0;\r\n            let smcdCount = 0;\r\n            \r\n            Object.values(appState.testResults).forEach(result => {\r\n                if (result === 'DP' || result === 'FP') {\r\n                    painCount++;\r\n                } else if (result === 'DN') {\r\n                    dysfunctionCount++;\r\n                }\r\n            });\r\n            \r\n            \/\/ \u7edf\u8ba1Breakout\u4e2d\u7684SMCD\r\n            Object.keys(appState.breakoutResults).forEach(key => {\r\n                const breakoutResults = appState.breakoutResults[key];\r\n                Object.values(breakoutResults).forEach(result => {\r\n                    if (typeof result === 'string' && result.includes('SMCD')) {\r\n                        smcdCount++;\r\n                    }\r\n                });\r\n            });\r\n            \r\n            let recommendations = '';\r\n            \r\n            if (painCount > 0) {\r\n                recommendations += `1. \u9ad8\u4f18\u5148\u7ea7\uff1a\u53d1\u73b0${painCount}\u9879\u75bc\u75db\u76f8\u5173\u529f\u80fd\u969c\u788d\uff0c\u5efa\u8bae\u4f18\u5148\u8fdb\u884c\u75bc\u75db\u7ba1\u7406\u548c\u533b\u5b66\u8bc4\u4f30\u3002\\n`;\r\n            }\r\n            \r\n            if (dysfunctionCount > 0) {\r\n                recommendations += `2. \u4e2d\u4f18\u5148\u7ea7\uff1a\u53d1\u73b0${dysfunctionCount}\u9879\u6d3b\u52a8\u6027\u529f\u80fd\u969c\u788d\uff0c\u5efa\u8bae\u8fdb\u884c\u5173\u8282\u677e\u52a8\u3001\u8f6f\u7ec4\u7ec7\u677e\u89e3\u548c\u62c9\u4f38\u8bad\u7ec3\u3002\\n`;\r\n            }\r\n            \r\n            if (smcdCount > 0) {\r\n                recommendations += `3. \u53d1\u73b0${smcdCount}\u9879\u611f\u89c9\u8fd0\u52a8\u63a7\u5236\u529f\u80fd\u969c\u788d\uff0c\u5efa\u8bae\u8fdb\u884c\u795e\u7ecf\u808c\u8089\u63a7\u5236\u3001\u534f\u8c03\u6027\u548c\u7a33\u5b9a\u6027\u8bad\u7ec3\u3002\\n`;\r\n            }\r\n            \r\n            if (painCount === 0 && dysfunctionCount === 0 && smcdCount === 0) {\r\n                recommendations += '4. \u6240\u6709\u6d4b\u8bd5\u7ed3\u679c\u6b63\u5e38\uff0c\u5efa\u8bae\u7ef4\u6301\u5f53\u524d\u8fd0\u52a8\u6a21\u5f0f\uff0c\u5b9a\u671f\u8fdb\u884c\u9884\u9632\u6027\u7b5b\u67e5\u3002\\n';\r\n            }\r\n            \r\n            return recommendations || '\u672a\u5b8c\u6210\u8db3\u591f\u8bc4\u4f30\uff0c\u5efa\u8bae\u5b8c\u6210\u6240\u6709Top-Tier\u6d4b\u8bd5\u540e\u518d\u5236\u5b9a\u5eb7\u590d\u8ba1\u5212\u3002';\r\n        }\r\n\r\n        \/\/ \u751f\u6210\u6253\u5370\u5efa\u8bae\r\n        function generatePrintRecommendations() {\r\n            \/\/ \u7edf\u8ba1\u5404\u7c7b\u7ed3\u679c\r\n            let painCount = 0;\r\n            let dysfunctionCount = 0;\r\n            \r\n            Object.values(appState.testResults).forEach(result => {\r\n                if (result === 'DP' || result === 'FP') {\r\n                    painCount++;\r\n                } else if (result === 'DN') {\r\n                    dysfunctionCount++;\r\n                }\r\n            });\r\n            \r\n            let html = '';\r\n            \r\n            if (painCount > 0) {\r\n                html += `\r\n                    <div class=\"result-item\" style=\"border-left-color: #e74c3c; background-color: #ffeaea;\">\r\n                        <h4>\u9ad8\u4f18\u5148\u7ea7\uff1a\u53d1\u73b0${painCount}\u9879\u75bc\u75db\u76f8\u5173\u529f\u80fd\u969c\u788d<\/h4>\r\n                        <p><strong>\u5904\u7406\u5efa\u8bae\uff1a<\/strong>\u9700\u8981\u4f18\u5148\u8fdb\u884c\u75bc\u75db\u7ba1\u7406\u548c\u533b\u5b66\u8bc4\u4f30\u3002<\/p>\r\n                    <\/div>\r\n                `;\r\n            }\r\n            \r\n            if (dysfunctionCount > 0 && painCount === 0) {\r\n                html += `\r\n                    <div class=\"result-item\" style=\"border-left-color: #f39c12; background-color: #fff3cd;\">\r\n                        <h4>\u4e2d\u4f18\u5148\u7ea7\uff1a\u53d1\u73b0${dysfunctionCount}\u9879\u6d3b\u52a8\u6027\u529f\u80fd\u969c\u788d<\/h4>\r\n                        <p><strong>\u5904\u7406\u5efa\u8bae\uff1a<\/strong>\u9700\u8981\u8fdb\u884c\u5173\u8282\/\u8f6f\u7ec4\u7ec7\u5e72\u9884\u548c\u6d3b\u52a8\u6027\u8bad\u7ec3\u3002<\/p>\r\n                    <\/div>\r\n                `;\r\n            }\r\n            \r\n            html += `\r\n                <div style=\"margin-top: 20px;\">\r\n                    <h4>\u603b\u4f53\u5eb7\u590d\u5efa\u8bae<\/h4>\r\n                    <ol>\r\n                        <li>\u6839\u636e\u4f18\u5148\u7ea7\u5236\u5b9a\u4e2a\u6027\u5316\u5eb7\u590d\u8ba1\u5212<\/li>\r\n                        <li>\u75bc\u75db\u7ba1\u7406\u4f18\u5148\u4e8e\u5176\u4ed6\u5e72\u9884\u63aa\u65bd<\/li>\r\n                        <li>\u6d3b\u52a8\u6027\u8bad\u7ec3\u5e94\u5faa\u5e8f\u6e10\u8fdb<\/li>\r\n                        <li>\u529f\u80fd\u8bad\u7ec3\u5e94\u6a21\u62df\u65e5\u5e38\u6d3b\u52a8<\/li>\r\n                        <li>\u5b9a\u671f\u91cd\u65b0\u8bc4\u4f30\u4ee5\u76d1\u6d4b\u8fdb\u5c55<\/li>\r\n                    <\/ol>\r\n                <\/div>\r\n            `;\r\n            \r\n            return html;\r\n        }\r\n\r\n        \/\/ \u83b7\u53d6\u8bc4\u5206\u989c\u8272\r\n        function getScoreColor(score) {\r\n            switch(score) {\r\n                case 'FN': return 'var(--fn-color)';\r\n                case 'DN': return 'var(--dn-color)';\r\n                case 'DP': return 'var(--dp-color)';\r\n                case 'FP': return 'var(--fp-color)';\r\n                default: return 'var(--primary-color)';\r\n            }\r\n        }\r\n\r\n        \/\/ \u66f4\u65b0\u8fdb\u5ea6\r\n        function updateProgress() {\r\n            let completedSteps = 0;\r\n            let totalSteps = assessmentSteps.length - 1; \/\/ \u51cf\u53bb\u60a3\u8005\u4fe1\u606f\u6b65\u9aa4\r\n            \r\n            assessmentSteps.forEach(step => {\r\n                if (step.id === 'patient') return;\r\n                \r\n                if (step.bilateral) {\r\n                    \/\/ \u53cc\u4fa7\u6d4b\u8bd5\u9700\u8981\u4e24\u4fa7\u90fd\u5b8c\u6210\u624d\u7b97\u5b8c\u6210\r\n                    const rightResult = appState.testResults[`${step.id}_right`];\r\n                    const leftResult = appState.testResults[`${step.id}_left`];\r\n                    \r\n                    if (rightResult && leftResult) {\r\n                        completedSteps++;\r\n                    } else if (rightResult || leftResult) {\r\n                        completedSteps += 0.5; \/\/ \u53ea\u5b8c\u6210\u4e00\u4fa7\r\n                    }\r\n                } else {\r\n                    if (appState.testResults[step.id]) {\r\n                        completedSteps++;\r\n                    }\r\n                }\r\n            });\r\n            \r\n            const progress = totalSteps > 0 ? (completedSteps \/ totalSteps) * 100 : 0;\r\n            progressFill.style.width = `${progress}%`;\r\n            progressText.textContent = `\u8fdb\u5ea6\uff1a${Math.round(progress)}%`;\r\n            currentStep.textContent = `\u6b65\u9aa4 ${appState.currentStepIndex}\/${assessmentSteps.length - 1}`;\r\n        }\r\n    <\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>SFMA\uff08\u9009\u62e9\u6027\u529f\u80fd\u52a8\u4f5c\u8bc4\u4f30\uff09\u5b8c\u6574\u6d41\u7a0b\u56fe\u7cfb\u7edf 2019\u7248 SFMA\uff08\u9009\u62e9\u6027\u529f\u80fd\u52a8\u4f5c\u8bc4\u4f30\uff092019\u7248 \u5b8c\u6574\u6d41\u7a0b\u56fe [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1959,"parent":1307,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1972","page","type-page","status-publish","has-post-thumbnail","hentry"],"blocksy_meta":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages\/1972","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1972"}],"version-history":[{"count":13,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages\/1972\/revisions"}],"predecessor-version":[{"id":1988,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages\/1972\/revisions\/1988"}],"up":[{"embeddable":true,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages\/1307"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/media\/1959"}],"wp:attachment":[{"href":"https:\/\/www.funpt.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1972"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}