{"id":5633,"date":"2026-02-23T00:00:40","date_gmt":"2026-02-23T00:00:40","guid":{"rendered":"https:\/\/ary-themes.com\/?page_id=5633"},"modified":"2026-03-04T09:21:49","modified_gmt":"2026-03-04T09:21:49","slug":"snapchat-private-story","status":"publish","type":"page","link":"https:\/\/ary-themes.com\/tools\/social-downloader\/snapchat-private-story\/","title":{"rendered":"Snapchat Private Story Downloader \u2013 Easy Save"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"5633\" class=\"elementor elementor-5633\">\n\t\t\t\t<div class=\"elementor-element elementor-element-331d42ed e-con-full e-flex e-con e-parent\" data-id=\"331d42ed\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-31fd31ce elementor-widget elementor-widget-shortcode\" data-id=\"31fd31ce\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- START OF FILE -->\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.5.0\/css\/all.min.css\">\r\n<script src=\"https:\/\/code.jquery.com\/jquery-3.6.0.min.js\"><\/script>\r\n\r\n<style>\r\n    \/* Reset and Base Styles *\/\r\n    .sc-story-viewer * {\r\n        margin: 0;\r\n        padding: 0;\r\n        box-sizing: border-box;\r\n    }\r\n\r\n    .sc-story-viewer {\r\n        font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\r\n        \/* Deep Blue Gradient for Tool Section #1A2E46 *\/\r\n        background: linear-gradient(135deg, #1A2E46 0%, #243b55 50%, #1A2E46 100%);\r\n        background-size: 200% 200%;\r\n        animation: gradientShift 15s ease infinite;\r\n        line-height: 1.6;\r\n        min-height: 100vh;\r\n        padding: 0 !important;\r\n        margin: 0 !important;\r\n        width: 100% !important;\r\n        max-width: 100% !important;\r\n        color: #333;\r\n        overflow-x: hidden;\r\n    }\r\n\r\n    @keyframes gradientShift {\r\n        0% { background-position: 0% 50%; }\r\n        50% { background-position: 100% 50%; }\r\n        100% { background-position: 0% 50%; }\r\n    }\r\n\r\n    .sc-story-viewer .main-contain {\r\n        width: 100%;\r\n        margin: 0 auto;\r\n        padding: 40px 0 0 0;\r\n    }\r\n\r\n    \/* Container for the moved header to ensure alignment *\/\r\n    .sc-story-viewer .sc-header {\r\n        text-align: center;\r\n        margin-bottom: 35px;\r\n        padding: 0 20px;\r\n        position: relative;\r\n        z-index: 5;\r\n    }\r\n\r\n    \/* Tool Wrapper - Glassy Dark Theme *\/\r\n    .sc-story-viewer .sc-tool-wrapper {\r\n        width: 94%;\r\n        max-width: 1200px;\r\n        margin: 0 auto 50px auto;\r\n        padding: 40px 30px;\r\n        border-radius: 20px;\r\n        background: rgba(26, 46, 70, 0.85); \/* Dark Glassy *\/\r\n        backdrop-filter: blur(12px);\r\n        color: #fff; \/* White text for dark bg *\/\r\n        text-align: center;\r\n        \/* Orange Shadow *\/\r\n        box-shadow: 0 20px 50px rgba(242, 161, 75, 0.15);\r\n        position: relative;\r\n        overflow: hidden;\r\n        border: 1px solid rgba(255, 255, 255, 0.1);\r\n    }\r\n\r\n    .sc-story-viewer .sc-tool-wrapper::before {\r\n        content: \"\";\r\n        position: absolute;\r\n        top: 0;\r\n        left: 0;\r\n        width: 100%;\r\n        height: 100%;\r\n        background: radial-gradient(circle at top right, rgba(242, 161, 75, 0.1), transparent 60%);\r\n        pointer-events: none;\r\n    }\r\n\r\n    .sc-story-viewer .sc-header h1 {\r\n        font-size: clamp(28px, 6vw, 42px); \/* Slightly increased for standalone title *\/\r\n        font-weight: 800;\r\n        color: #ffffff;\r\n        margin-bottom: 15px;\r\n        letter-spacing: -0.5px;\r\n        line-height: 1.2;\r\n        text-shadow: 0 2px 10px rgba(0,0,0,0.3);\r\n    }\r\n\r\n    .sc-story-viewer .sc-header h1 span {\r\n        \/* Accent Color #F2A14B *\/\r\n        color: #F2A14B;\r\n        position: relative;\r\n        display: inline-block;\r\n    }\r\n\r\n    .sc-story-viewer .sc-header h1 span::after {\r\n        content: \"\";\r\n        position: absolute;\r\n        bottom: -3px;\r\n        left: 0;\r\n        width: 100%;\r\n        height: 3px;\r\n        background: #F2A14B;\r\n        border-radius: 10px;\r\n    }\r\n\r\n    .sc-story-viewer .sc-header p {\r\n        font-size: 18px; \/* Slightly increased for better visibility on bg *\/\r\n        margin: 15px auto 0;\r\n        line-height: 1.6;\r\n        font-weight: 500;\r\n        opacity: 0.95;\r\n        max-width: 700px;\r\n        color: #e0e0e0;\r\n    }\r\n\r\n    \/* Input Area *\/\r\n    .sc-story-viewer .sc-input-area {\r\n        display: flex;\r\n        align-items: center;\r\n        background: #fff;\r\n        padding: 25px 20px;\r\n        border-radius: 16px;\r\n        gap: 15px;\r\n        margin: 0 auto;\r\n        max-width: 100%;\r\n        flex-wrap: wrap;\r\n        box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);\r\n        border: 2px solid rgba(242, 161, 75, 0.3);\r\n    }\r\n\r\n    .sc-story-viewer .sc-input-area input {\r\n        flex-grow: 1;\r\n        padding: 14px 18px;\r\n        font-size: 16px;\r\n        border: 2px solid #e0e0e0;\r\n        outline: none;\r\n        min-width: 200px;\r\n        background: #fafafa;\r\n        border-radius: 12px;\r\n        transition: all 0.3s;\r\n        color: #333;\r\n        font-weight: 500;\r\n    }\r\n\r\n    .sc-story-viewer .sc-input-area input:focus {\r\n        border-color: #F2A14B;\r\n        background: #fff;\r\n        box-shadow: 0 0 0 3px rgba(242, 161, 75, 0.2);\r\n    }\r\n\r\n    .sc-story-viewer .view-btn {\r\n        border: none;\r\n        border-radius: 12px;\r\n        padding: 14px 30px;\r\n        cursor: pointer;\r\n        font-weight: 600;\r\n        transition: all 0.3s;\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 8px;\r\n        font-size: 15px;\r\n        \/* Orange Gradient *\/\r\n        background: linear-gradient(135deg, #F2A14B, #e68a2e);\r\n        color: white;\r\n        box-shadow: 0 5px 15px rgba(242, 161, 75, 0.4);\r\n    }\r\n\r\n    .sc-story-viewer .view-btn:hover {\r\n        transform: translateY(-2px);\r\n        box-shadow: 0 8px 20px rgba(242, 161, 75, 0.5);\r\n    }\r\n\r\n    .sc-story-viewer .view-btn:disabled {\r\n        opacity: 0.6;\r\n        cursor: not-allowed;\r\n        background: #ccc;\r\n        box-shadow: none;\r\n    }\r\n\r\n    .sc-story-viewer #error-message {\r\n        color: #ff6b6b;\r\n        margin-top: 15px;\r\n        display: none;\r\n        font-weight: 500;\r\n        background: rgba(255, 0, 0, 0.1);\r\n        padding: 10px;\r\n        border-radius: 8px;\r\n    }\r\n\r\n    \/* Result Section *\/\r\n    .sc-story-viewer .tools-result {\r\n        width: 94%;\r\n        max-width: 1200px;\r\n        margin: 0 auto 40px auto;\r\n        display: none; \/* Initially hidden *\/\r\n    }\r\n\r\n    .sc-story-viewer .sc-result {\r\n        margin-top: 30px;\r\n        background: #fff;\r\n        border-radius: 20px;\r\n        padding: 30px;\r\n        color: #333;\r\n        box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);\r\n        animation: fadeIn 0.5s ease-out;\r\n        border: 1px solid rgba(0, 0, 0, 0.05);\r\n    }\r\n\r\n    @keyframes fadeIn {\r\n        from { opacity: 0; transform: translateY(20px); }\r\n        to { opacity: 1; transform: translateY(0); }\r\n    }\r\n\r\n    \/* Stories Grid *\/\r\n    .sc-story-viewer .stories-grid {\r\n        display: grid;\r\n        grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\r\n        gap: 25px;\r\n        margin-top: 30px;\r\n        padding: 20px 0;\r\n    }\r\n\r\n    .sc-story-viewer .story-card {\r\n        border-radius: 16px;\r\n        overflow: hidden;\r\n        background: #fff;\r\n        box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);\r\n        transition: all 0.3s;\r\n        border: 1px solid #eee;\r\n        animation: slideUp 0.5s ease-out;\r\n        animation-fill-mode: both;\r\n    }\r\n\r\n    @keyframes slideUp {\r\n        from { opacity: 0; transform: translateY(20px); }\r\n        to { opacity: 1; transform: translateY(0); }\r\n    }\r\n\r\n    .sc-story-viewer .story-card:hover {\r\n        transform: translateY(-5px);\r\n        box-shadow: 0 12px 30px rgba(242, 161, 75, 0.15);\r\n        border-color: rgba(242, 161, 75, 0.4);\r\n    }\r\n\r\n    .sc-story-viewer .story-img-container {\r\n        position: relative;\r\n        overflow: hidden;\r\n        aspect-ratio: 9 \/ 16;\r\n        cursor: pointer;\r\n    }\r\n\r\n    .sc-story-viewer .story-thumb {\r\n        width: 100%;\r\n        height: 100%;\r\n        object-fit: cover;\r\n        display: block;\r\n    }\r\n\r\n    .sc-story-viewer .story-overlay {\r\n        position: absolute;\r\n        top: 0;\r\n        left: 0;\r\n        right: 0;\r\n        bottom: 0;\r\n        background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 50%, rgba(0, 0, 0, 0.5) 100%);\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        opacity: 0;\r\n        transition: opacity 0.3s ease;\r\n        pointer-events: none;\r\n    }\r\n\r\n    .sc-story-viewer .story-overlay button {\r\n        pointer-events: auto;\r\n    }\r\n\r\n    .sc-story-viewer .story-img-container:hover .story-overlay {\r\n        opacity: 1;\r\n    }\r\n\r\n    .sc-story-viewer .story-img-container[data-type=\"video\"] .story-overlay {\r\n        display: none; \r\n    }\r\n\r\n    .sc-story-viewer .story-img-container[data-type=\"video\"] video.story-video:not([paused]) ~ .story-overlay,\r\n    .sc-story-viewer .story-img-container[data-type=\"video\"]:has(video.story-video:not([paused])) .story-overlay {\r\n        display: none;\r\n    }\r\n\r\n    \/* Always visible download icon in corner *\/\r\n    .sc-story-viewer .story-always-download {\r\n        position: absolute;\r\n        top: 10px;\r\n        right: 10px;\r\n        background: rgba(255, 255, 255, 0.9);\r\n        color: #F2A14B;\r\n        width: 36px;\r\n        height: 36px;\r\n        border-radius: 50%;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        cursor: pointer;\r\n        transition: all 0.3s;\r\n        border: 1px solid rgba(242, 161, 75, 0.2);\r\n        font-size: 14px;\r\n        z-index: 10;\r\n        box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);\r\n    }\r\n\r\n    .sc-story-viewer .story-always-download:hover {\r\n        background: #F2A14B;\r\n        color: white;\r\n        transform: scale(1.15);\r\n        box-shadow: 0 5px 15px rgba(242, 161, 75, 0.3);\r\n    }\r\n\r\n    \/* Always visible play icon for videos *\/\r\n    .sc-story-viewer .story-always-play {\r\n        position: absolute;\r\n        top: 50%;\r\n        left: 50%;\r\n        transform: translate(-50%, -50%);\r\n        background: rgba(255, 255, 255, 0.85);\r\n        color: #F2A14B;\r\n        width: 60px;\r\n        height: 60px;\r\n        border-radius: 50%;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        cursor: pointer;\r\n        transition: all 0.3s;\r\n        border: 2px solid #fff;\r\n        font-size: 24px;\r\n        z-index: 15;\r\n        box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);\r\n        pointer-events: auto;\r\n    }\r\n\r\n    .sc-story-viewer .story-always-play:hover {\r\n        background: #F2A14B;\r\n        color: white;\r\n        transform: translate(-50%, -50%) scale(1.1);\r\n        box-shadow: 0 8px 25px rgba(242, 161, 75, 0.4);\r\n    }\r\n\r\n    .sc-story-viewer .story-always-play i {\r\n        margin-left: 3px; \r\n    }\r\n\r\n    .sc-story-viewer .story-title {\r\n        color: #333;\r\n        font-weight: 700;\r\n        font-size: 16px;\r\n        text-shadow: none;\r\n    }\r\n\r\n    .sc-story-viewer .story-badge {\r\n        background: rgba(242, 161, 75, 0.1);\r\n        border-radius: 999px;\r\n        padding: 4px 12px;\r\n        font-size: 12px;\r\n        color: #F2A14B;\r\n        display: inline-flex;\r\n        align-items: center;\r\n        gap: 6px;\r\n        font-weight: 600;\r\n        cursor: pointer;\r\n        transition: all 0.3s;\r\n        user-select: none;\r\n    }\r\n\r\n    .sc-story-viewer .story-badge:hover {\r\n        background: #F2A14B;\r\n        color: white;\r\n        transform: scale(1.05);\r\n        box-shadow: 0 2px 8px rgba(242, 161, 75, 0.2);\r\n    }\r\n\r\n    .sc-story-viewer .story-meta {\r\n        padding: 15px;\r\n        font-size: 13px;\r\n        border-top: 1px solid #eee;\r\n    }\r\n\r\n    .sc-story-viewer .story-meta-row {\r\n        display: flex;\r\n        justify-content: space-between;\r\n        margin-bottom: 8px;\r\n        color: #555;\r\n    }\r\n\r\n    .sc-story-viewer .story-meta-label {\r\n        color: #888;\r\n        font-weight: 500;\r\n    }\r\n\r\n    .sc-story-viewer .story-meta-value {\r\n        color: #333;\r\n        font-weight: 600;\r\n    }\r\n\r\n    .sc-story-viewer .snap-list {\r\n        border-top: 1px solid #eee;\r\n        padding: 15px;\r\n        max-height: 400px;\r\n        overflow-y: auto;\r\n        overflow-x: hidden;\r\n    }\r\n\r\n    .sc-story-viewer .snap-list::-webkit-scrollbar {\r\n        width: 8px;\r\n    }\r\n\r\n    .sc-story-viewer .snap-list::-webkit-scrollbar-track {\r\n        background: #f5f5f5;\r\n        border-radius: 4px;\r\n    }\r\n\r\n    .sc-story-viewer .snap-list::-webkit-scrollbar-thumb {\r\n        background: #ccc;\r\n        border-radius: 4px;\r\n    }\r\n\r\n    .sc-story-viewer .snap-list::-webkit-scrollbar-thumb:hover {\r\n        background: #F2A14B;\r\n    }\r\n\r\n    .sc-story-viewer .snap-item {\r\n        display: flex;\r\n        gap: 12px;\r\n        margin-bottom: 12px;\r\n        padding-bottom: 12px;\r\n        border-bottom: 1px solid #eee;\r\n    }\r\n\r\n    .sc-story-viewer .snap-item:last-child {\r\n        border-bottom: none;\r\n        margin-bottom: 0;\r\n        padding-bottom: 0;\r\n    }\r\n\r\n    .sc-story-viewer .snap-thumb {\r\n        width: 60px;\r\n        height: 90px;\r\n        border-radius: 8px;\r\n        overflow: hidden;\r\n        flex-shrink: 0;\r\n        background: #eee;\r\n    }\r\n\r\n    .sc-story-viewer .snap-thumb img {\r\n        width: 100%;\r\n        height: 100%;\r\n        object-fit: cover;\r\n    }\r\n\r\n    .sc-story-viewer .snap-meta {\r\n        flex: 1;\r\n        font-size: 12px;\r\n        text-align: left;\r\n    }\r\n\r\n    .sc-story-viewer .snap-badge {\r\n        display: inline-block;\r\n        padding: 2px 8px;\r\n        border-radius: 999px;\r\n        background: rgba(242, 161, 75, 0.1);\r\n        color: #F2A14B;\r\n        font-size: 11px;\r\n        margin-bottom: 6px;\r\n        font-weight: 600;\r\n    }\r\n\r\n    .sc-story-viewer .no-result {\r\n        border: 2px dashed #ccc;\r\n        padding: 40px 20px;\r\n        margin-top: 30px;\r\n        text-align: center;\r\n        font-size: 16px;\r\n        font-weight: 500;\r\n        border-radius: 12px;\r\n        color: #777;\r\n        background: #fafafa;\r\n    }\r\n\r\n    .sc-story-viewer .no-result i {\r\n        font-size: 48px;\r\n        color: #ddd;\r\n        margin-bottom: 15px;\r\n        display: block;\r\n    }\r\n\r\n    \/* Skeleton Loaders *\/\r\n    @keyframes shimmer {\r\n        0% { background-position: -1000px 0; }\r\n        100% { background-position: 1000px 0; }\r\n    }\r\n\r\n    .sc-story-viewer .skeleton-grid {\r\n        display: grid;\r\n        grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\r\n        gap: 25px;\r\n        margin-top: 30px;\r\n        padding: 20px 0;\r\n    }\r\n\r\n    .sc-story-viewer .skeleton-story-card {\r\n        border-radius: 16px;\r\n        overflow: hidden;\r\n        background: #fff;\r\n        border: 1px solid #eee;\r\n    }\r\n\r\n    .sc-story-viewer .skeleton-img {\r\n        width: 100%;\r\n        aspect-ratio: 9 \/ 16;\r\n        background: linear-gradient(90deg, #e0e0e0 25%, #f0f0f0 50%, #e0e0e0 75%);\r\n        background-size: 1000px 100%;\r\n        animation: shimmer 2s infinite linear;\r\n    }\r\n\r\n    .sc-story-viewer .skeleton-text {\r\n        height: 14px;\r\n        margin: 10px 15px;\r\n        border-radius: 4px;\r\n        background: linear-gradient(90deg, #e0e0e0 25%, #f0f0f0 50%, #e0e0e0 75%);\r\n        background-size: 1000px 100%;\r\n        animation: shimmer 2s infinite linear;\r\n    }\r\n\r\n    .sc-story-viewer .skeleton-text.short {\r\n        width: 60%;\r\n    }\r\n\r\n    \/* Story Header *\/\r\n    .sc-story-viewer .stories-header {\r\n        display: flex;\r\n        justify-content: space-between;\r\n        align-items: baseline;\r\n        margin-bottom: 20px;\r\n        padding-bottom: 15px;\r\n        border-bottom: 2px solid #eee;\r\n    }\r\n\r\n    .sc-story-viewer .stories-header h2 {\r\n        margin: 0;\r\n        font-size: 24px;\r\n        font-weight: 700;\r\n        color: #1a1a1a;\r\n    }\r\n    \r\n\r\n    .sc-story-viewer .stories-header .count {\r\n        font-size: 14px;\r\n        color: #777;\r\n    }\r\n\r\n    \/* Action Buttons *\/\r\n    .sc-story-viewer .story-actions {\r\n        display: flex;\r\n        gap: 10px;\r\n        padding: 15px;\r\n        border-top: 1px solid #eee;\r\n    }\r\n\r\n    .sc-story-viewer .story-action-btn {\r\n        flex: 1;\r\n        padding: 10px;\r\n        border-radius: 8px;\r\n        border: none;\r\n        background: #f5f5f5;\r\n        color: #555;\r\n        cursor: pointer;\r\n        font-weight: 600;\r\n        font-size: 13px;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        gap: 6px;\r\n        transition: all 0.3s;\r\n    }\r\n\r\n    .sc-story-viewer .story-action-btn:hover {\r\n        background: rgba(242, 161, 75, 0.1);\r\n        color: #F2A14B;\r\n        transform: translateY(-2px);\r\n    }\r\n\r\n    .sc-story-viewer .story-action-btn i {\r\n        font-size: 14px;\r\n    }\r\n\r\n    \/* Streaming button *\/\r\n    .sc-story-viewer .story-stream-btn {\r\n        flex: 1;\r\n        padding: 10px;\r\n        border-radius: 8px;\r\n        border: none;\r\n        background: rgba(242, 161, 75, 0.1);\r\n        color: #F2A14B;\r\n        cursor: pointer;\r\n        font-weight: 600;\r\n        font-size: 13px;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        gap: 6px;\r\n        transition: all 0.3s;\r\n    }\r\n\r\n    .sc-story-viewer .story-stream-btn:hover {\r\n        background: #F2A14B;\r\n        color: #fff;\r\n        transform: translateY(-2px);\r\n    }\r\n\r\n    .sc-story-viewer .story-stream-btn i {\r\n        font-size: 14px;\r\n    }\r\n\r\n    \/* Collapsible snap list *\/\r\n    .sc-story-viewer .snap-list.collapsed {\r\n        max-height: 0;\r\n        padding: 0 15px;\r\n        overflow: hidden;\r\n    }\r\n\r\n    \/* Modal Styles *\/\r\n    .sc-media-modal {\r\n        position: fixed;\r\n        top: 0;\r\n        left: 0;\r\n        width: 100%;\r\n        height: 100%;\r\n        z-index: 10000;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        opacity: 0;\r\n        transition: opacity 0.3s ease;\r\n        pointer-events: none;\r\n    }\r\n\r\n    .sc-media-modal.active {\r\n        opacity: 1;\r\n        pointer-events: all;\r\n    }\r\n\r\n    .sc-modal-backdrop {\r\n        position: absolute;\r\n        top: 0;\r\n        left: 0;\r\n        width: 100%;\r\n        height: 100%;\r\n        background: rgba(0, 0, 0, 0.9);\r\n        cursor: pointer;\r\n    }\r\n\r\n    .sc-modal-content {\r\n        position: relative;\r\n        background: white;\r\n        border-radius: 20px;\r\n        padding: 30px;\r\n        max-width: 90vw;\r\n        max-height: 90vh;\r\n        overflow: auto;\r\n        z-index: 10001;\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: center;\r\n    }\r\n\r\n    .sc-modal-actions {\r\n        margin-top: 20px;\r\n        display: flex;\r\n        gap: 10px;\r\n    }\r\n\r\n    .sc-modal-media {\r\n        max-width: 90vw;\r\n        max-height: 70vh;\r\n        object-fit: contain;\r\n        border-radius: 10px;\r\n    }\r\n\r\n    .sc-modal-download-btn {\r\n        margin-top: 20px;\r\n        padding: 12px 24px;\r\n        background: linear-gradient(135deg, #F2A14B, #e68a2e);\r\n        color: white;\r\n        border: none;\r\n        border-radius: 10px;\r\n        cursor: pointer;\r\n        font-weight: 600;\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 8px;\r\n        margin: 20px auto 0;\r\n    }\r\n\r\n    .sc-modal-download-btn:hover {\r\n        transform: translateY(-2px);\r\n        box-shadow: 0 5px 15px rgba(242, 161, 75, 0.4);\r\n    }\r\n\r\n    .sc-close-modal {\r\n        position: absolute;\r\n        top: 15px;\r\n        right: 15px;\r\n        background: #F2A14B;\r\n        color: white;\r\n        border: none;\r\n        width: 40px;\r\n        height: 40px;\r\n        border-radius: 50%;\r\n        cursor: pointer;\r\n        font-size: 20px;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        z-index: 10002;\r\n        transition: background 0.3s;\r\n    }\r\n\r\n    .sc-close-modal:hover {\r\n        background: #e68a2e;\r\n    }\r\n\r\n    body.sc-modal-open {\r\n        overflow: hidden;\r\n    }\r\n\r\n    \/* Story view and download buttons in overlay *\/\r\n    .sc-story-viewer .story-view-btn,\r\n    .sc-story-viewer .story-download-btn {\r\n        background: rgba(255, 255, 255, 0.95);\r\n        color: #F2A14B;\r\n        width: 45px;\r\n        height: 45px;\r\n        border-radius: 50%;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        cursor: pointer;\r\n        transition: all 0.3s;\r\n        border: none;\r\n        font-size: 16px;\r\n        margin: 0 5px;\r\n        box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);\r\n    }\r\n\r\n    .sc-story-viewer .story-view-btn:hover,\r\n    .sc-story-viewer .story-download-btn:hover {\r\n        transform: scale(1.1) translateY(-3px);\r\n        box-shadow: 0 8px 20px rgba(242, 161, 75, 0.3);\r\n    }\r\n\r\n    \/* Video element for inline playback *\/\r\n    .sc-story-viewer .story-video {\r\n        width: 100%;\r\n        height: 100%;\r\n        object-fit: cover;\r\n        display: none;\r\n        position: absolute;\r\n        top: 0;\r\n        left: 0;\r\n        z-index: 2;\r\n    }\r\n\r\n    \/* Fullscreen button for videos *\/\r\n    .sc-story-viewer .story-fullscreen-btn {\r\n        position: absolute;\r\n        top: 10px;\r\n        right: 50px;\r\n        background: rgba(0, 0, 0, 0.6);\r\n        color: white;\r\n        border: none;\r\n        width: 40px;\r\n        height: 40px;\r\n        border-radius: 50%;\r\n        cursor: pointer;\r\n        font-size: 16px;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        transition: background 0.3s;\r\n        z-index: 11;\r\n    }\r\n\r\n    .sc-story-viewer .story-fullscreen-btn:hover {\r\n        background: rgba(0, 0, 0, 0.8);\r\n    }\r\n\r\n    \/* Centered play button overlay for video modal *\/\r\n    .sc-modal-video-wrapper {\r\n        position: relative;\r\n        display: inline-block;\r\n        max-width: 90vw;\r\n        max-height: 70vh;\r\n    }\r\n\r\n    .sc-modal-play-overlay {\r\n        position: absolute;\r\n        top: 50%;\r\n        left: 50%;\r\n        transform: translate(-50%, -50%);\r\n        width: 80px;\r\n        height: 80px;\r\n        background: rgba(255, 255, 255, 0.8);\r\n        border-radius: 50%;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        cursor: pointer;\r\n        z-index: 10003;\r\n        transition: all 0.3s;\r\n        border: 3px solid #fff;\r\n        opacity: 1;\r\n        box-shadow: 0 10px 30px rgba(0,0,0,0.2);\r\n    }\r\n\r\n    .sc-modal-play-overlay:hover {\r\n        background: #fff;\r\n        transform: translate(-50%, -50%) scale(1.1);\r\n    }\r\n\r\n    .sc-modal-play-overlay.hidden {\r\n        opacity: 0;\r\n        pointer-events: none;\r\n    }\r\n\r\n    .sc-modal-play-overlay i {\r\n        color: #F2A14B;\r\n        font-size: 32px;\r\n        margin-left: 4px;\r\n    }\r\n\r\n    .sc-modal-media {\r\n        display: block;\r\n    }\r\n\r\n    \/* -------------------------------------- *\/\r\n    \/* NEW CONTENT SECTIONS CSS *\/\r\n    \/* -------------------------------------- *\/\r\n    .sc-content-section {\r\n        padding: 50px 0;\r\n        width: 100%;\r\n        box-sizing: border-box;\r\n    }\r\n\r\n    .sc-content-container {\r\n        \/* Max width 1200px *\/\r\n        max-width: 1200px;\r\n        margin: 0 auto;\r\n        padding: 0 15px;\r\n    }\r\n\r\n    .sc-content-title {\r\n        text-align: center;\r\n        font-size: 32px;\r\n        font-weight: 800;\r\n        margin-bottom: 40px;\r\n        position: relative;\r\n    }\r\n\r\n    .sc-content-title::after {\r\n        content: '';\r\n        display: block;\r\n        width: 80px;\r\n        height: 4px;\r\n        background: linear-gradient(90deg, #F2A14B, #e68a2e);\r\n        margin: 12px auto 0;\r\n        border-radius: 4px;\r\n    }\r\n\r\n    \/* Target First Content Section specifically via sibling selector: White BG *\/\r\n    .tools-result + .sc-content-section {\r\n        background: #ffffff;\r\n    }\r\n    \r\n    .tools-result + .sc-content-section .sc-content-title {\r\n        color: #222;\r\n    }\r\n\r\n    .tools-result + .sc-content-section .sc-info-card {\r\n        background: #fff;\r\n        color: #555;\r\n        border: 1px solid #eee;\r\n    }\r\n    \r\n    .tools-result + .sc-content-section .sc-card-title {\r\n        color: #333;\r\n    }\r\n\r\n    \/* Target Last Content Section: Dark BG *\/\r\n    .tools-result + .sc-content-section + .sc-content-section {\r\n        background:  #ffffff;\r\n    }\r\n\r\n    .tools-result + .sc-content-section + .sc-content-section .sc-content-title {\r\n        color: #151C23\r\n    }\r\n\r\n    .tools-result + .sc-content-section + .sc-content-section .sc-info-card {\r\n        background: #1f2933;\r\n        border: 1px solid rgba(255,255,255,0.05);\r\n        color: #b0b0b0;\r\n    }\r\n\r\n    .tools-result + .sc-content-section + .sc-content-section .sc-card-title {\r\n        color: #ffffff;\r\n    }\r\n\r\n    .tools-result + .sc-content-section + .sc-content-section .sc-card-text {\r\n        color: #b0b0b0;\r\n    }\r\n\r\n    .sc-grid-6 {\r\n        display: grid;\r\n        grid-template-columns: repeat(3, 1fr);\r\n        gap: 25px;\r\n    }\r\n\r\n    .sc-grid-8 {\r\n        display: grid;\r\n        grid-template-columns: repeat(4, 1fr);\r\n        gap: 20px;\r\n    }\r\n\r\n    .sc-info-card {\r\n        padding: 25px;\r\n        border-radius: 16px;\r\n        box-shadow: 0 5px 15px rgba(0,0,0,0.03);\r\n        transition: all 0.3s ease;\r\n        position: relative;\r\n        overflow: hidden;\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: flex-start;\r\n        height: 100%;\r\n        text-align: left;\r\n    }\r\n\r\n    .sc-info-card:hover {\r\n        transform: translateY(-5px);\r\n        box-shadow: 0 12px 30px rgba(242, 161, 75, 0.15);\r\n        border-color: rgba(242, 161, 75, 0.4);\r\n    }\r\n\r\n    .sc-card-icon {\r\n        width: 54px;\r\n        height: 54px;\r\n        background: rgba(242, 161, 75, 0.1);\r\n        border-radius: 12px;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        margin-bottom: 20px;\r\n        color: #F2A14B;\r\n        font-size: 24px;\r\n    }\r\n\r\n    .sc-card-title {\r\n        font-size: 19px;\r\n        font-weight: 700;\r\n        margin-bottom: 12px;\r\n    }\r\n\r\n    .sc-card-text {\r\n        font-size: 15px;\r\n        line-height: 1.5;\r\n    }\r\n\r\n    \/* Tablet Responsive *\/\r\n    @media (max-width: 1024px) {\r\n        .sc-grid-8 { grid-template-columns: repeat(2, 1fr); }\r\n        .sc-grid-6 { grid-template-columns: repeat(2, 1fr); }\r\n    }\r\n\r\n    \/* Mobile Responsive *\/\r\n    @media (max-width: 480px) {\r\n        .sc-story-viewer .main-contain { padding-top: 20px; }\r\n        .sc-tool-wrapper { padding: 25px 15px; margin-bottom: 20px; width: 96%; }\r\n        \r\n        .sc-content-section { padding: 30px 0; }\r\n        .sc-content-title { font-size: 24px; margin-bottom: 25px; }\r\n        \r\n        .sc-grid-6, .sc-grid-8 {\r\n            grid-template-columns: repeat(2, 1fr);\r\n            gap: 10px;\r\n        }\r\n        \r\n        .sc-info-card { padding: 15px 12px; min-height: 160px; }\r\n        .sc-card-icon { width: 40px; height: 40px; font-size: 18px; margin-bottom: 12px; }\r\n        .sc-card-title { font-size: 14px; margin-bottom: 6px; line-height: 1.3; }\r\n        .sc-card-text { font-size: 11px; line-height: 1.4; }\r\n    }\r\n<\/style>\r\n\r\n<div class=\"sc-story-viewer\">\r\n    <div class=\"main-contain\">\r\n        <!-- HEADER MOVED HERE FROM TOOL WRAPPER -->\r\n        <div class=\"sc-header\">\r\n            <!-- UPDATED TITLE: Snapchat Private Story Downloader -->\r\n            <h1><span>Snapchat Private Story Downloader<\/span> \u2013 Save Private Stories<\/h1>\r\n            <!-- UPDATED DESCRIPTION: Based on Private Story Downloader -->\r\n            <p>Download private Snapchat stories anonymously. Enter a username to get started.<\/p>\r\n        <\/div>\r\n\r\n        <div class=\"sc-tool-wrapper\">\r\n            <!-- HEADER REMOVED FROM HERE -->\r\n\r\n            <div class=\"sc-input-area\">\r\n                <div style=\"width: 100%; text-align: left; margin-bottom: 10px;\">\r\n                    <i class=\"fa-brands fa-snapchat\" style=\"color: #F2A14B; font-size: 18px; margin-right: 8px;\"><\/i>\r\n                    <span style=\"font-weight: 500; color: #333;\">Enter Snapchat Username<\/span>\r\n                <\/div>\r\n                <input type=\"text\" id=\"input-username\" placeholder=\"e.g., private_user123\" \/>\r\n                <button class=\"view-btn\" id=\"story-view-btn\">\r\n                    <i class=\"fa-solid fa-download\"><\/i> Download Private Story\r\n                <\/button>\r\n            <\/div>\r\n\r\n            <div id=\"error-message\"><\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"tools-result\">\r\n        <div class=\"sc-result\" id=\"stories-result\">\r\n            <!-- Skeleton Loading -->\r\n            <div id=\"skeleton-loading\" style=\"display: none;\">\r\n                <div style=\"padding: 40px; text-align: center;\">\r\n                    <div style=\"width: 120px; height: 120px; background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); background-size: 200% 100%; animation: loading 1.5s infinite; border-radius: 50%; margin: 0 auto 20px;\"><\/div>\r\n                    <div style=\"height: 24px; width: 200px; background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); background-size: 200% 100%; animation: loading 1.5s infinite; border-radius: 4px; margin: 0 auto 12px;\"><\/div>\r\n                    <div style=\"height: 16px; width: 150px; background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); background-size: 200% 100%; animation: loading 1.5s infinite; border-radius: 4px; margin: 0 auto;\"><\/div>\r\n                <\/div>\r\n            <\/div>\r\n            <style>@keyframes loading { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }<\/style>\r\n\r\n            <!-- Actual Content -->\r\n            <div id=\"actual-content\">\r\n                <!-- Profile Header -->\r\n                <div class=\"sc-profile-header\" style=\"display: none; padding: 30px; background: rgba(255,255,255,0.05); border-radius: 20px; margin-bottom: 30px; border: 1px solid rgba(255,255,255,0.1);\">\r\n                    <div style=\"display: flex; align-items: center; gap: 25px; flex-wrap: wrap;\">\r\n                        <div class=\"profile-image-container\" style=\"flex-shrink: 0;\">\r\n                            <div class=\"profile-image\" style=\"width: 120px; height: 120px; border-radius: 50%; background: rgba(255,255,255,0.1); display: flex; align-items: center; justify-content: center; overflow: hidden;\">\r\n                                <i class=\"fa-brands fa-snapchat\" style=\"font-size: 60px; color: #FFFC00;\"><\/i>\r\n                            <\/div>\r\n                        <\/div>\r\n                        <div style=\"flex: 1;\">\r\n                            <h2 id=\"profile-fullname\" style=\"margin: 0 0 8px 0; color: #fff; font-size: 28px; font-weight: 700;\">Profile Name<\/h2>\r\n                            <p id=\"profile-username\" style=\"margin: 0 0 15px 0; color: #aaa; font-size: 16px;\">@username<\/p>\r\n                            <div id=\"profile-bio-section\" style=\"display: none; margin: 15px 0; padding: 15px; background: rgba(255,255,255,0.05); border-radius: 12px;\">\r\n                                <p style=\"margin: 0; color: #ccc; font-size: 14px; line-height: 1.6;\"><\/p>\r\n                            <\/div>\r\n                            <div style=\"display: flex; gap: 30px; flex-wrap: wrap;\">\r\n                                <div style=\"text-align: center;\">\r\n                                    <div id=\"subscribers-count\" style=\"font-size: 24px; font-weight: 700; color: #FFFC00;\">0<\/div>\r\n                                    <div style=\"font-size: 12px; color: #888; text-transform: uppercase;\">Subscribers<\/div>\r\n                                <\/div>\r\n                                <div style=\"text-align: center;\">\r\n                                    <div id=\"stories-count-display\" style=\"font-size: 24px; font-weight: 700; color: #00BCD4;\">0<\/div>\r\n                                    <div style=\"font-size: 12px; color: #888; text-transform: uppercase;\">Stories<\/div>\r\n                                <\/div>\r\n                                <div style=\"text-align: center;\">\r\n                                    <div id=\"highlights-count-display\" style=\"font-size: 24px; font-weight: 700; color: #FF9800;\">0<\/div>\r\n                                    <div style=\"font-size: 12px; color: #888; text-transform: uppercase;\">Highlights<\/div>\r\n                                <\/div>\r\n                                <div style=\"text-align: center;\">\r\n                                    <div id=\"spotlights-count-display\" style=\"font-size: 24px; font-weight: 700; color: #e91e63;\">0<\/div>\r\n                                    <div style=\"font-size: 12px; color: #888; text-transform: uppercase;\">Spotlights<\/div>\r\n                                <\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- Tabs Navigation -->\r\n                <div class=\"sc-tabs\" style=\"display: none; margin-bottom: 30px;\">\r\n                    <div style=\"display: flex; gap: 10px; border-bottom: 1px solid rgba(255,255,255,0.1); padding-bottom: 10px; flex-wrap: wrap;\">\r\n                        <button class=\"active\" data-tab=\"highlights\" style=\"padding: 12px 24px; background: rgba(0,188,212,0.2); color: #00BCD4; border: none; border-radius: 25px; cursor: pointer; font-weight: 600; font-size: 14px; transition: all 0.3s;\">Highlights<\/button>\r\n                        <button data-tab=\"spotlights\" style=\"padding: 12px 24px; background: rgba(255,152,0,0.2); color: #FF9800; border: none; border-radius: 25px; cursor: pointer; font-weight: 600; font-size: 14px; transition: all 0.3s;\">Spotlights<\/button>\r\n                        <button data-tab=\"story\" style=\"padding: 12px 24px; background: rgba(233,30,99,0.2); color: #e91e63; border: none; border-radius: 25px; cursor: pointer; font-weight: 600; font-size: 14px; transition: all 0.3s;\">Story<\/button>\r\n                        <button data-tab=\"related\" style=\"padding: 12px 24px; background: rgba(156,39,176,0.2); color: #9c27b0; border: none; border-radius: 25px; cursor: pointer; font-weight: 600; font-size: 14px; transition: all 0.3s;\">Related<\/button>\r\n                        <button data-tab=\"other\" style=\"padding: 12px 24px; background: rgba(76,175,80,0.2); color: #4caf50; border: none; border-radius: 25px; cursor: pointer; font-weight: 600; font-size: 14px; transition: all 0.3s;\">Other<\/button>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- Tab Content Containers -->\r\n                <div class=\"tab-content-container\">\r\n                    <div id=\"highlights-content\" class=\"tab-content active\" style=\"display: block;\">\r\n                        <div class=\"no-result\" style=\"text-align: center; padding: 60px 20px;\">\r\n                            <i class=\"fa-solid fa-bookmark\" style=\"font-size: 48px; color: rgba(255,255,255,0.3); margin-bottom: 20px;\"><\/i>\r\n                            <p style=\"color: #888; font-size: 16px;\">No highlights available at this time<\/p>\r\n                        <\/div>\r\n                    <\/div>\r\n                    <div id=\"spotlights-content\" class=\"tab-content\" style=\"display: none;\">\r\n                        <div class=\"no-result\" style=\"text-align: center; padding: 60px 20px;\">\r\n                            <i class=\"fa-solid fa-fire\" style=\"font-size: 48px; color: rgba(255,255,255,0.3); margin-bottom: 20px;\"><\/i>\r\n                            <p style=\"color: #888; font-size: 16px;\">No spotlights available at this time<\/p>\r\n                        <\/div>\r\n                    <\/div>\r\n                    <div id=\"story-content\" class=\"tab-content\" style=\"display: none;\">\r\n                        <div class=\"no-result\" style=\"text-align: center; padding: 60px 20px;\">\r\n                            <i class=\"fa-solid fa-circle-play\" style=\"font-size: 48px; color: rgba(255,255,255,0.3); margin-bottom: 20px;\"><\/i>\r\n                            <p style=\"color: #888; font-size: 16px;\">No active story at this time<\/p>\r\n                        <\/div>\r\n                    <\/div>\r\n                    <div id=\"related-content\" class=\"tab-content\" style=\"display: none;\">\r\n                        <div class=\"no-result\" style=\"text-align: center; padding: 60px 20px;\">\r\n                            <i class=\"fa-solid fa-users\" style=\"font-size: 48px; color: rgba(255,255,255,0.3); margin-bottom: 20px;\"><\/i>\r\n                            <p style=\"color: #888; font-size: 16px;\">No related accounts available<\/p>\r\n                        <\/div>\r\n                    <\/div>\r\n                    <div id=\"other-content\" class=\"tab-content\" style=\"display: none;\">\r\n                        <div class=\"no-result\" style=\"text-align: center; padding: 60px 20px;\">\r\n                            <i class=\"fa-solid fa-info-circle\" style=\"font-size: 48px; color: rgba(255,255,255,0.3); margin-bottom: 20px;\"><\/i>\r\n                            <p style=\"color: #888; font-size: 16px;\">No additional information available<\/p>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- NEW CONTENT SECTION 1: Key Features (White BG) -->\r\n    \r\n<\/div>\r\n\r\n\r\n<script>\r\n        \/\/ Load scripts with error handling to prevent blocking page load\r\n        function loadScript(src, onError) {\r\n            const script = document.createElement('script');\r\n            script.src = src;\r\n            script.onerror = function() {\r\n                if (onError) onError();\r\n            };\r\n            document.head.appendChild(script);\r\n        }\r\n\r\n        \/\/ API base URL\r\n        var apiBaseUrl = \"https:\/\/tools.xrespond.com\";\r\n\r\n        \/\/ Load scripts with fallback\r\n        loadScript(apiBaseUrl + \"\/api\/rate-limit-handler.js\");\r\n        loadScript(apiBaseUrl + \"\/api\/js\/client-ip-detector.js\");\r\n\r\n        (function($) {\r\n            let currentMediaUrl = '';\r\n            let currentFilename = '';\r\n            \/\/ Store comments data globally for modal access\r\n            window.spotlightCommentsData = {};\r\n            window.highlightCommentsData = {};\r\n\r\n            \/\/ Suppress non-critical console messages from external scripts on page load\r\n            \/\/ These scripts auto-initialize and log messages - we'll keep only important ones\r\n            const originalConsoleLog = console.log;\r\n            const originalConsoleError = console.error;\r\n            const originalConsoleWarn = console.warn;\r\n\r\n            \/\/ Only suppress messages during initial page load (first 3 seconds)\r\n            const pageLoadTime = Date.now();\r\n            const suppressDuration = 3000; \/\/ 3 seconds\r\n\r\n            console.log = function(...args) {\r\n                const message = args.join(' ');\r\n                const elapsed = Date.now() - pageLoadTime;\r\n\r\n                \/\/ Allow important messages through\r\n                if (message.includes('Error') || message.includes('Failed') || message.includes('Uncaught')) {\r\n                    originalConsoleLog.apply(console, args);\r\n                }\r\n                \/\/ Suppress verbose initialization messages during page load\r\n                else if (elapsed < suppressDuration && (\r\n                    message.includes('Global Rate Limit Handler loaded') ||\r\n                    message.includes('IP Detection System initialized') ||\r\n                    message.includes('Client IP Detector loaded') ||\r\n                    message.includes('All API requests will automatically include') ||\r\n                    message.includes('Detecting IPv4 from free APIs') ||\r\n                    message.includes('Checking 24 free IP APIs') ||\r\n                    message.includes('Trying ipify-json') ||\r\n                    message.includes('IP found from') ||\r\n                    message.includes('IPv4 detected from free APIs') ||\r\n                    message.includes('Sending IP to service') ||\r\n                    message.includes('IP detected and ready') ||\r\n                    message.includes('IP Detection in progress')\r\n                )) {\r\n                    \/\/ Suppress these messages\r\n                    return;\r\n                }\r\n                \/\/ Allow all other messages\r\n                else {\r\n                    originalConsoleLog.apply(console, args);\r\n                }\r\n            };\r\n\r\n            console.error = function(...args) {\r\n                const message = args.join(' ');\r\n                \/\/ Suppress 405\/404 errors and JSON parse errors from IP detection scripts trying to reach non-existent endpoints\r\n                \/\/ These errors occur when running on Live Server (port 5501) instead of Laravel server (port 8002)\r\n                if (message.includes('405') || message.includes('404') ||\r\n                    message.includes('Failed to send IP to service') ||\r\n                    message.includes('Failed to load API list from backend') ||\r\n                    message.includes('JSON.parse: unexpected character') ||\r\n                    (message.includes('SyntaxError') && (message.includes('rate-limit-handler') || message.includes('api\/client-ip') || message.includes('api\/ip-finder'))) ||\r\n                    (message.includes('api\/client-ip') || message.includes('api\/ip-finder'))) {\r\n                    \/\/ These are expected when running on Live Server - IP detection still works via free APIs (ipify, etc.)\r\n                    \/\/ The backend endpoints only exist on the Laravel server (port 8002)\r\n                    return;\r\n                }\r\n                originalConsoleError.apply(console, args);\r\n            };\r\n\r\n            console.warn = function(...args) {\r\n                const message = args.join(' ');\r\n                \/\/ Suppress warnings from IP detection during page load\r\n                const elapsed = Date.now() - pageLoadTime;\r\n                if ((elapsed < suppressDuration && message.includes('IP Detection')) ||\r\n                    message.includes('api\/client-ip') ||\r\n                    message.includes('api\/ip-finder') ||\r\n                    message.includes('405') ||\r\n                    message.includes('404')) {\r\n                    return;\r\n                }\r\n                originalConsoleWarn.apply(console, args);\r\n            };\r\n\r\n            \/\/ Restore original console after suppression period\r\n            setTimeout(() => {\r\n                console.log = originalConsoleLog;\r\n                console.error = originalConsoleError;\r\n                console.warn = originalConsoleWarn;\r\n            }, suppressDuration);\r\n\r\n            \/\/ View button click handler\r\n            $(\".view-btn\").on(\"click\", async function(e) {\r\n                e.preventDefault();\r\n\r\n                const username = $(\"#input-username\").val().trim();\r\n\r\n                if (username === \"\") {\r\n                    $(\"#error-message\").text(\"Please enter a Snapchat username\").show();\r\n                    return;\r\n                }\r\n\r\n                \/\/ Reset\r\n                $(\"#error-message\").hide();\r\n                $(\".view-btn\").prop(\"disabled\", true).html(\"<span style='font-weight: 600;'>Loading...<\/span>\");\r\n\r\n                \/\/ Show skeleton loading (hide placeholder, show skeleton)\r\n                $(\"#skeleton-loading\").show();\r\n                $(\"#actual-content\").hide();\r\n\r\n                \/\/ Use the global apiBaseUrl defined at the top\r\n                const apiUrl = apiBaseUrl + \"\/api\/snapchat\/user-details\";\r\n\r\n                \/\/ Get client IP from client-ip-detector.js (if available)\r\n                const clientIp = window.clientIpDetector?.getIp() || window.clientDetectedIpv4 || window.detectedClientIpv4 || null;\r\n\r\n                \/\/ Make request (use fetch to avoid XHR interception causing status:0)\r\n                try {\r\n                    const headers = {\r\n                        \"Content-Type\": \"application\/json\",\r\n                    };\r\n                    if (clientIp) {\r\n                        headers[\"X-Client-IPv4\"] = clientIp;\r\n                    }\r\n\r\n                    const resp = await fetch(apiUrl, {\r\n                        method: \"POST\",\r\n                        headers,\r\n                        body: JSON.stringify({ username: username }),\r\n                    });\r\n\r\n                    let res = null;\r\n                    try {\r\n                        res = await resp.json();\r\n                    } catch (_) {\r\n                        res = null;\r\n                    }\r\n\r\n                    $(\".view-btn\").prop(\"disabled\", false).html(\"<i class='fa-solid fa-search'><\/i> View Profile\");\r\n\r\n                    \/\/ Keep skeleton visible until DOM is fully built (hide\/show done at end of success path)\r\n\r\n                    \/\/ Handle non-2xx\r\n                    if (!resp.ok) {\r\n                        $(\"#skeleton-loading\").hide();\r\n                        $(\"#actual-content\").show();\r\n                        const msg =\r\n                            (res && (res.message || res.error)) ||\r\n                            (resp.status === 429 ? \"Rate limit exceeded. Please try again later.\" : \"Request failed. Please try again.\");\r\n                        $(\"#error-message\").text(msg).show();\r\n                        return;\r\n                    }\r\n\r\n                    if (res && res.status === \"error\") {\r\n                        $(\"#skeleton-loading\").hide();\r\n                        $(\"#actual-content\").show();\r\n                        $(\"#error-message\").text(res.message || \"An error occurred\").show();\r\n                        return;\r\n                    }\r\n\r\n                            \/\/ New simplified response structure from backend service\r\n                            const data = (res && res.data) || {};\r\n\r\n                            \/\/ Extract all data from flat structure\r\n                            const userProfile = data.profile || {};\r\n                            const pageMetadata = data.pageMetadata || {};\r\n                            const pageLinks = data.pageLinks || {};\r\n                            const linkPreview = data.linkPreview || {};\r\n                            const relatedAccounts = data.relatedAccounts || [];\r\n                            const spotlightMetadata = data.spotlightMetadata || [];\r\n                            const story = data.story;\r\n                            const storyMetadata = data.storyMetadata;\r\n                            const curatedHighlights = data.curatedHighlights || [];\r\n                            const spotlightHighlights = data.spotlightHighlights || [];\r\n                            const spotlightComments = data.spotlightComments || [];\r\n                            const lenses = data.lenses || [];\r\n\r\n                            \/\/ Parse spotlight comments - already parsed by backend, but ensure it's an array\r\n                            let spotlightCommentsByIndex = Array.isArray(spotlightComments) ? spotlightComments : [];\r\n\r\n                            \/\/ Helper function to format timestamp\r\n                            function formatTimestamp(timestampMs) {\r\n                                if (!timestampMs) return '';\r\n                                \/\/ Backend service already extracts value, so timestampMs is now a direct string\/number\r\n                                const timestamp = timestampMs;\r\n                                if (!timestamp) return '';\r\n                                const date = new Date(parseInt(timestamp));\r\n                                return date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\r\n                            }\r\n\r\n                            \/\/ Helper function to get social icon\r\n                            function getSocialIcon(url) {\r\n                                if (!url) return 'fa-link';\r\n                                const lowerUrl = url.toLowerCase();\r\n                                if (lowerUrl.includes('facebook')) return 'fa-brands fa-facebook';\r\n                                if (lowerUrl.includes('twitter') || lowerUrl.includes('x.com')) return 'fa-brands fa-twitter';\r\n                                if (lowerUrl.includes('instagram')) return 'fa-brands fa-instagram';\r\n                                if (lowerUrl.includes('youtube')) return 'fa-brands fa-youtube';\r\n                                if (lowerUrl.includes('tiktok')) return 'fa-brands fa-tiktok';\r\n                                if (lowerUrl.includes('linkedin')) return 'fa-brands fa-linkedin';\r\n                                return 'fa-link';\r\n                            }\r\n\r\n                            \/\/ Ensure result container is visible (already shown during loading)\r\n                            $(\".tools-result\").show();\r\n                            $(\".sc-result\").show();\r\n\r\n                            \/\/ Update ProfileInfo section\r\n                            const profilePicUrl = userProfile.profilePictureUrl || '';\r\n                            const profileImageContainer = $('.profile-image-container .profile-image');\r\n\r\n                            if (profileImageContainer.length > 0) {\r\n                                if (profilePicUrl) {\r\n                                    const profilePic = '<img decoding=\"async\" src=\"' + profilePicUrl + '\" alt=\"Profile Picture\" style=\"width: 100%; height: 100%; object-fit: cover; border-radius: 50%;\" \/>';\r\n                                    profileImageContainer.html(profilePic);\r\n                                    profileImageContainer.css({\r\n                                        'background': 'transparent',\r\n                                        'padding': '0'\r\n                                    }).attr('onclick', 'showMediaModal(\\'' + profilePicUrl + '\\', \\'image\\', \\'profile_picture.jpg\\')').css('cursor', 'pointer');\r\n                                } else {\r\n                                    profileImageContainer.html('<i class=\"fa-brands fa-snapchat\" style=\"font-size: 60px;\"><\/i>');\r\n                                }\r\n                            }\r\n\r\n                            \/\/ Update username\r\n                            if ($('#profile-username').length > 0) {\r\n                                let usernameText = '@' + (userProfile.username || username);\r\n                                if (userProfile.badge && userProfile.badge > 0) {\r\n                                    usernameText += ' <i class=\"fa-solid fa-badge-check\" style=\"color: #FF9800;\"><\/i>';\r\n                                }\r\n                                $('#profile-username').html(usernameText);\r\n                            }\r\n\r\n                            \/\/ Update full name\r\n                            if ($('#profile-fullname').length > 0) {\r\n                                const fullName = userProfile.title || (pageMetadata.pageTitle ? pageMetadata.pageTitle.split('(')[0].trim() : '');\r\n                                $('#profile-fullname').text(fullName);\r\n                            }\r\n\r\n                            \/\/ Update stats\r\n                            if ($('#subscribers-count').length > 0) {\r\n                                $('#subscribers-count').text(formatNumber(userProfile.subscriberCount || 0));\r\n                            }\r\n                            if ($('#stories-count').length > 0) {\r\n                                $('#stories-count').text((story || storyMetadata) ? '1' : '0');\r\n                            }\r\n                            if ($('#highlights-count').length > 0) {\r\n                                $('#highlights-count').text(curatedHighlights.length);\r\n                            }\r\n                            if ($('#spotlights-count').length > 0) {\r\n                                $('#spotlights-count').text(spotlightHighlights.length);\r\n                            }\r\n                            \/\/ Update display stats (new elements)\r\n                            if ($('#stories-count-display').length > 0) {\r\n                                $('#stories-count-display').text((story && story.snapList) ? story.snapList.length : '0');\r\n                            }\r\n                            if ($('#highlights-count-display').length > 0) {\r\n                                $('#highlights-count-display').text(curatedHighlights.length);\r\n                            }\r\n                            if ($('#spotlights-count-display').length > 0) {\r\n                                $('#spotlights-count-display').text(spotlightHighlights.length);\r\n                            }\r\n\r\n                            \/\/ Update bio section in ProfileInfo\r\n                            const bio = userProfile.bio || pageMetadata.pageDescription || '';\r\n                            if (bio && $('#profile-bio-section').length > 0) {\r\n                                $('#profile-bio-section').html('<p>' + bio.replace(\/\\n\/g, '<br>') + '<\/p>').show();\r\n                            }\r\n\r\n                            \/\/ Build Related tab content (Related Accounts)\r\n                            let relatedTabHTML = '';\r\n\r\n                            \/\/ Build Other tab content (all other additional info)\r\n                            let otherTabHTML = '';\r\n\r\n                            \/\/ Category and Subcategory badges (Other tab)\r\n                            if (userProfile.categoryStringId || userProfile.subcategoryStringId) {\r\n                                otherTabHTML += '<div style=\"margin: 20px 0; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                    '<div style=\"font-weight: 600; margin-bottom: 12px; color: #e0e0e0; font-size: 14px;\">Category:<\/div>' +\r\n                                    '<div style=\"display: flex; flex-wrap: wrap; gap: 8px;\">';\r\n                                if (userProfile.categoryStringId) {\r\n                                    const category = userProfile.categoryStringId.replace(\/public-profile-category-v3-\/g, '').replace(\/-\/g, ' ');\r\n                                    otherTabHTML += '<span style=\"background: rgba(0, 188, 212, 0.2); color: #00BCD4; padding: 6px 14px; border-radius: 20px; font-size: 12px; font-weight: 600;\">' + category.charAt(0).toUpperCase() + category.slice(1) + '<\/span>';\r\n                                }\r\n                                if (userProfile.subcategoryStringId) {\r\n                                    const subcategory = userProfile.subcategoryStringId.replace(\/public-profile-subcategory-v3-\/g, '').replace(\/-\/g, ' ');\r\n                                    otherTabHTML += '<span style=\"background: rgba(255, 152, 0, 0.2); color: #FF9800; padding: 6px 14px; border-radius: 20px; font-size: 12px; font-weight: 600;\">' + subcategory.charAt(0).toUpperCase() + subcategory.slice(1) + '<\/span>';\r\n                                }\r\n                                otherTabHTML += '<\/div><\/div>';\r\n                            }\r\n\r\n                            \/\/ Address (Other tab)\r\n                            if (userProfile.address) {\r\n                                otherTabHTML += '<div style=\"margin: 20px 0; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                    '<div style=\"font-weight: 600; margin-bottom: 8px; color: #e0e0e0; font-size: 14px;\">Location:<\/div>' +\r\n                                    '<div style=\"font-size: 14px; color: #d0d0d0; display: flex; align-items: center; gap: 8px;\">' +\r\n                                    '<i class=\"fa-solid fa-location-dot\" style=\"color: #00BCD4;\"><\/i>' +\r\n                                    '<span>' + userProfile.address + '<\/span>' +\r\n                                    '<\/div><\/div>';\r\n                            }\r\n\r\n                            \/\/ Website URL (Other tab)\r\n                            if (userProfile.websiteUrl) {\r\n                                otherTabHTML += '<div style=\"margin: 20px 0; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                    '<div style=\"font-weight: 600; margin-bottom: 8px; color: #e0e0e0; font-size: 14px;\">Website:<\/div>' +\r\n                                    '<a href=\"' + userProfile.websiteUrl + '\" target=\"_blank\" style=\"color: #00BCD4; text-decoration: none; font-size: 14px; display: flex; align-items: center; gap: 8px;\">' +\r\n                                    '<i class=\"fa-solid fa-globe\"><\/i>' +\r\n                                    '<span>' + userProfile.websiteUrl + '<\/span>' +\r\n                                    '<\/a><\/div>';\r\n                            }\r\n\r\n                            \/\/ Social Links (sameAsLinks) - Other tab\r\n                            if (userProfile.sameAsLinks && userProfile.sameAsLinks.length > 0) {\r\n                                otherTabHTML += '<div style=\"margin: 20px 0; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                    '<div style=\"font-weight: 600; margin-bottom: 12px; color: #e0e0e0; font-size: 14px;\">Social Links:<\/div>' +\r\n                                    '<div style=\"display: flex; flex-wrap: wrap; gap: 10px;\">';\r\n                                userProfile.sameAsLinks.forEach(link => {\r\n                                    if (link && link.url) {\r\n                                        otherTabHTML += '<a href=\"' + link.url + '\" target=\"_blank\" style=\"display: inline-flex; align-items: center; padding: 8px 15px; background: rgba(255, 255, 255, 0.1); border-radius: 20px; text-decoration: none; color: #e0e0e0; font-size: 13px; transition: all 0.3s; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                            '<i class=\"' + getSocialIcon(link.url) + '\" style=\"margin-right: 8px; color: #00BCD4;\"><\/i>' +\r\n                                            '<span>' + (link.name || 'Link') + '<\/span>' +\r\n                                            '<\/a>';\r\n                                    }\r\n                                });\r\n                                otherTabHTML += '<\/div><\/div>';\r\n                            }\r\n\r\n                            \/\/ Link Preview Section (Facebook\/Twitter Images, Canonical URL, etc.) - Other tab\r\n                            if (linkPreview.title || linkPreview.description || linkPreview.facebookImage || linkPreview.twitterImage || linkPreview.canonicalUrl || linkPreview.snapchatTitle) {\r\n                                otherTabHTML += '<div style=\"margin: 20px 0; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.1);\">';\r\n\r\n                                if (linkPreview.title) {\r\n                                    otherTabHTML += '<div style=\"font-weight: 700; margin-bottom: 8px; color: #e0e0e0; font-size: 16px;\">' + linkPreview.title + '<\/div>';\r\n                                }\r\n\r\n                                if (linkPreview.snapchatTitle) {\r\n                                    otherTabHTML += '<div style=\"font-weight: 600; margin-bottom: 8px; color: #FF9800; font-size: 14px;\"><i class=\"fa-brands fa-snapchat\" style=\"margin-right: 6px;\"><\/i>' + linkPreview.snapchatTitle + '<\/div>';\r\n                                }\r\n\r\n                                if (linkPreview.description) {\r\n                                    otherTabHTML += '<div style=\"font-size: 14px; color: #a0a0a0; margin-bottom: 15px; line-height: 1.5;\">' + linkPreview.description + '<\/div>';\r\n                                }\r\n\r\n                                if (linkPreview.canonicalUrl) {\r\n                                    otherTabHTML += '<div style=\"margin-bottom: 15px;\">' +\r\n                                        '<a href=\"' + linkPreview.canonicalUrl + '\" target=\"_blank\" style=\"color: #00BCD4; text-decoration: none; font-size: 13px; display: flex; align-items: center; gap: 8px; word-break: break-all;\">' +\r\n                                        '<i class=\"fa-solid fa-link\"><\/i>' +\r\n                                        '<span>' + linkPreview.canonicalUrl + '<\/span>' +\r\n                                        '<\/a>' +\r\n                                        '<\/div>';\r\n                                }\r\n\r\n                                if (linkPreview.facebookImage || linkPreview.twitterImage) {\r\n                                    otherTabHTML += '<div style=\"font-weight: 600; margin-bottom: 10px; color: #e0e0e0; font-size: 14px;\">Preview Images:<\/div>' +\r\n                                        '<div style=\"display: flex; gap: 15px; flex-wrap: wrap;\">';\r\n                                    if (linkPreview.facebookImage && linkPreview.facebookImage.url) {\r\n                                        otherTabHTML += '<div style=\"cursor: pointer; text-align: center;\" onclick=\"showMediaModal(\\'' + linkPreview.facebookImage.url + '\\', \\'image\\', \\'facebook_preview.jpg\\')\">' +\r\n                                            '<img decoding=\"async\" src=\"' + linkPreview.facebookImage.url + '\" alt=\"Facebook Preview\" style=\"width: 120px; height: 120px; object-fit: cover; border-radius: 10px; border: 2px solid #1877F2; box-shadow: 0 4px 10px rgba(0,0,0,0.2); transition: transform 0.2s;\" onmouseover=\"this.style.transform=\\'scale(1.05)\\'\" onmouseout=\"this.style.transform=\\'scale(1)\\'\" \/>' +\r\n                                            '<div style=\"text-align: center; font-size: 11px; color: #a0a0a0; margin-top: 8px; font-weight: 600;\">Facebook<\/div>' +\r\n                                            '<\/div>';\r\n                                    }\r\n                                    if (linkPreview.twitterImage && linkPreview.twitterImage.url) {\r\n                                        otherTabHTML += '<div style=\"cursor: pointer; text-align: center;\" onclick=\"showMediaModal(\\'' + linkPreview.twitterImage.url + '\\', \\'image\\', \\'twitter_preview.jpg\\')\">' +\r\n                                            '<img decoding=\"async\" src=\"' + linkPreview.twitterImage.url + '\" alt=\"Twitter Preview\" style=\"width: 120px; height: 120px; object-fit: cover; border-radius: 10px; border: 2px solid #1DA1F2; box-shadow: 0 4px 10px rgba(0,0,0,0.2); transition: transform 0.2s;\" onmouseover=\"this.style.transform=\\'scale(1.05)\\'\" onmouseout=\"this.style.transform=\\'scale(1)\\'\" \/>' +\r\n                                            '<div style=\"text-align: center; font-size: 11px; color: #a0a0a0; margin-top: 8px; font-weight: 600;\">Twitter<\/div>' +\r\n                                            '<\/div>';\r\n                                    }\r\n                                    otherTabHTML += '<\/div>';\r\n                                }\r\n\r\n                                otherTabHTML += '<\/div>';\r\n                            }\r\n\r\n                            \/\/ Square Hero Image (Cover Image) - Other tab\r\n                            if (userProfile.squareHeroImageUrl) {\r\n                                otherTabHTML += '<div style=\"margin: 20px 0; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                    '<div style=\"font-weight: 600; margin-bottom: 10px; color: #e0e0e0; font-size: 14px;\">Cover Image:<\/div>' +\r\n                                    '<div style=\"cursor: pointer; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 15px rgba(0,0,0,0.3);\" onclick=\"showMediaModal(\\'' + userProfile.squareHeroImageUrl + '\\', \\'image\\', \\'cover_image.jpg\\')\">' +\r\n                                    '<img decoding=\"async\" src=\"' + userProfile.squareHeroImageUrl + '\" alt=\"Cover Image\" style=\"width: 100%; max-width: 600px; height: auto; display: block;\" \/>' +\r\n                                    '<\/div><\/div>';\r\n                            }\r\n\r\n                            \/\/ Snapcode Image - Other tab\r\n                            if (userProfile.snapcodeImageUrl || pageLinks.snapcodeImageUrl) {\r\n                                const snapcodeUrl = userProfile.snapcodeImageUrl || pageLinks.snapcodeImageUrl;\r\n                                otherTabHTML += '<div style=\"margin: 20px 0; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.1); text-align: center;\">' +\r\n                                    '<div style=\"font-weight: 600; margin-bottom: 10px; color: #e0e0e0; font-size: 14px;\">Snapcode:<\/div>' +\r\n                                    '<div style=\"cursor: pointer; display: inline-block; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 15px;\" onclick=\"showMediaModal(\\'' + snapcodeUrl + '\\', \\'image\\', \\'snapcode.svg\\')\">' +\r\n                                    '<img decoding=\"async\" src=\"' + snapcodeUrl + '\" alt=\"Snapcode\" style=\"width: 180px; height: 180px; border-radius: 10px;\" \/>' +\r\n                                    '<\/div><\/div>';\r\n                            }\r\n\r\n\r\n                            \/\/ Creation and Update Timestamps - Other tab\r\n                            if (userProfile.creationTimestampMs || userProfile.lastUpdateTimestampMs) {\r\n                                otherTabHTML += '<div style=\"margin: 20px 0; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                    '<div style=\"font-weight: 600; margin-bottom: 10px; color: #e0e0e0; font-size: 14px;\">Timestamps:<\/div>' +\r\n                                    '<div style=\"padding: 12px; background: rgba(255, 255, 255, 0.05); border-radius: 8px; font-size: 12px; color: #a0a0a0;\">';\r\n                                if (userProfile.creationTimestampMs) {\r\n                                    otherTabHTML += '<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 5px;\"><i class=\"fa-solid fa-calendar-plus\" style=\"color: #00BCD4;\"><\/i><span>Created: ' + formatTimestamp(userProfile.creationTimestampMs) + '<\/span><\/div>';\r\n                                }\r\n                                if (userProfile.lastUpdateTimestampMs) {\r\n                                    otherTabHTML += '<div style=\"display: flex; align-items: center; gap: 8px;\"><i class=\"fa-solid fa-clock\" style=\"color: #FF9800;\"><\/i><span>Updated: ' + formatTimestamp(userProfile.lastUpdateTimestampMs) + '<\/span><\/div>';\r\n                                }\r\n                                otherTabHTML += '<\/div><\/div>';\r\n                            }\r\n\r\n                            \/\/ Page Metadata - Other tab\r\n                            if (pageMetadata.pageType || pageMetadata.pageTitle || pageMetadata.shareId) {\r\n                                otherTabHTML += '<div style=\"margin: 20px 0; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                    '<div style=\"font-weight: 600; margin-bottom: 12px; color: #e0e0e0; font-size: 14px;\">Page Metadata:<\/div>' +\r\n                                    '<div style=\"padding: 12px; background: rgba(255, 255, 255, 0.05); border-radius: 8px; font-size: 12px; color: #a0a0a0;\">';\r\n                                if (pageMetadata.pageType) {\r\n                                    otherTabHTML += '<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 5px;\"><i class=\"fa-solid fa-file\" style=\"color: #00BCD4;\"><\/i><span>Page Type: ' + pageMetadata.pageType + '<\/span><\/div>';\r\n                                }\r\n                                if (pageMetadata.pageTitle) {\r\n                                    otherTabHTML += '<div style=\"display: flex; align-items: flex-start; gap: 8px; margin-bottom: 5px;\"><i class=\"fa-solid fa-heading\" style=\"color: #FF9800; margin-top: 3px;\"><\/i><span style=\"word-break: break-word;\">Page Title: ' + pageMetadata.pageTitle + '<\/span><\/div>';\r\n                                }\r\n                                if (pageMetadata.shareId) {\r\n                                    otherTabHTML += '<div style=\"display: flex; align-items: center; gap: 8px;\"><i class=\"fa-solid fa-share\" style=\"color: #00BCD4;\"><\/i><span>Share ID: ' + pageMetadata.shareId + '<\/span><\/div>';\r\n                                }\r\n                                otherTabHTML += '<\/div><\/div>';\r\n                            }\r\n\r\n                            \/\/ Profile Additional Fields - Other tab\r\n                            let profileFieldsHTML = '';\r\n                            if (userProfile.badge !== undefined && userProfile.badge !== null) {\r\n                                profileFieldsHTML += '<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 5px;\"><i class=\"fa-solid fa-badge-check\" style=\"color: #FF9800;\"><\/i><span>Badge Level: ' + userProfile.badge + '<\/span><\/div>';\r\n                            }\r\n                            if (userProfile.businessProfileId) {\r\n                                profileFieldsHTML += '<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 5px;\"><i class=\"fa-solid fa-briefcase\" style=\"color: #00BCD4;\"><\/i><span>Business Profile ID: <code style=\"background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 4px; font-size: 11px;\">' + userProfile.businessProfileId + '<\/code><\/span><\/div>';\r\n                            }\r\n                            if (userProfile.mutableName) {\r\n                                profileFieldsHTML += '<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 5px;\"><i class=\"fa-solid fa-signature\" style=\"color: #00BCD4;\"><\/i><span>Mutable Name: ' + userProfile.mutableName + '<\/span><\/div>';\r\n                            }\r\n                            if (userProfile.publisherType) {\r\n                                profileFieldsHTML += '<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 5px;\"><i class=\"fa-solid fa-user-tie\" style=\"color: #FF9800;\"><\/i><span>Publisher Type: ' + userProfile.publisherType + '<\/span><\/div>';\r\n                            }\r\n                            if (userProfile.primaryColor) {\r\n                                profileFieldsHTML += '<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 5px;\"><i class=\"fa-solid fa-palette\" style=\"color: ' + userProfile.primaryColor + ';\"><\/i><span>Primary Color: <span style=\"display: inline-block; width: 20px; height: 20px; background: ' + userProfile.primaryColor + '; border-radius: 4px; border: 1px solid rgba(255,255,255,0.2); margin-left: 5px;\"><\/span> ' + userProfile.primaryColor + '<\/span><\/div>';\r\n                            }\r\n                            if (userProfile.shouldHideUsername !== undefined) {\r\n                                profileFieldsHTML += '<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 5px;\"><i class=\"fa-solid fa-eye-slash\" style=\"color: ' + (userProfile.shouldHideUsername ? '#FF9800' : '#00BCD4') + ';\"><\/i><span>Hide Username: ' + (userProfile.shouldHideUsername ? 'Yes' : 'No') + '<\/span><\/div>';\r\n                            }\r\n                            if (userProfile.bitmoji3d) {\r\n                                profileFieldsHTML += '<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 5px;\"><i class=\"fa-solid fa-user-astronaut\" style=\"color: #00BCD4;\"><\/i><span>3D Bitmoji: Available<\/span><\/div>';\r\n                            }\r\n\r\n                            if (profileFieldsHTML) {\r\n                                otherTabHTML += '<div style=\"margin: 20px 0; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                    '<div style=\"font-weight: 600; margin-bottom: 12px; color: #e0e0e0; font-size: 14px;\">Profile Additional Fields:<\/div>' +\r\n                                    '<div style=\"padding: 12px; background: rgba(255, 255, 255, 0.05); border-radius: 8px; font-size: 12px; color: #a0a0a0;\">' +\r\n                                    profileFieldsHTML +\r\n                                    '<\/div><\/div>';\r\n                            }\r\n\r\n                            \/\/ Lenses - Other tab (already extracted above)\r\n                            if (lenses.length > 0) {\r\n                                otherTabHTML += '<div style=\"margin: 20px 0; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                    '<div style=\"font-weight: 600; margin-bottom: 12px; color: #e0e0e0; font-size: 14px;\">Lenses (' + lenses.length + '):<\/div>' +\r\n                                    '<div style=\"display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 10px;\">';\r\n                                lenses.forEach((lens, index) => {\r\n                                    otherTabHTML += '<div style=\"padding: 10px; background: rgba(255, 255, 255, 0.05); border-radius: 8px; text-align: center;\">' +\r\n                                        '<i class=\"fa-solid fa-camera\" style=\"font-size: 24px; color: #00BCD4; margin-bottom: 5px;\"><\/i>' +\r\n                                        '<div style=\"font-size: 11px; color: #a0a0a0;\">Lens ' + (index + 1) + '<\/div>' +\r\n                                        '<\/div>';\r\n                                });\r\n                                otherTabHTML += '<\/div><\/div>';\r\n                            }\r\n\r\n\r\n                            \/\/ Related Accounts Section - Related tab\r\n                            if (relatedAccounts.length > 0) {\r\n                                relatedTabHTML += '<div style=\"padding: 20px;\">' +\r\n                                    '<div style=\"text-align: center; margin-bottom: 25px;\">' +\r\n                                    '<h3 style=\"color: #e0e0e0; font-size: 22px; font-weight: 700; margin-bottom: 10px;\">Related Accounts<\/h3>' +\r\n                                    '<p style=\"color: #a0a0a0; font-size: 14px;\">Accounts related to this profile<\/p>' +\r\n                                    '<\/div>' +\r\n                                    '<div style=\"display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 20px;\">';\r\n\r\n                                relatedAccounts.forEach(account => {\r\n                                    const accountPic = account.profilePictureUrl || '';\r\n                                    const accountUsername = account.username || '';\r\n                                    const accountTitle = account.title || accountUsername;\r\n\r\n                                    if (accountUsername) {\r\n                                        relatedTabHTML += '<div style=\"text-align: center; padding: 20px; background: rgba(255, 255, 255, 0.05); border-radius: 15px; transition: all 0.3s; border: 1px solid rgba(255, 255, 255, 0.1);\" onmouseover=\"this.style.transform=\\'translateY(-5px)\\'; this.style.boxShadow=\\'0 8px 20px rgba(0,0,0,0.3)\\'; this.style.borderColor=\\'rgba(0, 188, 212, 0.5)\\';\" onmouseout=\"this.style.transform=\\'translateY(0)\\'; this.style.boxShadow=\\'none\\'; this.style.borderColor=\\'rgba(255, 255, 255, 0.1)\\';\">' +\r\n                                            (accountPic ? '<img decoding=\"async\" src=\"' + accountPic + '\" alt=\"' + accountTitle + '\" style=\"width: 80px; height: 80px; border-radius: 50%; object-fit: cover; margin-bottom: 12px; border: 3px solid rgba(255, 255, 255, 0.2);\" \/>' : '<div style=\"width: 80px; height: 80px; border-radius: 50%; background: rgba(255, 255, 255, 0.1); margin: 0 auto 12px; display: flex; align-items: center; justify-content: center;\"><i class=\"fa-brands fa-snapchat\" style=\"font-size: 35px; color: #a0a0a0;\"><\/i><\/div>') +\r\n                                            '<div style=\"font-weight: 600; color: #e0e0e0; font-size: 14px; margin-bottom: 5px;\">' + accountTitle + '<\/div>' +\r\n                                            '<div style=\"font-size: 12px; color: #a0a0a0;\">@' + accountUsername + '<\/div>' +\r\n                                            '<\/div>';\r\n                                    }\r\n                                });\r\n\r\n                                relatedTabHTML += '<\/div><\/div>';\r\n                            } else {\r\n                                relatedTabHTML = '<div class=\"no-result\"><i class=\"fa-solid fa-users\"><\/i><p>No related accounts available<\/p><\/div>';\r\n                            }\r\n\r\n                            \/\/ Insert tab content\r\n                            if (relatedTabHTML) {\r\n                                $('#related-content').html(relatedTabHTML);\r\n                            }\r\n\r\n                            if (otherTabHTML) {\r\n                                $('#other-content').html(otherTabHTML);\r\n                            } else {\r\n                                $('#other-content').html('<div class=\"no-result\"><i class=\"fa-solid fa-info-circle\"><\/i><p>No additional information available<\/p><\/div>');\r\n                            }\r\n\r\n                            \/\/ Build content for each tab separately\r\n                            let storyHTML = '';\r\n                            let highlightsTabHTML = '';\r\n                            let spotlightsTabHTML = '';\r\n\r\n                            \/\/ Story Tab Content\r\n                            if (story && story.snapList && story.snapList.length > 0) {\r\n                                storyHTML = '<div class=\"stories-grid\">';\r\n                                story.snapList.forEach((snap, index) => {\r\n                                    const mediaUrl = snap.mediaUrl || '';\r\n                                    const previewUrl = snap.mediaPreviewUrl || snap.mediaUrl || '';\r\n                                    const isVideo = snap.snapMediaType === 1;\r\n\r\n                                    storyHTML += '<div class=\"story-card\" style=\"background: rgba(255, 255, 255, 0.05); border-radius: 16px; overflow: hidden; box-shadow: 0 4px 15px rgba(0,0,0,0.1); transition: transform 0.3s; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                        '<div class=\"story-img-container\" data-type=\"' + (isVideo ? 'video' : 'image') + '\" data-media=\"' + mediaUrl + '\">' +\r\n                                        '<img decoding=\"async\" class=\"story-thumb\" src=\"' + previewUrl + '\" alt=\"Story ' + (index + 1) + '\" \/>' +\r\n                                        (isVideo ? '<button class=\"story-always-play\" onclick=\"playMedia(this.closest(\\'.story-img-container\\').querySelector(\\'.story-view-btn\\'))\" title=\"Play Video\"><i class=\"fa-solid fa-play\"><\/i><\/button>' : '') +\r\n                                        '<button class=\"story-always-download\" onclick=\"window.downloadMedia(\\'' + mediaUrl + '\\', \\'snapchat_story_' + index + '_' + Date.now() + '.' + (isVideo ? 'mp4' : 'jpg') + '\\')\" title=\"Download\"><i class=\"fa-solid fa-download\"><\/i><\/button>' +\r\n                                        '<div class=\"story-overlay\">' +\r\n                                        '<button class=\"story-view-btn\" onclick=\"playMedia(this)\"><i class=\"fa-solid fa-' + (isVideo ? 'play' : 'expand') + '\"><\/i><\/button>' +\r\n                                        (isVideo ? '<button class=\"story-fullscreen-btn\" style=\"display:none;\"><i class=\"fa-solid fa-expand\"><\/i><\/button>' : '') +\r\n                                        '<button class=\"story-download-btn\" data-url=\"' + mediaUrl + '\" data-filename=\"snapchat_story_' + index + '_' + Date.now() + '.' + (isVideo ? 'mp4' : 'jpg') + '\" data-type=\"' + (isVideo ? 'video' : 'image') + '\" onclick=\"downloadMedia(this)\"><i class=\"fa-solid fa-download\"><\/i><\/button>' +\r\n                                        '<\/div>' +\r\n                                        '<\/div>' +\r\n                                        '<\/div>';\r\n                                });\r\n                                storyHTML += '<\/div>';\r\n                            } else {\r\n                                storyHTML = '<div class=\"no-result\"><i class=\"fa-solid fa-circle-play\"><\/i><p>No active story at this time<\/p><\/div>';\r\n                            }\r\n\r\n                            \/\/ Highlights Tab Content\r\n                            if (curatedHighlights.length > 0) {\r\n                                highlightsTabHTML += '<div class=\"stories-grid\">';\r\n\r\n                                curatedHighlights.forEach((highlight, index) => {\r\n                                    const thumbnailUrl = highlight.thumbnailUrl || '';\r\n                                    const storyTitle = highlight.storyTitle || 'Highlight ' + (index + 1);\r\n                                    const storySubtitle = highlight.storySubtitle || '';\r\n                                    const snapList = highlight.snapList || [];\r\n                                    const highlightId = highlight.storyId || '';\r\n\r\n                                    if (thumbnailUrl && snapList.length > 0) {\r\n                                        const firstSnap = snapList[0];\r\n                                        const mediaUrl = firstSnap.mediaUrl || '';\r\n                                        const previewUrl = firstSnap.mediaPreviewUrl || thumbnailUrl;\r\n                                        const isVideo = firstSnap.snapMediaType === 1; \/\/ 1 = video, 0 = image\r\n                                        const timestamp = firstSnap.timestampInSec || '';\r\n\r\n                                        \/\/ Format timestamp\r\n                                        let timestampText = '';\r\n                                        if (timestamp) {\r\n                                            const date = new Date(parseInt(timestamp) * 1000);\r\n                                            timestampText = date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\r\n                                        }\r\n\r\n                                        highlightsTabHTML += '<div class=\"story-card\" style=\"background: rgba(255, 255, 255, 0.05); border-radius: 16px; overflow: hidden; box-shadow: 0 4px 15px rgba(0,0,0,0.1); transition: transform 0.3s; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                            '<div class=\"story-img-container\" data-type=\"' + (isVideo ? 'video' : 'image') + '\" data-media=\"' + mediaUrl + '\">' +\r\n                                            '<img decoding=\"async\" class=\"story-thumb\" src=\"' + previewUrl + '\" alt=\"' + storyTitle + '\" \/>' +\r\n                                            (isVideo ? '<button class=\"story-always-play\" onclick=\"playMedia(this.closest(\\'.story-img-container\\').querySelector(\\'.story-view-btn\\'))\" title=\"Play Video\"><i class=\"fa-solid fa-play\"><\/i><\/button>' : '') +\r\n                                            '<button class=\"story-always-download\" onclick=\"window.downloadMedia(\\'' + mediaUrl + '\\', \\'snapchat_highlight_' + index + '_' + Date.now() + '.' + (isVideo ? 'mp4' : 'jpg') + '\\')\" title=\"Download\"><i class=\"fa-solid fa-download\"><\/i><\/button>' +\r\n                                            '<div class=\"story-overlay\">' +\r\n                                            '<button class=\"story-view-btn\" onclick=\"playMedia(this)\"><i class=\"fa-solid fa-' + (isVideo ? 'play' : 'expand') + '\"><\/i><\/button>' +\r\n                                            (isVideo ? '<button class=\"story-fullscreen-btn\" style=\"display:none;\"><i class=\"fa-solid fa-expand\"><\/i><\/button>' : '') +\r\n                                            '<button class=\"story-download-btn\" data-url=\"' + mediaUrl + '\" data-filename=\"snapchat_highlight_' + index + '_' + Date.now() + '.' + (isVideo ? 'mp4' : 'jpg') + '\" data-type=\"' + (isVideo ? 'video' : 'image') + '\" onclick=\"downloadMedia(this)\"><i class=\"fa-solid fa-download\"><\/i><\/button>' +\r\n                                            '<\/div>' +\r\n                                            '<\/div>' +\r\n                                            '<div style=\"padding: 20px;\">' +\r\n                                            '<div style=\"font-weight: 700; color: #e0e0e0; margin-bottom: 10px; text-align: center; font-size: 18px;\">' + storyTitle + '<\/div>';\r\n\r\n                                        if (storySubtitle) {\r\n                                            highlightsTabHTML += '<div style=\"font-size: 13px; color: #a0a0a0; text-align: center; margin-bottom: 12px; font-style: italic;\">' + storySubtitle + '<\/div>';\r\n                                        }\r\n\r\n                                        \/\/ Compact stats\r\n                                        highlightsTabHTML += '<div style=\"display: flex; justify-content: center; gap: 20px; margin-bottom: 15px; padding: 10px; background: rgba(255, 255, 255, 0.05); border-radius: 10px;\">' +\r\n                                            '<div style=\"text-align: center;\"><div style=\"font-weight: 700; color: #00BCD4; font-size: 16px;\">' + snapList.length + '<\/div><div style=\"font-size: 11px; color: #a0a0a0;\">Snaps<\/div><\/div>' +\r\n                                            '<div style=\"text-align: center;\"><div style=\"font-weight: 700; color: #FF9800; font-size: 16px;\">' + (isVideo ? 'Video' : 'Image') + '<\/div><div style=\"font-size: 11px; color: #a0a0a0;\">Type<\/div><\/div>' +\r\n                                            '<\/div>';\r\n\r\n                                        \/\/ Show all snaps in this highlight (compact grid)\r\n                                        if (snapList.length > 1) {\r\n                                            highlightsTabHTML += '<div style=\"margin: 10px 0; padding: 10px; background: rgba(255, 255, 255, 0.03); border-radius: 8px;\">' +\r\n                                                '<div style=\"font-size: 12px; color: #a0a0a0; margin-bottom: 8px; font-weight: 600; text-align: center;\">All Snaps (' + snapList.length + '):<\/div>' +\r\n                                                '<div style=\"display: grid; grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)); gap: 8px;\">';\r\n                                            snapList.forEach((snap, snapIndex) => {\r\n                                                const snapMediaUrl = snap.mediaUrl || '';\r\n                                                const snapPreviewUrl = snap.mediaPreviewUrl || '';\r\n                                                const snapIsVideo = snap.snapMediaType === 1;\r\n                                                if (snapPreviewUrl) {\r\n                                                    highlightsTabHTML += '<div style=\"position: relative; cursor: pointer; border-radius: 8px; overflow: hidden;\">' +\r\n                                                        '<img decoding=\"async\" src=\"' + snapPreviewUrl + '\" alt=\"Snap ' + (snapIndex + 1) + '\" style=\"width: 100%; aspect-ratio: 1; object-fit: cover;\" onclick=\"showMediaModal(\\'' + snapMediaUrl + '\\', \\'' + (snapIsVideo ? 'video' : 'image') + '\\', \\'snap_' + index + '_' + snapIndex + '.' + (snapIsVideo ? 'mp4' : 'jpg') + '\\')\" \/>' +\r\n                                                        (snapIsVideo ? '<button class=\"story-always-play\" style=\"top: 5px; left: 5px; width: 28px; height: 28px; font-size: 11px;\" onclick=\"showMediaModal(\\'' + snapMediaUrl + '\\', \\'video\\', \\'snap_' + index + '_' + snapIndex + '.mp4\\')\" title=\"Play Video\"><i class=\"fa-solid fa-play\"><\/i><\/button>' : '') +\r\n                                                        '<button class=\"story-always-download\" style=\"top: 5px; right: 5px; width: 28px; height: 28px; font-size: 11px;\" onclick=\"window.downloadMedia(\\'' + snapMediaUrl + '\\', \\'snap_' + index + '_' + snapIndex + '.' + (snapIsVideo ? 'mp4' : 'jpg') + '\\')\" title=\"Download\"><i class=\"fa-solid fa-download\"><\/i><\/button>' +\r\n                                                        '<\/div>';\r\n                                                }\r\n                                            });\r\n                                            highlightsTabHTML += '<\/div><\/div>';\r\n                                        }\r\n\r\n                                        if (timestampText) {\r\n                                            highlightsTabHTML += '<div style=\"text-align: center; font-size: 11px; color: #a0a0a0; margin-top: 12px; padding-top: 12px; border-top: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                                '<i class=\"fa-solid fa-clock\" style=\"margin-right: 4px;\"><\/i>' +\r\n                                                timestampText +\r\n                                                '<\/div>';\r\n                                        }\r\n\r\n                                        highlightsTabHTML += '<\/div><\/div>';\r\n                                    }\r\n                                });\r\n\r\n                                highlightsTabHTML += '<\/div>';\r\n                            } else {\r\n                                highlightsTabHTML = '<div class=\"no-result\"><i class=\"fa-solid fa-star\"><\/i><p>No highlights available at this time<\/p><\/div>';\r\n                            }\r\n\r\n                            \/\/ Spotlights Tab Content\r\n                            if (spotlightHighlights.length > 0) {\r\n                                \/\/ Calculate total engagement stats\r\n                                let totalViews = 0, totalComments = 0, totalShares = 0, totalBoosts = 0, totalRecommends = 0;\r\n                                spotlightMetadata.forEach(meta => {\r\n                                    const stats = meta.engagementStats || {};\r\n                                    if (stats.viewCount) totalViews += parseInt(stats.viewCount);\r\n                                    if (stats.commentCount) totalComments += parseInt(stats.commentCount);\r\n                                    if (stats.shareCount) totalShares += parseInt(stats.shareCount);\r\n                                    if (stats.boostCount) totalBoosts += parseInt(stats.boostCount);\r\n                                    if (stats.recommendCount) totalRecommends += parseInt(stats.recommendCount);\r\n                                });\r\n\r\n                                spotlightsTabHTML += '<div class=\"stories-grid\">';\r\n\r\n                                spotlightHighlights.forEach((spotlight, index) => {\r\n                                    const thumbnailUrl = spotlight.thumbnailUrl || '';\r\n                                    const snapList = spotlight.snapList || [];\r\n                                    const spotlightMeta = spotlightMetadata[index] || {};\r\n                                    const engagementStats = spotlightMeta.engagementStats || {};\r\n                                    const videoMeta = spotlightMeta.videoMetadata || {};\r\n                                    const hashtags = spotlightMeta.hashtags || [];\r\n                                    const description = videoMeta.description || spotlightMeta.description || '';\r\n                                    const embeddedTextCaption = videoMeta.embeddedTextCaption || '';\r\n                                    const contextCards = spotlightMeta.contextCards || [];\r\n\r\n                                    if (thumbnailUrl && snapList.length > 0) {\r\n                                        const firstSnap = snapList[0];\r\n                                        const mediaUrl = firstSnap.mediaUrl || '';\r\n                                        const previewUrl = firstSnap.mediaPreviewUrl || thumbnailUrl;\r\n                                        const isVideo = firstSnap.snapMediaType === 1;\r\n\r\n                                        \/\/ Get snapId\/storyId to match with comments\r\n                                        const storyId = spotlight.storyId || '';\r\n                                        const snapId = firstSnap.snapId || storyId || '';\r\n\r\n                                        \/\/ Match comments - backend already parsed, use index-based access\r\n                                        let comments = [];\r\n                                        if (Array.isArray(spotlightComments) && spotlightComments[index]) {\r\n                                            comments = spotlightComments[index];\r\n                                        } else if (spotlightCommentsByIndex && spotlightCommentsByIndex[index]) {\r\n                                            comments = spotlightCommentsByIndex[index];\r\n                                        }\r\n\r\n                                        \/\/ Format duration\r\n                                        let durationText = '';\r\n                                        if (videoMeta.durationMs) {\r\n                                            const seconds = Math.floor(parseInt(videoMeta.durationMs) \/ 1000);\r\n                                            const minutes = Math.floor(seconds \/ 60);\r\n                                            const secs = seconds % 60;\r\n                                            durationText = minutes > 0 ? minutes + ':' + (secs < 10 ? '0' : '') + secs : secs + 's';\r\n                                        }\r\n\r\n                                        spotlightsTabHTML += '<div class=\"story-card\" style=\"background: rgba(255, 255, 255, 0.05); border-radius: 16px; overflow: hidden; box-shadow: 0 4px 15px rgba(0,0,0,0.1); transition: transform 0.3s; border: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                            '<div class=\"story-img-container\" data-type=\"' + (isVideo ? 'video' : 'image') + '\" data-media=\"' + mediaUrl + '\">' +\r\n                                            '<img decoding=\"async\" class=\"story-thumb\" src=\"' + previewUrl + '\" alt=\"Spotlight ' + (index + 1) + '\" \/>' +\r\n                                            (isVideo ? '<button class=\"story-always-play\" onclick=\"playMedia(this.closest(\\'.story-img-container\\').querySelector(\\'.story-view-btn\\'))\" title=\"Play Video\"><i class=\"fa-solid fa-play\"><\/i><\/button>' : '') +\r\n                                            '<button class=\"story-always-download\" onclick=\"window.downloadMedia(\\'' + mediaUrl + '\\', \\'snapchat_spotlight_' + index + '_' + Date.now() + '.' + (isVideo ? 'mp4' : 'jpg') + '\\')\" title=\"Download\"><i class=\"fa-solid fa-download\"><\/i><\/button>' +\r\n                                            (durationText ? '<div style=\"position: absolute; bottom: 10px; right: 10px; background: rgba(0,0,0,0.8); color: white; padding: 4px 8px; border-radius: 4px; font-size: 12px; font-weight: 600;\">' + durationText + '<\/div>' : '') +\r\n                                            '<div class=\"story-overlay\">' +\r\n                                            '<button class=\"story-view-btn\" onclick=\"playMedia(this)\"><i class=\"fa-solid fa-' + (isVideo ? 'play' : 'expand') + '\"><\/i><\/button>' +\r\n                                            (isVideo ? '<button class=\"story-fullscreen-btn\" style=\"display:none;\"><i class=\"fa-solid fa-expand\"><\/i><\/button>' : '') +\r\n                                            '<button class=\"story-download-btn\" data-url=\"' + mediaUrl + '\" data-filename=\"snapchat_spotlight_' + index + '_' + Date.now() + '.' + (isVideo ? 'mp4' : 'jpg') + '\" data-type=\"' + (isVideo ? 'video' : 'image') + '\" onclick=\"downloadMedia(this)\"><i class=\"fa-solid fa-download\"><\/i><\/button>' +\r\n                                            ((comments.length > 0 || engagementStats.commentCount) ? '<button class=\"story-comment-btn\" onclick=\"showCommentsModal(' + index + ', \\'spotlight\\')\"><i class=\"fa-solid fa-comments\"><\/i><\/button>' : '') +\r\n                                            '<\/div>' +\r\n                                            '<\/div>' +\r\n                                            '<div style=\"padding: 20px;\">' +\r\n                                            '<div style=\"font-weight: 700; color: #e0e0e0; margin-bottom: 15px; text-align: center; font-size: 18px;\">Spotlight ' + (index + 1) + '<\/div>';\r\n\r\n                                        \/\/ Compact Engagement Stats\r\n                                        if (engagementStats.viewCount || engagementStats.commentCount || engagementStats.shareCount || engagementStats.boostCount) {\r\n                                            spotlightsTabHTML += '<div style=\"display: flex; justify-content: center; gap: 20px; margin-bottom: 15px; padding: 12px; background: rgba(255, 255, 255, 0.05); border-radius: 10px;\">';\r\n                                            if (engagementStats.viewCount) {\r\n                                                spotlightsTabHTML += '<div style=\"text-align: center;\"><div style=\"font-weight: 700; color: #00BCD4; font-size: 16px;\">' + formatNumber(engagementStats.viewCount) + '<\/div><div style=\"font-size: 11px; color: #a0a0a0;\">Views<\/div><\/div>';\r\n                                            }\r\n                                            if (engagementStats.commentCount) {\r\n                                                spotlightsTabHTML += '<div style=\"text-align: center;\"><div style=\"font-weight: 700; color: #FF9800; font-size: 16px;\">' + formatNumber(engagementStats.commentCount) + '<\/div><div style=\"font-size: 11px; color: #a0a0a0;\">Comments<\/div><\/div>';\r\n                                            }\r\n                                            if (engagementStats.shareCount) {\r\n                                                spotlightsTabHTML += '<div style=\"text-align: center;\"><div style=\"font-weight: 700; color: #25D366; font-size: 16px;\">' + formatNumber(engagementStats.shareCount) + '<\/div><div style=\"font-size: 11px; color: #a0a0a0;\">Shares<\/div><\/div>';\r\n                                            }\r\n                                            if (engagementStats.boostCount) {\r\n                                                spotlightsTabHTML += '<div style=\"text-align: center;\"><div style=\"font-weight: 700; color: #FF9800; font-size: 16px;\">' + formatNumber(engagementStats.boostCount) + '<\/div><div style=\"font-size: 11px; color: #a0a0a0;\">Boosts<\/div><\/div>';\r\n                                            }\r\n                                            spotlightsTabHTML += '<\/div>';\r\n                                        }\r\n\r\n                                        \/\/ Description (if available)\r\n                                        if (description) {\r\n                                            spotlightsTabHTML += '<div style=\"margin: 10px 0; padding: 10px; background: rgba(255, 255, 255, 0.05); border-radius: 8px; font-size: 13px; color: #d0d0d0; line-height: 1.4; text-align: center;\">' + description + '<\/div>';\r\n                                        }\r\n\r\n                                        \/\/ Hashtags (compact)\r\n                                        if (hashtags.length > 0) {\r\n                                            spotlightsTabHTML += '<div style=\"margin: 10px 0; text-align: center;\">';\r\n                                            hashtags.forEach(tag => {\r\n                                                spotlightsTabHTML += '<span style=\"background: rgba(255, 152, 0, 0.2); color: #FF9800; padding: 4px 10px; border-radius: 15px; font-size: 11px; font-weight: 600; margin: 3px;\">#' + tag + '<\/span>';\r\n                                            });\r\n                                            spotlightsTabHTML += '<\/div>';\r\n                                        }\r\n\r\n                                        \/\/ Comment Button - Prominent\r\n                                        if (comments.length > 0 || engagementStats.commentCount) {\r\n                                            const commentCount = comments.length || engagementStats.commentCount || 0;\r\n                                            spotlightsTabHTML += '<div style=\"text-align: center; margin-top: 15px;\">' +\r\n                                                '<button onclick=\"showCommentsModal(' + index + ', \\'spotlight\\')\" style=\"padding: 12px 30px; background: linear-gradient(135deg, #00BCD4, #FF9800); color: white; border: none; border-radius: 25px; font-weight: 700; cursor: pointer; font-size: 15px; transition: transform 0.2s; box-shadow: 0 4px 15px rgba(0, 188, 212, 0.3); width: 100%;\">' +\r\n                                                '<i class=\"fa-solid fa-comments\" style=\"margin-right: 8px;\"><\/i>' +\r\n                                                'View Comments (' + formatNumber(commentCount) + ')' +\r\n                                                '<\/button>' +\r\n                                                '<\/div>';\r\n                                        }\r\n\r\n                                        \/\/ Upload Date (compact)\r\n                                        if (videoMeta.uploadDateMs) {\r\n                                            const uploadDate = new Date(parseInt(videoMeta.uploadDateMs));\r\n                                            spotlightsTabHTML += '<div style=\"text-align: center; font-size: 11px; color: #a0a0a0; margin-top: 12px; padding-top: 12px; border-top: 1px solid rgba(255, 255, 255, 0.1);\">' +\r\n                                                '<i class=\"fa-solid fa-clock\" style=\"margin-right: 4px;\"><\/i>' +\r\n                                                uploadDate.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) +\r\n                                                '<\/div>';\r\n                                        }\r\n\r\n                                        spotlightsTabHTML += '<\/div><\/div>';\r\n                                    }\r\n                                });\r\n\r\n                                spotlightsTabHTML += '<\/div>';\r\n                            } else {\r\n                                spotlightsTabHTML = '<div class=\"no-result\"><i class=\"fa-solid fa-fire\"><\/i><p>No spotlights available at this time<\/p><\/div>';\r\n                            }\r\n\r\n                            \/\/ Update highlights cards to match dark theme\r\n                            highlightsTabHTML = highlightsTabHTML.replace(\/background: white\/g, 'background: rgba(255, 255, 255, 0.05)');\r\n                            highlightsTabHTML = highlightsTabHTML.replace(\/color: #333\/g, 'color: #e0e0e0');\r\n                            highlightsTabHTML = highlightsTabHTML.replace(\/color: #666\/g, 'color: #a0a0a0');\r\n                            highlightsTabHTML = highlightsTabHTML.replace(\/border: 2px solid rgba\\(0, 0, 0, 0\\.1\\)\/g, 'border: 1px solid rgba(255, 255, 255, 0.1)');\r\n\r\n                            \/\/ Populate tab contents\r\n                            \/\/ Highlights tab - show curatedHighlights\r\n                            if ($('#highlights-content').length > 0) {\r\n                                $('#highlights-content').html(highlightsTabHTML || '<div class=\"no-result\"><i class=\"fa-solid fa-bookmark\"><\/i><p>No highlights available<\/p><\/div>');\r\n                            }\r\n                            \/\/ Story tab - show story only (not highlights)\r\n                            if ($('#story-content').length > 0) {\r\n                                $('#story-content').html(storyHTML || '<div class=\"no-result\"><i class=\"fa-solid fa-circle-play\"><\/i><p>No active story at this time<\/p><\/div>');\r\n                            }\r\n                            \/\/ Spotlights tab\r\n                            if ($('#spotlights-content').length > 0) {\r\n                                $('#spotlights-content').html(spotlightsTabHTML || '<div class=\"no-result\"><i class=\"fa-solid fa-fire\"><\/i><p>No spotlights available<\/p><\/div>');\r\n                            }\r\n\r\n                            \/\/ Always set Highlights as the default active tab\r\n                            \/\/ Tabs order: Highlights(0), Spotlights(1), Story(2), Related(3), Other(4)\r\n                            $('.sc-tabs button').removeClass('active');\r\n                            $('.tab-content').removeClass('active').hide();\r\n\r\n                            \/\/ Always show Highlights tab by default\r\n                            $('#highlights-content').addClass('active').show();\r\n                            $('.sc-tabs button').eq(0).addClass('active');\r\n\r\n                            \/\/ Ensure all containers are visible (already visible by default now)\r\n                            $(\".sc-profile-header\").show();\r\n                            $(\".sc-tabs\").show();\r\n\r\n                            \/\/ Scroll to result\r\n                            setTimeout(() => {\r\n                                $(\".sc-result\")[0].scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n                            }, 500);\r\n\r\n                            \/\/ Store spotlight comments data for modal access\r\n                            spotlightHighlights.forEach((spotlight, index) => {\r\n                                const spotlightMeta = spotlightMetadata[index] || {};\r\n                                const engagementStats = spotlightMeta.engagementStats || {};\r\n\r\n                                \/\/ Get comments from transformed data (already parsed by backend)\r\n                                let comments = [];\r\n                                if (Array.isArray(spotlightComments) && spotlightComments[index]) {\r\n                                    comments = spotlightComments[index];\r\n                                } else if (spotlightCommentsByIndex && spotlightCommentsByIndex[index]) {\r\n                                    comments = spotlightCommentsByIndex[index];\r\n                                }\r\n\r\n                                window.spotlightCommentsData[index] = {\r\n                                    title: 'Spotlight ' + (index + 1),\r\n                                    comments: comments,\r\n                                    commentCount: engagementStats.commentCount || comments.length || 0\r\n                                };\r\n                            });\r\n\r\n                            \/\/ Data is ready: hide loading, show content (next frame so DOM has painted)\r\n                            requestAnimationFrame(function() {\r\n                                requestAnimationFrame(function() {\r\n                                    $(\"#skeleton-loading\").hide();\r\n                                    $(\"#actual-content\").show();\r\n                                });\r\n                            });\r\n\r\n                } catch (err) {\r\n                    $(\".view-btn\").prop(\"disabled\", false).html(\"<i class='fa-solid fa-search'><\/i> View Profile\");\r\n                    $(\"#skeleton-loading\").hide();\r\n                    $(\"#actual-content\").show();\r\n\r\n                    let errorMsg = \"Something went wrong. Please try again.\";\r\n\r\n                    \/\/ Check for network\/CORS errors\r\n                    if (err && err.message) {\r\n                        if (err.message.includes(\"Failed to fetch\") || err.message.includes(\"NetworkError\")) {\r\n                            errorMsg = \"Unable to connect to \" + apiBaseUrl + \". Please check if the server is running.\";\r\n                        } else {\r\n                            \/\/ Remove technical terms from error message\r\n                            errorMsg = String(err.message).replace(\/API|api|endpoint|server|CORS|cors|Laravel|laravel|port \\d+\/gi, '').trim();\r\n                            if (!errorMsg || errorMsg.length < 3) {\r\n                                errorMsg = \"Something went wrong. Please try again.\";\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    $(\"#error-message\").text(errorMsg).show();\r\n                }\r\n            });\r\n\r\n            \/\/ Story action button handlers (play\/download) - delegated, so register once\r\n            $(document).on(\"click\", \".story-action-btn\", function (e) {\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n\r\n                var index = parseInt($(this).attr(\"data-index\"), 10);\r\n                var action = $(this).attr(\"data-action\");\r\n\r\n                if (isNaN(index)) {\r\n                    return;\r\n                }\r\n\r\n                var data = window._snapchatStoriesData || {};\r\n                var stories = data.stories || [];\r\n\r\n                if (!stories || stories.length === 0) {\r\n                    return;\r\n                }\r\n\r\n                var story = stories[index];\r\n                if (!story) {\r\n                    return;\r\n                }\r\n\r\n                if (action === \"play\") {\r\n                    var firstSnap = story.snaps && story.snaps[0];\r\n                    if (firstSnap) {\r\n                        var mediaUrl = firstSnap.mediaUrl;\r\n                        if (!mediaUrl) {\r\n                            var storyCard = $('.story-card[data-index=\"' + index + '\"]');\r\n                            var imgContainer = storyCard.find('.story-img-container');\r\n                            mediaUrl = imgContainer.attr('data-media');\r\n                        }\r\n\r\n                        var isVideo = false;\r\n                        var snapMediaType = firstSnap.snapMediaType;\r\n\r\n                        if (snapMediaType === 1 || snapMediaType === '1' || parseInt(snapMediaType) === 1) {\r\n                            isVideo = true;\r\n                        } else if (snapMediaType === 2 || snapMediaType === '2' || parseInt(snapMediaType) === 2) {\r\n                            isVideo = true;\r\n                        }\r\n\r\n                        if (!isVideo && story.snaps && story.snaps.length > 0) {\r\n                            story.snaps.forEach(function(snap) {\r\n                                var st = snap.snapMediaType;\r\n                                if (st === 1 || st === '1' || parseInt(st) === 1 || st === 2 || st === '2' || parseInt(st) === 2) {\r\n                                    isVideo = true;\r\n                                }\r\n                            });\r\n                        }\r\n\r\n                        if (!isVideo && mediaUrl) {\r\n                            if (mediaUrl.includes('.1322')) {\r\n                                isVideo = true;\r\n                            } else {\r\n                                var videoExtensions = ['.mp4', '.mov', '.webm', '.avi', '.mkv', 'video', 'mp4'];\r\n                                var urlLower = mediaUrl.toLowerCase();\r\n                                isVideo = videoExtensions.some(function(ext) {\r\n                                    return urlLower.includes(ext);\r\n                                });\r\n                            }\r\n                        }\r\n\r\n                        if (mediaUrl) {\r\n                            if (isVideo) {\r\n                                try {\r\n                                    if (typeof window.showMediaModal === 'function') {\r\n                                        var fullUrl = window.resolveFullVideoUrl(mediaUrl, 'video');\r\n                                        window.showMediaModal(fullUrl || mediaUrl, 'video', 'story_' + index + '_' + Date.now() + '.mp4');\r\n                                    } else {\r\n                                        window.open(mediaUrl, '_blank');\r\n                                    }\r\n                                } catch (err) {\r\n                                    window.open(mediaUrl, '_blank');\r\n                                }\r\n                            } else {\r\n                                try {\r\n                                    if (typeof window.showMediaModal === 'function') {\r\n                                        window.showMediaModal(mediaUrl, 'image', 'story_' + index + '_' + Date.now() + '.jpg');\r\n                                    } else {\r\n                                        window.open(mediaUrl, '_blank');\r\n                                    }\r\n                                } catch (err) {\r\n                                    window.open(mediaUrl, '_blank');\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                } else if (action === \"download\") {\r\n                    var firstSnap = story.snaps && story.snaps[0];\r\n                    if (firstSnap) {\r\n                        var mediaUrl = firstSnap.mediaUrl;\r\n                        if (!mediaUrl) {\r\n                            var storyCard = $('.story-card[data-index=\"' + index + '\"]');\r\n                            var imgContainer = storyCard.find('.story-img-container');\r\n                            mediaUrl = imgContainer.attr('data-media');\r\n                        }\r\n                        if (!mediaUrl && window.getFullMediaUrl) {\r\n                            mediaUrl = window.getFullMediaUrl(index);\r\n                        }\r\n                        var isVideo = false;\r\n                        if (firstSnap.snapMediaType === 1 || firstSnap.snapMediaType === 2 || firstSnap.snapMediaType === '1' || firstSnap.snapMediaType === '2') {\r\n                            isVideo = true;\r\n                        } else if (mediaUrl && (mediaUrl.includes('.1322') || mediaUrl.match(\/\\.mp4|\\.mov|\\.webm\/i))) {\r\n                            isVideo = true;\r\n                        }\r\n                        if (mediaUrl) {\r\n                            if (isVideo && window.resolveFullVideoUrl) {\r\n                                mediaUrl = window.resolveFullVideoUrl(mediaUrl, 'video');\r\n                            }\r\n                            if (typeof window.downloadMedia === 'function') {\r\n                                window.downloadMedia(mediaUrl, 'story_' + index + '_' + Date.now() + '.' + (isVideo ? 'mp4' : 'jpg'));\r\n                            } else {\r\n                                window.open(mediaUrl, '_blank');\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n\r\n            \/\/ Enter key support\r\n            $(\"#input-username\").on(\"keypress\", function(e) {\r\n                if (e.key === \"Enter\") {\r\n                    $(\".view-btn\").click();\r\n                }\r\n            });\r\n\r\n            \/\/ Switch tab function\r\n            window.switchTab = function(tabName, buttonElement) {\r\n                \/\/ Update active button\r\n                document.querySelectorAll('.sc-tabs button').forEach(btn => {\r\n                    btn.classList.remove('active');\r\n                });\r\n                if (buttonElement) {\r\n                    buttonElement.classList.add('active');\r\n                }\r\n\r\n                \/\/ Hide all tab contents and remove active class\r\n                document.querySelectorAll('.tab-content').forEach(content => {\r\n                    content.classList.remove('active');\r\n                    content.style.display = 'none';\r\n                });\r\n\r\n                \/\/ Show selected tab content\r\n                const targetContent = document.getElementById(tabName + '-content');\r\n                if (targetContent) {\r\n                    targetContent.classList.add('active');\r\n                    targetContent.style.display = 'block';\r\n                }\r\n\r\n                \/\/ If Story tab is clicked, fetch stories API\r\n                if (tabName === 'story') {\r\n                    const username = $(\"#input-username\").val().trim();\r\n                    if (username) {\r\n                        fetchStoriesForProfile(username);\r\n                    } else {\r\n                        \/\/ Show placeholder if no username\r\n                        $('#story-content').html('<div class=\"no-result\"><i class=\"fa-solid fa-circle-play\" style=\"font-size: 48px; color: rgba(255, 255, 255, 0.2); margin-bottom: 15px;\"><\/i><p>Enter a Snapchat username above and click Story to view stories anonymously.<\/p><\/div>');\r\n                    }\r\n                }\r\n            };\r\n\r\n            \/\/ Tab button click handlers - using event delegation\r\n            $(document).on('click', '.sc-tabs button', function() {\r\n                const tabName = $(this).data('tab');\r\n                if (tabName) {\r\n                    window.switchTab(tabName, this);\r\n                }\r\n            });\r\n\r\n            \/\/ HTML escape function\r\n            function esc(str) {\r\n                if (!str) return \"\";\r\n                return String(str)\r\n                    .replace(\/&\/g, \"\\u0026amp;\")\r\n                    .replace(\/<\/g, \"\\u0026lt;\")\r\n                    .replace(\/>\/g, \"\\u0026gt;\")\r\n                    .replace(\/\"\/g, \"\\u0026quot;\")\r\n                    .replace(\/'\/g, \"\\u0026#39;\");\r\n            }\r\n\r\n            \/\/ Function to fetch stories API (similar to snapchatstoryviewer.html)\r\n            async function fetchStoriesForProfile(username) {\r\n                if (!username) return;\r\n\r\n                \/\/ Show loading state\r\n                $('#story-content').html('<div class=\"no-result\"><i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 48px; color: rgba(255, 255, 255, 0.2); margin-bottom: 15px;\"><\/i><p>Loading stories...<\/p><\/div>');\r\n\r\n                try {\r\n                    const apiUrl = apiBaseUrl + \"\/api\/snapchat\/stories\";\r\n                    const clientIp = window.clientIpDetector?.getIp() || window.clientDetectedIpv4 || window.detectedClientIpv4 || null;\r\n\r\n                    const headers = { \"Content-Type\": \"application\/json\" };\r\n                    if (clientIp) {\r\n                        headers[\"X-Client-IPv4\"] = clientIp;\r\n                    }\r\n\r\n                    const resp = await fetch(apiUrl, {\r\n                        method: \"POST\",\r\n                        headers: headers,\r\n                        body: JSON.stringify({ username: username }),\r\n                    });\r\n\r\n                    const responseText = await resp.text();\r\n                    if (!responseText || responseText.trim().length === 0) {\r\n                        throw new Error(\"No data received. Please try again.\");\r\n                    }\r\n\r\n                    if (responseText.trim().startsWith(\"<\")) {\r\n                        throw new Error(\"Something went wrong. Please try again later.\");\r\n                    }\r\n\r\n                    let res = null;\r\n                    try {\r\n                        res = JSON.parse(responseText);\r\n                    } catch (parseErr) {\r\n                        throw new Error(\"Unable to process the response. Please try again.\");\r\n                    }\r\n\r\n                    if (!resp.ok) {\r\n                        let msg = (res && (res.message || res.error)) || \"Something went wrong. Please try again.\";\r\n                        msg = msg.replace(\/API|api|endpoint|server|CORS|cors\/gi, '').trim();\r\n                        if (!msg || msg.length < 3) {\r\n                            msg = \"Something went wrong. Please try again.\";\r\n                        }\r\n                        $('#story-content').html('<div class=\"no-result\"><i class=\"fa-solid fa-circle-play\"><\/i><p>' + esc(msg) + '<\/p><\/div>');\r\n                        return;\r\n                    }\r\n\r\n                    if (res && res.status === \"error\") {\r\n                        let msg = res.message || \"Something went wrong. Please try again.\";\r\n                        msg = msg.replace(\/API|api|endpoint|server|CORS|cors\/gi, '').trim();\r\n                        if (!msg || msg.length < 3) {\r\n                            msg = \"Something went wrong. Please try again.\";\r\n                        }\r\n                        $('#story-content').html('<div class=\"no-result\"><i class=\"fa-solid fa-circle-play\"><\/i><p>' + esc(msg) + '<\/p><\/div>');\r\n                        return;\r\n                    }\r\n\r\n                    const data = (res && res.data) || {};\r\n                    window._snapchatStoriesData = data;\r\n                    renderStoriesInProfile(data);\r\n\r\n                } catch (err) {\r\n                    let errorMsg = \"Something went wrong. Please try again.\";\r\n                    if (err && err.message) {\r\n                        if (err.message.includes(\"Failed to fetch\") || err.message.includes(\"NetworkError\")) {\r\n                            errorMsg = \"Unable to connect to \" + apiBaseUrl + \". Please check if the server is running.\";\r\n                        } else {\r\n                            errorMsg = String(err.message).replace(\/API|api|endpoint|server|CORS|cors|Laravel|laravel|port \\d+\/gi, '').trim();\r\n                            if (!errorMsg || errorMsg.length < 3) {\r\n                                errorMsg = \"Something went wrong. Please try again.\";\r\n                            }\r\n                        }\r\n                    }\r\n                    $('#story-content').html('<div class=\"no-result\"><i class=\"fa-solid fa-circle-play\"><\/i><p>' + esc(errorMsg) + '<\/p><\/div>');\r\n                }\r\n            }\r\n\r\n            \/\/ Helper function for date formatting\r\n            function formatDateOnly(sec) {\r\n                if (!sec) return \"Unknown\";\r\n                var n = parseInt(sec, 10);\r\n                if (isNaN(n)) return \"Unknown\";\r\n                var d = new Date(n * 1000);\r\n                return d.toLocaleDateString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" });\r\n            }\r\n\r\n            function formatTimestamp(sec) {\r\n                if (!sec) return \"Unknown time\";\r\n                var n = parseInt(sec, 10);\r\n                if (isNaN(n)) return \"Unknown time\";\r\n                var d = new Date(n * 1000);\r\n                return d.toLocaleString();\r\n            }\r\n\r\n            \/\/ Helper function to get full mediaUrl\r\n            window.getFullMediaUrl = function(storyIndex, snapIndex) {\r\n                if (window._snapchatStoriesData && window._snapchatStoriesData.stories && window._snapchatStoriesData.stories[storyIndex]) {\r\n                    const story = window._snapchatStoriesData.stories[storyIndex];\r\n                    if (snapIndex !== undefined && story.snaps && story.snaps[snapIndex]) {\r\n                        const snap = story.snaps[snapIndex];\r\n                        if (snap.mediaUrl) {\r\n                            return snap.mediaUrl;\r\n                        }\r\n                    } else if (story.snaps && story.snaps.length > 0) {\r\n                        for (let i = 0; i < story.snaps.length; i++) {\r\n                            const snap = story.snaps[i];\r\n                            if (snap.mediaUrl) {\r\n                                return snap.mediaUrl;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                return null;\r\n            };\r\n\r\n            \/\/ Helper function to resolve preview URLs to full video URLs\r\n            window.resolveFullVideoUrl = function(url, mediaType) {\r\n                if (!url) return url;\r\n                const isVideoUrl = mediaType === 'video' || url.includes('.1322') || url.match(\/\\.mp4|\\.mov|\\.webm\/i);\r\n                if (!isVideoUrl) return url;\r\n\r\n                if (window._snapchatStoriesData && window._snapchatStoriesData.stories) {\r\n                    for (let sIdx = 0; sIdx < window._snapchatStoriesData.stories.length; sIdx++) {\r\n                        const story = window._snapchatStoriesData.stories[sIdx];\r\n                        if (story && story.snaps) {\r\n                            for (let snapIdx = 0; snapIdx < story.snaps.length; snapIdx++) {\r\n                                const snap = story.snaps[snapIdx];\r\n                                if (snap.mediaPreviewUrl === url && snap.mediaUrl) {\r\n                                    return snap.mediaUrl;\r\n                                }\r\n                                if (snap.mediaUrl === url) {\r\n                                    return url;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                return url;\r\n            };\r\n\r\n            \/\/ Function to toggle snap list visibility\r\n            window.toggleSnapList = function(index) {\r\n                var snapList = $(\"#snap-list-\" + index);\r\n                if (snapList.length) {\r\n                    snapList.toggleClass(\"collapsed\");\r\n                }\r\n            };\r\n\r\n            \/\/ Function to render stories in profile viewer (same as snapchatstoryviewer.html)\r\n            function renderStoriesInProfile(data) {\r\n                const stories = data.stories || [];\r\n\r\n                if (!stories.length) {\r\n                    $('#story-content').html('<div class=\"no-result\"><i class=\"fa-solid fa-clapperboard\"><\/i><p>No public stories were found for this user.<\/p><\/div>');\r\n                    return;\r\n                }\r\n\r\n                var html = \"\";\r\n                stories.forEach(function (story, index) {\r\n                    var snaps = story.snaps || [];\r\n                    var thumb = story.thumbnailUrl || (snaps[0] && (snaps[0].mediaPreviewUrl || snaps[0].mediaUrl)) || \"\";\r\n                    var title = story.storyTitle || (\"Story \" + (index + 1));\r\n                    var firstTs = snaps[0] && snaps[0].timestampInSec;\r\n                    var dateText = formatDateOnly(firstTs);\r\n                    var subtitle = story.storySubtitle || \"\";\r\n                    var emoji = story.emoji || \"\";\r\n                    var storyId = story.storyId || \"\";\r\n                    var storyShareId = story.storyShareId || \"\";\r\n\r\n                    var firstSnap = snaps[0] || {};\r\n                    var firstMediaUrl = firstSnap.mediaUrl || firstSnap.mediaPreviewUrl || thumb || \"\";\r\n\r\n                    \/\/ Detect video\r\n                    var isVideo = false;\r\n                    var videoSnap = null;\r\n\r\n                    snaps.forEach(function(snap, snapIdx) {\r\n                        var snapMediaType = snap.snapMediaType;\r\n                        var snapUrl = snap.mediaUrl || snap.mediaPreviewUrl || '';\r\n\r\n                        var isSnapVideo = false;\r\n                        if (snapMediaType === 1 || snapMediaType === '1' || parseInt(snapMediaType) === 1) {\r\n                            isSnapVideo = true;\r\n                        } else if (snapMediaType === 2 || snapMediaType === '2' || parseInt(snapMediaType) === 2) {\r\n                            isSnapVideo = true;\r\n                        }\r\n\r\n                        if (!isSnapVideo && snapUrl) {\r\n                            if (snapUrl.includes('.1322') || snapUrl.match(\/\\.\\d{4}\/)) {\r\n                                var urlMatch = snapUrl.match(\/\\.(\\d{3,4})\/);\r\n                                if (urlMatch && urlMatch[1] !== '400' && urlMatch[1] !== '410') {\r\n                                    isSnapVideo = true;\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        if (isSnapVideo) {\r\n                            isVideo = true;\r\n                            videoSnap = snap;\r\n                        }\r\n                    });\r\n\r\n                    if (videoSnap) {\r\n                        if (videoSnap.mediaUrl) {\r\n                            firstMediaUrl = videoSnap.mediaUrl;\r\n                        } else {\r\n                            var foundUrl = null;\r\n                            snaps.forEach(function(snap) {\r\n                                if (snap.mediaUrl && !foundUrl) {\r\n                                    foundUrl = snap.mediaUrl;\r\n                                }\r\n                            });\r\n                            if (foundUrl) {\r\n                                firstMediaUrl = foundUrl;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (!isVideo && firstMediaUrl) {\r\n                        if (firstMediaUrl.includes('.1322')) {\r\n                            isVideo = true;\r\n                        } else {\r\n                            var videoExtensions = ['.mp4', '.mov', '.webm', '.avi', '.mkv', 'video', 'mp4'];\r\n                            var urlLower = firstMediaUrl.toLowerCase();\r\n                            isVideo = videoExtensions.some(function(ext) {\r\n                                return urlLower.includes(ext);\r\n                            });\r\n                        }\r\n                    }\r\n\r\n                    var snapListHtml = \"\";\r\n                    if (snaps.length) {\r\n                        snaps.forEach(function (snap, sIndex) {\r\n                            var snapThumb = snap.mediaPreviewUrl || snap.mediaUrl || \"\";\r\n                            var snapMediaUrl = snap.mediaUrl || \"\";\r\n                            var snapTime = formatTimestamp(snap.timestampInSec);\r\n\r\n                            var isVideo = false;\r\n                            var snapMediaType = snap.snapMediaType;\r\n\r\n                            if (snapMediaType === 1 || snapMediaType === '1' || parseInt(snapMediaType) === 1) {\r\n                                isVideo = true;\r\n                            } else if (snapMediaType === 2 || snapMediaType === '2' || parseInt(snapMediaType) === 2) {\r\n                                isVideo = true;\r\n                            }\r\n\r\n                            if (!isVideo && snapMediaUrl) {\r\n                                if (snapMediaUrl.includes('.1322')) {\r\n                                    isVideo = true;\r\n                                } else {\r\n                                    var videoExtensions = ['.mp4', '.mov', '.webm', '.avi', '.mkv', 'video', 'mp4'];\r\n                                    var urlLower = snapMediaUrl.toLowerCase();\r\n                                    isVideo = videoExtensions.some(function(ext) {\r\n                                        return urlLower.includes(ext);\r\n                                    });\r\n                                }\r\n                            }\r\n\r\n                            var mediaType = isVideo ? \"Video\" : \"Image\";\r\n                            var hasAttach = snap.hasAttachment ? \"Yes\" : \"No\";\r\n                            var coords = (snap.lat && snap.lng) ? (snap.lat + \", \" + snap.lng) : \"-\";\r\n                            var snapTitle = snap.snapTitle || \"\";\r\n                            var snapSubtitles = snap.snapSubtitles || \"\";\r\n                            var overlayUrl = snap.overlayUrl || \"\";\r\n                            var attachmentUrl = snap.attachmentUrl || \"\";\r\n\r\n                            snapListHtml += '<div class=\"snap-item\">' +\r\n                                '<div class=\"snap-thumb\" style=\"position:relative;cursor:pointer;\" onclick=\"showMediaModal(\\'' + esc(snapMediaUrl) + '\\', \\'' + (isVideo ? 'video' : 'image') + '\\', \\'snap_' + index + '_' + sIndex + '_' + Date.now() + '.' + (isVideo ? 'mp4' : 'jpg') + '\\')\">' +\r\n                                (snapThumb\r\n                                    ? '<img decoding=\"async\" src=\"' + esc(snapThumb) + '\" alt=\"Snap ' + (sIndex + 1) + '\">'\r\n                                    : '<div style=\"width:100%;height:100%;background:rgba(255,255,255,0.05);display:flex;align-items:center;justify-content:center;\"><i class=\"fa-solid fa-image\" style=\"color:rgba(255,255,255,0.3);\"><\/i><\/div>'\r\n                                ) +\r\n                                (isVideo ? '<button class=\"story-always-play\" style=\"top: 5px; left: 5px; width: 28px; height: 28px; font-size: 11px;\" onclick=\"event.stopPropagation(); showMediaModal(\\'' + esc(snapMediaUrl) + '\\', \\'video\\', \\'snap_' + index + '_' + sIndex + '.mp4\\')\" title=\"Play Video\"><i class=\"fa-solid fa-play\"><\/i><\/button>' : '') +\r\n                                '<button class=\"story-always-download\" style=\"top: 5px; right: 5px; width: 28px; height: 28px; font-size: 11px;\" onclick=\"event.stopPropagation(); (function(storyIdx, snapIdx, isVid) { var url = window.getFullMediaUrl(storyIdx, snapIdx); if (url) { window.downloadMedia(url, \\'snap_\\' + storyIdx + \\'_\\' + snapIdx + \\'_\\' + Date.now() + \\'.\\' + (isVid ? \\'mp4\\' : \\'jpg\\')); } })(' + index + ', ' + sIndex + ', ' + (isVideo ? 'true' : 'false') + ')\" title=\"Download\"><i class=\"fa-solid fa-download\"><\/i><\/button>' +\r\n                                '<\/div>' +\r\n                                '<div class=\"snap-meta\">' +\r\n                                '<div class=\"snap-badge\">Snap ' + (sIndex + 1) + \" \u2022 \" + esc(mediaType) + \"<\/div>\" +\r\n                                (snapTitle ? '<div class=\"story-meta-row\"><span class=\"story-meta-label\">Title:<\/span><span class=\"story-meta-value\">' + esc(snapTitle) + \"<\/span><\/div>\" : \"\") +\r\n                                (snapSubtitles ? '<div class=\"story-meta-row\"><span class=\"story-meta-label\">Subtitles:<\/span><span class=\"story-meta-value\">' + esc(snapSubtitles) + \"<\/span><\/div>\" : \"\") +\r\n                                '<div class=\"story-meta-row\"><span class=\"story-meta-label\">Time:<\/span><span class=\"story-meta-value\">' + esc(snapTime) + \"<\/span><\/div>\" +\r\n                                '<div class=\"story-meta-row\"><span class=\"story-meta-label\">Location:<\/span><span class=\"story-meta-value\">' + esc(coords) + \"<\/span><\/div>\" +\r\n                                '<div class=\"story-meta-row\"><span class=\"story-meta-label\">Attachment:<\/span><span class=\"story-meta-value\">' + esc(hasAttach) + (attachmentUrl ? ' <a href=\"' + esc(attachmentUrl).replace(\/\"\/g, '\"') + '\" target=\"_blank\" style=\"color:#00BCD4;margin-left:5px;\"><i class=\"fa-solid fa-external-link\"><\/i><\/a>' : '') + '<\/span><\/div>' +\r\n                                (overlayUrl ? '<div class=\"story-meta-row\"><span class=\"story-meta-label\">Overlay:<\/span><span class=\"story-meta-value\"><a href=\"' + esc(overlayUrl).replace(\/\"\/g, '\"') + '\" target=\"_blank\" style=\"color:#00BCD4;\"><i class=\"fa-solid fa-external-link\"><\/i> View<\/a><\/span><\/div>' : '') +\r\n                                \"<\/div>\" +\r\n                                \"<\/div>\";\r\n                        });\r\n                    } else {\r\n                        snapListHtml = '<div class=\"snap-item\"><div class=\"snap-meta\"><span class=\"story-meta-value\">No snaps listed for this story.<\/span><\/div><\/div>';\r\n                    }\r\n\r\n                    html += '<div class=\"story-card\" data-index=\"' + index + '\">' +\r\n                        '<div class=\"story-img-container\" data-type=\"' + (isVideo ? 'video' : 'image') + '\" data-media=\"' + esc(firstMediaUrl) + '\">' +\r\n                        (thumb ? '<img decoding=\"async\" src=\"' + esc(thumb) + '\" alt=\"' + esc(title) + '\" class=\"story-thumb\">' : '<div style=\"width:100%;height:100%;background:rgba(255,255,255,0.05);display:flex;align-items:center;justify-content:center;\"><i class=\"fa-solid fa-image\" style=\"color:rgba(255,255,255,0.3);font-size:48px;\"><\/i><\/div>') +\r\n                        (isVideo ? '<button class=\"story-always-play\" onclick=\"event.stopPropagation(); playMedia(this.closest(\\'.story-img-container\\').querySelector(\\'.story-view-btn\\'))\" title=\"Play Video\"><i class=\"fa-solid fa-play\"><\/i><\/button>' : '') +\r\n                        '<button class=\"story-always-download\" onclick=\"event.stopPropagation(); (function(idx, isVid) { var url = window.getFullMediaUrl(idx) || $(this).closest(\\'.story-img-container\\').attr(\\'data-media\\'); if (url) { window.downloadMedia(url, \\'story_\\' + idx + \\'_\\' + Date.now() + \\'.\\' + (isVid ? \\'mp4\\' : \\'jpg\\')); } }).call(this, ' + index + ', ' + (isVideo ? 'true' : 'false') + ')\" title=\"Download\"><i class=\"fa-solid fa-download\"><\/i><\/button>' +\r\n                        '<div class=\"story-overlay\">' +\r\n                        '<button class=\"story-view-btn\" onclick=\"event.stopPropagation(); playMedia(this); return false;\"><i class=\"fa-solid fa-' + (isVideo ? 'play' : 'expand') + '\"><\/i><\/button>' +\r\n                        (isVideo ? '<button class=\"story-fullscreen-btn\" style=\"display:none;\"><i class=\"fa-solid fa-expand\"><\/i><\/button>' : '') +\r\n                        '<button class=\"story-download-btn\" data-url=\"' + esc(firstMediaUrl) + '\" data-filename=\"story_' + index + '_' + Date.now() + '.' + (isVideo ? 'mp4' : 'jpg') + '\" data-type=\"' + (isVideo ? 'video' : 'image') + '\" onclick=\"event.stopPropagation(); downloadMedia(this); return false;\"><i class=\"fa-solid fa-download\"><\/i><\/button>' +\r\n                        '<\/div>' +\r\n                        '<div style=\"position:absolute;bottom:15px;left:15px;right:15px;display:flex;justify-content:space-between;align-items:flex-end;z-index:5;\">' +\r\n                        '<div class=\"story-title\">' + (emoji ? esc(emoji) + \" \" : \"\") + esc(title) + \"<\/div>\" +\r\n                        '<div class=\"story-badge\" onclick=\"event.stopPropagation(); toggleSnapList(' + index + ')\" title=\"Click to show\/hide snaps\"><i class=\"fa-solid fa-clapperboard\"><\/i><span>' + snaps.length + \" snaps<\/span><\/div>\" +\r\n                        \"<\/div>\" +\r\n                        \"<\/div>\" +\r\n                        '<div class=\"story-meta\">' +\r\n                        '<div class=\"story-meta-row\"><span class=\"story-meta-label\">Title:<\/span><span class=\"story-meta-value\">' + esc(title) + \"<\/span><\/div>\" +\r\n                        (subtitle ? '<div class=\"story-meta-row\"><span class=\"story-meta-label\">Subtitle:<\/span><span class=\"story-meta-value\">' + esc(subtitle) + \"<\/span><\/div>\" : \"\") +\r\n                        '<div class=\"story-meta-row\"><span class=\"story-meta-label\">Date:<\/span><span class=\"story-meta-value\">' + (dateText ? esc(dateText) : \"Unknown\") + \"<\/span><\/div>\" +\r\n                        \"<\/div>\" +\r\n                        '<div class=\"story-actions\">' +\r\n                        '<button class=\"story-action-btn\" data-action=\"play\" data-index=\"' + index + '\"><i class=\"fa-solid fa-' + (isVideo ? 'play' : 'expand') + '\"><\/i> ' + (isVideo ? 'Play' : 'View') + '<\/button>' +\r\n                        '<button class=\"story-action-btn\" data-action=\"download\" data-index=\"' + index + '\"><i class=\"fa-solid fa-download\"><\/i> Download<\/button>' +\r\n                        \"<\/div>\" +\r\n                        '<div class=\"snap-list collapsed\" id=\"snap-list-' + index + '\">' + snapListHtml + \"<\/div>\" +\r\n                        \"<\/div>\";\r\n                });\r\n\r\n                $('#story-content').html('<div class=\"stories-grid\">' + html + '<\/div>');\r\n            }\r\n\r\n            \/\/ Profile image expand handler\r\n            $(document).on('click', '.view-profile-img', function() {\r\n                const profileImage = $(this).siblings('.profile-image');\r\n                const imgSrc = profileImage.find('img').attr('src');\r\n                if (imgSrc) {\r\n                    showMediaModal(imgSrc, 'image', 'profile_picture.jpg');\r\n                }\r\n            });\r\n\r\n            \/\/ Format number function\r\n            function formatNumber(num) {\r\n                if (!num) return '0';\r\n                const n = parseInt(num);\r\n                if (n >= 1000000) return (n \/ 1000000).toFixed(1) + 'M';\r\n                if (n >= 1000) return (n \/ 1000).toFixed(1) + 'K';\r\n                return n.toString();\r\n            }\r\n\r\n            \/\/ Function to pause all videos except the current one\r\n            function pauseAllVideosExcept(currentVideo) {\r\n                $(\"video.story-video\").each(function () {\r\n                    if (this !== currentVideo) {\r\n                        try {\r\n                            if (!this.paused) {\r\n                                this.pause();\r\n                            }\r\n                            \/\/ Reset UI for paused videos\r\n                            const container = $(this).closest('.story-img-container');\r\n                            const overlay = container.find('.story-overlay');\r\n                            const viewBtn = overlay.find('.story-view-btn');\r\n                            const fullscreenBtn = overlay.find('.story-fullscreen-btn');\r\n                            const thumbnail = container.find('.story-thumb');\r\n\r\n                            $(this).hide();\r\n                            thumbnail.show();\r\n                            viewBtn.html('<i class=\"fa-solid fa-play\"><\/i>');\r\n                            fullscreenBtn.hide();\r\n                        } catch (e) {\r\n                            console.warn(\"Error pausing video:\", e);\r\n                        }\r\n                    }\r\n                });\r\n            }\r\n\r\n            \/\/ Play media function (similar to Instagram)\r\n            window.playMedia = function(btn) {\r\n                const container = $(btn).closest('.story-img-container');\r\n                const mediaType = container.data('type');\r\n                const mediaUrl = container.data('media');\r\n                const overlay = container.find('.story-overlay');\r\n                const thumbnail = container.find('.story-thumb');\r\n                const viewBtn = $(btn);\r\n                const fullscreenBtn = overlay.find('.story-fullscreen-btn');\r\n\r\n                if (mediaType === 'video') {\r\n                    \/\/ Check if video already exists\r\n                    let video = container.find('video.story-video');\r\n                    let videoElement = video.length > 0 ? video.get(0) : null;\r\n\r\n                    if (!videoElement) {\r\n                        \/\/ Create video element\r\n                        video = $('<video class=\"story-video\" controls playsinline style=\"width:100%;height:100%;object-fit:cover;\"><\/video>');\r\n                        video.attr('src', mediaUrl);\r\n                        container.append(video);\r\n                        videoElement = video.get(0);\r\n                    }\r\n\r\n                    if (videoElement.paused) {\r\n                        \/\/ Pause all other videos first\r\n                        pauseAllVideosExcept(videoElement);\r\n\r\n                        thumbnail.hide();\r\n                        video.show();\r\n\r\n                        \/\/ Set video to start from beginning and play with a small delay\r\n                        videoElement.currentTime = 0;\r\n                        setTimeout(() => {\r\n                            videoElement.play()\r\n                                .then(() => {\r\n                                    viewBtn.html('<i class=\"fa-solid fa-pause\"><\/i>');\r\n                                    fullscreenBtn.show();\r\n                                })\r\n                                .catch((e) => {\r\n                                    console.warn(\"Video play error:\", e);\r\n                                    \/\/ Reset to play button if video fails\r\n                                    viewBtn.html('<i class=\"fa-solid fa-play\"><\/i>');\r\n                                    fullscreenBtn.hide();\r\n                                    video.hide();\r\n                                    thumbnail.show();\r\n                                });\r\n                        }, 100);\r\n                    } else {\r\n                        try {\r\n                            videoElement.pause();\r\n                            viewBtn.html('<i class=\"fa-solid fa-play\"><\/i>');\r\n                            fullscreenBtn.hide();\r\n                            video.hide();\r\n                            thumbnail.show();\r\n                        } catch (e) {\r\n                            console.warn(\"Error pausing video:\", e);\r\n                        }\r\n                    }\r\n                } else {\r\n                    \/\/ For images, show in modal with download option\r\n                    const filename = 'snapchat_image_' + Date.now() + '.jpg';\r\n                    showMediaModal(mediaUrl, 'image', filename);\r\n                }\r\n            };\r\n\r\n            \/\/ Fullscreen button handler - Show media in modal with download option\r\n            $(document).on('click', '.story-fullscreen-btn', function() {\r\n                const container = $(this).closest('.story-img-container');\r\n                const mediaUrl = container.data('media');\r\n                const mediaType = container.data('type');\r\n                const video = container.find('video.story-video').get(0);\r\n                const thumbnail = container.find('.story-thumb');\r\n                const overlay = container.find('.story-overlay');\r\n                const viewBtn = overlay.find('.story-view-btn');\r\n                const fullscreenBtn = $(this);\r\n\r\n                \/\/ Pause the current video and reset the UI\r\n                if (video && !video.paused) {\r\n                    video.pause();\r\n                }\r\n\r\n                \/\/ Hide video and show thumbnail\r\n                container.find('video.story-video').hide();\r\n                thumbnail.show();\r\n\r\n                \/\/ Reset buttons to initial state\r\n                viewBtn.html('<i class=\"fa-solid fa-play\"><\/i>');\r\n                fullscreenBtn.hide();\r\n\r\n                \/\/ Show video in modal with download option\r\n                const filename = 'snapchat_' + (container.closest('.story-card').find('.story-title').text() || 'media') + '_' + Date.now() + '.' + (mediaType === 'video' ? 'mp4' : 'jpg');\r\n                showMediaModal(mediaUrl, mediaType, filename);\r\n            });\r\n\r\n            \/\/ Download media function (supports both button click and direct call)\r\n            window.downloadMedia = function(btnOrUrl, urlOrFilename, filename) {\r\n                let url, downloadFilename, mediaType;\r\n\r\n                \/\/ If first argument is a button element\r\n                if (btnOrUrl && typeof btnOrUrl === 'object' && $(btnOrUrl).length > 0) {\r\n                    url = $(btnOrUrl).data('url');\r\n                    downloadFilename = $(btnOrUrl).data('filename');\r\n                    mediaType = $(btnOrUrl).data('type') || 'image';\r\n                } else {\r\n                    \/\/ Direct call with url and filename\r\n                    url = btnOrUrl || urlOrFilename;\r\n                    downloadFilename = urlOrFilename || filename || 'snapchat_media_' + Date.now() + '.jpg';\r\n                    \/\/ Try to detect media type from filename extension\r\n                    if (downloadFilename.toLowerCase().endsWith('.mp4') || downloadFilename.toLowerCase().endsWith('.mov') || downloadFilename.toLowerCase().endsWith('.webm')) {\r\n                        mediaType = 'video';\r\n                    } else {\r\n                        mediaType = 'image';\r\n                    }\r\n                }\r\n\r\n                \/\/ Ensure images always use .jpg extension\r\n                if (mediaType === 'image' && downloadFilename) {\r\n                    \/\/ Remove any existing extension and add .jpg\r\n                    downloadFilename = downloadFilename.replace(\/\\.(jpg|jpeg|png|gif|webp|bmp|svg)$\/i, '') + '.jpg';\r\n                }\r\n\r\n                if (url) {\r\n                    \/\/ Use fetch to download with proper CORS handling\r\n                    fetch(url)\r\n                        .then(response => response.blob())\r\n                        .then(blob => {\r\n                            const blobUrl = window.URL.createObjectURL(blob);\r\n                            const link = document.createElement('a');\r\n                            link.href = blobUrl;\r\n                            \/\/ Ensure final filename has correct extension\r\n                            if (mediaType === 'image') {\r\n                                link.download = downloadFilename || 'snapchat_media_' + Date.now() + '.jpg';\r\n                            } else {\r\n                                link.download = downloadFilename || 'snapchat_media_' + Date.now() + '.mp4';\r\n                            }\r\n                            document.body.appendChild(link);\r\n                            link.click();\r\n                            document.body.removeChild(link);\r\n                            window.URL.revokeObjectURL(blobUrl);\r\n\r\n                            \/\/ Show success message\r\n                            $(\"#error-message\").text(\"Download started!\").css(\"color\", \"green\").show();\r\n                            setTimeout(() => $(\"#error-message\").hide(), 2000);\r\n                        })\r\n                        .catch(err => {\r\n                            console.error('Download failed:', err);\r\n                            \/\/ Fallback: open in new tab\r\n                            window.open(url, '_blank');\r\n                        });\r\n                }\r\n            };\r\n\r\n            \/\/ Download function (legacy)\r\n            \/\/ Helper function to download media from URL directly\r\n            function downloadMediaFromUrl(url, filename, type) {\r\n                if (!url) return;\r\n\r\n                \/\/ Ensure images always use .jpg extension\r\n                let finalFilename = filename;\r\n                if (type === 'image' || (!type && !filename.toLowerCase().endsWith('.mp4') && !filename.toLowerCase().endsWith('.mov') && !filename.toLowerCase().endsWith('.webm'))) {\r\n                    finalFilename = filename.replace(\/\\.(jpg|jpeg|png|gif|webp|bmp|svg)$\/i, '') + '.jpg';\r\n                }\r\n\r\n                const link = document.createElement('a');\r\n                link.href = url;\r\n                link.download = finalFilename;\r\n                link.target = '_blank';\r\n\r\n                \/\/ For CORS issues, open in new tab\r\n                if (url.startsWith('http')) {\r\n                    window.open(url, '_blank');\r\n                } else {\r\n                    document.body.appendChild(link);\r\n                    link.click();\r\n                    document.body.removeChild(link);\r\n                }\r\n            }\r\n\r\n            function downloadMedia(url, filename) {\r\n                \/\/ Ensure images always use .jpg extension\r\n                let finalFilename = filename;\r\n                if (!filename.toLowerCase().endsWith('.mp4') && !filename.toLowerCase().endsWith('.mov') && !filename.toLowerCase().endsWith('.webm')) {\r\n                    finalFilename = filename.replace(\/\\.(jpg|jpeg|png|gif|webp|bmp|svg)$\/i, '') + '.jpg';\r\n                }\r\n\r\n                fetch(url)\r\n                    .then(response => response.blob())\r\n                    .then(blob => {\r\n                        const blobUrl = window.URL.createObjectURL(blob);\r\n                        const link = document.createElement('a');\r\n                        link.href = blobUrl;\r\n                        link.download = finalFilename;\r\n                        document.body.appendChild(link);\r\n                        link.click();\r\n                        document.body.removeChild(link);\r\n                        window.URL.revokeObjectURL(blobUrl);\r\n                    })\r\n                    .catch(err => {\r\n                        console.error('Download failed:', err);\r\n                        window.open(url, '_blank');\r\n                    });\r\n            }\r\n\r\n            \/\/ Modal functions - Legacy (for backward compatibility)\r\n            \/\/ Note: This now uses the new dynamic modal system\r\n            window.showModal = function(mediaUrl, mediaType, filename) {\r\n                showMediaModal(mediaUrl, mediaType, filename);\r\n            };\r\n\r\n            \/\/ Ensure old modal is hidden on page load\r\n            $(document).ready(function() {\r\n                $(\"#sc-modal\").hide();\r\n            });\r\n\r\n            \/\/ Show media in modal with download option (similar to Instagram)\r\n            window.showMediaModal = function(mediaUrl, mediaType, filename) {\r\n                \/\/ Close existing modal if any\r\n                $('.sc-media-modal').remove();\r\n\r\n                const modal = $('<div class=\"sc-media-modal profile-img-modal\">');\r\n                const backdrop = $('<div class=\"sc-modal-backdrop\">');\r\n                const content = $('<div class=\"sc-modal-content\">');\r\n                const actions = $('<div class=\"sc-modal-actions\">');\r\n                const downloadBtn = $('<button class=\"sc-modal-download-btn\">');\r\n                const closeBtn = $('<button class=\"sc-close-modal\">');\r\n\r\n                \/\/ Create media element based on type\r\n                let mediaElement;\r\n                if (mediaType === 'video') {\r\n                    mediaElement = $('<video class=\"sc-modal-media\" controls autoplay playsinline style=\"max-width: 90vw; max-height: 70vh; object-fit: contain;\" \/>');\r\n                    mediaElement.attr('src', mediaUrl);\r\n                } else {\r\n                    mediaElement = $('<img class=\"sc-modal-media modal-img\" referrerpolicy=\"no-referrer\" alt=\"Media\" style=\"max-width: 90vw; max-height: 70vh; object-fit: contain;\" \/>');\r\n                    mediaElement.attr('src', mediaUrl);\r\n                }\r\n\r\n                \/\/ Download button\r\n                downloadBtn.html('<i class=\"fa-solid fa-download\"><\/i> Download');\r\n                downloadBtn.on('click', function() {\r\n                    let downloadFilename = filename || 'snapchat_media_' + Date.now();\r\n                    \/\/ Ensure images always use .jpg extension, videos use .mp4\r\n                    if (mediaType === 'video') {\r\n                        downloadFilename = downloadFilename.replace(\/\\.(mp4|mov|webm|avi)$\/i, '') + '.mp4';\r\n                    } else {\r\n                        \/\/ It's an image, ensure .jpg extension\r\n                        downloadFilename = downloadFilename.replace(\/\\.(jpg|jpeg|png|gif|webp|bmp|svg)$\/i, '') + '.jpg';\r\n                    }\r\n                    window.downloadMedia(mediaUrl, downloadFilename);\r\n                });\r\n\r\n                \/\/ Close button\r\n                closeBtn.html('<i class=\"fa-solid fa-xmark\"><\/i>');\r\n\r\n                \/\/ Assemble modal\r\n                actions.append(downloadBtn);\r\n                content.append(mediaElement, actions, closeBtn);\r\n                modal.append(backdrop, content);\r\n\r\n                \/\/ Add modal to body\r\n                $('body').append(modal);\r\n\r\n                \/\/ Show modal with animation\r\n                setTimeout(function() {\r\n                    modal.addClass('active');\r\n                    $('body').addClass('sc-modal-open');\r\n                }, 10);\r\n\r\n                \/\/ Close modal when clicking close button or backdrop\r\n                closeBtn.on('click', function() {\r\n                    modal.removeClass('active');\r\n                    setTimeout(function() {\r\n                        modal.remove();\r\n                        $('body').removeClass('sc-modal-open');\r\n                    }, 300);\r\n                });\r\n\r\n                backdrop.on('click', function() {\r\n                    modal.removeClass('active');\r\n                    setTimeout(function() {\r\n                        modal.remove();\r\n                        $('body').removeClass('sc-modal-open');\r\n                    }, 300);\r\n                });\r\n\r\n                \/\/ Close on Escape key\r\n                $(document).on('keydown.scmodal', function(e) {\r\n                    if (e.key === 'Escape' && modal.hasClass('active')) {\r\n                        modal.removeClass('active');\r\n                        setTimeout(function() {\r\n                            modal.remove();\r\n                            $('body').removeClass('sc-modal-open');\r\n                            $(document).off('keydown.scmodal');\r\n                        }, 300);\r\n                    }\r\n                });\r\n            };\r\n\r\n            window.closeModal = function() {\r\n                \/\/ Close legacy modal\r\n                $(\"#sc-modal\").css('display', 'none');\r\n                $(\"#modal-media\").empty();\r\n                currentMediaUrl = '';\r\n                currentFilename = '';\r\n\r\n                \/\/ Also close any dynamically created modals\r\n                $('.sc-media-modal').removeClass('active');\r\n                setTimeout(function() {\r\n                    $('.sc-media-modal').remove();\r\n                    $('body').removeClass('sc-modal-open');\r\n                }, 300);\r\n            };\r\n\r\n            \/\/ Download button in modal\r\n            $(\"#modal-download-btn\").on(\"click\", function() {\r\n                if (currentMediaUrl) {\r\n                    let filename = currentFilename || 'snapchat_media_' + Date.now() + '.jpg';\r\n                    \/\/ Ensure images always use .jpg extension\r\n                    if (!filename.toLowerCase().endsWith('.mp4') && !filename.toLowerCase().endsWith('.mov') && !filename.toLowerCase().endsWith('.webm')) {\r\n                        \/\/ It's an image, ensure .jpg extension\r\n                        filename = filename.replace(\/\\.(jpg|jpeg|png|gif|webp|bmp|svg)$\/i, '') + '.jpg';\r\n                    }\r\n                    window.downloadMedia(currentMediaUrl, filename);\r\n                }\r\n            });\r\n\r\n            \/\/ Close modal on backdrop click\r\n            $(\"#sc-modal\").on(\"click\", function(e) {\r\n                if (e.target === this) {\r\n                    closeModal();\r\n                }\r\n            });\r\n\r\n            \/\/ Show Comments Modal Function\r\n            window.showCommentsModal = function(index, type) {\r\n                let commentData = null;\r\n                if (type === 'spotlight') {\r\n                    commentData = window.spotlightCommentsData[index];\r\n                } else if (type === 'highlight') {\r\n                    commentData = window.highlightCommentsData[index];\r\n                }\r\n\r\n                if (!commentData || !commentData.comments || commentData.comments.length === 0) {\r\n                    alert('No comments available for this ' + type);\r\n                    return;\r\n                }\r\n\r\n                const modal = $('#sc-comment-modal');\r\n                const title = $('#comment-modal-title');\r\n                const body = $('#comment-modal-body');\r\n\r\n                title.text(commentData.title + ' - Comments (' + commentData.comments.length + ')');\r\n                body.empty();\r\n\r\n                \/\/ Display comments\r\n                commentData.comments.forEach((comment, idx) => {\r\n                    const commentText = comment.replyText || '';\r\n                    const commenterName = comment.replyPosterDisplayName || 'Anonymous';\r\n                    const commentTime = comment.replyTimestampMs ? new Date(parseInt(comment.replyTimestampMs)).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit' }) : '';\r\n                    const reactCount = comment.reactCounts && comment.reactCounts.length > 0 ? comment.reactCounts[0].reactCount : '0';\r\n                    const threadCount = comment.threadedReplyCount || '0';\r\n\r\n                    if (commentText) {\r\n                        const commentHTML = '<div class=\"sc-comment-item\">' +\r\n                            '<div class=\"sc-comment-header\">' +\r\n                            '<span class=\"sc-comment-author\">' + commenterName + '<\/span>' +\r\n                            (commentTime ? '<span class=\"sc-comment-time\">' + commentTime + '<\/span>' : '') +\r\n                            '<\/div>' +\r\n                            '<div class=\"sc-comment-text\">' + commentText + '<\/div>' +\r\n                            '<div class=\"sc-comment-stats\">' +\r\n                            (parseInt(reactCount) > 0 ? '<span><i class=\"fa-solid fa-heart\" style=\"color: #FF6B00;\"><\/i> ' + reactCount + '<\/span>' : '') +\r\n                            (parseInt(threadCount) > 0 ? '<span><i class=\"fa-solid fa-reply\"><\/i> ' + threadCount + ' replies<\/span>' : '') +\r\n                            '<\/div>' +\r\n                            '<\/div>';\r\n                        body.append(commentHTML);\r\n                    }\r\n                });\r\n\r\n                \/\/ Show modal\r\n                modal.addClass('active');\r\n                $('body').addClass('sc-modal-open');\r\n            };\r\n\r\n            \/\/ Close Comments Modal Function\r\n            window.closeCommentsModal = function() {\r\n                $('#sc-comment-modal').removeClass('active');\r\n                $('body').removeClass('sc-modal-open');\r\n            };\r\n\r\n            \/\/ Close comment modal on backdrop click\r\n            $('#sc-comment-modal').on('click', function(e) {\r\n                if ($(e.target).hasClass('sc-comment-modal')) {\r\n                    closeCommentsModal();\r\n                }\r\n            });\r\n\r\n            \/\/ Close comment modal on Escape key\r\n            $(document).on('keydown', function(e) {\r\n                if (e.key === 'Escape' && $('#sc-comment-modal').hasClass('active')) {\r\n                    closeCommentsModal();\r\n                }\r\n            });\r\n\r\n        })(jQuery);\r\n   <\/script>\r\n\r\n\r\n<!-- content section start -->\r\n\r\n\r\n<style>\r\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\r\n\r\n.sv{\r\n  --grad:      linear-gradient(135deg,#7C3AED,#4C1D95);\r\n  --grad-soft: linear-gradient(135deg,#F5F3FF,#EDE9FE);\r\n  --grad-text: linear-gradient(135deg,#6D28D9,#4C1D95);\r\n  --ink:   #17171A;\r\n  --body:  #52525E;\r\n  --border:#E8E8F0;\r\n  --wh:    #FFFFFF;\r\n  --ow:    #F7F8FA;\r\n  --r:     9px;\r\n  --ease:  cubic-bezier(.4,0,.2,1);\r\n  --spring:cubic-bezier(.34,1.56,.64,1);\r\n  font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Helvetica Neue\",Arial,sans-serif;\r\n  -webkit-font-smoothing:antialiased;\r\n  color:var(--ink);\r\n}\r\n\r\n.sv-sec  {width:100%;padding:110px 32px}\r\n.sv-bg-wh{background:var(--wh)}\r\n.sv-bg-ow{background:var(--ow)}\r\n.sv-inner{max-width:1200px;margin:0 auto}\r\n\r\n.sv-hd{text-align:center;margin-bottom:72px}\r\n.sv-hd h2{\r\n  font-size:clamp(1.6rem,2.6vw,2.5rem);\r\n  font-weight:800;letter-spacing:-.04em;\r\n  line-height:1.15;white-space:nowrap;margin-bottom:18px;\r\n}\r\n.sv-hd p{font-size:clamp(.9rem,1.1vw,1.0625rem);color:var(--body);max-width:540px;margin:0 auto;line-height:1.75}\r\n.sv-gx{\r\n  background:var(--grad-text);\r\n  -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;\r\n}\r\n\r\n.sv-g4{display:grid;grid-template-columns:repeat(4,1fr);gap:26px}\r\n.sv-g3{display:grid;grid-template-columns:repeat(3,1fr);gap:26px}\r\n\r\n.sv-ico{\r\n  width:68px;height:68px;min-width:68px;border-radius:var(--r);\r\n  background:var(--grad-soft);\r\n  display:flex;align-items:center;justify-content:center;\r\n  transition:background .3s var(--ease),transform .3s var(--spring);\r\n}\r\n.sv-ico svg{\r\n  width:30px;height:30px;stroke:#5B21B6;stroke-width:1.55;\r\n  stroke-linecap:round;stroke-linejoin:round;fill:none;\r\n  transition:stroke .3s var(--ease);\r\n}\r\n\r\n\/* Card A *\/\r\n.sv-ca{\r\n  background:var(--wh);border-radius:var(--r);\r\n  padding:42px 32px 38px;border:1px solid var(--border);\r\n  position:relative;overflow:hidden;\r\n  opacity:0;transform:translateY(18px);\r\n  transition:opacity .44s var(--ease),transform .36s var(--ease),\r\n    box-shadow .3s var(--ease),border-color .3s var(--ease);\r\n}\r\n.sv-ca .sv-ico{margin-bottom:26px}\r\n.sv-ca::before{\r\n  content:'';position:absolute;top:0;left:0;right:0;height:2px;\r\n  background:var(--grad);opacity:0;transition:opacity .28s var(--ease);\r\n}\r\n.sv-ca.sv-on{opacity:1;transform:translateY(0)}\r\n.sv-ca.sv-on:hover{transform:translateY(-6px);box-shadow:0 20px 50px rgba(91,33,182,.09);border-color:transparent}\r\n.sv-ca.sv-on:hover::before{opacity:1}\r\n.sv-ca.sv-on:hover .sv-ico{background:var(--grad);transform:scale(1.1) rotate(-4deg)}\r\n.sv-ca.sv-on:hover .sv-ico svg{stroke:#fff}\r\n\r\n\/* Card B *\/\r\n.sv-cb{\r\n  background:var(--wh);border-radius:var(--r);\r\n  padding:60px 32px 56px;border:1px solid var(--border);\r\n  display:flex;flex-direction:column;align-items:center;text-align:center;\r\n  position:relative;overflow:hidden;\r\n  opacity:0;transform:translateY(18px);\r\n  transition:opacity .44s var(--ease),transform .36s var(--ease),\r\n    box-shadow .3s var(--ease),border-color .3s var(--ease);\r\n}\r\n.sv-cb::before{\r\n  content:'';position:absolute;top:0;left:0;right:0;height:2px;\r\n  background:var(--grad);opacity:0;transition:opacity .28s var(--ease);\r\n}\r\n.sv-cb .sv-ico{margin-bottom:26px}\r\n.sv-cb-body{width:100%}\r\n.sv-cb.sv-on{opacity:1;transform:translateY(0)}\r\n.sv-cb.sv-on:hover{transform:translateY(-5px);box-shadow:0 18px 44px rgba(91,33,182,.08);border-color:transparent}\r\n.sv-cb.sv-on:hover::before{opacity:1}\r\n.sv-cb.sv-on:hover .sv-ico{background:var(--grad);transform:scale(1.1)}\r\n.sv-cb.sv-on:hover .sv-ico svg{stroke:#fff}\r\n\r\n.sv-ca h3,.sv-cb h3{font-size:1.1rem;font-weight:700;color:var(--ink);margin-bottom:12px;line-height:1.3}\r\n.sv-ca p,.sv-cb p{font-size:.9375rem;color:var(--body);line-height:1.75;margin:0}\r\n\r\n@media(max-width:1100px){\r\n  .sv-g4,.sv-g3{grid-template-columns:repeat(2,1fr)}\r\n  .sv-hd h2{white-space:normal;font-size:1.9rem}\r\n}\r\n@media(max-width:640px){\r\n  .sv-sec{padding:56px 16px}\r\n  .sv-hd{margin-bottom:36px}\r\n  .sv-hd h2{font-size:1.25rem}\r\n  .sv-hd p{font-size:.875rem}\r\n  .sv-g4,.sv-g3{grid-template-columns:repeat(2,1fr);gap:12px}\r\n  .sv-ca{padding:22px 16px 20px}\r\n  .sv-ca .sv-ico{width:44px;height:44px;min-width:44px;margin-bottom:14px}\r\n  .sv-cb{padding:28px 16px 24px}\r\n  .sv-cb .sv-ico{width:44px;height:44px;min-width:44px;margin-bottom:14px}\r\n  .sv-ico svg{width:20px;height:20px}\r\n  .sv-ca h3,.sv-cb h3{font-size:.875rem;margin-bottom:7px}\r\n  .sv-ca p,.sv-cb p{font-size:.8rem}\r\n}\r\n@media(scripting:none){.sv-ca,.sv-cb{opacity:1!important;transform:none!important}}\r\n\r\n\/* \u2500\u2500 INTERACTION: Micro wiggle + press-down tactile push \u2500\u2500 *\/\r\n@keyframes sv-wiggle{\r\n  0%,100%{transform:translateY(-5px) rotate(0deg)}\r\n  20%{transform:translateY(-5px) rotate(-.6deg)}\r\n  40%{transform:translateY(-5px) rotate(.5deg)}\r\n  60%{transform:translateY(-5px) rotate(-.4deg)}\r\n  80%{transform:translateY(-5px) rotate(.3deg)}\r\n}\r\n.sv-ca.sv-on:hover{\r\n  animation:sv-wiggle .45s ease-in-out;\r\n  box-shadow:0 4px 12px rgba(91,33,182,.06) inset, 0 16px 40px rgba(91,33,182,.1);\r\n  border-color:transparent;\r\n}\r\n.sv-cb.sv-on:hover{\r\n  transform:translateY(-4px);\r\n  box-shadow:0 3px 8px rgba(91,33,182,.05) inset, 0 14px 36px rgba(91,33,182,.08);\r\n  border-color:transparent;\r\n}\r\n.sv-ca:active,.sv-cb:active{\r\n  transform:translateY(3px) scale(.97)!important;\r\n  box-shadow:0 6px 16px rgba(91,33,182,.14) inset!important;\r\n  animation:none!important;\r\n  transition:transform .1s,box-shadow .1s;\r\n}\r\n.sv-ca.sv-on:hover::before,.sv-cb.sv-on:hover::before{opacity:1}\r\n.sv-ca.sv-on:hover .sv-ico,.sv-cb.sv-on:hover .sv-ico{background:var(--grad);transform:scale(1.1) rotate(-4deg)}\r\n.sv-ca.sv-on:hover .sv-ico svg,.sv-cb.sv-on:hover .sv-ico svg{stroke:#fff}\r\n\r\n<\/style>\r\n<div class=\"sv\">\r\n\r\n\t<section class=\"sv-sec sv-bg-wh\" aria-labelledby=\"sv-h1\">\r\n  \t<div class=\"sv-inner\">\r\n\t\t\t\t\t\r\n\t\t<\/div>\r\n\t<\/section>\r\n\t\r\n<!-- Section 1 \u00b7 White \u00b7 8 cards \u00b7 4-col -->\r\n<section class=\"sv-sec sv-bg-wh\" aria-labelledby=\"sv-h1\">\r\n  <div class=\"sv-inner\">\r\n    <div class=\"sv-hd\">\r\n      <h2 id=\"sv-h1\">How <span class=\"sv-gx\">Snapchat Private Story Downloader<\/span> Works<\/h2>\r\n      <p>Save Snapchat private stories you have been added to. Discreet, fast, and simple to use.<\/p>\r\n    <\/div>\r\n    <div class=\"sv-g4\" data-sv-grid>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\"\/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/><circle cx=\"12\" cy=\"16\" r=\"1\"\/><\/svg><\/div>\r\n        <h3>Access Your Private Stories<\/h3>\r\n        <p>View and download private Snapchat stories that have been shared with you directly.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"\/><circle cx=\"12\" cy=\"12\" r=\"3\"\/><\/svg><\/div>\r\n        <h3>Preview Before Download<\/h3>\r\n        <p>Watch any private story in full before deciding to save it to your device.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"\/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"\/><\/svg><\/div>\r\n        <h3>Discreet Saving<\/h3>\r\n        <p>Save private stories without replaying them or triggering any screenshot notifications.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"\/><polyline points=\"7 10 12 15 17 10\"\/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"\/><\/svg><\/div>\r\n        <h3>Download Instantly<\/h3>\r\n        <p>Save any private story snap to your device in its original quality with one tap.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\"\/><\/svg><\/div>\r\n        <h3>Instant Story Access<\/h3>\r\n        <p>Private stories load immediately with no delay so you can view and save right away.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2.18\"\/><line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"22\"\/><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"\/><\/svg><\/div>\r\n        <h3>Original Quality Save<\/h3>\r\n        <p>All private story content downloads at native resolution with full audio preserved.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\"\/><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"\/><\/svg><\/div>\r\n        <h3>Mobile and Desktop<\/h3>\r\n        <p>Works seamlessly on mobile and desktop browsers so you can save stories anywhere.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\"\/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/><\/svg><\/div>\r\n        <h3>Secure and Private<\/h3>\r\n        <p>Your activity is never stored or monitored. Everything stays between you and your device.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- Section 2 \u00b7 Off-white \u00b7 6 cards \u00b7 3-col -->\r\n<section class=\"sv-sec sv-bg-ow\" aria-labelledby=\"sv-h2\">\r\n  <div class=\"sv-inner\">\r\n    <div class=\"sv-hd\">\r\n      <h2 id=\"sv-h2\">How <span class=\"sv-gx\">Snapchat Private Story Downloader<\/span> Privacy Works<\/h2>\r\n      <p>Complete privacy on every save. Your activity stays invisible and your data stays safe.<\/p>\r\n    <\/div>\r\n    <div class=\"sv-g3\" data-sv-grid>\r\n      <div class=\"sv-cb\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/><polyline points=\"9 12 11 14 15 10\"\/><\/svg><\/div>\r\n        <div class=\"sv-cb-body\">\r\n          <h3>No Save Notifications<\/h3>\r\n          <p>Saving a private story does not trigger any notification to the person who posted it.<\/p>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"sv-cb\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"\/><circle cx=\"8.5\" cy=\"7\" r=\"4\"\/><line x1=\"18\" y1=\"8\" x2=\"23\" y2=\"13\"\/><line x1=\"23\" y1=\"8\" x2=\"18\" y2=\"13\"\/><\/svg><\/div>\r\n        <div class=\"sv-cb-body\">\r\n          <h3>No Extra Login<\/h3>\r\n          <p>Use your existing access without any additional registration on our platform.<\/p>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"sv-cb\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\"\/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/><\/svg><\/div>\r\n        <div class=\"sv-cb-body\">\r\n          <h3>End-to-End Encryption<\/h3>\r\n          <p>All content transfers between the tool and your device are fully encrypted via HTTPS.<\/p>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"sv-cb\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\"\/><path d=\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\"\/><path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\"\/><\/svg><\/div>\r\n        <div class=\"sv-cb-body\">\r\n          <h3>Nothing Stored by Us<\/h3>\r\n          <p>We never cache or retain private story content. Downloads go straight to your device.<\/p>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"sv-cb\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4\"\/><\/svg><\/div>\r\n        <div class=\"sv-cb-body\">\r\n          <h3>Access-Controlled Only<\/h3>\r\n          <p>Only stories you have been added to by the poster can be accessed through this tool.<\/p>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"sv-cb\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\"\/><line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\"\/><\/svg><\/div>\r\n        <div class=\"sv-cb-body\">\r\n          <h3>Completely Free<\/h3>\r\n          <p>Download unlimited private stories with no subscription, paywall, or hidden fees.<\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- Section 3 \u00b7 White \u00b7 8 cards \u00b7 4-col -->\r\n<section class=\"sv-sec sv-bg-wh\" aria-labelledby=\"sv-h3\">\r\n  <div class=\"sv-inner\">\r\n    <div class=\"sv-hd\">\r\n      <h2 id=\"sv-h3\">How <span class=\"sv-gx\">Snapchat Private Story Downloader<\/span> Features Work<\/h2>\r\n      <p>Every feature you need to save and manage Snapchat private story content with confidence.<\/p>\r\n    <\/div>\r\n    <div class=\"sv-g4\" data-sv-grid>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\"\/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/><circle cx=\"12\" cy=\"16\" r=\"1\"\/><\/svg><\/div>\r\n        <h3>Private Story Viewer<\/h3>\r\n        <p>View all private stories shared with you in a clean interface with easy navigation.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"\/><polyline points=\"7 10 12 15 17 10\"\/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"\/><\/svg><\/div>\r\n        <h3>Silent Snap Saver<\/h3>\r\n        <p>Download individual snaps from private stories one by one without any notifications.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2.18\"\/><line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"22\"\/><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"\/><\/svg><\/div>\r\n        <h3>Full Story Download<\/h3>\r\n        <p>Save the entire private story as a sequential set of files in a single action.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\"\/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/><\/svg><\/div>\r\n        <h3>Quality Preservation<\/h3>\r\n        <p>Every snap saves at its original quality whether it is a photo, video, or boomerang.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><polyline points=\"12 6 12 12 16 14\"\/><\/svg><\/div>\r\n        <h3>Before Expiry Save<\/h3>\r\n        <p>Save private stories before they expire so you keep a permanent copy of the content.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"\/><\/svg><\/div>\r\n        <h3>Story Organization<\/h3>\r\n        <p>Downloaded stories are organized by sender and date automatically for easy playback.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\"\/><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"\/><\/svg><\/div>\r\n        <h3>Gallery Save<\/h3>\r\n        <p>All saved content lands in your device photo gallery or downloads folder immediately.<\/p>\r\n      <\/div>\r\n      <div class=\"sv-ca\">\r\n        <div class=\"sv-ico\"><svg viewBox=\"0 0 24 24\"><polyline points=\"1 4 1 10 7 10\"\/><path d=\"M3.51 15a9 9 0 1 0 .49-3.51\"\/><\/svg><\/div>\r\n        <h3>New Story Alerts<\/h3>\r\n        <p>Check for newly added private stories from your connections without opening Snapchat.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<\/div>\r\n\r\n<noscript><style>.sv-ca,.sv-cb{opacity:1!important;transform:none!important}<\/style><\/noscript>\r\n\r\n<script defer>\r\n(function(){\r\n  var io=new IntersectionObserver(function(e){\r\n    e.forEach(function(n){\r\n      if(!n.isIntersecting)return;\r\n      n.target.querySelectorAll('.sv-ca,.sv-cb').forEach(function(c,i){\r\n        setTimeout(function(){c.classList.add('sv-on')},i*65);\r\n      });\r\n      io.unobserve(n.target);\r\n    });\r\n  },{threshold:.06,rootMargin:'0px 0px -40px 0px'});\r\n  document.querySelectorAll('[data-sv-grid]').forEach(function(g){io.observe(g)});\r\n  document.querySelectorAll('.sv-ca,.sv-cb').forEach(function(c){\r\n    c.setAttribute('tabindex','0');c.setAttribute('role','article');\r\n  });\r\n})();\r\n<\/script>\r\n\r\n<!-- content section end --><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":4,"featured_media":0,"parent":5631,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-homepage.php","meta":{"footnotes":""},"class_list":["post-5633","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ary-themes.com\/wp-json\/wp\/v2\/pages\/5633","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ary-themes.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ary-themes.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ary-themes.com\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/ary-themes.com\/wp-json\/wp\/v2\/comments?post=5633"}],"version-history":[{"count":5,"href":"https:\/\/ary-themes.com\/wp-json\/wp\/v2\/pages\/5633\/revisions"}],"predecessor-version":[{"id":5638,"href":"https:\/\/ary-themes.com\/wp-json\/wp\/v2\/pages\/5633\/revisions\/5638"}],"up":[{"embeddable":true,"href":"https:\/\/ary-themes.com\/wp-json\/wp\/v2\/pages\/5631"}],"wp:attachment":[{"href":"https:\/\/ary-themes.com\/wp-json\/wp\/v2\/media?parent=5633"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}