{"id":37385,"date":"2025-12-26T16:30:44","date_gmt":"2025-12-26T08:30:44","guid":{"rendered":"https:\/\/www.goglobalsafe.com\/?page_id=37385"},"modified":"2026-01-29T18:15:36","modified_gmt":"2026-01-29T10:15:36","slug":"blog","status":"publish","type":"page","link":"https:\/\/www.goglobalsafe.com\/zh\/blog\/","title":{"rendered":"blog"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"37385\" class=\"elementor elementor-37385\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c83eeb4 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c83eeb4\" data-element_type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-33a70a0\" data-id=\"33a70a0\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d1ba476 elementor-widget elementor-widget-shortcode\" data-id=\"d1ba476\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n    <script>\n        \/\/ \u5c06\u83b7\u53d6\u5230\u7684 slug \u6ce8\u5165\u7ed9\u5168\u5c40\u53d8\u91cf\uff0cVue \u4f1a\u8bfb\u53d6\u5b83\n        window.currentBlogSlug = \"\";\n\n        \/\/ \u4fdd\u7559 ID \u4ee5\u517c\u5bb9\u65e7\u94fe\u63a5\n        window.usc_fixed_id = \"\";\n    <\/script>\n\n    \n<head>\n    <link href=\"\/wp-content\/static\/element\/index.min.css\" rel=\"stylesheet\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<\/head>\n<script src=\"\/wp-content\/static\/js\/vue.global.js\"><\/script>\n<script src=\"\/wp-content\/static\/js\/axios.min.js\"><\/script>\n<script src=\"\/wp-content\/static\/element\/index.full.min.js\"><\/script>\n\n<style>\n    @font-face {\n        font-family: 'Inter Bold';\n        src: url('\/wp-content\/static\/font\/Inter\/Inter-Bold.woff2') format('woff2');\n        font-display: swap;\n    }\n    @font-face {\n        font-family: 'Inter Regular';\n        src: url('\/wp-content\/static\/font\/Inter\/Inter-Regular.woff2') format('woff2');\n        font-display: swap;\n    }\n    section {\n        padding: 0 !important;\n    }\n    .elementor-heading-title {\n        display: none !important;\n    }\n    .elementor-widget-theme-post-featured-image img {\n        display: none !important;\n    }\n\n    \/* --- 3. \u8c03\u6574\u4f60\u81ea\u5df1\u5bb9\u5668\u7684\u95f4\u8ddd --- *\/\n    \/* \u4f60\u539f\u6765\u7684\u4ee3\u7801\u91cc margin-top \u662f 1.5rem\uff0c\u6539\u4e3a 0 *\/\n    .usc-guide-page {\n        margin-top: 0 !important; \/* \u539f\u6765\u662f 1.5rem *\/\n\n        \/* \u4fdd\u6301\u539f\u6709\u6837\u5f0f *\/\n        font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n        color: #333;\n        background-color: #fff;\n        line-height: 1.6;\n    }\n    \/* \u4e3a\u4e86\u9632\u6b62\u6c61\u67d3 WordPress \u5176\u4ed6\u6837\u5f0f\uff0c\u5efa\u8bae\u52a0\u4e00\u4e2a\u7236\u7ea7\u7c7b .usc-guide-page *\/\n    .usc-guide-page {\n        font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n        color: #333;\n        background-color: #fff;\n        line-height: 1.6;\n        margin-top: 1.5rem;\n    }\n\n    .page-container {\n        display: flex;\n        \/*max-width: 1200px;*\/\n        \/*margin: 0 auto;*\/\n        \/*padding: 40px 20px;*\/\n        gap: 1rem;\n    }\n\n    \/* \u5de6\u4fa7\u5bfc\u822a - Sticky *\/\n    .sidebar {\n        width: 260px;\n        flex-shrink: 0;\n        position: -webkit-sticky; \/* Safari *\/\n        position: sticky;\n        top: 100px; \/* \u6839\u636e\u4f60\u7684 WordPress \u9876\u90e8\u5bfc\u822a\u680f\u9ad8\u5ea6\u8c03\u6574 *\/\n        max-height: calc(100vh - 120px);\n        overflow-y: auto;\n        overscroll-behavior: contain;\n        scrollbar-width: thin;\n        scrollbar-gutter: stable;\n        border-left: 2px solid #f3f4f6;\n        padding-left: 20px;\n        padding-right: 10px;\n    }\n\n    .toc-header {\n        font-family: 'Inter Bold', sans-serif;\n        font-weight: bold;\n        font-size: 0.72rem;\n        color: #333333;\n        margin-bottom: 15px;\n        text-transform: uppercase;\n        letter-spacing: 0.5px;\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n    }\n\n    \/* --- \u57fa\u7840\u91cd\u7f6e (\u89e3\u51b3\u9760\u53f3\u95ee\u9898) --- *\/\n    \/* --- \u57fa\u7840\u91cd\u7f6e --- *\/\n    .toc-list, .toc-sub-list, .toc-deep-list {\n        list-style: none !important;\n        padding: 0 !important;\n        margin: 0 !important;\n    }\n\n    \/* --- \u901a\u7528\u884c\u5e03\u5c40 (\u5173\u952e\u4fee\u6539) --- *\/\n    \/* \u9002\u7528\u4e8e Root \u548c Sub \u7684\u6807\u9898\u884c *\/\n    .toc-link-row {\n        display: flex;\n        align-items: center;\n        justify-content: space-between; \/* \u5173\u952e\uff1a\u6587\u5b57\u5728\u5de6\uff0c\u7bad\u5934\u5728\u53f3 *\/\n        padding: 8px 0; \/* \u589e\u52a0\u4e00\u70b9\u4e0a\u4e0b\u95f4\u8ddd\uff0c\u66f4\u6613\u70b9\u51fb *\/\n        cursor: pointer;\n        border-bottom: 1px solid transparent; \/* \u9884\u7559\u8fb9\u6846\u4f4d\u7f6e *\/\n    }\n    .toc-link-row:hover {\n        background-color: #f9fafb; \/* \u9f20\u6807\u60ac\u505c\u52a0\u4e2a\u6de1\u80cc\u666f *\/\n    }\n\n    \/* --- \u7bad\u5934\u6837\u5f0f (\u9760\u53f3) --- *\/\n    .toc-arrow {\n        font-size: 10px;\n        color: #9ca3af;\n        transition: transform 0.2s;\n        margin-left: 10px; \/* \u7bad\u5934\u8ddd\u79bb\u6587\u5b57\u7684\u95f4\u8ddd *\/\n        flex-shrink: 0;    \/* \u9632\u6b62\u7bad\u5934\u88ab\u6324\u538b *\/\n        width: 20px;\n        text-align: center;\n    }\n    .toc-arrow.expanded {\n        transform: rotate(90deg); \/* \u5c55\u5f00\u65cb\u8f6c *\/\n        color: #1e40af;\n    }\n\n    \/* --- \u6587\u5b57\u6837\u5f0f --- *\/\n    .toc-link-row:hover {\n        background-color: transparent !important;\n    }\n\n    .toc-arrow {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        width: 14px;\n        height: 14px;\n        background: transparent !important;\n        border: 0 !important;\n        box-shadow: none !important;\n    }\n\n    .toc-text {\n        font-family: 'Inter Regular', sans-serif;\n        font-weight: 400;\n        font-size: 0.76rem;\n        color: #555555;\n        line-height: 1.4;\n        flex: 1; \/* \u5173\u952e\uff1a\u6587\u5b57\u5360\u636e\u5269\u4f59\u7a7a\u95f4 *\/\n        display: block;\n        padding-right: 5px;\n    }\n    \/* \u6fc0\u6d3b\u9ad8\u4eae *\/\n    .toc-text.active {\n        color: #1e40af;\n        font-weight: 600;\n    }\n\n    \/* --- \u5c42\u7ea7\u7f29\u8fdb\u63a7\u5236 --- *\/\n\n    \/* Level 1 (Root) \u6837\u5f0f *\/\n    .toc-item-root {\n        border-bottom: 1px solid #f3f4f6; \/* \u4e00\u7ea7\u83dc\u5355\u4e4b\u95f4\u52a0\u4e2a\u5206\u5272\u7ebf *\/\n    }\n    .root-text {\n        font-weight: 400;\n        font-size: 0.76rem;\n        color: #555555;\n    }\n\n    \/* Level 2 (Sub) \u5bb9\u5668\u7f29\u8fdb *\/\n    .toc-sub-list {\n        background-color: #fff;\n        padding-left: 15px !important; \/* \u6574\u4f53\u7f29\u8fdb *\/\n        display: block;\n    }\n    .sub-text {\n        font-size: 13px;\n        color: #4b5563;\n    }\n\n    \/* Level 3 (Deep) \u5bb9\u5668\u7f29\u8fdb *\/\n    .toc-deep-list {\n        padding-left: 15px !important;\n    }\n    .deep-text {\n        font-size: 12px;\n        color: #6b7280;\n        padding: 4px 0;\n        display: block;\n    }\n    .deep-text:hover { color: #1e40af; }\n\n    \/* \u53f3\u4fa7\u5185\u5bb9\u533a *\/\n    .main-content {\n        flex: 1;\n        min-width: 0;\n        overflow: hidden; \/* \u9632\u6b62\u5185\u5bb9\u6ea2\u51fa *\/\n        box-shadow: 0rem 0.11rem 0.53rem 0rem rgba(0,0,0,0.05);\n        border-radius: 0.42rem 0.42rem 0.42rem 0.42rem;\n        padding: 0.53rem 2.11rem;\n    }\n\n    \/* \u9762\u5305\u5c51 *\/\n    .breadcrumbs {\n        font-family: 'Inter Regular', sans-serif;\n        font-size: 0.72rem;\n        color: #6b7280;\n        margin-bottom: 1.53rem;\n        display: flex;\n        align-items: center;\n    }\n    .back-link { cursor: pointer; display: flex; align-items: center; gap: 5px; }\n    .divider { margin: 0 10px; color: #d1d5db; }\n    .current { color: #111; font-weight: 500; }\n\n    \/* Tags *\/\n    .tags {\n        display: flex;\n        gap: 10px;\n        margin-bottom: 25px;\n        flex-wrap: wrap;\n    }\n    .tag {\n        background: #eff6ff;\n        color: #2563eb;\n        padding: 5px 14px;\n        border-radius: 20px;\n        font-size: 12px;\n        font-weight: 600;\n        letter-spacing: 0.3px;\n    }\n\n    .article-title {\n        font-family: 'Inter Bold', sans-serif;\n        font-size: 2.05rem !important;\n        margin-bottom: 25px;\n        font-weight: Bold !important;\n        color: #111111;\n    }\n\n    .author-meta {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 35px;\n        border-bottom: 1px solid #f3f4f6;\n        padding-bottom: 25px;\n    }\n    .author-info {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n    }\n    .avatar {\n        width: 44px;\n        height: 44px;\n        background: #dbeafe;\n        color: #1e40af;\n        border-radius: 50%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-weight: bold;\n        font-size: 16px;\n    }\n    .meta-text strong {\n        font-family: 'Inter Bold', sans-serif;\n        display: block; font-size: 14px; color: #1f2937; }\n    .meta-text p {\n        font-family: 'Inter Regular', sans-serif;\n        margin: 0; font-size: 12px; color: #6b7280; margin-top: 2px; }\n    .share-btn {\n        font-family: 'Inter Bold', sans-serif;\n        font-size: 13px;\n        color: #6b7280;\n        cursor: pointer;\n        font-weight: 500;\n        display: flex;\n        align-items: center;\n        gap: 8px;\n    }\n\n    \/* \u5012\u8ba1\u65f6\u5361\u7247 *\/\n    .deadline-card {\n        background: #1E3D9D;\n        color: white;\n        border-radius: 15px;\n        padding: 35px 40px;\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 40px;\n        box-shadow: 0 10px 25px rgba(30, 58, 138, 0.15);\n    }\n    .deadline-info .badge {\n        font-family: 'Inter Bold', sans-serif;\n        display: flex;\n        width: fit-content;\n        padding: 5px 15px;\n        flex-direction: row;\n        align-items: center;\n        justify-content: center;\n        border-radius: 20px;\n        border: 1px solid #F5CD1D;\n        background: none;\n        font-size: 0.7rem;\n        color: #F5CD1D;\n        font-weight: Bold;\n        margin-bottom: 10px;\n        letter-spacing: 0.5px;\n    }\n    .deadline-info h2 { margin: 5px 0 10px 0; font-size: 26px; font-weight: 700; }\n    .deadline-info p {\n        font-family: 'Inter Regular', sans-serif;\n        margin: 0; font-size: 0.74rem; opacity: 0.9; max-width: 300px; }\n\n    .timer-display { display: flex; gap: 20px; }\n    .time-box {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        background: rgba(0,0,0,0.2);\n        padding: 10px 15px;\n        border-radius: 8px;\n        min-width: 70px;\n    }\n    .time-box span {\n        font-family: 'Inter Bold', sans-serif;\n        font-size: 1.52rem; font-weight: Bold; line-height: 1; }\n    .time-box small {\n        font-family: 'Inter Regular', sans-serif;\n        font-size: 0.63rem; opacity: 0.8;font-weight: 400; margin-top: 6px; letter-spacing: 1px; }\n\n    \/* \u5feb\u901f\u6458\u8981 *\/\n    .quick-summary {\n        background: #f8fafc;\n        border: 1px solid #e2e8f0;\n        border-radius: 12px;\n        padding: 25px;\n        margin-bottom: 50px;\n    }\n    .quick-summary h3 { margin-top: 0; color: #0f172a; font-size: 17px; margin-bottom: 15px; font-weight: 700; }\n    .quick-summary ul { list-style: none; padding: 0; margin: 0; }\n    .quick-summary li { font-size: 15px; margin-bottom: 12px; line-height: 1.6; color: #334155; display: flex; gap: 10px; }\n    .quick-summary .warning { color: #dc2626; font-weight: 600; margin-top: 15px; background: #fef2f2; padding: 10px; border-radius: 6px; display: block; }\n\n    \/* 2. \u589e\u5f3a\u7248\u7684\u5185\u5bb9\u6362\u884c\u63a7\u5236 *\/\n    .content {\n        width: 100%;\n        \/* \u5141\u8bb8\u957f\u5355\u8bcd\u3001\u957f\u94fe\u63a5\u5728\u4efb\u4f55\u5730\u65b9\u65ad\u5f00 *\/\n        word-break: break-word !important;\n        overflow-wrap: anywhere !important;\n        \/* \u5f3a\u5236\u6062\u590d\u6b63\u5e38\u7684\u7a7a\u767d\u7b26\u5904\u7406 *\/\n        white-space: normal !important;\n    }\n\n    \/* 3. \u5f7b\u5e95\u89e3\u51b3\u5bcc\u6587\u672c\u4e2d\u56fe\u7247\u3001\u8868\u683c\u3001\u4ee3\u7801\u5757\u6ea2\u51fa\u7684\u95ee\u9898 *\/\n    .content img {\n        max-width: 100% !important;\n        height: auto !important;\n    }\n\n    .content table {\n        width: 100% !important;\n        table-layout: fixed !important; \/* \u5f3a\u5236\u8868\u683c\u4e0d\u6491\u5f00\u5bb9\u5668 *\/\n    }\n\n    .content pre, .content code {\n        white-space: pre-wrap !important; \/* \u5141\u8bb8\u4ee3\u7801\u5757\u6362\u884c *\/\n        word-wrap: break-word !important;\n        background: #f5f5f5;\n        padding: 10px;\n        border-radius: 4px;\n        overflow-x: auto; \/* \u4e07\u4e00\u592a\u957f\uff0c\u5141\u8bb8\u5185\u90e8\u6eda\u52a8\u800c\u4e0d\u662f\u6491\u5f00\u6574\u9875 *\/\n    }\n    .content-section { margin-bottom: 60px; scroll-margin-top: 120px; \/* \u951a\u70b9\u5b9a\u4f4d\u504f\u79fb *\/ }\n    .content-section h2 { font-size: 24px; margin-bottom: 20px; color: #111827; font-weight: 700; letter-spacing: -0.5px; }\n    .content-section p { font-size: 16px; line-height: 1.8; color: #374151; margin-bottom: 20px; }\n    .content-section strong { color: #111; font-weight: 600; }\n\n    \/* --- [\u65b0\u589e] \u4fee\u590d\u6587\u7ae0\u8be6\u60c5\u9875\u5217\u8868\u4e0d\u663e\u793a\u5706\u70b9\u7684\u95ee\u9898 --- *\/\n    .content ul {\n        list-style-type: disc !important; \/* \u5f3a\u5236\u663e\u793a\u5b9e\u5fc3\u5706\u70b9 *\/\n        padding-left: 2rem !important;    \/* \u5fc5\u987b\u7ed9\u5de6\u4fa7\u7559\u51fa\u7f29\u8fdb\uff0c\u5426\u5219\u5706\u70b9\u4f1a\u88ab\u5207\u6389 *\/\n        margin-bottom: 1.5rem;\n    }\n\n    .content ol {\n        list-style-type: decimal !important; \/* \u5f3a\u5236\u663e\u793a\u6570\u5b57 (1. 2. 3.) *\/\n        padding-left: 2rem !important;\n        margin-bottom: 1.5rem;\n    }\n\n    .content li {\n        margin-bottom: 0.5rem; \/* \u8ba9\u5217\u8868\u9879\u4e4b\u95f4\u6709\u70b9\u95f4\u8ddd\uff0c\u4e0d\u90a3\u4e48\u62e5\u6324 *\/\n        list-style-position: outside; \/* \u786e\u4fdd\u957f\u6587\u672c\u6362\u884c\u65f6\uff0c\u6587\u5b57\u4e0d\u4f1a\u8dd1\u5230\u5706\u70b9\u4e0b\u9762 *\/\n    }\n\n    \/* \u5bf9\u6bd4\u8868\u683c *\/\n    .comparison-table-wrapper {\n        overflow-x: auto;\n        border: 1px solid #e5e7eb;\n        border-radius: 12px;\n        margin-top: 25px;\n        box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n    }\n    .comparison-table {\n        width: 100%;\n        border-collapse: collapse;\n        font-size: 14px;\n        min-width: 600px; \/* \u79fb\u52a8\u7aef\u6eda\u52a8 *\/\n    }\n    .comparison-table th, .comparison-table td {\n        padding: 16px 20px;\n        text-align: left;\n        border-bottom: 1px solid #f3f4f6;\n    }\n    .comparison-table th { background: #f9fafb; font-weight: 700; color: #374151; }\n    .comparison-table th.highlight { color: #2563eb; background: #eff6ff; border-bottom: 2px solid #bfdbfe; }\n    .comparison-table tr:last-child td { border-bottom: none; }\n    .text-blue { color: #2563eb; font-weight: 600; }\n    .text-orange { color: #ea580c; font-weight: 600; }\n\n    \/* \u65b9\u6848\u5361\u7247 *\/\n    .plan-cards {\n        display: grid;\n        grid-template-columns: repeat(3, 1fr);\n        gap: 25px;\n        margin: 40px 0;\n    }\n    .card {\n        border: 1px solid #e5e7eb;\n        border-radius: 16px;\n        padding: 30px 20px;\n        position: relative;\n        transition: all 0.3s ease;\n        background: white;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n    }\n    .card:hover { transform: translateY(-5px); box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); border-color: transparent; }\n\n    \/* \u989c\u8272\u4e3b\u9898 *\/\n    .card.yellow { border-top: 5px solid #facc15; }\n    .card.blue { border: 2px solid #3b82f6; border-top: 5px solid #3b82f6; background: #eff6ff; transform: scale(1.02); z-index: 1; }\n    .card.orange { border-top: 5px solid #f97316; }\n\n    .card h3 { font-size: 18px; margin: 15px 0 25px 0; text-align: center; font-weight: 700; color: #111; }\n    .card .badge {\n        position: absolute;\n        top: -14px;\n        font-size: 11px;\n        padding: 5px 12px;\n        border-radius: 20px;\n        font-weight: 700;\n        text-transform: uppercase;\n        box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n    }\n    .badge.popular { background: #facc15; color: #000; }\n    .badge.premium { background: #f97316; color: #fff; }\n\n    .tags-group { display: flex; flex-direction: column; gap: 10px; align-items: center; width: 100%; }\n    .tags-group span {\n        background: #f3f4f6;\n        padding: 6px 15px;\n        border-radius: 20px;\n        font-size: 12px;\n        color: #4b5563;\n        font-weight: 500;\n        width: 100%;\n        text-align: center;\n    }\n    .card.blue .tags-group span { background: #fff; color: #2563eb; box-shadow: 0 1px 2px rgba(0,0,0,0.05); }\n\n    .card-note { font-size: 13px; color: #9ca3af; text-align: center; font-style: italic; margin-top: 20px; }\n\n    .center-btn { text-align: center; margin-top: 40px; }\n    .btn-primary {\n        background: #1E3D9D;\n        box-shadow: 0rem 0.11rem 0.42rem 0rem rgba(0,0,0,0.12);\n        border-radius: 0.84rem 0.84rem 0.84rem 0.84rem;\n        cursor: pointer;\n        font-weight: 500;\n        font-size: 1.05rem;\n        color: #FFFFFF;\n        padding: 0.53rem 3.89rem;\n    }\n    .btn-primary:hover { background: #172554; }\n\n    \/* \u6b65\u9aa4\u5217\u8868 *\/\n    .step-list { margin-top: 30px; }\n    .step {\n        padding-left: 20px;\n        border-left: 2px solid #e5e7eb;\n        margin-bottom: 25px;\n        position: relative;\n    }\n    .step::before {\n        content: '';\n        position: absolute;\n        left: -6px;\n        top: 0;\n        width: 10px;\n        height: 10px;\n        background: #e5e7eb;\n        border-radius: 50%;\n    }\n    .step h4 { margin: 0 0 10px 0; font-size: 18px; color: #1e40af; }\n\n    \/* \u6a21\u7cca\u89e3\u9501\u533a *\/\n    \/*.lock-section {*\/\n    \/*    position: relative;*\/\n    \/*    border: 1px solid #dcfce7;*\/\n    \/*    border-radius: 16px;*\/\n    \/*    overflow: hidden;*\/\n    \/*    margin-top: 60px;*\/\n    \/*    background: #f0fdf4;*\/\n    \/*}*\/\n    \/*.lock-overlay {*\/\n    \/*    position: absolute;*\/\n    \/*    top: 0; left: 0; width: 100%; height: 100%;*\/\n    \/*    background: rgba(255, 255, 255, 0.7);*\/\n    \/*    backdrop-filter: blur(4px);*\/\n    \/*    display: flex;*\/\n    \/*    flex-direction: column;*\/\n    \/*    justify-content: center;*\/\n    \/*    align-items: center;*\/\n    \/*    text-align: center;*\/\n    \/*    padding: 20px;*\/\n    \/*}*\/\n    \/* \u6dfb\u52a0\u6216\u4fee\u6539\u8fd9\u6bb5 CSS *\/\n    .lock-section {\n        margin-top: 0; \/* \u7d27\u8d34\u7740\u5185\u5bb9 *\/\n        background: #f8fafc; \/* \u7ed9\u4e00\u4e2a\u6d45\u7070\u80cc\u666f *\/\n        border-top: 1px dashed #e2e8f0; \/* \u7ed9\u4e00\u4e2a\u865a\u7ebf\u5206\u5272 *\/\n        padding: 40px 20px;\n        text-align: center;\n    }\n\n    .lock-overlay {\n        position: static !important;\n        background: none !important;\n        backdrop-filter: none !important;\n        height: auto !important;\n        padding: 0 !important;\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center\n    }\n    .lock-icon { font-size: 48px; margin-bottom: 15px; }\n    .lock-overlay h2 { font-size: 26px; margin: 10px 0; color: #111; font-weight: 700; }\n    .lock-overlay p { font-size: 15px; color: #4b5563; max-width: 450px; margin-bottom: 30px; }\n    .lock-buttons { display: flex; gap: 40px; flex-wrap: wrap; justify-content: center; }\n    .btn-outline {\n        background-color: #FFFFFF !important;\n        box-shadow: 0rem 0.11rem 0.42rem 0rem rgba(0,0,0,0.12);\n        border-radius: 0.84rem 0.84rem 0.84rem 0.84rem;\n        font-weight: 500;\n        font-size: 1.05rem;\n        color: #000000;\n        cursor: pointer;\n        transition: all 0.2s;\n        line-height: 1.47rem;\n        padding: 0.53rem 0.84rem;\n    }\n    .btn-outline:hover { background-color: #eff6ff !important; }\n    .deadline {\n        font-family: 'Inter Bold', sans-serif !important;\n        font-size: 1.47rem !important;\n        font-weight: bold !important;\n        color: #FFFFFF !important;\n    }\n    \/* --- FAQ \u533a\u57df\u7f8e\u5316 (\u7d27\u51d1\u7248) --- *\/\n\n    \/* 1. \u6574\u4f53\u5bb9\u5668\uff1a\u51cf\u5c0f\u5185\u8fb9\u8ddd\u548c\u5706\u89d2 *\/\n    .faq-section {\n        margin-top: 2rem;      \/* \u539f 3rem -> 2rem *\/\n        padding: 1.5rem;       \/* \u539f 2rem -> 1.5rem *\/\n        background-color: #fff;\n        border-radius: 12px;   \/* \u539f 16px -> 12px *\/\n        box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.02);\n        border: 1px solid #e5e7eb;\n    }\n\n    \/* 2. \u5927\u6807\u9898\uff1a\u51cf\u5c0f\u5b57\u53f7\u548c\u4e0b\u8fb9\u8ddd *\/\n    .faq-title {\n        margin: 0 0 1rem 0;    \/* \u539f 1.5rem -> 1rem *\/\n        font-size: 1.25rem;    \/* \u539f 1.5rem -> 1.25rem *\/\n        font-weight: 700;\n        color: #111827;\n        display: flex;\n        align-items: center;\n        gap: 8px;\n    }\n    .faq-title::before {\n        content: '\ud83d\udca1';\n        font-size: 1.1rem;\n    }\n\n    \/* --- Element Plus \u6298\u53e0\u9762\u677f\u6837\u5f0f\u8986\u76d6 --- *\/\n\n    .el-collapse {\n        border: none;\n    }\n\n    \/* \u6bcf\u4e00\u9879 (Item) *\/\n    .el-collapse-item {\n        margin-bottom: 8px;    \/* \u539f 10px -> 8px *\/\n        border: 1px solid #f3f4f6;\n        border-radius: 8px;    \/* \u539f 12px -> 8px *\/\n        overflow: hidden;\n    }\n    .el-collapse-item:last-child {\n        margin-bottom: 0;\n    }\n\n    \/* 3. \u6807\u9898\u680f (Header)\uff1a\u51cf\u5c0f\u9ad8\u5ea6\u548c\u5b57\u4f53 *\/\n    .el-collapse-item__header {\n        font-size: 0.95rem;      \/* \u539f 1.1rem -> 0.95rem (\u6807\u51c6\u6b63\u6587\u5927\u5c0f) *\/\n        font-weight: 600;\n        color: #374151 !important;\n        background-color: #f9fafb !important;\n        padding: 0.75rem 1rem;   \/* \u539f 1rem 1.5rem -> 0.75rem 1rem (\u663e\u8457\u51cf\u5c0f\u9ad8\u5ea6) *\/\n        height: auto;\n        min-height: 40px;        \/* \u9650\u5236\u6700\u5c0f\u9ad8\u5ea6 *\/\n        line-height: 1.4;\n        border-bottom: none;\n        transition: all 0.3s ease;\n    }\n\n    \/* \u6fc0\u6d3b\u72b6\u6001 *\/\n    .el-collapse-item__header.is-active {\n        color: #1E3D9D !important;\n        background-color: #eff6ff !important;\n        border-bottom: 1px solid #e5e7eb;\n    }\n\n    \/* \u53f3\u4fa7\u7bad\u5934\u56fe\u6807\uff1a\u8c03\u5c0f *\/\n    .el-collapse-item__arrow {\n        margin-left: auto;\n        color: #9ca3af;\n        font-size: 1rem;\n    }\n    .el-collapse-item__header.is-active .el-collapse-item__arrow {\n        color: #1E3D9D;\n    }\n\n    \/* 4. \u5185\u5bb9\u533a\u57df (Content)\uff1a\u51cf\u5c0f\u5185\u8fb9\u8ddd\u548c\u5b57\u4f53 *\/\n    .el-collapse-item__wrap {\n        border-bottom: none;\n        background-color: #fff;\n    }\n    .el-collapse-item__content {\n        padding: 1rem;           \/* \u539f 1.5rem -> 1rem *\/\n        font-size: 0.9rem;       \/* \u539f 1rem -> 0.9rem (\u7a0d\u5fae\u5c0f\u4e00\u70b9\uff0c\u66f4\u6709\u5c42\u6b21) *\/\n        color: #4b5563;\n        line-height: 1.6;\n        padding-bottom: 1rem !important; \/* \u5f3a\u5236\u8986\u76d6 Element \u9ed8\u8ba4\u7684 padding-bottom *\/\n    }\n\n    \/* \u7b54\u6848\u4e2d\u7684\u5bcc\u6587\u672c\u6837\u5f0f *\/\n    .faq-answer p {\n        margin-bottom: 0.8em;\n    }\n    .faq-answer p:last-child {\n        margin-bottom: 0;\n    }\n    .faq-answer a {\n        color: #1E3D9D;\n        text-decoration: underline;\n    }\n    .faq-answer ul, .faq-answer ol {\n        padding-left: 1.2rem;\n        margin-bottom: 0.8em;\n    }\n    .faq-answer li {\n        margin-bottom: 0.3em;\n    }\n    \/* BLOG \u5bcc\u6587\u672c\u5bbd\u8868\u683c\uff1a\u5916\u5c42\u6eda\u52a8\uff0c\u9996\u4e24\u5217\u56fa\u5b9a\u3002 *\/\n    .content .blog-scroll-table-shell {\n        position: relative;\n        width: 100%;\n        max-width: 100%;\n        overflow-x: auto;\n        overflow-y: hidden;\n        margin: 1.5rem 0;\n        border-radius: 8px;\n        overscroll-behavior-x: contain;\n        scrollbar-width: thin;\n        scrollbar-color: #94a3b8 #eef2f7;\n        -webkit-overflow-scrolling: touch;\n    }\n\n    .content .blog-scroll-table-shell:focus-visible {\n        outline: 3px solid rgba(37, 99, 235, 0.3);\n        outline-offset: 3px;\n    }\n\n    .content .blog-scroll-table-shell::-webkit-scrollbar {\n        height: 9px;\n    }\n\n    .content .blog-scroll-table-shell::-webkit-scrollbar-track {\n        background: #eef2f7;\n        border-radius: 999px;\n    }\n\n    .content .blog-scroll-table-shell::-webkit-scrollbar-thumb {\n        background: #94a3b8;\n        border: 2px solid #eef2f7;\n        border-radius: 999px;\n    }\n\n    .content table.blog-sticky-two-columns {\n        --blog-sticky-first-column-width: 240px;\n        display: table !important;\n        width: max-content !important;\n        min-width: 100% !important;\n        max-width: none !important;\n        height: auto !important;\n        margin: 0 !important;\n        overflow: visible !important;\n        table-layout: auto !important;\n        white-space: normal;\n        border-collapse: separate;\n        border-spacing: 0;\n    }\n\n    .content table.blog-sticky-two-columns tr > th,\n    .content table.blog-sticky-two-columns tr > td {\n        min-width: 210px;\n        box-sizing: border-box;\n        white-space: normal;\n    }\n\n    .content table.blog-sticky-two-columns tr > :first-child {\n        position: sticky;\n        left: 0;\n        z-index: 3;\n        min-width: 220px;\n        background-clip: padding-box;\n    }\n\n    .content table.blog-sticky-two-columns tr > :nth-child(2) {\n        position: sticky;\n        left: var(--blog-sticky-first-column-width);\n        z-index: 2;\n        min-width: 230px;\n        background-clip: padding-box;\n        box-shadow: 14px 0 18px -18px rgba(15, 23, 42, 0.7);\n    }\n\n    .content table.blog-sticky-two-columns thead tr > :first-child,\n    .content table.blog-sticky-two-columns thead tr > :nth-child(2) {\n        z-index: 5;\n    }\n\n    \/* \u9488\u5bf9\u79fb\u52a8\u7aef\u7684\u5fae\u8c03 *\/\n    @media screen and (max-width: 600px) {\n        .content table.blog-sticky-two-columns {\n            font-size: 13px;\n        }\n\n        .content table.blog-sticky-two-columns tr > th,\n        .content table.blog-sticky-two-columns tr > td {\n            padding: 10px 8px !important;\n            border-bottom: 1px solid #eee; \/* \u624b\u52a8\u8865\u9f50\u8fb9\u6846\uff0c\u56e0\u4e3a sticky \u6709\u65f6\u4f1a\u906e\u6321\u8fb9\u6846 *\/\n        }\n\n        .content table.blog-sticky-two-columns tr > :first-child {\n            width: 138px !important;\n            min-width: 138px;\n            max-width: 138px;\n        }\n\n        .content table.blog-sticky-two-columns tr > :nth-child(2) {\n            width: 156px !important;\n            min-width: 156px;\n            max-width: 156px;\n        }\n    }\n\n    @keyframes loading-rotate {\n        100% { transform: rotate(360deg); }\n    }\n    @keyframes loading-dash {\n        0% { stroke-dasharray: 1, 200; stroke-dashoffset: 0; }\n        50% { stroke-dasharray: 90, 150; stroke-dashoffset: -40px; }\n        100% { stroke-dasharray: 90, 150; stroke-dashoffset: -120px; }\n    }\n\n    .ggs-page-loading {\n        position: fixed;\n        inset: 0;\n        z-index: 10010;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        padding: 20px;\n        background: rgba(10, 16, 32, .42);\n        backdrop-filter: blur(8px);\n        -webkit-backdrop-filter: blur(8px);\n    }\n\n    .ggs-page-loading-card {\n        width: min(92vw, 360px);\n        padding: 24px 20px 20px;\n        border: 1px solid rgba(255, 255, 255, .24);\n        border-radius: 18px;\n        background: linear-gradient(145deg, rgba(255, 255, 255, .95), rgba(248, 250, 255, .90));\n        box-shadow: 0 18px 40px rgba(15, 23, 42, .24);\n        text-align: center;\n    }\n\n    .ggs-page-loading-card strong {\n        display: block;\n        margin-top: 12px;\n        color: #0f172a !important;\n        font-size: 20px !important;\n        font-weight: 800 !important;\n        line-height: 1.35 !important;\n    }\n\n    .ggs-page-loading-card p {\n        margin: 6px 0 0 !important;\n        color: #475467 !important;\n        font-size: 14px !important;\n        font-weight: 600 !important;\n        line-height: 1.5 !important;\n    }\n\n    .ggs-page-loading-orbit {\n        position: relative;\n        width: 68px;\n        height: 68px;\n        margin: 0 auto;\n    }\n\n    .ggs-page-loading-orbit span {\n        position: absolute;\n        inset: 0;\n        border: 2px solid transparent;\n        border-top-color: #2563eb;\n        border-radius: 999px;\n        animation: ggsPageLoadingSpin 1s linear infinite;\n    }\n\n    .ggs-page-loading-orbit span:nth-child(2) {\n        inset: 8px;\n        border-top-color: #4f46e5;\n        animation-duration: .85s;\n        animation-direction: reverse;\n    }\n\n    .ggs-page-loading-orbit span:nth-child(3) {\n        inset: 13px;\n        border-top-color: #10b981;\n        animation-duration: .7s;\n    }\n\n    .ggs-page-loading-logo {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        z-index: 2;\n        width: 30px;\n        height: 30px;\n        border-radius: 8px;\n        object-fit: contain;\n        pointer-events: none;\n        filter: drop-shadow(0 2px 5px rgba(37, 99, 235, .22));\n        transform: translate(-50%, -50%);\n    }\n\n    .ggs-page-loading-enter-active,\n    .ggs-page-loading-leave-active {\n        transition: opacity .18s ease;\n    }\n\n    .ggs-page-loading-enter-from,\n    .ggs-page-loading-leave-to {\n        opacity: 0;\n    }\n\n    @keyframes ggsPageLoadingSpin {\n        from { transform: rotate(0deg); }\n        to { transform: rotate(360deg); }\n    }\n\n    .blog-plan-embed {\n        width: 100%;\n        margin: 1.5rem 0 2rem;\n        padding: 0;\n        border: 0 !important;\n        border-radius: 0;\n        background: transparent !important;\n        \/*box-shadow: 0 8px 24px rgba(15, 23, 42, 0.04);*\/\n        color: #1f2937;\n        overflow: visible;\n    }\n\n    .blog-plan-embed,\n    .blog-plan-embed * {\n        box-sizing: border-box;\n    }\n\n    .blog-plan-embed button,\n    .blog-plan-embed a,\n    .blog-plan-embed input {\n        font-family: inherit !important;\n        letter-spacing: 0 !important;\n        text-transform: none !important;\n        text-shadow: none !important;\n        box-shadow: none;\n    }\n\n    .blog-plan-embed button {\n        appearance: none !important;\n        -webkit-appearance: none !important;\n        width: auto;\n        margin: 0 !important;\n        border: 0 solid transparent;\n        background: transparent;\n        box-shadow: none !important;\n        line-height: 1.2 !important;\n    }\n\n    .blog-plan-embed button:hover,\n    .blog-plan-embed button:focus,\n    .blog-plan-embed button:active {\n        border-color: transparent !important;\n        outline: none !important;\n        box-shadow: none !important;\n    }\n\n    .blog-plan-select:hover,\n    .blog-plan-select:focus,\n    .blog-plan-compare:hover,\n    .blog-plan-compare:focus,\n    .blog-plan-tab:hover,\n    .blog-plan-tab:focus,\n    .blog-plan-link:hover,\n    .blog-plan-link:focus,\n    .blog-plan-view-more:hover,\n    .blog-plan-view-more:focus,\n    .blog-plan-compare-fab:hover,\n    .blog-plan-compare-fab:focus,\n    .blog-plan-toggle:hover,\n    .blog-plan-toggle:focus {\n        border-color: transparent !important;\n        outline: none !important;\n        box-shadow: none !important;\n    }\n\n    .blog-plan-embed button:focus-visible,\n    .blog-plan-embed a:focus-visible,\n    .blog-plan-embed input:focus-visible {\n        outline: 2px solid #60a5fa;\n        outline-offset: 2px;\n    }\n\n    .blog-plan-notice {\n        margin-bottom: 1rem;\n        padding: 0.75rem 1rem;\n        border-radius: 12px;\n        background: #eff6ff;\n        color: #1d4ed8;\n        font-size: 0.875rem;\n        font-weight: 600;\n    }\n\n    .blog-plan-notice.error {\n        background: #fef2f2;\n        color: #b91c1c;\n    }\n\n    .blog-plan-mobile-controls {\n        display: flex;\n        flex-direction: column;\n        gap: 0.85rem;\n        margin-bottom: 1rem;\n    }\n\n    .blog-plan-layout {\n        display: flex;\n        flex-direction: column;\n        gap: 0.9rem;\n        width: 100%;\n        align-items: stretch;\n    }\n\n    .blog-plan-sidebar {\n        display: none;\n        width: 13rem;\n        flex: 0 0 13rem;\n        position: relative;\n        z-index: 2;\n    }\n\n    .blog-plan-cards-wrap {\n        position: relative;\n        z-index: 1;\n    }\n\n    .blog-plan-sidebar-head,\n    .blog-plan-card-head {\n        min-height: 16.6rem;\n    }\n\n    .blog-plan-sidebar-head {\n        display: flex;\n        flex-direction: column;\n        justify-content: flex-start;\n        gap: 1rem;\n        padding-top: 0;\n    }\n\n    .blog-plan-control {\n        position: relative;\n        display: grid;\n        grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n        align-items: center;\n        gap: 0;\n        width: 100%;\n        min-height: 2.55rem;\n        padding: 0.18rem;\n        border: 1px solid #dbe8fb;\n        border-radius: 999px;\n        background: #eef4ff;\n    }\n\n    .blog-plan-control-label {\n        position: relative;\n        z-index: 2;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        min-width: 0;\n        height: 2.15rem;\n        color: #74839a;\n        font-size: 0.78rem;\n        font-weight: 800;\n        line-height: 1;\n        pointer-events: none;\n        text-align: center;\n        white-space: nowrap;\n    }\n\n    .blog-plan-control-label.active {\n        color: #ffffff;\n    }\n\n    .blog-plan-toggle {\n        position: absolute;\n        inset: 0.18rem;\n        z-index: 1;\n        display: block;\n        width: auto;\n        height: auto;\n        align-items: center;\n        border: 0 !important;\n        border-radius: 999px;\n        background: transparent !important;\n        cursor: pointer;\n        padding: 0 !important;\n    }\n\n    .blog-plan-toggle::before {\n        content: '';\n        position: absolute;\n        inset: 0 auto 0 0;\n        width: 50%;\n        border-radius: 999px;\n        background: #2563eb;\n        box-shadow: 0 8px 18px rgba(37, 99, 235, 0.22);\n        transition: transform 0.22s ease;\n    }\n\n    .blog-plan-toggle.yearly::before {\n        transform: translateX(100%);\n    }\n\n    .blog-plan-toggle span {\n        display: none;\n    }\n\n    .blog-plan-dob-row {\n        display: flex;\n        align-items: center;\n        gap: 0.7rem;\n    }\n\n    .blog-plan-dob-row span {\n        min-width: 3.75rem;\n        color: #111827;\n        font-weight: 800;\n    }\n\n    .blog-plan-dob {\n        width: 100%;\n        min-height: 2.65rem;\n        border: 0;\n        border-radius: 12px;\n        background: #eff6ff;\n        color: #475569;\n        font-size: 0.9rem;\n        font-weight: 650;\n        padding: 0 0.75rem;\n        outline: none;\n    }\n\n    .blog-plan-state {\n        padding: 2rem;\n        border: 1px solid #e5e7eb;\n        border-radius: 16px;\n        background: #fff;\n        color: #64748b;\n        text-align: center;\n        font-weight: 650;\n    }\n\n    .blog-plan-cards-wrap {\n        min-width: 0;\n        width: 100%;\n    }\n\n    .blog-plan-cards {\n        display: grid;\n        grid-template-columns: minmax(0, 1fr);\n        gap: 0.9rem;\n        width: 100%;\n        padding-top: 1.1rem;\n    }\n\n    .blog-plan-card {\n        position: relative;\n        display: flex;\n        flex-direction: column;\n        min-width: 0;\n        overflow: visible;\n        border: 1px solid #e7eef8;\n        border-radius: 22px;\n        background: #fff;\n        box-shadow: 0 8px 20px rgba(15, 23, 42, 0.06);\n        transition: transform 0.2s ease, box-shadow 0.2s ease;\n    }\n\n    .blog-plan-card:has(.blog-plan-feature-help-trigger:hover),\n    .blog-plan-card:has(.blog-plan-feature-help-trigger:focus),\n    .blog-plan-card:has(.blog-plan-feature-help-trigger.active) {\n        z-index: 60;\n    }\n\n    .blog-plan-card:hover {\n        transform: translateY(-2px);\n        box-shadow: 0 16px 34px rgba(15, 23, 42, 0.11);\n    }\n\n    .blog-plan-card.popular {\n        border: 2px solid #2563eb;\n        box-shadow: 0 12px 32px rgba(37, 99, 235, 0.14);\n    }\n\n    .blog-plan-badge {\n        position: absolute;\n        top: -0.85rem;\n        left: 50%;\n        transform: translateX(-50%);\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        gap: 0.28rem;\n        width: 10.25rem;\n        min-width: 10.25rem;\n        max-width: none;\n        flex-wrap: nowrap;\n        border-radius: 999px;\n        background: linear-gradient(135deg, #facc15, #f59e0b);\n        color: #713f12;\n        font-size: 0.72rem;\n        font-weight: 850;\n        line-height: 1;\n        padding: 0.42rem 0.9rem;\n        white-space: nowrap;\n        box-shadow: 0 6px 14px rgba(245, 158, 11, 0.25);\n    }\n\n    .blog-plan-badge > * {\n        flex: 0 0 auto;\n        white-space: nowrap;\n    }\n\n    .blog-plan-badge-icon {\n        font-size: 0.72rem;\n        line-height: 1;\n    }\n\n    .blog-plan-card-head {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: flex-start;\n        padding: 1.35rem 1.2rem 1rem;\n        border-bottom: 1px solid #f3f6fa;\n        text-align: center;\n    }\n\n    .blog-plan-card-title {\n        min-height: 2.9rem;\n        margin: 0 0 0.6rem;\n        color: #1f2937;\n        font-size: 1.05rem;\n        font-weight: 850;\n        line-height: 1.35;\n    }\n\n    .blog-plan-price {\n        min-height: 3rem;\n        display: inline-flex;\n        align-items: baseline;\n        justify-content: center;\n        margin-bottom: 1.05rem;\n        color: #dc2626;\n        font-family: 'Inter Bold', sans-serif;\n        font-weight: 900;\n        white-space: nowrap;\n    }\n\n    .blog-plan-currency {\n        margin-right: 0.2rem;\n        font-size: 1.35rem;\n    }\n\n    .blog-plan-amount {\n        font-size: 2.15rem;\n        line-height: 1;\n    }\n\n    .blog-plan-unit {\n        margin-left: 0.25rem;\n        color: #64748b;\n        font-size: 0.8rem;\n        font-weight: 700;\n    }\n\n    .blog-plan-select {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        width: 100% !important;\n        min-height: 2.85rem;\n        border: 1px solid #1d4ed8 !important;\n        border-radius: 14px;\n        background-color: #2563eb !important;\n        background-image: none !important;\n        color: #ffffff !important;\n        cursor: pointer;\n        font-size: 0.95rem;\n        font-weight: 850;\n        text-align: center;\n        text-decoration: none !important;\n        box-shadow: 0 8px 18px rgba(37, 99, 235, 0.22) !important;\n        transition: background-color 0.2s ease, transform 0.2s ease;\n    }\n\n    .blog-plan-card.popular .blog-plan-select {\n        box-shadow: 0 10px 22px rgba(37, 99, 235, 0.28);\n    }\n\n    .blog-plan-select:hover,\n    .blog-plan-select:focus,\n    .blog-plan-select:active {\n        transform: translateY(-1px);\n        background-color: #1d4ed8 !important;\n        background-image: none !important;\n        border-color: #1d4ed8 !important;\n        box-shadow: 0 10px 22px rgba(37, 99, 235, 0.28) !important;\n    }\n\n    .blog-plan-card.popular .blog-plan-select:hover,\n    .blog-plan-card.popular .blog-plan-select:focus,\n    .blog-plan-card.popular .blog-plan-select:active {\n        background-color: #1d4ed8 !important;\n        background-image: none !important;\n    }\n\n    .blog-plan-compare-select {\n        width: 100% !important;\n        min-height: 2.55rem;\n        margin-top: 0.55rem;\n        padding: 0.6rem 0.85rem !important;\n        border-radius: 12px;\n        font-size: 0.86rem;\n        box-shadow: 0 8px 18px rgba(37, 99, 235, 0.2) !important;\n    }\n\n    .blog-plan-compare-select:hover,\n    .blog-plan-compare-select:focus,\n    .blog-plan-compare-select:active {\n        background-color: #1d4ed8 !important;\n        border-color: #1d4ed8 !important;\n        transform: translateY(-1px);\n        box-shadow: 0 10px 22px rgba(37, 99, 235, 0.28) !important;\n    }\n\n    .blog-plan-actions {\n        display: flex;\n        flex-direction: column;\n        align-items: stretch;\n        width: min(100%, 8.8rem);\n        gap: 0.72rem;\n        margin-top: 0.1rem;\n        margin-bottom: 0.85rem;\n    }\n\n    .blog-plan-compare {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        gap: 0.5rem;\n        width: auto !important;\n        min-height: 1.6rem;\n        margin: 0 auto;\n        padding: 0 !important;\n        border: 0 !important;\n        border-radius: 0;\n        background: transparent !important;\n        color: #334155 !important;\n        cursor: pointer;\n        font-size: 0.78rem;\n        font-weight: 800;\n        line-height: 1 !important;\n        text-decoration: none !important;\n        box-shadow: none !important;\n    }\n\n    .blog-plan-compare:hover,\n    .blog-plan-compare:focus,\n    .blog-plan-compare:active {\n        background: transparent !important;\n        color: #2563eb !important;\n        border-color: transparent !important;\n        box-shadow: none !important;\n    }\n\n    .blog-plan-compare.active,\n    .blog-plan-compare.active:hover,\n    .blog-plan-compare.active:focus {\n        background: transparent !important;\n        color: #1d4ed8 !important;\n        border-color: transparent !important;\n    }\n\n    .blog-plan-compare-box {\n        display: block;\n        flex: 0 0 auto;\n        width: 1.25rem;\n        height: 1.25rem;\n        border: 2px solid #d1d5db;\n        border-radius: 4px;\n        background: #fff;\n    }\n\n    .blog-plan-compare.active .blog-plan-compare-box {\n        border-color: #2563eb;\n        background: #2563eb;\n        box-shadow: inset 0 0 0 3px #fff;\n    }\n\n    .blog-plan-tabs {\n        display: flex;\n        width: 100%;\n        min-height: 2.55rem;\n        margin-top: auto;\n        padding: 0.3rem;\n        border-radius: 12px;\n        background: #f1f5f9;\n        gap: 0.2rem;\n    }\n\n    .blog-plan-tabs.empty {\n        visibility: hidden;\n    }\n\n    .blog-plan-tab {\n        flex: 1 1 0;\n        min-width: 0;\n        border: 0 !important;\n        border-radius: 9px;\n        background: transparent !important;\n        color: #64748b !important;\n        cursor: pointer;\n        font-size: 0.75rem;\n        font-weight: 850;\n        overflow: hidden;\n        padding: 0.42rem 0.3rem !important;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n    }\n\n    .blog-plan-tab:hover {\n        background: #e2e8f0 !important;\n        color: #1f2937 !important;\n    }\n\n    .blog-plan-tab.active {\n        background: #facc15 !important;\n        color: #111827 !important;\n        box-shadow: 0 5px 14px rgba(250, 204, 21, 0.3);\n    }\n\n    .blog-plan-features {\n        flex: 1;\n        padding: 0 1.2rem 1.2rem;\n    }\n\n    .blog-plan-feature-row,\n    .blog-plan-label-row {\n        min-height: 3.8rem;\n        border-bottom: 1px solid #f4f6fa;\n    }\n\n    .blog-plan-feature-row {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n        text-align: center;\n        position: relative;\n        z-index: 1;\n    }\n\n    .blog-plan-feature-row:has(.blog-plan-feature-help-trigger:hover),\n    .blog-plan-feature-row:has(.blog-plan-feature-help-trigger:focus),\n    .blog-plan-feature-row:has(.blog-plan-feature-help-trigger.active) {\n        z-index: 80;\n    }\n\n    .blog-plan-label-row {\n        display: flex;\n        align-items: center;\n        color: #2563eb;\n        font-size: 0.82rem;\n        font-weight: 750;\n        position: relative;\n        overflow: visible;\n        padding-right: 0.15rem;\n    }\n\n    .blog-plan-feature-label {\n        margin-bottom: 0;\n        width: 100%;\n        color: #94a3b8;\n        font-size: 0.72rem;\n        font-weight: 700;\n        position: relative;\n        overflow: visible;\n    }\n\n    .blog-plan-feature-value {\n        position: relative;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        gap: 0.35rem;\n        width: 100%;\n        color: #1f2937;\n        font-size: 0.85rem;\n        font-weight: 850;\n        line-height: 1.3;\n        overflow-wrap: anywhere;\n    }\n\n    .blog-plan-feature-value-text {\n        min-width: 0;\n    }\n\n    .blog-plan-feature-value.link {\n        color: #2563eb !important;\n        text-decoration: underline;\n        text-underline-offset: 3px;\n    }\n\n    .blog-plan-links {\n        display: flex;\n        flex-wrap: wrap;\n        justify-content: center;\n        gap: 0.55rem;\n        padding: 0.95rem 1rem;\n        \/*border-top: 1px solid #f3f6fa;*\/\n        border-radius: 0 0 22px 22px;\n        background: transparent;\n    }\n\n    .blog-plan-link {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        gap: 0.3rem;\n        width: auto !important;\n        min-height: auto !important;\n        border: 0 !important;\n        background: transparent !important;\n        color: #2563eb !important;\n        cursor: pointer;\n        font-size: 0.76rem;\n        font-weight: 850;\n        line-height: 1.2 !important;\n        padding: 0.15rem 0.2rem !important;\n        text-align: center;\n        text-decoration: none !important;\n        white-space: normal;\n    }\n\n    .blog-plan-link-icon {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        flex: 0 0 auto;\n        width: 1rem;\n        height: 1rem;\n        color: currentColor;\n    }\n\n    .blog-plan-link-icon svg {\n        display: block;\n        width: 100%;\n        height: 100%;\n    }\n\n    .blog-plan-link:hover,\n    .blog-plan-feature-value.link:hover {\n        color: #1d4ed8 !important;\n        text-decoration: underline !important;\n    }\n\n    .blog-plan-view-more-wrap {\n        display: flex;\n        justify-content: center;\n        margin-top: 1rem;\n    }\n\n    .blog-plan-view-more,\n    .blog-plan-compare-fab {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        border: 0 !important;\n        border-radius: 999px;\n        cursor: pointer;\n        font-weight: 850;\n        text-align: center;\n        text-decoration: none !important;\n    }\n\n    .blog-plan-view-more {\n        min-width: 11.5rem;\n        min-height: 2.35rem;\n        background: transparent !important;\n        color: #1d4ed8 !important;\n        border: 0 !important;\n        padding: 0.35rem 1.2rem !important;\n        font-size: 0.95rem;\n        box-shadow: none !important;\n    }\n\n    .blog-plan-view-more:hover,\n    .blog-plan-view-more:focus {\n        background: transparent !important;\n        color: #1d4ed8 !important;\n        border-color: transparent !important;\n        box-shadow: none !important;\n    }\n\n    .blog-plan-compare-fab {\n        margin-top: 1rem;\n        background: #111827 !important;\n        color: #fff !important;\n        padding: 0.75rem 1.1rem !important;\n        box-shadow: 0 12px 24px rgba(15, 23, 42, 0.16) !important;\n    }\n\n    .blog-plan-modal {\n        position: fixed;\n        inset: 0;\n        z-index: 1200;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        padding: 1rem;\n        background: rgba(15, 23, 42, 0.55);\n    }\n\n    .blog-plan-modal-panel {\n        width: min(960px, 100%);\n        max-height: 86vh;\n        overflow: auto;\n        border-radius: 18px;\n        background: #fff;\n        box-shadow: 0 24px 70px rgba(15, 23, 42, 0.24);\n    }\n\n    .blog-plan-modal-head {\n        position: sticky;\n        top: 0;\n        z-index: 2;\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 1rem;\n        padding: 1rem 1.25rem;\n        border-bottom: 1px solid #eef2f7;\n        background: #fff;\n    }\n\n    .blog-plan-modal-title {\n        color: #111827;\n        font-size: 1.1rem;\n        font-weight: 850;\n    }\n\n    .blog-plan-modal-close {\n        border: 0 !important;\n        border-radius: 999px;\n        background: #f1f5f9 !important;\n        color: #334155 !important;\n        cursor: pointer;\n        font-size: 1.3rem;\n        line-height: 1;\n        padding: 0.35rem 0.7rem !important;\n    }\n\n    .blog-plan-compare-table {\n        min-width: 720px;\n        display: grid;\n        grid-template-columns: minmax(190px, 1.2fr) repeat(3, minmax(150px, 1fr));\n    }\n\n    .blog-plan-feature-help-trigger {\n        position: relative;\n        display: inline-flex;\n        align-items: center;\n        gap: 0.45rem;\n        width: 100%;\n        min-width: 0;\n        padding: 0;\n        border: 0 !important;\n        background: transparent !important;\n        color: inherit !important;\n        cursor: help;\n        font: inherit;\n        line-height: inherit;\n        text-align: inherit;\n        text-decoration: none !important;\n        white-space: normal;\n    }\n\n    .blog-plan-feature-help-trigger:hover,\n    .blog-plan-feature-help-trigger:focus,\n    .blog-plan-feature-help-trigger.active {\n        z-index: 100;\n    }\n\n    .blog-plan-feature-help-trigger:hover,\n    .blog-plan-feature-help-trigger:focus,\n    .blog-plan-feature-help-trigger:focus-visible {\n        border: 0 !important;\n        background: transparent !important;\n        box-shadow: none !important;\n        outline: none !important;\n        text-decoration: none !important;\n    }\n\n    .blog-plan-feature-help-trigger--sidebar {\n        justify-content: space-between;\n        color: inherit;\n        min-height: 100%;\n        padding-right: 0.1rem;\n    }\n\n    .blog-plan-feature-help-trigger--card {\n        justify-content: center;\n        text-align: center;\n        padding: 0 0.1rem;\n    }\n\n    .blog-plan-feature-help-trigger--value {\n        flex: 0 0 auto;\n        justify-content: center;\n        width: auto !important;\n        padding: 0 !important;\n        vertical-align: middle;\n    }\n\n    .blog-plan-feature-help-label {\n        min-width: 0;\n        flex: 0 1 auto;\n    }\n\n    .blog-plan-feature-help-trigger--sidebar .blog-plan-feature-help-label {\n        flex: 1 1 auto;\n        text-align: left;\n    }\n\n    .blog-plan-feature-help-trigger--card .blog-plan-feature-help-label {\n        text-align: center;\n    }\n\n    .blog-plan-feature-help-icon {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        flex: 0 0 auto;\n        width: 1rem;\n        height: 1rem;\n        border-radius: 999px;\n        border: 1px solid #bfdbfe;\n        background: #eff6ff;\n        color: #2563eb;\n        font-size: 0.66rem;\n        font-weight: 900;\n        line-height: 1;\n    }\n\n    .blog-plan-feature-help-popover {\n        position: absolute;\n        z-index: 9999;\n        display: block;\n        max-width: min(16rem, 80vw);\n        padding: 0.7rem 0.8rem;\n        border-radius: 12px;\n        background: #111827;\n        color: #f8fafc;\n        font-size: 0.72rem;\n        font-weight: 600;\n        line-height: 1.45;\n        text-align: left;\n        white-space: pre-line;\n        word-break: break-word;\n        box-shadow: 0 16px 34px rgba(15, 23, 42, 0.22);\n        pointer-events: none;\n    }\n\n    .blog-plan-feature-help-popover::before {\n        content: '';\n        position: absolute;\n        width: 0.55rem;\n        height: 0.55rem;\n        background: #111827;\n        transform: rotate(45deg);\n    }\n\n    .blog-plan-feature-help-popover--sidebar {\n        left: calc(100% + 0.55rem);\n        top: 50%;\n        width: min(16rem, 42vw);\n        transform: translateY(-50%);\n    }\n\n    .blog-plan-feature-help-popover--sidebar::before {\n        left: -0.25rem;\n        top: 50%;\n        transform: translateY(-50%) rotate(45deg);\n    }\n\n    .blog-plan-feature-help-popover--card {\n        left: 50%;\n        top: calc(100% + 0.45rem);\n        width: min(15rem, 78vw);\n        transform: translateX(-50%);\n    }\n\n    .blog-plan-feature-help-popover--card::before {\n        left: 50%;\n        top: -0.25rem;\n        transform: translateX(-50%) rotate(45deg);\n    }\n\n    .blog-plan-feature-help-popover--value {\n        left: calc(100% + 0.35rem);\n        right: auto;\n        top: 50%;\n        bottom: auto;\n        width: max-content;\n        min-width: 12rem;\n        max-width: min(16rem, 62vw);\n        transform: translateY(-50%);\n    }\n\n    .blog-plan-feature-help-popover--value::before {\n        left: -0.25rem;\n        right: auto;\n        top: 50%;\n        bottom: auto;\n        transform: translateY(-50%) rotate(45deg);\n    }\n\n    .blog-plan-card:last-child .blog-plan-feature-help-popover--value {\n        left: auto;\n        right: calc(100% + 0.35rem);\n    }\n\n    .blog-plan-card:last-child .blog-plan-feature-help-popover--value::before {\n        left: auto;\n        right: -0.25rem;\n    }\n\n    .blog-plan-compare-cell {\n        min-height: 3.4rem;\n        padding: 0.9rem;\n        border-right: 1px solid #f1f5f9;\n        border-bottom: 1px solid #f1f5f9;\n        color: #334155;\n        font-size: 0.85rem;\n        text-align: center;\n    }\n\n    .blog-plan-compare-cell.label {\n        color: #2563eb;\n        font-weight: 850;\n        text-align: left;\n    }\n\n    .blog-plan-compare-cell.head {\n        background: #f8fafc;\n        color: #111827;\n        font-weight: 850;\n    }\n\n    .blog-plan-embed {\n        max-width: 100%;\n        overflow: visible;\n        border-radius: 0;\n        background: transparent !important;\n    }\n\n    .blog-plan-card {\n        border-radius: 18px;\n        box-shadow: 0 14px 30px rgba(15, 23, 42, 0.07);\n    }\n\n    .blog-plan-card.popular {\n        box-shadow: 0 16px 34px rgba(37, 99, 235, 0.16);\n    }\n\n    .blog-plan-card-title {\n        font-size: 1rem;\n        line-height: 1.32;\n    }\n\n    .blog-plan-price {\n        min-height: 2.85rem;\n        margin-bottom: 0.9rem;\n    }\n\n    .blog-plan-currency {\n        font-size: 1.05rem;\n    }\n\n    .blog-plan-amount {\n        font-size: 1.85rem;\n    }\n\n    .blog-plan-unit {\n        font-size: 0.72rem;\n    }\n\n    .blog-plan-select {\n        width: 100% !important;\n        max-width: none;\n        min-height: 2.6rem;\n        padding: 0.72rem 1.1rem !important;\n    }\n\n    .blog-plan-tabs {\n        width: min(100%, 8.6rem);\n        min-height: 2.35rem;\n        margin: auto auto 0;\n    }\n\n    .blog-plan-tab {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n    }\n\n    @media (max-width: 1440px) and (min-width: 1025px) {\n        .blog-plan-cards {\n            gap: 0.6rem;\n        }\n\n        .blog-plan-sidebar-head,\n        .blog-plan-card-head {\n            height: 15.8rem;\n            min-height: 15.8rem;\n        }\n\n        .blog-plan-card-head {\n            padding: 1.15rem 0.78rem 0.78rem;\n        }\n\n        .blog-plan-card-title {\n            min-height: 2.55rem;\n            font-size: 0.94rem;\n            line-height: 1.26;\n        }\n\n        .blog-plan-price {\n            min-height: 2.55rem;\n            margin-bottom: 0.75rem;\n        }\n\n        .blog-plan-currency {\n            font-size: 0.96rem;\n        }\n\n        .blog-plan-amount {\n            font-size: 1.68rem;\n        }\n\n        .blog-plan-unit {\n            margin-left: 0.18rem;\n            font-size: 0.66rem;\n        }\n\n        .blog-plan-actions {\n            width: min(100%, 8.05rem);\n            gap: 0.56rem;\n        }\n\n        .blog-plan-select {\n            min-height: 2.45rem;\n            font-size: 0.89rem;\n        }\n    }\n\n    \/* \u79fb\u52a8\u7aef\u9002\u914d *\/\n    @media (max-width: 768px) {\n        .elementor-widget-container {\n            margin: 0 !important;\n            padding: 0 !important;\n        }\n        .main-content {\n            box-shadow: none;\n            padding: 0;\n        }\n        .breadcrumbs {\n            display: none;\n        }\n        .page-container { flex-direction: column; }\n        .sidebar { display: none; } \/* \u79fb\u52a8\u7aef\u9690\u85cf\u4fa7\u8fb9\u680f *\/\n        .deadline-card { flex-direction: column; align-items: flex-start; gap: 20px; padding: 25px; }\n        .timer-display { width: 100%; justify-content: space-between; display: grid;\n            grid-template-columns: 1fr 1fr;}\n        .time-box span { font-size: 20px; }\n        .plan-cards { grid-template-columns: 1fr; max-width: 400px; margin: 40px auto; }\n        .article-title { font-size: 26px; }\n\n        .blog-plan-card {\n            border: 1px solid #dbe4f2;\n            box-shadow: 0 8px 18px rgba(15, 23, 42, 0.05);\n        }\n\n        .blog-plan-card.popular {\n            border: 2px solid #2563eb;\n            box-shadow: 0 8px 18px rgba(15, 23, 42, 0.05);\n        }\n    }\n\n    @media (min-width: 900px) {\n        .blog-plan-embed {\n            padding: 0;\n        }\n\n        .blog-plan-layout {\n            flex-direction: row;\n            gap: 0.75rem;\n        }\n\n        .blog-plan-mobile-controls {\n            display: none;\n        }\n\n        .blog-plan-sidebar {\n            display: block;\n            width: 12.9rem;\n            flex-basis: 12.9rem;\n        }\n\n        .blog-plan-sidebar .blog-plan-compare-fab {\n            width: 100%;\n            margin-top: 0;\n            min-height: 2.6rem;\n            border-radius: 999px;\n        }\n\n        .blog-plan-cards-wrap > .blog-plan-compare-fab {\n            display: none;\n        }\n\n        .blog-plan-cards {\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n            gap: 0.75rem;\n        }\n\n        .blog-plan-cards.single {\n            grid-template-columns: minmax(17rem, 22rem);\n            justify-content: center;\n        }\n\n        .blog-plan-cards.two {\n            grid-template-columns: repeat(2, minmax(17rem, 22rem));\n            justify-content: center;\n        }\n\n        .blog-plan-feature-label {\n            display: none;\n        }\n\n        .blog-plan-feature-row {\n            height: 3.65rem;\n            min-height: 3.65rem;\n        }\n\n        .blog-plan-label-row {\n            height: 3.65rem;\n            min-height: 3.65rem;\n            font-size: 0.78rem;\n        }\n\n        .blog-plan-sidebar-head,\n        .blog-plan-card-head {\n            height: 16.6rem;\n            min-height: 16.6rem;\n        }\n\n        .blog-plan-card-head {\n            padding: 1.35rem 0.95rem 0.85rem;\n        }\n\n        .blog-plan-features {\n            padding: 0 0.9rem 0.65rem;\n        }\n\n        .blog-plan-actions {\n            width: min(100%, 8.5rem);\n            gap: 0.62rem;\n            margin-bottom: 0.8rem;\n        }\n\n        .blog-plan-select {\n            min-height: 2.55rem;\n            padding: 0.68rem 1.1rem !important;\n        }\n\n        .blog-plan-links {\n            min-height: 6.2rem;\n            padding: 0.85rem 0.75rem 0.95rem;\n            align-content: center;\n        }\n    }\n<\/style>\n<div id=\"app\" class=\"usc-guide-page\" v-cloak>\n    <transition name=\"ggs-page-loading\">\n        <div\n                v-if=\"pageLoading || loading2\"\n                class=\"ggs-page-loading\"\n                role=\"status\"\n                aria-live=\"polite\"\n                aria-busy=\"true\"\n        >\n            <div class=\"ggs-page-loading-card\">\n                <div class=\"ggs-page-loading-orbit\" aria-hidden=\"true\">\n                    <span><\/span><span><\/span><span><\/span>\n                    <img decoding=\"async\"\n                            src=\"https:\/\/www.goglobalsafe.com\/wp-content\/uploads\/2026\/05\/logo-pure.webp\"\n                            alt=\"\"\n                            class=\"ggs-page-loading-logo\"\n                    >\n                <\/div>\n                <strong>{{ pageLoading ? loadingCopy.pageTitle : loadingCopy.processingTitle }}<\/strong>\n                <p>{{ pageLoading ? loadingCopy.pageMessage : loadingCopy.processingMessage }}<\/p>\n            <\/div>\n        <\/div>\n    <\/transition>\n\n    <div class=\"breadcrumbs\" v-if=\"blog\">\n        <span class=\"back-link\" @click=\"backLink\"><img decoding=\"async\" style=\"margin-right: 0.21rem;\" src=\"\/wp-content\/static\/img\/blog\/left-cat.svg\">Back to Blog<\/span>\n        <span class=\"divider\"><img decoding=\"async\" src=\"\/wp-content\/static\/img\/blog\/right-cat.svg\"><\/span>\n        <span class=\"current\">{{blog.title}}<\/span>\n    <\/div>\n    <!--\u767b\u5f55\u5f39\u7a97-->\n    <div v-if=\"is_login\" v-cloak\n class=\"fixed inset-0 p-4 flex flex-wrap justify-center items-center w-full h-full z-[1000] before:fixed before:inset-0 before:w-full before:h-full before:bg-[rgba(0,0,0,0.5)] overflow-auto font-[sans-serif]\"\n         style=\"z-index: 1300;\">\n        <div class=\"w-full max-w-xl bg-white shadow-lg rounded-md p-8 relative\">\n            <div @click=\"close_login\">\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n                     class=\"w-3.5 cursor-pointer shrink-0 fill-gray-800 hover:fill-red-500 float-right\"\n                     viewbox=\"0 0 320.591 320.591\">\n                    <path\n                            d=\"M30.391 318.583a30.37 30.37 0 0 1-21.56-7.288c-11.774-11.844-11.774-30.973 0-42.817L266.643 10.665c12.246-11.459 31.462-10.822 42.921 1.424 10.362 11.074 10.966 28.095 1.414 39.875L51.647 311.295a30.366 30.366 0 0 1-21.256 7.288z\"\n                            data-original=\"#000000\"><\/path>\n                    <path\n                            d=\"M287.9 318.583a30.37 30.37 0 0 1-21.257-8.806L8.83 51.963C-2.078 39.225-.595 20.055 12.143 9.146c11.369-9.736 28.136-9.736 39.504 0l259.331 257.813c12.243 11.462 12.876 30.679 1.414 42.922-.456.487-.927.958-1.414 1.414a30.368 30.368 0 0 1-23.078 7.288z\"\n                            data-original=\"#000000\"><\/path>\n                <\/svg>\n            <\/div>\n            <form class=\"max-w-xl mx-auto justify-center\" v-cloak @submit.prevent=\"handleSubmit\" action=\"\">\n                <h3 class=\"text-center md:text-base text-sm\" style=\"font-weight:800\">{{ login_title }}<\/h3>\n                <div class=\"mt-8 px-8\">\n                    <div class=\"space-y-4\">\n                        <template v-if=\"!mfa.active\">\n                        <div>\n                            <input v-model=\"loginform.email\" name=\"email\" @input=\"email_validateField\"\n                                   autocomplete=\"email\" type=\"email\" required\n class=\"bg-gray-100 w-full text-sm text-gray-800 px-4 py-3.5 rounded-md outline-blue-600 focus:bg-transparent\"\n                                   placeholder=\"\u7535\u5b50\u90ae\u4ef6\"\/>\n                        <\/div>\n                        <span class=\"text-red-500 font-bold text-xs mt-1 ml-2\"\n                              v-if=\"login_from_error.emailMessage\">{{ login_from_error.emailMessage }}<\/span>\n                        <span class=\"text-red-500 font-bold text-xs mt-1 ml-2\"\n                              v-if=\"login_from_error.errorMessage\">{{ login_from_error.errorMessage }}<\/span>\n                        <div v-if=\"emailSubmitted\">\n                            <input v-model=\"loginform.password\" name=\"password\" type=\"password\"\n                                   autocomplete=\"current-password\" required\n class=\"bg-gray-100 w-full text-sm text-gray-800 px-4 py-3.5 rounded-md outline-blue-600 focus:bg-transparent\"\n                                   placeholder=\"\u5bc6\u7801\"\/>\n                        <\/div>\n                        <div v-if=\"emailSubmitted\" class=\"flex flex-wrap items-center justify-between gap-4\">\n                            <div class=\"flex items-center\">\n                            <\/div>\n                            <div class=\"text-sm\">\n                                <a href=\"\/zh\/forget-password\/\" class=\"font-semibold\" style=\"color:#1558DA;font-size:14px\">\n                                    {{ login_forget_password }}\n                                <\/a>\n                            <\/div>\n                        <\/div>\n                        <\/template>\n                        <template v-else>\n                            <p style=\"color:#64748b;font-size:13px;line-height:1.5;margin:0;\">\n                                {{ mfa.useRecovery ? 'Enter your recovery code to continue.' : 'Enter the code from your Authenticator App to continue.' }}\n                            <\/p>\n                            <input\n                                    v-if=\"!mfa.useRecovery\"\n                                    v-model.trim=\"mfa.code\"\n                                    name=\"mfa_code\"\n                                    inputmode=\"numeric\"\n                                    autocomplete=\"one-time-code\"\n                                    class=\"bg-gray-100 w-full text-sm text-gray-800 px-4 py-3.5 rounded-md outline-blue-600 focus:bg-transparent\"\n                                    placeholder=\"Verification code\"\/>\n                            <input\n                                    v-else\n v-model.trim=\"mfa.recoveryCode\"\n                                    name=\"mfa_recovery\"\n                                    autocomplete=\"one-time-code\"\n                                    class=\"bg-gray-100 w-full text-sm text-gray-800 px-4 py-3.5 rounded-md outline-blue-600 focus:bg-transparent\"\n                                    placeholder=\"Recovery code\"\/>\n                            <span class=\"text-red-500 font-bold text-xs mt-1 ml-2\"\n                                  v-if=\"mfa.error\">{{ mfa.error }}<\/span>\n                            <div class=\"flex flex-wrap items-center justify-between gap-4\">\n                                <a href=\"#\" class=\"font-semibold\" style=\"color:#1558DA;font-size:14px\" @click.prevent=\"mfa.useRecovery = !mfa.useRecovery; mfa.error = ''\">\n                                    {{ mfa.useRecovery ? 'Use Authenticator code' : 'Use recovery code' }}\n                                <\/a>\n                                <a href=\"#\" class=\"font-semibold\" style=\"color:#1558DA;font-size:14px\" @click.prevent=\"cancelMfa\">\n                                    Back\n                                <\/a>\n                            <\/div>\n                        <\/template>\n                    <\/div>\n                    <div class=\"!mt-8\">\n                        <button type=\"submit\"\n                                class=\"w-full shadow-xl py-4 px-4 text-sm font-semibold rounded text-white focus:outline-none\"\n                                style=\"background-color:#242424\">\n                            {{ mfa.active ? (mfa.submitting ? 'Verifying...' : 'Verify and login') : (emailSubmitted ? login_submit_password : login_submit) }}\n                        <\/button>\n                    <\/div>\n                <\/div>\n            <input type=\"hidden\" name=\"trp-form-language\" value=\"zh\"\/><\/form>\n        <\/div>\n    <\/div>\n\n    <div class=\"page-container\">\n\n        <aside class=\"sidebar\" ref=\"sidebarRef\" @wheel=\"handleSidebarWheel\">\n\n            <div class=\"toc-header\"><img decoding=\"async\" style=\"margin-right: 0.21rem;\" src=\"\/wp-content\/static\/img\/blog\/category.svg\">ON THIS PAGE<\/div>\n\n            <div v-if=\"tocTree.length === 0\" style=\"color:#999;font-size:12px;\">Generating...<\/div>\n\n            <ul class=\"toc-list\" v-else>\n                <li v-for=\"root in tocTree\" :key=\"root.id\" class=\"toc-item-root\">\n\n                    <div class=\"toc-link-row\" @click=\"toggleSection(root)\">\n                        <span class=\"toc-text root-text\"\n                              @click.stop=\"scrollToId(root.id)\"\n                              :class=\"{'active': activeId === root.id}\">\n                            {{ root.text }}\n                        <\/span>\n\n                        <span v-if=\"root.children.length > 0\"\n                              class=\"toc-arrow\"\n                              :class=\"{ expanded: root.expanded }\">\u25b6<\/span>\n                    <\/div>\n\n                    <ul class=\"toc-sub-list\" v-show=\"root.expanded\" v-if=\"root.children.length > 0\">\n                        <li v-for=\"sub in root.children\" :key=\"sub.id\" class=\"toc-sub-item\">\n\n                            <div class=\"toc-link-row\" @click=\"toggleSection(sub)\">\n                                <a href=\"#\" class=\"toc-text sub-text\"\n                                   @click.stop.prevent=\"scrollToId(sub.id)\"\n                                   :class=\"{'active': activeId === sub.id}\">\n                                    {{ sub.text }}\n                                <\/a>\n                                <span v-if=\"sub.children.length > 0\"\n                                      class=\"toc-arrow\"\n                                      :class=\"{ expanded: sub.expanded }\">\u25b6<\/span>\n                            <\/div>\n\n                            <ul class=\"toc-deep-list\" v-show=\"sub.expanded\" v-if=\"sub.children.length > 0\">\n                                <li v-for=\"deep in sub.children\" :key=\"deep.id\" class=\"toc-deep-item\">\n                                    <a href=\"#\" class=\"deep-text\"\n                                       @click.prevent=\"scrollToId(deep.id)\"\n                                       :class=\"{'active': activeId === deep.id}\">\n                                        {{ deep.text }}\n                                    <\/a>\n                                <\/li>\n                            <\/ul>\n\n                        <\/li>\n                    <\/ul>\n                <\/li>\n            <\/ul>\n        <\/aside>\n\n        <main class=\"main-content\" v-if=\"blog\">\n\n\n\n            <div class=\"tags\" v-if=\"blog\">\n                <a class=\"tag\" v-for=\"tag in blog.tags\" :key=\"tag.id\"\n                   href=\"#\" @click.prevent=\"filterByTag(tag.id)\">\n                    {{ tag.name }}\n                <\/a>\n            <\/div>\n\n            <h1 class=\"article-title\">{{blog.title}}<\/h1>\n\n            <div class=\"author-meta\">\n                <div class=\"author-info\">\n                    <div class=\"avatar\">GGS<\/div>\n                    <div class=\"meta-text\">\n                        <strong>{{blog.author_name}}<\/strong>\n                        <p>{{blog.author_title}} \u2022 {{formatDate(blog.updated_at)}} \u2022 {{blog.reading_time}}<\/p>\n                    <\/div>\n                <\/div>\n                <div class=\"share-btn\" @click=\"shareClick\">SHARE <span>\ud83d\udd17<\/span><\/div>\n            <\/div>\n\n            <div class=\"deadline-card\" v-if=\"endTime\">\n                <div class=\"deadline-info\">\n                    <div class=\"badge\">\n                        <img decoding=\"async\" style=\"margin-right: 8px;\" src=\"\/wp-content\/static\/img\/blog\/clock.svg\">\n                        {{blog.waiver_name}}<\/div>\n                    <h2 class=\"deadline\">Waive Deadline<\/h2>\n                    <p style=\"max-width: 350px;\">Don't miss the chance to waive your school insurance.<\/p>\n                <\/div>\n                <div class=\"timer-display\">\n                    <div class=\"time-box\"><span>{{ timer.days }}<\/span><small>DAYS<\/small><\/div>\n                    <div class=\"time-box\"><span>{{ timer.hours }}<\/span><small>HOURS<\/small><\/div>\n                    <div class=\"time-box\"><span>{{ timer.mins }}<\/span><small>MINS<\/small><\/div>\n                    <div class=\"time-box\"><span>{{ timer.secs }}<\/span><small>SECS<\/small><\/div>\n                <\/div>\n            <\/div>\n            <div class=\"content\">\n                <div v-if=\"blog\">\n                    <div v-html=\"blogContentParts.before\"><\/div>\n\n                    <section\n                            v-if=\"blogContentParts.showPlanEmbed\"\n                            id=\"blog-plan-embed\"\n                            class=\"blog-plan-embed\"\n                            ref=\"blogPlanEmbedRef\"\n                            aria-label=\"GoGlobalSafe Plans\"\n                    >\n                        <div v-if=\"planNotice.message\" class=\"blog-plan-notice\" :class=\"planNotice.type\">\n                            {{ planNotice.message }}\n                        <\/div>\n\n                        <div class=\"blog-plan-mobile-controls\">\n                            <div class=\"blog-plan-control\">\n                                <span class=\"blog-plan-control-label\" :class=\"{ active: billingCycle === 'monthly' }\">{{ planCopy.monthly }}<\/span>\n                                <button\n                                        type=\"button\"\n                                        class=\"blog-plan-toggle\"\n                                        :class=\"{ yearly: billingCycle === 'yearly' }\"\n                                        :aria-label=\"planCopy.toggleBilling\"\n                                        @click=\"toggleBillingCycle\"\n                                >\n                                    <span><\/span>\n                                <\/button>\n                                <span class=\"blog-plan-control-label\" :class=\"{ active: billingCycle === 'yearly' }\">{{ billingToggleSecondaryLabel }}<\/span>\n                            <\/div>\n\n                            <label class=\"blog-plan-dob-row\">\n                                <span>{{ planCopy.dob }}<\/span>\n                                <input\n                                        class=\"blog-plan-dob\"\n                                        type=\"date\"\n                                        :max=\"todayIso\"\n                                        :value=\"nativeDateOfBirth\"\n                                        @change=\"setDateOfBirth\"\n                                >\n                            <\/label>\n                        <\/div>\n\n                        <div v-if=\"plansError\" class=\"blog-plan-state\">\n                            {{ plansError }}\n                        <\/div>\n                        <div v-else-if=\"!plansLoading && !filteredProducts.length\" class=\"blog-plan-state\">\n                            {{ noPlanDisplayMessage }}\n                        <\/div>\n                        <template v-else-if=\"!plansLoading\">\n                            <div class=\"blog-plan-layout\">\n                                <aside class=\"blog-plan-sidebar\">\n                                    <div class=\"blog-plan-sidebar-head\">\n                                        <div class=\"blog-plan-control\">\n                                            <span class=\"blog-plan-control-label\" :class=\"{ active: billingCycle === 'monthly' }\">{{ planCopy.monthly }}<\/span>\n                                            <button\n                                                    type=\"button\"\n                                                    class=\"blog-plan-toggle\"\n                                                    :class=\"{ yearly: billingCycle === 'yearly' }\"\n                                                    :aria-label=\"planCopy.toggleBilling\"\n                                                    @click=\"toggleBillingCycle\"\n                                            >\n                                                <span><\/span>\n                                            <\/button>\n                                            <span class=\"blog-plan-control-label\" :class=\"{ active: billingCycle === 'yearly' }\">{{ billingToggleSecondaryLabel }}<\/span>\n                                        <\/div>\n\n                                        <label class=\"blog-plan-dob-row\">\n                                            <span>{{ planCopy.dob }}<\/span>\n                                            <input\n                                                    class=\"blog-plan-dob\"\n                                                    type=\"date\"\n                                                    :max=\"todayIso\"\n                                                    :value=\"nativeDateOfBirth\"\n                                                    @change=\"setDateOfBirth\"\n                                            >\n                                        <\/label>\n\n                                        <button\n                                                v-if=\"selectedCompareProducts.length\"\n                                                type=\"button\"\n                                                class=\"blog-plan-compare-fab\"\n                                                @click=\"showCompareModal = true\"\n                                        >\n                                            {{ selectedCompareProducts.length }} {{ planCopy.compareSelected }}\n                                        <\/button>\n                                    <\/div>\n\n                                    <div>\n                                        <div\n                                                v-for=\"feature in visibleFeatures\"\n                                                :key=\"'label-' + feature.key\"\n                                                class=\"blog-plan-label-row\"\n                                        >\n                                            <button\n                                                    v-if=\"getFeatureHelp(feature.key, '', featureHasTierGuide(feature.key))\"\n                                                    type=\"button\"\n                                                    class=\"blog-plan-feature-help-trigger blog-plan-feature-help-trigger--sidebar\"\n                                                    :class=\"{ active: activeFeatureHelpId === getFeatureHelpId('sidebar', feature.key) }\"\n                                                    :aria-expanded=\"activeFeatureHelpId === getFeatureHelpId('sidebar', feature.key) ? 'true' : 'false'\"\n                                                    :aria-label=\"`${feature.label} explanation`\"\n                                                    @mouseenter=\"setFeatureHelpHover(getFeatureHelpId('sidebar', feature.key))\"\n                                                    @mouseleave=\"clearFeatureHelpHover(getFeatureHelpId('sidebar', feature.key))\"\n                                                    @focus=\"setFeatureHelpHover(getFeatureHelpId('sidebar', feature.key))\"\n                                                    @blur=\"clearFeatureHelpHover(getFeatureHelpId('sidebar', feature.key))\"\n                                                    @click.stop=\"toggleFeatureHelp(getFeatureHelpId('sidebar', feature.key))\"\n                                            >\n                                                <span class=\"blog-plan-feature-help-label\">{{ feature.label }}<\/span>\n                                                <span class=\"blog-plan-feature-help-icon\" aria-hidden=\"true\">i<\/span>\n                                                <span\n                                                        v-if=\"activeFeatureHelpId === getFeatureHelpId('sidebar', feature.key)\"\n                                                        class=\"blog-plan-feature-help-popover blog-plan-feature-help-popover--sidebar\"\n                                                >\n                                                    {{ getFeatureHelp(feature.key, '', featureHasTierGuide(feature.key)) }}\n                                                <\/span>\n                                            <\/button>\n                                            <span v-else>{{ feature.label }}<\/span>\n                                        <\/div>\n                                    <\/div>\n                                <\/aside>\n\n                                <div class=\"blog-plan-cards-wrap\">\n                                    <div\n                                            class=\"blog-plan-cards\"\n                                            :class=\"{ single: planCards.length === 1, two: planCards.length === 2 }\"\n                                    >\n                                        <article\n                                                v-for=\"plan in planCards\"\n                                                :key=\"plan.seriesKey || plan.compareId\"\n                                                class=\"blog-plan-card\"\n                                                :class=\"{ popular: plan.isPopular }\"\n                                        >\n                                            <div v-if=\"plan.isPopular\" class=\"blog-plan-badge\">\n                                                <span class=\"blog-plan-badge-icon\" aria-hidden=\"true\">\ud83d\udc51<\/span>\n                                                <span>{{ planCopy.mostPopular }}<\/span>\n                                            <\/div>\n\n                                            <div class=\"blog-plan-card-head\">\n                                                <div class=\"blog-plan-card-title\">GGS {{ normalizePlanName(plan.compareName || plan.name) }}<\/div>\n\n                                                <div class=\"blog-plan-price\">\n                                                    <span class=\"blog-plan-currency\">$<\/span>\n                                                    <span class=\"blog-plan-amount\">{{ formatPrice(displayPrice(plan)) }}<\/span>\n                                                    <span v-if=\"billingPriceUnitLabel\" class=\"blog-plan-unit\">\/{{ billingPriceUnitLabel }}<\/span>\n                                                <\/div>\n\n                                                <div class=\"blog-plan-actions\">\n                                                    <button type=\"button\" class=\"blog-plan-select\" @click=\"selectProduct(plan, $event)\">\n                                                        {{ planCopy.select }}\n                                                    <\/button>\n\n                                                    <button\n                                                            type=\"button\"\n                                                            class=\"blog-plan-compare\"\n                                                            :class=\"{ active: selectedForCompare.includes(String(plan.compareId)) }\"\n                                                            :aria-pressed=\"selectedForCompare.includes(String(plan.compareId)) ? 'true' : 'false'\"\n                                                            @click=\"toggleCompare(plan, $event)\"\n                                                    >\n                                                        <span class=\"blog-plan-compare-box\"><\/span>\n                                                        {{ planCopy.compare }}\n                                                    <\/button>\n                                                <\/div>\n\n                                                <div class=\"blog-plan-tabs\" :class=\"{ empty: !plan.hasOptionTabs }\">\n                                                    <button\n                                                            v-for=\"option in plan.optionTabs\"\n                                                            :key=\"(plan.seriesKey || plan.compareId) + '-option-' + option\"\n                                                            type=\"button\"\n                                                            class=\"blog-plan-tab\"\n                                                            :class=\"{ active: plan.selectedOption === option }\"\n                                                            @click=\"setSeriesOption(plan.seriesKey, option)\"\n                                                    >\n                                                        {{ getSeriesOptionLabel(option) }}\n                                                    <\/button>\n                                                <\/div>\n                                            <\/div>\n\n                                            <div class=\"blog-plan-features\">\n                                                <div\n                                                v-for=\"feature in visibleFeatures\"\n                                                :key=\"(plan.seriesKey || plan.compareId) + '-' + feature.key\"\n                                                class=\"blog-plan-feature-row\"\n                                            >\n                                                    <button\n                                                            v-if=\"getFeatureHelp(feature.key, getFeatureDisplay(plan, feature.key))\"\n                                                            type=\"button\"\n                                                            class=\"blog-plan-feature-label blog-plan-feature-help-trigger blog-plan-feature-help-trigger--card\"\n                                                            :class=\"{ active: activeFeatureHelpId === getFeatureHelpId('card', feature.key, plan.seriesKey || plan.compareId) }\"\n                                                            :aria-expanded=\"activeFeatureHelpId === getFeatureHelpId('card', feature.key, plan.seriesKey || plan.compareId) ? 'true' : 'false'\"\n                                                            :aria-label=\"`${feature.label} explanation`\"\n                                                            @mouseenter=\"setFeatureHelpHover(getFeatureHelpId('card', feature.key, plan.seriesKey || plan.compareId))\"\n                                                            @mouseleave=\"clearFeatureHelpHover(getFeatureHelpId('card', feature.key, plan.seriesKey || plan.compareId))\"\n                                                            @focus=\"setFeatureHelpHover(getFeatureHelpId('card', feature.key, plan.seriesKey || plan.compareId))\"\n                                                            @blur=\"clearFeatureHelpHover(getFeatureHelpId('card', feature.key, plan.seriesKey || plan.compareId))\"\n                                                            @click.stop=\"toggleFeatureHelp(getFeatureHelpId('card', feature.key, plan.seriesKey || plan.compareId))\"\n                                                    >\n                                                        <span class=\"blog-plan-feature-help-label\">{{ feature.label }}<\/span>\n                                                        <span class=\"blog-plan-feature-help-icon\" aria-hidden=\"true\">i<\/span>\n                                                        <span\n                                                                v-if=\"activeFeatureHelpId === getFeatureHelpId('card', feature.key, plan.seriesKey || plan.compareId)\"\n                                                                class=\"blog-plan-feature-help-popover blog-plan-feature-help-popover--card\"\n                                                        >\n                                                            {{ getFeatureHelp(feature.key, getFeatureDisplay(plan, feature.key)) }}\n                                                        <\/span>\n                                                    <\/button>\n                                                    <a\n                                                            v-if=\"feature.key === 'network' && hasProviderNetworkLink(getFeatureDisplay(plan, feature.key))\"\n                                                            class=\"blog-plan-feature-value link\"\n                                                            :href=\"getProviderNetworkLink(getFeatureDisplay(plan, feature.key))\"\n                                                            target=\"_blank\"\n                                                            rel=\"noopener noreferrer\"\n                                                    >\n                                                        {{ getFeatureDisplay(plan, feature.key) }}\n                                                    <\/a>\n                                                    <div v-else class=\"blog-plan-feature-value\">\n                                                        <span class=\"blog-plan-feature-value-text\">{{ getFeatureDisplay(plan, feature.key) }}<\/span>\n                                                        <button\n                                                                v-if=\"getTierValueHelp(feature.key, getFeatureDisplay(plan, feature.key))\"\n                                                                type=\"button\"\n                                                                class=\"blog-plan-feature-help-trigger blog-plan-feature-help-trigger--value\"\n                                                                :class=\"{ active: activeFeatureHelpId === getFeatureHelpId('value', feature.key, plan.seriesKey || plan.compareId) }\"\n                                                                :aria-expanded=\"activeFeatureHelpId === getFeatureHelpId('value', feature.key, plan.seriesKey || plan.compareId) ? 'true' : 'false'\"\n                                                                :aria-label=\"`${feature.label} tier explanation`\"\n                                                                @mouseenter=\"setFeatureHelpHover(getFeatureHelpId('value', feature.key, plan.seriesKey || plan.compareId))\"\n                                                                @mouseleave=\"clearFeatureHelpHover(getFeatureHelpId('value', feature.key, plan.seriesKey || plan.compareId))\"\n                                                                @focus=\"setFeatureHelpHover(getFeatureHelpId('value', feature.key, plan.seriesKey || plan.compareId))\"\n                                                                @blur=\"clearFeatureHelpHover(getFeatureHelpId('value', feature.key, plan.seriesKey || plan.compareId))\"\n                                                                @click.stop=\"toggleFeatureHelp(getFeatureHelpId('value', feature.key, plan.seriesKey || plan.compareId))\"\n                                                        >\n                                                            <span class=\"blog-plan-feature-help-icon\" aria-hidden=\"true\">i<\/span>\n                                                            <span\n                                                                    v-if=\"activeFeatureHelpId === getFeatureHelpId('value', feature.key, plan.seriesKey || plan.compareId)\"\n                                                                    class=\"blog-plan-feature-help-popover blog-plan-feature-help-popover--value\"\n                                                            >\n                                                                {{ getTierValueHelp(feature.key, getFeatureDisplay(plan, feature.key)) }}\n                                                            <\/span>\n                                                        <\/button>\n                                                    <\/div>\n                                                <\/div>\n                                            <\/div>\n\n                                            <div class=\"blog-plan-links\">\n                                                <button v-if=\"hasBrochureLink(plan)\" type=\"button\" class=\"blog-plan-link\" @click=\"openBrochure(plan, $event)\">\n                                                    <span class=\"blog-plan-link-icon\" aria-hidden=\"true\">\n                                                        <svg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n                                                            <path d=\"M6 3.5h8l4 4V20.5H6z\"><\/path>\n                                                            <path d=\"M14 3.5v4h4\"><\/path>\n                                                            <path d=\"M8.5 12h7\"><\/path>\n                                                            <path d=\"M8.5 15h7\"><\/path>\n                                                        <\/svg>\n                                                    <\/span>\n                                                    {{ planCopy.brochure }}\n                                                <\/button>\n                                                <button v-if=\"hasMedicationGuideLink(plan)\" type=\"button\" class=\"blog-plan-link\" @click=\"openMedicationGuide(plan, $event)\">\n                                                    <span class=\"blog-plan-link-icon\" aria-hidden=\"true\">\n                                                        <svg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n                                                            <path d=\"M9 14.5l6-6\"><\/path>\n                                                            <path d=\"M10.2 7.5a2.4 2.4 0 0 1 3.4 0l2.9 2.9a2.4 2.4 0 0 1 0 3.4l-4.6 4.6a2.4 2.4 0 0 1-3.4 0l-2.9-2.9a2.4 2.4 0 0 1 0-3.4z\"><\/path>\n                                                        <\/svg>\n                                                    <\/span>\n                                                    {{ planCopy.medicationGuide }}\n                                                <\/button>\n                                                <button v-if=\"hasPolicyLink(plan)\" type=\"button\" class=\"blog-plan-link\" @click=\"openPolicy(plan, $event)\">\n                                                    <span class=\"blog-plan-link-icon\" aria-hidden=\"true\">\n                                                        <svg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n                                                            <path d=\"M12 3.5 19 6.5v5.1c0 4.2-2.7 7.6-7 8.9-4.3-1.3-7-4.7-7-8.9V6.5z\"><\/path>\n                                                            <path d=\"M9.5 12.2l1.7 1.7 3.7-4\"><\/path>\n                                                        <\/svg>\n                                                    <\/span>\n                                                    {{ planCopy.policy }}\n                                                <\/button>\n                                            <\/div>\n                                        <\/article>\n                                    <\/div>\n\n                                    <button\n                                            v-if=\"selectedCompareProducts.length\"\n                                            type=\"button\"\n                                            class=\"blog-plan-compare-fab\"\n                                            @click=\"showCompareModal = true\"\n                                    >\n                                        {{ selectedCompareProducts.length }} {{ planCopy.compareSelected }}\n                                    <\/button>\n                                <\/div>\n                            <\/div>\n\n                            <div class=\"blog-plan-view-more-wrap\">\n                                <button type=\"button\" class=\"blog-plan-view-more\" @click=\"handleViewMoreToggle\">\n                                    {{ viewMore ? planCopy.viewLess : planCopy.viewMore }}\n                                <\/button>\n                            <\/div>\n\n                            <div v-if=\"showCompareModal\" class=\"blog-plan-modal\" @click.self=\"showCompareModal = false\">\n                                <div class=\"blog-plan-modal-panel\">\n                                    <div class=\"blog-plan-modal-head\">\n                                        <div class=\"blog-plan-modal-title\">{{ planCopy.comparePlans }}<\/div>\n                                        <button type=\"button\" class=\"blog-plan-modal-close\" @click=\"showCompareModal = false\" :aria-label=\"planCopy.close\">\u00d7<\/button>\n                                    <\/div>\n\n                                    <div class=\"blog-plan-compare-table\">\n                                        <div class=\"blog-plan-compare-cell head label\">{{ planCopy.features }}<\/div>\n                                        <div\n                                                v-for=\"(slot, index) in compareSlots\"\n                                                :key=\"'compare-head-' + index\"\n                                                class=\"blog-plan-compare-cell head\"\n                                        >\n                                            <template v-if=\"slot\">\n                                                <div>{{ normalizePlanName(slot.compareName || slot.name) }}<\/div>\n                                                <div>${{ formatPrice(displayPrice(slot)) }}<\/div>\n                                                <button type=\"button\" class=\"blog-plan-select blog-plan-compare-select\" @click=\"selectProduct(slot, $event)\">\n                                                    {{ planCopy.select }}\n                                                <\/button>\n                                            <\/template>\n                                        <\/div>\n\n                                        <template v-for=\"feature in compareFeatures\" :key=\"'compare-row-' + feature.key\">\n                                            <div class=\"blog-plan-compare-cell label\">{{ feature.label }}<\/div>\n                                            <div\n                                                    v-for=\"(slot, index) in compareSlots\"\n                                                    :key=\"'compare-cell-' + feature.key + '-' + index\"\n                                                    class=\"blog-plan-compare-cell\"\n                                            >\n                                                <template v-if=\"slot\">{{ getFeatureDisplay(slot, feature.key) }}<\/template>\n                                            <\/div>\n                                        <\/template>\n                                    <\/div>\n                                <\/div>\n                            <\/div>\n                        <\/template>\n                    <\/section>\n\n                    <div v-html=\"blogContentParts.after\"><\/div>\n                <\/div>\n\n                <div v-else style=\"text-align: center; padding: 40px; color: #999;\">\n                    \u52a0\u8f7d\u4e2d...\n                <\/div>\n\n                <div class=\"lock-section\" v-if=\"shouldShowLock\">\n                    <div class=\"lock-overlay\" style=\"position: relative; background: none; backdrop-filter: none;\">\n                        <div class=\"lock-icon\">\ud83d\udd12<\/div>\n\n                        <h2>{{ lockTitle }}<\/h2>\n                        <p>{{ lockDesc }}<\/p>\n\n                        <div class=\"lock-buttons\">\n                            <div class=\"btn-primary\" @click=\"goToBuy($event)\">\n                                {{ btnBuyText }}\n                            <\/div>\n\n                            <div class=\"btn-outline\" @click=\"checkLogin\">\n                                {{ btnLoginText }}\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n            <div class=\"faq-section\" v-if=\"blog.faqs && blog.faqs.length > 0\">\n                <h3 class=\"faq-title\">{{faq}}<\/h3>\n\n                <el-collapse v-model=\"activeFaq\">\n                    <el-collapse-item\n                            v-for=\"faq in blog.faqs\"\n                            :key=\"faq.id\"\n                            :name=\"faq.id\"\n                    >\n                        <template #title>\n                            <div class=\"faq-question\">\n                                <i class=\"el-icon-question\"><\/i> {{ faq.question }}\n                            <\/div>\n                        <\/template>\n\n                        <div class=\"faq-answer\" v-html=\"faq.answer\"><\/div>\n                    <\/el-collapse-item>\n                <\/el-collapse>\n            <\/div>\n        <\/main>\n\n    <\/div>\n<\/div>\n\n<script>\n    const { createApp, ref, onMounted, onUnmounted,computed, reactive, watch, nextTick } = Vue;\n    const {ElMessage} = ElementPlus;  \/\/ \u5f15\u5165 Element Plus \u7684 Message\n\n    const app = createApp({\n        setup() {\n            const path = window.location.pathname;\n            const lang = path.includes('\/zh') ? 'zh' : 'en';\n            const apiUrl = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/insurance\/baoxian\/';\n            const quoteApiUrl = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/Enrollment\/quote';\n            const apiStudentEmailExist = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/student\/email\/email_exist';\n            const apiStudentLogin = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/student\/user\/login';\n            const apiStudentMfaVerify = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/auth\/mfa\/verify';\n            const clickAnalyticsUrl = 'https:\/\/agent.goglobalsafe.com\/api\/v1\/analytics\/click';\n            const enrollmentPath = '\/us-enrollment\/';\n            const blogTrackingSource = 'blog';\n            const ageRange = { min: 17, max: 45 };\n            const maxComparePlans = 3;\n            const messages = {\n                zh: {\n                    emailInvalid: '\u8bf7\u8f93\u5165\u6709\u6548\u7684\u90ae\u7bb1\u5730\u5740\u3002',\n                    loginFailedDefault: '\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002',\n                    loginMissingToken: '\u767b\u5f55\u54cd\u5e94\u7f3a\u5c11 token\u3002',\n                    mfaCodeRequired: '\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801\u3002',\n                    mfaFailedDefault: '\u9a8c\u8bc1\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\u3002'\n                },\n                en: {\n                    emailInvalid: 'Please enter a valid email address.',\n                    loginFailedDefault: 'Login failed. Please try again later.',\n                    loginMissingToken: 'Login response is missing token.',\n                    mfaCodeRequired: 'Please enter your verification code.',\n                    mfaFailedDefault: 'Verification failed. Please try again.'\n                }\n            };\n            const blog = ref(null)\n            const pageLoading = ref(true)\n            const loadingCopy = computed(() => lang === 'zh'\n                ? {\n                    pageTitle: '\u6b63\u5728\u52a0\u8f7d',\n                    pageMessage: '\u6b63\u5728\u51c6\u5907\u6587\u7ae0\u548c\u5b66\u6821\u4fdd\u9669\u8ba1\u5212...',\n                    processingTitle: '\u6b63\u5728\u5904\u7406',\n                    processingMessage: '\u8bf7\u7a0d\u5019...'\n                }\n                : {\n                    pageTitle: 'Loading',\n                    pageMessage: 'Preparing the article and school plans...',\n                    processingTitle: 'Processing',\n                    processingMessage: 'Please wait a moment...'\n                }\n            )\n            const loginUser = ref(null)\n            \/\/ \u5b9a\u4e49\u8981\u5339\u914d\u7684\u5206\u5272\u5173\u952e\u8bcd\n            const splitKeyword = \"GGS Exclusive\";\n            \/\/ [\u65b0\u589e] \u5b58\u50a8\u76ee\u5f55\u6811\u7ed3\u6784\n            const tocTree = ref([]);\n            const sidebarRef = ref(null);\n            \/\/ [\u65b0\u589e] \u5f53\u524d\u6fc0\u6d3b\u7684\u951a\u70b9ID (\u7528\u4e8e\u9ad8\u4eae)\n            const activeId = ref('');\n            const products = ref([]);\n            const schoolName = ref('');\n            const schoolIdForPlans = ref('');\n            const schoolSlugForPlans = ref('');\n            const schoolWaive = ref({});\n            const plansLoading = ref(false);\n            const plansError = ref('');\n            const noPlanMessage = ref('');\n            const productQuoteMap = reactive({});\n            const productQuoteLoadingMap = reactive({});\n            const selectedAge = ref(ageRange.min);\n            const nativeDateOfBirth = ref('');\n            const billingCycle = ref('yearly');\n            const viewMore = ref(false);\n            const selectedSeriesOptions = ref({});\n            const selectedForCompare = ref([]);\n            const showCompareModal = ref(false);\n            const planNotice = ref({ message: '', type: 'info' });\n            const loginIntent = ref('unlock');\n            let quoteRequestTimer = null;\n            let quoteRequestSeq = 0;\n            let planNoticeTimer = null;\n\n\n            const activeSection = ref(0);\n            const endTime = ref(null)\n            \/\/ \u5012\u8ba1\u65f6\u903b\u8f91\n            const timer = ref({ days: 0, hours: 0, mins: 0, secs: 0 });\n            let timerInterval = null;\n\n            const updateTimer = () => {\n                const deadline = new Date(endTime.value).getTime();\n                const now = new Date().getTime();\n                const diff = deadline - now;\n\n                if (diff > 0) {\n                    timer.value.days = Math.floor(diff \/ (1000 * 60 * 60 * 24));\n                    timer.value.hours = Math.floor((diff % (1000 * 60 * 60 * 24)) \/ (1000 * 60 * 60));\n                    timer.value.mins = Math.floor((diff % (1000 * 60 * 60)) \/ (1000 * 60));\n                    timer.value.secs = Math.floor((diff % (1000 * 60)) \/ 1000);\n                }\n            };\n\n            const planTranslations = {\n                zh: {\n                    monthly: '\u6309\u6708',\n                    yearly: '\u6309\u5e74',\n                    schoolPrice: '\u8986\u76d6\u671f\u4ef7\u683c',\n                    toggleBilling: '\u5207\u6362\u6309\u6708\u4e0e\u6309\u5e74\u4ef7\u683c',\n                    dob: '\u51fa\u751f\u65e5\u671f',\n                    month: '\u6708',\n                    year: '\u5e74',\n                    select: '\u9009\u62e9\u65b9\u6848',\n                    compare: '\u5bf9\u6bd4',\n                    brochure: '\u7b80\u4ecb',\n                    policy: '\u6761\u6b3e',\n                    medicationGuide: '\u7528\u836f\u6307\u5357',\n                    mostPopular: '\u63a8\u8350',\n                    viewMore: '\u67e5\u770b\u66f4\u591a\u4fdd\u969c',\n                    viewLess: '\u6536\u8d77\u4fdd\u969c',\n                    compareSelected: '\u4e2a\u5df2\u9009\u65b9\u6848',\n                    comparePlans: '\u65b9\u6848\u5bf9\u6bd4',\n                    close: '\u5173\u95ed',\n                    features: '\u4fdd\u969c\u9879',\n                    loadingPlans: '\u6b63\u5728\u52a0\u8f7d\u5b66\u6821\u65b9\u6848...',\n                    noProductsDescription: '\u5f53\u524d\u6587\u7ae0\u7ed1\u5b9a\u5b66\u6821\u6682\u672a\u8fd4\u56de\u53ef\u5c55\u793a\u65b9\u6848\u3002',\n                    fetchErrorDefault: '\u4ea7\u54c1\u6570\u636e\u52a0\u8f7d\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002',\n                    quotePriceUnavailable: '\u62a5\u4ef7\u6682\u65f6\u83b7\u53d6\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002',\n                    availableSoon: '\u8be5\u5185\u5bb9\u6682\u672a\u5f00\u653e',\n                    compareLimitNotice: '\u6700\u591a\u53ef\u540c\u65f6\u5bf9\u6bd4 3 \u4e2a\u65b9\u6848\u3002',\n                    featureLabels: {\n                        annual_maxiumn: '\u6700\u9ad8\u4fdd\u9669\u989d\u5ea6',\n                        deductible_in: '\u514d\u8d54\u989d\uff08\u7f51\u7edc\u5185\uff09',\n                        coinsurance_in: '\u5171\u540c\u4fdd\u9669\uff08\u7f51\u7edc\u5185\uff09',\n                        coinsurance_of: '\u5171\u540c\u4fdd\u9669\uff08\u7f51\u7edc\u5916\uff09',\n                        co_payment_shc: '\u5171\u4ed8\u989d\uff08SHC\uff09',\n                        deductible_in_student_health_center: '\u5b66\u751f\u5065\u5eb7\u4e2d\u5fc3\u514d\u8d54\u989d',\n                        out_of_pocket_maximum_in_network: '\u6700\u9ad8\u81ea\u4ed8\u9650\u989d\uff08\u7f51\u7edc\u5185\uff09',\n                        prescription: '\u5904\u65b9\u836f\uff08\u5171\u4ed8\u989d\uff09',\n                        pre_existing_watiting_period: '\u65e2\u5f80\u75c5\u75c7\u7b49\u5f85\u671f',\n                        preventive_care_in_shc: '\u9884\u9632\u62a4\u7406\uff08\u7f51\u7edc\u5185\/SHC\uff09',\n                        telehealth: '\u8fdc\u7a0b\u533b\u7597',\n                        emergency_medical_evacuation: '\u7d27\u6025\u533b\u7597\u64a4\u79bb',\n                        accidental_death: '\u610f\u5916\u6b7b\u4ea1',\n                        repatriation_of_mortal_remains: '\u9057\u4f53\u9063\u8fd4',\n                        coverage: '\u4fdd\u969c\u8303\u56f4',\n                        network: '\u533b\u7597\u7f51\u7edc'\n                    }\n                },\n                en: {\n                    monthly: 'Monthly',\n                    yearly: 'Yearly',\n                    schoolPrice: 'Coverage Price',\n                    toggleBilling: 'Toggle monthly and coverage pricing',\n                    dob: 'DOB',\n                    month: 'month',\n                    year: 'year',\n                    select: 'Select',\n                    compare: 'Compare',\n                    brochure: 'Brochure',\n                    policy: 'Policy',\n                    medicationGuide: 'Medication Guide',\n                    mostPopular: 'Most Popular',\n                    viewMore: 'View more features',\n                    viewLess: 'View less',\n                    compareSelected: 'Selected Plans',\n                    comparePlans: 'Compare Plans',\n                    close: 'Close',\n                    features: 'Features',\n                    loadingPlans: 'Loading school plans...',\n                    noProductsDescription: 'No plans are available for the school linked to this article.',\n                    fetchErrorDefault: 'Failed to load plans. Please try again later.',\n                    quotePriceUnavailable: 'Quote is temporarily unavailable. Please try again.',\n                    availableSoon: 'Available soon',\n                    compareLimitNotice: 'You can compare up to 3 plans.',\n                    featureLabels: {\n                        annual_maxiumn: 'Annual Maximum',\n                        deductible_in: 'Deductible (in-network)',\n                        coinsurance_in: 'Coinsurance (in-network)',\n                        coinsurance_of: 'Coinsurance (out-of-network)',\n                        co_payment_shc: 'Co-payment (SHC)',\n                        deductible_in_student_health_center: 'Deductible in student health center',\n                        out_of_pocket_maximum_in_network: 'Out of pocket maximum in-network',\n                        prescription: 'Prescription (Co-pay)',\n                        pre_existing_watiting_period: 'Pre-existing waiting period',\n                        preventive_care_in_shc: 'Preventive care (in-network\/SHC)',\n                        telehealth: 'Telehealth',\n                        emergency_medical_evacuation: 'Emergency medical evacuation',\n                        accidental_death: 'Accidental death',\n                        repatriation_of_mortal_remains: 'Repatriation of mortal remains',\n                        coverage: 'Coverage Area',\n                        network: 'Network'\n                    }\n                }\n            };\n\n            const featureDefinition = [\n                { key: 'annual_maxiumn', advanced: false },\n                { key: 'deductible_in', advanced: false },\n                { key: 'coinsurance_in', advanced: false },\n                { key: 'coinsurance_of', advanced: false },\n                { key: 'co_payment_shc', advanced: true },\n                { key: 'deductible_in_student_health_center', advanced: true },\n                { key: 'out_of_pocket_maximum_in_network', advanced: true },\n                { key: 'prescription', advanced: true },\n                { key: 'pre_existing_watiting_period', advanced: true },\n                { key: 'preventive_care_in_shc', advanced: true },\n                { key: 'telehealth', advanced: true },\n                { key: 'emergency_medical_evacuation', advanced: true },\n                { key: 'accidental_death', advanced: true },\n                { key: 'repatriation_of_mortal_remains', advanced: true },\n                { key: 'coverage', advanced: true },\n                { key: 'network', advanced: true }\n            ];\n\n            const compareOnlyFeatureDefinition = [\n                { key: 'immunization_vaccines_and_test' },\n                { key: 'copay_primary_care' },\n                { key: 'copay_specialist' },\n                { key: 'copay_urgent_care' },\n                { key: 'copay_emergency_room' },\n                { key: 'copay_lab_and_xray' },\n                { key: 'copay_physical_therapy' },\n                { key: 'allergy_testing_treatment' },\n                { key: 'rx_generic' },\n                { key: 'rx_brand' },\n                { key: 'rx_non_preferred' },\n                { key: 'rx_specialty' },\n                { key: 'hospitalization_inpatient' },\n                { key: 'copay_outpatient_surgery' },\n                { key: 'ambulance_coverage' },\n                { key: 'mental_health_outpatient' },\n                { key: 'mental_health_inpatient' }\n            ];\n\n            const planCopy = computed(() => planTranslations[lang] || planTranslations.en);\n\n            const allFeatures = computed(() => featureDefinition.map((feature) => ({\n                ...feature,\n                label: planCopy.value.featureLabels[feature.key] || feature.key\n            })));\n\n            const visibleFeatures = computed(() => (\n                allFeatures.value.filter((feature) => viewMore.value || !feature.advanced)\n            ));\n\n            const blogPlanEmbedRef = ref(null);\n\n            const featureHelpText = {\n                annual_maxiumn: 'The highest amount the plan pays for covered services during the policy year.',\n                deductible_in: 'The amount you pay for in-network covered care before the plan starts sharing costs.',\n                coinsurance_in: 'The percentage of covered in-network costs you share after the deductible is met.',\n                coinsurance_of: 'The percentage of covered out-of-network costs you share after the deductible is met.',\n                co_payment_shc: 'A fixed amount you pay for services at the Student Health Center.',\n                deductible_in_student_health_center: 'The deductible that applies specifically to Student Health Center services.',\n                out_of_pocket_maximum_in_network: 'The most you will pay for covered in-network care in the policy year.',\n                prescription: 'How prescription drugs are covered and what you may pay for each tier.',\n                pre_existing_watiting_period: 'How long the plan may wait before covering conditions that existed before the policy started.',\n                preventive_care_in_shc: 'Routine exams, screenings, vaccines, and other preventive services.',\n                telehealth: 'Remote medical visits by phone or video.',\n                emergency_medical_evacuation: 'Transport to the right medical facility when local treatment is not available.',\n                accidental_death: 'The benefit paid if death results from a covered accident.',\n                repatriation_of_mortal_remains: 'The cost of returning a deceased student to their home country.',\n                coverage: 'The countries, regions, or service areas included in the plan.',\n                network: 'The doctors, hospitals, and clinics that the plan treats as in-network providers.'\n            };\n\n            const tierGuideFeatureKeys = new Set(['coinsurance_in', 'coinsurance_of']);\n            const tierGuideText = [\n                '[Tier 1] USC Designated Providers',\n                '[Tier 2] In-Network Providers'\n            ].join('\\n');\n            const hasTierNotation = (value) => \/\\bT\\s*[1-4]\\b\/i.test(String(value || ''));\n            const hasTierGuideNotation = (value) => \/\\bT\\s*[12]\\b\/i.test(String(value || ''));\n\n            const hoverFeatureHelpKey = ref('');\n            const pinnedFeatureHelpKey = ref('');\n\n            const activeFeatureHelpId = computed(() => hoverFeatureHelpKey.value || pinnedFeatureHelpKey.value);\n\n            const getFeatureHelpId = (scope, featureKey, planKey = '') => [scope, planKey, featureKey].filter(Boolean).join(':');\n\n            const getFeatureHelp = (featureKey, referenceValue = '', forceTierGuide = false) => {\n                const normalizedKey = String(featureKey || '');\n                const baseHelp = featureHelpText[normalizedKey] || '';\n                const needsTierGuide = forceTierGuide || hasTierGuideNotation(referenceValue);\n                const helpParts = [];\n\n                if (baseHelp) {\n                    helpParts.push(baseHelp);\n                }\n\n                if (needsTierGuide && tierGuideFeatureKeys.has(normalizedKey)) {\n                    helpParts.push(tierGuideText);\n                }\n\n                return helpParts.join('\\n\\n');\n            };\n\n            const setFeatureHelpHover = (helpId) => {\n                if (!helpId) {\n                    return;\n                }\n                hoverFeatureHelpKey.value = helpId;\n            };\n\n            const clearFeatureHelpHover = (helpId) => {\n                if (hoverFeatureHelpKey.value === helpId) {\n                    hoverFeatureHelpKey.value = '';\n                }\n            };\n\n            const toggleFeatureHelp = (helpId) => {\n                if (!helpId) {\n                    return;\n                }\n\n                if (pinnedFeatureHelpKey.value === helpId) {\n                    pinnedFeatureHelpKey.value = '';\n                    hoverFeatureHelpKey.value = '';\n                    return;\n                }\n\n                pinnedFeatureHelpKey.value = helpId;\n                hoverFeatureHelpKey.value = helpId;\n            };\n\n            const clearFeatureHelp = () => {\n                hoverFeatureHelpKey.value = '';\n                pinnedFeatureHelpKey.value = '';\n            };\n\n            const handleBlogPlanDocumentClick = (event) => {\n                const target = event?.target;\n                if (target instanceof Element) {\n                    const trackedLink = target.closest('a[data-blog-tracking=\"school-plan-link\"]');\n                    if (trackedLink) {\n                        trackBlogClick('blog_school_plan_link_click', {\n                            element_key: 'blog_school_plan_link',\n                            element_text: String(trackedLink.textContent || '').trim() || 'school plan link',\n                            extra: buildBlogTrackingMeta({\n                                target_url: trackedLink.getAttribute('href') || '',\n                                school_slug: trackedLink.getAttribute('data-school-slug') || null,\n                                school_name: trackedLink.getAttribute('data-school-name') || null,\n                                entry_point: 'article_content',\n                            })\n                        }, event);\n                    }\n                }\n\n                if (!pinnedFeatureHelpKey.value) {\n                    return;\n                }\n\n                const root = blogPlanEmbedRef.value;\n                if (root && target instanceof Node && !root.contains(target)) {\n                    clearFeatureHelp();\n                }\n            };\n\n            \/\/ \u6eda\u52a8\u5b9a\u4f4d\u903b\u8f91\n            const scrollTo = (index) => {\n                activeSection.value = index;\n                const el = document.getElementById(`section-${index}`);\n                if (el) {\n                    \/\/ \u51cf\u53bb header \u9ad8\u5ea6\n                    const top = el.getBoundingClientRect().top + window.scrollY - 120;\n                    window.scrollTo({ top: top, behavior: 'smooth' });\n                }\n            };\n            \/**\n             * \u5c06 \"Aug 20, 2025\" \u8f6c\u6362\u4e3a \"2025-08-20\"\n             * @param {string} dateStr\n             * @returns {string}\n             *\/\n            function formatDate(dateStr) {\n                const date = new Date(dateStr);\n\n                \/\/ \u68c0\u67e5\u65e5\u671f\u662f\u5426\u6709\u6548\n                if (isNaN(date.getTime())) {\n                    return \"Invalid Date\";\n                }\n\n                const year = date.getFullYear();\n                \/\/ getMonth() \u8fd4\u56de 0-11\uff0c\u6240\u4ee5\u9700\u8981 +1\uff0c\u5e76\u8865\u96f6\n                const month = String(date.getMonth() + 1).padStart(2, '0');\n                const day = String(date.getDate()).padStart(2, '0');\n\n                return `${year}-${month}-${day}`;\n            }\n\n            const getCurrentBlogId = () => {\n                const candidates = [\n                    blog?.value?.id,\n                    window.currentBlogId,\n                    getQueryParam('id'),\n                    getQueryParam('blog_id'),\n                ];\n                for (const candidate of candidates) {\n                    const value = String(candidate || '').trim();\n                    if (\/^\\d+$\/.test(value)) {\n                        return value;\n                    }\n                }\n                return '';\n            };\n\n            const normalizeSchoolSlug = (value) => {\n                const raw = String(value || '').trim();\n                if (!raw) return '';\n\n                return raw\n                    .toLowerCase()\n                    .replace(\/https?:\\\/\\\/[^\/]+\/i, '')\n                    .replace(\/^\\\/+|\\\/+$\/g, '')\n                    .replace(\/^schools\\\/\/i, '')\n                    .replace(\/\\\/+$\/g, '')\n                    .replace(\/[^a-z0-9\\u4e00-\\u9fa5]+\/g, '-')\n                    .replace(\/-+\/g, '-')\n                    .replace(\/^-+|-+$\/g, '');\n            };\n\n            const getSchoolSlugForBlog = () => {\n                const school = blog?.value?.school || {};\n                const candidates = [\n                    blog?.value?.school_slug,\n                    school.slug,\n                    school.school_slug,\n                    school.schoolSlug,\n                    school.slug_name,\n                    school.name,\n                    school.school_name,\n                    school.title,\n                ];\n\n                for (const candidate of candidates) {\n                    const slug = normalizeSchoolSlug(candidate);\n                    if (slug) {\n                        return slug;\n                    }\n                }\n\n                return '';\n            };\n\n            const appendBlogTrackingParams = (searchParams) => {\n                searchParams.set('source', blogTrackingSource);\n                searchParams.set('source_institution', blogTrackingSource);\n\n                const blogId = getCurrentBlogId();\n                if (blogId) {\n                    searchParams.set('blog_id', blogId);\n                }\n\n                return searchParams;\n            };\n\n            const buildSchoolPlanUrl = () => {\n                const schoolSlug = getSchoolSlugForBlog();\n                if (!schoolSlug) {\n                    return '';\n                }\n\n                const url = new URL(`\/schools\/${encodeURIComponent(schoolSlug)}\/`, window.location.origin);\n                appendBlogTrackingParams(url.searchParams);\n\n                return `${url.pathname}${url.search}${url.hash}`;\n            };\n\n            const getSchoolIdForBlog = () => {\n                const school = blog?.value?.school || {};\n                const candidates = [\n                    blog?.value?.school_id,\n                    blog?.value?.schoole_id,\n                    school.id,\n                    school.school_id,\n                    school.schoole_id,\n                    school.schoolId\n                ];\n\n                for (const candidate of candidates) {\n                    const value = String(candidate || '').trim();\n                    if (value) {\n                        return value;\n                    }\n                }\n\n                return '';\n            };\n\n            const blogSchoolContext = computed(() => ({\n                slug: getSchoolSlugForBlog(),\n                id: getSchoolIdForBlog()\n            }));\n\n            const normalizeHeadingText = (value) => String(value || '')\n                .replace(\/\\s+\/g, ' ')\n                .replace(\/^\\s*\\d+\\s*[.)-]?\\s*\/, '')\n                .trim()\n                .toLowerCase();\n\n            const isPlanHeading = (node) => {\n                if (!node || !\/^H[1-6]$\/.test(node.tagName || '')) {\n                    return false;\n                }\n                return normalizeHeadingText(node.textContent) === 'how to choose the right goglobalsafe plan?';\n            };\n\n            const getVisibleBlogHtml = () => {\n                if (!blog.value || !blog.value.content) {\n                    return '';\n                }\n\n                if (loginUser.value) {\n                    return rewriteBlogContentLinks(blog.value.content);\n                }\n\n                const content = blog.value.content;\n                const index = content.indexOf(splitKeyword);\n                return rewriteBlogContentLinks(index !== -1 ? content.substring(0, index) : content);\n            };\n\n            const injectPlanEmbedIntoHtml = (html) => {\n                const hasSchoolContext = Boolean(blogSchoolContext.value.slug || blogSchoolContext.value.id);\n                if (!html || !hasSchoolContext) {\n                    return {\n                        before: html || '',\n                        after: '',\n                        tocHtml: html || '',\n                        showPlanEmbed: false\n                    };\n                }\n\n                try {\n                    const wrapper = document.createElement('div');\n                    wrapper.innerHTML = html;\n                    const headings = Array.from(wrapper.querySelectorAll('h1, h2, h3, h4, h5, h6'));\n                    const targetHeading = headings.find(isPlanHeading);\n\n                    if (!targetHeading) {\n                        return {\n                            before: html,\n                            after: '',\n                            tocHtml: html,\n                            showPlanEmbed: false\n                        };\n                    }\n\n                    const currentLevel = Number(targetHeading.tagName.substring(1));\n                    const targetHeadingIndex = headings.indexOf(targetHeading);\n                    const boundaryHeading = headings\n                        .slice(targetHeadingIndex + 1)\n                        .find((heading) => Number(heading.tagName.substring(1)) <= currentLevel);\n\n                    const marker = document.createElement('div');\n                    marker.setAttribute('data-ggs-blog-plan-anchor', '1');\n                    if (boundaryHeading && boundaryHeading.parentNode) {\n                        boundaryHeading.parentNode.insertBefore(marker, boundaryHeading);\n                    } else {\n                        wrapper.appendChild(marker);\n                    }\n\n                    const markerHtml = '<div data-ggs-blog-plan-anchor=\"1\"><\/div>';\n                    const resultHtml = wrapper.innerHTML;\n                    const markerIndex = resultHtml.indexOf(markerHtml);\n                    if (markerIndex === -1) {\n                        return {\n                            before: resultHtml,\n                            after: '',\n                            tocHtml: resultHtml,\n                            showPlanEmbed: true\n                        };\n                    }\n\n                    return {\n                        before: resultHtml.substring(0, markerIndex),\n                        after: resultHtml.substring(markerIndex + markerHtml.length),\n                        tocHtml: resultHtml.replace(markerHtml, ''),\n                        showPlanEmbed: true\n                    };\n                } catch (error) {\n                    return {\n                        before: html,\n                        after: '',\n                        tocHtml: html,\n                        showPlanEmbed: false\n                    };\n                }\n            };\n\n            const blogContentParts = computed(() => injectPlanEmbedIntoHtml(getVisibleBlogHtml()));\n\n            const showPlanNotice = (message, type = 'info') => {\n                planNotice.value = { message, type };\n                if (planNoticeTimer) {\n                    clearTimeout(planNoticeTimer);\n                }\n                planNoticeTimer = setTimeout(() => {\n                    planNotice.value = { message: '', type: 'info' };\n                }, 2600);\n            };\n\n            const getHttpClient = () => {\n                if (window.apiClient && typeof window.apiClient.post === 'function' && typeof window.apiClient.get === 'function') {\n                    return window.apiClient;\n                }\n                const fallbackClient = axios.create({\n                    headers: {\n                        'X-Authentication-Key': ' HSxZK8nHniLzZtv0Qtfk87wvNvXpJZ5K',\n                        'Accept': 'application\/json'\n                    }\n                });\n                fallbackClient.interceptors.request.use((config) => {\n                    const token = localStorage.getItem('student_token');\n                    if (token) {\n                        config.headers.Authorization = `Bearer ${token}`;\n                    }\n                    return config;\n                });\n                return fallbackClient;\n            };\n\n            const buildBlogTrackingMeta = (extra = {}) => {\n                const blogId = getCurrentBlogId();\n                const schoolContext = blogSchoolContext.value || {};\n                const schoolSlug = String(schoolSlugForPlans.value || schoolContext.slug || '').trim();\n                const schoolId = String(schoolIdForPlans.value || schoolContext.id || '').trim();\n                const blogTitle = String(blog?.value?.title || '').trim();\n                const merged = {\n                    source_institution: blogTrackingSource,\n                    blog_id: blogId || null,\n                    blog_title: blogTitle || null,\n                    school_slug: schoolSlug || null,\n                    school_id: schoolId || null,\n                    ...extra,\n                };\n\n                return Object.fromEntries(\n                    Object.entries(merged).filter(([, value]) => value !== undefined && value !== '')\n                );\n            };\n\n            const buildPlanTrackingMeta = (product) => {\n                const targetProduct = product?.rawProduct || product || {};\n                const planId = String(targetProduct.id || '').trim();\n                const planName = String(targetProduct.name || targetProduct.compareName || '').trim();\n                const planCode = String(targetProduct.plan_code || targetProduct.planCode || '').trim();\n                const extra = typeof product === 'object' && product !== null ? { ...product } : {};\n                delete extra.rawProduct;\n\n                return buildBlogTrackingMeta({\n                    ...extra,\n                    plan_id: planId || null,\n                    plan_name: planName || null,\n                    plan_code: planCode || null,\n                });\n            };\n\n            const recordClickLog = async (payload, preferKeepalive = false) => {\n                if (preferKeepalive && window.fetch) {\n                    window.fetch(clickAnalyticsUrl, {\n                        method: 'POST',\n                        headers: {\n                            'Content-Type': 'application\/json',\n                            'Accept': 'application\/json'\n                        },\n                        body: JSON.stringify(payload),\n                        keepalive: true,\n                        credentials: 'omit'\n                    }).catch(() => {});\n                    return;\n                }\n\n                try {\n                    await getHttpClient().post(clickAnalyticsUrl, payload);\n                } catch (error) {\n                    console.warn('Blog click tracking failed:', error);\n                }\n            };\n\n            const trackBlogClick = async (featureName, options = {}, domEvent = null) => {\n                const payload = {\n                    source: blogTrackingSource,\n                    feature_name: featureName,\n                    page_url: window.location.href,\n                    page_path: window.location.pathname,\n                    element_key: options.element_key || null,\n                    element_text: options.element_text || null,\n                    click_x: domEvent?.clientX ?? null,\n                    click_y: domEvent?.clientY ?? null,\n                    viewport_width: window.innerWidth || null,\n                    viewport_height: window.innerHeight || null,\n                    clicked_at: new Date().toISOString(),\n                    extra: buildBlogTrackingMeta(options.extra || {}),\n                };\n\n                return recordClickLog(payload, options.prefer_keepalive === true);\n            };\n\n            const getClientId = () => {\n                const gaCookie = document.cookie.split(';').find((cookie) => cookie.trim().startsWith('_ga='));\n                if (!gaCookie) {\n                    return null;\n                }\n                const parts = gaCookie.split('.');\n                return parts.length >= 4 ? `${parts[2]}.${parts[3]}` : null;\n            };\n\n            const parseCoverageDate = (value) => {\n                const text = String(value || '').trim();\n                if (!text) {\n                    return null;\n                }\n                const normalized = text.replace(\/\\.\/g, '-').replace(\/\\\/\/g, '-');\n                const matched = normalized.match(\/^(\\d{4})-(\\d{1,2})-(\\d{1,2})$\/);\n                if (matched) {\n                    const parsed = new Date(Number(matched[1]), Number(matched[2]) - 1, Number(matched[3]));\n                    return Number.isNaN(parsed.getTime()) ? null : parsed;\n                }\n                const fallback = new Date(text);\n                return Number.isNaN(fallback.getTime())\n                    ? null\n                    : new Date(fallback.getFullYear(), fallback.getMonth(), fallback.getDate());\n            };\n\n            const formatQuoteDate = (value) => {\n                const parsed = value instanceof Date ? value : parseCoverageDate(value);\n                if (!parsed) {\n                    return '';\n                }\n                const year = parsed.getFullYear();\n                const month = String(parsed.getMonth() + 1).padStart(2, '0');\n                const day = String(parsed.getDate()).padStart(2, '0');\n                return `${year}-${month}-${day}`;\n            };\n\n            const addMonthsToDate = (date, months) => {\n                const next = new Date(date.getTime());\n                const currentDate = next.getDate();\n                next.setMonth(next.getMonth() + months);\n                if (next.getDate() !== currentDate) {\n                    next.setDate(0);\n                }\n                return next;\n            };\n\n            const todayIso = computed(() => formatQuoteDate(new Date()));\n\n            const useSchoolRequiredPricing = computed(() => {\n                const coverageStart = parseCoverageDate(schoolWaive.value.coverage_start_date);\n                const coverageEnd = parseCoverageDate(schoolWaive.value.coverage_end_date);\n                return Boolean(coverageStart && coverageEnd && coverageEnd >= coverageStart);\n            });\n\n            const billingToggleSecondaryLabel = computed(() => (\n                useSchoolRequiredPricing.value ? planCopy.value.schoolPrice : planCopy.value.yearly\n            ));\n\n            const billingPriceUnitLabel = computed(() => {\n                if (billingCycle.value === 'monthly') {\n                    return planCopy.value.month;\n                }\n                return useSchoolRequiredPricing.value ? '' : planCopy.value.year;\n            });\n\n            const getFallbackQuoteCoverageDates = () => {\n                const start = new Date();\n                start.setHours(0, 0, 0, 0);\n                start.setDate(start.getDate() + 1);\n                const end = billingCycle.value === 'monthly'\n                    ? new Date(start.getTime() + (29 * 86400000))\n                    : addMonthsToDate(start, 12);\n                if (billingCycle.value !== 'monthly') {\n                    end.setDate(end.getDate() - 1);\n                }\n                return {\n                    start: formatQuoteDate(start),\n                    end: formatQuoteDate(end)\n                };\n            };\n\n            const getQuoteCoverageDates = () => {\n                const schoolStart = formatQuoteDate(schoolWaive.value.coverage_start_date);\n                const schoolEnd = formatQuoteDate(schoolWaive.value.coverage_end_date);\n                if (schoolStart && schoolEnd) {\n                    return { start: schoolStart, end: schoolEnd };\n                }\n                return getFallbackQuoteCoverageDates();\n            };\n\n            const getCoverageDayCount = () => {\n                const coverageDates = getQuoteCoverageDates();\n                const start = parseCoverageDate(coverageDates.start);\n                const end = parseCoverageDate(coverageDates.end);\n                if (!start || !end || end < start) {\n                    return 0;\n                }\n                return Math.round((end - start) \/ 86400000) + 1;\n            };\n\n            const normalizeQuoteValue = (value) => String(value || '').trim();\n\n            const getProductQuoteKey = (product) => {\n                const targetProduct = product?.rawProduct || product || {};\n                return String(\n                    targetProduct.id\n                    || targetProduct.plan_code\n                    || targetProduct.planCode\n                    || targetProduct.name\n                    || ''\n                ).trim();\n            };\n\n            const getQuoteSignature = () => [\n                getQuoteCoverageDates().start,\n                getQuoteCoverageDates().end,\n                billingCycle.value,\n                nativeDateOfBirth.value || ''\n            ].join('|');\n\n            const getProductQuoteEntry = (product) => {\n                const key = getProductQuoteKey(product);\n                if (!key || !productQuoteMap[key]) {\n                    return null;\n                }\n                return productQuoteMap[key].quote_signature === getQuoteSignature()\n                    ? productQuoteMap[key]\n                    : null;\n            };\n\n            const toMoneyNumber = (value) => {\n                const amount = Number(value);\n                return Number.isFinite(amount) && amount > 0 ? Math.round(amount * 100) \/ 100 : null;\n            };\n\n            const getQuotePrimaryPrice = (product) => {\n                const entry = product?.quotePremiums || getProductQuoteEntry(product);\n                return toMoneyNumber(\n                    entry?.primary_price\n                    ?? entry?.primaryPrice\n                    ?? entry?.primary\n                    ?? entry?.total_price\n                    ?? entry?.totalPrice\n                );\n            };\n\n            const getProductMonthlyPrice = (product) => {\n                const targetProduct = product?.rawProduct || product || {};\n                return toMoneyNumber(\n                    targetProduct.monthly_price\n                    ?? targetProduct.monthlyPrice\n                    ?? targetProduct.monthly\n                    ?? targetProduct.price_per_month\n                    ?? targetProduct.pricePerMonth\n                );\n            };\n\n            const getProductYearlyPrice = (product) => {\n                const monthlyPrice = getProductMonthlyPrice(product);\n                return Number.isFinite(monthlyPrice) && monthlyPrice > 0\n                    ? Math.round(monthlyPrice * 12 * 100) \/ 100\n                    : null;\n            };\n\n            const getQuotePlanPayload = (product) => {\n                const targetProduct = product?.rawProduct || product || {};\n                const planId = normalizeQuoteValue(\n                    targetProduct.id\n                    || targetProduct.product_id\n                    || targetProduct.productId\n                    || targetProduct.plan_id\n                    || targetProduct.planId\n                );\n                const planCode = normalizeQuoteValue(\n                    targetProduct.plan_code\n                    || targetProduct.planCode\n                    || targetProduct.code\n                    || targetProduct.product_code\n                    || targetProduct.productCode\n                );\n                if (planId) {\n                    return { plan_id: Number(planId) || planId };\n                }\n                if (planCode) {\n                    return { plan_code: planCode };\n                }\n                return null;\n            };\n\n            const requestSingleProductQuote = async (product, requestSignature) => {\n                const targetProduct = product?.rawProduct || product || {};\n                const quoteKey = getProductQuoteKey(targetProduct);\n                const planPayload = getQuotePlanPayload(targetProduct);\n                const coverageDates = getQuoteCoverageDates();\n                if (!quoteKey || !planPayload || !coverageDates.start || !coverageDates.end) {\n                    if (quoteKey) {\n                        delete productQuoteMap[quoteKey];\n                    }\n                    return null;\n                }\n\n                productQuoteLoadingMap[quoteKey] = true;\n                try {\n                    const response = await getHttpClient().post(quoteApiUrl, {\n                        ...planPayload,\n                        coverageStartDate: coverageDates.start,\n                        coverageEndDate: coverageDates.end,\n                        dob: nativeDateOfBirth.value || '',\n                        spouse: false,\n                        dependents: 0\n                    }, {\n                        headers: {\n                            Accept: 'application\/json',\n                            'X-Authentication-Key': 'HSxZK8nHniLzZtv0Qtfk87wvNvXpJZ5K'\n                        }\n                    });\n                    const quoteData = response?.data?.data || {};\n                    const premiums = quoteData.application_premiums || {};\n                    if (!response?.data?.success || !premiums) {\n                        throw new Error(response?.data?.message || 'Quote failed.');\n                    }\n                    productQuoteMap[quoteKey] = {\n                        ...premiums,\n                        product_id: quoteData.product_id ?? targetProduct.id,\n                        plan_code: quoteData.plan_code ?? targetProduct.plan_code,\n                        product_name: quoteData.product_name ?? targetProduct.name,\n                        quote_signature: requestSignature\n                    };\n                    return productQuoteMap[quoteKey];\n                } catch (error) {\n                    delete productQuoteMap[quoteKey];\n                    return null;\n                } finally {\n                    productQuoteLoadingMap[quoteKey] = false;\n                }\n            };\n\n            const filteredProducts = computed(() => products.value.map((product) => ({\n                ...product,\n                quotePremiums: getProductQuoteEntry(product),\n                currentPrice: getQuotePrimaryPrice(product)\n            })));\n\n            const noPlanDisplayMessage = computed(() => (\n                noPlanMessage.value ? String(noPlanMessage.value).trim() : planCopy.value.noProductsDescription\n            ));\n\n            const normalizePlanName = (name) => String(name || '').replace(\/\\s+\/g, ' ').trim();\n            const seriesPlusOption = 'plus';\n\n            const getSeriesOptionValue = (name) => {\n                const normalizedName = normalizePlanName(name);\n                const numberMatch = normalizedName.match(\/^(.*?)(?:\\s+)(\\d+)$\/);\n                if (numberMatch) {\n                    return Number(numberMatch[2]);\n                }\n                const plusMatch = normalizedName.match(\/^(.*?)(?:\\s+)(plus)$\/i);\n                return plusMatch ? seriesPlusOption : null;\n            };\n\n            const getSeriesBaseName = (name) => {\n                const normalizedName = normalizePlanName(name);\n                const numberMatch = normalizedName.match(\/^(.*?)(?:\\s+)(\\d+)$\/);\n                if (numberMatch) {\n                    return normalizePlanName(numberMatch[1]);\n                }\n                const plusMatch = normalizedName.match(\/^(.*?)(?:\\s+)(plus)$\/i);\n                if (plusMatch) {\n                    return normalizePlanName(plusMatch[1]);\n                }\n                return normalizedName;\n            };\n\n            const getSeriesKey = (name) => {\n                const baseName = getSeriesBaseName(name);\n                return baseName\n                    ? baseName.toLowerCase().replace(\/[^a-z0-9]+\/g, '-').replace(\/^-|-$\/g, '')\n                    : null;\n            };\n\n            const isSeriesPlusOption = (option) => String(option || '').toLowerCase() === seriesPlusOption;\n            const getSeriesOptionLabel = (option) => (isSeriesPlusOption(option) ? 'Plus' : `$${option}`);\n            const getSeriesCompareName = (baseName, option) => (\n                isSeriesPlusOption(option) ? `${baseName} Plus` : `${baseName} ${option}`\n            );\n\n            const sortSeriesOptions = (a, b) => {\n                if (isSeriesPlusOption(a)) return isSeriesPlusOption(b) ? 0 : -1;\n                if (isSeriesPlusOption(b)) return 1;\n                return Number(a) - Number(b);\n            };\n\n            const findSeriesOption = (options, value) => {\n                const normalizedValue = String(value ?? '').toLowerCase();\n                return options.find((option) => String(option).toLowerCase() === normalizedValue);\n            };\n\n            const getDefaultSeriesOption = (group, options = []) => {\n                if (!Array.isArray(options) || !options.length) {\n                    return null;\n                }\n                if (\/\\broyal\\b\/i.test(String(group?.baseName || ''))) {\n                    const preferredRoyalOption = findSeriesOption(options, 500);\n                    if (preferredRoyalOption !== undefined) {\n                        return preferredRoyalOption;\n                    }\n                }\n                return options[0];\n            };\n\n            const collectSeriesGroups = (productList) => {\n                const groups = new Map();\n                productList.forEach((product, index) => {\n                    const optionValue = getSeriesOptionValue(product.name);\n                    const baseName = getSeriesBaseName(product.name);\n                    const seriesKey = getSeriesKey(product.name);\n                    if (optionValue === null || !baseName || !seriesKey) {\n                        return;\n                    }\n                    if (!groups.has(seriesKey)) {\n                        groups.set(seriesKey, {\n                            baseName,\n                            seriesKey,\n                            firstIndex: index,\n                            optionMap: new Map(),\n                            options: [],\n                            hasNumericOption: false\n                        });\n                    }\n                    const group = groups.get(seriesKey);\n                    if (!group.optionMap.has(optionValue)) {\n                        group.optionMap.set(optionValue, product);\n                        group.options.push(optionValue);\n                    }\n                    if (!isSeriesPlusOption(optionValue)) {\n                        group.hasNumericOption = true;\n                    }\n                    if (index < group.firstIndex) {\n                        group.firstIndex = index;\n                    }\n                });\n                groups.forEach((group, key) => {\n                    if (!group.hasNumericOption) {\n                        groups.delete(key);\n                        return;\n                    }\n                    group.options.sort(sortSeriesOptions);\n                });\n                return groups;\n            };\n\n            const planCards = computed(() => {\n                const cards = [];\n                const insertedSeries = new Set();\n                const seriesGroups = collectSeriesGroups(filteredProducts.value);\n\n                const pushStandalonePlanCard = (product, compareId = '') => {\n                    cards.push({\n                        ...product,\n                        compareName: normalizePlanName(product.name),\n                        compareId: String(compareId || product.id),\n                        rawProduct: product,\n                        hasOptionTabs: false,\n                        optionTabs: [],\n                        selectedOption: null,\n                        seriesKey: '',\n                        isPopular: false\n                    });\n                };\n\n                const pushSeriesGroupCard = (group, optionList, seriesKey) => {\n                    const availableOptions = optionList.filter((option) => group.optionMap.has(option));\n                    if (!availableOptions.length) {\n                        return;\n                    }\n                    if (availableOptions.length === 1) {\n                        const onlyOption = availableOptions[0];\n                        const onlyProduct = group.optionMap.get(onlyOption);\n                        if (onlyProduct) {\n                            pushStandalonePlanCard(onlyProduct, `${seriesKey}-${onlyOption}`);\n                        }\n                        return;\n                    }\n                    const defaultOption = getDefaultSeriesOption(group, availableOptions) ?? availableOptions[0];\n                    const selectedOption = findSeriesOption(availableOptions, selectedSeriesOptions.value[seriesKey]) ?? defaultOption;\n                    const selectedVariant = group.optionMap.get(selectedOption) || group.optionMap.get(defaultOption);\n                    cards.push({\n                        ...selectedVariant,\n                        name: group.baseName,\n                        compareName: getSeriesCompareName(group.baseName, selectedOption),\n                        compareId: `${seriesKey}-${selectedOption}`,\n                        rawProduct: selectedVariant,\n                        hasOptionTabs: true,\n                        optionTabs: availableOptions,\n                        selectedOption,\n                        seriesKey,\n                        isPopular: false\n                    });\n                };\n\n                const getBasePlanCardCount = () => {\n                    let count = 0;\n                    const countedSeries = new Set();\n\n                    filteredProducts.value.forEach((product) => {\n                        const seriesKey = getSeriesKey(product.name);\n                        const optionValue = getSeriesOptionValue(product.name);\n                        const group = seriesKey && optionValue !== null ? seriesGroups.get(seriesKey) : null;\n\n                        if (group) {\n                            if (countedSeries.has(seriesKey)) {\n                                return;\n                            }\n                            const plusOption = group.options.find((option) => isSeriesPlusOption(option));\n                            const numericOptions = group.options.filter((option) => !isSeriesPlusOption(option));\n                            count += plusOption && numericOptions.length ? 2 : 1;\n                            countedSeries.add(seriesKey);\n                            return;\n                        }\n\n                        count += 1;\n                    });\n\n                    return count;\n                };\n\n                const basePlanCardCount = getBasePlanCardCount();\n\n                filteredProducts.value.forEach((product) => {\n                    const seriesKey = getSeriesKey(product.name);\n                    const optionValue = getSeriesOptionValue(product.name);\n                    const group = seriesKey && optionValue !== null ? seriesGroups.get(seriesKey) : null;\n\n                    if (group && insertedSeries.has(seriesKey)) {\n                        return;\n                    }\n\n                if (group) {\n                    const plusOption = group.options.find((option) => isSeriesPlusOption(option));\n                    const numericOptions = group.options.filter((option) => !isSeriesPlusOption(option));\n                    if (plusOption && numericOptions.length) {\n                        const plusProduct = group.optionMap.get(plusOption);\n                        if (plusProduct) {\n                            pushStandalonePlanCard(plusProduct, `${seriesKey}-${plusOption}`);\n                        }\n                        if (basePlanCardCount === 2 && numericOptions.length > 1) {\n                            const firstNumericOption = numericOptions[0];\n                            const firstNumericProduct = group.optionMap.get(firstNumericOption);\n                            if (firstNumericProduct) {\n                                pushStandalonePlanCard(firstNumericProduct, `${seriesKey}-${firstNumericOption}`);\n                            }\n                            pushSeriesGroupCard(group, numericOptions.slice(1), seriesKey);\n                        } else {\n                            pushSeriesGroupCard(group, numericOptions, seriesKey);\n                        }\n                    } else {\n                        pushSeriesGroupCard(group, group.options, seriesKey);\n                    }\n                    insertedSeries.add(seriesKey);\n                    return;\n                    }\n\n                    pushStandalonePlanCard(product);\n                });\n\n                if (cards.length) {\n                    cards[0].isPopular = true;\n                }\n                return cards;\n            });\n\n            const selectedCompareProducts = computed(() => {\n                const productMap = new Map(planCards.value.map((product) => [String(product.compareId), product]));\n                return selectedForCompare.value\n                    .map((id) => productMap.get(id))\n                    .filter(Boolean);\n            });\n\n            const compareSlots = computed(() => {\n                const slots = selectedCompareProducts.value.slice(0, maxComparePlans);\n                while (slots.length < maxComparePlans) {\n                    slots.push(null);\n                }\n                return slots;\n            });\n\n            const compareFeatures = computed(() => {\n                const sourceProducts = selectedCompareProducts.value.length ? selectedCompareProducts.value : planCards.value;\n                return [\n                    ...allFeatures.value,\n                    ...compareOnlyFeatureDefinition.map((feature) => ({\n                        ...feature,\n                        label: planCopy.value.featureLabels[feature.key] || feature.key\n                    }))\n                ].filter((feature) => sourceProducts.some((product) => getFeatureDisplay(product, feature.key) !== '-'));\n            });\n\n            const formatCurrencyFeatureValue = (value) => {\n                const text = String(value ?? '').trim();\n                if (!text || \/^\\$\/.test(text)) {\n                    return text;\n                }\n                const numericValue = Number(text.replace(\/,\/g, ''));\n                if (!Number.isFinite(numericValue)) {\n                    return text;\n                }\n                return `$${numericValue.toLocaleString('en-US', {\n                    minimumFractionDigits: Number.isInteger(numericValue) ? 0 : 2,\n                    maximumFractionDigits: 2\n                })}`;\n            };\n\n            const percentageLikeFeatureKeys = new Set([\n                'coinsurance_in',\n                'coinsurance_of',\n                'preventive_care_in_shc',\n                'hospitalization_inpatient',\n                'copay_outpatient_surgery',\n                'ambulance_coverage',\n                'mental_health_outpatient',\n                'mental_health_inpatient'\n            ]);\n\n            const formatPercentageFeatureValue = (value) => {\n                const numericValue = Number(value);\n                if (!Number.isFinite(numericValue)) {\n                    return String(value ?? '').trim();\n                }\n                const percentValue = numericValue <= 1 ? numericValue * 100 : numericValue;\n                return `${String(percentValue).replace(\/\\.0+$\/, '')}%`;\n            };\n\n            const formatTieredCoinsuranceValue = (value) => {\n                const text = String(value ?? '').trim();\n                if (!hasTierNotation(text)) {\n                    return text;\n                }\n                return text\n                    .replace(\/\\s*[,\/;]\\s*\/g, ' \u00b7 ')\n                    .replace(\/\\b(T\\s*[1-4])\\s*:\\s*\/gi, '$1: ')\n                    .replace(\/\\b(T\\s*[1-4])\\s*=\\s*\/gi, '$1: ')\n                    .replace(\/\\b(T\\s*[1-4])\\s+(?=[\\d$])\/gi, '$1: ')\n                    .replace(\/\\bT\\s*([1-4])\\b\/gi, 'T$1')\n                    .replace(\/\\s{2,}\/g, ' ')\n                    .trim();\n            };\n\n            const getFeatureDisplay = (product, key) => {\n                const values = product.values || null;\n                const sourceProduct = product.rawProduct || product;\n                const rawValue = values && Object.prototype.hasOwnProperty.call(values, key) ? values[key] : sourceProduct[key];\n                if (rawValue === null || rawValue === undefined || rawValue === '') {\n                    return '-';\n                }\n                if (percentageLikeFeatureKeys.has(key) && !Number.isNaN(Number(rawValue))) {\n                    return formatPercentageFeatureValue(rawValue);\n                }\n                if (\/deductible\/i.test(key)) {\n                    return formatCurrencyFeatureValue(rawValue);\n                }\n                const formattedValue = String(rawValue)\n                    .replace(\/(\\d+)%\\.0\\b\/g, '$1%')\n                    .replace(\/(\\d+)\\.0%\/g, '$1%')\n                    .trim();\n                if (hasTierNotation(formattedValue)) {\n                    return formatTieredCoinsuranceValue(formattedValue);\n                }\n                return formattedValue;\n            };\n\n            const featureHasTierGuide = (featureKey) => {\n                const normalizedKey = String(featureKey || '');\n                if (!tierGuideFeatureKeys.has(normalizedKey)) {\n                    return false;\n                }\n                return planCards.value.some((plan) => hasTierGuideNotation(getFeatureDisplay(plan, normalizedKey)));\n            };\n\n            const getTierValueHelp = (featureKey, value) => {\n                const normalizedKey = String(featureKey || '');\n                if (!tierGuideFeatureKeys.has(normalizedKey) || !hasTierGuideNotation(value)) {\n                    return '';\n                }\n                return tierGuideText;\n            };\n\n            const getDisplayPrice = (product, yearlyMode) => {\n                const targetProduct = product.rawProduct || product;\n                const quotePrice = getQuotePrimaryPrice(targetProduct);\n                if (!Number.isFinite(quotePrice) || quotePrice <= 0) {\n                    return yearlyMode ? getProductYearlyPrice(targetProduct) : getProductMonthlyPrice(targetProduct);\n                }\n                if (yearlyMode) {\n                    return quotePrice;\n                }\n                const coverageDays = getCoverageDayCount();\n                if (coverageDays > 0) {\n                    return Math.round(((quotePrice \/ coverageDays) * 30) * 100) \/ 100;\n                }\n                return Math.round((quotePrice \/ 12) * 100) \/ 100;\n            };\n\n            const displayPrice = (product) => (\n                billingCycle.value === 'yearly' ? getDisplayPrice(product, true) : getDisplayPrice(product, false)\n            );\n\n            const formatPrice = (price) => {\n                const numericPrice = Number(price);\n                return Number.isFinite(numericPrice) && numericPrice > 0 ? numericPrice.toFixed(2) : '...';\n            };\n\n            const requestProductQuotes = (options = {}) => {\n                clearTimeout(quoteRequestTimer);\n                const delay = options.immediate ? 0 : 250;\n                quoteRequestTimer = setTimeout(async () => {\n                    const currentSeq = ++quoteRequestSeq;\n                    const requestSignature = getQuoteSignature();\n                    const quoteProducts = planCards.value.map((plan) => plan.rawProduct || plan);\n                    const seen = new Set();\n                    const uniqueProducts = quoteProducts.filter((product) => {\n                        const key = getProductQuoteKey(product);\n                        if (!key || seen.has(key)) {\n                            return false;\n                        }\n                        seen.add(key);\n                        return true;\n                    });\n                    await Promise.all(uniqueProducts.map((product) => requestSingleProductQuote(product, requestSignature)));\n                    if (currentSeq !== quoteRequestSeq) {\n                        return;\n                    }\n                }, delay);\n            };\n\n            const ensureProductQuote = async (product) => {\n                const targetProduct = product?.rawProduct || product || {};\n                const existingPrice = getQuotePrimaryPrice(targetProduct);\n                if (Number.isFinite(existingPrice) && existingPrice > 0) {\n                    return true;\n                }\n                if (Number.isFinite(getProductMonthlyPrice(targetProduct))) {\n                    return true;\n                }\n                const quote = await requestSingleProductQuote(targetProduct, getQuoteSignature());\n                const quotedPrice = getQuotePrimaryPrice({ ...targetProduct, quotePremiums: quote });\n                return Number.isFinite(quotedPrice) && quotedPrice > 0;\n            };\n\n            const toggleBillingCycle = () => {\n                billingCycle.value = billingCycle.value === 'monthly' ? 'yearly' : 'monthly';\n            };\n\n            const handleViewMoreToggle = async () => {\n                const isCollapsing = viewMore.value;\n                viewMore.value = !viewMore.value;\n                if (isCollapsing) {\n                    await nextTick();\n                    const target = document.getElementById('blog-plan-embed');\n                    if (target) {\n                        window.scrollTo({\n                            top: Math.max(target.getBoundingClientRect().top + window.scrollY - 90, 0),\n                            behavior: 'smooth'\n                        });\n                    }\n                }\n            };\n\n            const setSeriesOption = (seriesKey, value) => {\n                if (!seriesKey) {\n                    return;\n                }\n                selectedSeriesOptions.value = {\n                    ...selectedSeriesOptions.value,\n                    [seriesKey]: value\n                };\n            };\n\n            const setDateOfBirth = (event) => {\n                const inputValue = String(event?.target?.value || '').trim();\n                nativeDateOfBirth.value = inputValue;\n                if (!inputValue) {\n                    selectedAge.value = ageRange.min;\n                    return;\n                }\n                const dob = parseCoverageDate(inputValue);\n                if (!dob) {\n                    return;\n                }\n                const today = new Date();\n                let age = today.getFullYear() - dob.getFullYear();\n                const monthDiff = today.getMonth() - dob.getMonth();\n                const dayDiff = today.getDate() - dob.getDate();\n                if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) {\n                    age -= 1;\n                }\n                selectedAge.value = Math.min(ageRange.max, Math.max(ageRange.min, age));\n                requestProductQuotes({ immediate: true });\n            };\n\n            const toggleCompare = (product, event = null) => {\n                const compareId = String(product.compareId || product.id);\n                if (selectedForCompare.value.includes(compareId)) {\n                    selectedForCompare.value = selectedForCompare.value.filter((id) => id !== compareId);\n                    trackBlogClick('blog_plan_compare_toggle', {\n                        element_key: 'blog_plan_compare_remove',\n                        element_text: 'Remove compare',\n                        extra: buildPlanTrackingMeta({\n                            ...(product.rawProduct || product),\n                            compare_selected_count: selectedForCompare.value.length,\n                            compare_action: 'remove',\n                        })\n                    }, event);\n                    return;\n                }\n                if (selectedForCompare.value.length >= maxComparePlans) {\n                    showPlanNotice(planCopy.value.compareLimitNotice, 'error');\n                    return;\n                }\n                selectedForCompare.value = [...selectedForCompare.value, compareId];\n                trackBlogClick('blog_plan_compare_toggle', {\n                    element_key: 'blog_plan_compare_add',\n                    element_text: 'Add compare',\n                    extra: buildPlanTrackingMeta({\n                        ...(product.rawProduct || product),\n                        compare_selected_count: selectedForCompare.value.length,\n                        compare_action: 'add',\n                    })\n                }, event);\n            };\n\n            const openBrochure = (product, event = null) => {\n                const targetProduct = product.rawProduct || product;\n                if (targetProduct.doc_link) {\n                    trackBlogClick('blog_plan_brochure_click', {\n                        element_key: 'blog_plan_brochure',\n                        element_text: 'Brochure',\n                        extra: buildPlanTrackingMeta({\n                            ...targetProduct,\n                            rawProduct: targetProduct,\n                            target_url: targetProduct.doc_link,\n                        })\n                    }, event);\n                    window.open(targetProduct.doc_link, '_blank', 'noopener');\n                    return;\n                }\n                showPlanNotice(planCopy.value.availableSoon, 'error');\n            };\n\n            const hasBrochureLink = (product) => Boolean((product.rawProduct || product).doc_link);\n            const openMedicationGuide = (product, event = null) => {\n                const targetProduct = product.rawProduct || product;\n                if (targetProduct.medication_guide) {\n                    trackBlogClick('blog_plan_medication_guide_click', {\n                        element_key: 'blog_plan_medication_guide',\n                        element_text: 'Medication Guide',\n                        extra: buildPlanTrackingMeta({\n                            ...targetProduct,\n                            rawProduct: targetProduct,\n                            target_url: targetProduct.medication_guide,\n                        })\n                    }, event);\n                    window.open(targetProduct.medication_guide, '_blank', 'noopener');\n                    return;\n                }\n                showPlanNotice(planCopy.value.availableSoon, 'error');\n            };\n\n            const hasMedicationGuideLink = (product) => Boolean((product.rawProduct || product).medication_guide);\n            const openPolicy = (product, event = null) => {\n                const targetProduct = product.rawProduct || product;\n                if (targetProduct.policy_link) {\n                    trackBlogClick('blog_plan_policy_click', {\n                        element_key: 'blog_plan_policy',\n                        element_text: 'Policy',\n                        extra: buildPlanTrackingMeta({\n                            ...targetProduct,\n                            rawProduct: targetProduct,\n                            target_url: targetProduct.policy_link,\n                        })\n                    }, event);\n                    window.open(targetProduct.policy_link, '_blank', 'noopener');\n                    return;\n                }\n                showPlanNotice(planCopy.value.availableSoon, 'error');\n            };\n\n            const hasPolicyLink = (product) => Boolean((product.rawProduct || product).policy_link);\n\n            const providerNetworkLinkMap = {\n                unitedhealthcare: 'https:\/\/connect.werally.com\/guest\/eyJkZWxzeXMiOiIwMSIsInBsYW5OYW1lIjoiT3B0aW9ucyBQUE8ifQVLFsGPr47EfrRoLy_tUboAapKh8zyHMxof6WugRzNUU',\n                'unitedhealthcare ppo': 'https:\/\/connect.werally.com\/guest\/eyJkZWxzeXMiOiIwMSIsInBsYW5OYW1lIjoiT3B0aW9ucyBQUE8ifQVLFsGPr47EfrRoLy_tUboAapKh8zyHMxof6WugRzNUU',\n                aetna: 'https:\/\/www.aetna.com\/dsepublic\/#\/contentPage?page=providerSearchLanding&site_id=passport'\n            };\n\n            const normalizeProviderNetworkName = (value) => String(value || '').replace(\/\\s+\/g, ' ').trim().toLowerCase();\n            const getProviderNetworkLink = (value) => {\n                const normalizedNetworkName = normalizeProviderNetworkName(value);\n                if (!normalizedNetworkName || normalizedNetworkName === '-') {\n                    return '';\n                }\n                if (providerNetworkLinkMap[normalizedNetworkName]) {\n                    return providerNetworkLinkMap[normalizedNetworkName];\n                }\n                if (normalizedNetworkName.includes('unitedhealthcare')) {\n                    return providerNetworkLinkMap.unitedhealthcare;\n                }\n                if (normalizedNetworkName.includes('aetna')) {\n                    return providerNetworkLinkMap.aetna;\n                }\n                return '';\n            };\n\n            const hasProviderNetworkLink = (value) => Boolean(getProviderNetworkLink(value));\n\n            const skipNextPlanContextWatch = ref(false);\n\n            const resetPlanEmbedState = () => {\n                products.value = [];\n                selectedForCompare.value = [];\n                Object.keys(productQuoteMap).forEach((key) => delete productQuoteMap[key]);\n            };\n\n            const hasPlanEmbedContext = () => {\n                const context = blogSchoolContext.value;\n                return blogContentParts.value.showPlanEmbed && Boolean(context.slug || context.id);\n            };\n\n            const fetchBlogPlans = async () => {\n                const context = blogSchoolContext.value;\n                if (!blogContentParts.value.showPlanEmbed || (!context.slug && !context.id)) {\n                    return;\n                }\n\n                plansLoading.value = true;\n                plansError.value = '';\n                try {\n                    const response = await getHttpClient().post(`${apiUrl}product_all`, {\n                        school_slug: context.slug,\n                        school_id: context.id,\n                        client_id: getClientId(),\n                        source: blogTrackingSource,\n                        source_institution: blogTrackingSource,\n                        blog_id: getCurrentBlogId()\n                    });\n                    const payload = response?.data?.data || {};\n                    const responseData = response?.data || {};\n                    const rawProducts = Array.isArray(payload.product_all) ? payload.product_all : [];\n                    products.value = rawProducts.map((product, index) => ({ ...product, newProperty: index === 0 }));\n                    schoolName.value = payload.schoole_name || blog.value?.school?.name || '';\n                    schoolWaive.value = payload.school_waive || {};\n                    schoolIdForPlans.value = payload.school_waive?.school_id || context.id || '';\n                    schoolSlugForPlans.value = payload.school_slug || payload.slug || payload.school_waive?.slug || payload.school_waive?.school_slug || context.slug || '';\n                    noPlanMessage.value = rawProducts.length\n                        ? ''\n                        : (payload.message || responseData.message || planCopy.value.noProductsDescription);\n\n                    const nextSelectedSeriesOptions = { ...selectedSeriesOptions.value };\n                    const seriesGroups = collectSeriesGroups(products.value);\n                    Object.keys(nextSelectedSeriesOptions).forEach((seriesKey) => {\n                        if (!seriesGroups.has(seriesKey)) {\n                            delete nextSelectedSeriesOptions[seriesKey];\n                        }\n                    });\n                    seriesGroups.forEach((group, seriesKey) => {\n                        if (!findSeriesOption(group.options, nextSelectedSeriesOptions[seriesKey])) {\n                            nextSelectedSeriesOptions[seriesKey] = getDefaultSeriesOption(group, group.options) ?? group.options[0];\n                        }\n                    });\n                    selectedSeriesOptions.value = nextSelectedSeriesOptions;\n                    selectedForCompare.value = selectedForCompare.value.filter((id) =>\n                        planCards.value.some((product) => String(product.compareId) === id)\n                    ).slice(0, maxComparePlans);\n                    nextTick(() => requestProductQuotes({ immediate: true }));\n                } catch (error) {\n                    console.error(error);\n                    products.value = [];\n                    plansError.value = planCopy.value.fetchErrorDefault;\n                } finally {\n                    plansLoading.value = false;\n                }\n            };\n\n            const appendEnrollmentQueryParams = (targetUrl, email = '') => {\n                const nextEmail = String(email || '').trim();\n                const currentSchoolSlug = String(schoolSlugForPlans.value || blogSchoolContext.value.slug || '').trim();\n                if (nextEmail) {\n                    targetUrl.searchParams.set('email', nextEmail);\n                }\n                if (currentSchoolSlug) {\n                    targetUrl.searchParams.set('school_slug', currentSchoolSlug);\n                }\n                appendBlogTrackingParams(targetUrl.searchParams);\n                return targetUrl;\n            };\n\n            const navigateToEnrollment = async (email = '', context = {}, event = null) => {\n                const targetUrl = appendEnrollmentQueryParams(new URL(enrollmentPath, window.location.origin), email);\n                const trackedPlan = context.plan || {\n                    id: localStorage.getItem('selected_plan_id') || '',\n                    name: localStorage.getItem('selected_plan_name') || '',\n                    plan_code: localStorage.getItem('selected_plan_code') || '',\n                };\n                await trackBlogClick('blog_plan_form_jump', {\n                    element_key: context.element_key || 'blog_plan_form_jump',\n                    element_text: context.element_text || 'Go to form',\n                    prefer_keepalive: true,\n                    extra: buildPlanTrackingMeta({\n                        ...trackedPlan,\n                        rawProduct: context.plan?.rawProduct || context.plan || trackedPlan,\n                        target_url: targetUrl.toString(),\n                        entry_point: context.entry_point || 'plan_card',\n                    })\n                }, event);\n                window.location.href = targetUrl.toString();\n            };\n\n            const storeSelectedPlan = (product) => {\n                const targetProduct = product.rawProduct || product;\n                const quotePrice = getQuotePrimaryPrice(targetProduct);\n                const monthlyPrice = quotePrice || getProductMonthlyPrice(targetProduct);\n                localStorage.setItem('age_ranges', JSON.stringify(targetProduct.age_ranges || []));\n                localStorage.setItem('InsuranceName', targetProduct.name || product.name || '');\n                localStorage.setItem('monthly_price', String(monthlyPrice || ''));\n                localStorage.setItem('selected_plan_id', String(targetProduct.id || product.id || ''));\n                const selectedPlanCode = String(targetProduct.plan_code || targetProduct.planCode || product.plan_code || product.planCode || '').trim();\n                if (selectedPlanCode) {\n                    localStorage.setItem('selected_plan_code', selectedPlanCode);\n                } else {\n                    localStorage.removeItem('selected_plan_code');\n                }\n                localStorage.setItem('selected_plan_name', String(targetProduct.name || product.name || ''));\n                localStorage.setItem('school_id', schoolName.value || blog.value?.school?.name || '');\n                localStorage.setItem('school_slug', String(schoolSlugForPlans.value || blogSchoolContext.value.slug || ''));\n                localStorage.setItem('sid', String(schoolIdForPlans.value || blogSchoolContext.value.id || ''));\n                localStorage.setItem('coverage_start_date', schoolWaive.value.coverage_start_date || '');\n                localStorage.setItem('coverage_end_date', schoolWaive.value.coverage_end_date || '');\n                localStorage.setItem('student_age', String(selectedAge.value));\n                if (nativeDateOfBirth.value) {\n                    localStorage.setItem('prefilled_student_dob', nativeDateOfBirth.value);\n                } else {\n                    localStorage.removeItem('prefilled_student_dob');\n                }\n                const currentBlogId = getCurrentBlogId();\n                if (currentBlogId) {\n                    localStorage.setItem('blog_id', currentBlogId);\n                    localStorage.setItem('blog_source', blogTrackingSource);\n                    localStorage.setItem('source', blogTrackingSource);\n                    localStorage.setItem('source_institution', blogTrackingSource);\n                }\n            };\n\n            const selectProduct = async (product, event = null) => {\n                const targetProduct = product.rawProduct || product;\n                if (!await ensureProductQuote(targetProduct)) {\n                    showPlanNotice(planCopy.value.quotePriceUnavailable, 'error');\n                    return;\n                }\n                trackBlogClick('blog_plan_card_select', {\n                    element_key: 'blog_plan_select',\n                    element_text: 'Select plan',\n                    extra: buildPlanTrackingMeta(targetProduct)\n                }, event);\n                storeSelectedPlan(targetProduct);\n                showCompareModal.value = false;\n                if (isLoggedIn()) {\n                    navigateToEnrollment(localStorage.getItem('student_email') || '', {\n                        plan: targetProduct,\n                        entry_point: 'plan_card',\n                        element_key: 'blog_plan_select',\n                        element_text: 'Select plan',\n                    }, event);\n                    return;\n                }\n                loginIntent.value = 'plan';\n                is_login.value = true;\n            };\n\n            const rewriteBlogContentLinks = (html) => {\n                if (!html) {\n                    return '';\n                }\n\n                const blogId = getCurrentBlogId();\n                if (!blogId) {\n                    return html;\n                }\n\n                try {\n                    const wrapper = document.createElement('div');\n                    wrapper.innerHTML = html;\n\n                    wrapper.querySelectorAll('a[href]').forEach((anchor) => {\n                        const href = anchor.getAttribute('href') || '';\n                        if (href.toLowerCase().indexOf('\/schools\/') === -1 && href.toLowerCase().indexOf('goglobalsafe.com\/schools\/') === -1) {\n                            return;\n                        }\n\n                        try {\n                            const url = new URL(href, window.location.origin);\n                            if (url.hostname && url.hostname !== window.location.hostname && url.hostname.indexOf('goglobalsafe.com') === -1) {\n                                return;\n                            }\n\n                            if (url.pathname.toLowerCase().indexOf('\/schools\/') === -1) {\n                                return;\n                            }\n\n                            appendBlogTrackingParams(url.searchParams);\n                            const schoolSlug = normalizeSchoolSlug(url.pathname);\n                            if (schoolSlug) {\n                                anchor.setAttribute('data-school-slug', schoolSlug);\n                            }\n                            anchor.setAttribute('data-school-name', String(blog?.value?.school?.name || '').trim());\n                            anchor.setAttribute('data-blog-tracking', 'school-plan-link');\n                            anchor.setAttribute('href', `${url.pathname}${url.search}${url.hash}`);\n                        } catch (error) {\n                            const separator = href.indexOf('?') === -1 ? '?' : '&';\n                            anchor.setAttribute('data-blog-tracking', 'school-plan-link');\n                            anchor.setAttribute('data-school-name', String(blog?.value?.school?.name || '').trim());\n                            anchor.setAttribute('href', `${href}${separator}source=blog&source_institution=blog&blog_id=${encodeURIComponent(blogId)}`);\n                        }\n                    });\n\n                    return wrapper.innerHTML;\n                } catch (error) {\n                    return html;\n                }\n            };\n\n            const goToBuy = async (event = null) => {\n                const targetUrl = buildSchoolPlanUrl();\n                if (targetUrl) {\n                    trackBlogClick('blog_plan_list_jump', {\n                        element_key: 'blog_plan_list_jump',\n                        element_text: 'Go to school plans',\n                        extra: buildBlogTrackingMeta({\n                            target_url: new URL(targetUrl, window.location.origin).toString(),\n                            entry_point: 'lock_cta',\n                        })\n                    }, event);\n                    window.open(targetUrl);\n                    return;\n                }\n\n                ElMessage.error('School plan link not found.')\n            }\n\n            \/\/ --- \u65b0\u589e\uff1aSEO \u52a8\u6001\u66f4\u65b0\u51fd\u6570 ---\n            const updateSeoTags = (post) => {\n                if (!post) return;\n\n                \/\/ 1. \u8bbe\u7f6e\u7f51\u9875\u6807\u9898 (\u4f18\u5148\u7528 SEO \u6807\u9898\uff0c\u5426\u5219\u7528\u6587\u7ae0\u539f\u6807\u9898)\n                document.title = post.seo_title || post.title;\n\n                \/\/ \u8f85\u52a9\u51fd\u6570\uff1a\u67e5\u627e\u6216\u521b\u5efa meta \u6807\u7b7e\n                const setMeta = (name, content, attr = 'name') => {\n                    if (!content) return;\n                    let element = document.querySelector(`meta[${attr}=\"${name}\"]`);\n                    if (!element) {\n                        element = document.createElement('meta');\n                        element.setAttribute(attr, name);\n                        document.head.appendChild(element);\n                    }\n                    element.setAttribute('content', content);\n                };\n\n                \/\/ 2. \u8bbe\u7f6e Meta Description (\u5143\u63cf\u8ff0)\n                \/\/ \u4f18\u5148\u7528 SEO \u63cf\u8ff0\uff0c\u5982\u679c\u6ca1\u6709\uff0c\u5219\u5c1d\u8bd5\u622a\u53d6\u5185\u5bb9\u6458\u8981 (\u9700\u53bb\u9664 HTML \u6807\u7b7e)\n                const desc = post.seo_description || (post.content ? post.content.replace(\/<[^>]+>\/g, '').slice(0, 150) + '...' : '');\n                setMeta('description', desc);\n\n                \/\/ 3. \u8bbe\u7f6e Keywords (\u5173\u952e\u8bcd + \u540c\u4e49\u8bcd)\n                let keywords = [];\n                if (post.seo_focus_keyword) keywords.push(post.seo_focus_keyword);\n                \/\/ \u5047\u8bbe\u540e\u7aef\u8fd4\u56de\u7684 synonyms \u662f\u6570\u7ec4\uff0c\u5982\u679c\u4e0d\u662f\u8bf7\u81ea\u884c\u5904\u7406\n                if (Array.isArray(post.seo_synonyms)) {\n                    keywords = keywords.concat(post.seo_synonyms);\n                }\n                if (keywords.length > 0) {\n                    setMeta('keywords', keywords.join(', '));\n                }\n\n                \/\/ 4. \u8bbe\u7f6e Robots (\u722c\u866b\u6307\u4ee4)\n                setMeta('robots', post.meta_robots || 'index, follow');\n\n                \/\/ 5. \u8bbe\u7f6e Canonical URL (\u6743\u5a01\u94fe\u63a5)\n                let link = document.querySelector('link[rel=\"canonical\"]');\n                if (!link) {\n                    link = document.createElement('link');\n                    link.setAttribute('rel', 'canonical');\n                    document.head.appendChild(link);\n                }\n                \/\/ \u4f18\u5148\u7528\u586b\u5199\u7684 canonical\uff0c\u5426\u5219\u7528\u5f53\u524d slug \u751f\u6210\n                link.setAttribute('href', post.canonical_url || `https:\/\/www.goglobalsafe.com\/blog\/${post.slug}`);\n\n                \/\/ 6. \u8bbe\u7f6e Open Graph (\u793e\u4ea4\u5206\u4eab\u5361\u7247: \u5fae\u4fe1\/Facebook)\n                setMeta('og:title', post.seo_title || post.title, 'property');\n                setMeta('og:description', desc, 'property');\n                setMeta('og:image', post.og_image || post.cover_image, 'property');\n                setMeta('og:url', window.location.href, 'property');\n                setMeta('og:type', 'article', 'property');\n            };\n            const getPost = async () => {\n                \/\/ 1. \u83b7\u53d6\u6807\u8bc6\u7b26\n                let slug = window.currentBlogSlug; \/\/ \u8bfb\u53d6 PHP \u6ce8\u5165\u7684 Slug\n                let id = window.usc_fixed_id || getQueryParam('id'); \/\/ \u8bfb\u53d6 ID (\u4f5c\u4e3a\u540e\u5907)\n                if (slug) {\n                    id = slug\n                }\n                \/\/\u90ae\u4ef6\u68c0\u67e5\n                try {\n                    const response = await getHttpClient()\n                        .get('https:\/\/agent.goglobalsafe.com\/api\/v1\/blog\/posts\/' + id);\n                    console.log(response);\n                    if (response.status === 200) {\n                        skipNextPlanContextWatch.value = true;\n                        blog.value = response.data.data\n                        updateSeoTags(blog.value);\n                        console.log('123123123123', blog.value)\n                        endTime.value = response.data.data.school?.waive_deadline || response.data.data.waive_deadline || null\n                        resetPlanEmbedState();\n                        if (hasPlanEmbedContext()) {\n                            await fetchBlogPlans();\n                        }\n                    }\n                    \/\/\u7528\u6237\u5b58\u5728\n                } catch (error) {\n                    console.log(error);\n                    if (error?.response?.status === 404) {\n                        console.log('\u6587\u7ae0\u4e0d\u5b58\u5728')\n                    } else {\n                        console.log(error)\n                    }\n                } finally {\n                    pageLoading.value = false;\n                }\n            }\n            \/\/\u9a8c\u8bc1\u90ae\u4ef6\u683c\u5f0f\n            const email_validateField = () => {\n                \/\/ \u90ae\u4ef6\u683c\u5f0f\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\n                const emailPattern = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\n                if (!emailPattern.test(loginform.value.email)) {\n                    login_from_error.emailMessage = messages[lang].emailInvalid;\n                    return false\n                }\n                login_from_error.emailMessage = '';\n                return true\n            }\n            \/\/\u767b\u5f55\u8868\u5355\n            const loading2 = ref(false)\n            const emailSubmitted = ref(false)\n            const is_login = ref(false)\n            const login_from_error = reactive({})\n            const loginform = ref({\n                email: '',\n                password: '',\n            })\n            const mfa = reactive({\n                active: false,\n                challengeToken: '',\n                code: '',\n                recoveryCode: '',\n                useRecovery: false,\n                submitting: false,\n                error: ''\n            })\n            const login_title = computed(() => (lang === 'zh' ? '\u5df2\u7ecf\u8d2d\u4e70\u4fdd\u9669\u4e86\u5417?' : 'Already purchased insurance?'))\n            const faq = computed(() => (lang === 'zh' ? '\u5e38\u89c1\u95ee\u9898' : 'Q&A'))\n            const login_subtitle = computed(() => (lang === 'zh' ? '\u8bf7\u8f93\u5165\u60a8\u7684\u7535\u5b50\u90ae\u7bb1' : 'Please enter your email'))\n            const login_forget_password = computed(() => (lang === 'zh' ? '\u5fd8\u8bb0\u5bc6\u7801\uff1f' : 'forget the password\uff1f'))\n            const login_submit = computed(() => (lang === 'zh' ? '\u5f00\u59cb\u4f7f\u7528' : 'Get started'))\n            const login_submit_password = computed(() => (lang === 'zh' ? '\u89e3\u9501' : 'Unlock'))\n            \/\/ 1. \u9501\u5c4f\u6807\u9898\uff1a\u901a\u7528\u5316\n            const lockTitle = computed(() => (\n                lang === 'zh' ? '\u89e3\u9501\u5b8c\u6574\u5185\u5bb9' : 'Unlock Full Content'\n            ));\n\n            \/\/ 2. \u9501\u5c4f\u63cf\u8ff0\uff1a\u53bb\u6389\u4e86\u5177\u4f53\u7684 \"Waiver Guide\" \u5b57\u773c\uff0c\u6539\u4e3a\u901a\u7528\u63cf\u8ff0\n            const lockDesc = computed(() => (\n                lang === 'zh'\n                    ? '\u8d2d\u4e70\u5408\u89c4\u65b9\u6848\u4ee5\u83b7\u53d6\u9488\u5bf9\u60a8\u5b66\u6821\u7684\u8be6\u7ec6\u5206\u6b65\u6307\u5357\u53ca\u5b8c\u6574\u6587\u7ae0\u3002'\n                    : 'Get specific, step-by-step instructions and the full article by purchasing a compliant plan.'\n            ));\n\n            \/\/ 3. \u8d2d\u4e70\u6309\u94ae\uff1a\u901a\u7528\n            const btnBuyText = computed(() => (\n                lang === 'zh' ? '\u67e5\u770b\u65b9\u6848' : 'Find a plan'\n            ));\n\n            \/\/ 4. \u767b\u5f55\u6309\u94ae\uff1a\u901a\u7528\n            const btnLoginText = computed(() => (\n                lang === 'zh' ? '\u767b\u5f55\u89e3\u9501' : 'Already have a plan? Login to Unlock'\n            ));\n            \/\/\u5173\u95ed\u767b\u5f55\u5f39\u7a97\n            const close_login = () => {\n                is_login.value = false\n                loading2.value = false\n                emailSubmitted.value = false\n                login_from_error.emailMessage = ''\n                login_from_error.errorMessage = ''\n                loginform.value.email = ''\n                loginform.value.password = ''\n                mfa.active = false\n                mfa.challengeToken = ''\n                mfa.code = ''\n                mfa.recoveryCode = ''\n                mfa.useRecovery = false\n                mfa.submitting = false\n                mfa.error = ''\n                loginIntent.value = 'unlock'\n            }\n            \/\/\u5b58\u50a8\u9009\u62e9\u540e\u8981\u4f20\u9012\u7684\u5bf9\u8c61\n            const selectedInsurance = reactive({\n                email: null\n            });\n            \/\/\u5224\u65ad\u5f53\u524d\u662f\u5426\u767b\u5f55\n            const isLoggedIn = () => {\n                return !!localStorage.getItem('student_token'); \/\/ Use double negation to convert to a boolean\n            };\n\n            const getAuthPayload = (response) => {\n                return response && response.data && response.data.data ? response.data.data : {};\n            };\n\n            const getAuthErrorMessage = (error, fallbackMessage) => {\n                return error?.response?.data?.message\n                    || error?.response?.data?.errors?.code?.[0]\n                    || error?.response?.data?.errors?.recovery_code?.[0]\n                    || fallbackMessage;\n            };\n\n            const openMfaChallenge = (payload) => {\n                mfa.active = true\n                mfa.challengeToken = payload?.challenge_token || payload?.challengeToken || payload?.mfa_challenge_token || ''\n                mfa.code = ''\n                mfa.recoveryCode = ''\n                mfa.useRecovery = false\n                mfa.submitting = false\n                mfa.error = ''\n                login_from_error.errorMessage = ''\n            }\n\n            const cancelMfa = () => {\n                mfa.active = false\n                mfa.challengeToken = ''\n                mfa.code = ''\n                mfa.recoveryCode = ''\n                mfa.useRecovery = false\n                mfa.submitting = false\n                mfa.error = ''\n                login_from_error.errorMessage = ''\n            }\n\n            const completeLoginWithPayload = async (payload, email) => {\n                const token = payload && payload.token ? payload.token : ''\n                if (!token) {\n                    const message = messages[lang].loginMissingToken\n                    if (mfa.active) {\n                        mfa.error = message\n                    } else {\n                        login_from_error.errorMessage = message\n                    }\n                    return false\n                }\n\n                const user = payload.user || payload.student || {}\n                localStorage.setItem('student_token', token)\n                localStorage.setItem('student_email', email)\n                localStorage.setItem('student_info', JSON.stringify(user))\n                localStorage.setItem('user_info', JSON.stringify(user))\n                loginUser.value = user\n\n                const currentIntent = loginIntent.value\n                close_login()\n                if (currentIntent === 'plan') {\n                    navigateToEnrollment(email)\n                }\n                return true\n            }\n\n            const verifyMfaLogin = async () => {\n                const payload = {\n                    challenge_token: mfa.challengeToken\n                }\n                if (mfa.useRecovery) {\n                    payload.recovery_code = String(mfa.recoveryCode || '').trim()\n                    if (!payload.recovery_code) {\n                        mfa.error = messages[lang].mfaCodeRequired\n                        return\n                    }\n                } else {\n                    payload.code = String(mfa.code || '').trim()\n                    if (!payload.code) {\n                        mfa.error = messages[lang].mfaCodeRequired\n                        return\n                    }\n                }\n\n                mfa.submitting = true\n                mfa.error = ''\n                try {\n                    const response = await getHttpClient().post(apiStudentMfaVerify, payload)\n                    await completeLoginWithPayload(getAuthPayload(response), String(loginform.value.email || '').trim())\n                } catch (error) {\n                    mfa.error = getAuthErrorMessage(error, messages[lang].mfaFailedDefault)\n                } finally {\n                    mfa.submitting = false\n                }\n            }\n\n            \/\/\u63d0\u4ea4\u767b\u5f55\n            const handleSubmit = async () => {\n                if (mfa.active) {\n                    await verifyMfaLogin()\n                    return\n                }\n\n                const email = String(loginform.value.email || '').trim()\n                loginform.value.email = email\n                selectedInsurance.email = email\n                login_from_error.errorMessage = ''\n\n                if (!email_validateField()) {\n                    return\n                }\n\n                if (!emailSubmitted.value) {\n                    loading2.value = true\n                    try {\n                        const response = await getHttpClient().post(apiStudentEmailExist, { email })\n                        const existsValue = response.data?.data?.exists\n                        const emailMissing = existsValue === false\n                            || existsValue === 0\n                            || String(existsValue).trim().toLowerCase() === 'false'\n                            || String(existsValue).trim() === '0'\n                        if (emailMissing) {\n                            const currentIntent = loginIntent.value\n                            localStorage.setItem('student_email', email)\n                            close_login()\n                            if (currentIntent === 'plan') {\n                                navigateToEnrollment(email)\n                            }\n                            return\n                        }\n                        emailSubmitted.value = true\n                    } catch (error) {\n                        const status = error && error.response ? error.response.status : null\n                        if (status === 404) {\n                            const currentIntent = loginIntent.value\n                            localStorage.setItem('student_email', email)\n                            close_login()\n                            if (currentIntent === 'plan') {\n                                navigateToEnrollment(email)\n                            }\n                            return\n                        }\n                        login_from_error.errorMessage = (error && error.response && error.response.data && error.response.data.message)\n                            ? error.response.data.message\n                            : messages[lang].loginFailedDefault\n                    } finally {\n                        loading2.value = false\n                    }\n                    return\n                }\n\n                loading2.value = true\n                try {\n                    const response = await getHttpClient().post(apiStudentLogin, {\n                        email,\n                        password: loginform.value.password,\n                    })\n                    const payload = getAuthPayload(response)\n                    if (payload.mfa_required) {\n                        openMfaChallenge(payload)\n                        return\n                    }\n                    if (response.data.status === 200 && payload.token) {\n                        await completeLoginWithPayload(payload, email)\n                        return\n                    }\n                    login_from_error.errorMessage = response.data?.data?.message || messages[lang].loginFailedDefault\n                } catch (error) {\n                    login_from_error.errorMessage = (error && error.response && error.response.data && error.response.data.message)\n                        ? error.response.data.message\n                        : messages[lang].loginFailedDefault\n                } finally {\n                    loading2.value = false\n                }\n            }\n            const checkLogin = () => {\n                console.log(loginUser.value, '\u6765\u4e86')\n                if (loginUser.value) {\n                    is_login.value = false \/\/\u663e\u793a\u5f39\u7a97 \u63d0\u793a\u767b\u5f55\n                } else {\n                    loginIntent.value = 'unlock'\n                    is_login.value = true \/\/\u663e\u793a\u5f39\u7a97 \u63d0\u793a\u767b\u5f55\n                }\n\n            }\n            \/\/ 1. \u8ba1\u7b97\u5c5e\u6027\uff1a\u5904\u7406\u663e\u793a\u7684\u5185\u5bb9\n            const processedContent = computed(() => {\n                return `${blogContentParts.value.before}${blogContentParts.value.after}`;\n            });\n            \/\/ 2. \u8ba1\u7b97\u5c5e\u6027\uff1a\u63a7\u5236\u9501\u7684\u663e\u793a\n            const shouldShowLock = computed(() => {\n                \/\/ \u6570\u636e\u672a\u52a0\u8f7d -> \u4e0d\u663e\u793a\u9501\n                if (!blog.value || !blog.value.content) return false;\n\n                \/\/ \u7528\u6237\u5df2\u767b\u5f55 -> \u4e0d\u663e\u793a\u9501\n                if (loginUser.value) return false;\n\n                \/\/ \u7528\u6237\u672a\u767b\u5f55 \u4e14 \u5185\u5bb9\u5305\u542b\u5173\u952e\u8bcd -> \u663e\u793a\u9501\n                return blog.value.content.includes(splitKeyword);\n            });\n            \/**\n             * \u7ed9\u9875\u9762\u4e0a\u53ef\u89c1\u7684 H \u6807\u7b7e\u5f3a\u884c\u52a0\u4e0a ID\n             * \u5fc5\u987b\u5728\u9875\u9762\u6e32\u67d3\u5b8c\u6210\u540e\u6267\u884c\n             *\/\n            const assignIdsToVisibleContent = () => {\n                \/\/ \u26a0\ufe0f\u6ce8\u610f\uff1a\u8bf7\u786e\u8ba4\u4f60\u7684\u6587\u7ae0\u5185\u5bb9\u5bb9\u5668\u7684 class \u662f\u4ec0\u4e48\uff1f\n                \/\/ \u5982\u679c\u4f60\u7684 HTML \u662f <div class=\"blog-details-content\" ...>\uff0c\u8fd9\u91cc\u5c31\u8981\u6539\u6210 .blog-details-content\n                const contentEl = document.querySelector('.content') || document.querySelector('.blog-content');\n\n                if (!contentEl) {\n                    console.warn('\u672a\u627e\u5230\u6587\u7ae0\u5bb9\u5668\uff0c\u65e0\u6cd5\u6dfb\u52a0ID');\n                    return;\n                }\n\n                \/\/ \u83b7\u53d6\u5f53\u524d\u9875\u9762\u5b9e\u9645\u6e32\u67d3\u51fa\u6765\u7684\u6807\u9898\n                const headers = Array.from(contentEl.querySelectorAll('h1, h2, h3'));\n\n                headers.forEach((header, index) => {\n                    \/\/ \u7ed9\u5b83\u4eec\u52a0\u4e0a\u548c\u76ee\u5f55\u91cc\u4e00\u6a21\u4e00\u6837\u7684 ID\n                    header.id = `section-${index}`;\n                });\n            };\n            \/**\n             * [\u4fee\u6539] \u57fa\u4e8e\u5b8c\u6574\u5185\u5bb9\u751f\u6210\u76ee\u5f55\n             * \u903b\u8f91\uff1a\u4e0d\u518d\u6293\u53d6\u5f53\u524d\u9875\u9762 DOM\uff0c\u800c\u662f\u521b\u5efa\u4e00\u4e2a\u865a\u62df DOM \u89e3\u6790 blog.value.content (\u5b8c\u6574\u5185\u5bb9)\n             *\/\n            const generateTOC = () => {\n                \/\/ 1. \u68c0\u67e5\u662f\u5426\u6709\u5b8c\u6574\u6570\u636e\n                if (!blog.value || !blog.value.content) return;\n\n                \/\/ 2. \u521b\u5efa\u4e00\u4e2a\u865a\u62df\u5bb9\u5668 (\u4e0d\u6dfb\u52a0\u5230\u9875\u9762\u4e0a)\n                const tempDiv = document.createElement('div');\n                tempDiv.innerHTML = blogContentParts.value.tocHtml || blog.value.content; \/\/ \u653e\u5165\u5f53\u524d\u53ef\u89c1\u7ed3\u6784\n\n                \/\/ 3. \u5728\u865a\u62df\u5bb9\u5668\u4e2d\u67e5\u627e\u6240\u6709\u6807\u9898\n                const headers = Array.from(tempDiv.querySelectorAll('h1, h2, h3'));\n                if (headers.length === 0) return;\n\n                const levels = headers.map(h => parseInt(h.tagName.substring(1)));\n                const minLevel = Math.min(...levels);\n\n                const tree = [];\n                let lastRoot = null;\n                let lastSub = null;\n\n                headers.forEach((header, index) => {\n                    \/\/ \u5173\u952e\uff1a\u6211\u4eec\u8981\u751f\u6210\u786e\u5b9a\u6027\u7684 ID\uff0c\u65b9\u4fbf\u540e\u7eed\u5b9a\u4f4d\n                    \/\/ \u8fd9\u91cc\u7684 ID \u5fc5\u987b\u548c\u9875\u9762\u5b9e\u9645\u6e32\u67d3\u65f6\u7684 ID \u903b\u8f91\u4e00\u81f4\n                    const headerId = `section-${index}`;\n\n                    const currentLevel = parseInt(header.tagName.substring(1));\n                    const depth = currentLevel - minLevel + 1;\n\n                    const item = {\n                        id: headerId,\n                        text: header.innerText,\n                        depth: depth,\n                        children: [],\n                        expanded: false\n                    };\n\n                    if (depth === 1) {\n                        tree.push(item);\n                        lastRoot = item;\n                        lastSub = null;\n                    } else if (depth === 2) {\n                        if (lastRoot) {\n                            lastRoot.children.push(item);\n                        } else {\n                            tree.push(item);\n                        }\n                        lastSub = item;\n                    } else if (depth === 3) {\n                        if (lastSub) {\n                            lastSub.children.push(item);\n                        } else if (lastRoot) {\n                            lastRoot.children.push(item);\n                        }\n                    }\n                });\n\n                tocTree.value = tree;\n            };\n\n            \/\/ \u5207\u6362\u6298\u53e0\u72b6\u6001\n            const toggleSection = (item) => {\n                if (item.children && item.children.length > 0) {\n                    item.expanded = !item.expanded;\n                }\n            };\n\n            \/\/ [\u4fee\u6539] \u6eda\u52a8\u5b9a\u4f4d\u903b\u8f91\uff0c\u6539\u4e3a\u901a\u8fc7 ID\n            const scrollToId = (id) => {\n                activeId.value = id;\n                const el = document.getElementById(id);\n                if (el) {\n                    const top = el.getBoundingClientRect().top + window.scrollY - 120;\n                    window.scrollTo({ top: top, behavior: 'smooth' });\n                }else {\n                    \/\/ [\u4fee\u6539] \u5c06 .lock-section \u6539\u4e3a .usc-guide-lock\n                    const lockSection = document.querySelector('.usc-guide-lock');\n\n                    if (lockSection) {\n                        \/\/ ...\n                    }\n                }\n            };\n\n            const handleSidebarWheel = (event) => {\n                const sidebar = sidebarRef.value;\n                if (!sidebar) {\n                    return;\n                }\n\n                const maxScrollTop = sidebar.scrollHeight - sidebar.clientHeight;\n                if (maxScrollTop <= 0) {\n                    return;\n                }\n\n                const nextScrollTop = Math.max(0, Math.min(maxScrollTop, sidebar.scrollTop + event.deltaY));\n                if (nextScrollTop !== sidebar.scrollTop) {\n                    event.preventDefault();\n                    sidebar.scrollTop = nextScrollTop;\n                }\n            };\n\n            let stickyTableResizeObserver = null;\n\n            const isTransparentTableColor = (color) => {\n                return !color\n                    || color === 'transparent'\n                    || \/^rgba\\([^)]*,\\s*0(?:\\.0+)?\\)$\/.test(color);\n            };\n\n            const getStickyCellBackground = (cell) => {\n                const contentRoot = cell.closest('.content');\n                let current = cell;\n\n                while (current && current !== contentRoot) {\n                    const color = window.getComputedStyle(current).backgroundColor;\n                    if (!isTransparentTableColor(color)) {\n                        return color;\n                    }\n                    current = current.parentElement;\n                }\n\n                return '#ffffff';\n            };\n\n            const getTableColumnCount = (row) => {\n                return Array.from(row.cells).reduce((total, cell) => {\n                    return total + Math.max(Number.parseInt(cell.getAttribute('colspan') || '1', 10), 1);\n                }, 0);\n            };\n\n            const updateStickyTableOffset = (table, firstCell) => {\n                const firstColumnWidth = Math.ceil(firstCell.getBoundingClientRect().width);\n                if (firstColumnWidth > 0) {\n                    table.style.setProperty('--blog-sticky-first-column-width', `${firstColumnWidth}px`);\n                }\n\n                const shell = table.closest('.blog-scroll-table-shell');\n                if (shell) {\n                    shell.classList.toggle('is-scrollable', shell.scrollWidth > shell.clientWidth + 1);\n                }\n            };\n\n            const setupStickyContentTables = () => {\n                if (stickyTableResizeObserver) {\n                    stickyTableResizeObserver.disconnect();\n                }\n\n                stickyTableResizeObserver = typeof ResizeObserver === 'function'\n                    ? new ResizeObserver((entries) => {\n                        entries.forEach((entry) => {\n                            const table = entry.target.closest('table.blog-sticky-two-columns');\n                            if (table) {\n                                updateStickyTableOffset(table, entry.target);\n                            }\n                        });\n                    })\n                    : null;\n\n                document.querySelectorAll('.content table').forEach((table) => {\n                    const rows = Array.from(table.rows || []);\n                    const hasThreeColumns = rows.some((row) => getTableColumnCount(row) >= 3);\n                    if (!hasThreeColumns) {\n                        return;\n                    }\n\n                    let shell = table.parentElement;\n                    if (!shell || !shell.classList.contains('blog-scroll-table-shell')) {\n                        shell = document.createElement('div');\n                        shell.className = 'blog-scroll-table-shell';\n                        table.parentNode.insertBefore(shell, table);\n                        shell.appendChild(table);\n                    }\n\n                    const caption = table.querySelector('caption');\n                    const isChinese = document.documentElement.lang.toLowerCase().startsWith('zh');\n                    const fallbackLabel = isChinese\n                        ? '\u53ef\u6a2a\u5411\u6eda\u52a8\u7684\u5bf9\u6bd4\u8868\u683c\uff0c\u524d\u4e24\u5217\u5df2\u56fa\u5b9a'\n                        : 'Scrollable comparison table with the first two columns fixed';\n                    shell.tabIndex = 0;\n                    shell.setAttribute('role', 'region');\n                    shell.setAttribute(\n                        'aria-label',\n                        caption && caption.textContent.trim() ? caption.textContent.trim() : fallbackLabel\n                    );\n\n                    table.classList.add('blog-sticky-two-columns');\n                    table.querySelectorAll('tr > :first-child, tr > :nth-child(2)').forEach((cell) => {\n                        const currentColor = window.getComputedStyle(cell).backgroundColor;\n                        if (isTransparentTableColor(currentColor)) {\n                            cell.style.backgroundColor = getStickyCellBackground(cell);\n                        }\n                    });\n\n                    const sizingRow = rows.find((row) => {\n                        return row.cells.length >= 2\n                            && Number(row.cells[0].colSpan || 1) === 1\n                            && Number(row.cells[1].colSpan || 1) === 1;\n                    });\n                    const firstCell = sizingRow ? sizingRow.cells[0] : null;\n                    if (!firstCell) {\n                        return;\n                    }\n\n                    updateStickyTableOffset(table, firstCell);\n                    window.requestAnimationFrame(() => updateStickyTableOffset(table, firstCell));\n                    if (stickyTableResizeObserver) {\n                        stickyTableResizeObserver.observe(firstCell);\n                    }\n                });\n            };\n\n            \/\/ [\u65b0\u589e] \u76d1\u542c processedContent \u53d8\u5316\n            \/\/ \u5f53 v-html \u5185\u5bb9\u6e32\u67d3\u66f4\u65b0\u540e\uff0c\u91cd\u65b0\u751f\u6210\u76ee\u5f55\n            watch(processedContent, () => {\n                nextTick(() => {\n                    generateTOC();\n                    assignIdsToVisibleContent();\n                    setupStickyContentTables();\n                });\n            });\n\n            watch(\n                () => [\n                    blogContentParts.value.showPlanEmbed ? '1' : '0',\n                    blogSchoolContext.value.slug,\n                    blogSchoolContext.value.id\n                ].join('|'),\n                () => {\n                    if (!blog.value) {\n                        return;\n                    }\n                    if (skipNextPlanContextWatch.value) {\n                        skipNextPlanContextWatch.value = false;\n                        return;\n                    }\n                    resetPlanEmbedState();\n                    if (hasPlanEmbedContext()) {\n                        fetchBlogPlans();\n                    }\n                }\n            );\n\n            watch(\n                () => [\n                    nativeDateOfBirth.value || '',\n                    String(schoolWaive.value.coverage_start_date || ''),\n                    String(schoolWaive.value.coverage_end_date || ''),\n                    billingCycle.value,\n                    planCards.value.map((plan) => getProductQuoteKey(plan.rawProduct || plan)).join('|')\n                ].join('::'),\n                () => requestProductQuotes()\n            );\n            const shareClick = async () => {\n                const textToCopy = window.location.href;\n\n                \/\/ --- \u65b9\u6848 A: \u73b0\u4ee3\u6d4f\u89c8\u5668 (HTTPS\u73af\u5883) ---\n                if (navigator.clipboard && navigator.clipboard.writeText) {\n                    try {\n                        await navigator.clipboard.writeText(textToCopy);\n                        ElMessage.success('Copy success!');\n\n                        return; \/\/ \u6210\u529f\u5219\u76f4\u63a5\u7ed3\u675f\n                    } catch (err) {\n                        console.warn('Clipboard API \u5931\u8d25\uff0c\u5c1d\u8bd5\u964d\u7ea7\u65b9\u6848:', err);\n                        \/\/ \u5931\u8d25\u4e86\u4e0d\u62a5\u9519\uff0c\u7ee7\u7eed\u5f80\u4e0b\u8d70\u65b9\u6848 B\n                    }\n                }\n\n                \/\/ --- \u65b9\u6848 B: \u4f20\u7edf\u517c\u5bb9\u65b9\u6848 (HTTP\u73af\u5883 \/ \u65e7\u6d4f\u89c8\u5668) ---\n                try {\n                    \/\/ 1. \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u7684\u6587\u672c\u57df\n                    const textArea = document.createElement(\"textarea\");\n                    textArea.value = textToCopy;\n\n                    \/\/ 2. \u628a\u5b83\u653e\u5728\u5c4f\u5e55\u5916\uff0c\u9632\u6b62\u5f71\u54cd\u5e03\u5c40\u6216\u9020\u6210\u95ea\u70c1\n                    textArea.style.position = \"fixed\";\n                    textArea.style.left = \"-9999px\";\n                    textArea.style.top = \"0\";\n\n                    document.body.appendChild(textArea);\n\n                    \/\/ 3. \u9009\u4e2d\u5185\u5bb9\n                    textArea.focus();\n                    textArea.select();\n\n                    \/\/ 4. \u6267\u884c\u590d\u5236\u547d\u4ee4\n                    const successful = document.execCommand('copy');\n\n                    \/\/ 5. \u79fb\u9664\u4e34\u65f6\u5143\u7d20\n                    document.body.removeChild(textArea);\n\n                    if (successful) {\n                        ElMessage.success('Copy success!');\n                    } else {\n                        throw new Error('execCommand \u5931\u8d25');\n                    }\n                } catch (err) {\n                    console.error('\u6240\u6709\u590d\u5236\u624b\u6bb5\u90fd\u5931\u8d25:', err);\n                    alert('\u590d\u5236\u5931\u8d25\uff0c\u8bf7\u624b\u52a8\u590d\u5236\u6d4f\u89c8\u5668\u5730\u5740\u680f');\n                    ElMessage.error('Copy error!Please manually copy the browser address bar');\n\n                }\n            };\n            const backLink = () => {\n                window.location.href = '\/blogs';\n            }\n            const filterByTag = (id) => {\n                const tagId = String(id || '').trim();\n                if (!tagId) return;\n\n                const url = new URL('\/blogs', window.location.origin);\n                url.searchParams.set('tag_id', tagId);\n                window.location.href = url.toString();\n            }\n            const getQueryParam = (name) => {\n                return new URLSearchParams(window.location.search).get(name);\n            };\n\n            \/\/ \u68c0\u67e5\u662f\u5426\u5b58\u5728 Slug (\u4f18\u5148\uff1a\u5148\u770b PHP \u6ce8\u5165\u7684\u5168\u5c40\u53d8\u91cf\uff0c\u518d\u770b URL \u53c2\u6570)\n            const hasSlug = (window.currentBlogSlug && window.currentBlogSlug !== \"\") || getQueryParam('slug');\n\n            \/\/ \u68c0\u67e5\u662f\u5426\u5b58\u5728 ID (\u540e\u5907\uff1a\u5148\u770b PHP \u6ce8\u5165\u7684\u7b80\u7801\u53d8\u91cf\uff0c\u518d\u770b URL \u53c2\u6570)\n            const hasId = (window.usc_fixed_id && window.usc_fixed_id !== \"\") || getQueryParam('id');\n            onMounted(() => {\n                if (hasSlug || hasId) {\n                    getPost();\n                } else {\n                    pageLoading.value = false;\n                    ElMessage.error('No post found.');\n                    console.warn(\"URL\u4e2d\u6ca1\u6709\u627e\u5230ID\u53c2\u6570\");\n                    \/\/ \u8fd9\u91cc\u53ef\u4ee5\u505a\u91cd\u5b9a\u5411\u5904\u7406\uff0c\u6bd4\u5982\u56de\u5230\u9996\u9875\n                    \/\/ window.location.href = '\/blog';\n                }\n                try {\n                    loginUser.value = JSON.parse(localStorage.getItem('student_info') || localStorage.getItem('user_info') || 'null')\n                } catch (error) {\n                    loginUser.value = localStorage.getItem('student_token') ? {} : null\n                }\n                \/\/ console.log(123123123123123, loginUser.value)\n                updateTimer();\n                timerInterval = setInterval(updateTimer, 1000);\n\n                if (processedContent.value) {\n                    nextTick(() => {\n                        generateTOC()\n                        assignIdsToVisibleContent();\n                        setupStickyContentTables();\n                    });\n                }\n\n                \/\/ [\u53ef\u9009] \u6eda\u52a8\u76d1\u542c\uff0c\u9ad8\u4eae\u5f53\u524d\u9605\u8bfb\u4f4d\u7f6e\n                window.addEventListener('scroll', () => {\n                    const headers = document.querySelectorAll('.content h1, .content h2, .content h3');\n                    let current = '';\n                    headers.forEach(header => {\n                        const top = header.getBoundingClientRect().top;\n                        if (top < 150) { \/\/ \u8ddd\u79bb\u9876\u90e8 150px \u89c6\u4e3a\u6fc0\u6d3b\n                            current = header.id;\n                        }\n                    });\n                    if (current) activeId.value = current;\n                });\n\n                document.addEventListener('click', handleBlogPlanDocumentClick);\n            });\n            const activeFaq = ref([]);\/\/\u7a7a\u9ed8\u8ba4\u95ed\u5408\n            onUnmounted(() => {\n                if(timerInterval) clearInterval(timerInterval);\n                if (stickyTableResizeObserver) stickyTableResizeObserver.disconnect();\n                document.removeEventListener('click', handleBlogPlanDocumentClick);\n            });\n\n            return {\n                tocTree,\n                sidebarRef,\n                toggleSection,\n                scrollToId,\n                handleSidebarWheel,\n                activeId,\n                timer,\n                goToBuy,\n                activeFaq,\n                blog,\n                pageLoading,\n                loadingCopy,\n                formatDate,\n                loginUser,\n                loginform,\n                is_login,\n                login_title,\n                login_subtitle,\n                login_forget_password,\n                login_submit,\n                login_submit_password,\n                handleSubmit,\n                login_from_error,\n                emailSubmitted,\n                close_login,\n                checkLogin,\n                blogPlanEmbedRef,\n                activeFeatureHelpId,\n                clearFeatureHelpHover,\n                clearFeatureHelp,\n                loading2,\n                processedContent,\n                shouldShowLock,\n                shareClick,\n                backLink,\n                filterByTag,\n                endTime,\n                faq,\n                lockTitle,\n                lockDesc,\n                btnBuyText,\n                btnLoginText,\n                blogContentParts,\n                billingCycle,\n                billingPriceUnitLabel,\n                billingToggleSecondaryLabel,\n                compareFeatures,\n                compareSlots,\n                displayPrice,\n                filteredProducts,\n                formatPrice,\n                getFeatureDisplay,\n                getProviderNetworkLink,\n                getSeriesOptionLabel,\n                hasBrochureLink,\n                hasMedicationGuideLink,\n                hasPolicyLink,\n                hasProviderNetworkLink,\n                handleViewMoreToggle,\n                mfa,\n                cancelMfa,\n                nativeDateOfBirth,\n                noPlanDisplayMessage,\n                normalizePlanName,\n                getFeatureHelpId,\n                featureHasTierGuide,\n                openBrochure,\n                openMedicationGuide,\n                openPolicy,\n                planCards,\n                planCopy,\n                planNotice,\n                plansError,\n                plansLoading,\n                getFeatureHelp,\n                getTierValueHelp,\n                selectProduct,\n                selectedCompareProducts,\n                selectedForCompare,\n                setFeatureHelpHover,\n                setDateOfBirth,\n                setSeriesOption,\n                toggleFeatureHelp,\n                showCompareModal,\n                todayIso,\n                toggleBillingCycle,\n                toggleCompare,\n                viewMore,\n                visibleFeatures\n            };\n        }\n    });\n    app.use(ElementPlus);\n    \/\/ \u6302\u8f7d\u5230 id=\"app\" \u7684 div \u4e0a\n    app.mount('#app');\n<\/script>\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-global-header-display":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","footnotes":""},"class_list":["post-37385","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v22.6 (Yoast SEO v26.4) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>blog | GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.goglobalsafe.com\/zh\/blog\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"blog\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.goglobalsafe.com\/zh\/blog\/\" \/>\n<meta property=\"og:site_name\" content=\"GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-29T10:15:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"1000\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.goglobalsafe.com\/blog\/\",\"url\":\"https:\/\/www.goglobalsafe.com\/blog\/\",\"name\":\"blog | GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848\",\"isPartOf\":{\"@id\":\"https:\/\/www.goglobalsafe.com\/#website\"},\"datePublished\":\"2025-12-26T08:30:44+00:00\",\"dateModified\":\"2026-01-29T10:15:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.goglobalsafe.com\/blog\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.goglobalsafe.com\/blog\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.goglobalsafe.com\/blog\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.goglobalsafe.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"blog\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.goglobalsafe.com\/#website\",\"url\":\"https:\/\/www.goglobalsafe.com\/\",\"name\":\"GoGlobalSafe Student Insurance\",\"description\":\"Your Health, Our Priority\",\"publisher\":{\"@id\":\"https:\/\/www.goglobalsafe.com\/#organization\"},\"alternateName\":\"GoGlobalSafe international student insurance\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.goglobalsafe.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.goglobalsafe.com\/#organization\",\"name\":\"Golobal student consulting limited\",\"alternateName\":\"GoGlobalSafe\",\"url\":\"https:\/\/www.goglobalsafe.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.goglobalsafe.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO3.png\",\"contentUrl\":\"https:\/\/www.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO3.png\",\"width\":500,\"height\":140,\"caption\":\"Golobal student consulting limited\"},\"image\":{\"@id\":\"https:\/\/www.goglobalsafe.com\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"blog | GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.goglobalsafe.com\/zh\/blog\/","og_locale":"zh_CN","og_type":"article","og_title":"blog","og_url":"https:\/\/www.goglobalsafe.com\/zh\/blog\/","og_site_name":"GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848","article_modified_time":"2026-01-29T10:15:36+00:00","og_image":[{"width":1000,"height":1000,"url":"https:\/\/www.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO1.png","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.goglobalsafe.com\/blog\/","url":"https:\/\/www.goglobalsafe.com\/blog\/","name":"blog | GoGlobalsafe-\u7559\u5b66\u751f\u4fdd\u9669\u4e00\u7ad9\u5f0f\u89e3\u51b3\u65b9\u6848","isPartOf":{"@id":"https:\/\/www.goglobalsafe.com\/#website"},"datePublished":"2025-12-26T08:30:44+00:00","dateModified":"2026-01-29T10:15:36+00:00","breadcrumb":{"@id":"https:\/\/www.goglobalsafe.com\/blog\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.goglobalsafe.com\/blog\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.goglobalsafe.com\/blog\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.goglobalsafe.com\/"},{"@type":"ListItem","position":2,"name":"blog"}]},{"@type":"WebSite","@id":"https:\/\/www.goglobalsafe.com\/#website","url":"https:\/\/www.goglobalsafe.com\/","name":"GoGlobalSafe \u5b66\u751f\u4fdd\u9669","description":"\u60a8\u7684\u5065\u5eb7\uff0c\u6211\u4eec\u7684\u9996\u8981\u4efb\u52a1","publisher":{"@id":"https:\/\/www.goglobalsafe.com\/#organization"},"alternateName":"GoGlobalSafe international student insurance","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.goglobalsafe.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":"Organization","@id":"https:\/\/www.goglobalsafe.com\/#organization","name":"\u73af\u7403\u5b66\u751f\u54a8\u8be2\u6709\u9650\u516c\u53f8","alternateName":"GoGlobalSafe","url":"https:\/\/www.goglobalsafe.com\/","logo":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.goglobalsafe.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO3.png","contentUrl":"https:\/\/www.goglobalsafe.com\/wp-content\/uploads\/2023\/04\/LOGO3.png","width":500,"height":140,"caption":"Golobal student consulting limited"},"image":{"@id":"https:\/\/www.goglobalsafe.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/pages\/37385","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/comments?post=37385"}],"version-history":[{"count":13,"href":"https:\/\/www.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/pages\/37385\/revisions"}],"predecessor-version":[{"id":37734,"href":"https:\/\/www.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/pages\/37385\/revisions\/37734"}],"wp:attachment":[{"href":"https:\/\/www.goglobalsafe.com\/zh\/wp-json\/wp\/v2\/media?parent=37385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}