{"id":6,"date":"2026-04-03T01:17:34","date_gmt":"2026-04-03T01:17:34","guid":{"rendered":"http:\/\/192.168.99.216\/?page_id=6"},"modified":"2026-04-05T18:46:54","modified_gmt":"2026-04-05T23:46:54","slug":"rose-hill-burial-park-camera-portal","status":"publish","type":"page","link":"https:\/\/rosehill.gregawelch.com\/","title":{"rendered":"Rose Hill Camera Portal"},"content":{"rendered":"\n<h5 class=\"wp-block-heading alignfull has-text-align-center\"><strong><em>Rose Hill Camera Portal<\/em><\/strong><\/h5>\n\n\n\n<hr class=\"wp-block-separator alignfull has-alpha-channel-opacity is-style-wide\"\/>\n\n\n    <style>\r\n        .blink-slow {\r\n            animation: slowBlink 2s ease-in-out infinite;\r\n        }\r\n\r\n        @keyframes slowBlink {\r\n            0%   { opacity: 1; }\r\n            50%  { opacity: 0.35; }\r\n            100% { opacity: 1; }\r\n        }\r\n\t\t\/* \ud83d\udd25 Blinking red border for new clips *\/\r\n        .blink-alert {\r\n            border: 3px solid red !important;\r\n            animation: blink 1s infinite;\r\n        }\r\n\r\n        \/* \ud83d\udd25 Red alert label *\/\r\n        .recent-alert-label {\r\n            text-align: center;\r\n            color: red;\r\n            font-weight: bold;\r\n            margin-bottom: 6px;\r\n            font-size: 0.9rem;\r\n        }\r\n\r\n        @keyframes blink {\r\n            0%   { border-color: red; }\r\n            50%  { border-color: transparent; }\r\n            100% { border-color: red; }\r\n        }\r\n\r\n        .latest-activity-wrapper {\r\n            font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\r\n            padding: 1rem;\r\n        }\r\n        .latest-activity-header {\r\n            display: flex;\r\n            justify-content: space-between;\r\n            align-items: baseline;\r\n            margin-bottom: 0.75rem;\r\n        }\r\n        .latest-activity-title {\r\n            font-size: 1.25rem;\r\n            font-weight: 600;\r\n        }\r\n        .latest-activity-status {\r\n            font-size: 0.9rem;\r\n            color: #555;\r\n        }\r\n\r\n        \/* \u2b50 3-wide grid *\/\r\n        .latest-activity-grid {\r\n            display: grid;\r\n            grid-template-columns: repeat(3, 1fr);\r\n            gap: 1rem;\r\n        }\r\n\r\n        .latest-activity-card {\r\n            border: 1px solid #ddd;\r\n            border-radius: 6px;\r\n            padding: 0.5rem;\r\n            background: #fafafa;\r\n        }\r\n\r\n        .latest-activity-label {\r\n            font-size: 0.9rem;\r\n            font-weight: 600;\r\n        }\r\n\r\n        .latest-activity-timeago {\r\n            font-size: 0.8rem;\r\n            color: #666;\r\n            margin-bottom: 0.35rem;\r\n            display: block;\r\n        }\r\n\r\n        \/* \u2b50 Responsive 16:9 video wrapper in grid *\/\r\n        .video-wrapper {\r\n            position: relative;\r\n            width: 100%;\r\n            padding-top: 56.25%; \/* 16:9 *\/\r\n            background: #000;\r\n            border-radius: 4px;\r\n            overflow: hidden;\r\n            cursor: pointer;\r\n        }\r\n\r\n        .latest-activity-video {\r\n            position: absolute;\r\n            top: 0;\r\n            left: 0;\r\n            width: 100%;\r\n            height: 100%;\r\n            object-fit: contain;\r\n            cursor: pointer;\r\n        }\r\n\r\n        \/* \u2b50 Fullscreen-style modal overlay *\/\r\n        .la-modal-overlay {\r\n            position: fixed;\r\n            inset: 0;\r\n            background: rgba(0, 0, 0, 0.85);\r\n            display: none;\r\n            align-items: center;\r\n            justify-content: center;\r\n            z-index: 9999;\r\n        }\r\n\r\n        .la-modal-overlay.la-open {\r\n            display: flex;\r\n        }\r\n\r\n        .la-modal-content {\r\n            position: relative;\r\n            width: 100%;\r\n            height: 100%;\r\n            display: flex;\r\n            flex-direction: column;\r\n            align-items: center;\r\n            justify-content: center;\r\n        }\r\n\r\n        .la-modal-video-container {\r\n            position: relative;\r\n            width: 100%;\r\n            max-width: 1200px;\r\n            aspect-ratio: 16 \/ 9;\r\n            background: #000;\r\n            overflow: hidden;\r\n        }\r\n\r\n        .la-modal-video {\r\n            width: 100%;\r\n            height: 100%;\r\n            object-fit: contain;\r\n            background: #000;\r\n        }\r\n\r\n        .la-modal-close {\r\n            position: absolute;\r\n            top: 16px;\r\n            right: 20px;\r\n            font-size: 1.8rem;\r\n            color: #fff;\r\n            cursor: pointer;\r\n            z-index: 2;\r\n        }\r\n\r\n        .la-modal-controls {\r\n            width: 100%;\r\n            max-width: 1200px;\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 0.75rem;\r\n            padding: 0.75rem 1rem 1.25rem;\r\n            box-sizing: border-box;\r\n        }\r\n\r\n        .la-btn {\r\n            background: #ffffff22;\r\n            border: 1px solid #ffffff55;\r\n            color: #fff;\r\n            padding: 0.35rem 0.75rem;\r\n            border-radius: 4px;\r\n            cursor: pointer;\r\n            font-size: 0.9rem;\r\n        }\r\n\r\n        .la-btn:hover {\r\n            background: #ffffff33;\r\n        }\r\n\r\n        .la-timeline {\r\n            flex: 1;\r\n            -webkit-appearance: none;\r\n            appearance: none;\r\n            height: 4px;\r\n            border-radius: 2px;\r\n            background: #555;\r\n            outline: none;\r\n            cursor: pointer;\r\n        }\r\n\r\n        .la-timeline::-webkit-slider-thumb {\r\n            -webkit-appearance: none;\r\n            appearance: none;\r\n            width: 12px;\r\n            height: 12px;\r\n            border-radius: 50%;\r\n            background: #fff;\r\n            cursor: pointer;\r\n        }\r\n\r\n        .la-timeline::-moz-range-thumb {\r\n            width: 12px;\r\n            height: 12px;\r\n            border-radius: 50%;\r\n            background: #fff;\r\n            cursor: pointer;\r\n        }\r\n\r\n        .la-time-label {\r\n            color: #fff;\r\n            font-size: 0.8rem;\r\n            min-width: 70px;\r\n            text-align: right;\r\n        }\r\n    <\/style>\r\n\r\n    <div class=\"latest-activity-wrapper\" id=\"latest-activity-root\">\r\n        <div class=\"latest-activity-header\">\r\n            <div class=\"latest-activity-title\">Latest Activity<\/div>\r\n            <div class=\"latest-activity-status\" id=\"latest-activity-status\">\r\n                Loading latest clips\u2026\r\n            <\/div>\r\n        <\/div>\r\n        <div class=\"latest-activity-grid\" id=\"latest-activity-grid\"><\/div>\r\n    <\/div>\r\n\r\n    <!-- \u2b50 Modal viewer -->\r\n    <div class=\"la-modal-overlay\" id=\"la-modal-overlay\">\r\n        <div class=\"la-modal-content\" id=\"la-modal-content\">\r\n            <div class=\"la-modal-close\" id=\"la-modal-close\">&times;<\/div>\r\n            <div class=\"la-modal-video-container\">\r\n                <video id=\"la-modal-video\" class=\"la-modal-video\"><\/video>\r\n            <\/div>\r\n            <div class=\"la-modal-controls\">\r\n                <button class=\"la-btn\" id=\"la-btn-play\">Play<\/button>\r\n                <button class=\"la-btn\" id=\"la-btn-restart\">Restart<\/button>\r\n                <input type=\"range\" id=\"la-timeline\" class=\"la-timeline\" min=\"0\" value=\"0\">\r\n                <div class=\"la-time-label\" id=\"la-time-label\">0:00 \/ 0:00<\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n        \/* \u2b50 Friendly camera names *\/\r\n        const CAMERA_NAMES = {\r\n            \"FGate\": \"Front Gate\",\r\n            \"BGate\": \"Back Gate\",\r\n            \"Mos Bldg 1\": \"Main Mausoleum - Front Door\",\r\n            \"Mos Bldg 2\": \"Main Mausoleum - Back Door\"\r\n        };\r\n\r\n    (function() {\r\n        const API_URL = 'https:\/\/rosehill.gregawelch.com\/api\/latest-activity.php';\r\n        const POLL_INTERVAL_MS = 10000;\r\n\r\n        const statusEl = document.getElementById('latest-activity-status');\r\n        const gridEl   = document.getElementById('latest-activity-grid');\r\n\r\n        let latestTimestamp = null;\r\n        let clipTimestamps = {};\r\n        let currentClips = [];\r\n        let currentIndex = 0;\r\n\r\n        \/* \u2b50 Modal elements *\/\r\n        const modalOverlay   = document.getElementById('la-modal-overlay');\r\n        const modalContent   = document.getElementById('la-modal-content');\r\n        const modalVideo     = document.getElementById('la-modal-video');\r\n        const modalClose     = document.getElementById('la-modal-close');\r\n        const btnPlay        = document.getElementById('la-btn-play');\r\n        const btnRestart     = document.getElementById('la-btn-restart');\r\n        const timeline       = document.getElementById('la-timeline');\r\n        const timeLabel      = document.getElementById('la-time-label');\r\n\r\n        let isPlaying = false;\r\n        let isScrubbing = false;\r\n\r\n        function timeAgo(ts) {\r\n            const now = Date.now();\r\n            const diff = Math.floor((now - ts * 1000) \/ 1000);\r\n\r\n            if (diff < 60) return diff + \" seconds ago\";\r\n            if (diff < 3600) return Math.floor(diff \/ 60) + \" minutes ago\";\r\n            return Math.floor(diff \/ 3600) + \" hours ago\";\r\n        }\r\n\r\n        function formatTime(sec) {\r\n            sec = Math.floor(sec || 0);\r\n            const m = Math.floor(sec \/ 60);\r\n            const s = sec % 60;\r\n            return m + \":\" + (s < 10 ? \"0\" + s : s);\r\n        }\r\n\r\n        function updateAllTimeAgo() {\r\n            if (latestTimestamp) {\r\n                statusEl.textContent = \"Latest activity \" + timeAgo(latestTimestamp);\r\n            }\r\n\r\n            for (const id in clipTimestamps) {\r\n                const el = document.getElementById(id);\r\n                if (el) {\r\n                    el.textContent = timeAgo(clipTimestamps[id]);\r\n                }\r\n            }\r\n        }\r\n\r\n        async function fetchLatest() {\r\n            try {\r\n                const res = await fetch(API_URL + '?_=' + Date.now(), { cache: 'no-store' });\r\n                if (!res.ok) throw new Error('HTTP ' + res.status);\r\n                const data = await res.json();\r\n\r\n                if (data.error) {\r\n    \t\t\t\tstatusEl.textContent = data.error;\r\n\r\n    \t\t\t\t\/\/ Styling\r\n    \t\t\t\tstatusEl.style.color = \"red\";\r\n    \t\t\t\tstatusEl.style.fontSize = \"24px\";\r\n    \t\t\t\tstatusEl.style.fontWeight = \"bold\";\r\n    \t\t\t\tstatusEl.style.textAlign = \"left\";\r\n    \t\t\t\tstatusEl.style.marginTop = \"20px\";\r\n\r\n    \t\t\t\t\/\/ Force centering regardless of parent layout\r\n    \t\t\t\tstatusEl.style.display = \"block\";\r\n    \t\t\t\tstatusEl.style.width = \"100%\";\r\n    \t\t\t\tstatusEl.style.marginLeft = \"auto\";\r\n    \t\t\t\tstatusEl.style.marginRight = \"auto\";\r\n\r\n    \t\t\t\t\/\/ Slow blink\r\n    \t\t\t\tstatusEl.classList.add(\"blink-slow\");\r\n\r\n    \t\t\t\tgridEl.innerHTML = '';\r\n    \t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n                renderLatest(data);\r\n            } catch (e) {\r\n                statusEl.textContent = 'Error contacting activity API';\r\n                console.error(e);\r\n            }\r\n        }\r\n\r\n        function renderLatest(data) {\r\n            let clips = data.clips || [];\r\n            if (!clips.length) {\r\n                statusEl.textContent = \"No recent activity.\";\r\n                gridEl.innerHTML = '';\r\n                currentClips = [];\r\n                return;\r\n            }\r\n\r\n            clips.sort((a, b) => b.timestamp_unix - a.timestamp_unix);\r\n\r\n            const unique = {};\r\n            clips.forEach(c => {\r\n                if (!unique[c.camera]) {\r\n                    unique[c.camera] = c;\r\n                }\r\n            });\r\n\r\n            const finalClips = Object.values(unique);\r\n            currentClips = finalClips;\r\n\r\n            latestTimestamp = finalClips[0].timestamp_unix;\r\n            clipTimestamps = {};\r\n\r\n            gridEl.innerHTML = '';\r\n\r\n            finalClips.forEach((clip, index) => {\r\n                const card = document.createElement('div');\r\n                card.className = 'latest-activity-card';\r\n\r\n                const isRecent = ((Date.now() \/ 1000) - clip.timestamp_unix) < 120;\r\n\r\n                if (isRecent) {\r\n                    card.classList.add('blink-alert');\r\n\r\n                    const alertLabel = document.createElement('div');\r\n                    alertLabel.className = 'recent-alert-label';\r\n                    alertLabel.textContent = '\"Less than 2 Minutes Ago\"';\r\n                    card.appendChild(alertLabel);\r\n                }\r\n\r\n                const label = document.createElement('div');\r\n                label.className = 'latest-activity-label';\r\n                label.textContent = CAMERA_NAMES[clip.camera] || clip.camera;\r\n                card.appendChild(label);\r\n\r\n                const timeAgoEl = document.createElement('span');\r\n                timeAgoEl.className = 'latest-activity-timeago';\r\n                timeAgoEl.id = 'timeago_' + index;\r\n                timeAgoEl.textContent = timeAgo(clip.timestamp_unix);\r\n                card.appendChild(timeAgoEl);\r\n\r\n                clipTimestamps[timeAgoEl.id] = clip.timestamp_unix;\r\n\r\n                const wrapper = document.createElement('div');\r\n                wrapper.className = 'video-wrapper';\r\n\r\n                const video = document.createElement('video');\r\n                video.className = 'latest-activity-video';\r\n                video.src = clip.mp4_url;\r\n                video.controls = false;\r\n                video.autoplay = true;\r\n                video.muted = true;\r\n                video.loop = false;\r\n                video.playsInline = true;\r\n                video.setAttribute(\"webkit-playsinline\", \"true\");\r\n                video.setAttribute(\"playsinline\", \"true\");\r\n\r\n                \/* \u2b50 Click wrapper or video \u2192 open modal viewer *\/\r\n                const openHandler = function(e) {\r\n                    e.preventDefault();\r\n                    e.stopPropagation();\r\n                    openModal(index);\r\n                };\r\n\r\n                wrapper.addEventListener(\"click\", openHandler);\r\n                video.addEventListener(\"click\", openHandler);\r\n\r\n                wrapper.appendChild(video);\r\n                card.appendChild(wrapper);\r\n\r\n                gridEl.appendChild(card);\r\n            });\r\n\r\n            updateAllTimeAgo();\r\n        }\r\n\r\n        \/* \u2b50 Modal logic *\/\r\n\r\n        function openModal(index) {\r\n            if (!currentClips.length) return;\r\n            currentIndex = index;\r\n\r\n            const clip = currentClips[currentIndex];\r\n            if (!clip) return;\r\n\r\n            modalVideo.src = clip.mp4_url;\r\n            modalVideo.currentTime = 0;\r\n            modalVideo.muted = false;\r\n            modalVideo.autoplay = true;\r\n            modalVideo.play().catch(() => {});\r\n\r\n            isPlaying = true;\r\n            btnPlay.textContent = \"Pause\";\r\n\r\n            timeline.value = 0;\r\n            timeline.max = 0;\r\n            timeLabel.textContent = \"0:00 \/ 0:00\";\r\n\r\n            modalOverlay.classList.add('la-open');\r\n        }\r\n\r\n        function closeModal() {\r\n            modalOverlay.classList.remove('la-open');\r\n            modalVideo.pause();\r\n            modalVideo.src = \"\";\r\n            isPlaying = false;\r\n            btnPlay.textContent = \"Play\";\r\n        }\r\n\r\n        function showNext() {\r\n            if (!currentClips.length) return;\r\n            currentIndex = (currentIndex + 1) % currentClips.length;\r\n            openModal(currentIndex);\r\n        }\r\n\r\n        function showPrev() {\r\n            if (!currentClips.length) return;\r\n            currentIndex = (currentIndex - 1 + currentClips.length) % currentClips.length;\r\n            openModal(currentIndex);\r\n        }\r\n\r\n        modalClose.addEventListener('click', closeModal);\r\n\r\n        modalOverlay.addEventListener('click', function(e) {\r\n            if (e.target === modalOverlay) {\r\n                closeModal();\r\n            }\r\n        });\r\n\r\n        document.addEventListener('keydown', function(e) {\r\n            if (!modalOverlay.classList.contains('la-open')) return;\r\n\r\n            if (e.key === 'Escape') {\r\n                closeModal();\r\n            } else if (e.key === 'ArrowRight') {\r\n                showNext();\r\n            } else if (e.key === 'ArrowLeft') {\r\n                showPrev();\r\n            } else if (e.key === ' ') {\r\n                e.preventDefault();\r\n                togglePlay();\r\n            }\r\n        });\r\n\r\n        function togglePlay() {\r\n            if (isPlaying) {\r\n                modalVideo.pause();\r\n                isPlaying = false;\r\n                btnPlay.textContent = \"Play\";\r\n            } else {\r\n                modalVideo.play().catch(() => {});\r\n                isPlaying = true;\r\n                btnPlay.textContent = \"Pause\";\r\n            }\r\n        }\r\n\r\n        btnPlay.addEventListener('click', function() {\r\n            togglePlay();\r\n        });\r\n\r\n        btnRestart.addEventListener('click', function() {\r\n            modalVideo.currentTime = 0;\r\n            modalVideo.play().catch(() => {});\r\n            isPlaying = true;\r\n            btnPlay.textContent = \"Pause\";\r\n        });\r\n\r\n        modalVideo.addEventListener('loadedmetadata', function() {\r\n            if (!isFinite(modalVideo.duration)) return;\r\n            timeline.max = modalVideo.duration;\r\n            timeLabel.textContent = \"0:00 \/ \" + formatTime(modalVideo.duration);\r\n        });\r\n\r\n        modalVideo.addEventListener('timeupdate', function() {\r\n            if (isScrubbing) return;\r\n            timeline.value = modalVideo.currentTime || 0;\r\n            timeLabel.textContent = formatTime(modalVideo.currentTime) + \" \/ \" + formatTime(modalVideo.duration || 0);\r\n        });\r\n\r\n        timeline.addEventListener('input', function() {\r\n            isScrubbing = true;\r\n        });\r\n\r\n        timeline.addEventListener('change', function() {\r\n            modalVideo.currentTime = parseFloat(timeline.value || 0);\r\n            isScrubbing = false;\r\n        });\r\n\r\n        \/* \u2b50 Swipe navigation (touch + mouse drag) *\/\r\n        let touchStartX = null;\r\n        let mouseDownX = null;\r\n        const SWIPE_THRESHOLD = 50;\r\n\r\n        modalContent.addEventListener('touchstart', function(e) {\r\n            if (e.touches.length === 1) {\r\n                touchStartX = e.touches[0].clientX;\r\n            }\r\n        });\r\n\r\n        modalContent.addEventListener('touchend', function(e) {\r\n            if (touchStartX === null) return;\r\n            const endX = (e.changedTouches[0] || {}).clientX || touchStartX;\r\n            const diff = endX - touchStartX;\r\n            touchStartX = null;\r\n\r\n            if (Math.abs(diff) > SWIPE_THRESHOLD) {\r\n                if (diff < 0) showNext();\r\n                else showPrev();\r\n            }\r\n        });\r\n\r\n        modalContent.addEventListener('mousedown', function(e) {\r\n            mouseDownX = e.clientX;\r\n        });\r\n\r\n        modalContent.addEventListener('mouseup', function(e) {\r\n            if (mouseDownX === null) return;\r\n            const diff = e.clientX - mouseDownX;\r\n            mouseDownX = null;\r\n\r\n            if (Math.abs(diff) > SWIPE_THRESHOLD) {\r\n                if (diff < 0) showNext();\r\n                else showPrev();\r\n            }\r\n        });\r\n\r\n        fetchLatest();\r\n        setInterval(fetchLatest, POLL_INTERVAL_MS);\r\n        setInterval(updateAllTimeAgo, 1000);\r\n\r\n    })();\r\n    <\/script>\r\n    \n\n\n\n<hr class=\"wp-block-separator alignfull has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n        <div style='text-align:center; margin-bottom:25px;'>\r\n            <div style='font-size:1.2em; font-weight:bold; margin-bottom:6px;'>Front Gate -Archive-<\/div>\r\n\r\n            <a href='\/index.php\/frontgate\/' style='display:inline-block; text-decoration:none;'>\r\n                <img src='https:\/\/rosehill.gregawelch.com\/cameras\/FrontGate\/latest.jpg' style='max-width:100%; border-radius:6px; box-shadow:0 2px 6px rgba(0,0,0,0.2);'>\r\n            <\/a>\r\n\r\n            <div style='font-weight:bold; margin-top:6px; font-size:0.9em;'>April 5, 2026 \u2014 6:48 PM<\/div>\r\n        <\/div>\r\n    \n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n        <div style='text-align:center; margin-bottom:25px;'>\r\n            <div style='font-size:1.2em; font-weight:bold; margin-bottom:6px;'>Main Mausoleum -Front Door -Archive-<\/div>\r\n\r\n            <a href='\/index.php\/mausbldg1\/' style='display:inline-block; text-decoration:none;'>\r\n                <img src='https:\/\/rosehill.gregawelch.com\/cameras\/MosBldg1\/latest.jpg' style='max-width:100%; border-radius:6px; box-shadow:0 2px 6px rgba(0,0,0,0.2);'>\r\n            <\/a>\r\n\r\n            <div style='font-weight:bold; margin-top:6px; font-size:0.9em;'>April 5, 2026 \u2014 4:51 PM<\/div>\r\n        <\/div>\r\n    \n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n        <div style='text-align:center; margin-bottom:25px;'>\r\n            <div style='font-size:1.2em; font-weight:bold; margin-bottom:6px;'>Main Mausoleum -Back Door -Archive-<\/div>\r\n\r\n            <a href='\/index.php\/mausbldg2\/' style='display:inline-block; text-decoration:none;'>\r\n                <img src='https:\/\/rosehill.gregawelch.com\/cameras\/MosBldg2\/latest.jpg' style='max-width:100%; border-radius:6px; box-shadow:0 2px 6px rgba(0,0,0,0.2);'>\r\n            <\/a>\r\n\r\n            <div style='font-weight:bold; margin-top:6px; font-size:0.9em;'>April 5, 2026 \u2014 6:48 PM<\/div>\r\n        <\/div>\r\n    \n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n        <div style='text-align:center; margin-bottom:25px;'>\r\n            <div style='font-size:1.2em; font-weight:bold; margin-bottom:6px;'>Back Gate -Archive-<\/div>\r\n\r\n            <a href='\/index.php\/backgate\/' style='display:inline-block; text-decoration:none;'>\r\n                <img src='https:\/\/rosehill.gregawelch.com\/cameras\/BackGate\/latest.jpg' style='max-width:100%; border-radius:6px; box-shadow:0 2px 6px rgba(0,0,0,0.2);'>\r\n            <\/a>\r\n\r\n            <div style='font-weight:bold; margin-top:6px; font-size:0.9em;'>April 5, 2026 \u2014 6:34 PM<\/div>\r\n        <\/div>\r\n    \n<\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Rose Hill Camera Portal<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"disabled","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"disabled","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-6","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/rosehill.gregawelch.com\/index.php\/wp-json\/wp\/v2\/pages\/6","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rosehill.gregawelch.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rosehill.gregawelch.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rosehill.gregawelch.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rosehill.gregawelch.com\/index.php\/wp-json\/wp\/v2\/comments?post=6"}],"version-history":[{"count":76,"href":"https:\/\/rosehill.gregawelch.com\/index.php\/wp-json\/wp\/v2\/pages\/6\/revisions"}],"predecessor-version":[{"id":209,"href":"https:\/\/rosehill.gregawelch.com\/index.php\/wp-json\/wp\/v2\/pages\/6\/revisions\/209"}],"wp:attachment":[{"href":"https:\/\/rosehill.gregawelch.com\/index.php\/wp-json\/wp\/v2\/media?parent=6"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}