<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SkyGrid v2.9 — GNSS Survey Planning</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,300;0,400;0,500;0,600;1,400&family=IBM+Plex+Sans:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/satellite.js/4.1.3/satellite.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"></script>
<style>
:root {
--amber:#f59e0b; --amber-dim:#92600a; --amber-glow:rgba(245,158,11,.13); --amber-glow2:rgba(245,158,11,.06);
--bg:#090909; --bg2:#0f0f11; --bg3:#161618; --bg4:#1c1c20;
--border:rgba(245,158,11,.16); --border-hi:rgba(245,158,11,.4);
--text:#e6dfc8; --text-dim:#7a7264; --text-muted:#3a3830;
--green:#22c55e; --red:#ef4444; --yellow:#eab308; --blue:#3b82f6; --cyan:#06b6d4;
}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{background:var(--bg);color:var(--text);font-family:'IBM Plex Sans',sans-serif;font-size:14px;line-height:1.6;min-height:100vh;overflow-x:hidden}
body::before{content:'';position:fixed;inset:0;background-image:linear-gradient(rgba(245,158,11,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(245,158,11,.035) 1px,transparent 1px);background-size:44px 44px;pointer-events:none;z-index:0}
body::after{content:'';position:fixed;top:-240px;left:50%;transform:translateX(-50%);width:900px;height:480px;background:radial-gradient(ellipse,rgba(245,158,11,.07) 0%,transparent 68%);pointer-events:none;z-index:0}
#app{position:relative;z-index:1;max-width:980px;margin:0 auto;padding:0 18px 80px}
/* HEADER */
.hdr{display:flex;align-items:center;justify-content:space-between;padding:26px 0 18px;border-bottom:1px solid var(--border);margin-bottom:26px}
.hdr-logo{display:flex;flex-direction:column;gap:4px}
.hdr-title{font-family:'IBM Plex Mono',monospace;font-size:24px;font-weight:600;color:var(--amber);letter-spacing:.12em;line-height:1}
.hdr-sub{font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:300;color:var(--text-dim);letter-spacing:.3em;text-transform:uppercase}
.hdr-v{font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--amber-dim);border:1px solid var(--border);padding:4px 10px;letter-spacing:.12em}
/* MODE TOGGLE */
.mode-toggle{display:flex;border:1px solid var(--border);margin-bottom:26px;overflow:hidden}
.mode-btn{flex:1;background:transparent;border:none;color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:500;letter-spacing:.12em;padding:13px 20px;cursor:pointer;transition:all .2s;border-right:1px solid var(--border);text-transform:uppercase;position:relative}
.mode-btn:last-child{border-right:none}
.mode-btn.active{background:var(--amber-glow);color:var(--amber)}
.mode-btn.active::after{content:'';position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--amber)}
.new-badge{font-size:8px;background:var(--amber);color:#000;padding:2px 5px;margin-left:7px;vertical-align:middle;font-weight:700;letter-spacing:.04em}
.mode-panel{display:none}
.mode-panel.active{display:block}
/* SECTIONS */
.sec{background:var(--bg2);border:1px solid var(--border);padding:20px 24px;margin-bottom:14px}
.sec-title{font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:600;color:var(--amber);letter-spacing:.28em;text-transform:uppercase;margin-bottom:16px;display:flex;align-items:center;gap:10px}
.sec-title::after{content:'';flex:1;height:1px;background:var(--border)}
.form-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}
.form-group{display:flex;flex-direction:column;gap:5px}
.form-group label{font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase}
.form-group input,.form-group select,.form-group textarea{background:var(--bg3);border:1px solid var(--border);color:var(--text);font-family:'IBM Plex Mono',monospace;font-size:13px;padding:9px 12px;outline:none;transition:border-color .2s;width:100%}
.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:var(--border-hi)}
.form-group input::placeholder,.form-group textarea::placeholder{color:var(--text-muted)}
.form-group textarea{resize:vertical;min-height:70px}
select option{background:var(--bg3)}
/* LOCATION ROW */
.loc-row{display:flex;gap:10px;align-items:flex-end}
.loc-row .form-group{flex:1}
.loc-btn{background:var(--bg3);border:1px solid var(--border);color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:11px;padding:9px 14px;cursor:pointer;transition:all .2s;white-space:nowrap;height:38px}
.loc-btn:hover{border-color:var(--border-hi);color:var(--amber)}
/* DAYS SELECTOR */
.days-sel{display:flex;gap:0;border:1px solid var(--border);overflow:hidden;width:fit-content}
.day-opt{background:transparent;border:none;color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:11px;letter-spacing:.1em;padding:9px 20px;cursor:pointer;transition:all .2s;border-right:1px solid var(--border)}
.day-opt:last-child{border-right:none}
.day-opt.active{background:var(--amber-glow);color:var(--amber)}
/* STATUS BAR */
.status-bar{display:flex;align-items:center;gap:20px;padding:14px 20px;background:var(--bg3);border:1px solid var(--border);margin-bottom:14px;flex-wrap:wrap}
.status-item{display:flex;align-items:center;gap:8px;font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim);letter-spacing:.1em}
.dot{width:10px;height:10px;border-radius:50%;background:var(--text-muted);flex-shrink:0;transition:all .4s}
.dot.idle{background:var(--text-muted)}
.dot.loading{background:var(--amber);animation:pulse 1s infinite}
.dot.ok{background:var(--green)}
.dot.warn{background:var(--yellow)}
.dot.err{background:var(--red)}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.85)}}
/* RUN BUTTON */
.run-btn{width:100%;background:transparent;border:1px solid var(--amber);color:var(--amber);font-family:'IBM Plex Mono',monospace;font-size:13px;font-weight:600;letter-spacing:.2em;padding:15px;cursor:pointer;text-transform:uppercase;transition:all .25s;position:relative;overflow:hidden;margin-bottom:14px}
.run-btn:hover{background:var(--amber-glow)}
.run-btn:disabled{opacity:.4;cursor:not-allowed}
.run-btn::before{content:'⚡ '}
/* PROGRESS */
.progress-box{background:var(--bg3);border:1px solid var(--border);padding:20px 24px;margin-bottom:14px;display:none}
.progress-box.visible{display:block}
.progress-step{font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--text-dim);padding:4px 0;border-left:2px solid var(--text-muted);padding-left:12px;margin-bottom:6px;transition:all .3s}
.progress-step.active{color:var(--amber);border-color:var(--amber)}
.progress-step.done{color:var(--green);border-color:var(--green)}
.progress-step.warn{color:#eab308;border-color:#eab308}
.progress-step.err{color:var(--red);border-color:var(--red)}
.progress-step::before{margin-right:8px}
.progress-step.active::before{content:'▶'}
.progress-step.done::before{content:'✓'}
.progress-step.err::before{content:'✗'}
.progress-step.idle::before{content:'○'}
/* RESULTS */
.results-area{display:none}
.results-area.visible{display:block}
/* IONO PANEL */
.site-signal-header{margin-bottom:12px}
.site-signal-title{font-family:'Space Mono',monospace;font-size:9px;color:var(--text-dim);letter-spacing:.25em;text-transform:uppercase;margin-bottom:8px;padding-bottom:6px;border-bottom:1px solid var(--border)}
.site-signal-facts{display:flex;gap:24px;flex-wrap:wrap}
.ssf-item{display:flex;flex-direction:column;gap:2px;min-width:120px;max-width:200px}
.ssf-label{font-family:'Space Mono',monospace;font-size:8px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.15em}
.ssf-value{font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:600;color:var(--text)}
.ssf-note{font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-dim)}
.iono-panel{background:var(--bg2);border:1px solid var(--border);padding:20px 24px;margin-bottom:14px}
.iono-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:14px;margin-top:14px}
.iono-metric{background:var(--bg3);border:1px solid var(--border);padding:14px 16px}
.iono-metric-label{font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-dim);letter-spacing:.2em;text-transform:uppercase;margin-bottom:6px}
.iono-metric-val{font-family:'IBM Plex Mono',monospace;font-size:24px;font-weight:600;line-height:1}
.iono-metric-unit{font-size:11px;color:var(--text-dim);margin-left:4px}
.iono-level{display:inline-block;font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:.15em;padding:5px 14px;text-transform:uppercase;margin-top:12px}
.iono-level.quiet{background:rgba(34,197,94,.15);color:var(--green);border:1px solid rgba(34,197,94,.3)}
.iono-level.moderate{background:rgba(234,179,8,.15);color:var(--yellow);border:1px solid rgba(234,179,8,.3)}
.iono-level.elevated{background:rgba(239,68,68,.15);color:var(--red);border:1px solid rgba(239,68,68,.3)}
.iono-summary{margin-top:12px;color:var(--text-dim);font-size:13px;line-height:1.5}
/* DOP TABLE */
.dop-table-wrap{overflow-x:auto;margin-top:14px}
.mask-selector-wrap{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.mask-label{font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.1em;white-space:nowrap}
.mask-btn-group{display:flex;gap:4px}
.mask-btn{font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:600;padding:4px 10px;background:var(--bg3);border:1px solid var(--border);color:var(--text-dim);cursor:pointer;border-radius:3px;transition:all .15s}
.mask-btn:hover{border-color:var(--amber);color:var(--amber)}
.mask-btn-active{background:var(--amber) !important;border-color:var(--amber) !important;color:#000 !important}
.mask-hint{font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-muted);font-style:italic;white-space:nowrap}
.dop-table{width:100%;border-collapse:collapse;font-family:'IBM Plex Mono',monospace;font-size:12px}
.dop-table th{background:var(--bg4);color:var(--amber);font-size:10px;letter-spacing:.15em;text-transform:uppercase;padding:8px 12px;text-align:left;border-bottom:1px solid var(--border)}
.dop-table td{padding:7px 12px;border-bottom:1px solid var(--text-muted);color:var(--text-dim)}
.dop-table tr:last-child td{border-bottom:none}
.dop-good{color:var(--green)!important}
.dop-ok{color:var(--yellow)!important}
.dop-poor{color:var(--red)!important}
.dop-spike{color:var(--amber)!important;font-weight:700!important}
.dop-na{color:var(--text-muted)!important}
/* AI RESULT CARD */
.ai-card{background:var(--bg2);border:1px solid var(--border);padding:22px 26px;margin-bottom:14px}
.ai-card h3{font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:600;color:var(--amber);letter-spacing:.2em;text-transform:uppercase;margin-bottom:14px}
.ai-card-body{color:var(--text);font-size:14px;line-height:1.7;white-space:pre-wrap;font-family:'IBM Plex Sans',sans-serif}
.ai-card-body strong{color:var(--amber);font-weight:600}
/* ── 7-DAY CARD GRID ── */
.week-grid{display:flex;flex-direction:column;gap:12px;margin-bottom:14px}
.day-card{background:var(--bg2);border:1px solid var(--border);overflow:hidden;transition:border-color .2s}
.day-card.top5{border-color:rgba(245,158,11,.35)}
.day-card.rank1{border-color:var(--amber);box-shadow:0 0 20px rgba(245,158,11,.08)}
.day-card.bottom2{opacity:.55}
.day-card-header{display:flex;align-items:center;gap:12px;padding:14px 20px;cursor:pointer;user-select:none;border-bottom:1px solid transparent;transition:border-color .2s}
.day-card.expanded .day-card-header{border-bottom-color:var(--border)}
.day-rank-badge{font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:700;padding:3px 10px;letter-spacing:.1em;flex-shrink:0}
.rank-b1{background:rgba(245,158,11,.25);color:var(--amber);border:1px solid var(--amber-dim)}
.rank-b2{background:rgba(200,200,200,.1);color:#aaa;border:1px solid rgba(200,200,200,.2)}
.rank-b3{background:rgba(59,130,246,.15);color:var(--blue);border:1px solid rgba(59,130,246,.3)}
.rank-b4,.rank-b5{background:rgba(34,197,94,.1);color:var(--green);border:1px solid rgba(34,197,94,.2)}
.rank-b6,.rank-b7{background:rgba(100,100,100,.1);color:var(--text-muted);border:1px solid rgba(100,100,100,.15)}
.day-card-dateblock{flex:1}
.day-card-datestr{font-family:'IBM Plex Mono',monospace;font-size:14px;font-weight:600;color:var(--text);line-height:1.2}
.day-card-tags{display:flex;gap:6px;margin-top:4px;flex-wrap:wrap}
.tag{font-family:'IBM Plex Mono',monospace;font-size:9px;font-weight:700;padding:2px 7px;letter-spacing:.1em;text-transform:uppercase}
.tag-weekend{background:rgba(59,130,246,.12);color:var(--blue);border:1px solid rgba(59,130,246,.25)}
.day-card-gonogo{font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:700;padding:4px 12px;letter-spacing:.12em;flex-shrink:0}
.gonogo-go{background:rgba(34,197,94,.15);color:var(--green);border:1px solid rgba(34,197,94,.3)}
.gonogo-caution{background:rgba(234,179,8,.15);color:var(--yellow);border:1px solid rgba(234,179,8,.3)}
.gonogo-nogo{background:rgba(239,68,68,.15);color:var(--red);border:1px solid rgba(239,68,68,.3)}
.day-card-chevron{color:var(--text-muted);font-size:12px;transition:transform .25s;flex-shrink:0}
.day-card.expanded .day-card-chevron{transform:rotate(90deg)}
.day-card-body{display:none;padding:16px 20px}
.day-card.expanded .day-card-body{display:block}
/* WEATHER PILLS */
.wx-pills{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:14px}
.wx-pill{font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);background:var(--bg4);border:1px solid var(--border);padding:4px 10px;letter-spacing:.07em}
.wx-pill span{color:var(--text)}
/* WIND CHART */
.wind-chart{margin-bottom:14px}
.wind-chart-title{font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-muted);letter-spacing:.2em;text-transform:uppercase;margin-bottom:8px;display:flex;align-items:center;justify-content:space-between}
.wind-chart-title .threshold-note{color:var(--text-muted);font-size:8px}
.wind-bar-row{display:flex;align-items:center;gap:8px;margin-bottom:4px}
.wind-bar-label{font-family:'IBM Plex Mono',monospace;font-size:9px;width:44px;color:var(--text-dim);text-align:right;flex-shrink:0}
.wind-bar-track{flex:1;height:7px;background:var(--bg4);border:1px solid var(--text-muted);overflow:visible;position:relative}
.wind-bar-fill{height:100%;transition:width .6s ease;position:relative}
.wind-bar-fill.calm{background:var(--green)}
.wind-bar-fill.breezy{background:var(--yellow)}
.wind-bar-fill.strong{background:var(--red)}
.wind-threshold-line{position:absolute;top:-2px;bottom:-2px;width:1px;background:rgba(239,68,68,.5);pointer-events:none}
.wind-val{font-family:'IBM Plex Mono',monospace;font-size:9px;width:42px;color:var(--text-dim)}
/* DRONE BLOCK */
.drone-block{background:var(--bg3);border:1px solid var(--border);padding:10px 14px;margin-bottom:10px;font-size:12px;color:var(--text-dim);line-height:1.5}
.drone-block strong{color:var(--text)}
/* FIELD WARNINGS */
.field-warnings{margin-top:8px}
.field-warn-item{font-family:'IBM Plex Mono',monospace;font-size:11px;padding:6px 12px;margin-bottom:5px;border-left:3px solid}
.field-warn-item.critical{border-color:var(--red);background:rgba(239,68,68,.08);color:#fca5a5}
.field-warn-item.caution{border-color:var(--yellow);background:rgba(234,179,8,.08);color:#fde68a}
.field-warn-item.info{border-color:var(--blue);background:rgba(59,130,246,.08);color:#93c5fd}
/* RESULT SECTION (shared) */
.result-section{background:var(--bg2);border:1px solid var(--border);padding:20px 24px;margin-bottom:14px}
.result-section h3{font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:600;color:var(--amber);letter-spacing:.2em;text-transform:uppercase;margin-bottom:12px}
/* BANNERS */
.warn-banner{background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.3);color:#fca5a5;font-family:'IBM Plex Mono',monospace;font-size:12px;padding:10px 14px;margin-bottom:14px;display:flex;align-items:center;gap:8px}
.info-banner{background:rgba(245,158,11,.07);border:1px solid var(--border);color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:12px;padding:10px 14px;margin-bottom:14px}
/* EXPORT */
.export-row{display:flex;gap:10px;margin-top:20px;flex-wrap:wrap}
.export-btn{background:transparent;border:1px solid var(--border);color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:11px;letter-spacing:.12em;padding:9px 18px;cursor:pointer;transition:all .2s;text-transform:uppercase}
.export-btn:hover{border-color:var(--border-hi);color:var(--amber)}
/* MANUAL MODE */
.upload-zone{border:1px dashed var(--border);padding:28px 24px;text-align:center;cursor:pointer;transition:all .2s;background:var(--bg3);margin-bottom:14px}
.upload-zone:hover{border-color:var(--border-hi);background:var(--bg4)}
.upload-zone-title{font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase;margin-bottom:8px}
.upload-zone-sub{font-size:12px;color:var(--text-muted)}
.upload-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px}
.img-preview{max-width:100%;max-height:220px;object-fit:contain;margin-top:10px;border:1px solid var(--border)}
.manual-analyze-btn{width:100%;background:transparent;border:1px solid var(--border-hi);color:var(--amber);font-family:'IBM Plex Mono',monospace;font-size:13px;font-weight:600;letter-spacing:.2em;padding:14px;cursor:pointer;text-transform:uppercase;transition:all .25s;margin-bottom:14px}
.manual-analyze-btn:hover{background:var(--amber-glow)}
.manual-analyze-btn:disabled{opacity:.4;cursor:not-allowed}
.date-row{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end;margin-bottom:10px}
.date-row .form-group{min-width:150px}
.add-date-btn{background:var(--bg3);border:1px solid var(--border);color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:11px;padding:9px 14px;cursor:pointer;white-space:nowrap;height:38px}
.add-date-btn:hover{border-color:var(--border-hi);color:var(--amber)}
.remove-date-btn{background:transparent;border:none;color:var(--red);font-family:'IBM Plex Mono',monospace;font-size:14px;cursor:pointer;padding:0 4px;opacity:.6;margin-left:2px}
.remove-date-btn:hover{opacity:1}
/* ADDR SUGGESTIONS */
.addr-wrap{position:relative}
.addr-suggestions{position:absolute;top:100%;left:0;right:0;background:var(--bg3);border:1px solid var(--border-hi);z-index:100;max-height:200px;overflow-y:auto}
.addr-suggestion{padding:9px 12px;font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--text);cursor:pointer;border-bottom:1px solid var(--border)}
.addr-suggestion:hover{background:var(--amber-glow)}
.addr-suggestion:last-child{border-bottom:none}
/* WEEK SUMMARY BAR */
.week-summary{background:var(--bg3);border:1px solid var(--border);padding:14px 20px;margin-bottom:14px;display:flex;gap:20px;flex-wrap:wrap;align-items:center}
.week-summary-item{font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim)}
.week-summary-item span{color:var(--text)}
/* PRINT */
@media print {
/* ═══════════════════════════════════════════════════
SKYGRID PRINT STYLESHEET — REVISED
Matches: clean white editorial style from reference PDF
Fonts: Barlow (headings/numbers) · Space Mono (labels) · Georgia (body/italic)
Palette: #fff bg · #111 text · #f0f0f0 tint · left-border accents
═══════════════════════════════════════════════════ */
@page {
margin: 8mm 14mm 8mm 14mm;
size: letter;
}
/* ── Force color printing ───────────────────────── */
* {
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
color-adjust: exact !important;
box-shadow: none !important;
text-shadow: none !important;
}
/* ── Global white/black reset ───────────────────── */
html, body, #app, .results-area, .mode-panel,
.week-grid, .day-card, .day-card-body,
.week-summary, .ai-card, .iono-panel,
[class*="bg"], [style*="background"] {
background: #fff !important;
background-color: #fff !important;
background-image: none !important;
color: #111 !important;
}
* {
background-color: transparent !important;
color: #111 !important;
}
body::before, body::after { display: none !important; }
body {
background: #fff !important;
background-color: #fff !important;
font-family: 'Georgia', 'Times New Roman', serif !important;
font-size: 7.5pt !important;
line-height: 1.4 !important;
color: #111 !important;
}
/* CSS variable overrides */
:root {
--bg: #fff !important;
--bg2: #fff !important;
--bg3: #f8f8f8 !important;
--bg4: #f0f0f0 !important;
--text: #111 !important;
--text-dim: #555 !important;
--text-muted: #999 !important;
--amber: #111 !important;
--amber-dim: #555 !important;
--amber-glow: transparent !important;
--amber-glow2: transparent !important;
--border: #ddd !important;
--border-bright: #aaa !important;
--green: #111 !important;
--red: #111 !important;
--yellow: #555 !important;
}
/* Kill inline dark backgrounds */
[style*="background:#0d1117"], [style*="background: #0d1117"],
[style*="background:#090909"], [style*="background:#0f0f11"],
[style*="background:#161618"], [style*="background:#18181c"],
[style*="background:#1c1c20"], [style*="background:#1e1e24"],
[style*="background:rgba(0"], [style*="background: rgba(0"] {
background: #fff !important;
background-color: #fff !important;
}
/* Kill inline colored text — force black */
[style*="color:#f59e0b"], [style*="color: #f59e0b"],
[style*="color:#00ff9d"], [style*="color:#ff6b6b"],
[style*="color:#ff6b00"], [style*="color:#ffb800"],
[style*="color:var(--amber)"], [style*="color:var(--text)"],
[style*="color:var(--text-dim)"], [style*="color:var(--green)"],
[style*="color:var(--red)"] {
color: #111 !important;
}
/* ── Hide UI chrome — DO NOT hide containers that wrap results ── */
/* Only hide leaf elements: forms, buttons, labels, toggles */
.day-selector, .day-tabs, .day-panel,
.info-note, .error-box, .loading-state,
.instructions-box, .location-box, .gnss-launch-btn,
.paste-btn, .upload-pair,
header .subtitle, header .tagline, header .header-job-line,
header .header-logo-img, #weeklyBanner,
.mode-tabs, .mode-switcher, .app-controls,
.step-row, .new-badge,
.sec, .mode-toggle, .status-bar, .progress-box,
.progress-step, .export-btn, .export-row,
.manual-analyze-btn, .analyze-btn, .run-btn,
.warn-banner, .batch-controls,
#run-btn, #btn-auto, #btn-manual, #btn-batch { display: none !important; }
/* Results containers — force visible regardless of screen state */
/* NOTE: do NOT hide .mode-panel — results-area lives inside it */
.mode-panel, #auto-panel, #manual-panel { display: block !important; }
.results-area, #auto-results, #manual-results,
#week-grid-area, #results, .result-section { display: block !important; }
/* Cover: hidden on screen (inline style), must show for print */
#report-cover { display: block !important; }
.cover-page { display: block !important; }
#ranking-page { display: block !important; }
/* ── PAGE TOP RULE ──────────────────────────────── */
body::before {
content: '';
display: block;
position: fixed;
top: 0; left: 0; right: 0;
height: 3pt;
background: #111 !important;
}
/* ── HEADER ─────────────────────────────────────── */
.hdr, header {
display: grid !important;
grid-template-columns: auto 1fr auto !important;
align-items: center !important;
gap: 14pt !important;
padding: 0 0 8pt 0 !important;
margin-bottom: 14pt !important;
border: none !important;
border-bottom: 2pt solid #111 !important;
background: #fff !important;
}
.hdr-logo, .logo {
display: flex !important;
flex-direction: column !important;
gap: 1pt !important;
}
.hdr-title, header h1 {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 20pt !important;
font-weight: 900 !important;
color: #111 !important;
letter-spacing: -0.5pt !important;
margin: 0 !important;
}
.hdr-sub, header .subtitle {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 7pt !important;
color: #888 !important;
font-weight: 300 !important;
letter-spacing: 0.5pt !important;
}
.hdr-v { display: none !important; }
.print-header-info {
display: flex !important;
flex-direction: column !important;
align-items: flex-end !important;
gap: 1.5pt !important;
text-align: right !important;
}
.print-header-info div {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 7.5pt !important;
color: #444 !important;
line-height: 1.4 !important;
}
.print-header-info div:first-child {
font-size: 9.5pt !important;
font-weight: 700 !important;
color: #111 !important;
}
/* ── RESULTS CONTAINER ──────────────────────────── */
#results { display: block !important; }
.result-section { display: block !important; }
/* ── REPORT TITLE ROW ───────────────────────────── */
.result-header {
display: flex !important;
align-items: baseline !important;
gap: 10pt !important;
margin-bottom: 10pt !important;
padding-bottom: 5pt !important;
border-bottom: 0.75pt solid #111 !important;
}
.result-header h2 {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 16pt !important;
font-weight: 900 !important;
color: #111 !important;
letter-spacing: -0.3pt !important;
margin: 0 !important;
text-transform: uppercase !important;
}
/* ── SECTION LABELS (monospace, small caps) ─────── */
.section-title, .rank-label-bar {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 2.5pt !important;
color: #666 !important;
border: none !important;
border-top: 0.5pt solid #ccc !important;
padding: 5pt 0 4pt 0 !important;
margin: 12pt 0 6pt 0 !important;
background: transparent !important;
page-break-after: avoid !important;
}
.rank-label-bar {
border-top: none !important;
border-bottom: 0.5pt solid #bbb !important;
padding: 3pt 0 4pt 0 !important;
margin: 0 0 6pt 0 !important;
}
.rank-label-0 {
font-size: 7pt !important;
color: #000 !important;
font-weight: 900 !important;
border-bottom: 1.5pt solid #111 !important;
letter-spacing: 3pt !important;
}
/* ── BADGES (EXCELLENT / GOOD / CAUTION / etc.) ─── */
.badge, .gonogo-go, .gonogo-caution, .gonogo-nogo {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
letter-spacing: 1.5pt !important;
text-transform: uppercase !important;
padding: 2pt 6pt !important;
border: 1pt solid #111 !important;
border-radius: 0 !important;
background: transparent !important;
color: #111 !important;
}
.gonogo-go { background: #111 !important; color: #fff !important; }
.gonogo-caution { background: #fff !important; color: #111 !important; }
.gonogo-nogo { border-color: #bbb !important; color: #888 !important; }
.badge-good { background: #f0f0f0 !important; }
.badge-warn { background: #fff !important; }
.badge-bad { background: #e8e8e8 !important; }
/* ── RANKING CARDS ──────────────────────────────── */
.ranking-grid {
display: grid !important;
grid-template-columns: 1fr !important;
gap: 0 !important;
margin-bottom: 12pt !important;
}
.rank-card {
display: grid !important;
grid-template-columns: 1fr auto !important;
align-items: start !important;
gap: 10pt !important;
padding: 10pt 0 !important;
background: transparent !important;
border: none !important;
border-bottom: 0.5pt solid #ddd !important;
border-radius: 0 !important;
border-left: none !important;
page-break-inside: avoid !important;
}
.rank-card:last-child { border-bottom: none !important; }
.rank-card-body {
display: grid !important;
grid-template-columns: 22pt 1fr !important;
align-items: start !important;
gap: 10pt !important;
}
.rank-num-screen { display: none !important; }
.rank-num-print { display: block !important; }
.rank-number {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 16pt !important;
font-weight: 900 !important;
color: #111 !important;
line-height: 1.1 !important;
width: auto !important;
height: auto !important;
border-radius: 0 !important;
background: transparent !important;
}
.rank-info h3 {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 11pt !important;
font-weight: 700 !important;
color: #111 !important;
margin: 0 0 2pt 0 !important;
}
.rank-info .rank-window {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 8pt !important;
font-weight: 700 !important;
color: #111 !important;
margin-bottom: 3pt !important;
}
.rank-info .rank-reason {
font-family: 'Georgia', serif !important;
font-size: 8pt !important;
color: #444 !important;
font-style: italic !important;
}
.rank-score { text-align: right !important; }
.score-num {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 28pt !important;
font-weight: 900 !important;
color: #111 !important;
line-height: 1 !important;
}
.score-label {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 5.5pt !important;
text-transform: uppercase !important;
letter-spacing: 1pt !important;
color: #999 !important;
}
/* ── OVERALL RECOMMENDATION BOX ────────────────── */
.overall-rec, .ai-card {
background: #fff !important;
border: 0.5pt solid #ccc !important;
border-radius: 0 !important;
padding: 8pt 12pt !important;
margin-bottom: 10pt !important;
page-break-inside: avoid !important;
}
.overall-rec h4, .ai-card h3 {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 1.5pt !important;
color: #111 !important;
margin: 0 0 5pt 0 !important;
}
.overall-rec p, .ai-card-body {
font-family: 'Georgia', serif !important;
font-size: 8.5pt !important;
color: #222 !important;
font-style: italic !important;
margin: 0 !important;
line-height: 1.5 !important;
}
/* ── 4-HOUR STATIC WINDOW BOX ───────────────────── */
.four-hour-box {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
gap: 14pt !important;
margin-bottom: 12pt !important;
page-break-inside: avoid !important;
}
.four-hour-primary {
background: #f0f0f0 !important;
border: none !important;
border-top: 3pt solid #111 !important;
border-radius: 0 !important;
padding: 10pt 12pt !important;
}
.four-hour-backup {
background: transparent !important;
border: none !important;
border-top: 1pt solid #bbb !important;
border-radius: 0 !important;
padding: 10pt 12pt !important;
}
.four-hour-rec-label {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
font-weight: 900 !important;
letter-spacing: 3pt !important;
text-transform: uppercase !important;
color: #000 !important;
background: transparent !important;
border-radius: 0 !important;
padding: 0 0 4pt 0 !important;
margin: 0 0 6pt 0 !important;
border-bottom: 1.5pt solid #111 !important;
display: block !important;
}
.four-hour-rec-label-alt {
color: #666 !important;
border-bottom-color: #bbb !important;
font-size: 6pt !important;
font-weight: 700 !important;
}
.four-hour-date {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 9.5pt !important;
font-weight: 700 !important;
color: #111 !important;
margin: 0 0 5pt 0 !important;
}
.four-hour-time {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 26pt !important;
font-weight: 900 !important;
color: #111 !important;
letter-spacing: -0.5pt !important;
line-height: 1.1 !important;
margin-bottom: 4pt !important;
}
.four-hour-time.backup {
font-size: 18pt !important;
color: #333 !important;
}
.four-hour-label {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 5.5pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 1.5pt !important;
color: #888 !important;
margin-bottom: 3pt !important;
}
.four-hour-times {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
color: #333 !important;
margin-bottom: 4pt !important;
}
.four-hour-times strong { font-weight: 700 !important; color: #111 !important; }
.four-hour-reason {
font-family: 'Georgia', serif !important;
font-size: 7.5pt !important;
color: #444 !important;
font-style: italic !important;
}
.four-hour-warn {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
color: #444 !important;
background: #ebebeb !important;
border: none !important;
padding: 4pt 6pt !important;
margin-top: 5pt !important;
border-radius: 0 !important;
}
/* ── WEATHER STRIP ──────────────────────────────── */
.weather-strip {
display: grid !important;
grid-template-columns: auto 1fr !important;
align-items: center !important;
gap: 10pt !important;
border: none !important;
border-left: 3.5pt solid #111 !important;
background: #f5f5f5 !important;
border-radius: 0 !important;
padding: 7pt 12pt !important;
margin-bottom: 7pt !important;
page-break-inside: avoid !important;
}
.weather-emoji { font-size: 16pt !important; }
.weather-status {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7.5pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 0.5pt !important;
color: #111 !important;
margin-bottom: 2pt !important;
}
.weather-details {
font-family: 'Georgia', serif !important;
font-size: 8pt !important;
color: #333 !important;
}
/* ── FIELD WARNINGS ─────────────────────────────── */
.field-warnings {
background: #f0f0f0 !important;
border: none !important;
border-left: 3pt solid #555 !important;
border-radius: 0 !important;
padding: 6pt 12pt !important;
margin-bottom: 6pt !important;
page-break-inside: avoid !important;
}
.fw-title {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 1.5pt !important;
color: #333 !important;
margin-bottom: 4pt !important;
}
.fw-item {
font-family: 'Georgia', serif !important;
font-size: 8pt !important;
color: #222 !important;
padding: 1.5pt 0 !important;
border: none !important;
}
/* ── DRONE WIND BOX ─────────────────────────────── */
.drone-wind-box {
background: #fff !important;
border: 0.5pt solid #ddd !important;
border-left: none !important;
border-radius: 0 !important;
padding: 4pt 8pt !important;
margin-bottom: 4pt !important;
page-break-inside: auto !important;
}
/* Wind bar track */
.wbar-track, [style*="background:#e4e4e4"] { background: #e4e4e4 !important; }
.wbar-gust { background: #b8b8b8 !important; }
.wbar-go { background: #222 !important; opacity: 1 !important; }
.wbar-caution { background: #555 !important; opacity: 1 !important; }
.wbar-highrisk{ background: #888 !important; opacity: 1 !important; }
.wbar-grounded{ background: #111 !important; opacity: 1 !important; }
.wbar-label { color: #fff !important; font-size: 5.5pt !important; }
/* Kill dark bg inside drone box */
.drone-wind-box [style*="background:#0d1117"],
.drone-wind-box [style*="background:rgba"] { background: #fff !important; }
.drone-wind-box [style*="color:#fff"],
.drone-wind-box [style*="color:#ccc"],
.drone-wind-box [style*="color:#aaa"],
.drone-wind-box [style*="color:#888"],
.drone-wind-box [style*="color:#999"],
.drone-wind-box [style*="color:#555"],
.drone-wind-box [style*="color:#666"] { color: #444 !important; }
.drone-wind-box [style*="color:#00ff9d"],
.drone-wind-box [style*="color:#ff6b6b"],
.drone-wind-box [style*="color:#ff6b00"],
.drone-wind-box [style*="color:#ffb800"] { color: #222 !important; }
/* Drone wind title + meta row */
.wind-chart-title { color: #555 !important; font-size: 7pt !important; }
.drone-wind-title {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
font-weight: 700 !important;
letter-spacing: 1.5pt !important;
color: #111 !important;
text-transform: uppercase !important;
}
/* "No clean flyable window" pill */
.no-fly-pill {
background: #f0f0f0 !important;
border: 0.5pt solid #ccc !important;
color: #555 !important;
border-radius: 0 !important;
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7.5pt !important;
padding: 4pt 10pt !important;
}
/* "Best flight window" pill */
.best-fly-pill {
background: #f0f0f0 !important;
border: 0.5pt solid #bbb !important;
color: #111 !important;
border-radius: 0 !important;
font-size: 8pt !important;
font-weight: 700 !important;
padding: 4pt 10pt !important;
}
/* ── BEST WINDOW HERO ────────────────────────────── */
.best-window {
background: #f5f5f5 !important;
border: none !important;
border-left: 4pt solid #111 !important;
border-radius: 0 !important;
padding: 5pt 10pt !important;
margin-top: 4pt !important;
page-break-inside: avoid !important;
}
.best-window-label {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
letter-spacing: 2pt !important;
text-transform: uppercase !important;
color: #666 !important;
margin-bottom: 3pt !important;
}
.best-window-time {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 18pt !important;
font-weight: 900 !important;
color: #111 !important;
line-height: 1.1 !important;
letter-spacing: -0.5pt !important;
margin-bottom: 2pt !important;
}
/* "NO CLEAN WINDOW" variant */
.best-window-time[style*="color:#ef4444"],
.best-window-time[style*="color: #ef4444"] {
font-size: 14pt !important;
color: #777 !important;
}
.best-window-reason {
font-family: 'Georgia', serif !important;
font-size: 8pt !important;
color: #444 !important;
font-style: italic !important;
}
/* ── HOURLY GNSS / DOP BLOCK ─────────────────────── */
.gnss-hourly-block {
background: #f7f7f7 !important;
border: none !important;
border-top: 2pt solid #111 !important;
border-radius: 0 !important;
padding: 5pt 8pt !important;
margin-bottom: 4pt !important;
page-break-inside: auto !important;
}
/* Keep each hour row together */
.ghb-row { page-break-inside: avoid !important; }
/* Keep header + first few rows together */
.ghb-header { page-break-after: avoid !important; }
.ghb-col-heads { page-break-after: avoid !important; }
.ghb-header {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
letter-spacing: 2pt !important;
text-transform: uppercase !important;
color: #444 !important;
margin-bottom: 5pt !important;
}
.ghb-col-heads { margin-bottom: 3pt !important; }
.ghb-col-lbl {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
color: #999 !important;
text-transform: uppercase !important;
letter-spacing: 1pt !important;
}
.ghb-time {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
color: #555 !important;
}
.ghb-bar-track {
background: #d8d8d8 !important;
border: none !important;
border-radius: 0 !important;
height: 7pt !important;
}
.ghb-bar-fill {
opacity: 1 !important;
background: #555 !important; /* solid dark grey — readable in print */
}
.ghb-pdop-val {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
color: #000 !important;
font-weight: 700 !important;
line-height: 7pt !important;
}
.ghb-sats {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
color: #333 !important;
font-weight: 600 !important;
}
.ghb-rating {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
color: #000 !important;
text-align: right !important;
}
/* Rating emphasis by class */
.ghb-rating.dop-good { color: #000 !important; font-weight: 700 !important; }
.ghb-rating.dop-ok { color: #222 !important; font-weight: 700 !important; }
.ghb-rating.dop-poor { color: #000 !important; font-weight: 900 !important; }
.ghb-rating.dop-spike { color: #000 !important; font-weight: 900 !important; }
/* AVOID / POOR rows: visible shading in print */
.ghb-row.spike-row {
border-left: 2.5pt solid #333 !important;
padding-left: 3pt !important;
background: #ebebeb !important;
}
/* ── DOP SUMMARY TABLE ───────────────────────────── */
.mask-selector-wrap { display: none !important; }
.dop-table-wrap {
overflow: visible !important;
margin-top: 8pt !important;
page-break-inside: avoid !important;
}
.dop-table {
width: 100% !important;
border-collapse: collapse !important;
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
}
.dop-table th {
background: #d0d0d0 !important;
color: #000 !important;
font-size: 6pt !important;
font-weight: 800 !important;
letter-spacing: 1.5pt !important;
text-transform: uppercase !important;
padding: 4pt 8pt !important;
border-bottom: 1pt solid #999 !important;
text-align: left !important;
}
.dop-table td {
padding: 4pt 8pt !important;
border-bottom: 0.25pt solid #ccc !important;
color: #111 !important;
font-weight: 500 !important;
}
.dop-table tr:last-child td { border-bottom: none !important; }
.dop-good { color: #000 !important; font-weight: 800 !important; }
.dop-ok { color: #111 !important; font-weight: 600 !important; }
.dop-poor { color: #333 !important; font-style: italic !important; }
.dop-footnote {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
color: #555 !important;
margin-top: 5pt !important;
line-height: 1.5 !important;
}
.dop-footnote span { opacity: 1 !important; color: #999 !important; }
/* ── IONOSPHERIC PANEL ───────────────────────────── */
.site-signal-header {
border-top: 2pt solid #111 !important;
padding-top: 6pt !important;
margin-bottom: 8pt !important;
page-break-inside: avoid !important;
}
.site-signal-title {
font-family: 'Space Mono', monospace !important;
font-size: 7pt !important;
font-weight: 700 !important;
letter-spacing: 3pt !important;
color: #111 !important;
margin-bottom: 6pt !important;
text-transform: uppercase !important;
}
.site-signal-facts {
display: flex !important;
gap: 20pt !important;
flex-wrap: wrap !important;
margin-bottom: 4pt !important;
}
.ssf-item { display: flex !important; flex-direction: column !important; gap: 1pt !important; }
.ssf-label {
font-family: 'Space Mono', monospace !important;
font-size: 5.5pt !important;
color: #666 !important;
text-transform: uppercase !important;
letter-spacing: 1pt !important;
}
.ssf-value {
font-family: 'Space Mono', monospace !important;
font-size: 10pt !important;
font-weight: 700 !important;
color: #000 !important;
}
.ssf-note {
font-family: 'Space Mono', monospace !important;
font-size: 5.5pt !important;
color: #555 !important;
}
.iono-panel {
background: #f8f8f8 !important;
border: 0.5pt solid #ddd !important;
border-radius: 0 !important;
padding: 8pt 12pt !important;
page-break-inside: avoid !important;
}
/* ── Airspace / TFR block ─────────────────────────── */
[style*="font-family:monospace"][style*="border-radius:6px"] {
font-size: 5.5pt !important;
padding: 4pt 6pt !important;
margin: 2pt 0 1pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
border-radius: 0 !important;
background: #f8f8f8 !important;
border: 0.5pt solid #ddd !important;
color: #111 !important;
line-height: 1.3 !important;
}
[style*="font-family:monospace"][style*="border-radius:6px"] * {
color: #111 !important;
font-size: 5.5pt !important;
line-height: 1.3 !important;
margin: 0 !important;
padding: 0 !important;
}
.iono-panel * { color: #111 !important; background: transparent !important; }
/* ── WEEK SUMMARY BAR ────────────────────────────── */
.week-summary {
background: #f0f0f0 !important;
border: 0.5pt solid #ccc !important;
border-radius: 0 !important;
padding: 8pt 12pt !important;
margin-bottom: 10pt !important;
page-break-inside: avoid !important;
page-break-before: avoid !important;
break-before: avoid !important;
}
.week-summary * { color: #111 !important; }
/* ── METRICS STRIP ───────────────────────────────── */
.metrics {
display: grid !important;
grid-template-columns: 1fr 1fr 1fr 1fr !important;
gap: 6pt !important;
page-break-inside: avoid !important;
margin-bottom: 10pt !important;
}
.metric-card {
background: transparent !important;
border: none !important;
border-top: 2pt solid #111 !important;
padding: 5pt 0 0 0 !important;
}
.metric-name {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 5.5pt !important;
text-transform: uppercase !important;
letter-spacing: 1pt !important;
color: #888 !important;
margin-bottom: 2pt !important;
}
.metric-value {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 10pt !important;
font-weight: 700 !important;
color: #111 !important;
margin-bottom: 3pt !important;
}
.metric-bar { background: #e0e0e0 !important; height: 3pt !important; border-radius: 0 !important; }
.metric-bar-fill { background: #111 !important; }
/* ── DAY CARDS ───────────────────────────────────── */
.day-card {
background: #fff !important;
border: none !important;
border-top: 0.75pt solid #111 !important;
border-radius: 0 !important;
/* Don't avoid page break for the full card — too tall at 14 DOP rows + wind bars */
page-break-inside: auto !important;
}
/* Keep the card header on same page as first content block */
.day-card-header {
page-break-after: avoid !important;
}
.day-card-header { background: #fff !important; }
.day-card-body { background: #fff !important; }
.day-card-datestr {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 11pt !important;
font-weight: 700 !important;
color: #111 !important;
}
/* ── WX PILLS ────────────────────────────────────── */
.wx-pill {
background: #f0f0f0 !important;
color: #111 !important;
border: 0.5pt solid #ccc !important;
border-radius: 0 !important;
}
.wx-pill span { color: #111 !important; }
/* ── TAGS ────────────────────────────────────────── */
.tag {
background: #e8e8e8 !important;
color: #333 !important;
border-radius: 0 !important;
}
/* ── DAY DETAIL CARDS ────────────────────────────── */
.day-detail {
background: transparent !important;
border: none !important;
border-top: 0.75pt solid #111 !important;
margin-bottom: 0 !important;
page-break-inside: avoid !important;
}
.day-detail-body { display: block !important; }
.day-detail-header {
display: flex !important;
align-items: center !important;
gap: 8pt !important;
padding: 8pt 0 6pt 0 !important;
}
.day-detail-header h3 {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 11pt !important;
font-weight: 700 !important;
color: #111 !important;
margin: 0 !important;
flex: 1 !important;
}
.chevron { display: none !important; }
.go-avoid-badge {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
letter-spacing: 1pt !important;
border: 0.5pt solid #111 !important;
background: transparent !important;
color: #111 !important;
padding: 1.5pt 5pt !important;
border-radius: 0 !important;
}
/* ── WINDOW ROWS ─────────────────────────────────── */
.windows-grid { page-break-inside: avoid !important; }
.window-row {
display: grid !important;
grid-template-columns: 120pt 1fr auto !important;
align-items: start !important;
gap: 8pt !important;
padding: 5pt 0 !important;
background: transparent !important;
border: none !important;
border-bottom: 0.25pt solid #e0e0e0 !important;
border-radius: 0 !important;
margin: 0 !important;
}
.window-row.best { background: #f5f5f5 !important; padding: 5pt 6pt !important; }
.window-row.avoid { background: transparent !important; }
.window-time {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 8.5pt !important;
font-weight: 700 !important;
color: #111 !important;
}
.window-desc strong {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 8.5pt !important;
font-weight: 700 !important;
color: #111 !important;
}
.window-desc .detail {
font-family: 'Georgia', serif !important;
font-size: 7.5pt !important;
color: #555 !important;
}
/* ── REC BOXES ───────────────────────────────────── */
.rec-box {
border: none !important;
border-left: 2pt solid #bbb !important;
padding: 3pt 0 3pt 8pt !important;
margin-bottom: 2pt !important;
background: transparent !important;
page-break-inside: avoid !important;
}
.rec-box h4 {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 9pt !important;
font-weight: 700 !important;
color: #111 !important;
margin: 0 0 2pt 0 !important;
text-transform: uppercase !important;
}
.rec-box p {
font-family: 'Georgia', serif !important;
font-size: 8.5pt !important;
color: #333 !important;
margin: 0 !important;
font-style: italic !important;
}
.rec-box.warn { border-left-color: #555 !important; }
.rec-box.danger { border-left-color: #111 !important; background: #f5f5f5 !important; }
/* ── RESOURCE LINKS (last page) ──────────────────── */
.resource-links-section, .links-section {
page-break-before: always !important;
}
.resource-link-cat {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 2pt !important;
color: #666 !important;
border-top: 0.5pt solid #ccc !important;
padding-top: 5pt !important;
margin: 10pt 0 4pt 0 !important;
}
.resource-link-item {
font-family: 'Georgia', serif !important;
font-size: 8pt !important;
color: #111 !important;
padding: 2pt 0 !important;
}
.resource-link-item a {
color: #333 !important;
text-decoration: underline !important;
}
/* ── RANKING PAGE ────────────────────────────────── */
.ranking-page-inner {
background: #fff !important;
page-break-after: always !important;
break-after: always !important;
padding: 0 !important;
}
.ranking-page-header {
display: flex !important;
align-items: baseline !important;
gap: 10pt !important;
margin-bottom: 6pt !important;
padding-bottom: 5pt !important;
border-bottom: 2pt solid #111 !important;
}
.ranking-page-title {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 18pt !important;
font-weight: 900 !important;
color: #111 !important;
letter-spacing: -0.3pt !important;
text-transform: uppercase !important;
}
.ranking-page-sub {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
color: #666 !important;
text-transform: uppercase !important;
letter-spacing: 1pt !important;
}
.ranking-meta-note {
font-family: 'Georgia', serif !important;
font-size: 7.5pt !important;
color: #555 !important;
font-style: italic !important;
margin-bottom: 8pt !important;
}
.ranking-table-wrap { overflow: visible !important; }
.ranking-table {
width: 100% !important;
border-collapse: collapse !important;
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
}
.ranking-table thead tr {
border-bottom: 1.5pt solid #111 !important;
}
.ranking-table th {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 1.5pt !important;
color: #555 !important;
padding: 4pt 6pt !important;
text-align: left !important;
background: transparent !important;
vertical-align: bottom !important;
}
.rh-sub {
font-size: 5pt !important;
color: #999 !important;
font-weight: 400 !important;
letter-spacing: 0.5pt !important;
display: block !important;
}
.rank-row td {
padding: 7pt 6pt !important;
border-bottom: 0.5pt solid #e0e0e0 !important;
vertical-align: top !important;
color: #111 !important;
}
.rank-row-top td { background: transparent !important; }
.rank-row-top:first-child td { background: #f5f5f5 !important; }
.rank-row-low td { color: #666 !important; }
.rank-n {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 18pt !important;
font-weight: 900 !important;
color: #111 !important;
line-height: 1 !important;
width: 22pt !important;
padding-top: 5pt !important;
}
.rank-row-low .rank-n { color: #bbb !important; }
.rank-date {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 9pt !important;
font-weight: 700 !important;
color: #111 !important;
white-space: nowrap !important;
min-width: 70pt !important;
}
.rank-dow {
display: block !important;
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 400 !important;
color: #888 !important;
margin-top: 1pt !important;
}
.rank-weekend-tag {
display: inline-block !important;
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 5.5pt !important;
color: #888 !important;
border: 0.5pt solid #ccc !important;
padding: 0.5pt 3pt !important;
margin-top: 2pt !important;
letter-spacing: 0.5pt !important;
}
.rank-pdop {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 11pt !important;
font-weight: 700 !important;
color: #111 !important;
white-space: nowrap !important;
min-width: 32pt !important;
}
.rank-row-low .rank-pdop { color: #888 !important; }
.rank-sats {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7.5pt !important;
color: #333 !important;
white-space: nowrap !important;
}
.rank-wx {
font-family: 'Georgia', serif !important;
font-size: 7.5pt !important;
color: #444 !important;
white-space: nowrap !important;
min-width: 55pt !important;
}
.rank-badge-cell { white-space: nowrap !important; }
.rank-badge {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
letter-spacing: 1pt !important;
text-transform: uppercase !important;
padding: 2pt 5pt !important;
border-radius: 0 !important;
white-space: nowrap !important;
}
.rank-go { background: #111 !important; color: #fff !important;
-webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }
.rank-caution { background: #fff !important; color: #111 !important; border: 1pt solid #111 !important; }
.rank-nogo { background: #fff !important; color: #999 !important; border: 1pt solid #ccc !important; }
.rank-notes {
font-family: 'Georgia', serif !important;
font-size: 7pt !important;
color: #444 !important;
font-style: italic !important;
line-height: 1.45 !important;
}
/* ── COVER PAGE ──────────────────────────────────── */
.cover-page {
page-break-after: always !important;
background: #fff !important;
}
/* ── PAGE BREAK HINTS ────────────────────────────── */
.page-break-before { page-break-before: always !important; }
.page-break-after { page-break-after: always !important; }
}
::-webkit-scrollbar{width:4px;height:4px}
::-webkit-scrollbar-track{background:var(--bg)}
::-webkit-scrollbar-thumb{background:var(--amber-dim)}
/* Print header elements - hidden on screen */
.print-header-info { display: none; }
.print-footer { display: none; }
@media print {
/* Map .hdr to behave like header for print */
.hdr {
display: none !important;
}
.print-header-info {
display: flex !important;
flex-direction: column !important;
align-items: flex-end !important;
gap: 2pt !important;
text-align: right !important;
}
.print-header-info div {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 7.5pt !important;
color: #444 !important;
line-height: 1.4;
}
.print-header-info div:first-child {
font-size: 9pt !important;
font-weight: 700 !important;
color: #111 !important;
}
.print-footer {
display: flex !important;
position: fixed !important;
bottom: 0 !important;
left: 20mm !important;
right: 20mm !important;
border-top: 0.5pt solid #ccc !important;
padding: 3pt 0 !important;
justify-content: space-between !important;
}
.print-footer span {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
color: #999 !important;
}
/* Hide app chrome */
.mode-toggle, .sec, .status-bar, .progress-box,
.export-row, .export-btn, .manual-analyze-btn, .analyze-btn,
.progress-step, .warn-banner, .new-badge,
.run-btn, #run-btn { display: none !important; }
/* Keep mode-panel containers visible — results live inside them */
.mode-panel, #auto-panel, #manual-panel { display: block !important; }
.results-area, .results-area.visible,
#auto-results, #manual-results, #report-cover,
#ranking-page, .cover-page { display: block !important; }
/* Expand all day cards */
.day-card-body { display: block !important; }
.day-card-chevron { display: none !important; }
/* Forced colors for wind bars */
.wbar-go { background: #222 !important; opacity: 1 !important; }
.wbar-caution { background: #555 !important; opacity: 1 !important; }
.wbar-highrisk { background: #777 !important; opacity: 1 !important; }
.wbar-grounded { background: #111 !important; opacity: 1 !important; }
.wbar-track { background: #e4e4e4 !important; }
.wbar-gust { background: #c0c0c0 !important; }
.wbar-label { color: #fff !important; }
.iono-level { background: #eee !important; color: #111 !important; border: 0.5pt solid #999 !important; }
/* ── STATIC BASE OBSERVATION WINDOW ── */
.static-window-card {
background: transparent !important;
border: none !important;
border-top: 2pt solid #111 !important;
padding: 6pt 0 !important;
margin-bottom: 8pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
page-break-before: always !important;
break-before: always !important;
}
.static-window-grid {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
gap: 10pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
}
.static-window-primary {
background: #f0f0f0 !important;
border: none !important;
border-top: 3pt solid #111 !important;
padding: 8pt 10pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
}
.static-window-backup {
background: transparent !important;
border: none !important;
border-top: 1pt solid #bbb !important;
padding: 8pt 10pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
}
.static-window-rec-label {
font-family: 'Space Mono', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
letter-spacing: 2pt !important;
color: #666 !important;
margin-bottom: 3pt !important;
}
.static-window-date {
font-family: 'Space Mono', monospace !important;
font-size: 6.5pt !important;
color: #555 !important;
margin-bottom: 2pt !important;
}
/* ── Site Conditions page ──────────────────────────── */
.site-cond-wrap {
font-size: 8pt !important;
page-break-before: always !important;
break-before: always !important;
}
.site-cond-title {
font-family: 'Space Mono', monospace !important;
font-size: 7pt !important;
letter-spacing: 0.15em !important;
color: #111 !important;
font-weight: 700 !important;
border-bottom: 1.5pt solid #111 !important;
padding-bottom: 5pt !important;
margin-bottom: 8pt !important;
}
.site-cond-section-head {
font-family: 'Space Mono', monospace !important;
font-size: 6.5pt !important;
font-weight: 700 !important;
letter-spacing: 0.12em !important;
color: #444 !important;
border-bottom: 0.5pt solid #ccc !important;
padding-bottom: 3pt !important;
margin: 10pt 0 5pt 0 !important;
}
.gauge-row {
display: grid !important;
grid-template-columns: 2fr 0.7fr 0.7fr 0.7fr 1fr !important;
gap: 0 8pt !important;
padding: 3pt 0 !important;
border-bottom: 0.25pt solid #eee !important;
align-items: center !important;
}
.cdec-row {
display: grid !important;
grid-template-columns: 2fr 0.6fr 0.9fr 0.7fr 0.8fr 0.6fr !important;
gap: 0 8pt !important;
padding: 3pt 0 !important;
border-bottom: 0.25pt solid #eee !important;
align-items: center !important;
}
.gauge-head {
font-weight: 700 !important;
color: #666 !important;
font-size: 6pt !important;
letter-spacing: 0.08em !important;
}
.gauge-name { font-weight: 600 !important; color: #111 !important; }
.gauge-val { color: #333 !important; text-align: right !important; }
.flood-normal { color: #16a34a !important; font-weight: 700 !important; }
.flood-action { color: #ca8a04 !important; font-weight: 700 !important; }
.flood-flood { color: #dc2626 !important; font-weight: 700 !important; }
.flood-moderate { color: #dc2626 !important; font-weight: 700 !important; }
.flood-major { color: #7c3aed !important; font-weight: 700 !important; }
.flood-unknown { color: #888 !important; }
/* ── Control points page ───────────────────────────── */
.control-page-wrap {
font-size: 8pt !important;
page-break-before: always !important;
break-before: always !important;
}
.control-page-title {
font-family: 'Space Mono', monospace !important;
font-size: 7pt !important;
letter-spacing: 0.15em !important;
color: #111 !important;
font-weight: 700 !important;
border-bottom: 1.5pt solid #111 !important;
padding-bottom: 5pt !important;
margin-bottom: 8pt !important;
}
.control-section-head {
font-family: 'Space Mono', monospace !important;
font-size: 6.5pt !important;
font-weight: 700 !important;
letter-spacing: 0.12em !important;
color: #444 !important;
margin: 8pt 0 4pt !important;
text-transform: uppercase !important;
}
.control-table {
width: 100% !important;
border-collapse: collapse !important;
font-size: 7.5pt !important;
font-family: 'IBM Plex Mono', monospace !important;
margin-bottom: 10pt !important;
}
.control-table th {
font-size: 6pt !important;
font-weight: 700 !important;
color: #666 !important;
border-bottom: 0.5pt solid #ccc !important;
padding: 2pt 4pt !important;
text-align: left !important;
letter-spacing: 0.1em !important;
text-transform: uppercase !important;
}
.control-table td {
padding: 2pt 4pt !important;
border-bottom: 0.25pt solid #eee !important;
vertical-align: middle !important;
color: #111 !important;
}
.control-id {
font-weight: 700 !important;
color: #000 !important;
}
.control-qr img, .control-qr canvas {
width: 32pt !important;
height: 32pt !important;
}
.fema-box {
display: flex !important;
gap: 10pt !important;
align-items: flex-start !important;
background: #f8f8f8 !important;
padding: 6pt 10pt !important;
border: 0.5pt solid #ddd !important;
page-break-inside: avoid !important;
}
.fema-zone-badge {
font-family: 'Space Mono', monospace !important;
font-size: 8pt !important;
font-weight: 700 !important;
color: #111 !important;
background: transparent !important;
}
.fema-meta {
font-size: 7pt !important;
color: #333 !important;
}
.static-window-inner {
page-break-inside: avoid !important;
break-inside: avoid !important;
}
.static-window-card-title {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
font-weight: 700 !important;
letter-spacing: 2pt !important;
text-transform: uppercase !important;
color: #666 !important;
margin-bottom: 8pt !important;
border: none !important;
page-break-after: avoid !important;
break-after: avoid !important;
}
.static-window-card-title::after {
content: '' !important;
flex: 1 !important;
height: 0.5pt !important;
background: #ddd !important;
}
.static-window-grid {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
gap: 12pt !important;
}
.static-window-primary {
background: #f0f0f0 !important;
border: none !important;
border-top: 3pt solid #111 !important;
padding: 8pt 10pt !important;
}
.static-window-backup {
background: transparent !important;
border: none !important;
border-top: 1pt solid #bbb !important;
padding: 8pt 10pt !important;
}
.static-window-rec-label {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 900 !important;
letter-spacing: 2pt !important;
color: #000 !important;
border-bottom: 1.5pt solid #111 !important;
padding-bottom: 3pt !important;
margin-bottom: 5pt !important;
}
.static-window-rec-label-alt {
color: #666 !important;
border-bottom-color: #bbb !important;
font-weight: 700 !important;
border-bottom-width: 0.5pt !important;
}
.static-window-date {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
color: #555 !important;
margin-bottom: 3pt !important;
}
.static-window-time {
font-family: 'Barlow', 'Arial Black', sans-serif !important;
font-size: 20pt !important;
font-weight: 900 !important;
color: #111 !important;
letter-spacing: -0.5pt !important;
line-height: 1.1 !important;
margin-bottom: 3pt !important;
}
.static-window-time.backup {
font-size: 14pt !important;
color: #444 !important;
}
.static-window-meta {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
color: #333 !important;
margin-bottom: 3pt !important;
}
.static-window-reason {
font-family: 'Georgia', serif !important;
font-size: 7.5pt !important;
color: #444 !important;
font-style: italic !important;
}
}
/* ═══════════════════════════════════════════════════════
COVER SHEET — screen hidden, print only
═══════════════════════════════════════════════════════ */
#report-cover { display: none; }
/* Cover on-screen summary table styles */
#report-cover .cover-day-row { display: grid; grid-template-columns: 22px 100px 120px 80px 56px 1fr auto; align-items: center; padding: 7px 0; border-bottom: 1px solid #333; gap: 10px; font-family: "IBM Plex Mono", monospace; font-size: 12px; color: var(--text); }
#report-cover .cover-day-row:first-child { border-top: 1px solid #333; }
#report-cover .cover-rank-num { font-size: 16px; font-weight: 700; color: var(--amber); }
#report-cover .cover-day-dow { font-size: 10px; font-weight: 700; letter-spacing: .1em; }
#report-cover .cover-day-fulldate { font-size: 11px; color: var(--text-dim); }
#report-cover .cover-day-gnss-window { font-size: 12px; }
#report-cover .cover-day-pdop-sats { font-size: 10px; color: var(--text-dim); }
#report-cover .cover-day-wx-col { font-size: 11px; color: var(--text-dim); }
#report-cover .cover-day-note { font-size: 10px; color: var(--text-dim); }
#report-cover .cover-badge-go { background: rgba(34,197,94,.15); color: var(--green); border: 1px solid rgba(34,197,94,.3); font-size: 9px; font-weight: 700; padding: 3px 8px; letter-spacing: .1em; }
#report-cover .cover-badge-caution { background: rgba(234,179,8,.15); color: var(--yellow); border: 1px solid rgba(234,179,8,.3); font-size: 9px; font-weight: 700; padding: 3px 8px; letter-spacing: .1em; }
#report-cover .cover-badge-nogo { background: rgba(239,68,68,.15); color: var(--red); border: 1px solid rgba(239,68,68,.3); font-size: 9px; font-weight: 700; padding: 3px 8px; letter-spacing: .1em; }
#report-cover .cover-summary-table { padding: 0 20px; display: flex; flex-direction: column; }
#report-cover .cover-job-meta { display: flex; gap: 8px; font-family: "IBM Plex Mono", monospace; font-size: 12px; color: var(--text-dim); flex-wrap: wrap; }
#report-cover .cover-aqi-val { font-size: 11px; font-weight: 700; }
#report-cover .cover-aqi-alert { background: var(--red); color: #fff; padding: 2px 5px; }
.cover-page {
width: 100%;
height: auto;
max-height: none;
background: #fff;
display: flex;
flex-direction: column;
padding: 0;
box-sizing: border-box;
font-family: 'Barlow', Arial, sans-serif;
color: #111;
overflow: hidden;
}
.cover-top-rule {
height: 5px;
background: #111;
width: 100%;
flex-shrink: 0;
}
.cover-logo-block {
padding: 28px 52px 0;
display: flex;
flex-direction: column;
gap: 4px;
flex-shrink: 0;
}
.cover-globe {
font-size: 36px;
line-height: 1;
margin-bottom: 6px;
}
.cover-wordmark {
font-family: 'Barlow', Arial, sans-serif;
font-size: 54px;
font-weight: 900;
letter-spacing: -2px;
color: #111;
line-height: 0.9;
}
.cover-tagline {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
font-weight: 400;
letter-spacing: 0.25em;
color: #666;
margin-top: 4px;
}
.cover-rule {
height: 1px;
background: #ddd;
margin: 18px 52px;
}
.cover-job-block {
padding: 0 52px;
display: flex;
flex-direction: column;
gap: 4px;
flex-shrink: 0;
}
.cover-job-company {
font-family: 'Barlow', Arial, sans-serif;
font-size: 24px;
font-weight: 700;
color: #111;
line-height: 1.1;
}
.cover-job-name {
font-family: 'Barlow', Arial, sans-serif;
font-size: 15px;
font-weight: 400;
color: #444;
}
.cover-job-meta {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
color: #888;
margin-top: 3px;
display: flex;
gap: 8px;
flex-wrap: wrap;
align-items: center;
}
.cover-meta-sep { color: #ccc; }
.cover-section-label {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.2em;
color: #999;
text-transform: uppercase;
padding: 16px 52px 10px;
border-top: 0.5px solid #eee;
margin-top: 16px;
flex-shrink: 0;
}
/* Summary table */
.cover-summary-table {
padding: 0 52px;
display: flex;
flex-direction: column;
gap: 0;
flex: 0 0 auto;
}
.cover-day-row {
display: grid;
grid-template-columns: 22px 100px 120px 80px 56px 1fr auto;
align-items: center;
padding: 7px 0;
border-bottom: 0.5px solid #eee;
gap: 10px;
}
.cover-day-row.no-aqi {
grid-template-columns: 22px 100px 120px 80px 1fr auto;
}
.cover-day-row:first-child { border-top: 0.5px solid #eee; }
/* Rank 1 gets a subtle highlight */
.cover-rank-1 { background: #f5f5f5; margin: 0 -12px; padding: 8px 12px; }
.cover-rank-wknd .cover-day-fulldate,
.cover-rank-wknd .cover-day-dow { opacity: 0.55; }
/* AQI badge */
.cover-aqi {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 3px 6px;
border-radius: 3px;
min-width: 44px;
text-align: center;
}
.cover-aqi-val {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 11px;
font-weight: 700;
line-height: 1;
}
.cover-aqi-cat {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 6px;
margin-top: 2px;
line-height: 1.2;
text-align: center;
}
.cover-aqi-ok { background: transparent; color: #666; }
.cover-aqi-alert { background: #c62828; color: #fff; border-radius: 3px; }
.cover-aqi-nokey { background: #f0f0f0; color: #bbb; border: 1px dashed #ddd; }
.cover-rank-num {
font-family: 'Barlow', Arial, sans-serif;
font-size: 16px;
font-weight: 900;
color: #111;
line-height: 1;
}
.cover-rank-1 .cover-rank-num { color: #111; }
.cover-rank-wknd .cover-rank-num { color: #bbb; }
.cover-day-dowcol {
display: flex;
flex-direction: column;
gap: 1px;
}
.cover-day-dow {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.1em;
color: #111;
}
.cover-day-fulldate {
font-family: 'Barlow', Arial, sans-serif;
font-size: 12px;
font-weight: 400;
color: #555;
}
.cover-wknd-tag {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 7px;
color: #999;
border: 0.5px solid #ddd;
padding: 1px 4px;
margin-top: 2px;
display: inline-block;
letter-spacing: 0.5px;
}
.cover-day-gnss-col {
display: flex;
flex-direction: column;
gap: 2px;
}
.cover-day-gnss-window {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
font-weight: 700;
color: #111;
white-space: nowrap;
}
.cover-day-pdop-sats {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 8px;
color: #888;
}
.cover-day-wx-col {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 8px;
color: #666;
}
.cover-day-note {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 8px;
color: #888;
font-style: italic;
}
.cover-day-badge {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.08em;
padding: 4px 10px;
border-radius: 2px;
min-width: 72px;
text-align: center;
}
.cover-badge-go {
background: #111;
color: #fff;
}
.cover-badge-caution {
background: #fff;
color: #111;
border: 1.5px solid #111;
}
.cover-badge-nogo {
background: #fff;
color: #999;
border: 1.5px solid #ccc;
}
/* Bottom row */
.cover-bottom-row {
display: flex;
align-items: flex-end;
justify-content: space-between;
padding: 16px 52px 22px;
margin-top: 24px;
flex-shrink: 0;
}
.cover-qr-block {
display: flex;
align-items: center;
gap: 16px;
}
#cover-qr-canvas {
width: 80px;
height: 80px;
flex-shrink: 0;
}
#cover-qr-canvas canvas,
#cover-qr-canvas img {
width: 80px !important;
height: 80px !important;
}
.cover-qr-note {
display: flex;
flex-direction: column;
gap: 4px;
}
.cover-qr-line1 {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
font-weight: 700;
color: #111;
letter-spacing: 0.05em;
}
.cover-qr-line2 {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
color: #888;
}
.cover-report-label {
text-align: right;
}
.cover-report-type {
font-family: 'Barlow', Arial, sans-serif;
font-size: 13px;
font-weight: 700;
color: #111;
letter-spacing: 0.02em;
}
.cover-report-sub {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
color: #999;
margin-top: 3px;
}
.cover-report-accuracy {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 7px;
color: #bbb;
margin-top: 4px;
letter-spacing: 0.02em;
line-height: 1.5;
}
.cover-bottom-rule {
height: 4px;
background: #111;
width: 100%;
}
/* ── PRINT OVERRIDES FOR COVER ───────────────────────────────── */
@media print {
#report-cover {
display: block !important;
page-break-after: always !important;
}
.cover-page {
width: 100% !important;
min-height: 0 !important;
height: auto !important;
max-height: none !important;
overflow: visible !important;
page-break-after: always !important;
break-after: always !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
.cover-top-rule,
.cover-bottom-rule {
background: #111 !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
.cover-badge-go {
background: #111 !important;
color: #fff !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
/* Ranked cover row — print layout */
.cover-day-row {
grid-template-columns: 16pt 78pt 98pt 56pt 38pt 1fr auto !important;
padding: 5pt 0 !important;
gap: 5pt !important;
}
/* When AQI column has no data, collapse it */
.cover-day-row:has(.no-print) {
grid-template-columns: 16pt 78pt 98pt 56pt 0 1fr auto !important;
}
.cover-aqi {
padding: 2pt 4pt !important;
border-radius: 2pt !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
.cover-aqi-val { font-size: 8pt !important; }
.cover-aqi-cat { font-size: 5pt !important; }
.cover-rank-1 {
background: #f0f0f0 !important;
margin: 0 -8pt !important;
padding: 5pt 8pt !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
.cover-rank-num {
font-size: 13pt !important;
font-weight: 900 !important;
color: #111 !important;
line-height: 1 !important;
}
.cover-rank-wknd .cover-rank-num { color: #bbb !important; }
.cover-day-dow {
font-size: 7pt !important;
font-weight: 700 !important;
letter-spacing: 0.5pt !important;
color: #111 !important;
}
.cover-day-fulldate {
font-size: 8.5pt !important;
color: #333 !important;
}
.cover-wknd-tag {
font-size: 5pt !important;
color: #999 !important;
border-color: #ddd !important;
}
.cover-day-gnss-window {
font-size: 8pt !important;
font-weight: 700 !important;
color: #111 !important;
}
.cover-day-pdop-sats {
font-size: 6.5pt !important;
color: #666 !important;
}
.cover-day-wx-col {
font-size: 7pt !important;
color: #444 !important;
}
.cover-aqi.no-print { display: none !important; }
.cover-day-note {
font-size: 6.5pt !important;
color: #666 !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
}
.cover-day-badge {
font-size: 6.5pt !important;
padding: 2pt 5pt !important;
}
#cover-qr-canvas canvas,
#cover-qr-canvas img {
width: 80px !important;
height: 80px !important;
}
/* Force each day card onto its own page after the cover */
.day-card {
page-break-before: always !important;
page-break-inside: auto !important;
break-before: always !important;
}
/* ── COMPACT DAY LAYOUT — fit each day on one page ──── */
/* Day card structure */
.day-card-header { padding: 3pt 7pt !important; margin-bottom: 1pt !important; }
.day-num { font-size: 7pt !important; padding: 1.5pt 4pt !important; }
.day-title { font-size: 11pt !important; }
.day-card-body { padding: 0 5pt 1pt 5pt !important; }
/* Stat badges row */
.day-stats-row { gap: 2pt !important; margin-bottom: 2pt !important; flex-wrap: wrap !important; }
.day-stat { padding: 1.5pt 4pt !important; font-size: 6pt !important; }
/* wx pills row — shrink and wrap */
.wx-pills { gap: 3pt !important; margin-bottom: 3pt !important; flex-wrap: wrap !important; }
.wx-pill { padding: 1.5pt 5pt !important; font-size: 6pt !important; }
.wx-pill span { font-size: 6pt !important; }
/* GNSS summary line above hourly table */
[style*="Avg PDOP"] { font-size: 6.5pt !important; margin-bottom: 2pt !important; }
/* Hourly DOP block — tighten rows significantly */
.gnss-hourly-block { margin-bottom: 3pt !important; padding: 4pt 6pt !important; }
.ghb-header { padding: 0 0 3pt 0 !important; margin-bottom: 2pt !important; }
.ghb-header * { font-size: 6pt !important; }
.ghb-col-heads { padding: 0 0 1pt 0 !important; margin-bottom: 1pt !important; }
.ghb-col-heads * { font-size: 5.5pt !important; }
/* Override inline margin-bottom:3px on each row */
.ghb-row { margin-bottom: 0 !important; padding-top: 0 !important; padding-bottom: 0 !important; }
/* Override inline height on bar track */
.ghb-bar-track { height: 10px !important; min-height: 0 !important; background: #d0d0d0 !important; }
.ghb-bar-fill { height: 10px !important; opacity: 1 !important; background: #444 !important; }
.ghb-pdop-val { line-height: 10px !important; font-size: 6pt !important; color: #000 !important; font-weight: 700 !important; }
.ghb-time { font-size: 6pt !important; color: #333 !important; }
.ghb-sats { font-size: 6pt !important; color: #333 !important; font-weight: 600 !important; }
.ghb-rating { font-size: 5.5pt !important; color: #000 !important; font-weight: 700 !important; }
/* Weather callout box */
.weather-callout { padding: 4pt 6pt !important; margin: 2pt 0 !important; }
.weather-callout * { font-size: 6.5pt !important; }
/* Drone wind box — shrink hard, allow break if needed */
.drone-wind-box {
padding: 4pt 6pt !important;
margin-top: 2pt !important;
margin-bottom: 2pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
}
.drone-wind-box > * { font-size: 6pt !important; line-height: 1.25 !important; }
/* Wind bar rows — tighter */
.wind-bar-row {
margin-bottom: 0 !important;
min-height: 0 !important;
padding: 0 !important;
}
.wind-bar-label { font-size: 5.5pt !important; min-width: 22pt !important; width: 22pt !important; }
.wind-bar-track { height: 8px !important; }
.wind-bar-fill { height: 8px !important; }
.wind-threshold-line { height: 8px !important; }
/* Drone wind bar track (inline-styled divs) — override via class */
.wbar-track { height: 10px !important; }
.wbar-wind,
.wbar-gust { top: 1px !important; height: 8px !important; }
.wbar-label { font-size: 5.5pt !important; line-height: 10px !important; }
/* Drone wind bar wrapper rows use inline margin-bottom:4px — shrink via container */
.drone-wind-box > div > div { margin-bottom: 0 !important; }
.wind-val { font-size: 5.5pt !important; min-width: 36pt !important; }
.wind-dir-label { font-size: 5.5pt !important; width: 18pt !important; }
.wbar-row { min-height: 12px !important; height: 12px !important; }
/* Best window callout */
.best-window { padding: 4pt 6pt !important; margin-top: 2pt !important; }
.best-window-time { font-size: 14pt !important; line-height: 1.1 !important; }
.best-window-label { font-size: 5.5pt !important; margin-bottom: 1.5pt !important; }
.best-window-reason { font-size: 6pt !important; margin-top: 1.5pt !important; }
/* ── END COMPACT RULES ───────────────────────────── */
/* Iono + DOP on page 2, right after cover */
#iono-panel {
page-break-inside: avoid !important;
}
#ranking-page { display: none !important; }
#dop-section {
page-break-inside: avoid !important;
page-break-before: avoid !important;
break-before: avoid !important;
}
/* Expand all day cards for print */
.day-card-body {
display: block !important;
}
.day-card-chevron { display: none !important; }
}
/* ═══════════════════════════════════════════════════════
RANKING PAGE — screen styles
═══════════════════════════════════════════════════════ */
#ranking-page {
background: var(--bg2);
border: 1px solid var(--border);
padding: 20px 24px;
margin-bottom: 14px;
}
#ranking-page .ranking-page-header {
display: flex;
align-items: baseline;
gap: 12px;
margin-bottom: 6px;
padding-bottom: 8px;
border-bottom: 2px solid var(--amber);
}
#ranking-page .ranking-page-title {
font-family: 'Barlow', Arial, sans-serif;
font-size: 20px;
font-weight: 900;
color: var(--text);
letter-spacing: -0.3px;
text-transform: uppercase;
}
#ranking-page .ranking-page-sub {
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
color: var(--text-dim);
text-transform: uppercase;
letter-spacing: 1px;
}
#ranking-page .ranking-meta-note {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-muted);
font-style: italic;
margin-bottom: 12px;
}
#ranking-page .ranking-table {
width: 100%;
border-collapse: collapse;
font-family: 'IBM Plex Mono', monospace;
font-size: 11px;
}
#ranking-page .ranking-table th {
font-size: 9px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--text-dim);
padding: 6px 8px;
text-align: left;
border-bottom: 1px solid var(--border-bright);
background: var(--bg3);
vertical-align: bottom;
}
#ranking-page .rh-sub { font-size: 8px; color: var(--text-muted); font-weight: 400; display: block; }
#ranking-page .rank-row td {
padding: 8px 8px;
border-bottom: 1px solid var(--border);
vertical-align: top;
color: var(--text);
}
#ranking-page .rank-row-top:first-child td { background: rgba(245,158,11,0.04); }
#ranking-page .rank-row-low td { opacity: 0.6; }
#ranking-page .rank-n {
font-family: 'Barlow', Arial, sans-serif;
font-size: 22px;
font-weight: 900;
color: var(--amber);
line-height: 1;
width: 28px;
padding-top: 4px;
}
#ranking-page .rank-row-low .rank-n { color: var(--text-muted); }
#ranking-page .rank-date {
font-family: 'Barlow', Arial, sans-serif;
font-size: 13px;
font-weight: 700;
color: var(--text);
white-space: nowrap;
}
#ranking-page .rank-dow {
display: block;
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
color: var(--text-muted);
margin-top: 2px;
}
#ranking-page .rank-weekend-tag {
display: inline-block;
font-family: 'IBM Plex Mono', monospace;
font-size: 8px;
color: var(--amber-dim);
border: 1px solid var(--border);
padding: 1px 4px;
margin-top: 3px;
letter-spacing: 0.5px;
}
#ranking-page .rank-pdop {
font-family: 'Barlow', Arial, sans-serif;
font-size: 15px;
font-weight: 700;
color: var(--text);
white-space: nowrap;
}
#ranking-page .rank-sats {
font-family: 'IBM Plex Mono', monospace;
font-size: 11px;
color: var(--text-dim);
}
#ranking-page .rank-wx {
font-size: 11px;
color: var(--text-dim);
white-space: nowrap;
}
#ranking-page .rank-badge { font-size: 9px; font-weight: 700; letter-spacing: 1px; padding: 3px 7px; white-space: nowrap; }
#ranking-page .rank-go { background: var(--amber); color: #000; }
#ranking-page .rank-caution { background: transparent; color: var(--amber); border: 1px solid var(--amber); }
#ranking-page .rank-nogo { background: transparent; color: var(--text-muted); border: 1px solid var(--border); }
#ranking-page .rank-notes {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-dim);
font-style: italic;
line-height: 1.5;
}
.control-qr { display:inline-block; vertical-align:top; }
.control-qr img, .control-qr canvas { width:36px !important; height:36px !important; }
.ctrl-link { display:block; font-family:'IBM Plex Mono',monospace; font-size:7px; color:var(--amber); text-decoration:none; margin-top:2px; opacity:0.8; }
.ctrl-link:hover { opacity:1; text-decoration:underline; }
@media print { .ctrl-link { color:#555 !important; font-size:6pt !important; } }
/* ═══════════════════════════════════════════════════════
FIELD RESOURCE LINKS — screen + print
═══════════════════════════════════════════════════════ */
.resource-section {
margin-top: 32px;
border-top: 1px solid var(--border);
padding-top: 24px;
}
.resource-section-title {
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
font-weight: 600;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--text-dim);
margin-bottom: 20px;
}
.resource-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 24px;
}
.resource-category {
display: flex;
flex-direction: column;
gap: 8px;
}
.resource-cat-title {
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--amber);
padding-bottom: 6px;
border-bottom: 1px solid var(--border);
margin-bottom: 2px;
}
.resource-link {
display: flex;
flex-direction: column;
gap: 2px;
}
.resource-link a {
font-family: 'Barlow', sans-serif;
font-size: 13px;
font-weight: 600;
color: var(--text);
text-decoration: none;
transition: color 0.15s;
}
.resource-link a:hover {
color: var(--amber);
}
.resource-link-desc {
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
color: var(--text-dim);
line-height: 1.4;
}
.resource-verified {
font-family: 'IBM Plex Mono', monospace;
font-size: 8px;
color: var(--text-dim);
margin-top: 20px;
padding-top: 12px;
border-top: 1px solid var(--border);
opacity: 0.6;
}
/* ── PRINT styles for resource section ── */
@media print {
.resource-section {
page-break-before: always !important;
border-top: 2pt solid #111 !important;
padding-top: 12pt !important;
margin-top: 0 !important;
}
.resource-section-title {
font-family: 'Space Mono', monospace !important;
font-size: 8pt !important;
color: #666 !important;
letter-spacing: 0.2em !important;
margin-bottom: 16pt !important;
page-break-after: avoid !important;
}
.resource-grid {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
gap: 10pt 20pt !important;
}
.resource-cat-title {
font-family: 'Space Mono', monospace !important;
font-size: 7pt !important;
color: #111 !important;
border-bottom: 0.5pt solid #ccc !important;
padding-bottom: 4pt !important;
letter-spacing: 0.15em !important;
}
.resource-link a {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 9.5pt !important;
font-weight: 700 !important;
color: #000 !important;
text-decoration: none !important;
}
.resource-link-desc {
font-family: 'Space Mono', monospace !important;
font-size: 6.5pt !important;
color: #444 !important;
font-weight: 500 !important;
}
/* Print the URL after each link name so it's usable on paper */
.resource-link a::after {
content: " — " attr(href) !important;
font-family: 'Space Mono', monospace !important;
font-size: 6pt !important;
color: #999 !important;
font-weight: 400 !important;
}
.resource-verified {
font-family: 'Space Mono', monospace !important;
font-size: 6.5pt !important;
color: #aaa !important;
border-top: 0.5pt solid #eee !important;
page-break-before: avoid !important;
page-break-inside: avoid !important;
page-break-after: avoid !important;
break-after: avoid !important;
}
.resource-section {
page-break-inside: avoid !important;
}
}
/* ── DRONE WIND BARS — screen colors ── */
.wbar-track {
background: #1e2535;
border-radius: 3px;
overflow: hidden;
}
.wbar-gust {
background: #2a3348;
}
.wbar-go { background: #00c853; }
.wbar-caution { background: #ffd600; }
.wbar-highrisk{ background: #ff6d00; }
.wbar-grounded{ background: #d50000; }
.wbar-label { color: #fff; font-size: 10px; }
/* Drone wind box screen styles */
.drone-wind-box {
background: var(--bg2);
border: 1px solid var(--border);
border-left: 3px solid var(--amber);
border-radius: 6px;
padding: 14px 16px;
margin-top: 12px;
}
/* ── STATIC BASE WINDOW CARD ── */
.static-window-card {
background: var(--bg2);
border: 1px solid var(--border);
border-left: 4px solid var(--amber);
padding: 20px 24px;
margin-bottom: 14px;
}
.static-window-card-title {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
font-weight: 600;
color: var(--amber);
letter-spacing: 0.28em;
text-transform: uppercase;
margin-bottom: 14px;
display: flex;
align-items: center;
gap: 10px;
}
.static-window-card-title::after {
content: '';
flex: 1;
height: 1px;
background: var(--border);
}
.static-window-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
.static-window-primary {
background: var(--bg3);
border: 1px solid var(--border-hi);
border-top: 3px solid var(--amber);
padding: 14px 16px;
}
.static-window-backup {
background: var(--bg3);
border: 1px solid var(--border);
padding: 14px 16px;
}
.static-window-rec-label {
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--amber);
margin-bottom: 6px;
padding-bottom: 6px;
border-bottom: 1px solid var(--border);
}
.static-window-rec-label-alt {
color: var(--text-dim);
}
.static-window-date {
font-family: 'IBM Plex Mono', monospace;
font-size: 11px;
color: var(--text-dim);
margin-bottom: 4px;
}
.static-window-time {
font-family: 'IBM Plex Mono', monospace;
font-size: 22px;
font-weight: 600;
color: var(--amber);
letter-spacing: 0.05em;
line-height: 1.1;
margin-bottom: 6px;
}
.static-window-time.backup {
font-size: 16px;
color: var(--text-dim);
}
.static-window-meta {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-dim);
margin-bottom: 4px;
}
.static-window-reason {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-dim);
font-style: italic;
margin-top: 4px;
}
.drone-wind-title {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.15em;
color: var(--amber);
margin-bottom: 10px;
text-transform: uppercase;
}
.wbar-row {
display: grid;
grid-template-columns: 52px 1fr 48px;
align-items: center;
gap: 8px;
margin-bottom: 4px;
}
.wbar-hour {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-dim);
text-align: right;
}
.wbar-dir {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-dim);
text-align: right;
}
/* Weather summary screen */
.weather-summary-box {
background: var(--bg2);
border: 1px solid var(--border);
border-radius: 6px;
padding: 14px 16px;
margin-bottom: 10px;
}
/* Field warnings screen */
.field-warnings {
background: rgba(255,109,0,0.08);
border: 1px solid rgba(255,109,0,0.3);
border-left: 3px solid #ff6d00;
border-radius: 6px;
padding: 12px 14px;
margin-bottom: 10px;
}
.fw-title {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
font-weight: 700;
color: #ff6d00;
margin-bottom: 6px;
letter-spacing: 0.1em;
}
.fw-item {
font-family: 'Barlow', sans-serif;
font-size: 13px;
color: var(--text);
padding: 3px 0;
}
</style>
</head>
<body>
<div id="app">
<div class="hdr">
<div class="hdr-logo">
<span class="hdr-title">SKYGRID</span>
<span class="hdr-sub">GNSS Survey Planning System</span>
</div>
<span class="hdr-v">v2.9</span>
</div>
<div class="mode-toggle">
<button class="mode-btn active" onclick="switchMode('auto')" id="btn-auto">⚡ Auto Report <span class="new-badge">NEW</span></button>
<button class="mode-btn" onclick="switchMode('manual')" id="btn-manual">📊 Upload Charts</button>
<button class="mode-btn" onclick="switchMode('batch')" id="btn-batch">📋 Batch</button>
</div>
<!-- ═══════════════════════════════════════
AUTO MODE
═══════════════════════════════════════ -->
<div class="mode-panel active" id="auto-panel">
<div class="sec">
<div class="sec-title">Job Information</div>
<div class="form-grid">
<div class="form-group">
<label>Company Name</label>
<input type="text" id="a-company" placeholder="Survey Co. Ltd" oninput="syncJobInfo('company',this.value)">
</div>
<div class="form-group">
<label>Job Name / Number</label>
<input type="text" id="a-jobname" placeholder="Project Alpha 2024" oninput="syncJobInfo('jobname',this.value)">
</div>
<div class="form-group" style="grid-column:1/-1">
<label>Site Description</label>
<textarea id="a-sitedesc" rows="2" placeholder="Urban corridor, open sky, known obstructions…" oninput="syncJobInfo('sitedesc',this.value)"></textarea>
</div>
</div>
</div>
<div class="sec">
<div class="sec-title">Location</div>
<div class="loc-row" style="margin-bottom:10px">
<div class="form-group addr-wrap" style="flex:1">
<label>Address Search</label>
<input type="text" id="a-address" placeholder="123 Main St, City, State…" autocomplete="off" oninput="debounceGeocode(this.value)">
<div class="addr-suggestions" id="addr-suggestions" style="display:none"></div>
</div>
<button class="loc-btn" onclick="geocodeAddress()">Search</button>
</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-muted);text-align:center;margin:10px 0;letter-spacing:.15em">— OR ENTER COORDINATES —</div>
<div class="form-grid">
<div class="form-group">
<label>Latitude (decimal)</label>
<input type="number" id="a-lat" placeholder="39.7392" step="0.0001" min="-90" max="90">
</div>
<div class="form-group">
<label>Longitude (decimal)</label>
<input type="number" id="a-lng" placeholder="-104.9903" step="0.0001" min="-180" max="180">
</div>
</div>
<div id="loc-confirmed" style="display:none;margin-top:10px;font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--green);letter-spacing:.1em">✓ <span id="loc-confirmed-text"></span></div>
</div>
<div class="sec">
<div class="sec-title">Analysis Window</div>
<div style="display:flex;align-items:center;gap:24px;flex-wrap:wrap">
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase;margin-bottom:8px">Number of Days</div>
<div class="days-sel">
<button class="day-opt active" onclick="selectDays(1,this)">1 Day</button>
<button class="day-opt" onclick="selectDays(3,this)">3 Days</button>
<button class="day-opt" onclick="selectDays(7,this)">7 Days</button>
</div>
</div>
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase;margin-bottom:8px">Start Date</div>
<div style="display:flex;align-items:center;gap:10px">
<input type="date" id="a-startdate"
style="background:var(--bg2);border:1px solid var(--border);color:var(--text);font-family:'IBM Plex Mono',monospace;font-size:12px;padding:8px 12px;border-radius:4px;outline:none;cursor:pointer"
oninput="updateStartDateLabel()">
<span id="start-date-label" style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim)">defaults to today</span>
</div>
</div>
</div>
<div class="form-grid" style="margin-top:14px">
<div class="form-group" style="grid-column:1/-1">
<label>Anthropic API Key</label>
<input type="password" id="a-apikey" placeholder="sk-ant-api03-…" oninput="saveApiKey(this.value)">
</div>
<div class="form-group" style="grid-column:1/-1">
<label>AirNow API Key <span style="font-weight:400;opacity:0.6;font-size:10px">— optional · free at airnowapi.org · enables AQI on cover</span></label>
<input type="password" id="a-airnow-key" placeholder="AirNow API key…" oninput="ls('airnow_key', this.value.trim())" style="font-family:'IBM Plex Mono',monospace;font-size:12px">
</div>
</div>
</div>
<div class="status-bar">
<div class="status-item"><span class="dot idle" id="dot-gnss"></span>GNSS / DOP</div>
<div class="status-item"><span class="dot idle" id="dot-iono"></span>Ionosphere</div>
<div class="status-item"><span class="dot idle" id="dot-wx"></span>Weather</div>
<div class="status-item"><span class="dot idle" id="dot-ai"></span>AI Analysis</div>
</div>
<button class="run-btn" id="run-btn" onclick="analyzeAuto()">GENERATE REPORT</button>
<div class="progress-box" id="progress-box">
<div class="sec-title">Processing</div>
<div class="progress-step idle" id="ps-gnss">Fetching GNSS almanac (gnssplanning.com)…</div>
<div class="progress-step idle" id="ps-dop">Computing DOP geometry (per-day independent, spike detection)…</div>
<div class="progress-step idle" id="ps-iono">Fetching ionospheric Kp + TEC (NOAA SWPC)…</div>
<div class="progress-step idle" id="ps-flux">Fetching solar flux F10.7 (NOAA)…</div>
<div class="progress-step idle" id="ps-wx">Fetching weather + hourly wind (Open-Meteo)…</div>
<div class="progress-step idle" id="ps-aqi">Fetching air quality index (AirNow)…</div>
<div class="progress-step idle" id="ps-faa">Checking FAA airspace + TFRs…</div>
<div class="progress-step idle" id="ps-fire">Checking wildfire proximity (NIFC)…</div>
<div class="progress-step idle" id="ps-nanu">Checking GPS satellite health (NAVCEN)…</div>
<div class="progress-step idle" id="ps-landcover">Checking land cover + multipath risk (NLCD)…</div>
<div class="progress-step idle" id="ps-ai">Sending to Claude AI for analysis…</div>
</div>
<!-- ═══ PRINT COVER SHEET (hidden on screen, shown when printing ≥3 days) ═══ -->
<div id="report-cover" style="display:none">
<div class="cover-page">
<!-- TOP RULE -->
<div class="cover-top-rule"></div>
<!-- LOGO BLOCK -->
<div class="cover-logo-block">
<div class="cover-globe">🌐</div>
<div class="cover-wordmark">SKYGRID</div>
<div class="cover-tagline">GNSS SURVEY PLANNING SYSTEM</div>
</div>
<!-- DIVIDER -->
<div class="cover-rule"></div>
<!-- JOB INFO -->
<div class="cover-job-block">
<div class="cover-job-company" id="cover-company"></div>
<div class="cover-job-name" id="cover-jobname"></div>
<div class="cover-job-meta">
<span id="cover-location"></span>
<span class="cover-meta-sep">·</span>
<span id="cover-coords"></span>
<span id="cover-elev-sep" class="cover-meta-sep" style="display:none">·</span>
<span id="cover-elev" style="display:none"></span>
<span id="cover-decl-sep" class="cover-meta-sep" style="display:none">·</span>
<span id="cover-decl" style="display:none"></span>
<span class="cover-meta-sep">·</span>
<span id="cover-gendate"></span>
</div>
<div class="cover-job-meta" id="cover-recorder-row" style="display:none;margin-top:4px">
<span style="color:#aaa;min-width:70px;flex-shrink:0">Recorder:</span>
<span id="cover-recorder-text" style="color:#888"></span>
</div>
<div class="cover-job-meta" id="cover-assessor-row" style="display:none;margin-top:2px">
<span style="color:#aaa;min-width:70px;flex-shrink:0">Assessor:</span>
<span id="cover-assessor-text" style="color:#888"></span>
</div>
<div class="cover-job-meta" id="cover-elev-temp-row" style="display:none;margin-top:2px">
<span style="color:#aaa;min-width:70px;flex-shrink:0">Weather:</span>
<span id="cover-elev-temp-text" style="color:#888"></span>
</div>
</div>
<!-- CORS ELEVATION DELTA -->
<div id="cover-elev-delta-row" style="display:none;margin:8px 0 2px 0;padding:6px 12px;border-radius:6px;font-size:0.78rem;align-items:center;gap:8px">
<span id="cover-elev-delta-icon" style="font-size:1rem;flex-shrink:0"></span>
<span id="cover-elev-delta-text" style="color:#aaa;line-height:1.4"></span>
</div>
<!-- SECTION LABEL -->
<div class="cover-section-label" id="cover-section-label">7-DAY FIELD SUMMARY</div>
<!-- SUMMARY TABLE -->
<div class="cover-summary-table" id="cover-summary-table">
<!-- Populated by JS -->
</div>
<!-- BOTTOM ROW: QR + note -->
<div class="cover-bottom-row">
<div class="cover-qr-block">
<div id="cover-qr-canvas"></div>
<div class="cover-qr-note">
<div class="cover-qr-line1">Scan for ranked GNSS windows</div>
<div class="cover-qr-line2">Best days, times & PDOP on your phone</div>
</div>
</div>
<div class="cover-report-label">
<div class="cover-report-type" id="cover-report-type"></div>
<div class="cover-report-sub">Field Planning Report</div>
<div class="cover-report-accuracy">GNSS geometry valid within 50-mile radius · 15° elevation mask · Weather at entered location</div>
<div class="cover-report-accuracy" style="margin-top:3px">Air quality data: EPA AirNow · Preliminary data, subject to change · Not for regulatory use</div>
</div>
</div>
<!-- BOTTOM RULE -->
<div class="cover-bottom-rule"></div>
</div>
</div>
<div class="results-area" id="auto-results">
<div id="ranking-page" style="display:none"></div>
<div class="site-signal-header" id="site-signal-header" style="display:none">
<div class="site-signal-title">SITE & SIGNAL REPORT</div>
<div class="site-signal-facts" id="site-signal-facts"></div>
</div>
<div class="iono-panel" id="iono-panel"></div>
<div class="result-section" id="dop-section" style="display:none">
<div style="display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap">
<h3 style="margin:0">GNSS / DOP Summary</h3>
<div class="mask-selector-wrap">
<span class="mask-label">Elevation Mask</span>
<div class="mask-btn-group">
<button class="mask-btn" data-mask="10" onclick="setElevMask(10)">10°</button>
<button class="mask-btn mask-btn-active" data-mask="15" onclick="setElevMask(15)">15°</button>
<button class="mask-btn" data-mask="20" onclick="setElevMask(20)">20°</button>
<button class="mask-btn" data-mask="25" onclick="setElevMask(25)">25°</button>
</div>
<span class="mask-hint" id="mask-hint">Standard field practice</span>
</div>
</div>
<div class="dop-table-wrap" id="dop-table-wrap"></div>
</div>
<div id="static-window-card" style="display:none"></div>
<div id="wildfire-card" style="display:none"></div>
<div id="nanu-card" style="display:none"></div>
<div id="landcover-card" style="display:none"></div>
<div id="week-grid-area"></div>
<div id="ai-summary-card"></div>
<div id="county-offices-block" style="display:none;background:var(--bg2);border:1px solid var(--border);padding:20px 24px;margin-bottom:14px">
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:600;color:var(--amber);letter-spacing:.28em;text-transform:uppercase;margin-bottom:14px;display:flex;align-items:center;gap:10px">
County Recording Offices
<span style="flex:1;height:1px;background:var(--border);display:block"></span>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px">
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase;margin-bottom:6px">Recorder / Register of Deeds</div>
<div id="screen-recorder-name" style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--text);margin-bottom:3px"></div>
<div id="screen-recorder-addr" style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim)"></div>
</div>
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase;margin-bottom:6px">Assessor / Tax Office</div>
<div id="screen-assessor-name" style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--text);margin-bottom:3px"></div>
<div id="screen-assessor-addr" style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim)"></div>
</div>
</div>
</div>
<div class="export-row">
<button class="export-btn" onclick="window.print()">🖨 Print / PDF</button>
<button class="export-btn" onclick="exportEmailAuto()">✉ Copy Email Text</button>
</div>
</div>
</div>
<!-- ═══════════════════════════════════════
MANUAL MODE
═══════════════════════════════════════ -->
<div class="mode-panel" id="manual-panel">
<div class="sec">
<div class="sec-title">Job Information</div>
<div class="form-grid">
<div class="form-group">
<label>Company Name</label>
<input type="text" id="m-company" placeholder="Survey Co. Ltd" oninput="syncJobInfo('company',this.value)">
</div>
<div class="form-group">
<label>Job Name / Number</label>
<input type="text" id="m-jobname" placeholder="Project Alpha 2024" oninput="syncJobInfo('jobname',this.value)">
</div>
<div class="form-group" style="grid-column:1/-1">
<label>Site Description</label>
<textarea id="m-sitedesc" rows="2" placeholder="Urban corridor, open sky, known obstructions…" oninput="syncJobInfo('sitedesc',this.value)"></textarea>
</div>
</div>
</div>
<div class="sec">
<div class="sec-title">Job Location</div>
<div class="loc-row" style="margin-bottom:10px">
<div class="form-group" style="flex:1">
<label>Address</label>
<input type="text" id="m-address" placeholder="123 Main St, City, State…">
</div>
<button class="loc-btn" onclick="geocodeManual()">Search</button>
</div>
<div class="form-grid">
<div class="form-group"><label>Latitude</label><input type="number" id="m-lat" placeholder="39.7392" step="0.0001"></div>
<div class="form-group"><label>Longitude</label><input type="number" id="m-lng" placeholder="-104.9903" step="0.0001"></div>
</div>
</div>
<div class="sec">
<div class="sec-title">Trimble GNSS Planning Charts</div>
<div class="upload-grid">
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);letter-spacing:.15em;text-transform:uppercase;margin-bottom:8px">DOP Chart</div>
<div class="upload-zone" onclick="document.getElementById('dop-upload').click()" id="dop-zone">
<div class="upload-zone-title">DOP / Satellite Chart</div>
<div class="upload-zone-sub">Click to upload PNG/JPG screenshot</div>
<img class="img-preview" id="dop-preview" style="display:none">
</div>
<input type="file" id="dop-upload" accept="image/*" style="display:none" onchange="previewImage(this,'dop-preview','dop-zone')">
</div>
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);letter-spacing:.15em;text-transform:uppercase;margin-bottom:8px">Iono Chart</div>
<div class="upload-zone" onclick="document.getElementById('iono-upload').click()" id="iono-zone">
<div class="upload-zone-title">Ionospheric Chart</div>
<div class="upload-zone-sub">Click to upload PNG/JPG screenshot</div>
<img class="img-preview" id="iono-preview" style="display:none">
</div>
<input type="file" id="iono-upload" accept="image/*" style="display:none" onchange="previewImage(this,'iono-preview','iono-zone')">
</div>
</div>
</div>
<div class="sec">
<div class="sec-title">Survey Dates</div>
<div id="date-rows"></div>
<button class="add-date-btn" onclick="addDateRow()">+ Add Date</button>
</div>
<div class="sec">
<div class="sec-title">API Configuration</div>
<div class="form-group">
<label>Anthropic API Key</label>
<input type="password" id="m-apikey" placeholder="sk-ant-api03-…" oninput="saveApiKey(this.value)">
</div>
</div>
<button class="manual-analyze-btn" id="manual-run-btn" onclick="analyzeManual()">📊 ANALYZE CHARTS</button>
<div class="results-area" id="manual-results">
<div id="manual-result-area"></div>
<div class="export-row">
<button class="export-btn" onclick="window.print()">🖨 Print / PDF</button>
<button class="export-btn" onclick="exportEmailManual()">✉ Copy Email Text</button>
</div>
</div>
</div>
<!-- ═══════════════════════════════════════
BATCH MODE
═══════════════════════════════════════ -->
<div class="mode-panel" id="batch-panel">
<div class="sec">
<div class="sec-title">Batch Report Generator</div>
<p style="color:var(--text-dim);font-size:13px;margin-bottom:16px">
Upload a CSV to generate individual PDF reports for multiple clients. Iono data (Kp, TEC) is fetched once and shared across all jobs. GNSS and weather are fetched per location.
</p>
<!-- API Key -->
<div class="form-grid" style="margin-bottom:16px">
<div class="form-group">
<label class="form-label">Anthropic API Key</label>
<input type="password" id="b-apikey" placeholder="sk-ant-api03-…" oninput="saveBatchApiKey(this.value)" style="width:100%">
</div>
<div class="form-group">
<label class="form-label">Survey Start Date</label>
<input type="date" id="b-startdate" style="width:100%">
</div>
</div>
<!-- CSV Drop Zone -->
<div id="batch-drop" onclick="document.getElementById('batch-file').click()"
style="border:2px dashed var(--border);border-radius:8px;padding:32px;text-align:center;cursor:pointer;background:var(--bg2);transition:border-color .2s;margin-bottom:16px">
<div style="font-size:28px;margin-bottom:8px">📄</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--amber);letter-spacing:.1em">DROP CSV HERE OR CLICK TO BROWSE</div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px">company, address · zip works too</div>
</div>
<input type="file" id="batch-file" accept=".csv" style="display:none" onchange="loadBatchCSV(this)">
<!-- Template download + preview -->
<div style="display:flex;gap:10px;margin-bottom:16px;flex-wrap:wrap">
<button class="export-btn" onclick="downloadBatchTemplate()" style="font-size:11px">⬇ Download CSV Template</button>
<button class="export-btn" onclick="clearBatch()" style="font-size:11px">✕ Clear</button>
</div>
<!-- Client table preview -->
<div id="batch-preview" style="display:none;margin-bottom:20px">
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--amber);letter-spacing:.15em;margin-bottom:8px">LOADED CLIENTS</div>
<div style="overflow-x:auto">
<table class="dop-table" id="batch-table">
<thead><tr>
<th>#</th><th>Company</th><th>Address / Location</th><th>Geocode</th><th>Status</th>
</tr></thead>
<tbody id="batch-tbody"></tbody>
</table>
</div>
</div>
<!-- Geocode status -->
<div id="batch-geocode-status" style="display:none;font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim);margin-bottom:10px"></div>
<!-- Run button -->
<button class="analyze-btn" id="batch-run-btn" onclick="runBatch()" style="display:none;width:100%;margin-top:8px">
⚡ RUN BATCH — GENERATE ALL REPORTS
</button>
<!-- Progress area -->
<div id="batch-progress" style="display:none;margin-top:20px">
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--amber);letter-spacing:.15em;margin-bottom:12px">BATCH PROGRESS</div>
<div id="batch-progress-list" style="display:flex;flex-direction:column;gap:8px"></div>
<div id="batch-summary" style="display:none;margin-top:16px;padding:14px 16px;background:var(--bg3);border:1px solid var(--border);border-radius:6px;font-family:'IBM Plex Mono',monospace;font-size:12px"></div>
</div>
</div>
</div>
<!-- ═══════════════════════════════════════════════════════════
NEARBY CONTROL POINTS PAGE — prints before resource links
═══════════════════════════════════════════════════════════ -->
<div id="control-page" style="display:none">
</div>
<!-- ═══════════════════════════════════════════════════════════
SITE CONDITIONS PAGE — stream gauges, lakes, soil (future)
═══════════════════════════════════════════════════════════ -->
<div id="site-conditions-page" style="display:none">
</div>
<!-- ═══════════════════════════════════════════════════════════
FIELD RESOURCE LINKS — appears in both modes, prints at end
═══════════════════════════════════════════════════════════ -->
<div class="resource-section" id="resource-links">
<div class="resource-section-title">⚡ Field Resource Links</div>
<div class="resource-grid">
<!-- PRE-MISSION PLANNING -->
<div class="resource-category">
<div class="resource-cat-title">Pre-Mission Planning</div>
<div class="resource-link">
<a href="https://trimblegnssplanningonline.com" target="_blank" rel="noopener">Trimble GNSS Planning Online</a>
<div class="resource-link-desc">Satellite visibility, DOP charts, sky plots</div>
</div>
<div class="resource-link">
<a href="https://www.faa.gov/uas/recreational_flyers/where_can_i_fly/b4ufly" target="_blank" rel="noopener">FAA B4UFLY</a>
<div class="resource-link-desc">Drone airspace authorization, TFRs, restricted areas</div>
</div>
<div class="resource-link">
<a href="https://www.aloft.ai" target="_blank" rel="noopener">Aloft (Kittyhawk)</a>
<div class="resource-link-desc">Field-friendly drone airspace map and LAANC authorization</div>
</div>
<div class="resource-link">
<a href="https://www.swpc.noaa.gov/products/planetary-k-index" target="_blank" rel="noopener">NOAA Space Weather — Live Kp</a>
<div class="resource-link-desc">Real-time Kp index, geomagnetic storm alerts</div>
</div>
</div>
<!-- BASE STATION & NETWORK -->
<div class="resource-category">
<div class="resource-cat-title">Base Station & Network</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/CORS/cors-data.shtml" target="_blank" rel="noopener">NOAA CORS Network</a>
<div class="resource-link-desc">Continuously operating reference stations, data download</div>
</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/CORS/GoogleMap/CORSmap.shtml" target="_blank" rel="noopener">NGS CORS Station Map</a>
<div class="resource-link-desc">Interactive map of all CORS stations with status</div>
</div>
<div class="resource-link">
<a href="https://www.igs.org/network" target="_blank" rel="noopener">IGS Station Monitor</a>
<div class="resource-link-desc">International GNSS Service — global base station health</div>
</div>
</div>
<!-- POST-PROCESSING -->
<div class="resource-category">
<div class="resource-cat-title">Post-Processing</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/OPUS/index.jsp" target="_blank" rel="noopener">NGS OPUS</a>
<div class="resource-link-desc">Online Positioning User Service — static GNSS processing</div>
</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/OPUSI/index.jsp" target="_blank" rel="noopener">NGS OPUS-RS</a>
<div class="resource-link-desc">Rapid static processing — sessions as short as 15 minutes</div>
</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/CORS/cors-data.shtml" target="_blank" rel="noopener">CORS Data Download</a>
<div class="resource-link-desc">Raw RINEX observation files from CORS stations</div>
</div>
</div>
<!-- REFERENCE & CALCULATIONS -->
<div class="resource-category">
<div class="resource-cat-title">Reference & Calculations</div>
<div class="resource-link">
<a href="https://www.ngs.noaa.gov/cgi-bin/datasheet.prl" target="_blank" rel="noopener">NGS Datasheets</a>
<div class="resource-link-desc">Benchmarks, control points, passive monuments</div>
</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/NCAT/" target="_blank" rel="noopener">NGS Coordinate Conversion (NCAT)</a>
<div class="resource-link-desc">NADCON5, datum transforms, state plane conversions</div>
</div>
<div class="resource-link">
<a href="https://www.ngdc.noaa.gov/geomag/calculators/magcalc.shtml" target="_blank" rel="noopener">NOAA Magnetic Declination</a>
<div class="resource-link-desc">Declination calculator for any location and date</div>
</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/GEOID/" target="_blank" rel="noopener">NGS Geoid Models</a>
<div class="resource-link-desc">GEOID18 and current model downloads, GEOID calculator</div>
</div>
</div>
<!-- FEMA & FLOOD -->
<div class="resource-category">
<div class="resource-cat-title">FEMA & Flood</div>
<div class="resource-link">
<a href="https://msc.fema.gov/portal/home" target="_blank" rel="noopener">FEMA Flood Map Service Center</a>
<div class="resource-link-desc">FIRM panels, flood zone lookup by address or coordinates</div>
</div>
<div class="resource-link">
<a href="https://www.fema.gov/flood-insurance/work-with-nfip/elevation-certificate" target="_blank" rel="noopener">FEMA Elevation Certificate</a>
<div class="resource-link-desc">Current EC form, instructions, LOMA/LOMR submission guidance</div>
</div>
</div>
<!-- DRONE OPERATIONS -->
<div class="resource-category">
<div class="resource-cat-title">Drone Operations</div>
<div class="resource-link">
<a href="https://www.faa.gov/uas/commercial_operators" target="_blank" rel="noopener">FAA Part 107 — Commercial Rules</a>
<div class="resource-link-desc">Full Part 107 regulatory summary for commercial UAS operations</div>
</div>
<div class="resource-link">
<a href="https://faadronezone.faa.gov" target="_blank" rel="noopener">FAA DroneZone</a>
<div class="resource-link-desc">Drone registration, operator certificates, waiver management</div>
</div>
<div class="resource-link">
<a href="https://www.faa.gov/uas/recreational_flyers/where_can_i_fly/b4ufly" target="_blank" rel="noopener">FAA B4UFLY</a>
<div class="resource-link-desc">Pre-flight airspace check, TFRs, LAANC authorization</div>
</div>
<div class="resource-link">
<a href="https://www.faa.gov/uas/commercial_operators/part_107_waivers" target="_blank" rel="noopener">FAA Part 107 Waivers</a>
<div class="resource-link-desc">Waiver applications for operations beyond standard 107 rules</div>
</div>
<div class="resource-link">
<a href="https://www.aloft.ai" target="_blank" rel="noopener">Aloft — Field Airspace Map</a>
<div class="resource-link-desc">Mobile-friendly real-time airspace, LAANC, flight logging</div>
</div>
</div>
<!-- AIR QUALITY -->
<div class="resource-col" style="grid-column: 1 / -1; border-top: 1px solid #e5e5e5; padding-top: 18px; margin-top: 4px; page-break-inside: avoid;">
<div class="resource-cat">AIR QUALITY & WILDFIRE SMOKE</div>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:0 32px;">
<div class="resource-link-item">
<div class="resource-link-title">
<a href="https://www.fire.airnow.gov" target="_blank" rel="noopener">AirNow Fire & Smoke Map</a>
</div>
<div class="resource-link-url">https://www.fire.airnow.gov</div>
<div class="resource-link-desc">Current fire locations, smoke plumes, PM2.5 readings by location</div>
</div>
<div class="resource-link-item">
<div class="resource-link-title">
<a href="https://gispub.epa.gov/airnow" target="_blank" rel="noopener">AirNow Interactive Map</a>
</div>
<div class="resource-link-url">https://gispub.epa.gov/airnow</div>
<div class="resource-link-desc">Real-time AQI monitors, hourly NowCast, 48-hr forecast overlays</div>
</div>
<div class="resource-link-item">
<div class="resource-link-title">
<a href="https://airquality.weather.gov" target="_blank" rel="noopener">NOAA Smoke Forecast</a>
</div>
<div class="resource-link-url">https://airquality.weather.gov</div>
<div class="resource-link-desc">48-hr smoke concentration forecast, HRRR-Smoke model</div>
</div>
</div>
</div>
</div><!-- /resource-grid -->
<div class="resource-verified">Links verified: February 2026 · Check quarterly · SkyGrid GNSS Planning System</div>
</div><!-- /resource-section -->
</div><!-- /app -->
<script>
// ================================================================
// SKYGRID v2 — FULL ENGINE
// ================================================================
let selectedDays = 1;
let autoLat = null, autoLng = null, autoLocLabel = '';
let siteElevFt = null; // elevation in feet from Open-Meteo
let siteDeclDeg = null; // magnetic declination in degrees from NOAA
let autoLastResult = {};
let coverQrTimer = null; // tracks pending cover QR render to prevent double-fire
let geocodeTimer = null;
let manualDates = [];
let currentElevMask = 15; // degrees — standard field practice
// ── INIT ─────────────────────────────────────────────────────────
window.addEventListener('DOMContentLoaded', () => {
loadSaved();
addDateRow();
// Set today as default start date (prevents stale/future dates)
const sdInput = document.getElementById('a-startdate');
if (sdInput && !sdInput.value) {
const now = new Date();
const y = now.getFullYear();
const m = String(now.getMonth()+1).padStart(2,'0');
const d = String(now.getDate()).padStart(2,'0');
sdInput.value = `${y}-${m}-${d}`;
}
});
function loadSaved() {
['company','jobname','sitedesc'].forEach(k => {
const v = ls(k);
if (v) { setVal('a-'+k, v); setVal('m-'+k, v); }
});
const key = ls('apikey');
if (key) { setVal('a-apikey', key); setVal('m-apikey', key); }
const airnowKey = ls('airnow_key');
if (airnowKey) { setVal('a-airnow-key', airnowKey); }
}
function ls(k, v) {
if (v === undefined) return localStorage.getItem('sg_'+k) || '';
localStorage.setItem('sg_'+k, v);
}
function setVal(id, v) { const el = document.getElementById(id); if (el) el.value = v; }
function syncJobInfo(key, val) {
ls(key, val);
['a','m'].forEach(p => { const el = document.getElementById(p+'-'+key); if (el && el.value !== val) el.value = val; });
}
function saveApiKey(val) {
ls('apikey', val);
['a-apikey','m-apikey'].forEach(id => { const el = document.getElementById(id); if (el && el.value !== val) el.value = val; });
}
function switchMode(mode) {
['auto','manual','batch'].forEach(m => {
document.getElementById(m+'-panel').classList.toggle('active', m === mode);
document.getElementById('btn-'+m).classList.toggle('active', m === mode);
});
}
function selectDays(n, el) {
selectedDays = n;
document.querySelectorAll('.day-opt').forEach(b => b.classList.remove('active'));
el.classList.add('active');
}
function updateStartDateLabel() {
const input = document.getElementById('a-startdate');
const label = document.getElementById('start-date-label');
if (!input || !label) return;
if (!input.value) { label.textContent = 'defaults to today'; return; }
// Parse both as local midnight to get an exact day difference
const d = new Date(input.value + 'T00:00:00');
const today = new Date(); today.setHours(0,0,0,0);
const diff = Math.round((d - today) / 86400000);
const dow = d.toLocaleDateString('en-US', {weekday:'long'});
const dateStr = d.toLocaleDateString('en-US', {month:'short', day:'numeric'});
if (diff === 0) label.textContent = 'today — ' + dow;
else if (diff === 1) label.textContent = 'tomorrow — ' + dow;
else if (diff > 0) label.textContent = 'in ' + diff + ' days — ' + dow + ', ' + dateStr;
else label.textContent = dow + ', ' + dateStr;
}
function getStartDate() {
const input = document.getElementById('a-startdate');
if (!input || !input.value) return new Date();
const d = new Date(input.value + 'T06:00:00');
// Sanity check: if date is more than 14 days in future or in the past >1 day, use today
const now = new Date();
const diffDays = (d - now) / 86400000;
if (diffDays > 14 || diffDays < -1) {
console.warn('[SkyGrid] Start date out of range (' + input.value + '), using today');
const y = now.getFullYear(), m = String(now.getMonth()+1).padStart(2,'0'), day = String(now.getDate()).padStart(2,'0');
input.value = `${y}-${m}-${day}`;
return new Date(`${y}-${m}-${day}T06:00:00`);
}
return d;
}
// ── GEOCODING ─────────────────────────────────────────────────────
function updateCoverDeclination(deg) {
siteDeclDeg = deg;
const fmt = formatDeclination(deg);
if (!fmt) return;
// Cover line
const declEl = document.getElementById('cover-decl');
const declSep = document.getElementById('cover-decl-sep');
if (declEl) { declEl.textContent = 'Decl ' + fmt; declEl.style.display = ''; }
if (declSep) declSep.style.display = '';
// Site & Signal header
const facts = document.getElementById('site-signal-facts');
if (facts) {
const existing = facts.querySelector('[data-ssf="decl"]');
const note = deg >= 0
? `Compass reads ${Math.abs(deg).toFixed(1)}° too far W`
: `Compass reads ${Math.abs(deg).toFixed(1)}° too far E`;
const html = `<div class="ssf-item" data-ssf="decl">
<div class="ssf-label">Magnetic Declination</div>
<div class="ssf-value">${fmt}</div>
<div class="ssf-note">${note}</div>
</div>`;
if (existing) existing.outerHTML = html;
else {
// Insert after elevation if present
const elevEl = facts.querySelector('[data-ssf="elev"]');
if (elevEl) elevEl.insertAdjacentHTML('afterend', html);
else facts.insertAdjacentHTML('afterbegin', html);
}
}
}
async function fetchDeclination(lat, lng) {
// NOAA World Magnetic Model — open CORS, browser-side fetch
try {
const year = new Date().getFullYear();
const url = `https://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination?lat1=${lat}&lon1=${lng}&key=zNEw7&resultFormat=json&startYear=${year}&startMonth=${new Date().getMonth()+1}&startDay=${new Date().getDate()}`;
const res = await fetch(url, { signal: AbortSignal.timeout(8000) });
if (!res.ok) return null;
const data = await res.json();
const decl = data?.result?.[0]?.declination;
if (decl === undefined || decl === null) return null;
siteDeclDeg = decl;
console.log('[SkyGrid] Declination:', decl.toFixed(2), '°');
return decl;
} catch(e) {
console.warn('[SkyGrid] Declination fetch failed:', e.message);
return null;
}
}
function formatDeclination(deg) {
if (deg === null || deg === undefined) return null;
const abs = Math.abs(deg).toFixed(1);
const dir = deg >= 0 ? 'E' : 'W';
return abs + '° ' + dir;
}
function cleanAddress(display_name) {
// Nominatim returns: "1025, Clay Street, Arbee, Colusa, Colusa County, California, 95932, United States"
// We want: "1025 Clay Street, Colusa, CA 95932"
const stateAbbr = {
'Alabama':'AL','Alaska':'AK','Arizona':'AZ','Arkansas':'AR','California':'CA',
'Colorado':'CO','Connecticut':'CT','Delaware':'DE','Florida':'FL','Georgia':'GA',
'Hawaii':'HI','Idaho':'ID','Illinois':'IL','Indiana':'IN','Iowa':'IA','Kansas':'KS',
'Kentucky':'KY','Louisiana':'LA','Maine':'ME','Maryland':'MD','Massachusetts':'MA',
'Michigan':'MI','Minnesota':'MN','Mississippi':'MS','Missouri':'MO','Montana':'MT',
'Nebraska':'NE','Nevada':'NV','New Hampshire':'NH','New Jersey':'NJ','New Mexico':'NM',
'New York':'NY','North Carolina':'NC','North Dakota':'ND','Ohio':'OH','Oklahoma':'OK',
'Oregon':'OR','Pennsylvania':'PA','Rhode Island':'RI','South Carolina':'SC',
'South Dakota':'SD','Tennessee':'TN','Texas':'TX','Utah':'UT','Vermont':'VT',
'Virginia':'VA','Washington':'WA','West Virginia':'WV','Wisconsin':'WI','Wyoming':'WY'
};
try {
const parts = display_name.split(', ').map(p => p.trim());
// Find state, zip, city
let state = '', zip = '', city = '', streetParts = [];
const stateNames = Object.keys(stateAbbr);
for (let i = 0; i < parts.length; i++) {
const p = parts[i];
if (stateNames.includes(p)) { state = stateAbbr[p]; continue; }
if (/^\d{5}(-\d{4})?$/.test(p)) { zip = p; continue; }
if (p === 'United States') continue;
if (p.endsWith(' County')) continue; // skip county
// Skip neighborhood/suburb (short names between street and city)
// Keep: house number, street name, city
streetParts.push(p);
}
// streetParts is now: [housenum, street, suburb?, city, ...]
// Remove known suburb/neighborhood duplicates — if a part appears as substring of another, remove the shorter
const filtered = streetParts.filter((p, i) => {
// Remove if it looks like a suburb (no numbers, not the last meaningful part)
return true;
});
// Simple heuristic: take first 2 parts as street address, last unique part before state as city
let street = '';
let cityPart = '';
if (filtered.length >= 2) {
// Check if first part is a house number
if (/^\d+$/.test(filtered[0])) {
street = filtered[0] + ' ' + filtered[1];
// City = last part that isn't the street
// Find the actual city by looking for a part that matches the zip's city
// Simple: use the part just before the county or state
const nonStreet = filtered.slice(2);
cityPart = nonStreet[nonStreet.length - 1] || nonStreet[0] || '';
} else {
street = filtered[0];
cityPart = filtered[filtered.length - 1] || '';
}
} else {
street = filtered.join(', ');
}
const result = [street, cityPart, state, zip].filter(Boolean);
// Format: "1025 Clay Street, Colusa, CA 95932"
if (result.length >= 2) {
return street + ', ' + [cityPart, state, zip].filter(Boolean).join(' ');
}
return display_name; // fallback
} catch(e) {
return display_name;
}
}
async function geocodeAddress() {
const addr = document.getElementById('a-address').value.trim();
if (!addr) return;
try {
const res = await fetch(`/.netlify/functions/nominatim?limit=1&q=${encodeURIComponent(addr)}`, { signal: AbortSignal.timeout(10000) });
const data = await res.json();
if (data.length) {
autoLat = parseFloat(data[0].lat); autoLng = parseFloat(data[0].lon);
autoLocLabel = cleanAddress(data[0].display_name);
setVal('a-lat', autoLat.toFixed(5)); setVal('a-lng', autoLng.toFixed(5));
showLocConfirmed(autoLocLabel);
extractCountyFromAddress(data[0].display_name);
}
} catch(e) {}
hideSuggestions();
}
async function geocodeManual() {
const addr = document.getElementById('m-address').value.trim();
if (!addr) return;
try {
const res = await fetch(`/.netlify/functions/nominatim?limit=1&q=${encodeURIComponent(addr)}`, { signal: AbortSignal.timeout(10000) });
const data = await res.json();
if (data.length) { setVal('m-lat', parseFloat(data[0].lat).toFixed(5)); setVal('m-lng', parseFloat(data[0].lon).toFixed(5)); }
} catch(e) {}
}
function debounceGeocode(val) {
clearTimeout(geocodeTimer);
if (val.length < 3) { hideSuggestions(); return; }
geocodeTimer = setTimeout(() => fetchSuggestions(val), 480);
}
async function fetchSuggestions(val) {
try {
const res = await fetch(`/.netlify/functions/nominatim?limit=5&q=${encodeURIComponent(val)}`, { signal: AbortSignal.timeout(10000) });
const data = await res.json();
const box = document.getElementById('addr-suggestions');
if (!data.length) { hideSuggestions(); return; }
box.innerHTML = data.map(d => `<div class="addr-suggestion" data-raw="${d.display_name.replace(/"/g,'"')}" onclick="selectSuggestion('${cleanAddress(d.display_name).replace(/'/g,"'")}',${d.lat},${d.lon},this)">${cleanAddress(d.display_name)}</div>`).join('');
box.style.display = 'block';
} catch(e) {}
}
function hideSuggestions() { const b = document.getElementById('addr-suggestions'); if(b) b.style.display='none'; }
function selectSuggestion(label, lat, lng, el) {
setVal('a-address', label);
autoLat = parseFloat(lat); autoLng = parseFloat(lng); autoLocLabel = label;
setVal('a-lat', autoLat.toFixed(5)); setVal('a-lng', autoLng.toFixed(5));
showLocConfirmed(label); hideSuggestions();
extractCountyFromAddress(el && el.dataset.raw ? el.dataset.raw : label);
}
function showLocConfirmed(label) {
document.getElementById('loc-confirmed-text').textContent = label.length > 80 ? label.slice(0,80)+'…' : label;
document.getElementById('loc-confirmed').style.display = 'block';
}
document.addEventListener('click', e => { if (!e.target.closest('.addr-wrap')) hideSuggestions(); });
// ── MANUAL DATE ROWS ──────────────────────────────────────────────
function addDateRow() {
const id = Date.now(); manualDates.push(id);
const today = new Date().toISOString().split('T')[0];
const wrap = document.getElementById('date-rows');
const row = document.createElement('div');
row.className = 'date-row'; row.id = 'date-row-'+id;
row.innerHTML = `
<div class="form-group"><label>Date</label><input type="date" id="date-${id}" value="${today}"></div>
<div class="form-group"><label>Label (optional)</label><input type="text" id="datelbl-${id}" placeholder="e.g. Day 1"></div>
${manualDates.length > 1 ? `<button class="remove-date-btn" onclick="removeDateRow(${id})">✕</button>` : ''}
`;
wrap.appendChild(row);
}
function removeDateRow(id) {
manualDates = manualDates.filter(d => d !== id);
const el = document.getElementById('date-row-'+id); if(el) el.remove();
}
function previewImage(input, previewId, zoneId) {
const file = input.files[0]; if(!file) return;
const reader = new FileReader();
reader.onload = e => {
const p = document.getElementById(previewId); p.src = e.target.result; p.style.display = 'block';
const z = document.getElementById(zoneId);
z.querySelector('.upload-zone-title').style.display = 'none';
z.querySelector('.upload-zone-sub').style.display = 'none';
};
reader.readAsDataURL(file);
}
// ================================================================
// GNSS DOP ENGINE — gnssplanning.com API + almanac propagator
// ================================================================
// Strategy:
// 1. Fetch gnssplanning.com/api/almanac/YYYY/M/D for the Wednesday
// of the report week — same data source Trimble uses
// 2. Propagate satellite positions using Keplerian orbital mechanics
// (same math as gnssplanning's Calculator, extracted from their source)
// 3. Compute PDOP hourly independently for each day using real UTC times
// 4. Accurately captures per-day geometry spikes and dead zones
// ================================================================
// WGS84 constants (from gnssplanning source)
const WGS_MU = 3.986005e14; // m^3/s^2
const WGS_OE = 7.2921151467e-5; // rad/s Earth rotation rate
const WGS_A = 6378137.0; // m semi-major axis
const WGS_E2 = 0.00669437999014; // first eccentricity squared
const D2R = Math.PI / 180;
// ── Fetch almanac from gnssplanning API ─────────────────────────
async function fetchGNSSAlmanac(dateISO) {
const [y, m, d] = dateISO.split('-').map(Number);
// Their API: /api/almanac/YYYY/M/D (no zero-padding on month/day)
const url = `https://www.gnssplanning.com/api/almanac/${y}/${m}/${d}`;
const res = await fetch(url, { signal: AbortSignal.timeout(10000) });
if (!res.ok) throw new Error(`Almanac API ${res.status}`);
const data = await res.json();
if (!data.satellites || !data.satellites.length) throw new Error('Empty almanac');
return data;
}
// ── Parse almanac JSON into orbital elements ─────────────────────
// Mirrors gnssplanning's p() function exactly
function parseAlmanacSats(data) {
return data.satellites
.filter(s => s.health === 0 || (s.code === 'J' && s.health === 1))
.filter(s => ['G','R','E','C'].includes(s.code)) // GPS,GLONASS,Galileo,BeiDou
// Filter BeiDou GEO/near-GEO: true incl ~0°, stored as delta from 54° → ~-54 to -48
// Keeps MEO/IGSO (delta > -40 = true incl > 14°) for accurate geometry
.filter(s => !(s.code === 'C' && s.inclination < -40))
.map(s => ({
code: s.code,
prn: s.prn,
inc: (54 + s.inclination) * D2R, // delta from 54°, then to rad
sqrtA: s.semiMajorAxis, // stored as sqrt(a) in meters^0.5
ecc: s.eccentricity,
raan: s.rightAscension * D2R,
aop: s.perigee * D2R,
m0: s.meanAnomaly * D2R,
omegaDot: s.ascensionRate * D2R / 1000, // millirad/s → rad/s
gpsWeek: s.gpsWeek,
toa: s.timeOfAlmanac // seconds into GPS week
}));
}
// ── GPS week/second → JS Date ────────────────────────────────────
function gpsToDate(week, sec) {
const GPS_EPOCH = 315964800000; // Jan 6 1980 UTC in ms
return new Date(GPS_EPOCH + (week * 604800 + sec) * 1000);
}
// ── Solve Kepler's equation iteratively ─────────────────────────
function solveKepler(M, e) {
let E = M;
for (let i = 0; i < 30; i++) {
const dE = (M - E + e * Math.sin(E)) / (1 - e * Math.cos(E));
E += dE;
if (Math.abs(dE) < 1e-12) break;
}
return E;
}
// ── Compute ECEF position for one satellite at given time ────────
function satECEF(sat, tUTC) {
const a = sat.sqrtA * sat.sqrtA; // semi-major axis in meters
const n = Math.sqrt(WGS_MU / (a * a * a)); // mean motion rad/s
// Time since almanac epoch
const toaDate = gpsToDate(sat.gpsWeek, sat.toa);
const dt = (tUTC - toaDate) / 1000; // seconds
// Mean anomaly at time t
const M = sat.m0 + n * dt;
// Eccentric anomaly
const E = solveKepler(M, sat.ecc);
// True anomaly
const sinV = Math.sqrt(1 - sat.ecc * sat.ecc) * Math.sin(E) / (1 - sat.ecc * Math.cos(E));
const cosV = (Math.cos(E) - sat.ecc) / (1 - sat.ecc * Math.cos(E));
const v = Math.atan2(sinV, cosV);
// Argument of latitude
const u = v + sat.aop;
// Radius
const r = a * (1 - sat.ecc * Math.cos(E));
// Position in orbital plane
const x0 = r * Math.cos(u);
const y0 = r * Math.sin(u);
// Corrected RAAN (accounting for Earth rotation)
const tGPS = (tUTC - new Date('1980-01-06T00:00:00Z')) / 1000;
const raan = sat.raan + (sat.omegaDot - WGS_OE) * dt - WGS_OE * sat.toa;
// ECEF position (meters)
const cosR = Math.cos(raan), sinR = Math.sin(raan);
const cosI = Math.cos(sat.inc), sinI = Math.sin(sat.inc);
return [
x0 * cosR - y0 * cosI * sinR,
x0 * sinR + y0 * cosI * cosR,
y0 * sinI
];
}
// ── ECEF → elevation/azimuth from observer ───────────────────────
function ecefToElAz(satECEF, latDeg, lngDeg, altM) {
const lat = latDeg * D2R, lng = lngDeg * D2R;
const sinLat = Math.sin(lat), cosLat = Math.cos(lat);
const sinLng = Math.sin(lng), cosLng = Math.cos(lng);
const N = WGS_A / Math.sqrt(1 - WGS_E2 * sinLat * sinLat);
const obsX = (N + altM) * cosLat * cosLng;
const obsY = (N + altM) * cosLat * sinLng;
const obsZ = (N * (1 - WGS_E2) + altM) * sinLat;
const dx = satECEF[0] - obsX;
const dy = satECEF[1] - obsY;
const dz = satECEF[2] - obsZ;
// Local ENU
const e = -sinLng * dx + cosLng * dy;
const n = -sinLat * cosLng * dx - sinLat * sinLng * dy + cosLat * dz;
const u = cosLat * cosLng * dx + cosLat * sinLng * dy + sinLat * dz;
const rng = Math.sqrt(e*e + n*n + u*u);
const el = Math.asin(u / rng) / D2R;
const az = (Math.atan2(e, n) / D2R + 360) % 360;
return { el, az };
}
// ── 4x4 matrix helpers for DOP calculation ───────────────────────
function matMul4(A, B) {
const C = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]];
for (let i=0;i<4;i++) for (let j=0;j<4;j++) for (let k=0;k<4;k++) C[i][j]+=A[i][k]*B[k][j];
return C;
}
function invert4(m) {
const a = m.map(r => [...r]);
const inv = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];
for (let col=0; col<4; col++) {
let pivot = col;
for (let row=col+1; row<4; row++) if (Math.abs(a[row][col]) > Math.abs(a[pivot][col])) pivot = row;
[a[col], a[pivot]] = [a[pivot], a[col]];
[inv[col], inv[pivot]] = [inv[pivot], inv[col]];
const d = a[col][col];
if (Math.abs(d) < 1e-12) return null;
for (let j=0; j<4; j++) { a[col][j]/=d; inv[col][j]/=d; }
for (let row=0; row<4; row++) {
if (row === col) continue;
const f = a[row][col];
for (let j=0; j<4; j++) { a[row][j]-=f*a[col][j]; inv[row][j]-=f*inv[col][j]; }
}
}
return inv;
}
// ── Compute PDOP from visible satellites ─────────────────────────
function computePDOP(sats, latDeg, lngDeg, altM, tUTC, maskDeg) {
const H = [];
let visCount = 0;
for (const sat of sats) {
try {
const pos = satECEF(sat, tUTC);
if (!pos || isNaN(pos[0])) continue;
const { el } = ecefToElAz(pos, latDeg, lngDeg, altM);
if (el < maskDeg) continue;
visCount++;
const elR = el * D2R;
const az = ecefToElAz(pos, latDeg, lngDeg, altM).az * D2R;
H.push([
Math.cos(elR) * Math.sin(az),
Math.cos(elR) * Math.cos(az),
Math.sin(elR),
1
]);
} catch(e) { continue; }
}
if (H.length < 4) return null;
// H^T * H
const n = H.length;
const HTH = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]];
for (let i = 0; i < 4; i++)
for (let j = 0; j < 4; j++)
for (let k = 0; k < n; k++)
HTH[i][j] += H[k][i] * H[k][j];
const Q = invert4(HTH);
if (!Q) return null;
const pdop = Math.sqrt(Q[0][0] + Q[1][1] + Q[2][2]);
return { pdop: parseFloat(pdop.toFixed(2)), sats: visCount };
}
// ── Compute 24 hourly DOP values for one day ─────────────────────
function computeDailyDOP(almanacSats, latDeg, lngDeg, dateISO, driftMinutes) {
const hours = [];
for (let h = 0; h < 24; h++) {
// Apply sidereal drift: subtract driftMinutes from actual time
// (earlier in the day = same geometry as reference day)
const tUTC = new Date(`${dateISO}T${String(h).padStart(2,'0')}:00:00Z`);
tUTC.setMinutes(tUTC.getMinutes() - driftMinutes);
const dop = computePDOP(almanacSats, latDeg, lngDeg, 0, tUTC, currentElevMask);
hours.push({ hour: h, pdop: dop?.pdop ?? null, sats: dop?.sats ?? 0 });
}
return hours;
}
// ── Build full dopData — true per-day independent computation ─────
// Each day uses real UTC times for that date, no drift approximation.
// This means spikes and dead zones are accurately located per day.
function almanacToDopData(almanacSats, latDeg, lngDeg, startDate, days, refDateISO) {
const fmtISO = d => {
const y = d.getFullYear(), m = String(d.getMonth()+1).padStart(2,'0'), day = String(d.getDate()).padStart(2,'0');
return `${y}-${m}-${day}`;
};
return Array.from({ length: days }, (_, i) => {
const dayDate = new Date(startDate);
dayDate.setDate(dayDate.getDate() + i);
const dateISO = fmtISO(dayDate);
// Compute each hour independently using the actual date — no drift
const hours = [];
for (let h = 0; h < 24; h++) {
const tUTC = new Date(`${dateISO}T${String(h).padStart(2,'0')}:00:00Z`);
const dop = computePDOP(almanacSats, latDeg, lngDeg, 0, tUTC, currentElevMask);
hours.push({ hour: h, pdop: dop?.pdop ?? null, sats: dop?.sats ?? 0 });
}
const valid = hours.filter(h => h.pdop !== null);
if (!valid.length) return { date: dayDate, avgPdop: null, bestWindow: null, source: 'gnssplanning' };
// Field hours only (6AM-7PM) for avg — same as display
const fieldValid = hours.filter(h => h.hour >= 6 && h.hour <= 19 && h.pdop !== null);
const avgPdop = (fieldValid.length ? fieldValid : valid)
.reduce((s, h) => s + h.pdop, 0) / (fieldValid.length || valid.length);
// Find best 4-hour window (field hours 6AM–7PM = indices 6–19)
let bestWindow = null, bestScore = Infinity;
for (let s = 6; s <= 16; s++) { // start 6AM, latest start 4PM for 4hr ending at 7PM
const win = hours.slice(s, s + 4).filter(h => h.pdop !== null);
if (win.length < 3) continue;
const score = win.reduce((a, h) => a + h.pdop, 0) / win.length;
if (score < bestScore) {
bestScore = score;
bestWindow = {
label: fmtHr(s) + ' – ' + fmtHr(s + 4),
startHour: s,
avgPdop: parseFloat(score.toFixed(2)),
sats: Math.round(win.reduce((a, h) => a + h.sats, 0) / win.length)
};
}
}
return {
date: dayDate,
avgPdop: parseFloat(avgPdop.toFixed(2)),
bestWindow,
hours,
source: 'gnssplanning'
};
});
}
// ── Find the Wednesday of the report week ────────────────────────
function getRefDay(startDate) {
// Reference day = startDate + 2 days
// Centering on day 3 of a 7-day report keeps max drift to ±2 days (~8 min error)
// For any report length, +2 from start puts us near the middle
const d = new Date(startDate);
d.setDate(d.getDate() + 2);
const y = d.getFullYear(), m = String(d.getMonth()+1).padStart(2,'0'), day = String(d.getDate()).padStart(2,'0');
return `${y}-${m}-${day}`;
}
function fmtHr(h) { const hh=h%24, ap=hh<12?'AM':'PM', hd=hh%12||12; return `${hd}:00 ${ap}`; }
// ================================================================
// IONOSPHERE
// ================================================================
async function fetchIonoData() {
const res=await fetch('https://services.swpc.noaa.gov/products/noaa-planetary-k-index-forecast.json', { signal: AbortSignal.timeout(8000) });
return res.json();
}
async function fetchSolarFlux() {
const res=await fetch('https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json', { signal: AbortSignal.timeout(8000) });
const data=await res.json();
const last=data[data.length-1];
return parseFloat(last['f10.7'] || last['observed_ssn'] || 0);
}
async function fetchTEC(lat, lng) {
// NOAA GloTEC — fetch via Netlify proxy function (avoids all CORS issues)
// Falls back to direct third-party proxies if Netlify function not available
let geojson = null;
try {
// Primary: Netlify function proxy
const proxyRes = await fetch('/.netlify/functions/glotec', { signal: AbortSignal.timeout(12000) });
if (proxyRes.ok) {
const proxyData = await proxyRes.json();
if (proxyData.geojson && proxyData.geojson.features) {
geojson = proxyData.geojson;
console.log('[SkyGrid] GloTEC loaded via Netlify proxy, time:', proxyData.time_tag);
}
}
} catch(e) {
console.warn('[SkyGrid] GloTEC Netlify proxy failed:', e.message);
}
// Fallback: try direct NOAA + third-party proxies
if (!geojson) {
const BASE = 'https://services.swpc.noaa.gov';
const INDEX_PATH = '/products/glotec/geojson_2d_urt.json';
const PROXY_FNS = [
u => u,
u => 'https://corsproxy.io/?' + encodeURIComponent(u),
u => 'https://api.allorigins.win/raw?url=' + encodeURIComponent(u),
];
async function tryOne(rawUrl, proxyFn) {
try {
const res = await fetch(proxyFn(rawUrl), { signal: AbortSignal.timeout(12000) });
if (!res.ok) return null;
return await res.json();
} catch(e) { return null; }
}
let index = null, workingProxy = null;
for (const proxyFn of PROXY_FNS) {
index = await tryOne(BASE + INDEX_PATH, proxyFn);
if (Array.isArray(index) && index.length) { workingProxy = proxyFn; break; }
index = null;
}
if (index && workingProxy) {
const latest = index[index.length - 1];
console.log('[SkyGrid] GloTEC latest entry:', latest.time_tag, latest.url);
const dataUrl = latest.url.startsWith('http') ? latest.url : BASE + latest.url;
geojson = await tryOne(dataUrl, workingProxy);
}
}
if (!geojson || !geojson.features) { console.warn('[SkyGrid] GloTEC index unavailable'); return null; }
console.log('[SkyGrid] GloTEC data type:', geojson.type, '| feature count:', geojson.features.length);
const features = geojson.features;
// Find nearest grid cell
let best = null, bestDist = Infinity;
for (const feat of features) {
let fLat, fLng;
if (feat.geometry && feat.geometry.coordinates) {
fLng = feat.geometry.coordinates[0]; fLat = feat.geometry.coordinates[1];
} else if (feat.latitude !== undefined) {
fLat = feat.latitude; fLng = feat.longitude != null ? feat.longitude : (feat.lon != null ? feat.lon : feat.lng);
} else continue;
const dist = Math.abs(fLat - lat) + Math.abs(fLng - lng);
if (dist < bestDist) { bestDist = dist; best = feat; }
}
if (!best) { console.warn('[SkyGrid] GloTEC: no matching feature'); return null; }
const props = best.properties || best;
const tec = props.tec != null ? props.tec : (props.TEC != null ? props.TEC : (props.vtec != null ? props.vtec : (props.VTEC != null ? props.VTEC : null)));
const anomaly = (props.anomaly !== undefined && props.anomaly !== null) ? parseFloat(props.anomaly) : null;
const qualityFlag = props.quality_flag != null ? props.quality_flag : null;
console.log('[SkyGrid] TEC fetched:', tec, 'TECU | anomaly:', anomaly, '| quality_flag:', qualityFlag, '| dist:', bestDist.toFixed(2));
if (tec === null) return null;
return { tec: parseFloat(tec), anomaly, qualityFlag };
}
function interpretIono(kpData, f107, tecRaw) {
const forecasts=kpData.slice(1);
const kpVals=forecasts.map(r=>parseFloat(r[1])).filter(v=>!isNaN(v));
const maxKp=Math.max(...kpVals), avgKp=kpVals.reduce((a,b)=>a+b,0)/kpVals.length;
const f107val=typeof f107==='number'?f107:null;
// Unpack tecRaw — fetchTEC returns {tec, anomaly, qualityFlag} or null
const tecVal = tecRaw && typeof tecRaw==='object' ? tecRaw.tec : (typeof tecRaw==='number' ? tecRaw : null);
const tecAnomaly = tecRaw && typeof tecRaw==='object' ? tecRaw.anomaly : null;
const tecQualityFlag = tecRaw && typeof tecRaw==='object' ? tecRaw.qualityFlag : null;
const tecDegraded = tecQualityFlag !== null && tecQualityFlag !== 0;
let level,label,color;
if(maxKp>=5||(f107val&&f107val>180)){level='elevated';label='ELEVATED ACTIVITY';color='#ef4444';}
else if(maxKp>=3.5||(f107val&&f107val>150)){level='moderate';label='MODERATE ACTIVITY';color='#eab308';}
else{level='quiet';label='QUIET CONDITIONS';color='#22c55e';}
const parts=[`Peak Kp ${maxKp.toFixed(1)} (avg ${avgKp.toFixed(1)}).`];
if(f107val) parts.push(`Solar flux F10.7 = ${f107val.toFixed(0)} sfu.`);
if(level==='quiet') parts.push('Ionospheric conditions favorable for GNSS. No significant signal distortion expected.');
else if(level==='moderate') parts.push('Moderate geomagnetic activity. Some ionospheric delay possible. Static sessions should use longer occupation times.');
else parts.push('Elevated geomagnetic activity. Potential for significant ionospheric delays and cycle slips. Consider postponing precision work if possible.');
return {maxKp,avgKp,f107:f107val,tec:tecVal,tecAnomaly,tecDegraded,level,label,color,summary:parts.join(' ')};
}
// ================================================================
// AIR QUALITY INDEX (AirNow API)
// ================================================================
async function fetchAQI(lat, lng, days) {
const apiKey = (typeof ls === 'function' ? ls('airnow_key') : '') || 'BCE0E778-7D73-47B9-A45D-C88A3ADB6C84';
try {
// Try Netlify proxy first (avoids CORS when deployed with functions)
let url = `/.netlify/functions/aqi?lat=${lat.toFixed(4)}&lng=${lng.toFixed(4)}`;
console.log('[SkyGrid] AQI fetch via proxy:', url);
let res = await fetch(url, { signal: AbortSignal.timeout(8000) });
// If proxy returns 404 (not deployed), fall back to direct call
if (res.status === 404) {
console.log('[SkyGrid] AQI proxy not found, trying direct...');
url = `https://www.airnowapi.org/aq/forecast/latLong/?format=application/json` +
`&latitude=${lat.toFixed(4)}&longitude=${lng.toFixed(4)}` +
`&distance=25&API_KEY=${apiKey}`;
res = await fetch(url, { signal: AbortSignal.timeout(8000) });
}
if (!res.ok) throw new Error('AirNow HTTP ' + res.status);
const data = await res.json();
console.log('[SkyGrid] AQI raw response:', JSON.stringify(data).substring(0, 500));
console.log('[SkyGrid] AQI data received:', data?.length, 'entries');
if (!Array.isArray(data) || !data.length) return null;
// Build a map of date → max AQI for that day
const byDate = {};
data.forEach(entry => {
const rawDate = entry.DateForecast?.trim();
if (!rawDate) return;
// Normalize to YYYY-MM-DD regardless of AirNow format (MM/DD/YYYY or YYYY-MM-DD)
let d = rawDate;
if (rawDate.includes('/')) {
const [m, day, yr] = rawDate.split('/');
d = `${yr}-${m.padStart(2,'0')}-${day.padStart(2,'0')}`;
}
const aqi = entry.AQI;
if (!d || aqi === undefined || aqi < 0) return;
if (!byDate[d] || aqi > byDate[d].aqi) {
byDate[d] = {
aqi,
category: entry.Category?.Name || aqiCategory(aqi),
pollutant: entry.ParameterName || ''
};
}
});
byDate['__avg__'] = null;
console.log('[SkyGrid] AQI byDate keys:', Object.keys(byDate));
return byDate;
} catch(e) {
console.warn('[SkyGrid] AQI fetch failed:', e.message);
return null;
}
}
// ── FAA AIRSPACE + TFR ────────────────────────────────────────────────────
async function fetchFAA(lat, lng) {
try {
// Try Netlify proxy first
let url = `/.netlify/functions/tfr?lat=${lat.toFixed(4)}&lng=${lng.toFixed(4)}`;
let res = await fetch(url, { signal: AbortSignal.timeout(8000) });
if (res.status === 404) {
// Proxy not available — return null gracefully
console.warn('[SkyGrid] FAA TFR proxy not found');
return null;
}
if (!res.ok) throw new Error('FAA TFR HTTP ' + res.status);
const data = await res.json();
console.log('[SkyGrid] FAA TFR result:', data.tfrs?.length, 'nearby TFRs of', data.total, 'total');
return data;
} catch(e) {
console.warn('[SkyGrid] FAA TFR fetch failed:', e.message);
return null;
}
}
async function fetchAirspace(lat, lng) {
try {
// 6 second hard timeout — never hold up the report for airspace
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 6000);
const res = await fetch(`/.netlify/functions/airspace?lat=${lat.toFixed(4)}&lng=${lng.toFixed(4)}`, { signal: AbortSignal.timeout(8000),
signal: controller.signal
});
clearTimeout(timer);
if (!res.ok) return null;
const data = await res.json();
if (data.error) return null;
console.log('[SkyGrid] Airspace class:', data.airspaceClass, '|', data.droneStatus);
return data;
} catch(e) {
console.warn('[SkyGrid] Airspace fetch skipped (timeout or error):', e.message);
return null; // always graceful — report runs without it
}
}
function buildFAABlock(faaData, airspaceData, lat, lng) {
const b4uflyUrl = `https://b4ufly.aloft.ai/?lat=${lat || 0}&lng=${lng || 0}`;
const hasTFR = faaData && faaData.tfrs && faaData.tfrs.length > 0;
const tfrStatus = hasTFR ? '⚠ TFR ACTIVE' : (faaData ? '✅ NO TFRs WITHIN 30 MI' : 'TFR status unavailable');
const tfrColor = hasTFR ? '#ef4444' : (faaData ? '#22c55e' : '#888');
// Airspace class display
let airspaceHtml = '';
const cls = (airspaceData?.airspaceClass || '').replace(/^CLASS\s*/i, '').trim() || 'G';
if (airspaceData && airspaceData.airspaceClass) {
const clsColors = { 'B':'#ef4444','C':'#f97316','D':'#3b82f6','E':'#a855f7','G':'#22c55e' };
const clsColor = clsColors[cls] || '#888';
const droneColors = { 'red':'#ef4444','orange':'#f97316','yellow':'#eab308','green':'#22c55e' };
const droneColor = droneColors[airspaceData.droneColor] || '#888';
// UAS ceiling note
const ceilingNote = airspaceData.uasCeiling != null
? `<span style="color:#fbbf24;margin-left:8px">Max UAS: ${airspaceData.uasCeiling}ft AGL${airspaceData.uasAirport ? ' near ' + airspaceData.uasAirport : ''}</span>`
: '';
// Nearby controlled airspace
const nearbyHtml = (airspaceData.nearbyControlled || []).map(n =>
`<div style="color:#888;margin-top:2px">Class ${n.class} · ${n.name} nearby</div>`
).join('');
airspaceHtml = `
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px">
<span style="color:#f59e0b;letter-spacing:.5px">AIRSPACE</span>
<span style="color:${clsColor};font-weight:700;font-size:.7rem">CLASS ${cls}</span>
<span style="color:${droneColor};margin-left:4px">▶ ${airspaceData.droneStatus}</span>
${ceilingNote}
</div>
<div style="color:#aaa;margin-bottom:4px">${airspaceData.droneNote || ''}</div>
${nearbyHtml}`;
}
// TFR list
const tfrList = (faaData?.tfrs || []).slice(0, 3).map(t => {
const typeLabel = t.type === 'HAZARDS' ? '🔥 Hazard' :
t.type === 'VIP' ? '🔒 VIP' :
t.type === 'SECURITY' ? '🔒 Security' :
t.type === 'STADIUM' ? '🏟 Stadium' : t.type || 'TFR';
return `<div style="margin-top:3px;color:#fbbf24">${typeLabel} · NOTAM ${t.notam} · ${t.distance} mi away</div>`;
}).join('');
const borderColor = hasTFR ? '#7f1d1d' : (cls === 'G' ? '#14532d' : '#1d3557');
const bgColor = hasTFR ? '#1a0a0a' : (cls === 'G' ? '#0a1a0a' : '#0a0f1a');
return `<div style="font-family:monospace;font-size:.6rem;margin:6px 0 4px;padding:8px 10px;border:1px solid ${borderColor};border-radius:6px;background:${bgColor}">
${airspaceHtml}
<div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:${airspaceHtml ? '6px' : '0'}">
<span style="color:#f59e0b;letter-spacing:.5px">✈ TFR STATUS</span>
<span style="color:${tfrColor};font-weight:700">${tfrStatus}</span>
<a href="${b4uflyUrl}" target="_blank" style="color:#4a9eff;margin-left:auto">Check B4UFLY ↗</a>
</div>
${tfrList}
${hasTFR ? '<div style="color:#ef4444;margin-top:4px;font-weight:700">⚠ Verify TFR details before flight</div>' : ''}
<div style="color:#555;margin-top:4px">Current TFRs only · Always verify airspace day-of with B4UFLY or Aloft</div>
</div>`;
}
// ───────────────────────────────────────────────────────────────────────────
function moonPhase(date) {
// Calculate moon age in days (0-29.53)
const known = new Date(2000, 0, 6, 18, 14, 0); // known new moon Jan 6 2000
const synodic = 29.53058867;
const diff = (date - known) / (1000 * 60 * 60 * 24);
let age = ((diff % synodic) + synodic) % synodic;
const illumination = Math.round((1 - Math.cos((age / synodic) * 2 * Math.PI)) / 2 * 100);
let name, emoji;
if (age < 1.85) { name = 'New Moon'; emoji = '🌑'; }
else if (age < 7.38) { name = 'Waxing Crescent'; emoji = '🌒'; }
else if (age < 9.22) { name = 'First Quarter'; emoji = '🌓'; }
else if (age < 14.77) { name = 'Waxing Gibbous'; emoji = '🌔'; }
else if (age < 16.61) { name = 'Full Moon'; emoji = '🌕'; }
else if (age < 22.15) { name = 'Waning Gibbous'; emoji = '🌖'; }
else if (age < 23.99) { name = 'Last Quarter'; emoji = '🌗'; }
else if (age < 29.53) { name = 'Waning Crescent'; emoji = '🌘'; }
else { name = 'New Moon'; emoji = '🌑'; }
return { age: Math.round(age), name, emoji, illumination };
}
// ───────────────────────────────────────────────────────────────────────────
function aqiCategory(v) {
if (v <= 50) return 'Good';
if (v <= 100) return 'Moderate';
if (v <= 150) return 'Unhealthy for Sensitive';
if (v <= 200) return 'Unhealthy';
if (v <= 300) return 'Very Unhealthy';
return 'Hazardous';
}
function aqiLevel(v) {
if (v === null || v === undefined) return 'unknown';
if (v <= 50) return 'good';
if (v <= 100) return 'moderate';
if (v <= 150) return 'sensitive';
if (v <= 200) return 'unhealthy';
return 'hazardous';
}
function aqiLabel(v) {
if (v === null || v === undefined) return '—';
return v + ' · ' + aqiCategory(v);
}
// ================================================================
// WEATHER
// ================================================================
async function fetchWeather(lat, lng, days, startDate) {
const d = Math.min(days, 16);
const start = startDate || new Date();
// Use local date (not UTC) to avoid timezone off-by-one where toISOString() returns tomorrow
const fmtLocal = dt => {
const y = dt.getFullYear();
const m = String(dt.getMonth() + 1).padStart(2, '0');
const day = String(dt.getDate()).padStart(2, '0');
return `${y}-${m}-${day}`;
};
const endDate = new Date(start);
endDate.setDate(endDate.getDate() + d - 1);
const target = `https://api.open-meteo.com/v1/forecast?latitude=${lat}&longitude=${lng}`
+ `&daily=weathercode,temperature_2m_max,temperature_2m_min,precipitation_sum,windspeed_10m_max,windgusts_10m_max,winddirection_10m_dominant,sunrise,sunset`
+ `&hourly=windspeed_10m,winddirection_10m,windgusts_10m,weathercode`
+ `&wind_speed_unit=mph&temperature_unit=fahrenheit&timezone=auto`
+ `&start_date=${fmtLocal(start)}&end_date=${fmtLocal(endDate)}`;
// Open-Meteo fully supports CORS — try direct first (works from any hosted origin).
// Proxies are fallback only for edge cases (strict corporate networks, etc).
const attempts = [
{ url: target, label: 'direct' },
{ url: 'https://corsproxy.io/?' + encodeURIComponent(target), label: 'corsproxy.io' },
{ url: 'https://api.allorigins.win/raw?url=' + encodeURIComponent(target), label: 'allorigins' },
{ url: 'https://thingproxy.freeboard.io/fetch/' + encodeURIComponent(target), label: 'thingproxy' },
{ url: 'https://api.codetabs.com/v1/proxy?quest=' + encodeURIComponent(target), label: 'codetabs' },
];
for (const attempt of attempts) {
try {
console.log('[SkyGrid] Weather trying:', attempt.label);
const res = await fetch(attempt.url, { signal: AbortSignal.timeout(12000),
signal: AbortSignal.timeout(attempt.label === 'direct' ? 8000 : 14000),
cache: 'no-cache'
});
if (!res.ok) { console.warn('[SkyGrid] HTTP', res.status, 'from', attempt.label); continue; }
const data = await res.json();
if (data && data.daily) {
console.log('[SkyGrid] Weather OK via:', attempt.label);
// Extract site elevation from Open-Meteo response
if (data.elevation !== undefined && data.elevation !== null) {
siteElevFt = Math.round(data.elevation * 3.28084);
console.log('[SkyGrid] Site elevation:', siteElevFt, 'ft');
}
return data;
}
console.warn('[SkyGrid] No daily data from', attempt.label);
} catch(e) {
console.warn('[SkyGrid] Weather failed via', attempt.label + ':', e.message);
}
}
throw new Error('All weather fetch attempts failed');
}
// ── v1 WEATHER + WIND HELPERS ────────────────────────────────────────
function windStatus(wind, gusts) {
if (gusts > 45 || wind > 35) return {status:'GROUNDED', color:'#c62828', bg:'#ffebee', icon:'🚫', rank:3};
if (gusts > 30 || wind > 22) return {status:'HIGH RISK', color:'#e65100', bg:'#fff3e0', icon:'⛔', rank:2};
if (gusts > 20 || wind > 15) return {status:'CAUTION', color:'#f57c00', bg:'#fff8e1', icon:'⚠️', rank:1};
return {status:'GO', color:'#2e7d32', bg:'#f1f8f1', icon:'✅', rank:0};
}
function compassDir(deg) {
if (deg === null || deg === undefined) return '';
return ['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','WNW','NW','NNW'][Math.round(deg/22.5)%16];
}
function weatherRating(w) {
if (!w) return { rating: 'unknown', label: 'No Data', color: '#64748b' };
if (w.code >= 80) return { rating: 'avoid', label: 'AVOID — Storms/Heavy Rain', color: '#ff4444' };
if (w.windGusts > 35) return { rating: 'caution', label: 'CAUTION — High Gusts', color: '#ffb800' };
if (w.code >= 60 || w.precip > 0.1) return { rating: 'caution', label: 'CAUTION — Rain Expected', color: '#ffb800' };
if (w.windMax > 20) return { rating: 'caution', label: 'CAUTION — Windy', color: '#ffb800' };
return { rating: 'go', label: 'GO — Good Conditions', color: '#00ff9d' };
}
function weatherCodeDesc(code) {
if (code === 0) return 'Clear sky';
if (code <= 3) return 'Partly cloudy';
if (code <= 49) return 'Foggy';
if (code <= 59) return 'Drizzle';
if (code <= 69) return 'Rain';
if (code <= 79) return 'Snow';
if (code <= 82) return 'Rain showers';
if (code <= 86) return 'Snow showers';
if (code <= 99) return 'Thunderstorm ⚡';
return 'Unknown';
}
function weatherEmoji(code) {
if (code === 0) return '☀️';
if (code <= 3) return '⛅';
if (code <= 49) return '🌫️';
if (code <= 69) return '🌧️';
if (code <= 79) return '❄️';
if (code <= 82) return '🌦️';
if (code <= 99) return '⛈️';
return '🌤️';
}
// Convert v2 raw wxData + dayIdx into v1-compatible weather object
function buildDayWeather(wxData, dayIdx) {
if(!wxData || !wxData.daily) return null;
const daily = wxData.daily;
const hourly = wxData.hourly;
const code = daily.weathercode?.[dayIdx] ?? 0;
const windMax = daily.windspeed_10m_max?.[dayIdx] ?? 0;
const windGusts = daily.windgusts_10m_max?.[dayIdx] ?? 0;
const windDir = daily.winddirection_10m_dominant?.[dayIdx] ?? 0;
const tempMax = daily.temperature_2m_max?.[dayIdx] ?? 70;
const tempMin = daily.temperature_2m_min?.[dayIdx] ?? 50;
const precip = daily.precipitation_sum?.[dayIdx] ?? 0;
const srStr = daily.sunrise?.[dayIdx] ?? null;
const ssStr = daily.sunset?.[dayIdx] ?? null;
const srHour = srStr ? parseInt(srStr.slice(11,13)) : 6;
const srMin = srStr ? parseInt(srStr.slice(14,16)) : 0;
const ssHour = ssStr ? parseInt(ssStr.slice(11,13)) : 19;
const ssMin = ssStr ? parseInt(ssStr.slice(14,16)) : 0;
const fmtSun = (h,m) => { const ap=h<12?'AM':'PM', hh=h%12||12, mm=m>0?':'+String(m).padStart(2,'0'):':00'; return hh+mm+' '+ap; };
// Build hourly array for this day (5am–8pm)
const hourOffset = dayIdx * 24;
const hourlyArr = [];
if(hourly && hourly.windspeed_10m) {
for(let h=5; h<=20; h++) {
const idx = hourOffset + h;
if(idx < hourly.windspeed_10m.length) {
hourlyArr.push({
hour: h,
wind: Math.round(hourly.windspeed_10m[idx] ?? 0),
gusts: Math.round(hourly.windgusts_10m?.[idx] ?? hourly.windspeed_10m[idx] ?? 0),
dir: hourly.winddirection_10m?.[idx] ?? 0
});
}
}
}
return { code, windMax, windGusts, windDir, tempMax, tempMin, precip,
sunriseHour: srHour, sunriseMin: srMin, sunsetHour: ssHour, sunsetMin: ssMin,
sunriseStr: srStr ? fmtSun(srHour, srMin) : null,
sunsetStr: ssStr ? fmtSun(ssHour, ssMin) : null,
hourly: hourlyArr };
}
function formatWeatherHTML(w, wr) {
if (!w) return '';
const bgColor = wr.rating==='go' ? '#f1f8f1' : wr.rating==='caution' ? '#fff8e1' : '#ffebee';
const bdColor = wr.rating==='go' ? '#388e3c' : wr.rating==='caution' ? '#f57c00' : '#c62828';
return '<div class="weather-strip" style="border-color:'+bdColor+';background:'+bgColor+'">'
+'<div class="weather-emoji">'+weatherEmoji(w.code)+'</div>'
+'<div class="weather-info">'
+'<div class="weather-status" style="color:'+bdColor+'">'+wr.label+'</div>'
+'<div class="weather-details">'+weatherCodeDesc(w.code)+' | Wind: '+w.windMax+' mph (gusts '+w.windGusts+' mph) | Precip: '+w.precip+'" | Temp: '+w.tempMin+'°–'+w.tempMax+'°F</div>'
+'</div></div>';
}
function buildFieldWarningsHTML(w) {
if(!w) return '';
const warns=[];
if(w.code>=95) warns.push('⛈️ THUNDERSTORMS — Do not operate in the field');
else if(w.code>=80) warns.push('🌧️ HEAVY RAIN/SHOWERS — Equipment exposure risk');
else if(w.code>=61) warns.push('🌧️ RAIN — Protect equipment, slippery conditions');
if(w.code>=71&&w.code<=77) warns.push('❄️ SNOW — Check site access and road conditions');
if(w.windGusts>45) warns.push(`💨 EXTREME WIND GUSTS ${w.windGusts} mph — Do not set up equipment`);
else if(w.windGusts>30) warns.push(`💨 HIGH WIND GUSTS ${w.windGusts} mph — Secure all tripods`);
if(w.tempMax>105) warns.push(`🌡️ EXTREME HEAT ${w.tempMax}°F — Heat safety protocols required`);
else if(w.tempMax>95) warns.push(`🌡️ HIGH HEAT ${w.tempMax}°F — Monitor crew for heat stress`);
if(w.tempMin<20) warns.push(`🥶 EXTREME COLD ${w.tempMin}°F — Battery and equipment severely degraded`);
else if(w.tempMin<32) warns.push(`🥶 FREEZING TEMPS ${w.tempMin}°F — Monitor batteries, ice possible`);
if(!warns.length) return '';
return '<div class="field-warnings"><div class="fw-title">⚠️ Field Safety Warnings</div>'+warns.map(x=>'<div class="fw-item">'+x+'</div>').join('')+'</div>';
}
function formatDroneWindHTML(w) {
if (!w) return '';
const daily = windStatus(w.windMax || 0, w.windGusts || 0);
const hourly = w.hourly || [];
console.log('[SkyGrid] drone wind: hourly='+hourly.length+' windMax='+w.windMax);
// Turbulence: gust-to-sustained ratio
const turbHours = hourly.filter(h => (h.gusts - h.wind) > 15);
const turbulent = turbHours.length >= 3;
const maxTurbSpike = turbulent ? Math.round(Math.max(...turbHours.map(h => h.gusts - h.wind))) : 0;
// Best flyable window: longest consecutive GO streak within daylight hours
const srH = w.sunriseHour != null ? w.sunriseHour : 5;
const srM = w.sunriseMin != null ? w.sunriseMin : 0;
const ssH = w.sunsetHour != null ? w.sunsetHour : 20;
const ssM = w.sunsetMin != null ? w.sunsetMin : 0;
// Convert to decimal for fractional hour comparison
const srDec = srH + srM/60;
const ssDec = ssH + ssM/60;
let flyStart = null, flyEnd = null, bestRun = 0, curRun = 0, curStart = null;
hourly.forEach(h => {
// Only consider hours within civil daylight (sunrise to sunset)
if (h.hour < srDec || h.hour > ssDec) { curRun = 0; curStart = null; return; }
if (windStatus(h.wind, h.gusts).rank === 0) {
curRun++;
if (!curStart) curStart = h.hour;
if (curRun > bestRun) { bestRun = curRun; flyStart = curStart; flyEnd = h.hour; }
} else { curRun = 0; curStart = null; }
});
// Direction consistency
let dirShift = false;
if (hourly.length >= 2) {
const dirs = hourly.map(h => h.dir || 0);
let spread = Math.max(...dirs) - Math.min(...dirs);
if (spread > 180) spread = 360 - spread;
dirShift = spread > 60;
}
const fmt12 = h => { const ap = h < 12 ? 'AM' : 'PM'; return (h % 12 || 12) + ':00 ' + ap; };
const flyWindow = (flyStart !== null && bestRun >= 2)
? fmt12(flyStart) + ' \u2013 ' + fmt12(flyEnd + 1) + (bestRun >= 4 ? ' (' + bestRun + ' hrs)' : '')
: null;
// Bar chart
const maxBar = Math.max(35, ...hourly.map(h => h.gusts || 0));
const bars = hourly.map(h => {
const s = windStatus(h.wind, h.gusts);
const wPct = Math.round((h.wind / maxBar) * 100);
const gPct = Math.round((h.gusts / maxBar) * 100);
const turb = (h.gusts - h.wind) > 15 ? '<span style="color:#ff6b00;margin-left:3px">⚡</span>' : '';
const rankCls = ['wbar-go','wbar-caution','wbar-highrisk','wbar-grounded'][s.rank];
return '<div style="display:grid;grid-template-columns:46px 1fr 44px;align-items:center;gap:3px;margin-bottom:1px">'
+ '<div style="font-family:monospace;font-size:.62rem;color:#888;text-align:right;padding-right:4px">' + fmt12(h.hour).replace(':00','') + '</div>'
+ '<div class="wbar-track" style="position:relative;height:12px;border-radius:3px;overflow:hidden">'
+ '<div class="wbar-gust" style="position:absolute;inset:0;width:' + gPct + '%;border-radius:3px"></div>'
+ '<div class="wbar-wind ' + rankCls + '" style="position:absolute;top:2px;left:0;height:13px;width:' + wPct + '%;border-radius:2px;"></div>'
+ '<span class="wbar-label" style="position:absolute;left:5px;top:0;font-size:.65rem;font-family:monospace;line-height:17px">'
+ h.wind + '/' + h.gusts + ' mph' + turb
+ '</span>'
+ '</div>'
+ '<div style="font-family:monospace;font-size:.6rem;color:#999;text-align:center">' + compassDir(h.dir) + '</div>'
+ '</div>';
}).join('');
// Sunrise/sunset line
const sunLine = (w.sunriseStr && w.sunsetStr)
? '<div style="font-family:monospace;font-size:.6rem;color:#888;margin-bottom:6px;letter-spacing:.5px">'
+ '☀ Sunrise: <strong style="color:#ccc">' + w.sunriseStr + '</strong>'
+ ' ☾ Sunset: <strong style="color:#ccc">' + w.sunsetStr + '</strong>'
+ ' <span style="color:#666">fly window clipped to daylight</span>'
+ '</div>'
: '';
return '<div class="drone-wind-box" style="border:1px solid ' + daily.color + ';background:#0d1117;border-radius:10px;padding:14px 16px;margin-bottom:14px;page-break-inside:avoid">'
// Header
+ '<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;flex-wrap:wrap;gap:6px">'
+ '<span style="font-family:monospace;font-size:.63rem;text-transform:uppercase;letter-spacing:1.5px;color:' + daily.color + ';font-weight:700">🚁 Drone Wind Analysis</span>'
+ '<span style="font-size:.78rem;color:#aaa">' + daily.icon + ' <strong style="color:' + daily.color + '">' + daily.status + '</strong> Peak: ' + (w.windMax||0) + '/' + (w.windGusts||0) + ' mph ' + compassDir(w.windDir) + '</span>'
+ '</div>'
+ sunLine
// Fly window
+ (hourly.length === 0
? '<div style="color:#888;font-size:.8rem;margin-bottom:10px">No hourly data \u2014 check that a location is set before analyzing</div>'
: flyWindow
? '<div style="background:rgba(0,255,157,.07);border:1px solid rgba(0,255,157,.2);border-radius:6px;padding:6px 12px;margin-bottom:8px;font-size:.78rem;color:#00ff9d">✅ Best flight window: <strong>' + flyWindow + '</strong></div>'
: '<div style="background:rgba(255,68,68,.07);border:1px solid rgba(255,68,68,.2);border-radius:6px;padding:6px 12px;margin-bottom:8px;font-size:.78rem;color:#ff6b6b">⛔ No clean flyable window today</div>')
// Turbulence
+ (turbulent ? '<div style="background:rgba(255,107,0,.1);border:1px solid rgba(255,107,0,.25);border-radius:6px;padding:6px 12px;margin-bottom:8px;font-size:.75rem;color:#ff6b00">⚡ Turbulence risk \u2014 gust spikes up to ' + maxTurbSpike + ' mph above sustained</div>' : '')
// Direction shift
+ (dirShift ? '<div style="background:rgba(255,184,0,.07);border:1px solid rgba(255,184,0,.2);border-radius:6px;padding:6px 12px;margin-bottom:8px;font-size:.75rem;color:#ffb800">🔄 Wind direction shifting \u2014 plan mission headings carefully</div>' : '')
// Legend + bars
+ (hourly.length > 0
? '<div style="display:grid;grid-template-columns:46px 1fr 44px;gap:5px;margin-bottom:5px">'
+ '<div></div>'
+ '<div style="font-size:.58rem;color:#555;font-family:monospace">SUSTAINED / GUSTS mph ⚡=turbulence</div>'
+ '<div style="font-size:.58rem;color:#555;font-family:monospace;text-align:center">DIR</div>'
+ '</div>' + bars
: '')
+ '</div>';
}
const WX_CODES={0:'Clear sky',1:'Mainly clear',2:'Partly cloudy',3:'Overcast',45:'Foggy',48:'Rime fog',51:'Light drizzle',53:'Moderate drizzle',55:'Dense drizzle',61:'Slight rain',63:'Moderate rain',65:'Heavy rain',71:'Slight snow',73:'Moderate snow',75:'Heavy snow',77:'Snow grains',80:'Rain showers',81:'Moderate showers',82:'Violent showers',85:'Snow showers',86:'Heavy snow showers',95:'Thunderstorm',96:'Thunderstorm + hail',99:'Thunderstorm + heavy hail'};
function wxDesc(code){return WX_CODES[code]||`Code ${code}`;}
function buildFieldWarnings(wxData, dayIdx) {
const warnings=[], daily=wxData.daily;
const code=daily.weathercode[dayIdx], maxWind=daily.windspeed_10m_max[dayIdx], gusts=daily.windgusts_10m_max[dayIdx], maxT=daily.temperature_2m_max[dayIdx], minT=daily.temperature_2m_min[dayIdx];
if(code>=95) warnings.push({level:'critical',msg:'Thunderstorm forecast. Do NOT fly or operate equipment outdoors.'});
else if(code>=71&&code<=77) warnings.push({level:'critical',msg:'Snow forecast. GNSS multipath from accumulation likely.'});
else if(code>=61&&code<=65) warnings.push({level:'caution',msg:'Rain forecast. Protect equipment; PPP initialization delay possible.'});
if(maxWind>30) warnings.push({level:'critical',msg:`High winds ${maxWind?.toFixed(0)} mph — drone operations unsafe.`});
else if(maxWind>20) warnings.push({level:'caution',msg:`Breezy ${maxWind?.toFixed(0)} mph (gusts ${gusts?.toFixed(0)||'?'} mph). Monitor drone conditions.`});
if(maxT>100) warnings.push({level:'caution',msg:`Extreme heat ${maxT?.toFixed(0)}°F. Heat stroke risk.`});
if(minT<20) warnings.push({level:'caution',msg:`Extreme cold ${minT?.toFixed(0)}°F. Battery performance degraded.`});
return warnings;
}
// Score a day for ranking (lower is better)
function scoreDayConditions(wxData, dayIdx, dopDay) {
let score = 0;
const daily = wxData.daily;
const code = daily.weathercode[dayIdx];
const maxWind = daily.windspeed_10m_max[dayIdx] || 0;
// Weather penalty
if (code >= 95) score += 100;
else if (code >= 71 && code <= 77) score += 60;
else if (code >= 61 && code <= 65) score += 40;
else if (code >= 51 && code <= 55) score += 20;
else if (code === 3) score += 5;
// Wind penalty
if (maxWind > 30) score += 50;
else if (maxWind > 20) score += 25;
else if (maxWind > 15) score += 10;
// DOP penalty
if (dopDay && dopDay.avgPdop) {
score += Math.max(0, (dopDay.avgPdop - 1.5) * 10);
}
return score;
}
async function fetchFemaDirect(lat, lng) {
// FEMA blocks server-to-server — fetch directly from browser (CORS is open)
try {
const base = 'https://hazards.fema.gov/arcgis/rest/services/public/NFHL/MapServer';
const geom = `where=1%3D1&geometry=${lng}%2C${lat}&geometryType=esriGeometryPoint&inSR=4269&spatialRel=esriSpatialRelIntersects&returnGeometry=false&f=json`;
const [zoneRes, panelRes] = await Promise.allSettled([
fetch(`${base}/28/query?${geom}&outFields=FLD_ZONE%2CZONE_SUBTY%2CDFIRM_ID%2CSFHA_TF`, { signal: AbortSignal.timeout(8000) }),
fetch(`${base}/3/query?${geom}&outFields=FIRM_PAN%2CPANEL%2CSUFFIX%2CEFF_DATE`, { signal: AbortSignal.timeout(8000) })
]);
let zone=null, subtype=null, dfirmId=null, firmPan=null, effDate=null;
if (zoneRes.status==='fulfilled' && zoneRes.value.ok) {
const d = await zoneRes.value.json();
const f = d.features?.[0]?.attributes;
if (f) { zone=f.FLD_ZONE; subtype=f.ZONE_SUBTY||''; dfirmId=f.DFIRM_ID; }
}
if (panelRes.status==='fulfilled' && panelRes.value.ok) {
const d = await panelRes.value.json();
const f = d.features?.[0]?.attributes;
if (f) {
firmPan = f.FIRM_PAN || f.PANEL || null;
if (firmPan && f.SUFFIX) firmPan += f.SUFFIX;
if (f.EFF_DATE) effDate = new Date(f.EFF_DATE).toLocaleDateString('en-US',{year:'numeric',month:'short',day:'numeric'});
}
}
if (!zone) return null;
console.log('[SkyGrid] FEMA direct:', zone, dfirmId);
return {
zone, subtype, panel: firmPan || dfirmId || 'N/A', effDate: effDate || 'N/A',
url: `https://msc.fema.gov/portal/search?AddressQuery=${lat},${lng}`
};
} catch(e) {
console.warn('[SkyGrid] FEMA direct fetch failed:', e.message);
return null;
}
}
async function fetchControl(lat, lng) {
try {
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 10000);
const res = await fetch(`/.netlify/functions/control?lat=${lat.toFixed(4)}&lng=${lng.toFixed(4)}`, {
signal: controller.signal
});
clearTimeout(timer);
if (!res.ok) return null;
const data = await res.json();
// Fetch FEMA directly from browser (bypasses server-side block)
data.femaZone = await fetchFemaDirect(lat, lng);
console.log('[SkyGrid] Control: CORS:', data.corsStations?.length, '| BM:', data.benchmarks?.length, '| FEMA:', data.femaZone?.zone);
return data;
} catch(e) {
console.warn('[SkyGrid] Control fetch skipped:', e.message);
return null;
}
}
// ================================================================
// AUTO MODE ORCHESTRATOR
// ================================================================
// ── WILDFIRE PROXIMITY (NIFC AGOL) ──────────────────────────────────────────
async function fetchWildfire(lat, lng) {
console.log('[SkyGrid] fetchWildfire called:', lat, lng);
try {
const res = await fetch(`/.netlify/functions/wildfire?lat=${lat.toFixed(4)}&lng=${lng.toFixed(4)}`, { signal: AbortSignal.timeout(10000) });
if (!res.ok) throw new Error('Wildfire function HTTP ' + res.status);
const data = await res.json();
console.log('[SkyGrid] Wildfire result:', data.fires?.length, 'fires', data.error || '');
return data;
} catch(e) {
console.warn('[SkyGrid] Wildfire fetch failed:', e.message);
return { fires: [], error: e.message };
}
}
async function analyzeAuto() {
const lat = parseFloat(document.getElementById('a-lat').value);
const lng = parseFloat(document.getElementById('a-lng').value);
if (isNaN(lat) || isNaN(lng) || lat < -90 || lat > 90 || lng < -180 || lng > 180) {
alert('Invalid coordinates. Please search for a valid address or enter lat/lng manually.');
return;
}
const apiKey = document.getElementById('a-apikey').value.trim() || ls('apikey');
if (!apiKey) { alert('Please enter your Anthropic API key.'); return; }
const btn = document.getElementById('run-btn');
btn.disabled = true;
['gnss','iono','wx','ai'].forEach(k => setDot(k,'idle'));
showProgress(true);
document.getElementById('auto-results').classList.remove('visible');
let dopData = null, ionoResult = null, wxData = null;
let almanacSats = null, refDateISO = null;
const company=ls('company')||'', jobname=ls('jobname')||'', sitedesc=ls('sitedesc')||'';
const startDate = getStartDate(); // user-selected or today
// 1. GNSS DOP — fetch gnssplanning almanac for the center reference day,
// then compute DOP independently for each day using real UTC times.
// This accurately captures per-day spikes and geometry dead zones.
setStep('ps-gnss','active'); setDot('gnss','loading');
try {
refDateISO = getRefDay(startDate);
console.log('[SkyGrid] Fetching almanac for reference day:', refDateISO);
const almanacData = await fetchGNSSAlmanac(refDateISO);
almanacSats = parseAlmanacSats(almanacData);
console.log('[SkyGrid] Almanac loaded:', almanacSats.length, 'healthy satellites');
setStep('ps-gnss','done'); setStep('ps-dop','active');
dopData = almanacToDopData(almanacSats, lat, lng, startDate, selectedDays, refDateISO);
setStep('ps-dop','done'); setDot('gnss','ok');
console.log('[SkyGrid] DOP computed for', selectedDays, 'days — true per-day independent computation (no drift approximation)');
} catch(e) {
setStep('ps-gnss','err'); setStep('ps-dop','err'); setDot('gnss','err');
console.error('[SkyGrid] GNSS almanac fetch failed:', e.message);
}
// 2. Ionosphere
setStep('ps-iono','active'); setDot('iono','loading');
try {
const [kpRaw, fluxRaw, tecRaw] = await Promise.all([fetchIonoData().catch(()=>null), fetchSolarFlux().catch(()=>null), fetchTEC(lat, lng).catch(()=>null)]);
if (!kpRaw && !fluxRaw && !tecRaw) { throw new Error('All iono sources failed'); }
ionoResult = interpretIono(kpRaw, fluxRaw, tecRaw);
setStep('ps-iono','done'); setStep('ps-flux','done');
setDot('iono', ionoResult.level==='elevated' ? 'warn' : 'ok');
} catch(e) { setStep('ps-iono','err'); setStep('ps-flux','err'); setDot('iono','err'); }
// 3. Weather + AQI + FAA — fetch in parallel
setStep('ps-wx','active'); setDot('wx','loading');
// Show AQI step if key is present
const aqiKey = (typeof ls === 'function' ? ls('airnow_key') : '') || 'BCE0E778-7D73-47B9-A45D-C88A3ADB6C84';
if (aqiKey) setStep('ps-aqi','active');
setStep('ps-faa','active');
setStep('ps-fire','active');
setStep('ps-nanu','active');
setStep('ps-landcover','active');
let wxFailed = false;
let aqiData = null;
let faaData = null;
let airspaceData = null;
let controlData = null;
let fireData = null;
let nanuData = null;
let landCoverData = null;
let streamGaugeData = null;
let cdecData = null;
let usbrData = null;
let armyCorpsData = null;
try {
// Fetch declination in parallel (non-blocking — failure is OK)
fetchDeclination(lat, lng).then(decl => {
if (decl !== null) updateCoverDeclination(decl);
});
[wxData, aqiData, faaData, airspaceData, controlData, fireData, nanuData, landCoverData, streamGaugeData, cdecData, usbrData, armyCorpsData] = await Promise.all([
fetchWeather(lat, lng, selectedDays, startDate).catch(e => { console.warn('[SkyGrid] Weather failed:', e.message); return null; }),
fetchAQI(lat, lng, selectedDays).catch(() => null),
fetchFAA(lat, lng).catch(() => null),
fetchAirspace(lat, lng).catch(() => null),
fetchControl(lat, lng).catch(() => null),
fetchWildfire(lat, lng).catch(() => { return { fires: [], error: 'fetch failed' }; }),
fetchNanu().catch(() => null),
fetchLandCover(lat, lng).catch(() => null),
fetchStreamGauges(lat, lng).catch(() => null),
fetchCDEC(lat, lng).catch(() => null),
fetchUSBR(lat, lng).catch(() => null),
fetchArmyCorps(lat, lng).catch(() => null)
]);
if (!wxData || !wxData.daily || !wxData.daily.time || !wxData.daily.time.length) {
throw new Error('Empty response from Open-Meteo');
}
setStep('ps-wx','done'); setDot('wx','ok');
if (aqiData) { setStep('ps-aqi','done'); console.log('[SkyGrid] AQI data mapped:', Object.keys(aqiData)); }
else { setStep('ps-aqi','err'); console.warn('[SkyGrid] AQI returned null'); }
if (faaData) { setStep('ps-faa', faaData.tfrs?.length > 0 ? 'warn' : 'done'); }
else { setStep('ps-faa','err'); }
if (fireData && Array.isArray(fireData.fires)) {
const dangerFires = fireData.fires.filter(f => f.distMi < 50);
setStep('ps-fire', dangerFires.length > 0 ? 'warn' : 'done');
} else { setStep('ps-fire','err'); }
if (nanuData && !nanuData.error) {
setStep('ps-nanu', nanuData.activeCount > 0 ? 'warn' : 'done');
} else if (nanuData && nanuData.error) {
setStep('ps-nanu', 'err');
} else {
setStep('ps-nanu', 'err');
}
if (landCoverData && !landCoverData.error) {
const obs = landCoverData.worstObstruction;
setStep('ps-landcover', (obs === 'high' || obs === 'moderate') ? 'warn' : 'done');
} else {
setStep('ps-landcover', 'err');
}
// check for critical warnings
for (let d=0;d<selectedDays;d++) {
const w = buildFieldWarnings(wxData, d);
if (w.some(x=>x.level==='critical')) { setDot('wx','warn'); break; }
}
} catch(e) {
wxFailed = true;
setStep('ps-wx','err'); setDot('wx','err');
setStep('ps-ai','err');
document.getElementById('auto-results').classList.add('visible');
document.getElementById('ai-summary-card').innerHTML = `
<div class="warn-banner" style="border-left:3px solid #ef4444;padding:16px 20px">
<strong>⚠ Weather fetch failed — report cannot be generated.</strong><br><br>
Open-Meteo weather could not be reached. Tried direct + 4 proxy fallbacks. This usually means:<br>
· You are offline or on a restricted network<br>
· All public proxy services are temporarily down<br><br>
<strong>Fix:</strong> Check your internet connection and try again. Open your browser DevTools (F12 → Console) to see which specific attempt failed and why.<br><br>
<em style="font-size:11px;color:#888">Error detail: ${e.message}</em>
</div>`;
showProgress(false);
btn.disabled = false; btn.textContent = 'GENERATE REPORT';
return;
}
// 4. AI
setStep('ps-ai','active'); setDot('ai','loading');
const prompt = buildAutoPrompt(lat, lng, selectedDays, dopData, ionoResult, wxData, company, jobname, sitedesc, startDate, nanuData, fireData, landCoverData, aqiData);
try {
const aiText = await callClaudeAPI(prompt, apiKey);
setStep('ps-ai','done'); setDot('ai','ok');
document.getElementById('auto-results').classList.add('visible');
// Populate print header
const co_p = ls('company'), jn_p = ls('jobname');
const ph1 = document.getElementById('printHeaderPrepared');
const ph2 = document.getElementById('printHeaderProject');
const ph3 = document.getElementById('printHeaderDate');
const pf = document.getElementById('printFooterDate');
const pl = document.getElementById('printLocation');
const pd = document.getElementById('printDate');
if (ph1) ph1.textContent = co_p ? 'Prepared for: '+co_p : 'SkyGrid — GNSS Survey Planning';
if (ph2) ph2.textContent = jn_p || '';
if (ph3) ph3.textContent = 'Generated: '+new Date().toLocaleDateString('en-US',{weekday:'long',year:'numeric',month:'long',day:'numeric'});
if (pf) pf.textContent = new Date().toLocaleDateString();
if (pl) pl.textContent = lat && lng ? 'Coordinates: '+lat.toFixed(4)+', '+lng.toFixed(4) : '';
if (pd) pd.textContent = 'Generated: '+new Date().toLocaleString();
// Update page title for clean PDF header
document.title = 'SkyGrid Report'+(co_p?' — '+co_p:'')+(jn_p?' | '+jn_p:'');
console.log('[SkyGrid] Rendering iono...');
if (ionoResult) renderIonoPanel(ionoResult);
renderSiteSignalHeader(lat, lng, controlData, fireData);
console.log('[SkyGrid] Rendering DOP table...');
if (dopData) renderDopTable(dopData, wxData, selectedDays);
console.log('[SkyGrid] Rendering week grid...');
renderWeekGrid(wxData, dopData, selectedDays, faaData, airspaceData, lat, lng);
console.log('[SkyGrid] Rendering static window card...');
console.log('[SkyGrid] Rendering static window card...');
if (selectedDays >= 2) renderStaticWindowCard(wxData, dopData, selectedDays);
console.log('[SkyGrid] Rendering wildfire card...');
renderWildfireCard(fireData);
console.log('[SkyGrid] Rendering NANU card...');
renderNanuCard(nanuData);
console.log('[SkyGrid] Rendering land cover card...');
renderLandCoverCard(landCoverData, dopData, almanacSats, lat, lng);
console.log('[SkyGrid] Rendering AI summary...');
renderAISummary(aiText);
applyCountyToReport();
renderControlPage(controlData, lat, lng);
renderSiteConditionsPage(streamGaugeData, cdecData, usbrData, armyCorpsData);
console.log('[SkyGrid] Rendering cover sheet...');
// Cover sheet — only for 3+ day reports
if (selectedDays >= 3) {
renderCoverSheet(wxData, dopData, selectedDays, lat, lng, company, jobname, sitedesc, aqiData, controlData);
} else {
document.getElementById('report-cover').style.display = 'none';
}
console.log('[SkyGrid] All rendering complete.');
autoLastResult = { lat, lng, dopData, ionoResult, wxData, aqiData, faaData, airspaceData, controlData, streamGaugeData, aiText, company, jobname, sitedesc, selectedDays,
almanacSats: almanacSats || null, startDate, refDateISO: refDateISO || null };
} catch(e) {
setStep('ps-ai','err'); setDot('ai','err');
document.getElementById('auto-results').classList.add('visible');
document.getElementById('ai-summary-card').innerHTML = `<div class="warn-banner">AI analysis failed: ${e.message}</div>`;
}
btn.disabled = false;
}
function buildAutoPrompt(lat, lng, days, dopData, iono, wx, company, jobname, sitedesc, startDate, nanuData, fireData, landCoverData, aqiData) {
const today = new Date();
const start = startDate || today;
const DOW = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
const fmtDate = d => d.toLocaleDateString('en-US',{weekday:'long',month:'long',day:'numeric',year:'numeric'});
const isFuture = (start - today) > 86400000;
let p = `You are a senior GNSS survey operations expert. Produce a professional, concise field planning report.\n\n`;
p += `JOB: ${company||'N/A'} — ${jobname||'N/A'}\n`;
p += `SITE: ${sitedesc||'N/A'}\n`;
p += `LOCATION: ${lat.toFixed(4)}, ${lng.toFixed(4)}\n`;
p += `REPORT GENERATED: ${fmtDate(today)}\n`;
p += `SURVEY START DATE: ${fmtDate(start)}${isFuture?' (planned future date)':''}\n`;
p += `ANALYSIS WINDOW: ${days} day(s)\n\n`;
if (iono) {
p += `IONOSPHERIC CONDITIONS\nPeak Kp: ${iono.maxKp.toFixed(1)} | Avg Kp: ${iono.avgKp.toFixed(1)} | Status: ${iono.label}\n`;
if (iono.f107) p += `Solar Flux F10.7: ${iono.f107.toFixed(0)} sfu\n`;
if (iono.tec != null) {
let tecLine = 'TEC (Vertical Total Electron Content): ' + iono.tec.toFixed(1) + ' TECU';
if (iono.tecAnomaly !== null) tecLine += ' (anomaly vs 30-day median: ' + (iono.tecAnomaly >= 0 ? '+' : '') + iono.tecAnomaly.toFixed(1) + ' TECU)';
if (iono.tecDegraded) tecLine += ' [DATA QUALITY DEGRADED - quality_flag non-zero, treat as estimate only]';
p += tecLine + '\n';
} else {
p += 'TEC (Vertical Total Electron Content): UNAVAILABLE (fetch failed — note in analysis)\n';
}
p += `${iono.summary}\n\n`;
}
if (dopData && dopData.length) {
const src = dopData[0]?.source === 'gnssplanning' ? 'GNSS Planning Online (multi-constellation GPS+GLONASS+Galileo+BeiDou)' : 'GPS TLE static model';
p += `GNSS / DOP (source: ${src}, ${currentElevMask}° elevation mask)\n`;
dopData.forEach((d,i) => {
const dow = DOW[d.date.getDay()];
const tags = [];
if (i===0 && d.date.getDay()===new Date().getDay()) {} // date shown inline
if (d.date.getDay()===0||d.date.getDay()===6) tags.push('WEEKEND');
p += ` ${dow} ${d.date.toLocaleDateString('en-US',{month:'short',day:'numeric'})}${tags.length?' ['+tags.join(',')+']':''}: Avg PDOP ${d.avgPdop?.toFixed(2)||'N/A'}, Best window ${d.bestWindow?.label||'N/A'} (PDOP ${d.bestWindow?.avgPdop?.toFixed(2)||'N/A'}, ${d.bestWindow?.sats||'?'} sats)\n`;
});
p += '\n';
}
// NANU satellite health
if (nanuData && !nanuData.error) {
p += `GPS SATELLITE HEALTH (NAVCEN)\n`;
if (nanuData.activeCount === 0 && nanuData.scheduledCount === 0) {
p += ` All GPS satellites healthy — full constellation operational.\n`;
} else {
if (nanuData.activeCount > 0) {
nanuData.active.forEach(o => {
p += ` PRN ${o.prn} — CURRENTLY UNHEALTHY (${o.type})${o.openEnded ? ', no estimated return time' : ''}. Receivers should auto-exclude this satellite.\n`;
});
}
if (nanuData.scheduledCount > 0) {
nanuData.scheduled.forEach(o => {
let timeStr = '';
if (o.startISO && o.endISO) {
const start = new Date(o.startISO);
const end = new Date(o.endISO);
const fmt = d => d.toUTCString().replace(' GMT','').replace(':00 ',' ').slice(0,-3);
timeStr = ` — Scheduled outage: ${fmt(start)} UTC to ${fmt(end)} UTC`;
} else if (o.startISO) {
const start = new Date(o.startISO);
timeStr = ` — Scheduled outage starts: ${start.toUTCString().slice(0,-4)}`;
}
p += ` PRN ${o.prn} — SCHEDULED MAINTENANCE (${o.type})${timeStr}. Informational only — mention in narrative but do not affect day ranking.\n`;
});
}
}
p += '\n';
}
// Wildfire proximity — context only
if (fireData && !fireData.error && fireData.fires !== undefined) {
const nearest = fireData.fires.length > 0
? fireData.fires.reduce((a,b) => a.distMi < b.distMi ? a : b)
: null;
p += `WILDFIRE PROXIMITY (NIFC)\n`;
if (!nearest) {
p += ` No active fires detected within reporting range. Mention briefly as all-clear.\n`;
} else if (nearest.distMi < 25) {
p += ` ⚠ Active fire ${nearest.distMi.toFixed(0)} miles from site — smoke/AQI impact likely. Mention as field safety concern. Do not affect day ranking unless AQI confirms degradation.\n`;
} else if (nearest.distMi < 50) {
p += ` Active fire ${nearest.distMi.toFixed(0)} miles from site — monitor conditions. Informational only.\n`;
} else {
p += ` Nearest active fire ${nearest.distMi.toFixed(0)} miles away — no immediate concern. Brief mention only.\n`;
}
p += ` Note: Wildfire proximity is site context, not a day-ranking factor.\n\n`;
}
// Land cover + mask — context only
if (landCoverData && !landCoverData.error) {
p += `SITE LAND COVER & ELEVATION MASK (USGS NLCD)\n`;
p += ` Dominant cover: ${landCoverData.dominantLabel}\n`;
p += ` Sky obstruction: ${landCoverData.worstObstruction} | Multipath risk: ${landCoverData.worstMultipath}\n`;
p += ` Recommended elevation mask: ${landCoverData.recMask || 'see report'}° based on terrain\n`;
p += ` Note: Land cover is site context. Mention in site conditions summary. Do not affect day ranking.\n\n`;
}
// AQI — context only
if (aqiData) {
const aqiVals = Object.values(aqiData).filter(v => v && typeof v.aqi === 'number');
if (aqiVals.length) {
const maxAqi = Math.max(...aqiVals.map(v => v.aqi));
const aqiLabel = maxAqi <= 50 ? 'Good' : maxAqi <= 100 ? 'Moderate' : maxAqi <= 150 ? 'Unhealthy for Sensitive Groups' : 'Unhealthy';
p += `AIR QUALITY INDEX (AirNow)\n`;
p += ` Peak AQI across survey window: ${maxAqi} (${aqiLabel})\n`;
if (maxAqi > 150) {
p += ` ⚠ Unhealthy air quality — mention as field crew health concern. Do not affect day ranking.\n`;
} else {
p += ` Air quality acceptable for field operations. Brief mention only.\n`;
}
p += ` Note: AQI is crew comfort/safety context, not a day-ranking factor.\n\n`;
}
}
if (wx) {
p += `WEATHER FORECAST\n`;
const daily = wx.daily;
for (let d=0;d<Math.min(days,daily.time.length);d++) {
const dt = new Date(daily.time[d]+'T12:00:00');
const dow = DOW[dt.getDay()];
const tags = [];
if (dt.getDay()===0||dt.getDay()===6) tags.push('WEEKEND');
p += ` ${dow} ${daily.time[d]}${tags.length?' ['+tags.join(',')+']':''}: ${wxDesc(daily.weathercode[d])}, H ${daily.temperature_2m_max[d]?.toFixed(0)}°F L ${daily.temperature_2m_min[d]?.toFixed(0)}°F, Wind max ${daily.windspeed_10m_max[d]?.toFixed(0)} mph, Precip ${daily.precipitation_sum[d]?.toFixed(2)}"\n`;
}
p += '\n';
}
p += `INSTRUCTIONS\n`;
p += `RANKING RULE: Day rankings must be based ONLY on: PDOP geometry, weather conditions, and ionospheric activity. ` +
`Satellite health (NANU), wildfire proximity, land cover, and AQI are SITE CONTEXT — mention them in narrative but DO NOT use them to raise or lower any day's ranking. ` +
`PDOP scores already reflect any reduced constellation from unhealthy satellites.\n`;
if (days === 1) {
p += `Provide:\n1. GO / CAUTION / NO-GO verdict with one clear reason\n2. Best survey window (time range + why)\n3. Best 4-hour static GNSS window\n4. Drone operations assessment\n5. Field safety warnings (if any)\n6. One-paragraph summary\nUse ALL CAPS section labels. Be direct. No markdown.`;
} else if (days === 7) {
p += `Today is Sunday — this report is being distributed Sunday morning to crews for the coming week.\n\nProvide:\n1. TODAY (Sunday) — full GO/CAUTION/NO-GO with rationale\n2. MONDAY CALL — most urgent decision, clear GO/CAUTION/NO-GO since crews mobilize tomorrow\n3. WEEK RANKING — rank all 7 days 1 (best) to 7 (worst) for GNSS survey conditions. Note weekend days. Top 5 are the recommended work candidates.\n4. BEST STATIC WINDOW — best consecutive 4-hour static GNSS session across the whole week\n5. DRONE ASSESSMENT — day-by-day flyable/caution/no-fly\n6. FIELD WARNINGS — any critical safety issues\n7. OVERALL RECOMMENDATION — 2-3 sentences for the crew chief\nUse ALL CAPS section labels. Be concise and field-ready. No markdown.`;
} else {
p += `Provide:\n1. Day ranking best to worst for GNSS survey work, with GO/CAUTION/NO-GO and one-line rationale each. Flag any weekend days.\n2. Best 4-hour static GNSS window across all days\n3. Drone assessment per day\n4. Field safety warnings\n5. Summary recommendation\nUse ALL CAPS section labels. No markdown.`;
}
return p;
}
async function callClaudeAPI(prompt, apiKey) {
console.log('[SkyGrid] Claude API starting, prompt chars:', prompt.length, 'key chars:', apiKey ? apiKey.length : 'NO KEY');
try {
const res = await fetch('https://api.anthropic.com/v1/messages', {
method: 'POST',
signal: AbortSignal.timeout(45000),
headers: { 'Content-Type':'application/json','x-api-key':apiKey,'anthropic-version':'2023-06-01','anthropic-dangerous-direct-browser-access':'true' },
body: JSON.stringify({ model:'claude-haiku-4-5-20251001', max_tokens:2400, messages:[{role:'user',content:prompt}] })
});
console.log('[SkyGrid] Claude API status:', res.status);
if (!res.ok) { const e=await res.json().catch(()=>({})); throw new Error(e.error?.message||`HTTP ${res.status}`); }
const data = await res.json();
console.log('[SkyGrid] Claude API success');
if (!data.content || !data.content[0] || !data.content[0].text) throw new Error('Empty API response');
return data.content[0].text;
} catch(err) {
console.error('[SkyGrid] Claude API FAILED:', err.message);
throw err;
}
}
// ================================================================
// FETCH + RENDER: GPS SATELLITE HEALTH (NANU)
// ================================================================
async function fetchNanu() {
try {
const res = await fetch('/.netlify/functions/nanu', { signal: AbortSignal.timeout(10000) });
if (!res.ok) throw new Error(`NANU function ${res.status}`);
return await res.json();
} catch(e) {
console.warn('[SkyGrid] NANU fetch failed:', e.message);
return null;
}
}
async function fetchLandCover(lat, lon) {
try {
const res = await fetch(`/.netlify/functions/landcover?lat=${lat}&lon=${lon}`, { signal: AbortSignal.timeout(10000) });
if (!res.ok) throw new Error(`LandCover function ${res.status}`);
return await res.json();
} catch(e) {
console.warn('[SkyGrid] LandCover fetch failed:', e.message);
return null;
}
}
// ── Stream Gauge + Lake fetch ─────────────────────────────────────
async function fetchStreamGauges(lat, lng) {
try {
const res = await fetch(`/.netlify/functions/streamgauge?lat=${lat}&lng=${lng}`, { signal: AbortSignal.timeout(15000) });
if (!res.ok) throw new Error(`StreamGauge function ${res.status}`);
const data = await res.json();
console.log(`[SkyGrid] StreamGauge: ${data.streams?.length || 0} streams, ${data.lakes?.length || 0} lakes`);
return data;
} catch(e) {
console.warn('[SkyGrid] StreamGauge fetch failed:', e.message);
return null;
}
}
// ── CDEC California Reservoir fetch ──────────────────────────────
async function fetchCDEC(lat, lng) {
try {
const res = await fetch(`/.netlify/functions/cdec?lat=${lat}&lng=${lng}`, { signal: AbortSignal.timeout(20000) });
if (!res.ok) throw new Error(`CDEC function ${res.status}`);
const data = await res.json();
console.log(`[SkyGrid] CDEC: ${data.reservoirs?.length || 0} reservoirs`);
return data;
} catch(e) {
console.warn('[SkyGrid] CDEC fetch failed:', e.message);
return null;
}
}
async function fetchUSBR(lat, lng) {
try {
const res = await fetch(`/.netlify/functions/usbr?lat=${lat}&lng=${lng}`, { signal: AbortSignal.timeout(20000) });
if (!res.ok) throw new Error(`USBR function ${res.status}`);
const data = await res.json();
console.log(`[SkyGrid] USBR: ${data.reservoirs?.length || 0} reservoirs`);
return data;
} catch(e) {
console.warn('[SkyGrid] USBR fetch failed:', e.message);
return null;
}
}
async function fetchArmyCorps(lat, lng) {
try {
const res = await fetch(`/.netlify/functions/armycorps?lat=${lat}&lng=${lng}`, { signal: AbortSignal.timeout(20000) });
if (!res.ok) throw new Error(`ArmyCorps function ${res.status}`);
const data = await res.json();
console.log(`[SkyGrid] Army Corps: ${data.reservoirs?.length || 0} reservoirs`);
return data;
} catch(e) {
console.warn('[SkyGrid] Army Corps fetch failed:', e.message);
return null;
}
}
// ── Site Conditions Page render ───────────────────────────────────
function renderSiteConditionsPage(data, cdecData, usbrData, armyCorpsData) {
const wrap = document.getElementById('site-conditions-page');
if (!wrap) return;
const streams = data?.streams || [];
const usgsLakes = data?.lakes || [];
const cdecResv = cdecData?.reservoirs || [];
if (!streams.length && !usgsLakes.length && !cdecResv.length &&
!usbrData?.reservoirs?.length && !armyCorpsData?.reservoirs?.length) {
wrap.style.display = 'none';
return;
}
const FLOOD_LABEL = {
NORMAL: '<span class="flood-normal">● Normal</span>',
ACTION: '<span class="flood-action">▲ Action Stage</span>',
FLOOD: '<span class="flood-flood">⚠ Flood Stage</span>',
MODERATE: '<span class="flood-moderate">⚠ Moderate Flood</span>',
MAJOR: '<span class="flood-major">⬆ Major Flood</span>',
UNKNOWN: '<span class="flood-unknown">— Unknown</span>'
};
let html = `<div class="site-cond-wrap">
<div class="site-cond-title">🌊 SITE CONDITIONS · STREAM GAUGES & WATER LEVELS</div>`;
// ── Streams ──────────────────────────────────────────────────────
if (streams.length) {
html += `<div class="site-cond-section-head">USGS STREAM GAUGES — within 25 miles</div>`;
html += `<div class="gauge-row">
<span class="gauge-head">STATION</span>
<span class="gauge-head" style="text-align:right">DIST</span>
<span class="gauge-head" style="text-align:right">LEVEL</span>
<span class="gauge-head" style="text-align:right">FLOW</span>
<span class="gauge-head">FLOOD STATUS</span>
</div>`;
for (const s of streams) {
const ht = s.gageHt !== null ? s.gageHt.toFixed(2) + ' ft' : '—';
const cfs = s.cfs !== null ? s.cfs.toLocaleString() + ' cfs' : '—';
const status = FLOOD_LABEL[s.floodStatus || 'UNKNOWN'] || FLOOD_LABEL.UNKNOWN;
html += `<div class="gauge-row">
<span class="gauge-name"><a href="${s.url}" style="color:#111;text-decoration:none">${s.name}</a> <span style="color:#888;font-size:6pt">#${s.id}</span></span>
<span class="gauge-val">${s.distMi} mi</span>
<span class="gauge-val">${ht}</span>
<span class="gauge-val">${cfs}</span>
<span>${status}</span>
</div>`;
}
// Flood stage thresholds note for first gauge
const first = streams[0];
if (first?.floodThresholds) {
const t = first.floodThresholds;
const parts = [];
if (t.action !== null) parts.push(`Action: ${t.action}ft`);
if (t.flood !== null) parts.push(`Flood: ${t.flood}ft`);
if (t.moderate !== null) parts.push(`Moderate: ${t.moderate}ft`);
if (t.major !== null) parts.push(`Major: ${t.major}ft`);
if (parts.length) {
html += `<div style="font-size:6pt;color:#888;margin-top:4pt;padding-top:3pt;border-top:0.25pt solid #eee">
Flood thresholds for ${first.name}: ${parts.join(' · ')}
</div>`;
}
}
}
// ── USGS Lakes ────────────────────────────────────────────────────────
const usgsLakesWithData = usgsLakes.filter(l => l.levelFt !== null || l.gageHt !== null);
if (usgsLakesWithData.length) {
html += `<div class="site-cond-section-head">USGS LAKES & RESERVOIRS — within 150 miles</div>`;
html += `<div class="gauge-row">
<span class="gauge-head">STATION</span>
<span class="gauge-head" style="text-align:right">DIST</span>
<span class="gauge-head" style="text-align:right">LEVEL</span>
<span class="gauge-head" style="text-align:right">FULL POOL</span>
<span class="gauge-head">LINK</span>
</div>`;
for (const l of usgsLakesWithData) {
const lvl = l.levelFt !== null ? l.levelFt.toFixed(2) + ' ft' : (l.gageHt !== null ? l.gageHt.toFixed(2) + ' ft' : null);
if (lvl === null) continue; // skip rows with no data
html += `<div class="gauge-row">
<span class="gauge-name"><a href="${l.url}" style="color:#111;text-decoration:none">${l.name}</a> <span style="color:#888;font-size:6pt">#${l.id}</span></span>
<span class="gauge-val">${l.distMi} mi</span>
<span class="gauge-val">${lvl}</span>
<span class="gauge-val">N/R</span>
<span style="font-size:6pt"><a href="${l.url}" style="color:#555">USGS ↗</a></span>
</div>`;
}
}
// ── CDEC California Reservoirs ────────────────────────────────────────
if (cdecResv.length) {
html += `<div class="site-cond-section-head">CALIFORNIA RESERVOIRS (DWR/CDEC) — within 150 miles</div>`;
html += `<div class="cdec-row">
<span class="gauge-head">RESERVOIR</span>
<span class="gauge-head" style="text-align:right">DIST</span>
<span class="gauge-head" style="text-align:right">ELEVATION</span>
<span class="gauge-head" style="text-align:right">FULL POOL</span>
<span class="gauge-head" style="text-align:right">STORAGE</span>
<span class="gauge-head" style="text-align:right">% CAP</span>
</div>`;
for (const r of cdecResv) {
const elev = r.elevFt !== null ? r.elevFt.toLocaleString() + ' ft' : '—';
const fp = r.fullPool ? r.fullPool.toLocaleString() + ' ft' : 'N/R';
const stor = r.storageAF !== null ? (Math.round(r.storageAF/1000)).toLocaleString() + 'K af' : '—';
const pct = r.pctCapacity !== null ? r.pctCapacity + '%' : '—';
const delta = r.deltaFt !== null ? ' (' + (r.deltaFt >= 0 ? '+' : '') + r.deltaFt + ' ft)' : '';
const pctColor = r.pctCapacity !== null
? (r.pctCapacity >= 80 ? '#16a34a' : r.pctCapacity >= 40 ? '#ca8a04' : '#dc2626')
: '#333';
html += `<div class="cdec-row">
<span class="gauge-name"><a href="${r.url}" style="color:#111;text-decoration:none">${r.name}</a></span>
<span class="gauge-val">${r.distMi} mi</span>
<span class="gauge-val">${elev}${delta}</span>
<span class="gauge-val">${fp}</span>
<span class="gauge-val">${stor}</span>
<span class="gauge-val" style="color:${pctColor};font-weight:700">${pct}</span>
</div>`;
}
}
// ── USBR Reservoirs ────────────────────────────────────────────────────
const usbrResv = usbrData?.reservoirs || [];
if (usbrResv.length) {
html += `<div class="site-cond-section-head">USBR RESERVOIRS (Bureau of Reclamation) — within 150 miles</div>`;
html += `<div class="cdec-row">
<span class="gauge-head">RESERVOIR</span>
<span class="gauge-head" style="text-align:right">DIST</span>
<span class="gauge-head" style="text-align:right">ELEVATION</span>
<span class="gauge-head" style="text-align:right">FULL POOL</span>
<span class="gauge-head" style="text-align:right">STORAGE</span>
<span class="gauge-head" style="text-align:right">% CAP</span>
</div>`;
for (const r of usbrResv) {
const elev = r.elevFt !== null
? r.elevFt.toLocaleString() + ' ft'
: (r.fullPool ? `<span style="color:#aaa">${r.fullPool.toLocaleString()} ft*</span>` : '—');
const fp = r.fullPool ? r.fullPool.toLocaleString() + ' ft' : 'N/R';
const stor = r.storageAF !== null ? (Math.round(r.storageAF / 1000)).toLocaleString() + 'K af' : '—';
const pct = r.pctCapacity !== null ? r.pctCapacity + '%' : '—';
const pctColor = r.pctCapacity !== null
? (r.pctCapacity >= 80 ? '#16a34a' : r.pctCapacity >= 40 ? '#ca8a04' : '#dc2626')
: '#333';
html += `<div class="cdec-row">
<span class="gauge-name"><a href="${r.url}" target="_blank" style="color:#111;text-decoration:none">${r.name}</a></span>
<span class="gauge-val">${r.distMi} mi</span>
<span class="gauge-val">${elev}</span>
<span class="gauge-val">${fp}</span>
<span class="gauge-val">${stor}</span>
<span class="gauge-val" style="color:${pctColor};font-weight:700">${pct}</span>
</div>`;
}
}
// ── Army Corps Reservoirs ──────────────────────────────────────────────
const corpsResv = armyCorpsData?.reservoirs || [];
if (corpsResv.length) {
html += `<div class="site-cond-section-head">ARMY CORPS RESERVOIRS (USACE) — within 150 miles</div>`;
html += `<div class="cdec-row">
<span class="gauge-head">RESERVOIR</span>
<span class="gauge-head" style="text-align:right">DIST</span>
<span class="gauge-head" style="text-align:right">POOL ELEV</span>
<span class="gauge-head" style="text-align:right">FULL POOL</span>
<span class="gauge-head" style="text-align:right">STORAGE</span>
<span class="gauge-head" style="text-align:right">% CAP</span>
</div>`;
for (const r of corpsResv) {
const elev = r.elevFt !== null
? r.elevFt.toLocaleString() + ' ft'
: (r.fullPool ? `<span style="color:#aaa">${r.fullPool.toLocaleString()} ft*</span>` : '—');
const fp = r.fullPool ? r.fullPool.toLocaleString() + ' ft' : 'N/R';
const stor = r.storageAF !== null ? (Math.round(r.storageAF / 1000)).toLocaleString() + 'K af' : '—';
const pct = r.pctCapacity !== null ? r.pctCapacity + '%' : '—';
const pctColor = r.pctCapacity !== null
? (r.pctCapacity >= 80 ? '#16a34a' : r.pctCapacity >= 40 ? '#ca8a04' : '#dc2626')
: '#333';
html += `<div class="cdec-row">
<span class="gauge-name"><a href="${r.url}" target="_blank" style="color:#111;text-decoration:none">${r.name}</a></span>
<span class="gauge-val">${r.distMi} mi</span>
<span class="gauge-val">${elev}</span>
<span class="gauge-val">${fp}</span>
<span class="gauge-val">${stor}</span>
<span class="gauge-val" style="color:${pctColor};font-weight:700">${pct}</span>
</div>`;
}
}
// ── Footer ─────────────────────────────────────────────────────────────
const sources = [];
if (streams.length || usgsLakes.length) sources.push('USGS National Water Information System · waterdata.usgs.gov');
if (cdecResv.length) sources.push('California DWR / CDEC · cdec.water.ca.gov');
if (usbrResv.length) sources.push('USBR RISE · data.usbr.gov');
if (corpsResv.length) sources.push('USACE CWMS · water.usace.army.mil');
const reportTime = new Date().toLocaleString('en-US', { month:'short', day:'numeric', year:'numeric', hour:'numeric', minute:'2-digit', timeZoneName:'short' });
html += `<div style="font-size:5.5pt;color:#aaa;margin-top:8pt;border-top:0.25pt solid #eee;padding-top:4pt">
Data sources: ${sources.join(' · ')} · Real-time data subject to revision<br>
<span style="color:#bbb">Water levels current as of report run: ${reportTime}</span><br>
<span style="color:#ccc">* Live pool elevation not reported by this reservoir — full pool design elevation shown</span>
</div>`;
html += `</div>`;
wrap.innerHTML = html;
wrap.style.display = 'block';
}
function renderNanuCard(data) {
const card = document.getElementById('nanu-card');
if (!card) return;
let statusColor, statusText, statusNote, borderColor, icon;
if (!data || data.error) {
// Fetch failed — show neutral unavailable state
statusColor = 'var(--text-dim)';
statusText = 'Satellite Health Data Unavailable';
statusNote = 'Could not reach NAVCEN — check navcen.uscg.gov manually';
borderColor = 'var(--border)';
icon = '🛰';
} else if (data.activeCount === 0 && data.scheduledCount === 0) {
statusColor = 'var(--green)';
statusText = 'All GPS Satellites Healthy';
statusNote = `Full constellation operational · ${data.scheduled?.length === 0 ? 'No scheduled maintenance' : 'No active outages'} · Source: NAVCEN`;
borderColor = 'var(--green)';
icon = '🛰';
} else if (data.activeCount > 0) {
const prnList = data.active.map(o => `PRN ${o.prn}`).join(', ');
statusColor = 'var(--red)';
statusText = `⚠ ${data.activeCount} Satellite${data.activeCount > 1 ? 's' : ''} Currently Unhealthy — ${prnList}`;
statusNote = `Active outage${data.activeCount > 1 ? 's' : ''} per NAVCEN · Affected satellites auto-excluded by receiver`;
borderColor = 'var(--red)';
icon = '🛰';
} else {
// Only scheduled outages — build per-PRN detail with dates
const details = data.scheduled.map(o => {
let when = '';
if (o.startISO && o.endISO) {
const s = new Date(o.startISO);
const e = new Date(o.endISO);
const fmtShort = d => d.toUTCString().slice(5,22) + ' UTC';
when = ` (${fmtShort(s)} – ${fmtShort(e)})`;
} else if (o.startISO) {
when = ` (from ${new Date(o.startISO).toUTCString().slice(5,22)} UTC)`;
}
return `PRN ${o.prn}${when}`;
}).join(' · ');
statusColor = 'var(--yellow)';
statusText = `${data.scheduledCount} Satellite${data.scheduledCount > 1 ? 's' : ''} Scheduled for Maintenance`;
statusNote = details + ' · May temporarily reduce satellite count during outage window';
borderColor = 'var(--yellow)';
icon = '🛰';
}
card.style.display = 'block';
card.innerHTML = `
<div style="border:1px solid ${borderColor};padding:20px 24px;margin-bottom:14px;page-break-before:avoid !important;background:var(--bg2)">
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:600;color:var(--amber);letter-spacing:.28em;text-transform:uppercase;margin-bottom:14px;display:flex;align-items:center;gap:10px">
${icon} GPS Constellation Health
<span style="flex:1;height:1px;background:var(--border);display:block"></span>
</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:16px;font-weight:600;color:${statusColor};margin-bottom:6px">${statusText}</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim)">${statusNote}</div>
</div>`;
}
// ================================================================
// RENDER: IONO PANEL
// ================================================================
// ================================================================
// ELEVATION MASK SELECTOR
// ================================================================
const MASK_HINTS = {
10: 'Trimble default — theoretical max sat count',
15: 'Standard field practice — recommended',
20: 'Urban canyon / tree canopy',
25: 'Heavy obstruction / deep valley'
};
function setElevMask(deg) {
currentElevMask = deg;
// Update button states
document.querySelectorAll('.mask-btn').forEach(btn => {
btn.classList.toggle('mask-btn-active', parseInt(btn.dataset.mask) === deg);
});
// Update hint text
const hint = document.getElementById('mask-hint');
if (hint) hint.textContent = MASK_HINTS[deg] || '';
// Re-run DOP from cached almanac data if available
const r = autoLastResult;
if (!r || !r.wxData || !r.almanacSats) {
console.log('[SkyGrid] No cached almanac — re-run report to apply new mask');
return;
}
// Recompute DOP with new mask
const newDopData = almanacToDopData(
r.almanacSats, r.lat, r.lng,
r.startDate, r.selectedDays, r.refDateISO
);
// Update cached result
autoLastResult.dopData = newDopData;
// Re-render affected sections
renderDOPSummaryTable(r.wxData, newDopData, r.selectedDays);
renderWeekGrid(r.wxData, newDopData, r.selectedDays, r.faaData, r.airspaceData, r.lat, r.lng);
renderStaticWindowCard(r.wxData, newDopData, r.selectedDays);
if (r.selectedDays >= 3) {
renderCoverSheet(r.wxData, newDopData, r.selectedDays, r.lat, r.lng, r.company, r.jobname, r.sitedesc, r.aqiData, r.controlData);
}
// Update mask label in footnote
const footNote = document.querySelector('#dop-table-wrap span[style*="opacity"]');
// Will naturally update on next renderDOPSummaryTable call
}
function renderSiteSignalHeader(lat, lng, controlData, fireData) {
const hdr = document.getElementById('site-signal-header');
const facts = document.getElementById('site-signal-facts');
if (!hdr || !facts) return;
const items = [];
// Coordinates — always first
if (!isNaN(lat) && !isNaN(lng)) {
items.push(`<div class="ssf-item" data-ssf="coords">
<div class="ssf-label">Coordinates</div>
<div class="ssf-value">${lat.toFixed(4)}, ${lng.toFixed(4)}</div>
<div class="ssf-note">WGS84 / NAD83</div>
</div>`);
}
// Elevation
if (siteElevFt !== null) {
items.push(`<div class="ssf-item" data-ssf="elev">
<div class="ssf-label">Elevation</div>
<div class="ssf-value">${siteElevFt.toLocaleString()} ft</div>
<div class="ssf-note">Above MSL (approx)</div>
</div>`);
}
// Magnetic Declination (may also arrive via updateCoverDeclination async)
if (siteDeclDeg !== null) {
const fmt = formatDeclination(siteDeclDeg);
const note = siteDeclDeg >= 0
? `Compass reads ${Math.abs(siteDeclDeg).toFixed(1)}° too far W`
: `Compass reads ${Math.abs(siteDeclDeg).toFixed(1)}° too far E`;
items.push(`<div class="ssf-item" data-ssf="decl">
<div class="ssf-label">Magnetic Declination</div>
<div class="ssf-value">${fmt}</div>
<div class="ssf-note">${note}</div>
</div>`);
}
// FEMA one-liner from control data
const fema = controlData?.femaZone;
if (fema) {
const zoneLabel = fema.zone + (fema.subtype ? ' — ' + fema.subtype : '');
items.push(`<div class="ssf-item">
<div class="ssf-label">FEMA Flood Zone</div>
<div class="ssf-value">${fema.zone}</div>
<div class="ssf-note">${fema.subtype || 'See control points page'} · Panel ${fema.panel}</div>
</div>`);
}
// Always show if we have at least coords
if (items.length === 0) {
// Add placeholder for elev/decl that arrive async
items.push(`<div class="ssf-item" data-ssf="coords">
<div class="ssf-label">Coordinates</div>
<div class="ssf-value">${lat.toFixed(4)}, ${lng.toFixed(4)}</div>
<div class="ssf-note">WGS84 / NAD83 (NSRS2007)</div>
</div>`);
}
facts.innerHTML = items.join('');
hdr.style.display = 'block';
}
function renderIonoPanel(iono) {
document.getElementById('iono-panel').innerHTML = `
<div class="sec-title">Ionospheric Conditions</div>
<div class="iono-grid">
<div class="iono-metric"><div class="iono-metric-label">Peak Kp Index</div><div class="iono-metric-val" style="color:${iono.color}">${iono.maxKp.toFixed(1)}</div></div>
<div class="iono-metric"><div class="iono-metric-label">Avg Kp</div><div class="iono-metric-val" style="color:${iono.color}">${iono.avgKp.toFixed(1)}</div></div>
${iono.f107?`<div class="iono-metric"><div class="iono-metric-label">Solar Flux F10.7</div><div class="iono-metric-val" style="color:var(--text)">${iono.f107.toFixed(0)}<span class="iono-metric-unit">sfu</span></div></div>`:''}
${(()=>{
const tecColor = iono.tecDegraded ? 'var(--text-dim)' : (iono.tec>40?'#ef4444':iono.tec>20?'#eab308':'#22c55e');
const degradedBadge = iono.tecDegraded ? ' <span style="color:#ef4444;font-size:8px;letter-spacing:.05em">⚠ DEGRADED</span>' : '';
const anomalyColor = iono.tecAnomaly>5?'#ef4444':iono.tecAnomaly>2?'#eab308':iono.tecAnomaly<-2?'#60a5fa':'var(--text-dim)';
const anomalyLine = iono.tecAnomaly!==null ? '<div style="font-family:\'IBM Plex Mono\',monospace;font-size:10px;color:'+anomalyColor+';margin-top:4px">'+(iono.tecAnomaly>=0?'+':'')+iono.tecAnomaly.toFixed(1)+' TECU vs median</div>' : '';
if (iono.tec!=null) {
return '<div class="iono-metric"><div class="iono-metric-label">TEC (VTEC)'+degradedBadge+'</div><div class="iono-metric-val" style="color:'+tecColor+'">'+iono.tec.toFixed(1)+'<span class="iono-metric-unit">TECU</span></div>'+anomalyLine+'</div>';
} else {
return '<div class="iono-metric"><div class="iono-metric-label">TEC (VTEC)</div><div class="iono-metric-val" style="color:var(--text-dim);font-size:16px">— <span style="font-size:10px">UNAVAILABLE</span></div></div>';
}
})()}
<div class="iono-metric" style="grid-column:1/-1"><div class="iono-metric-label">Assessment</div><span class="iono-level ${iono.level}">${iono.label}</span><p class="iono-summary">${iono.summary}</p></div>
</div>`;
}
// ================================================================
// RENDER: DOP TABLE
// ================================================================
let dopTableData = null;
let dopTableWx = null;
let dopTableDays = 0;
function renderDopTable(dopData, wxData, days) {
dopTableData = dopData;
dopTableWx = wxData;
dopTableDays = days || (dopData ? dopData.length : 0);
const sec = document.getElementById('dop-section'); sec.style.display = 'block';
let html = `<table class="dop-table"><thead><tr><th>Date</th><th>Avg PDOP</th><th>Best 4-hr Window</th><th>Avg Sats</th><th>Rating</th></tr></thead><tbody>`;
dopData.forEach(d => {
const dateStr = d.date.toLocaleDateString('en-US',{weekday:'short',month:'short',day:'numeric'});
const pdop = d.avgPdop;
let cls='dop-na',rating='N/A';
if(pdop){if(pdop<1.0){cls='dop-good';rating='Ideal';}else if(pdop<1.5){cls='dop-good';rating='Good';}else if(pdop<2.0){cls='dop-ok';rating='Fair';}else if(pdop<3.0){cls='dop-ok';rating='Poor';}else{cls='dop-poor';rating='Avoid';}}
html+=`<tr><td>${dateStr}</td><td class="${cls}">${pdop?pdop.toFixed(2):'—'}</td><td>${d.bestWindow?d.bestWindow.label:'—'}</td><td>${d.bestWindow?d.bestWindow.sats:'—'}</td><td class="${cls}">${rating}</td></tr>`;
});
html += '</tbody></table>';
html += '<div class="dop-footnote" style="margin-top:8px;font-family:\'IBM Plex Mono\',monospace;font-size:10px;color:var(--text-dim);line-height:1.6">';
html += 'GPS + GLONASS + Galileo + BeiDou MEO · Full multi-constellation model · ' + currentElevMask + '° elevation mask · Per-day independent computation';
html += '<br><span style="opacity:0.6">GNSS satellite geometry is accurate within a 50-mile radius of the entered location — orbital mechanics do not change meaningfully at ground-level distances. Weather data is specific to the entered coordinates. For site-specific weather, terrain mask angle, and nearest CORS station, order an On-Demand Site Report.</span>';
html += '</div>';
// Add week stats bar below DOP table
if (dopTableWx && dopTableWx.daily && dopTableDays >= 3) {
const goCount = Array.from({length: dopTableDays}, (_, d) => d)
.filter(d => scoreDayConditions(dopTableWx, d, dopTableData?.[d]) < 30).length;
const bestPdop = dopTableData
? Math.min(...dopTableData.filter(d => d && d.avgPdop).map(d => d.avgPdop))
: null;
html += `<div class="week-summary">
<div class="week-summary-item">Days analyzed: <span>${dopTableDays}</span></div>
<div class="week-summary-item">Recommended work days: <span>${Math.min(goCount, 5)} of ${dopTableDays}</span></div>
${bestPdop ? `<div class="week-summary-item">Best PDOP: <span>${bestPdop.toFixed(2)}</span></div>` : ''}
</div>`;
}
document.getElementById('dop-table-wrap').innerHTML = html;
}
// ================================================================
// RENDER: 7-DAY WEEK GRID (the big new feature)
// ================================================================
function buildHourlyDOPBlock(dopDay) {
if (!dopDay || !dopDay.hours) return '';
const hours = dopDay.hours;
const fmt12 = h => { const hh = h % 12 || 12, ap = h < 12 ? 'AM' : 'PM'; return hh + ':00 ' + ap; };
// Only show 6AM–7PM (field hours)
const fieldHours = hours.filter(h => h.hour >= 6 && h.hour <= 19);
if (!fieldHours.length) return '';
const maxPdop = Math.max(...fieldHours.filter(h => h.pdop).map(h => h.pdop), 2.5);
function pdopRating(pdop) {
if (!pdop) return { label: '—', color: '#555', cls: 'dop-na', spike: false };
if (pdop < 1.0) return { label: 'IDEAL', color: '#22c55e', cls: 'dop-good', spike: false };
if (pdop < 1.5) return { label: 'GOOD', color: '#86efac', cls: 'dop-good', spike: false };
if (pdop < 2.0) return { label: 'FAIR', color: '#eab308', cls: 'dop-ok', spike: false };
if (pdop < 3.0) return { label: 'POOR', color: '#f97316', cls: 'dop-ok', spike: true };
return { label: 'AVOID', color: '#ef4444', cls: 'dop-poor', spike: true };
}
let rows = fieldHours.map(h => {
const r = pdopRating(h.pdop);
const pct = h.pdop ? Math.min(100, Math.round((h.pdop / maxPdop) * 100)) : 0;
// Bar fill: wider = worse PDOP (inverted — shorter bar = better)
const fillPct = h.pdop ? Math.max(8, Math.round((h.pdop / 4.0) * 100)) : 0;
const rowBg = r.spike ? 'background:rgba(245,158,11,0.08);border-radius:3px;' : '';
const timeCl = r.spike ? r.color : '#888';
const spikeClass = r.spike ? ' spike-row' : '';
return '<div class="ghb-row' + spikeClass + '" style="display:grid;grid-template-columns:52px 1fr 60px 70px;align-items:center;gap:6px;margin-bottom:1px;' + rowBg + '">' + '<div class="ghb-time" style="font-family:\'IBM Plex Mono\',monospace;font-size:9px;color:' + timeCl + ';text-align:right;padding-right:4px;font-weight:' + (r.spike?'700':'400') + '">' + fmt12(h.hour) + '</div>' + '<div class="ghb-bar-track" style="position:relative;height:11px;background:var(--bg4);border:1px solid ' + (r.spike ? r.color : 'var(--border)') + ';border-radius:2px;overflow:hidden">' + '<div class="ghb-bar-fill" style="position:absolute;inset:0;width:' + fillPct + '%;background:' + r.color + ';opacity:' + (r.spike ? '0.35' : '0.25') + ';border-radius:2px"></div>' + '<span class="ghb-pdop-val" style="position:absolute;left:6px;top:0;font-size:9px;font-family:\'IBM Plex Mono\',monospace;line-height:11px;color:' + r.color + ';font-weight:' + (r.spike?'700':'400') + '">' + (h.pdop ? h.pdop.toFixed(2) : '—') + '</span>' + '</div>' + '<div class="ghb-sats" style="font-family:\'IBM Plex Mono\',monospace;font-size:9px;color:' + (r.spike ? r.color : '#666') + ';text-align:center;font-weight:' + (r.spike?'700':'400') + '">' + (h.sats || '—') + ' sv</div>' + '<div class="ghb-rating ' + r.cls + '" style="font-family:\'IBM Plex Mono\',monospace;font-size:8px;color:' + r.color + ';text-align:right;letter-spacing:.05em;font-weight:700">' + r.label + '</div>' + '</div>';
}).join('');
return '<div class="gnss-hourly-block" style="background:var(--bg3);border:1px solid var(--border);border-radius:8px;padding:12px 14px;margin-bottom:12px;page-break-inside:avoid">' + '<div class="ghb-header" style="font-family:\'IBM Plex Mono\',monospace;font-size:9px;color:var(--amber);letter-spacing:.15em;text-transform:uppercase;margin-bottom:8px">GNSS / DOP — Hourly</div>' + '<div class="ghb-col-heads" style="display:grid;grid-template-columns:52px 1fr 60px 70px;gap:6px;margin-bottom:5px">' + '<div></div>' + '<div class="ghb-col-lbl" style="font-size:8px;color:#555;font-family:\'IBM Plex Mono\',monospace">PDOP</div>' + '<div class="ghb-col-lbl" style="font-size:8px;color:#555;font-family:\'IBM Plex Mono\',monospace;text-align:center">SATS</div>' + '<div class="ghb-col-lbl" style="font-size:8px;color:#555;font-family:\'IBM Plex Mono\',monospace;text-align:right">RATING</div>' + '</div>' + rows + '</div>';
}
function buildBestWindowBlock(wxData, dayIdx) {
// Compute best flyable window for this specific day
// Reuses the same logic as formatDroneWindHTML but renders as a standalone hero block
const dayW = buildDayWeather(wxData, dayIdx);
if (!dayW || !dayW.hourly || dayW.hourly.length === 0) return '';
const srDec = (dayW.sunriseHour || 5) + (dayW.sunriseMin || 0) / 60;
const ssDec = (dayW.sunsetHour || 20) + (dayW.sunsetMin || 0) / 60;
const fmt12 = h => { const ap = h < 12 ? 'AM' : 'PM'; return (h % 12 || 12) + ':00 ' + ap; };
// Find longest consecutive flyable window within daylight
let bestRun = 0, curRun = 0, flyStart = null, flyEnd = null, curStart = null;
dayW.hourly.forEach(h => {
if (h.hour < srDec || h.hour > ssDec) { curRun = 0; curStart = null; return; }
if (windStatus(h.wind, h.gusts).rank === 0) {
curRun++;
if (!curStart) curStart = h.hour;
if (curRun > bestRun) { bestRun = curRun; flyStart = curStart; flyEnd = h.hour; }
} else { curRun = 0; curStart = null; }
});
if (flyStart === null || bestRun < 1) {
return '<div class="best-window" style="background:var(--bg3);border:1px solid var(--border);border-radius:6px;padding:14px 16px;margin-top:10px">'
+ '<div class="best-window-label" style="font-family:\'IBM Plex Mono\',monospace;font-size:9px;letter-spacing:.15em;color:var(--text-dim);margin-bottom:6px">BEST WINDOW</div>'
+ '<div class="best-window-time" style="font-size:22px;font-weight:900;color:#ef4444;letter-spacing:-.5px">NO CLEAN WINDOW</div>'
+ '<div class="best-window-reason" style="font-size:11px;color:var(--text-dim);margin-top:4px;font-style:italic">Wind or precipitation prevents safe drone operations today</div>'
+ '</div>';
}
const windowStr = fmt12(flyStart) + ' – ' + fmt12(flyEnd + 1);
const hrs = bestRun;
// Build a reason string based on conditions
const wr = weatherRating(dayW);
let reason = '';
if (wr === 'excellent') reason = 'Ideal conditions — calm winds, clear operations all day';
else if (wr === 'good') reason = 'Good conditions with ' + hrs + '-hr clean window available';
else reason = 'Best available ' + hrs + '-hr window given forecast conditions';
return '<div class="best-window" style="background:var(--bg3);border:1px solid var(--border);border-left:3px solid var(--amber);border-radius:6px;padding:14px 16px;margin-top:10px;page-break-inside:avoid">'
+ '<div class="best-window-label" style="font-family:\'IBM Plex Mono\',monospace;font-size:9px;letter-spacing:.15em;color:var(--amber);margin-bottom:6px">BEST WINDOW</div>'
+ '<div class="best-window-time" style="font-size:28px;font-weight:900;color:var(--text);letter-spacing:-.5px;line-height:1.1">' + windowStr + '</div>'
+ '<div class="best-window-reason" style="font-size:11px;color:var(--text-dim);margin-top:6px;font-style:italic">' + reason + '</div>'
+ '</div>';
}
function renderWeekGrid(wxData, dopData, days, faaData, airspaceData, lat, lng) {
if (!wxData) return;
const area = document.getElementById('week-grid-area');
const daily = wxData.daily;
const hourly = wxData.hourly;
const today = new Date();
const todayDow = today.getDay(); // 0=Sun
// Score and rank each day
const dayScores = [];
for (let d = 0; d < Math.min(days, daily.time.length); d++) {
const dopDay = dopData ? dopData[d] : null;
const score = scoreDayConditions(wxData, d, dopDay);
const dt = new Date(daily.time[d]+'T12:00:00');
dayScores.push({ d, score, dow: dt.getDay(), dt, dateStr: daily.time[d] });
}
// Sort by score to get ranking, then map back
const sorted = [...dayScores].sort((a,b) => a.score - b.score);
const rankMap = {}; // d => rank (1=best)
sorted.forEach((item, idx) => { rankMap[item.d] = idx + 1; });
// Parse sunrise/sunset times
function parseSunTime(str) {
if (!str) return null;
const d = new Date(str); return isNaN(d) ? null : d;
}
let html = '';
html += `<div class="week-grid">`;
for (let d = 0; d < Math.min(days, daily.time.length); d++) {
const rank = rankMap[d];
const isTop5 = rank <= 5;
const isBottom2 = rank > 5 && days >= 7;
const isRank1 = rank === 1;
const dt = new Date(daily.time[d]+'T12:00:00');
const dow = dt.getDay();
const isToday = d === 0;
const isWeekend = dow === 0 || dow === 6;
const DOW_FULL = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
const DOW_SHORT = ['SUN','MON','TUE','WED','THU','FRI','SAT'];
// Tags
const tags = [];
if (isWeekend) tags.push('<span class="tag tag-weekend">WEEKEND</span>');
// Rank badge
const rankClass = rank <= 2 ? `rank-b${rank}` : rank <= 5 ? `rank-b${rank}` : `rank-b${rank}`;
const rankLabel = days >= 3 ? `#${rank}` : '—';
// GO/NO-GO signal from score
const score = dayScores[d].score;
let gonogoClass, gonogoLabel;
if (score < 30) { gonogoClass='gonogo-go'; gonogoLabel='GO'; }
else if (score < 60) { gonogoClass='gonogo-caution'; gonogoLabel='CAUTION'; }
else { gonogoClass='gonogo-nogo'; gonogoLabel='NO-GO'; }
// Weather pills
const code = daily.weathercode[d];
const maxWind = daily.windspeed_10m_max[d];
const gusts = daily.windgusts_10m_max[d];
const maxT = daily.temperature_2m_max[d];
const minT = daily.temperature_2m_min[d];
const precip = daily.precipitation_sum[d];
const sunrise = parseSunTime(daily.sunrise?.[d]);
const sunset = parseSunTime(daily.sunset?.[d]);
const srStr = sunrise ? sunrise.toLocaleTimeString('en-US',{hour:'numeric',minute:'2-digit'}) : '—';
const ssStr = sunset ? sunset.toLocaleTimeString('en-US',{hour:'numeric',minute:'2-digit'}) : '—';
// Field warnings for this day
const warnings = buildFieldWarnings(wxData, d);
// Hourly wind chart — daylight hours only
let windChartHtml = '';
if (hourly && hourly.windspeed_10m) {
const hourOffset = d * 24;
const dayWinds = hourly.windspeed_10m.slice(hourOffset, hourOffset + 24);
const dayDirs = hourly.winddirection_10m ? hourly.winddirection_10m.slice(hourOffset, hourOffset + 24) : [];
// Determine daylight window
const srHour = sunrise ? sunrise.getHours() : 6;
const ssHour = sunset ? sunset.getHours() : 19;
// Get hours in daylight range
const daylightWinds = [];
for (let h = srHour; h <= ssHour && h < 24; h++) {
daylightWinds.push({ hour: h, speed: dayWinds[h] || 0, dir: dayDirs[h] || 0 });
}
const maxW = Math.max(...daylightWinds.map(w => w.speed), 25);
const threshold20Pct = Math.min(100, (20 / maxW) * 100);
windChartHtml = `<div class="wind-chart">
<div class="wind-chart-title">
<span>Hourly Wind — Daylight Hours (${srStr} – ${ssStr})</span>
<span class="threshold-note">▶ 20 mph drone limit</span>
</div>`;
daylightWinds.forEach(w => {
const pct = Math.min(100, (w.speed / maxW) * 100);
const cls = w.speed < 10 ? 'calm' : w.speed < 20 ? 'breezy' : 'strong';
const dirArrow = degToArrow(w.dir);
windChartHtml += `<div class="wind-bar-row">
<div class="wind-bar-label">${fmtHr(w.hour)}</div>
<div class="wind-bar-track">
<div class="wind-bar-fill ${cls}" style="width:${pct}%"></div>
<div class="wind-threshold-line" style="left:${threshold20Pct}%"></div>
</div>
<div class="wind-val">${w.speed.toFixed(0)} mph ${dirArrow}</div>
</div>`;
});
windChartHtml += '</div>';
}
// DOP info for this day
const dopDay = dopData ? dopData[d] : null;
let dopHtml = '';
if (dopDay) {
const pCls = dopDay.avgPdop
? (dopDay.avgPdop < 1.0 ? 'dop-good'
: dopDay.avgPdop < 1.5 ? 'dop-good'
: dopDay.avgPdop < 2.0 ? 'dop-ok'
: dopDay.avgPdop < 3.0 ? 'dop-ok'
: 'dop-poor')
: 'dop-na';
dopHtml = `<div style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim);margin-bottom:10px">
GNSS: Avg PDOP <span class="${pCls}">${dopDay.avgPdop?.toFixed(2)||'—'}</span>
${dopDay.bestWindow ? ` · Best 4-hr window <span style="color:var(--text)">${dopDay.bestWindow.label}</span> (PDOP ${dopDay.bestWindow.avgPdop.toFixed(2)}, ${dopDay.bestWindow.sats} sats avg)` : ''}
</div>`;
}
// Drone assessment
// Build full v1-quality weather + drone wind block
const dayW = buildDayWeather(wxData, d);
const droneWindHtml = dayW
? formatWeatherHTML(dayW, weatherRating(dayW)) + buildFieldWarningsHTML(dayW) + formatDroneWindHTML(dayW)
: '';
// Card classes
let cardClass = 'day-card';
if (isRank1) cardClass += ' rank1 top5';
else if (isTop5) cardClass += ' top5';
else if (isBottom2) cardClass += ' bottom2';
// Auto-expand today and tomorrow, and rank 1
const expanded = (isToday || isRank1) ? ' expanded' : '';
html += `<div class="${cardClass}${expanded}" id="daycard-${d}">
<div class="day-card-header" onclick="toggleDayCard(${d})">
${days>=3 ? `<span class="day-rank-badge rank-b${Math.min(rank,7)}">#${d+1}</span>` : ''}
<div class="day-card-dateblock">
<div class="day-card-datestr">${DOW_FULL[dow]}, ${dt.toLocaleDateString('en-US',{month:'short',day:'numeric'})}</div>
<div class="day-card-tags">${tags.join('')}</div>
</div>
<div style="display:flex;align-items:center;gap:10px;flex-shrink:0">
<span class="wx-pill" style="font-size:10px">${wxDesc(code)}</span>
<span class="wx-pill" style="font-size:10px">💨 ${maxWind?.toFixed(0)} mph</span>
<span class="day-card-gonogo ${gonogoClass}">${gonogoLabel}</span>
<span class="day-card-chevron">▶</span>
</div>
</div>
<div class="day-card-body">
<div class="wx-pills">
<div class="wx-pill">High <span>${maxT?.toFixed(0)}°F</span></div>
<div class="wx-pill">Low <span>${minT?.toFixed(0)}°F</span></div>
<div class="wx-pill">Wind max <span>${maxWind?.toFixed(0)} mph</span></div>
${gusts ? `<div class="wx-pill">Gusts <span>${gusts?.toFixed(0)} mph</span></div>` : ''}
<div class="wx-pill">Precip <span>${precip?.toFixed(2)}"</span></div>
<div class="wx-pill">Sunrise <span>${srStr}</span></div>
<div class="wx-pill">Sunset <span>${ssStr}</span></div>
${(() => { const m = moonPhase(new Date(daily.time[d]+'T12:00:00')); return `<div class="wx-pill">${m.emoji} <span>${m.name} ${m.illumination}%</span></div>`; })()}
</div>
${dopHtml}
${dopDay && dopDay.hours ? buildHourlyDOPBlock(dopDay) : ''}
${droneWindHtml}
${buildBestWindowBlock(wxData, d)}
${buildFAABlock(faaData, airspaceData, lat, lng)}
</div>
</div>`;
}
html += '</div>';
area.innerHTML = html;
}
// ================================================================
// RENDER: NEARBY CONTROL POINTS PAGE
// ================================================================
function renderControlPage(controlData, lat, lng) {
const wrap = document.getElementById('control-page');
if (!wrap) return;
if (!controlData || (!controlData.corsStations?.length && !controlData.benchmarks?.length && !controlData.femaZone)) {
wrap.style.display = 'none';
return;
}
wrap.style.display = 'block';
const cors = controlData.corsStations || [];
const bms = controlData.benchmarks || [];
const fema = controlData.femaZone;
const locStr = `${lat.toFixed(4)}, ${lng.toFixed(4)}`;
let html = `<div class="control-page-wrap">
<div class="control-page-title">⚡ Nearby Control Points · ${locStr}</div>`;
// ── CORS STATIONS ──────────────────────────────────────────────
if (cors.length) {
html += `<div class="control-section-head">CORS Stations — within 30 miles</div>
<table class="control-table">
<thead><tr>
<th style="width:56px">QR / Link</th>
<th>Station ID</th>
<th>Name / Location</th>
<th>Distance</th>
</tr></thead>
<tbody>`;
cors.forEach((s, i) => {
html += `<tr>
<td><div class="control-qr" id="cors-qr-${i}"></div><a href="${s.url}" target="_blank" class="ctrl-link">NGS ↗</a></td>
<td><span class="control-id">${s.id}</span></td>
<td>${s.name}${s.state ? ', ' + s.state : ''}</td>
<td>${s.dist} mi</td>
</tr>`;
});
html += `</tbody></table>`;
}
// ── BENCHMARKS ─────────────────────────────────────────────────
if (bms.length) {
html += `<div class="control-section-head">NGS Benchmarks — within 10 miles</div>
<table class="control-table">
<thead><tr>
<th style="width:56px">QR / Link</th>
<th>PID</th>
<th>Designation</th>
<th>Elevation</th>
<th>Order</th>
<th>Distance</th>
</tr></thead>
<tbody>`;
bms.forEach((m, i) => {
html += `<tr>
<td><div class="control-qr" id="bm-qr-${i}"></div><a href="${m.url}" target="_blank" class="ctrl-link">Datasheet ↗</a></td>
<td><span class="control-id">${m.pid}</span></td>
<td>"${m.name}"</td>
<td>${m.elev}</td>
<td>${m.order}</td>
<td>${m.dist} mi</td>
</tr>`;
});
html += `</tbody></table>`;
}
// ── FEMA FLOOD ZONE ────────────────────────────────────────────
if (fema) {
const zClass = 'fema-zone-' + (fema.zone || 'x').toLowerCase().replace(/[^a-z]/g,'');
html += `<div class="control-section-head">FEMA Flood Zone</div>
<div class="fema-box">
<div class="fema-zone-badge ${zClass}">${fema.zone}${fema.subtype ? ' — ' + fema.subtype : ''}</div>
<div class="fema-meta">
Panel: <strong>${fema.panel}</strong><br>
Effective: ${fema.effDate}<br>
<a href="${fema.url}" target="_blank" style="color:var(--amber)">View FEMA Map ↗</a>
</div>
<div class="control-qr" id="fema-qr"></div>
</div>`;
}
html += `</div>`;
wrap.innerHTML = html;
// Generate QR codes after DOM insertion
setTimeout(() => {
cors.forEach((s, i) => {
const el = document.getElementById('cors-qr-' + i);
if (el && s.url) { try { new QRCode(el, { text: s.url, width: 36, height: 36, colorDark: '#111', colorLight: '#fff', correctLevel: QRCode.CorrectLevel.M }); } catch(e) {} }
});
bms.forEach((m, i) => {
const el = document.getElementById('bm-qr-' + i);
if (el && m.url) { try { new QRCode(el, { text: m.url, width: 36, height: 36, colorDark: '#111', colorLight: '#fff', correctLevel: QRCode.CorrectLevel.M }); } catch(e) {} }
});
const femaEl = document.getElementById('fema-qr');
if (femaEl && fema?.url) { try { new QRCode(femaEl, { text: fema.url, width: 36, height: 36, colorDark: '#111', colorLight: '#fff', correctLevel: QRCode.CorrectLevel.M }); } catch(e) {} }
}, 400);
}
function toggleDayCard(d) {
const card = document.getElementById('daycard-'+d);
if (card) card.classList.toggle('expanded');
}
function degToArrow(deg) {
const dirs = ['N','NE','E','SE','S','SW','W','NW'];
return dirs[Math.round(deg/45)%8] || '—';
}
// ================================================================
// RENDER: STATIC BASE OBSERVATION WINDOW CARD
// Shows best 4-hour window across all days (2+ day reports)
// ================================================================
function renderStaticWindowCard(wxData, dopData, days) {
const card = document.getElementById('static-window-card');
if (!card) return;
if (days < 2) { card.style.display = 'none'; return; }
// Find best 4-hour static windows across all days
// Scoring: lowest wind average + no precipitation + good conditions
const daily = wxData.daily;
const hourly = wxData.hourly;
const candidates = [];
for (let d = 0; d < Math.min(days, daily.time.length); d++) {
const dt = new Date(daily.time[d] + 'T12:00:00');
const hourOffset = d * 24;
// Get sunrise/sunset for this day
const srRaw = daily.sunrise ? new Date(daily.sunrise[d]) : null;
const ssRaw = daily.sunset ? new Date(daily.sunset[d]) : null;
const srHour = srRaw ? srRaw.getHours() : 6;
const ssHour = ssRaw ? ssRaw.getHours() : 19;
// Build hourly data for this day
const dayHourly = [];
for (let h = srHour; h <= ssHour && h < 24; h++) {
const idx = hourOffset + h;
const wind = hourly.windspeed_10m?.[idx] || 0;
const gusts = hourly.windgusts_10m?.[idx] || 0;
const wxCode = hourly.weathercode?.[idx] || 0;
dayHourly.push({ hour: h, wind, gusts, wxCode });
}
// Score each possible 4-hour window
for (let startH = 0; startH <= dayHourly.length - 4; startH++) {
const window4 = dayHourly.slice(startH, startH + 4);
const avgWind = window4.reduce((s, h) => s + h.wind, 0) / 4;
const maxGusts = Math.max(...window4.map(h => h.gusts));
const maxWxCode = Math.max(...window4.map(h => h.wxCode));
const badWx = maxWxCode >= 61; // rain or worse
const score = avgWind + maxGusts * 0.5 + (badWx ? 200 : 0);
// DOP bonus — if we have DOP data, prefer windows with better PDOP
let dopBonus = 0;
if (dopData && dopData[d] && dopData[d].bestWindow) {
const bwStart = dopData[d].bestWindow.startHour;
const wStart = window4[0].hour;
if (Math.abs(bwStart - wStart) <= 1) dopBonus = -5; // slight preference for DOP-aligned window
}
const label = fmtHr(window4[0].hour) + ' – ' + fmtHr(window4[3].hour + 1);
candidates.push({ d, dt, window4, avgWind, maxGusts, badWx, score: score + dopBonus, label });
}
}
if (!candidates.length) { card.style.display = 'none'; return; }
// Sort by score (lower = better)
candidates.sort((a, b) => a.score - b.score);
const best = candidates[0];
// Find a backup from a DIFFERENT day
const backup = candidates.find(c => c.d !== best.d) || null;
const DOW_FULL = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
function buildWindowBlock(c, isPrimary) {
const dow = c.dt.getDay();
const dateStr = c.dt.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });
const ws = c.avgWind.toFixed(0);
const gs = c.maxGusts.toFixed(0);
const condNote = c.badWx ? 'Weather concern' : (c.avgWind < 8 ? 'Ideal conditions' : c.avgWind < 15 ? 'Light wind' : 'Moderate wind');
const labelClass = isPrimary ? 'static-window-rec-label' : 'static-window-rec-label static-window-rec-label-alt';
const timeClass = isPrimary ? 'static-window-time' : 'static-window-time backup';
const blockClass = isPrimary ? 'static-window-primary' : 'static-window-backup';
const recLabel = isPrimary ? '▶ RECOMMENDED WINDOW' : 'ALTERNATE WINDOW';
return `<div class="${blockClass}">
<div class="${labelClass}">${recLabel}</div>
<div class="static-window-date">${dateStr}</div>
<div class="${timeClass}">${c.label}</div>
<div class="static-window-meta">Avg wind ${ws} mph · Gusts ${gs} mph</div>
<div class="static-window-reason">${condNote} — 4-hr static occupation</div>
</div>`;
}
card.style.display = 'block';
card.innerHTML = `<div class="static-window-card">
<div class="static-window-inner">
<div class="static-window-card-title">⚡ Best 4-Hour Static Base Observation Window</div>
<div class="static-window-grid">
${buildWindowBlock(best, true)}
${backup ? buildWindowBlock(backup, false) : '<div class="static-window-backup"><div class="static-window-rec-label static-window-rec-label-alt">ALTERNATE WINDOW</div><div class="static-window-reason">No alternate available.</div></div>'}
</div>
</div>
</div>`;
}
// ================================================================
// RENDER: LAND COVER CARD
// ================================================================
function renderLandCoverCard(data, dopData, almanacSats, lat, lng) {
const card = document.getElementById('landcover-card');
if (!card) return;
const RANK = { none: 0, low: 1, moderate: 2, high: 3 };
const OBS_LABEL = { none: 'Clear Sky View', low: 'Minor Obstruction', moderate: 'Moderate Obstruction', high: 'Heavy Obstruction' };
const MULTI_LABEL= { none: 'Minimal Multipath', low: 'Low Multipath', moderate: 'Moderate Multipath', high: 'High Multipath Risk' };
const OBS_NOTE = {
none: 'Open terrain — excellent satellite visibility in all directions.',
low: 'Low vegetation or sparse development nearby — minor sky obstruction possible.',
moderate: 'Moderate vegetation or urban development — elevation mask will be affected.',
high: 'Dense forest or tall structures within 100 m — significant sky obstruction likely. Consider elevated antenna or alternate benchmark.'
};
const MULTI_NOTE = {
none: 'No significant reflective surfaces detected.',
low: 'Minor reflective surfaces present — multipath generally manageable.',
moderate: 'Urban or wetland environment — multipath possible at low elevations.',
high: 'High-density development detected — multipath mitigation recommended (choke ring antenna, elevation mask ≥20°).'
};
if (!data || data.error) {
card.style.display = 'block';
card.innerHTML = `
<div class="info-card" style="border-color:var(--border)">
<div class="card-header" style="color:var(--text-dim)">🌿 Land Cover & Multipath Risk</div>
<p style="color:var(--text-dim);font-size:12px;margin:8px 0 0">Land cover data unavailable — verify site conditions manually · Source: USGS NLCD</p>
</div>`;
return;
}
const obs = data.worstObstruction || 'none';
const multi = data.worstMultipath || 'none';
const domLabel = data.dominantLabel || 'Unknown';
const obsRank = RANK[obs];
const multiRank= RANK[multi];
const maxRank = Math.max(obsRank, multiRank);
// ── Recommended elevation mask (industry standard logic) ──────────
// Base mask from obstruction
let recMask = 10;
if (obsRank >= 3) recMask = 20; // high obstruction
else if (obsRank >= 2) recMask = 15; // moderate
else if (obsRank >= 1) recMask = 13; // low
else recMask = 10; // clear
// Multipath penalty
if (multiRank >= 3) recMask = Math.min(recMask + 5, 25);
else if (multiRank >= 2) recMask = Math.min(recMask + 3, 25);
// Round to nearest standard value: 10, 13, 15, 20, 25
const STANDARD_MASKS = [10, 13, 15, 20, 25];
recMask = STANDARD_MASKS.reduce((prev, curr) =>
Math.abs(curr - recMask) < Math.abs(prev - recMask) ? curr : prev
);
const MASK_REASON = {
10: 'Open sky, no obstructions — NGS default',
13: 'Minor vegetation — slight horizon reduction',
15: 'Moderate terrain or light development — standard field practice',
20: 'Significant obstruction or urban environment',
25: 'Heavy obstruction and/or high multipath — maximum practical mask'
};
// ── PDOP cross-check at recommended mask ─────────────────────────
let maskPdopHtml = '';
try {
if (almanacSats && almanacSats.length && lat != null && lng != null) {
// Sample PDOP at recMask across all days' best window hours
// Use dopData to find best window hours, then re-compute at recMask
const baseMask = currentElevMask;
let bestPdopAtRec = null;
let worstPdopAtRec = null;
let conflictDays = 0;
const totalDays = dopData ? dopData.length : 0;
if (dopData && dopData.length) {
dopData.forEach(day => {
// Find the best 4-hour window for this day (lowest avg PDOP at current mask)
const hours = day.hours || [];
const goodHours = hours.filter(h => h.pdop !== null && h.pdop > 0 && h.pdop < 10);
if (!goodHours.length) return;
// Best single hour at current mask
const bestHour = goodHours.reduce((b, h) => h.pdop < b.pdop ? h : b, goodHours[0]);
// Re-compute PDOP at recMask for that same hour
// day.date may be a Date object or ISO string — normalize to ISO
const dayISO = (day.date instanceof Date)
? day.date.toISOString().slice(0,10)
: String(day.date).slice(0,10);
const tUTC = new Date(dayISO + 'T' + String(bestHour.hour).padStart(2,'0') + ':30:00Z');
const result = computePDOP(almanacSats, lat, lng, 0, tUTC, recMask);
if (!result || !result.pdop) return;
const p = result.pdop;
if (bestPdopAtRec === null || p < bestPdopAtRec) bestPdopAtRec = p;
if (worstPdopAtRec === null || p > worstPdopAtRec) worstPdopAtRec = p;
if (p > 3.0) conflictDays++;
});
}
if (bestPdopAtRec !== null) {
const pdopOk = worstPdopAtRec <= 3.0;
const pdopColor = pdopOk ? 'var(--green)' : 'var(--yellow)';
const pdopIcon = pdopOk ? '✓' : '⚠';
const pdopNote = pdopOk
? `PDOP remains ≤ ${worstPdopAtRec.toFixed(1)} at ${recMask}° — geometry confirmed acceptable`
: `PDOP reaches ${worstPdopAtRec.toFixed(1)} on ${conflictDays} day${conflictDays>1?'s':''} at ${recMask}° — consider ${recMask-5}° mask with extended occupation time`;
maskPdopHtml = `
<div style="margin-top:4px;padding:8px 10px;background:rgba(255,255,255,.04);border-radius:4px;border-left:3px solid ${pdopColor}">
<div style="font-size:11px;color:${pdopColor};font-weight:600">${pdopIcon} PDOP Check at ${recMask}°: ${bestPdopAtRec.toFixed(1)}–${worstPdopAtRec.toFixed(1)} across survey window${totalDays > 1 ? 's' : ''}</div>
<div style="font-size:10px;color:var(--text-dim);margin-top:3px">${pdopNote}</div>
</div>`;
}
}
} catch(e) { console.warn('[LandCover] PDOP check failed:', e.message); }
// Store recMask on data object so AI prompt can read it
if (data) data.recMask = recMask;
// ── Colors ────────────────────────────────────────────────────────
const borderColor = maxRank >= 3 ? 'var(--red)' : maxRank >= 2 ? 'var(--yellow)' : 'var(--green)';
const obsColor = obsRank >= 3 ? 'var(--red)' : obsRank >= 2 ? 'var(--yellow)' : 'var(--green)';
const multiColor = multiRank >= 3 ? 'var(--red)' : multiRank >= 2 ? 'var(--yellow)' : 'var(--green)';
const maskColor = recMask >= 20 ? 'var(--yellow)' : recMask >= 15 ? 'var(--text)' : 'var(--green)';
// ── Point breakdown table ─────────────────────────────────────────
const pointRows = (data.points || []).map(p => {
if (!p.info) return `<tr><td style="padding:2px 8px 2px 0;color:var(--text-dim);text-transform:capitalize">${p.label}</td><td style="color:var(--text-dim)">No data</td><td></td><td></td></tr>`;
const oc = RANK[p.info.obstruction] >= 3 ? 'var(--red)' : RANK[p.info.obstruction] >= 2 ? 'var(--yellow)' : 'var(--green)';
const mc = RANK[p.info.multipath] >= 3 ? 'var(--red)' : RANK[p.info.multipath] >= 2 ? 'var(--yellow)' : 'var(--green)';
return `<tr>
<td style="padding:2px 8px 2px 0;color:var(--text-dim);text-transform:capitalize">${p.label}</td>
<td style="padding:2px 8px 2px 0;color:var(--text)">${p.info.label}</td>
<td style="padding:2px 8px 2px 0;color:${oc};text-transform:capitalize">${p.info.obstruction}</td>
<td style="padding:2px 0;color:${mc};text-transform:capitalize">${p.info.multipath}</td>
</tr>`;
}).join('');
card.style.display = 'block';
card.innerHTML = `
<div class="info-card" style="border-color:${borderColor};page-break-before:avoid">
<div class="card-header" style="color:${borderColor}">🌿 Land Cover & Multipath Risk</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:12px 0 8px">
<div>
<div style="font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px">Sky Obstruction</div>
<div style="font-size:15px;font-weight:700;color:${obsColor}">${OBS_LABEL[obs]}</div>
<div style="font-size:11px;color:var(--text-dim);margin-top:4px">${OBS_NOTE[obs]}</div>
</div>
<div>
<div style="font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px">Multipath Risk</div>
<div style="font-size:15px;font-weight:700;color:${multiColor}">${MULTI_LABEL[multi]}</div>
<div style="font-size:11px;color:var(--text-dim);margin-top:4px">${MULTI_NOTE[multi]}</div>
</div>
</div>
<div style="margin:12px 0;padding:10px 12px;background:rgba(255,255,255,.05);border-radius:6px;border:1px solid ${maskColor}">
<div style="font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;margin-bottom:6px">Recommended Elevation Mask</div>
<div style="display:flex;align-items:baseline;gap:8px">
<span style="font-size:28px;font-weight:800;color:${maskColor};font-family:'IBM Plex Mono',monospace">${recMask}°</span>
<span style="font-size:11px;color:var(--text-dim)">${MASK_REASON[recMask]}</span>
</div>
${maskPdopHtml}
</div>
<div style="margin-top:10px">
<div style="font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;margin-bottom:6px">5-Point Sample (Center + N/S/E/W · ~100 m)</div>
<table style="font-size:11px;width:100%;border-collapse:collapse">
<thead><tr>
<th style="text-align:left;color:var(--text-dim);font-weight:500;padding:0 8px 4px 0">Point</th>
<th style="text-align:left;color:var(--text-dim);font-weight:500;padding:0 8px 4px 0">Cover Type</th>
<th style="text-align:left;color:var(--text-dim);font-weight:500;padding:0 8px 4px 0">Obstruction</th>
<th style="text-align:left;color:var(--text-dim);font-weight:500;padding:0">Multipath</th>
</tr></thead>
<tbody>${pointRows}</tbody>
</table>
</div>
<div style="margin-top:10px;font-size:10px;color:var(--text-dim)">Dominant cover: ${domLabel} · Source: USGS NLCD 2024 via MRLC · 30 m resolution · Industry standard mask guidance per NGS field procedures</div>
</div>`;
}
// ================================================================
// RENDER: AI SUMMARY
// ================================================================
function renderWildfireCard(fireData) {
const card = document.getElementById('wildfire-card');
if (!card || !fireData) return;
const fires = fireData.fires;
let statusColor, statusText, statusNote, borderColor;
if (fires.length === 0) {
statusColor = 'var(--green)';
statusText = 'No Active Fires Within 150 Miles';
const today = new Date().toLocaleDateString('en-US', {month:'long', day:'numeric', year:'numeric'});
statusNote = `No active fires as of report date (${today}) · Conditions may change — verify before fieldwork`;
borderColor = 'var(--green)';
} else {
const closest = fires[0];
const distStr = closest.distMi.toFixed(1) + ' mi';
const extraFires = fires.length > 1 ? ` · +${fires.length - 1} additional fire${fires.length > 2 ? 's' : ''} within 150 mi` : '';
if (closest.distMi < 25) {
statusColor = 'var(--red)'; borderColor = 'var(--red)';
statusText = `⚠ CRITICAL — ${closest.name} · ${distStr}`;
} else if (closest.distMi < 50) {
statusColor = '#f97316'; borderColor = '#f97316';
statusText = `⚠ WARNING — ${closest.name} · ${distStr}`;
} else {
statusColor = 'var(--yellow)'; borderColor = 'var(--yellow)';
statusText = `CAUTION — ${closest.name} · ${distStr}`;
}
statusNote = `${closest.acres} acres · NIFC current perimeters${extraFires}`;
}
card.style.display = 'block';
card.innerHTML = `
<div style="border:1px solid ${borderColor};padding:20px 24px;margin-bottom:14px;page-break-before:avoid !important;page-break-inside:avoid;background:var(--bg2)">
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:600;color:var(--amber);letter-spacing:.28em;text-transform:uppercase;margin-bottom:14px;display:flex;align-items:center;gap:10px">
🔥 Wildfire Proximity
<span style="flex:1;height:1px;background:var(--border);display:block"></span>
</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:18px;font-weight:600;color:${statusColor};margin-bottom:6px">${statusText}</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim)">${statusNote}</div>
</div>`;
}
function renderAISummary(text) {
const formatted = text.replace(/^([A-Z][A-Z\s\/\-]{2,}[A-Z]):?\s*$/gm, m => `<strong>${m.trim()}</strong>`).replace(/\n/g, '<br>');
document.getElementById('ai-summary-card').innerHTML = `
<div class="ai-card">
<h3>AI Field Analysis — Claude Opus</h3>
<div class="ai-card-body">${formatted}</div>
</div>`;
}
// ================================================================
// PROGRESS / STATUS
// ================================================================
function showProgress(show) {
document.getElementById('progress-box').classList.toggle('visible', show);
if (show) ['ps-gnss','ps-dop','ps-iono','ps-flux','ps-wx','ps-aqi','ps-faa','ps-fire','ps-nanu','ps-landcover','ps-ai'].forEach(id => setStep(id,'idle'));
}
function setStep(id, state) { const el=document.getElementById(id); if(el) el.className='progress-step '+state; }
function setDot(name, state) { const el=document.getElementById('dot-'+name); if(el) el.className='dot '+state; }
// ================================================================
// MANUAL MODE
// ================================================================
async function analyzeManual() {
const lat=parseFloat(document.getElementById('m-lat').value);
const lng=parseFloat(document.getElementById('m-lng').value);
const apiKey=document.getElementById('m-apikey').value.trim()||ls('apikey');
if(!apiKey){alert('Please enter your Anthropic API key.');return;}
const dopFile=document.getElementById('dop-upload').files[0];
const ionoFile=document.getElementById('iono-upload').files[0];
if(!dopFile&&!ionoFile){alert('Please upload at least one chart image.');return;}
const btn=document.getElementById('manual-run-btn');
btn.disabled=true; btn.textContent='⏳ ANALYZING…';
try {
const company=ls('company')||'', jobname=ls('jobname')||'', sitedesc=ls('sitedesc')||'';
const dates=manualDates.map(id=>{
const dv=document.getElementById('date-'+id)?.value;
const lv=document.getElementById('datelbl-'+id)?.value;
return dv?`${dv}${lv?' ('+lv+')':''}`:null;
}).filter(Boolean);
let wxData=null;
if(!isNaN(lat)&&!isNaN(lng)){try{wxData=await fetchWeather(lat,lng,Math.max(dates.length,1));}catch(e){}}
const content=[];
let ctx=`You are a senior GNSS survey operations expert analyzing Trimble GNSS Planning screenshots.\n\nJOB: ${company||'N/A'} — ${jobname||'N/A'}\nSITE: ${sitedesc||'N/A'}\n`;
if(!isNaN(lat)) ctx+=`LOCATION: ${lat.toFixed(4)}, ${lng.toFixed(4)}\n`;
if(dates.length) ctx+=`SURVEY DATES: ${dates.join(', ')}\n`;
ctx+='\n';
if(wxData){
ctx+=`WEATHER FORECAST:\n`;
const daily=wxData.daily;
for(let d=0;d<Math.min(dates.length||1,daily.time.length);d++){
ctx+=`${daily.time[d]}: ${wxDesc(daily.weathercode[d])}, High ${daily.temperature_2m_max[d]?.toFixed(0)}°F, Wind ${daily.windspeed_10m_max[d]?.toFixed(0)} mph\n`;
}
ctx+='\n';
}
ctx+=`Analyze the attached Trimble GNSS Planning chart(s) and provide:\n`;
if(dates.length>1){ctx+=`1. Day ranking best to worst with GO/CAUTION/NO-GO and rationale\n2. Best survey window per day\n3. Best 4-hour static GNSS window\n4. Drone assessment\n5. Field safety warnings\n6. Summary\nALL CAPS section labels. No markdown.`;}
else{ctx+=`1. GO / CAUTION / NO-GO recommendation\n2. Best survey window\n3. Best 4-hour static GNSS window\n4. Drone assessment\n5. Field safety warnings\n6. Summary\nALL CAPS section labels. No markdown.`;}
content.push({type:'text',text:ctx});
for(const file of [dopFile,ionoFile].filter(Boolean)){
const b64=await fileToBase64(file);
content.push({type:'image',source:{type:'base64',media_type:file.type||'image/png',data:b64}});
}
const res=await fetch('https://api.anthropic.com/v1/messages',{method:'POST',signal:AbortSignal.timeout(45000),headers:{'Content-Type':'application/json','x-api-key':apiKey,'anthropic-version':'2023-06-01','anthropic-dangerous-direct-browser-access':'true'},body:JSON.stringify({model:'claude-opus-4-5',max_tokens:1800,messages:[{role:'user',content}]})});
if(!res.ok){const e=await res.json().catch(()=>({}));throw new Error(e.error?.message||`HTTP ${res.status}`);}
const data=await res.json(), aiText=data.content[0].text;
document.getElementById('manual-results').classList.add('visible');
let html='';
if(wxData){
const numDays=Math.max(dates.length,1);
for(let d=0;d<numDays;d++){
const dayW=buildDayWeather(wxData,d);
if(dayW){
const wr=weatherRating(dayW);
const dateLabel=wxData.daily.time?.[d]||dates[d]||`Day ${d+1}`;
html+=`<div class="section-title">Weather — ${dateLabel}</div>`;
html+=formatWeatherHTML(dayW,wr)+buildFieldWarningsHTML(dayW)+formatDroneWindHTML(dayW);
}
}
}
const formatted=aiText.replace(/^([A-Z][A-Z\s\/\-]{2,}[A-Z]):?\s*$/gm,m=>`<strong>${m.trim()}</strong>`).replace(/\n/g,'<br>');
html+=`<div class="ai-card"><h3>AI Field Analysis — Claude Opus</h3><div class="ai-card-body">${formatted}</div></div>`;
document.getElementById('manual-result-area').innerHTML=html;
} catch(e) {
document.getElementById('manual-results').classList.add('visible');
document.getElementById('manual-result-area').innerHTML=`<div class="warn-banner">Analysis failed: ${e.message}</div>`;
}
btn.disabled=false; btn.textContent='📊 ANALYZE CHARTS';
}
function fileToBase64(file) {
return new Promise((resolve,reject)=>{
const r=new FileReader();
r.onload=e=>resolve(e.target.result.split(',')[1]);
r.onerror=reject;
r.readAsDataURL(file);
});
}
// ================================================================
// EXPORT
// ================================================================
// ================================================================
// COVER SHEET — generates for reports with 3+ days
// ================================================================
// ================================================================
// RENDER: RANKING PAGE (print page 2)
// ================================================================
function renderRankingPage(wxData, dopData, days) {
const el = document.getElementById('ranking-page');
if (!el || days < 3) { if (el) el.style.display = 'none'; return; }
el.style.display = 'block';
const daily = wxData.daily;
const DOW_FULL = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
const DOW_SHORT = ['SUN','MON','TUE','WED','THU','FRI','SAT'];
const WEEKEND = [0, 6]; // Sun, Sat
// Build scored list
const days_arr = [];
for (let d = 0; d < Math.min(days, daily.time.length); d++) {
const dopDay = dopData ? dopData[d] : null;
const score = scoreDayConditions(wxData, d, dopDay);
const dt = new Date(daily.time[d] + 'T12:00:00');
const dow = dt.getDay();
const isWeekend = WEEKEND.includes(dow);
const code = daily.weathercode[d];
const maxWind = daily.windspeed_10m_max[d] || 0;
const precip = daily.precipitation_sum?.[d] || 0;
const bestPdop = dopDay?.bestWindow?.avgPdop ?? dopDay?.avgPdop ?? null;
const bestSats = dopDay?.bestWindow?.sats ?? null;
const avgPdop = dopDay?.avgPdop ?? null;
days_arr.push({ d, score, dt, dow, isWeekend,
dateStr: dt.toLocaleDateString('en-US', {month:'short', day:'numeric'}),
dowFull: DOW_FULL[dow], dowShort: DOW_SHORT[dow],
code, wxLabel: wxDesc(code), maxWind, precip,
bestPdop, bestSats, avgPdop });
}
// Sort best→worst
const ranked = [...days_arr].sort((a, b) => a.score - b.score);
// Auto-generate notes per day
function makeNote(r, rank) {
const notes = [];
if (r.bestPdop !== null && r.bestPdop <= 0.78) notes.push('Best DOP window of the week');
if (r.bestSats !== null && r.bestSats >= 39) notes.push(`High sat count (${r.bestSats} sv)`);
if (r.precip > 0) notes.push(`Precip ${r.precip.toFixed(2)}" — moisture risk`);
if (r.maxWind > 20) notes.push(`High wind ${r.maxWind.toFixed(0)} mph — caution`);
else if (r.maxWind > 14) notes.push(`Wind ${r.maxWind.toFixed(0)} mph — slightly elevated`);
else if (r.maxWind <= 8) notes.push(`Low wind ${r.maxWind.toFixed(0)} mph`);
else notes.push(`Wind ${r.maxWind.toFixed(0)} mph`);
if (r.code === 45 || r.code === 48) notes.push('Fog — does not affect GNSS; may limit visibility');
if (r.code >= 61 && r.code <= 65) notes.push('Rain forecast');
if (r.code >= 71 && r.code <= 77) notes.push('Snow forecast');
if (r.isWeekend) notes.push('Weekend — overtime/premium labor costs apply');
if (rank === 1) notes.push('Top pick');
return notes.join('. ');
}
// GO/CAUTION/NO-GO badge
function goBadge(score) {
if (score < 30) return ['GO', 'rank-go'];
if (score < 60) return ['CAUTION', 'rank-caution'];
return ['NO-GO', 'rank-nogo'];
}
const rows = ranked.map((r, i) => {
const rank = i + 1;
const [badge, badgeCls] = goBadge(r.score);
const note = makeNote(r, rank);
const pdopStr = r.bestPdop !== null ? r.bestPdop.toFixed(2) : '—';
const satsStr = r.bestSats !== null ? r.bestSats : (r.avgPdop ? '~37' : '—');
const wknd = r.isWeekend ? `<span class="rank-weekend-tag">WEEKEND</span>` : '';
return `
<tr class="rank-row rank-row-${rank <= 3 ? 'top' : rank >= 6 ? 'low' : 'mid'}">
<td class="rank-n">${rank}</td>
<td class="rank-date">${r.dateStr}<br><span class="rank-dow">${r.dowFull}</span>${wknd}</td>
<td class="rank-pdop">${pdopStr}</td>
<td class="rank-sats">${satsStr}</td>
<td class="rank-wx">${r.wxLabel}</td>
<td class="rank-badge-cell"><span class="rank-badge ${badgeCls}">${badge}</span></td>
<td class="rank-notes">${note}</td>
</tr>`;
}).join('');
el.innerHTML = `
<div class="ranking-page-inner">
<div class="ranking-page-header">
<div class="ranking-page-title">WEEK RANKING</div>
<div class="ranking-page-sub">Best to worst for GNSS survey operations</div>
</div>
<div class="ranking-meta-note">Ranking considers PDOP, satellite count, weather, precipitation, wind, and operational day status.</div>
<div class="ranking-table-wrap">
<table class="ranking-table">
<thead>
<tr>
<th class="rh-rank">RANK</th>
<th class="rh-date">DATE / DAY</th>
<th class="rh-pdop">PDOP<br><span class="rh-sub">BEST 4-HR</span></th>
<th class="rh-sats">SATS</th>
<th class="rh-wx">WEATHER</th>
<th class="rh-badge">STATUS</th>
<th class="rh-notes">NOTES</th>
</tr>
</thead>
<tbody>${rows}</tbody>
</table>
</div>
</div>`;
}
function renderCoverSheet(wxData, dopData, days, lat, lng, company, jobname, sitedesc, aqiData, controlData) {
if (days < 3) {
document.getElementById('report-cover').style.display = 'none';
return;
}
const cover = document.getElementById('report-cover');
cover.style.display = 'block';
// ── Job info ────────────────────────────────────────────────────
const el = id => document.getElementById(id);
el('cover-company').textContent = company || 'GNSS Survey Report';
el('cover-jobname').textContent = jobname || '';
el('cover-location').textContent = autoLocLabel || sitedesc || '';
el('cover-coords').textContent = (!isNaN(lat) && !isNaN(lng))
? lat.toFixed(4) + ', ' + lng.toFixed(4) : '';
// Elevation
if (siteElevFt !== null) {
const elevEl = document.getElementById('cover-elev');
const elevSep = document.getElementById('cover-elev-sep');
if (elevEl) { elevEl.textContent = siteElevFt.toLocaleString() + ' ft'; elevEl.style.display = ''; }
if (elevSep) elevSep.style.display = '';
}
// ── High Elevation Weather Warning ──────────────────────────────
if (siteElevFt !== null && siteElevFt >= 5000) {
const row = document.getElementById('cover-elev-temp-row');
const txt = document.getElementById('cover-elev-temp-text');
if (row && txt) {
txt.textContent = `Site at ${siteElevFt.toLocaleString()} ft — weather model data may not fully reflect high-elevation conditions. Expect cooler temperatures, stronger winds, and faster-changing weather than forecast.`;
row.style.display = '';
}
}
// ── CORS Elevation Delta Warning ────────────────────────────────
(function() {
const deltaRow = document.getElementById('cover-elev-delta-row');
const deltaIcon = document.getElementById('cover-elev-delta-icon');
const deltaTxt = document.getElementById('cover-elev-delta-text');
if (!deltaRow || !deltaIcon || !deltaTxt) return;
const cors = (controlData && controlData.corsStations) ? controlData.corsStations : [];
const nearestRefElevFt = controlData?.nearestCorsElevFt ?? null;
const nearest = cors.length > 0 ? cors[0] : null;
if (siteElevFt !== null && nearestRefElevFt !== null && nearest) {
const delta = siteElevFt - nearestRefElevFt;
const absDelta = Math.abs(delta);
const dir = delta >= 0 ? 'above' : 'below';
let icon, bg, textColor, msg;
if (absDelta >= 4000) {
icon = '🔴'; bg = 'rgba(239,68,68,0.12)'; textColor = '#ef4444';
msg = `Site is ${absDelta.toLocaleString()} ft ${dir} nearest CORS station (${nearest.id}, ${nearest.dist} mi) — Significant elevation difference. Use dual-frequency receiver, plan extended occupation (2+ hrs), and verify atmosphere modeling.`;
} else if (absDelta >= 2000) {
icon = '⚠️'; bg = 'rgba(234,179,8,0.12)'; textColor = '#ca8a04';
msg = `Site is ${absDelta.toLocaleString()} ft ${dir} nearest CORS station (${nearest.id}, ${nearest.dist} mi) — Elevated baseline difference. Extended occupation recommended. Monitor tropospheric correction in processing.`;
} else {
icon = '✅'; bg = 'rgba(34,197,94,0.10)'; textColor = '#16a34a';
msg = `CORS Elev Delta: ${absDelta.toLocaleString()} ft ${dir} nearest CORS station (${nearest.id}, ${nearest.dist} mi) — Good baseline geometry.`;
}
deltaRow.style.background = bg;
deltaRow.style.display = 'flex';
deltaIcon.textContent = icon;
deltaTxt.style.color = textColor;
deltaTxt.textContent = msg;
} else if (siteElevFt !== null && nearest) {
deltaRow.style.background = 'rgba(100,116,139,0.10)';
deltaRow.style.display = 'flex';
deltaIcon.textContent = '📡';
deltaTxt.style.color = '#94a3b8';
deltaTxt.textContent = `Nearest CORS: ${nearest.id} (${nearest.dist} mi) — Elevation delta unavailable.`;
}
})();
// Declination (may arrive async — also called via updateCoverDeclination)
if (siteDeclDeg !== null) updateCoverDeclination(siteDeclDeg);
el('cover-gendate').textContent = new Date().toLocaleDateString('en-US',
{weekday:'short', month:'short', day:'numeric', year:'numeric'});
applyCountyToReport();
el('cover-report-type').textContent = days + '-DAY ANALYSIS';
const labelEl = document.getElementById('cover-section-label');
if (labelEl) labelEl.textContent = days + '-DAY FIELD RANKING · RANKED BEST TO WORST FOR GNSS OPERATIONS';
// ── Build and RANK all days ─────────────────────────────────────
const daily = wxData.daily;
const DOW_FULL = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
const DOW_SHORT = ['SUN','MON','TUE','WED','THU','FRI','SAT'];
const WEEKEND = [0, 6];
const rows = [];
for (let d = 0; d < Math.min(days, daily.time.length); d++) {
const score = scoreDayConditions(wxData, d, dopData ? dopData[d] : null);
const dopDay = dopData ? dopData[d] : null;
const dt = new Date(daily.time[d] + 'T12:00:00');
const dow = dt.getDay();
const isWeekend = WEEKEND.includes(dow);
const code = daily.weathercode[d];
const maxWind = daily.windspeed_10m_max?.[d] || 0;
const precip = daily.precipitation_sum?.[d] || 0;
// Best GNSS window from DOP data
let windowStr = '—';
if (dopDay && dopDay.bestWindow && dopDay.bestWindow.label) {
windowStr = dopDay.bestWindow.label;
} else if (dopDay && dopDay.hours && dopDay.hours.length) {
const fmtH = h => { const hh = h % 12 || 12, ap = h < 12 ? 'AM' : 'PM'; return hh + ':00 ' + ap; };
const fieldHours = dopDay.hours.filter(h => h.hour >= 6 && h.hour <= 19);
let bestScore = Infinity, bestStart = null, bestEnd = null;
for (let i = 0; i <= fieldHours.length - 4; i++) {
const win4 = fieldHours.slice(i, i + 4);
const avg = win4.reduce((s, h) => s + (h.pdop || 3), 0) / 4;
if (avg < bestScore) { bestScore = avg; bestStart = win4[0].hour; bestEnd = win4[3].hour; }
}
if (bestStart !== null) windowStr = fmtH(bestStart) + ' – ' + fmtH(bestEnd + 1);
}
// Best PDOP and sats
const bestPdop = dopDay?.bestWindow?.avgPdop ?? dopDay?.avgPdop ?? null;
const bestSats = dopDay?.bestWindow?.sats ?? null;
// GO/CAUTION/NO-GO
let badge, badgeClass;
if (score < 30) { badge = 'GO'; badgeClass = 'cover-badge-go'; }
else if (score < 60) { badge = 'CAUTION'; badgeClass = 'cover-badge-caution'; }
else { badge = 'NO-GO'; badgeClass = 'cover-badge-nogo'; }
// One-line note
const noteParts = [];
if (precip > 0) noteParts.push(`Precip ${precip.toFixed(2)}"`);
if (code === 45 || code === 48) noteParts.push('Fog AM');
if (maxWind > 20) noteParts.push(`Wind ${maxWind.toFixed(0)} mph — high`);
else if (maxWind > 14) noteParts.push(`Wind ${maxWind.toFixed(0)} mph`);
else if (maxWind <= 8) noteParts.push(`Wind ${maxWind.toFixed(0)} mph — calm`);
else noteParts.push(`Wind ${maxWind.toFixed(0)} mph`);
if (isWeekend) noteParts.push('Weekend');
const note = noteParts.join(' · ');
// AQI for this day — forecast only, blank if unavailable
const dateKey = daily.time[d]; // "2026-02-26"
const aqiDay = aqiData ? aqiData[dateKey] : null;
const aqiVal = aqiDay?.aqi ?? null;
const aqiEst = false;
const aqiCat = aqiDay?.category ?? null;
// Bump score for bad air quality
let aqiScorePenalty = 0;
if (aqiVal !== null) {
if (aqiVal > 200) aqiScorePenalty = 40;
else if (aqiVal > 150) aqiScorePenalty = 20;
else if (aqiVal > 100) aqiScorePenalty = 5;
}
rows.push({ d, score: score + aqiScorePenalty, dow, isWeekend,
dowShort: DOW_SHORT[dow], fullDow: DOW_FULL[dow],
dateStr: dt.toLocaleDateString('en-US', {month:'short', day:'numeric'}),
badge, badgeClass, windowStr, bestPdop, bestSats,
wxLabel: wxDesc(code), note, aqiVal, aqiCat });
}
// Sort best → worst by score, preserve original calendar order as tiebreak
rows.sort((a, b) => a.score - b.score || a.d - b.d);
// ── Render ranked table ─────────────────────────────────────────
const table = el('cover-summary-table');
table.innerHTML = rows.map((r, i) => {
const rank = i + 1;
const hasAqi = rows.some(r => r.aqiVal !== null);
const noKey = !ls('airnow_key');
const rankClass = rank === 1 ? 'cover-rank-1' : rank <= 3 ? 'cover-rank-top' : r.isWeekend ? 'cover-rank-wknd' : '';
const aqiLevel = r.aqiVal === null ? 'unknown' :
r.aqiVal <= 50 ? 'good' :
r.aqiVal <= 100 ? 'moderate' :
r.aqiVal <= 150 ? 'sensitive' :
r.aqiVal <= 200 ? 'unhealthy' : 'hazardous';
let aqiHtml;
if (r.aqiVal !== null) {
// Have real data — number only, red badge if unhealthy+
const isAlert = r.aqiVal > 150;
aqiHtml = `<div class="cover-aqi ${isAlert ? 'cover-aqi-alert' : 'cover-aqi-ok'}">
<div class="cover-aqi-val">${r.aqiVal}</div>
</div>`;
} else {
// No key or no data — empty cell, hidden in print
aqiHtml = `<div class="cover-aqi cover-aqi-nokey no-print"><div class="cover-aqi-val">—</div></div>`;
}
return `
<div class="cover-day-row ${rankClass}">
<div class="cover-rank-num">${rank}</div>
<div class="cover-day-dowcol">
<div class="cover-day-dow">${r.dowShort}</div>
<div class="cover-day-fulldate">${r.fullDow}, ${r.dateStr}</div>
${r.isWeekend ? '<div class="cover-wknd-tag">WEEKEND</div>' : ''}
</div>
<div class="cover-day-gnss-col">
<div class="cover-day-gnss-window">${r.windowStr}</div>
<div class="cover-day-pdop-sats">
${r.bestPdop ? `PDOP ${r.bestPdop.toFixed(2)}` : ''}${r.bestSats ? ` · ${r.bestSats} sv` : ''}
</div>
</div>
<div class="cover-day-wx-col">${r.wxLabel}</div>
${aqiHtml}
<div class="cover-day-note">${r.note}</div>
<div class="cover-day-badge ${r.badgeClass}">${r.badge}</div>
</div>`;
}).join('');
// ── QR Code ────────────────────────────────────────────────────
// Payload: human-readable ranked field summary the crew can read on their phone
const co_qr = (company||'').slice(0, 24);
const jn_qr = (jobname||'').slice(0, 24);
const dateStr_qr = new Date().toLocaleDateString('en-US',
{ weekday:'short', month:'short', day:'numeric', year:'numeric' });
let qrText = 'SKYGRID GNSS FIELD REPORT\n';
if (co_qr) qrText += co_qr + '\n';
if (jn_qr) qrText += jn_qr + '\n';
qrText += dateStr_qr + '\n';
qrText += '-------------------------\n';
qrText += 'RANK DAY WINDOW PDOP AQI STATUS\n';
rows.forEach((r, i) => {
const rank = String(i + 1).padEnd(5);
const day = (r.dowShort + ' ' + r.dateStr).padEnd(11);
const win = r.windowStr.replace(' AM',' AM').replace(' PM',' PM').padEnd(16);
const pdop = r.bestPdop ? r.bestPdop.toFixed(2).padEnd(6) : '— ';
const aqi = r.aqiVal !== null ? String(r.aqiVal).padEnd(6) : '— ';
const status = r.badge + (r.isWeekend ? ' [WKND]' : '') + (r.aqiVal > 150 ? ' ⚠SMOKE' : '');
qrText += rank + day + win + pdop + aqi + status + '\n';
});
qrText += '-------------------------\n';
// Best day callout
if (rows.length > 0) {
const best = rows[0];
qrText += 'TOP PICK: ' + best.fullDow + ' ' + best.dateStr + '\n';
qrText += 'WINDOW: ' + best.windowStr + '\n';
if (best.bestPdop) qrText += 'PDOP: ' + best.bestPdop.toFixed(2);
if (best.bestSats) qrText += ' / ' + best.bestSats + ' sv';
if (best.aqiVal !== null) qrText += '\nAQI: ' + best.aqiVal + ' ' + (best.aqiCat || '');
qrText += '\n';
}
// QR has ~900 char limit — trim and use lowest correction level
// Strip non-ASCII chars (unicode symbols blow up QR byte count)
const qrPayload = qrText.replace(/[^\x00-\x7F]/g, '').replace(/[ \t]+\n/g, '\n').slice(0, 700);
console.log('[SkyGrid] Cover QR payload length:', qrPayload.length);
if (coverQrTimer) { clearTimeout(coverQrTimer); coverQrTimer = null; }
coverQrTimer = setTimeout(() => {
coverQrTimer = null;
const qrDiv = el('cover-qr-canvas');
if (!qrDiv) { console.warn('[SkyGrid] cover-qr-canvas not found'); return; }
qrDiv.innerHTML = '';
try {
new QRCode(qrDiv, {
text: qrPayload, width: 80, height: 80,
colorDark: '#111111', colorLight: '#ffffff',
correctLevel: QRCode.CorrectLevel.L
});
console.log('[SkyGrid] Cover QR generated OK');
} catch(e) {
console.warn('[SkyGrid] Cover QR failed:', e.message);
}
}, 800);
}
function exportEmailAuto() {
const r = autoLastResult;
if (!r || !r.aiText) { alert('Generate a report first.'); return; }
const co = r.company || ls('company') || '';
const jn = r.jobname || ls('jobname') || '';
const now = new Date().toLocaleDateString('en-US', {weekday:'short', month:'short', day:'numeric', year:'numeric'});
const div = '─'.repeat(44);
function wEm(code) {
if (!code && code !== 0) return '';
if (code === 0) return '☀'; if (code <= 3) return '⛅';
if (code <= 49) return '🌫'; if (code <= 69) return '🌧';
if (code <= 79) return '❄'; if (code <= 82) return '🌧'; return '⛈';
}
function droneStr(dayW) {
if (!dayW) return '';
const s = windStatus(dayW.windMax||0, dayW.windGusts||0);
const hourly = dayW.hourly||[];
const srDec = (dayW.sunriseHour||5)+(dayW.sunriseMin||0)/60;
const ssDec = (dayW.sunsetHour||20)+(dayW.sunsetMin||0)/60;
let flyStart=null, flyEnd=null, bestRun=0, curRun=0, curStart=null;
hourly.forEach(h => {
if (h.hour < srDec || h.hour > ssDec) { curRun=0; curStart=null; return; }
if (windStatus(h.wind, h.gusts).rank === 0) {
curRun++; if (!curStart) curStart=h.hour;
if (curRun > bestRun) { bestRun=curRun; flyStart=curStart; flyEnd=h.hour; }
} else { curRun=0; curStart=null;
// ================================================================
// BATCH MODE
// ================================================================
let batchClients = [];
let batchSharedIono = null;
function saveBatchApiKey(v) {
try { localStorage.setItem('apikey', v); } catch(e) {}
// sync with auto panel key too
['a-apikey','m-apikey'].forEach(id => {
const el = document.getElementById(id);
if (el && el.value !== v) el.value = v;
});
}
function downloadBatchTemplate() {
// Format: company, address (street/city/zip — anything Nominatim can geocode)
const csv = [
'company,address',
'OutKast Designs,Colusa CA 95932',
'Survey Co,Reno NV 89501',
'Pacific Survey,Medford OR 97501',
'Smith & Associates,Sacramento CA 95814',
'Valley Survey,Fresno CA 93721',
].join('\n') + '\n';
const a = document.createElement('a');
a.href = 'data:text/csv;charset=utf-8,' + encodeURIComponent(csv);
a.download = 'SkyGrid_Batch_Template.csv';
a.click();
}
function parseCSVLine(line) {
// Handle quoted fields with commas inside
const result = [];
let cur = '', inQuote = false;
for (let i = 0; i < line.length; i++) {
const ch = line[i];
if (ch === '"') { inQuote = !inQuote; }
else if (ch === ',' && !inQuote) { result.push(cur.trim()); cur = ''; }
else { cur += ch; }
}
result.push(cur.trim());
return result;
}
async function geocodeBatchAddress(address) {
// Use Nominatim via CORS proxy (direct Nominatim is blocked on localhost)
const q = encodeURIComponent(address);
const proxies = [
`/.netlify/functions/nominatim?limit=1&q=${encodeURIComponent(address)}`,
];
for (const url of proxies) {
try {
const res = await fetch(url, { signal: AbortSignal.timeout(8000) });
if (!res.ok) continue;
const data = await res.json();
if (data && data.length) {
return { lat: parseFloat(data[0].lat), lng: parseFloat(data[0].lon), display: cleanAddress(data[0].display_name) };
}
} catch(e) { /* try next proxy */ }
}
return null;
}
async function loadBatchCSV(input) {
const file = input.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = async e => {
const lines = e.target.result.split('\n').map(l => l.trim()).filter(Boolean);
if (!lines.length) { alert('Empty CSV'); return; }
const firstLow = lines[0].toLowerCase();
const hasHeader = firstLow.includes('company') || firstLow.includes('address') || firstLow.includes('zip');
const dataLines = hasHeader ? lines.slice(1) : lines;
batchClients = [];
for (const line of dataLines) {
const cols = parseCSVLine(line);
if (cols.length < 2) continue;
const company = cols[0] || '';
// Everything after the first column is the address — join back with comma
const address = cols.slice(1).join(', ').trim();
if (!company || !address) continue;
batchClients.push({ company, address, lat: null, lng: null, displayAddr: '', geocodeStatus: 'pending' });
}
if (!batchClients.length) { alert('No valid rows found.\nFormat: company,address\nExample: OutKast Designs,Colusa CA 95932'); return; }
renderBatchTable();
document.getElementById('batch-preview').style.display = 'block';
document.getElementById('batch-run-btn').style.display = 'none'; // hide until geocoded
document.getElementById('batch-progress').style.display = 'none';
document.getElementById('batch-summary').style.display = 'none';
// Geocode all addresses
document.getElementById('batch-geocode-status').style.display = 'block';
let ok = 0, fail = 0;
for (let i = 0; i < batchClients.length; i++) {
const c = batchClients[i];
setBatchGeoStatus(i, '⏳', '#eab308', 'Geocoding…');
const geo = await geocodeBatchAddress(c.address);
if (geo) {
c.lat = geo.lat; c.lng = geo.lng; c.displayAddr = geo.display;
c.geocodeStatus = 'ok';
setBatchGeoStatus(i, '✓', '#22c55e', geo.lat.toFixed(4) + ', ' + geo.lng.toFixed(4));
ok++;
} else {
c.geocodeStatus = 'failed';
setBatchGeoStatus(i, '✗', '#ef4444', 'Not found — check address');
fail++;
}
// Small pause to be polite to Nominatim
await new Promise(r => setTimeout(r, 500));
}
document.getElementById('batch-geocode-status').textContent =
'Geocoding complete: ' + ok + ' found, ' + fail + ' failed' + (fail > 0 ? ' — fix failed rows before running' : '');
document.getElementById('batch-geocode-status').style.color = fail > 0 ? '#eab308' : '#22c55e';
const readyCount = batchClients.filter(c => c.geocodeStatus === 'ok').length;
if (readyCount > 0) {
document.getElementById('batch-run-btn').style.display = 'block';
document.getElementById('batch-run-btn').textContent =
'⚡ RUN BATCH — GENERATE ' + readyCount + ' REPORT' + (readyCount > 1 ? 'S' : '');
}
};
reader.readAsText(file);
}
function renderBatchTable() {
const tbody = document.getElementById('batch-tbody');
tbody.innerHTML = batchClients.map((c, i) => `
<tr id="batch-row-${i}">
<td style="color:var(--text-dim)">${i+1}</td>
<td>${c.company}</td>
<td style="color:var(--text-dim);font-size:11px">${c.address}</td>
<td id="batch-geo-${i}" style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim)">—</td>
<td id="batch-status-${i}"><span style="color:var(--text-dim)">Pending</span></td>
</tr>`).join('');
}
function setBatchGeoStatus(i, icon, color, text) {
const el = document.getElementById('batch-geo-' + i);
if (el) el.innerHTML = '<span style="color:' + color + '">' + icon + '</span> <span style="font-size:10px;color:var(--text-dim)">' + text + '</span>';
}
function setBatchStatus(i, html) {
const el = document.getElementById('batch-status-' + i);
if (el) el.innerHTML = html;
}
function clearBatch() {
batchClients = [];
batchSharedIono = null;
document.getElementById('batch-preview').style.display = 'none';
document.getElementById('batch-run-btn').style.display = 'none';
document.getElementById('batch-progress').style.display = 'none';
document.getElementById('batch-file').value = '';
}
function getBatchStartDate() {
const input = document.getElementById('b-startdate');
if (input && input.value) return new Date(input.value + 'T12:00:00Z');
const d = new Date(); d.setDate(d.getDate() + 1); return d;
}
async function runBatch() {
if (!batchClients.length) return;
const apiKey = document.getElementById('b-apikey').value.trim() || ls('apikey');
if (!apiKey) { alert('Please enter your Anthropic API key.'); return; }
const btn = document.getElementById('batch-run-btn');
btn.disabled = true;
btn.textContent = '⏳ Running…';
const progDiv = document.getElementById('batch-progress');
const progList = document.getElementById('batch-progress-list');
progDiv.style.display = 'block';
progList.innerHTML = '';
document.getElementById('batch-summary').style.display = 'none';
// Build progress rows
batchClients.forEach((c, i) => {
progList.innerHTML += `<div id="bprog-${i}" style="display:flex;align-items:center;gap:10px;padding:8px 12px;background:var(--bg3);border:1px solid var(--border);border-radius:5px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim);min-width:20px">${i+1}</span>
<span style="flex:1;font-size:12px">${c.company} — ${c.job}</span>
<span id="bprog-status-${i}" style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim)">Waiting…</span>
</div>`;
});
// Step 1: Fetch shared iono data ONCE
setBprogStatus(0, 'Fetching iono…', '#eab308');
try {
const [kpRaw, fluxRaw, tecRaw] = await Promise.all([fetchIonoData(), fetchSolarFlux(), fetchTEC(batchClients[0].lat, batchClients[0].lng)]);
batchSharedIono = interpretIono(kpRaw, fluxRaw, tecRaw);
} catch(e) {
batchSharedIono = null;
console.warn('[Batch] Iono fetch failed:', e.message);
}
// Fetch NANU ONCE for all batch clients (same constellation for all locations)
let batchNanuData = null;
try { batchNanuData = await fetchNanu(); } catch(e) { console.warn('[Batch] NANU fetch failed:', e.message); }
let batchLandCoverData = null;
// Step 2: Fetch almanac ONCE for the reference day (same for all locations)
const startDate = getBatchStartDate();
const refDateISO = getRefDay(startDate);
let almanacSats = null;
try {
const almanacData = await fetchGNSSAlmanac(refDateISO);
almanacSats = parseAlmanacSats(almanacData);
} catch(e) {
console.warn('[Batch] Almanac fetch failed:', e.message);
}
let passed = 0, failed = 0;
// Step 3: Run each client
for (let i = 0; i < batchClients.length; i++) {
const c = batchClients[i];
setBprogStatus(i, 'Running…', '#eab308');
setBatchStatus(i, '<span style="color:#eab308">⏳ Running</span>');
try {
// Skip clients that failed geocoding
if (c.geocodeStatus !== 'ok' || c.lat === null || c.lng === null) {
throw new Error('Geocoding failed — address not found');
}
// GNSS DOP — per location
let dopData = null;
if (almanacSats) {
dopData = almanacToDopData(almanacSats, c.lat, c.lng, startDate, selectedDays, refDateISO);
}
// Weather — per location
const wxData = await fetchWeather(c.lat, c.lng, selectedDays, startDate);
if (!wxData || !wxData.daily) throw new Error('Weather fetch failed');
// Land Cover — per location
try { batchLandCoverData = await fetchLandCover(c.lat, c.lng); } catch(e) { batchLandCoverData = null; }
// Use address as job/site description
const jobName = c.address;
const siteName = c.displayAddr ? c.displayAddr.split(',').slice(0,3).join(',') : c.address;
// AI prompt
const prompt = buildAutoPrompt(c.lat, c.lng, selectedDays, dopData, batchSharedIono, wxData, c.company, jobName, siteName, startDate, batchNanuData, fireData, batchLandCoverData, aqiData);
const aiText = await callClaudeAPI(prompt, apiKey);
// Render report into DOM
if (batchSharedIono) renderIonoPanel(batchSharedIono);
if (dopData) renderDopTable(dopData, wxData, selectedDays);
renderWeekGrid(wxData, dopData, selectedDays, faaData, airspaceData, lat, lng);
if (selectedDays >= 2) renderStaticWindowCard(wxData, dopData, selectedDays);
renderWildfireCard(fireData);
renderNanuCard(batchNanuData);
renderLandCoverCard(batchLandCoverData, dopData, almanacSats, c.lat, c.lng);
renderAISummary(aiText);
if (selectedDays >= 3) renderCoverSheet(wxData, dopData, selectedDays, c.lat, c.lng, c.company, jobName, siteName, aqiData, controlData);
// Update print header fields
document.title = 'SkyGrid Report — ' + c.company + ' | ' + c.job;
const ph1 = document.getElementById('printHeaderPrepared');
const ph2 = document.getElementById('printHeaderProject');
const ph3 = document.getElementById('printHeaderDate');
if (ph1) ph1.textContent = 'Prepared for: ' + c.company;
if (ph2) ph2.textContent = c.job;
if (ph3) ph3.textContent = 'Generated: ' + new Date().toLocaleDateString('en-US',{weekday:'long',year:'numeric',month:'long',day:'numeric'});
document.getElementById('auto-results').classList.add('visible');
// Brief pause to let DOM settle, then print
await new Promise(r => setTimeout(r, 800));
window.print();
// Wait for print dialog to close before continuing
await new Promise(r => setTimeout(r, 2000));
setBprogStatus(i, '✓ Done', '#22c55e');
setBatchStatus(i, '<span style="color:#22c55e">✓ Done</span>');
passed++;
} catch(e) {
console.error('[Batch] Client', i, 'failed:', e.message);
setBprogStatus(i, '✗ Failed: ' + e.message.substring(0,40), '#ef4444');
setBatchStatus(i, '<span style="color:#ef4444">✗ Failed</span>');
failed++;
}
// Small pause between jobs to avoid rate limiting
if (i < batchClients.length - 1) {
setBprogStatus(i+1, 'Starting in 3s…', '#eab308');
await new Promise(r => setTimeout(r, 3000));
}
}
// Summary
const sumDiv = document.getElementById('batch-summary');
sumDiv.style.display = 'block';
sumDiv.innerHTML = `<span style="color:${failed===0?'#22c55e':'#eab308'}">Batch complete: ${passed} succeeded, ${failed} failed.</span>${failed>0?' Check failed rows above.':''}`;
btn.disabled = false;
btn.textContent = '⚡ RUN BATCH — GENERATE ALL REPORTS';
document.title = 'SkyGrid — GNSS Survey Planning System';
}
function setBprogStatus(i, text, color) {
const el = document.getElementById('bprog-status-' + i);
if (el) { el.textContent = text; el.style.color = color || 'var(--text-dim)'; }
}
// Drag-and-drop on batch drop zone
document.addEventListener('DOMContentLoaded', () => {
const drop = document.getElementById('batch-drop');
if (!drop) return;
drop.addEventListener('dragover', e => { e.preventDefault(); drop.style.borderColor = 'var(--amber)'; });
drop.addEventListener('dragleave', () => { drop.style.borderColor = 'var(--border)'; });
drop.addEventListener('drop', e => {
e.preventDefault();
drop.style.borderColor = 'var(--border)';
const file = e.dataTransfer.files[0];
if (file) {
const input = document.getElementById('batch-file');
const dt = new DataTransfer(); dt.items.add(file);
input.files = dt.files;
loadBatchCSV(input);
}
});
// Sync API key from auto panel
const autoKey = document.getElementById('a-apikey');
const batchKey = document.getElementById('b-apikey');
if (autoKey && batchKey) {
const stored = (() => { try { return localStorage.getItem('apikey')||''; } catch(e){return '';} })();
if (stored) batchKey.value = stored;
}
});
}
});
const fmt12 = h => (h%12||12)+':00 '+(h<12?'AM':'PM');
const sunInfo = dayW.sunriseStr ? ' (sun '+dayW.sunriseStr+'-'+dayW.sunsetStr+')' : '';
const fly = flyStart !== null && bestRun >= 2
? fmt12(flyStart)+' - '+fmt12(flyEnd+1)+(bestRun>=4?' ('+bestRun+' hrs)':'')
: 'no daylight window';
return s.status+' - Fly: '+fly+sunInfo;
}
function wxLine(w, date) {
if (!w) return ' '+String(date).padEnd(12)+' (no weather data)';
const flags = [];
if (w.code >= 95) flags.push('!! THUNDERSTORMS');
else if (w.code >= 80) flags.push('! HEAVY RAIN');
else if (w.code >= 61) flags.push('! RAIN');
if (w.windGusts > 45) flags.push('!! EXTREME WIND');
else if (w.windGusts > 30) flags.push('! HIGH GUSTS');
if (w.tempMin < 32) flags.push('! FREEZING');
if (w.tempMax > 95) flags.push('! HEAT');
const sky = w.code===0?'Clear':w.code<=3?'Partly cloudy':w.code<=49?'Foggy':w.code<=69?'Rain':w.code<=79?'Snow':w.code<=82?'Showers':'Storms';
return ' '+String(date).padEnd(12)
+' '+sky.padEnd(14)
+' '+Math.round(w.tempMin)+'–'+Math.round(w.tempMax)+'°F'
+' Wind '+Math.round(w.windMax||0)+'/'+Math.round(w.windGusts||0)+' mph'
+(flags.length ? ' '+flags.join(' ') : '');
}
let body = '';
body += 'GNSS SURVEY PLANNING REPORT';
if (co) body += ' — '+co;
body += '\n';
if (jn) body += jn+'\n';
body += now;
if (r.selectedDays > 1) body += ' | '+r.selectedDays+'-Day Analysis';
body += '\n'+div+'\n\n';
// Iono summary
if (r.ionoResult) {
body += 'IONOSPHERIC CONDITIONS\n'+div+'\n';
body += ' Kp Peak: '+r.ionoResult.maxKp.toFixed(1)+' | Avg: '+r.ionoResult.avgKp.toFixed(1);
if (r.ionoResult.f107) body += ' | F10.7: '+r.ionoResult.f107.toFixed(0)+' sfu';
body += '\n Status: '+r.ionoResult.label+'\n';
body += ' '+r.ionoResult.summary+'\n\n';
}
// Weather at a glance
if (r.wxData && r.wxData.daily) {
const daily = r.wxData.daily;
const numDays = Math.min(r.selectedDays || 1, daily.time.length);
body += 'WEATHER AT A GLANCE\n'+div+'\n';
for (let d = 0; d < numDays; d++) {
const dayW = buildDayWeather(r.wxData, d);
body += wxLine(dayW, daily.time[d])+'\n';
}
body += '\n';
// Drone per day
body += 'DRONE / WIND STATUS\n'+div+'\n';
for (let d = 0; d < numDays; d++) {
const dayW = buildDayWeather(r.wxData, d);
body += ' '+String(daily.time[d]).padEnd(12)+' '+droneStr(dayW)+'\n';
}
body += '\n';
}
// AI analysis
body += 'FIELD ANALYSIS\n'+div+'\n';
body += r.aiText+'\n\n';
body += div+'\n';
body += 'See attached PDF for full analysis and DOP charts.\n';
body += div+'\n\nSent via SkyGrid GNSS Planning System\n';
navigator.clipboard.writeText(body).then(() => {
const btn = document.querySelector('#auto-panel .export-btn.email');
if (btn) { const orig=btn.textContent; btn.textContent='✓ Copied!'; setTimeout(()=>btn.textContent=orig, 2500); }
}).catch(() => alert('Copy failed.\n\n'+body));
}
function exportEmailManual() {
const area=document.getElementById('manual-result-area');
if(!area||!area.innerText){alert('Generate a report first.');return;}
const company=ls('company')||'', jobname=ls('jobname')||'';
const txt=`SKYGRID GNSS SURVEY PLANNING REPORT\n======================================\nDate: ${new Date().toLocaleDateString()}\n${company?'Company: '+company+'\n':''}${jobname?'Job: '+jobname+'\n':''}\n${area.innerText}\n\n---\nGenerated by SkyGrid v2`;
navigator.clipboard.writeText(txt).catch(()=>{});
alert('Copied!');
}
// ═══════════════════════════════════════════════════════════════
// SKYGRID COUNTY OFFICE LOOKUP
// 3,050 US jurisdictions embedded — ZERO external API calls
// County detected from Nominatim address string (already available)
// ═══════════════════════════════════════════════════════════════
const COUNTY_DATA = {"Aleutians East Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Aleutians East Borough Assessor","address":"3380 C St. Suite 205, Anchorage, AK 99503"}},"Aleutians West Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Anchorage Municipality, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Anchorage Municipal Assessor","address":"632 W 6th Ave. Suite 300, Anchorage, AK 99501"}},"Bethel Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Bristol Bay Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Bristol Bay Borough Assessor","address":"P.O. Box 189, Naknek, AK 99633"}},"Chugach Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Copper River Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Denali Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Denali Borough Assessor","address":"P.O. Box 480, Healy, AK 99743"}},"Dillingham Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Fairbanks North Star Borough, AK":{"recorder":{"name":"Fairbanks Recording District (DNR)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"},"assessor":{"name":"Fairbanks North Star Borough Assessor","address":"809 Pioneer Rd., Fairbanks, AK 99701"}},"Haines Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Haines Borough Assessor","address":"103 3rd Ave. S, Haines, AK 99827"}},"Hoonah-Angoon Census Area, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"}},"Juneau City and Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Juneau Borough Assessor","address":"155 S Seward St., Juneau, AK 99801"}},"Kenai Peninsula Borough, AK":{"recorder":{"name":"Kenai Recording District (DNR)","address":"120 Trading Bay Rd. Suite 160, Kenai, AK 99611"},"assessor":{"name":"Kenai Peninsula Borough Assessor","address":"144 N Binkley St., Soldotna, AK 99669"}},"Ketchikan Gateway Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Ketchikan Gateway Borough Assessor","address":"344 Front St., Ketchikan, AK 99901"}},"Kodiak Island Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Kodiak Island Borough Assessor","address":"710 Mill Bay Rd., Kodiak, AK 99615"}},"Kusilvak Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Lake and Peninsula Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Lake and Peninsula Borough Assessor","address":"P.O. Box 495, King Salmon, AK 99613"}},"Matanuska-Susitna Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Matanuska-Susitna Borough Assessor","address":"350 E Dahlia Ave., Palmer, AK 99645"}},"Nome Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"North Slope Borough, AK":{"recorder":{"name":"Fairbanks Recording District (DNR)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"},"assessor":{"name":"North Slope Borough Assessor","address":"P.O. Box 69, Barrow, AK 99723"}},"Northwest Arctic Borough, AK":{"recorder":{"name":"Fairbanks Recording District (DNR)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"},"assessor":{"name":"Northwest Arctic Borough Assessor","address":"P.O. Box 1110, Kotzebue, AK 99752"}},"Petersburg Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Petersburg Borough Assessor","address":"12 S Nordic Dr., Petersburg, AK 99833"}},"Prince of Wales-Hyder Census Area, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"}},"Sitka City and Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Sitka Borough Assessor","address":"100 Lincoln St., Sitka, AK 99835"}},"Skagway Municipality, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Skagway Municipality Assessor","address":"700 Spring St., Skagway, AK 99840"}},"Southeast Fairbanks Census Area, AK":{"recorder":{"name":"Fairbanks Recording District (DNR)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"}},"Valdez-Cordova Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Wrangell City and Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Wrangell Borough Assessor","address":"205 Brueger St., Wrangell, AK 99929"}},"Yakutat City and Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Yakutat Borough Assessor","address":"712 Ocean Cape Rd., Yakutat, AK 99689"}},"Yukon-Koyukuk Census Area, AK":{"recorder":{"name":"Fairbanks Recording District (DNR)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"}},"Autauga County, AL":{"recorder":{"name":"Autauga County Judge of Probate","address":"176 W 5th St., Prattville, AL 36067"},"assessor":{"name":"Autauga County Tax Assessor","address":"176 W 5th St., Prattville, AL 36067"}},"Baldwin County, AL":{"recorder":{"name":"Baldwin County Judge of Probate","address":"312 Courthouse Square Suite 10, Bay Minette, AL 36507"},"assessor":{"name":"Baldwin County Tax Assessor","address":"312 Courthouse Square Suite 10, Bay Minette, AL 36507"}},"Barbour County, AL":{"recorder":{"name":"Barbour County Judge of Probate","address":"303 E Broad St., Eufaula, AL 36027"},"assessor":{"name":"Barbour County Tax Assessor","address":"303 E Broad St., Eufaula, AL 36027"}},"Bibb County, AL":{"recorder":{"name":"Bibb County Judge of Probate","address":"8 Court Square Suite A, Centreville, AL 35042"},"assessor":{"name":"Bibb County Tax Assessor","address":"8 Court Square Suite A, Centreville, AL 35042"}},"Blount County, AL":{"recorder":{"name":"Blount County Judge of Probate","address":"220 2nd Ave E Suite 106, Oneonta, AL 35121"},"assessor":{"name":"Blount County Tax Assessor","address":"220 2nd Ave E Suite 106, Oneonta, AL 35121"}},"Bullock County, AL":{"recorder":{"name":"Bullock County Judge of Probate","address":"217 N Prairie St., Union Springs, AL 36089"},"assessor":{"name":"Bullock County Tax Assessor","address":"217 N Prairie St., Union Springs, AL 36089"}},"Butler County, AL":{"recorder":{"name":"Butler County Judge of Probate","address":"700 Court Square, Greenville, AL 36037"},"assessor":{"name":"Butler County Tax Assessor","address":"700 Court Square, Greenville, AL 36037"}},"Calhoun County, AL":{"recorder":{"name":"Calhoun County Judge of Probate","address":"25 W 11th St., Anniston, AL 36201"},"assessor":{"name":"Calhoun County Tax Assessor","address":"25 W 11th St., Anniston, AL 36201"}},"Chambers County, AL":{"recorder":{"name":"Chambers County Judge of Probate","address":"2 LaFayette St., LaFayette, AL 36862"},"assessor":{"name":"Chambers County Tax Assessor","address":"2 LaFayette St., LaFayette, AL 36862"}},"Cherokee County, AL":{"recorder":{"name":"Cherokee County Judge of Probate","address":"100 Main St. Suite 1, Centre, AL 35960"},"assessor":{"name":"Cherokee County Tax Assessor","address":"100 Main St. Suite 1, Centre, AL 35960"}},"Chilton County, AL":{"recorder":{"name":"Chilton County Judge of Probate","address":"500 2nd Ave N, Clanton, AL 35045"},"assessor":{"name":"Chilton County Tax Assessor","address":"500 2nd Ave N, Clanton, AL 35045"}},"Choctaw County, AL":{"recorder":{"name":"Choctaw County Judge of Probate","address":"117 S Mulberry Ave., Butler, AL 36904"},"assessor":{"name":"Choctaw County Tax Assessor","address":"117 S Mulberry Ave., Butler, AL 36904"}},"Clarke County, AL":{"recorder":{"name":"Clarke County Judge of Probate","address":"114 Court St., Grove Hill, AL 36451"},"assessor":{"name":"Clarke County Tax Assessor","address":"114 Court St., Grove Hill, AL 36451"}},"Clay County, AL":{"recorder":{"name":"Clay County Judge of Probate","address":"1 Court Square Suite B, Ashland, AL 36251"},"assessor":{"name":"Clay County Tax Assessor","address":"1 Court Square Suite B, Ashland, AL 36251"}},"Cleburne County, AL":{"recorder":{"name":"Cleburne County Judge of Probate","address":"406 Vickery St. Suite 1, Heflin, AL 36264"},"assessor":{"name":"Cleburne County Tax Assessor","address":"406 Vickery St. Suite 1, Heflin, AL 36264"}},"Coffee County, AL":{"recorder":{"name":"Coffee County Judge of Probate","address":"230 N Court Ave., Elba, AL 36323"},"assessor":{"name":"Coffee County Tax Assessor","address":"230 N Court Ave., Elba, AL 36323"}},"Colbert County, AL":{"recorder":{"name":"Colbert County Judge of Probate","address":"201 N Main St., Tuscumbia, AL 35674"},"assessor":{"name":"Colbert County Tax Assessor","address":"201 N Main St., Tuscumbia, AL 35674"}},"Conecuh County, AL":{"recorder":{"name":"Conecuh County Judge of Probate","address":"1 Courthouse Square, Evergreen, AL 36401"},"assessor":{"name":"Conecuh County Tax Assessor","address":"1 Courthouse Square, Evergreen, AL 36401"}},"Coosa County, AL":{"recorder":{"name":"Coosa County Judge of Probate","address":"9 Court Square Suite A, Rockford, AL 35136"},"assessor":{"name":"Coosa County Tax Assessor","address":"9 Court Square Suite A, Rockford, AL 35136"}},"Covington County, AL":{"recorder":{"name":"Covington County Judge of Probate","address":"1 Court Square, Andalusia, AL 36420"},"assessor":{"name":"Covington County Tax Assessor","address":"1 Court Square, Andalusia, AL 36420"}},"Crenshaw County, AL":{"recorder":{"name":"Crenshaw County Judge of Probate","address":"29 S Glenwood Ave., Luverne, AL 36049"},"assessor":{"name":"Crenshaw County Tax Assessor","address":"29 S Glenwood Ave., Luverne, AL 36049"}},"Cullman County, AL":{"recorder":{"name":"Cullman County Judge of Probate","address":"500 2nd Ave SW Suite 102, Cullman, AL 35055"},"assessor":{"name":"Cullman County Tax Assessor","address":"500 2nd Ave SW Suite 102, Cullman, AL 35055"}},"Dale County, AL":{"recorder":{"name":"Dale County Judge of Probate","address":"100 S Main St., Ozark, AL 36360"},"assessor":{"name":"Dale County Tax Assessor","address":"100 S Main St., Ozark, AL 36360"}},"Dallas County, AL":{"recorder":{"name":"Dallas County Judge of Probate","address":"105 Lauderdale St., Selma, AL 36701"},"assessor":{"name":"Dallas County Tax Assessor","address":"105 Lauderdale St., Selma, AL 36701"}},"DeKalb County, AL":{"recorder":{"name":"DeKalb County Judge of Probate","address":"111 Grand Ave. SW Suite 1, Fort Payne, AL 35967"},"assessor":{"name":"DeKalb County Tax Assessor","address":"111 Grand Ave. SW Suite 1, Fort Payne, AL 35967"}},"Elmore County, AL":{"recorder":{"name":"Elmore County Judge of Probate","address":"100 E Commerce St., Wetumpka, AL 36092"},"assessor":{"name":"Elmore County Tax Assessor","address":"100 E Commerce St., Wetumpka, AL 36092"}},"Escambia County, AL":{"recorder":{"name":"Escambia County Judge of Probate","address":"314 Belleville Ave., Brewton, AL 36426"},"assessor":{"name":"Escambia County Tax Assessor","address":"314 Belleville Ave., Brewton, AL 36426"}},"Etowah County, AL":{"recorder":{"name":"Etowah County Judge of Probate","address":"800 Forrest Ave. Suite 203, Gadsden, AL 35901"},"assessor":{"name":"Etowah County Tax Assessor","address":"800 Forrest Ave. Suite 203, Gadsden, AL 35901"}},"Fayette County, AL":{"recorder":{"name":"Fayette County Judge of Probate","address":"113 1st Ave NW, Fayette, AL 35555"},"assessor":{"name":"Fayette County Tax Assessor","address":"113 1st Ave NW, Fayette, AL 35555"}},"Franklin County, AL":{"recorder":{"name":"Franklin County Judge of Probate","address":"410 N Jackson Ave. Suite 5, Russellville, AL 35653"},"assessor":{"name":"Franklin County Tax Assessor","address":"410 N Jackson Ave. Suite 5, Russellville, AL 35653"}},"Geneva County, AL":{"recorder":{"name":"Geneva County Judge of Probate","address":"200 N Commerce St., Geneva, AL 36340"},"assessor":{"name":"Geneva County Tax Assessor","address":"200 N Commerce St., Geneva, AL 36340"}},"Greene County, AL":{"recorder":{"name":"Greene County Judge of Probate","address":"400 Morrow Ave., Eutaw, AL 35462"},"assessor":{"name":"Greene County Tax Assessor","address":"400 Morrow Ave., Eutaw, AL 35462"}},"Hale County, AL":{"recorder":{"name":"Hale County Judge of Probate","address":"1001 Main St., Greensboro, AL 36744"},"assessor":{"name":"Hale County Tax Assessor","address":"1001 Main St., Greensboro, AL 36744"}},"Henry County, AL":{"recorder":{"name":"Henry County Judge of Probate","address":"101 Court Square Suite A, Abbeville, AL 36310"},"assessor":{"name":"Henry County Tax Assessor","address":"101 Court Square Suite A, Abbeville, AL 36310"}},"Houston County, AL":{"recorder":{"name":"Houston County Judge of Probate","address":"462 N Oates St., Dothan, AL 36303"},"assessor":{"name":"Houston County Tax Assessor","address":"462 N Oates St., Dothan, AL 36303"}},"Jackson County, AL":{"recorder":{"name":"Jackson County Judge of Probate","address":"102 E Laurel St., Scottsboro, AL 35768"},"assessor":{"name":"Jackson County Tax Assessor","address":"102 E Laurel St., Scottsboro, AL 35768"}},"Jefferson County, AL":{"recorder":{"name":"Jefferson County Judge of Probate","address":"716 N 21st St., Birmingham, AL 35203"},"assessor":{"name":"Jefferson County Tax Assessor","address":"716 N 21st St., Birmingham, AL 35203"}},"Lamar County, AL":{"recorder":{"name":"Lamar County Judge of Probate","address":"330 1st St. NE, Vernon, AL 35592"},"assessor":{"name":"Lamar County Tax Assessor","address":"330 1st St. NE, Vernon, AL 35592"}},"Lauderdale County, AL":{"recorder":{"name":"Lauderdale County Judge of Probate","address":"200 S Court St., Florence, AL 35630"},"assessor":{"name":"Lauderdale County Tax Assessor","address":"200 S Court St., Florence, AL 35630"}},"Lawrence County, AL":{"recorder":{"name":"Lawrence County Judge of Probate","address":"14001 Market St. Suite B, Moulton, AL 35650"},"assessor":{"name":"Lawrence County Tax Assessor","address":"14001 Market St. Suite B, Moulton, AL 35650"}},"Lee County, AL":{"recorder":{"name":"Lee County Judge of Probate","address":"215 S 9th St., Opelika, AL 36801"},"assessor":{"name":"Lee County Tax Assessor","address":"215 S 9th St., Opelika, AL 36801"}},"Limestone County, AL":{"recorder":{"name":"Limestone County Judge of Probate","address":"200 W Washington St. Suite 2, Athens, AL 35611"},"assessor":{"name":"Limestone County Tax Assessor","address":"200 W Washington St. Suite 2, Athens, AL 35611"}},"Lowndes County, AL":{"recorder":{"name":"Lowndes County Judge of Probate","address":"1 Courthouse Square, Hayneville, AL 36040"},"assessor":{"name":"Lowndes County Tax Assessor","address":"1 Courthouse Square, Hayneville, AL 36040"}},"Macon County, AL":{"recorder":{"name":"Macon County Judge of Probate","address":"101 E Rosa Parks Ave., Tuskegee, AL 36083"},"assessor":{"name":"Macon County Tax Assessor","address":"101 E Rosa Parks Ave., Tuskegee, AL 36083"}},"Madison County, AL":{"recorder":{"name":"Madison County Judge of Probate","address":"100 Northside Square Suite 542, Huntsville, AL 35801"},"assessor":{"name":"Madison County Tax Assessor","address":"100 Northside Square Suite 136, Huntsville, AL 35801"}},"Marengo County, AL":{"recorder":{"name":"Marengo County Judge of Probate","address":"101 E Coats Ave., Linden, AL 36748"},"assessor":{"name":"Marengo County Tax Assessor","address":"101 E Coats Ave., Linden, AL 36748"}},"Marion County, AL":{"recorder":{"name":"Marion County Judge of Probate","address":"132 Military St. S, Hamilton, AL 35570"},"assessor":{"name":"Marion County Tax Assessor","address":"132 Military St. S, Hamilton, AL 35570"}},"Marshall County, AL":{"recorder":{"name":"Marshall County Judge of Probate","address":"425 Gunter Ave., Guntersville, AL 35976"},"assessor":{"name":"Marshall County Tax Assessor","address":"425 Gunter Ave., Guntersville, AL 35976"}},"Mobile County, AL":{"recorder":{"name":"Mobile County Judge of Probate","address":"205 Government St. Room S-11, Mobile, AL 36644"},"assessor":{"name":"Mobile County Tax Assessor","address":"3925 Michael Blvd. Suite G, Mobile, AL 36609"}},"Monroe County, AL":{"recorder":{"name":"Monroe County Judge of Probate","address":"65 N Alabama Ave., Monroeville, AL 36460"},"assessor":{"name":"Monroe County Tax Assessor","address":"65 N Alabama Ave., Monroeville, AL 36460"}},"Montgomery County, AL":{"recorder":{"name":"Montgomery County Judge of Probate","address":"100 S Lawrence St., Montgomery, AL 36104"},"assessor":{"name":"Montgomery County Tax Assessor","address":"100 S Lawrence St., Montgomery, AL 36104"}},"Morgan County, AL":{"recorder":{"name":"Morgan County Judge of Probate","address":"302 Lee St. NE Suite 100, Decatur, AL 35601"},"assessor":{"name":"Morgan County Tax Assessor","address":"302 Lee St. NE Suite 100, Decatur, AL 35601"}},"Perry County, AL":{"recorder":{"name":"Perry County Judge of Probate","address":"300 Washington St., Marion, AL 36756"},"assessor":{"name":"Perry County Tax Assessor","address":"300 Washington St., Marion, AL 36756"}},"Pickens County, AL":{"recorder":{"name":"Pickens County Judge of Probate","address":"1 Courthouse Square, Carrollton, AL 35447"},"assessor":{"name":"Pickens County Tax Assessor","address":"1 Courthouse Square, Carrollton, AL 35447"}},"Pike County, AL":{"recorder":{"name":"Pike County Judge of Probate","address":"120 W Church St. Suite 41, Troy, AL 36081"},"assessor":{"name":"Pike County Tax Assessor","address":"120 W Church St. Suite 41, Troy, AL 36081"}},"Randolph County, AL":{"recorder":{"name":"Randolph County Judge of Probate","address":"1 Main St., Wedowee, AL 36278"},"assessor":{"name":"Randolph County Tax Assessor","address":"1 Main St., Wedowee, AL 36278"}},"Russell County, AL":{"recorder":{"name":"Russell County Judge of Probate","address":"501 14th St., Phenix City, AL 36867"},"assessor":{"name":"Russell County Tax Assessor","address":"501 14th St., Phenix City, AL 36867"}},"St. Clair County, AL":{"recorder":{"name":"St. Clair County Judge of Probate","address":"1815 Cogswell Ave. Suite 210, Pell City, AL 35125"},"assessor":{"name":"St. Clair County Tax Assessor","address":"1815 Cogswell Ave. Suite 210, Pell City, AL 35125"}},"Shelby County, AL":{"recorder":{"name":"Shelby County Judge of Probate","address":"112 N Main St., Columbiana, AL 35051"},"assessor":{"name":"Shelby County Tax Assessor","address":"112 N Main St., Columbiana, AL 35051"}},"Sumter County, AL":{"recorder":{"name":"Sumter County Judge of Probate","address":"Franklin St., Livingston, AL 35470"},"assessor":{"name":"Sumter County Tax Assessor","address":"Franklin St., Livingston, AL 35470"}},"Talladega County, AL":{"recorder":{"name":"Talladega County Judge of Probate","address":"315 W Oak St. Suite 1, Talladega, AL 35160"},"assessor":{"name":"Talladega County Tax Assessor","address":"315 W Oak St. Suite 1, Talladega, AL 35160"}},"Tallapoosa County, AL":{"recorder":{"name":"Tallapoosa County Judge of Probate","address":"125 N Broadnax St. Suite 105, Dadeville, AL 36853"},"assessor":{"name":"Tallapoosa County Tax Assessor","address":"125 N Broadnax St. Suite 105, Dadeville, AL 36853"}},"Tuscaloosa County, AL":{"recorder":{"name":"Tuscaloosa County Judge of Probate","address":"714 Greensboro Ave., Tuscaloosa, AL 35401"},"assessor":{"name":"Tuscaloosa County Tax Assessor","address":"714 Greensboro Ave., Tuscaloosa, AL 35401"}},"Walker County, AL":{"recorder":{"name":"Walker County Judge of Probate","address":"1803 3rd Ave., Jasper, AL 35501"},"assessor":{"name":"Walker County Tax Assessor","address":"1803 3rd Ave., Jasper, AL 35501"}},"Washington County, AL":{"recorder":{"name":"Washington County Judge of Probate","address":"101 Court St., Chatom, AL 36518"},"assessor":{"name":"Washington County Tax Assessor","address":"101 Court St., Chatom, AL 36518"}},"Wilcox County, AL":{"recorder":{"name":"Wilcox County Judge of Probate","address":"100 Broad St., Camden, AL 36726"},"assessor":{"name":"Wilcox County Tax Assessor","address":"100 Broad St., Camden, AL 36726"}},"Winston County, AL":{"recorder":{"name":"Winston County Judge of Probate","address":"Double Springs, AL 35553"},"assessor":{"name":"Winston County Tax Assessor","address":"Double Springs, AL 35553"}},"Arkansas County, AR":{"recorder":{"name":"Arkansas County Circuit Clerk","address":"101 Court Square, DeWitt, AR 72042"},"assessor":{"name":"Arkansas County Assessor","address":"101 Court Square, DeWitt, AR 72042"}},"Ashley County, AR":{"recorder":{"name":"Ashley County Circuit Clerk","address":"205 E Jefferson St., Hamburg, AR 71646"},"assessor":{"name":"Ashley County Assessor","address":"205 E Jefferson St., Hamburg, AR 71646"}},"Baxter County, AR":{"recorder":{"name":"Baxter County Circuit Clerk","address":"1 E 7th St., Mountain Home, AR 72653"},"assessor":{"name":"Baxter County Assessor","address":"1 E 7th St., Mountain Home, AR 72653"}},"Benton County, AR":{"recorder":{"name":"Benton County Circuit Clerk","address":"215 E Central Ave., Bentonville, AR 72712"},"assessor":{"name":"Benton County Assessor","address":"215 E Central Ave., Bentonville, AR 72712"}},"Boone County, AR":{"recorder":{"name":"Boone County Circuit Clerk","address":"100 N Main St., Harrison, AR 72601"},"assessor":{"name":"Boone County Assessor","address":"100 N Main St., Harrison, AR 72601"}},"Bradley County, AR":{"recorder":{"name":"Bradley County Circuit Clerk","address":"101 E Cedar St., Warren, AR 71671"},"assessor":{"name":"Bradley County Assessor","address":"101 E Cedar St., Warren, AR 71671"}},"Calhoun County, AR":{"recorder":{"name":"Calhoun County Circuit Clerk","address":"250 Pine St. Suite 4, Hampton, AR 71744"},"assessor":{"name":"Calhoun County Assessor","address":"250 Pine St. Suite 4, Hampton, AR 71744"}},"Carroll County, AR":{"recorder":{"name":"Carroll County Circuit Clerk","address":"210 W Church Ave., Berryville, AR 72616"},"assessor":{"name":"Carroll County Assessor","address":"210 W Church Ave., Berryville, AR 72616"}},"Chicot County, AR":{"recorder":{"name":"Chicot County Circuit Clerk","address":"108 Main St., Lake Village, AR 71653"},"assessor":{"name":"Chicot County Assessor","address":"108 Main St., Lake Village, AR 71653"}},"Clark County, AR":{"recorder":{"name":"Clark County Circuit Clerk","address":"401 Clay St., Arkadelphia, AR 71923"},"assessor":{"name":"Clark County Assessor","address":"401 Clay St., Arkadelphia, AR 71923"}},"Clay County, AR":{"recorder":{"name":"Clay County Circuit Clerk","address":"151 S Second St., Piggott, AR 72454"},"assessor":{"name":"Clay County Assessor","address":"151 S Second St., Piggott, AR 72454"}},"Cleburne County, AR":{"recorder":{"name":"Cleburne County Circuit Clerk","address":"301 W Main St., Heber Springs, AR 72543"},"assessor":{"name":"Cleburne County Assessor","address":"301 W Main St., Heber Springs, AR 72543"}},"Cleveland County, AR":{"recorder":{"name":"Cleveland County Circuit Clerk","address":"100 Courthouse Square, Rison, AR 71665"},"assessor":{"name":"Cleveland County Assessor","address":"100 Courthouse Square, Rison, AR 71665"}},"Columbia County, AR":{"recorder":{"name":"Columbia County Circuit Clerk","address":"1 Court Square Suite 1, Magnolia, AR 71753"},"assessor":{"name":"Columbia County Assessor","address":"1 Court Square Suite 1, Magnolia, AR 71753"}},"Conway County, AR":{"recorder":{"name":"Conway County Circuit Clerk","address":"117 S Moose St., Morrilton, AR 72110"},"assessor":{"name":"Conway County Assessor","address":"117 S Moose St., Morrilton, AR 72110"}},"Craighead County, AR":{"recorder":{"name":"Craighead County Circuit Clerk","address":"511 Union St., Jonesboro, AR 72401"},"assessor":{"name":"Craighead County Assessor","address":"511 Union St., Jonesboro, AR 72401"}},"Crawford County, AR":{"recorder":{"name":"Crawford County Circuit Clerk","address":"300 Main St., Van Buren, AR 72956"},"assessor":{"name":"Crawford County Assessor","address":"300 Main St., Van Buren, AR 72956"}},"Crittenden County, AR":{"recorder":{"name":"Crittenden County Circuit Clerk","address":"100 Court St., Marion, AR 72364"},"assessor":{"name":"Crittenden County Assessor","address":"100 Court St., Marion, AR 72364"}},"Cross County, AR":{"recorder":{"name":"Cross County Circuit Clerk","address":"705 Union Ave E, Wynne, AR 72396"},"assessor":{"name":"Cross County Assessor","address":"705 Union Ave E, Wynne, AR 72396"}},"Dallas County, AR":{"recorder":{"name":"Dallas County Circuit Clerk","address":"206 W 3rd St., Fordyce, AR 71742"},"assessor":{"name":"Dallas County Assessor","address":"206 W 3rd St., Fordyce, AR 71742"}},"Desha County, AR":{"recorder":{"name":"Desha County Circuit Clerk","address":"302 S Main St., Arkansas City, AR 71630"},"assessor":{"name":"Desha County Assessor","address":"302 S Main St., Arkansas City, AR 71630"}},"Drew County, AR":{"recorder":{"name":"Drew County Circuit Clerk","address":"210 S Main St., Monticello, AR 71655"},"assessor":{"name":"Drew County Assessor","address":"210 S Main St., Monticello, AR 71655"}},"Faulkner County, AR":{"recorder":{"name":"Faulkner County Circuit Clerk","address":"801 Locust St., Conway, AR 72034"},"assessor":{"name":"Faulkner County Assessor","address":"801 Locust St., Conway, AR 72034"}},"Franklin County, AR":{"recorder":{"name":"Franklin County Circuit Clerk","address":"211 W Commercial St., Ozark, AR 72949"},"assessor":{"name":"Franklin County Assessor","address":"211 W Commercial St., Ozark, AR 72949"}},"Fulton County, AR":{"recorder":{"name":"Fulton County Circuit Clerk","address":"Box 485, Salem, AR 72576"},"assessor":{"name":"Fulton County Assessor","address":"Salem, AR 72576"}},"Garland County, AR":{"recorder":{"name":"Garland County Circuit Clerk","address":"501 Ouachita Ave., Hot Springs, AR 71901"},"assessor":{"name":"Garland County Assessor","address":"501 Ouachita Ave., Hot Springs, AR 71901"}},"Grant County, AR":{"recorder":{"name":"Grant County Circuit Clerk","address":"101 W Center St., Sheridan, AR 72150"},"assessor":{"name":"Grant County Assessor","address":"101 W Center St., Sheridan, AR 72150"}},"Greene County, AR":{"recorder":{"name":"Greene County Circuit Clerk","address":"320 W Court St., Paragould, AR 72450"},"assessor":{"name":"Greene County Assessor","address":"320 W Court St., Paragould, AR 72450"}},"Hempstead County, AR":{"recorder":{"name":"Hempstead County Circuit Clerk","address":"400 S Washington St., Hope, AR 71801"},"assessor":{"name":"Hempstead County Assessor","address":"400 S Washington St., Hope, AR 71801"}},"Hot Spring County, AR":{"recorder":{"name":"Hot Spring County Circuit Clerk","address":"210 Locust St., Malvern, AR 72104"},"assessor":{"name":"Hot Spring County Assessor","address":"210 Locust St., Malvern, AR 72104"}},"Howard County, AR":{"recorder":{"name":"Howard County Circuit Clerk","address":"421 N Main St., Nashville, AR 71852"},"assessor":{"name":"Howard County Assessor","address":"421 N Main St., Nashville, AR 71852"}},"Independence County, AR":{"recorder":{"name":"Independence County Circuit Clerk","address":"192 E Main St., Batesville, AR 72501"},"assessor":{"name":"Independence County Assessor","address":"192 E Main St., Batesville, AR 72501"}},"Izard County, AR":{"recorder":{"name":"Izard County Circuit Clerk","address":"1 E Front St., Melbourne, AR 72556"},"assessor":{"name":"Izard County Assessor","address":"1 E Front St., Melbourne, AR 72556"}},"Jackson County, AR":{"recorder":{"name":"Jackson County Circuit Clerk","address":"208 Main St., Newport, AR 72112"},"assessor":{"name":"Jackson County Assessor","address":"208 Main St., Newport, AR 72112"}},"Jefferson County, AR":{"recorder":{"name":"Jefferson County Circuit Clerk","address":"101 W Barraque St., Pine Bluff, AR 71601"},"assessor":{"name":"Jefferson County Assessor","address":"101 W Barraque St., Pine Bluff, AR 71601"}},"Johnson County, AR":{"recorder":{"name":"Johnson County Circuit Clerk","address":"215 W Main St., Clarksville, AR 72830"},"assessor":{"name":"Johnson County Assessor","address":"215 W Main St., Clarksville, AR 72830"}},"Lafayette County, AR":{"recorder":{"name":"Lafayette County Circuit Clerk","address":"2 Courthouse Square, Lewisville, AR 71845"},"assessor":{"name":"Lafayette County Assessor","address":"2 Courthouse Square, Lewisville, AR 71845"}},"Lawrence County, AR":{"recorder":{"name":"Lawrence County Circuit Clerk","address":"315 W Main St., Walnut Ridge, AR 72476"},"assessor":{"name":"Lawrence County Assessor","address":"315 W Main St., Walnut Ridge, AR 72476"}},"Lee County, AR":{"recorder":{"name":"Lee County Circuit Clerk","address":"15 E Chestnut St., Marianna, AR 72360"},"assessor":{"name":"Lee County Assessor","address":"15 E Chestnut St., Marianna, AR 72360"}},"Lincoln County, AR":{"recorder":{"name":"Lincoln County Circuit Clerk","address":"300 S Drew St., Star City, AR 71667"},"assessor":{"name":"Lincoln County Assessor","address":"300 S Drew St., Star City, AR 71667"}},"Little River County, AR":{"recorder":{"name":"Little River County Circuit Clerk","address":"351 N 2nd St., Ashdown, AR 71822"},"assessor":{"name":"Little River County Assessor","address":"351 N 2nd St., Ashdown, AR 71822"}},"Logan County, AR":{"recorder":{"name":"Logan County Circuit Clerk","address":"25 W Walnut St., Paris, AR 72855"},"assessor":{"name":"Logan County Assessor","address":"25 W Walnut St., Paris, AR 72855"}},"Lonoke County, AR":{"recorder":{"name":"Lonoke County Circuit Clerk","address":"301 N Center St., Lonoke, AR 72086"},"assessor":{"name":"Lonoke County Assessor","address":"301 N Center St., Lonoke, AR 72086"}},"Madison County, AR":{"recorder":{"name":"Madison County Circuit Clerk","address":"201 W Main St., Huntsville, AR 72740"},"assessor":{"name":"Madison County Assessor","address":"201 W Main St., Huntsville, AR 72740"}},"Marion County, AR":{"recorder":{"name":"Marion County Circuit Clerk","address":"310 E Old Main St., Yellville, AR 72687"},"assessor":{"name":"Marion County Assessor","address":"310 E Old Main St., Yellville, AR 72687"}},"Miller County, AR":{"recorder":{"name":"Miller County Circuit Clerk","address":"400 Laurel St., Texarkana, AR 71854"},"assessor":{"name":"Miller County Assessor","address":"400 Laurel St., Texarkana, AR 71854"}},"Mississippi County, AR":{"recorder":{"name":"Mississippi County Circuit Clerk","address":"200 W Walnut St., Blytheville, AR 72315"},"assessor":{"name":"Mississippi County Assessor","address":"200 W Walnut St., Blytheville, AR 72315"}},"Monroe County, AR":{"recorder":{"name":"Monroe County Circuit Clerk","address":"123 Madison St., Clarendon, AR 72029"},"assessor":{"name":"Monroe County Assessor","address":"123 Madison St., Clarendon, AR 72029"}},"Montgomery County, AR":{"recorder":{"name":"Montgomery County Circuit Clerk","address":"105 Hwy 270 E, Mount Ida, AR 71957"},"assessor":{"name":"Montgomery County Assessor","address":"105 Hwy 270 E, Mount Ida, AR 71957"}},"Nevada County, AR":{"recorder":{"name":"Nevada County Circuit Clerk","address":"215 E 2nd St. N, Prescott, AR 71857"},"assessor":{"name":"Nevada County Assessor","address":"215 E 2nd St. N, Prescott, AR 71857"}},"Newton County, AR":{"recorder":{"name":"Newton County Circuit Clerk","address":"100 E Court St., Jasper, AR 72641"},"assessor":{"name":"Newton County Assessor","address":"100 E Court St., Jasper, AR 72641"}},"Ouachita County, AR":{"recorder":{"name":"Ouachita County Circuit Clerk","address":"145 Jefferson St. SW, Camden, AR 71701"},"assessor":{"name":"Ouachita County Assessor","address":"145 Jefferson St. SW, Camden, AR 71701"}},"Perry County, AR":{"recorder":{"name":"Perry County Circuit Clerk","address":"310 W Main St., Perryville, AR 72126"},"assessor":{"name":"Perry County Assessor","address":"310 W Main St., Perryville, AR 72126"}},"Phillips County, AR":{"recorder":{"name":"Phillips County Circuit Clerk","address":"620 Cherry St., Helena, AR 72342"},"assessor":{"name":"Phillips County Assessor","address":"620 Cherry St., Helena, AR 72342"}},"Pike County, AR":{"recorder":{"name":"Pike County Circuit Clerk","address":"100 State Hwy 195 S, Murfreesboro, AR 71958"},"assessor":{"name":"Pike County Assessor","address":"100 State Hwy 195 S, Murfreesboro, AR 71958"}},"Poinsett County, AR":{"recorder":{"name":"Poinsett County Circuit Clerk","address":"401 Market St., Harrisburg, AR 72432"},"assessor":{"name":"Poinsett County Assessor","address":"401 Market St., Harrisburg, AR 72432"}},"Polk County, AR":{"recorder":{"name":"Polk County Circuit Clerk","address":"507 Church Ave., Mena, AR 71953"},"assessor":{"name":"Polk County Assessor","address":"507 Church Ave., Mena, AR 71953"}},"Pope County, AR":{"recorder":{"name":"Pope County Circuit Clerk","address":"100 W Main St., Russellville, AR 72801"},"assessor":{"name":"Pope County Assessor","address":"100 W Main St., Russellville, AR 72801"}},"Prairie County, AR":{"recorder":{"name":"Prairie County Circuit Clerk","address":"200 Court St., Des Arc, AR 72040"},"assessor":{"name":"Prairie County Assessor","address":"200 Court St., Des Arc, AR 72040"}},"Pulaski County, AR":{"recorder":{"name":"Pulaski County Circuit Clerk","address":"401 W Markham St., Little Rock, AR 72201"},"assessor":{"name":"Pulaski County Assessor","address":"201 S Broadway Suite 310, Little Rock, AR 72201"}},"Randolph County, AR":{"recorder":{"name":"Randolph County Circuit Clerk","address":"107 W Broadway St., Pocahontas, AR 72455"},"assessor":{"name":"Randolph County Assessor","address":"107 W Broadway St., Pocahontas, AR 72455"}},"Saline County, AR":{"recorder":{"name":"Saline County Circuit Clerk","address":"200 N Main St., Benton, AR 72015"},"assessor":{"name":"Saline County Assessor","address":"200 N Main St., Benton, AR 72015"}},"Scott County, AR":{"recorder":{"name":"Scott County Circuit Clerk","address":"190 W 1st St., Waldron, AR 72958"},"assessor":{"name":"Scott County Assessor","address":"190 W 1st St., Waldron, AR 72958"}},"Searcy County, AR":{"recorder":{"name":"Searcy County Circuit Clerk","address":"George St., Marshall, AR 72650"},"assessor":{"name":"Searcy County Assessor","address":"George St., Marshall, AR 72650"}},"Sebastian County, AR":{"recorder":{"name":"Sebastian County Circuit Clerk","address":"35 S 6th St., Fort Smith, AR 72901"},"assessor":{"name":"Sebastian County Assessor","address":"35 S 6th St., Fort Smith, AR 72901"}},"Sevier County, AR":{"recorder":{"name":"Sevier County Circuit Clerk","address":"115 N 3rd St., De Queen, AR 71832"},"assessor":{"name":"Sevier County Assessor","address":"115 N 3rd St., De Queen, AR 71832"}},"Sharp County, AR":{"recorder":{"name":"Sharp County Circuit Clerk","address":"718 Ash Flat Dr., Ash Flat, AR 72513"},"assessor":{"name":"Sharp County Assessor","address":"718 Ash Flat Dr., Ash Flat, AR 72513"}},"St. Francis County, AR":{"recorder":{"name":"St. Francis County Circuit Clerk","address":"313 S Izard St., Forrest City, AR 72335"},"assessor":{"name":"St. Francis County Assessor","address":"313 S Izard St., Forrest City, AR 72335"}},"Stone County, AR":{"recorder":{"name":"Stone County Circuit Clerk","address":"107 W Main St., Mountain View, AR 72560"},"assessor":{"name":"Stone County Assessor","address":"107 W Main St., Mountain View, AR 72560"}},"Union County, AR":{"recorder":{"name":"Union County Circuit Clerk","address":"101 N Washington St., El Dorado, AR 71730"},"assessor":{"name":"Union County Assessor","address":"101 N Washington St., El Dorado, AR 71730"}},"Van Buren County, AR":{"recorder":{"name":"Van Buren County Circuit Clerk","address":"6 Court Square, Clinton, AR 72031"},"assessor":{"name":"Van Buren County Assessor","address":"6 Court Square, Clinton, AR 72031"}},"Washington County, AR":{"recorder":{"name":"Washington County Circuit Clerk","address":"280 N College Ave., Fayetteville, AR 72701"},"assessor":{"name":"Washington County Assessor","address":"280 N College Ave., Fayetteville, AR 72701"}},"White County, AR":{"recorder":{"name":"White County Circuit Clerk","address":"300 N Spruce St., Searcy, AR 72143"},"assessor":{"name":"White County Assessor","address":"300 N Spruce St., Searcy, AR 72143"}},"Woodruff County, AR":{"recorder":{"name":"Woodruff County Circuit Clerk","address":"500 N 3rd St., Augusta, AR 72006"},"assessor":{"name":"Woodruff County Assessor","address":"500 N 3rd St., Augusta, AR 72006"}},"Yell County, AR":{"recorder":{"name":"Yell County Circuit Clerk","address":"101 Courthouse Square, Danville, AR 72833"},"assessor":{"name":"Yell County Assessor","address":"101 Courthouse Square, Danville, AR 72833"}},"Apache County, AZ":{"recorder":{"name":"Apache County Recorder","address":"75 W Cleveland St., St. Johns, AZ 85936"},"assessor":{"name":"Apache County Assessor","address":"75 W Cleveland St., St. Johns, AZ 85936"}},"Cochise County, AZ":{"recorder":{"name":"Cochise County Recorder","address":"1415 W Melody Lane Bldg. B, Bisbee, AZ 85603"},"assessor":{"name":"Cochise County Assessor","address":"1415 W Melody Lane Bldg. A, Bisbee, AZ 85603"}},"Coconino County, AZ":{"recorder":{"name":"Coconino County Recorder","address":"110 E Cherry Ave., Flagstaff, AZ 86001"},"assessor":{"name":"Coconino County Assessor","address":"110 E Cherry Ave., Flagstaff, AZ 86001"}},"Gila County, AZ":{"recorder":{"name":"Gila County Recorder","address":"1400 E Ash St., Globe, AZ 85501"},"assessor":{"name":"Gila County Assessor","address":"1400 E Ash St., Globe, AZ 85501"}},"Graham County, AZ":{"recorder":{"name":"Graham County Recorder","address":"921 Thatcher Blvd., Safford, AZ 85546"},"assessor":{"name":"Graham County Assessor","address":"921 Thatcher Blvd., Safford, AZ 85546"}},"Greenlee County, AZ":{"recorder":{"name":"Greenlee County Recorder","address":"253 5th St., Clifton, AZ 85533"},"assessor":{"name":"Greenlee County Assessor","address":"253 5th St., Clifton, AZ 85533"}},"La Paz County, AZ":{"recorder":{"name":"La Paz County Recorder","address":"1112 Joshua Ave. Suite 201, Parker, AZ 85344"},"assessor":{"name":"La Paz County Assessor","address":"1112 Joshua Ave., Parker, AZ 85344"}},"Maricopa County, AZ":{"recorder":{"name":"Maricopa County Recorder","address":"111 S 3rd Ave Suite 103, Phoenix, AZ 85003"},"assessor":{"name":"Maricopa County Assessor","address":"301 W Jefferson St., Phoenix, AZ 85003"}},"Mohave County, AZ":{"recorder":{"name":"Mohave County Recorder","address":"700 W Beale St., Kingman, AZ 86401"},"assessor":{"name":"Mohave County Assessor","address":"700 W Beale St., Kingman, AZ 86401"}},"Navajo County, AZ":{"recorder":{"name":"Navajo County Recorder","address":"100 E Code Talkers Dr., Holbrook, AZ 86025"},"assessor":{"name":"Navajo County Assessor","address":"100 E Code Talkers Dr., Holbrook, AZ 86025"}},"Pima County, AZ":{"recorder":{"name":"Pima County Recorder","address":"240 N Stone Ave., Tucson, AZ 85701"},"assessor":{"name":"Pima County Assessor","address":"240 N Stone Ave., Tucson, AZ 85701"}},"Pinal County, AZ":{"recorder":{"name":"Pinal County Recorder","address":"31 N Pinal St. Bldg. E, Florence, AZ 85132"},"assessor":{"name":"Pinal County Assessor","address":"31 N Pinal St., Florence, AZ 85132"}},"Santa Cruz County, AZ":{"recorder":{"name":"Santa Cruz County Recorder","address":"2150 N Congress Dr., Nogales, AZ 85621"},"assessor":{"name":"Santa Cruz County Assessor","address":"2150 N Congress Dr., Nogales, AZ 85621"}},"Yavapai County, AZ":{"recorder":{"name":"Yavapai County Recorder","address":"1015 Fair St. Room 228, Prescott, AZ 86305"},"assessor":{"name":"Yavapai County Assessor","address":"1015 Fair St., Prescott, AZ 86305"}},"Yuma County, AZ":{"recorder":{"name":"Yuma County Recorder","address":"410 S Maiden Lane Suite B, Yuma, AZ 85364"},"assessor":{"name":"Yuma County Assessor","address":"410 S Maiden Lane, Yuma, AZ 85364"}},"Alameda County, CA":{"recorder":{"name":"Alameda County Clerk-Recorder","address":"1106 Madison St, Oakland, CA 94607"},"assessor":{"name":"Alameda County Assessor","address":"1221 Oak St, Oakland, CA 94612"}},"Alpine County, CA":{"recorder":{"name":"Alpine County Assessor-Recorder","address":"99 Water St, Markleeville, CA 96120"},"assessor":{"name":"Alpine County Assessor","address":"99 Water St, Markleeville, CA 96120"}},"Amador County, CA":{"recorder":{"name":"Amador County Clerk-Recorder","address":"810 Court St, Jackson, CA 95642"},"assessor":{"name":"Amador County Assessor","address":"810 Court St, Jackson, CA 95642"}},"Butte County, CA":{"recorder":{"name":"Butte County Clerk-Recorder","address":"155 Nelson Ave, Oroville, CA 95965"},"assessor":{"name":"Butte County Assessor","address":"25 County Center Dr, Oroville, CA 95965"}},"Calaveras County, CA":{"recorder":{"name":"Calaveras County Clerk-Recorder","address":"891 Mountain Ranch Rd, San Andreas, CA 95249"},"assessor":{"name":"Calaveras County Assessor","address":"891 Mountain Ranch Rd, San Andreas, CA 95249"}},"Colusa County, CA":{"recorder":{"name":"Colusa County Clerk-Recorder","address":"546 Jay St, Colusa, CA 95932"},"assessor":{"name":"Colusa County Assessor","address":"546 Jay St, Colusa, CA 95932"}},"Contra Costa County, CA":{"recorder":{"name":"Contra Costa County Clerk-Recorder","address":"555 Escobar St, Martinez, CA 94553"},"assessor":{"name":"Contra Costa County Assessor","address":"2530 Arnold Dr, Martinez, CA 94553"}},"Del Norte County, CA":{"recorder":{"name":"Del Norte County Clerk-Recorder","address":"981 H St, Crescent City, CA 95531"},"assessor":{"name":"Del Norte County Assessor","address":"981 H St, Crescent City, CA 95531"}},"El Dorado County, CA":{"recorder":{"name":"El Dorado County Clerk-Recorder","address":"360 Fair Ln, Placerville, CA 95667"},"assessor":{"name":"El Dorado County Assessor","address":"360 Fair Ln, Placerville, CA 95667"}},"Fresno County, CA":{"recorder":{"name":"Fresno County Assessor-Recorder","address":"2281 Tulare St, Fresno, CA 93721"},"assessor":{"name":"Fresno County Assessor","address":"2281 Tulare St, Fresno, CA 93721"}},"Glenn County, CA":{"recorder":{"name":"Glenn County Clerk-Recorder","address":"516 W Sycamore St, Willows, CA 95988"},"assessor":{"name":"Glenn County Assessor","address":"516 W Sycamore St, Willows, CA 95988"}},"Humboldt County, CA":{"recorder":{"name":"Humboldt County Clerk-Recorder","address":"825 Fifth St, Eureka, CA 95501"},"assessor":{"name":"Humboldt County Assessor","address":"825 Fifth St, Eureka, CA 95501"}},"Imperial County, CA":{"recorder":{"name":"Imperial County Clerk-Recorder","address":"940 Main St, El Centro, CA 92243"},"assessor":{"name":"Imperial County Assessor","address":"940 Main St, El Centro, CA 92243"}},"Inyo County, CA":{"recorder":{"name":"Inyo County Clerk-Recorder","address":"168 N Edwards St, Independence, CA 93526"},"assessor":{"name":"Inyo County Assessor","address":"168 N Edwards St, Independence, CA 93526"}},"Kern County, CA":{"recorder":{"name":"Kern County Assessor-Recorder","address":"1115 Truxtun Ave, Bakersfield, CA 93301"},"assessor":{"name":"Kern County Assessor","address":"1115 Truxtun Ave, Bakersfield, CA 93301"}},"Kings County, CA":{"recorder":{"name":"Kings County Assessor-Clerk-Recorder","address":"1400 W Lacey Blvd, Hanford, CA 93230"},"assessor":{"name":"Kings County Assessor","address":"1400 W Lacey Blvd, Hanford, CA 93230"}},"Lake County, CA":{"recorder":{"name":"Lake County Assessor-Recorder","address":"255 N Forbes St, Lakeport, CA 95453"},"assessor":{"name":"Lake County Assessor","address":"255 N Forbes St, Lakeport, CA 95453"}},"Lassen County, CA":{"recorder":{"name":"Lassen County Clerk-Recorder","address":"220 S Lassen St, Susanville, CA 96130"},"assessor":{"name":"Lassen County Assessor","address":"220 S Lassen St, Susanville, CA 96130"}},"Los Angeles County, CA":{"recorder":{"name":"LA County Registrar-Recorder","address":"12400 Imperial Hwy, Norwalk, CA 90650"},"assessor":{"name":"LA County Assessor","address":"500 W Temple St, Los Angeles, CA 90012"}},"Madera County, CA":{"recorder":{"name":"Madera County Clerk-Recorder","address":"200 W Fourth St, Madera, CA 93637"},"assessor":{"name":"Madera County Assessor","address":"200 W Fourth St, Madera, CA 93637"}},"Marin County, CA":{"recorder":{"name":"Marin County Assessor-Recorder","address":"3501 Civic Center Dr, San Rafael, CA 94903"},"assessor":{"name":"Marin County Assessor","address":"3501 Civic Center Dr, San Rafael, CA 94903"}},"Mariposa County, CA":{"recorder":{"name":"Mariposa County Assessor-Recorder","address":"4982 10th St, Mariposa, CA 95338"},"assessor":{"name":"Mariposa County Assessor","address":"4982 10th St, Mariposa, CA 95338"}},"Mendocino County, CA":{"recorder":{"name":"Mendocino County Clerk-Recorder","address":"501 Low Gap Rd, Ukiah, CA 95482"},"assessor":{"name":"Mendocino County Assessor","address":"501 Low Gap Rd, Ukiah, CA 95482"}},"Merced County, CA":{"recorder":{"name":"Merced County Assessor-Clerk-Recorder","address":"2222 M St, Merced, CA 95340"},"assessor":{"name":"Merced County Assessor","address":"2222 M St, Merced, CA 95340"}},"Modoc County, CA":{"recorder":{"name":"Modoc County Assessor-Recorder","address":"204 S Court St, Alturas, CA 96101"},"assessor":{"name":"Modoc County Assessor","address":"204 S Court St, Alturas, CA 96101"}},"Mono County, CA":{"recorder":{"name":"Mono County Clerk-Recorder","address":"74 N School St, Bridgeport, CA 93517"},"assessor":{"name":"Mono County Assessor","address":"74 N School St, Bridgeport, CA 93517"}},"Monterey County, CA":{"recorder":{"name":"Monterey County Recorder","address":"168 W Alisal St, Salinas, CA 93901"},"assessor":{"name":"Monterey County Assessor","address":"168 W Alisal St, Salinas, CA 93901"}},"Napa County, CA":{"recorder":{"name":"Napa County Recorder-Clerk","address":"1127 First St, Napa, CA 94559"},"assessor":{"name":"Napa County Assessor","address":"1127 First St, Napa, CA 94559"}},"Nevada County, CA":{"recorder":{"name":"Nevada County Clerk-Recorder","address":"950 Maidu Ave, Nevada City, CA 95959"},"assessor":{"name":"Nevada County Assessor","address":"950 Maidu Ave, Nevada City, CA 95959"}},"Orange County, CA":{"recorder":{"name":"Orange County Clerk-Recorder","address":"12 Civic Center Plaza, Santa Ana, CA 92701"},"assessor":{"name":"Orange County Assessor","address":"500 N State College Blvd, Orange, CA 92868"}},"Placer County, CA":{"recorder":{"name":"Placer County Clerk-Recorder","address":"2954 Richardson Dr, Auburn, CA 95603"},"assessor":{"name":"Placer County Assessor","address":"2976 Richardson Dr, Auburn, CA 95603"}},"Plumas County, CA":{"recorder":{"name":"Plumas County Clerk-Recorder","address":"520 Main St, Quincy, CA 95971"},"assessor":{"name":"Plumas County Assessor","address":"520 Main St, Quincy, CA 95971"}},"Riverside County, CA":{"recorder":{"name":"Riverside County Assessor-Clerk-Recorder","address":"2724 Gateway Dr, Riverside, CA 92507"},"assessor":{"name":"Riverside County Assessor","address":"2724 Gateway Dr, Riverside, CA 92507"}},"Sacramento County, CA":{"recorder":{"name":"Sacramento County Clerk-Recorder","address":"600 8th St, Sacramento, CA 95814"},"assessor":{"name":"Sacramento County Assessor","address":"3636 American River Dr, Sacramento, CA 95864"}},"San Benito County, CA":{"recorder":{"name":"San Benito County Clerk-Recorder","address":"440 Fifth St, Hollister, CA 95023"},"assessor":{"name":"San Benito County Assessor","address":"440 Fifth St, Hollister, CA 95023"}},"San Bernardino County, CA":{"recorder":{"name":"San Bernardino County Assessor-Recorder-Clerk","address":"222 W Hospitality Ln, San Bernardino, CA 92415"},"assessor":{"name":"San Bernardino County Assessor","address":"222 W Hospitality Ln, San Bernardino, CA 92415"}},"San Diego County, CA":{"recorder":{"name":"San Diego County Assessor-Recorder-Clerk","address":"1600 Pacific Hwy, San Diego, CA 92101"},"assessor":{"name":"San Diego County Assessor","address":"1600 Pacific Hwy, San Diego, CA 92101"}},"San Francisco County, CA":{"recorder":{"name":"SF Assessor-Recorder","address":"1 Dr Carlton B Goodlett Pl, San Francisco, CA 94102"},"assessor":{"name":"SF Assessor","address":"1 Dr Carlton B Goodlett Pl, San Francisco, CA 94102"}},"San Joaquin County, CA":{"recorder":{"name":"San Joaquin County Assessor-Recorder-Clerk","address":"44 N San Joaquin St, Stockton, CA 95202"},"assessor":{"name":"San Joaquin County Assessor","address":"44 N San Joaquin St, Stockton, CA 95202"}},"San Luis Obispo County, CA":{"recorder":{"name":"SLO County Clerk-Recorder","address":"1055 Monterey St, San Luis Obispo, CA 93408"},"assessor":{"name":"SLO County Assessor","address":"1055 Monterey St, San Luis Obispo, CA 93408"}},"San Mateo County, CA":{"recorder":{"name":"San Mateo County Assessor-Clerk-Recorder","address":"555 County Center, Redwood City, CA 94063"},"assessor":{"name":"San Mateo County Assessor","address":"555 County Center, Redwood City, CA 94063"}},"Santa Barbara County, CA":{"recorder":{"name":"Santa Barbara County Clerk-Recorder","address":"105 E Anapamu St, Santa Barbara, CA 93101"},"assessor":{"name":"Santa Barbara County Assessor","address":"105 E Anapamu St, Santa Barbara, CA 93101"}},"Santa Clara County, CA":{"recorder":{"name":"Santa Clara County Clerk-Recorder","address":"70 W Hedding St, San Jose, CA 95110"},"assessor":{"name":"Santa Clara County Assessor","address":"70 W Hedding St, San Jose, CA 95110"}},"Santa Cruz County, CA":{"recorder":{"name":"Santa Cruz County Assessor-Recorder","address":"701 Ocean St, Santa Cruz, CA 95060"},"assessor":{"name":"Santa Cruz County Assessor","address":"701 Ocean St, Santa Cruz, CA 95060"}},"Shasta County, CA":{"recorder":{"name":"Shasta County Assessor-Recorder","address":"1450 Court St, Redding, CA 96001"},"assessor":{"name":"Shasta County Assessor","address":"1450 Court St, Redding, CA 96001"}},"Sierra County, CA":{"recorder":{"name":"Sierra County Clerk-Recorder","address":"100 Courthouse Sq, Downieville, CA 95936"},"assessor":{"name":"Sierra County Assessor","address":"100 Courthouse Sq, Downieville, CA 95936"}},"Siskiyou County, CA":{"recorder":{"name":"Siskiyou County Assessor-Recorder","address":"311 Fourth St, Yreka, CA 96097"},"assessor":{"name":"Siskiyou County Assessor","address":"311 Fourth St, Yreka, CA 96097"}},"Solano County, CA":{"recorder":{"name":"Solano County Assessor-Recorder","address":"675 Texas St, Fairfield, CA 94533"},"assessor":{"name":"Solano County Assessor","address":"675 Texas St, Fairfield, CA 94533"}},"Sonoma County, CA":{"recorder":{"name":"Sonoma County Clerk-Recorder-Assessor","address":"585 Fiscal Dr, Santa Rosa, CA 95403"},"assessor":{"name":"Sonoma County Assessor","address":"585 Fiscal Dr, Santa Rosa, CA 95403"}},"Stanislaus County, CA":{"recorder":{"name":"Stanislaus County Clerk-Recorder","address":"1021 I St, Modesto, CA 95354"},"assessor":{"name":"Stanislaus County Assessor","address":"1010 10th St, Modesto, CA 95354"}},"Sutter County, CA":{"recorder":{"name":"Sutter County Clerk-Recorder","address":"433 Second St, Yuba City, CA 95991"},"assessor":{"name":"Sutter County Assessor","address":"433 Second St, Yuba City, CA 95991"}},"Tehama County, CA":{"recorder":{"name":"Tehama County Clerk-Recorder","address":"633 Washington St, Red Bluff, CA 96080"},"assessor":{"name":"Tehama County Assessor","address":"633 Washington St, Red Bluff, CA 96080"}},"Trinity County, CA":{"recorder":{"name":"Trinity County Clerk-Recorder","address":"11 Court St, Weaverville, CA 96093"},"assessor":{"name":"Trinity County Assessor","address":"11 Court St, Weaverville, CA 96093"}},"Tulare County, CA":{"recorder":{"name":"Tulare County Assessor-Clerk-Recorder","address":"221 S Mooney Blvd, Visalia, CA 93291"},"assessor":{"name":"Tulare County Assessor","address":"221 S Mooney Blvd, Visalia, CA 93291"}},"Tuolumne County, CA":{"recorder":{"name":"Tuolumne County Assessor-Recorder","address":"2 S Green St, Sonora, CA 95370"},"assessor":{"name":"Tuolumne County Assessor","address":"2 S Green St, Sonora, CA 95370"}},"Ventura County, CA":{"recorder":{"name":"Ventura County Clerk-Recorder","address":"800 S Victoria Ave, Ventura, CA 93009"},"assessor":{"name":"Ventura County Assessor","address":"800 S Victoria Ave, Ventura, CA 93009"}},"Yolo County, CA":{"recorder":{"name":"Yolo County Clerk-Recorder","address":"625 Court St, Woodland, CA 95695"},"assessor":{"name":"Yolo County Assessor","address":"625 Court St, Woodland, CA 95695"}},"Yuba County, CA":{"recorder":{"name":"Yuba County Clerk-Recorder","address":"915 8th St, Marysville, CA 95901"},"assessor":{"name":"Yuba County Assessor","address":"915 8th St, Marysville, CA 95901"}},"Adams County, CO":{"recorder":{"name":"Adams County Clerk & Recorder","address":"4430 S Adams County Pkwy Suite E3000, Brighton, CO 80601"},"assessor":{"name":"Adams County Assessor","address":"4430 S Adams County Pkwy Suite E2000, Brighton, CO 80601"}},"Alamosa County, CO":{"recorder":{"name":"Alamosa County Clerk & Recorder","address":"402 Edison Ave., Alamosa, CO 81101"},"assessor":{"name":"Alamosa County Assessor","address":"402 Edison Ave., Alamosa, CO 81101"}},"Arapahoe County, CO":{"recorder":{"name":"Arapahoe County Clerk & Recorder","address":"5334 S Prince St., Littleton, CO 80120"},"assessor":{"name":"Arapahoe County Assessor","address":"5334 S Prince St., Littleton, CO 80120"}},"Archuleta County, CO":{"recorder":{"name":"Archuleta County Clerk & Recorder","address":"449 San Juan St., Pagosa Springs, CO 81147"},"assessor":{"name":"Archuleta County Assessor","address":"449 San Juan St., Pagosa Springs, CO 81147"}},"Baca County, CO":{"recorder":{"name":"Baca County Clerk & Recorder","address":"741 Main St. Suite 3, Springfield, CO 81073"},"assessor":{"name":"Baca County Assessor","address":"741 Main St., Springfield, CO 81073"}},"Bent County, CO":{"recorder":{"name":"Bent County Clerk & Recorder","address":"725 Bent Ave., Las Animas, CO 81054"},"assessor":{"name":"Bent County Assessor","address":"725 Bent Ave., Las Animas, CO 81054"}},"Boulder County, CO":{"recorder":{"name":"Boulder County Clerk & Recorder","address":"1750 33rd St. Suite 200, Boulder, CO 80301"},"assessor":{"name":"Boulder County Assessor","address":"1750 33rd St. Suite 200, Boulder, CO 80301"}},"Broomfield County, CO":{"recorder":{"name":"Broomfield County Clerk & Recorder","address":"1 DesCombes Dr., Broomfield, CO 80020"},"assessor":{"name":"Broomfield County Assessor","address":"1 DesCombes Dr., Broomfield, CO 80020"}},"Chaffee County, CO":{"recorder":{"name":"Chaffee County Clerk & Recorder","address":"104 Crestone Ave., Salida, CO 81201"},"assessor":{"name":"Chaffee County Assessor","address":"104 Crestone Ave., Salida, CO 81201"}},"Cheyenne County, CO":{"recorder":{"name":"Cheyenne County Clerk & Recorder","address":"51 S 1st St., Cheyenne Wells, CO 80810"},"assessor":{"name":"Cheyenne County Assessor","address":"51 S 1st St., Cheyenne Wells, CO 80810"}},"Clear Creek County, CO":{"recorder":{"name":"Clear Creek County Clerk & Recorder","address":"405 Argentine St., Georgetown, CO 80444"},"assessor":{"name":"Clear Creek County Assessor","address":"405 Argentine St., Georgetown, CO 80444"}},"Conejos County, CO":{"recorder":{"name":"Conejos County Clerk & Recorder","address":"6683 County Rd. 13, Conejos, CO 81129"},"assessor":{"name":"Conejos County Assessor","address":"6683 County Rd. 13, Conejos, CO 81129"}},"Costilla County, CO":{"recorder":{"name":"Costilla County Clerk & Recorder","address":"400 Gascon St., San Luis, CO 81152"},"assessor":{"name":"Costilla County Assessor","address":"400 Gascon St., San Luis, CO 81152"}},"Crowley County, CO":{"recorder":{"name":"Crowley County Clerk & Recorder","address":"631 Main St., Ordway, CO 81063"},"assessor":{"name":"Crowley County Assessor","address":"631 Main St., Ordway, CO 81063"}},"Custer County, CO":{"recorder":{"name":"Custer County Clerk & Recorder","address":"205 S 6th St., Westcliffe, CO 81252"},"assessor":{"name":"Custer County Assessor","address":"205 S 6th St., Westcliffe, CO 81252"}},"Delta County, CO":{"recorder":{"name":"Delta County Clerk & Recorder","address":"501 Palmer St. Suite 211, Delta, CO 81416"},"assessor":{"name":"Delta County Assessor","address":"501 Palmer St. Suite 214, Delta, CO 81416"}},"Denver County, CO":{"recorder":{"name":"Denver Clerk & Recorder","address":"201 W Colfax Ave. Dept 101, Denver, CO 80202"},"assessor":{"name":"Denver Manager of Finance / Assessor","address":"201 W Colfax Ave., Denver, CO 80202"}},"Dolores County, CO":{"recorder":{"name":"Dolores County Clerk & Recorder","address":"409 N Main St., Dove Creek, CO 81324"},"assessor":{"name":"Dolores County Assessor","address":"409 N Main St., Dove Creek, CO 81324"}},"Douglas County, CO":{"recorder":{"name":"Douglas County Clerk & Recorder","address":"301 Wilcox St., Castle Rock, CO 80104"},"assessor":{"name":"Douglas County Assessor","address":"301 Wilcox St., Castle Rock, CO 80104"}},"Eagle County, CO":{"recorder":{"name":"Eagle County Clerk & Recorder","address":"500 Broadway, Eagle, CO 81631"},"assessor":{"name":"Eagle County Assessor","address":"500 Broadway, Eagle, CO 81631"}},"Elbert County, CO":{"recorder":{"name":"Elbert County Clerk & Recorder","address":"215 Comanche St., Kiowa, CO 80117"},"assessor":{"name":"Elbert County Assessor","address":"215 Comanche St., Kiowa, CO 80117"}},"El Paso County, CO":{"recorder":{"name":"El Paso County Clerk & Recorder","address":"1675 W Garden of the Gods Rd., Colorado Springs, CO 80907"},"assessor":{"name":"El Paso County Assessor","address":"1675 W Garden of the Gods Rd., Colorado Springs, CO 80907"}},"Fremont County, CO":{"recorder":{"name":"Fremont County Clerk & Recorder","address":"615 Macon Ave. Room 102, Canon City, CO 81212"},"assessor":{"name":"Fremont County Assessor","address":"615 Macon Ave. Room 100, Canon City, CO 81212"}},"Garfield County, CO":{"recorder":{"name":"Garfield County Clerk & Recorder","address":"109 8th St. Suite 200, Glenwood Springs, CO 81601"},"assessor":{"name":"Garfield County Assessor","address":"109 8th St. Suite 207, Glenwood Springs, CO 81601"}},"Gilpin County, CO":{"recorder":{"name":"Gilpin County Clerk & Recorder","address":"203 Eureka St., Central City, CO 80427"},"assessor":{"name":"Gilpin County Assessor","address":"203 Eureka St., Central City, CO 80427"}},"Grand County, CO":{"recorder":{"name":"Grand County Clerk & Recorder","address":"308 Byers Ave., Hot Sulphur Springs, CO 80451"},"assessor":{"name":"Grand County Assessor","address":"308 Byers Ave., Hot Sulphur Springs, CO 80451"}},"Gunnison County, CO":{"recorder":{"name":"Gunnison County Clerk & Recorder","address":"200 E Virginia Ave., Gunnison, CO 81230"},"assessor":{"name":"Gunnison County Assessor","address":"200 E Virginia Ave., Gunnison, CO 81230"}},"Hinsdale County, CO":{"recorder":{"name":"Hinsdale County Clerk & Recorder","address":"317 Henson St., Lake City, CO 81235"},"assessor":{"name":"Hinsdale County Assessor","address":"317 Henson St., Lake City, CO 81235"}},"Huerfano County, CO":{"recorder":{"name":"Huerfano County Clerk & Recorder","address":"401 Main St. Suite 201, Walsenburg, CO 81089"},"assessor":{"name":"Huerfano County Assessor","address":"401 Main St. Suite 204, Walsenburg, CO 81089"}},"Jackson County, CO":{"recorder":{"name":"Jackson County Clerk & Recorder","address":"396 LaFever St., Walden, CO 80480"},"assessor":{"name":"Jackson County Assessor","address":"396 LaFever St., Walden, CO 80480"}},"Jefferson County, CO":{"recorder":{"name":"Jefferson County Clerk & Recorder","address":"100 Jefferson County Pkwy Suite 1580, Golden, CO 80419"},"assessor":{"name":"Jefferson County Assessor","address":"100 Jefferson County Pkwy Suite 2500, Golden, CO 80419"}},"Kiowa County, CO":{"recorder":{"name":"Kiowa County Clerk & Recorder","address":"1305 Goff St., Eads, CO 81036"},"assessor":{"name":"Kiowa County Assessor","address":"1305 Goff St., Eads, CO 81036"}},"Kit Carson County, CO":{"recorder":{"name":"Kit Carson County Clerk & Recorder","address":"251 16th St. Suite 301, Burlington, CO 80807"},"assessor":{"name":"Kit Carson County Assessor","address":"251 16th St. Suite 301, Burlington, CO 80807"}},"Lake County, CO":{"recorder":{"name":"Lake County Clerk & Recorder","address":"505 Harrison Ave., Leadville, CO 80461"},"assessor":{"name":"Lake County Assessor","address":"505 Harrison Ave., Leadville, CO 80461"}},"La Plata County, CO":{"recorder":{"name":"La Plata County Clerk & Recorder","address":"1101 E 2nd Ave., Durango, CO 81301"},"assessor":{"name":"La Plata County Assessor","address":"1101 E 2nd Ave., Durango, CO 81301"}},"Larimer County, CO":{"recorder":{"name":"Larimer County Clerk & Recorder","address":"200 W Oak St. Suite 1000, Fort Collins, CO 80521"},"assessor":{"name":"Larimer County Assessor","address":"200 W Oak St. Suite 2000, Fort Collins, CO 80521"}},"Las Animas County, CO":{"recorder":{"name":"Las Animas County Clerk & Recorder","address":"200 E 1st St. Room 203, Trinidad, CO 81082"},"assessor":{"name":"Las Animas County Assessor","address":"200 E 1st St. Room 204, Trinidad, CO 81082"}},"Lincoln County, CO":{"recorder":{"name":"Lincoln County Clerk & Recorder","address":"103 3rd Ave., Hugo, CO 80821"},"assessor":{"name":"Lincoln County Assessor","address":"103 3rd Ave., Hugo, CO 80821"}},"Logan County, CO":{"recorder":{"name":"Logan County Clerk & Recorder","address":"315 Main St. Room 1, Sterling, CO 80751"},"assessor":{"name":"Logan County Assessor","address":"315 Main St. Room 3, Sterling, CO 80751"}},"Mesa County, CO":{"recorder":{"name":"Mesa County Clerk & Recorder","address":"544 Rood Ave. Suite 200, Grand Junction, CO 81501"},"assessor":{"name":"Mesa County Assessor","address":"544 Rood Ave. Suite 140, Grand Junction, CO 81501"}},"Mineral County, CO":{"recorder":{"name":"Mineral County Clerk & Recorder","address":"1201 N Main St., Creede, CO 81130"},"assessor":{"name":"Mineral County Assessor","address":"1201 N Main St., Creede, CO 81130"}},"Moffat County, CO":{"recorder":{"name":"Moffat County Clerk & Recorder","address":"221 W Victory Way, Craig, CO 81625"},"assessor":{"name":"Moffat County Assessor","address":"221 W Victory Way, Craig, CO 81625"}},"Montezuma County, CO":{"recorder":{"name":"Montezuma County Clerk & Recorder","address":"109 W Main St. Room 104, Cortez, CO 81321"},"assessor":{"name":"Montezuma County Assessor","address":"109 W Main St. Room 105, Cortez, CO 81321"}},"Montrose County, CO":{"recorder":{"name":"Montrose County Clerk & Recorder","address":"317 S 2nd St., Montrose, CO 81401"},"assessor":{"name":"Montrose County Assessor","address":"317 S 2nd St., Montrose, CO 81401"}},"Morgan County, CO":{"recorder":{"name":"Morgan County Clerk & Recorder","address":"231 Ensign St., Fort Morgan, CO 80701"},"assessor":{"name":"Morgan County Assessor","address":"231 Ensign St., Fort Morgan, CO 80701"}},"Otero County, CO":{"recorder":{"name":"Otero County Clerk & Recorder","address":"13 W 3rd St. Room 207, La Junta, CO 81050"},"assessor":{"name":"Otero County Assessor","address":"13 W 3rd St. Room 213, La Junta, CO 81050"}},"Ouray County, CO":{"recorder":{"name":"Ouray County Clerk & Recorder","address":"541 4th St., Ouray, CO 81427"},"assessor":{"name":"Ouray County Assessor","address":"541 4th St., Ouray, CO 81427"}},"Park County, CO":{"recorder":{"name":"Park County Clerk & Recorder","address":"501 Main St., Fairplay, CO 80440"},"assessor":{"name":"Park County Assessor","address":"501 Main St., Fairplay, CO 80440"}},"Phillips County, CO":{"recorder":{"name":"Phillips County Clerk & Recorder","address":"221 S Interocean Ave., Holyoke, CO 80734"},"assessor":{"name":"Phillips County Assessor","address":"221 S Interocean Ave., Holyoke, CO 80734"}},"Pitkin County, CO":{"recorder":{"name":"Pitkin County Clerk & Recorder","address":"530 E Main St. Suite 101, Aspen, CO 81611"},"assessor":{"name":"Pitkin County Assessor","address":"530 E Main St. Suite 100, Aspen, CO 81611"}},"Prowers County, CO":{"recorder":{"name":"Prowers County Clerk & Recorder","address":"301 S Main St. Suite 215, Lamar, CO 81052"},"assessor":{"name":"Prowers County Assessor","address":"301 S Main St. Suite 218, Lamar, CO 81052"}},"Pueblo County, CO":{"recorder":{"name":"Pueblo County Clerk & Recorder","address":"215 W 10th St., Pueblo, CO 81003"},"assessor":{"name":"Pueblo County Assessor","address":"215 W 10th St. Room 140, Pueblo, CO 81003"}},"Rio Blanco County, CO":{"recorder":{"name":"Rio Blanco County Clerk & Recorder","address":"555 Main St., Meeker, CO 81641"},"assessor":{"name":"Rio Blanco County Assessor","address":"555 Main St., Meeker, CO 81641"}},"Rio Grande County, CO":{"recorder":{"name":"Rio Grande County Clerk & Recorder","address":"965 6th St., Del Norte, CO 81132"},"assessor":{"name":"Rio Grande County Assessor","address":"965 6th St., Del Norte, CO 81132"}},"Routt County, CO":{"recorder":{"name":"Routt County Clerk & Recorder","address":"136 6th St. Suite 101, Steamboat Springs, CO 80487"},"assessor":{"name":"Routt County Assessor","address":"136 6th St. Suite 103, Steamboat Springs, CO 80487"}},"Saguache County, CO":{"recorder":{"name":"Saguache County Clerk & Recorder","address":"501 4th St., Saguache, CO 81149"},"assessor":{"name":"Saguache County Assessor","address":"501 4th St., Saguache, CO 81149"}},"San Juan County, CO":{"recorder":{"name":"San Juan County Clerk & Recorder","address":"1557 Greene St., Silverton, CO 81433"},"assessor":{"name":"San Juan County Assessor","address":"1557 Greene St., Silverton, CO 81433"}},"San Miguel County, CO":{"recorder":{"name":"San Miguel County Clerk & Recorder","address":"305 W Colorado Ave., Telluride, CO 81435"},"assessor":{"name":"San Miguel County Assessor","address":"305 W Colorado Ave., Telluride, CO 81435"}},"Sedgwick County, CO":{"recorder":{"name":"Sedgwick County Clerk & Recorder","address":"315 Cedar St. Suite 5, Julesburg, CO 80737"},"assessor":{"name":"Sedgwick County Assessor","address":"315 Cedar St., Julesburg, CO 80737"}},"Summit County, CO":{"recorder":{"name":"Summit County Clerk & Recorder","address":"208 E Lincoln Ave., Breckenridge, CO 80424"},"assessor":{"name":"Summit County Assessor","address":"208 E Lincoln Ave., Breckenridge, CO 80424"}},"Teller County, CO":{"recorder":{"name":"Teller County Clerk & Recorder","address":"101 W Bennett Ave., Cripple Creek, CO 80813"},"assessor":{"name":"Teller County Assessor","address":"101 W Bennett Ave., Cripple Creek, CO 80813"}},"Washington County, CO":{"recorder":{"name":"Washington County Clerk & Recorder","address":"150 Ash Ave. Suite F, Akron, CO 80720"},"assessor":{"name":"Washington County Assessor","address":"150 Ash Ave., Akron, CO 80720"}},"Weld County, CO":{"recorder":{"name":"Weld County Clerk & Recorder","address":"1402 N 17th Ave., Greeley, CO 80631"},"assessor":{"name":"Weld County Assessor","address":"1402 N 17th Ave., Greeley, CO 80631"}},"Yuma County, CO":{"recorder":{"name":"Yuma County Clerk & Recorder","address":"310 Ash St. Suite D, Wray, CO 80758"},"assessor":{"name":"Yuma County Assessor","address":"310 Ash St., Wray, CO 80758"}},"Fairfield County, CT":{"recorder":{"name":"Bridgeport Town Clerk (Fairfield County Seat)","address":"45 Lyon Terrace Room 122, Bridgeport, CT 06604"},"assessor":{"name":"Bridgeport Tax Assessor (Fairfield County Seat)","address":"45 Lyon Terrace Room 106, Bridgeport, CT 06604"}},"Hartford County, CT":{"recorder":{"name":"Hartford Town Clerk (Hartford County Seat)","address":"550 Main St. Room 106, Hartford, CT 06103"},"assessor":{"name":"Hartford Tax Assessor (Hartford County Seat)","address":"550 Main St. Room 108, Hartford, CT 06103"}},"Litchfield County, CT":{"recorder":{"name":"Litchfield Town Clerk (Litchfield County Seat)","address":"74 West St., Litchfield, CT 06759"},"assessor":{"name":"Litchfield Tax Assessor (Litchfield County Seat)","address":"74 West St., Litchfield, CT 06759"}},"Middlesex County, CT":{"recorder":{"name":"Middletown Town Clerk (Middlesex County Seat)","address":"245 DeKoven Dr., Middletown, CT 06457"},"assessor":{"name":"Middletown Tax Assessor (Middlesex County Seat)","address":"245 DeKoven Dr., Middletown, CT 06457"}},"New Haven County, CT":{"recorder":{"name":"New Haven Town Clerk (New Haven County Seat)","address":"200 Orange St. Room 202, New Haven, CT 06510"},"assessor":{"name":"New Haven Tax Assessor (New Haven County Seat)","address":"165 Church St. 4th Floor, New Haven, CT 06510"}},"New London County, CT":{"recorder":{"name":"New London Town Clerk (New London County Seat)","address":"181 State St., New London, CT 06320"},"assessor":{"name":"New London Tax Assessor (New London County Seat)","address":"181 State St., New London, CT 06320"}},"Tolland County, CT":{"recorder":{"name":"Tolland Town Clerk (Tolland County Seat)","address":"21 Tolland Green 5th Floor, Tolland, CT 06084"},"assessor":{"name":"Tolland Tax Assessor (Tolland County Seat)","address":"21 Tolland Green 5th Floor, Tolland, CT 06084"}},"Windham County, CT":{"recorder":{"name":"Windham Town Clerk (Windham County Seat)","address":"979 Main St., Willimantic, CT 06226"},"assessor":{"name":"Windham Tax Assessor (Windham County Seat)","address":"979 Main St., Willimantic, CT 06226"}},"Kent County, DE":{"recorder":{"name":"Kent County Recorder of Deeds","address":"555 Bay Rd., Dover, DE 19901"},"assessor":{"name":"Kent County Assessment Division","address":"555 Bay Rd., Dover, DE 19901"}},"New Castle County, DE":{"recorder":{"name":"New Castle County Recorder of Deeds","address":"800 N French St. 4th Floor, Wilmington, DE 19801"},"assessor":{"name":"New Castle County Assessment Division","address":"87 Reads Way, New Castle, DE 19720"}},"Sussex County, DE":{"recorder":{"name":"Sussex County Recorder of Deeds","address":"2 The Circle Suite 2, Georgetown, DE 19947"},"assessor":{"name":"Sussex County Assessment Division","address":"2 The Circle Suite 3, Georgetown, DE 19947"}},"Alachua County, FL":{"recorder":{"name":"Alachua County Clerk of Circuit Court","address":"201 E University Ave., Gainesville, FL 32601"},"assessor":{"name":"Alachua County Property Appraiser","address":"12 SE 1st St., Gainesville, FL 32601"}},"Baker County, FL":{"recorder":{"name":"Baker County Clerk of Circuit Court","address":"339 E Macclenny Ave., Macclenny, FL 32063"},"assessor":{"name":"Baker County Property Appraiser","address":"339 E Macclenny Ave. Suite 1, Macclenny, FL 32063"}},"Bay County, FL":{"recorder":{"name":"Bay County Clerk of Circuit Court","address":"300 E 4th St., Panama City, FL 32401"},"assessor":{"name":"Bay County Property Appraiser","address":"860 W 11th St., Panama City, FL 32401"}},"Bradford County, FL":{"recorder":{"name":"Bradford County Clerk of Circuit Court","address":"945 N Temple Ave., Starke, FL 32091"},"assessor":{"name":"Bradford County Property Appraiser","address":"945 N Temple Ave., Starke, FL 32091"}},"Brevard County, FL":{"recorder":{"name":"Brevard County Clerk of Circuit Court","address":"700 S Park Ave. Suite 100, Titusville, FL 32780"},"assessor":{"name":"Brevard County Property Appraiser","address":"400 S St., Titusville, FL 32780"}},"Broward County, FL":{"recorder":{"name":"Broward County Clerk of Circuit Court","address":"201 SE 6th St. Room 03150, Fort Lauderdale, FL 33301"},"assessor":{"name":"Broward County Property Appraiser","address":"115 S Andrews Ave. Room 111, Fort Lauderdale, FL 33301"}},"Calhoun County, FL":{"recorder":{"name":"Calhoun County Clerk of Circuit Court","address":"20859 Central Ave. E, Blountstown, FL 32424"},"assessor":{"name":"Calhoun County Property Appraiser","address":"20859 Central Ave. E Suite 221, Blountstown, FL 32424"}},"Charlotte County, FL":{"recorder":{"name":"Charlotte County Clerk of Circuit Court","address":"350 E Marion Ave., Punta Gorda, FL 33950"},"assessor":{"name":"Charlotte County Property Appraiser","address":"18500 Murdock Circle Suite 501, Port Charlotte, FL 33948"}},"Citrus County, FL":{"recorder":{"name":"Citrus County Clerk of Circuit Court","address":"110 N Apopka Ave., Inverness, FL 34450"},"assessor":{"name":"Citrus County Property Appraiser","address":"210 N Apopka Ave. Suite 200, Inverness, FL 34450"}},"Clay County, FL":{"recorder":{"name":"Clay County Clerk of Circuit Court","address":"825 N Orange Ave., Green Cove Springs, FL 32043"},"assessor":{"name":"Clay County Property Appraiser","address":"477 Houston St., Green Cove Springs, FL 32043"}},"Collier County, FL":{"recorder":{"name":"Collier County Clerk of Circuit Court","address":"3315 Tamiami Trail E Suite 102, Naples, FL 34112"},"assessor":{"name":"Collier County Property Appraiser","address":"3950 Radio Rd., Naples, FL 34104"}},"Columbia County, FL":{"recorder":{"name":"Columbia County Clerk of Circuit Court","address":"173 NE Hernando Ave. Suite 221, Lake City, FL 32055"},"assessor":{"name":"Columbia County Property Appraiser","address":"135 NE Hernando Ave. Suite 238, Lake City, FL 32055"}},"DeSoto County, FL":{"recorder":{"name":"DeSoto County Clerk of Circuit Court","address":"115 E Oak St. Suite 202, Arcadia, FL 34266"},"assessor":{"name":"DeSoto County Property Appraiser","address":"201 E Oak St. Suite 103, Arcadia, FL 34266"}},"Dixie County, FL":{"recorder":{"name":"Dixie County Clerk of Circuit Court","address":"214 NE 351 Hwy, Cross City, FL 32628"},"assessor":{"name":"Dixie County Property Appraiser","address":"214 NE 351 Hwy, Cross City, FL 32628"}},"Duval County, FL":{"recorder":{"name":"Duval County Clerk of Circuit Court","address":"501 W Adams St. Suite 1163, Jacksonville, FL 32202"},"assessor":{"name":"Duval County Property Appraiser","address":"231 E Forsyth St. Suite 270, Jacksonville, FL 32202"}},"Escambia County, FL":{"recorder":{"name":"Escambia County Clerk of Circuit Court","address":"190 Governmental Center Suite 4, Pensacola, FL 32502"},"assessor":{"name":"Escambia County Property Appraiser","address":"221 Palafox Pl. Suite 300, Pensacola, FL 32502"}},"Flagler County, FL":{"recorder":{"name":"Flagler County Clerk of Circuit Court","address":"1769 E Moody Blvd. Bldg 1, Bunnell, FL 32110"},"assessor":{"name":"Flagler County Property Appraiser","address":"1769 E Moody Blvd. Suite 102, Bunnell, FL 32110"}},"Franklin County, FL":{"recorder":{"name":"Franklin County Clerk of Circuit Court","address":"33 Market St. Suite 203, Apalachicola, FL 32320"},"assessor":{"name":"Franklin County Property Appraiser","address":"33 Market St. Suite 203, Apalachicola, FL 32320"}},"Gadsden County, FL":{"recorder":{"name":"Gadsden County Clerk of Circuit Court","address":"10 E Jefferson St., Quincy, FL 32351"},"assessor":{"name":"Gadsden County Property Appraiser","address":"10 E Jefferson St., Quincy, FL 32351"}},"Gilchrist County, FL":{"recorder":{"name":"Gilchrist County Clerk of Circuit Court","address":"112 S Main St., Trenton, FL 32693"},"assessor":{"name":"Gilchrist County Property Appraiser","address":"112 S Main St., Trenton, FL 32693"}},"Glades County, FL":{"recorder":{"name":"Glades County Clerk of Circuit Court","address":"500 Ave J Suite 350, Moore Haven, FL 33471"},"assessor":{"name":"Glades County Property Appraiser","address":"500 Ave J Suite 350, Moore Haven, FL 33471"}},"Gulf County, FL":{"recorder":{"name":"Gulf County Clerk of Circuit Court","address":"1000 Cecil G Costin Sr Blvd., Port St. Joe, FL 32456"},"assessor":{"name":"Gulf County Property Appraiser","address":"1000 Cecil G Costin Sr Blvd. Suite 110, Port St. Joe, FL 32456"}},"Hamilton County, FL":{"recorder":{"name":"Hamilton County Clerk of Circuit Court","address":"207 NE 1st St. Suite 106, Jasper, FL 32052"},"assessor":{"name":"Hamilton County Property Appraiser","address":"207 NE 1st St. Suite 106, Jasper, FL 32052"}},"Hardee County, FL":{"recorder":{"name":"Hardee County Clerk of Circuit Court","address":"417 W Main St., Wauchula, FL 33873"},"assessor":{"name":"Hardee County Property Appraiser","address":"205 S 4th Ave. Suite F, Wauchula, FL 33873"}},"Hendry County, FL":{"recorder":{"name":"Hendry County Clerk of Circuit Court","address":"25 E Hickpochee Ave., LaBelle, FL 33935"},"assessor":{"name":"Hendry County Property Appraiser","address":"25 E Hickpochee Ave., LaBelle, FL 33935"}},"Hernando County, FL":{"recorder":{"name":"Hernando County Clerk of Circuit Court","address":"20 N Main St. Suite 129, Brooksville, FL 34601"},"assessor":{"name":"Hernando County Property Appraiser","address":"201 Howell Ave. Suite 300, Brooksville, FL 34601"}},"Highlands County, FL":{"recorder":{"name":"Highlands County Clerk of Circuit Court","address":"590 S Commerce Ave., Sebring, FL 33870"},"assessor":{"name":"Highlands County Property Appraiser","address":"560 S Commerce Ave., Sebring, FL 33870"}},"Hillsborough County, FL":{"recorder":{"name":"Hillsborough County Clerk of Circuit Court","address":"419 Pierce St. Suite 140, Tampa, FL 33602"},"assessor":{"name":"Hillsborough County Property Appraiser","address":"601 E Kennedy Blvd., Tampa, FL 33602"}},"Holmes County, FL":{"recorder":{"name":"Holmes County Clerk of Circuit Court","address":"201 N Oklahoma St. Suite 204, Bonifay, FL 32425"},"assessor":{"name":"Holmes County Property Appraiser","address":"201 N Oklahoma St. Suite 204, Bonifay, FL 32425"}},"Indian River County, FL":{"recorder":{"name":"Indian River County Clerk of Circuit Court","address":"2000 16th Ave., Vero Beach, FL 32960"},"assessor":{"name":"Indian River County Property Appraiser","address":"1800 27th St. Bldg B, Vero Beach, FL 32960"}},"Jackson County, FL":{"recorder":{"name":"Jackson County Clerk of Circuit Court","address":"4445 Lafayette St. Suite 100, Marianna, FL 32446"},"assessor":{"name":"Jackson County Property Appraiser","address":"4445 Lafayette St. Suite 100, Marianna, FL 32446"}},"Jefferson County, FL":{"recorder":{"name":"Jefferson County Clerk of Circuit Court","address":"1 Courthouse Circle, Monticello, FL 32344"},"assessor":{"name":"Jefferson County Property Appraiser","address":"1 Courthouse Circle Suite B, Monticello, FL 32344"}},"Lafayette County, FL":{"recorder":{"name":"Lafayette County Clerk of Circuit Court","address":"120 W Main St., Mayo, FL 32066"},"assessor":{"name":"Lafayette County Property Appraiser","address":"120 W Main St., Mayo, FL 32066"}},"Lake County, FL":{"recorder":{"name":"Lake County Clerk of Circuit Court","address":"550 W Main St., Tavares, FL 32778"},"assessor":{"name":"Lake County Property Appraiser","address":"320 W Main St. Suite 2, Tavares, FL 32778"}},"Lee County, FL":{"recorder":{"name":"Lee County Clerk of Circuit Court","address":"2115 2nd St. Suite 201, Fort Myers, FL 33901"},"assessor":{"name":"Lee County Property Appraiser","address":"2480 Thompson St., Fort Myers, FL 33901"}},"Leon County, FL":{"recorder":{"name":"Leon County Clerk of Circuit Court","address":"301 S Monroe St. Suite 100, Tallahassee, FL 32301"},"assessor":{"name":"Leon County Property Appraiser","address":"315 S Calhoun St. Suite 500, Tallahassee, FL 32301"}},"Levy County, FL":{"recorder":{"name":"Levy County Clerk of Circuit Court","address":"355 S Court St. Suite 1, Bronson, FL 32621"},"assessor":{"name":"Levy County Property Appraiser","address":"355 S Court St. Suite 2, Bronson, FL 32621"}},"Liberty County, FL":{"recorder":{"name":"Liberty County Clerk of Circuit Court","address":"10818 NW Theo Jacobs Way, Bristol, FL 32321"},"assessor":{"name":"Liberty County Property Appraiser","address":"10818 NW Theo Jacobs Way, Bristol, FL 32321"}},"Madison County, FL":{"recorder":{"name":"Madison County Clerk of Circuit Court","address":"125 SW Range Ave., Madison, FL 32340"},"assessor":{"name":"Madison County Property Appraiser","address":"125 SW Range Ave., Madison, FL 32340"}},"Manatee County, FL":{"recorder":{"name":"Manatee County Clerk of Circuit Court","address":"1115 Manatee Ave. W, Bradenton, FL 34205"},"assessor":{"name":"Manatee County Property Appraiser","address":"915 4th Ave. W, Bradenton, FL 34205"}},"Marion County, FL":{"recorder":{"name":"Marion County Clerk of Circuit Court","address":"110 NW 1st Ave., Ocala, FL 34475"},"assessor":{"name":"Marion County Property Appraiser","address":"3100 SE 27th Ave., Ocala, FL 34471"}},"Martin County, FL":{"recorder":{"name":"Martin County Clerk of Circuit Court","address":"100 E Ocean Blvd., Stuart, FL 34994"},"assessor":{"name":"Martin County Property Appraiser","address":"1111 SE Federal Hwy Suite 330, Stuart, FL 34994"}},"Miami-Dade County, FL":{"recorder":{"name":"Miami-Dade County Clerk of Circuit Court","address":"22 NW 1st St. Suite 1510, Miami, FL 33128"},"assessor":{"name":"Miami-Dade County Property Appraiser","address":"111 NW 1st St. Suite 710, Miami, FL 33128"}},"Monroe County, FL":{"recorder":{"name":"Monroe County Clerk of Circuit Court","address":"500 Whitehead St., Key West, FL 33040"},"assessor":{"name":"Monroe County Property Appraiser","address":"500 Whitehead St. Suite 101, Key West, FL 33040"}},"Nassau County, FL":{"recorder":{"name":"Nassau County Clerk of Circuit Court","address":"76347 Veterans Way Suite 456, Yulee, FL 32097"},"assessor":{"name":"Nassau County Property Appraiser","address":"96135 Nassau Place Suite 4, Yulee, FL 32097"}},"Okaloosa County, FL":{"recorder":{"name":"Okaloosa County Clerk of Circuit Court","address":"101 E James Lee Blvd. Suite 108, Crestview, FL 32536"},"assessor":{"name":"Okaloosa County Property Appraiser","address":"73 Eglin Pkwy NE Suite 202, Fort Walton Beach, FL 32548"}},"Okeechobee County, FL":{"recorder":{"name":"Okeechobee County Clerk of Circuit Court","address":"312 NW 3rd St., Okeechobee, FL 34972"},"assessor":{"name":"Okeechobee County Property Appraiser","address":"409 NW 2nd Ave. Suite A, Okeechobee, FL 34972"}},"Orange County, FL":{"recorder":{"name":"Orange County Clerk of Circuit Court","address":"425 N Orange Ave. Suite 310, Orlando, FL 32801"},"assessor":{"name":"Orange County Property Appraiser","address":"200 S Orange Ave. Suite 1700, Orlando, FL 32801"}},"Osceola County, FL":{"recorder":{"name":"Osceola County Clerk of Circuit Court","address":"2 Courthouse Square Suite 2000, Kissimmee, FL 34741"},"assessor":{"name":"Osceola County Property Appraiser","address":"2505 E Irlo Bronson Memorial Hwy, Kissimmee, FL 34744"}},"Palm Beach County, FL":{"recorder":{"name":"Palm Beach County Clerk of Circuit Court","address":"205 N Dixie Hwy Room 4.2400, West Palm Beach, FL 33401"},"assessor":{"name":"Palm Beach County Property Appraiser","address":"301 N Olive Ave. Suite 900, West Palm Beach, FL 33401"}},"Pasco County, FL":{"recorder":{"name":"Pasco County Clerk of Circuit Court","address":"38053 Live Oak Ave. Suite 201, Dade City, FL 33523"},"assessor":{"name":"Pasco County Property Appraiser","address":"14236 6th St. Suite 101, Dade City, FL 33523"}},"Pinellas County, FL":{"recorder":{"name":"Pinellas County Clerk of Circuit Court","address":"315 Court St. Room 161, Clearwater, FL 33756"},"assessor":{"name":"Pinellas County Property Appraiser","address":"315 Court St., Clearwater, FL 33756"}},"Polk County, FL":{"recorder":{"name":"Polk County Clerk of Circuit Court","address":"255 N Broadway Ave., Bartow, FL 33830"},"assessor":{"name":"Polk County Property Appraiser","address":"255 N Wilson Ave., Bartow, FL 33830"}},"Putnam County, FL":{"recorder":{"name":"Putnam County Clerk of Circuit Court","address":"410 St. Johns Ave., Palatka, FL 32177"},"assessor":{"name":"Putnam County Property Appraiser","address":"312 Oak St., Palatka, FL 32177"}},"Santa Rosa County, FL":{"recorder":{"name":"Santa Rosa County Clerk of Circuit Court","address":"6865 Caroline St. Suite A, Milton, FL 32570"},"assessor":{"name":"Santa Rosa County Property Appraiser","address":"6495 Caroline St. Suite K, Milton, FL 32570"}},"Sarasota County, FL":{"recorder":{"name":"Sarasota County Clerk of Circuit Court","address":"2000 Main St. Suite 200, Sarasota, FL 34237"},"assessor":{"name":"Sarasota County Property Appraiser","address":"101 S Washington Blvd., Sarasota, FL 34236"}},"Seminole County, FL":{"recorder":{"name":"Seminole County Clerk of Circuit Court","address":"301 N Park Ave., Sanford, FL 32771"},"assessor":{"name":"Seminole County Property Appraiser","address":"1101 E 1st St., Sanford, FL 32771"}},"St. Johns County, FL":{"recorder":{"name":"St. Johns County Clerk of Circuit Court","address":"4010 Lewis Speedway, St. Augustine, FL 32084"},"assessor":{"name":"St. Johns County Property Appraiser","address":"4030 Lewis Speedway, St. Augustine, FL 32084"}},"St. Lucie County, FL":{"recorder":{"name":"St. Lucie County Clerk of Circuit Court","address":"201 S Indian River Dr., Fort Pierce, FL 34950"},"assessor":{"name":"St. Lucie County Property Appraiser","address":"2300 Virginia Ave. Room 107, Fort Pierce, FL 34982"}},"Sumter County, FL":{"recorder":{"name":"Sumter County Clerk of Circuit Court","address":"215 E McCollum Ave., Bushnell, FL 33513"},"assessor":{"name":"Sumter County Property Appraiser","address":"7375 Powell Rd., Wildwood, FL 34785"}},"Suwannee County, FL":{"recorder":{"name":"Suwannee County Clerk of Circuit Court","address":"200 S Ohio Ave., Live Oak, FL 32064"},"assessor":{"name":"Suwannee County Property Appraiser","address":"200 S Ohio Ave. Suite 2, Live Oak, FL 32064"}},"Taylor County, FL":{"recorder":{"name":"Taylor County Clerk of Circuit Court","address":"108 N Jefferson St. Suite 102, Perry, FL 32347"},"assessor":{"name":"Taylor County Property Appraiser","address":"108 N Jefferson St. Suite 102, Perry, FL 32347"}},"Union County, FL":{"recorder":{"name":"Union County Clerk of Circuit Court","address":"55 W Main St. Room 103, Lake Butler, FL 32054"},"assessor":{"name":"Union County Property Appraiser","address":"55 W Main St. Room 103, Lake Butler, FL 32054"}},"Volusia County, FL":{"recorder":{"name":"Volusia County Clerk of Circuit Court","address":"101 N Alabama Ave., DeLand, FL 32724"},"assessor":{"name":"Volusia County Property Appraiser","address":"123 W Indiana Ave., DeLand, FL 32720"}},"Wakulla County, FL":{"recorder":{"name":"Wakulla County Clerk of Circuit Court","address":"3056 Crawfordville Hwy, Crawfordville, FL 32327"},"assessor":{"name":"Wakulla County Property Appraiser","address":"3115 Crawfordville Hwy, Crawfordville, FL 32327"}},"Walton County, FL":{"recorder":{"name":"Walton County Clerk of Circuit Court","address":"571 US Hwy 90 E, DeFuniak Springs, FL 32433"},"assessor":{"name":"Walton County Property Appraiser","address":"571 US Hwy 90 E, DeFuniak Springs, FL 32433"}},"Washington County, FL":{"recorder":{"name":"Washington County Clerk of Circuit Court","address":"1293 Jackson Ave. Suite 101, Chipley, FL 32428"},"assessor":{"name":"Washington County Property Appraiser","address":"1293 Jackson Ave. Suite 101, Chipley, FL 32428"}},"Appling County, GA":{"recorder":{"name":"Appling County Clerk of Superior Court","address":"69 Tippins St. Suite 201, Baxley, GA 31513"},"assessor":{"name":"Appling County Tax Assessor","address":"69 Tippins St. Suite 201, Baxley, GA 31513"}},"Atkinson County, GA":{"recorder":{"name":"Atkinson County Clerk of Superior Court","address":"18 Court Square, Pearson, GA 31642"},"assessor":{"name":"Atkinson County Tax Assessor","address":"18 Court Square, Pearson, GA 31642"}},"Bacon County, GA":{"recorder":{"name":"Bacon County Clerk of Superior Court","address":"502 W 12th St. Suite 4, Alma, GA 31510"},"assessor":{"name":"Bacon County Tax Assessor","address":"502 W 12th St. Suite 4, Alma, GA 31510"}},"Baker County, GA":{"recorder":{"name":"Baker County Clerk of Superior Court","address":"Baker County Courthouse, Newton, GA 39870"},"assessor":{"name":"Baker County Tax Assessor","address":"Baker County Courthouse, Newton, GA 39870"}},"Baldwin County, GA":{"recorder":{"name":"Baldwin County Clerk of Superior Court","address":"121 N Wilkinson St. Suite 124, Milledgeville, GA 31061"},"assessor":{"name":"Baldwin County Tax Assessor","address":"121 N Wilkinson St. Suite 124, Milledgeville, GA 31061"}},"Banks County, GA":{"recorder":{"name":"Banks County Clerk of Superior Court","address":"144 Yonah Homer Rd., Homer, GA 30547"},"assessor":{"name":"Banks County Tax Assessor","address":"144 Yonah Homer Rd., Homer, GA 30547"}},"Barrow County, GA":{"recorder":{"name":"Barrow County Clerk of Superior Court","address":"30 N Broad St., Winder, GA 30680"},"assessor":{"name":"Barrow County Tax Assessor","address":"30 N Broad St., Winder, GA 30680"}},"Bartow County, GA":{"recorder":{"name":"Bartow County Clerk of Superior Court","address":"135 W Cherokee Ave. Suite 233, Cartersville, GA 30120"},"assessor":{"name":"Bartow County Tax Assessor","address":"135 W Cherokee Ave. Suite 233, Cartersville, GA 30120"}},"Ben Hill County, GA":{"recorder":{"name":"Ben Hill County Clerk of Superior Court","address":"401 E Central Ave., Fitzgerald, GA 31750"},"assessor":{"name":"Ben Hill County Tax Assessor","address":"401 E Central Ave., Fitzgerald, GA 31750"}},"Berrien County, GA":{"recorder":{"name":"Berrien County Clerk of Superior Court","address":"101 E Marion Ave. Suite 1, Nashville, GA 31639"},"assessor":{"name":"Berrien County Tax Assessor","address":"101 E Marion Ave. Suite 1, Nashville, GA 31639"}},"Bibb County, GA":{"recorder":{"name":"Bibb County Clerk of Superior Court","address":"601 Mulberry St., Macon, GA 31201"},"assessor":{"name":"Bibb County Tax Assessor","address":"601 Mulberry St., Macon, GA 31201"}},"Bleckley County, GA":{"recorder":{"name":"Bleckley County Clerk of Superior Court","address":"306 SE 2nd St., Cochran, GA 31014"},"assessor":{"name":"Bleckley County Tax Assessor","address":"306 SE 2nd St., Cochran, GA 31014"}},"Brantley County, GA":{"recorder":{"name":"Brantley County Clerk of Superior Court","address":"117 Brantley Ave., Nahunta, GA 31553"},"assessor":{"name":"Brantley County Tax Assessor","address":"117 Brantley Ave., Nahunta, GA 31553"}},"Brooks County, GA":{"recorder":{"name":"Brooks County Clerk of Superior Court","address":"610 S Highland Ave., Quitman, GA 31643"},"assessor":{"name":"Brooks County Tax Assessor","address":"610 S Highland Ave., Quitman, GA 31643"}},"Bryan County, GA":{"recorder":{"name":"Bryan County Clerk of Superior Court","address":"W State St., Pembroke, GA 31321"},"assessor":{"name":"Bryan County Tax Assessor","address":"W State St., Pembroke, GA 31321"}},"Bulloch County, GA":{"recorder":{"name":"Bulloch County Clerk of Superior Court","address":"20 Siebald St., Statesboro, GA 30458"},"assessor":{"name":"Bulloch County Tax Assessor","address":"20 Siebald St., Statesboro, GA 30458"}},"Burke County, GA":{"recorder":{"name":"Burke County Clerk of Superior Court","address":"602 Liberty St., Waynesboro, GA 30830"},"assessor":{"name":"Burke County Tax Assessor","address":"602 Liberty St., Waynesboro, GA 30830"}},"Butts County, GA":{"recorder":{"name":"Butts County Clerk of Superior Court","address":"25 3rd St. Suite 107, Jackson, GA 30233"},"assessor":{"name":"Butts County Tax Assessor","address":"25 3rd St. Suite 107, Jackson, GA 30233"}},"Calhoun County, GA":{"recorder":{"name":"Calhoun County Clerk of Superior Court","address":"Morgan, GA 39866"},"assessor":{"name":"Calhoun County Tax Assessor","address":"Morgan, GA 39866"}},"Camden County, GA":{"recorder":{"name":"Camden County Clerk of Superior Court","address":"200 E 4th St., Woodbine, GA 31569"},"assessor":{"name":"Camden County Tax Assessor","address":"200 E 4th St., Woodbine, GA 31569"}},"Candler County, GA":{"recorder":{"name":"Candler County Clerk of Superior Court","address":"355 S Church St., Metter, GA 30439"},"assessor":{"name":"Candler County Tax Assessor","address":"355 S Church St., Metter, GA 30439"}},"Carroll County, GA":{"recorder":{"name":"Carroll County Clerk of Superior Court","address":"323 Newnan St., Carrollton, GA 30117"},"assessor":{"name":"Carroll County Tax Assessor","address":"323 Newnan St., Carrollton, GA 30117"}},"Catoosa County, GA":{"recorder":{"name":"Catoosa County Clerk of Superior Court","address":"875 Lafayette St., Ringgold, GA 30736"},"assessor":{"name":"Catoosa County Tax Assessor","address":"875 Lafayette St., Ringgold, GA 30736"}},"Charlton County, GA":{"recorder":{"name":"Charlton County Clerk of Superior Court","address":"100 S 3rd St., Folkston, GA 31537"},"assessor":{"name":"Charlton County Tax Assessor","address":"100 S 3rd St., Folkston, GA 31537"}},"Chatham County, GA":{"recorder":{"name":"Chatham County Clerk of Superior Court","address":"133 Montgomery St. Suite 3100, Savannah, GA 31401"},"assessor":{"name":"Chatham County Tax Assessor","address":"133 Montgomery St. Suite 3100, Savannah, GA 31401"}},"Chattahoochee County, GA":{"recorder":{"name":"Chattahoochee County Clerk of Superior Court","address":"Harrison, GA 31849"},"assessor":{"name":"Chattahoochee County Tax Assessor","address":"Harrison, GA 31849"}},"Chattooga County, GA":{"recorder":{"name":"Chattooga County Clerk of Superior Court","address":"10 Commerce St., Summerville, GA 30747"},"assessor":{"name":"Chattooga County Tax Assessor","address":"10 Commerce St., Summerville, GA 30747"}},"Cherokee County, GA":{"recorder":{"name":"Cherokee County Clerk of Superior Court","address":"90 North St. Suite G170, Canton, GA 30114"},"assessor":{"name":"Cherokee County Tax Assessor","address":"2780 Marietta Hwy Suite 200, Canton, GA 30114"}},"Clarke County, GA":{"recorder":{"name":"Clarke County Clerk of Superior Court","address":"325 E Washington St. Suite 211, Athens, GA 30601"},"assessor":{"name":"Clarke County Tax Assessor","address":"325 E Washington St. Suite 211, Athens, GA 30601"}},"Clay County, GA":{"recorder":{"name":"Clay County Clerk of Superior Court","address":"210 S Washington St., Fort Gaines, GA 39851"},"assessor":{"name":"Clay County Tax Assessor","address":"210 S Washington St., Fort Gaines, GA 39851"}},"Clayton County, GA":{"recorder":{"name":"Clayton County Clerk of Superior Court","address":"9151 Tara Blvd., Jonesboro, GA 30236"},"assessor":{"name":"Clayton County Tax Assessor","address":"121 S McDonough St., Jonesboro, GA 30236"}},"Clinch County, GA":{"recorder":{"name":"Clinch County Clerk of Superior Court","address":"100 Court Square, Homerville, GA 31634"},"assessor":{"name":"Clinch County Tax Assessor","address":"100 Court Square, Homerville, GA 31634"}},"Cobb County, GA":{"recorder":{"name":"Cobb County Clerk of Superior Court","address":"70 Haynes St., Marietta, GA 30090"},"assessor":{"name":"Cobb County Tax Assessor","address":"736 Whitlock Ave. Suite 200, Marietta, GA 30064"}},"Coffee County, GA":{"recorder":{"name":"Coffee County Clerk of Superior Court","address":"101 S Peterson Ave., Douglas, GA 31533"},"assessor":{"name":"Coffee County Tax Assessor","address":"101 S Peterson Ave., Douglas, GA 31533"}},"Colquitt County, GA":{"recorder":{"name":"Colquitt County Clerk of Superior Court","address":"101 E Central Ave. Suite A, Moultrie, GA 31768"},"assessor":{"name":"Colquitt County Tax Assessor","address":"101 E Central Ave. Suite A, Moultrie, GA 31768"}},"Columbia County, GA":{"recorder":{"name":"Columbia County Clerk of Superior Court","address":"640 Ronald Reagan Dr. Bldg C, Evans, GA 30809"},"assessor":{"name":"Columbia County Tax Assessor","address":"630 Ronald Reagan Dr. Bldg A, Evans, GA 30809"}},"Cook County, GA":{"recorder":{"name":"Cook County Clerk of Superior Court","address":"212 N Hutchinson Ave., Adel, GA 31620"},"assessor":{"name":"Cook County Tax Assessor","address":"212 N Hutchinson Ave., Adel, GA 31620"}},"Coweta County, GA":{"recorder":{"name":"Coweta County Clerk of Superior Court","address":"72 Greenville St., Newnan, GA 30264"},"assessor":{"name":"Coweta County Tax Assessor","address":"37 Perry St., Newnan, GA 30263"}},"Crawford County, GA":{"recorder":{"name":"Crawford County Clerk of Superior Court","address":"1 Courthouse Square, Knoxville, GA 31050"},"assessor":{"name":"Crawford County Tax Assessor","address":"1 Courthouse Square, Knoxville, GA 31050"}},"Crisp County, GA":{"recorder":{"name":"Crisp County Clerk of Superior Court","address":"210 S 7th St., Cordele, GA 31015"},"assessor":{"name":"Crisp County Tax Assessor","address":"210 S 7th St., Cordele, GA 31015"}},"Dade County, GA":{"recorder":{"name":"Dade County Clerk of Superior Court","address":"71 Case Ave., Trenton, GA 30752"},"assessor":{"name":"Dade County Tax Assessor","address":"71 Case Ave., Trenton, GA 30752"}},"Dawson County, GA":{"recorder":{"name":"Dawson County Clerk of Superior Court","address":"25 Justice Way Suite 1322, Dawsonville, GA 30534"},"assessor":{"name":"Dawson County Tax Assessor","address":"25 Justice Way Suite 1322, Dawsonville, GA 30534"}},"Decatur County, GA":{"recorder":{"name":"Decatur County Clerk of Superior Court","address":"112 W Water St., Bainbridge, GA 39817"},"assessor":{"name":"Decatur County Tax Assessor","address":"112 W Water St., Bainbridge, GA 39817"}},"DeKalb County, GA":{"recorder":{"name":"DeKalb County Clerk of Superior Court","address":"556 N McDonough St. Suite 1100, Decatur, GA 30030"},"assessor":{"name":"DeKalb County Tax Assessor","address":"4380 Memorial Dr. Suite 100, Decatur, GA 30032"}},"Dodge County, GA":{"recorder":{"name":"Dodge County Clerk of Superior Court","address":"5401 Anson Ave., Eastman, GA 31023"},"assessor":{"name":"Dodge County Tax Assessor","address":"5401 Anson Ave., Eastman, GA 31023"}},"Dooly County, GA":{"recorder":{"name":"Dooly County Clerk of Superior Court","address":"105 Cotton St., Vienna, GA 31092"},"assessor":{"name":"Dooly County Tax Assessor","address":"105 Cotton St., Vienna, GA 31092"}},"Dougherty County, GA":{"recorder":{"name":"Dougherty County Clerk of Superior Court","address":"225 Pine Ave. Suite 131, Albany, GA 31701"},"assessor":{"name":"Dougherty County Tax Assessor","address":"225 Pine Ave. Suite 131, Albany, GA 31701"}},"Douglas County, GA":{"recorder":{"name":"Douglas County Clerk of Superior Court","address":"8700 Hospital Dr., Douglasville, GA 30134"},"assessor":{"name":"Douglas County Tax Assessor","address":"8700 Hospital Dr., Douglasville, GA 30134"}},"Early County, GA":{"recorder":{"name":"Early County Clerk of Superior Court","address":"111 Court Square Suite 1, Blakely, GA 39823"},"assessor":{"name":"Early County Tax Assessor","address":"111 Court Square Suite 1, Blakely, GA 39823"}},"Echols County, GA":{"recorder":{"name":"Echols County Clerk of Superior Court","address":"Statenville, GA 31648"},"assessor":{"name":"Echols County Tax Assessor","address":"Statenville, GA 31648"}},"Effingham County, GA":{"recorder":{"name":"Effingham County Clerk of Superior Court","address":"700 N Pine St. Suite 142, Springfield, GA 31329"},"assessor":{"name":"Effingham County Tax Assessor","address":"700 N Pine St. Suite 142, Springfield, GA 31329"}},"Elbert County, GA":{"recorder":{"name":"Elbert County Clerk of Superior Court","address":"45 Forest Ave. Suite 300, Elberton, GA 30635"},"assessor":{"name":"Elbert County Tax Assessor","address":"45 Forest Ave. Suite 300, Elberton, GA 30635"}},"Emanuel County, GA":{"recorder":{"name":"Emanuel County Clerk of Superior Court","address":"125 S Main St., Swainsboro, GA 30401"},"assessor":{"name":"Emanuel County Tax Assessor","address":"125 S Main St., Swainsboro, GA 30401"}},"Evans County, GA":{"recorder":{"name":"Evans County Clerk of Superior Court","address":"200 Freeman St., Claxton, GA 30417"},"assessor":{"name":"Evans County Tax Assessor","address":"200 Freeman St., Claxton, GA 30417"}},"Fannin County, GA":{"recorder":{"name":"Fannin County Clerk of Superior Court","address":"400 West Main St. Suite 101, Blue Ridge, GA 30513"},"assessor":{"name":"Fannin County Tax Assessor","address":"400 West Main St. Suite 101, Blue Ridge, GA 30513"}},"Fayette County, GA":{"recorder":{"name":"Fayette County Clerk of Superior Court","address":"1 Center Dr. Suite 1245, Fayetteville, GA 30214"},"assessor":{"name":"Fayette County Tax Assessor","address":"140 Stonewall Ave. W Suite 208, Fayetteville, GA 30214"}},"Floyd County, GA":{"recorder":{"name":"Floyd County Clerk of Superior Court","address":"3 Government Plaza Suite 101, Rome, GA 30161"},"assessor":{"name":"Floyd County Tax Assessor","address":"4 Government Plaza Suite 203, Rome, GA 30161"}},"Forsyth County, GA":{"recorder":{"name":"Forsyth County Clerk of Superior Court","address":"100 Courthouse Square Suite 010, Cumming, GA 30040"},"assessor":{"name":"Forsyth County Tax Assessor","address":"110 E Main St. Suite 260, Cumming, GA 30040"}},"Franklin County, GA":{"recorder":{"name":"Franklin County Clerk of Superior Court","address":"11 N Boyd St., Carnesville, GA 30521"},"assessor":{"name":"Franklin County Tax Assessor","address":"11 N Boyd St., Carnesville, GA 30521"}},"Fulton County, GA":{"recorder":{"name":"Fulton County Clerk of Superior Court","address":"136 Pryor St. SW Suite C-301, Atlanta, GA 30303"},"assessor":{"name":"Fulton County Tax Assessor","address":"235 Peachtree St. NE Suite 1400, Atlanta, GA 30303"}},"Gilmer County, GA":{"recorder":{"name":"Gilmer County Clerk of Superior Court","address":"1 Broad St. Suite 201, Ellijay, GA 30540"},"assessor":{"name":"Gilmer County Tax Assessor","address":"1 Broad St. Suite 201, Ellijay, GA 30540"}},"Glascock County, GA":{"recorder":{"name":"Glascock County Clerk of Superior Court","address":"62 E Main St., Gibson, GA 30810"},"assessor":{"name":"Glascock County Tax Assessor","address":"62 E Main St., Gibson, GA 30810"}},"Glynn County, GA":{"recorder":{"name":"Glynn County Clerk of Superior Court","address":"701 H St., Brunswick, GA 31520"},"assessor":{"name":"Glynn County Tax Assessor","address":"1725 Reynolds St. Suite 100, Brunswick, GA 31520"}},"Gordon County, GA":{"recorder":{"name":"Gordon County Clerk of Superior Court","address":"100 Wall St. Suite 105, Calhoun, GA 30701"},"assessor":{"name":"Gordon County Tax Assessor","address":"100 Wall St. Suite 105, Calhoun, GA 30701"}},"Grady County, GA":{"recorder":{"name":"Grady County Clerk of Superior Court","address":"250 N Broad St., Cairo, GA 39827"},"assessor":{"name":"Grady County Tax Assessor","address":"250 N Broad St., Cairo, GA 39827"}},"Greene County, GA":{"recorder":{"name":"Greene County Clerk of Superior Court","address":"113 N Main St. Suite 123, Greensboro, GA 30642"},"assessor":{"name":"Greene County Tax Assessor","address":"113 N Main St. Suite 123, Greensboro, GA 30642"}},"Gwinnett County, GA":{"recorder":{"name":"Gwinnett County Clerk of Superior Court","address":"75 Langley Dr., Lawrenceville, GA 30046"},"assessor":{"name":"Gwinnett County Tax Assessor","address":"75 Langley Dr., Lawrenceville, GA 30046"}},"Habersham County, GA":{"recorder":{"name":"Habersham County Clerk of Superior Court","address":"555 Monroe St. Unit 26, Clarkesville, GA 30523"},"assessor":{"name":"Habersham County Tax Assessor","address":"555 Monroe St. Unit 26, Clarkesville, GA 30523"}},"Hall County, GA":{"recorder":{"name":"Hall County Clerk of Superior Court","address":"225 Green St. SE Suite 2120, Gainesville, GA 30501"},"assessor":{"name":"Hall County Tax Assessor","address":"2875 Browns Bridge Rd., Gainesville, GA 30504"}},"Hancock County, GA":{"recorder":{"name":"Hancock County Clerk of Superior Court","address":"12630 Broad St., Sparta, GA 31087"},"assessor":{"name":"Hancock County Tax Assessor","address":"12630 Broad St., Sparta, GA 31087"}},"Haralson County, GA":{"recorder":{"name":"Haralson County Clerk of Superior Court","address":"4485 Georgia Hwy 120, Buchanan, GA 30113"},"assessor":{"name":"Haralson County Tax Assessor","address":"4485 Georgia Hwy 120, Buchanan, GA 30113"}},"Harris County, GA":{"recorder":{"name":"Harris County Clerk of Superior Court","address":"102 College St., Hamilton, GA 31811"},"assessor":{"name":"Harris County Tax Assessor","address":"102 College St., Hamilton, GA 31811"}},"Hart County, GA":{"recorder":{"name":"Hart County Clerk of Superior Court","address":"165 W Franklin St. Suite 301, Hartwell, GA 30643"},"assessor":{"name":"Hart County Tax Assessor","address":"165 W Franklin St. Suite 301, Hartwell, GA 30643"}},"Heard County, GA":{"recorder":{"name":"Heard County Clerk of Superior Court","address":"215 E Court Square, Franklin, GA 30217"},"assessor":{"name":"Heard County Tax Assessor","address":"215 E Court Square, Franklin, GA 30217"}},"Henry County, GA":{"recorder":{"name":"Henry County Clerk of Superior Court","address":"1 Courthouse Square Suite 1007, McDonough, GA 30253"},"assessor":{"name":"Henry County Tax Assessor","address":"140 Henry Pkwy Suite D, McDonough, GA 30253"}},"Houston County, GA":{"recorder":{"name":"Houston County Clerk of Superior Court","address":"201 Perry Pkwy, Perry, GA 31069"},"assessor":{"name":"Houston County Tax Assessor","address":"201 Perry Pkwy, Perry, GA 31069"}},"Irwin County, GA":{"recorder":{"name":"Irwin County Clerk of Superior Court","address":"107 N Irwin Ave., Ocilla, GA 31774"},"assessor":{"name":"Irwin County Tax Assessor","address":"107 N Irwin Ave., Ocilla, GA 31774"}},"Jackson County, GA":{"recorder":{"name":"Jackson County Clerk of Superior Court","address":"67 Athens St., Jefferson, GA 30549"},"assessor":{"name":"Jackson County Tax Assessor","address":"67 Athens St., Jefferson, GA 30549"}},"Jasper County, GA":{"recorder":{"name":"Jasper County Clerk of Superior Court","address":"126 W Greene St., Monticello, GA 31064"},"assessor":{"name":"Jasper County Tax Assessor","address":"126 W Greene St., Monticello, GA 31064"}},"Jeff Davis County, GA":{"recorder":{"name":"Jeff Davis County Clerk of Superior Court","address":"14 Jeff Davis St. Suite 108, Hazlehurst, GA 31539"},"assessor":{"name":"Jeff Davis County Tax Assessor","address":"14 Jeff Davis St. Suite 108, Hazlehurst, GA 31539"}},"Jefferson County, GA":{"recorder":{"name":"Jefferson County Clerk of Superior Court","address":"202 E Broad St., Louisville, GA 30434"},"assessor":{"name":"Jefferson County Tax Assessor","address":"202 E Broad St., Louisville, GA 30434"}},"Jenkins County, GA":{"recorder":{"name":"Jenkins County Clerk of Superior Court","address":"524 Cotton Ave., Millen, GA 30442"},"assessor":{"name":"Jenkins County Tax Assessor","address":"524 Cotton Ave., Millen, GA 30442"}},"Johnson County, GA":{"recorder":{"name":"Johnson County Clerk of Superior Court","address":"291 N Marcus St., Wrightsville, GA 31096"},"assessor":{"name":"Johnson County Tax Assessor","address":"291 N Marcus St., Wrightsville, GA 31096"}},"Jones County, GA":{"recorder":{"name":"Jones County Clerk of Superior Court","address":"166 Industrial Blvd. Suite B, Gray, GA 31032"},"assessor":{"name":"Jones County Tax Assessor","address":"166 Industrial Blvd. Suite B, Gray, GA 31032"}},"Lamar County, GA":{"recorder":{"name":"Lamar County Clerk of Superior Court","address":"408 Thomaston St. Suite A, Barnesville, GA 30204"},"assessor":{"name":"Lamar County Tax Assessor","address":"408 Thomaston St. Suite A, Barnesville, GA 30204"}},"Lanier County, GA":{"recorder":{"name":"Lanier County Clerk of Superior Court","address":"100 Main St., Lakeland, GA 31635"},"assessor":{"name":"Lanier County Tax Assessor","address":"100 Main St., Lakeland, GA 31635"}},"Laurens County, GA":{"recorder":{"name":"Laurens County Clerk of Superior Court","address":"101 N Jefferson St., Dublin, GA 31021"},"assessor":{"name":"Laurens County Tax Assessor","address":"101 N Jefferson St., Dublin, GA 31021"}},"Lee County, GA":{"recorder":{"name":"Lee County Clerk of Superior Court","address":"100 Starksville Ave. N Suite 102, Leesburg, GA 31763"},"assessor":{"name":"Lee County Tax Assessor","address":"100 Starksville Ave. N Suite 102, Leesburg, GA 31763"}},"Liberty County, GA":{"recorder":{"name":"Liberty County Clerk of Superior Court","address":"112 N Main St., Hinesville, GA 31313"},"assessor":{"name":"Liberty County Tax Assessor","address":"112 N Main St., Hinesville, GA 31313"}},"Lincoln County, GA":{"recorder":{"name":"Lincoln County Clerk of Superior Court","address":"210 Humphrey St., Lincolnton, GA 30817"},"assessor":{"name":"Lincoln County Tax Assessor","address":"210 Humphrey St., Lincolnton, GA 30817"}},"Long County, GA":{"recorder":{"name":"Long County Clerk of Superior Court","address":"65 N McDonald St., Ludowici, GA 31316"},"assessor":{"name":"Long County Tax Assessor","address":"65 N McDonald St., Ludowici, GA 31316"}},"Lowndes County, GA":{"recorder":{"name":"Lowndes County Clerk of Superior Court","address":"327 N Ashley St., Valdosta, GA 31601"},"assessor":{"name":"Lowndes County Tax Assessor","address":"327 N Ashley St., Valdosta, GA 31601"}},"Lumpkin County, GA":{"recorder":{"name":"Lumpkin County Clerk of Superior Court","address":"99 Courthouse Hill Suite B, Dahlonega, GA 30533"},"assessor":{"name":"Lumpkin County Tax Assessor","address":"99 Courthouse Hill Suite B, Dahlonega, GA 30533"}},"Macon County, GA":{"recorder":{"name":"Macon County Clerk of Superior Court","address":"121 S Main St., Oglethorpe, GA 31068"},"assessor":{"name":"Macon County Tax Assessor","address":"121 S Main St., Oglethorpe, GA 31068"}},"Madison County, GA":{"recorder":{"name":"Madison County Clerk of Superior Court","address":"91 Albany Ave. Suite 103, Danielsville, GA 30633"},"assessor":{"name":"Madison County Tax Assessor","address":"91 Albany Ave. Suite 103, Danielsville, GA 30633"}},"Marion County, GA":{"recorder":{"name":"Marion County Clerk of Superior Court","address":"100 Burkhalter Ave., Buena Vista, GA 31803"},"assessor":{"name":"Marion County Tax Assessor","address":"100 Burkhalter Ave., Buena Vista, GA 31803"}},"McDuffie County, GA":{"recorder":{"name":"McDuffie County Clerk of Superior Court","address":"339 Main St., Thomson, GA 30824"},"assessor":{"name":"McDuffie County Tax Assessor","address":"339 Main St., Thomson, GA 30824"}},"McIntosh County, GA":{"recorder":{"name":"McIntosh County Clerk of Superior Court","address":"310 Northway, Darien, GA 31305"},"assessor":{"name":"McIntosh County Tax Assessor","address":"310 Northway, Darien, GA 31305"}},"Meriwether County, GA":{"recorder":{"name":"Meriwether County Clerk of Superior Court","address":"1 Court Square Suite 200, Greenville, GA 30222"},"assessor":{"name":"Meriwether County Tax Assessor","address":"1 Court Square Suite 200, Greenville, GA 30222"}},"Miller County, GA":{"recorder":{"name":"Miller County Clerk of Superior Court","address":"155 S 1st Ave., Colquitt, GA 39837"},"assessor":{"name":"Miller County Tax Assessor","address":"155 S 1st Ave., Colquitt, GA 39837"}},"Mitchell County, GA":{"recorder":{"name":"Mitchell County Clerk of Superior Court","address":"12 N Court Square Suite 103, Camilla, GA 31730"},"assessor":{"name":"Mitchell County Tax Assessor","address":"12 N Court Square Suite 103, Camilla, GA 31730"}},"Monroe County, GA":{"recorder":{"name":"Monroe County Clerk of Superior Court","address":"1 Courthouse Square, Forsyth, GA 31029"},"assessor":{"name":"Monroe County Tax Assessor","address":"1 Courthouse Square, Forsyth, GA 31029"}},"Montgomery County, GA":{"recorder":{"name":"Montgomery County Clerk of Superior Court","address":"300 S Railroad Ave., Mount Vernon, GA 30445"},"assessor":{"name":"Montgomery County Tax Assessor","address":"300 S Railroad Ave., Mount Vernon, GA 30445"}},"Morgan County, GA":{"recorder":{"name":"Morgan County Clerk of Superior Court","address":"149 E Jefferson St. Suite 103, Madison, GA 30650"},"assessor":{"name":"Morgan County Tax Assessor","address":"149 E Jefferson St. Suite 103, Madison, GA 30650"}},"Murray County, GA":{"recorder":{"name":"Murray County Clerk of Superior Court","address":"121 N 4th Ave., Chatsworth, GA 30705"},"assessor":{"name":"Murray County Tax Assessor","address":"121 N 4th Ave., Chatsworth, GA 30705"}},"Muscogee County, GA":{"recorder":{"name":"Muscogee County Clerk of Superior Court","address":"100 10th St., Columbus, GA 31901"},"assessor":{"name":"Muscogee County Tax Assessor","address":"3111 Citizens Way, Columbus, GA 31906"}},"Newton County, GA":{"recorder":{"name":"Newton County Clerk of Superior Court","address":"1132 Usher St. Suite 100, Covington, GA 30014"},"assessor":{"name":"Newton County Tax Assessor","address":"1113 Usher St. Suite 101, Covington, GA 30014"}},"Oconee County, GA":{"recorder":{"name":"Oconee County Clerk of Superior Court","address":"23 N Main St. Suite 101, Watkinsville, GA 30677"},"assessor":{"name":"Oconee County Tax Assessor","address":"23 N Main St. Suite 101, Watkinsville, GA 30677"}},"Oglethorpe County, GA":{"recorder":{"name":"Oglethorpe County Clerk of Superior Court","address":"105 W Liberty St., Lexington, GA 30648"},"assessor":{"name":"Oglethorpe County Tax Assessor","address":"105 W Liberty St., Lexington, GA 30648"}},"Paulding County, GA":{"recorder":{"name":"Paulding County Clerk of Superior Court","address":"11 Courthouse Square, Dallas, GA 30132"},"assessor":{"name":"Paulding County Tax Assessor","address":"25 Courthouse Square Suite 203, Dallas, GA 30132"}},"Peach County, GA":{"recorder":{"name":"Peach County Clerk of Superior Court","address":"205 W Church St., Fort Valley, GA 31030"},"assessor":{"name":"Peach County Tax Assessor","address":"205 W Church St., Fort Valley, GA 31030"}},"Pickens County, GA":{"recorder":{"name":"Pickens County Clerk of Superior Court","address":"50 N Main St. Suite 105, Jasper, GA 30143"},"assessor":{"name":"Pickens County Tax Assessor","address":"50 N Main St. Suite 105, Jasper, GA 30143"}},"Pierce County, GA":{"recorder":{"name":"Pierce County Clerk of Superior Court","address":"312 Nichols St. Suite 5, Blackshear, GA 31516"},"assessor":{"name":"Pierce County Tax Assessor","address":"312 Nichols St. Suite 5, Blackshear, GA 31516"}},"Pike County, GA":{"recorder":{"name":"Pike County Clerk of Superior Court","address":"16001 Barnesville St. Suite 201, Zebulon, GA 30295"},"assessor":{"name":"Pike County Tax Assessor","address":"16001 Barnesville St. Suite 201, Zebulon, GA 30295"}},"Polk County, GA":{"recorder":{"name":"Polk County Clerk of Superior Court","address":"100 Prior St., Cedartown, GA 30125"},"assessor":{"name":"Polk County Tax Assessor","address":"100 Prior St., Cedartown, GA 30125"}},"Pulaski County, GA":{"recorder":{"name":"Pulaski County Clerk of Superior Court","address":"152 N Lumpkin St., Hawkinsville, GA 31036"},"assessor":{"name":"Pulaski County Tax Assessor","address":"152 N Lumpkin St., Hawkinsville, GA 31036"}},"Putnam County, GA":{"recorder":{"name":"Putnam County Clerk of Superior Court","address":"100 S Jefferson Ave. Suite 203, Eatonton, GA 31024"},"assessor":{"name":"Putnam County Tax Assessor","address":"100 S Jefferson Ave. Suite 203, Eatonton, GA 31024"}},"Quitman County, GA":{"recorder":{"name":"Quitman County Clerk of Superior Court","address":"Georgetown, GA 39854"},"assessor":{"name":"Quitman County Tax Assessor","address":"Georgetown, GA 39854"}},"Rabun County, GA":{"recorder":{"name":"Rabun County Clerk of Superior Court","address":"25 Courthouse Square Suite 105, Clayton, GA 30525"},"assessor":{"name":"Rabun County Tax Assessor","address":"25 Courthouse Square Suite 105, Clayton, GA 30525"}},"Randolph County, GA":{"recorder":{"name":"Randolph County Clerk of Superior Court","address":"1 Court Square Suite 2, Cuthbert, GA 39840"},"assessor":{"name":"Randolph County Tax Assessor","address":"1 Court Square Suite 2, Cuthbert, GA 39840"}},"Richmond County, GA":{"recorder":{"name":"Richmond County Clerk of Superior Court","address":"735 James Brown Blvd. Suite 1300, Augusta, GA 30901"},"assessor":{"name":"Richmond County Tax Assessor","address":"535 Telfair St. Suite 120, Augusta, GA 30901"}},"Rockdale County, GA":{"recorder":{"name":"Rockdale County Clerk of Superior Court","address":"922 Court St. NE Suite 101, Conyers, GA 30012"},"assessor":{"name":"Rockdale County Tax Assessor","address":"958 Milstead Ave. Suite 201, Conyers, GA 30012"}},"Schley County, GA":{"recorder":{"name":"Schley County Clerk of Superior Court","address":"Ellaville, GA 31806"},"assessor":{"name":"Schley County Tax Assessor","address":"Ellaville, GA 31806"}},"Screven County, GA":{"recorder":{"name":"Screven County Clerk of Superior Court","address":"216 Mims Rd. Suite 104, Sylvania, GA 30467"},"assessor":{"name":"Screven County Tax Assessor","address":"216 Mims Rd. Suite 104, Sylvania, GA 30467"}},"Seminole County, GA":{"recorder":{"name":"Seminole County Clerk of Superior Court","address":"200 S Knox Ave., Donalsonville, GA 39845"},"assessor":{"name":"Seminole County Tax Assessor","address":"200 S Knox Ave., Donalsonville, GA 39845"}},"Spalding County, GA":{"recorder":{"name":"Spalding County Clerk of Superior Court","address":"132 E Solomon St., Griffin, GA 30223"},"assessor":{"name":"Spalding County Tax Assessor","address":"132 E Solomon St., Griffin, GA 30223"}},"Stephens County, GA":{"recorder":{"name":"Stephens County Clerk of Superior Court","address":"90 N Alexander St. Suite 103, Toccoa, GA 30577"},"assessor":{"name":"Stephens County Tax Assessor","address":"90 N Alexander St. Suite 103, Toccoa, GA 30577"}},"Stewart County, GA":{"recorder":{"name":"Stewart County Clerk of Superior Court","address":"Lumpkin, GA 31815"},"assessor":{"name":"Stewart County Tax Assessor","address":"Lumpkin, GA 31815"}},"Sumter County, GA":{"recorder":{"name":"Sumter County Clerk of Superior Court","address":"500 W Lamar St., Americus, GA 31709"},"assessor":{"name":"Sumter County Tax Assessor","address":"500 W Lamar St., Americus, GA 31709"}},"Talbot County, GA":{"recorder":{"name":"Talbot County Clerk of Superior Court","address":"Courthouse Square, Talbotton, GA 31827"},"assessor":{"name":"Talbot County Tax Assessor","address":"Courthouse Square, Talbotton, GA 31827"}},"Taliaferro County, GA":{"recorder":{"name":"Taliaferro County Clerk of Superior Court","address":"Crawfordville, GA 30631"},"assessor":{"name":"Taliaferro County Tax Assessor","address":"Crawfordville, GA 30631"}},"Tattnall County, GA":{"recorder":{"name":"Tattnall County Clerk of Superior Court","address":"108 W Brazell St., Reidsville, GA 30453"},"assessor":{"name":"Tattnall County Tax Assessor","address":"108 W Brazell St., Reidsville, GA 30453"}},"Taylor County, GA":{"recorder":{"name":"Taylor County Clerk of Superior Court","address":"1 Courthouse Square Suite 102, Butler, GA 31006"},"assessor":{"name":"Taylor County Tax Assessor","address":"1 Courthouse Square Suite 102, Butler, GA 31006"}},"Telfair County, GA":{"recorder":{"name":"Telfair County Clerk of Superior Court","address":"128 E Oak St. Suite 1, McRae-Helena, GA 31055"},"assessor":{"name":"Telfair County Tax Assessor","address":"128 E Oak St. Suite 1, McRae-Helena, GA 31055"}},"Terrell County, GA":{"recorder":{"name":"Terrell County Clerk of Superior Court","address":"955 Forrester Dr. SE, Dawson, GA 39842"},"assessor":{"name":"Terrell County Tax Assessor","address":"955 Forrester Dr. SE, Dawson, GA 39842"}},"Thomas County, GA":{"recorder":{"name":"Thomas County Clerk of Superior Court","address":"225 N Broad St., Thomasville, GA 31792"},"assessor":{"name":"Thomas County Tax Assessor","address":"225 N Broad St., Thomasville, GA 31792"}},"Tift County, GA":{"recorder":{"name":"Tift County Clerk of Superior Court","address":"225 N Tift Ave., Tifton, GA 31794"},"assessor":{"name":"Tift County Tax Assessor","address":"225 N Tift Ave., Tifton, GA 31794"}},"Toombs County, GA":{"recorder":{"name":"Toombs County Clerk of Superior Court","address":"100 Courthouse Square Suite 1, Lyons, GA 30436"},"assessor":{"name":"Toombs County Tax Assessor","address":"100 Courthouse Square Suite 1, Lyons, GA 30436"}},"Towns County, GA":{"recorder":{"name":"Towns County Clerk of Superior Court","address":"48 River St. Suite E, Hiawassee, GA 30546"},"assessor":{"name":"Towns County Tax Assessor","address":"48 River St. Suite E, Hiawassee, GA 30546"}},"Treutlen County, GA":{"recorder":{"name":"Treutlen County Clerk of Superior Court","address":"650 2nd St. Suite 105, Soperton, GA 30457"},"assessor":{"name":"Treutlen County Tax Assessor","address":"650 2nd St. Suite 105, Soperton, GA 30457"}},"Troup County, GA":{"recorder":{"name":"Troup County Clerk of Superior Court","address":"900 Dallis St., LaGrange, GA 30240"},"assessor":{"name":"Troup County Tax Assessor","address":"100 Ridley Ave., LaGrange, GA 30240"}},"Turner County, GA":{"recorder":{"name":"Turner County Clerk of Superior Court","address":"219 E College Ave. Suite 3, Ashburn, GA 31714"},"assessor":{"name":"Turner County Tax Assessor","address":"219 E College Ave. Suite 3, Ashburn, GA 31714"}},"Twiggs County, GA":{"recorder":{"name":"Twiggs County Clerk of Superior Court","address":"425 Railroad St., Jeffersonville, GA 31044"},"assessor":{"name":"Twiggs County Tax Assessor","address":"425 Railroad St., Jeffersonville, GA 31044"}},"Union County, GA":{"recorder":{"name":"Union County Clerk of Superior Court","address":"114 Courthouse St. Suite 5, Blairsville, GA 30512"},"assessor":{"name":"Union County Tax Assessor","address":"114 Courthouse St. Suite 5, Blairsville, GA 30512"}},"Upson County, GA":{"recorder":{"name":"Upson County Clerk of Superior Court","address":"116 W Main St., Thomaston, GA 30286"},"assessor":{"name":"Upson County Tax Assessor","address":"116 W Main St., Thomaston, GA 30286"}},"Walker County, GA":{"recorder":{"name":"Walker County Clerk of Superior Court","address":"103 S Duke St., LaFayette, GA 30728"},"assessor":{"name":"Walker County Tax Assessor","address":"103 S Duke St., LaFayette, GA 30728"}},"Walton County, GA":{"recorder":{"name":"Walton County Clerk of Superior Court","address":"303 S Hammond Dr. Suite 330, Monroe, GA 30655"},"assessor":{"name":"Walton County Tax Assessor","address":"303 S Hammond Dr. Suite 330, Monroe, GA 30655"}},"Ware County, GA":{"recorder":{"name":"Ware County Clerk of Superior Court","address":"800 Church St. Suite C, Waycross, GA 31501"},"assessor":{"name":"Ware County Tax Assessor","address":"800 Church St. Suite C, Waycross, GA 31501"}},"Warren County, GA":{"recorder":{"name":"Warren County Clerk of Superior Court","address":"100 Main St., Warrenton, GA 30828"},"assessor":{"name":"Warren County Tax Assessor","address":"100 Main St., Warrenton, GA 30828"}},"Washington County, GA":{"recorder":{"name":"Washington County Clerk of Superior Court","address":"115 Jones St., Sandersville, GA 31082"},"assessor":{"name":"Washington County Tax Assessor","address":"115 Jones St., Sandersville, GA 31082"}},"Wayne County, GA":{"recorder":{"name":"Wayne County Clerk of Superior Court","address":"174 N Brunswick St. Suite 105, Jesup, GA 31545"},"assessor":{"name":"Wayne County Tax Assessor","address":"174 N Brunswick St. Suite 105, Jesup, GA 31545"}},"Webster County, GA":{"recorder":{"name":"Webster County Clerk of Superior Court","address":"Preston, GA 31824"},"assessor":{"name":"Webster County Tax Assessor","address":"Preston, GA 31824"}},"Wheeler County, GA":{"recorder":{"name":"Wheeler County Clerk of Superior Court","address":"101 S Railroad Ave., Alamo, GA 30411"},"assessor":{"name":"Wheeler County Tax Assessor","address":"101 S Railroad Ave., Alamo, GA 30411"}},"White County, GA":{"recorder":{"name":"White County Clerk of Superior Court","address":"59 S Main St. Suite 103, Cleveland, GA 30528"},"assessor":{"name":"White County Tax Assessor","address":"59 S Main St. Suite 103, Cleveland, GA 30528"}},"Whitfield County, GA":{"recorder":{"name":"Whitfield County Clerk of Superior Court","address":"205 N Selvidge St. Suite F, Dalton, GA 30720"},"assessor":{"name":"Whitfield County Tax Assessor","address":"205 N Selvidge St. Suite F, Dalton, GA 30720"}},"Wilcox County, GA":{"recorder":{"name":"Wilcox County Clerk of Superior Court","address":"103 N Broad St., Abbeville, GA 31001"},"assessor":{"name":"Wilcox County Tax Assessor","address":"103 N Broad St., Abbeville, GA 31001"}},"Wilkes County, GA":{"recorder":{"name":"Wilkes County Clerk of Superior Court","address":"23 E Court St. Suite 205, Washington, GA 30673"},"assessor":{"name":"Wilkes County Tax Assessor","address":"23 E Court St. Suite 205, Washington, GA 30673"}},"Wilkinson County, GA":{"recorder":{"name":"Wilkinson County Clerk of Superior Court","address":"100 W Gordon St., Irwinton, GA 31042"},"assessor":{"name":"Wilkinson County Tax Assessor","address":"100 W Gordon St., Irwinton, GA 31042"}},"Worth County, GA":{"recorder":{"name":"Worth County Clerk of Superior Court","address":"201 N Main Ave. Suite 3, Sylvester, GA 31791"},"assessor":{"name":"Worth County Tax Assessor","address":"201 N Main Ave. Suite 3, Sylvester, GA 31791"}},"Hawaii County, HI":{"recorder":{"name":"Hawaii Bureau of Conveyances (Statewide Recorder)","address":"1151 Punchbowl St. Suite 120, Honolulu, HI 96813","note":"Hawaii uses a single statewide recording system. All documents recorded at state BOC."},"assessor":{"name":"Hawaii County Real Property Tax Office","address":"74 Pu'uhonu Pl. Suite 4, Hilo, HI 96720"}},"Honolulu County, HI":{"recorder":{"name":"Hawaii Bureau of Conveyances (Statewide Recorder)","address":"1151 Punchbowl St. Suite 120, Honolulu, HI 96813","note":"Hawaii uses a single statewide recording system. All documents recorded at state BOC."},"assessor":{"name":"City & County of Honolulu Real Property Assessment Division","address":"842 Bethel St. Basement, Honolulu, HI 96813"}},"Kalawao County, HI":{"recorder":{"name":"Hawaii Bureau of Conveyances (Statewide Recorder)","address":"1151 Punchbowl St. Suite 120, Honolulu, HI 96813","note":"Hawaii uses a single statewide recording system. All documents recorded at state BOC."},"assessor":{"name":"Maui County Real Property Assessment Division (administers Kalawao)","address":"110 'Ala'ihi St. Suite 110, Kahului, HI 96732","note":"Kalawao County has no independent county government. Real property administered by Maui County RPAD."}},"Kauai County, HI":{"recorder":{"name":"Hawaii Bureau of Conveyances (Statewide Recorder)","address":"1151 Punchbowl St. Suite 120, Honolulu, HI 96813","note":"Hawaii uses a single statewide recording system. All documents recorded at state BOC."},"assessor":{"name":"Kauai County Real Property Assessment Division","address":"4444 Rice St. Suite 463, Lihue, HI 96766"}},"Maui County, HI":{"recorder":{"name":"Hawaii Bureau of Conveyances (Statewide Recorder)","address":"1151 Punchbowl St. Suite 120, Honolulu, HI 96813","note":"Hawaii uses a single statewide recording system. All documents recorded at state BOC."},"assessor":{"name":"Maui County Real Property Assessment Division","address":"110 'Ala'ihi St. Suite 110, Kahului, HI 96732"}},"Adair County, IA":{"recorder":{"name":"Adair County Recorder","address":"400 Public Square Suite 5, Greenfield, IA 50849"},"assessor":{"name":"Adair County Assessor","address":"400 Public Square Suite 5, Greenfield, IA 50849"}},"Adams County, IA":{"recorder":{"name":"Adams County Recorder","address":"500 9th St., Corning, IA 50841"},"assessor":{"name":"Adams County Assessor","address":"500 9th St., Corning, IA 50841"}},"Allamakee County, IA":{"recorder":{"name":"Allamakee County Recorder","address":"110 Allamakee St., Waukon, IA 52172"},"assessor":{"name":"Allamakee County Assessor","address":"110 Allamakee St., Waukon, IA 52172"}},"Appanoose County, IA":{"recorder":{"name":"Appanoose County Recorder","address":"201 N 12th St., Centerville, IA 52544"},"assessor":{"name":"Appanoose County Assessor","address":"201 N 12th St., Centerville, IA 52544"}},"Audubon County, IA":{"recorder":{"name":"Audubon County Recorder","address":"318 Leroy St., Audubon, IA 50025"},"assessor":{"name":"Audubon County Assessor","address":"318 Leroy St., Audubon, IA 50025"}},"Benton County, IA":{"recorder":{"name":"Benton County Recorder","address":"111 E 4th St., Vinton, IA 52349"},"assessor":{"name":"Benton County Assessor","address":"111 E 4th St., Vinton, IA 52349"}},"Black Hawk County, IA":{"recorder":{"name":"Black Hawk County Recorder","address":"316 E 5th St., Waterloo, IA 50703"},"assessor":{"name":"Black Hawk County Assessor","address":"316 E 5th St., Waterloo, IA 50703"}},"Boone County, IA":{"recorder":{"name":"Boone County Recorder","address":"201 State St., Boone, IA 50036"},"assessor":{"name":"Boone County Assessor","address":"201 State St., Boone, IA 50036"}},"Bremer County, IA":{"recorder":{"name":"Bremer County Recorder","address":"415 E Bremer Ave., Waverly, IA 50677"},"assessor":{"name":"Bremer County Assessor","address":"415 E Bremer Ave., Waverly, IA 50677"}},"Buchanan County, IA":{"recorder":{"name":"Buchanan County Recorder","address":"210 5th Ave NE, Independence, IA 50644"},"assessor":{"name":"Buchanan County Assessor","address":"210 5th Ave NE, Independence, IA 50644"}},"Buena Vista County, IA":{"recorder":{"name":"Buena Vista County Recorder","address":"215 E 5th St., Storm Lake, IA 50588"},"assessor":{"name":"Buena Vista County Assessor","address":"215 E 5th St., Storm Lake, IA 50588"}},"Butler County, IA":{"recorder":{"name":"Butler County Recorder","address":"428 6th St., Allison, IA 50602"},"assessor":{"name":"Butler County Assessor","address":"428 6th St., Allison, IA 50602"}},"Calhoun County, IA":{"recorder":{"name":"Calhoun County Recorder","address":"416 4th St., Rockwell City, IA 50579"},"assessor":{"name":"Calhoun County Assessor","address":"416 4th St., Rockwell City, IA 50579"}},"Carroll County, IA":{"recorder":{"name":"Carroll County Recorder","address":"114 E 6th St., Carroll, IA 51401"},"assessor":{"name":"Carroll County Assessor","address":"114 E 6th St., Carroll, IA 51401"}},"Cass County, IA":{"recorder":{"name":"Cass County Recorder","address":"5 W 7th St., Atlantic, IA 50022"},"assessor":{"name":"Cass County Assessor","address":"5 W 7th St., Atlantic, IA 50022"}},"Cedar County, IA":{"recorder":{"name":"Cedar County Recorder","address":"400 Cedar St., Tipton, IA 52772"},"assessor":{"name":"Cedar County Assessor","address":"400 Cedar St., Tipton, IA 52772"}},"Cerro Gordo County, IA":{"recorder":{"name":"Cerro Gordo County Recorder","address":"220 N Washington Ave., Mason City, IA 50401"},"assessor":{"name":"Cerro Gordo County Assessor","address":"220 N Washington Ave., Mason City, IA 50401"}},"Cherokee County, IA":{"recorder":{"name":"Cherokee County Recorder","address":"520 W Main St., Cherokee, IA 51012"},"assessor":{"name":"Cherokee County Assessor","address":"520 W Main St., Cherokee, IA 51012"}},"Chickasaw County, IA":{"recorder":{"name":"Chickasaw County Recorder","address":"8 E Prospect St., New Hampton, IA 50659"},"assessor":{"name":"Chickasaw County Assessor","address":"8 E Prospect St., New Hampton, IA 50659"}},"Clarke County, IA":{"recorder":{"name":"Clarke County Recorder","address":"100 S Main St., Osceola, IA 50213"},"assessor":{"name":"Clarke County Assessor","address":"100 S Main St., Osceola, IA 50213"}},"Clay County, IA":{"recorder":{"name":"Clay County Recorder","address":"215 W 4th St. Suite 6, Spencer, IA 51301"},"assessor":{"name":"Clay County Assessor","address":"215 W 4th St. Suite 6, Spencer, IA 51301"}},"Clayton County, IA":{"recorder":{"name":"Clayton County Recorder","address":"111 High St. NE, Elkader, IA 52043"},"assessor":{"name":"Clayton County Assessor","address":"111 High St. NE, Elkader, IA 52043"}},"Clinton County, IA":{"recorder":{"name":"Clinton County Recorder","address":"612 N 2nd St., Clinton, IA 52732"},"assessor":{"name":"Clinton County Assessor","address":"612 N 2nd St., Clinton, IA 52732"}},"Crawford County, IA":{"recorder":{"name":"Crawford County Recorder","address":"1202 Broadway, Denison, IA 51442"},"assessor":{"name":"Crawford County Assessor","address":"1202 Broadway, Denison, IA 51442"}},"Dallas County, IA":{"recorder":{"name":"Dallas County Recorder","address":"801 Court St., Adel, IA 50003"},"assessor":{"name":"Dallas County Assessor","address":"801 Court St., Adel, IA 50003"}},"Davis County, IA":{"recorder":{"name":"Davis County Recorder","address":"100 Courthouse Square, Bloomfield, IA 52537"},"assessor":{"name":"Davis County Assessor","address":"100 Courthouse Square, Bloomfield, IA 52537"}},"Decatur County, IA":{"recorder":{"name":"Decatur County Recorder","address":"207 N Main St., Leon, IA 50144"},"assessor":{"name":"Decatur County Assessor","address":"207 N Main St., Leon, IA 50144"}},"Delaware County, IA":{"recorder":{"name":"Delaware County Recorder","address":"301 E Main St., Manchester, IA 52057"},"assessor":{"name":"Delaware County Assessor","address":"301 E Main St., Manchester, IA 52057"}},"Des Moines County, IA":{"recorder":{"name":"Des Moines County Recorder","address":"513 N Main St., Burlington, IA 52601"},"assessor":{"name":"Des Moines County Assessor","address":"513 N Main St., Burlington, IA 52601"}},"Dickinson County, IA":{"recorder":{"name":"Dickinson County Recorder","address":"1802 Hill Ave. Suite 1400, Spirit Lake, IA 51360"},"assessor":{"name":"Dickinson County Assessor","address":"1802 Hill Ave. Suite 1400, Spirit Lake, IA 51360"}},"Dubuque County, IA":{"recorder":{"name":"Dubuque County Recorder","address":"720 Central Ave., Dubuque, IA 52001"},"assessor":{"name":"Dubuque County Assessor","address":"720 Central Ave., Dubuque, IA 52001"}},"Emmet County, IA":{"recorder":{"name":"Emmet County Recorder","address":"609 1st Ave N, Estherville, IA 51334"},"assessor":{"name":"Emmet County Assessor","address":"609 1st Ave N, Estherville, IA 51334"}},"Fayette County, IA":{"recorder":{"name":"Fayette County Recorder","address":"114 N Vine St., West Union, IA 52175"},"assessor":{"name":"Fayette County Assessor","address":"114 N Vine St., West Union, IA 52175"}},"Floyd County, IA":{"recorder":{"name":"Floyd County Recorder","address":"101 S Main St., Charles City, IA 50616"},"assessor":{"name":"Floyd County Assessor","address":"101 S Main St., Charles City, IA 50616"}},"Franklin County, IA":{"recorder":{"name":"Franklin County Recorder","address":"12 1st Ave NW, Hampton, IA 50441"},"assessor":{"name":"Franklin County Assessor","address":"12 1st Ave NW, Hampton, IA 50441"}},"Fremont County, IA":{"recorder":{"name":"Fremont County Recorder","address":"506 Filmore St., Sidney, IA 51652"},"assessor":{"name":"Fremont County Assessor","address":"506 Filmore St., Sidney, IA 51652"}},"Greene County, IA":{"recorder":{"name":"Greene County Recorder","address":"114 N Chestnut St., Jefferson, IA 50129"},"assessor":{"name":"Greene County Assessor","address":"114 N Chestnut St., Jefferson, IA 50129"}},"Grundy County, IA":{"recorder":{"name":"Grundy County Recorder","address":"706 G Ave., Grundy Center, IA 50638"},"assessor":{"name":"Grundy County Assessor","address":"706 G Ave., Grundy Center, IA 50638"}},"Guthrie County, IA":{"recorder":{"name":"Guthrie County Recorder","address":"200 N 5th St., Guthrie Center, IA 50115"},"assessor":{"name":"Guthrie County Assessor","address":"200 N 5th St., Guthrie Center, IA 50115"}},"Hamilton County, IA":{"recorder":{"name":"Hamilton County Recorder","address":"2300 Superior St., Webster City, IA 50595"},"assessor":{"name":"Hamilton County Assessor","address":"2300 Superior St., Webster City, IA 50595"}},"Hancock County, IA":{"recorder":{"name":"Hancock County Recorder","address":"855 State St., Garner, IA 50438"},"assessor":{"name":"Hancock County Assessor","address":"855 State St., Garner, IA 50438"}},"Hardin County, IA":{"recorder":{"name":"Hardin County Recorder","address":"1215 Edgington Ave., Eldora, IA 50627"},"assessor":{"name":"Hardin County Assessor","address":"1215 Edgington Ave., Eldora, IA 50627"}},"Harrison County, IA":{"recorder":{"name":"Harrison County Recorder","address":"111 N 2nd Ave., Logan, IA 51546"},"assessor":{"name":"Harrison County Assessor","address":"111 N 2nd Ave., Logan, IA 51546"}},"Henry County, IA":{"recorder":{"name":"Henry County Recorder","address":"100 E Washington St., Mount Pleasant, IA 52641"},"assessor":{"name":"Henry County Assessor","address":"100 E Washington St., Mount Pleasant, IA 52641"}},"Howard County, IA":{"recorder":{"name":"Howard County Recorder","address":"137 N Elm St., Cresco, IA 52136"},"assessor":{"name":"Howard County Assessor","address":"137 N Elm St., Cresco, IA 52136"}},"Humboldt County, IA":{"recorder":{"name":"Humboldt County Recorder","address":"203 Main St., Dakota City, IA 50529"},"assessor":{"name":"Humboldt County Assessor","address":"203 Main St., Dakota City, IA 50529"}},"Ida County, IA":{"recorder":{"name":"Ida County Recorder","address":"401 Moorehead St., Ida Grove, IA 51445"},"assessor":{"name":"Ida County Assessor","address":"401 Moorehead St., Ida Grove, IA 51445"}},"Iowa County, IA":{"recorder":{"name":"Iowa County Recorder","address":"901 Court Ave., Marengo, IA 52301"},"assessor":{"name":"Iowa County Assessor","address":"901 Court Ave., Marengo, IA 52301"}},"Jackson County, IA":{"recorder":{"name":"Jackson County Recorder","address":"201 W Platt St., Maquoketa, IA 52060"},"assessor":{"name":"Jackson County Assessor","address":"201 W Platt St., Maquoketa, IA 52060"}},"Jasper County, IA":{"recorder":{"name":"Jasper County Recorder","address":"101 1st St N, Newton, IA 50208"},"assessor":{"name":"Jasper County Assessor","address":"101 1st St N, Newton, IA 50208"}},"Jefferson County, IA":{"recorder":{"name":"Jefferson County Recorder","address":"51 W Briggs Ave., Fairfield, IA 52556"},"assessor":{"name":"Jefferson County Assessor","address":"51 W Briggs Ave., Fairfield, IA 52556"}},"Johnson County, IA":{"recorder":{"name":"Johnson County Recorder","address":"913 S Dubuque St., Iowa City, IA 52240"},"assessor":{"name":"Johnson County Assessor","address":"913 S Dubuque St., Iowa City, IA 52240"}},"Jones County, IA":{"recorder":{"name":"Jones County Recorder","address":"500 W Main St., Anamosa, IA 52205"},"assessor":{"name":"Jones County Assessor","address":"500 W Main St., Anamosa, IA 52205"}},"Keokuk County, IA":{"recorder":{"name":"Keokuk County Recorder","address":"101 S Main St., Sigourney, IA 52591"},"assessor":{"name":"Keokuk County Assessor","address":"101 S Main St., Sigourney, IA 52591"}},"Kossuth County, IA":{"recorder":{"name":"Kossuth County Recorder","address":"114 W State St., Algona, IA 50511"},"assessor":{"name":"Kossuth County Assessor","address":"114 W State St., Algona, IA 50511"}},"Lee County, IA":{"recorder":{"name":"Lee County Recorder","address":"25 N 7th St., Keokuk, IA 52632"},"assessor":{"name":"Lee County Assessor","address":"25 N 7th St., Keokuk, IA 52632"}},"Linn County, IA":{"recorder":{"name":"Linn County Recorder","address":"935 2nd St SW, Cedar Rapids, IA 52404"},"assessor":{"name":"Linn County Assessor","address":"935 2nd St SW, Cedar Rapids, IA 52404"}},"Louisa County, IA":{"recorder":{"name":"Louisa County Recorder","address":"117 S Main St., Wapello, IA 52653"},"assessor":{"name":"Louisa County Assessor","address":"117 S Main St., Wapello, IA 52653"}},"Lucas County, IA":{"recorder":{"name":"Lucas County Recorder","address":"916 Braden Ave., Chariton, IA 50049"},"assessor":{"name":"Lucas County Assessor","address":"916 Braden Ave., Chariton, IA 50049"}},"Lyon County, IA":{"recorder":{"name":"Lyon County Recorder","address":"206 S 2nd Ave., Rock Rapids, IA 51246"},"assessor":{"name":"Lyon County Assessor","address":"206 S 2nd Ave., Rock Rapids, IA 51246"}},"Madison County, IA":{"recorder":{"name":"Madison County Recorder","address":"112 N John Wayne Dr., Winterset, IA 50273"},"assessor":{"name":"Madison County Assessor","address":"112 N John Wayne Dr., Winterset, IA 50273"}},"Mahaska County, IA":{"recorder":{"name":"Mahaska County Recorder","address":"106 S 1st St., Oskaloosa, IA 52577"},"assessor":{"name":"Mahaska County Assessor","address":"106 S 1st St., Oskaloosa, IA 52577"}},"Marion County, IA":{"recorder":{"name":"Marion County Recorder","address":"214 E Main St., Knoxville, IA 50138"},"assessor":{"name":"Marion County Assessor","address":"214 E Main St., Knoxville, IA 50138"}},"Marshall County, IA":{"recorder":{"name":"Marshall County Recorder","address":"1 E Main St., Marshalltown, IA 50158"},"assessor":{"name":"Marshall County Assessor","address":"1 E Main St., Marshalltown, IA 50158"}},"Mills County, IA":{"recorder":{"name":"Mills County Recorder","address":"418 Sharp St., Glenwood, IA 51534"},"assessor":{"name":"Mills County Assessor","address":"418 Sharp St., Glenwood, IA 51534"}},"Mitchell County, IA":{"recorder":{"name":"Mitchell County Recorder","address":"508 State St., Osage, IA 50461"},"assessor":{"name":"Mitchell County Assessor","address":"508 State St., Osage, IA 50461"}},"Monona County, IA":{"recorder":{"name":"Monona County Recorder","address":"610 Iowa Ave., Onawa, IA 51040"},"assessor":{"name":"Monona County Assessor","address":"610 Iowa Ave., Onawa, IA 51040"}},"Monroe County, IA":{"recorder":{"name":"Monroe County Recorder","address":"10 Benton Ave E, Albia, IA 52531"},"assessor":{"name":"Monroe County Assessor","address":"10 Benton Ave E, Albia, IA 52531"}},"Montgomery County, IA":{"recorder":{"name":"Montgomery County Recorder","address":"105 E Coolbaugh St., Red Oak, IA 51566"},"assessor":{"name":"Montgomery County Assessor","address":"105 E Coolbaugh St., Red Oak, IA 51566"}},"Muscatine County, IA":{"recorder":{"name":"Muscatine County Recorder","address":"401 E 3rd St., Muscatine, IA 52761"},"assessor":{"name":"Muscatine County Assessor","address":"401 E 3rd St., Muscatine, IA 52761"}},"O'Brien County, IA":{"recorder":{"name":"O'Brien County Recorder","address":"155 S Hayes Ave., Primghar, IA 51245"},"assessor":{"name":"O'Brien County Assessor","address":"155 S Hayes Ave., Primghar, IA 51245"}},"Osceola County, IA":{"recorder":{"name":"Osceola County Recorder","address":"300 7th St., Sibley, IA 51249"},"assessor":{"name":"Osceola County Assessor","address":"300 7th St., Sibley, IA 51249"}},"Page County, IA":{"recorder":{"name":"Page County Recorder","address":"112 E Main St., Clarinda, IA 51632"},"assessor":{"name":"Page County Assessor","address":"112 E Main St., Clarinda, IA 51632"}},"Palo Alto County, IA":{"recorder":{"name":"Palo Alto County Recorder","address":"1010 Broadway St., Emmetsburg, IA 50536"},"assessor":{"name":"Palo Alto County Assessor","address":"1010 Broadway St., Emmetsburg, IA 50536"}},"Plymouth County, IA":{"recorder":{"name":"Plymouth County Recorder","address":"215 4th Ave SE, Le Mars, IA 51031"},"assessor":{"name":"Plymouth County Assessor","address":"215 4th Ave SE, Le Mars, IA 51031"}},"Pocahontas County, IA":{"recorder":{"name":"Pocahontas County Recorder","address":"99 Court Square, Pocahontas, IA 50574"},"assessor":{"name":"Pocahontas County Assessor","address":"99 Court Square, Pocahontas, IA 50574"}},"Polk County, IA":{"recorder":{"name":"Polk County Recorder","address":"111 Court Ave. Suite 240, Des Moines, IA 50309"},"assessor":{"name":"Polk County Assessor","address":"111 Court Ave. Suite 195, Des Moines, IA 50309"}},"Pottawattamie County, IA":{"recorder":{"name":"Pottawattamie County Recorder","address":"227 S 6th St., Council Bluffs, IA 51501"},"assessor":{"name":"Pottawattamie County Assessor","address":"227 S 6th St., Council Bluffs, IA 51501"}},"Poweshiek County, IA":{"recorder":{"name":"Poweshiek County Recorder","address":"302 E Main St., Montezuma, IA 50171"},"assessor":{"name":"Poweshiek County Assessor","address":"302 E Main St., Montezuma, IA 50171"}},"Ringgold County, IA":{"recorder":{"name":"Ringgold County Recorder","address":"109 W Madison St., Mount Ayr, IA 50854"},"assessor":{"name":"Ringgold County Assessor","address":"109 W Madison St., Mount Ayr, IA 50854"}},"Sac County, IA":{"recorder":{"name":"Sac County Recorder","address":"100 NW State St. Suite 9, Sac City, IA 50583"},"assessor":{"name":"Sac County Assessor","address":"100 NW State St. Suite 9, Sac City, IA 50583"}},"Scott County, IA":{"recorder":{"name":"Scott County Recorder","address":"600 W 4th St., Davenport, IA 52801"},"assessor":{"name":"Scott County Assessor","address":"600 W 4th St., Davenport, IA 52801"}},"Shelby County, IA":{"recorder":{"name":"Shelby County Recorder","address":"612 Court St., Harlan, IA 51537"},"assessor":{"name":"Shelby County Assessor","address":"612 Court St., Harlan, IA 51537"}},"Sioux County, IA":{"recorder":{"name":"Sioux County Recorder","address":"210 Central Ave SW, Orange City, IA 51041"},"assessor":{"name":"Sioux County Assessor","address":"210 Central Ave SW, Orange City, IA 51041"}},"Story County, IA":{"recorder":{"name":"Story County Recorder","address":"900 6th St., Nevada, IA 50201"},"assessor":{"name":"Story County Assessor","address":"900 6th St., Nevada, IA 50201"}},"Tama County, IA":{"recorder":{"name":"Tama County Recorder","address":"100 W High St., Toledo, IA 52342"},"assessor":{"name":"Tama County Assessor","address":"100 W High St., Toledo, IA 52342"}},"Taylor County, IA":{"recorder":{"name":"Taylor County Recorder","address":"405 Jefferson St., Bedford, IA 50833"},"assessor":{"name":"Taylor County Assessor","address":"405 Jefferson St., Bedford, IA 50833"}},"Union County, IA":{"recorder":{"name":"Union County Recorder","address":"300 N Pine St., Creston, IA 50801"},"assessor":{"name":"Union County Assessor","address":"300 N Pine St., Creston, IA 50801"}},"Van Buren County, IA":{"recorder":{"name":"Van Buren County Recorder","address":"4 Dodge St., Keosauqua, IA 52565"},"assessor":{"name":"Van Buren County Assessor","address":"4 Dodge St., Keosauqua, IA 52565"}},"Wapello County, IA":{"recorder":{"name":"Wapello County Recorder","address":"101 W 4th St., Ottumwa, IA 52501"},"assessor":{"name":"Wapello County Assessor","address":"101 W 4th St., Ottumwa, IA 52501"}},"Warren County, IA":{"recorder":{"name":"Warren County Recorder","address":"301 N Buxton St., Indianola, IA 50125"},"assessor":{"name":"Warren County Assessor","address":"301 N Buxton St., Indianola, IA 50125"}},"Washington County, IA":{"recorder":{"name":"Washington County Recorder","address":"222 W Main St., Washington, IA 52353"},"assessor":{"name":"Washington County Assessor","address":"222 W Main St., Washington, IA 52353"}},"Wayne County, IA":{"recorder":{"name":"Wayne County Recorder","address":"100 N Lafayette St., Corydon, IA 50060"},"assessor":{"name":"Wayne County Assessor","address":"100 N Lafayette St., Corydon, IA 50060"}},"Webster County, IA":{"recorder":{"name":"Webster County Recorder","address":"701 Central Ave., Fort Dodge, IA 50501"},"assessor":{"name":"Webster County Assessor","address":"701 Central Ave., Fort Dodge, IA 50501"}},"Winnebago County, IA":{"recorder":{"name":"Winnebago County Recorder","address":"126 S Clark St., Forest City, IA 50436"},"assessor":{"name":"Winnebago County Assessor","address":"126 S Clark St., Forest City, IA 50436"}},"Winneshiek County, IA":{"recorder":{"name":"Winneshiek County Recorder","address":"201 W Main St., Decorah, IA 52101"},"assessor":{"name":"Winneshiek County Assessor","address":"201 W Main St., Decorah, IA 52101"}},"Woodbury County, IA":{"recorder":{"name":"Woodbury County Recorder","address":"620 Douglas St. Suite 115, Sioux City, IA 51101"},"assessor":{"name":"Woodbury County Assessor","address":"620 Douglas St. Suite 115, Sioux City, IA 51101"}},"Worth County, IA":{"recorder":{"name":"Worth County Recorder","address":"1000 Central Ave., Northwood, IA 50459"},"assessor":{"name":"Worth County Assessor","address":"1000 Central Ave., Northwood, IA 50459"}},"Wright County, IA":{"recorder":{"name":"Wright County Recorder","address":"115 N Main Ave., Clarion, IA 50525"},"assessor":{"name":"Wright County Assessor","address":"115 N Main Ave., Clarion, IA 50525"}},"Ada County, ID":{"recorder":{"name":"Ada County Clerk","address":"200 W Front St., Boise, ID 83702"},"assessor":{"name":"Ada County Assessor","address":"190 E Front St. Suite 107, Boise, ID 83702"}},"Adams County, ID":{"recorder":{"name":"Adams County Clerk","address":"201 Industrial Ave., Council, ID 83612"},"assessor":{"name":"Adams County Assessor","address":"201 Industrial Ave., Council, ID 83612"}},"Bannock County, ID":{"recorder":{"name":"Bannock County Clerk","address":"624 E Center St., Pocatello, ID 83201"},"assessor":{"name":"Bannock County Assessor","address":"624 E Center St., Pocatello, ID 83201"}},"Bear Lake County, ID":{"recorder":{"name":"Bear Lake County Clerk","address":"7 E Center St., Paris, ID 83261"},"assessor":{"name":"Bear Lake County Assessor","address":"7 E Center St., Paris, ID 83261"}},"Benewah County, ID":{"recorder":{"name":"Benewah County Clerk","address":"701 W College Ave., St. Maries, ID 83861"},"assessor":{"name":"Benewah County Assessor","address":"701 W College Ave., St. Maries, ID 83861"}},"Bingham County, ID":{"recorder":{"name":"Bingham County Clerk","address":"501 N Maple St., Blackfoot, ID 83221"},"assessor":{"name":"Bingham County Assessor","address":"501 N Maple St., Blackfoot, ID 83221"}},"Blaine County, ID":{"recorder":{"name":"Blaine County Clerk","address":"206 1st Ave S., Hailey, ID 83333"},"assessor":{"name":"Blaine County Assessor","address":"206 1st Ave S., Hailey, ID 83333"}},"Boise County, ID":{"recorder":{"name":"Boise County Clerk","address":"419 Main St., Idaho City, ID 83631"},"assessor":{"name":"Boise County Assessor","address":"419 Main St., Idaho City, ID 83631"}},"Bonner County, ID":{"recorder":{"name":"Bonner County Clerk","address":"215 S 1st Ave., Sandpoint, ID 83864"},"assessor":{"name":"Bonner County Assessor","address":"215 S 1st Ave., Sandpoint, ID 83864"}},"Bonneville County, ID":{"recorder":{"name":"Bonneville County Clerk","address":"605 N Capital Ave., Idaho Falls, ID 83402"},"assessor":{"name":"Bonneville County Assessor","address":"605 N Capital Ave., Idaho Falls, ID 83402"}},"Boundary County, ID":{"recorder":{"name":"Boundary County Clerk","address":"6452 Kootenai St., Bonners Ferry, ID 83805"},"assessor":{"name":"Boundary County Assessor","address":"6452 Kootenai St., Bonners Ferry, ID 83805"}},"Butte County, ID":{"recorder":{"name":"Butte County Clerk","address":"248 W Grand Ave., Arco, ID 83213"},"assessor":{"name":"Butte County Assessor","address":"248 W Grand Ave., Arco, ID 83213"}},"Camas County, ID":{"recorder":{"name":"Camas County Clerk","address":"501 Soldier Rd., Fairfield, ID 83327"},"assessor":{"name":"Camas County Assessor","address":"501 Soldier Rd., Fairfield, ID 83327"}},"Canyon County, ID":{"recorder":{"name":"Canyon County Clerk","address":"1115 Albany St., Caldwell, ID 83605"},"assessor":{"name":"Canyon County Assessor","address":"111 N 11th Ave. Suite 240, Caldwell, ID 83605"}},"Caribou County, ID":{"recorder":{"name":"Caribou County Clerk","address":"159 S Main St., Soda Springs, ID 83276"},"assessor":{"name":"Caribou County Assessor","address":"159 S Main St., Soda Springs, ID 83276"}},"Cassia County, ID":{"recorder":{"name":"Cassia County Clerk","address":"1459 Overland Rd., Burley, ID 83318"},"assessor":{"name":"Cassia County Assessor","address":"1459 Overland Rd., Burley, ID 83318"}},"Clark County, ID":{"recorder":{"name":"Clark County Clerk","address":"224 W Main St., Dubois, ID 83423"},"assessor":{"name":"Clark County Assessor","address":"224 W Main St., Dubois, ID 83423"}},"Clearwater County, ID":{"recorder":{"name":"Clearwater County Clerk","address":"150 Michigan Ave., Orofino, ID 83544"},"assessor":{"name":"Clearwater County Assessor","address":"150 Michigan Ave., Orofino, ID 83544"}},"Custer County, ID":{"recorder":{"name":"Custer County Clerk","address":"801 E Main Ave., Challis, ID 83226"},"assessor":{"name":"Custer County Assessor","address":"801 E Main Ave., Challis, ID 83226"}},"Elmore County, ID":{"recorder":{"name":"Elmore County Clerk","address":"150 S 4th E Suite 5, Mountain Home, ID 83647"},"assessor":{"name":"Elmore County Assessor","address":"150 S 4th E Suite 5, Mountain Home, ID 83647"}},"Franklin County, ID":{"recorder":{"name":"Franklin County Clerk","address":"39 W Oneida St., Preston, ID 83263"},"assessor":{"name":"Franklin County Assessor","address":"39 W Oneida St., Preston, ID 83263"}},"Fremont County, ID":{"recorder":{"name":"Fremont County Clerk","address":"151 W 1st N, St. Anthony, ID 83445"},"assessor":{"name":"Fremont County Assessor","address":"151 W 1st N, St. Anthony, ID 83445"}},"Gem County, ID":{"recorder":{"name":"Gem County Clerk","address":"415 E Main St., Emmett, ID 83617"},"assessor":{"name":"Gem County Assessor","address":"415 E Main St., Emmett, ID 83617"}},"Gooding County, ID":{"recorder":{"name":"Gooding County Clerk","address":"624 Main St., Gooding, ID 83330"},"assessor":{"name":"Gooding County Assessor","address":"624 Main St., Gooding, ID 83330"}},"Idaho County, ID":{"recorder":{"name":"Idaho County Clerk","address":"320 W Main St. Suite 23, Grangeville, ID 83530"},"assessor":{"name":"Idaho County Assessor","address":"320 W Main St. Suite 23, Grangeville, ID 83530"}},"Jefferson County, ID":{"recorder":{"name":"Jefferson County Clerk","address":"210 Courthouse Way Suite 120, Rigby, ID 83442"},"assessor":{"name":"Jefferson County Assessor","address":"210 Courthouse Way Suite 120, Rigby, ID 83442"}},"Jerome County, ID":{"recorder":{"name":"Jerome County Clerk","address":"300 N Lincoln Ave., Jerome, ID 83338"},"assessor":{"name":"Jerome County Assessor","address":"300 N Lincoln Ave., Jerome, ID 83338"}},"Kootenai County, ID":{"recorder":{"name":"Kootenai County Clerk","address":"451 N Government Way, Coeur d'Alene, ID 83814"},"assessor":{"name":"Kootenai County Assessor","address":"451 N Government Way, Coeur d'Alene, ID 83814"}},"Latah County, ID":{"recorder":{"name":"Latah County Clerk","address":"522 S Adams St., Moscow, ID 83843"},"assessor":{"name":"Latah County Assessor","address":"522 S Adams St., Moscow, ID 83843"}},"Lemhi County, ID":{"recorder":{"name":"Lemhi County Clerk","address":"206 Courthouse Dr., Salmon, ID 83467"},"assessor":{"name":"Lemhi County Assessor","address":"206 Courthouse Dr., Salmon, ID 83467"}},"Lewis County, ID":{"recorder":{"name":"Lewis County Clerk","address":"510 Oak St., Nezperce, ID 83543"},"assessor":{"name":"Lewis County Assessor","address":"510 Oak St., Nezperce, ID 83543"}},"Lincoln County, ID":{"recorder":{"name":"Lincoln County Clerk","address":"111 W B St., Shoshone, ID 83352"},"assessor":{"name":"Lincoln County Assessor","address":"111 W B St., Shoshone, ID 83352"}},"Madison County, ID":{"recorder":{"name":"Madison County Clerk","address":"134 E Main St., Rexburg, ID 83440"},"assessor":{"name":"Madison County Assessor","address":"134 E Main St., Rexburg, ID 83440"}},"Minidoka County, ID":{"recorder":{"name":"Minidoka County Clerk","address":"715 G St., Rupert, ID 83350"},"assessor":{"name":"Minidoka County Assessor","address":"715 G St., Rupert, ID 83350"}},"Nez Perce County, ID":{"recorder":{"name":"Nez Perce County Clerk","address":"1230 Main St., Lewiston, ID 83501"},"assessor":{"name":"Nez Perce County Assessor","address":"1230 Main St., Lewiston, ID 83501"}},"Oneida County, ID":{"recorder":{"name":"Oneida County Clerk","address":"10 Courthouse Way, Malad City, ID 83252"},"assessor":{"name":"Oneida County Assessor","address":"10 Courthouse Way, Malad City, ID 83252"}},"Owyhee County, ID":{"recorder":{"name":"Owyhee County Clerk","address":"20381 State Hwy 78, Murphy, ID 83650"},"assessor":{"name":"Owyhee County Assessor","address":"20381 State Hwy 78, Murphy, ID 83650"}},"Payette County, ID":{"recorder":{"name":"Payette County Clerk","address":"1130 3rd Ave N, Payette, ID 83661"},"assessor":{"name":"Payette County Assessor","address":"1130 3rd Ave N, Payette, ID 83661"}},"Power County, ID":{"recorder":{"name":"Power County Clerk","address":"543 Bannock Ave., American Falls, ID 83211"},"assessor":{"name":"Power County Assessor","address":"543 Bannock Ave., American Falls, ID 83211"}},"Shoshone County, ID":{"recorder":{"name":"Shoshone County Clerk","address":"700 Bank St., Wallace, ID 83873"},"assessor":{"name":"Shoshone County Assessor","address":"700 Bank St., Wallace, ID 83873"}},"Teton County, ID":{"recorder":{"name":"Teton County Clerk","address":"150 Courthouse Dr., Driggs, ID 83422"},"assessor":{"name":"Teton County Assessor","address":"150 Courthouse Dr., Driggs, ID 83422"}},"Twin Falls County, ID":{"recorder":{"name":"Twin Falls County Clerk","address":"630 Addison Ave W, Twin Falls, ID 83301"},"assessor":{"name":"Twin Falls County Assessor","address":"630 Addison Ave W, Twin Falls, ID 83301"}},"Valley County, ID":{"recorder":{"name":"Valley County Clerk","address":"219 N Main St., Cascade, ID 83611"},"assessor":{"name":"Valley County Assessor","address":"219 N Main St., Cascade, ID 83611"}},"Washington County, ID":{"recorder":{"name":"Washington County Clerk","address":"256 E Court St., Weiser, ID 83672"},"assessor":{"name":"Washington County Assessor","address":"256 E Court St., Weiser, ID 83672"}},"Adams County, IL":{"recorder":{"name":"Adams County Recorder","address":"521 Vermont St., Quincy, IL 62301"},"assessor":{"name":"Adams County Assessor","address":"521 Vermont St., Quincy, IL 62301"}},"Alexander County, IL":{"recorder":{"name":"Alexander County Recorder","address":"2000 Washington Ave., Cairo, IL 62914"},"assessor":{"name":"Alexander County Assessor","address":"2000 Washington Ave., Cairo, IL 62914"}},"Bond County, IL":{"recorder":{"name":"Bond County Recorder","address":"200 W College Ave., Greenville, IL 62246"},"assessor":{"name":"Bond County Assessor","address":"200 W College Ave., Greenville, IL 62246"}},"Boone County, IL":{"recorder":{"name":"Boone County Recorder","address":"601 N Main St. Suite 302, Belvidere, IL 61008"},"assessor":{"name":"Boone County Assessor","address":"601 N Main St. Suite 302, Belvidere, IL 61008"}},"Brown County, IL":{"recorder":{"name":"Brown County Recorder","address":"200 Court St., Mount Sterling, IL 62353"},"assessor":{"name":"Brown County Assessor","address":"200 Court St., Mount Sterling, IL 62353"}},"Bureau County, IL":{"recorder":{"name":"Bureau County Recorder","address":"700 S Main St., Princeton, IL 61356"},"assessor":{"name":"Bureau County Assessor","address":"700 S Main St., Princeton, IL 61356"}},"Calhoun County, IL":{"recorder":{"name":"Calhoun County Recorder","address":"102 County Road, Hardin, IL 62047"},"assessor":{"name":"Calhoun County Assessor","address":"102 County Road, Hardin, IL 62047"}},"Carroll County, IL":{"recorder":{"name":"Carroll County Recorder","address":"301 N Main St., Mount Carroll, IL 61053"},"assessor":{"name":"Carroll County Assessor","address":"301 N Main St., Mount Carroll, IL 61053"}},"Cass County, IL":{"recorder":{"name":"Cass County Recorder","address":"100 E Springfield St., Virginia, IL 62691"},"assessor":{"name":"Cass County Assessor","address":"100 E Springfield St., Virginia, IL 62691"}},"Champaign County, IL":{"recorder":{"name":"Champaign County Recorder","address":"1776 E Washington St., Urbana, IL 61802"},"assessor":{"name":"Champaign County Assessor","address":"1776 E Washington St., Urbana, IL 61802"}},"Christian County, IL":{"recorder":{"name":"Christian County Recorder","address":"101 S Main St., Taylorville, IL 62568"},"assessor":{"name":"Christian County Assessor","address":"101 S Main St., Taylorville, IL 62568"}},"Clark County, IL":{"recorder":{"name":"Clark County Recorder","address":"501 Archer Ave., Marshall, IL 62441"},"assessor":{"name":"Clark County Assessor","address":"501 Archer Ave., Marshall, IL 62441"}},"Clay County, IL":{"recorder":{"name":"Clay County Recorder","address":"111 Chestnut St., Louisville, IL 62858"},"assessor":{"name":"Clay County Assessor","address":"111 Chestnut St., Louisville, IL 62858"}},"Clinton County, IL":{"recorder":{"name":"Clinton County Recorder","address":"850 Fairfax St., Carlyle, IL 62231"},"assessor":{"name":"Clinton County Assessor","address":"850 Fairfax St., Carlyle, IL 62231"}},"Coles County, IL":{"recorder":{"name":"Coles County Recorder","address":"651 Jackson Ave. Suite 133, Charleston, IL 61920"},"assessor":{"name":"Coles County Assessor","address":"651 Jackson Ave. Suite 133, Charleston, IL 61920"}},"Cook County, IL":{"recorder":{"name":"Cook County Recorder of Deeds","address":"118 N Clark St. Room 120, Chicago, IL 60602"},"assessor":{"name":"Cook County Assessor","address":"118 N Clark St. Room 320, Chicago, IL 60602"}},"Crawford County, IL":{"recorder":{"name":"Crawford County Recorder","address":"112 E Walnut St., Robinson, IL 62454"},"assessor":{"name":"Crawford County Assessor","address":"112 E Walnut St., Robinson, IL 62454"}},"Cumberland County, IL":{"recorder":{"name":"Cumberland County Recorder","address":"Toledo, IL 62468"},"assessor":{"name":"Cumberland County Assessor","address":"Toledo, IL 62468"}},"DeKalb County, IL":{"recorder":{"name":"DeKalb County Recorder","address":"110 E Sycamore St., Sycamore, IL 60178"},"assessor":{"name":"DeKalb County Assessor","address":"110 E Sycamore St., Sycamore, IL 60178"}},"DeWitt County, IL":{"recorder":{"name":"DeWitt County Recorder","address":"201 W Washington St., Clinton, IL 61727"},"assessor":{"name":"DeWitt County Assessor","address":"201 W Washington St., Clinton, IL 61727"}},"Douglas County, IL":{"recorder":{"name":"Douglas County Recorder","address":"401 S Center St., Tuscola, IL 61953"},"assessor":{"name":"Douglas County Assessor","address":"401 S Center St., Tuscola, IL 61953"}},"DuPage County, IL":{"recorder":{"name":"DuPage County Recorder","address":"421 N County Farm Rd., Wheaton, IL 60187"},"assessor":{"name":"DuPage County Assessor","address":"421 N County Farm Rd., Wheaton, IL 60187"}},"Edgar County, IL":{"recorder":{"name":"Edgar County Recorder","address":"115 W Court St., Paris, IL 61944"},"assessor":{"name":"Edgar County Assessor","address":"115 W Court St., Paris, IL 61944"}},"Edwards County, IL":{"recorder":{"name":"Edwards County Recorder","address":"50 E Main St., Albion, IL 62806"},"assessor":{"name":"Edwards County Assessor","address":"50 E Main St., Albion, IL 62806"}},"Effingham County, IL":{"recorder":{"name":"Effingham County Recorder","address":"101 N 4th St., Effingham, IL 62401"},"assessor":{"name":"Effingham County Assessor","address":"101 N 4th St., Effingham, IL 62401"}},"Fayette County, IL":{"recorder":{"name":"Fayette County Recorder","address":"221 S 7th St., Vandalia, IL 62471"},"assessor":{"name":"Fayette County Assessor","address":"221 S 7th St., Vandalia, IL 62471"}},"Ford County, IL":{"recorder":{"name":"Ford County Recorder","address":"200 W State St., Paxton, IL 60957"},"assessor":{"name":"Ford County Assessor","address":"200 W State St., Paxton, IL 60957"}},"Franklin County, IL":{"recorder":{"name":"Franklin County Recorder","address":"202 W Main St., Benton, IL 62812"},"assessor":{"name":"Franklin County Assessor","address":"202 W Main St., Benton, IL 62812"}},"Fulton County, IL":{"recorder":{"name":"Fulton County Recorder","address":"100 N Main St., Lewistown, IL 61542"},"assessor":{"name":"Fulton County Assessor","address":"100 N Main St., Lewistown, IL 61542"}},"Gallatin County, IL":{"recorder":{"name":"Gallatin County Recorder","address":"484 Lincoln Blvd., Shawneetown, IL 62984"},"assessor":{"name":"Gallatin County Assessor","address":"484 Lincoln Blvd., Shawneetown, IL 62984"}},"Greene County, IL":{"recorder":{"name":"Greene County Recorder","address":"519 N Main St., Carrollton, IL 62016"},"assessor":{"name":"Greene County Assessor","address":"519 N Main St., Carrollton, IL 62016"}},"Grundy County, IL":{"recorder":{"name":"Grundy County Recorder","address":"111 E Washington St., Morris, IL 60450"},"assessor":{"name":"Grundy County Assessor","address":"111 E Washington St., Morris, IL 60450"}},"Hamilton County, IL":{"recorder":{"name":"Hamilton County Recorder","address":"100 S Jackson St., McLeansboro, IL 62859"},"assessor":{"name":"Hamilton County Assessor","address":"100 S Jackson St., McLeansboro, IL 62859"}},"Hancock County, IL":{"recorder":{"name":"Hancock County Recorder","address":"500 Main St., Carthage, IL 62321"},"assessor":{"name":"Hancock County Assessor","address":"500 Main St., Carthage, IL 62321"}},"Hardin County, IL":{"recorder":{"name":"Hardin County Recorder","address":"Elizabethtown, IL 62931"},"assessor":{"name":"Hardin County Assessor","address":"Elizabethtown, IL 62931"}},"Henderson County, IL":{"recorder":{"name":"Henderson County Recorder","address":"Oquawka, IL 61469"},"assessor":{"name":"Henderson County Assessor","address":"Oquawka, IL 61469"}},"Henry County, IL":{"recorder":{"name":"Henry County Recorder","address":"307 W Center St., Cambridge, IL 61238"},"assessor":{"name":"Henry County Assessor","address":"307 W Center St., Cambridge, IL 61238"}},"Iroquois County, IL":{"recorder":{"name":"Iroquois County Recorder","address":"550 S 10th St., Watseka, IL 60970"},"assessor":{"name":"Iroquois County Assessor","address":"550 S 10th St., Watseka, IL 60970"}},"Jackson County, IL":{"recorder":{"name":"Jackson County Recorder","address":"1001 Walnut St., Murphysboro, IL 62966"},"assessor":{"name":"Jackson County Assessor","address":"1001 Walnut St., Murphysboro, IL 62966"}},"Jasper County, IL":{"recorder":{"name":"Jasper County Recorder","address":"100 W Jourdan St., Newton, IL 62448"},"assessor":{"name":"Jasper County Assessor","address":"100 W Jourdan St., Newton, IL 62448"}},"Jefferson County, IL":{"recorder":{"name":"Jefferson County Recorder","address":"100 S 10th St., Mount Vernon, IL 62864"},"assessor":{"name":"Jefferson County Assessor","address":"100 S 10th St., Mount Vernon, IL 62864"}},"Jersey County, IL":{"recorder":{"name":"Jersey County Recorder","address":"201 W Pearl St., Jerseyville, IL 62052"},"assessor":{"name":"Jersey County Assessor","address":"201 W Pearl St., Jerseyville, IL 62052"}},"Jo Daviess County, IL":{"recorder":{"name":"Jo Daviess County Recorder","address":"330 N Bench St., Galena, IL 61036"},"assessor":{"name":"Jo Daviess County Assessor","address":"330 N Bench St., Galena, IL 61036"}},"Johnson County, IL":{"recorder":{"name":"Johnson County Recorder","address":"511 Broadway, Vienna, IL 62995"},"assessor":{"name":"Johnson County Assessor","address":"511 Broadway, Vienna, IL 62995"}},"Kane County, IL":{"recorder":{"name":"Kane County Recorder","address":"719 S Batavia Ave. Bldg B, Geneva, IL 60134"},"assessor":{"name":"Kane County Assessor","address":"719 S Batavia Ave. Bldg B, Geneva, IL 60134"}},"Kankakee County, IL":{"recorder":{"name":"Kankakee County Recorder","address":"189 E Court St., Kankakee, IL 60901"},"assessor":{"name":"Kankakee County Assessor","address":"189 E Court St., Kankakee, IL 60901"}},"Kendall County, IL":{"recorder":{"name":"Kendall County Recorder","address":"111 W Fox St., Yorkville, IL 60560"},"assessor":{"name":"Kendall County Assessor","address":"111 W Fox St., Yorkville, IL 60560"}},"Knox County, IL":{"recorder":{"name":"Knox County Recorder","address":"200 S Cherry St., Galesburg, IL 61401"},"assessor":{"name":"Knox County Assessor","address":"200 S Cherry St., Galesburg, IL 61401"}},"Lake County, IL":{"recorder":{"name":"Lake County Recorder","address":"18 N County St., Waukegan, IL 60085"},"assessor":{"name":"Lake County Assessor","address":"18 N County St., Waukegan, IL 60085"}},"LaSalle County, IL":{"recorder":{"name":"LaSalle County Recorder","address":"707 E Etna Rd., Ottawa, IL 61350"},"assessor":{"name":"LaSalle County Assessor","address":"707 E Etna Rd., Ottawa, IL 61350"}},"Lawrence County, IL":{"recorder":{"name":"Lawrence County Recorder","address":"1100 State St., Lawrenceville, IL 62439"},"assessor":{"name":"Lawrence County Assessor","address":"1100 State St., Lawrenceville, IL 62439"}},"Lee County, IL":{"recorder":{"name":"Lee County Recorder","address":"112 E 2nd St., Dixon, IL 61021"},"assessor":{"name":"Lee County Assessor","address":"112 E 2nd St., Dixon, IL 61021"}},"Livingston County, IL":{"recorder":{"name":"Livingston County Recorder","address":"112 W Madison St., Pontiac, IL 61764"},"assessor":{"name":"Livingston County Assessor","address":"112 W Madison St., Pontiac, IL 61764"}},"Logan County, IL":{"recorder":{"name":"Logan County Recorder","address":"601 Broadway St., Lincoln, IL 62656"},"assessor":{"name":"Logan County Assessor","address":"601 Broadway St., Lincoln, IL 62656"}},"Macon County, IL":{"recorder":{"name":"Macon County Recorder","address":"141 S Main St., Decatur, IL 62523"},"assessor":{"name":"Macon County Assessor","address":"141 S Main St., Decatur, IL 62523"}},"Macoupin County, IL":{"recorder":{"name":"Macoupin County Recorder","address":"201 E Main St., Carlinville, IL 62626"},"assessor":{"name":"Macoupin County Assessor","address":"201 E Main St., Carlinville, IL 62626"}},"Madison County, IL":{"recorder":{"name":"Madison County Recorder","address":"157 N Main St. Suite 131, Edwardsville, IL 62025"},"assessor":{"name":"Madison County Assessor","address":"157 N Main St. Suite 131, Edwardsville, IL 62025"}},"Marion County, IL":{"recorder":{"name":"Marion County Recorder","address":"100 E Main St., Salem, IL 62881"},"assessor":{"name":"Marion County Assessor","address":"100 E Main St., Salem, IL 62881"}},"Marshall County, IL":{"recorder":{"name":"Marshall County Recorder","address":"122 N Prairie St., Lacon, IL 61540"},"assessor":{"name":"Marshall County Assessor","address":"122 N Prairie St., Lacon, IL 61540"}},"Mason County, IL":{"recorder":{"name":"Mason County Recorder","address":"125 N Plum St., Havana, IL 62644"},"assessor":{"name":"Mason County Assessor","address":"125 N Plum St., Havana, IL 62644"}},"Massac County, IL":{"recorder":{"name":"Massac County Recorder","address":"1 Superman Square, Metropolis, IL 62960"},"assessor":{"name":"Massac County Assessor","address":"1 Superman Square, Metropolis, IL 62960"}},"McDonough County, IL":{"recorder":{"name":"McDonough County Recorder","address":"1 Courthouse Square, Macomb, IL 61455"},"assessor":{"name":"McDonough County Assessor","address":"1 Courthouse Square, Macomb, IL 61455"}},"McHenry County, IL":{"recorder":{"name":"McHenry County Recorder","address":"667 Ware Rd., Woodstock, IL 60098"},"assessor":{"name":"McHenry County Assessor","address":"667 Ware Rd., Woodstock, IL 60098"}},"McLean County, IL":{"recorder":{"name":"McLean County Recorder","address":"115 E Washington St. Suite 102, Bloomington, IL 61701"},"assessor":{"name":"McLean County Assessor","address":"115 E Washington St. Suite 102, Bloomington, IL 61701"}},"Menard County, IL":{"recorder":{"name":"Menard County Recorder","address":"102 S Seventh St., Petersburg, IL 62675"},"assessor":{"name":"Menard County Assessor","address":"102 S Seventh St., Petersburg, IL 62675"}},"Mercer County, IL":{"recorder":{"name":"Mercer County Recorder","address":"100 SE 3rd St., Aledo, IL 61231"},"assessor":{"name":"Mercer County Assessor","address":"100 SE 3rd St., Aledo, IL 61231"}},"Monroe County, IL":{"recorder":{"name":"Monroe County Recorder","address":"100 S Main St., Waterloo, IL 62298"},"assessor":{"name":"Monroe County Assessor","address":"100 S Main St., Waterloo, IL 62298"}},"Montgomery County, IL":{"recorder":{"name":"Montgomery County Recorder","address":"120 N Main St., Hillsboro, IL 62049"},"assessor":{"name":"Montgomery County Assessor","address":"120 N Main St., Hillsboro, IL 62049"}},"Morgan County, IL":{"recorder":{"name":"Morgan County Recorder","address":"300 W State St., Jacksonville, IL 62650"},"assessor":{"name":"Morgan County Assessor","address":"300 W State St., Jacksonville, IL 62650"}},"Moultrie County, IL":{"recorder":{"name":"Moultrie County Recorder","address":"10 S Main St., Sullivan, IL 61951"},"assessor":{"name":"Moultrie County Assessor","address":"10 S Main St., Sullivan, IL 61951"}},"Ogle County, IL":{"recorder":{"name":"Ogle County Recorder","address":"105 S 5th St., Oregon, IL 61061"},"assessor":{"name":"Ogle County Assessor","address":"105 S 5th St., Oregon, IL 61061"}},"Peoria County, IL":{"recorder":{"name":"Peoria County Recorder","address":"324 Main St. Room G22, Peoria, IL 61602"},"assessor":{"name":"Peoria County Assessor","address":"324 Main St. Room G22, Peoria, IL 61602"}},"Perry County, IL":{"recorder":{"name":"Perry County Recorder","address":"1 Public Square, Pinckneyville, IL 62274"},"assessor":{"name":"Perry County Assessor","address":"1 Public Square, Pinckneyville, IL 62274"}},"Piatt County, IL":{"recorder":{"name":"Piatt County Recorder","address":"101 W Washington St., Monticello, IL 61856"},"assessor":{"name":"Piatt County Assessor","address":"101 W Washington St., Monticello, IL 61856"}},"Pike County, IL":{"recorder":{"name":"Pike County Recorder","address":"121 E Washington St., Pittsfield, IL 62363"},"assessor":{"name":"Pike County Assessor","address":"121 E Washington St., Pittsfield, IL 62363"}},"Pope County, IL":{"recorder":{"name":"Pope County Recorder","address":"Golconda, IL 62938"},"assessor":{"name":"Pope County Assessor","address":"Golconda, IL 62938"}},"Pulaski County, IL":{"recorder":{"name":"Pulaski County Recorder","address":"500 Illinois Ave., Mound City, IL 62963"},"assessor":{"name":"Pulaski County Assessor","address":"500 Illinois Ave., Mound City, IL 62963"}},"Putnam County, IL":{"recorder":{"name":"Putnam County Recorder","address":"120 N 4th St., Hennepin, IL 61327"},"assessor":{"name":"Putnam County Assessor","address":"120 N 4th St., Hennepin, IL 61327"}},"Randolph County, IL":{"recorder":{"name":"Randolph County Recorder","address":"1 Taylor St., Chester, IL 62233"},"assessor":{"name":"Randolph County Assessor","address":"1 Taylor St., Chester, IL 62233"}},"Richland County, IL":{"recorder":{"name":"Richland County Recorder","address":"103 W Main St., Olney, IL 62450"},"assessor":{"name":"Richland County Assessor","address":"103 W Main St., Olney, IL 62450"}},"Rock Island County, IL":{"recorder":{"name":"Rock Island County Recorder","address":"1504 3rd Ave., Rock Island, IL 61201"},"assessor":{"name":"Rock Island County Assessor","address":"1504 3rd Ave., Rock Island, IL 61201"}},"Saline County, IL":{"recorder":{"name":"Saline County Recorder","address":"10 E Poplar St., Harrisburg, IL 62946"},"assessor":{"name":"Saline County Assessor","address":"10 E Poplar St., Harrisburg, IL 62946"}},"Sangamon County, IL":{"recorder":{"name":"Sangamon County Recorder","address":"200 S 9th St. Room 101, Springfield, IL 62701"},"assessor":{"name":"Sangamon County Assessor","address":"200 S 9th St. Room 101, Springfield, IL 62701"}},"Schuyler County, IL":{"recorder":{"name":"Schuyler County Recorder","address":"102 S Congress St., Rushville, IL 62681"},"assessor":{"name":"Schuyler County Assessor","address":"102 S Congress St., Rushville, IL 62681"}},"Scott County, IL":{"recorder":{"name":"Scott County Recorder","address":"35 E Market St., Winchester, IL 62694"},"assessor":{"name":"Scott County Assessor","address":"35 E Market St., Winchester, IL 62694"}},"Shelby County, IL":{"recorder":{"name":"Shelby County Recorder","address":"301 E Main St., Shelbyville, IL 62565"},"assessor":{"name":"Shelby County Assessor","address":"301 E Main St., Shelbyville, IL 62565"}},"St. Clair County, IL":{"recorder":{"name":"St. Clair County Recorder","address":"10 Public Square, Belleville, IL 62220"},"assessor":{"name":"St. Clair County Assessor","address":"10 Public Square, Belleville, IL 62220"}},"Stark County, IL":{"recorder":{"name":"Stark County Recorder","address":"130 W Main St., Toulon, IL 61483"},"assessor":{"name":"Stark County Assessor","address":"130 W Main St., Toulon, IL 61483"}},"Stephenson County, IL":{"recorder":{"name":"Stephenson County Recorder","address":"15 N Galena Ave., Freeport, IL 61032"},"assessor":{"name":"Stephenson County Assessor","address":"15 N Galena Ave., Freeport, IL 61032"}},"Tazewell County, IL":{"recorder":{"name":"Tazewell County Recorder","address":"11 S 4th St., Pekin, IL 61554"},"assessor":{"name":"Tazewell County Assessor","address":"11 S 4th St., Pekin, IL 61554"}},"Union County, IL":{"recorder":{"name":"Union County Recorder","address":"309 W Market St., Jonesboro, IL 62952"},"assessor":{"name":"Union County Assessor","address":"309 W Market St., Jonesboro, IL 62952"}},"Vermilion County, IL":{"recorder":{"name":"Vermilion County Recorder","address":"6 N Vermilion St., Danville, IL 61832"},"assessor":{"name":"Vermilion County Assessor","address":"6 N Vermilion St., Danville, IL 61832"}},"Wabash County, IL":{"recorder":{"name":"Wabash County Recorder","address":"401 Market St., Mount Carmel, IL 62863"},"assessor":{"name":"Wabash County Assessor","address":"401 Market St., Mount Carmel, IL 62863"}},"Warren County, IL":{"recorder":{"name":"Warren County Recorder","address":"100 W Broadway, Monmouth, IL 61462"},"assessor":{"name":"Warren County Assessor","address":"100 W Broadway, Monmouth, IL 61462"}},"Washington County, IL":{"recorder":{"name":"Washington County Recorder","address":"101 E St. Louis St., Nashville, IL 62263"},"assessor":{"name":"Washington County Assessor","address":"101 E St. Louis St., Nashville, IL 62263"}},"Wayne County, IL":{"recorder":{"name":"Wayne County Recorder","address":"301 E Main St., Fairfield, IL 62837"},"assessor":{"name":"Wayne County Assessor","address":"301 E Main St., Fairfield, IL 62837"}},"White County, IL":{"recorder":{"name":"White County Recorder","address":"301 E Main St., Carmi, IL 62821"},"assessor":{"name":"White County Assessor","address":"301 E Main St., Carmi, IL 62821"}},"Whiteside County, IL":{"recorder":{"name":"Whiteside County Recorder","address":"200 E Knox St., Morrison, IL 61270"},"assessor":{"name":"Whiteside County Assessor","address":"200 E Knox St., Morrison, IL 61270"}},"Will County, IL":{"recorder":{"name":"Will County Recorder","address":"302 N Chicago St., Joliet, IL 60432"},"assessor":{"name":"Will County Assessor","address":"302 N Chicago St., Joliet, IL 60432"}},"Williamson County, IL":{"recorder":{"name":"Williamson County Recorder","address":"200 W Jefferson St., Marion, IL 62959"},"assessor":{"name":"Williamson County Assessor","address":"200 W Jefferson St., Marion, IL 62959"}},"Winnebago County, IL":{"recorder":{"name":"Winnebago County Recorder","address":"404 Elm St. Room 111, Rockford, IL 61101"},"assessor":{"name":"Winnebago County Assessor","address":"404 Elm St. Room 111, Rockford, IL 61101"}},"Woodford County, IL":{"recorder":{"name":"Woodford County Recorder","address":"115 N Main St., Eureka, IL 61530"},"assessor":{"name":"Woodford County Assessor","address":"115 N Main St., Eureka, IL 61530"}},"Adams County, IN":{"recorder":{"name":"Adams County Recorder","address":"112 S 2nd St., Decatur, IN 46733"},"assessor":{"name":"Adams County Assessor","address":"112 S 2nd St., Decatur, IN 46733"}},"Allen County, IN":{"recorder":{"name":"Allen County Recorder","address":"1 E Main St. Suite 102, Fort Wayne, IN 46802"},"assessor":{"name":"Allen County Assessor","address":"1 E Main St. Suite 415, Fort Wayne, IN 46802"}},"Bartholomew County, IN":{"recorder":{"name":"Bartholomew County Recorder","address":"440 3rd St., Columbus, IN 47201"},"assessor":{"name":"Bartholomew County Assessor","address":"440 3rd St., Columbus, IN 47201"}},"Benton County, IN":{"recorder":{"name":"Benton County Recorder","address":"706 E 5th St. Suite 12, Fowler, IN 47944"},"assessor":{"name":"Benton County Assessor","address":"706 E 5th St. Suite 12, Fowler, IN 47944"}},"Blackford County, IN":{"recorder":{"name":"Blackford County Recorder","address":"110 W Washington St., Hartford City, IN 47348"},"assessor":{"name":"Blackford County Assessor","address":"110 W Washington St., Hartford City, IN 47348"}},"Boone County, IN":{"recorder":{"name":"Boone County Recorder","address":"1 Courthouse Square Suite 140, Lebanon, IN 46052"},"assessor":{"name":"Boone County Assessor","address":"1 Courthouse Square Suite 105, Lebanon, IN 46052"}},"Brown County, IN":{"recorder":{"name":"Brown County Recorder","address":"201 Locust Ln., Nashville, IN 47448"},"assessor":{"name":"Brown County Assessor","address":"201 Locust Ln., Nashville, IN 47448"}},"Carroll County, IN":{"recorder":{"name":"Carroll County Recorder","address":"101 W Main St., Delphi, IN 46923"},"assessor":{"name":"Carroll County Assessor","address":"101 W Main St., Delphi, IN 46923"}},"Cass County, IN":{"recorder":{"name":"Cass County Recorder","address":"200 Court Park, Logansport, IN 46947"},"assessor":{"name":"Cass County Assessor","address":"200 Court Park, Logansport, IN 46947"}},"Clark County, IN":{"recorder":{"name":"Clark County Recorder","address":"501 E Court Ave. Room 130, Jeffersonville, IN 47130"},"assessor":{"name":"Clark County Assessor","address":"501 E Court Ave. Room 130, Jeffersonville, IN 47130"}},"Clay County, IN":{"recorder":{"name":"Clay County Recorder","address":"609 E National Ave., Brazil, IN 47834"},"assessor":{"name":"Clay County Assessor","address":"609 E National Ave., Brazil, IN 47834"}},"Clinton County, IN":{"recorder":{"name":"Clinton County Recorder","address":"265 Courthouse Square, Frankfort, IN 46041"},"assessor":{"name":"Clinton County Assessor","address":"265 Courthouse Square, Frankfort, IN 46041"}},"Crawford County, IN":{"recorder":{"name":"Crawford County Recorder","address":"715 Judicial Center Dr., English, IN 47118"},"assessor":{"name":"Crawford County Assessor","address":"715 Judicial Center Dr., English, IN 47118"}},"Daviess County, IN":{"recorder":{"name":"Daviess County Recorder","address":"200 E Walnut St., Washington, IN 47501"},"assessor":{"name":"Daviess County Assessor","address":"200 E Walnut St., Washington, IN 47501"}},"Dearborn County, IN":{"recorder":{"name":"Dearborn County Recorder","address":"165 Mary St., Lawrenceburg, IN 47025"},"assessor":{"name":"Dearborn County Assessor","address":"165 Mary St., Lawrenceburg, IN 47025"}},"Decatur County, IN":{"recorder":{"name":"Decatur County Recorder","address":"150 Courthouse Square Suite 4, Greensburg, IN 47240"},"assessor":{"name":"Decatur County Assessor","address":"150 Courthouse Square Suite 4, Greensburg, IN 47240"}},"DeKalb County, IN":{"recorder":{"name":"DeKalb County Recorder","address":"100 S Main St., Auburn, IN 46706"},"assessor":{"name":"DeKalb County Assessor","address":"100 S Main St., Auburn, IN 46706"}},"Delaware County, IN":{"recorder":{"name":"Delaware County Recorder","address":"100 W Main St. Room 102, Muncie, IN 47305"},"assessor":{"name":"Delaware County Assessor","address":"100 W Main St. Room 102, Muncie, IN 47305"}},"Dubois County, IN":{"recorder":{"name":"Dubois County Recorder","address":"1 Courthouse Square Suite 202, Jasper, IN 47546"},"assessor":{"name":"Dubois County Assessor","address":"1 Courthouse Square Suite 202, Jasper, IN 47546"}},"Elkhart County, IN":{"recorder":{"name":"Elkhart County Recorder","address":"117 N 2nd St. Room 201, Goshen, IN 46526"},"assessor":{"name":"Elkhart County Assessor","address":"117 N 2nd St. Room 201, Goshen, IN 46526"}},"Fayette County, IN":{"recorder":{"name":"Fayette County Recorder","address":"401 N Central Ave., Connersville, IN 47331"},"assessor":{"name":"Fayette County Assessor","address":"401 N Central Ave., Connersville, IN 47331"}},"Floyd County, IN":{"recorder":{"name":"Floyd County Recorder","address":"311 Hauss Square Room 104, New Albany, IN 47150"},"assessor":{"name":"Floyd County Assessor","address":"311 Hauss Square Room 104, New Albany, IN 47150"}},"Fountain County, IN":{"recorder":{"name":"Fountain County Recorder","address":"301 4th St., Covington, IN 47932"},"assessor":{"name":"Fountain County Assessor","address":"301 4th St., Covington, IN 47932"}},"Franklin County, IN":{"recorder":{"name":"Franklin County Recorder","address":"459 Main St., Brookville, IN 47012"},"assessor":{"name":"Franklin County Assessor","address":"459 Main St., Brookville, IN 47012"}},"Fulton County, IN":{"recorder":{"name":"Fulton County Recorder","address":"815 Main St., Rochester, IN 46975"},"assessor":{"name":"Fulton County Assessor","address":"815 Main St., Rochester, IN 46975"}},"Gibson County, IN":{"recorder":{"name":"Gibson County Recorder","address":"101 N Main St., Princeton, IN 47670"},"assessor":{"name":"Gibson County Assessor","address":"101 N Main St., Princeton, IN 47670"}},"Grant County, IN":{"recorder":{"name":"Grant County Recorder","address":"401 S Adams St. Room 415, Marion, IN 46953"},"assessor":{"name":"Grant County Assessor","address":"401 S Adams St. Room 415, Marion, IN 46953"}},"Greene County, IN":{"recorder":{"name":"Greene County Recorder","address":"204 N Main St., Bloomfield, IN 47424"},"assessor":{"name":"Greene County Assessor","address":"204 N Main St., Bloomfield, IN 47424"}},"Hamilton County, IN":{"recorder":{"name":"Hamilton County Recorder","address":"1 Hamilton County Square Suite 106, Noblesville, IN 46060"},"assessor":{"name":"Hamilton County Assessor","address":"1 Hamilton County Square Suite 106, Noblesville, IN 46060"}},"Hancock County, IN":{"recorder":{"name":"Hancock County Recorder","address":"9 E Main St. Suite 201, Greenfield, IN 46140"},"assessor":{"name":"Hancock County Assessor","address":"9 E Main St. Suite 201, Greenfield, IN 46140"}},"Harrison County, IN":{"recorder":{"name":"Harrison County Recorder","address":"300 N Capitol Ave. Suite 8, Corydon, IN 47112"},"assessor":{"name":"Harrison County Assessor","address":"300 N Capitol Ave. Suite 8, Corydon, IN 47112"}},"Hendricks County, IN":{"recorder":{"name":"Hendricks County Recorder","address":"355 S Washington St. Room 215, Danville, IN 46122"},"assessor":{"name":"Hendricks County Assessor","address":"355 S Washington St. Room 215, Danville, IN 46122"}},"Henry County, IN":{"recorder":{"name":"Henry County Recorder","address":"101 S Main St. Suite 209, New Castle, IN 47362"},"assessor":{"name":"Henry County Assessor","address":"101 S Main St. Suite 209, New Castle, IN 47362"}},"Howard County, IN":{"recorder":{"name":"Howard County Recorder","address":"220 N Main St. Room 226, Kokomo, IN 46901"},"assessor":{"name":"Howard County Assessor","address":"220 N Main St. Room 226, Kokomo, IN 46901"}},"Huntington County, IN":{"recorder":{"name":"Huntington County Recorder","address":"201 N Jefferson St. Suite 101, Huntington, IN 46750"},"assessor":{"name":"Huntington County Assessor","address":"201 N Jefferson St. Suite 101, Huntington, IN 46750"}},"Jackson County, IN":{"recorder":{"name":"Jackson County Recorder","address":"111 S Main St. Suite 110, Brownstown, IN 47220"},"assessor":{"name":"Jackson County Assessor","address":"111 S Main St. Suite 110, Brownstown, IN 47220"}},"Jasper County, IN":{"recorder":{"name":"Jasper County Recorder","address":"115 W Washington St. Suite B, Rensselaer, IN 47978"},"assessor":{"name":"Jasper County Assessor","address":"115 W Washington St. Suite B, Rensselaer, IN 47978"}},"Jay County, IN":{"recorder":{"name":"Jay County Recorder","address":"120 N Court St., Portland, IN 47371"},"assessor":{"name":"Jay County Assessor","address":"120 N Court St., Portland, IN 47371"}},"Jefferson County, IN":{"recorder":{"name":"Jefferson County Recorder","address":"300 E Main St. Suite 103, Madison, IN 47250"},"assessor":{"name":"Jefferson County Assessor","address":"300 E Main St. Suite 103, Madison, IN 47250"}},"Jennings County, IN":{"recorder":{"name":"Jennings County Recorder","address":"5 E Main St., Vernon, IN 47282"},"assessor":{"name":"Jennings County Assessor","address":"5 E Main St., Vernon, IN 47282"}},"Johnson County, IN":{"recorder":{"name":"Johnson County Recorder","address":"86 W Court St., Franklin, IN 46131"},"assessor":{"name":"Johnson County Assessor","address":"86 W Court St., Franklin, IN 46131"}},"Knox County, IN":{"recorder":{"name":"Knox County Recorder","address":"111 N 7th St., Vincennes, IN 47591"},"assessor":{"name":"Knox County Assessor","address":"111 N 7th St., Vincennes, IN 47591"}},"Kosciusko County, IN":{"recorder":{"name":"Kosciusko County Recorder","address":"100 W Center St. Room 210, Warsaw, IN 46580"},"assessor":{"name":"Kosciusko County Assessor","address":"100 W Center St. Room 210, Warsaw, IN 46580"}},"LaGrange County, IN":{"recorder":{"name":"LaGrange County Recorder","address":"105 N Detroit St., LaGrange, IN 46761"},"assessor":{"name":"LaGrange County Assessor","address":"105 N Detroit St., LaGrange, IN 46761"}},"Lake County, IN":{"recorder":{"name":"Lake County Recorder","address":"2293 N Main St., Crown Point, IN 46307"},"assessor":{"name":"Lake County Assessor","address":"2293 N Main St., Crown Point, IN 46307"}},"LaPorte County, IN":{"recorder":{"name":"LaPorte County Recorder","address":"813 Lincoln Way Suite 206, LaPorte, IN 46350"},"assessor":{"name":"LaPorte County Assessor","address":"813 Lincoln Way Suite 206, LaPorte, IN 46350"}},"Lawrence County, IN":{"recorder":{"name":"Lawrence County Recorder","address":"916 15th St. Room 12, Bedford, IN 47421"},"assessor":{"name":"Lawrence County Assessor","address":"916 15th St. Room 12, Bedford, IN 47421"}},"Madison County, IN":{"recorder":{"name":"Madison County Recorder","address":"16 E 9th St. Suite 106, Anderson, IN 46016"},"assessor":{"name":"Madison County Assessor","address":"16 E 9th St. Suite 106, Anderson, IN 46016"}},"Marion County, IN":{"recorder":{"name":"Marion County Recorder","address":"200 E Washington St. Suite W122, Indianapolis, IN 46204"},"assessor":{"name":"Marion County Assessor","address":"200 E Washington St. Suite 1360, Indianapolis, IN 46204"}},"Marshall County, IN":{"recorder":{"name":"Marshall County Recorder","address":"112 W Jefferson St. Room 202, Plymouth, IN 46563"},"assessor":{"name":"Marshall County Assessor","address":"112 W Jefferson St. Room 202, Plymouth, IN 46563"}},"Martin County, IN":{"recorder":{"name":"Martin County Recorder","address":"129 Main St., Shoals, IN 47581"},"assessor":{"name":"Martin County Assessor","address":"129 Main St., Shoals, IN 47581"}},"Miami County, IN":{"recorder":{"name":"Miami County Recorder","address":"25 N Broadway St., Peru, IN 46970"},"assessor":{"name":"Miami County Assessor","address":"25 N Broadway St., Peru, IN 46970"}},"Monroe County, IN":{"recorder":{"name":"Monroe County Recorder","address":"100 W Kirkwood Ave. Suite 215, Bloomington, IN 47404"},"assessor":{"name":"Monroe County Assessor","address":"100 W Kirkwood Ave. Suite 215, Bloomington, IN 47404"}},"Montgomery County, IN":{"recorder":{"name":"Montgomery County Recorder","address":"100 E Main St., Crawfordsville, IN 47933"},"assessor":{"name":"Montgomery County Assessor","address":"100 E Main St., Crawfordsville, IN 47933"}},"Morgan County, IN":{"recorder":{"name":"Morgan County Recorder","address":"180 S Main St. Suite 211, Martinsville, IN 46151"},"assessor":{"name":"Morgan County Assessor","address":"180 S Main St. Suite 211, Martinsville, IN 46151"}},"Newton County, IN":{"recorder":{"name":"Newton County Recorder","address":"201 N 3rd St., Kentland, IN 47951"},"assessor":{"name":"Newton County Assessor","address":"201 N 3rd St., Kentland, IN 47951"}},"Noble County, IN":{"recorder":{"name":"Noble County Recorder","address":"101 N Orange St., Albion, IN 46701"},"assessor":{"name":"Noble County Assessor","address":"101 N Orange St., Albion, IN 46701"}},"Ohio County, IN":{"recorder":{"name":"Ohio County Recorder","address":"413 Main St., Rising Sun, IN 47040"},"assessor":{"name":"Ohio County Assessor","address":"413 Main St., Rising Sun, IN 47040"}},"Orange County, IN":{"recorder":{"name":"Orange County Recorder","address":"205 E Main St. Suite 7, Paoli, IN 47454"},"assessor":{"name":"Orange County Assessor","address":"205 E Main St. Suite 7, Paoli, IN 47454"}},"Owen County, IN":{"recorder":{"name":"Owen County Recorder","address":"60 S Main St. Suite 103, Spencer, IN 47460"},"assessor":{"name":"Owen County Assessor","address":"60 S Main St. Suite 103, Spencer, IN 47460"}},"Parke County, IN":{"recorder":{"name":"Parke County Recorder","address":"116 W High St. Suite 204, Rockville, IN 47872"},"assessor":{"name":"Parke County Assessor","address":"116 W High St. Suite 204, Rockville, IN 47872"}},"Perry County, IN":{"recorder":{"name":"Perry County Recorder","address":"2219 Payne St., Tell City, IN 47586"},"assessor":{"name":"Perry County Assessor","address":"2219 Payne St., Tell City, IN 47586"}},"Pike County, IN":{"recorder":{"name":"Pike County Recorder","address":"801 E Poplar St., Petersburg, IN 47567"},"assessor":{"name":"Pike County Assessor","address":"801 E Poplar St., Petersburg, IN 47567"}},"Porter County, IN":{"recorder":{"name":"Porter County Recorder","address":"155 Indiana Ave. Suite 203, Valparaiso, IN 46383"},"assessor":{"name":"Porter County Assessor","address":"155 Indiana Ave. Suite 203, Valparaiso, IN 46383"}},"Posey County, IN":{"recorder":{"name":"Posey County Recorder","address":"300 Main St. Suite 206, Mount Vernon, IN 47620"},"assessor":{"name":"Posey County Assessor","address":"300 Main St. Suite 206, Mount Vernon, IN 47620"}},"Pulaski County, IN":{"recorder":{"name":"Pulaski County Recorder","address":"112 E Main St. Suite 232, Winamac, IN 46996"},"assessor":{"name":"Pulaski County Assessor","address":"112 E Main St. Suite 232, Winamac, IN 46996"}},"Putnam County, IN":{"recorder":{"name":"Putnam County Recorder","address":"1 Courthouse Square Suite 340, Greencastle, IN 46135"},"assessor":{"name":"Putnam County Assessor","address":"1 Courthouse Square Suite 340, Greencastle, IN 46135"}},"Randolph County, IN":{"recorder":{"name":"Randolph County Recorder","address":"100 S Main St. Suite 102, Winchester, IN 47394"},"assessor":{"name":"Randolph County Assessor","address":"100 S Main St. Suite 102, Winchester, IN 47394"}},"Ripley County, IN":{"recorder":{"name":"Ripley County Recorder","address":"115 N Main St., Versailles, IN 47042"},"assessor":{"name":"Ripley County Assessor","address":"115 N Main St., Versailles, IN 47042"}},"Rush County, IN":{"recorder":{"name":"Rush County Recorder","address":"101 E 2nd St., Rushville, IN 46173"},"assessor":{"name":"Rush County Assessor","address":"101 E 2nd St., Rushville, IN 46173"}},"St. Joseph County, IN":{"recorder":{"name":"St. Joseph County Recorder","address":"101 S Main St. Suite 104, South Bend, IN 46601"},"assessor":{"name":"St. Joseph County Assessor","address":"101 S Main St. Suite 104, South Bend, IN 46601"}},"Scott County, IN":{"recorder":{"name":"Scott County Recorder","address":"1 E McClain Ave. Suite 140, Scottsburg, IN 47170"},"assessor":{"name":"Scott County Assessor","address":"1 E McClain Ave. Suite 140, Scottsburg, IN 47170"}},"Shelby County, IN":{"recorder":{"name":"Shelby County Recorder","address":"407 S Harrison St. Suite 102, Shelbyville, IN 46176"},"assessor":{"name":"Shelby County Assessor","address":"407 S Harrison St. Suite 102, Shelbyville, IN 46176"}},"Spencer County, IN":{"recorder":{"name":"Spencer County Recorder","address":"200 Main St. Suite 8, Rockport, IN 47635"},"assessor":{"name":"Spencer County Assessor","address":"200 Main St. Suite 8, Rockport, IN 47635"}},"Starke County, IN":{"recorder":{"name":"Starke County Recorder","address":"53 E Mound St., Knox, IN 46534"},"assessor":{"name":"Starke County Assessor","address":"53 E Mound St., Knox, IN 46534"}},"Steuben County, IN":{"recorder":{"name":"Steuben County Recorder","address":"317 S Wayne St. Suite 2K, Angola, IN 46703"},"assessor":{"name":"Steuben County Assessor","address":"317 S Wayne St. Suite 2K, Angola, IN 46703"}},"Sullivan County, IN":{"recorder":{"name":"Sullivan County Recorder","address":"100 Courthouse Square Suite 302, Sullivan, IN 47882"},"assessor":{"name":"Sullivan County Assessor","address":"100 Courthouse Square Suite 302, Sullivan, IN 47882"}},"Switzerland County, IN":{"recorder":{"name":"Switzerland County Recorder","address":"212 W Main St., Vevay, IN 47043"},"assessor":{"name":"Switzerland County Assessor","address":"212 W Main St., Vevay, IN 47043"}},"Tippecanoe County, IN":{"recorder":{"name":"Tippecanoe County Recorder","address":"20 N 3rd St., Lafayette, IN 47901"},"assessor":{"name":"Tippecanoe County Assessor","address":"20 N 3rd St., Lafayette, IN 47901"}},"Tipton County, IN":{"recorder":{"name":"Tipton County Recorder","address":"101 E Jefferson St., Tipton, IN 46072"},"assessor":{"name":"Tipton County Assessor","address":"101 E Jefferson St., Tipton, IN 46072"}},"Union County, IN":{"recorder":{"name":"Union County Recorder","address":"26 W Union St., Liberty, IN 47353"},"assessor":{"name":"Union County Assessor","address":"26 W Union St., Liberty, IN 47353"}},"Vanderburgh County, IN":{"recorder":{"name":"Vanderburgh County Recorder","address":"1 NW Martin Luther King Jr Blvd Suite 216, Evansville, IN 47708"},"assessor":{"name":"Vanderburgh County Assessor","address":"1 NW Martin Luther King Jr Blvd Suite 216, Evansville, IN 47708"}},"Vermillion County, IN":{"recorder":{"name":"Vermillion County Recorder","address":"255 S Main St., Newport, IN 47966"},"assessor":{"name":"Vermillion County Assessor","address":"255 S Main St., Newport, IN 47966"}},"Vigo County, IN":{"recorder":{"name":"Vigo County Recorder","address":"33 S 3rd St. Suite 407, Terre Haute, IN 47807"},"assessor":{"name":"Vigo County Assessor","address":"33 S 3rd St. Suite 407, Terre Haute, IN 47807"}},"Wabash County, IN":{"recorder":{"name":"Wabash County Recorder","address":"1 W Hill St. Suite 104, Wabash, IN 46992"},"assessor":{"name":"Wabash County Assessor","address":"1 W Hill St. Suite 104, Wabash, IN 46992"}},"Warren County, IN":{"recorder":{"name":"Warren County Recorder","address":"125 N Monroe St. Suite 22, Williamsport, IN 47993"},"assessor":{"name":"Warren County Assessor","address":"125 N Monroe St. Suite 22, Williamsport, IN 47993"}},"Warrick County, IN":{"recorder":{"name":"Warrick County Recorder","address":"1 County Square Suite 240, Boonville, IN 47601"},"assessor":{"name":"Warrick County Assessor","address":"1 County Square Suite 240, Boonville, IN 47601"}},"Washington County, IN":{"recorder":{"name":"Washington County Recorder","address":"99 Public Square Suite 202, Salem, IN 47167"},"assessor":{"name":"Washington County Assessor","address":"99 Public Square Suite 202, Salem, IN 47167"}},"Wayne County, IN":{"recorder":{"name":"Wayne County Recorder","address":"401 E Main St. Suite 105, Richmond, IN 47374"},"assessor":{"name":"Wayne County Assessor","address":"401 E Main St. Suite 105, Richmond, IN 47374"}},"Wells County, IN":{"recorder":{"name":"Wells County Recorder","address":"102 W Market St. Suite 204, Bluffton, IN 46714"},"assessor":{"name":"Wells County Assessor","address":"102 W Market St. Suite 204, Bluffton, IN 46714"}},"White County, IN":{"recorder":{"name":"White County Recorder","address":"110 N Main St. Suite 24, Monticello, IN 47960"},"assessor":{"name":"White County Assessor","address":"110 N Main St. Suite 24, Monticello, IN 47960"}},"Whitley County, IN":{"recorder":{"name":"Whitley County Recorder","address":"220 N Line St. Suite 201, Columbia City, IN 46725"},"assessor":{"name":"Whitley County Assessor","address":"220 N Line St. Suite 201, Columbia City, IN 46725"}},"Allen County, KS":{"recorder":{"name":"Allen County Register of Deeds","address":"1 N Washington Ave., Iola, KS 66749"},"assessor":{"name":"Allen County Appraiser","address":"1 N Washington Ave., Iola, KS 66749"}},"Anderson County, KS":{"recorder":{"name":"Anderson County Register of Deeds","address":"100 E 4th Ave., Garnett, KS 66032"},"assessor":{"name":"Anderson County Appraiser","address":"100 E 4th Ave., Garnett, KS 66032"}},"Atchison County, KS":{"recorder":{"name":"Atchison County Register of Deeds","address":"423 N 5th St., Atchison, KS 66002"},"assessor":{"name":"Atchison County Appraiser","address":"423 N 5th St., Atchison, KS 66002"}},"Barber County, KS":{"recorder":{"name":"Barber County Register of Deeds","address":"120 E Washington St., Medicine Lodge, KS 67104"},"assessor":{"name":"Barber County Appraiser","address":"120 E Washington St., Medicine Lodge, KS 67104"}},"Barton County, KS":{"recorder":{"name":"Barton County Register of Deeds","address":"1400 Main St. Suite 206, Great Bend, KS 67530"},"assessor":{"name":"Barton County Appraiser","address":"1400 Main St. Suite 205, Great Bend, KS 67530"}},"Bourbon County, KS":{"recorder":{"name":"Bourbon County Register of Deeds","address":"210 S National Ave., Fort Scott, KS 66701"},"assessor":{"name":"Bourbon County Appraiser","address":"210 S National Ave., Fort Scott, KS 66701"}},"Brown County, KS":{"recorder":{"name":"Brown County Register of Deeds","address":"601 Oregon St., Hiawatha, KS 66434"},"assessor":{"name":"Brown County Appraiser","address":"601 Oregon St., Hiawatha, KS 66434"}},"Butler County, KS":{"recorder":{"name":"Butler County Register of Deeds","address":"205 W Central Ave., El Dorado, KS 67042"},"assessor":{"name":"Butler County Appraiser","address":"205 W Central Ave., El Dorado, KS 67042"}},"Chase County, KS":{"recorder":{"name":"Chase County Register of Deeds","address":"300 Broadway, Cottonwood Falls, KS 66845"},"assessor":{"name":"Chase County Appraiser","address":"300 Broadway, Cottonwood Falls, KS 66845"}},"Chautauqua County, KS":{"recorder":{"name":"Chautauqua County Register of Deeds","address":"215 N Cherry St., Sedan, KS 67361"},"assessor":{"name":"Chautauqua County Appraiser","address":"215 N Cherry St., Sedan, KS 67361"}},"Cherokee County, KS":{"recorder":{"name":"Cherokee County Register of Deeds","address":"110 W Maple St., Columbus, KS 66725"},"assessor":{"name":"Cherokee County Appraiser","address":"110 W Maple St., Columbus, KS 66725"}},"Cheyenne County, KS":{"recorder":{"name":"Cheyenne County Register of Deeds","address":"212 E Washington St., St. Francis, KS 67756"},"assessor":{"name":"Cheyenne County Appraiser","address":"212 E Washington St., St. Francis, KS 67756"}},"Clark County, KS":{"recorder":{"name":"Clark County Register of Deeds","address":"913 Highland St., Ashland, KS 67831"},"assessor":{"name":"Clark County Appraiser","address":"913 Highland St., Ashland, KS 67831"}},"Clay County, KS":{"recorder":{"name":"Clay County Register of Deeds","address":"712 5th St., Clay Center, KS 67432"},"assessor":{"name":"Clay County Appraiser","address":"712 5th St., Clay Center, KS 67432"}},"Cloud County, KS":{"recorder":{"name":"Cloud County Register of Deeds","address":"811 Washington St., Concordia, KS 66901"},"assessor":{"name":"Cloud County Appraiser","address":"811 Washington St., Concordia, KS 66901"}},"Coffey County, KS":{"recorder":{"name":"Coffey County Register of Deeds","address":"110 S 6th St., Burlington, KS 66839"},"assessor":{"name":"Coffey County Appraiser","address":"110 S 6th St., Burlington, KS 66839"}},"Comanche County, KS":{"recorder":{"name":"Comanche County Register of Deeds","address":"201 S New York Ave., Coldwater, KS 67029"},"assessor":{"name":"Comanche County Appraiser","address":"201 S New York Ave., Coldwater, KS 67029"}},"Cowley County, KS":{"recorder":{"name":"Cowley County Register of Deeds","address":"311 E 9th Ave., Winfield, KS 67156"},"assessor":{"name":"Cowley County Appraiser","address":"311 E 9th Ave., Winfield, KS 67156"}},"Crawford County, KS":{"recorder":{"name":"Crawford County Register of Deeds","address":"111 E Forest St., Girard, KS 66743"},"assessor":{"name":"Crawford County Appraiser","address":"111 E Forest St., Girard, KS 66743"}},"Decatur County, KS":{"recorder":{"name":"Decatur County Register of Deeds","address":"120 E Hall St., Oberlin, KS 67749"},"assessor":{"name":"Decatur County Appraiser","address":"120 E Hall St., Oberlin, KS 67749"}},"Dickinson County, KS":{"recorder":{"name":"Dickinson County Register of Deeds","address":"109 E 1st St. Suite 201, Abilene, KS 67410"},"assessor":{"name":"Dickinson County Appraiser","address":"109 E 1st St. Suite 207, Abilene, KS 67410"}},"Doniphan County, KS":{"recorder":{"name":"Doniphan County Register of Deeds","address":"120 E Chestnut St., Troy, KS 66087"},"assessor":{"name":"Doniphan County Appraiser","address":"120 E Chestnut St., Troy, KS 66087"}},"Douglas County, KS":{"recorder":{"name":"Douglas County Register of Deeds","address":"1100 Massachusetts St., Lawrence, KS 66044"},"assessor":{"name":"Douglas County Appraiser","address":"1100 Massachusetts St., Lawrence, KS 66044"}},"Edwards County, KS":{"recorder":{"name":"Edwards County Register of Deeds","address":"312 Massachusetts Ave., Kinsley, KS 67547"},"assessor":{"name":"Edwards County Appraiser","address":"312 Massachusetts Ave., Kinsley, KS 67547"}},"Elk County, KS":{"recorder":{"name":"Elk County Register of Deeds","address":"127 N Pine St., Howard, KS 67349"},"assessor":{"name":"Elk County Appraiser","address":"127 N Pine St., Howard, KS 67349"}},"Ellis County, KS":{"recorder":{"name":"Ellis County Register of Deeds","address":"1204 Fort St., Hays, KS 67601"},"assessor":{"name":"Ellis County Appraiser","address":"1204 Fort St., Hays, KS 67601"}},"Ellsworth County, KS":{"recorder":{"name":"Ellsworth County Register of Deeds","address":"210 N Kansas Ave., Ellsworth, KS 67439"},"assessor":{"name":"Ellsworth County Appraiser","address":"210 N Kansas Ave., Ellsworth, KS 67439"}},"Finney County, KS":{"recorder":{"name":"Finney County Register of Deeds","address":"311 N 9th St., Garden City, KS 67846"},"assessor":{"name":"Finney County Appraiser","address":"311 N 9th St., Garden City, KS 67846"}},"Ford County, KS":{"recorder":{"name":"Ford County Register of Deeds","address":"100 Gunsmoke St., Dodge City, KS 67801"},"assessor":{"name":"Ford County Appraiser","address":"100 Gunsmoke St., Dodge City, KS 67801"}},"Franklin County, KS":{"recorder":{"name":"Franklin County Register of Deeds","address":"315 S Main St., Ottawa, KS 66067"},"assessor":{"name":"Franklin County Appraiser","address":"315 S Main St., Ottawa, KS 66067"}},"Geary County, KS":{"recorder":{"name":"Geary County Register of Deeds","address":"139 E 8th St., Junction City, KS 66441"},"assessor":{"name":"Geary County Appraiser","address":"139 E 8th St., Junction City, KS 66441"}},"Gove County, KS":{"recorder":{"name":"Gove County Register of Deeds","address":"520 Washington St., Gove, KS 67736"},"assessor":{"name":"Gove County Appraiser","address":"520 Washington St., Gove, KS 67736"}},"Graham County, KS":{"recorder":{"name":"Graham County Register of Deeds","address":"410 N Pomeroy St., Hill City, KS 67642"},"assessor":{"name":"Graham County Appraiser","address":"410 N Pomeroy St., Hill City, KS 67642"}},"Grant County, KS":{"recorder":{"name":"Grant County Register of Deeds","address":"108 S Glenn St., Ulysses, KS 67880"},"assessor":{"name":"Grant County Appraiser","address":"108 S Glenn St., Ulysses, KS 67880"}},"Gray County, KS":{"recorder":{"name":"Gray County Register of Deeds","address":"300 S Main St., Cimarron, KS 67835"},"assessor":{"name":"Gray County Appraiser","address":"300 S Main St., Cimarron, KS 67835"}},"Greeley County, KS":{"recorder":{"name":"Greeley County Register of Deeds","address":"208 Harper Ave., Tribune, KS 67879"},"assessor":{"name":"Greeley County Appraiser","address":"208 Harper Ave., Tribune, KS 67879"}},"Greenwood County, KS":{"recorder":{"name":"Greenwood County Register of Deeds","address":"311 N Main St., Eureka, KS 67045"},"assessor":{"name":"Greenwood County Appraiser","address":"311 N Main St., Eureka, KS 67045"}},"Hamilton County, KS":{"recorder":{"name":"Hamilton County Register of Deeds","address":"219 N Main St., Syracuse, KS 67878"},"assessor":{"name":"Hamilton County Appraiser","address":"219 N Main St., Syracuse, KS 67878"}},"Harper County, KS":{"recorder":{"name":"Harper County Register of Deeds","address":"201 N Jennings Ave., Anthony, KS 67003"},"assessor":{"name":"Harper County Appraiser","address":"201 N Jennings Ave., Anthony, KS 67003"}},"Harvey County, KS":{"recorder":{"name":"Harvey County Register of Deeds","address":"800 N Main St., Newton, KS 67114"},"assessor":{"name":"Harvey County Appraiser","address":"800 N Main St., Newton, KS 67114"}},"Haskell County, KS":{"recorder":{"name":"Haskell County Register of Deeds","address":"300 S Inman St., Sublette, KS 67877"},"assessor":{"name":"Haskell County Appraiser","address":"300 S Inman St., Sublette, KS 67877"}},"Hodgeman County, KS":{"recorder":{"name":"Hodgeman County Register of Deeds","address":"500 Main St., Jetmore, KS 67854"},"assessor":{"name":"Hodgeman County Appraiser","address":"500 Main St., Jetmore, KS 67854"}},"Jackson County, KS":{"recorder":{"name":"Jackson County Register of Deeds","address":"400 New York Ave., Holton, KS 66436"},"assessor":{"name":"Jackson County Appraiser","address":"400 New York Ave., Holton, KS 66436"}},"Jefferson County, KS":{"recorder":{"name":"Jefferson County Register of Deeds","address":"300 Jefferson St., Oskaloosa, KS 66066"},"assessor":{"name":"Jefferson County Appraiser","address":"300 Jefferson St., Oskaloosa, KS 66066"}},"Jewell County, KS":{"recorder":{"name":"Jewell County Register of Deeds","address":"307 N Commercial St., Mankato, KS 66956"},"assessor":{"name":"Jewell County Appraiser","address":"307 N Commercial St., Mankato, KS 66956"}},"Johnson County, KS":{"recorder":{"name":"Johnson County Register of Deeds","address":"111 S Cherry St. Suite 3200, Olathe, KS 66061"},"assessor":{"name":"Johnson County Appraiser","address":"11811 S Sunset Dr. Suite 2100, Olathe, KS 66061"}},"Kearny County, KS":{"recorder":{"name":"Kearny County Register of Deeds","address":"304 N Main St., Lakin, KS 67860"},"assessor":{"name":"Kearny County Appraiser","address":"304 N Main St., Lakin, KS 67860"}},"Kingman County, KS":{"recorder":{"name":"Kingman County Register of Deeds","address":"130 N Spruce St., Kingman, KS 67068"},"assessor":{"name":"Kingman County Appraiser","address":"130 N Spruce St., Kingman, KS 67068"}},"Kiowa County, KS":{"recorder":{"name":"Kiowa County Register of Deeds","address":"211 E Florida Ave., Greensburg, KS 67054"},"assessor":{"name":"Kiowa County Appraiser","address":"211 E Florida Ave., Greensburg, KS 67054"}},"Labette County, KS":{"recorder":{"name":"Labette County Register of Deeds","address":"501 Merchant St., Oswego, KS 67356"},"assessor":{"name":"Labette County Appraiser","address":"501 Merchant St., Oswego, KS 67356"}},"Lane County, KS":{"recorder":{"name":"Lane County Register of Deeds","address":"144 S Lane Ave., Dighton, KS 67839"},"assessor":{"name":"Lane County Appraiser","address":"144 S Lane Ave., Dighton, KS 67839"}},"Leavenworth County, KS":{"recorder":{"name":"Leavenworth County Register of Deeds","address":"300 Walnut St. Suite 106, Leavenworth, KS 66048"},"assessor":{"name":"Leavenworth County Appraiser","address":"300 Walnut St. Suite 204, Leavenworth, KS 66048"}},"Lincoln County, KS":{"recorder":{"name":"Lincoln County Register of Deeds","address":"216 E Lincoln Ave., Lincoln, KS 67455"},"assessor":{"name":"Lincoln County Appraiser","address":"216 E Lincoln Ave., Lincoln, KS 67455"}},"Linn County, KS":{"recorder":{"name":"Linn County Register of Deeds","address":"315 Main St., Mound City, KS 66056"},"assessor":{"name":"Linn County Appraiser","address":"315 Main St., Mound City, KS 66056"}},"Logan County, KS":{"recorder":{"name":"Logan County Register of Deeds","address":"710 W 2nd St., Oakley, KS 67748"},"assessor":{"name":"Logan County Appraiser","address":"710 W 2nd St., Oakley, KS 67748"}},"Lyon County, KS":{"recorder":{"name":"Lyon County Register of Deeds","address":"430 Commercial St., Emporia, KS 66801"},"assessor":{"name":"Lyon County Appraiser","address":"430 Commercial St., Emporia, KS 66801"}},"Marion County, KS":{"recorder":{"name":"Marion County Register of Deeds","address":"200 S 3rd St., Marion, KS 66861"},"assessor":{"name":"Marion County Appraiser","address":"200 S 3rd St., Marion, KS 66861"}},"Marshall County, KS":{"recorder":{"name":"Marshall County Register of Deeds","address":"1201 Broadway St., Marysville, KS 66508"},"assessor":{"name":"Marshall County Appraiser","address":"1201 Broadway St., Marysville, KS 66508"}},"McPherson County, KS":{"recorder":{"name":"McPherson County Register of Deeds","address":"117 N Maple St., McPherson, KS 67460"},"assessor":{"name":"McPherson County Appraiser","address":"117 N Maple St., McPherson, KS 67460"}},"Meade County, KS":{"recorder":{"name":"Meade County Register of Deeds","address":"200 N Fowler St., Meade, KS 67864"},"assessor":{"name":"Meade County Appraiser","address":"200 N Fowler St., Meade, KS 67864"}},"Miami County, KS":{"recorder":{"name":"Miami County Register of Deeds","address":"201 S Pearl St. Suite 203, Paola, KS 66071"},"assessor":{"name":"Miami County Appraiser","address":"201 S Pearl St. Suite 201, Paola, KS 66071"}},"Mitchell County, KS":{"recorder":{"name":"Mitchell County Register of Deeds","address":"111 S Hersey Ave., Beloit, KS 67420"},"assessor":{"name":"Mitchell County Appraiser","address":"111 S Hersey Ave., Beloit, KS 67420"}},"Montgomery County, KS":{"recorder":{"name":"Montgomery County Register of Deeds","address":"300 E Main St., Independence, KS 67301"},"assessor":{"name":"Montgomery County Appraiser","address":"300 E Main St., Independence, KS 67301"}},"Morris County, KS":{"recorder":{"name":"Morris County Register of Deeds","address":"501 W Main St., Council Grove, KS 66846"},"assessor":{"name":"Morris County Appraiser","address":"501 W Main St., Council Grove, KS 66846"}},"Morton County, KS":{"recorder":{"name":"Morton County Register of Deeds","address":"1025 Morton St., Elkhart, KS 67950"},"assessor":{"name":"Morton County Appraiser","address":"1025 Morton St., Elkhart, KS 67950"}},"Nemaha County, KS":{"recorder":{"name":"Nemaha County Register of Deeds","address":"607 Nemaha St., Seneca, KS 66538"},"assessor":{"name":"Nemaha County Appraiser","address":"607 Nemaha St., Seneca, KS 66538"}},"Neosho County, KS":{"recorder":{"name":"Neosho County Register of Deeds","address":"100 S Main St., Erie, KS 66733"},"assessor":{"name":"Neosho County Appraiser","address":"100 S Main St., Erie, KS 66733"}},"Ness County, KS":{"recorder":{"name":"Ness County Register of Deeds","address":"202 W Sycamore St., Ness City, KS 67560"},"assessor":{"name":"Ness County Appraiser","address":"202 W Sycamore St., Ness City, KS 67560"}},"Norton County, KS":{"recorder":{"name":"Norton County Register of Deeds","address":"105 S Kansas Ave., Norton, KS 67654"},"assessor":{"name":"Norton County Appraiser","address":"105 S Kansas Ave., Norton, KS 67654"}},"Osage County, KS":{"recorder":{"name":"Osage County Register of Deeds","address":"717 Topeka Ave., Lyndon, KS 66451"},"assessor":{"name":"Osage County Appraiser","address":"717 Topeka Ave., Lyndon, KS 66451"}},"Osborne County, KS":{"recorder":{"name":"Osborne County Register of Deeds","address":"423 W Main St., Osborne, KS 67473"},"assessor":{"name":"Osborne County Appraiser","address":"423 W Main St., Osborne, KS 67473"}},"Ottawa County, KS":{"recorder":{"name":"Ottawa County Register of Deeds","address":"307 N Concord St., Minneapolis, KS 67467"},"assessor":{"name":"Ottawa County Appraiser","address":"307 N Concord St., Minneapolis, KS 67467"}},"Pawnee County, KS":{"recorder":{"name":"Pawnee County Register of Deeds","address":"715 Broadway St., Larned, KS 67550"},"assessor":{"name":"Pawnee County Appraiser","address":"715 Broadway St., Larned, KS 67550"}},"Phillips County, KS":{"recorder":{"name":"Phillips County Register of Deeds","address":"301 State St., Phillipsburg, KS 67661"},"assessor":{"name":"Phillips County Appraiser","address":"301 State St., Phillipsburg, KS 67661"}},"Pottawatomie County, KS":{"recorder":{"name":"Pottawatomie County Register of Deeds","address":"207 N 1st St., Westmoreland, KS 66549"},"assessor":{"name":"Pottawatomie County Appraiser","address":"207 N 1st St., Westmoreland, KS 66549"}},"Pratt County, KS":{"recorder":{"name":"Pratt County Register of Deeds","address":"300 S Ninnescah St., Pratt, KS 67124"},"assessor":{"name":"Pratt County Appraiser","address":"300 S Ninnescah St., Pratt, KS 67124"}},"Rawlins County, KS":{"recorder":{"name":"Rawlins County Register of Deeds","address":"607 Main St., Atwood, KS 67730"},"assessor":{"name":"Rawlins County Appraiser","address":"607 Main St., Atwood, KS 67730"}},"Reno County, KS":{"recorder":{"name":"Reno County Register of Deeds","address":"206 W 1st Ave., Hutchinson, KS 67501"},"assessor":{"name":"Reno County Appraiser","address":"206 W 1st Ave., Hutchinson, KS 67501"}},"Republic County, KS":{"recorder":{"name":"Republic County Register of Deeds","address":"1815 M St., Belleville, KS 66935"},"assessor":{"name":"Republic County Appraiser","address":"1815 M St., Belleville, KS 66935"}},"Rice County, KS":{"recorder":{"name":"Rice County Register of Deeds","address":"101 W Commercial St., Lyons, KS 67554"},"assessor":{"name":"Rice County Appraiser","address":"101 W Commercial St., Lyons, KS 67554"}},"Riley County, KS":{"recorder":{"name":"Riley County Register of Deeds","address":"110 Courthouse Plaza, Manhattan, KS 66502"},"assessor":{"name":"Riley County Appraiser","address":"110 Courthouse Plaza, Manhattan, KS 66502"}},"Rooks County, KS":{"recorder":{"name":"Rooks County Register of Deeds","address":"115 N Walnut St., Stockton, KS 67669"},"assessor":{"name":"Rooks County Appraiser","address":"115 N Walnut St., Stockton, KS 67669"}},"Rush County, KS":{"recorder":{"name":"Rush County Register of Deeds","address":"715 Elm St., La Crosse, KS 67548"},"assessor":{"name":"Rush County Appraiser","address":"715 Elm St., La Crosse, KS 67548"}},"Russell County, KS":{"recorder":{"name":"Russell County Register of Deeds","address":"401 N Main St., Russell, KS 67665"},"assessor":{"name":"Russell County Appraiser","address":"401 N Main St., Russell, KS 67665"}},"Saline County, KS":{"recorder":{"name":"Saline County Register of Deeds","address":"300 W Ash St. Room 214, Salina, KS 67401"},"assessor":{"name":"Saline County Appraiser","address":"300 W Ash St. Room 209, Salina, KS 67401"}},"Scott County, KS":{"recorder":{"name":"Scott County Register of Deeds","address":"303 Court St., Scott City, KS 67871"},"assessor":{"name":"Scott County Appraiser","address":"303 Court St., Scott City, KS 67871"}},"Sedgwick County, KS":{"recorder":{"name":"Sedgwick County Register of Deeds","address":"525 N Main St. Suite 227, Wichita, KS 67203"},"assessor":{"name":"Sedgwick County Appraiser","address":"271 W 3rd St. N Suite 501, Wichita, KS 67202"}},"Seward County, KS":{"recorder":{"name":"Seward County Register of Deeds","address":"415 N Washington St., Liberal, KS 67901"},"assessor":{"name":"Seward County Appraiser","address":"415 N Washington St., Liberal, KS 67901"}},"Shawnee County, KS":{"recorder":{"name":"Shawnee County Register of Deeds","address":"200 SE 7th St. Room 108, Topeka, KS 66603"},"assessor":{"name":"Shawnee County Appraiser","address":"1515 NW Saline St., Topeka, KS 66618"}},"Sheridan County, KS":{"recorder":{"name":"Sheridan County Register of Deeds","address":"925 9th St., Hoxie, KS 67740"},"assessor":{"name":"Sheridan County Appraiser","address":"925 9th St., Hoxie, KS 67740"}},"Sherman County, KS":{"recorder":{"name":"Sherman County Register of Deeds","address":"813 Broadway St., Goodland, KS 67735"},"assessor":{"name":"Sherman County Appraiser","address":"813 Broadway St., Goodland, KS 67735"}},"Smith County, KS":{"recorder":{"name":"Smith County Register of Deeds","address":"218 S Grant Ave., Smith Center, KS 66967"},"assessor":{"name":"Smith County Appraiser","address":"218 S Grant Ave., Smith Center, KS 66967"}},"Stafford County, KS":{"recorder":{"name":"Stafford County Register of Deeds","address":"209 N Broadway Ave., St. John, KS 67576"},"assessor":{"name":"Stafford County Appraiser","address":"209 N Broadway Ave., St. John, KS 67576"}},"Stanton County, KS":{"recorder":{"name":"Stanton County Register of Deeds","address":"201 N Main St., Johnson, KS 67855"},"assessor":{"name":"Stanton County Appraiser","address":"201 N Main St., Johnson, KS 67855"}},"Stevens County, KS":{"recorder":{"name":"Stevens County Register of Deeds","address":"200 E 6th St., Hugoton, KS 67951"},"assessor":{"name":"Stevens County Appraiser","address":"200 E 6th St., Hugoton, KS 67951"}},"Sumner County, KS":{"recorder":{"name":"Sumner County Register of Deeds","address":"501 N Washington Ave., Wellington, KS 67152"},"assessor":{"name":"Sumner County Appraiser","address":"501 N Washington Ave., Wellington, KS 67152"}},"Thomas County, KS":{"recorder":{"name":"Thomas County Register of Deeds","address":"300 N Court Ave., Colby, KS 67701"},"assessor":{"name":"Thomas County Appraiser","address":"300 N Court Ave., Colby, KS 67701"}},"Trego County, KS":{"recorder":{"name":"Trego County Register of Deeds","address":"216 N Main St., WaKeeney, KS 67672"},"assessor":{"name":"Trego County Appraiser","address":"216 N Main St., WaKeeney, KS 67672"}},"Wabaunsee County, KS":{"recorder":{"name":"Wabaunsee County Register of Deeds","address":"215 Kansas Ave., Alma, KS 66401"},"assessor":{"name":"Wabaunsee County Appraiser","address":"215 Kansas Ave., Alma, KS 66401"}},"Wallace County, KS":{"recorder":{"name":"Wallace County Register of Deeds","address":"313 Main St., Sharon Springs, KS 67758"},"assessor":{"name":"Wallace County Appraiser","address":"313 Main St., Sharon Springs, KS 67758"}},"Washington County, KS":{"recorder":{"name":"Washington County Register of Deeds","address":"214 C St., Washington, KS 66968"},"assessor":{"name":"Washington County Appraiser","address":"214 C St., Washington, KS 66968"}},"Wichita County, KS":{"recorder":{"name":"Wichita County Register of Deeds","address":"206 S 4th St., Leoti, KS 67861"},"assessor":{"name":"Wichita County Appraiser","address":"206 S 4th St., Leoti, KS 67861"}},"Wilson County, KS":{"recorder":{"name":"Wilson County Register of Deeds","address":"615 Madison St., Fredonia, KS 66736"},"assessor":{"name":"Wilson County Appraiser","address":"615 Madison St., Fredonia, KS 66736"}},"Woodson County, KS":{"recorder":{"name":"Woodson County Register of Deeds","address":"105 W Rutledge St., Yates Center, KS 66783"},"assessor":{"name":"Woodson County Appraiser","address":"105 W Rutledge St., Yates Center, KS 66783"}},"Wyandotte County, KS":{"recorder":{"name":"Wyandotte County Register of Deeds","address":"710 N 7th St. Suite 240, Kansas City, KS 66101"},"assessor":{"name":"Wyandotte County Appraiser","address":"8200 State Ave., Kansas City, KS 66112"}},"Adair County, KY":{"recorder":{"name":"Adair County Clerk","address":"424 Public Square Suite 2, Columbia, KY 42728"},"assessor":{"name":"Adair County PVA","address":"424 Public Square Suite 5, Columbia, KY 42728"}},"Allen County, KY":{"recorder":{"name":"Allen County Clerk","address":"201 W Main St., Scottsville, KY 42164"},"assessor":{"name":"Allen County PVA","address":"201 W Main St. Suite 4, Scottsville, KY 42164"}},"Anderson County, KY":{"recorder":{"name":"Anderson County Clerk","address":"151 S Main St., Lawrenceburg, KY 40342"},"assessor":{"name":"Anderson County PVA","address":"151 S Main St. Suite 6, Lawrenceburg, KY 40342"}},"Ballard County, KY":{"recorder":{"name":"Ballard County Clerk","address":"132 N 4th St., Wickliffe, KY 42087"},"assessor":{"name":"Ballard County PVA","address":"132 N 4th St., Wickliffe, KY 42087"}},"Barren County, KY":{"recorder":{"name":"Barren County Clerk","address":"117 N Public Square Suite 1, Glasgow, KY 42141"},"assessor":{"name":"Barren County PVA","address":"117 N Public Square Suite 2, Glasgow, KY 42141"}},"Bath County, KY":{"recorder":{"name":"Bath County Clerk","address":"19 E Main St., Owingsville, KY 40360"},"assessor":{"name":"Bath County PVA","address":"19 E Main St., Owingsville, KY 40360"}},"Bell County, KY":{"recorder":{"name":"Bell County Clerk","address":"101 Courthouse Square, Pineville, KY 40977"},"assessor":{"name":"Bell County PVA","address":"101 Courthouse Square, Pineville, KY 40977"}},"Boone County, KY":{"recorder":{"name":"Boone County Clerk","address":"2950 Washington St., Burlington, KY 41005"},"assessor":{"name":"Boone County PVA","address":"2950 Washington St., Burlington, KY 41005"}},"Bourbon County, KY":{"recorder":{"name":"Bourbon County Clerk","address":"301 Main St. Suite 102, Paris, KY 40361"},"assessor":{"name":"Bourbon County PVA","address":"301 Main St. Suite 102, Paris, KY 40361"}},"Boyd County, KY":{"recorder":{"name":"Boyd County Clerk","address":"2800 Louisa St., Catlettsburg, KY 41129"},"assessor":{"name":"Boyd County PVA","address":"2800 Louisa St., Catlettsburg, KY 41129"}},"Boyle County, KY":{"recorder":{"name":"Boyle County Clerk","address":"321 W Main St. Suite 123, Danville, KY 40422"},"assessor":{"name":"Boyle County PVA","address":"321 W Main St. Suite 123, Danville, KY 40422"}},"Bracken County, KY":{"recorder":{"name":"Bracken County Clerk","address":"116 W Miami St., Brooksville, KY 41004"},"assessor":{"name":"Bracken County PVA","address":"116 W Miami St., Brooksville, KY 41004"}},"Breathitt County, KY":{"recorder":{"name":"Breathitt County Clerk","address":"1137 Main St., Jackson, KY 41339"},"assessor":{"name":"Breathitt County PVA","address":"1137 Main St., Jackson, KY 41339"}},"Breckinridge County, KY":{"recorder":{"name":"Breckinridge County Clerk","address":"208 S Main St., Hardinsburg, KY 40143"},"assessor":{"name":"Breckinridge County PVA","address":"208 S Main St., Hardinsburg, KY 40143"}},"Bullitt County, KY":{"recorder":{"name":"Bullitt County Clerk","address":"149 N Walnut St., Shepherdsville, KY 40165"},"assessor":{"name":"Bullitt County PVA","address":"149 N Walnut St., Shepherdsville, KY 40165"}},"Butler County, KY":{"recorder":{"name":"Butler County Clerk","address":"110 N Main St., Morgantown, KY 42261"},"assessor":{"name":"Butler County PVA","address":"110 N Main St., Morgantown, KY 42261"}},"Caldwell County, KY":{"recorder":{"name":"Caldwell County Clerk","address":"100 E Market St., Princeton, KY 42445"},"assessor":{"name":"Caldwell County PVA","address":"100 E Market St., Princeton, KY 42445"}},"Calloway County, KY":{"recorder":{"name":"Calloway County Clerk","address":"101 S 5th St., Murray, KY 42071"},"assessor":{"name":"Calloway County PVA","address":"101 S 5th St., Murray, KY 42071"}},"Campbell County, KY":{"recorder":{"name":"Campbell County Clerk","address":"330 York St., Newport, KY 41071"},"assessor":{"name":"Campbell County PVA","address":"330 York St., Newport, KY 41071"}},"Carlisle County, KY":{"recorder":{"name":"Carlisle County Clerk","address":"Bardwell, KY 42023"},"assessor":{"name":"Carlisle County PVA","address":"Bardwell, KY 42023"}},"Carroll County, KY":{"recorder":{"name":"Carroll County Clerk","address":"440 Main St., Carrollton, KY 41008"},"assessor":{"name":"Carroll County PVA","address":"440 Main St., Carrollton, KY 41008"}},"Carter County, KY":{"recorder":{"name":"Carter County Clerk","address":"300 W Main St., Grayson, KY 41143"},"assessor":{"name":"Carter County PVA","address":"300 W Main St., Grayson, KY 41143"}},"Casey County, KY":{"recorder":{"name":"Casey County Clerk","address":"100 S Jefferson St., Liberty, KY 42539"},"assessor":{"name":"Casey County PVA","address":"100 S Jefferson St., Liberty, KY 42539"}},"Christian County, KY":{"recorder":{"name":"Christian County Clerk","address":"511 S Main St., Hopkinsville, KY 42240"},"assessor":{"name":"Christian County PVA","address":"511 S Main St., Hopkinsville, KY 42240"}},"Clark County, KY":{"recorder":{"name":"Clark County Clerk","address":"34 S Main St., Winchester, KY 40391"},"assessor":{"name":"Clark County PVA","address":"34 S Main St., Winchester, KY 40391"}},"Clay County, KY":{"recorder":{"name":"Clay County Clerk","address":"102 Richmond Rd. Suite 100, Manchester, KY 40962"},"assessor":{"name":"Clay County PVA","address":"102 Richmond Rd. Suite 100, Manchester, KY 40962"}},"Clinton County, KY":{"recorder":{"name":"Clinton County Clerk","address":"100 S Cross St., Albany, KY 42602"},"assessor":{"name":"Clinton County PVA","address":"100 S Cross St., Albany, KY 42602"}},"Crittenden County, KY":{"recorder":{"name":"Crittenden County Clerk","address":"107 S Main St., Marion, KY 42064"},"assessor":{"name":"Crittenden County PVA","address":"107 S Main St., Marion, KY 42064"}},"Cumberland County, KY":{"recorder":{"name":"Cumberland County Clerk","address":"1 Court Square Suite 2, Burkesville, KY 42717"},"assessor":{"name":"Cumberland County PVA","address":"1 Court Square Suite 2, Burkesville, KY 42717"}},"Daviess County, KY":{"recorder":{"name":"Daviess County Clerk","address":"212 St. Ann St., Owensboro, KY 42303"},"assessor":{"name":"Daviess County PVA","address":"212 St. Ann St., Owensboro, KY 42303"}},"Edmonson County, KY":{"recorder":{"name":"Edmonson County Clerk","address":"Main St., Brownsville, KY 42210"},"assessor":{"name":"Edmonson County PVA","address":"Main St., Brownsville, KY 42210"}},"Elliott County, KY":{"recorder":{"name":"Elliott County Clerk","address":"Main St., Sandy Hook, KY 41171"},"assessor":{"name":"Elliott County PVA","address":"Main St., Sandy Hook, KY 41171"}},"Estill County, KY":{"recorder":{"name":"Estill County Clerk","address":"130 Main St., Irvine, KY 40336"},"assessor":{"name":"Estill County PVA","address":"130 Main St., Irvine, KY 40336"}},"Fayette County, KY":{"recorder":{"name":"Fayette County Clerk","address":"162 E Main St., Lexington, KY 40507"},"assessor":{"name":"Fayette County PVA","address":"101 E Vine St. Suite 600, Lexington, KY 40507"}},"Fleming County, KY":{"recorder":{"name":"Fleming County Clerk","address":"100 Court Square, Flemingsburg, KY 41041"},"assessor":{"name":"Fleming County PVA","address":"100 Court Square, Flemingsburg, KY 41041"}},"Floyd County, KY":{"recorder":{"name":"Floyd County Clerk","address":"149 S Central Ave., Prestonsburg, KY 41653"},"assessor":{"name":"Floyd County PVA","address":"149 S Central Ave., Prestonsburg, KY 41653"}},"Franklin County, KY":{"recorder":{"name":"Franklin County Clerk","address":"315 W Main St. Suite 103, Frankfort, KY 40601"},"assessor":{"name":"Franklin County PVA","address":"315 W Main St. Suite 103, Frankfort, KY 40601"}},"Fulton County, KY":{"recorder":{"name":"Fulton County Clerk","address":"2216 E State Line Rd., Hickman, KY 42050"},"assessor":{"name":"Fulton County PVA","address":"2216 E State Line Rd., Hickman, KY 42050"}},"Gallatin County, KY":{"recorder":{"name":"Gallatin County Clerk","address":"100 Main St., Warsaw, KY 41095"},"assessor":{"name":"Gallatin County PVA","address":"100 Main St., Warsaw, KY 41095"}},"Garrard County, KY":{"recorder":{"name":"Garrard County Clerk","address":"15 Public Square, Lancaster, KY 40444"},"assessor":{"name":"Garrard County PVA","address":"15 Public Square, Lancaster, KY 40444"}},"Grant County, KY":{"recorder":{"name":"Grant County Clerk","address":"101 N Main St., Williamstown, KY 41097"},"assessor":{"name":"Grant County PVA","address":"101 N Main St., Williamstown, KY 41097"}},"Graves County, KY":{"recorder":{"name":"Graves County Clerk","address":"100 E Broadway, Mayfield, KY 42066"},"assessor":{"name":"Graves County PVA","address":"100 E Broadway, Mayfield, KY 42066"}},"Grayson County, KY":{"recorder":{"name":"Grayson County Clerk","address":"10 Public Square, Leitchfield, KY 42754"},"assessor":{"name":"Grayson County PVA","address":"10 Public Square, Leitchfield, KY 42754"}},"Green County, KY":{"recorder":{"name":"Green County Clerk","address":"203 W Court St., Greensburg, KY 42743"},"assessor":{"name":"Green County PVA","address":"203 W Court St., Greensburg, KY 42743"}},"Greenup County, KY":{"recorder":{"name":"Greenup County Clerk","address":"301 Main St., Greenup, KY 41144"},"assessor":{"name":"Greenup County PVA","address":"301 Main St., Greenup, KY 41144"}},"Hancock County, KY":{"recorder":{"name":"Hancock County Clerk","address":"225 Main Cross St., Hawesville, KY 42348"},"assessor":{"name":"Hancock County PVA","address":"225 Main Cross St., Hawesville, KY 42348"}},"Hardin County, KY":{"recorder":{"name":"Hardin County Clerk","address":"14 Public Square, Elizabethtown, KY 42701"},"assessor":{"name":"Hardin County PVA","address":"14 Public Square, Elizabethtown, KY 42701"}},"Harlan County, KY":{"recorder":{"name":"Harlan County Clerk","address":"205 W Central St., Harlan, KY 40831"},"assessor":{"name":"Harlan County PVA","address":"205 W Central St., Harlan, KY 40831"}},"Harrison County, KY":{"recorder":{"name":"Harrison County Clerk","address":"111 S Main St. Suite 1, Cynthiana, KY 41031"},"assessor":{"name":"Harrison County PVA","address":"111 S Main St. Suite 1, Cynthiana, KY 41031"}},"Hart County, KY":{"recorder":{"name":"Hart County Clerk","address":"Main St., Munfordville, KY 42765"},"assessor":{"name":"Hart County PVA","address":"Main St., Munfordville, KY 42765"}},"Henderson County, KY":{"recorder":{"name":"Henderson County Clerk","address":"20 N Main St., Henderson, KY 42420"},"assessor":{"name":"Henderson County PVA","address":"20 N Main St., Henderson, KY 42420"}},"Henry County, KY":{"recorder":{"name":"Henry County Clerk","address":"27 Main St., New Castle, KY 40050"},"assessor":{"name":"Henry County PVA","address":"27 Main St., New Castle, KY 40050"}},"Hickman County, KY":{"recorder":{"name":"Hickman County Clerk","address":"110 E Clay St., Clinton, KY 42031"},"assessor":{"name":"Hickman County PVA","address":"110 E Clay St., Clinton, KY 42031"}},"Hopkins County, KY":{"recorder":{"name":"Hopkins County Clerk","address":"25 E Center St., Madisonville, KY 42431"},"assessor":{"name":"Hopkins County PVA","address":"25 E Center St., Madisonville, KY 42431"}},"Jackson County, KY":{"recorder":{"name":"Jackson County Clerk","address":"Main St., McKee, KY 40447"},"assessor":{"name":"Jackson County PVA","address":"Main St., McKee, KY 40447"}},"Jefferson County, KY":{"recorder":{"name":"Jefferson County Clerk","address":"527 W Jefferson St. Suite 100, Louisville, KY 40202"},"assessor":{"name":"Jefferson County PVA","address":"815 W Market St. Suite 400, Louisville, KY 40202"}},"Jessamine County, KY":{"recorder":{"name":"Jessamine County Clerk","address":"101 N Main St., Nicholasville, KY 40356"},"assessor":{"name":"Jessamine County PVA","address":"101 N Main St., Nicholasville, KY 40356"}},"Johnson County, KY":{"recorder":{"name":"Johnson County Clerk","address":"230 Court St. Suite 201, Paintsville, KY 41240"},"assessor":{"name":"Johnson County PVA","address":"230 Court St. Suite 201, Paintsville, KY 41240"}},"Kenton County, KY":{"recorder":{"name":"Kenton County Clerk","address":"303 Court St., Covington, KY 41011"},"assessor":{"name":"Kenton County PVA","address":"303 Court St., Covington, KY 41011"}},"Knott County, KY":{"recorder":{"name":"Knott County Clerk","address":"54 W Courthouse Sq., Hindman, KY 41822"},"assessor":{"name":"Knott County PVA","address":"54 W Courthouse Sq., Hindman, KY 41822"}},"Knox County, KY":{"recorder":{"name":"Knox County Clerk","address":"401 Court Square Suite 102, Barbourville, KY 40906"},"assessor":{"name":"Knox County PVA","address":"401 Court Square Suite 102, Barbourville, KY 40906"}},"Larue County, KY":{"recorder":{"name":"Larue County Clerk","address":"209 W High St., Hodgenville, KY 42748"},"assessor":{"name":"Larue County PVA","address":"209 W High St., Hodgenville, KY 42748"}},"Laurel County, KY":{"recorder":{"name":"Laurel County Clerk","address":"101 S Main St. Suite 203, London, KY 40741"},"assessor":{"name":"Laurel County PVA","address":"101 S Main St. Suite 203, London, KY 40741"}},"Lawrence County, KY":{"recorder":{"name":"Lawrence County Clerk","address":"122 S Main Cross St., Louisa, KY 41230"},"assessor":{"name":"Lawrence County PVA","address":"122 S Main Cross St., Louisa, KY 41230"}},"Lee County, KY":{"recorder":{"name":"Lee County Clerk","address":"38 Main St., Beattyville, KY 41311"},"assessor":{"name":"Lee County PVA","address":"38 Main St., Beattyville, KY 41311"}},"Leslie County, KY":{"recorder":{"name":"Leslie County Clerk","address":"22010 Main St., Hyden, KY 41749"},"assessor":{"name":"Leslie County PVA","address":"22010 Main St., Hyden, KY 41749"}},"Letcher County, KY":{"recorder":{"name":"Letcher County Clerk","address":"156 Main St. Suite 100, Whitesburg, KY 41858"},"assessor":{"name":"Letcher County PVA","address":"156 Main St. Suite 100, Whitesburg, KY 41858"}},"Lewis County, KY":{"recorder":{"name":"Lewis County Clerk","address":"510 Second St., Vanceburg, KY 41179"},"assessor":{"name":"Lewis County PVA","address":"510 Second St., Vanceburg, KY 41179"}},"Lincoln County, KY":{"recorder":{"name":"Lincoln County Clerk","address":"102 E Main St. Suite 1, Stanford, KY 40484"},"assessor":{"name":"Lincoln County PVA","address":"102 E Main St. Suite 1, Stanford, KY 40484"}},"Livingston County, KY":{"recorder":{"name":"Livingston County Clerk","address":"100 Court St., Smithland, KY 42081"},"assessor":{"name":"Livingston County PVA","address":"100 Court St., Smithland, KY 42081"}},"Logan County, KY":{"recorder":{"name":"Logan County Clerk","address":"200 W 4th St., Russellville, KY 42276"},"assessor":{"name":"Logan County PVA","address":"200 W 4th St., Russellville, KY 42276"}},"Lyon County, KY":{"recorder":{"name":"Lyon County Clerk","address":"Main St., Eddyville, KY 42038"},"assessor":{"name":"Lyon County PVA","address":"Main St., Eddyville, KY 42038"}},"Madison County, KY":{"recorder":{"name":"Madison County Clerk","address":"101 W Main St., Richmond, KY 40475"},"assessor":{"name":"Madison County PVA","address":"101 W Main St., Richmond, KY 40475"}},"Magoffin County, KY":{"recorder":{"name":"Magoffin County Clerk","address":"Main St., Salyersville, KY 41465"},"assessor":{"name":"Magoffin County PVA","address":"Main St., Salyersville, KY 41465"}},"Marion County, KY":{"recorder":{"name":"Marion County Clerk","address":"223 N Spalding Ave. Suite 203, Lebanon, KY 40033"},"assessor":{"name":"Marion County PVA","address":"223 N Spalding Ave. Suite 203, Lebanon, KY 40033"}},"Marshall County, KY":{"recorder":{"name":"Marshall County Clerk","address":"1101 Main St., Benton, KY 42025"},"assessor":{"name":"Marshall County PVA","address":"1101 Main St., Benton, KY 42025"}},"Martin County, KY":{"recorder":{"name":"Martin County Clerk","address":"Main St., Inez, KY 41224"},"assessor":{"name":"Martin County PVA","address":"Main St., Inez, KY 41224"}},"Mason County, KY":{"recorder":{"name":"Mason County Clerk","address":"27 W 3rd St., Maysville, KY 41056"},"assessor":{"name":"Mason County PVA","address":"27 W 3rd St., Maysville, KY 41056"}},"McCracken County, KY":{"recorder":{"name":"McCracken County Clerk","address":"300 S 7th St. Room 109, Paducah, KY 42003"},"assessor":{"name":"McCracken County PVA","address":"300 S 7th St. Room 109, Paducah, KY 42003"}},"McCreary County, KY":{"recorder":{"name":"McCreary County Clerk","address":"Main St., Whitley City, KY 42653"},"assessor":{"name":"McCreary County PVA","address":"Main St., Whitley City, KY 42653"}},"McLean County, KY":{"recorder":{"name":"McLean County Clerk","address":"210 Main St., Calhoun, KY 42327"},"assessor":{"name":"McLean County PVA","address":"210 Main St., Calhoun, KY 42327"}},"Meade County, KY":{"recorder":{"name":"Meade County Clerk","address":"516 Hillcrest Dr., Brandenburg, KY 40108"},"assessor":{"name":"Meade County PVA","address":"516 Hillcrest Dr., Brandenburg, KY 40108"}},"Menifee County, KY":{"recorder":{"name":"Menifee County Clerk","address":"Frenchburg, KY 40322"},"assessor":{"name":"Menifee County PVA","address":"Frenchburg, KY 40322"}},"Mercer County, KY":{"recorder":{"name":"Mercer County Clerk","address":"207 W Lexington St. Suite 9, Harrodsburg, KY 40330"},"assessor":{"name":"Mercer County PVA","address":"207 W Lexington St. Suite 9, Harrodsburg, KY 40330"}},"Metcalfe County, KY":{"recorder":{"name":"Metcalfe County Clerk","address":"100 E Stockton St., Edmonton, KY 42129"},"assessor":{"name":"Metcalfe County PVA","address":"100 E Stockton St., Edmonton, KY 42129"}},"Monroe County, KY":{"recorder":{"name":"Monroe County Clerk","address":"200 N Main St., Tompkinsville, KY 42167"},"assessor":{"name":"Monroe County PVA","address":"200 N Main St., Tompkinsville, KY 42167"}},"Montgomery County, KY":{"recorder":{"name":"Montgomery County Clerk","address":"1 Court St., Mount Sterling, KY 40353"},"assessor":{"name":"Montgomery County PVA","address":"1 Court St., Mount Sterling, KY 40353"}},"Morgan County, KY":{"recorder":{"name":"Morgan County Clerk","address":"505 Prestonsburg St., West Liberty, KY 41472"},"assessor":{"name":"Morgan County PVA","address":"505 Prestonsburg St., West Liberty, KY 41472"}},"Muhlenberg County, KY":{"recorder":{"name":"Muhlenberg County Clerk","address":"100 W Main St., Greenville, KY 42345"},"assessor":{"name":"Muhlenberg County PVA","address":"100 W Main St., Greenville, KY 42345"}},"Nelson County, KY":{"recorder":{"name":"Nelson County Clerk","address":"113 E Stephen Foster Ave., Bardstown, KY 40004"},"assessor":{"name":"Nelson County PVA","address":"113 E Stephen Foster Ave., Bardstown, KY 40004"}},"Nicholas County, KY":{"recorder":{"name":"Nicholas County Clerk","address":"125 E Main St., Carlisle, KY 40311"},"assessor":{"name":"Nicholas County PVA","address":"125 E Main St., Carlisle, KY 40311"}},"Ohio County, KY":{"recorder":{"name":"Ohio County Clerk","address":"Main St., Hartford, KY 42347"},"assessor":{"name":"Ohio County PVA","address":"Main St., Hartford, KY 42347"}},"Oldham County, KY":{"recorder":{"name":"Oldham County Clerk","address":"100 W Jefferson St., LaGrange, KY 40031"},"assessor":{"name":"Oldham County PVA","address":"100 W Jefferson St., LaGrange, KY 40031"}},"Owen County, KY":{"recorder":{"name":"Owen County Clerk","address":"135 W Bryan St., Owenton, KY 40359"},"assessor":{"name":"Owen County PVA","address":"135 W Bryan St., Owenton, KY 40359"}},"Owsley County, KY":{"recorder":{"name":"Owsley County Clerk","address":"154 Main St., Booneville, KY 41314"},"assessor":{"name":"Owsley County PVA","address":"154 Main St., Booneville, KY 41314"}},"Pendleton County, KY":{"recorder":{"name":"Pendleton County Clerk","address":"233 Main St., Falmouth, KY 41040"},"assessor":{"name":"Pendleton County PVA","address":"233 Main St., Falmouth, KY 41040"}},"Perry County, KY":{"recorder":{"name":"Perry County Clerk","address":"481 Main St., Hazard, KY 41701"},"assessor":{"name":"Perry County PVA","address":"481 Main St., Hazard, KY 41701"}},"Pike County, KY":{"recorder":{"name":"Pike County Clerk","address":"320 Main St., Pikeville, KY 41501"},"assessor":{"name":"Pike County PVA","address":"320 Main St., Pikeville, KY 41501"}},"Powell County, KY":{"recorder":{"name":"Powell County Clerk","address":"525 Washington St., Stanton, KY 40380"},"assessor":{"name":"Powell County PVA","address":"525 Washington St., Stanton, KY 40380"}},"Pulaski County, KY":{"recorder":{"name":"Pulaski County Clerk","address":"100 N Main St. Suite 200, Somerset, KY 42501"},"assessor":{"name":"Pulaski County PVA","address":"100 N Main St. Suite 200, Somerset, KY 42501"}},"Robertson County, KY":{"recorder":{"name":"Robertson County Clerk","address":"57 N Main St., Mount Olivet, KY 41064"},"assessor":{"name":"Robertson County PVA","address":"57 N Main St., Mount Olivet, KY 41064"}},"Rockcastle County, KY":{"recorder":{"name":"Rockcastle County Clerk","address":"205 E Main St. Suite 4, Mount Vernon, KY 40456"},"assessor":{"name":"Rockcastle County PVA","address":"205 E Main St. Suite 4, Mount Vernon, KY 40456"}},"Rowan County, KY":{"recorder":{"name":"Rowan County Clerk","address":"600 W Main St. Suite 102, Morehead, KY 40351"},"assessor":{"name":"Rowan County PVA","address":"600 W Main St. Suite 102, Morehead, KY 40351"}},"Russell County, KY":{"recorder":{"name":"Russell County Clerk","address":"410 Monument Square Suite 203, Jamestown, KY 42629"},"assessor":{"name":"Russell County PVA","address":"410 Monument Square Suite 203, Jamestown, KY 42629"}},"Scott County, KY":{"recorder":{"name":"Scott County Clerk","address":"101 E Main St., Georgetown, KY 40324"},"assessor":{"name":"Scott County PVA","address":"101 E Main St., Georgetown, KY 40324"}},"Shelby County, KY":{"recorder":{"name":"Shelby County Clerk","address":"501 Main St., Shelbyville, KY 40065"},"assessor":{"name":"Shelby County PVA","address":"501 Main St., Shelbyville, KY 40065"}},"Simpson County, KY":{"recorder":{"name":"Simpson County Clerk","address":"103 W Cedar St., Franklin, KY 42134"},"assessor":{"name":"Simpson County PVA","address":"103 W Cedar St., Franklin, KY 42134"}},"Spencer County, KY":{"recorder":{"name":"Spencer County Clerk","address":"20 Main St., Taylorsville, KY 40071"},"assessor":{"name":"Spencer County PVA","address":"20 Main St., Taylorsville, KY 40071"}},"Taylor County, KY":{"recorder":{"name":"Taylor County Clerk","address":"203 N Court St., Campbellsville, KY 42718"},"assessor":{"name":"Taylor County PVA","address":"203 N Court St., Campbellsville, KY 42718"}},"Todd County, KY":{"recorder":{"name":"Todd County Clerk","address":"P.O. Box 307, Elkton, KY 42220"},"assessor":{"name":"Todd County PVA","address":"Elkton, KY 42220"}},"Trigg County, KY":{"recorder":{"name":"Trigg County Clerk","address":"35 Main St., Cadiz, KY 42211"},"assessor":{"name":"Trigg County PVA","address":"35 Main St., Cadiz, KY 42211"}},"Trimble County, KY":{"recorder":{"name":"Trimble County Clerk","address":"Bedford, KY 40006"},"assessor":{"name":"Trimble County PVA","address":"Bedford, KY 40006"}},"Union County, KY":{"recorder":{"name":"Union County Clerk","address":"100 W Main St., Morganfield, KY 42437"},"assessor":{"name":"Union County PVA","address":"100 W Main St., Morganfield, KY 42437"}},"Warren County, KY":{"recorder":{"name":"Warren County Clerk","address":"429 E 10th Ave., Bowling Green, KY 42101"},"assessor":{"name":"Warren County PVA","address":"429 E 10th Ave., Bowling Green, KY 42101"}},"Washington County, KY":{"recorder":{"name":"Washington County Clerk","address":"105 Court Square, Springfield, KY 40069"},"assessor":{"name":"Washington County PVA","address":"105 Court Square, Springfield, KY 40069"}},"Wayne County, KY":{"recorder":{"name":"Wayne County Clerk","address":"109 N Main St., Monticello, KY 42633"},"assessor":{"name":"Wayne County PVA","address":"109 N Main St., Monticello, KY 42633"}},"Webster County, KY":{"recorder":{"name":"Webster County Clerk","address":"25 US 41A S, Dixon, KY 42409"},"assessor":{"name":"Webster County PVA","address":"25 US 41A S, Dixon, KY 42409"}},"Whitley County, KY":{"recorder":{"name":"Whitley County Clerk","address":"100 Main St. Suite 2, Williamsburg, KY 40769"},"assessor":{"name":"Whitley County PVA","address":"100 Main St. Suite 2, Williamsburg, KY 40769"}},"Wolfe County, KY":{"recorder":{"name":"Wolfe County Clerk","address":"10 Court St., Campton, KY 41301"},"assessor":{"name":"Wolfe County PVA","address":"10 Court St., Campton, KY 41301"}},"Woodford County, KY":{"recorder":{"name":"Woodford County Clerk","address":"103 S Main St., Versailles, KY 40383"},"assessor":{"name":"Woodford County PVA","address":"103 S Main St., Versailles, KY 40383"}},"Acadia Parish, LA":{"recorder":{"name":"Acadia Parish Clerk of Court","address":"500 NE Court Circle, Crowley, LA 70526"},"assessor":{"name":"Acadia Parish Assessor","address":"500 NE Court Circle, Crowley, LA 70526"}},"Allen Parish, LA":{"recorder":{"name":"Allen Parish Clerk of Court","address":"400 W 6th Ave., Oberlin, LA 70655"},"assessor":{"name":"Allen Parish Assessor","address":"400 W 6th Ave., Oberlin, LA 70655"}},"Ascension Parish, LA":{"recorder":{"name":"Ascension Parish Clerk of Court","address":"828 S Irma Blvd., Gonzales, LA 70737"},"assessor":{"name":"Ascension Parish Assessor","address":"300 Houmas St., Donaldsonville, LA 70346"}},"Assumption Parish, LA":{"recorder":{"name":"Assumption Parish Clerk of Court","address":"4809 Hwy 308, Napoleonville, LA 70390"},"assessor":{"name":"Assumption Parish Assessor","address":"4809 Hwy 308, Napoleonville, LA 70390"}},"Avoyelles Parish, LA":{"recorder":{"name":"Avoyelles Parish Clerk of Court","address":"312 N Main St., Marksville, LA 71351"},"assessor":{"name":"Avoyelles Parish Assessor","address":"312 N Main St., Marksville, LA 71351"}},"Beauregard Parish, LA":{"recorder":{"name":"Beauregard Parish Clerk of Court","address":"201 W 1st St., De Ridder, LA 70634"},"assessor":{"name":"Beauregard Parish Assessor","address":"201 W 1st St., De Ridder, LA 70634"}},"Bienville Parish, LA":{"recorder":{"name":"Bienville Parish Clerk of Court","address":"100 Courthouse Dr. Suite 100, Arcadia, LA 71001"},"assessor":{"name":"Bienville Parish Assessor","address":"100 Courthouse Dr. Suite 100, Arcadia, LA 71001"}},"Bossier Parish, LA":{"recorder":{"name":"Bossier Parish Clerk of Court","address":"204 Burt Blvd., Benton, LA 71006"},"assessor":{"name":"Bossier Parish Assessor","address":"204 Burt Blvd., Benton, LA 71006"}},"Caddo Parish, LA":{"recorder":{"name":"Caddo Parish Clerk of Court","address":"501 Texas St. Room 103, Shreveport, LA 71101"},"assessor":{"name":"Caddo Parish Assessor","address":"501 Texas St. Room 101, Shreveport, LA 71101"}},"Calcasieu Parish, LA":{"recorder":{"name":"Calcasieu Parish Clerk of Court","address":"1000 Ryan St., Lake Charles, LA 70601"},"assessor":{"name":"Calcasieu Parish Assessor","address":"1000 Ryan St., Lake Charles, LA 70601"}},"Caldwell Parish, LA":{"recorder":{"name":"Caldwell Parish Clerk of Court","address":"201 Main St. Suite 3, Columbia, LA 71418"},"assessor":{"name":"Caldwell Parish Assessor","address":"201 Main St. Suite 3, Columbia, LA 71418"}},"Cameron Parish, LA":{"recorder":{"name":"Cameron Parish Clerk of Court","address":"119 Smith Circle Suite 1, Cameron, LA 70631"},"assessor":{"name":"Cameron Parish Assessor","address":"119 Smith Circle Suite 1, Cameron, LA 70631"}},"Catahoula Parish, LA":{"recorder":{"name":"Catahoula Parish Clerk of Court","address":"301 Bushley St., Harrisonburg, LA 71340"},"assessor":{"name":"Catahoula Parish Assessor","address":"301 Bushley St., Harrisonburg, LA 71340"}},"Claiborne Parish, LA":{"recorder":{"name":"Claiborne Parish Clerk of Court","address":"512 E Main St., Homer, LA 71040"},"assessor":{"name":"Claiborne Parish Assessor","address":"512 E Main St., Homer, LA 71040"}},"Concordia Parish, LA":{"recorder":{"name":"Concordia Parish Clerk of Court","address":"4001 Carter St. Room 1, Vidalia, LA 71373"},"assessor":{"name":"Concordia Parish Assessor","address":"4001 Carter St. Room 1, Vidalia, LA 71373"}},"De Soto Parish, LA":{"recorder":{"name":"De Soto Parish Clerk of Court","address":"201 Texas St., Mansfield, LA 71052"},"assessor":{"name":"De Soto Parish Assessor","address":"201 Texas St., Mansfield, LA 71052"}},"East Baton Rouge Parish, LA":{"recorder":{"name":"East Baton Rouge Parish Clerk of Court","address":"222 St. Louis St. Room 238, Baton Rouge, LA 70802"},"assessor":{"name":"East Baton Rouge Parish Assessor","address":"222 St. Louis St. Room 126, Baton Rouge, LA 70802"}},"East Carroll Parish, LA":{"recorder":{"name":"East Carroll Parish Clerk of Court","address":"400 1st St., Lake Providence, LA 71254"},"assessor":{"name":"East Carroll Parish Assessor","address":"400 1st St., Lake Providence, LA 71254"}},"East Feliciana Parish, LA":{"recorder":{"name":"East Feliciana Parish Clerk of Court","address":"12305 St. Helena St., Clinton, LA 70722"},"assessor":{"name":"East Feliciana Parish Assessor","address":"12305 St. Helena St., Clinton, LA 70722"}},"Evangeline Parish, LA":{"recorder":{"name":"Evangeline Parish Clerk of Court","address":"200 Court St., Ville Platte, LA 70586"},"assessor":{"name":"Evangeline Parish Assessor","address":"200 Court St., Ville Platte, LA 70586"}},"Franklin Parish, LA":{"recorder":{"name":"Franklin Parish Clerk of Court","address":"6552 Main St., Winnsboro, LA 71295"},"assessor":{"name":"Franklin Parish Assessor","address":"6552 Main St., Winnsboro, LA 71295"}},"Grant Parish, LA":{"recorder":{"name":"Grant Parish Clerk of Court","address":"200 Main St. Suite 2, Colfax, LA 71417"},"assessor":{"name":"Grant Parish Assessor","address":"200 Main St. Suite 2, Colfax, LA 71417"}},"Iberia Parish, LA":{"recorder":{"name":"Iberia Parish Clerk of Court","address":"300 Iberia St. Suite 400, New Iberia, LA 70560"},"assessor":{"name":"Iberia Parish Assessor","address":"300 Iberia St. Suite 400, New Iberia, LA 70560"}},"Iberville Parish, LA":{"recorder":{"name":"Iberville Parish Clerk of Court","address":"58050 Meriam St., Plaquemine, LA 70764"},"assessor":{"name":"Iberville Parish Assessor","address":"58050 Meriam St., Plaquemine, LA 70764"}},"Jackson Parish, LA":{"recorder":{"name":"Jackson Parish Clerk of Court","address":"500 E Court St. Suite 101, Jonesboro, LA 71251"},"assessor":{"name":"Jackson Parish Assessor","address":"500 E Court St. Suite 101, Jonesboro, LA 71251"}},"Jefferson Parish, LA":{"recorder":{"name":"Jefferson Parish Clerk of Court","address":"200 Derbigny St. Suite 3200, Gretna, LA 70053"},"assessor":{"name":"Jefferson Parish Assessor","address":"200 Derbigny St. Suite 1100, Gretna, LA 70053"}},"Jefferson Davis Parish, LA":{"recorder":{"name":"Jefferson Davis Parish Clerk of Court","address":"300 N State St. Suite 103, Jennings, LA 70546"},"assessor":{"name":"Jefferson Davis Parish Assessor","address":"300 N State St. Suite 103, Jennings, LA 70546"}},"Lafayette Parish, LA":{"recorder":{"name":"Lafayette Parish Clerk of Court","address":"800 S Buchanan St., Lafayette, LA 70501"},"assessor":{"name":"Lafayette Parish Assessor","address":"1010 Lafayette St. Suite 402, Lafayette, LA 70501"}},"Lafourche Parish, LA":{"recorder":{"name":"Lafourche Parish Clerk of Court","address":"309 W 3rd St., Thibodaux, LA 70301"},"assessor":{"name":"Lafourche Parish Assessor","address":"403 Saint Mary St., Thibodaux, LA 70301"}},"LaSalle Parish, LA":{"recorder":{"name":"LaSalle Parish Clerk of Court","address":"14 Courthouse Square Suite 100, Jena, LA 71342"},"assessor":{"name":"LaSalle Parish Assessor","address":"14 Courthouse Square Suite 100, Jena, LA 71342"}},"Lincoln Parish, LA":{"recorder":{"name":"Lincoln Parish Clerk of Court","address":"100 W Texas Ave. Suite 200, Ruston, LA 71270"},"assessor":{"name":"Lincoln Parish Assessor","address":"100 W Texas Ave. Suite 200, Ruston, LA 71270"}},"Livingston Parish, LA":{"recorder":{"name":"Livingston Parish Clerk of Court","address":"20180 Iowa St., Livingston, LA 70754"},"assessor":{"name":"Livingston Parish Assessor","address":"20180 Iowa St., Livingston, LA 70754"}},"Madison Parish, LA":{"recorder":{"name":"Madison Parish Clerk of Court","address":"100 N Cedar St., Tallulah, LA 71282"},"assessor":{"name":"Madison Parish Assessor","address":"100 N Cedar St., Tallulah, LA 71282"}},"Morehouse Parish, LA":{"recorder":{"name":"Morehouse Parish Clerk of Court","address":"100 E Madison Ave. Suite 100, Bastrop, LA 71220"},"assessor":{"name":"Morehouse Parish Assessor","address":"100 E Madison Ave. Suite 100, Bastrop, LA 71220"}},"Natchitoches Parish, LA":{"recorder":{"name":"Natchitoches Parish Clerk of Court","address":"200 Church St. Suite 100, Natchitoches, LA 71457"},"assessor":{"name":"Natchitoches Parish Assessor","address":"200 Church St. Suite 100, Natchitoches, LA 71457"}},"Orleans Parish, LA":{"recorder":{"name":"Orleans Parish Clerk of Civil District Court","address":"421 Loyola Ave. Room 402, New Orleans, LA 70112"},"assessor":{"name":"Orleans Parish Assessor","address":"1300 Perdido St. Room 4E01, New Orleans, LA 70112"}},"Ouachita Parish, LA":{"recorder":{"name":"Ouachita Parish Clerk of Court","address":"300 St. John St. Room 101, Monroe, LA 71201"},"assessor":{"name":"Ouachita Parish Assessor","address":"300 St. John St. Room 101, Monroe, LA 71201"}},"Plaquemines Parish, LA":{"recorder":{"name":"Plaquemines Parish Clerk of Court","address":"301 Main St., Belle Chasse, LA 70037"},"assessor":{"name":"Plaquemines Parish Assessor","address":"301 Main St., Belle Chasse, LA 70037"}},"Pointe Coupee Parish, LA":{"recorder":{"name":"Pointe Coupee Parish Clerk of Court","address":"160 E Main St., New Roads, LA 70760"},"assessor":{"name":"Pointe Coupee Parish Assessor","address":"160 E Main St., New Roads, LA 70760"}},"Rapides Parish, LA":{"recorder":{"name":"Rapides Parish Clerk of Court","address":"701 Murray St. Suite 100, Alexandria, LA 71301"},"assessor":{"name":"Rapides Parish Assessor","address":"701 Murray St. Suite 101, Alexandria, LA 71301"}},"Red River Parish, LA":{"recorder":{"name":"Red River Parish Clerk of Court","address":"615 E Carroll St., Coushatta, LA 71019"},"assessor":{"name":"Red River Parish Assessor","address":"615 E Carroll St., Coushatta, LA 71019"}},"Richland Parish, LA":{"recorder":{"name":"Richland Parish Clerk of Court","address":"708 S Julia St. Suite 150, Rayville, LA 71269"},"assessor":{"name":"Richland Parish Assessor","address":"708 S Julia St. Suite 150, Rayville, LA 71269"}},"Sabine Parish, LA":{"recorder":{"name":"Sabine Parish Clerk of Court","address":"400 S Capitol St. Suite A, Many, LA 71449"},"assessor":{"name":"Sabine Parish Assessor","address":"400 S Capitol St. Suite A, Many, LA 71449"}},"St. Bernard Parish, LA":{"recorder":{"name":"St. Bernard Parish Clerk of Court","address":"8201 W Judge Perez Dr., Chalmette, LA 70043"},"assessor":{"name":"St. Bernard Parish Assessor","address":"8201 W Judge Perez Dr., Chalmette, LA 70043"}},"St. Charles Parish, LA":{"recorder":{"name":"St. Charles Parish Clerk of Court","address":"15045 River Rd., Hahnville, LA 70057"},"assessor":{"name":"St. Charles Parish Assessor","address":"15045 River Rd., Hahnville, LA 70057"}},"St. Helena Parish, LA":{"recorder":{"name":"St. Helena Parish Clerk of Court","address":"19845 Central Ave., Greensburg, LA 70441"},"assessor":{"name":"St. Helena Parish Assessor","address":"19845 Central Ave., Greensburg, LA 70441"}},"St. James Parish, LA":{"recorder":{"name":"St. James Parish Clerk of Court","address":"5800 Hwy 44, Convent, LA 70723"},"assessor":{"name":"St. James Parish Assessor","address":"5800 Hwy 44, Convent, LA 70723"}},"St. John the Baptist Parish, LA":{"recorder":{"name":"St. John the Baptist Parish Clerk of Court","address":"2393 Hwy 18 Suite 100, Edgard, LA 70049"},"assessor":{"name":"St. John the Baptist Parish Assessor","address":"2393 Hwy 18 Suite 100, Edgard, LA 70049"}},"St. Landry Parish, LA":{"recorder":{"name":"St. Landry Parish Clerk of Court","address":"118 N Court St., Opelousas, LA 70570"},"assessor":{"name":"St. Landry Parish Assessor","address":"118 N Court St., Opelousas, LA 70570"}},"St. Martin Parish, LA":{"recorder":{"name":"St. Martin Parish Clerk of Court","address":"415 S Main St., St. Martinville, LA 70582"},"assessor":{"name":"St. Martin Parish Assessor","address":"415 S Main St., St. Martinville, LA 70582"}},"St. Mary Parish, LA":{"recorder":{"name":"St. Mary Parish Clerk of Court","address":"500 Main St. Suite 1, Franklin, LA 70538"},"assessor":{"name":"St. Mary Parish Assessor","address":"500 Main St. Suite 1, Franklin, LA 70538"}},"St. Tammany Parish, LA":{"recorder":{"name":"St. Tammany Parish Clerk of Court","address":"701 N Columbia St., Covington, LA 70433"},"assessor":{"name":"St. Tammany Parish Assessor","address":"701 N Columbia St., Covington, LA 70433"}},"Tangipahoa Parish, LA":{"recorder":{"name":"Tangipahoa Parish Clerk of Court","address":"110 N Bay St. Suite 100, Amite City, LA 70422"},"assessor":{"name":"Tangipahoa Parish Assessor","address":"110 N Bay St. Suite 100, Amite City, LA 70422"}},"Tensas Parish, LA":{"recorder":{"name":"Tensas Parish Clerk of Court","address":"201 Courthouse Square, St. Joseph, LA 71366"},"assessor":{"name":"Tensas Parish Assessor","address":"201 Courthouse Square, St. Joseph, LA 71366"}},"Terrebonne Parish, LA":{"recorder":{"name":"Terrebonne Parish Clerk of Court","address":"301 Goode St., Houma, LA 70360"},"assessor":{"name":"Terrebonne Parish Assessor","address":"8026 Main St. Suite 501, Houma, LA 70360"}},"Union Parish, LA":{"recorder":{"name":"Union Parish Clerk of Court","address":"100 E Bayou St. Suite 103, Farmerville, LA 71241"},"assessor":{"name":"Union Parish Assessor","address":"100 E Bayou St. Suite 103, Farmerville, LA 71241"}},"Vermilion Parish, LA":{"recorder":{"name":"Vermilion Parish Clerk of Court","address":"100 N State St. Suite 101, Abbeville, LA 70510"},"assessor":{"name":"Vermilion Parish Assessor","address":"100 N State St. Suite 101, Abbeville, LA 70510"}},"Vernon Parish, LA":{"recorder":{"name":"Vernon Parish Clerk of Court","address":"201 S 3rd St. Suite 1, Leesville, LA 71446"},"assessor":{"name":"Vernon Parish Assessor","address":"201 S 3rd St. Suite 1, Leesville, LA 71446"}},"Washington Parish, LA":{"recorder":{"name":"Washington Parish Clerk of Court","address":"908 Washington St., Franklinton, LA 70438"},"assessor":{"name":"Washington Parish Assessor","address":"908 Washington St., Franklinton, LA 70438"}},"Webster Parish, LA":{"recorder":{"name":"Webster Parish Clerk of Court","address":"410 Main St., Minden, LA 71055"},"assessor":{"name":"Webster Parish Assessor","address":"410 Main St., Minden, LA 71055"}},"West Baton Rouge Parish, LA":{"recorder":{"name":"West Baton Rouge Parish Clerk of Court","address":"850 8th St., Port Allen, LA 70767"},"assessor":{"name":"West Baton Rouge Parish Assessor","address":"850 8th St., Port Allen, LA 70767"}},"West Carroll Parish, LA":{"recorder":{"name":"West Carroll Parish Clerk of Court","address":"305 E Main St., Oak Grove, LA 71263"},"assessor":{"name":"West Carroll Parish Assessor","address":"305 E Main St., Oak Grove, LA 71263"}},"West Feliciana Parish, LA":{"recorder":{"name":"West Feliciana Parish Clerk of Court","address":"4789 Prosperity St., St. Francisville, LA 70775"},"assessor":{"name":"West Feliciana Parish Assessor","address":"4789 Prosperity St., St. Francisville, LA 70775"}},"Winn Parish, LA":{"recorder":{"name":"Winn Parish Clerk of Court","address":"119 W Main St. Suite 101, Winnfield, LA 71483"},"assessor":{"name":"Winn Parish Assessor","address":"119 W Main St. Suite 101, Winnfield, LA 71483"}},"Barnstable County, MA":{"recorder":{"name":"Barnstable County Registry of Deeds","address":"3195 Main St., Barnstable, MA 02630"},"assessor":{"name":"Barnstable Town Assessor","address":"367 Main St., Hyannis, MA 02601"}},"Berkshire County, MA":{"recorder":{"name":"Berkshire County Registry of Deeds (Middle)","address":"44 Bank Row, Pittsfield, MA 01201"},"assessor":{"name":"Pittsfield Assessor","address":"70 Allen St., Pittsfield, MA 01201"}},"Bristol County, MA":{"recorder":{"name":"Bristol County Registry of Deeds (Northern)","address":"11 Court St., Taunton, MA 02780"},"assessor":{"name":"Taunton Assessor","address":"15 Summer St., Taunton, MA 02780"}},"Dukes County, MA":{"recorder":{"name":"Dukes County Registry of Deeds","address":"81 Main St., Edgartown, MA 02539"},"assessor":{"name":"Edgartown Assessor","address":"1 Veterans Memorial Way, Edgartown, MA 02539"}},"Essex County, MA":{"recorder":{"name":"Essex County Registry of Deeds (Northern)","address":"381 Common St., Lawrence, MA 01840"},"assessor":{"name":"Salem Assessor","address":"93 Washington St., Salem, MA 01970"}},"Franklin County, MA":{"recorder":{"name":"Franklin County Registry of Deeds","address":"425 Main St., Greenfield, MA 01301"},"assessor":{"name":"Greenfield Assessor","address":"14 Court Square, Greenfield, MA 01301"}},"Hampden County, MA":{"recorder":{"name":"Hampden County Registry of Deeds","address":"50 State St., Springfield, MA 01103"},"assessor":{"name":"Springfield Assessor","address":"36 Court St. Room 1006, Springfield, MA 01103"}},"Hampshire County, MA":{"recorder":{"name":"Hampshire County Registry of Deeds","address":"33 King St., Northampton, MA 01060"},"assessor":{"name":"Northampton Assessor","address":"212 Main St. Room 107, Northampton, MA 01060"}},"Middlesex County, MA":{"recorder":{"name":"Middlesex County Registry of Deeds (Northern)","address":"370 Jackson St., Lowell, MA 01852"},"assessor":{"name":"Cambridge Assessor","address":"795 Massachusetts Ave., Cambridge, MA 02139"}},"Nantucket County, MA":{"recorder":{"name":"Nantucket County Registry of Deeds","address":"16 Broad St., Nantucket, MA 02554"},"assessor":{"name":"Nantucket Assessor","address":"16 Broad St., Nantucket, MA 02554"}},"Norfolk County, MA":{"recorder":{"name":"Norfolk County Registry of Deeds","address":"649 High St., Dedham, MA 02026"},"assessor":{"name":"Dedham Assessor","address":"26 Bryant St., Dedham, MA 02026"}},"Plymouth County, MA":{"recorder":{"name":"Plymouth County Registry of Deeds","address":"7 Russell St., Plymouth, MA 02360"},"assessor":{"name":"Plymouth Assessor","address":"26 Court St., Plymouth, MA 02360"}},"Suffolk County, MA":{"recorder":{"name":"Suffolk County Registry of Deeds","address":"24 New Chardon St., Boston, MA 02114"},"assessor":{"name":"Boston Assessing Department","address":"1 City Hall Square Room 301, Boston, MA 02201"}},"Worcester County, MA":{"recorder":{"name":"Worcester County Registry of Deeds","address":"90 Front St., Worcester, MA 01608"},"assessor":{"name":"Worcester Assessor","address":"455 Main St. Room 209, Worcester, MA 01608"}},"Allegany County, MD":{"recorder":{"name":"Allegany County Circuit Court Clerk","address":"30 Washington St., Cumberland, MD 21502"},"assessor":{"name":"SDAT Allegany County Office","address":"30 Washington St. Suite 1000, Cumberland, MD 21502"}},"Anne Arundel County, MD":{"recorder":{"name":"Anne Arundel County Circuit Court Clerk","address":"8 Church Circle, Annapolis, MD 21401"},"assessor":{"name":"SDAT Anne Arundel County Office","address":"45 Calvert St., Annapolis, MD 21401"}},"Baltimore City, MD":{"recorder":{"name":"Baltimore City Circuit Court Clerk","address":"111 N Calvert St., Baltimore, MD 21202"},"assessor":{"name":"SDAT Baltimore City Office","address":"417 E Fayette St. Suite 1100, Baltimore, MD 21202"}},"Baltimore County, MD":{"recorder":{"name":"Baltimore County Circuit Court Clerk","address":"401 Bosley Ave., Towson, MD 21204"},"assessor":{"name":"SDAT Baltimore County Office","address":"6 E Chesapeake Ave., Towson, MD 21286"}},"Calvert County, MD":{"recorder":{"name":"Calvert County Circuit Court Clerk","address":"175 Main St., Prince Frederick, MD 20678"},"assessor":{"name":"SDAT Calvert County Office","address":"205 Main St., Prince Frederick, MD 20678"}},"Caroline County, MD":{"recorder":{"name":"Caroline County Circuit Court Clerk","address":"109 Market St. Suite 104, Denton, MD 21629"},"assessor":{"name":"SDAT Caroline County Office","address":"109 Market St., Denton, MD 21629"}},"Carroll County, MD":{"recorder":{"name":"Carroll County Circuit Court Clerk","address":"55 N Court St., Westminster, MD 21157"},"assessor":{"name":"SDAT Carroll County Office","address":"225 N Center St. Suite 110, Westminster, MD 21157"}},"Cecil County, MD":{"recorder":{"name":"Cecil County Circuit Court Clerk","address":"129 E Main St., Elkton, MD 21921"},"assessor":{"name":"SDAT Cecil County Office","address":"129 E Main St. Suite 116, Elkton, MD 21921"}},"Charles County, MD":{"recorder":{"name":"Charles County Circuit Court Clerk","address":"200 Charles St., La Plata, MD 20646"},"assessor":{"name":"SDAT Charles County Office","address":"200 Baltimore St., La Plata, MD 20646"}},"Dorchester County, MD":{"recorder":{"name":"Dorchester County Circuit Court Clerk","address":"206 High St., Cambridge, MD 21613"},"assessor":{"name":"SDAT Dorchester County Office","address":"501 Court Ln. Suite 102, Cambridge, MD 21613"}},"Frederick County, MD":{"recorder":{"name":"Frederick County Circuit Court Clerk","address":"100 W Patrick St., Frederick, MD 21701"},"assessor":{"name":"SDAT Frederick County Office","address":"100 W Patrick St. Suite 1400, Frederick, MD 21701"}},"Garrett County, MD":{"recorder":{"name":"Garrett County Circuit Court Clerk","address":"203 S 4th St. Suite 109, Oakland, MD 21550"},"assessor":{"name":"SDAT Garrett County Office","address":"203 S 4th St. Suite 210, Oakland, MD 21550"}},"Harford County, MD":{"recorder":{"name":"Harford County Circuit Court Clerk","address":"20 W Courtland St., Bel Air, MD 21014"},"assessor":{"name":"SDAT Harford County Office","address":"220 S Main St. Suite 101, Bel Air, MD 21014"}},"Howard County, MD":{"recorder":{"name":"Howard County Circuit Court Clerk","address":"8360 Court Ave., Ellicott City, MD 21043"},"assessor":{"name":"SDAT Howard County Office","address":"3430 Court House Dr., Ellicott City, MD 21043"}},"Kent County, MD":{"recorder":{"name":"Kent County Circuit Court Clerk","address":"103 N Cross St., Chestertown, MD 21620"},"assessor":{"name":"SDAT Kent County Office","address":"103 N Cross St., Chestertown, MD 21620"}},"Montgomery County, MD":{"recorder":{"name":"Montgomery County Circuit Court Clerk","address":"50 Maryland Ave. Room 322, Rockville, MD 20850"},"assessor":{"name":"SDAT Montgomery County Office","address":"30 W Gude Dr. Suite 400, Rockville, MD 20850"}},"Prince George's County, MD":{"recorder":{"name":"Prince George's County Circuit Court Clerk","address":"14735 Main St. Suite 178B, Upper Marlboro, MD 20772"},"assessor":{"name":"SDAT Prince George's County Office","address":"14735 Main St. Suite 356B, Upper Marlboro, MD 20772"}},"Queen Anne's County, MD":{"recorder":{"name":"Queen Anne's County Circuit Court Clerk","address":"100 Courthouse Square, Centreville, MD 21617"},"assessor":{"name":"SDAT Queen Anne's County Office","address":"107 N Liberty St., Centreville, MD 21617"}},"St. Mary's County, MD":{"recorder":{"name":"St. Mary's County Circuit Court Clerk","address":"41605 Courthouse Dr., Leonardtown, MD 20650"},"assessor":{"name":"SDAT St. Mary's County Office","address":"23150 Leonard Hall Dr. Suite 1100, Leonardtown, MD 20650"}},"Somerset County, MD":{"recorder":{"name":"Somerset County Circuit Court Clerk","address":"30512 Prince William St., Princess Anne, MD 21853"},"assessor":{"name":"SDAT Somerset County Office","address":"30512 Prince William St., Princess Anne, MD 21853"}},"Talbot County, MD":{"recorder":{"name":"Talbot County Circuit Court Clerk","address":"11 N Washington St., Easton, MD 21601"},"assessor":{"name":"SDAT Talbot County Office","address":"29 S Washington St., Easton, MD 21601"}},"Washington County, MD":{"recorder":{"name":"Washington County Circuit Court Clerk","address":"95 W Washington St., Hagerstown, MD 21740"},"assessor":{"name":"SDAT Washington County Office","address":"35 W Washington St. Suite 102, Hagerstown, MD 21740"}},"Wicomico County, MD":{"recorder":{"name":"Wicomico County Circuit Court Clerk","address":"101 N Division St., Salisbury, MD 21801"},"assessor":{"name":"SDAT Wicomico County Office","address":"201 Baptist St. Suite 27, Salisbury, MD 21801"}},"Worcester County, MD":{"recorder":{"name":"Worcester County Circuit Court Clerk","address":"One W Market St. Room 1021, Snow Hill, MD 21863"},"assessor":{"name":"SDAT Worcester County Office","address":"1 W Market St. Room 1102, Snow Hill, MD 21863"}},"Androscoggin County, ME":{"recorder":{"name":"Androscoggin County Register of Deeds","address":"2 Turner St. Unit 4, Auburn, ME 04210"},"assessor":{"name":"Androscoggin County Assessment","address":"2 Turner St., Auburn, ME 04210"}},"Aroostook County, ME":{"recorder":{"name":"Aroostook County Register of Deeds","address":"144 Sweden St. Suite 1, Caribou, ME 04736"},"assessor":{"name":"Aroostook County Assessment","address":"144 Sweden St. Suite 1, Caribou, ME 04736"}},"Cumberland County, ME":{"recorder":{"name":"Cumberland County Register of Deeds","address":"1 Courthouse Square, Portland, ME 04101"},"assessor":{"name":"Portland City Assessor","address":"389 Congress St. Room 115, Portland, ME 04101"}},"Franklin County, ME":{"recorder":{"name":"Franklin County Register of Deeds","address":"38 Main St., Farmington, ME 04938"},"assessor":{"name":"Franklin County Assessment","address":"38 Main St., Farmington, ME 04938"}},"Hancock County, ME":{"recorder":{"name":"Hancock County Register of Deeds","address":"50 State St. Suite 4, Ellsworth, ME 04605"},"assessor":{"name":"Hancock County Assessment","address":"50 State St. Suite 4, Ellsworth, ME 04605"}},"Kennebec County, ME":{"recorder":{"name":"Kennebec County Register of Deeds","address":"125 State St., Augusta, ME 04330"},"assessor":{"name":"Augusta City Assessor","address":"16 Cony St., Augusta, ME 04330"}},"Knox County, ME":{"recorder":{"name":"Knox County Register of Deeds","address":"62 Union St., Rockland, ME 04841"},"assessor":{"name":"Knox County Assessment","address":"62 Union St., Rockland, ME 04841"}},"Lincoln County, ME":{"recorder":{"name":"Lincoln County Register of Deeds","address":"32 High St., Wiscasset, ME 04578"},"assessor":{"name":"Lincoln County Assessment","address":"32 High St., Wiscasset, ME 04578"}},"Oxford County, ME":{"recorder":{"name":"Oxford County Register of Deeds","address":"26 Western Ave., South Paris, ME 04281"},"assessor":{"name":"Oxford County Assessment","address":"26 Western Ave., South Paris, ME 04281"}},"Penobscot County, ME":{"recorder":{"name":"Penobscot County Register of Deeds","address":"97 Hammond St., Bangor, ME 04401"},"assessor":{"name":"Bangor City Assessor","address":"73 Harlow St., Bangor, ME 04401"}},"Piscataquis County, ME":{"recorder":{"name":"Piscataquis County Register of Deeds","address":"51 E Main St., Dover-Foxcroft, ME 04426"},"assessor":{"name":"Piscataquis County Assessment","address":"51 E Main St., Dover-Foxcroft, ME 04426"}},"Sagadahoc County, ME":{"recorder":{"name":"Sagadahoc County Register of Deeds","address":"752 High St., Bath, ME 04530"},"assessor":{"name":"Bath City Assessor","address":"55 Front St., Bath, ME 04530"}},"Somerset County, ME":{"recorder":{"name":"Somerset County Register of Deeds","address":"41 Court St., Skowhegan, ME 04976"},"assessor":{"name":"Somerset County Assessment","address":"41 Court St., Skowhegan, ME 04976"}},"Waldo County, ME":{"recorder":{"name":"Waldo County Register of Deeds","address":"137 Church St., Belfast, ME 04915"},"assessor":{"name":"Waldo County Assessment","address":"137 Church St., Belfast, ME 04915"}},"Washington County, ME":{"recorder":{"name":"Washington County Register of Deeds","address":"85 Court St. Suite 4, Machias, ME 04654"},"assessor":{"name":"Washington County Assessment","address":"85 Court St. Suite 4, Machias, ME 04654"}},"York County, ME":{"recorder":{"name":"York County Register of Deeds","address":"45 Kennebunk Rd., Alfred, ME 04002"},"assessor":{"name":"York County Assessment","address":"45 Kennebunk Rd., Alfred, ME 04002"}},"Alcona County, MI":{"recorder":{"name":"Alcona County Register of Deeds","address":"106 5th St., Harrisville, MI 48740"},"assessor":{"name":"Alcona County Equalization","address":"106 5th St., Harrisville, MI 48740"}},"Alger County, MI":{"recorder":{"name":"Alger County Register of Deeds","address":"101 Court St., Munising, MI 49862"},"assessor":{"name":"Alger County Equalization","address":"101 Court St., Munising, MI 49862"}},"Allegan County, MI":{"recorder":{"name":"Allegan County Register of Deeds","address":"113 Chestnut St., Allegan, MI 49010"},"assessor":{"name":"Allegan County Equalization","address":"113 Chestnut St., Allegan, MI 49010"}},"Alpena County, MI":{"recorder":{"name":"Alpena County Register of Deeds","address":"720 W Chisholm St., Alpena, MI 49707"},"assessor":{"name":"Alpena County Equalization","address":"720 W Chisholm St., Alpena, MI 49707"}},"Antrim County, MI":{"recorder":{"name":"Antrim County Register of Deeds","address":"203 E Cayuga St., Bellaire, MI 49615"},"assessor":{"name":"Antrim County Equalization","address":"203 E Cayuga St., Bellaire, MI 49615"}},"Arenac County, MI":{"recorder":{"name":"Arenac County Register of Deeds","address":"120 N Grove St., Standish, MI 48658"},"assessor":{"name":"Arenac County Equalization","address":"120 N Grove St., Standish, MI 48658"}},"Baraga County, MI":{"recorder":{"name":"Baraga County Register of Deeds","address":"16 N 3rd St., L'Anse, MI 49946"},"assessor":{"name":"Baraga County Equalization","address":"16 N 3rd St., L'Anse, MI 49946"}},"Barry County, MI":{"recorder":{"name":"Barry County Register of Deeds","address":"220 W State St., Hastings, MI 49058"},"assessor":{"name":"Barry County Equalization","address":"220 W State St., Hastings, MI 49058"}},"Bay County, MI":{"recorder":{"name":"Bay County Register of Deeds","address":"515 Center Ave., Bay City, MI 48708"},"assessor":{"name":"Bay County Equalization","address":"515 Center Ave., Bay City, MI 48708"}},"Benzie County, MI":{"recorder":{"name":"Benzie County Register of Deeds","address":"448 Court Pl., Beulah, MI 49617"},"assessor":{"name":"Benzie County Equalization","address":"448 Court Pl., Beulah, MI 49617"}},"Berrien County, MI":{"recorder":{"name":"Berrien County Register of Deeds","address":"811 Port St., St. Joseph, MI 49085"},"assessor":{"name":"Berrien County Equalization","address":"811 Port St., St. Joseph, MI 49085"}},"Branch County, MI":{"recorder":{"name":"Branch County Register of Deeds","address":"31 Division St., Coldwater, MI 49036"},"assessor":{"name":"Branch County Equalization","address":"31 Division St., Coldwater, MI 49036"}},"Calhoun County, MI":{"recorder":{"name":"Calhoun County Register of Deeds","address":"315 W Green St., Marshall, MI 49068"},"assessor":{"name":"Calhoun County Equalization","address":"315 W Green St., Marshall, MI 49068"}},"Cass County, MI":{"recorder":{"name":"Cass County Register of Deeds","address":"120 N Broadway St., Cassopolis, MI 49031"},"assessor":{"name":"Cass County Equalization","address":"120 N Broadway St., Cassopolis, MI 49031"}},"Charlevoix County, MI":{"recorder":{"name":"Charlevoix County Register of Deeds","address":"203 Antrim St., Charlevoix, MI 49720"},"assessor":{"name":"Charlevoix County Equalization","address":"203 Antrim St., Charlevoix, MI 49720"}},"Cheboygan County, MI":{"recorder":{"name":"Cheboygan County Register of Deeds","address":"870 S Main St., Cheboygan, MI 49721"},"assessor":{"name":"Cheboygan County Equalization","address":"870 S Main St., Cheboygan, MI 49721"}},"Chippewa County, MI":{"recorder":{"name":"Chippewa County Register of Deeds","address":"319 Court St., Sault Ste. Marie, MI 49783"},"assessor":{"name":"Chippewa County Equalization","address":"319 Court St., Sault Ste. Marie, MI 49783"}},"Clare County, MI":{"recorder":{"name":"Clare County Register of Deeds","address":"225 W Main St., Harrison, MI 48625"},"assessor":{"name":"Clare County Equalization","address":"225 W Main St., Harrison, MI 48625"}},"Clinton County, MI":{"recorder":{"name":"Clinton County Register of Deeds","address":"100 E State St. Suite 2400, St. Johns, MI 48879"},"assessor":{"name":"Clinton County Equalization","address":"100 E State St. Suite 2400, St. Johns, MI 48879"}},"Crawford County, MI":{"recorder":{"name":"Crawford County Register of Deeds","address":"200 W Michigan Ave., Grayling, MI 49738"},"assessor":{"name":"Crawford County Equalization","address":"200 W Michigan Ave., Grayling, MI 49738"}},"Delta County, MI":{"recorder":{"name":"Delta County Register of Deeds","address":"310 Ludington St., Escanaba, MI 49829"},"assessor":{"name":"Delta County Equalization","address":"310 Ludington St., Escanaba, MI 49829"}},"Dickinson County, MI":{"recorder":{"name":"Dickinson County Register of Deeds","address":"705 S Stephenson Ave., Iron Mountain, MI 49801"},"assessor":{"name":"Dickinson County Equalization","address":"705 S Stephenson Ave., Iron Mountain, MI 49801"}},"Eaton County, MI":{"recorder":{"name":"Eaton County Register of Deeds","address":"1045 Independence Blvd., Charlotte, MI 48813"},"assessor":{"name":"Eaton County Equalization","address":"1045 Independence Blvd., Charlotte, MI 48813"}},"Emmet County, MI":{"recorder":{"name":"Emmet County Register of Deeds","address":"200 Division St., Petoskey, MI 49770"},"assessor":{"name":"Emmet County Equalization","address":"200 Division St., Petoskey, MI 49770"}},"Genesee County, MI":{"recorder":{"name":"Genesee County Register of Deeds","address":"1101 Beach St., Flint, MI 48502"},"assessor":{"name":"Genesee County Equalization","address":"1101 Beach St., Flint, MI 48502"}},"Gladwin County, MI":{"recorder":{"name":"Gladwin County Register of Deeds","address":"401 W Cedar Ave., Gladwin, MI 48624"},"assessor":{"name":"Gladwin County Equalization","address":"401 W Cedar Ave., Gladwin, MI 48624"}},"Gogebic County, MI":{"recorder":{"name":"Gogebic County Register of Deeds","address":"200 N Moore St., Bessemer, MI 49911"},"assessor":{"name":"Gogebic County Equalization","address":"200 N Moore St., Bessemer, MI 49911"}},"Grand Traverse County, MI":{"recorder":{"name":"Grand Traverse County Register of Deeds","address":"400 Boardman Ave., Traverse City, MI 49684"},"assessor":{"name":"Grand Traverse County Equalization","address":"400 Boardman Ave., Traverse City, MI 49684"}},"Gratiot County, MI":{"recorder":{"name":"Gratiot County Register of Deeds","address":"214 E Center St., Ithaca, MI 48847"},"assessor":{"name":"Gratiot County Equalization","address":"214 E Center St., Ithaca, MI 48847"}},"Hillsdale County, MI":{"recorder":{"name":"Hillsdale County Register of Deeds","address":"29 N Howell St., Hillsdale, MI 49242"},"assessor":{"name":"Hillsdale County Equalization","address":"29 N Howell St., Hillsdale, MI 49242"}},"Houghton County, MI":{"recorder":{"name":"Houghton County Register of Deeds","address":"401 E Houghton Ave., Houghton, MI 49931"},"assessor":{"name":"Houghton County Equalization","address":"401 E Houghton Ave., Houghton, MI 49931"}},"Huron County, MI":{"recorder":{"name":"Huron County Register of Deeds","address":"250 E Huron Ave., Bad Axe, MI 48413"},"assessor":{"name":"Huron County Equalization","address":"250 E Huron Ave., Bad Axe, MI 48413"}},"Ingham County, MI":{"recorder":{"name":"Ingham County Register of Deeds","address":"341 S Jefferson St., Mason, MI 48854"},"assessor":{"name":"Ingham County Equalization","address":"341 S Jefferson St., Mason, MI 48854"}},"Ionia County, MI":{"recorder":{"name":"Ionia County Register of Deeds","address":"100 W Main St., Ionia, MI 48846"},"assessor":{"name":"Ionia County Equalization","address":"100 W Main St., Ionia, MI 48846"}},"Iosco County, MI":{"recorder":{"name":"Iosco County Register of Deeds","address":"422 W Lake St., Tawas City, MI 48763"},"assessor":{"name":"Iosco County Equalization","address":"422 W Lake St., Tawas City, MI 48763"}},"Iron County, MI":{"recorder":{"name":"Iron County Register of Deeds","address":"2 S 6th Ave., Crystal Falls, MI 49920"},"assessor":{"name":"Iron County Equalization","address":"2 S 6th Ave., Crystal Falls, MI 49920"}},"Isabella County, MI":{"recorder":{"name":"Isabella County Register of Deeds","address":"200 N Main St., Mount Pleasant, MI 48858"},"assessor":{"name":"Isabella County Equalization","address":"200 N Main St., Mount Pleasant, MI 48858"}},"Jackson County, MI":{"recorder":{"name":"Jackson County Register of Deeds","address":"120 W Michigan Ave., Jackson, MI 49201"},"assessor":{"name":"Jackson County Equalization","address":"120 W Michigan Ave., Jackson, MI 49201"}},"Kalamazoo County, MI":{"recorder":{"name":"Kalamazoo County Register of Deeds","address":"201 W Kalamazoo Ave., Kalamazoo, MI 49007"},"assessor":{"name":"Kalamazoo County Equalization","address":"201 W Kalamazoo Ave., Kalamazoo, MI 49007"}},"Kalkaska County, MI":{"recorder":{"name":"Kalkaska County Register of Deeds","address":"605 N Birch St., Kalkaska, MI 49646"},"assessor":{"name":"Kalkaska County Equalization","address":"605 N Birch St., Kalkaska, MI 49646"}},"Kent County, MI":{"recorder":{"name":"Kent County Register of Deeds","address":"300 Monroe Ave. NW, Grand Rapids, MI 49503"},"assessor":{"name":"Kent County Equalization","address":"300 Monroe Ave. NW, Grand Rapids, MI 49503"}},"Keweenaw County, MI":{"recorder":{"name":"Keweenaw County Register of Deeds","address":"5095 4th St., Eagle River, MI 49950"},"assessor":{"name":"Keweenaw County Equalization","address":"5095 4th St., Eagle River, MI 49950"}},"Lake County, MI":{"recorder":{"name":"Lake County Register of Deeds","address":"800 10th St., Baldwin, MI 49304"},"assessor":{"name":"Lake County Equalization","address":"800 10th St., Baldwin, MI 49304"}},"Lapeer County, MI":{"recorder":{"name":"Lapeer County Register of Deeds","address":"255 Clay St., Lapeer, MI 48446"},"assessor":{"name":"Lapeer County Equalization","address":"255 Clay St., Lapeer, MI 48446"}},"Leelanau County, MI":{"recorder":{"name":"Leelanau County Register of Deeds","address":"8527 E Government Center Dr., Suttons Bay, MI 49682"},"assessor":{"name":"Leelanau County Equalization","address":"8527 E Government Center Dr., Suttons Bay, MI 49682"}},"Lenawee County, MI":{"recorder":{"name":"Lenawee County Register of Deeds","address":"301 N Main St., Adrian, MI 49221"},"assessor":{"name":"Lenawee County Equalization","address":"301 N Main St., Adrian, MI 49221"}},"Livingston County, MI":{"recorder":{"name":"Livingston County Register of Deeds","address":"200 E Grand River Ave., Howell, MI 48843"},"assessor":{"name":"Livingston County Equalization","address":"200 E Grand River Ave., Howell, MI 48843"}},"Luce County, MI":{"recorder":{"name":"Luce County Register of Deeds","address":"407 W Harrie St., Newberry, MI 49868"},"assessor":{"name":"Luce County Equalization","address":"407 W Harrie St., Newberry, MI 49868"}},"Mackinac County, MI":{"recorder":{"name":"Mackinac County Register of Deeds","address":"100 S Marley St., St. Ignace, MI 49781"},"assessor":{"name":"Mackinac County Equalization","address":"100 S Marley St., St. Ignace, MI 49781"}},"Macomb County, MI":{"recorder":{"name":"Macomb County Register of Deeds","address":"120 N Main St., Mount Clemens, MI 48043"},"assessor":{"name":"Macomb County Equalization","address":"120 N Main St., Mount Clemens, MI 48043"}},"Manistee County, MI":{"recorder":{"name":"Manistee County Register of Deeds","address":"415 3rd St., Manistee, MI 49660"},"assessor":{"name":"Manistee County Equalization","address":"415 3rd St., Manistee, MI 49660"}},"Marquette County, MI":{"recorder":{"name":"Marquette County Register of Deeds","address":"234 W Baraga Ave., Marquette, MI 49855"},"assessor":{"name":"Marquette County Equalization","address":"234 W Baraga Ave., Marquette, MI 49855"}},"Mason County, MI":{"recorder":{"name":"Mason County Register of Deeds","address":"304 E Ludington Ave., Ludington, MI 49431"},"assessor":{"name":"Mason County Equalization","address":"304 E Ludington Ave., Ludington, MI 49431"}},"Mecosta County, MI":{"recorder":{"name":"Mecosta County Register of Deeds","address":"400 Elm St., Big Rapids, MI 49307"},"assessor":{"name":"Mecosta County Equalization","address":"400 Elm St., Big Rapids, MI 49307"}},"Menominee County, MI":{"recorder":{"name":"Menominee County Register of Deeds","address":"839 10th Ave., Menominee, MI 49858"},"assessor":{"name":"Menominee County Equalization","address":"839 10th Ave., Menominee, MI 49858"}},"Midland County, MI":{"recorder":{"name":"Midland County Register of Deeds","address":"220 W Ellsworth St., Midland, MI 48640"},"assessor":{"name":"Midland County Equalization","address":"220 W Ellsworth St., Midland, MI 48640"}},"Missaukee County, MI":{"recorder":{"name":"Missaukee County Register of Deeds","address":"111 S Canal St., Lake City, MI 49651"},"assessor":{"name":"Missaukee County Equalization","address":"111 S Canal St., Lake City, MI 49651"}},"Monroe County, MI":{"recorder":{"name":"Monroe County Register of Deeds","address":"125 E Second St., Monroe, MI 48161"},"assessor":{"name":"Monroe County Equalization","address":"125 E Second St., Monroe, MI 48161"}},"Montcalm County, MI":{"recorder":{"name":"Montcalm County Register of Deeds","address":"211 W Main St., Stanton, MI 48888"},"assessor":{"name":"Montcalm County Equalization","address":"211 W Main St., Stanton, MI 48888"}},"Montmorency County, MI":{"recorder":{"name":"Montmorency County Register of Deeds","address":"12265 M-32, Atlanta, MI 49709"},"assessor":{"name":"Montmorency County Equalization","address":"12265 M-32, Atlanta, MI 49709"}},"Muskegon County, MI":{"recorder":{"name":"Muskegon County Register of Deeds","address":"990 Terrace St., Muskegon, MI 49442"},"assessor":{"name":"Muskegon County Equalization","address":"990 Terrace St., Muskegon, MI 49442"}},"Newaygo County, MI":{"recorder":{"name":"Newaygo County Register of Deeds","address":"1087 Newell St., White Cloud, MI 49349"},"assessor":{"name":"Newaygo County Equalization","address":"1087 Newell St., White Cloud, MI 49349"}},"Oakland County, MI":{"recorder":{"name":"Oakland County Register of Deeds","address":"1200 N Telegraph Rd., Pontiac, MI 48341"},"assessor":{"name":"Oakland County Equalization","address":"1200 N Telegraph Rd., Pontiac, MI 48341"}},"Oceana County, MI":{"recorder":{"name":"Oceana County Register of Deeds","address":"100 S State St., Hart, MI 49420"},"assessor":{"name":"Oceana County Equalization","address":"100 S State St., Hart, MI 49420"}},"Ogemaw County, MI":{"recorder":{"name":"Ogemaw County Register of Deeds","address":"806 W Houghton Ave., West Branch, MI 48661"},"assessor":{"name":"Ogemaw County Equalization","address":"806 W Houghton Ave., West Branch, MI 48661"}},"Ontonagon County, MI":{"recorder":{"name":"Ontonagon County Register of Deeds","address":"725 Greenland Rd., Ontonagon, MI 49953"},"assessor":{"name":"Ontonagon County Equalization","address":"725 Greenland Rd., Ontonagon, MI 49953"}},"Osceola County, MI":{"recorder":{"name":"Osceola County Register of Deeds","address":"301 W Upton Ave., Reed City, MI 49677"},"assessor":{"name":"Osceola County Equalization","address":"301 W Upton Ave., Reed City, MI 49677"}},"Oscoda County, MI":{"recorder":{"name":"Oscoda County Register of Deeds","address":"311 Morenci Ave., Mio, MI 48647"},"assessor":{"name":"Oscoda County Equalization","address":"311 Morenci Ave., Mio, MI 48647"}},"Otsego County, MI":{"recorder":{"name":"Otsego County Register of Deeds","address":"225 W Main St., Gaylord, MI 49735"},"assessor":{"name":"Otsego County Equalization","address":"225 W Main St., Gaylord, MI 49735"}},"Ottawa County, MI":{"recorder":{"name":"Ottawa County Register of Deeds","address":"414 Washington Ave., Grand Haven, MI 49417"},"assessor":{"name":"Ottawa County Equalization","address":"414 Washington Ave., Grand Haven, MI 49417"}},"Presque Isle County, MI":{"recorder":{"name":"Presque Isle County Register of Deeds","address":"151 E Huron Ave., Rogers City, MI 49779"},"assessor":{"name":"Presque Isle County Equalization","address":"151 E Huron Ave., Rogers City, MI 49779"}},"Roscommon County, MI":{"recorder":{"name":"Roscommon County Register of Deeds","address":"500 Lake St., Roscommon, MI 48653"},"assessor":{"name":"Roscommon County Equalization","address":"500 Lake St., Roscommon, MI 48653"}},"Saginaw County, MI":{"recorder":{"name":"Saginaw County Register of Deeds","address":"111 S Michigan Ave., Saginaw, MI 48602"},"assessor":{"name":"Saginaw County Equalization","address":"111 S Michigan Ave., Saginaw, MI 48602"}},"St. Clair County, MI":{"recorder":{"name":"St. Clair County Register of Deeds","address":"201 McMorran Blvd., Port Huron, MI 48060"},"assessor":{"name":"St. Clair County Equalization","address":"201 McMorran Blvd., Port Huron, MI 48060"}},"St. Joseph County, MI":{"recorder":{"name":"St. Joseph County Register of Deeds","address":"125 W Main St., Centreville, MI 49032"},"assessor":{"name":"St. Joseph County Equalization","address":"125 W Main St., Centreville, MI 49032"}},"Sanilac County, MI":{"recorder":{"name":"Sanilac County Register of Deeds","address":"60 W Sanilac Ave., Sandusky, MI 48471"},"assessor":{"name":"Sanilac County Equalization","address":"60 W Sanilac Ave., Sandusky, MI 48471"}},"Schoolcraft County, MI":{"recorder":{"name":"Schoolcraft County Register of Deeds","address":"300 Walnut St., Manistique, MI 49854"},"assessor":{"name":"Schoolcraft County Equalization","address":"300 Walnut St., Manistique, MI 49854"}},"Shiawassee County, MI":{"recorder":{"name":"Shiawassee County Register of Deeds","address":"208 N Shiawassee St., Corunna, MI 48817"},"assessor":{"name":"Shiawassee County Equalization","address":"208 N Shiawassee St., Corunna, MI 48817"}},"Tuscola County, MI":{"recorder":{"name":"Tuscola County Register of Deeds","address":"440 N State St., Caro, MI 48723"},"assessor":{"name":"Tuscola County Equalization","address":"440 N State St., Caro, MI 48723"}},"Van Buren County, MI":{"recorder":{"name":"Van Buren County Register of Deeds","address":"212 E Paw Paw St., Paw Paw, MI 49079"},"assessor":{"name":"Van Buren County Equalization","address":"212 E Paw Paw St., Paw Paw, MI 49079"}},"Washtenaw County, MI":{"recorder":{"name":"Washtenaw County Register of Deeds","address":"200 N Main St., Ann Arbor, MI 48107"},"assessor":{"name":"Washtenaw County Equalization","address":"200 N Main St., Ann Arbor, MI 48107"}},"Wayne County, MI":{"recorder":{"name":"Wayne County Register of Deeds","address":"400 Monroe St. Suite 510, Detroit, MI 48226"},"assessor":{"name":"Wayne County Equalization","address":"400 Monroe St. Suite 510, Detroit, MI 48226"}},"Wexford County, MI":{"recorder":{"name":"Wexford County Register of Deeds","address":"437 E Division St., Cadillac, MI 49601"},"assessor":{"name":"Wexford County Equalization","address":"437 E Division St., Cadillac, MI 49601"}},"Aitkin County, MN":{"recorder":{"name":"Aitkin County Recorder","address":"209 2nd St NW, Aitkin, MN 56431"},"assessor":{"name":"Aitkin County Assessor","address":"209 2nd St NW, Aitkin, MN 56431"}},"Anoka County, MN":{"recorder":{"name":"Anoka County Recorder","address":"2100 3rd Ave. Suite 160, Anoka, MN 55303"},"assessor":{"name":"Anoka County Assessor","address":"2100 3rd Ave. Suite 230, Anoka, MN 55303"}},"Becker County, MN":{"recorder":{"name":"Becker County Recorder","address":"915 Lake Ave., Detroit Lakes, MN 56501"},"assessor":{"name":"Becker County Assessor","address":"915 Lake Ave., Detroit Lakes, MN 56501"}},"Beltrami County, MN":{"recorder":{"name":"Beltrami County Recorder","address":"701 Minnesota Ave NW, Bemidji, MN 56601"},"assessor":{"name":"Beltrami County Assessor","address":"701 Minnesota Ave NW, Bemidji, MN 56601"}},"Benton County, MN":{"recorder":{"name":"Benton County Recorder","address":"531 Dewey St., Foley, MN 56329"},"assessor":{"name":"Benton County Assessor","address":"531 Dewey St., Foley, MN 56329"}},"Big Stone County, MN":{"recorder":{"name":"Big Stone County Recorder","address":"20 SE 2nd St., Ortonville, MN 56278"},"assessor":{"name":"Big Stone County Assessor","address":"20 SE 2nd St., Ortonville, MN 56278"}},"Blue Earth County, MN":{"recorder":{"name":"Blue Earth County Recorder","address":"410 S 5th St., Mankato, MN 56001"},"assessor":{"name":"Blue Earth County Assessor","address":"410 S 5th St., Mankato, MN 56001"}},"Brown County, MN":{"recorder":{"name":"Brown County Recorder","address":"14 S State St., New Ulm, MN 56073"},"assessor":{"name":"Brown County Assessor","address":"14 S State St., New Ulm, MN 56073"}},"Carlton County, MN":{"recorder":{"name":"Carlton County Recorder","address":"301 Walnut Ave., Carlton, MN 55718"},"assessor":{"name":"Carlton County Assessor","address":"301 Walnut Ave., Carlton, MN 55718"}},"Carver County, MN":{"recorder":{"name":"Carver County Recorder","address":"600 E 4th St., Chaska, MN 55318"},"assessor":{"name":"Carver County Assessor","address":"600 E 4th St., Chaska, MN 55318"}},"Cass County, MN":{"recorder":{"name":"Cass County Recorder","address":"303 Minnesota Ave W, Walker, MN 56484"},"assessor":{"name":"Cass County Assessor","address":"303 Minnesota Ave W, Walker, MN 56484"}},"Chippewa County, MN":{"recorder":{"name":"Chippewa County Recorder","address":"629 N 11th St., Montevideo, MN 56265"},"assessor":{"name":"Chippewa County Assessor","address":"629 N 11th St., Montevideo, MN 56265"}},"Chisago County, MN":{"recorder":{"name":"Chisago County Recorder","address":"313 N Main St., Center City, MN 55012"},"assessor":{"name":"Chisago County Assessor","address":"313 N Main St., Center City, MN 55012"}},"Clay County, MN":{"recorder":{"name":"Clay County Recorder","address":"807 11th St N, Moorhead, MN 56560"},"assessor":{"name":"Clay County Assessor","address":"807 11th St N, Moorhead, MN 56560"}},"Clearwater County, MN":{"recorder":{"name":"Clearwater County Recorder","address":"213 Main Ave N, Bagley, MN 56621"},"assessor":{"name":"Clearwater County Assessor","address":"213 Main Ave N, Bagley, MN 56621"}},"Cook County, MN":{"recorder":{"name":"Cook County Recorder","address":"411 W 2nd St., Grand Marais, MN 55604"},"assessor":{"name":"Cook County Assessor","address":"411 W 2nd St., Grand Marais, MN 55604"}},"Cottonwood County, MN":{"recorder":{"name":"Cottonwood County Recorder","address":"900 3rd Ave., Windom, MN 56101"},"assessor":{"name":"Cottonwood County Assessor","address":"900 3rd Ave., Windom, MN 56101"}},"Crow Wing County, MN":{"recorder":{"name":"Crow Wing County Recorder","address":"326 Laurel St., Brainerd, MN 56401"},"assessor":{"name":"Crow Wing County Assessor","address":"326 Laurel St., Brainerd, MN 56401"}},"Dakota County, MN":{"recorder":{"name":"Dakota County Recorder","address":"1590 W Hwy 55, Hastings, MN 55033"},"assessor":{"name":"Dakota County Assessor","address":"1590 W Hwy 55, Hastings, MN 55033"}},"Dodge County, MN":{"recorder":{"name":"Dodge County Recorder","address":"22 E 6th St., Mantorville, MN 55955"},"assessor":{"name":"Dodge County Assessor","address":"22 E 6th St., Mantorville, MN 55955"}},"Douglas County, MN":{"recorder":{"name":"Douglas County Recorder","address":"305 8th Ave W, Alexandria, MN 56308"},"assessor":{"name":"Douglas County Assessor","address":"305 8th Ave W, Alexandria, MN 56308"}},"Faribault County, MN":{"recorder":{"name":"Faribault County Recorder","address":"415 N Main St., Blue Earth, MN 56013"},"assessor":{"name":"Faribault County Assessor","address":"415 N Main St., Blue Earth, MN 56013"}},"Fillmore County, MN":{"recorder":{"name":"Fillmore County Recorder","address":"101 Fillmore St., Preston, MN 55965"},"assessor":{"name":"Fillmore County Assessor","address":"101 Fillmore St., Preston, MN 55965"}},"Freeborn County, MN":{"recorder":{"name":"Freeborn County Recorder","address":"411 S Broadway Ave., Albert Lea, MN 56007"},"assessor":{"name":"Freeborn County Assessor","address":"411 S Broadway Ave., Albert Lea, MN 56007"}},"Goodhue County, MN":{"recorder":{"name":"Goodhue County Recorder","address":"509 W 5th St., Red Wing, MN 55066"},"assessor":{"name":"Goodhue County Assessor","address":"509 W 5th St., Red Wing, MN 55066"}},"Grant County, MN":{"recorder":{"name":"Grant County Recorder","address":"10 2nd St NE, Elbow Lake, MN 56531"},"assessor":{"name":"Grant County Assessor","address":"10 2nd St NE, Elbow Lake, MN 56531"}},"Hennepin County, MN":{"recorder":{"name":"Hennepin County Recorder","address":"300 S 6th St. Suite A-703, Minneapolis, MN 55487"},"assessor":{"name":"Hennepin County Assessor","address":"300 S 6th St. Suite A-2103, Minneapolis, MN 55487"}},"Houston County, MN":{"recorder":{"name":"Houston County Recorder","address":"304 S Marshall St., Caledonia, MN 55921"},"assessor":{"name":"Houston County Assessor","address":"304 S Marshall St., Caledonia, MN 55921"}},"Hubbard County, MN":{"recorder":{"name":"Hubbard County Recorder","address":"301 Court Ave., Park Rapids, MN 56470"},"assessor":{"name":"Hubbard County Assessor","address":"301 Court Ave., Park Rapids, MN 56470"}},"Isanti County, MN":{"recorder":{"name":"Isanti County Recorder","address":"555 18th Ave SW, Cambridge, MN 55008"},"assessor":{"name":"Isanti County Assessor","address":"555 18th Ave SW, Cambridge, MN 55008"}},"Itasca County, MN":{"recorder":{"name":"Itasca County Recorder","address":"123 NE 4th St., Grand Rapids, MN 55744"},"assessor":{"name":"Itasca County Assessor","address":"123 NE 4th St., Grand Rapids, MN 55744"}},"Jackson County, MN":{"recorder":{"name":"Jackson County Recorder","address":"405 4th St., Jackson, MN 56143"},"assessor":{"name":"Jackson County Assessor","address":"405 4th St., Jackson, MN 56143"}},"Kanabec County, MN":{"recorder":{"name":"Kanabec County Recorder","address":"18 N Vine St., Mora, MN 55051"},"assessor":{"name":"Kanabec County Assessor","address":"18 N Vine St., Mora, MN 55051"}},"Kandiyohi County, MN":{"recorder":{"name":"Kandiyohi County Recorder","address":"400 Benson Ave SW, Willmar, MN 56201"},"assessor":{"name":"Kandiyohi County Assessor","address":"400 Benson Ave SW, Willmar, MN 56201"}},"Kittson County, MN":{"recorder":{"name":"Kittson County Recorder","address":"410 S 5th St., Hallock, MN 56728"},"assessor":{"name":"Kittson County Assessor","address":"410 S 5th St., Hallock, MN 56728"}},"Koochiching County, MN":{"recorder":{"name":"Koochiching County Recorder","address":"715 4th St., International Falls, MN 56649"},"assessor":{"name":"Koochiching County Assessor","address":"715 4th St., International Falls, MN 56649"}},"Lac qui Parle County, MN":{"recorder":{"name":"Lac qui Parle County Recorder","address":"600 6th St., Madison, MN 56256"},"assessor":{"name":"Lac qui Parle County Assessor","address":"600 6th St., Madison, MN 56256"}},"Lake County, MN":{"recorder":{"name":"Lake County Recorder","address":"601 3rd Ave., Two Harbors, MN 55616"},"assessor":{"name":"Lake County Assessor","address":"601 3rd Ave., Two Harbors, MN 55616"}},"Lake of the Woods County, MN":{"recorder":{"name":"Lake of the Woods County Recorder","address":"206 8th Ave SE, Baudette, MN 56623"},"assessor":{"name":"Lake of the Woods County Assessor","address":"206 8th Ave SE, Baudette, MN 56623"}},"Le Sueur County, MN":{"recorder":{"name":"Le Sueur County Recorder","address":"88 S Park Ave., Le Center, MN 56057"},"assessor":{"name":"Le Sueur County Assessor","address":"88 S Park Ave., Le Center, MN 56057"}},"Lincoln County, MN":{"recorder":{"name":"Lincoln County Recorder","address":"319 N Rebecca St., Ivanhoe, MN 56142"},"assessor":{"name":"Lincoln County Assessor","address":"319 N Rebecca St., Ivanhoe, MN 56142"}},"Lyon County, MN":{"recorder":{"name":"Lyon County Recorder","address":"607 W Main St., Marshall, MN 56258"},"assessor":{"name":"Lyon County Assessor","address":"607 W Main St., Marshall, MN 56258"}},"Mahnomen County, MN":{"recorder":{"name":"Mahnomen County Recorder","address":"311 N Main St., Mahnomen, MN 56557"},"assessor":{"name":"Mahnomen County Assessor","address":"311 N Main St., Mahnomen, MN 56557"}},"Marshall County, MN":{"recorder":{"name":"Marshall County Recorder","address":"208 E Colvin Ave., Warren, MN 56762"},"assessor":{"name":"Marshall County Assessor","address":"208 E Colvin Ave., Warren, MN 56762"}},"Martin County, MN":{"recorder":{"name":"Martin County Recorder","address":"201 Lake Ave., Fairmont, MN 56031"},"assessor":{"name":"Martin County Assessor","address":"201 Lake Ave., Fairmont, MN 56031"}},"McLeod County, MN":{"recorder":{"name":"McLeod County Recorder","address":"830 11th St E, Glencoe, MN 55336"},"assessor":{"name":"McLeod County Assessor","address":"830 11th St E, Glencoe, MN 55336"}},"Meeker County, MN":{"recorder":{"name":"Meeker County Recorder","address":"325 N Sibley Ave., Litchfield, MN 55355"},"assessor":{"name":"Meeker County Assessor","address":"325 N Sibley Ave., Litchfield, MN 55355"}},"Mille Lacs County, MN":{"recorder":{"name":"Mille Lacs County Recorder","address":"635 2nd St SE, Milaca, MN 56353"},"assessor":{"name":"Mille Lacs County Assessor","address":"635 2nd St SE, Milaca, MN 56353"}},"Morrison County, MN":{"recorder":{"name":"Morrison County Recorder","address":"213 1st Ave SE, Little Falls, MN 56345"},"assessor":{"name":"Morrison County Assessor","address":"213 1st Ave SE, Little Falls, MN 56345"}},"Mower County, MN":{"recorder":{"name":"Mower County Recorder","address":"201 1st St NE, Austin, MN 55912"},"assessor":{"name":"Mower County Assessor","address":"201 1st St NE, Austin, MN 55912"}},"Murray County, MN":{"recorder":{"name":"Murray County Recorder","address":"2500 28th St., Slayton, MN 56172"},"assessor":{"name":"Murray County Assessor","address":"2500 28th St., Slayton, MN 56172"}},"Nicollet County, MN":{"recorder":{"name":"Nicollet County Recorder","address":"501 S Minnesota Ave., Saint Peter, MN 56082"},"assessor":{"name":"Nicollet County Assessor","address":"501 S Minnesota Ave., Saint Peter, MN 56082"}},"Nobles County, MN":{"recorder":{"name":"Nobles County Recorder","address":"315 10th St., Worthington, MN 56187"},"assessor":{"name":"Nobles County Assessor","address":"315 10th St., Worthington, MN 56187"}},"Norman County, MN":{"recorder":{"name":"Norman County Recorder","address":"16 3rd Ave E, Ada, MN 56510"},"assessor":{"name":"Norman County Assessor","address":"16 3rd Ave E, Ada, MN 56510"}},"Olmsted County, MN":{"recorder":{"name":"Olmsted County Recorder","address":"151 4th St SE, Rochester, MN 55904"},"assessor":{"name":"Olmsted County Assessor","address":"151 4th St SE, Rochester, MN 55904"}},"Otter Tail County, MN":{"recorder":{"name":"Otter Tail County Recorder","address":"121 W Junius Ave., Fergus Falls, MN 56537"},"assessor":{"name":"Otter Tail County Assessor","address":"121 W Junius Ave., Fergus Falls, MN 56537"}},"Pennington County, MN":{"recorder":{"name":"Pennington County Recorder","address":"101 N Main Ave., Thief River Falls, MN 56701"},"assessor":{"name":"Pennington County Assessor","address":"101 N Main Ave., Thief River Falls, MN 56701"}},"Pine County, MN":{"recorder":{"name":"Pine County Recorder","address":"315 Main St S, Pine City, MN 55063"},"assessor":{"name":"Pine County Assessor","address":"315 Main St S, Pine City, MN 55063"}},"Pipestone County, MN":{"recorder":{"name":"Pipestone County Recorder","address":"416 S Hiawatha Ave., Pipestone, MN 56164"},"assessor":{"name":"Pipestone County Assessor","address":"416 S Hiawatha Ave., Pipestone, MN 56164"}},"Polk County, MN":{"recorder":{"name":"Polk County Recorder","address":"612 N Broadway Suite 303, Crookston, MN 56716"},"assessor":{"name":"Polk County Assessor","address":"612 N Broadway Suite 303, Crookston, MN 56716"}},"Pope County, MN":{"recorder":{"name":"Pope County Recorder","address":"130 E Minnesota Ave., Glenwood, MN 56334"},"assessor":{"name":"Pope County Assessor","address":"130 E Minnesota Ave., Glenwood, MN 56334"}},"Ramsey County, MN":{"recorder":{"name":"Ramsey County Recorder","address":"90 W Plato Blvd. Suite 100, Saint Paul, MN 55107"},"assessor":{"name":"Ramsey County Assessor","address":"90 W Plato Blvd. Suite 400, Saint Paul, MN 55107"}},"Red Lake County, MN":{"recorder":{"name":"Red Lake County Recorder","address":"124 N Main Ave., Red Lake Falls, MN 56750"},"assessor":{"name":"Red Lake County Assessor","address":"124 N Main Ave., Red Lake Falls, MN 56750"}},"Redwood County, MN":{"recorder":{"name":"Redwood County Recorder","address":"250 S Jefferson St., Redwood Falls, MN 56283"},"assessor":{"name":"Redwood County Assessor","address":"250 S Jefferson St., Redwood Falls, MN 56283"}},"Renville County, MN":{"recorder":{"name":"Renville County Recorder","address":"500 DePue Ave E, Olivia, MN 56277"},"assessor":{"name":"Renville County Assessor","address":"500 DePue Ave E, Olivia, MN 56277"}},"Rice County, MN":{"recorder":{"name":"Rice County Recorder","address":"218 NW 3rd St., Faribault, MN 55021"},"assessor":{"name":"Rice County Assessor","address":"218 NW 3rd St., Faribault, MN 55021"}},"Rock County, MN":{"recorder":{"name":"Rock County Recorder","address":"204 E Brown Ave., Luverne, MN 56156"},"assessor":{"name":"Rock County Assessor","address":"204 E Brown Ave., Luverne, MN 56156"}},"Roseau County, MN":{"recorder":{"name":"Roseau County Recorder","address":"606 5th Ave SW Suite 2, Roseau, MN 56751"},"assessor":{"name":"Roseau County Assessor","address":"606 5th Ave SW Suite 2, Roseau, MN 56751"}},"Scott County, MN":{"recorder":{"name":"Scott County Recorder","address":"200 4th Ave W, Shakopee, MN 55379"},"assessor":{"name":"Scott County Assessor","address":"200 4th Ave W, Shakopee, MN 55379"}},"Sherburne County, MN":{"recorder":{"name":"Sherburne County Recorder","address":"13880 Business Center Dr NW, Elk River, MN 55330"},"assessor":{"name":"Sherburne County Assessor","address":"13880 Business Center Dr NW, Elk River, MN 55330"}},"Sibley County, MN":{"recorder":{"name":"Sibley County Recorder","address":"400 Court Ave., Gaylord, MN 55334"},"assessor":{"name":"Sibley County Assessor","address":"400 Court Ave., Gaylord, MN 55334"}},"St. Louis County, MN":{"recorder":{"name":"St. Louis County Recorder","address":"100 N 5th Ave W, Duluth, MN 55802"},"assessor":{"name":"St. Louis County Assessor","address":"100 N 5th Ave W, Duluth, MN 55802"}},"Stearns County, MN":{"recorder":{"name":"Stearns County Recorder","address":"705 Courthouse Sq. Suite 248, St. Cloud, MN 56303"},"assessor":{"name":"Stearns County Assessor","address":"705 Courthouse Sq. Suite 246, St. Cloud, MN 56303"}},"Steele County, MN":{"recorder":{"name":"Steele County Recorder","address":"630 Florence Ave., Owatonna, MN 55060"},"assessor":{"name":"Steele County Assessor","address":"630 Florence Ave., Owatonna, MN 55060"}},"Stevens County, MN":{"recorder":{"name":"Stevens County Recorder","address":"400 Colorado Ave., Morris, MN 56267"},"assessor":{"name":"Stevens County Assessor","address":"400 Colorado Ave., Morris, MN 56267"}},"Swift County, MN":{"recorder":{"name":"Swift County Recorder","address":"301 14th St N, Benson, MN 56215"},"assessor":{"name":"Swift County Assessor","address":"301 14th St N, Benson, MN 56215"}},"Todd County, MN":{"recorder":{"name":"Todd County Recorder","address":"215 1st Ave S, Long Prairie, MN 56347"},"assessor":{"name":"Todd County Assessor","address":"215 1st Ave S, Long Prairie, MN 56347"}},"Traverse County, MN":{"recorder":{"name":"Traverse County Recorder","address":"702 2nd Ave N, Wheaton, MN 56296"},"assessor":{"name":"Traverse County Assessor","address":"702 2nd Ave N, Wheaton, MN 56296"}},"Wabasha County, MN":{"recorder":{"name":"Wabasha County Recorder","address":"625 Jefferson Ave., Wabasha, MN 55981"},"assessor":{"name":"Wabasha County Assessor","address":"625 Jefferson Ave., Wabasha, MN 55981"}},"Wadena County, MN":{"recorder":{"name":"Wadena County Recorder","address":"415 Jefferson St N, Wadena, MN 56482"},"assessor":{"name":"Wadena County Assessor","address":"415 Jefferson St N, Wadena, MN 56482"}},"Waseca County, MN":{"recorder":{"name":"Waseca County Recorder","address":"307 N State St., Waseca, MN 56093"},"assessor":{"name":"Waseca County Assessor","address":"307 N State St., Waseca, MN 56093"}},"Washington County, MN":{"recorder":{"name":"Washington County Recorder","address":"14949 62nd St N, Stillwater, MN 55082"},"assessor":{"name":"Washington County Assessor","address":"14949 62nd St N, Stillwater, MN 55082"}},"Watonwan County, MN":{"recorder":{"name":"Watonwan County Recorder","address":"710 2nd Ave S, St. James, MN 56081"},"assessor":{"name":"Watonwan County Assessor","address":"710 2nd Ave S, St. James, MN 56081"}},"Wilkin County, MN":{"recorder":{"name":"Wilkin County Recorder","address":"300 S 5th St., Breckenridge, MN 56520"},"assessor":{"name":"Wilkin County Assessor","address":"300 S 5th St., Breckenridge, MN 56520"}},"Winona County, MN":{"recorder":{"name":"Winona County Recorder","address":"171 W 3rd St., Winona, MN 55987"},"assessor":{"name":"Winona County Assessor","address":"171 W 3rd St., Winona, MN 55987"}},"Wright County, MN":{"recorder":{"name":"Wright County Recorder","address":"10 NW 2nd St., Buffalo, MN 55313"},"assessor":{"name":"Wright County Assessor","address":"10 NW 2nd St., Buffalo, MN 55313"}},"Yellow Medicine County, MN":{"recorder":{"name":"Yellow Medicine County Recorder","address":"415 9th Ave., Granite Falls, MN 56241"},"assessor":{"name":"Yellow Medicine County Assessor","address":"415 9th Ave., Granite Falls, MN 56241"}},"Adair County, MO":{"recorder":{"name":"Adair County Recorder of Deeds","address":"106 W Washington St., Kirksville, MO 63501"},"assessor":{"name":"Adair County Assessor","address":"106 W Washington St., Kirksville, MO 63501"}},"Andrew County, MO":{"recorder":{"name":"Andrew County Recorder of Deeds","address":"400 Court St., Savannah, MO 64485"},"assessor":{"name":"Andrew County Assessor","address":"400 Court St., Savannah, MO 64485"}},"Atchison County, MO":{"recorder":{"name":"Atchison County Recorder of Deeds","address":"400 S Washington St., Rock Port, MO 64482"},"assessor":{"name":"Atchison County Assessor","address":"400 S Washington St., Rock Port, MO 64482"}},"Audrain County, MO":{"recorder":{"name":"Audrain County Recorder of Deeds","address":"101 N Jefferson Rm 105, Mexico, MO 65265"},"assessor":{"name":"Audrain County Assessor","address":"101 N Jefferson Rm 106, Mexico, MO 65265"}},"Barry County, MO":{"recorder":{"name":"Barry County Recorder of Deeds","address":"700 Main St. Suite 6, Cassville, MO 65625"},"assessor":{"name":"Barry County Assessor","address":"700 Main St. Suite 7, Cassville, MO 65625"}},"Barton County, MO":{"recorder":{"name":"Barton County Recorder of Deeds","address":"1004 Gulf Rm 107, Lamar, MO 64759"},"assessor":{"name":"Barton County Assessor","address":"1004 Gulf Rm 109, Lamar, MO 64759"}},"Bates County, MO":{"recorder":{"name":"Bates County Recorder of Deeds","address":"103 W Dakota Rm 3, Butler, MO 64730"},"assessor":{"name":"Bates County Assessor","address":"103 W Dakota Rm 4, Butler, MO 64730"}},"Benton County, MO":{"recorder":{"name":"Benton County Recorder of Deeds","address":"316 Van Buren St., Warsaw, MO 65355"},"assessor":{"name":"Benton County Assessor","address":"316 Van Buren St., Warsaw, MO 65355"}},"Bollinger County, MO":{"recorder":{"name":"Bollinger County Recorder of Deeds","address":"204 High St. Suite 7, Marble Hill, MO 63764"},"assessor":{"name":"Bollinger County Assessor","address":"204 High St. Suite 1, Marble Hill, MO 63764"}},"Boone County, MO":{"recorder":{"name":"Boone County Recorder of Deeds","address":"801 E Walnut Rm 132, Columbia, MO 65201"},"assessor":{"name":"Boone County Assessor","address":"801 E Walnut Rm 143, Columbia, MO 65201"}},"Buchanan County, MO":{"recorder":{"name":"Buchanan County Recorder of Deeds","address":"411 Jules Rm 103, St. Joseph, MO 64501"},"assessor":{"name":"Buchanan County Assessor","address":"411 Jules Rm 222, St. Joseph, MO 64501"}},"Butler County, MO":{"recorder":{"name":"Butler County Recorder of Deeds","address":"100 N Main Rm 103, Poplar Bluff, MO 63901"},"assessor":{"name":"Butler County Assessor","address":"100 N Main Rm 201, Poplar Bluff, MO 63901"}},"Caldwell County, MO":{"recorder":{"name":"Caldwell County Recorder of Deeds","address":"49 E Main St., Kingston, MO 64650"},"assessor":{"name":"Caldwell County Assessor","address":"49 E Main St., Kingston, MO 64650"}},"Callaway County, MO":{"recorder":{"name":"Callaway County Recorder of Deeds","address":"10 E 5th St., Fulton, MO 65251"},"assessor":{"name":"Callaway County Assessor","address":"10 E 5th St., Fulton, MO 65251"}},"Camden County, MO":{"recorder":{"name":"Camden County Recorder of Deeds","address":"1 Courthouse Dr., Camdenton, MO 65020"},"assessor":{"name":"Camden County Assessor","address":"1 Courthouse Dr., Camdenton, MO 65020"}},"Cape Girardeau County, MO":{"recorder":{"name":"Cape Girardeau County Recorder of Deeds","address":"1 Barton Square Suite 202, Jackson, MO 63755"},"assessor":{"name":"Cape Girardeau County Assessor","address":"1 Barton Square Suite 202, Jackson, MO 63755"}},"Carroll County, MO":{"recorder":{"name":"Carroll County Recorder of Deeds","address":"8 S Main Suite 6, Carrollton, MO 64633"},"assessor":{"name":"Carroll County Assessor","address":"8 S Main Suite 3, Carrollton, MO 64633"}},"Carter County, MO":{"recorder":{"name":"Carter County Recorder of Deeds","address":"105 N Casey, Van Buren, MO 63965"},"assessor":{"name":"Carter County Assessor","address":"105 N Casey, Van Buren, MO 63965"}},"Cass County, MO":{"recorder":{"name":"Cass County Recorder of Deeds","address":"102 E Wall St., Harrisonville, MO 64701"},"assessor":{"name":"Cass County Assessor","address":"102 E Wall St., Harrisonville, MO 64701"}},"Cedar County, MO":{"recorder":{"name":"Cedar County Recorder of Deeds","address":"113 S Street, Stockton, MO 65785"},"assessor":{"name":"Cedar County Assessor","address":"113 S Street, Stockton, MO 65785"}},"Chariton County, MO":{"recorder":{"name":"Chariton County Recorder of Deeds","address":"306 S Cherry St., Keytesville, MO 65261"},"assessor":{"name":"Chariton County Assessor","address":"306 S Cherry St., Keytesville, MO 65261"}},"Christian County, MO":{"recorder":{"name":"Christian County Recorder of Deeds","address":"100 W Church St., Ozark, MO 65721"},"assessor":{"name":"Christian County Assessor","address":"100 W Church St., Ozark, MO 65721"}},"Clark County, MO":{"recorder":{"name":"Clark County Recorder of Deeds","address":"111 E Court St., Kahoka, MO 63445"},"assessor":{"name":"Clark County Assessor","address":"111 E Court St., Kahoka, MO 63445"}},"Clay County, MO":{"recorder":{"name":"Clay County Recorder of Deeds","address":"1 Courthouse Square, Liberty, MO 64068"},"assessor":{"name":"Clay County Assessor","address":"1 Courthouse Square, Liberty, MO 64068"}},"Clinton County, MO":{"recorder":{"name":"Clinton County Recorder of Deeds","address":"207 N Main St., Plattsburg, MO 64477"},"assessor":{"name":"Clinton County Assessor","address":"207 N Main St., Plattsburg, MO 64477"}},"Cole County, MO":{"recorder":{"name":"Cole County Recorder of Deeds","address":"311 E High St., Jefferson City, MO 65101"},"assessor":{"name":"Cole County Assessor","address":"311 E High St., Jefferson City, MO 65101"}},"Cooper County, MO":{"recorder":{"name":"Cooper County Recorder of Deeds","address":"200 Main St., Boonville, MO 65233"},"assessor":{"name":"Cooper County Assessor","address":"200 Main St., Boonville, MO 65233"}},"Crawford County, MO":{"recorder":{"name":"Crawford County Recorder of Deeds","address":"302 W Main St., Steelville, MO 65565"},"assessor":{"name":"Crawford County Assessor","address":"302 W Main St., Steelville, MO 65565"}},"Dade County, MO":{"recorder":{"name":"Dade County Recorder of Deeds","address":"300 W Water St., Greenfield, MO 65661"},"assessor":{"name":"Dade County Assessor","address":"300 W Water St., Greenfield, MO 65661"}},"Dallas County, MO":{"recorder":{"name":"Dallas County Recorder of Deeds","address":"Buffalo, MO 65622"},"assessor":{"name":"Dallas County Assessor","address":"Buffalo, MO 65622"}},"Daviess County, MO":{"recorder":{"name":"Daviess County Recorder of Deeds","address":"102 N Main St., Gallatin, MO 64640"},"assessor":{"name":"Daviess County Assessor","address":"102 N Main St., Gallatin, MO 64640"}},"DeKalb County, MO":{"recorder":{"name":"DeKalb County Recorder of Deeds","address":"109 W Main St., Maysville, MO 64469"},"assessor":{"name":"DeKalb County Assessor","address":"109 W Main St., Maysville, MO 64469"}},"Dent County, MO":{"recorder":{"name":"Dent County Recorder of Deeds","address":"400 N Main St., Salem, MO 65560"},"assessor":{"name":"Dent County Assessor","address":"400 N Main St., Salem, MO 65560"}},"Douglas County, MO":{"recorder":{"name":"Douglas County Recorder of Deeds","address":"203 SE 2nd Ave., Ava, MO 65608"},"assessor":{"name":"Douglas County Assessor","address":"203 SE 2nd Ave., Ava, MO 65608"}},"Dunklin County, MO":{"recorder":{"name":"Dunklin County Recorder of Deeds","address":"221 S Main St., Kennett, MO 63857"},"assessor":{"name":"Dunklin County Assessor","address":"221 S Main St., Kennett, MO 63857"}},"Franklin County, MO":{"recorder":{"name":"Franklin County Recorder of Deeds","address":"400 E Locust St., Union, MO 63084"},"assessor":{"name":"Franklin County Assessor","address":"400 E Locust St., Union, MO 63084"}},"Gasconade County, MO":{"recorder":{"name":"Gasconade County Recorder of Deeds","address":"119 E 1st St., Hermann, MO 65041"},"assessor":{"name":"Gasconade County Assessor","address":"119 E 1st St., Hermann, MO 65041"}},"Gentry County, MO":{"recorder":{"name":"Gentry County Recorder of Deeds","address":"200 W Clay St., Albany, MO 64402"},"assessor":{"name":"Gentry County Assessor","address":"200 W Clay St., Albany, MO 64402"}},"Greene County, MO":{"recorder":{"name":"Greene County Recorder of Deeds","address":"940 N Boonville Ave., Springfield, MO 65802"},"assessor":{"name":"Greene County Assessor","address":"940 N Boonville Ave., Springfield, MO 65802"}},"Grundy County, MO":{"recorder":{"name":"Grundy County Recorder of Deeds","address":"700 Main St., Trenton, MO 64683"},"assessor":{"name":"Grundy County Assessor","address":"700 Main St., Trenton, MO 64683"}},"Harrison County, MO":{"recorder":{"name":"Harrison County Recorder of Deeds","address":"1500 Central St., Bethany, MO 64424"},"assessor":{"name":"Harrison County Assessor","address":"1500 Central St., Bethany, MO 64424"}},"Henry County, MO":{"recorder":{"name":"Henry County Recorder of Deeds","address":"100 W Franklin St., Clinton, MO 64735"},"assessor":{"name":"Henry County Assessor","address":"100 W Franklin St., Clinton, MO 64735"}},"Hickory County, MO":{"recorder":{"name":"Hickory County Recorder of Deeds","address":"Hermitage, MO 65668"},"assessor":{"name":"Hickory County Assessor","address":"Hermitage, MO 65668"}},"Holt County, MO":{"recorder":{"name":"Holt County Recorder of Deeds","address":"102 W Nodaway St., Oregon, MO 64473"},"assessor":{"name":"Holt County Assessor","address":"102 W Nodaway St., Oregon, MO 64473"}},"Howard County, MO":{"recorder":{"name":"Howard County Recorder of Deeds","address":"1 Courthouse Square, Fayette, MO 65248"},"assessor":{"name":"Howard County Assessor","address":"1 Courthouse Square, Fayette, MO 65248"}},"Howell County, MO":{"recorder":{"name":"Howell County Recorder of Deeds","address":"2 Court Square Suite 3, West Plains, MO 65775"},"assessor":{"name":"Howell County Assessor","address":"2 Court Square Suite 3, West Plains, MO 65775"}},"Iron County, MO":{"recorder":{"name":"Iron County Recorder of Deeds","address":"250 S Main St., Ironton, MO 63650"},"assessor":{"name":"Iron County Assessor","address":"250 S Main St., Ironton, MO 63650"}},"Jackson County, MO":{"recorder":{"name":"Jackson County Recorder of Deeds","address":"415 E 12th St., Kansas City, MO 64106"},"assessor":{"name":"Jackson County Assessor","address":"415 E 12th St., Kansas City, MO 64106"}},"Jasper County, MO":{"recorder":{"name":"Jasper County Recorder of Deeds","address":"601 S Pearl Ave., Joplin, MO 64801"},"assessor":{"name":"Jasper County Assessor","address":"601 S Pearl Ave., Joplin, MO 64801"}},"Jefferson County, MO":{"recorder":{"name":"Jefferson County Recorder of Deeds","address":"729 Maple St., Hillsboro, MO 63050"},"assessor":{"name":"Jefferson County Assessor","address":"729 Maple St., Hillsboro, MO 63050"}},"Johnson County, MO":{"recorder":{"name":"Johnson County Recorder of Deeds","address":"300 N Holden St. Suite 6, Warrensburg, MO 64093"},"assessor":{"name":"Johnson County Assessor","address":"300 N Holden St. Suite 6, Warrensburg, MO 64093"}},"Knox County, MO":{"recorder":{"name":"Knox County Recorder of Deeds","address":"107 N 4th St., Edina, MO 63537"},"assessor":{"name":"Knox County Assessor","address":"107 N 4th St., Edina, MO 63537"}},"Laclede County, MO":{"recorder":{"name":"Laclede County Recorder of Deeds","address":"200 N Adams Ave., Lebanon, MO 65536"},"assessor":{"name":"Laclede County Assessor","address":"200 N Adams Ave., Lebanon, MO 65536"}},"Lafayette County, MO":{"recorder":{"name":"Lafayette County Recorder of Deeds","address":"1001 Main St., Lexington, MO 64067"},"assessor":{"name":"Lafayette County Assessor","address":"1001 Main St., Lexington, MO 64067"}},"Lawrence County, MO":{"recorder":{"name":"Lawrence County Recorder of Deeds","address":"1 Courthouse Square, Mount Vernon, MO 65712"},"assessor":{"name":"Lawrence County Assessor","address":"1 Courthouse Square, Mount Vernon, MO 65712"}},"Lewis County, MO":{"recorder":{"name":"Lewis County Recorder of Deeds","address":"100 E Lafayette St., Monticello, MO 63457"},"assessor":{"name":"Lewis County Assessor","address":"100 E Lafayette St., Monticello, MO 63457"}},"Lincoln County, MO":{"recorder":{"name":"Lincoln County Recorder of Deeds","address":"201 Main St., Troy, MO 63379"},"assessor":{"name":"Lincoln County Assessor","address":"201 Main St., Troy, MO 63379"}},"Linn County, MO":{"recorder":{"name":"Linn County Recorder of Deeds","address":"108 N High St., Linneus, MO 64653"},"assessor":{"name":"Linn County Assessor","address":"108 N High St., Linneus, MO 64653"}},"Livingston County, MO":{"recorder":{"name":"Livingston County Recorder of Deeds","address":"700 Webster St., Chillicothe, MO 64601"},"assessor":{"name":"Livingston County Assessor","address":"700 Webster St., Chillicothe, MO 64601"}},"Macon County, MO":{"recorder":{"name":"Macon County Recorder of Deeds","address":"101 E Washington St., Macon, MO 63552"},"assessor":{"name":"Macon County Assessor","address":"101 E Washington St., Macon, MO 63552"}},"Madison County, MO":{"recorder":{"name":"Madison County Recorder of Deeds","address":"1 Courthouse Square, Fredericktown, MO 63645"},"assessor":{"name":"Madison County Assessor","address":"1 Courthouse Square, Fredericktown, MO 63645"}},"Maries County, MO":{"recorder":{"name":"Maries County Recorder of Deeds","address":"211 4th St., Vienna, MO 65582"},"assessor":{"name":"Maries County Assessor","address":"211 4th St., Vienna, MO 65582"}},"Marion County, MO":{"recorder":{"name":"Marion County Recorder of Deeds","address":"906 Broadway Rm 102, Hannibal, MO 63401"},"assessor":{"name":"Marion County Assessor","address":"906 Broadway Rm 102, Hannibal, MO 63401"}},"McDonald County, MO":{"recorder":{"name":"McDonald County Recorder of Deeds","address":"601 S Main St., Pineville, MO 64856"},"assessor":{"name":"McDonald County Assessor","address":"601 S Main St., Pineville, MO 64856"}},"Mercer County, MO":{"recorder":{"name":"Mercer County Recorder of Deeds","address":"802 E Main St., Princeton, MO 64673"},"assessor":{"name":"Mercer County Assessor","address":"802 E Main St., Princeton, MO 64673"}},"Miller County, MO":{"recorder":{"name":"Miller County Recorder of Deeds","address":"2001 E Main St., Tuscumbia, MO 65082"},"assessor":{"name":"Miller County Assessor","address":"2001 E Main St., Tuscumbia, MO 65082"}},"Mississippi County, MO":{"recorder":{"name":"Mississippi County Recorder of Deeds","address":"200 N Washington St., Charleston, MO 63834"},"assessor":{"name":"Mississippi County Assessor","address":"200 N Washington St., Charleston, MO 63834"}},"Moniteau County, MO":{"recorder":{"name":"Moniteau County Recorder of Deeds","address":"200 E Main St., California, MO 65018"},"assessor":{"name":"Moniteau County Assessor","address":"200 E Main St., California, MO 65018"}},"Monroe County, MO":{"recorder":{"name":"Monroe County Recorder of Deeds","address":"300 N Main St., Paris, MO 65275"},"assessor":{"name":"Monroe County Assessor","address":"300 N Main St., Paris, MO 65275"}},"Montgomery County, MO":{"recorder":{"name":"Montgomery County Recorder of Deeds","address":"211 E 3rd St., Montgomery City, MO 63361"},"assessor":{"name":"Montgomery County Assessor","address":"211 E 3rd St., Montgomery City, MO 63361"}},"Morgan County, MO":{"recorder":{"name":"Morgan County Recorder of Deeds","address":"100 E Newton St., Versailles, MO 65084"},"assessor":{"name":"Morgan County Assessor","address":"100 E Newton St., Versailles, MO 65084"}},"New Madrid County, MO":{"recorder":{"name":"New Madrid County Recorder of Deeds","address":"450 Main St., New Madrid, MO 63869"},"assessor":{"name":"New Madrid County Assessor","address":"450 Main St., New Madrid, MO 63869"}},"Newton County, MO":{"recorder":{"name":"Newton County Recorder of Deeds","address":"101 S Wood St., Neosho, MO 64850"},"assessor":{"name":"Newton County Assessor","address":"101 S Wood St., Neosho, MO 64850"}},"Nodaway County, MO":{"recorder":{"name":"Nodaway County Recorder of Deeds","address":"305 N Main St., Maryville, MO 64468"},"assessor":{"name":"Nodaway County Assessor","address":"305 N Main St., Maryville, MO 64468"}},"Oregon County, MO":{"recorder":{"name":"Oregon County Recorder of Deeds","address":"Alton, MO 65606"},"assessor":{"name":"Oregon County Assessor","address":"Alton, MO 65606"}},"Osage County, MO":{"recorder":{"name":"Osage County Recorder of Deeds","address":"1 Courthouse Square, Linn, MO 65051"},"assessor":{"name":"Osage County Assessor","address":"1 Courthouse Square, Linn, MO 65051"}},"Ozark County, MO":{"recorder":{"name":"Ozark County Recorder of Deeds","address":"Gainesville, MO 65655"},"assessor":{"name":"Ozark County Assessor","address":"Gainesville, MO 65655"}},"Pemiscot County, MO":{"recorder":{"name":"Pemiscot County Recorder of Deeds","address":"610 Ward Ave., Caruthersville, MO 63830"},"assessor":{"name":"Pemiscot County Assessor","address":"610 Ward Ave., Caruthersville, MO 63830"}},"Perry County, MO":{"recorder":{"name":"Perry County Recorder of Deeds","address":"321 N Main St., Perryville, MO 63775"},"assessor":{"name":"Perry County Assessor","address":"321 N Main St., Perryville, MO 63775"}},"Pettis County, MO":{"recorder":{"name":"Pettis County Recorder of Deeds","address":"415 S Ohio Ave., Sedalia, MO 65301"},"assessor":{"name":"Pettis County Assessor","address":"415 S Ohio Ave., Sedalia, MO 65301"}},"Phelps County, MO":{"recorder":{"name":"Phelps County Recorder of Deeds","address":"200 N Main St., Rolla, MO 65401"},"assessor":{"name":"Phelps County Assessor","address":"200 N Main St., Rolla, MO 65401"}},"Pike County, MO":{"recorder":{"name":"Pike County Recorder of Deeds","address":"115 W Main St., Bowling Green, MO 63334"},"assessor":{"name":"Pike County Assessor","address":"115 W Main St., Bowling Green, MO 63334"}},"Platte County, MO":{"recorder":{"name":"Platte County Recorder of Deeds","address":"415 3rd St., Platte City, MO 64079"},"assessor":{"name":"Platte County Assessor","address":"415 3rd St., Platte City, MO 64079"}},"Polk County, MO":{"recorder":{"name":"Polk County Recorder of Deeds","address":"102 E Broadway St., Bolivar, MO 65613"},"assessor":{"name":"Polk County Assessor","address":"102 E Broadway St., Bolivar, MO 65613"}},"Pulaski County, MO":{"recorder":{"name":"Pulaski County Recorder of Deeds","address":"301 Historic Rt 66 E Suite 121, Waynesville, MO 65583"},"assessor":{"name":"Pulaski County Assessor","address":"301 Historic Rt 66 E Suite 121, Waynesville, MO 65583"}},"Putnam County, MO":{"recorder":{"name":"Putnam County Recorder of Deeds","address":"1601 Main St., Unionville, MO 63565"},"assessor":{"name":"Putnam County Assessor","address":"1601 Main St., Unionville, MO 63565"}},"Ralls County, MO":{"recorder":{"name":"Ralls County Recorder of Deeds","address":"311 S Main St., New London, MO 63459"},"assessor":{"name":"Ralls County Assessor","address":"311 S Main St., New London, MO 63459"}},"Randolph County, MO":{"recorder":{"name":"Randolph County Recorder of Deeds","address":"372 S Main St. Suite 1, Huntsville, MO 65259"},"assessor":{"name":"Randolph County Assessor","address":"372 S Main St. Suite 1, Huntsville, MO 65259"}},"Ray County, MO":{"recorder":{"name":"Ray County Recorder of Deeds","address":"100 W Main St., Richmond, MO 64085"},"assessor":{"name":"Ray County Assessor","address":"100 W Main St., Richmond, MO 64085"}},"Reynolds County, MO":{"recorder":{"name":"Reynolds County Recorder of Deeds","address":"1 Main St., Centerville, MO 63633"},"assessor":{"name":"Reynolds County Assessor","address":"1 Main St., Centerville, MO 63633"}},"Ripley County, MO":{"recorder":{"name":"Ripley County Recorder of Deeds","address":"100 Courthouse Square, Doniphan, MO 63935"},"assessor":{"name":"Ripley County Assessor","address":"100 Courthouse Square, Doniphan, MO 63935"}},"St. Charles County, MO":{"recorder":{"name":"St. Charles County Recorder of Deeds","address":"201 N 2nd St. Suite 321, St. Charles, MO 63301"},"assessor":{"name":"St. Charles County Assessor","address":"201 N 2nd St. Suite 321, St. Charles, MO 63301"}},"St. Clair County, MO":{"recorder":{"name":"St. Clair County Recorder of Deeds","address":"655 2nd St., Osceola, MO 64776"},"assessor":{"name":"St. Clair County Assessor","address":"655 2nd St., Osceola, MO 64776"}},"St. Francois County, MO":{"recorder":{"name":"St. Francois County Recorder of Deeds","address":"1 W Liberty St. Suite 100, Farmington, MO 63640"},"assessor":{"name":"St. Francois County Assessor","address":"1 W Liberty St. Suite 100, Farmington, MO 63640"}},"St. Louis City, MO":{"recorder":{"name":"St. Louis City Recorder of Deeds","address":"1200 Market St. Room 126, St. Louis, MO 63103"},"assessor":{"name":"St. Louis City Assessor","address":"1200 Market St. Room 110, St. Louis, MO 63103"}},"St. Louis County, MO":{"recorder":{"name":"St. Louis County Recorder of Deeds","address":"41 S Central Ave., Clayton, MO 63105"},"assessor":{"name":"St. Louis County Assessor","address":"41 S Central Ave., Clayton, MO 63105"}},"Ste. Genevieve County, MO":{"recorder":{"name":"Ste. Genevieve County Recorder of Deeds","address":"55 S 3rd St., Ste. Genevieve, MO 63670"},"assessor":{"name":"Ste. Genevieve County Assessor","address":"55 S 3rd St., Ste. Genevieve, MO 63670"}},"Saline County, MO":{"recorder":{"name":"Saline County Recorder of Deeds","address":"101 E Arrow St., Marshall, MO 65340"},"assessor":{"name":"Saline County Assessor","address":"101 E Arrow St., Marshall, MO 65340"}},"Schuyler County, MO":{"recorder":{"name":"Schuyler County Recorder of Deeds","address":"9 N Washington St., Lancaster, MO 63548"},"assessor":{"name":"Schuyler County Assessor","address":"9 N Washington St., Lancaster, MO 63548"}},"Scotland County, MO":{"recorder":{"name":"Scotland County Recorder of Deeds","address":"117 S Market St., Memphis, MO 63555"},"assessor":{"name":"Scotland County Assessor","address":"117 S Market St., Memphis, MO 63555"}},"Scott County, MO":{"recorder":{"name":"Scott County Recorder of Deeds","address":"131 S Winchester St., Benton, MO 63736"},"assessor":{"name":"Scott County Assessor","address":"131 S Winchester St., Benton, MO 63736"}},"Shannon County, MO":{"recorder":{"name":"Shannon County Recorder of Deeds","address":"Eminence, MO 65466"},"assessor":{"name":"Shannon County Assessor","address":"Eminence, MO 65466"}},"Shelby County, MO":{"recorder":{"name":"Shelby County Recorder of Deeds","address":"100 E Center St., Shelbyville, MO 63469"},"assessor":{"name":"Shelby County Assessor","address":"100 E Center St., Shelbyville, MO 63469"}},"Stoddard County, MO":{"recorder":{"name":"Stoddard County Recorder of Deeds","address":"401 S Prairie St., Bloomfield, MO 63825"},"assessor":{"name":"Stoddard County Assessor","address":"401 S Prairie St., Bloomfield, MO 63825"}},"Stone County, MO":{"recorder":{"name":"Stone County Recorder of Deeds","address":"108 E 4th St., Galena, MO 65656"},"assessor":{"name":"Stone County Assessor","address":"108 E 4th St., Galena, MO 65656"}},"Sullivan County, MO":{"recorder":{"name":"Sullivan County Recorder of Deeds","address":"109 N Main, Milan, MO 63556"},"assessor":{"name":"Sullivan County Assessor","address":"109 N Main, Milan, MO 63556"}},"Taney County, MO":{"recorder":{"name":"Taney County Recorder of Deeds","address":"132 David St., Forsyth, MO 65653"},"assessor":{"name":"Taney County Assessor","address":"132 David St., Forsyth, MO 65653"}},"Texas County, MO":{"recorder":{"name":"Texas County Recorder of Deeds","address":"210 N Grand Ave., Houston, MO 65483"},"assessor":{"name":"Texas County Assessor","address":"210 N Grand Ave., Houston, MO 65483"}},"Vernon County, MO":{"recorder":{"name":"Vernon County Recorder of Deeds","address":"100 W Cherry St., Nevada, MO 64772"},"assessor":{"name":"Vernon County Assessor","address":"100 W Cherry St., Nevada, MO 64772"}},"Warren County, MO":{"recorder":{"name":"Warren County Recorder of Deeds","address":"104 W Main St., Warrenton, MO 63383"},"assessor":{"name":"Warren County Assessor","address":"104 W Main St., Warrenton, MO 63383"}},"Washington County, MO":{"recorder":{"name":"Washington County Recorder of Deeds","address":"102 N Missouri St., Potosi, MO 63664"},"assessor":{"name":"Washington County Assessor","address":"102 N Missouri St., Potosi, MO 63664"}},"Wayne County, MO":{"recorder":{"name":"Wayne County Recorder of Deeds","address":"109 Walnut St., Greenville, MO 63944"},"assessor":{"name":"Wayne County Assessor","address":"109 Walnut St., Greenville, MO 63944"}},"Webster County, MO":{"recorder":{"name":"Webster County Recorder of Deeds","address":"101 S Jefferson Ave., Marshfield, MO 65706"},"assessor":{"name":"Webster County Assessor","address":"101 S Jefferson Ave., Marshfield, MO 65706"}},"Worth County, MO":{"recorder":{"name":"Worth County Recorder of Deeds","address":"Grant City, MO 64456"},"assessor":{"name":"Worth County Assessor","address":"Grant City, MO 64456"}},"Wright County, MO":{"recorder":{"name":"Wright County Recorder of Deeds","address":"125 Court Square, Hartville, MO 65667"},"assessor":{"name":"Wright County Assessor","address":"125 Court Square, Hartville, MO 65667"}},"Adams County, MS":{"recorder":{"name":"Adams County Chancery Clerk","address":"115 S Wall St., Natchez, MS 39120"},"assessor":{"name":"Adams County Tax Assessor","address":"115 S Wall St., Natchez, MS 39120"}},"Alcorn County, MS":{"recorder":{"name":"Alcorn County Chancery Clerk","address":"501 Waldron St., Corinth, MS 38834"},"assessor":{"name":"Alcorn County Tax Assessor","address":"501 Waldron St., Corinth, MS 38834"}},"Amite County, MS":{"recorder":{"name":"Amite County Chancery Clerk","address":"243 W Main St., Liberty, MS 39645"},"assessor":{"name":"Amite County Tax Assessor","address":"243 W Main St., Liberty, MS 39645"}},"Attala County, MS":{"recorder":{"name":"Attala County Chancery Clerk","address":"230 W Washington St., Kosciusko, MS 39090"},"assessor":{"name":"Attala County Tax Assessor","address":"230 W Washington St., Kosciusko, MS 39090"}},"Benton County, MS":{"recorder":{"name":"Benton County Chancery Clerk","address":"Box 218, Ashland, MS 38603"},"assessor":{"name":"Benton County Tax Assessor","address":"Ashland, MS 38603"}},"Bolivar County, MS":{"recorder":{"name":"Bolivar County Chancery Clerk","address":"400 S Court St., Cleveland, MS 38732"},"assessor":{"name":"Bolivar County Tax Assessor","address":"400 S Court St., Cleveland, MS 38732"}},"Calhoun County, MS":{"recorder":{"name":"Calhoun County Chancery Clerk","address":"201 S. Jefferson, Pittsboro, MS 38951"},"assessor":{"name":"Calhoun County Tax Assessor","address":"201 S. Jefferson, Pittsboro, MS 38951"}},"Carroll County, MS":{"recorder":{"name":"Carroll County Chancery Clerk","address":"Carrollton, MS 38917"},"assessor":{"name":"Carroll County Tax Assessor","address":"Carrollton, MS 38917"}},"Chickasaw County, MS":{"recorder":{"name":"Chickasaw County Chancery Clerk","address":"1 Pinson Square, Houston, MS 38851"},"assessor":{"name":"Chickasaw County Tax Assessor","address":"1 Pinson Square, Houston, MS 38851"}},"Choctaw County, MS":{"recorder":{"name":"Choctaw County Chancery Clerk","address":"112 Quinn St., Ackerman, MS 39735"},"assessor":{"name":"Choctaw County Tax Assessor","address":"112 Quinn St., Ackerman, MS 39735"}},"Claiborne County, MS":{"recorder":{"name":"Claiborne County Chancery Clerk","address":"410 Market St., Port Gibson, MS 39150"},"assessor":{"name":"Claiborne County Tax Assessor","address":"410 Market St., Port Gibson, MS 39150"}},"Clarke County, MS":{"recorder":{"name":"Clarke County Chancery Clerk","address":"101 Enterprise Ave., Quitman, MS 39355"},"assessor":{"name":"Clarke County Tax Assessor","address":"101 Enterprise Ave., Quitman, MS 39355"}},"Clay County, MS":{"recorder":{"name":"Clay County Chancery Clerk","address":"Main St., West Point, MS 39773"},"assessor":{"name":"Clay County Tax Assessor","address":"Main St., West Point, MS 39773"}},"Coahoma County, MS":{"recorder":{"name":"Coahoma County Chancery Clerk","address":"115 First St., Clarksdale, MS 38614"},"assessor":{"name":"Coahoma County Tax Assessor","address":"115 First St., Clarksdale, MS 38614"}},"Copiah County, MS":{"recorder":{"name":"Copiah County Chancery Clerk","address":"100 Caldwell Dr., Hazlehurst, MS 39083"},"assessor":{"name":"Copiah County Tax Assessor","address":"100 Caldwell Dr., Hazlehurst, MS 39083"}},"Covington County, MS":{"recorder":{"name":"Covington County Chancery Clerk","address":"101 S Dogwood Ave., Collins, MS 39428"},"assessor":{"name":"Covington County Tax Assessor","address":"101 S Dogwood Ave., Collins, MS 39428"}},"DeSoto County, MS":{"recorder":{"name":"DeSoto County Chancery Clerk","address":"365 Losher St., Hernando, MS 38632"},"assessor":{"name":"DeSoto County Tax Assessor","address":"365 Losher St., Hernando, MS 38632"}},"Forrest County, MS":{"recorder":{"name":"Forrest County Chancery Clerk","address":"641 Main St., Hattiesburg, MS 39401"},"assessor":{"name":"Forrest County Tax Assessor","address":"641 Main St., Hattiesburg, MS 39401"}},"Franklin County, MS":{"recorder":{"name":"Franklin County Chancery Clerk","address":"Main St., Meadville, MS 39653"},"assessor":{"name":"Franklin County Tax Assessor","address":"Main St., Meadville, MS 39653"}},"George County, MS":{"recorder":{"name":"George County Chancery Clerk","address":"355 Cox St., Lucedale, MS 39452"},"assessor":{"name":"George County Tax Assessor","address":"355 Cox St., Lucedale, MS 39452"}},"Greene County, MS":{"recorder":{"name":"Greene County Chancery Clerk","address":"400 Main St., Leakesville, MS 39451"},"assessor":{"name":"Greene County Tax Assessor","address":"400 Main St., Leakesville, MS 39451"}},"Grenada County, MS":{"recorder":{"name":"Grenada County Chancery Clerk","address":"59 Green St., Grenada, MS 38901"},"assessor":{"name":"Grenada County Tax Assessor","address":"59 Green St., Grenada, MS 38901"}},"Hancock County, MS":{"recorder":{"name":"Hancock County Chancery Clerk","address":"152 Main St., Bay St. Louis, MS 39520"},"assessor":{"name":"Hancock County Tax Assessor","address":"152 Main St., Bay St. Louis, MS 39520"}},"Harrison County, MS":{"recorder":{"name":"Harrison County Chancery Clerk","address":"1801 23rd Ave., Gulfport, MS 39501"},"assessor":{"name":"Harrison County Tax Assessor","address":"1801 23rd Ave., Gulfport, MS 39501"}},"Hinds County, MS":{"recorder":{"name":"Hinds County Chancery Clerk","address":"316 S President St., Jackson, MS 39201"},"assessor":{"name":"Hinds County Tax Assessor","address":"316 S President St., Jackson, MS 39201"}},"Holmes County, MS":{"recorder":{"name":"Holmes County Chancery Clerk","address":"20 Court St., Lexington, MS 39095"},"assessor":{"name":"Holmes County Tax Assessor","address":"20 Court St., Lexington, MS 39095"}},"Humphreys County, MS":{"recorder":{"name":"Humphreys County Chancery Clerk","address":"102 Castleman St., Belzoni, MS 39038"},"assessor":{"name":"Humphreys County Tax Assessor","address":"102 Castleman St., Belzoni, MS 39038"}},"Issaquena County, MS":{"recorder":{"name":"Issaquena County Chancery Clerk","address":"Main St., Mayersville, MS 39113"},"assessor":{"name":"Issaquena County Tax Assessor","address":"Main St., Mayersville, MS 39113"}},"Itawamba County, MS":{"recorder":{"name":"Itawamba County Chancery Clerk","address":"201 W Main St., Fulton, MS 38843"},"assessor":{"name":"Itawamba County Tax Assessor","address":"201 W Main St., Fulton, MS 38843"}},"Jackson County, MS":{"recorder":{"name":"Jackson County Chancery Clerk","address":"3104 Magnolia St., Pascagoula, MS 39567"},"assessor":{"name":"Jackson County Tax Assessor","address":"3104 Magnolia St., Pascagoula, MS 39567"}},"Jasper County, MS":{"recorder":{"name":"Jasper County Chancery Clerk","address":"Bay Springs, MS 39422"},"assessor":{"name":"Jasper County Tax Assessor","address":"Bay Springs, MS 39422"}},"Jefferson County, MS":{"recorder":{"name":"Jefferson County Chancery Clerk","address":"1483 Main St., Fayette, MS 39069"},"assessor":{"name":"Jefferson County Tax Assessor","address":"1483 Main St., Fayette, MS 39069"}},"Jefferson Davis County, MS":{"recorder":{"name":"Jefferson Davis County Chancery Clerk","address":"1025 3rd St., Prentiss, MS 39474"},"assessor":{"name":"Jefferson Davis County Tax Assessor","address":"1025 3rd St., Prentiss, MS 39474"}},"Jones County, MS":{"recorder":{"name":"Jones County Chancery Clerk","address":"415 N 5th Ave., Laurel, MS 39441"},"assessor":{"name":"Jones County Tax Assessor","address":"415 N 5th Ave., Laurel, MS 39441"}},"Kemper County, MS":{"recorder":{"name":"Kemper County Chancery Clerk","address":"DeKalb, MS 39328"},"assessor":{"name":"Kemper County Tax Assessor","address":"DeKalb, MS 39328"}},"Lafayette County, MS":{"recorder":{"name":"Lafayette County Chancery Clerk","address":"300 N Lamar Blvd., Oxford, MS 38655"},"assessor":{"name":"Lafayette County Tax Assessor","address":"300 N Lamar Blvd., Oxford, MS 38655"}},"Lamar County, MS":{"recorder":{"name":"Lamar County Chancery Clerk","address":"203 Main St., Purvis, MS 39475"},"assessor":{"name":"Lamar County Tax Assessor","address":"203 Main St., Purvis, MS 39475"}},"Lauderdale County, MS":{"recorder":{"name":"Lauderdale County Chancery Clerk","address":"500 Constitution Ave., Meridian, MS 39301"},"assessor":{"name":"Lauderdale County Tax Assessor","address":"500 Constitution Ave., Meridian, MS 39301"}},"Lawrence County, MS":{"recorder":{"name":"Lawrence County Chancery Clerk","address":"517 E Jefferson St., Monticello, MS 39654"},"assessor":{"name":"Lawrence County Tax Assessor","address":"517 E Jefferson St., Monticello, MS 39654"}},"Leake County, MS":{"recorder":{"name":"Leake County Chancery Clerk","address":"101 E Centreville St., Carthage, MS 39051"},"assessor":{"name":"Leake County Tax Assessor","address":"101 E Centreville St., Carthage, MS 39051"}},"Lee County, MS":{"recorder":{"name":"Lee County Chancery Clerk","address":"200 Jefferson St., Tupelo, MS 38804"},"assessor":{"name":"Lee County Tax Assessor","address":"200 Jefferson St., Tupelo, MS 38804"}},"Leflore County, MS":{"recorder":{"name":"Leflore County Chancery Clerk","address":"317 W Market St., Greenwood, MS 38930"},"assessor":{"name":"Leflore County Tax Assessor","address":"317 W Market St., Greenwood, MS 38930"}},"Lincoln County, MS":{"recorder":{"name":"Lincoln County Chancery Clerk","address":"300 S 1st St., Brookhaven, MS 39601"},"assessor":{"name":"Lincoln County Tax Assessor","address":"300 S 1st St., Brookhaven, MS 39601"}},"Lowndes County, MS":{"recorder":{"name":"Lowndes County Chancery Clerk","address":"505 2nd Ave N, Columbus, MS 39701"},"assessor":{"name":"Lowndes County Tax Assessor","address":"505 2nd Ave N, Columbus, MS 39701"}},"Madison County, MS":{"recorder":{"name":"Madison County Chancery Clerk","address":"146 W Center St., Canton, MS 39046"},"assessor":{"name":"Madison County Tax Assessor","address":"146 W Center St., Canton, MS 39046"}},"Marion County, MS":{"recorder":{"name":"Marion County Chancery Clerk","address":"250 Broad St. Suite 2, Columbia, MS 39429"},"assessor":{"name":"Marion County Tax Assessor","address":"250 Broad St. Suite 2, Columbia, MS 39429"}},"Marshall County, MS":{"recorder":{"name":"Marshall County Chancery Clerk","address":"Holly Springs, MS 38635"},"assessor":{"name":"Marshall County Tax Assessor","address":"Holly Springs, MS 38635"}},"Monroe County, MS":{"recorder":{"name":"Monroe County Chancery Clerk","address":"301 S Commerce St., Aberdeen, MS 39730"},"assessor":{"name":"Monroe County Tax Assessor","address":"301 S Commerce St., Aberdeen, MS 39730"}},"Montgomery County, MS":{"recorder":{"name":"Montgomery County Chancery Clerk","address":"Winona, MS 38967"},"assessor":{"name":"Montgomery County Tax Assessor","address":"Winona, MS 38967"}},"Neshoba County, MS":{"recorder":{"name":"Neshoba County Chancery Clerk","address":"401 E Beacon St. Suite 201, Philadelphia, MS 39350"},"assessor":{"name":"Neshoba County Tax Assessor","address":"401 E Beacon St. Suite 201, Philadelphia, MS 39350"}},"Newton County, MS":{"recorder":{"name":"Newton County Chancery Clerk","address":"92 W Broad St., Decatur, MS 39327"},"assessor":{"name":"Newton County Tax Assessor","address":"92 W Broad St., Decatur, MS 39327"}},"Noxubee County, MS":{"recorder":{"name":"Noxubee County Chancery Clerk","address":"505 S Jefferson St., Macon, MS 39341"},"assessor":{"name":"Noxubee County Tax Assessor","address":"505 S Jefferson St., Macon, MS 39341"}},"Oktibbeha County, MS":{"recorder":{"name":"Oktibbeha County Chancery Clerk","address":"101 E Main St., Starkville, MS 39759"},"assessor":{"name":"Oktibbeha County Tax Assessor","address":"101 E Main St., Starkville, MS 39759"}},"Panola County, MS":{"recorder":{"name":"Panola County Chancery Clerk","address":"151 Public Square, Batesville, MS 38606"},"assessor":{"name":"Panola County Tax Assessor","address":"151 Public Square, Batesville, MS 38606"}},"Pearl River County, MS":{"recorder":{"name":"Pearl River County Chancery Clerk","address":"200 S Main St., Poplarville, MS 39470"},"assessor":{"name":"Pearl River County Tax Assessor","address":"200 S Main St., Poplarville, MS 39470"}},"Perry County, MS":{"recorder":{"name":"Perry County Chancery Clerk","address":"101 Main St., New Augusta, MS 39462"},"assessor":{"name":"Perry County Tax Assessor","address":"101 Main St., New Augusta, MS 39462"}},"Pike County, MS":{"recorder":{"name":"Pike County Chancery Clerk","address":"200 E Bay St., Magnolia, MS 39652"},"assessor":{"name":"Pike County Tax Assessor","address":"200 E Bay St., Magnolia, MS 39652"}},"Pontotoc County, MS":{"recorder":{"name":"Pontotoc County Chancery Clerk","address":"11 N Main St., Pontotoc, MS 38863"},"assessor":{"name":"Pontotoc County Tax Assessor","address":"11 N Main St., Pontotoc, MS 38863"}},"Prentiss County, MS":{"recorder":{"name":"Prentiss County Chancery Clerk","address":"101 N Main St., Booneville, MS 38829"},"assessor":{"name":"Prentiss County Tax Assessor","address":"101 N Main St., Booneville, MS 38829"}},"Quitman County, MS":{"recorder":{"name":"Quitman County Chancery Clerk","address":"230 Chestnut St., Marks, MS 38646"},"assessor":{"name":"Quitman County Tax Assessor","address":"230 Chestnut St., Marks, MS 38646"}},"Rankin County, MS":{"recorder":{"name":"Rankin County Chancery Clerk","address":"211 E Government St., Brandon, MS 39042"},"assessor":{"name":"Rankin County Tax Assessor","address":"211 E Government St., Brandon, MS 39042"}},"Scott County, MS":{"recorder":{"name":"Scott County Chancery Clerk","address":"100 E 1st St. Suite 1, Forest, MS 39074"},"assessor":{"name":"Scott County Tax Assessor","address":"100 E 1st St. Suite 1, Forest, MS 39074"}},"Sharkey County, MS":{"recorder":{"name":"Sharkey County Chancery Clerk","address":"400 Locust St., Rolling Fork, MS 39159"},"assessor":{"name":"Sharkey County Tax Assessor","address":"400 Locust St., Rolling Fork, MS 39159"}},"Simpson County, MS":{"recorder":{"name":"Simpson County Chancery Clerk","address":"109 W Pine Ave., Mendenhall, MS 39114"},"assessor":{"name":"Simpson County Tax Assessor","address":"109 W Pine Ave., Mendenhall, MS 39114"}},"Smith County, MS":{"recorder":{"name":"Smith County Chancery Clerk","address":"Box 39, Raleigh, MS 39153"},"assessor":{"name":"Smith County Tax Assessor","address":"Raleigh, MS 39153"}},"Stone County, MS":{"recorder":{"name":"Stone County Chancery Clerk","address":"323 Cavers Ave., Wiggins, MS 39577"},"assessor":{"name":"Stone County Tax Assessor","address":"323 Cavers Ave., Wiggins, MS 39577"}},"Sunflower County, MS":{"recorder":{"name":"Sunflower County Chancery Clerk","address":"200 Main St., Indianola, MS 38751"},"assessor":{"name":"Sunflower County Tax Assessor","address":"200 Main St., Indianola, MS 38751"}},"Tallahatchie County, MS":{"recorder":{"name":"Tallahatchie County Chancery Clerk","address":"1 Court Square, Charleston, MS 38921"},"assessor":{"name":"Tallahatchie County Tax Assessor","address":"1 Court Square, Charleston, MS 38921"}},"Tate County, MS":{"recorder":{"name":"Tate County Chancery Clerk","address":"201 Ward St., Senatobia, MS 38668"},"assessor":{"name":"Tate County Tax Assessor","address":"201 Ward St., Senatobia, MS 38668"}},"Tippah County, MS":{"recorder":{"name":"Tippah County Chancery Clerk","address":"101 S Court St., Ripley, MS 38663"},"assessor":{"name":"Tippah County Tax Assessor","address":"101 S Court St., Ripley, MS 38663"}},"Tishomingo County, MS":{"recorder":{"name":"Tishomingo County Chancery Clerk","address":"1008 Battleground Dr., Iuka, MS 38852"},"assessor":{"name":"Tishomingo County Tax Assessor","address":"1008 Battleground Dr., Iuka, MS 38852"}},"Tunica County, MS":{"recorder":{"name":"Tunica County Chancery Clerk","address":"1 Court Square Suite 1, Tunica, MS 38676"},"assessor":{"name":"Tunica County Tax Assessor","address":"1 Court Square Suite 1, Tunica, MS 38676"}},"Union County, MS":{"recorder":{"name":"Union County Chancery Clerk","address":"109 Main St. W, New Albany, MS 38652"},"assessor":{"name":"Union County Tax Assessor","address":"109 Main St. W, New Albany, MS 38652"}},"Walthall County, MS":{"recorder":{"name":"Walthall County Chancery Clerk","address":"200 Ball Ave., Tylertown, MS 39667"},"assessor":{"name":"Walthall County Tax Assessor","address":"200 Ball Ave., Tylertown, MS 39667"}},"Warren County, MS":{"recorder":{"name":"Warren County Chancery Clerk","address":"1009 Cherry St., Vicksburg, MS 39183"},"assessor":{"name":"Warren County Tax Assessor","address":"1009 Cherry St., Vicksburg, MS 39183"}},"Washington County, MS":{"recorder":{"name":"Washington County Chancery Clerk","address":"300 Main St., Greenville, MS 38701"},"assessor":{"name":"Washington County Tax Assessor","address":"300 Main St., Greenville, MS 38701"}},"Wayne County, MS":{"recorder":{"name":"Wayne County Chancery Clerk","address":"609 Azalea Dr., Waynesboro, MS 39367"},"assessor":{"name":"Wayne County Tax Assessor","address":"609 Azalea Dr., Waynesboro, MS 39367"}},"Webster County, MS":{"recorder":{"name":"Webster County Chancery Clerk","address":"1 Court Square Suite A, Walthall, MS 39771"},"assessor":{"name":"Webster County Tax Assessor","address":"1 Court Square Suite A, Walthall, MS 39771"}},"Wilkinson County, MS":{"recorder":{"name":"Wilkinson County Chancery Clerk","address":"525 Main St., Woodville, MS 39669"},"assessor":{"name":"Wilkinson County Tax Assessor","address":"525 Main St., Woodville, MS 39669"}},"Winston County, MS":{"recorder":{"name":"Winston County Chancery Clerk","address":"Main St., Louisville, MS 39339"},"assessor":{"name":"Winston County Tax Assessor","address":"Main St., Louisville, MS 39339"}},"Yalobusha County, MS":{"recorder":{"name":"Yalobusha County Chancery Clerk","address":"Coffeeville, MS 38922"},"assessor":{"name":"Yalobusha County Tax Assessor","address":"Coffeeville, MS 38922"}},"Yazoo County, MS":{"recorder":{"name":"Yazoo County Chancery Clerk","address":"211 E Broadway St., Yazoo City, MS 39194"},"assessor":{"name":"Yazoo County Tax Assessor","address":"211 E Broadway St., Yazoo City, MS 39194"}},"Beaverhead County, MT":{"recorder":{"name":"Beaverhead County Clerk & Recorder","address":"2 S Pacific St., Dillon, MT 59725"},"assessor":{"name":"MT Dept. of Revenue - Beaverhead County","address":"2 S Pacific St., Dillon, MT 59725"}},"Big Horn County, MT":{"recorder":{"name":"Big Horn County Clerk & Recorder","address":"121 W 3rd St., Hardin, MT 59034"},"assessor":{"name":"MT Dept. of Revenue - Big Horn County","address":"121 W 3rd St., Hardin, MT 59034"}},"Blaine County, MT":{"recorder":{"name":"Blaine County Clerk & Recorder","address":"400 Ohio St., Chinook, MT 59523"},"assessor":{"name":"MT Dept. of Revenue - Blaine County","address":"400 Ohio St., Chinook, MT 59523"}},"Broadwater County, MT":{"recorder":{"name":"Broadwater County Clerk & Recorder","address":"515 Broadway St., Townsend, MT 59644"},"assessor":{"name":"MT Dept. of Revenue - Broadwater County","address":"515 Broadway St., Townsend, MT 59644"}},"Carbon County, MT":{"recorder":{"name":"Carbon County Clerk & Recorder","address":"17 W 11th St., Red Lodge, MT 59068"},"assessor":{"name":"MT Dept. of Revenue - Carbon County","address":"17 W 11th St., Red Lodge, MT 59068"}},"Carter County, MT":{"recorder":{"name":"Carter County Clerk & Recorder","address":"214 Park St., Ekalaka, MT 59324"},"assessor":{"name":"MT Dept. of Revenue - Carter County","address":"214 Park St., Ekalaka, MT 59324"}},"Cascade County, MT":{"recorder":{"name":"Cascade County Clerk & Recorder","address":"325 2nd Ave N, Great Falls, MT 59401"},"assessor":{"name":"MT Dept. of Revenue - Cascade County","address":"400 Central Ave Suite 125, Great Falls, MT 59401"}},"Chouteau County, MT":{"recorder":{"name":"Chouteau County Clerk & Recorder","address":"1308 Franklin St., Fort Benton, MT 59442"},"assessor":{"name":"MT Dept. of Revenue - Chouteau County","address":"1308 Franklin St., Fort Benton, MT 59442"}},"Custer County, MT":{"recorder":{"name":"Custer County Clerk & Recorder","address":"1010 Main St., Miles City, MT 59301"},"assessor":{"name":"MT Dept. of Revenue - Custer County","address":"1010 Main St., Miles City, MT 59301"}},"Daniels County, MT":{"recorder":{"name":"Daniels County Clerk & Recorder","address":"213 Main St., Scobey, MT 59263"},"assessor":{"name":"MT Dept. of Revenue - Daniels County","address":"213 Main St., Scobey, MT 59263"}},"Dawson County, MT":{"recorder":{"name":"Dawson County Clerk & Recorder","address":"207 W Bell St., Glendive, MT 59330"},"assessor":{"name":"MT Dept. of Revenue - Dawson County","address":"207 W Bell St., Glendive, MT 59330"}},"Deer Lodge County, MT":{"recorder":{"name":"Deer Lodge County Clerk & Recorder","address":"800 S Main St., Anaconda, MT 59711"},"assessor":{"name":"MT Dept. of Revenue - Deer Lodge County","address":"800 S Main St., Anaconda, MT 59711"}},"Fallon County, MT":{"recorder":{"name":"Fallon County Clerk & Recorder","address":"10 W Fallon Ave., Baker, MT 59313"},"assessor":{"name":"MT Dept. of Revenue - Fallon County","address":"10 W Fallon Ave., Baker, MT 59313"}},"Fergus County, MT":{"recorder":{"name":"Fergus County Clerk & Recorder","address":"712 W Main St., Lewistown, MT 59457"},"assessor":{"name":"MT Dept. of Revenue - Fergus County","address":"712 W Main St., Lewistown, MT 59457"}},"Flathead County, MT":{"recorder":{"name":"Flathead County Clerk & Recorder","address":"800 S Main St., Kalispell, MT 59901"},"assessor":{"name":"MT Dept. of Revenue - Flathead County","address":"100 Financial Dr. Suite 110, Kalispell, MT 59901"}},"Gallatin County, MT":{"recorder":{"name":"Gallatin County Clerk & Recorder","address":"311 W Main St. Room 203, Bozeman, MT 59715"},"assessor":{"name":"MT Dept. of Revenue - Gallatin County","address":"2273 Bootlegger Trail, Bozeman, MT 59715"}},"Garfield County, MT":{"recorder":{"name":"Garfield County Clerk & Recorder","address":"507 Main St., Jordan, MT 59337"},"assessor":{"name":"MT Dept. of Revenue - Garfield County","address":"507 Main St., Jordan, MT 59337"}},"Glacier County, MT":{"recorder":{"name":"Glacier County Clerk & Recorder","address":"512 E Main St., Cut Bank, MT 59427"},"assessor":{"name":"MT Dept. of Revenue - Glacier County","address":"512 E Main St., Cut Bank, MT 59427"}},"Golden Valley County, MT":{"recorder":{"name":"Golden Valley County Clerk & Recorder","address":"107 Kemp St., Ryegate, MT 59074"},"assessor":{"name":"MT Dept. of Revenue - Golden Valley County","address":"107 Kemp St., Ryegate, MT 59074"}},"Granite County, MT":{"recorder":{"name":"Granite County Clerk & Recorder","address":"220 N Sansome St., Philipsburg, MT 59858"},"assessor":{"name":"MT Dept. of Revenue - Granite County","address":"220 N Sansome St., Philipsburg, MT 59858"}},"Hill County, MT":{"recorder":{"name":"Hill County Clerk & Recorder","address":"315 4th St., Havre, MT 59501"},"assessor":{"name":"MT Dept. of Revenue - Hill County","address":"315 4th St., Havre, MT 59501"}},"Jefferson County, MT":{"recorder":{"name":"Jefferson County Clerk & Recorder","address":"201 Centennial St., Boulder, MT 59632"},"assessor":{"name":"MT Dept. of Revenue - Jefferson County","address":"201 Centennial St., Boulder, MT 59632"}},"Judith Basin County, MT":{"recorder":{"name":"Judith Basin County Clerk & Recorder","address":"11 3rd St N, Stanford, MT 59479"},"assessor":{"name":"MT Dept. of Revenue - Judith Basin County","address":"11 3rd St N, Stanford, MT 59479"}},"Lake County, MT":{"recorder":{"name":"Lake County Clerk & Recorder","address":"106 4th Ave E, Polson, MT 59860"},"assessor":{"name":"MT Dept. of Revenue - Lake County","address":"106 4th Ave E, Polson, MT 59860"}},"Lewis and Clark County, MT":{"recorder":{"name":"Lewis and Clark County Clerk & Recorder","address":"316 N Park Ave., Helena, MT 59601"},"assessor":{"name":"MT Dept. of Revenue - Lewis and Clark County","address":"340 N Last Chance Gulch Suite 2A, Helena, MT 59601"}},"Liberty County, MT":{"recorder":{"name":"Liberty County Clerk & Recorder","address":"111 1st St E, Chester, MT 59522"},"assessor":{"name":"MT Dept. of Revenue - Liberty County","address":"111 1st St E, Chester, MT 59522"}},"Lincoln County, MT":{"recorder":{"name":"Lincoln County Clerk & Recorder","address":"512 California Ave., Libby, MT 59923"},"assessor":{"name":"MT Dept. of Revenue - Lincoln County","address":"512 California Ave., Libby, MT 59923"}},"Madison County, MT":{"recorder":{"name":"Madison County Clerk & Recorder","address":"110 W Wallace St., Virginia City, MT 59755"},"assessor":{"name":"MT Dept. of Revenue - Madison County","address":"110 W Wallace St., Virginia City, MT 59755"}},"McCone County, MT":{"recorder":{"name":"McCone County Clerk & Recorder","address":"1004 C Ave., Circle, MT 59215"},"assessor":{"name":"MT Dept. of Revenue - McCone County","address":"1004 C Ave., Circle, MT 59215"}},"Meagher County, MT":{"recorder":{"name":"Meagher County Clerk & Recorder","address":"15 W Main St., White Sulphur Springs, MT 59645"},"assessor":{"name":"MT Dept. of Revenue - Meagher County","address":"15 W Main St., White Sulphur Springs, MT 59645"}},"Mineral County, MT":{"recorder":{"name":"Mineral County Clerk & Recorder","address":"300 River St., Superior, MT 59872"},"assessor":{"name":"MT Dept. of Revenue - Mineral County","address":"300 River St., Superior, MT 59872"}},"Missoula County, MT":{"recorder":{"name":"Missoula County Clerk & Recorder","address":"200 W Broadway St., Missoula, MT 59802"},"assessor":{"name":"MT Dept. of Revenue - Missoula County","address":"3100 N Reserve St. Suite A, Missoula, MT 59808"}},"Musselshell County, MT":{"recorder":{"name":"Musselshell County Clerk & Recorder","address":"506 Main St., Roundup, MT 59072"},"assessor":{"name":"MT Dept. of Revenue - Musselshell County","address":"506 Main St., Roundup, MT 59072"}},"Park County, MT":{"recorder":{"name":"Park County Clerk & Recorder","address":"414 E Callender St., Livingston, MT 59047"},"assessor":{"name":"MT Dept. of Revenue - Park County","address":"414 E Callender St., Livingston, MT 59047"}},"Petroleum County, MT":{"recorder":{"name":"Petroleum County Clerk & Recorder","address":"201 E Main St., Winnett, MT 59087"},"assessor":{"name":"MT Dept. of Revenue - Petroleum County","address":"201 E Main St., Winnett, MT 59087"}},"Phillips County, MT":{"recorder":{"name":"Phillips County Clerk & Recorder","address":"314 S 2nd Ave W, Malta, MT 59538"},"assessor":{"name":"MT Dept. of Revenue - Phillips County","address":"314 S 2nd Ave W, Malta, MT 59538"}},"Pondera County, MT":{"recorder":{"name":"Pondera County Clerk & Recorder","address":"20 4th Ave SW, Conrad, MT 59425"},"assessor":{"name":"MT Dept. of Revenue - Pondera County","address":"20 4th Ave SW, Conrad, MT 59425"}},"Powder River County, MT":{"recorder":{"name":"Powder River County Clerk & Recorder","address":"119 Centre Ave., Broadus, MT 59317"},"assessor":{"name":"MT Dept. of Revenue - Powder River County","address":"119 Centre Ave., Broadus, MT 59317"}},"Powell County, MT":{"recorder":{"name":"Powell County Clerk & Recorder","address":"409 Missouri Ave., Deer Lodge, MT 59722"},"assessor":{"name":"MT Dept. of Revenue - Powell County","address":"409 Missouri Ave., Deer Lodge, MT 59722"}},"Prairie County, MT":{"recorder":{"name":"Prairie County Clerk & Recorder","address":"217 W Park St., Terry, MT 59349"},"assessor":{"name":"MT Dept. of Revenue - Prairie County","address":"217 W Park St., Terry, MT 59349"}},"Ravalli County, MT":{"recorder":{"name":"Ravalli County Clerk & Recorder","address":"215 S 4th St. Suite A, Hamilton, MT 59840"},"assessor":{"name":"MT Dept. of Revenue - Ravalli County","address":"225 Bedford St. Suite D, Hamilton, MT 59840"}},"Richland County, MT":{"recorder":{"name":"Richland County Clerk & Recorder","address":"201 W Main St., Sidney, MT 59270"},"assessor":{"name":"MT Dept. of Revenue - Richland County","address":"201 W Main St., Sidney, MT 59270"}},"Roosevelt County, MT":{"recorder":{"name":"Roosevelt County Clerk & Recorder","address":"400 2nd Ave S, Wolf Point, MT 59201"},"assessor":{"name":"MT Dept. of Revenue - Roosevelt County","address":"400 2nd Ave S, Wolf Point, MT 59201"}},"Rosebud County, MT":{"recorder":{"name":"Rosebud County Clerk & Recorder","address":"1 S Main St., Forsyth, MT 59327"},"assessor":{"name":"MT Dept. of Revenue - Rosebud County","address":"1 S Main St., Forsyth, MT 59327"}},"Sanders County, MT":{"recorder":{"name":"Sanders County Clerk & Recorder","address":"1111 Main St., Thompson Falls, MT 59873"},"assessor":{"name":"MT Dept. of Revenue - Sanders County","address":"1111 Main St., Thompson Falls, MT 59873"}},"Sheridan County, MT":{"recorder":{"name":"Sheridan County Clerk & Recorder","address":"100 W Laurel Ave., Plentywood, MT 59254"},"assessor":{"name":"MT Dept. of Revenue - Sheridan County","address":"100 W Laurel Ave., Plentywood, MT 59254"}},"Silver Bow County, MT":{"recorder":{"name":"Silver Bow County Clerk & Recorder","address":"155 W Granite St., Butte, MT 59701"},"assessor":{"name":"MT Dept. of Revenue - Silver Bow County","address":"155 W Granite St., Butte, MT 59701"}},"Stillwater County, MT":{"recorder":{"name":"Stillwater County Clerk & Recorder","address":"400 E 3rd Ave N, Columbus, MT 59019"},"assessor":{"name":"MT Dept. of Revenue - Stillwater County","address":"400 E 3rd Ave N, Columbus, MT 59019"}},"Sweet Grass County, MT":{"recorder":{"name":"Sweet Grass County Clerk & Recorder","address":"1 American Legion St., Big Timber, MT 59011"},"assessor":{"name":"MT Dept. of Revenue - Sweet Grass County","address":"1 American Legion St., Big Timber, MT 59011"}},"Teton County, MT":{"recorder":{"name":"Teton County Clerk & Recorder","address":"1 Main Ave N, Choteau, MT 59422"},"assessor":{"name":"MT Dept. of Revenue - Teton County","address":"1 Main Ave N, Choteau, MT 59422"}},"Toole County, MT":{"recorder":{"name":"Toole County Clerk & Recorder","address":"226 1st St S, Shelby, MT 59474"},"assessor":{"name":"MT Dept. of Revenue - Toole County","address":"226 1st St S, Shelby, MT 59474"}},"Treasure County, MT":{"recorder":{"name":"Treasure County Clerk & Recorder","address":"307 Rapelje Ave., Hysham, MT 59038"},"assessor":{"name":"MT Dept. of Revenue - Treasure County","address":"307 Rapelje Ave., Hysham, MT 59038"}},"Valley County, MT":{"recorder":{"name":"Valley County Clerk & Recorder","address":"501 Court Square, Glasgow, MT 59230"},"assessor":{"name":"MT Dept. of Revenue - Valley County","address":"501 Court Square, Glasgow, MT 59230"}},"Wheatland County, MT":{"recorder":{"name":"Wheatland County Clerk & Recorder","address":"201 A Ave NW, Harlowton, MT 59036"},"assessor":{"name":"MT Dept. of Revenue - Wheatland County","address":"201 A Ave NW, Harlowton, MT 59036"}},"Wibaux County, MT":{"recorder":{"name":"Wibaux County Clerk & Recorder","address":"200 S Wibaux St., Wibaux, MT 59353"},"assessor":{"name":"MT Dept. of Revenue - Wibaux County","address":"200 S Wibaux St., Wibaux, MT 59353"}},"Yellowstone County, MT":{"recorder":{"name":"Yellowstone County Clerk & Recorder","address":"217 N 27th St., Billings, MT 59101"},"assessor":{"name":"MT Dept. of Revenue - Yellowstone County","address":"1111 Main St. Suite 300, Billings, MT 59105"}},"Alamance County, NC":{"recorder":{"name":"Alamance County Register of Deeds","address":"124 W Elm St., Graham, NC 27253"},"assessor":{"name":"Alamance County Tax Assessor","address":"124 W Elm St., Graham, NC 27253"}},"Alexander County, NC":{"recorder":{"name":"Alexander County Register of Deeds","address":"77 1st St. SW Suite 6, Taylorsville, NC 28681"},"assessor":{"name":"Alexander County Tax Assessor","address":"77 1st St. SW Suite 6, Taylorsville, NC 28681"}},"Alleghany County, NC":{"recorder":{"name":"Alleghany County Register of Deeds","address":"12 N Main St. Suite 4, Sparta, NC 28675"},"assessor":{"name":"Alleghany County Tax Assessor","address":"12 N Main St. Suite 4, Sparta, NC 28675"}},"Anson County, NC":{"recorder":{"name":"Anson County Register of Deeds","address":"101 S Greene St. Suite 30, Wadesboro, NC 28170"},"assessor":{"name":"Anson County Tax Assessor","address":"101 S Greene St. Suite 30, Wadesboro, NC 28170"}},"Ashe County, NC":{"recorder":{"name":"Ashe County Register of Deeds","address":"150 Government Circle Suite 2300, Jefferson, NC 28640"},"assessor":{"name":"Ashe County Tax Assessor","address":"150 Government Circle Suite 2300, Jefferson, NC 28640"}},"Avery County, NC":{"recorder":{"name":"Avery County Register of Deeds","address":"200 Montezuma St., Newland, NC 28657"},"assessor":{"name":"Avery County Tax Assessor","address":"200 Montezuma St., Newland, NC 28657"}},"Beaufort County, NC":{"recorder":{"name":"Beaufort County Register of Deeds","address":"112 W 2nd St., Washington, NC 27889"},"assessor":{"name":"Beaufort County Tax Assessor","address":"112 W 2nd St., Washington, NC 27889"}},"Bertie County, NC":{"recorder":{"name":"Bertie County Register of Deeds","address":"106 Dundee St., Windsor, NC 27983"},"assessor":{"name":"Bertie County Tax Assessor","address":"106 Dundee St., Windsor, NC 27983"}},"Bladen County, NC":{"recorder":{"name":"Bladen County Register of Deeds","address":"106 E Broad St., Elizabethtown, NC 28337"},"assessor":{"name":"Bladen County Tax Assessor","address":"106 E Broad St., Elizabethtown, NC 28337"}},"Brunswick County, NC":{"recorder":{"name":"Brunswick County Register of Deeds","address":"75 Courthouse Dr. Suite 130, Bolivia, NC 28422"},"assessor":{"name":"Brunswick County Tax Assessor","address":"75 Courthouse Dr. Suite 130, Bolivia, NC 28422"}},"Buncombe County, NC":{"recorder":{"name":"Buncombe County Register of Deeds","address":"205 College St., Asheville, NC 28801"},"assessor":{"name":"Buncombe County Tax Assessor","address":"94 Coxe Ave., Asheville, NC 28801"}},"Burke County, NC":{"recorder":{"name":"Burke County Register of Deeds","address":"201 S Green St., Morganton, NC 28655"},"assessor":{"name":"Burke County Tax Assessor","address":"201 S Green St., Morganton, NC 28655"}},"Cabarrus County, NC":{"recorder":{"name":"Cabarrus County Register of Deeds","address":"65 Church St. SE, Concord, NC 28025"},"assessor":{"name":"Cabarrus County Tax Assessor","address":"65 Church St. SE, Concord, NC 28025"}},"Caldwell County, NC":{"recorder":{"name":"Caldwell County Register of Deeds","address":"905 W Ave. NW, Lenoir, NC 28645"},"assessor":{"name":"Caldwell County Tax Assessor","address":"905 W Ave. NW, Lenoir, NC 28645"}},"Camden County, NC":{"recorder":{"name":"Camden County Register of Deeds","address":"117 NC-343, Camden, NC 27921"},"assessor":{"name":"Camden County Tax Assessor","address":"117 NC-343, Camden, NC 27921"}},"Carteret County, NC":{"recorder":{"name":"Carteret County Register of Deeds","address":"302 Courthouse Square, Beaufort, NC 28516"},"assessor":{"name":"Carteret County Tax Assessor","address":"302 Courthouse Square, Beaufort, NC 28516"}},"Caswell County, NC":{"recorder":{"name":"Caswell County Register of Deeds","address":"144 Court Square, Yanceyville, NC 27379"},"assessor":{"name":"Caswell County Tax Assessor","address":"144 Court Square, Yanceyville, NC 27379"}},"Catawba County, NC":{"recorder":{"name":"Catawba County Register of Deeds","address":"100 SW Blvd. Suite 100, Newton, NC 28658"},"assessor":{"name":"Catawba County Tax Assessor","address":"100 SW Blvd. Suite 100, Newton, NC 28658"}},"Chatham County, NC":{"recorder":{"name":"Chatham County Register of Deeds","address":"12 E St., Pittsboro, NC 27312"},"assessor":{"name":"Chatham County Tax Assessor","address":"12 E St., Pittsboro, NC 27312"}},"Cherokee County, NC":{"recorder":{"name":"Cherokee County Register of Deeds","address":"75 Peachtree St. Suite 112, Murphy, NC 28906"},"assessor":{"name":"Cherokee County Tax Assessor","address":"75 Peachtree St. Suite 112, Murphy, NC 28906"}},"Chowan County, NC":{"recorder":{"name":"Chowan County Register of Deeds","address":"305 King St. Suite 1, Edenton, NC 27932"},"assessor":{"name":"Chowan County Tax Assessor","address":"305 King St. Suite 1, Edenton, NC 27932"}},"Clay County, NC":{"recorder":{"name":"Clay County Register of Deeds","address":"261 Courthouse Dr. Suite 10, Hayesville, NC 28904"},"assessor":{"name":"Clay County Tax Assessor","address":"261 Courthouse Dr. Suite 10, Hayesville, NC 28904"}},"Cleveland County, NC":{"recorder":{"name":"Cleveland County Register of Deeds","address":"311 E Marion St., Shelby, NC 28150"},"assessor":{"name":"Cleveland County Tax Assessor","address":"311 E Marion St., Shelby, NC 28150"}},"Columbus County, NC":{"recorder":{"name":"Columbus County Register of Deeds","address":"111 Washington St., Whiteville, NC 28472"},"assessor":{"name":"Columbus County Tax Assessor","address":"111 Washington St., Whiteville, NC 28472"}},"Craven County, NC":{"recorder":{"name":"Craven County Register of Deeds","address":"302 Broad St., New Bern, NC 28560"},"assessor":{"name":"Craven County Tax Assessor","address":"226 Middle St. Suite 121, New Bern, NC 28560"}},"Cumberland County, NC":{"recorder":{"name":"Cumberland County Register of Deeds","address":"117 Dick St., Fayetteville, NC 28301"},"assessor":{"name":"Cumberland County Tax Assessor","address":"117 Dick St., Fayetteville, NC 28301"}},"Currituck County, NC":{"recorder":{"name":"Currituck County Register of Deeds","address":"153 Courthouse Rd. Suite 101, Currituck, NC 27929"},"assessor":{"name":"Currituck County Tax Assessor","address":"153 Courthouse Rd. Suite 101, Currituck, NC 27929"}},"Dare County, NC":{"recorder":{"name":"Dare County Register of Deeds","address":"954 Marshall C Collins Dr., Manteo, NC 27954"},"assessor":{"name":"Dare County Tax Assessor","address":"954 Marshall C Collins Dr., Manteo, NC 27954"}},"Davidson County, NC":{"recorder":{"name":"Davidson County Register of Deeds","address":"913 Greensboro St., Lexington, NC 27292"},"assessor":{"name":"Davidson County Tax Assessor","address":"913 Greensboro St., Lexington, NC 27292"}},"Davie County, NC":{"recorder":{"name":"Davie County Register of Deeds","address":"123 S Main St., Mocksville, NC 27028"},"assessor":{"name":"Davie County Tax Assessor","address":"123 S Main St., Mocksville, NC 27028"}},"Duplin County, NC":{"recorder":{"name":"Duplin County Register of Deeds","address":"224 Seminary St., Kenansville, NC 28349"},"assessor":{"name":"Duplin County Tax Assessor","address":"224 Seminary St., Kenansville, NC 28349"}},"Durham County, NC":{"recorder":{"name":"Durham County Register of Deeds","address":"201 E Main St. 2nd Floor, Durham, NC 27701"},"assessor":{"name":"Durham County Tax Assessor","address":"201 E Main St. 3rd Floor, Durham, NC 27701"}},"Edgecombe County, NC":{"recorder":{"name":"Edgecombe County Register of Deeds","address":"301 St. Andrew St., Tarboro, NC 27886"},"assessor":{"name":"Edgecombe County Tax Assessor","address":"301 St. Andrew St., Tarboro, NC 27886"}},"Forsyth County, NC":{"recorder":{"name":"Forsyth County Register of Deeds","address":"201 N Chestnut St., Winston-Salem, NC 27101"},"assessor":{"name":"Forsyth County Tax Assessor","address":"201 N Chestnut St., Winston-Salem, NC 27101"}},"Franklin County, NC":{"recorder":{"name":"Franklin County Register of Deeds","address":"113 Market St. Suite 101, Louisburg, NC 27549"},"assessor":{"name":"Franklin County Tax Assessor","address":"113 Market St. Suite 101, Louisburg, NC 27549"}},"Gaston County, NC":{"recorder":{"name":"Gaston County Register of Deeds","address":"325 N Marietta St., Gastonia, NC 28052"},"assessor":{"name":"Gaston County Tax Assessor","address":"128 W Main Ave., Gastonia, NC 28052"}},"Gates County, NC":{"recorder":{"name":"Gates County Register of Deeds","address":"123 Court St., Gatesville, NC 27938"},"assessor":{"name":"Gates County Tax Assessor","address":"123 Court St., Gatesville, NC 27938"}},"Graham County, NC":{"recorder":{"name":"Graham County Register of Deeds","address":"12 N Main St., Robbinsville, NC 28771"},"assessor":{"name":"Graham County Tax Assessor","address":"12 N Main St., Robbinsville, NC 28771"}},"Granville County, NC":{"recorder":{"name":"Granville County Register of Deeds","address":"101 Main St. Suite 103, Oxford, NC 27565"},"assessor":{"name":"Granville County Tax Assessor","address":"101 Main St. Suite 103, Oxford, NC 27565"}},"Greene County, NC":{"recorder":{"name":"Greene County Register of Deeds","address":"229 Kingold Blvd. Suite A, Snow Hill, NC 28580"},"assessor":{"name":"Greene County Tax Assessor","address":"229 Kingold Blvd. Suite A, Snow Hill, NC 28580"}},"Guilford County, NC":{"recorder":{"name":"Guilford County Register of Deeds","address":"201 W Market St., Greensboro, NC 27401"},"assessor":{"name":"Guilford County Tax Assessor","address":"400 W Market St. Suite 100, Greensboro, NC 27401"}},"Halifax County, NC":{"recorder":{"name":"Halifax County Register of Deeds","address":"357 Ferrell Ln., Halifax, NC 27839"},"assessor":{"name":"Halifax County Tax Assessor","address":"357 Ferrell Ln., Halifax, NC 27839"}},"Harnett County, NC":{"recorder":{"name":"Harnett County Register of Deeds","address":"305 W Cornelius Harnett Blvd. Suite 100, Lillington, NC 27546"},"assessor":{"name":"Harnett County Tax Assessor","address":"305 W Cornelius Harnett Blvd. Suite 100, Lillington, NC 27546"}},"Haywood County, NC":{"recorder":{"name":"Haywood County Register of Deeds","address":"215 N Main St., Waynesville, NC 28786"},"assessor":{"name":"Haywood County Tax Assessor","address":"215 N Main St., Waynesville, NC 28786"}},"Henderson County, NC":{"recorder":{"name":"Henderson County Register of Deeds","address":"200 N Grove St. Suite 129, Hendersonville, NC 28792"},"assessor":{"name":"Henderson County Tax Assessor","address":"200 N Grove St. Suite 129, Hendersonville, NC 28792"}},"Hertford County, NC":{"recorder":{"name":"Hertford County Register of Deeds","address":"301 N Washington St. Suite 110, Winton, NC 27986"},"assessor":{"name":"Hertford County Tax Assessor","address":"301 N Washington St. Suite 110, Winton, NC 27986"}},"Hoke County, NC":{"recorder":{"name":"Hoke County Register of Deeds","address":"304 N Main St., Raeford, NC 28376"},"assessor":{"name":"Hoke County Tax Assessor","address":"304 N Main St., Raeford, NC 28376"}},"Hyde County, NC":{"recorder":{"name":"Hyde County Register of Deeds","address":"30 Oyster Creek Rd., Swan Quarter, NC 27885"},"assessor":{"name":"Hyde County Tax Assessor","address":"30 Oyster Creek Rd., Swan Quarter, NC 27885"}},"Iredell County, NC":{"recorder":{"name":"Iredell County Register of Deeds","address":"203 Stockton St., Statesville, NC 28677"},"assessor":{"name":"Iredell County Tax Assessor","address":"203 Stockton St., Statesville, NC 28677"}},"Jackson County, NC":{"recorder":{"name":"Jackson County Register of Deeds","address":"401 Grindstaff Cove Rd. Suite A-140, Sylva, NC 28779"},"assessor":{"name":"Jackson County Tax Assessor","address":"401 Grindstaff Cove Rd. Suite A-140, Sylva, NC 28779"}},"Johnston County, NC":{"recorder":{"name":"Johnston County Register of Deeds","address":"207 E Johnston St., Smithfield, NC 27577"},"assessor":{"name":"Johnston County Tax Assessor","address":"207 E Johnston St., Smithfield, NC 27577"}},"Jones County, NC":{"recorder":{"name":"Jones County Register of Deeds","address":"101 Market St., Trenton, NC 28585"},"assessor":{"name":"Jones County Tax Assessor","address":"101 Market St., Trenton, NC 28585"}},"Lee County, NC":{"recorder":{"name":"Lee County Register of Deeds","address":"105 Courthouse Square, Sanford, NC 27330"},"assessor":{"name":"Lee County Tax Assessor","address":"105 Courthouse Square, Sanford, NC 27330"}},"Lenoir County, NC":{"recorder":{"name":"Lenoir County Register of Deeds","address":"130 S Queen St., Kinston, NC 28501"},"assessor":{"name":"Lenoir County Tax Assessor","address":"130 S Queen St., Kinston, NC 28501"}},"Lincoln County, NC":{"recorder":{"name":"Lincoln County Register of Deeds","address":"302 N Academy St. Suite 100, Lincolnton, NC 28092"},"assessor":{"name":"Lincoln County Tax Assessor","address":"302 N Academy St. Suite 100, Lincolnton, NC 28092"}},"Macon County, NC":{"recorder":{"name":"Macon County Register of Deeds","address":"5 W Main St., Franklin, NC 28734"},"assessor":{"name":"Macon County Tax Assessor","address":"5 W Main St., Franklin, NC 28734"}},"Madison County, NC":{"recorder":{"name":"Madison County Register of Deeds","address":"2 N Main St. Suite 209, Marshall, NC 28753"},"assessor":{"name":"Madison County Tax Assessor","address":"2 N Main St. Suite 209, Marshall, NC 28753"}},"Martin County, NC":{"recorder":{"name":"Martin County Register of Deeds","address":"305 E Main St., Williamston, NC 27892"},"assessor":{"name":"Martin County Tax Assessor","address":"305 E Main St., Williamston, NC 27892"}},"McDowell County, NC":{"recorder":{"name":"McDowell County Register of Deeds","address":"1 S Main St. Suite 119, Marion, NC 28752"},"assessor":{"name":"McDowell County Tax Assessor","address":"1 S Main St. Suite 119, Marion, NC 28752"}},"Mecklenburg County, NC":{"recorder":{"name":"Mecklenburg County Register of Deeds","address":"720 E 4th St., Charlotte, NC 28202"},"assessor":{"name":"Mecklenburg County Tax Assessor","address":"700 E Stonewall St., Charlotte, NC 28202"}},"Mitchell County, NC":{"recorder":{"name":"Mitchell County Register of Deeds","address":"11 Crimson Laurel Circle Suite 1, Bakersville, NC 28705"},"assessor":{"name":"Mitchell County Tax Assessor","address":"11 Crimson Laurel Circle Suite 1, Bakersville, NC 28705"}},"Montgomery County, NC":{"recorder":{"name":"Montgomery County Register of Deeds","address":"102 E Spring St. Suite 203, Troy, NC 27371"},"assessor":{"name":"Montgomery County Tax Assessor","address":"102 E Spring St. Suite 203, Troy, NC 27371"}},"Moore County, NC":{"recorder":{"name":"Moore County Register of Deeds","address":"1 Courthouse Square Suite 1, Carthage, NC 28327"},"assessor":{"name":"Moore County Tax Assessor","address":"1 Courthouse Square Suite 1, Carthage, NC 28327"}},"Nash County, NC":{"recorder":{"name":"Nash County Register of Deeds","address":"120 W Washington St. Suite 6010, Nashville, NC 27856"},"assessor":{"name":"Nash County Tax Assessor","address":"120 W Washington St. Suite 6010, Nashville, NC 27856"}},"New Hanover County, NC":{"recorder":{"name":"New Hanover County Register of Deeds","address":"216 N 2nd St., Wilmington, NC 28401"},"assessor":{"name":"New Hanover County Tax Assessor","address":"230 Government Center Dr. Suite 190, Wilmington, NC 28403"}},"Northampton County, NC":{"recorder":{"name":"Northampton County Register of Deeds","address":"211 N Piedmont Ave. Suite A, Jackson, NC 27845"},"assessor":{"name":"Northampton County Tax Assessor","address":"211 N Piedmont Ave. Suite A, Jackson, NC 27845"}},"Onslow County, NC":{"recorder":{"name":"Onslow County Register of Deeds","address":"109 Old Bridge St. Suite 101, Jacksonville, NC 28540"},"assessor":{"name":"Onslow County Tax Assessor","address":"234 NW Corridor Blvd., Jacksonville, NC 28540"}},"Orange County, NC":{"recorder":{"name":"Orange County Register of Deeds","address":"228 S Churton St. Suite 200, Hillsborough, NC 27278"},"assessor":{"name":"Orange County Tax Assessor","address":"228 S Churton St. Suite 200, Hillsborough, NC 27278"}},"Pamlico County, NC":{"recorder":{"name":"Pamlico County Register of Deeds","address":"202 Main St., Bayboro, NC 28515"},"assessor":{"name":"Pamlico County Tax Assessor","address":"202 Main St., Bayboro, NC 28515"}},"Pasquotank County, NC":{"recorder":{"name":"Pasquotank County Register of Deeds","address":"206 E Main St., Elizabeth City, NC 27909"},"assessor":{"name":"Pasquotank County Tax Assessor","address":"206 E Main St., Elizabeth City, NC 27909"}},"Pender County, NC":{"recorder":{"name":"Pender County Register of Deeds","address":"300 E Fremont St., Burgaw, NC 28425"},"assessor":{"name":"Pender County Tax Assessor","address":"300 E Fremont St., Burgaw, NC 28425"}},"Perquimans County, NC":{"recorder":{"name":"Perquimans County Register of Deeds","address":"128 N Church St., Hertford, NC 27944"},"assessor":{"name":"Perquimans County Tax Assessor","address":"128 N Church St., Hertford, NC 27944"}},"Person County, NC":{"recorder":{"name":"Person County Register of Deeds","address":"105 S Main St. Suite 106, Roxboro, NC 27573"},"assessor":{"name":"Person County Tax Assessor","address":"105 S Main St. Suite 106, Roxboro, NC 27573"}},"Pitt County, NC":{"recorder":{"name":"Pitt County Register of Deeds","address":"1717 W 5th St., Greenville, NC 27834"},"assessor":{"name":"Pitt County Tax Assessor","address":"111 S Washington St., Greenville, NC 27834"}},"Polk County, NC":{"recorder":{"name":"Polk County Register of Deeds","address":"40 Courthouse St. Suite 1, Columbus, NC 28722"},"assessor":{"name":"Polk County Tax Assessor","address":"40 Courthouse St. Suite 1, Columbus, NC 28722"}},"Randolph County, NC":{"recorder":{"name":"Randolph County Register of Deeds","address":"725 McDowell Rd., Asheboro, NC 27205"},"assessor":{"name":"Randolph County Tax Assessor","address":"725 McDowell Rd., Asheboro, NC 27205"}},"Richmond County, NC":{"recorder":{"name":"Richmond County Register of Deeds","address":"114 E Franklin St. Suite 205, Rockingham, NC 28379"},"assessor":{"name":"Richmond County Tax Assessor","address":"114 E Franklin St. Suite 205, Rockingham, NC 28379"}},"Robeson County, NC":{"recorder":{"name":"Robeson County Register of Deeds","address":"500 N Elm St., Lumberton, NC 28358"},"assessor":{"name":"Robeson County Tax Assessor","address":"500 N Elm St., Lumberton, NC 28358"}},"Rockingham County, NC":{"recorder":{"name":"Rockingham County Register of Deeds","address":"371 NC-65, Wentworth, NC 27375"},"assessor":{"name":"Rockingham County Tax Assessor","address":"371 NC-65, Wentworth, NC 27375"}},"Rowan County, NC":{"recorder":{"name":"Rowan County Register of Deeds","address":"402 N Main St. Suite 105, Salisbury, NC 28144"},"assessor":{"name":"Rowan County Tax Assessor","address":"402 N Main St. Suite 105, Salisbury, NC 28144"}},"Rutherford County, NC":{"recorder":{"name":"Rutherford County Register of Deeds","address":"229 N Main St., Rutherfordton, NC 28139"},"assessor":{"name":"Rutherford County Tax Assessor","address":"229 N Main St., Rutherfordton, NC 28139"}},"Sampson County, NC":{"recorder":{"name":"Sampson County Register of Deeds","address":"435 Rowan Rd. Suite 1, Clinton, NC 28328"},"assessor":{"name":"Sampson County Tax Assessor","address":"435 Rowan Rd. Suite 1, Clinton, NC 28328"}},"Scotland County, NC":{"recorder":{"name":"Scotland County Register of Deeds","address":"212 Biggs St. Suite 100, Laurinburg, NC 28352"},"assessor":{"name":"Scotland County Tax Assessor","address":"507 W Covington St., Laurinburg, NC 28352"}},"Stanly County, NC":{"recorder":{"name":"Stanly County Register of Deeds","address":"201 S 2nd St. Suite 9, Albemarle, NC 28001"},"assessor":{"name":"Stanly County Tax Assessor","address":"201 S 2nd St. Suite 9, Albemarle, NC 28001"}},"Stokes County, NC":{"recorder":{"name":"Stokes County Register of Deeds","address":"1014 Main St., Danbury, NC 27016"},"assessor":{"name":"Stokes County Tax Assessor","address":"1014 Main St., Danbury, NC 27016"}},"Surry County, NC":{"recorder":{"name":"Surry County Register of Deeds","address":"201 E Kapp St., Dobson, NC 27017"},"assessor":{"name":"Surry County Tax Assessor","address":"201 E Kapp St., Dobson, NC 27017"}},"Swain County, NC":{"recorder":{"name":"Swain County Register of Deeds","address":"101 Mitchell St. Suite B-101, Bryson City, NC 28713"},"assessor":{"name":"Swain County Tax Assessor","address":"101 Mitchell St. Suite B-101, Bryson City, NC 28713"}},"Transylvania County, NC":{"recorder":{"name":"Transylvania County Register of Deeds","address":"12 E Main St., Brevard, NC 28712"},"assessor":{"name":"Transylvania County Tax Assessor","address":"12 E Main St., Brevard, NC 28712"}},"Tyrrell County, NC":{"recorder":{"name":"Tyrrell County Register of Deeds","address":"108 S Water St., Columbia, NC 27925"},"assessor":{"name":"Tyrrell County Tax Assessor","address":"108 S Water St., Columbia, NC 27925"}},"Union County, NC":{"recorder":{"name":"Union County Register of Deeds","address":"500 N Main St. Suite 300, Monroe, NC 28112"},"assessor":{"name":"Union County Tax Assessor","address":"500 N Main St. Suite 236, Monroe, NC 28112"}},"Vance County, NC":{"recorder":{"name":"Vance County Register of Deeds","address":"122 Young St. Suite A, Henderson, NC 27536"},"assessor":{"name":"Vance County Tax Assessor","address":"122 Young St. Suite A, Henderson, NC 27536"}},"Wake County, NC":{"recorder":{"name":"Wake County Register of Deeds","address":"301 S McDowell St. Suite 3600, Raleigh, NC 27601"},"assessor":{"name":"Wake County Tax Assessor","address":"301 S McDowell St. Suite 3800, Raleigh, NC 27601"}},"Warren County, NC":{"recorder":{"name":"Warren County Register of Deeds","address":"121 S Front St. Suite 3, Warrenton, NC 27589"},"assessor":{"name":"Warren County Tax Assessor","address":"121 S Front St. Suite 3, Warrenton, NC 27589"}},"Washington County, NC":{"recorder":{"name":"Washington County Register of Deeds","address":"120 Adams St., Plymouth, NC 27962"},"assessor":{"name":"Washington County Tax Assessor","address":"120 Adams St., Plymouth, NC 27962"}},"Watauga County, NC":{"recorder":{"name":"Watauga County Register of Deeds","address":"842 W King St. Suite 4, Boone, NC 28607"},"assessor":{"name":"Watauga County Tax Assessor","address":"842 W King St. Suite 4, Boone, NC 28607"}},"Wayne County, NC":{"recorder":{"name":"Wayne County Register of Deeds","address":"224 E Walnut St., Goldsboro, NC 27530"},"assessor":{"name":"Wayne County Tax Assessor","address":"224 E Walnut St., Goldsboro, NC 27530"}},"Wilkes County, NC":{"recorder":{"name":"Wilkes County Register of Deeds","address":"500 Courthouse Dr. Suite 1150, Wilkesboro, NC 28697"},"assessor":{"name":"Wilkes County Tax Assessor","address":"500 Courthouse Dr. Suite 1150, Wilkesboro, NC 28697"}},"Wilson County, NC":{"recorder":{"name":"Wilson County Register of Deeds","address":"113 Nash St. E Suite 127, Wilson, NC 27893"},"assessor":{"name":"Wilson County Tax Assessor","address":"113 Nash St. E Suite 127, Wilson, NC 27893"}},"Yadkin County, NC":{"recorder":{"name":"Yadkin County Register of Deeds","address":"101 S State St., Yadkinville, NC 27055"},"assessor":{"name":"Yadkin County Tax Assessor","address":"101 S State St., Yadkinville, NC 27055"}},"Yancey County, NC":{"recorder":{"name":"Yancey County Register of Deeds","address":"110 Town Square Room 7, Burnsville, NC 28714"},"assessor":{"name":"Yancey County Tax Assessor","address":"110 Town Square Room 7, Burnsville, NC 28714"}},"Adams County, ND":{"recorder":{"name":"Adams County Recorder","address":"602 Adams Ave., Hettinger, ND 58639"},"assessor":{"name":"Adams County Tax Equalization","address":"602 Adams Ave., Hettinger, ND 58639"}},"Barnes County, ND":{"recorder":{"name":"Barnes County Recorder","address":"230 4th St NW, Valley City, ND 58072"},"assessor":{"name":"Barnes County Tax Equalization","address":"230 4th St NW, Valley City, ND 58072"}},"Benson County, ND":{"recorder":{"name":"Benson County Recorder","address":"311 B Ave S, Minnewaukan, ND 58351"},"assessor":{"name":"Benson County Tax Equalization","address":"311 B Ave S, Minnewaukan, ND 58351"}},"Billings County, ND":{"recorder":{"name":"Billings County Recorder","address":"495 4th St., Medora, ND 58645"},"assessor":{"name":"Billings County Tax Equalization","address":"495 4th St., Medora, ND 58645"}},"Bottineau County, ND":{"recorder":{"name":"Bottineau County Recorder","address":"314 W 5th St., Bottineau, ND 58318"},"assessor":{"name":"Bottineau County Tax Equalization","address":"314 W 5th St., Bottineau, ND 58318"}},"Bowman County, ND":{"recorder":{"name":"Bowman County Recorder","address":"104 1st St NE, Bowman, ND 58623"},"assessor":{"name":"Bowman County Tax Equalization","address":"104 1st St NE, Bowman, ND 58623"}},"Burke County, ND":{"recorder":{"name":"Burke County Recorder","address":"103 N Main Ave., Bowbells, ND 58721"},"assessor":{"name":"Burke County Tax Equalization","address":"103 N Main Ave., Bowbells, ND 58721"}},"Burleigh County, ND":{"recorder":{"name":"Burleigh County Recorder","address":"221 N 5th St., Bismarck, ND 58501"},"assessor":{"name":"Burleigh County Tax Equalization","address":"221 N 5th St., Bismarck, ND 58501"}},"Cass County, ND":{"recorder":{"name":"Cass County Recorder","address":"211 9th St S, Fargo, ND 58103"},"assessor":{"name":"Cass County Tax Equalization","address":"211 9th St S, Fargo, ND 58103"}},"Cavalier County, ND":{"recorder":{"name":"Cavalier County Recorder","address":"901 3rd St., Langdon, ND 58249"},"assessor":{"name":"Cavalier County Tax Equalization","address":"901 3rd St., Langdon, ND 58249"}},"Dickey County, ND":{"recorder":{"name":"Dickey County Recorder","address":"309 N 2nd St., Ellendale, ND 58436"},"assessor":{"name":"Dickey County Tax Equalization","address":"309 N 2nd St., Ellendale, ND 58436"}},"Divide County, ND":{"recorder":{"name":"Divide County Recorder","address":"300 N Main St., Crosby, ND 58730"},"assessor":{"name":"Divide County Tax Equalization","address":"300 N Main St., Crosby, ND 58730"}},"Dunn County, ND":{"recorder":{"name":"Dunn County Recorder","address":"205 Owens St., Manning, ND 58642"},"assessor":{"name":"Dunn County Tax Equalization","address":"205 Owens St., Manning, ND 58642"}},"Eddy County, ND":{"recorder":{"name":"Eddy County Recorder","address":"524 Central Ave., New Rockford, ND 58356"},"assessor":{"name":"Eddy County Tax Equalization","address":"524 Central Ave., New Rockford, ND 58356"}},"Emmons County, ND":{"recorder":{"name":"Emmons County Recorder","address":"100 4th Ave NW, Linton, ND 58552"},"assessor":{"name":"Emmons County Tax Equalization","address":"100 4th Ave NW, Linton, ND 58552"}},"Foster County, ND":{"recorder":{"name":"Foster County Recorder","address":"1000 Central Ave NE, Carrington, ND 58421"},"assessor":{"name":"Foster County Tax Equalization","address":"1000 Central Ave NE, Carrington, ND 58421"}},"Golden Valley County, ND":{"recorder":{"name":"Golden Valley County Recorder","address":"150 1st Ave SE, Beach, ND 58621"},"assessor":{"name":"Golden Valley County Tax Equalization","address":"150 1st Ave SE, Beach, ND 58621"}},"Grand Forks County, ND":{"recorder":{"name":"Grand Forks County Recorder","address":"151 S 4th St., Grand Forks, ND 58201"},"assessor":{"name":"Grand Forks County Tax Equalization","address":"151 S 4th St., Grand Forks, ND 58201"}},"Grant County, ND":{"recorder":{"name":"Grant County Recorder","address":"106 2nd Ave NE, Carson, ND 58529"},"assessor":{"name":"Grant County Tax Equalization","address":"106 2nd Ave NE, Carson, ND 58529"}},"Griggs County, ND":{"recorder":{"name":"Griggs County Recorder","address":"808 Rollin Ave NE, Cooperstown, ND 58425"},"assessor":{"name":"Griggs County Tax Equalization","address":"808 Rollin Ave NE, Cooperstown, ND 58425"}},"Hettinger County, ND":{"recorder":{"name":"Hettinger County Recorder","address":"336 Pacific Ave., Mott, ND 58646"},"assessor":{"name":"Hettinger County Tax Equalization","address":"336 Pacific Ave., Mott, ND 58646"}},"Kidder County, ND":{"recorder":{"name":"Kidder County Recorder","address":"120 E Broadway, Steele, ND 58482"},"assessor":{"name":"Kidder County Tax Equalization","address":"120 E Broadway, Steele, ND 58482"}},"LaMoure County, ND":{"recorder":{"name":"LaMoure County Recorder","address":"202 4th Ave NE, LaMoure, ND 58458"},"assessor":{"name":"LaMoure County Tax Equalization","address":"202 4th Ave NE, LaMoure, ND 58458"}},"Logan County, ND":{"recorder":{"name":"Logan County Recorder","address":"301 Broadway, Napoleon, ND 58561"},"assessor":{"name":"Logan County Tax Equalization","address":"301 Broadway, Napoleon, ND 58561"}},"McHenry County, ND":{"recorder":{"name":"McHenry County Recorder","address":"407 Main St S, Towner, ND 58788"},"assessor":{"name":"McHenry County Tax Equalization","address":"407 Main St S, Towner, ND 58788"}},"McIntosh County, ND":{"recorder":{"name":"McIntosh County Recorder","address":"112 NE 1st St., Ashley, ND 58413"},"assessor":{"name":"McIntosh County Tax Equalization","address":"112 NE 1st St., Ashley, ND 58413"}},"McKenzie County, ND":{"recorder":{"name":"McKenzie County Recorder","address":"201 5th St NW, Watford City, ND 58854"},"assessor":{"name":"McKenzie County Tax Equalization","address":"201 5th St NW, Watford City, ND 58854"}},"McLean County, ND":{"recorder":{"name":"McLean County Recorder","address":"712 5th Ave, Washburn, ND 58577"},"assessor":{"name":"McLean County Tax Equalization","address":"712 5th Ave, Washburn, ND 58577"}},"Mercer County, ND":{"recorder":{"name":"Mercer County Recorder","address":"1021 Arthur St., Stanton, ND 58571"},"assessor":{"name":"Mercer County Tax Equalization","address":"1021 Arthur St., Stanton, ND 58571"}},"Morton County, ND":{"recorder":{"name":"Morton County Recorder","address":"210 2nd Ave NW, Mandan, ND 58554"},"assessor":{"name":"Morton County Tax Equalization","address":"210 2nd Ave NW, Mandan, ND 58554"}},"Mountrail County, ND":{"recorder":{"name":"Mountrail County Recorder","address":"101 1st Ave NW, Stanley, ND 58784"},"assessor":{"name":"Mountrail County Tax Equalization","address":"101 1st Ave NW, Stanley, ND 58784"}},"Nelson County, ND":{"recorder":{"name":"Nelson County Recorder","address":"210 B Ave W, Lakota, ND 58344"},"assessor":{"name":"Nelson County Tax Equalization","address":"210 B Ave W, Lakota, ND 58344"}},"Oliver County, ND":{"recorder":{"name":"Oliver County Recorder","address":"115 W Main St., Center, ND 58530"},"assessor":{"name":"Oliver County Tax Equalization","address":"115 W Main St., Center, ND 58530"}},"Pembina County, ND":{"recorder":{"name":"Pembina County Recorder","address":"301 Dakota St W, Cavalier, ND 58220"},"assessor":{"name":"Pembina County Tax Equalization","address":"301 Dakota St W, Cavalier, ND 58220"}},"Pierce County, ND":{"recorder":{"name":"Pierce County Recorder","address":"240 SE 2nd St., Rugby, ND 58368"},"assessor":{"name":"Pierce County Tax Equalization","address":"240 SE 2nd St., Rugby, ND 58368"}},"Ramsey County, ND":{"recorder":{"name":"Ramsey County Recorder","address":"524 4th Ave, Devils Lake, ND 58301"},"assessor":{"name":"Ramsey County Tax Equalization","address":"524 4th Ave, Devils Lake, ND 58301"}},"Ransom County, ND":{"recorder":{"name":"Ransom County Recorder","address":"204 5th Ave W, Lisbon, ND 58054"},"assessor":{"name":"Ransom County Tax Equalization","address":"204 5th Ave W, Lisbon, ND 58054"}},"Renville County, ND":{"recorder":{"name":"Renville County Recorder","address":"205 Main St E, Mohall, ND 58761"},"assessor":{"name":"Renville County Tax Equalization","address":"205 Main St E, Mohall, ND 58761"}},"Richland County, ND":{"recorder":{"name":"Richland County Recorder","address":"418 2nd Ave N, Wahpeton, ND 58075"},"assessor":{"name":"Richland County Tax Equalization","address":"418 2nd Ave N, Wahpeton, ND 58075"}},"Rolette County, ND":{"recorder":{"name":"Rolette County Recorder","address":"102 NE 2nd St., Rolla, ND 58367"},"assessor":{"name":"Rolette County Tax Equalization","address":"102 NE 2nd St., Rolla, ND 58367"}},"Sargent County, ND":{"recorder":{"name":"Sargent County Recorder","address":"355 Main St., Forman, ND 58032"},"assessor":{"name":"Sargent County Tax Equalization","address":"355 Main St., Forman, ND 58032"}},"Sheridan County, ND":{"recorder":{"name":"Sheridan County Recorder","address":"215 2nd St., McClusky, ND 58463"},"assessor":{"name":"Sheridan County Tax Equalization","address":"215 2nd St., McClusky, ND 58463"}},"Sioux County, ND":{"recorder":{"name":"Sioux County Recorder","address":"209 2nd Ave, Fort Yates, ND 58538"},"assessor":{"name":"Sioux County Tax Equalization","address":"209 2nd Ave, Fort Yates, ND 58538"}},"Slope County, ND":{"recorder":{"name":"Slope County Recorder","address":"206 S Main St., Amidon, ND 58620"},"assessor":{"name":"Slope County Tax Equalization","address":"206 S Main St., Amidon, ND 58620"}},"Stark County, ND":{"recorder":{"name":"Stark County Recorder","address":"51 3rd St E, Dickinson, ND 58601"},"assessor":{"name":"Stark County Tax Equalization","address":"51 3rd St E, Dickinson, ND 58601"}},"Steele County, ND":{"recorder":{"name":"Steele County Recorder","address":"217 2nd Ave NE, Finley, ND 58230"},"assessor":{"name":"Steele County Tax Equalization","address":"217 2nd Ave NE, Finley, ND 58230"}},"Stutsman County, ND":{"recorder":{"name":"Stutsman County Recorder","address":"511 2nd Ave SE, Jamestown, ND 58401"},"assessor":{"name":"Stutsman County Tax Equalization","address":"511 2nd Ave SE, Jamestown, ND 58401"}},"Towner County, ND":{"recorder":{"name":"Towner County Recorder","address":"315 2nd St., Cando, ND 58324"},"assessor":{"name":"Towner County Tax Equalization","address":"315 2nd St., Cando, ND 58324"}},"Traill County, ND":{"recorder":{"name":"Traill County Recorder","address":"114 W Caledonia Ave., Hillsboro, ND 58045"},"assessor":{"name":"Traill County Tax Equalization","address":"114 W Caledonia Ave., Hillsboro, ND 58045"}},"Walsh County, ND":{"recorder":{"name":"Walsh County Recorder","address":"600 Cooper Ave., Grafton, ND 58237"},"assessor":{"name":"Walsh County Tax Equalization","address":"600 Cooper Ave., Grafton, ND 58237"}},"Ward County, ND":{"recorder":{"name":"Ward County Recorder","address":"315 3rd St SE, Minot, ND 58701"},"assessor":{"name":"Ward County Tax Equalization","address":"315 3rd St SE, Minot, ND 58701"}},"Wells County, ND":{"recorder":{"name":"Wells County Recorder","address":"700 Railway St N, Fessenden, ND 58438"},"assessor":{"name":"Wells County Tax Equalization","address":"700 Railway St N, Fessenden, ND 58438"}},"Williams County, ND":{"recorder":{"name":"Williams County Recorder","address":"206 E Broadway, Williston, ND 58801"},"assessor":{"name":"Williams County Tax Equalization","address":"206 E Broadway, Williston, ND 58801"}},"Belknap County, NH":{"recorder":{"name":"Belknap County Register of Deeds","address":"64 Court St., Laconia, NH 03246"},"assessor":{"name":"Belknap County Assessment","address":"64 Court St., Laconia, NH 03246"}},"Carroll County, NH":{"recorder":{"name":"Carroll County Register of Deeds","address":"95 Water Village Rd., Ossipee, NH 03864"},"assessor":{"name":"Carroll County Assessment","address":"95 Water Village Rd., Ossipee, NH 03864"}},"Cheshire County, NH":{"recorder":{"name":"Cheshire County Register of Deeds","address":"12 Court St., Keene, NH 03431"},"assessor":{"name":"Cheshire County Assessment","address":"12 Court St., Keene, NH 03431"}},"Coos County, NH":{"recorder":{"name":"Coos County Register of Deeds","address":"55 School St. Suite 103, Lancaster, NH 03584"},"assessor":{"name":"Coos County Assessment","address":"55 School St. Suite 103, Lancaster, NH 03584"}},"Grafton County, NH":{"recorder":{"name":"Grafton County Register of Deeds","address":"3785 Dartmouth College Hwy Suite 3, North Haverhill, NH 03774"},"assessor":{"name":"Grafton County Assessment","address":"3785 Dartmouth College Hwy Suite 3, North Haverhill, NH 03774"}},"Hillsborough County, NH":{"recorder":{"name":"Hillsborough County Register of Deeds","address":"19 Temple St., Nashua, NH 03060"},"assessor":{"name":"Hillsborough County Assessment","address":"19 Temple St., Nashua, NH 03060"}},"Merrimack County, NH":{"recorder":{"name":"Merrimack County Register of Deeds","address":"163 N Main St., Concord, NH 03301"},"assessor":{"name":"Merrimack County Assessment","address":"163 N Main St., Concord, NH 03301"}},"Rockingham County, NH":{"recorder":{"name":"Rockingham County Register of Deeds","address":"119 North Rd. Suite 201, Brentwood, NH 03833"},"assessor":{"name":"Rockingham County Assessment","address":"119 North Rd. Suite 201, Brentwood, NH 03833"}},"Strafford County, NH":{"recorder":{"name":"Strafford County Register of Deeds","address":"259 County Farm Rd. Suite 301, Dover, NH 03820"},"assessor":{"name":"Strafford County Assessment","address":"259 County Farm Rd. Suite 301, Dover, NH 03820"}},"Sullivan County, NH":{"recorder":{"name":"Sullivan County Register of Deeds","address":"22 Main St., Newport, NH 03773"},"assessor":{"name":"Sullivan County Assessment","address":"22 Main St., Newport, NH 03773"}},"Atlantic County, NJ":{"recorder":{"name":"Atlantic County Clerk","address":"5901 Main St., Mays Landing, NJ 08330"},"assessor":{"name":"Atlantic County Tax Assessor","address":"5901 Main St., Mays Landing, NJ 08330"}},"Bergen County, NJ":{"recorder":{"name":"Bergen County Clerk","address":"1 Bergen County Plaza Room 170, Hackensack, NJ 07601"},"assessor":{"name":"Bergen County Tax Assessor","address":"1 Bergen County Plaza Room 170, Hackensack, NJ 07601"}},"Burlington County, NJ":{"recorder":{"name":"Burlington County Clerk","address":"49 Rancocas Rd. Room 133, Mount Holly, NJ 08060"},"assessor":{"name":"Burlington County Tax Assessor","address":"49 Rancocas Rd. Room 133, Mount Holly, NJ 08060"}},"Camden County, NJ":{"recorder":{"name":"Camden County Clerk","address":"520 Market St. Suite 9100, Camden, NJ 08102"},"assessor":{"name":"Camden County Tax Assessor","address":"520 Market St. Suite 9100, Camden, NJ 08102"}},"Cape May County, NJ":{"recorder":{"name":"Cape May County Clerk","address":"7 N Main St. Suite 3, Cape May Court House, NJ 08210"},"assessor":{"name":"Cape May County Tax Assessor","address":"7 N Main St. Suite 3, Cape May Court House, NJ 08210"}},"Cumberland County, NJ":{"recorder":{"name":"Cumberland County Clerk","address":"60 W Broad St., Bridgeton, NJ 08302"},"assessor":{"name":"Cumberland County Tax Assessor","address":"60 W Broad St., Bridgeton, NJ 08302"}},"Essex County, NJ":{"recorder":{"name":"Essex County Clerk","address":"465 Dr. Martin Luther King Jr Blvd. Room 131, Newark, NJ 07102"},"assessor":{"name":"Essex County Tax Assessor","address":"465 Dr. Martin Luther King Jr Blvd. Room 131, Newark, NJ 07102"}},"Gloucester County, NJ":{"recorder":{"name":"Gloucester County Clerk","address":"1 N Broad St. Suite 1300, Woodbury, NJ 08096"},"assessor":{"name":"Gloucester County Tax Assessor","address":"1 N Broad St. Suite 1300, Woodbury, NJ 08096"}},"Hudson County, NJ":{"recorder":{"name":"Hudson County Clerk","address":"257 Cornelison Ave. Suite 109, Jersey City, NJ 07302"},"assessor":{"name":"Hudson County Tax Assessor","address":"257 Cornelison Ave. Suite 109, Jersey City, NJ 07302"}},"Hunterdon County, NJ":{"recorder":{"name":"Hunterdon County Clerk","address":"71 Main St. Suite 1, Flemington, NJ 08822"},"assessor":{"name":"Hunterdon County Tax Assessor","address":"71 Main St. Suite 1, Flemington, NJ 08822"}},"Mercer County, NJ":{"recorder":{"name":"Mercer County Clerk","address":"209 S Broad St., Trenton, NJ 08608"},"assessor":{"name":"Mercer County Tax Assessor","address":"209 S Broad St., Trenton, NJ 08608"}},"Middlesex County, NJ":{"recorder":{"name":"Middlesex County Clerk","address":"75 Bayard St., New Brunswick, NJ 08903"},"assessor":{"name":"Middlesex County Tax Assessor","address":"75 Bayard St., New Brunswick, NJ 08903"}},"Monmouth County, NJ":{"recorder":{"name":"Monmouth County Clerk","address":"1 E Main St., Freehold, NJ 07728"},"assessor":{"name":"Monmouth County Tax Assessor","address":"1 E Main St., Freehold, NJ 07728"}},"Morris County, NJ":{"recorder":{"name":"Morris County Clerk","address":"10 Court St. Suite 1300, Morristown, NJ 07963"},"assessor":{"name":"Morris County Tax Assessor","address":"10 Court St. Suite 1300, Morristown, NJ 07963"}},"Ocean County, NJ":{"recorder":{"name":"Ocean County Clerk","address":"118 Washington St. Suite 102, Toms River, NJ 08753"},"assessor":{"name":"Ocean County Tax Assessor","address":"118 Washington St. Suite 102, Toms River, NJ 08753"}},"Passaic County, NJ":{"recorder":{"name":"Passaic County Clerk","address":"401 Grand St. Room 130, Paterson, NJ 07505"},"assessor":{"name":"Passaic County Tax Assessor","address":"401 Grand St. Room 130, Paterson, NJ 07505"}},"Salem County, NJ":{"recorder":{"name":"Salem County Clerk","address":"92 Market St., Salem, NJ 08079"},"assessor":{"name":"Salem County Tax Assessor","address":"92 Market St., Salem, NJ 08079"}},"Somerset County, NJ":{"recorder":{"name":"Somerset County Clerk","address":"20 Grove St., Somerville, NJ 08876"},"assessor":{"name":"Somerset County Tax Assessor","address":"20 Grove St., Somerville, NJ 08876"}},"Sussex County, NJ":{"recorder":{"name":"Sussex County Clerk","address":"83 Spring St. Suite 304, Newton, NJ 07860"},"assessor":{"name":"Sussex County Tax Assessor","address":"83 Spring St. Suite 304, Newton, NJ 07860"}},"Union County, NJ":{"recorder":{"name":"Union County Clerk","address":"2 Broad St. Room 115, Elizabeth, NJ 07207"},"assessor":{"name":"Union County Tax Assessor","address":"2 Broad St. Room 115, Elizabeth, NJ 07207"}},"Warren County, NJ":{"recorder":{"name":"Warren County Clerk","address":"413 Second St., Belvidere, NJ 07823"},"assessor":{"name":"Warren County Tax Assessor","address":"413 Second St., Belvidere, NJ 07823"}},"Bernalillo County, NM":{"recorder":{"name":"Bernalillo County Clerk","address":"415 Silver Ave SW 2nd Floor, Albuquerque, NM 87102"},"assessor":{"name":"Bernalillo County Assessor","address":"415 Silver Ave SW, Albuquerque, NM 87102"}},"Catron County, NM":{"recorder":{"name":"Catron County Clerk","address":"Catron County Courthouse, Reserve, NM 87830"},"assessor":{"name":"Catron County Assessor","address":"Catron County Courthouse, Reserve, NM 87830"}},"Chaves County, NM":{"recorder":{"name":"Chaves County Clerk","address":"One St. Mary's Place, Roswell, NM 88201"},"assessor":{"name":"Chaves County Assessor","address":"One St. Mary's Place, Roswell, NM 88201"}},"Cibola County, NM":{"recorder":{"name":"Cibola County Clerk","address":"700 E Roosevelt Suite 50, Grants, NM 87020"},"assessor":{"name":"Cibola County Assessor","address":"700 E Roosevelt, Grants, NM 87020"}},"Colfax County, NM":{"recorder":{"name":"Colfax County Clerk","address":"230 N 3rd St., Raton, NM 87740"},"assessor":{"name":"Colfax County Assessor","address":"230 N 3rd St., Raton, NM 87740"}},"Curry County, NM":{"recorder":{"name":"Curry County Clerk","address":"417 Gidding St. Suite 130, Clovis, NM 88101"},"assessor":{"name":"Curry County Assessor","address":"417 Gidding St. Suite 110, Clovis, NM 88101"}},"De Baca County, NM":{"recorder":{"name":"De Baca County Clerk","address":"514 Ave C, Fort Sumner, NM 88119"},"assessor":{"name":"De Baca County Assessor","address":"514 Ave C, Fort Sumner, NM 88119"}},"Do\u00f1a Ana County, NM":{"recorder":{"name":"Do\u00f1a Ana County Clerk","address":"845 N Motel Blvd., Las Cruces, NM 88007"},"assessor":{"name":"Do\u00f1a Ana County Assessor","address":"845 N Motel Blvd., Las Cruces, NM 88007"}},"Eddy County, NM":{"recorder":{"name":"Eddy County Clerk","address":"325 S Main St., Carlsbad, NM 88220"},"assessor":{"name":"Eddy County Assessor","address":"325 S Main St., Carlsbad, NM 88220"}},"Grant County, NM":{"recorder":{"name":"Grant County Clerk","address":"201 N Cooper St., Silver City, NM 88061"},"assessor":{"name":"Grant County Assessor","address":"201 N Cooper St., Silver City, NM 88061"}},"Guadalupe County, NM":{"recorder":{"name":"Guadalupe County Clerk","address":"420 Parker Ave Suite 6, Santa Rosa, NM 88435"},"assessor":{"name":"Guadalupe County Assessor","address":"420 Parker Ave, Santa Rosa, NM 88435"}},"Harding County, NM":{"recorder":{"name":"Harding County Clerk","address":"35 Pine St., Mosquero, NM 87733"},"assessor":{"name":"Harding County Assessor","address":"35 Pine St., Mosquero, NM 87733"}},"Hidalgo County, NM":{"recorder":{"name":"Hidalgo County Clerk","address":"300 S Shakespeare St., Lordsburg, NM 88045"},"assessor":{"name":"Hidalgo County Assessor","address":"300 S Shakespeare St., Lordsburg, NM 88045"}},"Lea County, NM":{"recorder":{"name":"Lea County Clerk","address":"100 N Main Suite 19, Lovington, NM 88260"},"assessor":{"name":"Lea County Assessor","address":"100 N Main Suite 7, Lovington, NM 88260"}},"Lincoln County, NM":{"recorder":{"name":"Lincoln County Clerk","address":"300 Central Ave., Carrizozo, NM 88301"},"assessor":{"name":"Lincoln County Assessor","address":"300 Central Ave., Carrizozo, NM 88301"}},"Los Alamos County, NM":{"recorder":{"name":"Los Alamos County Clerk","address":"1000 Central Ave Suite 240, Los Alamos, NM 87544"},"assessor":{"name":"Los Alamos County Assessor","address":"1000 Central Ave Suite 130, Los Alamos, NM 87544"}},"Luna County, NM":{"recorder":{"name":"Luna County Clerk","address":"700 S Silver Ave., Deming, NM 88030"},"assessor":{"name":"Luna County Assessor","address":"700 S Silver Ave., Deming, NM 88030"}},"McKinley County, NM":{"recorder":{"name":"McKinley County Clerk","address":"207 W Hill Ave Suite 100, Gallup, NM 87301"},"assessor":{"name":"McKinley County Assessor","address":"207 W Hill Ave Suite 108, Gallup, NM 87301"}},"Mora County, NM":{"recorder":{"name":"Mora County Clerk","address":"Courthouse Plaza, Mora, NM 87732"},"assessor":{"name":"Mora County Assessor","address":"Courthouse Plaza, Mora, NM 87732"}},"Otero County, NM":{"recorder":{"name":"Otero County Clerk","address":"1000 New York Ave Suite 108, Alamogordo, NM 88310"},"assessor":{"name":"Otero County Assessor","address":"1000 New York Ave Suite 108, Alamogordo, NM 88310"}},"Quay County, NM":{"recorder":{"name":"Quay County Clerk","address":"300 S 3rd St., Tucumcari, NM 88401"},"assessor":{"name":"Quay County Assessor","address":"300 S 3rd St., Tucumcari, NM 88401"}},"Rio Arriba County, NM":{"recorder":{"name":"Rio Arriba County Clerk","address":"7 Main St., Tierra Amarilla, NM 87575"},"assessor":{"name":"Rio Arriba County Assessor","address":"7 Main St., Tierra Amarilla, NM 87575"}},"Roosevelt County, NM":{"recorder":{"name":"Roosevelt County Clerk","address":"109 W 1st St Suite 1, Portales, NM 88130"},"assessor":{"name":"Roosevelt County Assessor","address":"109 W 1st St Suite 4, Portales, NM 88130"}},"Sandoval County, NM":{"recorder":{"name":"Sandoval County Clerk","address":"1500 Idalia Rd. Bldg. D, Bernalillo, NM 87004"},"assessor":{"name":"Sandoval County Assessor","address":"1500 Idalia Rd. Bldg. D, Bernalillo, NM 87004"}},"San Juan County, NM":{"recorder":{"name":"San Juan County Clerk","address":"100 S Oliver Dr. Suite 200, Aztec, NM 87410"},"assessor":{"name":"San Juan County Assessor","address":"100 S Oliver Dr. Suite 204, Aztec, NM 87410"}},"San Miguel County, NM":{"recorder":{"name":"San Miguel County Clerk","address":"500 W National Ave., Las Vegas, NM 87701"},"assessor":{"name":"San Miguel County Assessor","address":"500 W National Ave., Las Vegas, NM 87701"}},"Santa Fe County, NM":{"recorder":{"name":"Santa Fe County Clerk","address":"102 Grant Ave., Santa Fe, NM 87501"},"assessor":{"name":"Santa Fe County Assessor","address":"100 Catron St., Santa Fe, NM 87501"}},"Sierra County, NM":{"recorder":{"name":"Sierra County Clerk","address":"1712 N Date St., Truth or Consequences, NM 87901"},"assessor":{"name":"Sierra County Assessor","address":"1712 N Date St., Truth or Consequences, NM 87901"}},"Socorro County, NM":{"recorder":{"name":"Socorro County Clerk","address":"200 Church St., Socorro, NM 87801"},"assessor":{"name":"Socorro County Assessor","address":"200 Church St., Socorro, NM 87801"}},"Taos County, NM":{"recorder":{"name":"Taos County Clerk","address":"105 Albright St. Suite E, Taos, NM 87571"},"assessor":{"name":"Taos County Assessor","address":"105 Albright St. Suite G, Taos, NM 87571"}},"Torrance County, NM":{"recorder":{"name":"Torrance County Clerk","address":"9th St. & Allen Ave., Estancia, NM 87016"},"assessor":{"name":"Torrance County Assessor","address":"9th St. & Allen Ave., Estancia, NM 87016"}},"Union County, NM":{"recorder":{"name":"Union County Clerk","address":"200 Court St., Clayton, NM 88415"},"assessor":{"name":"Union County Assessor","address":"200 Court St., Clayton, NM 88415"}},"Valencia County, NM":{"recorder":{"name":"Valencia County Clerk","address":"444 Luna Ave., Los Lunas, NM 87031"},"assessor":{"name":"Valencia County Assessor","address":"444 Luna Ave., Los Lunas, NM 87031"}},"Carson City, NV":{"recorder":{"name":"Carson City Clerk-Recorder","address":"885 E. Musser St. Ste. 1028, Carson City, NV 89701"},"assessor":{"name":"Carson City Assessor","address":"201 North Carson St. Suite 6, Carson City, NV 89701"}},"Churchill County, NV":{"recorder":{"name":"Churchill County Recorder","address":"155 N. Taylor St. Ste. 131, Fallon, NV 89406"},"assessor":{"name":"Churchill County Assessor","address":"155 North Taylor St. #200, Fallon, NV 89406"}},"Clark County, NV":{"recorder":{"name":"Clark County Recorder","address":"500 S. Grand Central Pkwy 2nd Floor, Las Vegas, NV 89155"},"assessor":{"name":"Clark County Assessor","address":"500 S. Grand Central Pkwy 2nd Floor, Las Vegas, NV 89155"}},"Douglas County, NV":{"recorder":{"name":"Douglas County Recorder","address":"1616 Eighth St., Minden, NV 89423"},"assessor":{"name":"Douglas County Assessor","address":"1616 8th St., Minden, NV 89423"}},"Elko County, NV":{"recorder":{"name":"Elko County Recorder","address":"571 Idaho St. Room 103, Elko, NV 89801"},"assessor":{"name":"Elko County Assessor","address":"550 Court St., Elko, NV 89801"}},"Esmeralda County, NV":{"recorder":{"name":"Esmeralda County Recorder","address":"PO Box 458, Goldfield, NV 89013"},"assessor":{"name":"Esmeralda County Assessor","address":"PO Box 471, Hwy 95 & Euclid, Goldfield, NV 89013"}},"Eureka County, NV":{"recorder":{"name":"Eureka County Recorder","address":"PO Box 540, Eureka, NV 89316"},"assessor":{"name":"Eureka County Assessor","address":"20 S. Main St., Eureka, NV 89316"}},"Humboldt County, NV":{"recorder":{"name":"Humboldt County Recorder","address":"25 W. Fourth St., Winnemucca, NV 89445"},"assessor":{"name":"Humboldt County Assessor","address":"50 West 5th St., Winnemucca, NV 89445"}},"Lander County, NV":{"recorder":{"name":"Lander County Recorder","address":"50 State Route 305, Battle Mountain, NV 89820"},"assessor":{"name":"Lander County Assessor","address":"50 State Route 305, Battle Mountain, NV 89820"}},"Lincoln County, NV":{"recorder":{"name":"Lincoln County Recorder","address":"181 North Main St. Suite 202, Pioche, NV 89043"},"assessor":{"name":"Lincoln County Assessor","address":"181 Main St., Pioche, NV 89043"}},"Lyon County, NV":{"recorder":{"name":"Lyon County Recorder","address":"27 S. Main St., Yerington, NV 89447"},"assessor":{"name":"Lyon County Assessor","address":"27 S. Main St., Yerington, NV 89447"}},"Mineral County, NV":{"recorder":{"name":"Mineral County Recorder","address":"105 South A St., Hawthorne, NV 89415"},"assessor":{"name":"Mineral County Assessor","address":"105 South A St., Hawthorne, NV 89415"}},"Nye County, NV":{"recorder":{"name":"Nye County Recorder","address":"101 Radar Rd., Tonopah, NV 89049"},"assessor":{"name":"Nye County Assessor","address":"101 Radar Rd., Tonopah, NV 89049"}},"Pershing County, NV":{"recorder":{"name":"Pershing County Recorder","address":"398 Main St., Lovelock, NV 89419"},"assessor":{"name":"Pershing County Assessor","address":"398 Main St., Lovelock, NV 89419"}},"Storey County, NV":{"recorder":{"name":"Storey County Recorder","address":"26 South B St., Virginia City, NV 89440"},"assessor":{"name":"Storey County Assessor","address":"26 South B St. Second Floor, Virginia City, NV 89440"}},"Washoe County, NV":{"recorder":{"name":"Washoe County Recorder","address":"1001 E. Ninth St. Bldg. A, Reno, NV 89512"},"assessor":{"name":"Washoe County Assessor","address":"1001 E. 9th St. Bldg. D, Reno, NV 89512"}},"White Pine County, NV":{"recorder":{"name":"White Pine County Recorder","address":"801 Clark St. Suite 1, Ely, NV 89301"},"assessor":{"name":"White Pine County Assessor","address":"297 Nevada Northern Railway Suite 3, Ely, NV 89301"}},"Albany County, NY":{"recorder":{"name":"Albany County Clerk","address":"112 State St. Room 128, Albany, NY 12207"},"assessor":{"name":"Albany County Real Property Tax Service","address":"112 State St. Room 128, Albany, NY 12207"}},"Allegany County, NY":{"recorder":{"name":"Allegany County Clerk","address":"7 Court St. Room 18, Belmont, NY 14813"},"assessor":{"name":"Allegany County Real Property Tax Service","address":"7 Court St. Room 18, Belmont, NY 14813"}},"Bronx County, NY":{"recorder":{"name":"Bronx County Clerk","address":"851 Grand Concourse Room 118, Bronx, NY 10451"},"assessor":{"name":"NYC Department of Finance (Bronx)","address":"3030 3rd Ave. 2nd Floor, Bronx, NY 10455"}},"Broome County, NY":{"recorder":{"name":"Broome County Clerk","address":"60 Hawley St., Binghamton, NY 13901"},"assessor":{"name":"Broome County Real Property Tax Service","address":"60 Hawley St., Binghamton, NY 13901"}},"Cattaraugus County, NY":{"recorder":{"name":"Cattaraugus County Clerk","address":"303 Court St., Little Valley, NY 14755"},"assessor":{"name":"Cattaraugus County Real Property Tax Service","address":"303 Court St., Little Valley, NY 14755"}},"Cayuga County, NY":{"recorder":{"name":"Cayuga County Clerk","address":"160 Genesee St., Auburn, NY 13021"},"assessor":{"name":"Cayuga County Real Property Tax Service","address":"160 Genesee St., Auburn, NY 13021"}},"Chautauqua County, NY":{"recorder":{"name":"Chautauqua County Clerk","address":"1 N Erie St., Mayville, NY 14757"},"assessor":{"name":"Chautauqua County Real Property Tax Service","address":"1 N Erie St., Mayville, NY 14757"}},"Chemung County, NY":{"recorder":{"name":"Chemung County Clerk","address":"210 Lake St., Elmira, NY 14902"},"assessor":{"name":"Chemung County Real Property Tax Service","address":"210 Lake St., Elmira, NY 14902"}},"Chenango County, NY":{"recorder":{"name":"Chenango County Clerk","address":"5 Court St., Norwich, NY 13815"},"assessor":{"name":"Chenango County Real Property Tax Service","address":"5 Court St., Norwich, NY 13815"}},"Clinton County, NY":{"recorder":{"name":"Clinton County Clerk","address":"137 Margaret St. Suite 208, Plattsburgh, NY 12901"},"assessor":{"name":"Clinton County Real Property Tax Service","address":"137 Margaret St. Suite 208, Plattsburgh, NY 12901"}},"Columbia County, NY":{"recorder":{"name":"Columbia County Clerk","address":"560 Warren St., Hudson, NY 12534"},"assessor":{"name":"Columbia County Real Property Tax Service","address":"560 Warren St., Hudson, NY 12534"}},"Cortland County, NY":{"recorder":{"name":"Cortland County Clerk","address":"46 Greenbush St. Suite 105, Cortland, NY 13045"},"assessor":{"name":"Cortland County Real Property Tax Service","address":"46 Greenbush St. Suite 105, Cortland, NY 13045"}},"Delaware County, NY":{"recorder":{"name":"Delaware County Clerk","address":"3 Court St., Delhi, NY 13753"},"assessor":{"name":"Delaware County Real Property Tax Service","address":"3 Court St., Delhi, NY 13753"}},"Dutchess County, NY":{"recorder":{"name":"Dutchess County Clerk","address":"22 Market St., Poughkeepsie, NY 12601"},"assessor":{"name":"Dutchess County Real Property Tax Service","address":"22 Market St., Poughkeepsie, NY 12601"}},"Erie County, NY":{"recorder":{"name":"Erie County Clerk","address":"92 Franklin St., Buffalo, NY 14202"},"assessor":{"name":"Erie County Real Property Tax Service","address":"95 Franklin St. Room 100, Buffalo, NY 14202"}},"Essex County, NY":{"recorder":{"name":"Essex County Clerk","address":"7559 Court St., Elizabethtown, NY 12932"},"assessor":{"name":"Essex County Real Property Tax Service","address":"7559 Court St., Elizabethtown, NY 12932"}},"Franklin County, NY":{"recorder":{"name":"Franklin County Clerk","address":"355 W Main St. Suite 147, Malone, NY 12953"},"assessor":{"name":"Franklin County Real Property Tax Service","address":"355 W Main St. Suite 147, Malone, NY 12953"}},"Fulton County, NY":{"recorder":{"name":"Fulton County Clerk","address":"223 W Main St., Johnstown, NY 12095"},"assessor":{"name":"Fulton County Real Property Tax Service","address":"223 W Main St., Johnstown, NY 12095"}},"Genesee County, NY":{"recorder":{"name":"Genesee County Clerk","address":"15 Main St., Batavia, NY 14020"},"assessor":{"name":"Genesee County Real Property Tax Service","address":"15 Main St., Batavia, NY 14020"}},"Greene County, NY":{"recorder":{"name":"Greene County Clerk","address":"411 Main St. Suite 443, Catskill, NY 12414"},"assessor":{"name":"Greene County Real Property Tax Service","address":"411 Main St. Suite 443, Catskill, NY 12414"}},"Hamilton County, NY":{"recorder":{"name":"Hamilton County Clerk","address":"White Birch Ln., Lake Pleasant, NY 12108"},"assessor":{"name":"Hamilton County Real Property Tax Service","address":"White Birch Ln., Lake Pleasant, NY 12108"}},"Herkimer County, NY":{"recorder":{"name":"Herkimer County Clerk","address":"109 Mary St. Suite 1111, Herkimer, NY 13350"},"assessor":{"name":"Herkimer County Real Property Tax Service","address":"109 Mary St. Suite 1111, Herkimer, NY 13350"}},"Jefferson County, NY":{"recorder":{"name":"Jefferson County Clerk","address":"175 Arsenal St., Watertown, NY 13601"},"assessor":{"name":"Jefferson County Real Property Tax Service","address":"175 Arsenal St., Watertown, NY 13601"}},"Kings County, NY":{"recorder":{"name":"Kings County Clerk","address":"360 Adams St. Room 189, Brooklyn, NY 11201"},"assessor":{"name":"NYC Department of Finance (Brooklyn)","address":"210 Joralemon St., Brooklyn, NY 11201"}},"Lewis County, NY":{"recorder":{"name":"Lewis County Clerk","address":"7660 N State St., Lowville, NY 13367"},"assessor":{"name":"Lewis County Real Property Tax Service","address":"7660 N State St., Lowville, NY 13367"}},"Livingston County, NY":{"recorder":{"name":"Livingston County Clerk","address":"6 Court St. Room 201, Geneseo, NY 14454"},"assessor":{"name":"Livingston County Real Property Tax Service","address":"6 Court St. Room 201, Geneseo, NY 14454"}},"Madison County, NY":{"recorder":{"name":"Madison County Clerk","address":"138 N Court St., Wampsville, NY 13163"},"assessor":{"name":"Madison County Real Property Tax Service","address":"138 N Court St., Wampsville, NY 13163"}},"Monroe County, NY":{"recorder":{"name":"Monroe County Clerk","address":"39 W Main St. Room 101, Rochester, NY 14614"},"assessor":{"name":"Monroe County Real Property Tax Service","address":"39 W Main St. Room 101, Rochester, NY 14614"}},"Montgomery County, NY":{"recorder":{"name":"Montgomery County Clerk","address":"64 Broadway Suite 103, Fonda, NY 12068"},"assessor":{"name":"Montgomery County Real Property Tax Service","address":"64 Broadway Suite 103, Fonda, NY 12068"}},"Nassau County, NY":{"recorder":{"name":"Nassau County Clerk","address":"240 Old Country Rd., Mineola, NY 11501"},"assessor":{"name":"Nassau County Assessor","address":"240 Old Country Rd. Suite 101, Mineola, NY 11501"}},"New York County, NY":{"recorder":{"name":"New York County Clerk","address":"60 Centre St. Room 161, New York, NY 10007"},"assessor":{"name":"NYC Department of Finance (Manhattan)","address":"66 John St. 2nd Floor, New York, NY 10038"}},"Niagara County, NY":{"recorder":{"name":"Niagara County Clerk","address":"175 Hawley St., Lockport, NY 14094"},"assessor":{"name":"Niagara County Real Property Tax Service","address":"175 Hawley St., Lockport, NY 14094"}},"Oneida County, NY":{"recorder":{"name":"Oneida County Clerk","address":"800 Park Ave., Utica, NY 13501"},"assessor":{"name":"Oneida County Real Property Tax Service","address":"800 Park Ave., Utica, NY 13501"}},"Onondaga County, NY":{"recorder":{"name":"Onondaga County Clerk","address":"401 Montgomery St. Room 200, Syracuse, NY 13202"},"assessor":{"name":"Onondaga County Real Property Tax Service","address":"421 Montgomery St. 10th Floor, Syracuse, NY 13202"}},"Ontario County, NY":{"recorder":{"name":"Ontario County Clerk","address":"20 Ontario St. Suite 1, Canandaigua, NY 14424"},"assessor":{"name":"Ontario County Real Property Tax Service","address":"20 Ontario St. Suite 1, Canandaigua, NY 14424"}},"Orange County, NY":{"recorder":{"name":"Orange County Clerk","address":"255 Main St., Goshen, NY 10924"},"assessor":{"name":"Orange County Real Property Tax Service","address":"255 Main St., Goshen, NY 10924"}},"Orleans County, NY":{"recorder":{"name":"Orleans County Clerk","address":"3 S Main St. Suite 1, Albion, NY 14411"},"assessor":{"name":"Orleans County Real Property Tax Service","address":"3 S Main St. Suite 1, Albion, NY 14411"}},"Oswego County, NY":{"recorder":{"name":"Oswego County Clerk","address":"46 E Bridge St., Oswego, NY 13126"},"assessor":{"name":"Oswego County Real Property Tax Service","address":"46 E Bridge St., Oswego, NY 13126"}},"Otsego County, NY":{"recorder":{"name":"Otsego County Clerk","address":"197 Main St., Cooperstown, NY 13326"},"assessor":{"name":"Otsego County Real Property Tax Service","address":"197 Main St., Cooperstown, NY 13326"}},"Putnam County, NY":{"recorder":{"name":"Putnam County Clerk","address":"40 Gleneida Ave., Carmel, NY 10512"},"assessor":{"name":"Putnam County Real Property Tax Service","address":"40 Gleneida Ave., Carmel, NY 10512"}},"Queens County, NY":{"recorder":{"name":"Queens County Clerk","address":"88-11 Sutphin Blvd., Jamaica, NY 11435"},"assessor":{"name":"NYC Department of Finance (Queens)","address":"144-06 94th Ave., Jamaica, NY 11435"}},"Rensselaer County, NY":{"recorder":{"name":"Rensselaer County Clerk","address":"105 3rd St., Troy, NY 12180"},"assessor":{"name":"Rensselaer County Real Property Tax Service","address":"1600 7th Ave., Troy, NY 12180"}},"Richmond County, NY":{"recorder":{"name":"Richmond County Clerk","address":"130 Stuyvesant Pl., Staten Island, NY 10301"},"assessor":{"name":"NYC Department of Finance (Staten Island)","address":"350 St. Marks Pl., Staten Island, NY 10301"}},"Rockland County, NY":{"recorder":{"name":"Rockland County Clerk","address":"1 S Main St. Suite 100, New City, NY 10956"},"assessor":{"name":"Rockland County Real Property Tax Service","address":"1 S Main St. Suite 100, New City, NY 10956"}},"St. Lawrence County, NY":{"recorder":{"name":"St. Lawrence County Clerk","address":"48 Court St., Canton, NY 13617"},"assessor":{"name":"St. Lawrence County Real Property Tax Service","address":"48 Court St., Canton, NY 13617"}},"Saratoga County, NY":{"recorder":{"name":"Saratoga County Clerk","address":"40 McMaster St. Suite 2, Ballston Spa, NY 12020"},"assessor":{"name":"Saratoga County Real Property Tax Service","address":"40 McMaster St. Suite 2, Ballston Spa, NY 12020"}},"Schenectady County, NY":{"recorder":{"name":"Schenectady County Clerk","address":"620 State St., Schenectady, NY 12305"},"assessor":{"name":"Schenectady County Real Property Tax Service","address":"620 State St., Schenectady, NY 12305"}},"Schoharie County, NY":{"recorder":{"name":"Schoharie County Clerk","address":"300 Main St., Schoharie, NY 12157"},"assessor":{"name":"Schoharie County Real Property Tax Service","address":"300 Main St., Schoharie, NY 12157"}},"Schuyler County, NY":{"recorder":{"name":"Schuyler County Clerk","address":"105 9th St. Unit 8, Watkins Glen, NY 14891"},"assessor":{"name":"Schuyler County Real Property Tax Service","address":"105 9th St. Unit 8, Watkins Glen, NY 14891"}},"Seneca County, NY":{"recorder":{"name":"Seneca County Clerk","address":"1 DiPronio Dr., Waterloo, NY 13165"},"assessor":{"name":"Seneca County Real Property Tax Service","address":"1 DiPronio Dr., Waterloo, NY 13165"}},"Steuben County, NY":{"recorder":{"name":"Steuben County Clerk","address":"3 E Pulteney Square, Bath, NY 14810"},"assessor":{"name":"Steuben County Real Property Tax Service","address":"3 E Pulteney Square, Bath, NY 14810"}},"Suffolk County, NY":{"recorder":{"name":"Suffolk County Clerk","address":"310 Center Dr., Riverhead, NY 11901"},"assessor":{"name":"Suffolk County Real Property Tax Service","address":"300 Center Dr., Riverhead, NY 11901"}},"Sullivan County, NY":{"recorder":{"name":"Sullivan County Clerk","address":"100 North St., Monticello, NY 12701"},"assessor":{"name":"Sullivan County Real Property Tax Service","address":"100 North St., Monticello, NY 12701"}},"Tioga County, NY":{"recorder":{"name":"Tioga County Clerk","address":"56 Main St., Owego, NY 13827"},"assessor":{"name":"Tioga County Real Property Tax Service","address":"56 Main St., Owego, NY 13827"}},"Tompkins County, NY":{"recorder":{"name":"Tompkins County Clerk","address":"320 N Tioga St., Ithaca, NY 14850"},"assessor":{"name":"Tompkins County Assessment","address":"128 E Buffalo St., Ithaca, NY 14850"}},"Ulster County, NY":{"recorder":{"name":"Ulster County Clerk","address":"244 Fair St., Kingston, NY 12401"},"assessor":{"name":"Ulster County Real Property Tax Service","address":"244 Fair St., Kingston, NY 12401"}},"Warren County, NY":{"recorder":{"name":"Warren County Clerk","address":"1340 State Route 9, Lake George, NY 12845"},"assessor":{"name":"Warren County Real Property Tax Service","address":"1340 State Route 9, Lake George, NY 12845"}},"Washington County, NY":{"recorder":{"name":"Washington County Clerk","address":"383 Broadway Fort Edward, NY 12828"},"assessor":{"name":"Washington County Real Property Tax Service","address":"383 Broadway, Fort Edward, NY 12828"}},"Wayne County, NY":{"recorder":{"name":"Wayne County Clerk","address":"9 Pearl St., Lyons, NY 14489"},"assessor":{"name":"Wayne County Real Property Tax Service","address":"9 Pearl St., Lyons, NY 14489"}},"Westchester County, NY":{"recorder":{"name":"Westchester County Clerk","address":"110 Dr. Martin Luther King Jr Blvd., White Plains, NY 10601"},"assessor":{"name":"Westchester County Real Property Tax Service","address":"110 Dr. Martin Luther King Jr Blvd., White Plains, NY 10601"}},"Wyoming County, NY":{"recorder":{"name":"Wyoming County Clerk","address":"143 N Main St., Warsaw, NY 14569"},"assessor":{"name":"Wyoming County Real Property Tax Service","address":"143 N Main St., Warsaw, NY 14569"}},"Yates County, NY":{"recorder":{"name":"Yates County Clerk","address":"417 Liberty St. Suite 1107, Penn Yan, NY 14527"},"assessor":{"name":"Yates County Real Property Tax Service","address":"417 Liberty St. Suite 1107, Penn Yan, NY 14527"}},"Adams County, OH":{"recorder":{"name":"Adams County Recorder","address":"110 W Main St., West Union, OH 45693"},"assessor":{"name":"Adams County Auditor","address":"110 W Main St., West Union, OH 45693"}},"Allen County, OH":{"recorder":{"name":"Allen County Recorder","address":"301 N Main St. Suite 204, Lima, OH 45801"},"assessor":{"name":"Allen County Auditor","address":"301 N Main St. Suite 203, Lima, OH 45801"}},"Ashland County, OH":{"recorder":{"name":"Ashland County Recorder","address":"142 W 2nd St., Ashland, OH 44805"},"assessor":{"name":"Ashland County Auditor","address":"142 W 2nd St., Ashland, OH 44805"}},"Ashtabula County, OH":{"recorder":{"name":"Ashtabula County Recorder","address":"25 W Jefferson St., Jefferson, OH 44047"},"assessor":{"name":"Ashtabula County Auditor","address":"25 W Jefferson St., Jefferson, OH 44047"}},"Athens County, OH":{"recorder":{"name":"Athens County Recorder","address":"15 S Court St., Athens, OH 45701"},"assessor":{"name":"Athens County Auditor","address":"15 S Court St., Athens, OH 45701"}},"Auglaize County, OH":{"recorder":{"name":"Auglaize County Recorder","address":"201 Willipie St. Suite 207, Wapakoneta, OH 45895"},"assessor":{"name":"Auglaize County Auditor","address":"201 Willipie St. Suite 207, Wapakoneta, OH 45895"}},"Belmont County, OH":{"recorder":{"name":"Belmont County Recorder","address":"101 W Main St., St. Clairsville, OH 43950"},"assessor":{"name":"Belmont County Auditor","address":"101 W Main St., St. Clairsville, OH 43950"}},"Brown County, OH":{"recorder":{"name":"Brown County Recorder","address":"800 Mt. Orab Pike Suite 1, Georgetown, OH 45121"},"assessor":{"name":"Brown County Auditor","address":"800 Mt. Orab Pike Suite 1, Georgetown, OH 45121"}},"Butler County, OH":{"recorder":{"name":"Butler County Recorder","address":"130 High St., Hamilton, OH 45011"},"assessor":{"name":"Butler County Auditor","address":"130 High St., Hamilton, OH 45011"}},"Carroll County, OH":{"recorder":{"name":"Carroll County Recorder","address":"119 Public Square, Carrollton, OH 44615"},"assessor":{"name":"Carroll County Auditor","address":"119 Public Square, Carrollton, OH 44615"}},"Champaign County, OH":{"recorder":{"name":"Champaign County Recorder","address":"200 N Main St., Urbana, OH 43078"},"assessor":{"name":"Champaign County Auditor","address":"200 N Main St., Urbana, OH 43078"}},"Clark County, OH":{"recorder":{"name":"Clark County Recorder","address":"31 N Limestone St., Springfield, OH 45502"},"assessor":{"name":"Clark County Auditor","address":"31 N Limestone St., Springfield, OH 45502"}},"Clermont County, OH":{"recorder":{"name":"Clermont County Recorder","address":"101 E Main St., Batavia, OH 45103"},"assessor":{"name":"Clermont County Auditor","address":"101 E Main St., Batavia, OH 45103"}},"Clinton County, OH":{"recorder":{"name":"Clinton County Recorder","address":"46 S South St., Wilmington, OH 45177"},"assessor":{"name":"Clinton County Auditor","address":"46 S South St., Wilmington, OH 45177"}},"Columbiana County, OH":{"recorder":{"name":"Columbiana County Recorder","address":"105 S Market St., Lisbon, OH 44432"},"assessor":{"name":"Columbiana County Auditor","address":"105 S Market St., Lisbon, OH 44432"}},"Coshocton County, OH":{"recorder":{"name":"Coshocton County Recorder","address":"349 Main St., Coshocton, OH 43812"},"assessor":{"name":"Coshocton County Auditor","address":"349 Main St., Coshocton, OH 43812"}},"Crawford County, OH":{"recorder":{"name":"Crawford County Recorder","address":"112 E Mansfield St., Bucyrus, OH 44820"},"assessor":{"name":"Crawford County Auditor","address":"112 E Mansfield St., Bucyrus, OH 44820"}},"Cuyahoga County, OH":{"recorder":{"name":"Cuyahoga County Fiscal Officer (Recording)","address":"2079 E 9th St., Cleveland, OH 44115"},"assessor":{"name":"Cuyahoga County Fiscal Officer (Assessment)","address":"2079 E 9th St., Cleveland, OH 44115"}},"Darke County, OH":{"recorder":{"name":"Darke County Recorder","address":"504 S Broadway, Greenville, OH 45331"},"assessor":{"name":"Darke County Auditor","address":"504 S Broadway, Greenville, OH 45331"}},"Defiance County, OH":{"recorder":{"name":"Defiance County Recorder","address":"500 Court St. Suite B, Defiance, OH 43512"},"assessor":{"name":"Defiance County Auditor","address":"500 Court St. Suite B, Defiance, OH 43512"}},"Delaware County, OH":{"recorder":{"name":"Delaware County Recorder","address":"91 N Sandusky St., Delaware, OH 43015"},"assessor":{"name":"Delaware County Auditor","address":"91 N Sandusky St., Delaware, OH 43015"}},"Erie County, OH":{"recorder":{"name":"Erie County Recorder","address":"247 Columbus Ave. Suite 210, Sandusky, OH 44870"},"assessor":{"name":"Erie County Auditor","address":"247 Columbus Ave. Suite 210, Sandusky, OH 44870"}},"Fairfield County, OH":{"recorder":{"name":"Fairfield County Recorder","address":"210 E Main St. Suite 201, Lancaster, OH 43130"},"assessor":{"name":"Fairfield County Auditor","address":"210 E Main St. Suite 201, Lancaster, OH 43130"}},"Fayette County, OH":{"recorder":{"name":"Fayette County Recorder","address":"110 E Court St., Washington Court House, OH 43160"},"assessor":{"name":"Fayette County Auditor","address":"110 E Court St., Washington Court House, OH 43160"}},"Franklin County, OH":{"recorder":{"name":"Franklin County Recorder","address":"373 S High St. 18th Floor, Columbus, OH 43215"},"assessor":{"name":"Franklin County Auditor","address":"373 S High St. 21st Floor, Columbus, OH 43215"}},"Fulton County, OH":{"recorder":{"name":"Fulton County Recorder","address":"152 S Fulton St. Suite 250, Wauseon, OH 43567"},"assessor":{"name":"Fulton County Auditor","address":"152 S Fulton St. Suite 250, Wauseon, OH 43567"}},"Gallia County, OH":{"recorder":{"name":"Gallia County Recorder","address":"18 Locust St. Room 1293, Gallipolis, OH 45631"},"assessor":{"name":"Gallia County Auditor","address":"18 Locust St. Room 1293, Gallipolis, OH 45631"}},"Geauga County, OH":{"recorder":{"name":"Geauga County Recorder","address":"231 Main St. Suite 1-C, Chardon, OH 44024"},"assessor":{"name":"Geauga County Auditor","address":"231 Main St. Suite 1-A, Chardon, OH 44024"}},"Greene County, OH":{"recorder":{"name":"Greene County Recorder","address":"45 N Detroit St., Xenia, OH 45385"},"assessor":{"name":"Greene County Auditor","address":"45 N Detroit St., Xenia, OH 45385"}},"Guernsey County, OH":{"recorder":{"name":"Guernsey County Recorder","address":"801 Wheeling Ave. Suite 304, Cambridge, OH 43725"},"assessor":{"name":"Guernsey County Auditor","address":"801 Wheeling Ave. Suite 304, Cambridge, OH 43725"}},"Hamilton County, OH":{"recorder":{"name":"Hamilton County Recorder","address":"138 E Court St. Room 202, Cincinnati, OH 45202"},"assessor":{"name":"Hamilton County Auditor","address":"138 E Court St. Room 304, Cincinnati, OH 45202"}},"Hancock County, OH":{"recorder":{"name":"Hancock County Recorder","address":"300 S Main St., Findlay, OH 45840"},"assessor":{"name":"Hancock County Auditor","address":"300 S Main St., Findlay, OH 45840"}},"Hardin County, OH":{"recorder":{"name":"Hardin County Recorder","address":"1 Courthouse Square Suite 140, Kenton, OH 43326"},"assessor":{"name":"Hardin County Auditor","address":"1 Courthouse Square Suite 140, Kenton, OH 43326"}},"Harrison County, OH":{"recorder":{"name":"Harrison County Recorder","address":"100 W Market St., Cadiz, OH 43907"},"assessor":{"name":"Harrison County Auditor","address":"100 W Market St., Cadiz, OH 43907"}},"Henry County, OH":{"recorder":{"name":"Henry County Recorder","address":"660 N Perry St. Suite 203, Napoleon, OH 43545"},"assessor":{"name":"Henry County Auditor","address":"660 N Perry St. Suite 203, Napoleon, OH 43545"}},"Highland County, OH":{"recorder":{"name":"Highland County Recorder","address":"114 Governor Foraker Pl., Hillsboro, OH 45133"},"assessor":{"name":"Highland County Auditor","address":"114 Governor Foraker Pl., Hillsboro, OH 45133"}},"Hocking County, OH":{"recorder":{"name":"Hocking County Recorder","address":"1 E Main St., Logan, OH 43138"},"assessor":{"name":"Hocking County Auditor","address":"1 E Main St., Logan, OH 43138"}},"Holmes County, OH":{"recorder":{"name":"Holmes County Recorder","address":"1 E Jackson St. Suite 200, Millersburg, OH 44654"},"assessor":{"name":"Holmes County Auditor","address":"1 E Jackson St. Suite 200, Millersburg, OH 44654"}},"Huron County, OH":{"recorder":{"name":"Huron County Recorder","address":"12 E Main St., Norwalk, OH 44857"},"assessor":{"name":"Huron County Auditor","address":"12 E Main St., Norwalk, OH 44857"}},"Jackson County, OH":{"recorder":{"name":"Jackson County Recorder","address":"226 E Main St., Jackson, OH 45640"},"assessor":{"name":"Jackson County Auditor","address":"226 E Main St., Jackson, OH 45640"}},"Jefferson County, OH":{"recorder":{"name":"Jefferson County Recorder","address":"301 Market St., Steubenville, OH 43952"},"assessor":{"name":"Jefferson County Auditor","address":"301 Market St., Steubenville, OH 43952"}},"Knox County, OH":{"recorder":{"name":"Knox County Recorder","address":"117 E High St. Suite 102, Mount Vernon, OH 43050"},"assessor":{"name":"Knox County Auditor","address":"117 E High St. Suite 102, Mount Vernon, OH 43050"}},"Lake County, OH":{"recorder":{"name":"Lake County Recorder","address":"105 Main St., Painesville, OH 44077"},"assessor":{"name":"Lake County Auditor","address":"105 Main St., Painesville, OH 44077"}},"Lawrence County, OH":{"recorder":{"name":"Lawrence County Recorder","address":"111 S 4th St., Ironton, OH 45638"},"assessor":{"name":"Lawrence County Auditor","address":"111 S 4th St., Ironton, OH 45638"}},"Licking County, OH":{"recorder":{"name":"Licking County Recorder","address":"20 S 2nd St., Newark, OH 43055"},"assessor":{"name":"Licking County Auditor","address":"20 S 2nd St., Newark, OH 43055"}},"Logan County, OH":{"recorder":{"name":"Logan County Recorder","address":"101 S Main St. Suite 28, Bellefontaine, OH 43311"},"assessor":{"name":"Logan County Auditor","address":"101 S Main St. Suite 28, Bellefontaine, OH 43311"}},"Lorain County, OH":{"recorder":{"name":"Lorain County Recorder","address":"226 Middle Ave. 3rd Floor, Elyria, OH 44035"},"assessor":{"name":"Lorain County Auditor","address":"226 Middle Ave. 3rd Floor, Elyria, OH 44035"}},"Lucas County, OH":{"recorder":{"name":"Lucas County Recorder","address":"1 Government Center Suite 700, Toledo, OH 43604"},"assessor":{"name":"Lucas County Auditor","address":"1 Government Center Suite 600, Toledo, OH 43604"}},"Madison County, OH":{"recorder":{"name":"Madison County Recorder","address":"1 N Main St., London, OH 43140"},"assessor":{"name":"Madison County Auditor","address":"1 N Main St., London, OH 43140"}},"Mahoning County, OH":{"recorder":{"name":"Mahoning County Recorder","address":"120 Market St., Youngstown, OH 44503"},"assessor":{"name":"Mahoning County Auditor","address":"120 Market St., Youngstown, OH 44503"}},"Marion County, OH":{"recorder":{"name":"Marion County Recorder","address":"222 W Center St., Marion, OH 43302"},"assessor":{"name":"Marion County Auditor","address":"222 W Center St., Marion, OH 43302"}},"Medina County, OH":{"recorder":{"name":"Medina County Recorder","address":"144 N Broadway St., Medina, OH 44256"},"assessor":{"name":"Medina County Auditor","address":"144 N Broadway St., Medina, OH 44256"}},"Meigs County, OH":{"recorder":{"name":"Meigs County Recorder","address":"100 E 2nd St., Pomeroy, OH 45769"},"assessor":{"name":"Meigs County Auditor","address":"100 E 2nd St., Pomeroy, OH 45769"}},"Mercer County, OH":{"recorder":{"name":"Mercer County Recorder","address":"101 N Main St. Room 103, Celina, OH 45822"},"assessor":{"name":"Mercer County Auditor","address":"101 N Main St. Room 103, Celina, OH 45822"}},"Miami County, OH":{"recorder":{"name":"Miami County Recorder","address":"201 W Main St., Troy, OH 45373"},"assessor":{"name":"Miami County Auditor","address":"201 W Main St., Troy, OH 45373"}},"Monroe County, OH":{"recorder":{"name":"Monroe County Recorder","address":"101 N Main St., Woodsfield, OH 43793"},"assessor":{"name":"Monroe County Auditor","address":"101 N Main St., Woodsfield, OH 43793"}},"Montgomery County, OH":{"recorder":{"name":"Montgomery County Recorder","address":"451 W 3rd St., Dayton, OH 45422"},"assessor":{"name":"Montgomery County Auditor","address":"451 W 3rd St., Dayton, OH 45422"}},"Morgan County, OH":{"recorder":{"name":"Morgan County Recorder","address":"19 E Main St., McConnelsville, OH 43756"},"assessor":{"name":"Morgan County Auditor","address":"19 E Main St., McConnelsville, OH 43756"}},"Morrow County, OH":{"recorder":{"name":"Morrow County Recorder","address":"48 E High St., Mount Gilead, OH 43338"},"assessor":{"name":"Morrow County Auditor","address":"48 E High St., Mount Gilead, OH 43338"}},"Muskingum County, OH":{"recorder":{"name":"Muskingum County Recorder","address":"401 Main St., Zanesville, OH 43701"},"assessor":{"name":"Muskingum County Auditor","address":"401 Main St., Zanesville, OH 43701"}},"Noble County, OH":{"recorder":{"name":"Noble County Recorder","address":"260 Courthouse, Caldwell, OH 43724"},"assessor":{"name":"Noble County Auditor","address":"260 Courthouse, Caldwell, OH 43724"}},"Ottawa County, OH":{"recorder":{"name":"Ottawa County Recorder","address":"315 Madison St. Room 203, Port Clinton, OH 43452"},"assessor":{"name":"Ottawa County Auditor","address":"315 Madison St. Room 203, Port Clinton, OH 43452"}},"Paulding County, OH":{"recorder":{"name":"Paulding County Recorder","address":"115 N Williams St., Paulding, OH 45879"},"assessor":{"name":"Paulding County Auditor","address":"115 N Williams St., Paulding, OH 45879"}},"Perry County, OH":{"recorder":{"name":"Perry County Recorder","address":"121 W Brown St., New Lexington, OH 43764"},"assessor":{"name":"Perry County Auditor","address":"121 W Brown St., New Lexington, OH 43764"}},"Pickaway County, OH":{"recorder":{"name":"Pickaway County Recorder","address":"207 S Court St., Circleville, OH 43113"},"assessor":{"name":"Pickaway County Auditor","address":"207 S Court St., Circleville, OH 43113"}},"Pike County, OH":{"recorder":{"name":"Pike County Recorder","address":"230 Waverly Plaza Suite 500, Waverly, OH 45690"},"assessor":{"name":"Pike County Auditor","address":"230 Waverly Plaza Suite 500, Waverly, OH 45690"}},"Portage County, OH":{"recorder":{"name":"Portage County Recorder","address":"449 S Meridian St., Ravenna, OH 44266"},"assessor":{"name":"Portage County Auditor","address":"449 S Meridian St., Ravenna, OH 44266"}},"Preble County, OH":{"recorder":{"name":"Preble County Recorder","address":"101 E Main St., Eaton, OH 45320"},"assessor":{"name":"Preble County Auditor","address":"101 E Main St., Eaton, OH 45320"}},"Putnam County, OH":{"recorder":{"name":"Putnam County Recorder","address":"245 E Main St. Suite 102, Ottawa, OH 45875"},"assessor":{"name":"Putnam County Auditor","address":"245 E Main St. Suite 102, Ottawa, OH 45875"}},"Richland County, OH":{"recorder":{"name":"Richland County Recorder","address":"50 Park Ave. E, Mansfield, OH 44902"},"assessor":{"name":"Richland County Auditor","address":"50 Park Ave. E, Mansfield, OH 44902"}},"Ross County, OH":{"recorder":{"name":"Ross County Recorder","address":"2 N Paint St. Suite D, Chillicothe, OH 45601"},"assessor":{"name":"Ross County Auditor","address":"2 N Paint St. Suite D, Chillicothe, OH 45601"}},"Sandusky County, OH":{"recorder":{"name":"Sandusky County Recorder","address":"100 N Park Ave. Suite 216, Fremont, OH 43420"},"assessor":{"name":"Sandusky County Auditor","address":"100 N Park Ave. Suite 216, Fremont, OH 43420"}},"Scioto County, OH":{"recorder":{"name":"Scioto County Recorder","address":"602 7th St., Portsmouth, OH 45662"},"assessor":{"name":"Scioto County Auditor","address":"602 7th St., Portsmouth, OH 45662"}},"Seneca County, OH":{"recorder":{"name":"Seneca County Recorder","address":"71 S Washington St. Suite 1101, Tiffin, OH 44883"},"assessor":{"name":"Seneca County Auditor","address":"71 S Washington St. Suite 1101, Tiffin, OH 44883"}},"Shelby County, OH":{"recorder":{"name":"Shelby County Recorder","address":"129 E Court St., Sidney, OH 45365"},"assessor":{"name":"Shelby County Auditor","address":"129 E Court St., Sidney, OH 45365"}},"Stark County, OH":{"recorder":{"name":"Stark County Recorder","address":"110 Central Plaza S Suite 210, Canton, OH 44702"},"assessor":{"name":"Stark County Auditor","address":"110 Central Plaza S Suite 210, Canton, OH 44702"}},"Summit County, OH":{"recorder":{"name":"Summit County Fiscal Officer (Recording)","address":"175 S Main St., Akron, OH 44308"},"assessor":{"name":"Summit County Fiscal Officer (Assessment)","address":"175 S Main St., Akron, OH 44308"}},"Trumbull County, OH":{"recorder":{"name":"Trumbull County Recorder","address":"160 High St. NW, Warren, OH 44481"},"assessor":{"name":"Trumbull County Auditor","address":"160 High St. NW, Warren, OH 44481"}},"Tuscarawas County, OH":{"recorder":{"name":"Tuscarawas County Recorder","address":"125 E High Ave., New Philadelphia, OH 44663"},"assessor":{"name":"Tuscarawas County Auditor","address":"125 E High Ave., New Philadelphia, OH 44663"}},"Union County, OH":{"recorder":{"name":"Union County Recorder","address":"233 W 6th St., Marysville, OH 43040"},"assessor":{"name":"Union County Auditor","address":"233 W 6th St., Marysville, OH 43040"}},"Van Wert County, OH":{"recorder":{"name":"Van Wert County Recorder","address":"121 E Main St., Van Wert, OH 45891"},"assessor":{"name":"Van Wert County Auditor","address":"121 E Main St., Van Wert, OH 45891"}},"Vinton County, OH":{"recorder":{"name":"Vinton County Recorder","address":"100 E Main St., McArthur, OH 45651"},"assessor":{"name":"Vinton County Auditor","address":"100 E Main St., McArthur, OH 45651"}},"Warren County, OH":{"recorder":{"name":"Warren County Recorder","address":"406 Justice Dr., Lebanon, OH 45036"},"assessor":{"name":"Warren County Auditor","address":"406 Justice Dr., Lebanon, OH 45036"}},"Washington County, OH":{"recorder":{"name":"Washington County Recorder","address":"205 Putnam St., Marietta, OH 45750"},"assessor":{"name":"Washington County Auditor","address":"205 Putnam St., Marietta, OH 45750"}},"Wayne County, OH":{"recorder":{"name":"Wayne County Recorder","address":"428 W Liberty St., Wooster, OH 44691"},"assessor":{"name":"Wayne County Auditor","address":"428 W Liberty St., Wooster, OH 44691"}},"Williams County, OH":{"recorder":{"name":"Williams County Recorder","address":"1 Courthouse Square, Bryan, OH 43506"},"assessor":{"name":"Williams County Auditor","address":"1 Courthouse Square, Bryan, OH 43506"}},"Wood County, OH":{"recorder":{"name":"Wood County Recorder","address":"1 Courthouse Square Suite 121, Bowling Green, OH 43402"},"assessor":{"name":"Wood County Auditor","address":"1 Courthouse Square Suite 121, Bowling Green, OH 43402"}},"Wyandot County, OH":{"recorder":{"name":"Wyandot County Recorder","address":"109 S Sandusky Ave. Room 23, Upper Sandusky, OH 43351"},"assessor":{"name":"Wyandot County Auditor","address":"109 S Sandusky Ave. Room 23, Upper Sandusky, OH 43351"}},"Adair County, OK":{"recorder":{"name":"Adair County Clerk","address":"220 W Division St., Stilwell, OK 74960"},"assessor":{"name":"Adair County Assessor","address":"220 W Division St., Stilwell, OK 74960"}},"Alfalfa County, OK":{"recorder":{"name":"Alfalfa County Clerk","address":"300 S Grand Ave. Suite 1, Cherokee, OK 73728"},"assessor":{"name":"Alfalfa County Assessor","address":"300 S Grand Ave. Suite 1, Cherokee, OK 73728"}},"Atoka County, OK":{"recorder":{"name":"Atoka County Clerk","address":"200 E Court St., Atoka, OK 74525"},"assessor":{"name":"Atoka County Assessor","address":"200 E Court St., Atoka, OK 74525"}},"Beaver County, OK":{"recorder":{"name":"Beaver County Clerk","address":"111 W 2nd St., Beaver, OK 73932"},"assessor":{"name":"Beaver County Assessor","address":"111 W 2nd St., Beaver, OK 73932"}},"Beckham County, OK":{"recorder":{"name":"Beckham County Clerk","address":"302 E Main St., Sayre, OK 73662"},"assessor":{"name":"Beckham County Assessor","address":"302 E Main St., Sayre, OK 73662"}},"Blaine County, OK":{"recorder":{"name":"Blaine County Clerk","address":"212 N Weigle Ave., Watonga, OK 73772"},"assessor":{"name":"Blaine County Assessor","address":"212 N Weigle Ave., Watonga, OK 73772"}},"Bryan County, OK":{"recorder":{"name":"Bryan County Clerk","address":"402 W Evergreen St., Durant, OK 74701"},"assessor":{"name":"Bryan County Assessor","address":"402 W Evergreen St., Durant, OK 74701"}},"Caddo County, OK":{"recorder":{"name":"Caddo County Clerk","address":"201 W Oklahoma Ave., Anadarko, OK 73005"},"assessor":{"name":"Caddo County Assessor","address":"201 W Oklahoma Ave., Anadarko, OK 73005"}},"Canadian County, OK":{"recorder":{"name":"Canadian County Clerk","address":"201 N Choctaw Ave., El Reno, OK 73036"},"assessor":{"name":"Canadian County Assessor","address":"201 N Choctaw Ave., El Reno, OK 73036"}},"Carter County, OK":{"recorder":{"name":"Carter County Clerk","address":"20 B St. SW, Ardmore, OK 73401"},"assessor":{"name":"Carter County Assessor","address":"20 B St. SW, Ardmore, OK 73401"}},"Cherokee County, OK":{"recorder":{"name":"Cherokee County Clerk","address":"213 W Delaware St., Tahlequah, OK 74464"},"assessor":{"name":"Cherokee County Assessor","address":"213 W Delaware St., Tahlequah, OK 74464"}},"Choctaw County, OK":{"recorder":{"name":"Choctaw County Clerk","address":"300 E Duke St., Hugo, OK 74743"},"assessor":{"name":"Choctaw County Assessor","address":"300 E Duke St., Hugo, OK 74743"}},"Cimarron County, OK":{"recorder":{"name":"Cimarron County Clerk","address":"100 S Boise St., Boise City, OK 73933"},"assessor":{"name":"Cimarron County Assessor","address":"100 S Boise St., Boise City, OK 73933"}},"Cleveland County, OK":{"recorder":{"name":"Cleveland County Clerk","address":"201 S Jones Ave., Norman, OK 73069"},"assessor":{"name":"Cleveland County Assessor","address":"201 S Jones Ave., Norman, OK 73069"}},"Coal County, OK":{"recorder":{"name":"Coal County Clerk","address":"4 N Main St., Coalgate, OK 74538"},"assessor":{"name":"Coal County Assessor","address":"4 N Main St., Coalgate, OK 74538"}},"Comanche County, OK":{"recorder":{"name":"Comanche County Clerk","address":"315 SW 5th St., Lawton, OK 73501"},"assessor":{"name":"Comanche County Assessor","address":"315 SW 5th St., Lawton, OK 73501"}},"Cotton County, OK":{"recorder":{"name":"Cotton County Clerk","address":"301 N Broadway St., Walters, OK 73572"},"assessor":{"name":"Cotton County Assessor","address":"301 N Broadway St., Walters, OK 73572"}},"Craig County, OK":{"recorder":{"name":"Craig County Clerk","address":"301 W Canadian Ave., Vinita, OK 74301"},"assessor":{"name":"Craig County Assessor","address":"301 W Canadian Ave., Vinita, OK 74301"}},"Creek County, OK":{"recorder":{"name":"Creek County Clerk","address":"317 E Lee Ave., Sapulpa, OK 74066"},"assessor":{"name":"Creek County Assessor","address":"317 E Lee Ave., Sapulpa, OK 74066"}},"Custer County, OK":{"recorder":{"name":"Custer County Clerk","address":"675 B St., Arapaho, OK 73620"},"assessor":{"name":"Custer County Assessor","address":"675 B St., Arapaho, OK 73620"}},"Delaware County, OK":{"recorder":{"name":"Delaware County Clerk","address":"1 Courthouse Dr., Jay, OK 74346"},"assessor":{"name":"Delaware County Assessor","address":"1 Courthouse Dr., Jay, OK 74346"}},"Dewey County, OK":{"recorder":{"name":"Dewey County Clerk","address":"213 W Prairie Ave., Taloga, OK 73667"},"assessor":{"name":"Dewey County Assessor","address":"213 W Prairie Ave., Taloga, OK 73667"}},"Ellis County, OK":{"recorder":{"name":"Ellis County Clerk","address":"100 S Washington St., Arnett, OK 73832"},"assessor":{"name":"Ellis County Assessor","address":"100 S Washington St., Arnett, OK 73832"}},"Garfield County, OK":{"recorder":{"name":"Garfield County Clerk","address":"114 W Broadway Ave., Enid, OK 73701"},"assessor":{"name":"Garfield County Assessor","address":"114 W Broadway Ave., Enid, OK 73701"}},"Garvin County, OK":{"recorder":{"name":"Garvin County Clerk","address":"201 W Grant Ave., Pauls Valley, OK 73075"},"assessor":{"name":"Garvin County Assessor","address":"201 W Grant Ave., Pauls Valley, OK 73075"}},"Grady County, OK":{"recorder":{"name":"Grady County Clerk","address":"326 W Choctaw Ave., Chickasha, OK 73018"},"assessor":{"name":"Grady County Assessor","address":"326 W Choctaw Ave., Chickasha, OK 73018"}},"Grant County, OK":{"recorder":{"name":"Grant County Clerk","address":"112 E Guthrie Ave., Medford, OK 73759"},"assessor":{"name":"Grant County Assessor","address":"112 E Guthrie Ave., Medford, OK 73759"}},"Greer County, OK":{"recorder":{"name":"Greer County Clerk","address":"106 E Jefferson St., Mangum, OK 73554"},"assessor":{"name":"Greer County Assessor","address":"106 E Jefferson St., Mangum, OK 73554"}},"Harmon County, OK":{"recorder":{"name":"Harmon County Clerk","address":"114 W Hollis St., Hollis, OK 73550"},"assessor":{"name":"Harmon County Assessor","address":"114 W Hollis St., Hollis, OK 73550"}},"Harper County, OK":{"recorder":{"name":"Harper County Clerk","address":"311 SE 1st St., Buffalo, OK 73834"},"assessor":{"name":"Harper County Assessor","address":"311 SE 1st St., Buffalo, OK 73834"}},"Haskell County, OK":{"recorder":{"name":"Haskell County Clerk","address":"202 E Main St., Stigler, OK 74462"},"assessor":{"name":"Haskell County Assessor","address":"202 E Main St., Stigler, OK 74462"}},"Hughes County, OK":{"recorder":{"name":"Hughes County Clerk","address":"200 N Broadway St., Holdenville, OK 74848"},"assessor":{"name":"Hughes County Assessor","address":"200 N Broadway St., Holdenville, OK 74848"}},"Jackson County, OK":{"recorder":{"name":"Jackson County Clerk","address":"101 N 5th St., Altus, OK 73521"},"assessor":{"name":"Jackson County Assessor","address":"101 N 5th St., Altus, OK 73521"}},"Jefferson County, OK":{"recorder":{"name":"Jefferson County Clerk","address":"220 N Main St., Waurika, OK 73573"},"assessor":{"name":"Jefferson County Assessor","address":"220 N Main St., Waurika, OK 73573"}},"Johnston County, OK":{"recorder":{"name":"Johnston County Clerk","address":"403 W Main St., Tishomingo, OK 73460"},"assessor":{"name":"Johnston County Assessor","address":"403 W Main St., Tishomingo, OK 73460"}},"Kay County, OK":{"recorder":{"name":"Kay County Clerk","address":"201 S Main St., Newkirk, OK 74647"},"assessor":{"name":"Kay County Assessor","address":"201 S Main St., Newkirk, OK 74647"}},"Kingfisher County, OK":{"recorder":{"name":"Kingfisher County Clerk","address":"101 S Main St., Kingfisher, OK 73750"},"assessor":{"name":"Kingfisher County Assessor","address":"101 S Main St., Kingfisher, OK 73750"}},"Kiowa County, OK":{"recorder":{"name":"Kiowa County Clerk","address":"316 S Main St., Hobart, OK 73651"},"assessor":{"name":"Kiowa County Assessor","address":"316 S Main St., Hobart, OK 73651"}},"Latimer County, OK":{"recorder":{"name":"Latimer County Clerk","address":"109 N Central St., Wilburton, OK 74578"},"assessor":{"name":"Latimer County Assessor","address":"109 N Central St., Wilburton, OK 74578"}},"Le Flore County, OK":{"recorder":{"name":"Le Flore County Clerk","address":"100 S Broadway St., Poteau, OK 74953"},"assessor":{"name":"Le Flore County Assessor","address":"100 S Broadway St., Poteau, OK 74953"}},"Lincoln County, OK":{"recorder":{"name":"Lincoln County Clerk","address":"811 Manvel Ave., Chandler, OK 74834"},"assessor":{"name":"Lincoln County Assessor","address":"811 Manvel Ave., Chandler, OK 74834"}},"Logan County, OK":{"recorder":{"name":"Logan County Clerk","address":"301 E Harrison Ave., Guthrie, OK 73044"},"assessor":{"name":"Logan County Assessor","address":"301 E Harrison Ave., Guthrie, OK 73044"}},"Love County, OK":{"recorder":{"name":"Love County Clerk","address":"405 W Main St., Marietta, OK 73448"},"assessor":{"name":"Love County Assessor","address":"405 W Main St., Marietta, OK 73448"}},"Major County, OK":{"recorder":{"name":"Major County Clerk","address":"500 E Broadway St., Fairview, OK 73737"},"assessor":{"name":"Major County Assessor","address":"500 E Broadway St., Fairview, OK 73737"}},"Marshall County, OK":{"recorder":{"name":"Marshall County Clerk","address":"1 Courthouse Dr., Madill, OK 73446"},"assessor":{"name":"Marshall County Assessor","address":"1 Courthouse Dr., Madill, OK 73446"}},"Mayes County, OK":{"recorder":{"name":"Mayes County Clerk","address":"1 Court Pl., Pryor, OK 74361"},"assessor":{"name":"Mayes County Assessor","address":"1 Court Pl., Pryor, OK 74361"}},"McClain County, OK":{"recorder":{"name":"McClain County Clerk","address":"121 N 2nd Ave., Purcell, OK 73080"},"assessor":{"name":"McClain County Assessor","address":"121 N 2nd Ave., Purcell, OK 73080"}},"McCurtain County, OK":{"recorder":{"name":"McCurtain County Clerk","address":"108 N Central Ave., Idabel, OK 74745"},"assessor":{"name":"McCurtain County Assessor","address":"108 N Central Ave., Idabel, OK 74745"}},"McIntosh County, OK":{"recorder":{"name":"McIntosh County Clerk","address":"110 N 1st St., Eufaula, OK 74432"},"assessor":{"name":"McIntosh County Assessor","address":"110 N 1st St., Eufaula, OK 74432"}},"Murray County, OK":{"recorder":{"name":"Murray County Clerk","address":"1 Courthouse Sq., Sulphur, OK 73086"},"assessor":{"name":"Murray County Assessor","address":"1 Courthouse Sq., Sulphur, OK 73086"}},"Muskogee County, OK":{"recorder":{"name":"Muskogee County Clerk","address":"400 W Broadway St., Muskogee, OK 74401"},"assessor":{"name":"Muskogee County Assessor","address":"400 W Broadway St., Muskogee, OK 74401"}},"Noble County, OK":{"recorder":{"name":"Noble County Clerk","address":"300 Courthouse Dr., Perry, OK 73077"},"assessor":{"name":"Noble County Assessor","address":"300 Courthouse Dr., Perry, OK 73077"}},"Nowata County, OK":{"recorder":{"name":"Nowata County Clerk","address":"229 N Maple St., Nowata, OK 74048"},"assessor":{"name":"Nowata County Assessor","address":"229 N Maple St., Nowata, OK 74048"}},"Okfuskee County, OK":{"recorder":{"name":"Okfuskee County Clerk","address":"200 S 3rd St., Okemah, OK 74859"},"assessor":{"name":"Okfuskee County Assessor","address":"200 S 3rd St., Okemah, OK 74859"}},"Oklahoma County, OK":{"recorder":{"name":"Oklahoma County Clerk","address":"320 Robert S Kerr Ave. Suite 203, Oklahoma City, OK 73102"},"assessor":{"name":"Oklahoma County Assessor","address":"320 Robert S Kerr Ave. Suite 313, Oklahoma City, OK 73102"}},"Okmulgee County, OK":{"recorder":{"name":"Okmulgee County Clerk","address":"314 W 7th St., Okmulgee, OK 74447"},"assessor":{"name":"Okmulgee County Assessor","address":"314 W 7th St., Okmulgee, OK 74447"}},"Osage County, OK":{"recorder":{"name":"Osage County Clerk","address":"600 Grandview Ave., Pawhuska, OK 74056"},"assessor":{"name":"Osage County Assessor","address":"600 Grandview Ave., Pawhuska, OK 74056"}},"Ottawa County, OK":{"recorder":{"name":"Ottawa County Clerk","address":"102 E Central Ave. Suite 106, Miami, OK 74354"},"assessor":{"name":"Ottawa County Assessor","address":"102 E Central Ave., Miami, OK 74354"}},"Pawnee County, OK":{"recorder":{"name":"Pawnee County Clerk","address":"500 Harrison St., Pawnee, OK 74058"},"assessor":{"name":"Pawnee County Assessor","address":"500 Harrison St., Pawnee, OK 74058"}},"Payne County, OK":{"recorder":{"name":"Payne County Clerk","address":"606 S Husband St., Stillwater, OK 74074"},"assessor":{"name":"Payne County Assessor","address":"606 S Husband St., Stillwater, OK 74074"}},"Pittsburg County, OK":{"recorder":{"name":"Pittsburg County Clerk","address":"115 E Carl Albert Pkwy., McAlester, OK 74501"},"assessor":{"name":"Pittsburg County Assessor","address":"115 E Carl Albert Pkwy., McAlester, OK 74501"}},"Pontotoc County, OK":{"recorder":{"name":"Pontotoc County Clerk","address":"120 W 13th St., Ada, OK 74820"},"assessor":{"name":"Pontotoc County Assessor","address":"120 W 13th St., Ada, OK 74820"}},"Pottawatomie County, OK":{"recorder":{"name":"Pottawatomie County Clerk","address":"325 N Broadway St., Shawnee, OK 74801"},"assessor":{"name":"Pottawatomie County Assessor","address":"325 N Broadway St., Shawnee, OK 74801"}},"Pushmataha County, OK":{"recorder":{"name":"Pushmataha County Clerk","address":"203 SW 3rd St., Antlers, OK 74523"},"assessor":{"name":"Pushmataha County Assessor","address":"203 SW 3rd St., Antlers, OK 74523"}},"Roger Mills County, OK":{"recorder":{"name":"Roger Mills County Clerk","address":"Cheyenne, OK 73628"},"assessor":{"name":"Roger Mills County Assessor","address":"Cheyenne, OK 73628"}},"Rogers County, OK":{"recorder":{"name":"Rogers County Clerk","address":"219 S Missouri Ave., Claremore, OK 74017"},"assessor":{"name":"Rogers County Assessor","address":"219 S Missouri Ave., Claremore, OK 74017"}},"Seminole County, OK":{"recorder":{"name":"Seminole County Clerk","address":"524 S Wewoka Ave., Wewoka, OK 74884"},"assessor":{"name":"Seminole County Assessor","address":"524 S Wewoka Ave., Wewoka, OK 74884"}},"Sequoyah County, OK":{"recorder":{"name":"Sequoyah County Clerk","address":"120 E Chickasaw Ave., Sallisaw, OK 74955"},"assessor":{"name":"Sequoyah County Assessor","address":"120 E Chickasaw Ave., Sallisaw, OK 74955"}},"Stephens County, OK":{"recorder":{"name":"Stephens County Clerk","address":"101 S 11th St., Duncan, OK 73533"},"assessor":{"name":"Stephens County Assessor","address":"101 S 11th St., Duncan, OK 73533"}},"Texas County, OK":{"recorder":{"name":"Texas County Clerk","address":"319 N Main St., Guymon, OK 73942"},"assessor":{"name":"Texas County Assessor","address":"319 N Main St., Guymon, OK 73942"}},"Tillman County, OK":{"recorder":{"name":"Tillman County Clerk","address":"201 N Main St., Frederick, OK 73542"},"assessor":{"name":"Tillman County Assessor","address":"201 N Main St., Frederick, OK 73542"}},"Tulsa County, OK":{"recorder":{"name":"Tulsa County Clerk","address":"500 S Denver Ave., Tulsa, OK 74103"},"assessor":{"name":"Tulsa County Assessor","address":"500 S Denver Ave. Suite 215, Tulsa, OK 74103"}},"Wagoner County, OK":{"recorder":{"name":"Wagoner County Clerk","address":"307 E Cherokee St., Wagoner, OK 74467"},"assessor":{"name":"Wagoner County Assessor","address":"307 E Cherokee St., Wagoner, OK 74467"}},"Washington County, OK":{"recorder":{"name":"Washington County Clerk","address":"420 S Johnstone Ave., Bartlesville, OK 74003"},"assessor":{"name":"Washington County Assessor","address":"420 S Johnstone Ave., Bartlesville, OK 74003"}},"Washita County, OK":{"recorder":{"name":"Washita County Clerk","address":"111 E Main St., Cordell, OK 73632"},"assessor":{"name":"Washita County Assessor","address":"111 E Main St., Cordell, OK 73632"}},"Woods County, OK":{"recorder":{"name":"Woods County Clerk","address":"407 Government St., Alva, OK 73717"},"assessor":{"name":"Woods County Assessor","address":"407 Government St., Alva, OK 73717"}},"Woodward County, OK":{"recorder":{"name":"Woodward County Clerk","address":"1600 Main St., Woodward, OK 73801"},"assessor":{"name":"Woodward County Assessor","address":"1600 Main St., Woodward, OK 73801"}},"Baker County, OR":{"recorder":{"name":"Baker County Clerk","address":"1995 3rd St. Suite 150, Baker City, OR 97814"},"assessor":{"name":"Baker County Assessor","address":"1995 3rd St. Suite 190, Baker City, OR 97814"}},"Benton County, OR":{"recorder":{"name":"Benton County Clerk","address":"4500 SW Research Way 2nd Floor, Corvallis, OR 97333"},"assessor":{"name":"Benton County Assessor","address":"4500 SW Research Way, Corvallis, OR 97333"}},"Clackamas County, OR":{"recorder":{"name":"Clackamas County Clerk","address":"1710 Red Soils Ct Suite 100, Oregon City, OR 97045"},"assessor":{"name":"Clackamas County Assessor","address":"150 Beavercreek Rd., Oregon City, OR 97045"}},"Clatsop County, OR":{"recorder":{"name":"Clatsop County Clerk","address":"820 Exchange St. Suite 220, Astoria, OR 97103"},"assessor":{"name":"Clatsop County Assessor","address":"820 Exchange St. Suite 210, Astoria, OR 97103"}},"Columbia County, OR":{"recorder":{"name":"Columbia County Clerk","address":"230 Strand St., St. Helens, OR 97051"},"assessor":{"name":"Columbia County Assessor","address":"230 Strand St., St. Helens, OR 97051"}},"Coos County, OR":{"recorder":{"name":"Coos County Clerk","address":"250 N. Baxter St., Coquille, OR 97423"},"assessor":{"name":"Coos County Assessor","address":"250 N. Baxter St., Coquille, OR 97423"}},"Crook County, OR":{"recorder":{"name":"Crook County Clerk","address":"300 NE 3rd St. Room 23, Prineville, OR 97754"},"assessor":{"name":"Crook County Assessor","address":"300 NE 3rd St. Room 24, Prineville, OR 97754"}},"Curry County, OR":{"recorder":{"name":"Curry County Clerk","address":"29821 Ellensburg Ave. 2nd Floor, Gold Beach, OR 97444"},"assessor":{"name":"Curry County Assessor","address":"29821 Ellensburg Ave., Gold Beach, OR 97444"}},"Deschutes County, OR":{"recorder":{"name":"Deschutes County Clerk","address":"1300 NW Wall St Suite 202, Bend, OR 97703"},"assessor":{"name":"Deschutes County Assessor","address":"1300 NW Wall St Suite 200, Bend, OR 97703"}},"Douglas County, OR":{"recorder":{"name":"Douglas County Clerk","address":"1036 SE Douglas Room 124, Roseburg, OR 97470"},"assessor":{"name":"Douglas County Assessor","address":"1036 SE Douglas Room 106, Roseburg, OR 97470"}},"Gilliam County, OR":{"recorder":{"name":"Gilliam County Clerk","address":"221 S. Oregon St. Room 200, Condon, OR 97823"},"assessor":{"name":"Gilliam County Assessor","address":"221 S. Oregon St., Condon, OR 97823"}},"Grant County, OR":{"recorder":{"name":"Grant County Clerk","address":"201 S. Humbolt Suite 290, Canyon City, OR 97820"},"assessor":{"name":"Grant County Assessor","address":"201 S. Humbolt Suite 270, Canyon City, OR 97820"}},"Harney County, OR":{"recorder":{"name":"Harney County Clerk","address":"450 N. Buena Vista Ave Suite 14, Burns, OR 97720"},"assessor":{"name":"Harney County Assessor","address":"450 N. Buena Vista Ave Suite 32, Burns, OR 97720"}},"Hood River County, OR":{"recorder":{"name":"Hood River County Clerk","address":"601 State St., Hood River, OR 97031"},"assessor":{"name":"Hood River County Assessor","address":"601 State St., Hood River, OR 97031"}},"Jackson County, OR":{"recorder":{"name":"Jackson County Clerk","address":"1101 W. Main St. Suite 201, Medford, OR 97501"},"assessor":{"name":"Jackson County Assessor","address":"10 S. Oakdale Ave. Room 300, Medford, OR 97501"}},"Jefferson County, OR":{"recorder":{"name":"Jefferson County Clerk","address":"66 SE D St. Suite C, Madras, OR 97741"},"assessor":{"name":"Jefferson County Assessor","address":"66 SE D St. Suite A, Madras, OR 97741"}},"Josephine County, OR":{"recorder":{"name":"Josephine County Clerk","address":"500 NW 6th St. Room 170, Grants Pass, OR 97526"},"assessor":{"name":"Josephine County Assessor","address":"500 NW 6th St. Room 175, Grants Pass, OR 97526"}},"Klamath County, OR":{"recorder":{"name":"Klamath County Clerk","address":"305 Main St., Klamath Falls, OR 97601"},"assessor":{"name":"Klamath County Assessor","address":"305 Main St., Klamath Falls, OR 97601"}},"Lake County, OR":{"recorder":{"name":"Lake County Clerk","address":"513 Center St., Lakeview, OR 97630"},"assessor":{"name":"Lake County Assessor","address":"513 Center St., Lakeview, OR 97630"}},"Lane County, OR":{"recorder":{"name":"Lane County Clerk","address":"275 W. 10th Ave., Eugene, OR 97401"},"assessor":{"name":"Lane County Assessor","address":"125 E. 8th Ave., Eugene, OR 97401"}},"Lincoln County, OR":{"recorder":{"name":"Lincoln County Clerk","address":"225 W. Olive St. Suite 201, Newport, OR 97365"},"assessor":{"name":"Lincoln County Assessor","address":"225 W. Olive St. Suite 103, Newport, OR 97365"}},"Linn County, OR":{"recorder":{"name":"Linn County Clerk","address":"421 Water Ave. NE Suite 1300, Albany, OR 97321"},"assessor":{"name":"Linn County Assessor","address":"300 4th Ave. SW Room 214, Albany, OR 97321"}},"Malheur County, OR":{"recorder":{"name":"Malheur County Clerk","address":"251 B St. W Suite 4, Vale, OR 97918"},"assessor":{"name":"Malheur County Assessor","address":"251 B St. W, Vale, OR 97918"}},"Marion County, OR":{"recorder":{"name":"Marion County Clerk","address":"555 Court St. NE Suite 2130, Salem, OR 97301"},"assessor":{"name":"Marion County Assessor","address":"PO Box 14500, Salem, OR 97309"}},"Morrow County, OR":{"recorder":{"name":"Morrow County Clerk","address":"100 S. Court St. Suite 102, Heppner, OR 97836"},"assessor":{"name":"Morrow County Assessor","address":"100 S. Court St., Heppner, OR 97836"}},"Multnomah County, OR":{"recorder":{"name":"Multnomah County Elections","address":"1040 SE Morrison St., Portland, OR 97214"},"assessor":{"name":"Multnomah County Assessor","address":"501 SE Hawthorne Blvd. Suite 175, Portland, OR 97214"}},"Polk County, OR":{"recorder":{"name":"Polk County Clerk","address":"850 Main St. Room 201, Dallas, OR 97338"},"assessor":{"name":"Polk County Assessor","address":"850 Main St. Room 202, Dallas, OR 97338"}},"Sherman County, OR":{"recorder":{"name":"Sherman County Clerk","address":"500 Court St., Moro, OR 97039"},"assessor":{"name":"Sherman County Assessor","address":"500 Court St., Moro, OR 97039"}},"Tillamook County, OR":{"recorder":{"name":"Tillamook County Clerk","address":"201 Laurel Ave., Tillamook, OR 97141"},"assessor":{"name":"Tillamook County Assessor","address":"201 Laurel Ave., Tillamook, OR 97141"}},"Umatilla County, OR":{"recorder":{"name":"Umatilla County Clerk","address":"216 SE 4th St. Suite 18, Pendleton, OR 97801"},"assessor":{"name":"Umatilla County Assessor","address":"216 SE 4th St., Pendleton, OR 97801"}},"Union County, OR":{"recorder":{"name":"Union County Clerk","address":"1001 4th St. Suite D, La Grande, OR 97850"},"assessor":{"name":"Union County Assessor","address":"1001 4th St. Suite A, La Grande, OR 97850"}},"Wallowa County, OR":{"recorder":{"name":"Wallowa County Clerk","address":"101 S. River St. Suite 100, Enterprise, OR 97828"},"assessor":{"name":"Wallowa County Assessor","address":"101 S. River St. Suite 201, Enterprise, OR 97828"}},"Wasco County, OR":{"recorder":{"name":"Wasco County Clerk","address":"401 E. 3rd St. Suite 100, The Dalles, OR 97058"},"assessor":{"name":"Wasco County Assessor","address":"511 Washington St. Suite 100, The Dalles, OR 97058"}},"Washington County, OR":{"recorder":{"name":"Washington County Elections","address":"2925 NE Aloclek Dr. Suite 170, Hillsboro, OR 97124"},"assessor":{"name":"Washington County Assessor","address":"155 N. First Ave. Suite 130, Hillsboro, OR 97124"}},"Wheeler County, OR":{"recorder":{"name":"Wheeler County Clerk","address":"701 Adams St. Suite 204, Fossil, OR 97830"},"assessor":{"name":"Wheeler County Assessor","address":"701 Adams St., Fossil, OR 97830"}},"Yamhill County, OR":{"recorder":{"name":"Yamhill County Clerk","address":"414 NE Evans St., McMinnville, OR 97128"},"assessor":{"name":"Yamhill County Assessor","address":"535 NE 5th St., McMinnville, OR 97128"}},"Adams County, PA":{"recorder":{"name":"Adams County Recorder of Deeds","address":"117 Baltimore St. Room 202, Gettysburg, PA 17325"},"assessor":{"name":"Adams County Assessment Office","address":"117 Baltimore St. Room 202, Gettysburg, PA 17325"}},"Allegheny County, PA":{"recorder":{"name":"Allegheny County Recorder of Deeds","address":"542 Forbes Ave. Room 101, Pittsburgh, PA 15219"},"assessor":{"name":"Allegheny County Office of Property Assessments","address":"542 Forbes Ave. Room 347, Pittsburgh, PA 15219"}},"Armstrong County, PA":{"recorder":{"name":"Armstrong County Recorder of Deeds","address":"500 E Market St. Suite 104, Kittanning, PA 16201"},"assessor":{"name":"Armstrong County Assessment Office","address":"500 E Market St. Suite 104, Kittanning, PA 16201"}},"Beaver County, PA":{"recorder":{"name":"Beaver County Recorder of Deeds","address":"810 3rd St., Beaver, PA 15009"},"assessor":{"name":"Beaver County Assessment Office","address":"810 3rd St., Beaver, PA 15009"}},"Bedford County, PA":{"recorder":{"name":"Bedford County Recorder of Deeds","address":"200 S Juliana St., Bedford, PA 15522"},"assessor":{"name":"Bedford County Assessment Office","address":"200 S Juliana St., Bedford, PA 15522"}},"Berks County, PA":{"recorder":{"name":"Berks County Recorder of Deeds","address":"633 Court St. 2nd Floor, Reading, PA 19601"},"assessor":{"name":"Berks County Assessment Office","address":"633 Court St. 3rd Floor, Reading, PA 19601"}},"Blair County, PA":{"recorder":{"name":"Blair County Recorder of Deeds","address":"423 Allegheny St. Suite 143, Hollidaysburg, PA 16648"},"assessor":{"name":"Blair County Assessment Office","address":"423 Allegheny St. Suite 143, Hollidaysburg, PA 16648"}},"Bradford County, PA":{"recorder":{"name":"Bradford County Recorder of Deeds","address":"301 Main St., Towanda, PA 18848"},"assessor":{"name":"Bradford County Assessment Office","address":"301 Main St., Towanda, PA 18848"}},"Bucks County, PA":{"recorder":{"name":"Bucks County Recorder of Deeds","address":"55 E Court St., Doylestown, PA 18901"},"assessor":{"name":"Bucks County Assessment Office","address":"55 E Court St., Doylestown, PA 18901"}},"Butler County, PA":{"recorder":{"name":"Butler County Recorder of Deeds","address":"124 W Diamond St., Butler, PA 16001"},"assessor":{"name":"Butler County Assessment Office","address":"124 W Diamond St., Butler, PA 16001"}},"Cambria County, PA":{"recorder":{"name":"Cambria County Recorder of Deeds","address":"200 S Center St., Ebensburg, PA 15931"},"assessor":{"name":"Cambria County Assessment Office","address":"200 S Center St., Ebensburg, PA 15931"}},"Cameron County, PA":{"recorder":{"name":"Cameron County Recorder of Deeds","address":"20 E 5th St., Emporium, PA 15834"},"assessor":{"name":"Cameron County Assessment Office","address":"20 E 5th St., Emporium, PA 15834"}},"Carbon County, PA":{"recorder":{"name":"Carbon County Recorder of Deeds","address":"2 Hazard Square Suite 3, Jim Thorpe, PA 18229"},"assessor":{"name":"Carbon County Assessment Office","address":"2 Hazard Square Suite 3, Jim Thorpe, PA 18229"}},"Centre County, PA":{"recorder":{"name":"Centre County Recorder of Deeds","address":"414 Holmes St. Suite 1, Bellefonte, PA 16823"},"assessor":{"name":"Centre County Assessment Office","address":"414 Holmes St. Suite 1, Bellefonte, PA 16823"}},"Chester County, PA":{"recorder":{"name":"Chester County Recorder of Deeds","address":"313 W Market St. Suite 3302, West Chester, PA 19380"},"assessor":{"name":"Chester County Assessment Office","address":"313 W Market St. Suite 4202, West Chester, PA 19380"}},"Clarion County, PA":{"recorder":{"name":"Clarion County Recorder of Deeds","address":"421 Main St. Suite 43, Clarion, PA 16214"},"assessor":{"name":"Clarion County Assessment Office","address":"421 Main St. Suite 43, Clarion, PA 16214"}},"Clearfield County, PA":{"recorder":{"name":"Clearfield County Recorder of Deeds","address":"1 N 2nd St. Suite 1, Clearfield, PA 16830"},"assessor":{"name":"Clearfield County Assessment Office","address":"1 N 2nd St. Suite 1, Clearfield, PA 16830"}},"Clinton County, PA":{"recorder":{"name":"Clinton County Recorder of Deeds","address":"230 E Water St., Lock Haven, PA 17745"},"assessor":{"name":"Clinton County Assessment Office","address":"230 E Water St., Lock Haven, PA 17745"}},"Columbia County, PA":{"recorder":{"name":"Columbia County Recorder of Deeds","address":"11 W Main St. Room 12, Bloomsburg, PA 17815"},"assessor":{"name":"Columbia County Assessment Office","address":"11 W Main St. Room 12, Bloomsburg, PA 17815"}},"Crawford County, PA":{"recorder":{"name":"Crawford County Recorder of Deeds","address":"903 Diamond Park, Meadville, PA 16335"},"assessor":{"name":"Crawford County Assessment Office","address":"903 Diamond Park, Meadville, PA 16335"}},"Cumberland County, PA":{"recorder":{"name":"Cumberland County Recorder of Deeds","address":"1 Courthouse Square Suite 120, Carlisle, PA 17013"},"assessor":{"name":"Cumberland County Assessment Office","address":"1 Courthouse Square Suite 120, Carlisle, PA 17013"}},"Dauphin County, PA":{"recorder":{"name":"Dauphin County Recorder of Deeds","address":"101 Market St. Room 102, Harrisburg, PA 17101"},"assessor":{"name":"Dauphin County Assessment Office","address":"2 S 2nd St., Harrisburg, PA 17101"}},"Delaware County, PA":{"recorder":{"name":"Delaware County Recorder of Deeds","address":"201 W Front St., Media, PA 19063"},"assessor":{"name":"Delaware County Assessment Office","address":"201 W Front St., Media, PA 19063"}},"Elk County, PA":{"recorder":{"name":"Elk County Recorder of Deeds","address":"250 Main St., Ridgway, PA 15853"},"assessor":{"name":"Elk County Assessment Office","address":"250 Main St., Ridgway, PA 15853"}},"Erie County, PA":{"recorder":{"name":"Erie County Recorder of Deeds","address":"140 W 6th St. Room 121, Erie, PA 16501"},"assessor":{"name":"Erie County Assessment Office","address":"140 W 6th St. Room 121, Erie, PA 16501"}},"Fayette County, PA":{"recorder":{"name":"Fayette County Recorder of Deeds","address":"61 E Main St., Uniontown, PA 15401"},"assessor":{"name":"Fayette County Assessment Office","address":"61 E Main St., Uniontown, PA 15401"}},"Forest County, PA":{"recorder":{"name":"Forest County Recorder of Deeds","address":"526 Elm St. Suite 1, Tionesta, PA 16353"},"assessor":{"name":"Forest County Assessment Office","address":"526 Elm St. Suite 1, Tionesta, PA 16353"}},"Franklin County, PA":{"recorder":{"name":"Franklin County Recorder of Deeds","address":"157 Lincoln Way E, Chambersburg, PA 17201"},"assessor":{"name":"Franklin County Assessment Office","address":"157 Lincoln Way E, Chambersburg, PA 17201"}},"Fulton County, PA":{"recorder":{"name":"Fulton County Recorder of Deeds","address":"201 N 2nd St. Suite 4, McConnellsburg, PA 17233"},"assessor":{"name":"Fulton County Assessment Office","address":"201 N 2nd St. Suite 4, McConnellsburg, PA 17233"}},"Greene County, PA":{"recorder":{"name":"Greene County Recorder of Deeds","address":"93 E High St. Room 106, Waynesburg, PA 15370"},"assessor":{"name":"Greene County Assessment Office","address":"93 E High St. Room 106, Waynesburg, PA 15370"}},"Huntingdon County, PA":{"recorder":{"name":"Huntingdon County Recorder of Deeds","address":"223 Penn St., Huntingdon, PA 16652"},"assessor":{"name":"Huntingdon County Assessment Office","address":"223 Penn St., Huntingdon, PA 16652"}},"Indiana County, PA":{"recorder":{"name":"Indiana County Recorder of Deeds","address":"825 Philadelphia St., Indiana, PA 15701"},"assessor":{"name":"Indiana County Assessment Office","address":"825 Philadelphia St., Indiana, PA 15701"}},"Jefferson County, PA":{"recorder":{"name":"Jefferson County Recorder of Deeds","address":"155 Main St. Suite 103, Brookville, PA 15825"},"assessor":{"name":"Jefferson County Assessment Office","address":"155 Main St. Suite 103, Brookville, PA 15825"}},"Juniata County, PA":{"recorder":{"name":"Juniata County Recorder of Deeds","address":"1 Bridge St., Mifflintown, PA 17059"},"assessor":{"name":"Juniata County Assessment Office","address":"1 Bridge St., Mifflintown, PA 17059"}},"Lackawanna County, PA":{"recorder":{"name":"Lackawanna County Recorder of Deeds","address":"135 Jefferson Ave., Scranton, PA 18503"},"assessor":{"name":"Lackawanna County Assessment Office","address":"135 Jefferson Ave., Scranton, PA 18503"}},"Lancaster County, PA":{"recorder":{"name":"Lancaster County Recorder of Deeds","address":"50 N Duke St., Lancaster, PA 17602"},"assessor":{"name":"Lancaster County Assessment Office","address":"150 N Queen St. Suite 310, Lancaster, PA 17603"}},"Lawrence County, PA":{"recorder":{"name":"Lawrence County Recorder of Deeds","address":"430 Court St., New Castle, PA 16101"},"assessor":{"name":"Lawrence County Assessment Office","address":"430 Court St., New Castle, PA 16101"}},"Lebanon County, PA":{"recorder":{"name":"Lebanon County Recorder of Deeds","address":"400 S 8th St. Room 103, Lebanon, PA 17042"},"assessor":{"name":"Lebanon County Assessment Office","address":"400 S 8th St. Room 103, Lebanon, PA 17042"}},"Lehigh County, PA":{"recorder":{"name":"Lehigh County Recorder of Deeds","address":"17 S 7th St., Allentown, PA 18101"},"assessor":{"name":"Lehigh County Assessment Office","address":"17 S 7th St., Allentown, PA 18101"}},"Luzerne County, PA":{"recorder":{"name":"Luzerne County Recorder of Deeds","address":"200 N River St., Wilkes-Barre, PA 18711"},"assessor":{"name":"Luzerne County Assessment Office","address":"200 N River St., Wilkes-Barre, PA 18711"}},"Lycoming County, PA":{"recorder":{"name":"Lycoming County Recorder of Deeds","address":"48 W 3rd St., Williamsport, PA 17701"},"assessor":{"name":"Lycoming County Assessment Office","address":"48 W 3rd St., Williamsport, PA 17701"}},"McKean County, PA":{"recorder":{"name":"McKean County Recorder of Deeds","address":"500 W Main St., Smethport, PA 16749"},"assessor":{"name":"McKean County Assessment Office","address":"500 W Main St., Smethport, PA 16749"}},"Mercer County, PA":{"recorder":{"name":"Mercer County Recorder of Deeds","address":"105 Mercer County Courthouse, Mercer, PA 16137"},"assessor":{"name":"Mercer County Assessment Office","address":"105 Mercer County Courthouse, Mercer, PA 16137"}},"Mifflin County, PA":{"recorder":{"name":"Mifflin County Recorder of Deeds","address":"20 N Wayne St., Lewistown, PA 17044"},"assessor":{"name":"Mifflin County Assessment Office","address":"20 N Wayne St., Lewistown, PA 17044"}},"Monroe County, PA":{"recorder":{"name":"Monroe County Recorder of Deeds","address":"1 Quaker Plaza Suite 103, Stroudsburg, PA 18360"},"assessor":{"name":"Monroe County Assessment Office","address":"1 Quaker Plaza Suite 103, Stroudsburg, PA 18360"}},"Montgomery County, PA":{"recorder":{"name":"Montgomery County Recorder of Deeds","address":"1 Montgomery Plaza Suite 303, Norristown, PA 19401"},"assessor":{"name":"Montgomery County Assessment Office","address":"1 Montgomery Plaza Suite 303, Norristown, PA 19401"}},"Montour County, PA":{"recorder":{"name":"Montour County Recorder of Deeds","address":"29 Mill St., Danville, PA 17821"},"assessor":{"name":"Montour County Assessment Office","address":"29 Mill St., Danville, PA 17821"}},"Northampton County, PA":{"recorder":{"name":"Northampton County Recorder of Deeds","address":"669 Washington St., Easton, PA 18042"},"assessor":{"name":"Northampton County Assessment Office","address":"669 Washington St., Easton, PA 18042"}},"Northumberland County, PA":{"recorder":{"name":"Northumberland County Recorder of Deeds","address":"201 Market St., Sunbury, PA 17801"},"assessor":{"name":"Northumberland County Assessment Office","address":"201 Market St., Sunbury, PA 17801"}},"Perry County, PA":{"recorder":{"name":"Perry County Recorder of Deeds","address":"2 E Main St. Suite 105, New Bloomfield, PA 17068"},"assessor":{"name":"Perry County Assessment Office","address":"2 E Main St. Suite 105, New Bloomfield, PA 17068"}},"Philadelphia County, PA":{"recorder":{"name":"Philadelphia Department of Records","address":"City Hall Room 154, Philadelphia, PA 19107"},"assessor":{"name":"Philadelphia Office of Property Assessment","address":"601 Walnut St. Suite 300W, Philadelphia, PA 19106"}},"Pike County, PA":{"recorder":{"name":"Pike County Recorder of Deeds","address":"410 Broad St., Milford, PA 18337"},"assessor":{"name":"Pike County Assessment Office","address":"410 Broad St., Milford, PA 18337"}},"Potter County, PA":{"recorder":{"name":"Potter County Recorder of Deeds","address":"1 E 2nd St. Suite 24, Coudersport, PA 16915"},"assessor":{"name":"Potter County Assessment Office","address":"1 E 2nd St. Suite 24, Coudersport, PA 16915"}},"Schuylkill County, PA":{"recorder":{"name":"Schuylkill County Recorder of Deeds","address":"401 N 2nd St., Pottsville, PA 17901"},"assessor":{"name":"Schuylkill County Assessment Office","address":"401 N 2nd St., Pottsville, PA 17901"}},"Snyder County, PA":{"recorder":{"name":"Snyder County Recorder of Deeds","address":"9 W Market St. Suite 121, Middleburg, PA 17842"},"assessor":{"name":"Snyder County Assessment Office","address":"9 W Market St. Suite 121, Middleburg, PA 17842"}},"Somerset County, PA":{"recorder":{"name":"Somerset County Recorder of Deeds","address":"111 E Union St. Suite 160, Somerset, PA 15501"},"assessor":{"name":"Somerset County Assessment Office","address":"111 E Union St. Suite 160, Somerset, PA 15501"}},"Sullivan County, PA":{"recorder":{"name":"Sullivan County Recorder of Deeds","address":"245 Muncy St. Suite 3, Laporte, PA 18626"},"assessor":{"name":"Sullivan County Assessment Office","address":"245 Muncy St. Suite 3, Laporte, PA 18626"}},"Susquehanna County, PA":{"recorder":{"name":"Susquehanna County Recorder of Deeds","address":"31 Lake Ave. Suite 2, Montrose, PA 18801"},"assessor":{"name":"Susquehanna County Assessment Office","address":"31 Lake Ave. Suite 2, Montrose, PA 18801"}},"Tioga County, PA":{"recorder":{"name":"Tioga County Recorder of Deeds","address":"118 Main St., Wellsboro, PA 16901"},"assessor":{"name":"Tioga County Assessment Office","address":"118 Main St., Wellsboro, PA 16901"}},"Union County, PA":{"recorder":{"name":"Union County Recorder of Deeds","address":"103 S 2nd St., Lewisburg, PA 17837"},"assessor":{"name":"Union County Assessment Office","address":"103 S 2nd St., Lewisburg, PA 17837"}},"Venango County, PA":{"recorder":{"name":"Venango County Recorder of Deeds","address":"1168 Liberty St. Suite 119, Franklin, PA 16323"},"assessor":{"name":"Venango County Assessment Office","address":"1168 Liberty St. Suite 119, Franklin, PA 16323"}},"Warren County, PA":{"recorder":{"name":"Warren County Recorder of Deeds","address":"204 4th Ave., Warren, PA 16365"},"assessor":{"name":"Warren County Assessment Office","address":"204 4th Ave., Warren, PA 16365"}},"Washington County, PA":{"recorder":{"name":"Washington County Recorder of Deeds","address":"100 W Beau St. Suite 203, Washington, PA 15301"},"assessor":{"name":"Washington County Assessment Office","address":"100 W Beau St. Suite 203, Washington, PA 15301"}},"Wayne County, PA":{"recorder":{"name":"Wayne County Recorder of Deeds","address":"925 Court St., Honesdale, PA 18431"},"assessor":{"name":"Wayne County Assessment Office","address":"925 Court St., Honesdale, PA 18431"}},"Westmoreland County, PA":{"recorder":{"name":"Westmoreland County Recorder of Deeds","address":"2 N Main St. Suite 503, Greensburg, PA 15601"},"assessor":{"name":"Westmoreland County Assessment Office","address":"2 N Main St. Suite 503, Greensburg, PA 15601"}},"Wyoming County, PA":{"recorder":{"name":"Wyoming County Recorder of Deeds","address":"1 Courthouse Square, Tunkhannock, PA 18657"},"assessor":{"name":"Wyoming County Assessment Office","address":"1 Courthouse Square, Tunkhannock, PA 18657"}},"York County, PA":{"recorder":{"name":"York County Recorder of Deeds","address":"28 E Market St., York, PA 17401"},"assessor":{"name":"York County Assessment Office","address":"28 E Market St., York, PA 17401"}},"Bristol County, RI":{"recorder":{"name":"Bristol Town Clerk (Bristol County Seat)","address":"10 Court St., Bristol, RI 02809"},"assessor":{"name":"Bristol Tax Assessor (Bristol County Seat)","address":"10 Court St., Bristol, RI 02809"}},"Kent County, RI":{"recorder":{"name":"East Greenwich Town Clerk (Kent County Seat)","address":"125 Main St., East Greenwich, RI 02818"},"assessor":{"name":"East Greenwich Tax Assessor (Kent County Seat)","address":"125 Main St., East Greenwich, RI 02818"}},"Newport County, RI":{"recorder":{"name":"Newport City Clerk (Newport County Seat)","address":"43 Broadway, Newport, RI 02840"},"assessor":{"name":"Newport Tax Assessor (Newport County Seat)","address":"43 Broadway, Newport, RI 02840"}},"Providence County, RI":{"recorder":{"name":"Providence City Clerk (Providence County Seat)","address":"25 Dorrance St. Room 300, Providence, RI 02903"},"assessor":{"name":"Providence Tax Assessor (Providence County Seat)","address":"25 Dorrance St. Room 208, Providence, RI 02903"}},"Washington County, RI":{"recorder":{"name":"West Kingston Town Clerk (Washington County Seat)","address":"4800 Tower Hill Rd., Wakefield, RI 02879"},"assessor":{"name":"South Kingstown Tax Assessor (Washington County Seat)","address":"180 High St., Wakefield, RI 02879"}},"Abbeville County, SC":{"recorder":{"name":"Abbeville County Register of Deeds","address":"102 Courthouse Square, Abbeville, SC 29620"},"assessor":{"name":"Abbeville County Assessor","address":"102 Courthouse Square, Abbeville, SC 29620"}},"Aiken County, SC":{"recorder":{"name":"Aiken County Register of Deeds","address":"828 Richland Ave., Aiken, SC 29801"},"assessor":{"name":"Aiken County Assessor","address":"828 Richland Ave., Aiken, SC 29801"}},"Allendale County, SC":{"recorder":{"name":"Allendale County Register of Deeds","address":"292 Barnwell Hwy, Allendale, SC 29810"},"assessor":{"name":"Allendale County Assessor","address":"292 Barnwell Hwy, Allendale, SC 29810"}},"Anderson County, SC":{"recorder":{"name":"Anderson County Register of Deeds","address":"100 S Main St., Anderson, SC 29624"},"assessor":{"name":"Anderson County Assessor","address":"401 E River St., Anderson, SC 29624"}},"Bamberg County, SC":{"recorder":{"name":"Bamberg County Register of Deeds","address":"1234 Courthouse Dr., Bamberg, SC 29003"},"assessor":{"name":"Bamberg County Assessor","address":"1234 Courthouse Dr., Bamberg, SC 29003"}},"Barnwell County, SC":{"recorder":{"name":"Barnwell County Register of Deeds","address":"141 Main St. Suite 4, Barnwell, SC 29812"},"assessor":{"name":"Barnwell County Assessor","address":"141 Main St. Suite 4, Barnwell, SC 29812"}},"Beaufort County, SC":{"recorder":{"name":"Beaufort County Register of Deeds","address":"100 Ribaut Rd., Beaufort, SC 29902"},"assessor":{"name":"Beaufort County Assessor","address":"100 Ribaut Rd., Beaufort, SC 29902"}},"Berkeley County, SC":{"recorder":{"name":"Berkeley County Register of Deeds","address":"223 N Live Oak Dr., Moncks Corner, SC 29461"},"assessor":{"name":"Berkeley County Assessor","address":"223 N Live Oak Dr., Moncks Corner, SC 29461"}},"Calhoun County, SC":{"recorder":{"name":"Calhoun County Register of Deeds","address":"302 S Railroad Ave., St. Matthews, SC 29135"},"assessor":{"name":"Calhoun County Assessor","address":"302 S Railroad Ave., St. Matthews, SC 29135"}},"Charleston County, SC":{"recorder":{"name":"Charleston County Register of Deeds","address":"4045 Bridge View Dr., North Charleston, SC 29405"},"assessor":{"name":"Charleston County Assessor","address":"3875 Faber Place Dr. Suite 100, North Charleston, SC 29405"}},"Cherokee County, SC":{"recorder":{"name":"Cherokee County Register of Deeds","address":"110 Railroad Ave., Gaffney, SC 29340"},"assessor":{"name":"Cherokee County Assessor","address":"110 Railroad Ave., Gaffney, SC 29340"}},"Chester County, SC":{"recorder":{"name":"Chester County Register of Deeds","address":"1476 J.A. Cochran Bypass, Chester, SC 29706"},"assessor":{"name":"Chester County Assessor","address":"1476 J.A. Cochran Bypass, Chester, SC 29706"}},"Chesterfield County, SC":{"recorder":{"name":"Chesterfield County Register of Deeds","address":"200 W Main St., Chesterfield, SC 29709"},"assessor":{"name":"Chesterfield County Assessor","address":"200 W Main St., Chesterfield, SC 29709"}},"Clarendon County, SC":{"recorder":{"name":"Clarendon County Register of Deeds","address":"411 Sunset Dr., Manning, SC 29102"},"assessor":{"name":"Clarendon County Assessor","address":"411 Sunset Dr., Manning, SC 29102"}},"Colleton County, SC":{"recorder":{"name":"Colleton County Register of Deeds","address":"31 Klein St., Walterboro, SC 29488"},"assessor":{"name":"Colleton County Assessor","address":"31 Klein St., Walterboro, SC 29488"}},"Darlington County, SC":{"recorder":{"name":"Darlington County Register of Deeds","address":"1 Public Square Room 210, Darlington, SC 29532"},"assessor":{"name":"Darlington County Assessor","address":"1 Public Square Room 210, Darlington, SC 29532"}},"Dillon County, SC":{"recorder":{"name":"Dillon County Register of Deeds","address":"405 W Main St., Dillon, SC 29536"},"assessor":{"name":"Dillon County Assessor","address":"405 W Main St., Dillon, SC 29536"}},"Dorchester County, SC":{"recorder":{"name":"Dorchester County Register of Deeds","address":"201 Johnston St., St. George, SC 29477"},"assessor":{"name":"Dorchester County Assessor","address":"201 Johnston St., St. George, SC 29477"}},"Edgefield County, SC":{"recorder":{"name":"Edgefield County Register of Deeds","address":"129 Courthouse Square, Edgefield, SC 29824"},"assessor":{"name":"Edgefield County Assessor","address":"129 Courthouse Square, Edgefield, SC 29824"}},"Fairfield County, SC":{"recorder":{"name":"Fairfield County Register of Deeds","address":"350 Columbia Rd., Winnsboro, SC 29180"},"assessor":{"name":"Fairfield County Assessor","address":"350 Columbia Rd., Winnsboro, SC 29180"}},"Florence County, SC":{"recorder":{"name":"Florence County Register of Deeds","address":"180 N Irby St. MSC-K, Florence, SC 29501"},"assessor":{"name":"Florence County Assessor","address":"180 N Irby St. MSC-R, Florence, SC 29501"}},"Georgetown County, SC":{"recorder":{"name":"Georgetown County Register of Deeds","address":"129 Screven St., Georgetown, SC 29440"},"assessor":{"name":"Georgetown County Assessor","address":"129 Screven St., Georgetown, SC 29440"}},"Greenville County, SC":{"recorder":{"name":"Greenville County Register of Deeds","address":"301 University Ridge Suite 1300, Greenville, SC 29601"},"assessor":{"name":"Greenville County Assessor","address":"301 University Ridge Suite 1000, Greenville, SC 29601"}},"Greenwood County, SC":{"recorder":{"name":"Greenwood County Register of Deeds","address":"528 Monument St., Greenwood, SC 29646"},"assessor":{"name":"Greenwood County Assessor","address":"528 Monument St., Greenwood, SC 29646"}},"Hampton County, SC":{"recorder":{"name":"Hampton County Register of Deeds","address":"1 Courthouse Square, Hampton, SC 29924"},"assessor":{"name":"Hampton County Assessor","address":"1 Courthouse Square, Hampton, SC 29924"}},"Horry County, SC":{"recorder":{"name":"Horry County Register of Deeds","address":"1301 2nd Ave., Conway, SC 29526"},"assessor":{"name":"Horry County Assessor","address":"1301 2nd Ave., Conway, SC 29526"}},"Jasper County, SC":{"recorder":{"name":"Jasper County Register of Deeds","address":"358 3rd Ave., Ridgeland, SC 29936"},"assessor":{"name":"Jasper County Assessor","address":"358 3rd Ave., Ridgeland, SC 29936"}},"Kershaw County, SC":{"recorder":{"name":"Kershaw County Register of Deeds","address":"1121 Broad St., Camden, SC 29020"},"assessor":{"name":"Kershaw County Assessor","address":"1121 Broad St., Camden, SC 29020"}},"Lancaster County, SC":{"recorder":{"name":"Lancaster County Register of Deeds","address":"101 N Main St., Lancaster, SC 29720"},"assessor":{"name":"Lancaster County Assessor","address":"101 N Main St., Lancaster, SC 29720"}},"Laurens County, SC":{"recorder":{"name":"Laurens County Register of Deeds","address":"100 Hillcrest Square Suite B, Laurens, SC 29360"},"assessor":{"name":"Laurens County Assessor","address":"100 Hillcrest Square Suite B, Laurens, SC 29360"}},"Lee County, SC":{"recorder":{"name":"Lee County Register of Deeds","address":"123 S Main St., Bishopville, SC 29010"},"assessor":{"name":"Lee County Assessor","address":"123 S Main St., Bishopville, SC 29010"}},"Lexington County, SC":{"recorder":{"name":"Lexington County Register of Deeds","address":"212 S Lake Dr. Suite 301, Lexington, SC 29072"},"assessor":{"name":"Lexington County Assessor","address":"212 S Lake Dr. Suite 201, Lexington, SC 29072"}},"Marion County, SC":{"recorder":{"name":"Marion County Register of Deeds","address":"P.O. Box 183, Marion, SC 29571"},"assessor":{"name":"Marion County Assessor","address":"2523 E Hwy 76, Marion, SC 29571"}},"Marlboro County, SC":{"recorder":{"name":"Marlboro County Register of Deeds","address":"105 Main St., Bennettsville, SC 29512"},"assessor":{"name":"Marlboro County Assessor","address":"105 Main St., Bennettsville, SC 29512"}},"McCormick County, SC":{"recorder":{"name":"McCormick County Register of Deeds","address":"133 S Mine St., McCormick, SC 29835"},"assessor":{"name":"McCormick County Assessor","address":"133 S Mine St., McCormick, SC 29835"}},"Newberry County, SC":{"recorder":{"name":"Newberry County Register of Deeds","address":"1539 Bypass 76, Newberry, SC 29108"},"assessor":{"name":"Newberry County Assessor","address":"1539 Bypass 76, Newberry, SC 29108"}},"Oconee County, SC":{"recorder":{"name":"Oconee County Register of Deeds","address":"415 S Pine St. Suite 107, Walhalla, SC 29691"},"assessor":{"name":"Oconee County Assessor","address":"415 S Pine St. Suite 107, Walhalla, SC 29691"}},"Orangeburg County, SC":{"recorder":{"name":"Orangeburg County Register of Deeds","address":"1437 Amelia St., Orangeburg, SC 29115"},"assessor":{"name":"Orangeburg County Assessor","address":"1437 Amelia St., Orangeburg, SC 29115"}},"Pickens County, SC":{"recorder":{"name":"Pickens County Register of Deeds","address":"222 McDaniel Ave. Bldg B, Pickens, SC 29671"},"assessor":{"name":"Pickens County Assessor","address":"222 McDaniel Ave. Bldg B, Pickens, SC 29671"}},"Richland County, SC":{"recorder":{"name":"Richland County Register of Deeds","address":"2020 Hampton St., Columbia, SC 29204"},"assessor":{"name":"Richland County Assessor","address":"2020 Hampton St., Columbia, SC 29204"}},"Saluda County, SC":{"recorder":{"name":"Saluda County Register of Deeds","address":"100 E Church St. Suite 4, Saluda, SC 29138"},"assessor":{"name":"Saluda County Assessor","address":"100 E Church St. Suite 4, Saluda, SC 29138"}},"Spartanburg County, SC":{"recorder":{"name":"Spartanburg County Register of Deeds","address":"366 N Church St. Suite 200, Spartanburg, SC 29303"},"assessor":{"name":"Spartanburg County Assessor","address":"366 N Church St. Suite 200, Spartanburg, SC 29303"}},"Sumter County, SC":{"recorder":{"name":"Sumter County Register of Deeds","address":"141 N Main St., Sumter, SC 29150"},"assessor":{"name":"Sumter County Assessor","address":"141 N Main St., Sumter, SC 29150"}},"Union County, SC":{"recorder":{"name":"Union County Register of Deeds","address":"210 W Main St., Union, SC 29379"},"assessor":{"name":"Union County Assessor","address":"210 W Main St., Union, SC 29379"}},"Williamsburg County, SC":{"recorder":{"name":"Williamsburg County Register of Deeds","address":"125 W Main St., Kingstree, SC 29556"},"assessor":{"name":"Williamsburg County Assessor","address":"125 W Main St., Kingstree, SC 29556"}},"York County, SC":{"recorder":{"name":"York County Register of Deeds","address":"1070 Heckle Blvd. Suite 107, Rock Hill, SC 29732"},"assessor":{"name":"York County Assessor","address":"1070 Heckle Blvd. Suite 107, Rock Hill, SC 29732"}},"Aurora County, SD":{"recorder":{"name":"Aurora County Register of Deeds","address":"401 N Main St., Plankinton, SD 57368"},"assessor":{"name":"Aurora County Director of Equalization","address":"401 N Main St., Plankinton, SD 57368"}},"Beadle County, SD":{"recorder":{"name":"Beadle County Register of Deeds","address":"450 3rd St SW, Huron, SD 57350"},"assessor":{"name":"Beadle County Director of Equalization","address":"450 3rd St SW, Huron, SD 57350"}},"Bennett County, SD":{"recorder":{"name":"Bennett County Register of Deeds","address":"202 Main St., Martin, SD 57551"},"assessor":{"name":"Bennett County Director of Equalization","address":"202 Main St., Martin, SD 57551"}},"Bon Homme County, SD":{"recorder":{"name":"Bon Homme County Register of Deeds","address":"300 W 18th Ave., Tyndall, SD 57066"},"assessor":{"name":"Bon Homme County Director of Equalization","address":"300 W 18th Ave., Tyndall, SD 57066"}},"Brookings County, SD":{"recorder":{"name":"Brookings County Register of Deeds","address":"314 6th Ave., Brookings, SD 57006"},"assessor":{"name":"Brookings County Director of Equalization","address":"314 6th Ave., Brookings, SD 57006"}},"Brown County, SD":{"recorder":{"name":"Brown County Register of Deeds","address":"25 Market St., Aberdeen, SD 57401"},"assessor":{"name":"Brown County Director of Equalization","address":"25 Market St., Aberdeen, SD 57401"}},"Brule County, SD":{"recorder":{"name":"Brule County Register of Deeds","address":"300 S Courtland St., Chamberlain, SD 57325"},"assessor":{"name":"Brule County Director of Equalization","address":"300 S Courtland St., Chamberlain, SD 57325"}},"Buffalo County, SD":{"recorder":{"name":"Buffalo County Register of Deeds","address":"101 Ash Ave., Gann Valley, SD 57341"},"assessor":{"name":"Buffalo County Director of Equalization","address":"101 Ash Ave., Gann Valley, SD 57341"}},"Butte County, SD":{"recorder":{"name":"Butte County Register of Deeds","address":"839 5th Ave., Belle Fourche, SD 57717"},"assessor":{"name":"Butte County Director of Equalization","address":"839 5th Ave., Belle Fourche, SD 57717"}},"Campbell County, SD":{"recorder":{"name":"Campbell County Register of Deeds","address":"111 2nd St., Mound City, SD 57646"},"assessor":{"name":"Campbell County Director of Equalization","address":"111 2nd St., Mound City, SD 57646"}},"Charles Mix County, SD":{"recorder":{"name":"Charles Mix County Register of Deeds","address":"400 Main St., Lake Andes, SD 57356"},"assessor":{"name":"Charles Mix County Director of Equalization","address":"400 Main St., Lake Andes, SD 57356"}},"Clark County, SD":{"recorder":{"name":"Clark County Register of Deeds","address":"200 N Commercial St., Clark, SD 57225"},"assessor":{"name":"Clark County Director of Equalization","address":"200 N Commercial St., Clark, SD 57225"}},"Clay County, SD":{"recorder":{"name":"Clay County Register of Deeds","address":"211 W Main St., Vermillion, SD 57069"},"assessor":{"name":"Clay County Director of Equalization","address":"211 W Main St., Vermillion, SD 57069"}},"Codington County, SD":{"recorder":{"name":"Codington County Register of Deeds","address":"14 1st Ave SE, Watertown, SD 57201"},"assessor":{"name":"Codington County Director of Equalization","address":"14 1st Ave SE, Watertown, SD 57201"}},"Corson County, SD":{"recorder":{"name":"Corson County Register of Deeds","address":"101 E Main St., McIntosh, SD 57641"},"assessor":{"name":"Corson County Director of Equalization","address":"101 E Main St., McIntosh, SD 57641"}},"Custer County, SD":{"recorder":{"name":"Custer County Register of Deeds","address":"420 Mt. Rushmore Rd., Custer, SD 57730"},"assessor":{"name":"Custer County Director of Equalization","address":"420 Mt. Rushmore Rd., Custer, SD 57730"}},"Davison County, SD":{"recorder":{"name":"Davison County Register of Deeds","address":"200 E 4th Ave., Mitchell, SD 57301"},"assessor":{"name":"Davison County Director of Equalization","address":"200 E 4th Ave., Mitchell, SD 57301"}},"Day County, SD":{"recorder":{"name":"Day County Register of Deeds","address":"711 W 1st St. Suite 202, Webster, SD 57274"},"assessor":{"name":"Day County Director of Equalization","address":"711 W 1st St., Webster, SD 57274"}},"Deuel County, SD":{"recorder":{"name":"Deuel County Register of Deeds","address":"687 4th Ave S, Clear Lake, SD 57226"},"assessor":{"name":"Deuel County Director of Equalization","address":"687 4th Ave S, Clear Lake, SD 57226"}},"Dewey County, SD":{"recorder":{"name":"Dewey County Register of Deeds","address":"1 Main Ave., Timber Lake, SD 57656"},"assessor":{"name":"Dewey County Director of Equalization","address":"1 Main Ave., Timber Lake, SD 57656"}},"Douglas County, SD":{"recorder":{"name":"Douglas County Register of Deeds","address":"710 Braddock St., Armour, SD 57313"},"assessor":{"name":"Douglas County Director of Equalization","address":"710 Braddock St., Armour, SD 57313"}},"Edmunds County, SD":{"recorder":{"name":"Edmunds County Register of Deeds","address":"210 2nd Ave. Suite 205, Ipswich, SD 57451"},"assessor":{"name":"Edmunds County Director of Equalization","address":"210 2nd Ave., Ipswich, SD 57451"}},"Fall River County, SD":{"recorder":{"name":"Fall River County Register of Deeds","address":"906 N River St., Hot Springs, SD 57747"},"assessor":{"name":"Fall River County Director of Equalization","address":"906 N River St., Hot Springs, SD 57747"}},"Faulk County, SD":{"recorder":{"name":"Faulk County Register of Deeds","address":"800 Main Ave., Faulkton, SD 57438"},"assessor":{"name":"Faulk County Director of Equalization","address":"800 Main Ave., Faulkton, SD 57438"}},"Grant County, SD":{"recorder":{"name":"Grant County Register of Deeds","address":"210 E 5th Ave., Milbank, SD 57252"},"assessor":{"name":"Grant County Director of Equalization","address":"210 E 5th Ave., Milbank, SD 57252"}},"Gregory County, SD":{"recorder":{"name":"Gregory County Register of Deeds","address":"221 Main St., Burke, SD 57523"},"assessor":{"name":"Gregory County Director of Equalization","address":"221 Main St., Burke, SD 57523"}},"Haakon County, SD":{"recorder":{"name":"Haakon County Register of Deeds","address":"140 S Howard Ave., Philip, SD 57567"},"assessor":{"name":"Haakon County Director of Equalization","address":"140 S Howard Ave., Philip, SD 57567"}},"Hamlin County, SD":{"recorder":{"name":"Hamlin County Register of Deeds","address":"300 E 3rd St., Hayti, SD 57241"},"assessor":{"name":"Hamlin County Director of Equalization","address":"300 E 3rd St., Hayti, SD 57241"}},"Hand County, SD":{"recorder":{"name":"Hand County Register of Deeds","address":"415 W 1st Ave., Miller, SD 57362"},"assessor":{"name":"Hand County Director of Equalization","address":"415 W 1st Ave., Miller, SD 57362"}},"Hanson County, SD":{"recorder":{"name":"Hanson County Register of Deeds","address":"720 5th St., Alexandria, SD 57311"},"assessor":{"name":"Hanson County Director of Equalization","address":"720 5th St., Alexandria, SD 57311"}},"Harding County, SD":{"recorder":{"name":"Harding County Register of Deeds","address":"920 Main St., Buffalo, SD 57720"},"assessor":{"name":"Harding County Director of Equalization","address":"920 Main St., Buffalo, SD 57720"}},"Hughes County, SD":{"recorder":{"name":"Hughes County Register of Deeds","address":"104 E Capitol Ave., Pierre, SD 57501"},"assessor":{"name":"Hughes County Director of Equalization","address":"104 E Capitol Ave., Pierre, SD 57501"}},"Hutchinson County, SD":{"recorder":{"name":"Hutchinson County Register of Deeds","address":"140 Euclid Dr., Olivet, SD 57052"},"assessor":{"name":"Hutchinson County Director of Equalization","address":"140 Euclid Dr., Olivet, SD 57052"}},"Hyde County, SD":{"recorder":{"name":"Hyde County Register of Deeds","address":"412 Commercial Ave., Highmore, SD 57345"},"assessor":{"name":"Hyde County Director of Equalization","address":"412 Commercial Ave., Highmore, SD 57345"}},"Jackson County, SD":{"recorder":{"name":"Jackson County Register of Deeds","address":"700 Main St., Kadoka, SD 57543"},"assessor":{"name":"Jackson County Director of Equalization","address":"700 Main St., Kadoka, SD 57543"}},"Jerauld County, SD":{"recorder":{"name":"Jerauld County Register of Deeds","address":"205 S Wallace St., Wessington Springs, SD 57382"},"assessor":{"name":"Jerauld County Director of Equalization","address":"205 S Wallace St., Wessington Springs, SD 57382"}},"Jones County, SD":{"recorder":{"name":"Jones County Register of Deeds","address":"710 Main St., Murdo, SD 57559"},"assessor":{"name":"Jones County Director of Equalization","address":"710 Main St., Murdo, SD 57559"}},"Kingsbury County, SD":{"recorder":{"name":"Kingsbury County Register of Deeds","address":"202 2nd St. SE, De Smet, SD 57231"},"assessor":{"name":"Kingsbury County Director of Equalization","address":"202 2nd St. SE, De Smet, SD 57231"}},"Lake County, SD":{"recorder":{"name":"Lake County Register of Deeds","address":"200 E Center St., Madison, SD 57042"},"assessor":{"name":"Lake County Director of Equalization","address":"200 E Center St., Madison, SD 57042"}},"Lawrence County, SD":{"recorder":{"name":"Lawrence County Register of Deeds","address":"90 Sherman St., Deadwood, SD 57732"},"assessor":{"name":"Lawrence County Director of Equalization","address":"90 Sherman St., Deadwood, SD 57732"}},"Lincoln County, SD":{"recorder":{"name":"Lincoln County Register of Deeds","address":"104 N Main Ave., Canton, SD 57013"},"assessor":{"name":"Lincoln County Director of Equalization","address":"104 N Main Ave., Canton, SD 57013"}},"Lyman County, SD":{"recorder":{"name":"Lyman County Register of Deeds","address":"300 Main St., Kennebec, SD 57544"},"assessor":{"name":"Lyman County Director of Equalization","address":"300 Main St., Kennebec, SD 57544"}},"Marshall County, SD":{"recorder":{"name":"Marshall County Register of Deeds","address":"911 Vander Horck St., Britton, SD 57430"},"assessor":{"name":"Marshall County Director of Equalization","address":"911 Vander Horck St., Britton, SD 57430"}},"McCook County, SD":{"recorder":{"name":"McCook County Register of Deeds","address":"130 W Essex Ave., Salem, SD 57058"},"assessor":{"name":"McCook County Director of Equalization","address":"130 W Essex Ave., Salem, SD 57058"}},"McPherson County, SD":{"recorder":{"name":"McPherson County Register of Deeds","address":"105 Main St., Leola, SD 57456"},"assessor":{"name":"McPherson County Director of Equalization","address":"105 Main St., Leola, SD 57456"}},"Meade County, SD":{"recorder":{"name":"Meade County Register of Deeds","address":"1425 Sherman St., Sturgis, SD 57785"},"assessor":{"name":"Meade County Director of Equalization","address":"1425 Sherman St., Sturgis, SD 57785"}},"Mellette County, SD":{"recorder":{"name":"Mellette County Register of Deeds","address":"1 Main Ave. N, White River, SD 57579"},"assessor":{"name":"Mellette County Director of Equalization","address":"1 Main Ave. N, White River, SD 57579"}},"Miner County, SD":{"recorder":{"name":"Miner County Register of Deeds","address":"235 E 2nd Ave., Howard, SD 57349"},"assessor":{"name":"Miner County Director of Equalization","address":"235 E 2nd Ave., Howard, SD 57349"}},"Minnehaha County, SD":{"recorder":{"name":"Minnehaha County Register of Deeds","address":"415 N Dakota Ave., Sioux Falls, SD 57104"},"assessor":{"name":"Minnehaha County Director of Equalization","address":"415 N Dakota Ave., Sioux Falls, SD 57104"}},"Moody County, SD":{"recorder":{"name":"Moody County Register of Deeds","address":"101 E Pipestone Ave., Flandreau, SD 57028"},"assessor":{"name":"Moody County Director of Equalization","address":"101 E Pipestone Ave., Flandreau, SD 57028"}},"Oglala Lakota County, SD":{"recorder":{"name":"Oglala Lakota County Register of Deeds","address":"101 N River Rd., Pine Ridge, SD 57770"},"assessor":{"name":"Oglala Lakota County Director of Equalization","address":"101 N River Rd., Pine Ridge, SD 57770"}},"Pennington County, SD":{"recorder":{"name":"Pennington County Register of Deeds","address":"315 Saint Joseph St., Rapid City, SD 57701"},"assessor":{"name":"Pennington County Director of Equalization","address":"315 Saint Joseph St., Rapid City, SD 57701"}},"Perkins County, SD":{"recorder":{"name":"Perkins County Register of Deeds","address":"1001 1st Ave., Bison, SD 57620"},"assessor":{"name":"Perkins County Director of Equalization","address":"1001 1st Ave., Bison, SD 57620"}},"Potter County, SD":{"recorder":{"name":"Potter County Register of Deeds","address":"201 S Exene St., Gettysburg, SD 57442"},"assessor":{"name":"Potter County Director of Equalization","address":"201 S Exene St., Gettysburg, SD 57442"}},"Roberts County, SD":{"recorder":{"name":"Roberts County Register of Deeds","address":"411 2nd Ave E, Sisseton, SD 57262"},"assessor":{"name":"Roberts County Director of Equalization","address":"411 2nd Ave E, Sisseton, SD 57262"}},"Sanborn County, SD":{"recorder":{"name":"Sanborn County Register of Deeds","address":"604 W 6th St., Woonsocket, SD 57385"},"assessor":{"name":"Sanborn County Director of Equalization","address":"604 W 6th St., Woonsocket, SD 57385"}},"Spink County, SD":{"recorder":{"name":"Spink County Register of Deeds","address":"210 E 7th Ave., Redfield, SD 57469"},"assessor":{"name":"Spink County Director of Equalization","address":"210 E 7th Ave., Redfield, SD 57469"}},"Stanley County, SD":{"recorder":{"name":"Stanley County Register of Deeds","address":"8 E 2nd Ave., Fort Pierre, SD 57532"},"assessor":{"name":"Stanley County Director of Equalization","address":"8 E 2nd Ave., Fort Pierre, SD 57532"}},"Sully County, SD":{"recorder":{"name":"Sully County Register of Deeds","address":"700 Ash Ave., Onida, SD 57564"},"assessor":{"name":"Sully County Director of Equalization","address":"700 Ash Ave., Onida, SD 57564"}},"Todd County, SD":{"recorder":{"name":"Todd County Register of Deeds","address":"200 E 3rd St., Winner, SD 57580"},"assessor":{"name":"Todd County Director of Equalization","address":"200 E 3rd St., Winner, SD 57580"}},"Tripp County, SD":{"recorder":{"name":"Tripp County Register of Deeds","address":"200 E 3rd St., Winner, SD 57580"},"assessor":{"name":"Tripp County Director of Equalization","address":"200 E 3rd St., Winner, SD 57580"}},"Turner County, SD":{"recorder":{"name":"Turner County Register of Deeds","address":"400 S Main St., Parker, SD 57053"},"assessor":{"name":"Turner County Director of Equalization","address":"400 S Main St., Parker, SD 57053"}},"Union County, SD":{"recorder":{"name":"Union County Register of Deeds","address":"209 E Main St., Elk Point, SD 57025"},"assessor":{"name":"Union County Director of Equalization","address":"209 E Main St., Elk Point, SD 57025"}},"Walworth County, SD":{"recorder":{"name":"Walworth County Register of Deeds","address":"1004 W 4th Ave., Selby, SD 57472"},"assessor":{"name":"Walworth County Director of Equalization","address":"1004 W 4th Ave., Selby, SD 57472"}},"Yankton County, SD":{"recorder":{"name":"Yankton County Register of Deeds","address":"321 W 3rd St., Yankton, SD 57078"},"assessor":{"name":"Yankton County Director of Equalization","address":"321 W 3rd St., Yankton, SD 57078"}},"Ziebach County, SD":{"recorder":{"name":"Ziebach County Register of Deeds","address":"100 Main St., Dupree, SD 57623"},"assessor":{"name":"Ziebach County Director of Equalization","address":"100 Main St., Dupree, SD 57623"}},"Anderson County, TN":{"recorder":{"name":"Anderson County Register of Deeds","address":"100 N Main St. Suite 203, Clinton, TN 37716"},"assessor":{"name":"Anderson County Assessor","address":"100 N Main St. Suite 202, Clinton, TN 37716"}},"Bedford County, TN":{"recorder":{"name":"Bedford County Register of Deeds","address":"1 Public Square Suite 105, Shelbyville, TN 37160"},"assessor":{"name":"Bedford County Assessor","address":"1 Public Square Suite 106, Shelbyville, TN 37160"}},"Benton County, TN":{"recorder":{"name":"Benton County Register of Deeds","address":"1 E Court Square Suite 101, Camden, TN 38320"},"assessor":{"name":"Benton County Assessor","address":"1 E Court Square Suite 203, Camden, TN 38320"}},"Bledsoe County, TN":{"recorder":{"name":"Bledsoe County Register of Deeds","address":"Courthouse Square, Pikeville, TN 37367"},"assessor":{"name":"Bledsoe County Assessor","address":"Courthouse Square, Pikeville, TN 37367"}},"Blount County, TN":{"recorder":{"name":"Blount County Register of Deeds","address":"345 Court St., Maryville, TN 37804"},"assessor":{"name":"Blount County Assessor","address":"345 Court St., Maryville, TN 37804"}},"Bradley County, TN":{"recorder":{"name":"Bradley County Register of Deeds","address":"155 Broad St. NW, Cleveland, TN 37311"},"assessor":{"name":"Bradley County Assessor","address":"155 Broad St. NW, Cleveland, TN 37311"}},"Campbell County, TN":{"recorder":{"name":"Campbell County Register of Deeds","address":"570 Main St., Jacksboro, TN 37757"},"assessor":{"name":"Campbell County Assessor","address":"570 Main St., Jacksboro, TN 37757"}},"Cannon County, TN":{"recorder":{"name":"Cannon County Register of Deeds","address":"200 W Main St., Woodbury, TN 37190"},"assessor":{"name":"Cannon County Assessor","address":"200 W Main St., Woodbury, TN 37190"}},"Carroll County, TN":{"recorder":{"name":"Carroll County Register of Deeds","address":"625 High St., Huntingdon, TN 38344"},"assessor":{"name":"Carroll County Assessor","address":"625 High St., Huntingdon, TN 38344"}},"Carter County, TN":{"recorder":{"name":"Carter County Register of Deeds","address":"801 E Elk Ave., Elizabethton, TN 37643"},"assessor":{"name":"Carter County Assessor","address":"801 E Elk Ave., Elizabethton, TN 37643"}},"Cheatham County, TN":{"recorder":{"name":"Cheatham County Register of Deeds","address":"100 Public Square Suite 101, Ashland City, TN 37015"},"assessor":{"name":"Cheatham County Assessor","address":"100 Public Square Suite 106, Ashland City, TN 37015"}},"Chester County, TN":{"recorder":{"name":"Chester County Register of Deeds","address":"133 E Main St., Henderson, TN 38340"},"assessor":{"name":"Chester County Assessor","address":"133 E Main St., Henderson, TN 38340"}},"Claiborne County, TN":{"recorder":{"name":"Claiborne County Register of Deeds","address":"1740 Main St., Tazewell, TN 37879"},"assessor":{"name":"Claiborne County Assessor","address":"1740 Main St., Tazewell, TN 37879"}},"Clay County, TN":{"recorder":{"name":"Clay County Register of Deeds","address":"145 Cordell Hull Dr., Celina, TN 38551"},"assessor":{"name":"Clay County Assessor","address":"145 Cordell Hull Dr., Celina, TN 38551"}},"Cocke County, TN":{"recorder":{"name":"Cocke County Register of Deeds","address":"111 Court Ave. Suite 104, Newport, TN 37821"},"assessor":{"name":"Cocke County Assessor","address":"111 Court Ave. Suite 104, Newport, TN 37821"}},"Coffee County, TN":{"recorder":{"name":"Coffee County Register of Deeds","address":"300 Hillsboro Blvd. Suite 9, Manchester, TN 37355"},"assessor":{"name":"Coffee County Assessor","address":"300 Hillsboro Blvd. Suite 9, Manchester, TN 37355"}},"Crockett County, TN":{"recorder":{"name":"Crockett County Register of Deeds","address":"1 S Bells St., Alamo, TN 38001"},"assessor":{"name":"Crockett County Assessor","address":"1 S Bells St., Alamo, TN 38001"}},"Cumberland County, TN":{"recorder":{"name":"Cumberland County Register of Deeds","address":"2 N Main St. Suite 205, Crossville, TN 38555"},"assessor":{"name":"Cumberland County Assessor","address":"2 N Main St. Suite 206, Crossville, TN 38555"}},"Davidson County, TN":{"recorder":{"name":"Davidson County Register of Deeds","address":"501 Broadway Suite 501, Nashville, TN 37203"},"assessor":{"name":"Davidson County Assessor","address":"700 2nd Ave S Suite 210, Nashville, TN 37210"}},"Decatur County, TN":{"recorder":{"name":"Decatur County Register of Deeds","address":"22 W Main St., Decaturville, TN 38329"},"assessor":{"name":"Decatur County Assessor","address":"22 W Main St., Decaturville, TN 38329"}},"DeKalb County, TN":{"recorder":{"name":"DeKalb County Register of Deeds","address":"1 Public Square Suite 101, Smithville, TN 37166"},"assessor":{"name":"DeKalb County Assessor","address":"1 Public Square Suite 101, Smithville, TN 37166"}},"Dickson County, TN":{"recorder":{"name":"Dickson County Register of Deeds","address":"4 Court Square Suite 201, Charlotte, TN 37036"},"assessor":{"name":"Dickson County Assessor","address":"4 Court Square Suite 201, Charlotte, TN 37036"}},"Dyer County, TN":{"recorder":{"name":"Dyer County Register of Deeds","address":"1 Veterans Square, Dyersburg, TN 38024"},"assessor":{"name":"Dyer County Assessor","address":"1 Veterans Square, Dyersburg, TN 38024"}},"Fayette County, TN":{"recorder":{"name":"Fayette County Register of Deeds","address":"1 Court Square Suite 100, Somerville, TN 38068"},"assessor":{"name":"Fayette County Assessor","address":"1 Court Square Suite 100, Somerville, TN 38068"}},"Fentress County, TN":{"recorder":{"name":"Fentress County Register of Deeds","address":"101 Main St., Jamestown, TN 38556"},"assessor":{"name":"Fentress County Assessor","address":"101 Main St., Jamestown, TN 38556"}},"Franklin County, TN":{"recorder":{"name":"Franklin County Register of Deeds","address":"1 S Jefferson St. Suite 101, Winchester, TN 37398"},"assessor":{"name":"Franklin County Assessor","address":"1 S Jefferson St. Suite 103, Winchester, TN 37398"}},"Gibson County, TN":{"recorder":{"name":"Gibson County Register of Deeds","address":"1 Court Square, Trenton, TN 38382"},"assessor":{"name":"Gibson County Assessor","address":"1 Court Square, Trenton, TN 38382"}},"Giles County, TN":{"recorder":{"name":"Giles County Register of Deeds","address":"1 Public Square Suite 200, Pulaski, TN 38478"},"assessor":{"name":"Giles County Assessor","address":"1 Public Square Suite 200, Pulaski, TN 38478"}},"Grainger County, TN":{"recorder":{"name":"Grainger County Register of Deeds","address":"Main St., Rutledge, TN 37861"},"assessor":{"name":"Grainger County Assessor","address":"Main St., Rutledge, TN 37861"}},"Greene County, TN":{"recorder":{"name":"Greene County Register of Deeds","address":"101 S Main St. Suite 111, Greeneville, TN 37743"},"assessor":{"name":"Greene County Assessor","address":"101 S Main St. Suite 111, Greeneville, TN 37743"}},"Grundy County, TN":{"recorder":{"name":"Grundy County Register of Deeds","address":"Altamont, TN 37301"},"assessor":{"name":"Grundy County Assessor","address":"Altamont, TN 37301"}},"Hamblen County, TN":{"recorder":{"name":"Hamblen County Register of Deeds","address":"511 W 2nd N St., Morristown, TN 37814"},"assessor":{"name":"Hamblen County Assessor","address":"511 W 2nd N St., Morristown, TN 37814"}},"Hamilton County, TN":{"recorder":{"name":"Hamilton County Register of Deeds","address":"625 Georgia Ave. Suite 200, Chattanooga, TN 37402"},"assessor":{"name":"Hamilton County Assessor","address":"6135 Heritage Park Dr., Chattanooga, TN 37416"}},"Hancock County, TN":{"recorder":{"name":"Hancock County Register of Deeds","address":"Main St., Sneedville, TN 37869"},"assessor":{"name":"Hancock County Assessor","address":"Main St., Sneedville, TN 37869"}},"Hardeman County, TN":{"recorder":{"name":"Hardeman County Register of Deeds","address":"100 N Main St., Bolivar, TN 38008"},"assessor":{"name":"Hardeman County Assessor","address":"100 N Main St., Bolivar, TN 38008"}},"Hardin County, TN":{"recorder":{"name":"Hardin County Register of Deeds","address":"601 Main St., Savannah, TN 38372"},"assessor":{"name":"Hardin County Assessor","address":"601 Main St., Savannah, TN 38372"}},"Hawkins County, TN":{"recorder":{"name":"Hawkins County Register of Deeds","address":"100 E Main St., Rogersville, TN 37857"},"assessor":{"name":"Hawkins County Assessor","address":"100 E Main St., Rogersville, TN 37857"}},"Haywood County, TN":{"recorder":{"name":"Haywood County Register of Deeds","address":"1 N Washington Ave., Brownsville, TN 38012"},"assessor":{"name":"Haywood County Assessor","address":"1 N Washington Ave., Brownsville, TN 38012"}},"Henderson County, TN":{"recorder":{"name":"Henderson County Register of Deeds","address":"17 Monroe Ave., Lexington, TN 38351"},"assessor":{"name":"Henderson County Assessor","address":"17 Monroe Ave., Lexington, TN 38351"}},"Henry County, TN":{"recorder":{"name":"Henry County Register of Deeds","address":"101 W Washington St. Suite 106, Paris, TN 38242"},"assessor":{"name":"Henry County Assessor","address":"101 W Washington St. Suite 106, Paris, TN 38242"}},"Hickman County, TN":{"recorder":{"name":"Hickman County Register of Deeds","address":"1 Public Square Suite 4, Centerville, TN 37033"},"assessor":{"name":"Hickman County Assessor","address":"1 Public Square Suite 4, Centerville, TN 37033"}},"Houston County, TN":{"recorder":{"name":"Houston County Register of Deeds","address":"Main St., Erin, TN 37061"},"assessor":{"name":"Houston County Assessor","address":"Main St., Erin, TN 37061"}},"Humphreys County, TN":{"recorder":{"name":"Humphreys County Register of Deeds","address":"1 Courthouse Square, Waverly, TN 37185"},"assessor":{"name":"Humphreys County Assessor","address":"1 Courthouse Square, Waverly, TN 37185"}},"Jackson County, TN":{"recorder":{"name":"Jackson County Register of Deeds","address":"101 Main St., Gainesboro, TN 38562"},"assessor":{"name":"Jackson County Assessor","address":"101 Main St., Gainesboro, TN 38562"}},"Jefferson County, TN":{"recorder":{"name":"Jefferson County Register of Deeds","address":"300 E Main St. Suite 210, Dandridge, TN 37725"},"assessor":{"name":"Jefferson County Assessor","address":"300 E Main St. Suite 210, Dandridge, TN 37725"}},"Johnson County, TN":{"recorder":{"name":"Johnson County Register of Deeds","address":"222 W Main St., Mountain City, TN 37683"},"assessor":{"name":"Johnson County Assessor","address":"222 W Main St., Mountain City, TN 37683"}},"Knox County, TN":{"recorder":{"name":"Knox County Register of Deeds","address":"400 W Main Ave. Suite 221, Knoxville, TN 37902"},"assessor":{"name":"Knox County Assessor","address":"400 W Main Ave. Suite 221, Knoxville, TN 37902"}},"Lake County, TN":{"recorder":{"name":"Lake County Register of Deeds","address":"229 Church St., Tiptonville, TN 38079"},"assessor":{"name":"Lake County Assessor","address":"229 Church St., Tiptonville, TN 38079"}},"Lauderdale County, TN":{"recorder":{"name":"Lauderdale County Register of Deeds","address":"100 Court Square Suite 3, Ripley, TN 38063"},"assessor":{"name":"Lauderdale County Assessor","address":"100 Court Square Suite 3, Ripley, TN 38063"}},"Lawrence County, TN":{"recorder":{"name":"Lawrence County Register of Deeds","address":"240 W Gaines St. Suite 101, Lawrenceburg, TN 38464"},"assessor":{"name":"Lawrence County Assessor","address":"240 W Gaines St. Suite 101, Lawrenceburg, TN 38464"}},"Lewis County, TN":{"recorder":{"name":"Lewis County Register of Deeds","address":"110 N Park Ave., Hohenwald, TN 38462"},"assessor":{"name":"Lewis County Assessor","address":"110 N Park Ave., Hohenwald, TN 38462"}},"Lincoln County, TN":{"recorder":{"name":"Lincoln County Register of Deeds","address":"112 Main Ave S Suite 101, Fayetteville, TN 37334"},"assessor":{"name":"Lincoln County Assessor","address":"112 Main Ave S Suite 101, Fayetteville, TN 37334"}},"Loudon County, TN":{"recorder":{"name":"Loudon County Register of Deeds","address":"101 Mulberry St. Suite 104, Loudon, TN 37774"},"assessor":{"name":"Loudon County Assessor","address":"101 Mulberry St. Suite 104, Loudon, TN 37774"}},"McMinn County, TN":{"recorder":{"name":"McMinn County Register of Deeds","address":"6 E Madison Ave., Athens, TN 37303"},"assessor":{"name":"McMinn County Assessor","address":"6 E Madison Ave., Athens, TN 37303"}},"McNairy County, TN":{"recorder":{"name":"McNairy County Register of Deeds","address":"300 Industrial Park Dr., Selmer, TN 38375"},"assessor":{"name":"McNairy County Assessor","address":"300 Industrial Park Dr., Selmer, TN 38375"}},"Macon County, TN":{"recorder":{"name":"Macon County Register of Deeds","address":"104 County Courthouse, Lafayette, TN 37083"},"assessor":{"name":"Macon County Assessor","address":"104 County Courthouse, Lafayette, TN 37083"}},"Madison County, TN":{"recorder":{"name":"Madison County Register of Deeds","address":"100 E Main St. Room 201, Jackson, TN 38301"},"assessor":{"name":"Madison County Assessor","address":"100 E Main St. Room 107, Jackson, TN 38301"}},"Marion County, TN":{"recorder":{"name":"Marion County Register of Deeds","address":"1 Courthouse Square Suite 2, Jasper, TN 37347"},"assessor":{"name":"Marion County Assessor","address":"1 Courthouse Square Suite 2, Jasper, TN 37347"}},"Marshall County, TN":{"recorder":{"name":"Marshall County Register of Deeds","address":"1 Public Square Suite 101, Lewisburg, TN 37091"},"assessor":{"name":"Marshall County Assessor","address":"1 Public Square Suite 101, Lewisburg, TN 37091"}},"Maury County, TN":{"recorder":{"name":"Maury County Register of Deeds","address":"41 Public Square Suite 201, Columbia, TN 38401"},"assessor":{"name":"Maury County Assessor","address":"41 Public Square Suite 101, Columbia, TN 38401"}},"Meigs County, TN":{"recorder":{"name":"Meigs County Register of Deeds","address":"17214 Hwy 58 N, Decatur, TN 37322"},"assessor":{"name":"Meigs County Assessor","address":"17214 Hwy 58 N, Decatur, TN 37322"}},"Monroe County, TN":{"recorder":{"name":"Monroe County Register of Deeds","address":"105 College St. Suite 1, Madisonville, TN 37354"},"assessor":{"name":"Monroe County Assessor","address":"105 College St. Suite 1, Madisonville, TN 37354"}},"Montgomery County, TN":{"recorder":{"name":"Montgomery County Register of Deeds","address":"350 Pageant Ln. Suite 101, Clarksville, TN 37040"},"assessor":{"name":"Montgomery County Assessor","address":"350 Pageant Ln. Suite 101, Clarksville, TN 37040"}},"Moore County, TN":{"recorder":{"name":"Moore County Register of Deeds","address":"196 Majors Blvd., Lynchburg, TN 37352"},"assessor":{"name":"Moore County Assessor","address":"196 Majors Blvd., Lynchburg, TN 37352"}},"Morgan County, TN":{"recorder":{"name":"Morgan County Register of Deeds","address":"415 N Kingston St., Wartburg, TN 37887"},"assessor":{"name":"Morgan County Assessor","address":"415 N Kingston St., Wartburg, TN 37887"}},"Obion County, TN":{"recorder":{"name":"Obion County Register of Deeds","address":"2 Bill Burnett Circle, Union City, TN 38261"},"assessor":{"name":"Obion County Assessor","address":"2 Bill Burnett Circle, Union City, TN 38261"}},"Overton County, TN":{"recorder":{"name":"Overton County Register of Deeds","address":"317 E University St., Livingston, TN 38570"},"assessor":{"name":"Overton County Assessor","address":"317 E University St., Livingston, TN 38570"}},"Perry County, TN":{"recorder":{"name":"Perry County Register of Deeds","address":"121 W Tennessee St., Linden, TN 37096"},"assessor":{"name":"Perry County Assessor","address":"121 W Tennessee St., Linden, TN 37096"}},"Pickett County, TN":{"recorder":{"name":"Pickett County Register of Deeds","address":"1 Courthouse Square, Byrdstown, TN 38549"},"assessor":{"name":"Pickett County Assessor","address":"1 Courthouse Square, Byrdstown, TN 38549"}},"Polk County, TN":{"recorder":{"name":"Polk County Register of Deeds","address":"P.O. Box 636, Benton, TN 37307"},"assessor":{"name":"Polk County Assessor","address":"Benton, TN 37307"}},"Putnam County, TN":{"recorder":{"name":"Putnam County Register of Deeds","address":"421 E Spring St. Suite 1, Cookeville, TN 38501"},"assessor":{"name":"Putnam County Assessor","address":"421 E Spring St. Suite 1, Cookeville, TN 38501"}},"Rhea County, TN":{"recorder":{"name":"Rhea County Register of Deeds","address":"375 Church St. Suite 16, Dayton, TN 37321"},"assessor":{"name":"Rhea County Assessor","address":"375 Church St. Suite 16, Dayton, TN 37321"}},"Roane County, TN":{"recorder":{"name":"Roane County Register of Deeds","address":"200 E Race St., Kingston, TN 37763"},"assessor":{"name":"Roane County Assessor","address":"200 E Race St., Kingston, TN 37763"}},"Robertson County, TN":{"recorder":{"name":"Robertson County Register of Deeds","address":"501 Main St. Suite 108, Springfield, TN 37172"},"assessor":{"name":"Robertson County Assessor","address":"501 Main St. Suite 108, Springfield, TN 37172"}},"Rutherford County, TN":{"recorder":{"name":"Rutherford County Register of Deeds","address":"319 N Maple St. Suite 218, Murfreesboro, TN 37130"},"assessor":{"name":"Rutherford County Assessor","address":"319 N Maple St. Suite 218, Murfreesboro, TN 37130"}},"Scott County, TN":{"recorder":{"name":"Scott County Register of Deeds","address":"88 Justice Center Ln., Huntsville, TN 37756"},"assessor":{"name":"Scott County Assessor","address":"88 Justice Center Ln., Huntsville, TN 37756"}},"Sequatchie County, TN":{"recorder":{"name":"Sequatchie County Register of Deeds","address":"Main St., Dunlap, TN 37327"},"assessor":{"name":"Sequatchie County Assessor","address":"Main St., Dunlap, TN 37327"}},"Sevier County, TN":{"recorder":{"name":"Sevier County Register of Deeds","address":"125 Court Ave. Suite 202E, Sevierville, TN 37862"},"assessor":{"name":"Sevier County Assessor","address":"125 Court Ave. Suite 202E, Sevierville, TN 37862"}},"Shelby County, TN":{"recorder":{"name":"Shelby County Register of Deeds","address":"1075 Mullins Station Rd., Memphis, TN 38134"},"assessor":{"name":"Shelby County Assessor","address":"1075 Mullins Station Rd., Memphis, TN 38134"}},"Smith County, TN":{"recorder":{"name":"Smith County Register of Deeds","address":"122 Turner High Circle Suite 107, Carthage, TN 37030"},"assessor":{"name":"Smith County Assessor","address":"122 Turner High Circle Suite 107, Carthage, TN 37030"}},"Stewart County, TN":{"recorder":{"name":"Stewart County Register of Deeds","address":"Main St., Dover, TN 37058"},"assessor":{"name":"Stewart County Assessor","address":"Main St., Dover, TN 37058"}},"Sullivan County, TN":{"recorder":{"name":"Sullivan County Register of Deeds","address":"3258 Highway 126 Suite 102, Blountville, TN 37617"},"assessor":{"name":"Sullivan County Assessor","address":"3258 Highway 126 Suite 102, Blountville, TN 37617"}},"Sumner County, TN":{"recorder":{"name":"Sumner County Register of Deeds","address":"355 N Belvedere Dr., Gallatin, TN 37066"},"assessor":{"name":"Sumner County Assessor","address":"355 N Belvedere Dr., Gallatin, TN 37066"}},"Tipton County, TN":{"recorder":{"name":"Tipton County Register of Deeds","address":"1801 S College St., Covington, TN 38019"},"assessor":{"name":"Tipton County Assessor","address":"1801 S College St., Covington, TN 38019"}},"Trousdale County, TN":{"recorder":{"name":"Trousdale County Register of Deeds","address":"328 E Main St. Suite 103, Hartsville, TN 37074"},"assessor":{"name":"Trousdale County Assessor","address":"328 E Main St. Suite 103, Hartsville, TN 37074"}},"Unicoi County, TN":{"recorder":{"name":"Unicoi County Register of Deeds","address":"100 Main Ave., Erwin, TN 37650"},"assessor":{"name":"Unicoi County Assessor","address":"100 Main Ave., Erwin, TN 37650"}},"Union County, TN":{"recorder":{"name":"Union County Register of Deeds","address":"901 Main St. Suite 201, Maynardville, TN 37807"},"assessor":{"name":"Union County Assessor","address":"901 Main St. Suite 201, Maynardville, TN 37807"}},"Van Buren County, TN":{"recorder":{"name":"Van Buren County Register of Deeds","address":"Courthouse Square, Spencer, TN 38585"},"assessor":{"name":"Van Buren County Assessor","address":"Courthouse Square, Spencer, TN 38585"}},"Warren County, TN":{"recorder":{"name":"Warren County Register of Deeds","address":"111 S Court Square Suite 201, McMinnville, TN 37110"},"assessor":{"name":"Warren County Assessor","address":"111 S Court Square Suite 201, McMinnville, TN 37110"}},"Washington County, TN":{"recorder":{"name":"Washington County Register of Deeds","address":"100 E Main St. Suite 203, Jonesborough, TN 37659"},"assessor":{"name":"Washington County Assessor","address":"100 E Main St. Suite 203, Jonesborough, TN 37659"}},"Wayne County, TN":{"recorder":{"name":"Wayne County Register of Deeds","address":"100 Court Circle Suite 5, Waynesboro, TN 38485"},"assessor":{"name":"Wayne County Assessor","address":"100 Court Circle Suite 5, Waynesboro, TN 38485"}},"Weakley County, TN":{"recorder":{"name":"Weakley County Register of Deeds","address":"116 W Main St. Suite 104, Dresden, TN 38225"},"assessor":{"name":"Weakley County Assessor","address":"116 W Main St. Suite 104, Dresden, TN 38225"}},"White County, TN":{"recorder":{"name":"White County Register of Deeds","address":"1 S Main St. Suite 3, Sparta, TN 38583"},"assessor":{"name":"White County Assessor","address":"1 S Main St. Suite 3, Sparta, TN 38583"}},"Williamson County, TN":{"recorder":{"name":"Williamson County Register of Deeds","address":"1320 W Main St. Suite 105, Franklin, TN 37064"},"assessor":{"name":"Williamson County Assessor","address":"1320 W Main St. Suite 105, Franklin, TN 37064"}},"Wilson County, TN":{"recorder":{"name":"Wilson County Register of Deeds","address":"228 E Main St., Lebanon, TN 37087"},"assessor":{"name":"Wilson County Assessor","address":"228 E Main St., Lebanon, TN 37087"}},"Anderson County, TX":{"recorder":{"name":"Anderson County Clerk","address":"500 N. Church St. #10, Palestine, TX 75801"},"assessor":{"name":"Anderson CAD","address":"PO Box 279, Palestine, TX 75802"}},"Andrews County, TX":{"recorder":{"name":"Andrews County Clerk","address":"PO Box 727, Andrews, TX 79714"},"assessor":{"name":"Andrews CAD","address":"600 N. Main, Andrews, TX 79714"}},"Angelina County, TX":{"recorder":{"name":"Angelina County Clerk","address":"PO Box 908, Lufkin, TX 75902"},"assessor":{"name":"Angelina CAD","address":"PO Box 2357, Lufkin, TX 75902"}},"Aransas County, TX":{"recorder":{"name":"Aransas County Clerk","address":"301 N. Live Oak St., Rockport, TX 78382"},"assessor":{"name":"Aransas CAD","address":"11 Highway 35 North, Rockport, TX 78382"}},"Archer County, TX":{"recorder":{"name":"Archer County Clerk","address":"PO Box 427, Archer City, TX 76351"},"assessor":{"name":"Archer CAD","address":"PO Box 1141, Archer City, TX 76351"}},"Armstrong County, TX":{"recorder":{"name":"Armstrong County Clerk","address":"PO Box 309, Claude, TX 79019"},"assessor":{"name":"Armstrong CAD","address":"PO Box 149, Claude, TX 79019"}},"Atascosa County, TX":{"recorder":{"name":"Atascosa County Clerk","address":"1 Courthouse Circle Dr., Jourdanton, TX 78026"},"assessor":{"name":"Atascosa CAD","address":"PO Box 600, Pleasanton, TX 78064"}},"Austin County, TX":{"recorder":{"name":"Austin County Clerk","address":"1 E. Main St., Bellville, TX 77418"},"assessor":{"name":"Austin CAD","address":"906 E. Amelia St., Bellville, TX 77418"}},"Bailey County, TX":{"recorder":{"name":"Bailey County Clerk","address":"300 S. 1st St., Muleshoe, TX 79347"},"assessor":{"name":"Bailey CAD","address":"302 Main St., Muleshoe, TX 79347"}},"Bandera County, TX":{"recorder":{"name":"Bandera County Clerk","address":"PO Box 823, Bandera, TX 78003"},"assessor":{"name":"Bandera CAD","address":"PO Box 1119, Bandera, TX 78003"}},"Bastrop County, TX":{"recorder":{"name":"Bastrop County Clerk","address":"803 Pine St. Ste 112, Bastrop, TX 78602"},"assessor":{"name":"Bastrop CAD","address":"PO Drawer 578, Bastrop, TX 78602"}},"Baylor County, TX":{"recorder":{"name":"Baylor County Clerk","address":"101 S. Washington, Seymour, TX 76380"},"assessor":{"name":"Baylor CAD","address":"211 N. Washington, Seymour, TX 76380"}},"Bee County, TX":{"recorder":{"name":"Bee County Clerk","address":"105 W. Corpus Christi St. Rm. 108, Beeville, TX 78102"},"assessor":{"name":"Bee CAD","address":"401 N. Washington, Beeville, TX 78102"}},"Bell County, TX":{"recorder":{"name":"Bell County Clerk","address":"PO Box 480, Belton, TX 76513"},"assessor":{"name":"Bell CAD","address":"PO Box 390, Belton, TX 76513"}},"Bexar County, TX":{"recorder":{"name":"Bexar County Clerk","address":"100 Dolorosa Ste. 104, San Antonio, TX 78205"},"assessor":{"name":"Bexar Appraisal District","address":"PO Box 830248, San Antonio, TX 78283"}},"Blanco County, TX":{"recorder":{"name":"Blanco County Clerk","address":"PO Box 65, Johnson City, TX 78636"},"assessor":{"name":"Blanco CAD","address":"PO Box 338, Johnson City, TX 78636"}},"Borden County, TX":{"recorder":{"name":"Borden County Clerk","address":"PO Box 124, Gail, TX 79738"},"assessor":{"name":"Borden CAD","address":"PO Box 298, Gail, TX 79738"}},"Bosque County, TX":{"recorder":{"name":"Bosque County Clerk","address":"PO Box 617, Meridian, TX 76665"},"assessor":{"name":"Bosque CAD","address":"PO Box 393, Meridian, TX 76665"}},"Bowie County, TX":{"recorder":{"name":"Bowie County Clerk","address":"710 James Bowie Dr., New Boston, TX 75570"},"assessor":{"name":"Bowie CAD","address":"122 Plaza West Suite A, Texarkana, TX 75501"}},"Brazoria County, TX":{"recorder":{"name":"Brazoria County Clerk","address":"111 E. Locust St., Angleton, TX 77515"},"assessor":{"name":"Brazoria CAD","address":"500 N. Chenango, Angleton, TX 77515"}},"Brazos County, TX":{"recorder":{"name":"Brazos County Clerk","address":"300 E. 26th St., Bryan, TX 77803"},"assessor":{"name":"Brazos CAD","address":"4051 Pendleton Drive, Bryan, TX 77802"}},"Brewster County, TX":{"recorder":{"name":"Brewster County Clerk","address":"PO Box 119, Alpine, TX 79831"},"assessor":{"name":"Brewster CAD","address":"107 W Ave E Box 2, Alpine, TX 79830"}},"Briscoe County, TX":{"recorder":{"name":"Briscoe County Clerk","address":"PO Box 555, Silverton, TX 79257"},"assessor":{"name":"Briscoe CAD","address":"PO Box 728, Silverton, TX 79257"}},"Brooks County, TX":{"recorder":{"name":"Brooks County Clerk","address":"PO Box 427, Falfurrias, TX 78355"},"assessor":{"name":"Brooks CAD","address":"PO Drawer A, Falfurrias, TX 78355"}},"Brown County, TX":{"recorder":{"name":"Brown County Clerk","address":"200 S. Broadway, Brownwood, TX 76801"},"assessor":{"name":"Brown CAD","address":"403 Fisk Ave., Brownwood, TX 76801"}},"Burleson County, TX":{"recorder":{"name":"Burleson County Clerk","address":"100 W. Buck St., Caldwell, TX 77836"},"assessor":{"name":"Burleson CAD","address":"PO Box 1000, Caldwell, TX 77836"}},"Burnet County, TX":{"recorder":{"name":"Burnet County Clerk","address":"220 S. Pierce St., Burnet, TX 78611"},"assessor":{"name":"Burnet CAD","address":"PO Box 908, Burnet, TX 78611"}},"Caldwell County, TX":{"recorder":{"name":"Caldwell County Clerk","address":"110 S. Main St., Lockhart, TX 78644"},"assessor":{"name":"Caldwell CAD","address":"PO Box 900, Lockhart, TX 78644"}},"Calhoun County, TX":{"recorder":{"name":"Calhoun County Clerk","address":"211 S. Ann St., Port Lavaca, TX 77979"},"assessor":{"name":"Calhoun CAD","address":"426 W. Main St., Port Lavaca, TX 77979"}},"Callahan County, TX":{"recorder":{"name":"Callahan County Clerk","address":"100 W. 4th St., Baird, TX 79504"},"assessor":{"name":"Callahan CAD","address":"302 Chestnut St., Baird, TX 79504"}},"Cameron County, TX":{"recorder":{"name":"Cameron County Clerk","address":"835 E. Levee St., Brownsville, TX 78520"},"assessor":{"name":"Cameron Appraisal District","address":"PO Box 1010, San Benito, TX 78586"}},"Camp County, TX":{"recorder":{"name":"Camp County Clerk","address":"126 Church St., Pittsburg, TX 75686"},"assessor":{"name":"Camp CAD","address":"143 Quitman St., Pittsburg, TX 75686"}},"Carson County, TX":{"recorder":{"name":"Carson County Clerk","address":"PO Box 487, Panhandle, TX 79068"},"assessor":{"name":"Carson CAD","address":"PO Box 970, Panhandle, TX 79068"}},"Cass County, TX":{"recorder":{"name":"Cass County Clerk","address":"PO Box 468, Linden, TX 75563"},"assessor":{"name":"Cass CAD","address":"502 N. Main St., Linden, TX 75563"}},"Castro County, TX":{"recorder":{"name":"Castro County Clerk","address":"100 E. Bedford St., Dimmitt, TX 79027"},"assessor":{"name":"Castro CAD","address":"204 SE 3rd (Rear), Dimmitt, TX 79027"}},"Chambers County, TX":{"recorder":{"name":"Chambers County Clerk","address":"PO Box 728, Anahuac, TX 77514"},"assessor":{"name":"Chambers CAD","address":"PO Box 1520, Anahuac, TX 77514"}},"Cherokee County, TX":{"recorder":{"name":"Cherokee County Clerk","address":"135 S. Main St., Rusk, TX 75785"},"assessor":{"name":"Cherokee CAD","address":"PO Box 494, Rusk, TX 75785"}},"Childress County, TX":{"recorder":{"name":"Childress County Clerk","address":"100 Ave E NW, Childress, TX 79201"},"assessor":{"name":"Childress CAD","address":"1710 Ave. F NW, Childress, TX 79201"}},"Clay County, TX":{"recorder":{"name":"Clay County Clerk","address":"PO Box 548, Henrietta, TX 76365"},"assessor":{"name":"Clay CAD","address":"PO Box 108, Henrietta, TX 76365"}},"Cochran County, TX":{"recorder":{"name":"Cochran County Clerk","address":"100 N. Main St., Morton, TX 79346"},"assessor":{"name":"Cochran CAD","address":"109 SE First St., Morton, TX 79346"}},"Coke County, TX":{"recorder":{"name":"Coke County Clerk","address":"13 E. 7th St., Robert Lee, TX 76945"},"assessor":{"name":"Coke CAD","address":"PO Box 2, Robert Lee, TX 76945"}},"Coleman County, TX":{"recorder":{"name":"Coleman County Clerk","address":"100 W. Liveoak St., Coleman, TX 76834"},"assessor":{"name":"Coleman CAD","address":"PO Box 914, Coleman, TX 76834"}},"Collin County, TX":{"recorder":{"name":"Collin County Clerk","address":"2300 Bloomdale Rd., McKinney, TX 75071"},"assessor":{"name":"Collin CAD","address":"250 Eldorado Pkwy., McKinney, TX 75069"}},"Collingsworth County, TX":{"recorder":{"name":"Collingsworth County Clerk","address":"800 West Ave., Wellington, TX 79095"},"assessor":{"name":"Collingsworth CAD","address":"800 W. Ave. Box 9, Wellington, TX 79095"}},"Colorado County, TX":{"recorder":{"name":"Colorado County Clerk","address":"400 Spring St., Columbus, TX 78934"},"assessor":{"name":"Colorado CAD","address":"PO Box 10, Columbus, TX 78934"}},"Comal County, TX":{"recorder":{"name":"Comal County Clerk","address":"150 N. Seguin Ave., New Braunfels, TX 78130"},"assessor":{"name":"Comal Appraisal District","address":"900 S. Seguin Ave., New Braunfels, TX 78130"}},"Comanche County, TX":{"recorder":{"name":"Comanche County Clerk","address":"101 W. Central Ave., Comanche, TX 76442"},"assessor":{"name":"Comanche CAD","address":"8 Huett Circle, Comanche, TX 76442"}},"Concho County, TX":{"recorder":{"name":"Concho County Clerk","address":"PO Box 98, Paint Rock, TX 76866"},"assessor":{"name":"Concho CAD","address":"PO Box 68, Paint Rock, TX 76866"}},"Cooke County, TX":{"recorder":{"name":"Cooke County Clerk","address":"100 S. Dixon St., Gainesville, TX 76240"},"assessor":{"name":"Cooke CAD","address":"201 North Dixon, Gainesville, TX 76240"}},"Coryell County, TX":{"recorder":{"name":"Coryell County Clerk","address":"PO Box 237, Gatesville, TX 76528"},"assessor":{"name":"Coryell CAD","address":"705 E. Main St., Gatesville, TX 76528"}},"Cottle County, TX":{"recorder":{"name":"Cottle County Clerk","address":"PO Box 717, Paducah, TX 79248"},"assessor":{"name":"Cottle CAD","address":"PO Box 459, Paducah, TX 79248"}},"Crane County, TX":{"recorder":{"name":"Crane County Clerk","address":"PO Box 578, Crane, TX 79731"},"assessor":{"name":"Crane CAD","address":"511 West 8th St., Crane, TX 79731"}},"Crockett County, TX":{"recorder":{"name":"Crockett County Clerk","address":"PO Box 185, Ozona, TX 76943"},"assessor":{"name":"Crockett CAD","address":"PO Box 1569, Ozona, TX 76943"}},"Crosby County, TX":{"recorder":{"name":"Crosby County Clerk","address":"201 W. Aspen St., Crosbyton, TX 79322"},"assessor":{"name":"Crosby CAD","address":"PO Box 505, Crosbyton, TX 79322"}},"Culberson County, TX":{"recorder":{"name":"Culberson County Clerk","address":"PO Box 158, Van Horn, TX 79855"},"assessor":{"name":"Culberson CAD","address":"PO Box 550, Van Horn, TX 79855"}},"Dallam County, TX":{"recorder":{"name":"Dallam County Clerk","address":"PO Box 835, Dalhart, TX 79022"},"assessor":{"name":"Dallam CAD","address":"PO Box 579, Dalhart, TX 79022"}},"Dallas County, TX":{"recorder":{"name":"Dallas County Clerk","address":"500 Elm St. Ste 2100, Dallas, TX 75202"},"assessor":{"name":"Dallas CAD","address":"2949 North Stemmons Fwy., Dallas, TX 75247"}},"Dawson County, TX":{"recorder":{"name":"Dawson County Clerk","address":"PO Box 1268, Lamesa, TX 79331"},"assessor":{"name":"Dawson CAD","address":"PO Box 797, Lamesa, TX 79331"}},"Deaf Smith County, TX":{"recorder":{"name":"Deaf Smith County Clerk","address":"235 E. 3rd St., Hereford, TX 79045"},"assessor":{"name":"Deaf Smith CAD","address":"PO Box 2298, Hereford, TX 79045"}},"Delta County, TX":{"recorder":{"name":"Delta County Clerk","address":"200 W. Dallas Ave., Cooper, TX 75432"},"assessor":{"name":"Delta CAD","address":"PO Box 47, Cooper, TX 75432"}},"Denton County, TX":{"recorder":{"name":"Denton County Clerk","address":"1450 E. McKinney St., Denton, TX 76201"},"assessor":{"name":"Denton CAD","address":"PO Box 2816, Denton, TX 76202"}},"De Witt County, TX":{"recorder":{"name":"De Witt County Clerk","address":"307 N. Gonzales St., Cuero, TX 77954"},"assessor":{"name":"DeWitt CAD","address":"103 E. Bailey St., Cuero, TX 77954"}},"Dickens County, TX":{"recorder":{"name":"Dickens County Clerk","address":"PO Box 120, Dickens, TX 79229"},"assessor":{"name":"Dickens CAD","address":"PO Box 180, Dickens, TX 79229"}},"Dimmit County, TX":{"recorder":{"name":"Dimmit County Clerk","address":"103 N. 5th St., Carrizo Springs, TX 78834"},"assessor":{"name":"Dimmit CAD","address":"404 West Pena, Carrizo Springs, TX 78834"}},"Donley County, TX":{"recorder":{"name":"Donley County Clerk","address":"PO Box 825, Clarendon, TX 79226"},"assessor":{"name":"Donley CAD","address":"PO Box 1220, Clarendon, TX 79226"}},"Duval County, TX":{"recorder":{"name":"Duval County Clerk","address":"PO Box 248, San Diego, TX 78384"},"assessor":{"name":"Duval CAD","address":"PO Box 809, San Diego, TX 78384"}},"Eastland County, TX":{"recorder":{"name":"Eastland County Clerk","address":"PO Box 110, Eastland, TX 76448"},"assessor":{"name":"Eastland CAD","address":"PO Box 914, Eastland, TX 76448"}},"Ector County, TX":{"recorder":{"name":"Ector County Clerk","address":"300 N. Grant Ave., Odessa, TX 79761"},"assessor":{"name":"Ector CAD","address":"1301 E. 8th, Odessa, TX 79761"}},"Edwards County, TX":{"recorder":{"name":"Edwards County Clerk","address":"PO Box 184, Rocksprings, TX 78880"},"assessor":{"name":"Edwards CAD","address":"PO Box 858, Rocksprings, TX 78880"}},"El Paso County, TX":{"recorder":{"name":"El Paso County Clerk","address":"500 E. San Antonio Ave., El Paso, TX 79901"},"assessor":{"name":"El Paso CAD","address":"5801 Trowbridge, El Paso, TX 79925"}},"Ellis County, TX":{"recorder":{"name":"Ellis County Clerk","address":"1201 N. Hwy 77, Waxahachie, TX 75165"},"assessor":{"name":"Ellis CAD","address":"PO Box 878, Waxahachie, TX 75165"}},"Erath County, TX":{"recorder":{"name":"Erath County Clerk","address":"222 E. College St., Stephenville, TX 76401"},"assessor":{"name":"Erath CAD","address":"1195 West South Loop, Stephenville, TX 76401"}},"Falls County, TX":{"recorder":{"name":"Falls County Clerk","address":"PO Box 458, Marlin, TX 76661"},"assessor":{"name":"Falls CAD","address":"403 Craik Street, Marlin, TX 76661"}},"Fannin County, TX":{"recorder":{"name":"Fannin County Clerk","address":"101 E. Sam Rayburn Dr., Bonham, TX 75418"},"assessor":{"name":"Fannin CAD","address":"831 W. State Hwy 56, Bonham, TX 75418"}},"Fayette County, TX":{"recorder":{"name":"Fayette County Clerk","address":"PO Box 59, La Grange, TX 78945"},"assessor":{"name":"Fayette CAD","address":"PO Box 836, La Grange, TX 78945"}},"Fisher County, TX":{"recorder":{"name":"Fisher County Clerk","address":"PO Box 368, Roby, TX 79543"},"assessor":{"name":"Fisher CAD","address":"PO Box 516, Roby, TX 79543"}},"Floyd County, TX":{"recorder":{"name":"Floyd County Clerk","address":"105 S. Main St., Floydada, TX 79235"},"assessor":{"name":"Floyd CAD","address":"PO Box 249, Floydada, TX 79235"}},"Foard County, TX":{"recorder":{"name":"Foard County Clerk","address":"PO Box 539, Crowell, TX 79227"},"assessor":{"name":"Foard CAD","address":"PO Box 419, Crowell, TX 79227"}},"Fort Bend County, TX":{"recorder":{"name":"Fort Bend County Clerk","address":"301 Jackson St., Richmond, TX 77469"},"assessor":{"name":"Fort Bend CAD","address":"2801 BF Terry Blvd., Rosenberg, TX 77471"}},"Franklin County, TX":{"recorder":{"name":"Franklin County Clerk","address":"PO Box 68, Mount Vernon, TX 75457"},"assessor":{"name":"Franklin CAD","address":"PO Box 720, Mt. Vernon, TX 75457"}},"Freestone County, TX":{"recorder":{"name":"Freestone County Clerk","address":"PO Box 307, Fairfield, TX 75840"},"assessor":{"name":"Freestone CAD","address":"218 N. Mount, Fairfield, TX 75840"}},"Frio County, TX":{"recorder":{"name":"Frio County Clerk","address":"500 E. San Antonio St., Pearsall, TX 78061"},"assessor":{"name":"Frio CAD","address":"PO Box 1129, Pearsall, TX 78061"}},"Gaines County, TX":{"recorder":{"name":"Gaines County Clerk","address":"PO Box 789, Seminole, TX 79360"},"assessor":{"name":"Gaines CAD","address":"PO Box 490, Seminole, TX 79360"}},"Galveston County, TX":{"recorder":{"name":"Galveston County Clerk","address":"PO Box 17253, Galveston, TX 77552"},"assessor":{"name":"Galveston CAD","address":"9850 Emmett F. Lowry Expy Ste A101, Texas City, TX 77591"}},"Garza County, TX":{"recorder":{"name":"Garza County Clerk","address":"300 W. Main St., Post, TX 79356"},"assessor":{"name":"Garza CAD","address":"PO Drawer F, Post, TX 79356"}},"Gillespie County, TX":{"recorder":{"name":"Gillespie County Clerk","address":"101 W. Main St., Fredericksburg, TX 78624"},"assessor":{"name":"Gillespie CAD","address":"1159 South Milam St., Fredericksburg, TX 78624"}},"Glasscock County, TX":{"recorder":{"name":"Glasscock County Clerk","address":"PO Box 190, Garden City, TX 79739"},"assessor":{"name":"Glasscock CAD","address":"PO Box 155, Garden City, TX 79739"}},"Goliad County, TX":{"recorder":{"name":"Goliad County Clerk","address":"PO Box 50, Goliad, TX 77963"},"assessor":{"name":"Goliad CAD","address":"PO Box 34, Goliad, TX 77963"}},"Gonzales County, TX":{"recorder":{"name":"Gonzales County Clerk","address":"PO Box 77, Gonzales, TX 78629"},"assessor":{"name":"Gonzales CAD","address":"PO Box 867, Gonzales, TX 78629"}},"Gray County, TX":{"recorder":{"name":"Gray County Clerk","address":"PO Box 1902, Pampa, TX 79066"},"assessor":{"name":"Gray CAD","address":"PO Box 836, Pampa, TX 79066"}},"Grayson County, TX":{"recorder":{"name":"Grayson County Clerk","address":"100 W. Houston St., Sherman, TX 75090"},"assessor":{"name":"Grayson CAD","address":"512 North Travis St., Sherman, TX 75090"}},"Gregg County, TX":{"recorder":{"name":"Gregg County Clerk","address":"PO Box 3049, Longview, TX 75606"},"assessor":{"name":"Gregg CAD","address":"4367 W. Loop 281, Longview, TX 75604"}},"Grimes County, TX":{"recorder":{"name":"Grimes County Clerk","address":"PO Box 209, Anderson, TX 77830"},"assessor":{"name":"Grimes CAD","address":"PO Box 489, Anderson, TX 77830"}},"Guadalupe County, TX":{"recorder":{"name":"Guadalupe County Clerk","address":"211 W. Court St., Seguin, TX 78155"},"assessor":{"name":"Guadalupe Appraisal District","address":"3000 N. Austin St., Seguin, TX 78155"}},"Hale County, TX":{"recorder":{"name":"Hale County Clerk","address":"500 Broadway St., Plainview, TX 79072"},"assessor":{"name":"Hale CAD","address":"PO Box 29, Plainview, TX 79073"}},"Hall County, TX":{"recorder":{"name":"Hall County Clerk","address":"PO Box 879, Memphis, TX 79245"},"assessor":{"name":"Hall CAD","address":"112 S. 5th St., Memphis, TX 79245"}},"Hamilton County, TX":{"recorder":{"name":"Hamilton County Clerk","address":"PO Box 365, Hamilton, TX 76531"},"assessor":{"name":"Hamilton CAD","address":"119 E. Henry St., Hamilton, TX 76531"}},"Hansford County, TX":{"recorder":{"name":"Hansford County Clerk","address":"PO Box 397, Spearman, TX 79081"},"assessor":{"name":"Hansford CAD","address":"709 W. 7th Ave., Spearman, TX 79081"}},"Hardeman County, TX":{"recorder":{"name":"Hardeman County Clerk","address":"PO Box 30, Quanah, TX 79252"},"assessor":{"name":"Hardeman CAD","address":"PO Box 388, Quanah, TX 79252"}},"Hardin County, TX":{"recorder":{"name":"Hardin County Clerk","address":"PO Box 38, Kountze, TX 77625"},"assessor":{"name":"Hardin CAD","address":"PO Box 670, Kountze, TX 77625"}},"Harris County, TX":{"recorder":{"name":"Harris County Clerk","address":"PO Box 1525, Houston, TX 77251"},"assessor":{"name":"Harris CAD","address":"13013 Northwest Freeway, Houston, TX 77040"}},"Harrison County, TX":{"recorder":{"name":"Harrison County Clerk","address":"PO Box 1365, Marshall, TX 75671"},"assessor":{"name":"Harrison CAD","address":"PO Box 818, Marshall, TX 75671"}},"Hartley County, TX":{"recorder":{"name":"Hartley County Clerk","address":"PO Box 189, Channing, TX 79018"},"assessor":{"name":"Hartley CAD","address":"PO Box 405, Hartley, TX 79044"}},"Haskell County, TX":{"recorder":{"name":"Haskell County Clerk","address":"PO Box 1007, Haskell, TX 79521"},"assessor":{"name":"Haskell CAD","address":"PO Box 467, Haskell, TX 79521"}},"Hays County, TX":{"recorder":{"name":"Hays County Clerk","address":"712 S. Stagecoach Trail, San Marcos, TX 78666"},"assessor":{"name":"Hays CAD","address":"21001 N. IH 35, Kyle, TX 78640"}},"Hemphill County, TX":{"recorder":{"name":"Hemphill County Clerk","address":"PO Box 867, Canadian, TX 79014"},"assessor":{"name":"Hemphill CAD","address":"223 Main St., Canadian, TX 79014"}},"Henderson County, TX":{"recorder":{"name":"Henderson County Clerk","address":"PO Box 632, Athens, TX 75751"},"assessor":{"name":"Henderson CAD","address":"PO Box 430, Athens, TX 75751"}},"Hidalgo County, TX":{"recorder":{"name":"Hidalgo County Clerk","address":"PO Box 58, Edinburg, TX 78540"},"assessor":{"name":"Hidalgo CAD","address":"PO Box 208, Edinburg, TX 78540"}},"Hill County, TX":{"recorder":{"name":"Hill County Clerk","address":"PO Box 398, Hillsboro, TX 76645"},"assessor":{"name":"Hill CAD","address":"PO Box 416, Hillsboro, TX 76645"}},"Hockley County, TX":{"recorder":{"name":"Hockley County Clerk","address":"802 Houston St., Levelland, TX 79336"},"assessor":{"name":"Hockley CAD","address":"PO Box 1090, Levelland, TX 79336"}},"Hood County, TX":{"recorder":{"name":"Hood County Clerk","address":"201 W. Bridge St., Granbury, TX 76048"},"assessor":{"name":"Hood CAD","address":"PO Box 819, Granbury, TX 76048"}},"Hopkins County, TX":{"recorder":{"name":"Hopkins County Clerk","address":"PO Box 288, Sulphur Springs, TX 75483"},"assessor":{"name":"Hopkins CAD","address":"PO Box 753, Sulphur Springs, TX 75482"}},"Houston County, TX":{"recorder":{"name":"Houston County Clerk","address":"PO Box 370, Crockett, TX 75835"},"assessor":{"name":"Houston CAD","address":"PO Box 112, Crockett, TX 75835"}},"Howard County, TX":{"recorder":{"name":"Howard County Clerk","address":"PO Box 1468, Big Spring, TX 79721"},"assessor":{"name":"Howard CAD","address":"PO Box 1151, Big Spring, TX 79721"}},"Hudspeth County, TX":{"recorder":{"name":"Hudspeth County Clerk","address":"PO Box 58, Sierra Blanca, TX 79851"},"assessor":{"name":"Hudspeth CAD","address":"PO Box 429, Sierra Blanca, TX 79851"}},"Hunt County, TX":{"recorder":{"name":"Hunt County Clerk","address":"PO Box 1316, Greenville, TX 75403"},"assessor":{"name":"Hunt CAD","address":"PO Box 1339, Greenville, TX 75403"}},"Hutchinson County, TX":{"recorder":{"name":"Hutchinson County Clerk","address":"PO Box 1186, Stinnett, TX 79083"},"assessor":{"name":"Hutchinson CAD","address":"PO Box 5065, Borger, TX 79008"}},"Irion County, TX":{"recorder":{"name":"Irion County Clerk","address":"PO Box 228, Mertzon, TX 76941"},"assessor":{"name":"Irion CAD","address":"PO Box 980, Mertzon, TX 76941"}},"Jack County, TX":{"recorder":{"name":"Jack County Clerk","address":"100 N. Main St., Jacksboro, TX 76458"},"assessor":{"name":"Jack CAD","address":"PO Box 958, Jacksboro, TX 76458"}},"Jackson County, TX":{"recorder":{"name":"Jackson County Clerk","address":"115 W. Main St., Edna, TX 77957"},"assessor":{"name":"Jackson CAD","address":"404 North Allen, Edna, TX 77957"}},"Jasper County, TX":{"recorder":{"name":"Jasper County Clerk","address":"PO Box 2070, Jasper, TX 75951"},"assessor":{"name":"Jasper CAD","address":"PO Box 1300, Jasper, TX 75951"}},"Jeff Davis County, TX":{"recorder":{"name":"Jeff Davis County Clerk","address":"PO Box 398, Fort Davis, TX 79734"},"assessor":{"name":"Jeff Davis CAD","address":"PO Box 373, Fort Davis, TX 79734"}},"Jefferson County, TX":{"recorder":{"name":"Jefferson County Clerk","address":"PO Box 1151, Beaumont, TX 77704"},"assessor":{"name":"Jefferson CAD","address":"PO Box 21337, Beaumont, TX 77720"}},"Jim Hogg County, TX":{"recorder":{"name":"Jim Hogg County Clerk","address":"PO Box 729, Hebbronville, TX 78361"},"assessor":{"name":"Jim Hogg CAD","address":"PO Box 459, Hebbronville, TX 78361"}},"Jim Wells County, TX":{"recorder":{"name":"Jim Wells County Clerk","address":"PO Box 1459, Alice, TX 78333"},"assessor":{"name":"Jim Wells CAD","address":"PO Box 607, Alice, TX 78333"}},"Johnson County, TX":{"recorder":{"name":"Johnson County Clerk","address":"2 N. Main St., Cleburne, TX 76033"},"assessor":{"name":"Johnson CAD","address":"109 N. Main, Cleburne, TX 76033"}},"Jones County, TX":{"recorder":{"name":"Jones County Clerk","address":"PO Box 552, Anson, TX 79501"},"assessor":{"name":"Jones CAD","address":"PO Box 348, Anson, TX 79501"}},"Karnes County, TX":{"recorder":{"name":"Karnes County Clerk","address":"101 N. Panna Maria Ave., Karnes City, TX 78118"},"assessor":{"name":"Karnes CAD","address":"915 S. Panna Maria Ave., Karnes City, TX 78118"}},"Kaufman County, TX":{"recorder":{"name":"Kaufman County Clerk","address":"100 W. Mulberry St., Kaufman, TX 75142"},"assessor":{"name":"Kaufman CAD","address":"PO Box 819, Kaufman, TX 75142"}},"Kendall County, TX":{"recorder":{"name":"Kendall County Clerk","address":"201 E. San Antonio Ave., Boerne, TX 78006"},"assessor":{"name":"Kendall CAD","address":"118 Market Ave., Boerne, TX 78006"}},"Kenedy County, TX":{"recorder":{"name":"Kenedy County Clerk","address":"PO Box 37, Sarita, TX 78385"},"assessor":{"name":"Kenedy CAD","address":"PO Box 39, Sarita, TX 78385"}},"Kent County, TX":{"recorder":{"name":"Kent County Clerk","address":"PO Box 9, Jayton, TX 79528"},"assessor":{"name":"Kent CAD","address":"PO Box 68, Jayton, TX 79528"}},"Kerr County, TX":{"recorder":{"name":"Kerr County Clerk","address":"700 Main St., Kerrville, TX 78028"},"assessor":{"name":"Kerr CAD","address":"PO Box 294387, Kerrville, TX 78029"}},"Kimble County, TX":{"recorder":{"name":"Kimble County Clerk","address":"501 Main St., Junction, TX 76849"},"assessor":{"name":"Kimble CAD","address":"PO Box 307, Junction, TX 76849"}},"King County, TX":{"recorder":{"name":"King County Clerk","address":"PO Box 135, Guthrie, TX 79236"},"assessor":{"name":"King CAD","address":"PO Box 117, Guthrie, TX 79236"}},"Kinney County, TX":{"recorder":{"name":"Kinney County Clerk","address":"PO Box 9, Brackettville, TX 78832"},"assessor":{"name":"Kinney CAD","address":"PO Box 1377, Bracketville, TX 78832"}},"Kleberg County, TX":{"recorder":{"name":"Kleberg County Clerk","address":"PO Box 312, Kingsville, TX 78364"},"assessor":{"name":"Kleberg CAD","address":"502 E. Kleberg Ave., Kingsville, TX 78363"}},"Knox County, TX":{"recorder":{"name":"Knox County Clerk","address":"PO Box 196, Benjamin, TX 79505"},"assessor":{"name":"Knox CAD","address":"PO Box 47, Benjamin, TX 79505"}},"Lamar County, TX":{"recorder":{"name":"Lamar County Clerk","address":"119 N. Main St., Paris, TX 75460"},"assessor":{"name":"Lamar CAD","address":"521 Bonham St., Paris, TX 75460"}},"Lamb County, TX":{"recorder":{"name":"Lamb County Clerk","address":"100 6th Dr., Littlefield, TX 79339"},"assessor":{"name":"Lamb CAD","address":"PO Box 950, Littlefield, TX 79339"}},"Lampasas County, TX":{"recorder":{"name":"Lampasas County Clerk","address":"PO Box 347, Lampasas, TX 76550"},"assessor":{"name":"Lampasas CAD","address":"PO Box 175, Lampasas, TX 76550"}},"La Salle County, TX":{"recorder":{"name":"La Salle County Clerk","address":"101 Courthouse Sq., Cotulla, TX 78014"},"assessor":{"name":"LaSalle CAD","address":"PO Box 1530, Cotulla, TX 78014"}},"Lavaca County, TX":{"recorder":{"name":"Lavaca County Clerk","address":"PO Box 326, Hallettsville, TX 77964"},"assessor":{"name":"Lavaca CAD","address":"PO Box 386, Hallettsville, TX 77964"}},"Lee County, TX":{"recorder":{"name":"Lee County Clerk","address":"PO Box 419, Giddings, TX 78942"},"assessor":{"name":"Lee CAD","address":"898 E. Richmond St. Ste 100, Giddings, TX 78942"}},"Leon County, TX":{"recorder":{"name":"Leon County Clerk","address":"PO Box 98, Centerville, TX 75833"},"assessor":{"name":"Leon CAD","address":"PO Box 536, Centerville, TX 75833"}},"Liberty County, TX":{"recorder":{"name":"Liberty County Clerk","address":"PO Box 369, Liberty, TX 77575"},"assessor":{"name":"Liberty CAD","address":"PO Box 10016, Liberty, TX 77575"}},"Limestone County, TX":{"recorder":{"name":"Limestone County Clerk","address":"PO Box 350, Groesbeck, TX 76642"},"assessor":{"name":"Limestone CAD","address":"PO Drawer 831, Groesbeck, TX 76642"}},"Lipscomb County, TX":{"recorder":{"name":"Lipscomb County Clerk","address":"PO Box 70, Lipscomb, TX 79056"},"assessor":{"name":"Lipscomb CAD","address":"PO Box 128, Darrouzett, TX 79024"}},"Live Oak County, TX":{"recorder":{"name":"Live Oak County Clerk","address":"PO Box 280, George West, TX 78022"},"assessor":{"name":"Live Oak CAD","address":"PO Box 2370, George West, TX 78022"}},"Llano County, TX":{"recorder":{"name":"Llano County Clerk","address":"107 W. Sandstone St., Llano, TX 78643"},"assessor":{"name":"Llano CAD","address":"103 E. Sandstone, Llano, TX 78643"}},"Loving County, TX":{"recorder":{"name":"Loving County Clerk","address":"PO Box 194, Mentone, TX 79754"},"assessor":{"name":"Loving CAD","address":"PO Box 352, Mentone, TX 79751"}},"Lubbock County, TX":{"recorder":{"name":"Lubbock County Clerk","address":"PO Box 10536, Lubbock, TX 79408"},"assessor":{"name":"Lubbock CAD","address":"2109 Avenue Q, Lubbock, TX 79411"}},"Lynn County, TX":{"recorder":{"name":"Lynn County Clerk","address":"PO Box 937, Tahoka, TX 79373"},"assessor":{"name":"Lynn CAD","address":"PO Box 789, Tahoka, TX 79373"}},"Madison County, TX":{"recorder":{"name":"Madison County Clerk","address":"PO Box 607, Madisonville, TX 77864"},"assessor":{"name":"Madison CAD","address":"PO Box 1328, Madisonville, TX 77864"}},"Marion County, TX":{"recorder":{"name":"Marion County Clerk","address":"102 W. Austin St., Jefferson, TX 75657"},"assessor":{"name":"Marion CAD","address":"801 North Tuttle, Jefferson, TX 75657"}},"Martin County, TX":{"recorder":{"name":"Martin County Clerk","address":"PO Box 906, Stanton, TX 79782"},"assessor":{"name":"Martin CAD","address":"PO Box 1349, Stanton, TX 79782"}},"Mason County, TX":{"recorder":{"name":"Mason County Clerk","address":"PO Box 554, Mason, TX 76856"},"assessor":{"name":"Mason CAD","address":"PO Drawer 1119, Mason, TX 76856"}},"Matagorda County, TX":{"recorder":{"name":"Matagorda County Clerk","address":"1700 7th St., Bay City, TX 77414"},"assessor":{"name":"Matagorda CAD","address":"2225 Avenue G, Bay City, TX 77414"}},"Maverick County, TX":{"recorder":{"name":"Maverick County Clerk","address":"PO Box 4050, Eagle Pass, TX 78853"},"assessor":{"name":"Maverick CAD","address":"PO Box 2628, Eagle Pass, TX 78853"}},"McCulloch County, TX":{"recorder":{"name":"McCulloch County Clerk","address":"199 Courthouse Sq., Brady, TX 76825"},"assessor":{"name":"McCulloch CAD","address":"306 W. Lockhart, Brady, TX 76825"}},"McLennan County, TX":{"recorder":{"name":"McLennan County Clerk","address":"PO Box 1727, Waco, TX 76703"},"assessor":{"name":"McLennan CAD","address":"PO Box 2297, Waco, TX 76703"}},"McMullen County, TX":{"recorder":{"name":"McMullen County Clerk","address":"PO Box 237, Tilden, TX 78072"},"assessor":{"name":"McMullen CAD","address":"PO Box 338, Tilden, TX 78072"}},"Medina County, TX":{"recorder":{"name":"Medina County Clerk","address":"1100 16th St., Hondo, TX 78861"},"assessor":{"name":"Medina CAD","address":"1410 Ave K, Hondo, TX 78861"}},"Menard County, TX":{"recorder":{"name":"Menard County Clerk","address":"PO Box 1028, Menard, TX 76859"},"assessor":{"name":"Menard CAD","address":"PO Box 1008, Menard, TX 76859"}},"Midland County, TX":{"recorder":{"name":"Midland County Clerk","address":"PO Box 1350, Midland, TX 79702"},"assessor":{"name":"Midland CAD","address":"PO Box 908002, Midland, TX 79708"}},"Milam County, TX":{"recorder":{"name":"Milam County Clerk","address":"102 S. Fannin Ave., Cameron, TX 76520"},"assessor":{"name":"Milam CAD","address":"PO Box 769, Cameron, TX 76520"}},"Mills County, TX":{"recorder":{"name":"Mills County Clerk","address":"PO Box 646, Goldthwaite, TX 76844"},"assessor":{"name":"Mills CAD","address":"PO Box 565, Goldthwaite, TX 76844"}},"Mitchell County, TX":{"recorder":{"name":"Mitchell County Clerk","address":"349 Oak St., Colorado City, TX 79512"},"assessor":{"name":"Mitchell CAD","address":"2112 Hickory St., Colorado City, TX 79512"}},"Montague County, TX":{"recorder":{"name":"Montague County Clerk","address":"PO Box 77, Montague, TX 76251"},"assessor":{"name":"Montague CAD","address":"PO Box 121, Montague, TX 76251"}},"Montgomery County, TX":{"recorder":{"name":"Montgomery County Clerk","address":"PO Box 959, Conroe, TX 77305"},"assessor":{"name":"Montgomery CAD","address":"PO Box 2233, Conroe, TX 77305"}},"Moore County, TX":{"recorder":{"name":"Moore County Clerk","address":"715 S. Dumas Ave., Dumas, TX 79029"},"assessor":{"name":"Moore CAD","address":"419 Success Blvd., Dumas, TX 79029"}},"Morris County, TX":{"recorder":{"name":"Morris County Clerk","address":"500 Broadnax St., Daingerfield, TX 75638"},"assessor":{"name":"Morris CAD","address":"PO Box 563, Daingerfield, TX 75638"}},"Motley County, TX":{"recorder":{"name":"Motley County Clerk","address":"PO Box 66, Matador, TX 79244"},"assessor":{"name":"Motley CAD","address":"PO Box 779, Matador, TX 79244"}},"Nacogdoches County, TX":{"recorder":{"name":"Nacogdoches County Clerk","address":"101 W. Main St., Nacogdoches, TX 75961"},"assessor":{"name":"Nacogdoches CAD","address":"216 W. Hospital, Nacogdoches, TX 75961"}},"Navarro County, TX":{"recorder":{"name":"Navarro County Clerk","address":"PO Box 423, Corsicana, TX 75151"},"assessor":{"name":"Navarro CAD","address":"PO Box 3118, Corsicana, TX 75151"}},"Newton County, TX":{"recorder":{"name":"Newton County Clerk","address":"PO Box 484, Newton, TX 75966"},"assessor":{"name":"Newton CAD","address":"109 Court St., Newton, TX 75966"}},"Nolan County, TX":{"recorder":{"name":"Nolan County Clerk","address":"100 E. 3rd St., Sweetwater, TX 79556"},"assessor":{"name":"Nolan CAD","address":"PO Box 1256, Sweetwater, TX 79556"}},"Nueces County, TX":{"recorder":{"name":"Nueces County Clerk","address":"PO Box 2627, Corpus Christi, TX 78403"},"assessor":{"name":"Nueces CAD","address":"201 N. Chapparal Ste 206, Corpus Christi, TX 78401"}},"Ochiltree County, TX":{"recorder":{"name":"Ochiltree County Clerk","address":"511 S. Main St., Perryton, TX 79070"},"assessor":{"name":"Ochiltree CAD","address":"825 S. Main St. Ste 100, Perryton, TX 79070"}},"Oldham County, TX":{"recorder":{"name":"Oldham County Clerk","address":"PO Box 360, Vega, TX 79092"},"assessor":{"name":"Oldham CAD","address":"PO Box 310, Vega, TX 79092"}},"Orange County, TX":{"recorder":{"name":"Orange County Clerk","address":"123 S. 6th St., Orange, TX 77630"},"assessor":{"name":"Orange CAD","address":"PO Box 457, Orange, TX 77631"}},"Palo Pinto County, TX":{"recorder":{"name":"Palo Pinto County Clerk","address":"PO Box 219, Palo Pinto, TX 76484"},"assessor":{"name":"Palo Pinto CAD","address":"PO Box 250, Palo Pinto, TX 76484"}},"Panola County, TX":{"recorder":{"name":"Panola County Clerk","address":"110 S. Sycamore St., Carthage, TX 75633"},"assessor":{"name":"Panola CAD","address":"1736 Ballpark Dr., Carthage, TX 75633"}},"Parker County, TX":{"recorder":{"name":"Parker County Clerk","address":"1112 Santa Fe Dr., Weatherford, TX 76086"},"assessor":{"name":"Parker CAD","address":"1108 Santa Fe Dr., Weatherford, TX 76086"}},"Parmer County, TX":{"recorder":{"name":"Parmer County Clerk","address":"PO Box 356, Farwell, TX 79325"},"assessor":{"name":"Parmer CAD","address":"PO Box 56, Bovina, TX 79009"}},"Pecos County, TX":{"recorder":{"name":"Pecos County Clerk","address":"103 W. Callaghan St., Fort Stockton, TX 79735"},"assessor":{"name":"Pecos CAD","address":"PO Box 237, Fort Stockton, TX 79735"}},"Polk County, TX":{"recorder":{"name":"Polk County Clerk","address":"101 W. Church St., Livingston, TX 77351"},"assessor":{"name":"Polk CAD","address":"114 Matthew St., Livingston, TX 77351"}},"Potter County, TX":{"recorder":{"name":"Potter County Clerk","address":"PO Box 9638, Amarillo, TX 79105"},"assessor":{"name":"Potter/Randall CAD","address":"PO Box 7190, Amarillo, TX 79114"}},"Presidio County, TX":{"recorder":{"name":"Presidio County Clerk","address":"PO Box 789, Marfa, TX 79843"},"assessor":{"name":"Presidio CAD","address":"PO Box 879, Marfa, TX 79843"}},"Rains County, TX":{"recorder":{"name":"Rains County Clerk","address":"PO Box 187, Emory, TX 75440"},"assessor":{"name":"Rains CAD","address":"PO Box 70, Emory, TX 75440"}},"Randall County, TX":{"recorder":{"name":"Randall County Clerk","address":"PO Box 660, Canyon, TX 79015"},"assessor":{"name":"Potter/Randall CAD","address":"PO Box 7190, Amarillo, TX 79114"}},"Reagan County, TX":{"recorder":{"name":"Reagan County Clerk","address":"PO Box 100, Big Lake, TX 76932"},"assessor":{"name":"Reagan CAD","address":"PO Box 8, Big Lake, TX 76932"}},"Real County, TX":{"recorder":{"name":"Real County Clerk","address":"PO Box 750, Leakey, TX 78873"},"assessor":{"name":"Real CAD","address":"PO Box 158, Leakey, TX 78873"}},"Red River County, TX":{"recorder":{"name":"Red River County Clerk","address":"200 N. Walnut St., Clarksville, TX 75426"},"assessor":{"name":"Red River CAD","address":"PO Box 461, Clarksville, TX 75426"}},"Reeves County, TX":{"recorder":{"name":"Reeves County Clerk","address":"PO Box 867, Pecos, TX 79772"},"assessor":{"name":"Reeves CAD","address":"PO Box 1229, Pecos, TX 79772"}},"Refugio County, TX":{"recorder":{"name":"Refugio County Clerk","address":"PO Box 704, Refugio, TX 78377"},"assessor":{"name":"Refugio CAD","address":"PO Box 156, Refugio, TX 78377"}},"Roberts County, TX":{"recorder":{"name":"Roberts County Clerk","address":"PO Box 477, Miami, TX 79059"},"assessor":{"name":"Roberts CAD","address":"PO Box 458, Miami, TX 79059"}},"Robertson County, TX":{"recorder":{"name":"Robertson County Clerk","address":"PO Box 998, Franklin, TX 77856"},"assessor":{"name":"Robertson CAD","address":"PO Box 998, Franklin, TX 77856"}},"Rockwall County, TX":{"recorder":{"name":"Rockwall County Clerk","address":"1111 E. Yellowjacket Ln., Rockwall, TX 75087"},"assessor":{"name":"Rockwall CAD","address":"841 Justin Rd., Rockwall, TX 75087"}},"Runnels County, TX":{"recorder":{"name":"Runnels County Clerk","address":"PO Box 189, Ballinger, TX 76821"},"assessor":{"name":"Runnels CAD","address":"PO Box 524, Ballinger, TX 76821"}},"Rusk County, TX":{"recorder":{"name":"Rusk County Clerk","address":"115 N. Main St., Henderson, TX 75652"},"assessor":{"name":"Rusk CAD","address":"PO Box 7, Henderson, TX 75653"}},"Sabine County, TX":{"recorder":{"name":"Sabine County Clerk","address":"PO Box 580, Hemphill, TX 75948"},"assessor":{"name":"Sabine CAD","address":"PO Box 137, Hemphill, TX 75948"}},"San Augustine County, TX":{"recorder":{"name":"San Augustine County Clerk","address":"223 N. Harrison St., San Augustine, TX 75972"},"assessor":{"name":"San Augustine CAD","address":"122 N. Harrison, San Augustine, TX 75972"}},"San Jacinto County, TX":{"recorder":{"name":"San Jacinto County Clerk","address":"PO Box 696, Coldspring, TX 77331"},"assessor":{"name":"San Jacinto CAD","address":"PO Box 1170, Coldspring, TX 77331"}},"San Patricio County, TX":{"recorder":{"name":"San Patricio County Clerk","address":"400 W. Sinton St., Sinton, TX 78387"},"assessor":{"name":"San Patricio CAD","address":"1301 E. Sinton Ste. B, Sinton, TX 78387"}},"San Saba County, TX":{"recorder":{"name":"San Saba County Clerk","address":"500 E. Wallace St., San Saba, TX 76877"},"assessor":{"name":"San Saba CAD","address":"423 E. Wallace, San Saba, TX 76877"}},"Schleicher County, TX":{"recorder":{"name":"Schleicher County Clerk","address":"PO Box 537, Eldorado, TX 76936"},"assessor":{"name":"Schleicher CAD","address":"PO Box 936, Eldorado, TX 76936"}},"Scurry County, TX":{"recorder":{"name":"Scurry County Clerk","address":"1806 25th St., Snyder, TX 79549"},"assessor":{"name":"Scurry CAD","address":"2612 College Ave., Snyder, TX 79549"}},"Shackelford County, TX":{"recorder":{"name":"Shackelford County Clerk","address":"PO Box 2109, Albany, TX 76430"},"assessor":{"name":"Shackelford CAD","address":"PO Box 2247, Albany, TX 76430"}},"Shelby County, TX":{"recorder":{"name":"Shelby County Clerk","address":"PO Box 1987, Center, TX 75935"},"assessor":{"name":"Shelby CAD","address":"724 Shelbyville St., Center, TX 75935"}},"Sherman County, TX":{"recorder":{"name":"Sherman County Clerk","address":"PO Box 270, Stratford, TX 79084"},"assessor":{"name":"Sherman CAD","address":"PO Box 239, Stratford, TX 79084"}},"Smith County, TX":{"recorder":{"name":"Smith County Clerk","address":"200 E. Ferguson St., Tyler, TX 75702"},"assessor":{"name":"Smith CAD","address":"245 S. SE Loop 323, Tyler, TX 75702"}},"Somervell County, TX":{"recorder":{"name":"Somervell County Clerk","address":"PO Box 662, Glen Rose, TX 76043"},"assessor":{"name":"Somervell CAD","address":"112 Allen Dr., Glen Rose, TX 76043"}},"Starr County, TX":{"recorder":{"name":"Starr County Clerk","address":"401 N. Britton Ave., Rio Grande City, TX 78582"},"assessor":{"name":"Starr CAD","address":"100 N. FM 3167 Ste 300, Rio Grande City, TX 78582"}},"Stephens County, TX":{"recorder":{"name":"Stephens County Clerk","address":"200 W. Walker St., Breckenridge, TX 76424"},"assessor":{"name":"Stephens CAD","address":"PO Box 351, Breckenridge, TX 76424"}},"Sterling County, TX":{"recorder":{"name":"Sterling County Clerk","address":"PO Box 55, Sterling City, TX 76951"},"assessor":{"name":"Sterling CAD","address":"PO Box 28, Sterling City, TX 76951"}},"Stonewall County, TX":{"recorder":{"name":"Stonewall County Clerk","address":"PO Box 300, Aspermont, TX 79502"},"assessor":{"name":"Stonewall CAD","address":"PO Box 308, Aspermont, TX 79502"}},"Sutton County, TX":{"recorder":{"name":"Sutton County Clerk","address":"300 E. Oak St., Sonora, TX 76950"},"assessor":{"name":"Sutton CAD","address":"300 E. Oak St. Ste 2, Sonora, TX 76950"}},"Swisher County, TX":{"recorder":{"name":"Swisher County Clerk","address":"119 S. Maxwell Ave., Tulia, TX 79088"},"assessor":{"name":"Swisher CAD","address":"PO Box 8, Tulia, TX 79088"}},"Tarrant County, TX":{"recorder":{"name":"Tarrant County Clerk","address":"100 W. Weatherford St., Fort Worth, TX 76196"},"assessor":{"name":"Tarrant Appraisal District","address":"2500 Handley-Ederville Rd., Fort Worth, TX 76118"}},"Taylor County, TX":{"recorder":{"name":"Taylor County Clerk","address":"400 Oak St., Abilene, TX 79602"},"assessor":{"name":"Taylor CAD","address":"PO Box 1800, Abilene, TX 79604"}},"Terrell County, TX":{"recorder":{"name":"Terrell County Clerk","address":"105 E. Hackberry St., Sanderson, TX 79848"},"assessor":{"name":"Terrell CAD","address":"PO Box 747, Sanderson, TX 79848"}},"Terry County, TX":{"recorder":{"name":"Terry County Clerk","address":"500 W. Main St., Brownfield, TX 79316"},"assessor":{"name":"Terry CAD","address":"PO Box 426, Brownfield, TX 79316"}},"Throckmorton County, TX":{"recorder":{"name":"Throckmorton County Clerk","address":"PO Box 309, Throckmorton, TX 76483"},"assessor":{"name":"Throckmorton CAD","address":"PO Box 788, Throckmorton, TX 76483"}},"Titus County, TX":{"recorder":{"name":"Titus County Clerk","address":"100 W. 1st St., Mt. Pleasant, TX 75455"},"assessor":{"name":"Titus CAD","address":"PO Box 528, Mount Pleasant, TX 75456"}},"Tom Green County, TX":{"recorder":{"name":"Tom Green County Clerk","address":"124 W. Beauregard Ave., San Angelo, TX 76903"},"assessor":{"name":"Tom Green CAD","address":"2302 Pulliam St., San Angelo, TX 76905"}},"Travis County, TX":{"recorder":{"name":"Travis County Clerk","address":"PO Box 149325, Austin, TX 78714"},"assessor":{"name":"Travis CAD","address":"PO Box 149012, Austin, TX 78714"}},"Trinity County, TX":{"recorder":{"name":"Trinity County Clerk","address":"PO Box 456, Groveton, TX 75845"},"assessor":{"name":"Trinity CAD","address":"PO Box 950, Groveton, TX 75845"}},"Tyler County, TX":{"recorder":{"name":"Tyler County Clerk","address":"100 W. Bluff St., Woodville, TX 75979"},"assessor":{"name":"Tyler CAD","address":"PO Box 9, Woodville, TX 75979"}},"Upshur County, TX":{"recorder":{"name":"Upshur County Clerk","address":"PO Box 730, Gilmer, TX 75644"},"assessor":{"name":"Upshur CAD","address":"105 Diamond Loch, Gilmer, TX 75644"}},"Upton County, TX":{"recorder":{"name":"Upton County Clerk","address":"PO Box 373, Rankin, TX 79778"},"assessor":{"name":"Upton CAD","address":"PO Box 1110, McCamey, TX 79752"}},"Uvalde County, TX":{"recorder":{"name":"Uvalde County Clerk","address":"PO Box 284, Uvalde, TX 78802"},"assessor":{"name":"Uvalde CAD","address":"209 North High St., Uvalde, TX 78801"}},"Val Verde County, TX":{"recorder":{"name":"Val Verde County Clerk","address":"400 Pecan St., Del Rio, TX 78840"},"assessor":{"name":"Val Verde CAD","address":"417 W. Cantu Rd., Del Rio, TX 78844"}},"Van Zandt County, TX":{"recorder":{"name":"Van Zandt County Clerk","address":"121 E. Dallas St., Canton, TX 75103"},"assessor":{"name":"Van Zandt CAD","address":"PO Box 926, Canton, TX 75103"}},"Victoria County, TX":{"recorder":{"name":"Victoria County Clerk","address":"115 N. Bridge St., Victoria, TX 77901"},"assessor":{"name":"Victoria CAD","address":"2805 N. Navarro Suite 300, Victoria, TX 77901"}},"Walker County, TX":{"recorder":{"name":"Walker County Clerk","address":"1100 University Ave., Huntsville, TX 77340"},"assessor":{"name":"Walker CAD","address":"PO Box 1798, Huntsville, TX 77342"}},"Waller County, TX":{"recorder":{"name":"Waller County Clerk","address":"836 Austin St., Hempstead, TX 77445"},"assessor":{"name":"Waller CAD","address":"PO Box 887, Hempstead, TX 77445"}},"Ward County, TX":{"recorder":{"name":"Ward County Clerk","address":"400 S. Allen St., Monahans, TX 79756"},"assessor":{"name":"Ward CAD","address":"PO Box 905, Monahans, TX 79756"}},"Washington County, TX":{"recorder":{"name":"Washington County Clerk","address":"100 E. Main St., Brenham, TX 77833"},"assessor":{"name":"Washington CAD","address":"PO Box 681, Brenham, TX 77834"}},"Webb County, TX":{"recorder":{"name":"Webb County Clerk","address":"1110 Victoria St., Laredo, TX 78040"},"assessor":{"name":"Webb CAD","address":"3302 Clark Blvd., Laredo, TX 78043"}},"Wharton County, TX":{"recorder":{"name":"Wharton County Clerk","address":"103 S. Fulton St., Wharton, TX 77488"},"assessor":{"name":"Wharton CAD","address":"308 E. Milam, Wharton, TX 77488"}},"Wheeler County, TX":{"recorder":{"name":"Wheeler County Clerk","address":"PO Box 465, Wheeler, TX 79096"},"assessor":{"name":"Wheeler CAD","address":"PO Box 1200, Wheeler, TX 79096"}},"Wichita County, TX":{"recorder":{"name":"Wichita County Clerk","address":"PO Box 1679, Wichita Falls, TX 76307"},"assessor":{"name":"Wichita CAD","address":"PO Box 5172, Wichita Falls, TX 76307"}},"Wilbarger County, TX":{"recorder":{"name":"Wilbarger County Clerk","address":"1700 Wilbarger St., Vernon, TX 76384"},"assessor":{"name":"Wilbarger CAD","address":"PO Box 1519, Vernon, TX 76385"}},"Willacy County, TX":{"recorder":{"name":"Willacy County Clerk","address":"576 W. Main Ave., Raymondville, TX 78580"},"assessor":{"name":"Willacy CAD","address":"688 FM 3168, Raymondville, TX 78580"}},"Williamson County, TX":{"recorder":{"name":"Williamson County Clerk","address":"405 Martin Luther King St., Georgetown, TX 78626"},"assessor":{"name":"Williamson CAD","address":"625 FM 1460, Georgetown, TX 78626"}},"Wilson County, TX":{"recorder":{"name":"Wilson County Clerk","address":"1420 3rd St., Floresville, TX 78114"},"assessor":{"name":"Wilson CAD","address":"1611 Railroad St., Floresville, TX 78114"}},"Winkler County, TX":{"recorder":{"name":"Winkler County Clerk","address":"PO Box 1007, Kermit, TX 79745"},"assessor":{"name":"Winkler CAD","address":"PO Box 1219, Kermit, TX 79745"}},"Wise County, TX":{"recorder":{"name":"Wise County Clerk","address":"PO Box 359, Decatur, TX 76234"},"assessor":{"name":"Wise CAD","address":"400 E. Business Hwy 380, Decatur, TX 76234"}},"Wood County, TX":{"recorder":{"name":"Wood County Clerk","address":"PO Box 1796, Quitman, TX 75783"},"assessor":{"name":"Wood CAD","address":"PO Box 1706, Quitman, TX 75783"}},"Yoakum County, TX":{"recorder":{"name":"Yoakum County Clerk","address":"PO Box 309, Plains, TX 79355"},"assessor":{"name":"Yoakum CAD","address":"PO Box 748, Plains, TX 79355"}},"Young County, TX":{"recorder":{"name":"Young County Clerk","address":"516 4th St., Graham, TX 76450"},"assessor":{"name":"Young CAD","address":"PO Box 337, Graham, TX 79049"}},"Zapata County, TX":{"recorder":{"name":"Zapata County Clerk","address":"PO Box 789, Zapata, TX 78076"},"assessor":{"name":"Zapata CAD","address":"200 E. 7th Ave. Ste 240, Zapata, TX 78076"}},"Zavala County, TX":{"recorder":{"name":"Zavala County Clerk","address":"200 E. Uvalde St., Crystal City, TX 78839"},"assessor":{"name":"Zavala CAD","address":"200 E. Uvalde St., Crystal City, TX 78839"}},"Beaver County, UT":{"recorder":{"name":"Beaver County Recorder","address":"105 E Center St., Beaver, UT 84713"},"assessor":{"name":"Beaver County Assessor","address":"105 E Center St., Beaver, UT 84713"}},"Box Elder County, UT":{"recorder":{"name":"Box Elder County Recorder","address":"01 S Main St., Brigham City, UT 84302"},"assessor":{"name":"Box Elder County Assessor","address":"01 S Main St., Brigham City, UT 84302"}},"Cache County, UT":{"recorder":{"name":"Cache County Recorder","address":"179 N Main St. Suite 201, Logan, UT 84321"},"assessor":{"name":"Cache County Assessor","address":"179 N Main St. Suite 302, Logan, UT 84321"}},"Carbon County, UT":{"recorder":{"name":"Carbon County Recorder","address":"120 E Main St., Price, UT 84501"},"assessor":{"name":"Carbon County Assessor","address":"120 E Main St., Price, UT 84501"}},"Daggett County, UT":{"recorder":{"name":"Daggett County Recorder","address":"95 N 1st W, Manila, UT 84046"},"assessor":{"name":"Daggett County Assessor","address":"95 N 1st W, Manila, UT 84046"}},"Davis County, UT":{"recorder":{"name":"Davis County Recorder","address":"61 S Main St., Farmington, UT 84025"},"assessor":{"name":"Davis County Assessor","address":"61 S Main St., Farmington, UT 84025"}},"Duchesne County, UT":{"recorder":{"name":"Duchesne County Recorder","address":"734 N Center St., Duchesne, UT 84021"},"assessor":{"name":"Duchesne County Assessor","address":"734 N Center St., Duchesne, UT 84021"}},"Emery County, UT":{"recorder":{"name":"Emery County Recorder","address":"75 E Main St., Castle Dale, UT 84513"},"assessor":{"name":"Emery County Assessor","address":"75 E Main St., Castle Dale, UT 84513"}},"Garfield County, UT":{"recorder":{"name":"Garfield County Recorder","address":"55 S Main St., Panguitch, UT 84759"},"assessor":{"name":"Garfield County Assessor","address":"55 S Main St., Panguitch, UT 84759"}},"Grand County, UT":{"recorder":{"name":"Grand County Recorder","address":"125 E Center St., Moab, UT 84532"},"assessor":{"name":"Grand County Assessor","address":"125 E Center St., Moab, UT 84532"}},"Iron County, UT":{"recorder":{"name":"Iron County Recorder","address":"68 S 100 E, Parowan, UT 84761"},"assessor":{"name":"Iron County Assessor","address":"68 S 100 E, Parowan, UT 84761"}},"Juab County, UT":{"recorder":{"name":"Juab County Recorder","address":"160 N Main St., Nephi, UT 84648"},"assessor":{"name":"Juab County Assessor","address":"160 N Main St., Nephi, UT 84648"}},"Kane County, UT":{"recorder":{"name":"Kane County Recorder","address":"76 N Main St., Kanab, UT 84741"},"assessor":{"name":"Kane County Assessor","address":"76 N Main St., Kanab, UT 84741"}},"Millard County, UT":{"recorder":{"name":"Millard County Recorder","address":"765 S Hwy 99 Suite 6, Fillmore, UT 84631"},"assessor":{"name":"Millard County Assessor","address":"765 S Hwy 99 Suite 3, Fillmore, UT 84631"}},"Morgan County, UT":{"recorder":{"name":"Morgan County Recorder","address":"48 W Young St., Morgan, UT 84050"},"assessor":{"name":"Morgan County Assessor","address":"48 W Young St., Morgan, UT 84050"}},"Piute County, UT":{"recorder":{"name":"Piute County Recorder","address":"550 N Main St., Junction, UT 84740"},"assessor":{"name":"Piute County Assessor","address":"550 N Main St., Junction, UT 84740"}},"Rich County, UT":{"recorder":{"name":"Rich County Recorder","address":"20 S Main St., Randolph, UT 84064"},"assessor":{"name":"Rich County Assessor","address":"20 S Main St., Randolph, UT 84064"}},"Salt Lake County, UT":{"recorder":{"name":"Salt Lake County Recorder","address":"2001 S State St. Suite N1-600, Salt Lake City, UT 84190"},"assessor":{"name":"Salt Lake County Assessor","address":"2001 S State St. Suite N2-600, Salt Lake City, UT 84190"}},"San Juan County, UT":{"recorder":{"name":"San Juan County Recorder","address":"117 S Main St., Monticello, UT 84535"},"assessor":{"name":"San Juan County Assessor","address":"117 S Main St., Monticello, UT 84535"}},"Sanpete County, UT":{"recorder":{"name":"Sanpete County Recorder","address":"160 N Main St., Manti, UT 84642"},"assessor":{"name":"Sanpete County Assessor","address":"160 N Main St., Manti, UT 84642"}},"Sevier County, UT":{"recorder":{"name":"Sevier County Recorder","address":"250 N Main St., Richfield, UT 84701"},"assessor":{"name":"Sevier County Assessor","address":"250 N Main St., Richfield, UT 84701"}},"Summit County, UT":{"recorder":{"name":"Summit County Recorder","address":"60 N Main St., Coalville, UT 84017"},"assessor":{"name":"Summit County Assessor","address":"60 N Main St., Coalville, UT 84017"}},"Tooele County, UT":{"recorder":{"name":"Tooele County Recorder","address":"47 S Main St., Tooele, UT 84074"},"assessor":{"name":"Tooele County Assessor","address":"47 S Main St., Tooele, UT 84074"}},"Uintah County, UT":{"recorder":{"name":"Uintah County Recorder","address":"147 E Main St., Vernal, UT 84078"},"assessor":{"name":"Uintah County Assessor","address":"147 E Main St., Vernal, UT 84078"}},"Utah County, UT":{"recorder":{"name":"Utah County Recorder","address":"100 E Center St. Suite 1200, Provo, UT 84606"},"assessor":{"name":"Utah County Assessor","address":"100 E Center St. Suite 1100, Provo, UT 84606"}},"Wasatch County, UT":{"recorder":{"name":"Wasatch County Recorder","address":"25 N Main St., Heber City, UT 84032"},"assessor":{"name":"Wasatch County Assessor","address":"25 N Main St., Heber City, UT 84032"}},"Washington County, UT":{"recorder":{"name":"Washington County Recorder","address":"111 E Tabernacle St., St. George, UT 84770"},"assessor":{"name":"Washington County Assessor","address":"111 E Tabernacle St., St. George, UT 84770"}},"Wayne County, UT":{"recorder":{"name":"Wayne County Recorder","address":"18 S Main St., Loa, UT 84747"},"assessor":{"name":"Wayne County Assessor","address":"18 S Main St., Loa, UT 84747"}},"Weber County, UT":{"recorder":{"name":"Weber County Recorder","address":"2380 Washington Blvd. Suite 320, Ogden, UT 84401"},"assessor":{"name":"Weber County Assessor","address":"2380 Washington Blvd. Suite 380, Ogden, UT 84401"}},"Accomack County, VA":{"recorder":{"name":"Accomack County Circuit Court Clerk","address":"23296 Courthouse Ave., Accomac, VA 23301"},"assessor":{"name":"Accomack County Commissioner of Revenue","address":"23296 Courthouse Ave., Accomac, VA 23301"}},"Albemarle County, VA":{"recorder":{"name":"Albemarle County Circuit Court Clerk","address":"501 E Jefferson St., Charlottesville, VA 22902"},"assessor":{"name":"Albemarle County Commissioner of Revenue","address":"401 McIntire Rd. Suite 228, Charlottesville, VA 22902"}},"Alleghany County, VA":{"recorder":{"name":"Alleghany County Circuit Court Clerk","address":"266 W Main St., Covington, VA 24426"},"assessor":{"name":"Alleghany County Commissioner of Revenue","address":"266 W Main St., Covington, VA 24426"}},"Amelia County, VA":{"recorder":{"name":"Amelia County Circuit Court Clerk","address":"16441 Court St., Amelia Court House, VA 23002"},"assessor":{"name":"Amelia County Commissioner of Revenue","address":"16441 Court St., Amelia Court House, VA 23002"}},"Amherst County, VA":{"recorder":{"name":"Amherst County Circuit Court Clerk","address":"113 Taylor St., Amherst, VA 24521"},"assessor":{"name":"Amherst County Commissioner of Revenue","address":"113 Taylor St., Amherst, VA 24521"}},"Appomattox County, VA":{"recorder":{"name":"Appomattox County Circuit Court Clerk","address":"Main & Court St., Appomattox, VA 24522"},"assessor":{"name":"Appomattox County Commissioner of Revenue","address":"Main & Court St., Appomattox, VA 24522"}},"Arlington County, VA":{"recorder":{"name":"Arlington County Circuit Court Clerk","address":"1425 N Courthouse Rd. Suite 6700, Arlington, VA 22201"},"assessor":{"name":"Arlington County Commissioner of Revenue","address":"2100 Clarendon Blvd. Suite 200, Arlington, VA 22201"}},"Augusta County, VA":{"recorder":{"name":"Augusta County Circuit Court Clerk","address":"6 E Johnson St., Staunton, VA 24401"},"assessor":{"name":"Augusta County Commissioner of Revenue","address":"6 E Johnson St., Staunton, VA 24401"}},"Bath County, VA":{"recorder":{"name":"Bath County Circuit Court Clerk","address":"Courthouse Square, Warm Springs, VA 24484"},"assessor":{"name":"Bath County Commissioner of Revenue","address":"Courthouse Square, Warm Springs, VA 24484"}},"Bedford County, VA":{"recorder":{"name":"Bedford County Circuit Court Clerk","address":"123 E Main St. Suite 201, Bedford, VA 24523"},"assessor":{"name":"Bedford County Commissioner of Revenue","address":"123 E Main St. Suite 201, Bedford, VA 24523"}},"Bland County, VA":{"recorder":{"name":"Bland County Circuit Court Clerk","address":"612 Main St., Bland, VA 24315"},"assessor":{"name":"Bland County Commissioner of Revenue","address":"612 Main St., Bland, VA 24315"}},"Botetourt County, VA":{"recorder":{"name":"Botetourt County Circuit Court Clerk","address":"1 W Main St., Fincastle, VA 24090"},"assessor":{"name":"Botetourt County Commissioner of Revenue","address":"1 W Main St., Fincastle, VA 24090"}},"Brunswick County, VA":{"recorder":{"name":"Brunswick County Circuit Court Clerk","address":"216 N Main St., Lawrenceville, VA 23868"},"assessor":{"name":"Brunswick County Commissioner of Revenue","address":"216 N Main St., Lawrenceville, VA 23868"}},"Buchanan County, VA":{"recorder":{"name":"Buchanan County Circuit Court Clerk","address":"Grundy, VA 24614"},"assessor":{"name":"Buchanan County Commissioner of Revenue","address":"Grundy, VA 24614"}},"Buckingham County, VA":{"recorder":{"name":"Buckingham County Circuit Court Clerk","address":"13062 W James Anderson Hwy, Buckingham, VA 23921"},"assessor":{"name":"Buckingham County Commissioner of Revenue","address":"13062 W James Anderson Hwy, Buckingham, VA 23921"}},"Campbell County, VA":{"recorder":{"name":"Campbell County Circuit Court Clerk","address":"735 Village Hwy, Rustburg, VA 24588"},"assessor":{"name":"Campbell County Commissioner of Revenue","address":"735 Village Hwy, Rustburg, VA 24588"}},"Caroline County, VA":{"recorder":{"name":"Caroline County Circuit Court Clerk","address":"112 Courthouse Ln. Suite B, Bowling Green, VA 22427"},"assessor":{"name":"Caroline County Commissioner of Revenue","address":"112 Courthouse Ln. Suite B, Bowling Green, VA 22427"}},"Carroll County, VA":{"recorder":{"name":"Carroll County Circuit Court Clerk","address":"605 Pine St. Suite 201, Hillsville, VA 24343"},"assessor":{"name":"Carroll County Commissioner of Revenue","address":"605 Pine St. Suite 201, Hillsville, VA 24343"}},"Charles City County, VA":{"recorder":{"name":"Charles City County Circuit Court Clerk","address":"10760 Courthouse Rd., Charles City, VA 23030"},"assessor":{"name":"Charles City County Commissioner of Revenue","address":"10760 Courthouse Rd., Charles City, VA 23030"}},"Charlotte County, VA":{"recorder":{"name":"Charlotte County Circuit Court Clerk","address":"138 David Bruce Ave., Charlotte Court House, VA 23923"},"assessor":{"name":"Charlotte County Commissioner of Revenue","address":"138 David Bruce Ave., Charlotte Court House, VA 23923"}},"Chesterfield County, VA":{"recorder":{"name":"Chesterfield County Circuit Court Clerk","address":"9500 Courthouse Rd., Chesterfield, VA 23832"},"assessor":{"name":"Chesterfield County Commissioner of Revenue","address":"9500 Courthouse Rd., Chesterfield, VA 23832"}},"Clarke County, VA":{"recorder":{"name":"Clarke County Circuit Court Clerk","address":"102 E Main St., Berryville, VA 22611"},"assessor":{"name":"Clarke County Commissioner of Revenue","address":"102 E Main St., Berryville, VA 22611"}},"Craig County, VA":{"recorder":{"name":"Craig County Circuit Court Clerk","address":"303 Court St., New Castle, VA 24127"},"assessor":{"name":"Craig County Commissioner of Revenue","address":"303 Court St., New Castle, VA 24127"}},"Culpeper County, VA":{"recorder":{"name":"Culpeper County Circuit Court Clerk","address":"135 W Cameron St., Culpeper, VA 22701"},"assessor":{"name":"Culpeper County Commissioner of Revenue","address":"135 W Cameron St., Culpeper, VA 22701"}},"Cumberland County, VA":{"recorder":{"name":"Cumberland County Circuit Court Clerk","address":"1 Courthouse Circle, Cumberland, VA 23040"},"assessor":{"name":"Cumberland County Commissioner of Revenue","address":"1 Courthouse Circle, Cumberland, VA 23040"}},"Dickenson County, VA":{"recorder":{"name":"Dickenson County Circuit Court Clerk","address":"293 Clintwood Main St., Clintwood, VA 24228"},"assessor":{"name":"Dickenson County Commissioner of Revenue","address":"293 Clintwood Main St., Clintwood, VA 24228"}},"Dinwiddie County, VA":{"recorder":{"name":"Dinwiddie County Circuit Court Clerk","address":"14016 Boydton Plank Rd., Dinwiddie, VA 23841"},"assessor":{"name":"Dinwiddie County Commissioner of Revenue","address":"14016 Boydton Plank Rd., Dinwiddie, VA 23841"}},"Essex County, VA":{"recorder":{"name":"Essex County Circuit Court Clerk","address":"305 Prince St., Tappahannock, VA 22560"},"assessor":{"name":"Essex County Commissioner of Revenue","address":"305 Prince St., Tappahannock, VA 22560"}},"Fairfax County, VA":{"recorder":{"name":"Fairfax County Circuit Court Clerk","address":"4110 Chain Bridge Rd. Suite 317, Fairfax, VA 22030"},"assessor":{"name":"Fairfax County Department of Tax Administration","address":"12000 Government Center Pkwy Suite 223, Fairfax, VA 22035"}},"Fauquier County, VA":{"recorder":{"name":"Fauquier County Circuit Court Clerk","address":"40 Culpeper St., Warrenton, VA 20186"},"assessor":{"name":"Fauquier County Commissioner of Revenue","address":"40 Culpeper St., Warrenton, VA 20186"}},"Floyd County, VA":{"recorder":{"name":"Floyd County Circuit Court Clerk","address":"100 E Main St. Suite 200, Floyd, VA 24091"},"assessor":{"name":"Floyd County Commissioner of Revenue","address":"100 E Main St. Suite 200, Floyd, VA 24091"}},"Fluvanna County, VA":{"recorder":{"name":"Fluvanna County Circuit Court Clerk","address":"72 Main St., Palmyra, VA 22963"},"assessor":{"name":"Fluvanna County Commissioner of Revenue","address":"72 Main St., Palmyra, VA 22963"}},"Franklin County, VA":{"recorder":{"name":"Franklin County Circuit Court Clerk","address":"275 S Main St. Suite 117, Rocky Mount, VA 24151"},"assessor":{"name":"Franklin County Commissioner of Revenue","address":"275 S Main St. Suite 117, Rocky Mount, VA 24151"}},"Frederick County, VA":{"recorder":{"name":"Frederick County Circuit Court Clerk","address":"5 N Kent St., Winchester, VA 22601"},"assessor":{"name":"Frederick County Commissioner of Revenue","address":"107 N Kent St., Winchester, VA 22601"}},"Giles County, VA":{"recorder":{"name":"Giles County Circuit Court Clerk","address":"501 Wenonah Ave., Pearisburg, VA 24134"},"assessor":{"name":"Giles County Commissioner of Revenue","address":"501 Wenonah Ave., Pearisburg, VA 24134"}},"Gloucester County, VA":{"recorder":{"name":"Gloucester County Circuit Court Clerk","address":"7400 Justice Dr., Gloucester, VA 23061"},"assessor":{"name":"Gloucester County Commissioner of Revenue","address":"6489 Main St. Suite 116, Gloucester, VA 23061"}},"Goochland County, VA":{"recorder":{"name":"Goochland County Circuit Court Clerk","address":"2938 River Rd. W, Goochland, VA 23063"},"assessor":{"name":"Goochland County Commissioner of Revenue","address":"2938 River Rd. W, Goochland, VA 23063"}},"Grayson County, VA":{"recorder":{"name":"Grayson County Circuit Court Clerk","address":"129 Davis St. Suite 101, Independence, VA 24348"},"assessor":{"name":"Grayson County Commissioner of Revenue","address":"129 Davis St. Suite 101, Independence, VA 24348"}},"Greene County, VA":{"recorder":{"name":"Greene County Circuit Court Clerk","address":"22 Court St. Suite 201, Stanardsville, VA 22973"},"assessor":{"name":"Greene County Commissioner of Revenue","address":"22 Court St. Suite 201, Stanardsville, VA 22973"}},"Greensville County, VA":{"recorder":{"name":"Greensville County Circuit Court Clerk","address":"337 S Main St., Emporia, VA 23847"},"assessor":{"name":"Greensville County Commissioner of Revenue","address":"337 S Main St., Emporia, VA 23847"}},"Halifax County, VA":{"recorder":{"name":"Halifax County Circuit Court Clerk","address":"1 S Main St., Halifax, VA 24558"},"assessor":{"name":"Halifax County Commissioner of Revenue","address":"1 S Main St., Halifax, VA 24558"}},"Hanover County, VA":{"recorder":{"name":"Hanover County Circuit Court Clerk","address":"7507 Library Dr., Hanover, VA 23069"},"assessor":{"name":"Hanover County Commissioner of Revenue","address":"7507 Library Dr., Hanover, VA 23069"}},"Henrico County, VA":{"recorder":{"name":"Henrico County Circuit Court Clerk","address":"4301 E Parham Rd., Richmond, VA 23228"},"assessor":{"name":"Henrico County Department of Finance","address":"4301 E Parham Rd., Richmond, VA 23228"}},"Henry County, VA":{"recorder":{"name":"Henry County Circuit Court Clerk","address":"1 N Main St., Martinsville, VA 24112"},"assessor":{"name":"Henry County Commissioner of Revenue","address":"1 N Main St., Martinsville, VA 24112"}},"Highland County, VA":{"recorder":{"name":"Highland County Circuit Court Clerk","address":"165 W Main St., Monterey, VA 24465"},"assessor":{"name":"Highland County Commissioner of Revenue","address":"165 W Main St., Monterey, VA 24465"}},"Isle of Wight County, VA":{"recorder":{"name":"Isle of Wight County Circuit Court Clerk","address":"17000 Josiah Parker Circle, Isle of Wight, VA 23397"},"assessor":{"name":"Isle of Wight County Commissioner of Revenue","address":"17000 Josiah Parker Circle, Isle of Wight, VA 23397"}},"James City County, VA":{"recorder":{"name":"James City County Circuit Court Clerk","address":"5201 Monticello Ave. Suite 5, Williamsburg, VA 23188"},"assessor":{"name":"James City County Commissioner of Revenue","address":"5201 Monticello Ave. Suite 5, Williamsburg, VA 23188"}},"King and Queen County, VA":{"recorder":{"name":"King and Queen County Circuit Court Clerk","address":"242 Allens Circle Suite 5, King and Queen Court House, VA 23085"},"assessor":{"name":"King and Queen County Commissioner of Revenue","address":"242 Allens Circle Suite 5, King and Queen Court House, VA 23085"}},"King George County, VA":{"recorder":{"name":"King George County Circuit Court Clerk","address":"9483 Kings Hwy Suite 2, King George, VA 22485"},"assessor":{"name":"King George County Commissioner of Revenue","address":"9483 Kings Hwy Suite 2, King George, VA 22485"}},"King William County, VA":{"recorder":{"name":"King William County Circuit Court Clerk","address":"351 Courthouse Ln. Suite 201, King William, VA 23086"},"assessor":{"name":"King William County Commissioner of Revenue","address":"351 Courthouse Ln. Suite 201, King William, VA 23086"}},"Lancaster County, VA":{"recorder":{"name":"Lancaster County Circuit Court Clerk","address":"8311 Mary Ball Rd., Lancaster, VA 22503"},"assessor":{"name":"Lancaster County Commissioner of Revenue","address":"8311 Mary Ball Rd., Lancaster, VA 22503"}},"Lee County, VA":{"recorder":{"name":"Lee County Circuit Court Clerk","address":"Main St., Jonesville, VA 24263"},"assessor":{"name":"Lee County Commissioner of Revenue","address":"Main St., Jonesville, VA 24263"}},"Loudoun County, VA":{"recorder":{"name":"Loudoun County Circuit Court Clerk","address":"18 E Market St., Leesburg, VA 20176"},"assessor":{"name":"Loudoun County Commissioner of Revenue","address":"1 Harrison St. SE MSC #31, Leesburg, VA 20175"}},"Louisa County, VA":{"recorder":{"name":"Louisa County Circuit Court Clerk","address":"100 W Main St., Louisa, VA 23093"},"assessor":{"name":"Louisa County Commissioner of Revenue","address":"100 W Main St., Louisa, VA 23093"}},"Lunenburg County, VA":{"recorder":{"name":"Lunenburg County Circuit Court Clerk","address":"11420 Courthouse Dr., Lunenburg, VA 23952"},"assessor":{"name":"Lunenburg County Commissioner of Revenue","address":"11420 Courthouse Dr., Lunenburg, VA 23952"}},"Madison County, VA":{"recorder":{"name":"Madison County Circuit Court Clerk","address":"1 Main St., Madison, VA 22727"},"assessor":{"name":"Madison County Commissioner of Revenue","address":"1 Main St., Madison, VA 22727"}},"Mathews County, VA":{"recorder":{"name":"Mathews County Circuit Court Clerk","address":"10622 Buckley Hall Rd., Mathews, VA 23109"},"assessor":{"name":"Mathews County Commissioner of Revenue","address":"10622 Buckley Hall Rd., Mathews, VA 23109"}},"Mecklenburg County, VA":{"recorder":{"name":"Mecklenburg County Circuit Court Clerk","address":"393 Washington St., Boydton, VA 23917"},"assessor":{"name":"Mecklenburg County Commissioner of Revenue","address":"393 Washington St., Boydton, VA 23917"}},"Middlesex County, VA":{"recorder":{"name":"Middlesex County Circuit Court Clerk","address":"73 Bowden St., Saluda, VA 23149"},"assessor":{"name":"Middlesex County Commissioner of Revenue","address":"73 Bowden St., Saluda, VA 23149"}},"Montgomery County, VA":{"recorder":{"name":"Montgomery County Circuit Court Clerk","address":"55 E Main St. Suite 201, Christiansburg, VA 24073"},"assessor":{"name":"Montgomery County Commissioner of Revenue","address":"755 Roanoke St. Suite 1B, Christiansburg, VA 24073"}},"Nelson County, VA":{"recorder":{"name":"Nelson County Circuit Court Clerk","address":"84 Courthouse Square, Lovingston, VA 22949"},"assessor":{"name":"Nelson County Commissioner of Revenue","address":"84 Courthouse Square, Lovingston, VA 22949"}},"New Kent County, VA":{"recorder":{"name":"New Kent County Circuit Court Clerk","address":"12001 Courthouse Circle Suite 1, New Kent, VA 23124"},"assessor":{"name":"New Kent County Commissioner of Revenue","address":"12001 Courthouse Circle Suite 1, New Kent, VA 23124"}},"Northampton County, VA":{"recorder":{"name":"Northampton County Circuit Court Clerk","address":"5229 The Hornes Ln., Eastville, VA 23347"},"assessor":{"name":"Northampton County Commissioner of Revenue","address":"5229 The Hornes Ln., Eastville, VA 23347"}},"Northumberland County, VA":{"recorder":{"name":"Northumberland County Circuit Court Clerk","address":"220 Judicial Pl. Suite 301, Heathsville, VA 22473"},"assessor":{"name":"Northumberland County Commissioner of Revenue","address":"220 Judicial Pl. Suite 301, Heathsville, VA 22473"}},"Nottoway County, VA":{"recorder":{"name":"Nottoway County Circuit Court Clerk","address":"290 W Courthouse Rd., Nottoway, VA 23955"},"assessor":{"name":"Nottoway County Commissioner of Revenue","address":"290 W Courthouse Rd., Nottoway, VA 23955"}},"Orange County, VA":{"recorder":{"name":"Orange County Circuit Court Clerk","address":"110 N Madison Rd., Orange, VA 22960"},"assessor":{"name":"Orange County Commissioner of Revenue","address":"112 W Main St., Orange, VA 22960"}},"Page County, VA":{"recorder":{"name":"Page County Circuit Court Clerk","address":"116 S Court St., Luray, VA 22835"},"assessor":{"name":"Page County Commissioner of Revenue","address":"116 S Court St., Luray, VA 22835"}},"Patrick County, VA":{"recorder":{"name":"Patrick County Circuit Court Clerk","address":"106 Rucker St., Stuart, VA 24171"},"assessor":{"name":"Patrick County Commissioner of Revenue","address":"106 Rucker St., Stuart, VA 24171"}},"Pittsylvania County, VA":{"recorder":{"name":"Pittsylvania County Circuit Court Clerk","address":"11 Bank St. Suite 201, Chatham, VA 24531"},"assessor":{"name":"Pittsylvania County Commissioner of Revenue","address":"11 Bank St. Suite 201, Chatham, VA 24531"}},"Powhatan County, VA":{"recorder":{"name":"Powhatan County Circuit Court Clerk","address":"3880 Old Buckingham Rd., Powhatan, VA 23139"},"assessor":{"name":"Powhatan County Commissioner of Revenue","address":"3880 Old Buckingham Rd., Powhatan, VA 23139"}},"Prince Edward County, VA":{"recorder":{"name":"Prince Edward County Circuit Court Clerk","address":"111 S Main St., Farmville, VA 23901"},"assessor":{"name":"Prince Edward County Commissioner of Revenue","address":"111 S Main St., Farmville, VA 23901"}},"Prince George County, VA":{"recorder":{"name":"Prince George County Circuit Court Clerk","address":"6601 Courts Dr., Prince George, VA 23875"},"assessor":{"name":"Prince George County Commissioner of Revenue","address":"6601 Courts Dr., Prince George, VA 23875"}},"Prince William County, VA":{"recorder":{"name":"Prince William County Circuit Court Clerk","address":"9311 Lee Ave., Manassas, VA 20110"},"assessor":{"name":"Prince William County Office of Finance","address":"1 County Complex Court, Prince William, VA 22192"}},"Pulaski County, VA":{"recorder":{"name":"Pulaski County Circuit Court Clerk","address":"45 3rd St. NW Suite 101, Pulaski, VA 24301"},"assessor":{"name":"Pulaski County Commissioner of Revenue","address":"143 3rd St. NW Suite 1, Pulaski, VA 24301"}},"Rappahannock County, VA":{"recorder":{"name":"Rappahannock County Circuit Court Clerk","address":"238 Gay St., Washington, VA 22747"},"assessor":{"name":"Rappahannock County Commissioner of Revenue","address":"238 Gay St., Washington, VA 22747"}},"Richmond County, VA":{"recorder":{"name":"Richmond County Circuit Court Clerk","address":"101 Court Circle, Warsaw, VA 22572"},"assessor":{"name":"Richmond County Commissioner of Revenue","address":"101 Court Circle, Warsaw, VA 22572"}},"Roanoke County, VA":{"recorder":{"name":"Roanoke County Circuit Court Clerk","address":"305 E Main St., Salem, VA 24153"},"assessor":{"name":"Roanoke County Commissioner of Revenue","address":"5204 Bernard Dr. Suite 200, Roanoke, VA 24018"}},"Rockbridge County, VA":{"recorder":{"name":"Rockbridge County Circuit Court Clerk","address":"20 S Randolph St., Lexington, VA 24450"},"assessor":{"name":"Rockbridge County Commissioner of Revenue","address":"20 S Randolph St., Lexington, VA 24450"}},"Rockingham County, VA":{"recorder":{"name":"Rockingham County Circuit Court Clerk","address":"53 Court Square, Harrisonburg, VA 22801"},"assessor":{"name":"Rockingham County Commissioner of Revenue","address":"20 E Gay St., Harrisonburg, VA 22802"}},"Russell County, VA":{"recorder":{"name":"Russell County Circuit Court Clerk","address":"55 E Main St. Suite 101, Lebanon, VA 24266"},"assessor":{"name":"Russell County Commissioner of Revenue","address":"55 E Main St. Suite 101, Lebanon, VA 24266"}},"Scott County, VA":{"recorder":{"name":"Scott County Circuit Court Clerk","address":"104 E Jackson St. Suite 2, Gate City, VA 24251"},"assessor":{"name":"Scott County Commissioner of Revenue","address":"104 E Jackson St. Suite 2, Gate City, VA 24251"}},"Shenandoah County, VA":{"recorder":{"name":"Shenandoah County Circuit Court Clerk","address":"112 S Main St., Woodstock, VA 22664"},"assessor":{"name":"Shenandoah County Commissioner of Revenue","address":"600 N Main St. Suite 101, Woodstock, VA 22664"}},"Smyth County, VA":{"recorder":{"name":"Smyth County Circuit Court Clerk","address":"109 W Main St. Room 143, Marion, VA 24354"},"assessor":{"name":"Smyth County Commissioner of Revenue","address":"109 W Main St. Room 143, Marion, VA 24354"}},"Southampton County, VA":{"recorder":{"name":"Southampton County Circuit Court Clerk","address":"22350 Main St., Courtland, VA 23837"},"assessor":{"name":"Southampton County Commissioner of Revenue","address":"22350 Main St., Courtland, VA 23837"}},"Spotsylvania County, VA":{"recorder":{"name":"Spotsylvania County Circuit Court Clerk","address":"9115 Courthouse Rd. Suite 201, Spotsylvania, VA 22553"},"assessor":{"name":"Spotsylvania County Commissioner of Revenue","address":"9104 Courthouse Rd., Spotsylvania, VA 22553"}},"Stafford County, VA":{"recorder":{"name":"Stafford County Circuit Court Clerk","address":"1300 Courthouse Rd., Stafford, VA 22554"},"assessor":{"name":"Stafford County Commissioner of Revenue","address":"1300 Courthouse Rd., Stafford, VA 22554"}},"Surry County, VA":{"recorder":{"name":"Surry County Circuit Court Clerk","address":"45 School St., Surry, VA 23883"},"assessor":{"name":"Surry County Commissioner of Revenue","address":"45 School St., Surry, VA 23883"}},"Sussex County, VA":{"recorder":{"name":"Sussex County Circuit Court Clerk","address":"15088 Courthouse Rd., Sussex, VA 23884"},"assessor":{"name":"Sussex County Commissioner of Revenue","address":"15088 Courthouse Rd., Sussex, VA 23884"}},"Tazewell County, VA":{"recorder":{"name":"Tazewell County Circuit Court Clerk","address":"101 E Main St. Suite 201, Tazewell, VA 24651"},"assessor":{"name":"Tazewell County Commissioner of Revenue","address":"108 E Main St., Tazewell, VA 24651"}},"Warren County, VA":{"recorder":{"name":"Warren County Circuit Court Clerk","address":"1 E Main St., Front Royal, VA 22630"},"assessor":{"name":"Warren County Commissioner of Revenue","address":"220 N Commerce Ave. Suite 800, Front Royal, VA 22630"}},"Washington County, VA":{"recorder":{"name":"Washington County Circuit Court Clerk","address":"205 Academy Dr. Suite 102, Abingdon, VA 24210"},"assessor":{"name":"Washington County Commissioner of Revenue","address":"205 Academy Dr. Suite 102, Abingdon, VA 24210"}},"Westmoreland County, VA":{"recorder":{"name":"Westmoreland County Circuit Court Clerk","address":"111 Polk St. Suite 9, Montross, VA 22520"},"assessor":{"name":"Westmoreland County Commissioner of Revenue","address":"111 Polk St. Suite 9, Montross, VA 22520"}},"Wise County, VA":{"recorder":{"name":"Wise County Circuit Court Clerk","address":"206 E Main St., Wise, VA 24293"},"assessor":{"name":"Wise County Commissioner of Revenue","address":"206 E Main St., Wise, VA 24293"}},"Wythe County, VA":{"recorder":{"name":"Wythe County Circuit Court Clerk","address":"225 S 4th St. Room 105, Wytheville, VA 24382"},"assessor":{"name":"Wythe County Commissioner of Revenue","address":"340 S 4th St., Wytheville, VA 24382"}},"York County, VA":{"recorder":{"name":"York County Circuit Court Clerk","address":"300 Ballard St., Yorktown, VA 23690"},"assessor":{"name":"York County Commissioner of Revenue","address":"224 Ballard St., Yorktown, VA 23690"}},"Alexandria City, VA":{"recorder":{"name":"Alexandria Circuit Court Clerk","address":"520 King St. Suite 307, Alexandria, VA 22314"},"assessor":{"name":"Alexandria Commissioner of Revenue","address":"301 King St. Room 1700, Alexandria, VA 22314"}},"Bristol City, VA":{"recorder":{"name":"Bristol Circuit Court Clerk","address":"497 Cumberland St. Suite 1, Bristol, VA 24201"},"assessor":{"name":"Bristol Commissioner of Revenue","address":"497 Cumberland St. Suite 1, Bristol, VA 24201"}},"Buena Vista City, VA":{"recorder":{"name":"Buena Vista Circuit Court Clerk","address":"2039 Sycamore Ave., Buena Vista, VA 24416"},"assessor":{"name":"Buena Vista Commissioner of Revenue","address":"2039 Sycamore Ave., Buena Vista, VA 24416"}},"Charlottesville City, VA":{"recorder":{"name":"Charlottesville Circuit Court Clerk","address":"315 E High St., Charlottesville, VA 22902"},"assessor":{"name":"Charlottesville Commissioner of Revenue","address":"605 E Main St., Charlottesville, VA 22902"}},"Chesapeake City, VA":{"recorder":{"name":"Chesapeake Circuit Court Clerk","address":"307 Albemarle Dr. Suite 300A, Chesapeake, VA 23322"},"assessor":{"name":"Chesapeake Commissioner of Revenue","address":"306 Cedar Rd., Chesapeake, VA 23322"}},"Colonial Heights City, VA":{"recorder":{"name":"Colonial Heights Circuit Court Clerk","address":"401 Temple Ave., Colonial Heights, VA 23834"},"assessor":{"name":"Colonial Heights Commissioner of Revenue","address":"401 Temple Ave., Colonial Heights, VA 23834"}},"Covington City, VA":{"recorder":{"name":"Covington Circuit Court Clerk","address":"266 W Main St., Covington, VA 24426"},"assessor":{"name":"Covington Commissioner of Revenue","address":"266 W Main St., Covington, VA 24426"}},"Danville City, VA":{"recorder":{"name":"Danville Circuit Court Clerk","address":"401 Patton St., Danville, VA 24541"},"assessor":{"name":"Danville Commissioner of Revenue","address":"427 Patton St., Danville, VA 24541"}},"Emporia City, VA":{"recorder":{"name":"Emporia Circuit Court Clerk","address":"145 N Main St., Emporia, VA 23847"},"assessor":{"name":"Emporia Commissioner of Revenue","address":"201 S Main St., Emporia, VA 23847"}},"Fairfax City, VA":{"recorder":{"name":"Fairfax City Circuit Court Clerk","address":"4000 Chain Bridge Rd., Fairfax, VA 22030"},"assessor":{"name":"Fairfax City Commissioner of Revenue","address":"10455 Armstrong St., Fairfax, VA 22030"}},"Falls Church City, VA":{"recorder":{"name":"Falls Church Circuit Court Clerk","address":"300 Park Ave. Suite 103W, Falls Church, VA 22046"},"assessor":{"name":"Falls Church Commissioner of Revenue","address":"300 Park Ave. Suite 104E, Falls Church, VA 22046"}},"Franklin City, VA":{"recorder":{"name":"Franklin Circuit Court Clerk","address":"207 W 2nd Ave., Franklin, VA 23851"},"assessor":{"name":"Franklin Commissioner of Revenue","address":"207 W 2nd Ave., Franklin, VA 23851"}},"Fredericksburg City, VA":{"recorder":{"name":"Fredericksburg Circuit Court Clerk","address":"815 Princess Anne St., Fredericksburg, VA 22401"},"assessor":{"name":"Fredericksburg Commissioner of Revenue","address":"601 Caroline St., Fredericksburg, VA 22401"}},"Galax City, VA":{"recorder":{"name":"Galax Circuit Court Clerk","address":"200 S Main St., Galax, VA 24333"},"assessor":{"name":"Galax Commissioner of Revenue","address":"200 S Main St., Galax, VA 24333"}},"Hampton City, VA":{"recorder":{"name":"Hampton Circuit Court Clerk","address":"101 Kings Way Suite 2200, Hampton, VA 23669"},"assessor":{"name":"Hampton Commissioner of Revenue","address":"1 Franklin St. Suite 100, Hampton, VA 23669"}},"Harrisonburg City, VA":{"recorder":{"name":"Harrisonburg Circuit Court Clerk","address":"53 Court Square Suite B, Harrisonburg, VA 22801"},"assessor":{"name":"Harrisonburg Commissioner of Revenue","address":"409 S Main St., Harrisonburg, VA 22801"}},"Hopewell City, VA":{"recorder":{"name":"Hopewell Circuit Court Clerk","address":"100 E Broadway Suite 256, Hopewell, VA 23860"},"assessor":{"name":"Hopewell Commissioner of Revenue","address":"300 N Main St., Hopewell, VA 23860"}},"Lexington City, VA":{"recorder":{"name":"Lexington Circuit Court Clerk","address":"2 S Main St. Suite 201, Lexington, VA 24450"},"assessor":{"name":"Lexington Commissioner of Revenue","address":"300 E Washington St., Lexington, VA 24450"}},"Lynchburg City, VA":{"recorder":{"name":"Lynchburg Circuit Court Clerk","address":"900 Court St., Lynchburg, VA 24504"},"assessor":{"name":"Lynchburg Commissioner of Revenue","address":"900 Church St. 1st Floor, Lynchburg, VA 24504"}},"Manassas City, VA":{"recorder":{"name":"Manassas Circuit Court Clerk","address":"9311 Lee Ave., Manassas, VA 20110"},"assessor":{"name":"Manassas Commissioner of Revenue","address":"9027 Center St. Suite 104, Manassas, VA 20110"}},"Manassas Park City, VA":{"recorder":{"name":"Manassas Park Circuit Court Clerk","address":"1 Park Center Ct., Manassas Park, VA 20111"},"assessor":{"name":"Manassas Park Commissioner of Revenue","address":"1 Park Center Ct., Manassas Park, VA 20111"}},"Martinsville City, VA":{"recorder":{"name":"Martinsville Circuit Court Clerk","address":"55 W Church St., Martinsville, VA 24112"},"assessor":{"name":"Martinsville Commissioner of Revenue","address":"55 W Church St., Martinsville, VA 24112"}},"Newport News City, VA":{"recorder":{"name":"Newport News Circuit Court Clerk","address":"2500 Washington Ave., Newport News, VA 23607"},"assessor":{"name":"Newport News Commissioner of Revenue","address":"2400 Washington Ave., Newport News, VA 23607"}},"Norfolk City, VA":{"recorder":{"name":"Norfolk Circuit Court Clerk","address":"150 St. Paul's Blvd. Room 202, Norfolk, VA 23510"},"assessor":{"name":"Norfolk Commissioner of Revenue","address":"810 Union St. Suite 400, Norfolk, VA 23510"}},"Norton City, VA":{"recorder":{"name":"Norton Circuit Court Clerk","address":"618 Virginia Ave. NW Suite 210, Norton, VA 24273"},"assessor":{"name":"Norton Commissioner of Revenue","address":"618 Virginia Ave. NW Suite 210, Norton, VA 24273"}},"Petersburg City, VA":{"recorder":{"name":"Petersburg Circuit Court Clerk","address":"7 Courthouse Ave. Suite 101, Petersburg, VA 23803"},"assessor":{"name":"Petersburg Commissioner of Revenue","address":"135 N Union St., Petersburg, VA 23803"}},"Poquoson City, VA":{"recorder":{"name":"Poquoson Circuit Court Clerk","address":"500 City Hall Ave., Poquoson, VA 23662"},"assessor":{"name":"Poquoson Commissioner of Revenue","address":"500 City Hall Ave., Poquoson, VA 23662"}},"Portsmouth City, VA":{"recorder":{"name":"Portsmouth Circuit Court Clerk","address":"1345 Court St., Portsmouth, VA 23704"},"assessor":{"name":"Portsmouth Commissioner of Revenue","address":"801 Crawford St., Portsmouth, VA 23704"}},"Radford City, VA":{"recorder":{"name":"Radford Circuit Court Clerk","address":"619 2nd St. Room 244, Radford, VA 24141"},"assessor":{"name":"Radford Commissioner of Revenue","address":"10 Robertson St., Radford, VA 24141"}},"Richmond City, VA":{"recorder":{"name":"Richmond Circuit Court Clerk","address":"400 N 9th St. Suite 203, Richmond, VA 23219"},"assessor":{"name":"Richmond Commissioner of Revenue","address":"900 E Broad St. Suite 100, Richmond, VA 23219"}},"Roanoke City, VA":{"recorder":{"name":"Roanoke Circuit Court Clerk","address":"315 W Church Ave. Room 450, Roanoke, VA 24016"},"assessor":{"name":"Roanoke Commissioner of Revenue","address":"215 W Church Ave. Room 254, Roanoke, VA 24011"}},"Salem City, VA":{"recorder":{"name":"Salem Circuit Court Clerk","address":"2 E Calhoun St., Salem, VA 24153"},"assessor":{"name":"Salem Commissioner of Revenue","address":"114 N Broad St., Salem, VA 24153"}},"Staunton City, VA":{"recorder":{"name":"Staunton Circuit Court Clerk","address":"113 E Beverly St. Suite 201, Staunton, VA 24401"},"assessor":{"name":"Staunton Commissioner of Revenue","address":"116 W Beverley St., Staunton, VA 24401"}},"Suffolk City, VA":{"recorder":{"name":"Suffolk Circuit Court Clerk","address":"150 N Main St., Suffolk, VA 23434"},"assessor":{"name":"Suffolk Commissioner of Revenue","address":"441 Market St., Suffolk, VA 23434"}},"Virginia Beach City, VA":{"recorder":{"name":"Virginia Beach Circuit Court Clerk","address":"2425 Nimmo Pkwy Bldg 10B, Virginia Beach, VA 23456"},"assessor":{"name":"Virginia Beach Commissioner of Revenue","address":"2401 Courthouse Dr. Bldg 1, Virginia Beach, VA 23456"}},"Waynesboro City, VA":{"recorder":{"name":"Waynesboro Circuit Court Clerk","address":"250 S Wayne Ave., Waynesboro, VA 22980"},"assessor":{"name":"Waynesboro Commissioner of Revenue","address":"503 W Main St., Waynesboro, VA 22980"}},"Williamsburg City, VA":{"recorder":{"name":"Williamsburg Circuit Court Clerk","address":"5201 Monticello Ave. Suite 5, Williamsburg, VA 23188"},"assessor":{"name":"Williamsburg Commissioner of Revenue","address":"401 Lafayette St., Williamsburg, VA 23185"}},"Winchester City, VA":{"recorder":{"name":"Winchester Circuit Court Clerk","address":"5 N Kent St., Winchester, VA 22601"},"assessor":{"name":"Winchester Commissioner of Revenue","address":"400 W Jubal Early Dr. Suite 100, Winchester, VA 22601"}},"Addison County, VT":{"recorder":{"name":"Addison County Clerk","address":"5 Court St., Middlebury, VT 05753"},"assessor":{"name":"Middlebury Town Listers","address":"77 Main St., Middlebury, VT 05753"}},"Bennington County, VT":{"recorder":{"name":"Bennington County Clerk","address":"207 South St., Bennington, VT 05201"},"assessor":{"name":"Bennington Town Listers","address":"205 South St., Bennington, VT 05201"}},"Caledonia County, VT":{"recorder":{"name":"Caledonia County Clerk","address":"27 Main St. Suite 3, St. Johnsbury, VT 05819"},"assessor":{"name":"St. Johnsbury Town Listers","address":"1187 Main St. Suite 1, St. Johnsbury, VT 05819"}},"Chittenden County, VT":{"recorder":{"name":"Chittenden County Clerk","address":"175 Main St., Burlington, VT 05401"},"assessor":{"name":"Burlington City Assessor","address":"149 Church St., Burlington, VT 05401"}},"Essex County, VT":{"recorder":{"name":"Essex County Clerk","address":"75 Court St., Guildhall, VT 05905"},"assessor":{"name":"Guildhall Town Listers","address":"75 Court St., Guildhall, VT 05905"}},"Franklin County, VT":{"recorder":{"name":"Franklin County Clerk","address":"17 Church St., St. Albans, VT 05478"},"assessor":{"name":"St. Albans Town Listers","address":"579 Lake Rd., St. Albans, VT 05478"}},"Grand Isle County, VT":{"recorder":{"name":"Grand Isle County Clerk","address":"9 Hyde Rd., North Hero, VT 05474"},"assessor":{"name":"North Hero Town Listers","address":"9 Hyde Rd., North Hero, VT 05474"}},"Lamoille County, VT":{"recorder":{"name":"Lamoille County Clerk","address":"154 Hyde Park Way, Hyde Park, VT 05655"},"assessor":{"name":"Hyde Park Town Listers","address":"454 VT Route 100, Hyde Park, VT 05655"}},"Orange County, VT":{"recorder":{"name":"Orange County Clerk","address":"5 Court St., Chelsea, VT 05038"},"assessor":{"name":"Chelsea Town Listers","address":"P.O. Box 266, Chelsea, VT 05038"}},"Orleans County, VT":{"recorder":{"name":"Orleans County Clerk","address":"247 Main St., Newport, VT 05855"},"assessor":{"name":"Newport City Assessor","address":"222 Main St., Newport, VT 05855"}},"Rutland County, VT":{"recorder":{"name":"Rutland County Clerk","address":"83 Center St., Rutland, VT 05701"},"assessor":{"name":"Rutland City Assessor","address":"1 Strongs Ave., Rutland, VT 05701"}},"Washington County, VT":{"recorder":{"name":"Washington County Clerk","address":"10 Elm St., Montpelier, VT 05602"},"assessor":{"name":"Montpelier City Assessor","address":"39 Main St., Montpelier, VT 05602"}},"Windham County, VT":{"recorder":{"name":"Windham County Clerk","address":"30 Putney Rd., Brattleboro, VT 05301"},"assessor":{"name":"Brattleboro Town Listers","address":"230 Main St. Suite 108, Brattleboro, VT 05301"}},"Windsor County, VT":{"recorder":{"name":"Windsor County Clerk","address":"12 The Green, Woodstock, VT 05091"},"assessor":{"name":"Woodstock Town Listers","address":"31 The Green, Woodstock, VT 05091"}},"Adams County, WA":{"recorder":{"name":"Adams County Auditor","address":"210 W Broadway Ave Suite 300, Ritzville, WA 99169"},"assessor":{"name":"Adams County Assessor","address":"210 W Broadway Ave Suite 200, Ritzville, WA 99169"}},"Asotin County, WA":{"recorder":{"name":"Asotin County Auditor","address":"135 2nd St., Asotin, WA 99402"},"assessor":{"name":"Asotin County Assessor","address":"135 2nd St., Asotin, WA 99402"}},"Benton County, WA":{"recorder":{"name":"Benton County Auditor","address":"620 Market St., Prosser, WA 99350"},"assessor":{"name":"Benton County Assessor","address":"620 Market St., Prosser, WA 99350"}},"Chelan County, WA":{"recorder":{"name":"Chelan County Auditor","address":"350 Orondo Ave., Wenatchee, WA 98801"},"assessor":{"name":"Chelan County Assessor","address":"350 Orondo Ave., Wenatchee, WA 98801"}},"Clallam County, WA":{"recorder":{"name":"Clallam County Auditor","address":"223 E 4th St. Suite 1, Port Angeles, WA 98362"},"assessor":{"name":"Clallam County Assessor","address":"223 E 4th St. Suite 4, Port Angeles, WA 98362"}},"Clark County, WA":{"recorder":{"name":"Clark County Auditor","address":"1408 Franklin St., Vancouver, WA 98660"},"assessor":{"name":"Clark County Assessor","address":"1300 Franklin St. Suite 650, Vancouver, WA 98660"}},"Columbia County, WA":{"recorder":{"name":"Columbia County Auditor","address":"341 E Main St., Dayton, WA 99328"},"assessor":{"name":"Columbia County Assessor","address":"341 E Main St., Dayton, WA 99328"}},"Cowlitz County, WA":{"recorder":{"name":"Cowlitz County Auditor","address":"207 4th Ave N., Kelso, WA 98626"},"assessor":{"name":"Cowlitz County Assessor","address":"207 4th Ave N. Room 201, Kelso, WA 98626"}},"Douglas County, WA":{"recorder":{"name":"Douglas County Auditor","address":"203 Rainier St., Waterville, WA 98858"},"assessor":{"name":"Douglas County Assessor","address":"203 Rainier St., Waterville, WA 98858"}},"Ferry County, WA":{"recorder":{"name":"Ferry County Auditor","address":"350 E Delaware Ave Suite 11, Republic, WA 99166"},"assessor":{"name":"Ferry County Assessor","address":"350 E Delaware Ave Suite 18, Republic, WA 99166"}},"Franklin County, WA":{"recorder":{"name":"Franklin County Auditor","address":"1016 N 4th Ave., Pasco, WA 99301"},"assessor":{"name":"Franklin County Assessor","address":"1016 N 4th Ave., Pasco, WA 99301"}},"Garfield County, WA":{"recorder":{"name":"Garfield County Auditor","address":"789 Main St., Pomeroy, WA 99347"},"assessor":{"name":"Garfield County Assessor","address":"789 Main St., Pomeroy, WA 99347"}},"Grant County, WA":{"recorder":{"name":"Grant County Auditor","address":"35 C St NW, Ephrata, WA 98823"},"assessor":{"name":"Grant County Assessor","address":"35 C St NW, Ephrata, WA 98823"}},"Grays Harbor County, WA":{"recorder":{"name":"Grays Harbor County Auditor","address":"100 W Broadway Suite 3, Montesano, WA 98563"},"assessor":{"name":"Grays Harbor County Assessor","address":"100 W Broadway Suite 4, Montesano, WA 98563"}},"Island County, WA":{"recorder":{"name":"Island County Auditor","address":"1 NE 7th St. Suite 103, Coupeville, WA 98239"},"assessor":{"name":"Island County Assessor","address":"1 NE 7th St. Suite 111, Coupeville, WA 98239"}},"Jefferson County, WA":{"recorder":{"name":"Jefferson County Auditor","address":"1820 Jefferson St., Port Townsend, WA 98368"},"assessor":{"name":"Jefferson County Assessor","address":"1820 Jefferson St., Port Townsend, WA 98368"}},"King County, WA":{"recorder":{"name":"King County Records & Licensing Services","address":"500 4th Ave Room 311, Seattle, WA 98104"},"assessor":{"name":"King County Assessor","address":"500 4th Ave Suite 700, Seattle, WA 98104"}},"Kitsap County, WA":{"recorder":{"name":"Kitsap County Auditor","address":"614 Division St. MS-31, Port Orchard, WA 98366"},"assessor":{"name":"Kitsap County Assessor","address":"614 Division St. MS-22, Port Orchard, WA 98366"}},"Kittitas County, WA":{"recorder":{"name":"Kittitas County Auditor","address":"205 W 5th Ave Suite 104, Ellensburg, WA 98926"},"assessor":{"name":"Kittitas County Assessor","address":"205 W 5th Ave Suite 101, Ellensburg, WA 98926"}},"Klickitat County, WA":{"recorder":{"name":"Klickitat County Auditor","address":"205 S Columbus Ave, Goldendale, WA 98620"},"assessor":{"name":"Klickitat County Assessor","address":"205 S Columbus Ave, Goldendale, WA 98620"}},"Lewis County, WA":{"recorder":{"name":"Lewis County Auditor","address":"351 NW North St. MS-ADR01, Chehalis, WA 98532"},"assessor":{"name":"Lewis County Assessor","address":"351 NW North St., Chehalis, WA 98532"}},"Lincoln County, WA":{"recorder":{"name":"Lincoln County Auditor","address":"450 Logan St., Davenport, WA 99122"},"assessor":{"name":"Lincoln County Assessor","address":"450 Logan St., Davenport, WA 99122"}},"Mason County, WA":{"recorder":{"name":"Mason County Auditor","address":"411 N 5th St., Shelton, WA 98584"},"assessor":{"name":"Mason County Assessor","address":"411 N 5th St., Shelton, WA 98584"}},"Okanogan County, WA":{"recorder":{"name":"Okanogan County Auditor","address":"149 3rd N Suite 1, Okanogan, WA 98840"},"assessor":{"name":"Okanogan County Assessor","address":"149 3rd N Suite 2, Okanogan, WA 98840"}},"Pacific County, WA":{"recorder":{"name":"Pacific County Auditor","address":"300 Memorial Dr., South Bend, WA 98586"},"assessor":{"name":"Pacific County Assessor","address":"300 Memorial Dr., South Bend, WA 98586"}},"Pend Oreille County, WA":{"recorder":{"name":"Pend Oreille County Auditor","address":"625 W 4th St., Newport, WA 99156"},"assessor":{"name":"Pend Oreille County Assessor","address":"625 W 4th St., Newport, WA 99156"}},"Pierce County, WA":{"recorder":{"name":"Pierce County Auditor","address":"2401 S 35th St., Tacoma, WA 98409"},"assessor":{"name":"Pierce County Assessor","address":"2401 S 35th St., Tacoma, WA 98409"}},"San Juan County, WA":{"recorder":{"name":"San Juan County Auditor","address":"350 Court St Suite 6, Friday Harbor, WA 98250"},"assessor":{"name":"San Juan County Assessor","address":"350 Court St Suite 9, Friday Harbor, WA 98250"}},"Skagit County, WA":{"recorder":{"name":"Skagit County Auditor","address":"700 S 2nd St Suite 105, Mount Vernon, WA 98273"},"assessor":{"name":"Skagit County Assessor","address":"700 S 2nd St Suite 204, Mount Vernon, WA 98273"}},"Skamania County, WA":{"recorder":{"name":"Skamania County Auditor","address":"240 Vancouver Ave., Stevenson, WA 98648"},"assessor":{"name":"Skamania County Assessor","address":"240 Vancouver Ave., Stevenson, WA 98648"}},"Snohomish County, WA":{"recorder":{"name":"Snohomish County Auditor","address":"3000 Rockefeller Ave. M/S 204, Everett, WA 98201"},"assessor":{"name":"Snohomish County Assessor","address":"3000 Rockefeller Ave. M/S 510, Everett, WA 98201"}},"Spokane County, WA":{"recorder":{"name":"Spokane County Auditor","address":"1116 W Broadway Ave, Spokane, WA 99260"},"assessor":{"name":"Spokane County Assessor","address":"824 N Adams St., Spokane, WA 99260"}},"Stevens County, WA":{"recorder":{"name":"Stevens County Auditor","address":"215 S Oak St. Room 106, Colville, WA 99114"},"assessor":{"name":"Stevens County Assessor","address":"215 S Oak St. Room 108, Colville, WA 99114"}},"Thurston County, WA":{"recorder":{"name":"Thurston County Auditor","address":"2000 Lakeridge Dr. SW Bldg 1, Olympia, WA 98502"},"assessor":{"name":"Thurston County Assessor","address":"2000 Lakeridge Dr. SW Bldg 1, Olympia, WA 98502"}},"Wahkiakum County, WA":{"recorder":{"name":"Wahkiakum County Auditor","address":"64 Main St., Cathlamet, WA 98612"},"assessor":{"name":"Wahkiakum County Assessor","address":"64 Main St., Cathlamet, WA 98612"}},"Walla Walla County, WA":{"recorder":{"name":"Walla Walla County Auditor","address":"315 W Main St Suite 201, Walla Walla, WA 99362"},"assessor":{"name":"Walla Walla County Assessor","address":"315 W Main St Suite 100, Walla Walla, WA 99362"}},"Whatcom County, WA":{"recorder":{"name":"Whatcom County Auditor","address":"311 Grand Ave Suite 103, Bellingham, WA 98225"},"assessor":{"name":"Whatcom County Assessor","address":"311 Grand Ave Suite 104, Bellingham, WA 98225"}},"Whitman County, WA":{"recorder":{"name":"Whitman County Auditor","address":"400 N Main St., Colfax, WA 99111"},"assessor":{"name":"Whitman County Assessor","address":"400 N Main St., Colfax, WA 99111"}},"Yakima County, WA":{"recorder":{"name":"Yakima County Auditor","address":"128 N 2nd St Room 117, Yakima, WA 98901"},"assessor":{"name":"Yakima County Assessor","address":"128 N 2nd St Room 112, Yakima, WA 98901"}},"Adams County, WI":{"recorder":{"name":"Adams County Register of Deeds","address":"402 Main St., Friendship, WI 53934"},"assessor":{"name":"Adams County Land Information","address":"402 Main St., Friendship, WI 53934"}},"Ashland County, WI":{"recorder":{"name":"Ashland County Register of Deeds","address":"201 W Main St., Ashland, WI 54806"},"assessor":{"name":"Ashland County Land Information","address":"201 W Main St., Ashland, WI 54806"}},"Barron County, WI":{"recorder":{"name":"Barron County Register of Deeds","address":"330 E LaSalle Ave., Barron, WI 54812"},"assessor":{"name":"Barron County Land Information","address":"330 E LaSalle Ave., Barron, WI 54812"}},"Bayfield County, WI":{"recorder":{"name":"Bayfield County Register of Deeds","address":"117 E 5th St., Washburn, WI 54891"},"assessor":{"name":"Bayfield County Land Information","address":"117 E 5th St., Washburn, WI 54891"}},"Brown County, WI":{"recorder":{"name":"Brown County Register of Deeds","address":"305 E Walnut St. Suite 100, Green Bay, WI 54301"},"assessor":{"name":"Brown County Land Information","address":"305 E Walnut St. Suite 100, Green Bay, WI 54301"}},"Buffalo County, WI":{"recorder":{"name":"Buffalo County Register of Deeds","address":"407 S 2nd St., Alma, WI 54610"},"assessor":{"name":"Buffalo County Land Information","address":"407 S 2nd St., Alma, WI 54610"}},"Burnett County, WI":{"recorder":{"name":"Burnett County Register of Deeds","address":"7410 County Rd K Suite 107, Siren, WI 54872"},"assessor":{"name":"Burnett County Land Information","address":"7410 County Rd K Suite 107, Siren, WI 54872"}},"Calumet County, WI":{"recorder":{"name":"Calumet County Register of Deeds","address":"206 Court St., Chilton, WI 53014"},"assessor":{"name":"Calumet County Land Information","address":"206 Court St., Chilton, WI 53014"}},"Chippewa County, WI":{"recorder":{"name":"Chippewa County Register of Deeds","address":"711 N Bridge St., Chippewa Falls, WI 54729"},"assessor":{"name":"Chippewa County Land Information","address":"711 N Bridge St., Chippewa Falls, WI 54729"}},"Clark County, WI":{"recorder":{"name":"Clark County Register of Deeds","address":"517 Court St. Room 406, Neillsville, WI 54456"},"assessor":{"name":"Clark County Land Information","address":"517 Court St. Room 406, Neillsville, WI 54456"}},"Columbia County, WI":{"recorder":{"name":"Columbia County Register of Deeds","address":"400 DeWitt St., Portage, WI 53901"},"assessor":{"name":"Columbia County Land Information","address":"400 DeWitt St., Portage, WI 53901"}},"Crawford County, WI":{"recorder":{"name":"Crawford County Register of Deeds","address":"225 N Beaumont Rd., Prairie du Chien, WI 53821"},"assessor":{"name":"Crawford County Land Information","address":"225 N Beaumont Rd., Prairie du Chien, WI 53821"}},"Dane County, WI":{"recorder":{"name":"Dane County Register of Deeds","address":"210 Martin Luther King Jr Blvd Room 110, Madison, WI 53703"},"assessor":{"name":"Dane County Land Information","address":"210 Martin Luther King Jr Blvd Room 110, Madison, WI 53703"}},"Dodge County, WI":{"recorder":{"name":"Dodge County Register of Deeds","address":"127 E Oak St., Juneau, WI 53039"},"assessor":{"name":"Dodge County Land Information","address":"127 E Oak St., Juneau, WI 53039"}},"Door County, WI":{"recorder":{"name":"Door County Register of Deeds","address":"421 Nebraska St., Sturgeon Bay, WI 54235"},"assessor":{"name":"Door County Land Information","address":"421 Nebraska St., Sturgeon Bay, WI 54235"}},"Douglas County, WI":{"recorder":{"name":"Douglas County Register of Deeds","address":"1313 Belknap St. Room 201, Superior, WI 54880"},"assessor":{"name":"Douglas County Land Information","address":"1313 Belknap St. Room 201, Superior, WI 54880"}},"Dunn County, WI":{"recorder":{"name":"Dunn County Register of Deeds","address":"800 Wilson Ave., Menomonie, WI 54751"},"assessor":{"name":"Dunn County Land Information","address":"800 Wilson Ave., Menomonie, WI 54751"}},"Eau Claire County, WI":{"recorder":{"name":"Eau Claire County Register of Deeds","address":"721 Oxford Ave., Eau Claire, WI 54703"},"assessor":{"name":"Eau Claire County Land Information","address":"721 Oxford Ave., Eau Claire, WI 54703"}},"Florence County, WI":{"recorder":{"name":"Florence County Register of Deeds","address":"501 Lake Ave., Florence, WI 54121"},"assessor":{"name":"Florence County Land Information","address":"501 Lake Ave., Florence, WI 54121"}},"Fond du Lac County, WI":{"recorder":{"name":"Fond du Lac County Register of Deeds","address":"160 S Macy St., Fond du Lac, WI 54935"},"assessor":{"name":"Fond du Lac County Land Information","address":"160 S Macy St., Fond du Lac, WI 54935"}},"Forest County, WI":{"recorder":{"name":"Forest County Register of Deeds","address":"200 E Madison St., Crandon, WI 54520"},"assessor":{"name":"Forest County Land Information","address":"200 E Madison St., Crandon, WI 54520"}},"Grant County, WI":{"recorder":{"name":"Grant County Register of Deeds","address":"130 W Maple St., Lancaster, WI 53813"},"assessor":{"name":"Grant County Land Information","address":"130 W Maple St., Lancaster, WI 53813"}},"Green County, WI":{"recorder":{"name":"Green County Register of Deeds","address":"1016 16th Ave., Monroe, WI 53566"},"assessor":{"name":"Green County Land Information","address":"1016 16th Ave., Monroe, WI 53566"}},"Green Lake County, WI":{"recorder":{"name":"Green Lake County Register of Deeds","address":"571 County Rd A, Green Lake, WI 54941"},"assessor":{"name":"Green Lake County Land Information","address":"571 County Rd A, Green Lake, WI 54941"}},"Iowa County, WI":{"recorder":{"name":"Iowa County Register of Deeds","address":"222 N Iowa St., Dodgeville, WI 53533"},"assessor":{"name":"Iowa County Land Information","address":"222 N Iowa St., Dodgeville, WI 53533"}},"Iron County, WI":{"recorder":{"name":"Iron County Register of Deeds","address":"300 Taconite St. Suite 101, Hurley, WI 54534"},"assessor":{"name":"Iron County Land Information","address":"300 Taconite St. Suite 101, Hurley, WI 54534"}},"Jackson County, WI":{"recorder":{"name":"Jackson County Register of Deeds","address":"307 Main St., Black River Falls, WI 54615"},"assessor":{"name":"Jackson County Land Information","address":"307 Main St., Black River Falls, WI 54615"}},"Jefferson County, WI":{"recorder":{"name":"Jefferson County Register of Deeds","address":"311 S Center Ave., Jefferson, WI 53549"},"assessor":{"name":"Jefferson County Land Information","address":"311 S Center Ave., Jefferson, WI 53549"}},"Juneau County, WI":{"recorder":{"name":"Juneau County Register of Deeds","address":"220 E State St., Mauston, WI 53948"},"assessor":{"name":"Juneau County Land Information","address":"220 E State St., Mauston, WI 53948"}},"Kenosha County, WI":{"recorder":{"name":"Kenosha County Register of Deeds","address":"1010 56th St., Kenosha, WI 53140"},"assessor":{"name":"Kenosha County Land Information","address":"1010 56th St., Kenosha, WI 53140"}},"Kewaunee County, WI":{"recorder":{"name":"Kewaunee County Register of Deeds","address":"613 Dodge St., Kewaunee, WI 54216"},"assessor":{"name":"Kewaunee County Land Information","address":"613 Dodge St., Kewaunee, WI 54216"}},"La Crosse County, WI":{"recorder":{"name":"La Crosse County Register of Deeds","address":"212 6th St. N, La Crosse, WI 54601"},"assessor":{"name":"La Crosse County Land Information","address":"212 6th St. N, La Crosse, WI 54601"}},"Lafayette County, WI":{"recorder":{"name":"Lafayette County Register of Deeds","address":"626 Main St., Darlington, WI 53530"},"assessor":{"name":"Lafayette County Land Information","address":"626 Main St., Darlington, WI 53530"}},"Langlade County, WI":{"recorder":{"name":"Langlade County Register of Deeds","address":"800 Clermont St., Antigo, WI 54409"},"assessor":{"name":"Langlade County Land Information","address":"800 Clermont St., Antigo, WI 54409"}},"Lincoln County, WI":{"recorder":{"name":"Lincoln County Register of Deeds","address":"1110 E Main St. Suite 205, Merrill, WI 54452"},"assessor":{"name":"Lincoln County Land Information","address":"1110 E Main St. Suite 205, Merrill, WI 54452"}},"Manitowoc County, WI":{"recorder":{"name":"Manitowoc County Register of Deeds","address":"1010 S 8th St., Manitowoc, WI 54220"},"assessor":{"name":"Manitowoc County Land Information","address":"1010 S 8th St., Manitowoc, WI 54220"}},"Marathon County, WI":{"recorder":{"name":"Marathon County Register of Deeds","address":"500 Forest St., Wausau, WI 54403"},"assessor":{"name":"Marathon County Land Information","address":"500 Forest St., Wausau, WI 54403"}},"Marinette County, WI":{"recorder":{"name":"Marinette County Register of Deeds","address":"1926 Hall Ave., Marinette, WI 54143"},"assessor":{"name":"Marinette County Land Information","address":"1926 Hall Ave., Marinette, WI 54143"}},"Marquette County, WI":{"recorder":{"name":"Marquette County Register of Deeds","address":"77 W Park St., Montello, WI 53949"},"assessor":{"name":"Marquette County Land Information","address":"77 W Park St., Montello, WI 53949"}},"Menominee County, WI":{"recorder":{"name":"Menominee County Register of Deeds","address":"W3269 Courthouse Ln., Keshena, WI 54135"},"assessor":{"name":"Menominee County Land Information","address":"W3269 Courthouse Ln., Keshena, WI 54135"}},"Milwaukee County, WI":{"recorder":{"name":"Milwaukee County Register of Deeds","address":"901 N 9th St. Room 103, Milwaukee, WI 53233"},"assessor":{"name":"Milwaukee County Land Information","address":"901 N 9th St. Room 103, Milwaukee, WI 53233"}},"Monroe County, WI":{"recorder":{"name":"Monroe County Register of Deeds","address":"202 S K St. Suite 1, Sparta, WI 54656"},"assessor":{"name":"Monroe County Land Information","address":"202 S K St. Suite 1, Sparta, WI 54656"}},"Oconto County, WI":{"recorder":{"name":"Oconto County Register of Deeds","address":"301 Washington St., Oconto, WI 54153"},"assessor":{"name":"Oconto County Land Information","address":"301 Washington St., Oconto, WI 54153"}},"Oneida County, WI":{"recorder":{"name":"Oneida County Register of Deeds","address":"1 S Oneida Ave., Rhinelander, WI 54501"},"assessor":{"name":"Oneida County Land Information","address":"1 S Oneida Ave., Rhinelander, WI 54501"}},"Outagamie County, WI":{"recorder":{"name":"Outagamie County Register of Deeds","address":"410 S Walnut St., Appleton, WI 54911"},"assessor":{"name":"Outagamie County Land Information","address":"410 S Walnut St., Appleton, WI 54911"}},"Ozaukee County, WI":{"recorder":{"name":"Ozaukee County Register of Deeds","address":"121 W Main St., Port Washington, WI 53074"},"assessor":{"name":"Ozaukee County Land Information","address":"121 W Main St., Port Washington, WI 53074"}},"Pepin County, WI":{"recorder":{"name":"Pepin County Register of Deeds","address":"740 7th Ave W, Durand, WI 54736"},"assessor":{"name":"Pepin County Land Information","address":"740 7th Ave W, Durand, WI 54736"}},"Pierce County, WI":{"recorder":{"name":"Pierce County Register of Deeds","address":"414 W Main St., Ellsworth, WI 54011"},"assessor":{"name":"Pierce County Land Information","address":"414 W Main St., Ellsworth, WI 54011"}},"Polk County, WI":{"recorder":{"name":"Polk County Register of Deeds","address":"100 Polk County Plaza Suite 110, Balsam Lake, WI 54810"},"assessor":{"name":"Polk County Land Information","address":"100 Polk County Plaza Suite 110, Balsam Lake, WI 54810"}},"Portage County, WI":{"recorder":{"name":"Portage County Register of Deeds","address":"1516 Church St., Stevens Point, WI 54481"},"assessor":{"name":"Portage County Land Information","address":"1516 Church St., Stevens Point, WI 54481"}},"Price County, WI":{"recorder":{"name":"Price County Register of Deeds","address":"126 Cherry St., Phillips, WI 54555"},"assessor":{"name":"Price County Land Information","address":"126 Cherry St., Phillips, WI 54555"}},"Racine County, WI":{"recorder":{"name":"Racine County Register of Deeds","address":"730 Wisconsin Ave., Racine, WI 53403"},"assessor":{"name":"Racine County Land Information","address":"730 Wisconsin Ave., Racine, WI 53403"}},"Richland County, WI":{"recorder":{"name":"Richland County Register of Deeds","address":"181 W Seminary St., Richland Center, WI 53581"},"assessor":{"name":"Richland County Land Information","address":"181 W Seminary St., Richland Center, WI 53581"}},"Rock County, WI":{"recorder":{"name":"Rock County Register of Deeds","address":"51 S Main St., Janesville, WI 53545"},"assessor":{"name":"Rock County Land Information","address":"51 S Main St., Janesville, WI 53545"}},"Rusk County, WI":{"recorder":{"name":"Rusk County Register of Deeds","address":"311 Miner Ave E Suite C150, Ladysmith, WI 54848"},"assessor":{"name":"Rusk County Land Information","address":"311 Miner Ave E Suite C150, Ladysmith, WI 54848"}},"Sauk County, WI":{"recorder":{"name":"Sauk County Register of Deeds","address":"505 Broadway Suite 114, Baraboo, WI 53913"},"assessor":{"name":"Sauk County Land Information","address":"505 Broadway Suite 114, Baraboo, WI 53913"}},"Sawyer County, WI":{"recorder":{"name":"Sawyer County Register of Deeds","address":"10610 Main St. Suite 10, Hayward, WI 54843"},"assessor":{"name":"Sawyer County Land Information","address":"10610 Main St. Suite 10, Hayward, WI 54843"}},"Shawano County, WI":{"recorder":{"name":"Shawano County Register of Deeds","address":"311 N Main St., Shawano, WI 54166"},"assessor":{"name":"Shawano County Land Information","address":"311 N Main St., Shawano, WI 54166"}},"Sheboygan County, WI":{"recorder":{"name":"Sheboygan County Register of Deeds","address":"508 New York Ave., Sheboygan, WI 53081"},"assessor":{"name":"Sheboygan County Land Information","address":"508 New York Ave., Sheboygan, WI 53081"}},"St. Croix County, WI":{"recorder":{"name":"St. Croix County Register of Deeds","address":"1101 Carmichael Rd., Hudson, WI 54016"},"assessor":{"name":"St. Croix County Land Information","address":"1101 Carmichael Rd., Hudson, WI 54016"}},"Taylor County, WI":{"recorder":{"name":"Taylor County Register of Deeds","address":"224 S 2nd St., Medford, WI 54451"},"assessor":{"name":"Taylor County Land Information","address":"224 S 2nd St., Medford, WI 54451"}},"Trempealeau County, WI":{"recorder":{"name":"Trempealeau County Register of Deeds","address":"36245 Main St., Whitehall, WI 54773"},"assessor":{"name":"Trempealeau County Land Information","address":"36245 Main St., Whitehall, WI 54773"}},"Vernon County, WI":{"recorder":{"name":"Vernon County Register of Deeds","address":"400 Courthouse Square, Viroqua, WI 54665"},"assessor":{"name":"Vernon County Land Information","address":"400 Courthouse Square, Viroqua, WI 54665"}},"Vilas County, WI":{"recorder":{"name":"Vilas County Register of Deeds","address":"330 Court St., Eagle River, WI 54521"},"assessor":{"name":"Vilas County Land Information","address":"330 Court St., Eagle River, WI 54521"}},"Walworth County, WI":{"recorder":{"name":"Walworth County Register of Deeds","address":"100 W Walworth St., Elkhorn, WI 53121"},"assessor":{"name":"Walworth County Land Information","address":"100 W Walworth St., Elkhorn, WI 53121"}},"Washburn County, WI":{"recorder":{"name":"Washburn County Register of Deeds","address":"10 4th Ave., Shell Lake, WI 54871"},"assessor":{"name":"Washburn County Land Information","address":"10 4th Ave., Shell Lake, WI 54871"}},"Washington County, WI":{"recorder":{"name":"Washington County Register of Deeds","address":"432 E Washington St. Room 1073, West Bend, WI 53095"},"assessor":{"name":"Washington County Land Information","address":"432 E Washington St. Room 1073, West Bend, WI 53095"}},"Waukesha County, WI":{"recorder":{"name":"Waukesha County Register of Deeds","address":"515 W Moreland Blvd. Room AC150, Waukesha, WI 53188"},"assessor":{"name":"Waukesha County Land Information","address":"515 W Moreland Blvd. Room AC150, Waukesha, WI 53188"}},"Waupaca County, WI":{"recorder":{"name":"Waupaca County Register of Deeds","address":"811 Harding St., Waupaca, WI 54981"},"assessor":{"name":"Waupaca County Land Information","address":"811 Harding St., Waupaca, WI 54981"}},"Waushara County, WI":{"recorder":{"name":"Waushara County Register of Deeds","address":"209 S Saint Marie St., Wautoma, WI 54982"},"assessor":{"name":"Waushara County Land Information","address":"209 S Saint Marie St., Wautoma, WI 54982"}},"Winnebago County, WI":{"recorder":{"name":"Winnebago County Register of Deeds","address":"415 Jackson St., Oshkosh, WI 54901"},"assessor":{"name":"Winnebago County Land Information","address":"415 Jackson St., Oshkosh, WI 54901"}},"Wood County, WI":{"recorder":{"name":"Wood County Register of Deeds","address":"400 Market St., Wisconsin Rapids, WI 54494"},"assessor":{"name":"Wood County Land Information","address":"400 Market St., Wisconsin Rapids, WI 54494"}},"Barbour County, WV":{"recorder":{"name":"Barbour County Clerk","address":"8 N Main St. Suite 1, Philippi, WV 26416"},"assessor":{"name":"Barbour County Assessor","address":"8 N Main St. Suite 1, Philippi, WV 26416"}},"Berkeley County, WV":{"recorder":{"name":"Berkeley County Clerk","address":"100 W King St. Suite 2, Martinsburg, WV 25401"},"assessor":{"name":"Berkeley County Assessor","address":"400 W Stephen St. Suite 209, Martinsburg, WV 25401"}},"Boone County, WV":{"recorder":{"name":"Boone County Clerk","address":"200 State St. Suite 4, Madison, WV 25130"},"assessor":{"name":"Boone County Assessor","address":"200 State St. Suite 4, Madison, WV 25130"}},"Braxton County, WV":{"recorder":{"name":"Braxton County Clerk","address":"300 Main St., Sutton, WV 26601"},"assessor":{"name":"Braxton County Assessor","address":"300 Main St., Sutton, WV 26601"}},"Brooke County, WV":{"recorder":{"name":"Brooke County Clerk","address":"632 Main St., Wellsburg, WV 26070"},"assessor":{"name":"Brooke County Assessor","address":"632 Main St., Wellsburg, WV 26070"}},"Cabell County, WV":{"recorder":{"name":"Cabell County Clerk","address":"750 5th Ave. Room 108, Huntington, WV 25701"},"assessor":{"name":"Cabell County Assessor","address":"750 5th Ave. Room 108, Huntington, WV 25701"}},"Calhoun County, WV":{"recorder":{"name":"Calhoun County Clerk","address":"Court St., Grantsville, WV 26147"},"assessor":{"name":"Calhoun County Assessor","address":"Court St., Grantsville, WV 26147"}},"Clay County, WV":{"recorder":{"name":"Clay County Clerk","address":"246 Main St., Clay, WV 25043"},"assessor":{"name":"Clay County Assessor","address":"246 Main St., Clay, WV 25043"}},"Doddridge County, WV":{"recorder":{"name":"Doddridge County Clerk","address":"118 E Court St., West Union, WV 26456"},"assessor":{"name":"Doddridge County Assessor","address":"118 E Court St., West Union, WV 26456"}},"Fayette County, WV":{"recorder":{"name":"Fayette County Clerk","address":"100 Court St. Suite 302, Fayetteville, WV 25840"},"assessor":{"name":"Fayette County Assessor","address":"100 Court St. Suite 302, Fayetteville, WV 25840"}},"Gilmer County, WV":{"recorder":{"name":"Gilmer County Clerk","address":"10 Howard St., Glenville, WV 26351"},"assessor":{"name":"Gilmer County Assessor","address":"10 Howard St., Glenville, WV 26351"}},"Grant County, WV":{"recorder":{"name":"Grant County Clerk","address":"5 Highland Ave., Petersburg, WV 26847"},"assessor":{"name":"Grant County Assessor","address":"5 Highland Ave., Petersburg, WV 26847"}},"Greenbrier County, WV":{"recorder":{"name":"Greenbrier County Clerk","address":"912 N Court St., Lewisburg, WV 24901"},"assessor":{"name":"Greenbrier County Assessor","address":"912 N Court St., Lewisburg, WV 24901"}},"Hampshire County, WV":{"recorder":{"name":"Hampshire County Clerk","address":"66 N High St. Suite 3, Romney, WV 26757"},"assessor":{"name":"Hampshire County Assessor","address":"66 N High St. Suite 3, Romney, WV 26757"}},"Hancock County, WV":{"recorder":{"name":"Hancock County Clerk","address":"102 N Court St., New Cumberland, WV 26047"},"assessor":{"name":"Hancock County Assessor","address":"102 N Court St., New Cumberland, WV 26047"}},"Hardy County, WV":{"recorder":{"name":"Hardy County Clerk","address":"204 Washington St. Suite 6, Moorefield, WV 26836"},"assessor":{"name":"Hardy County Assessor","address":"204 Washington St. Suite 6, Moorefield, WV 26836"}},"Harrison County, WV":{"recorder":{"name":"Harrison County Clerk","address":"301 W Main St. Suite 10, Clarksburg, WV 26301"},"assessor":{"name":"Harrison County Assessor","address":"301 W Main St. Suite 10, Clarksburg, WV 26301"}},"Jackson County, WV":{"recorder":{"name":"Jackson County Clerk","address":"200 Main St. Suite 100, Ripley, WV 25271"},"assessor":{"name":"Jackson County Assessor","address":"200 Main St. Suite 100, Ripley, WV 25271"}},"Jefferson County, WV":{"recorder":{"name":"Jefferson County Clerk","address":"100 E Washington St. Suite 200, Charles Town, WV 25414"},"assessor":{"name":"Jefferson County Assessor","address":"100 E Washington St. Suite 200, Charles Town, WV 25414"}},"Kanawha County, WV":{"recorder":{"name":"Kanawha County Clerk","address":"409 Virginia St. E Suite 120, Charleston, WV 25301"},"assessor":{"name":"Kanawha County Assessor","address":"409 Virginia St. E Suite 120, Charleston, WV 25301"}},"Lewis County, WV":{"recorder":{"name":"Lewis County Clerk","address":"110 Center Ave. Suite 1, Weston, WV 26452"},"assessor":{"name":"Lewis County Assessor","address":"110 Center Ave. Suite 1, Weston, WV 26452"}},"Lincoln County, WV":{"recorder":{"name":"Lincoln County Clerk","address":"8000 Court Ave., Hamlin, WV 25523"},"assessor":{"name":"Lincoln County Assessor","address":"8000 Court Ave., Hamlin, WV 25523"}},"Logan County, WV":{"recorder":{"name":"Logan County Clerk","address":"300 Stratton St. Room 203, Logan, WV 25601"},"assessor":{"name":"Logan County Assessor","address":"300 Stratton St. Room 203, Logan, WV 25601"}},"Marion County, WV":{"recorder":{"name":"Marion County Clerk","address":"200 Jackson St. Suite 202, Fairmont, WV 26554"},"assessor":{"name":"Marion County Assessor","address":"200 Jackson St. Suite 202, Fairmont, WV 26554"}},"Marshall County, WV":{"recorder":{"name":"Marshall County Clerk","address":"600 7th St., Moundsville, WV 26041"},"assessor":{"name":"Marshall County Assessor","address":"600 7th St., Moundsville, WV 26041"}},"Mason County, WV":{"recorder":{"name":"Mason County Clerk","address":"200 6th St., Point Pleasant, WV 25550"},"assessor":{"name":"Mason County Assessor","address":"200 6th St., Point Pleasant, WV 25550"}},"McDowell County, WV":{"recorder":{"name":"McDowell County Clerk","address":"90 Wyoming St. Suite 109, Welch, WV 24801"},"assessor":{"name":"McDowell County Assessor","address":"90 Wyoming St. Suite 109, Welch, WV 24801"}},"Mercer County, WV":{"recorder":{"name":"Mercer County Clerk","address":"1501 W Main St. Suite 115, Princeton, WV 24740"},"assessor":{"name":"Mercer County Assessor","address":"1501 W Main St. Suite 115, Princeton, WV 24740"}},"Mineral County, WV":{"recorder":{"name":"Mineral County Clerk","address":"150 Armstrong St., Keyser, WV 26726"},"assessor":{"name":"Mineral County Assessor","address":"150 Armstrong St., Keyser, WV 26726"}},"Mingo County, WV":{"recorder":{"name":"Mingo County Clerk","address":"75 E 2nd Ave. Suite 117, Williamson, WV 25661"},"assessor":{"name":"Mingo County Assessor","address":"75 E 2nd Ave. Suite 117, Williamson, WV 25661"}},"Monongalia County, WV":{"recorder":{"name":"Monongalia County Clerk","address":"243 High St. Room 123, Morgantown, WV 26505"},"assessor":{"name":"Monongalia County Assessor","address":"243 High St. Room 123, Morgantown, WV 26505"}},"Monroe County, WV":{"recorder":{"name":"Monroe County Clerk","address":"200 Main St., Union, WV 24983"},"assessor":{"name":"Monroe County Assessor","address":"200 Main St., Union, WV 24983"}},"Morgan County, WV":{"recorder":{"name":"Morgan County Clerk","address":"77 Fairfax St. Room 104, Berkeley Springs, WV 25411"},"assessor":{"name":"Morgan County Assessor","address":"77 Fairfax St. Room 104, Berkeley Springs, WV 25411"}},"Nicholas County, WV":{"recorder":{"name":"Nicholas County Clerk","address":"700 Main St., Summersville, WV 26651"},"assessor":{"name":"Nicholas County Assessor","address":"700 Main St., Summersville, WV 26651"}},"Ohio County, WV":{"recorder":{"name":"Ohio County Clerk","address":"1500 Chapline St. Suite 201, Wheeling, WV 26003"},"assessor":{"name":"Ohio County Assessor","address":"1500 Chapline St. Suite 201, Wheeling, WV 26003"}},"Pendleton County, WV":{"recorder":{"name":"Pendleton County Clerk","address":"100 S Main St. Suite 3, Franklin, WV 26807"},"assessor":{"name":"Pendleton County Assessor","address":"100 S Main St. Suite 3, Franklin, WV 26807"}},"Pleasants County, WV":{"recorder":{"name":"Pleasants County Clerk","address":"301 Court Ln. Suite 101, St. Marys, WV 26170"},"assessor":{"name":"Pleasants County Assessor","address":"301 Court Ln. Suite 101, St. Marys, WV 26170"}},"Pocahontas County, WV":{"recorder":{"name":"Pocahontas County Clerk","address":"900 10th Ave. Suite A, Marlinton, WV 24954"},"assessor":{"name":"Pocahontas County Assessor","address":"900 10th Ave. Suite A, Marlinton, WV 24954"}},"Preston County, WV":{"recorder":{"name":"Preston County Clerk","address":"101 W Main St. Suite 202, Kingwood, WV 26537"},"assessor":{"name":"Preston County Assessor","address":"101 W Main St. Suite 202, Kingwood, WV 26537"}},"Putnam County, WV":{"recorder":{"name":"Putnam County Clerk","address":"3389 Winfield Rd., Winfield, WV 25213"},"assessor":{"name":"Putnam County Assessor","address":"3389 Winfield Rd., Winfield, WV 25213"}},"Raleigh County, WV":{"recorder":{"name":"Raleigh County Clerk","address":"215 Main St. Suite 100, Beckley, WV 25801"},"assessor":{"name":"Raleigh County Assessor","address":"215 Main St. Suite 100, Beckley, WV 25801"}},"Randolph County, WV":{"recorder":{"name":"Randolph County Clerk","address":"2 Randolph Ave., Elkins, WV 26241"},"assessor":{"name":"Randolph County Assessor","address":"2 Randolph Ave., Elkins, WV 26241"}},"Ritchie County, WV":{"recorder":{"name":"Ritchie County Clerk","address":"115 E Main St., Harrisville, WV 26362"},"assessor":{"name":"Ritchie County Assessor","address":"115 E Main St., Harrisville, WV 26362"}},"Roane County, WV":{"recorder":{"name":"Roane County Clerk","address":"200 Main St., Spencer, WV 25276"},"assessor":{"name":"Roane County Assessor","address":"200 Main St., Spencer, WV 25276"}},"Summers County, WV":{"recorder":{"name":"Summers County Clerk","address":"120 Ballengee St. Suite 105, Hinton, WV 25951"},"assessor":{"name":"Summers County Assessor","address":"120 Ballengee St. Suite 105, Hinton, WV 25951"}},"Taylor County, WV":{"recorder":{"name":"Taylor County Clerk","address":"214 W Main St. Suite 101, Grafton, WV 26354"},"assessor":{"name":"Taylor County Assessor","address":"214 W Main St. Suite 101, Grafton, WV 26354"}},"Tucker County, WV":{"recorder":{"name":"Tucker County Clerk","address":"215 1st St., Parsons, WV 26287"},"assessor":{"name":"Tucker County Assessor","address":"215 1st St., Parsons, WV 26287"}},"Tyler County, WV":{"recorder":{"name":"Tyler County Clerk","address":"Main St., Middlebourne, WV 26149"},"assessor":{"name":"Tyler County Assessor","address":"Main St., Middlebourne, WV 26149"}},"Upshur County, WV":{"recorder":{"name":"Upshur County Clerk","address":"38 W Main St. Suite 101, Buckhannon, WV 26201"},"assessor":{"name":"Upshur County Assessor","address":"38 W Main St. Suite 101, Buckhannon, WV 26201"}},"Wayne County, WV":{"recorder":{"name":"Wayne County Clerk","address":"700 Hendricks St., Wayne, WV 25570"},"assessor":{"name":"Wayne County Assessor","address":"700 Hendricks St., Wayne, WV 25570"}},"Webster County, WV":{"recorder":{"name":"Webster County Clerk","address":"2 Court Square, Webster Springs, WV 26288"},"assessor":{"name":"Webster County Assessor","address":"2 Court Square, Webster Springs, WV 26288"}},"Wetzel County, WV":{"recorder":{"name":"Wetzel County Clerk","address":"Main St., New Martinsville, WV 26155"},"assessor":{"name":"Wetzel County Assessor","address":"Main St., New Martinsville, WV 26155"}},"Wirt County, WV":{"recorder":{"name":"Wirt County Clerk","address":"Courthouse Square, Elizabeth, WV 26143"},"assessor":{"name":"Wirt County Assessor","address":"Courthouse Square, Elizabeth, WV 26143"}},"Wood County, WV":{"recorder":{"name":"Wood County Clerk","address":"1 Court Square Suite 101, Parkersburg, WV 26101"},"assessor":{"name":"Wood County Assessor","address":"1 Court Square Suite 101, Parkersburg, WV 26101"}},"Wyoming County, WV":{"recorder":{"name":"Wyoming County Clerk","address":"24 Courthouse Ave., Pineville, WV 24874"},"assessor":{"name":"Wyoming County Assessor","address":"24 Courthouse Ave., Pineville, WV 24874"}},"Albany County, WY":{"recorder":{"name":"Albany County Clerk","address":"525 Grand Ave. Suite 202, Laramie, WY 82070"},"assessor":{"name":"Albany County Assessor","address":"525 Grand Ave. Suite 300, Laramie, WY 82070"}},"Big Horn County, WY":{"recorder":{"name":"Big Horn County Clerk","address":"420 W C St., Basin, WY 82410"},"assessor":{"name":"Big Horn County Assessor","address":"420 W C St., Basin, WY 82410"}},"Campbell County, WY":{"recorder":{"name":"Campbell County Clerk","address":"500 S Gillette Ave. Suite 1602, Gillette, WY 82716"},"assessor":{"name":"Campbell County Assessor","address":"500 S Gillette Ave. Suite 1100, Gillette, WY 82716"}},"Carbon County, WY":{"recorder":{"name":"Carbon County Clerk","address":"415 W Pine St., Rawlins, WY 82301"},"assessor":{"name":"Carbon County Assessor","address":"415 W Pine St., Rawlins, WY 82301"}},"Converse County, WY":{"recorder":{"name":"Converse County Clerk","address":"107 N 5th St. Suite 114, Douglas, WY 82633"},"assessor":{"name":"Converse County Assessor","address":"107 N 5th St. Suite 138, Douglas, WY 82633"}},"Crook County, WY":{"recorder":{"name":"Crook County Clerk","address":"309 Cleveland St., Sundance, WY 82729"},"assessor":{"name":"Crook County Assessor","address":"309 Cleveland St., Sundance, WY 82729"}},"Fremont County, WY":{"recorder":{"name":"Fremont County Clerk","address":"450 N 2nd St. Room 220, Lander, WY 82520"},"assessor":{"name":"Fremont County Assessor","address":"450 N 2nd St. Room 235, Lander, WY 82520"}},"Goshen County, WY":{"recorder":{"name":"Goshen County Clerk","address":"2125 E A St., Torrington, WY 82240"},"assessor":{"name":"Goshen County Assessor","address":"2125 E A St., Torrington, WY 82240"}},"Hot Springs County, WY":{"recorder":{"name":"Hot Springs County Clerk","address":"415 Arapahoe St., Thermopolis, WY 82443"},"assessor":{"name":"Hot Springs County Assessor","address":"415 Arapahoe St., Thermopolis, WY 82443"}},"Johnson County, WY":{"recorder":{"name":"Johnson County Clerk","address":"76 N Main St., Buffalo, WY 82834"},"assessor":{"name":"Johnson County Assessor","address":"76 N Main St., Buffalo, WY 82834"}},"Laramie County, WY":{"recorder":{"name":"Laramie County Clerk","address":"309 W 20th St., Cheyenne, WY 82001"},"assessor":{"name":"Laramie County Assessor","address":"309 W 20th St., Cheyenne, WY 82001"}},"Lincoln County, WY":{"recorder":{"name":"Lincoln County Clerk","address":"925 Sage Ave. Suite 101, Kemmerer, WY 83101"},"assessor":{"name":"Lincoln County Assessor","address":"925 Sage Ave. Suite 103, Kemmerer, WY 83101"}},"Natrona County, WY":{"recorder":{"name":"Natrona County Clerk","address":"200 N Center St. Room 154, Casper, WY 82601"},"assessor":{"name":"Natrona County Assessor","address":"200 N Center St. Room 140, Casper, WY 82601"}},"Niobrara County, WY":{"recorder":{"name":"Niobrara County Clerk","address":"424 S Elm St., Lusk, WY 82225"},"assessor":{"name":"Niobrara County Assessor","address":"424 S Elm St., Lusk, WY 82225"}},"Park County, WY":{"recorder":{"name":"Park County Clerk","address":"1002 Sheridan Ave., Cody, WY 82414"},"assessor":{"name":"Park County Assessor","address":"1002 Sheridan Ave., Cody, WY 82414"}},"Platte County, WY":{"recorder":{"name":"Platte County Clerk","address":"800 9th St., Wheatland, WY 82201"},"assessor":{"name":"Platte County Assessor","address":"800 9th St., Wheatland, WY 82201"}},"Sheridan County, WY":{"recorder":{"name":"Sheridan County Clerk","address":"224 S Main St. Suite B-17, Sheridan, WY 82801"},"assessor":{"name":"Sheridan County Assessor","address":"224 S Main St. Suite B-14, Sheridan, WY 82801"}},"Sublette County, WY":{"recorder":{"name":"Sublette County Clerk","address":"21 S Tyler Ave., Pinedale, WY 82941"},"assessor":{"name":"Sublette County Assessor","address":"21 S Tyler Ave., Pinedale, WY 82941"}},"Sweetwater County, WY":{"recorder":{"name":"Sweetwater County Clerk","address":"80 W Flaming Gorge Way Suite 150, Green River, WY 82935"},"assessor":{"name":"Sweetwater County Assessor","address":"80 W Flaming Gorge Way Suite 220, Green River, WY 82935"}},"Teton County, WY":{"recorder":{"name":"Teton County Clerk","address":"200 S Willow St., Jackson, WY 83001"},"assessor":{"name":"Teton County Assessor","address":"200 S Willow St., Jackson, WY 83001"}},"Uinta County, WY":{"recorder":{"name":"Uinta County Clerk","address":"225 9th St., Evanston, WY 82930"},"assessor":{"name":"Uinta County Assessor","address":"225 9th St., Evanston, WY 82930"}},"Washakie County, WY":{"recorder":{"name":"Washakie County Clerk","address":"1001 Big Horn Ave., Worland, WY 82401"},"assessor":{"name":"Washakie County Assessor","address":"1001 Big Horn Ave., Worland, WY 82401"}},"Weston County, WY":{"recorder":{"name":"Weston County Clerk","address":"1 W Main St., Newcastle, WY 82701"},"assessor":{"name":"Weston County Assessor","address":"1 W Main St., Newcastle, WY 82701"}}};
var _countyInfo = null;
var _STATE_MAP = {
'Alabama':'AL','Alaska':'AK','Arizona':'AZ','Arkansas':'AR','California':'CA',
'Colorado':'CO','Connecticut':'CT','Delaware':'DE','Florida':'FL','Georgia':'GA',
'Hawaii':'HI','Idaho':'ID','Illinois':'IL','Indiana':'IN','Iowa':'IA','Kansas':'KS',
'Kentucky':'KY','Louisiana':'LA','Maine':'ME','Maryland':'MD','Massachusetts':'MA',
'Michigan':'MI','Minnesota':'MN','Mississippi':'MS','Missouri':'MO','Montana':'MT',
'Nebraska':'NE','Nevada':'NV','New Hampshire':'NH','New Jersey':'NJ','New Mexico':'NM',
'New York':'NY','North Carolina':'NC','North Dakota':'ND','Ohio':'OH','Oklahoma':'OK',
'Oregon':'OR','Pennsylvania':'PA','Rhode Island':'RI','South Carolina':'SC',
'South Dakota':'SD','Tennessee':'TN','Texas':'TX','Utah':'UT','Vermont':'VT',
'Virginia':'VA','Washington':'WA','West Virginia':'WV','Wisconsin':'WI','Wyoming':'WY'
};
function extractCountyFromAddress(address) {
console.log('[County] STEP 1 — input address:', address);
if (!address) { console.warn('[County] STEP 1 FAIL — address is empty'); return; }
// Find state abbreviation — check full name first, then abbreviation
var stateAbbr = null;
var stateNames = Object.keys(_STATE_MAP);
for (var i = 0; i < stateNames.length; i++) {
if (address.indexOf(stateNames[i]) !== -1) {
stateAbbr = _STATE_MAP[stateNames[i]];
console.log('[County] STEP 2 — state found by full name:', stateNames[i], '→', stateAbbr);
break;
}
}
// Fallback: check for state abbreviation directly (e.g. "Colusa CA 95932")
if (!stateAbbr) {
var abbrVals = Object.values(_STATE_MAP);
for (var j = 0; j < abbrVals.length; j++) {
var abbr = abbrVals[j];
if (new RegExp('\\b' + abbr + '\\b').test(address)) {
stateAbbr = abbr;
console.log('[County] STEP 2 — state found by abbreviation:', stateAbbr);
break;
}
}
}
if (!stateAbbr) {
console.warn('[County] STEP 2 FAIL — no state found in:', address);
return;
}
// Split by comma and look for jurisdiction part
var suffixes = ['City and Borough', 'Census Area', 'Municipality', 'Borough', 'Parish', 'County', 'City'];
var parts = address.split(',');
console.log('[County] STEP 3 — address parts:', parts);
var countyKey = null;
for (var p = 0; p < parts.length; p++) {
var part = parts[p].trim();
for (var s = 0; s < suffixes.length; s++) {
if (part.indexOf(suffixes[s]) !== -1) {
countyKey = part + ', ' + stateAbbr;
console.log('[County] STEP 3 — county key from suffix match:', countyKey);
break;
}
}
if (countyKey) break;
}
// If no county suffix found, try matching comma-parts against COUNTY_DATA keys
// Uses comma-split (not space-split) to preserve multi-word names like "San Luis Obispo"
if (!countyKey) {
console.log('[County] STEP 3 — no suffix match, trying name match against COUNTY_DATA...');
var commaParts = address.split(',').map(function(p) { return p.trim(); });
console.log('[County] STEP 3 — comma parts:', commaParts);
var allKeys2 = Object.keys(COUNTY_DATA);
var caKeys = allKeys2.filter(function(k) { return k.slice(-3) === ', ' + stateAbbr; });
console.log('[County] STEP 3 — COUNTY_DATA keys for', stateAbbr + ':', caKeys);
for (var k2 = 0; k2 < allKeys2.length; k2++) {
if (allKeys2[k2].slice(-3) !== ', ' + stateAbbr) continue;
var keyName2 = allKeys2[k2].replace(', ' + stateAbbr, '').replace(' County','').trim().toLowerCase();
for (var p2 = 0; p2 < commaParts.length; p2++) {
// Check exact match OR if the part contains the county name
var part2lower = commaParts[p2].toLowerCase().replace(' county','').trim();
if (part2lower === keyName2 || part2lower.indexOf(keyName2) !== -1) {
countyKey = allKeys2[k2];
console.log('[County] STEP 3 — county key from name match:', countyKey);
break;
}
}
if (countyKey) break;
}
}
if (!countyKey) {
console.warn('[County] STEP 3 FAIL — could not build countyKey from address:', address);
return;
}
console.log('[County] STEP 4 — looking up countyKey:', countyKey, '| COUNTY_DATA has it?', !!COUNTY_DATA[countyKey]);
// Direct lookup
if (COUNTY_DATA[countyKey]) {
_countyInfo = Object.assign({}, COUNTY_DATA[countyKey]);
_countyInfo._key = countyKey;
console.log('[County] STEP 4 — SUCCESS direct lookup:', countyKey);
return;
}
// Fuzzy fallback
console.log('[County] STEP 4 — direct miss, trying fuzzy...');
var allKeys = Object.keys(COUNTY_DATA);
for (var k = 0; k < allKeys.length; k++) {
if (allKeys[k].slice(-3) === ', ' + stateAbbr) {
var keyName = allKeys[k].replace(', ' + stateAbbr, '');
var searchName = countyKey.replace(', ' + stateAbbr, '');
if (keyName.indexOf(searchName) !== -1 || searchName.indexOf(keyName) !== -1) {
_countyInfo = Object.assign({}, COUNTY_DATA[allKeys[k]]);
_countyInfo._key = allKeys[k];
console.log('[County] STEP 4 — SUCCESS fuzzy:', allKeys[k]);
return;
}
}
}
console.warn('[County] STEP 4 FAIL — not found. countyKey was:', countyKey, '| stateAbbr:', stateAbbr);
console.warn('[County] STEP 4 — first 5 COUNTY_DATA keys for this state:', Object.keys(COUNTY_DATA).filter(function(k){ return k.slice(-3) === ', '+stateAbbr; }).slice(0,5));
}
function applyCountyToReport() {
if (!_countyInfo) return;
// Cover sheet
var recRow = document.getElementById('cover-recorder-row');
var assRow = document.getElementById('cover-assessor-row');
var recText = document.getElementById('cover-recorder-text');
var assText = document.getElementById('cover-assessor-text');
if (recText) recText.textContent = _countyInfo.recorder.name + ' · ' + _countyInfo.recorder.address;
if (assText) assText.textContent = _countyInfo.assessor.name + ' · ' + _countyInfo.assessor.address;
if (recRow) recRow.style.display = 'flex';
if (assRow) assRow.style.display = 'flex';
// On-screen block
var block = document.getElementById('county-offices-block');
var scrRName = document.getElementById('screen-recorder-name');
var scrRAddr = document.getElementById('screen-recorder-addr');
var scrAName = document.getElementById('screen-assessor-name');
var scrAAddr = document.getElementById('screen-assessor-addr');
if (scrRName) scrRName.textContent = _countyInfo.recorder.name;
if (scrRAddr) scrRAddr.textContent = _countyInfo.recorder.address;
if (scrAName) scrAName.textContent = _countyInfo.assessor.name;
if (scrAAddr) scrAAddr.textContent = _countyInfo.assessor.address;
if (block) block.style.display = 'block';
console.log('[SkyGrid] County offices displayed:', _countyInfo._key);
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SkyGrid v2.9 — GNSS Survey Planning</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,300;0,400;0,500;0,600;1,400&family=IBM+Plex+Sans:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/satellite.js/4.1.3/satellite.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"></script>
<style>
:root {
--amber:#f59e0b; --amber-dim:#92600a; --amber-glow:rgba(245,158,11,.13); --amber-glow2:rgba(245,158,11,.06);
--bg:#090909; --bg2:#0f0f11; --bg3:#161618; --bg4:#1c1c20;
--border:rgba(245,158,11,.16); --border-hi:rgba(245,158,11,.4);
--text:#e6dfc8; --text-dim:#7a7264; --text-muted:#3a3830;
--green:#22c55e; --red:#ef4444; --yellow:#eab308; --blue:#3b82f6; --cyan:#06b6d4;
}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{background:var(--bg);color:var(--text);font-family:'IBM Plex Sans',sans-serif;font-size:14px;line-height:1.6;min-height:100vh;overflow-x:hidden}
body::before{content:'';position:fixed;inset:0;background-image:linear-gradient(rgba(245,158,11,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(245,158,11,.035) 1px,transparent 1px);background-size:44px 44px;pointer-events:none;z-index:0}
body::after{content:'';position:fixed;top:-240px;left:50%;transform:translateX(-50%);width:900px;height:480px;background:radial-gradient(ellipse,rgba(245,158,11,.07) 0%,transparent 68%);pointer-events:none;z-index:0}
#app{position:relative;z-index:1;max-width:980px;margin:0 auto;padding:0 18px 80px}
/* HEADER */
.hdr{display:flex;align-items:center;justify-content:space-between;padding:26px 0 18px;border-bottom:1px solid var(--border);margin-bottom:26px}
.hdr-logo{display:flex;flex-direction:column;gap:4px}
.hdr-title{font-family:'IBM Plex Mono',monospace;font-size:24px;font-weight:600;color:var(--amber);letter-spacing:.12em;line-height:1}
.hdr-sub{font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:300;color:var(--text-dim);letter-spacing:.3em;text-transform:uppercase}
.hdr-v{font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--amber-dim);border:1px solid var(--border);padding:4px 10px;letter-spacing:.12em}
/* MODE TOGGLE */
.mode-toggle{display:flex;border:1px solid var(--border);margin-bottom:26px;overflow:hidden}
.mode-btn{flex:1;background:transparent;border:none;color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:500;letter-spacing:.12em;padding:13px 20px;cursor:pointer;transition:all .2s;border-right:1px solid var(--border);text-transform:uppercase;position:relative}
.mode-btn:last-child{border-right:none}
.mode-btn.active{background:var(--amber-glow);color:var(--amber)}
.mode-btn.active::after{content:'';position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--amber)}
.new-badge{font-size:8px;background:var(--amber);color:#000;padding:2px 5px;margin-left:7px;vertical-align:middle;font-weight:700;letter-spacing:.04em}
.mode-panel{display:none}
.mode-panel.active{display:block}
/* SECTIONS */
.sec{background:var(--bg2);border:1px solid var(--border);padding:20px 24px;margin-bottom:14px}
.sec-title{font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:600;color:var(--amber);letter-spacing:.28em;text-transform:uppercase;margin-bottom:16px;display:flex;align-items:center;gap:10px}
.sec-title::after{content:'';flex:1;height:1px;background:var(--border)}
.form-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}
.form-group{display:flex;flex-direction:column;gap:5px}
.form-group label{font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase}
.form-group input,.form-group select,.form-group textarea{background:var(--bg3);border:1px solid var(--border);color:var(--text);font-family:'IBM Plex Mono',monospace;font-size:13px;padding:9px 12px;outline:none;transition:border-color .2s;width:100%}
.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:var(--border-hi)}
.form-group input::placeholder,.form-group textarea::placeholder{color:var(--text-muted)}
.form-group textarea{resize:vertical;min-height:70px}
select option{background:var(--bg3)}
/* LOCATION ROW */
.loc-row{display:flex;gap:10px;align-items:flex-end}
.loc-row .form-group{flex:1}
.loc-btn{background:var(--bg3);border:1px solid var(--border);color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:11px;padding:9px 14px;cursor:pointer;transition:all .2s;white-space:nowrap;height:38px}
.loc-btn:hover{border-color:var(--border-hi);color:var(--amber)}
/* DAYS SELECTOR */
.days-sel{display:flex;gap:0;border:1px solid var(--border);overflow:hidden;width:fit-content}
.day-opt{background:transparent;border:none;color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:11px;letter-spacing:.1em;padding:9px 20px;cursor:pointer;transition:all .2s;border-right:1px solid var(--border)}
.day-opt:last-child{border-right:none}
.day-opt.active{background:var(--amber-glow);color:var(--amber)}
/* STATUS BAR */
.status-bar{display:flex;align-items:center;gap:20px;padding:14px 20px;background:var(--bg3);border:1px solid var(--border);margin-bottom:14px;flex-wrap:wrap}
.status-item{display:flex;align-items:center;gap:8px;font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim);letter-spacing:.1em}
.dot{width:10px;height:10px;border-radius:50%;background:var(--text-muted);flex-shrink:0;transition:all .4s}
.dot.idle{background:var(--text-muted)}
.dot.loading{background:var(--amber);animation:pulse 1s infinite}
.dot.ok{background:var(--green)}
.dot.warn{background:var(--yellow)}
.dot.err{background:var(--red)}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.85)}}
/* RUN BUTTON */
.run-btn{width:100%;background:transparent;border:1px solid var(--amber);color:var(--amber);font-family:'IBM Plex Mono',monospace;font-size:13px;font-weight:600;letter-spacing:.2em;padding:15px;cursor:pointer;text-transform:uppercase;transition:all .25s;position:relative;overflow:hidden;margin-bottom:14px}
.run-btn:hover{background:var(--amber-glow)}
.run-btn:disabled{opacity:.4;cursor:not-allowed}
.run-btn::before{content:'⚡ '}
/* PROGRESS */
.progress-box{background:var(--bg3);border:1px solid var(--border);padding:20px 24px;margin-bottom:14px;display:none}
.progress-box.visible{display:block}
.progress-step{font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--text-dim);padding:4px 0;border-left:2px solid var(--text-muted);padding-left:12px;margin-bottom:6px;transition:all .3s}
.progress-step.active{color:var(--amber);border-color:var(--amber)}
.progress-step.done{color:var(--green);border-color:var(--green)}
.progress-step.warn{color:#eab308;border-color:#eab308}
.progress-step.err{color:var(--red);border-color:var(--red)}
.progress-step::before{margin-right:8px}
.progress-step.active::before{content:'▶'}
.progress-step.done::before{content:'✓'}
.progress-step.err::before{content:'✗'}
.progress-step.idle::before{content:'○'}
/* RESULTS */
.results-area{display:none}
.results-area.visible{display:block}
/* IONO PANEL */
.site-signal-header{margin-bottom:12px}
.site-signal-title{font-family:'Space Mono',monospace;font-size:9px;color:var(--text-dim);letter-spacing:.25em;text-transform:uppercase;margin-bottom:8px;padding-bottom:6px;border-bottom:1px solid var(--border)}
.site-signal-facts{display:flex;gap:24px;flex-wrap:wrap}
.ssf-item{display:flex;flex-direction:column;gap:2px;min-width:120px;max-width:200px}
.ssf-label{font-family:'Space Mono',monospace;font-size:8px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.15em}
.ssf-value{font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:600;color:var(--text)}
.ssf-note{font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-dim)}
.iono-panel{background:var(--bg2);border:1px solid var(--border);padding:20px 24px;margin-bottom:14px}
.iono-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:14px;margin-top:14px}
.iono-metric{background:var(--bg3);border:1px solid var(--border);padding:14px 16px}
.iono-metric-label{font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-dim);letter-spacing:.2em;text-transform:uppercase;margin-bottom:6px}
.iono-metric-val{font-family:'IBM Plex Mono',monospace;font-size:24px;font-weight:600;line-height:1}
.iono-metric-unit{font-size:11px;color:var(--text-dim);margin-left:4px}
.iono-level{display:inline-block;font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:600;letter-spacing:.15em;padding:5px 14px;text-transform:uppercase;margin-top:12px}
.iono-level.quiet{background:rgba(34,197,94,.15);color:var(--green);border:1px solid rgba(34,197,94,.3)}
.iono-level.moderate{background:rgba(234,179,8,.15);color:var(--yellow);border:1px solid rgba(234,179,8,.3)}
.iono-level.elevated{background:rgba(239,68,68,.15);color:var(--red);border:1px solid rgba(239,68,68,.3)}
.iono-summary{margin-top:12px;color:var(--text-dim);font-size:13px;line-height:1.5}
/* DOP TABLE */
.dop-table-wrap{overflow-x:auto;margin-top:14px}
.mask-selector-wrap{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.mask-label{font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.1em;white-space:nowrap}
.mask-btn-group{display:flex;gap:4px}
.mask-btn{font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:600;padding:4px 10px;background:var(--bg3);border:1px solid var(--border);color:var(--text-dim);cursor:pointer;border-radius:3px;transition:all .15s}
.mask-btn:hover{border-color:var(--amber);color:var(--amber)}
.mask-btn-active{background:var(--amber) !important;border-color:var(--amber) !important;color:#000 !important}
.mask-hint{font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-muted);font-style:italic;white-space:nowrap}
.dop-table{width:100%;border-collapse:collapse;font-family:'IBM Plex Mono',monospace;font-size:12px}
.dop-table th{background:var(--bg4);color:var(--amber);font-size:10px;letter-spacing:.15em;text-transform:uppercase;padding:8px 12px;text-align:left;border-bottom:1px solid var(--border)}
.dop-table td{padding:7px 12px;border-bottom:1px solid var(--text-muted);color:var(--text-dim)}
.dop-table tr:last-child td{border-bottom:none}
.dop-good{color:var(--green)!important}
.dop-ok{color:var(--yellow)!important}
.dop-poor{color:var(--red)!important}
.dop-spike{color:var(--amber)!important;font-weight:700!important}
.dop-na{color:var(--text-muted)!important}
/* AI RESULT CARD */
.ai-card{background:var(--bg2);border:1px solid var(--border);padding:22px 26px;margin-bottom:14px}
.ai-card h3{font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:600;color:var(--amber);letter-spacing:.2em;text-transform:uppercase;margin-bottom:14px}
.ai-card-body{color:var(--text);font-size:14px;line-height:1.7;white-space:pre-wrap;font-family:'IBM Plex Sans',sans-serif}
.ai-card-body strong{color:var(--amber);font-weight:600}
/* ── 7-DAY CARD GRID ── */
.week-grid{display:flex;flex-direction:column;gap:12px;margin-bottom:14px}
.day-card{background:var(--bg2);border:1px solid var(--border);overflow:hidden;transition:border-color .2s}
.day-card.top5{border-color:rgba(245,158,11,.35)}
.day-card.rank1{border-color:var(--amber);box-shadow:0 0 20px rgba(245,158,11,.08)}
.day-card.bottom2{opacity:.55}
.day-card-header{display:flex;align-items:center;gap:12px;padding:14px 20px;cursor:pointer;user-select:none;border-bottom:1px solid transparent;transition:border-color .2s}
.day-card.expanded .day-card-header{border-bottom-color:var(--border)}
.day-rank-badge{font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:700;padding:3px 10px;letter-spacing:.1em;flex-shrink:0}
.rank-b1{background:rgba(245,158,11,.25);color:var(--amber);border:1px solid var(--amber-dim)}
.rank-b2{background:rgba(200,200,200,.1);color:#aaa;border:1px solid rgba(200,200,200,.2)}
.rank-b3{background:rgba(59,130,246,.15);color:var(--blue);border:1px solid rgba(59,130,246,.3)}
.rank-b4,.rank-b5{background:rgba(34,197,94,.1);color:var(--green);border:1px solid rgba(34,197,94,.2)}
.rank-b6,.rank-b7{background:rgba(100,100,100,.1);color:var(--text-muted);border:1px solid rgba(100,100,100,.15)}
.day-card-dateblock{flex:1}
.day-card-datestr{font-family:'IBM Plex Mono',monospace;font-size:14px;font-weight:600;color:var(--text);line-height:1.2}
.day-card-tags{display:flex;gap:6px;margin-top:4px;flex-wrap:wrap}
.tag{font-family:'IBM Plex Mono',monospace;font-size:9px;font-weight:700;padding:2px 7px;letter-spacing:.1em;text-transform:uppercase}
.tag-weekend{background:rgba(59,130,246,.12);color:var(--blue);border:1px solid rgba(59,130,246,.25)}
.day-card-gonogo{font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:700;padding:4px 12px;letter-spacing:.12em;flex-shrink:0}
.gonogo-go{background:rgba(34,197,94,.15);color:var(--green);border:1px solid rgba(34,197,94,.3)}
.gonogo-caution{background:rgba(234,179,8,.15);color:var(--yellow);border:1px solid rgba(234,179,8,.3)}
.gonogo-nogo{background:rgba(239,68,68,.15);color:var(--red);border:1px solid rgba(239,68,68,.3)}
.day-card-chevron{color:var(--text-muted);font-size:12px;transition:transform .25s;flex-shrink:0}
.day-card.expanded .day-card-chevron{transform:rotate(90deg)}
.day-card-body{display:none;padding:16px 20px}
.day-card.expanded .day-card-body{display:block}
/* WEATHER PILLS */
.wx-pills{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:14px}
.wx-pill{font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);background:var(--bg4);border:1px solid var(--border);padding:4px 10px;letter-spacing:.07em}
.wx-pill span{color:var(--text)}
/* WIND CHART */
.wind-chart{margin-bottom:14px}
.wind-chart-title{font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-muted);letter-spacing:.2em;text-transform:uppercase;margin-bottom:8px;display:flex;align-items:center;justify-content:space-between}
.wind-chart-title .threshold-note{color:var(--text-muted);font-size:8px}
.wind-bar-row{display:flex;align-items:center;gap:8px;margin-bottom:4px}
.wind-bar-label{font-family:'IBM Plex Mono',monospace;font-size:9px;width:44px;color:var(--text-dim);text-align:right;flex-shrink:0}
.wind-bar-track{flex:1;height:7px;background:var(--bg4);border:1px solid var(--text-muted);overflow:visible;position:relative}
.wind-bar-fill{height:100%;transition:width .6s ease;position:relative}
.wind-bar-fill.calm{background:var(--green)}
.wind-bar-fill.breezy{background:var(--yellow)}
.wind-bar-fill.strong{background:var(--red)}
.wind-threshold-line{position:absolute;top:-2px;bottom:-2px;width:1px;background:rgba(239,68,68,.5);pointer-events:none}
.wind-val{font-family:'IBM Plex Mono',monospace;font-size:9px;width:42px;color:var(--text-dim)}
/* DRONE BLOCK */
.drone-block{background:var(--bg3);border:1px solid var(--border);padding:10px 14px;margin-bottom:10px;font-size:12px;color:var(--text-dim);line-height:1.5}
.drone-block strong{color:var(--text)}
/* FIELD WARNINGS */
.field-warnings{margin-top:8px}
.field-warn-item{font-family:'IBM Plex Mono',monospace;font-size:11px;padding:6px 12px;margin-bottom:5px;border-left:3px solid}
.field-warn-item.critical{border-color:var(--red);background:rgba(239,68,68,.08);color:#fca5a5}
.field-warn-item.caution{border-color:var(--yellow);background:rgba(234,179,8,.08);color:#fde68a}
.field-warn-item.info{border-color:var(--blue);background:rgba(59,130,246,.08);color:#93c5fd}
/* RESULT SECTION (shared) */
.result-section{background:var(--bg2);border:1px solid var(--border);padding:20px 24px;margin-bottom:14px}
.result-section h3{font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:600;color:var(--amber);letter-spacing:.2em;text-transform:uppercase;margin-bottom:12px}
/* BANNERS */
.warn-banner{background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.3);color:#fca5a5;font-family:'IBM Plex Mono',monospace;font-size:12px;padding:10px 14px;margin-bottom:14px;display:flex;align-items:center;gap:8px}
.info-banner{background:rgba(245,158,11,.07);border:1px solid var(--border);color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:12px;padding:10px 14px;margin-bottom:14px}
/* EXPORT */
.export-row{display:flex;gap:10px;margin-top:20px;flex-wrap:wrap}
.export-btn{background:transparent;border:1px solid var(--border);color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:11px;letter-spacing:.12em;padding:9px 18px;cursor:pointer;transition:all .2s;text-transform:uppercase}
.export-btn:hover{border-color:var(--border-hi);color:var(--amber)}
/* MANUAL MODE */
.upload-zone{border:1px dashed var(--border);padding:28px 24px;text-align:center;cursor:pointer;transition:all .2s;background:var(--bg3);margin-bottom:14px}
.upload-zone:hover{border-color:var(--border-hi);background:var(--bg4)}
.upload-zone-title{font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase;margin-bottom:8px}
.upload-zone-sub{font-size:12px;color:var(--text-muted)}
.upload-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px}
.img-preview{max-width:100%;max-height:220px;object-fit:contain;margin-top:10px;border:1px solid var(--border)}
.manual-analyze-btn{width:100%;background:transparent;border:1px solid var(--border-hi);color:var(--amber);font-family:'IBM Plex Mono',monospace;font-size:13px;font-weight:600;letter-spacing:.2em;padding:14px;cursor:pointer;text-transform:uppercase;transition:all .25s;margin-bottom:14px}
.manual-analyze-btn:hover{background:var(--amber-glow)}
.manual-analyze-btn:disabled{opacity:.4;cursor:not-allowed}
.date-row{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end;margin-bottom:10px}
.date-row .form-group{min-width:150px}
.add-date-btn{background:var(--bg3);border:1px solid var(--border);color:var(--text-dim);font-family:'IBM Plex Mono',monospace;font-size:11px;padding:9px 14px;cursor:pointer;white-space:nowrap;height:38px}
.add-date-btn:hover{border-color:var(--border-hi);color:var(--amber)}
.remove-date-btn{background:transparent;border:none;color:var(--red);font-family:'IBM Plex Mono',monospace;font-size:14px;cursor:pointer;padding:0 4px;opacity:.6;margin-left:2px}
.remove-date-btn:hover{opacity:1}
/* ADDR SUGGESTIONS */
.addr-wrap{position:relative}
.addr-suggestions{position:absolute;top:100%;left:0;right:0;background:var(--bg3);border:1px solid var(--border-hi);z-index:100;max-height:200px;overflow-y:auto}
.addr-suggestion{padding:9px 12px;font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--text);cursor:pointer;border-bottom:1px solid var(--border)}
.addr-suggestion:hover{background:var(--amber-glow)}
.addr-suggestion:last-child{border-bottom:none}
/* WEEK SUMMARY BAR */
.week-summary{background:var(--bg3);border:1px solid var(--border);padding:14px 20px;margin-bottom:14px;display:flex;gap:20px;flex-wrap:wrap;align-items:center}
.week-summary-item{font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim)}
.week-summary-item span{color:var(--text)}
/* PRINT */
@media print {
/* ═══════════════════════════════════════════════════
SKYGRID PRINT STYLESHEET — REVISED
Matches: clean white editorial style from reference PDF
Fonts: Barlow (headings/numbers) · Space Mono (labels) · Georgia (body/italic)
Palette: #fff bg · #111 text · #f0f0f0 tint · left-border accents
═══════════════════════════════════════════════════ */
@page {
margin: 8mm 14mm 8mm 14mm;
size: letter;
}
/* ── Force color printing ───────────────────────── */
* {
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
color-adjust: exact !important;
box-shadow: none !important;
text-shadow: none !important;
}
/* ── Global white/black reset ───────────────────── */
html, body, #app, .results-area, .mode-panel,
.week-grid, .day-card, .day-card-body,
.week-summary, .ai-card, .iono-panel,
[class*="bg"], [style*="background"] {
background: #fff !important;
background-color: #fff !important;
background-image: none !important;
color: #111 !important;
}
* {
background-color: transparent !important;
color: #111 !important;
}
body::before, body::after { display: none !important; }
body {
background: #fff !important;
background-color: #fff !important;
font-family: 'Georgia', 'Times New Roman', serif !important;
font-size: 7.5pt !important;
line-height: 1.4 !important;
color: #111 !important;
}
/* CSS variable overrides */
:root {
--bg: #fff !important;
--bg2: #fff !important;
--bg3: #f8f8f8 !important;
--bg4: #f0f0f0 !important;
--text: #111 !important;
--text-dim: #555 !important;
--text-muted: #999 !important;
--amber: #111 !important;
--amber-dim: #555 !important;
--amber-glow: transparent !important;
--amber-glow2: transparent !important;
--border: #ddd !important;
--border-bright: #aaa !important;
--green: #111 !important;
--red: #111 !important;
--yellow: #555 !important;
}
/* Kill inline dark backgrounds */
[style*="background:#0d1117"], [style*="background: #0d1117"],
[style*="background:#090909"], [style*="background:#0f0f11"],
[style*="background:#161618"], [style*="background:#18181c"],
[style*="background:#1c1c20"], [style*="background:#1e1e24"],
[style*="background:rgba(0"], [style*="background: rgba(0"] {
background: #fff !important;
background-color: #fff !important;
}
/* Kill inline colored text — force black */
[style*="color:#f59e0b"], [style*="color: #f59e0b"],
[style*="color:#00ff9d"], [style*="color:#ff6b6b"],
[style*="color:#ff6b00"], [style*="color:#ffb800"],
[style*="color:var(--amber)"], [style*="color:var(--text)"],
[style*="color:var(--text-dim)"], [style*="color:var(--green)"],
[style*="color:var(--red)"] {
color: #111 !important;
}
/* ── Hide UI chrome — DO NOT hide containers that wrap results ── */
/* Only hide leaf elements: forms, buttons, labels, toggles */
.day-selector, .day-tabs, .day-panel,
.info-note, .error-box, .loading-state,
.instructions-box, .location-box, .gnss-launch-btn,
.paste-btn, .upload-pair,
header .subtitle, header .tagline, header .header-job-line,
header .header-logo-img, #weeklyBanner,
.mode-tabs, .mode-switcher, .app-controls,
.step-row, .new-badge,
.sec, .mode-toggle, .status-bar, .progress-box,
.progress-step, .export-btn, .export-row,
.manual-analyze-btn, .analyze-btn, .run-btn,
.warn-banner, .batch-controls,
#run-btn, #btn-auto, #btn-manual, #btn-batch { display: none !important; }
/* Results containers — force visible regardless of screen state */
/* NOTE: do NOT hide .mode-panel — results-area lives inside it */
.mode-panel, #auto-panel, #manual-panel { display: block !important; }
.results-area, #auto-results, #manual-results,
#week-grid-area, #results, .result-section { display: block !important; }
/* Cover: hidden on screen (inline style), must show for print */
#report-cover { display: block !important; }
.cover-page { display: block !important; }
#ranking-page { display: block !important; }
/* ── PAGE TOP RULE ──────────────────────────────── */
body::before {
content: '';
display: block;
position: fixed;
top: 0; left: 0; right: 0;
height: 3pt;
background: #111 !important;
}
/* ── HEADER ─────────────────────────────────────── */
.hdr, header {
display: grid !important;
grid-template-columns: auto 1fr auto !important;
align-items: center !important;
gap: 14pt !important;
padding: 0 0 8pt 0 !important;
margin-bottom: 14pt !important;
border: none !important;
border-bottom: 2pt solid #111 !important;
background: #fff !important;
}
.hdr-logo, .logo {
display: flex !important;
flex-direction: column !important;
gap: 1pt !important;
}
.hdr-title, header h1 {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 20pt !important;
font-weight: 900 !important;
color: #111 !important;
letter-spacing: -0.5pt !important;
margin: 0 !important;
}
.hdr-sub, header .subtitle {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 7pt !important;
color: #888 !important;
font-weight: 300 !important;
letter-spacing: 0.5pt !important;
}
.hdr-v { display: none !important; }
.print-header-info {
display: flex !important;
flex-direction: column !important;
align-items: flex-end !important;
gap: 1.5pt !important;
text-align: right !important;
}
.print-header-info div {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 7.5pt !important;
color: #444 !important;
line-height: 1.4 !important;
}
.print-header-info div:first-child {
font-size: 9.5pt !important;
font-weight: 700 !important;
color: #111 !important;
}
/* ── RESULTS CONTAINER ──────────────────────────── */
#results { display: block !important; }
.result-section { display: block !important; }
/* ── REPORT TITLE ROW ───────────────────────────── */
.result-header {
display: flex !important;
align-items: baseline !important;
gap: 10pt !important;
margin-bottom: 10pt !important;
padding-bottom: 5pt !important;
border-bottom: 0.75pt solid #111 !important;
}
.result-header h2 {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 16pt !important;
font-weight: 900 !important;
color: #111 !important;
letter-spacing: -0.3pt !important;
margin: 0 !important;
text-transform: uppercase !important;
}
/* ── SECTION LABELS (monospace, small caps) ─────── */
.section-title, .rank-label-bar {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 2.5pt !important;
color: #666 !important;
border: none !important;
border-top: 0.5pt solid #ccc !important;
padding: 5pt 0 4pt 0 !important;
margin: 12pt 0 6pt 0 !important;
background: transparent !important;
page-break-after: avoid !important;
}
.rank-label-bar {
border-top: none !important;
border-bottom: 0.5pt solid #bbb !important;
padding: 3pt 0 4pt 0 !important;
margin: 0 0 6pt 0 !important;
}
.rank-label-0 {
font-size: 7pt !important;
color: #000 !important;
font-weight: 900 !important;
border-bottom: 1.5pt solid #111 !important;
letter-spacing: 3pt !important;
}
/* ── BADGES (EXCELLENT / GOOD / CAUTION / etc.) ─── */
.badge, .gonogo-go, .gonogo-caution, .gonogo-nogo {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
letter-spacing: 1.5pt !important;
text-transform: uppercase !important;
padding: 2pt 6pt !important;
border: 1pt solid #111 !important;
border-radius: 0 !important;
background: transparent !important;
color: #111 !important;
}
.gonogo-go { background: #111 !important; color: #fff !important; }
.gonogo-caution { background: #fff !important; color: #111 !important; }
.gonogo-nogo { border-color: #bbb !important; color: #888 !important; }
.badge-good { background: #f0f0f0 !important; }
.badge-warn { background: #fff !important; }
.badge-bad { background: #e8e8e8 !important; }
/* ── RANKING CARDS ──────────────────────────────── */
.ranking-grid {
display: grid !important;
grid-template-columns: 1fr !important;
gap: 0 !important;
margin-bottom: 12pt !important;
}
.rank-card {
display: grid !important;
grid-template-columns: 1fr auto !important;
align-items: start !important;
gap: 10pt !important;
padding: 10pt 0 !important;
background: transparent !important;
border: none !important;
border-bottom: 0.5pt solid #ddd !important;
border-radius: 0 !important;
border-left: none !important;
page-break-inside: avoid !important;
}
.rank-card:last-child { border-bottom: none !important; }
.rank-card-body {
display: grid !important;
grid-template-columns: 22pt 1fr !important;
align-items: start !important;
gap: 10pt !important;
}
.rank-num-screen { display: none !important; }
.rank-num-print { display: block !important; }
.rank-number {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 16pt !important;
font-weight: 900 !important;
color: #111 !important;
line-height: 1.1 !important;
width: auto !important;
height: auto !important;
border-radius: 0 !important;
background: transparent !important;
}
.rank-info h3 {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 11pt !important;
font-weight: 700 !important;
color: #111 !important;
margin: 0 0 2pt 0 !important;
}
.rank-info .rank-window {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 8pt !important;
font-weight: 700 !important;
color: #111 !important;
margin-bottom: 3pt !important;
}
.rank-info .rank-reason {
font-family: 'Georgia', serif !important;
font-size: 8pt !important;
color: #444 !important;
font-style: italic !important;
}
.rank-score { text-align: right !important; }
.score-num {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 28pt !important;
font-weight: 900 !important;
color: #111 !important;
line-height: 1 !important;
}
.score-label {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 5.5pt !important;
text-transform: uppercase !important;
letter-spacing: 1pt !important;
color: #999 !important;
}
/* ── OVERALL RECOMMENDATION BOX ────────────────── */
.overall-rec, .ai-card {
background: #fff !important;
border: 0.5pt solid #ccc !important;
border-radius: 0 !important;
padding: 8pt 12pt !important;
margin-bottom: 10pt !important;
page-break-inside: avoid !important;
}
.overall-rec h4, .ai-card h3 {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 1.5pt !important;
color: #111 !important;
margin: 0 0 5pt 0 !important;
}
.overall-rec p, .ai-card-body {
font-family: 'Georgia', serif !important;
font-size: 8.5pt !important;
color: #222 !important;
font-style: italic !important;
margin: 0 !important;
line-height: 1.5 !important;
}
/* ── 4-HOUR STATIC WINDOW BOX ───────────────────── */
.four-hour-box {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
gap: 14pt !important;
margin-bottom: 12pt !important;
page-break-inside: avoid !important;
}
.four-hour-primary {
background: #f0f0f0 !important;
border: none !important;
border-top: 3pt solid #111 !important;
border-radius: 0 !important;
padding: 10pt 12pt !important;
}
.four-hour-backup {
background: transparent !important;
border: none !important;
border-top: 1pt solid #bbb !important;
border-radius: 0 !important;
padding: 10pt 12pt !important;
}
.four-hour-rec-label {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
font-weight: 900 !important;
letter-spacing: 3pt !important;
text-transform: uppercase !important;
color: #000 !important;
background: transparent !important;
border-radius: 0 !important;
padding: 0 0 4pt 0 !important;
margin: 0 0 6pt 0 !important;
border-bottom: 1.5pt solid #111 !important;
display: block !important;
}
.four-hour-rec-label-alt {
color: #666 !important;
border-bottom-color: #bbb !important;
font-size: 6pt !important;
font-weight: 700 !important;
}
.four-hour-date {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 9.5pt !important;
font-weight: 700 !important;
color: #111 !important;
margin: 0 0 5pt 0 !important;
}
.four-hour-time {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 26pt !important;
font-weight: 900 !important;
color: #111 !important;
letter-spacing: -0.5pt !important;
line-height: 1.1 !important;
margin-bottom: 4pt !important;
}
.four-hour-time.backup {
font-size: 18pt !important;
color: #333 !important;
}
.four-hour-label {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 5.5pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 1.5pt !important;
color: #888 !important;
margin-bottom: 3pt !important;
}
.four-hour-times {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
color: #333 !important;
margin-bottom: 4pt !important;
}
.four-hour-times strong { font-weight: 700 !important; color: #111 !important; }
.four-hour-reason {
font-family: 'Georgia', serif !important;
font-size: 7.5pt !important;
color: #444 !important;
font-style: italic !important;
}
.four-hour-warn {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
color: #444 !important;
background: #ebebeb !important;
border: none !important;
padding: 4pt 6pt !important;
margin-top: 5pt !important;
border-radius: 0 !important;
}
/* ── WEATHER STRIP ──────────────────────────────── */
.weather-strip {
display: grid !important;
grid-template-columns: auto 1fr !important;
align-items: center !important;
gap: 10pt !important;
border: none !important;
border-left: 3.5pt solid #111 !important;
background: #f5f5f5 !important;
border-radius: 0 !important;
padding: 7pt 12pt !important;
margin-bottom: 7pt !important;
page-break-inside: avoid !important;
}
.weather-emoji { font-size: 16pt !important; }
.weather-status {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7.5pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 0.5pt !important;
color: #111 !important;
margin-bottom: 2pt !important;
}
.weather-details {
font-family: 'Georgia', serif !important;
font-size: 8pt !important;
color: #333 !important;
}
/* ── FIELD WARNINGS ─────────────────────────────── */
.field-warnings {
background: #f0f0f0 !important;
border: none !important;
border-left: 3pt solid #555 !important;
border-radius: 0 !important;
padding: 6pt 12pt !important;
margin-bottom: 6pt !important;
page-break-inside: avoid !important;
}
.fw-title {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 1.5pt !important;
color: #333 !important;
margin-bottom: 4pt !important;
}
.fw-item {
font-family: 'Georgia', serif !important;
font-size: 8pt !important;
color: #222 !important;
padding: 1.5pt 0 !important;
border: none !important;
}
/* ── DRONE WIND BOX ─────────────────────────────── */
.drone-wind-box {
background: #fff !important;
border: 0.5pt solid #ddd !important;
border-left: none !important;
border-radius: 0 !important;
padding: 4pt 8pt !important;
margin-bottom: 4pt !important;
page-break-inside: auto !important;
}
/* Wind bar track */
.wbar-track, [style*="background:#e4e4e4"] { background: #e4e4e4 !important; }
.wbar-gust { background: #b8b8b8 !important; }
.wbar-go { background: #222 !important; opacity: 1 !important; }
.wbar-caution { background: #555 !important; opacity: 1 !important; }
.wbar-highrisk{ background: #888 !important; opacity: 1 !important; }
.wbar-grounded{ background: #111 !important; opacity: 1 !important; }
.wbar-label { color: #fff !important; font-size: 5.5pt !important; }
/* Kill dark bg inside drone box */
.drone-wind-box [style*="background:#0d1117"],
.drone-wind-box [style*="background:rgba"] { background: #fff !important; }
.drone-wind-box [style*="color:#fff"],
.drone-wind-box [style*="color:#ccc"],
.drone-wind-box [style*="color:#aaa"],
.drone-wind-box [style*="color:#888"],
.drone-wind-box [style*="color:#999"],
.drone-wind-box [style*="color:#555"],
.drone-wind-box [style*="color:#666"] { color: #444 !important; }
.drone-wind-box [style*="color:#00ff9d"],
.drone-wind-box [style*="color:#ff6b6b"],
.drone-wind-box [style*="color:#ff6b00"],
.drone-wind-box [style*="color:#ffb800"] { color: #222 !important; }
/* Drone wind title + meta row */
.wind-chart-title { color: #555 !important; font-size: 7pt !important; }
.drone-wind-title {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
font-weight: 700 !important;
letter-spacing: 1.5pt !important;
color: #111 !important;
text-transform: uppercase !important;
}
/* "No clean flyable window" pill */
.no-fly-pill {
background: #f0f0f0 !important;
border: 0.5pt solid #ccc !important;
color: #555 !important;
border-radius: 0 !important;
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7.5pt !important;
padding: 4pt 10pt !important;
}
/* "Best flight window" pill */
.best-fly-pill {
background: #f0f0f0 !important;
border: 0.5pt solid #bbb !important;
color: #111 !important;
border-radius: 0 !important;
font-size: 8pt !important;
font-weight: 700 !important;
padding: 4pt 10pt !important;
}
/* ── BEST WINDOW HERO ────────────────────────────── */
.best-window {
background: #f5f5f5 !important;
border: none !important;
border-left: 4pt solid #111 !important;
border-radius: 0 !important;
padding: 5pt 10pt !important;
margin-top: 4pt !important;
page-break-inside: avoid !important;
}
.best-window-label {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
letter-spacing: 2pt !important;
text-transform: uppercase !important;
color: #666 !important;
margin-bottom: 3pt !important;
}
.best-window-time {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 18pt !important;
font-weight: 900 !important;
color: #111 !important;
line-height: 1.1 !important;
letter-spacing: -0.5pt !important;
margin-bottom: 2pt !important;
}
/* "NO CLEAN WINDOW" variant */
.best-window-time[style*="color:#ef4444"],
.best-window-time[style*="color: #ef4444"] {
font-size: 14pt !important;
color: #777 !important;
}
.best-window-reason {
font-family: 'Georgia', serif !important;
font-size: 8pt !important;
color: #444 !important;
font-style: italic !important;
}
/* ── HOURLY GNSS / DOP BLOCK ─────────────────────── */
.gnss-hourly-block {
background: #f7f7f7 !important;
border: none !important;
border-top: 2pt solid #111 !important;
border-radius: 0 !important;
padding: 5pt 8pt !important;
margin-bottom: 4pt !important;
page-break-inside: auto !important;
}
/* Keep each hour row together */
.ghb-row { page-break-inside: avoid !important; }
/* Keep header + first few rows together */
.ghb-header { page-break-after: avoid !important; }
.ghb-col-heads { page-break-after: avoid !important; }
.ghb-header {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
letter-spacing: 2pt !important;
text-transform: uppercase !important;
color: #444 !important;
margin-bottom: 5pt !important;
}
.ghb-col-heads { margin-bottom: 3pt !important; }
.ghb-col-lbl {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
color: #999 !important;
text-transform: uppercase !important;
letter-spacing: 1pt !important;
}
.ghb-time {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
color: #555 !important;
}
.ghb-bar-track {
background: #d8d8d8 !important;
border: none !important;
border-radius: 0 !important;
height: 7pt !important;
}
.ghb-bar-fill {
opacity: 1 !important;
background: #555 !important; /* solid dark grey — readable in print */
}
.ghb-pdop-val {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
color: #000 !important;
font-weight: 700 !important;
line-height: 7pt !important;
}
.ghb-sats {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
color: #333 !important;
font-weight: 600 !important;
}
.ghb-rating {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
color: #000 !important;
text-align: right !important;
}
/* Rating emphasis by class */
.ghb-rating.dop-good { color: #000 !important; font-weight: 700 !important; }
.ghb-rating.dop-ok { color: #222 !important; font-weight: 700 !important; }
.ghb-rating.dop-poor { color: #000 !important; font-weight: 900 !important; }
.ghb-rating.dop-spike { color: #000 !important; font-weight: 900 !important; }
/* AVOID / POOR rows: visible shading in print */
.ghb-row.spike-row {
border-left: 2.5pt solid #333 !important;
padding-left: 3pt !important;
background: #ebebeb !important;
}
/* ── DOP SUMMARY TABLE ───────────────────────────── */
.mask-selector-wrap { display: none !important; }
.dop-table-wrap {
overflow: visible !important;
margin-top: 8pt !important;
page-break-inside: avoid !important;
}
.dop-table {
width: 100% !important;
border-collapse: collapse !important;
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
}
.dop-table th {
background: #d0d0d0 !important;
color: #000 !important;
font-size: 6pt !important;
font-weight: 800 !important;
letter-spacing: 1.5pt !important;
text-transform: uppercase !important;
padding: 4pt 8pt !important;
border-bottom: 1pt solid #999 !important;
text-align: left !important;
}
.dop-table td {
padding: 4pt 8pt !important;
border-bottom: 0.25pt solid #ccc !important;
color: #111 !important;
font-weight: 500 !important;
}
.dop-table tr:last-child td { border-bottom: none !important; }
.dop-good { color: #000 !important; font-weight: 800 !important; }
.dop-ok { color: #111 !important; font-weight: 600 !important; }
.dop-poor { color: #333 !important; font-style: italic !important; }
.dop-footnote {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
color: #555 !important;
margin-top: 5pt !important;
line-height: 1.5 !important;
}
.dop-footnote span { opacity: 1 !important; color: #999 !important; }
/* ── IONOSPHERIC PANEL ───────────────────────────── */
.site-signal-header {
border-top: 2pt solid #111 !important;
padding-top: 6pt !important;
margin-bottom: 8pt !important;
page-break-inside: avoid !important;
}
.site-signal-title {
font-family: 'Space Mono', monospace !important;
font-size: 7pt !important;
font-weight: 700 !important;
letter-spacing: 3pt !important;
color: #111 !important;
margin-bottom: 6pt !important;
text-transform: uppercase !important;
}
.site-signal-facts {
display: flex !important;
gap: 20pt !important;
flex-wrap: wrap !important;
margin-bottom: 4pt !important;
}
.ssf-item { display: flex !important; flex-direction: column !important; gap: 1pt !important; }
.ssf-label {
font-family: 'Space Mono', monospace !important;
font-size: 5.5pt !important;
color: #666 !important;
text-transform: uppercase !important;
letter-spacing: 1pt !important;
}
.ssf-value {
font-family: 'Space Mono', monospace !important;
font-size: 10pt !important;
font-weight: 700 !important;
color: #000 !important;
}
.ssf-note {
font-family: 'Space Mono', monospace !important;
font-size: 5.5pt !important;
color: #555 !important;
}
.iono-panel {
background: #f8f8f8 !important;
border: 0.5pt solid #ddd !important;
border-radius: 0 !important;
padding: 8pt 12pt !important;
page-break-inside: avoid !important;
}
/* ── Airspace / TFR block ─────────────────────────── */
[style*="font-family:monospace"][style*="border-radius:6px"] {
font-size: 5.5pt !important;
padding: 4pt 6pt !important;
margin: 2pt 0 1pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
border-radius: 0 !important;
background: #f8f8f8 !important;
border: 0.5pt solid #ddd !important;
color: #111 !important;
line-height: 1.3 !important;
}
[style*="font-family:monospace"][style*="border-radius:6px"] * {
color: #111 !important;
font-size: 5.5pt !important;
line-height: 1.3 !important;
margin: 0 !important;
padding: 0 !important;
}
.iono-panel * { color: #111 !important; background: transparent !important; }
/* ── WEEK SUMMARY BAR ────────────────────────────── */
.week-summary {
background: #f0f0f0 !important;
border: 0.5pt solid #ccc !important;
border-radius: 0 !important;
padding: 8pt 12pt !important;
margin-bottom: 10pt !important;
page-break-inside: avoid !important;
page-break-before: avoid !important;
break-before: avoid !important;
}
.week-summary * { color: #111 !important; }
/* ── METRICS STRIP ───────────────────────────────── */
.metrics {
display: grid !important;
grid-template-columns: 1fr 1fr 1fr 1fr !important;
gap: 6pt !important;
page-break-inside: avoid !important;
margin-bottom: 10pt !important;
}
.metric-card {
background: transparent !important;
border: none !important;
border-top: 2pt solid #111 !important;
padding: 5pt 0 0 0 !important;
}
.metric-name {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 5.5pt !important;
text-transform: uppercase !important;
letter-spacing: 1pt !important;
color: #888 !important;
margin-bottom: 2pt !important;
}
.metric-value {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 10pt !important;
font-weight: 700 !important;
color: #111 !important;
margin-bottom: 3pt !important;
}
.metric-bar { background: #e0e0e0 !important; height: 3pt !important; border-radius: 0 !important; }
.metric-bar-fill { background: #111 !important; }
/* ── DAY CARDS ───────────────────────────────────── */
.day-card {
background: #fff !important;
border: none !important;
border-top: 0.75pt solid #111 !important;
border-radius: 0 !important;
/* Don't avoid page break for the full card — too tall at 14 DOP rows + wind bars */
page-break-inside: auto !important;
}
/* Keep the card header on same page as first content block */
.day-card-header {
page-break-after: avoid !important;
}
.day-card-header { background: #fff !important; }
.day-card-body { background: #fff !important; }
.day-card-datestr {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 11pt !important;
font-weight: 700 !important;
color: #111 !important;
}
/* ── WX PILLS ────────────────────────────────────── */
.wx-pill {
background: #f0f0f0 !important;
color: #111 !important;
border: 0.5pt solid #ccc !important;
border-radius: 0 !important;
}
.wx-pill span { color: #111 !important; }
/* ── TAGS ────────────────────────────────────────── */
.tag {
background: #e8e8e8 !important;
color: #333 !important;
border-radius: 0 !important;
}
/* ── DAY DETAIL CARDS ────────────────────────────── */
.day-detail {
background: transparent !important;
border: none !important;
border-top: 0.75pt solid #111 !important;
margin-bottom: 0 !important;
page-break-inside: avoid !important;
}
.day-detail-body { display: block !important; }
.day-detail-header {
display: flex !important;
align-items: center !important;
gap: 8pt !important;
padding: 8pt 0 6pt 0 !important;
}
.day-detail-header h3 {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 11pt !important;
font-weight: 700 !important;
color: #111 !important;
margin: 0 !important;
flex: 1 !important;
}
.chevron { display: none !important; }
.go-avoid-badge {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
letter-spacing: 1pt !important;
border: 0.5pt solid #111 !important;
background: transparent !important;
color: #111 !important;
padding: 1.5pt 5pt !important;
border-radius: 0 !important;
}
/* ── WINDOW ROWS ─────────────────────────────────── */
.windows-grid { page-break-inside: avoid !important; }
.window-row {
display: grid !important;
grid-template-columns: 120pt 1fr auto !important;
align-items: start !important;
gap: 8pt !important;
padding: 5pt 0 !important;
background: transparent !important;
border: none !important;
border-bottom: 0.25pt solid #e0e0e0 !important;
border-radius: 0 !important;
margin: 0 !important;
}
.window-row.best { background: #f5f5f5 !important; padding: 5pt 6pt !important; }
.window-row.avoid { background: transparent !important; }
.window-time {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 8.5pt !important;
font-weight: 700 !important;
color: #111 !important;
}
.window-desc strong {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 8.5pt !important;
font-weight: 700 !important;
color: #111 !important;
}
.window-desc .detail {
font-family: 'Georgia', serif !important;
font-size: 7.5pt !important;
color: #555 !important;
}
/* ── REC BOXES ───────────────────────────────────── */
.rec-box {
border: none !important;
border-left: 2pt solid #bbb !important;
padding: 3pt 0 3pt 8pt !important;
margin-bottom: 2pt !important;
background: transparent !important;
page-break-inside: avoid !important;
}
.rec-box h4 {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 9pt !important;
font-weight: 700 !important;
color: #111 !important;
margin: 0 0 2pt 0 !important;
text-transform: uppercase !important;
}
.rec-box p {
font-family: 'Georgia', serif !important;
font-size: 8.5pt !important;
color: #333 !important;
margin: 0 !important;
font-style: italic !important;
}
.rec-box.warn { border-left-color: #555 !important; }
.rec-box.danger { border-left-color: #111 !important; background: #f5f5f5 !important; }
/* ── RESOURCE LINKS (last page) ──────────────────── */
.resource-links-section, .links-section {
page-break-before: always !important;
}
.resource-link-cat {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 2pt !important;
color: #666 !important;
border-top: 0.5pt solid #ccc !important;
padding-top: 5pt !important;
margin: 10pt 0 4pt 0 !important;
}
.resource-link-item {
font-family: 'Georgia', serif !important;
font-size: 8pt !important;
color: #111 !important;
padding: 2pt 0 !important;
}
.resource-link-item a {
color: #333 !important;
text-decoration: underline !important;
}
/* ── RANKING PAGE ────────────────────────────────── */
.ranking-page-inner {
background: #fff !important;
page-break-after: always !important;
break-after: always !important;
padding: 0 !important;
}
.ranking-page-header {
display: flex !important;
align-items: baseline !important;
gap: 10pt !important;
margin-bottom: 6pt !important;
padding-bottom: 5pt !important;
border-bottom: 2pt solid #111 !important;
}
.ranking-page-title {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 18pt !important;
font-weight: 900 !important;
color: #111 !important;
letter-spacing: -0.3pt !important;
text-transform: uppercase !important;
}
.ranking-page-sub {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
color: #666 !important;
text-transform: uppercase !important;
letter-spacing: 1pt !important;
}
.ranking-meta-note {
font-family: 'Georgia', serif !important;
font-size: 7.5pt !important;
color: #555 !important;
font-style: italic !important;
margin-bottom: 8pt !important;
}
.ranking-table-wrap { overflow: visible !important; }
.ranking-table {
width: 100% !important;
border-collapse: collapse !important;
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
}
.ranking-table thead tr {
border-bottom: 1.5pt solid #111 !important;
}
.ranking-table th {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 1.5pt !important;
color: #555 !important;
padding: 4pt 6pt !important;
text-align: left !important;
background: transparent !important;
vertical-align: bottom !important;
}
.rh-sub {
font-size: 5pt !important;
color: #999 !important;
font-weight: 400 !important;
letter-spacing: 0.5pt !important;
display: block !important;
}
.rank-row td {
padding: 7pt 6pt !important;
border-bottom: 0.5pt solid #e0e0e0 !important;
vertical-align: top !important;
color: #111 !important;
}
.rank-row-top td { background: transparent !important; }
.rank-row-top:first-child td { background: #f5f5f5 !important; }
.rank-row-low td { color: #666 !important; }
.rank-n {
font-family: 'Barlow', 'Arial Black', Arial, sans-serif !important;
font-size: 18pt !important;
font-weight: 900 !important;
color: #111 !important;
line-height: 1 !important;
width: 22pt !important;
padding-top: 5pt !important;
}
.rank-row-low .rank-n { color: #bbb !important; }
.rank-date {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 9pt !important;
font-weight: 700 !important;
color: #111 !important;
white-space: nowrap !important;
min-width: 70pt !important;
}
.rank-dow {
display: block !important;
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 400 !important;
color: #888 !important;
margin-top: 1pt !important;
}
.rank-weekend-tag {
display: inline-block !important;
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 5.5pt !important;
color: #888 !important;
border: 0.5pt solid #ccc !important;
padding: 0.5pt 3pt !important;
margin-top: 2pt !important;
letter-spacing: 0.5pt !important;
}
.rank-pdop {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 11pt !important;
font-weight: 700 !important;
color: #111 !important;
white-space: nowrap !important;
min-width: 32pt !important;
}
.rank-row-low .rank-pdop { color: #888 !important; }
.rank-sats {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7.5pt !important;
color: #333 !important;
white-space: nowrap !important;
}
.rank-wx {
font-family: 'Georgia', serif !important;
font-size: 7.5pt !important;
color: #444 !important;
white-space: nowrap !important;
min-width: 55pt !important;
}
.rank-badge-cell { white-space: nowrap !important; }
.rank-badge {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
letter-spacing: 1pt !important;
text-transform: uppercase !important;
padding: 2pt 5pt !important;
border-radius: 0 !important;
white-space: nowrap !important;
}
.rank-go { background: #111 !important; color: #fff !important;
-webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }
.rank-caution { background: #fff !important; color: #111 !important; border: 1pt solid #111 !important; }
.rank-nogo { background: #fff !important; color: #999 !important; border: 1pt solid #ccc !important; }
.rank-notes {
font-family: 'Georgia', serif !important;
font-size: 7pt !important;
color: #444 !important;
font-style: italic !important;
line-height: 1.45 !important;
}
/* ── COVER PAGE ──────────────────────────────────── */
.cover-page {
page-break-after: always !important;
background: #fff !important;
}
/* ── PAGE BREAK HINTS ────────────────────────────── */
.page-break-before { page-break-before: always !important; }
.page-break-after { page-break-after: always !important; }
}
::-webkit-scrollbar{width:4px;height:4px}
::-webkit-scrollbar-track{background:var(--bg)}
::-webkit-scrollbar-thumb{background:var(--amber-dim)}
/* Print header elements - hidden on screen */
.print-header-info { display: none; }
.print-footer { display: none; }
@media print {
/* Map .hdr to behave like header for print */
.hdr {
display: none !important;
}
.print-header-info {
display: flex !important;
flex-direction: column !important;
align-items: flex-end !important;
gap: 2pt !important;
text-align: right !important;
}
.print-header-info div {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 7.5pt !important;
color: #444 !important;
line-height: 1.4;
}
.print-header-info div:first-child {
font-size: 9pt !important;
font-weight: 700 !important;
color: #111 !important;
}
.print-footer {
display: flex !important;
position: fixed !important;
bottom: 0 !important;
left: 20mm !important;
right: 20mm !important;
border-top: 0.5pt solid #ccc !important;
padding: 3pt 0 !important;
justify-content: space-between !important;
}
.print-footer span {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
color: #999 !important;
}
/* Hide app chrome */
.mode-toggle, .sec, .status-bar, .progress-box,
.export-row, .export-btn, .manual-analyze-btn, .analyze-btn,
.progress-step, .warn-banner, .new-badge,
.run-btn, #run-btn { display: none !important; }
/* Keep mode-panel containers visible — results live inside them */
.mode-panel, #auto-panel, #manual-panel { display: block !important; }
.results-area, .results-area.visible,
#auto-results, #manual-results, #report-cover,
#ranking-page, .cover-page { display: block !important; }
/* Expand all day cards */
.day-card-body { display: block !important; }
.day-card-chevron { display: none !important; }
/* Forced colors for wind bars */
.wbar-go { background: #222 !important; opacity: 1 !important; }
.wbar-caution { background: #555 !important; opacity: 1 !important; }
.wbar-highrisk { background: #777 !important; opacity: 1 !important; }
.wbar-grounded { background: #111 !important; opacity: 1 !important; }
.wbar-track { background: #e4e4e4 !important; }
.wbar-gust { background: #c0c0c0 !important; }
.wbar-label { color: #fff !important; }
.iono-level { background: #eee !important; color: #111 !important; border: 0.5pt solid #999 !important; }
/* ── STATIC BASE OBSERVATION WINDOW ── */
.static-window-card {
background: transparent !important;
border: none !important;
border-top: 2pt solid #111 !important;
padding: 6pt 0 !important;
margin-bottom: 8pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
page-break-before: always !important;
break-before: always !important;
}
.static-window-grid {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
gap: 10pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
}
.static-window-primary {
background: #f0f0f0 !important;
border: none !important;
border-top: 3pt solid #111 !important;
padding: 8pt 10pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
}
.static-window-backup {
background: transparent !important;
border: none !important;
border-top: 1pt solid #bbb !important;
padding: 8pt 10pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
}
.static-window-rec-label {
font-family: 'Space Mono', monospace !important;
font-size: 6pt !important;
font-weight: 700 !important;
letter-spacing: 2pt !important;
color: #666 !important;
margin-bottom: 3pt !important;
}
.static-window-date {
font-family: 'Space Mono', monospace !important;
font-size: 6.5pt !important;
color: #555 !important;
margin-bottom: 2pt !important;
}
/* ── Site Conditions page ──────────────────────────── */
.site-cond-wrap {
font-size: 8pt !important;
page-break-before: always !important;
break-before: always !important;
}
.site-cond-title {
font-family: 'Space Mono', monospace !important;
font-size: 7pt !important;
letter-spacing: 0.15em !important;
color: #111 !important;
font-weight: 700 !important;
border-bottom: 1.5pt solid #111 !important;
padding-bottom: 5pt !important;
margin-bottom: 8pt !important;
}
.site-cond-section-head {
font-family: 'Space Mono', monospace !important;
font-size: 6.5pt !important;
font-weight: 700 !important;
letter-spacing: 0.12em !important;
color: #444 !important;
border-bottom: 0.5pt solid #ccc !important;
padding-bottom: 3pt !important;
margin: 10pt 0 5pt 0 !important;
}
.gauge-row {
display: grid !important;
grid-template-columns: 2fr 0.7fr 0.7fr 0.7fr 1fr !important;
gap: 0 8pt !important;
padding: 3pt 0 !important;
border-bottom: 0.25pt solid #eee !important;
align-items: center !important;
}
.cdec-row {
display: grid !important;
grid-template-columns: 2fr 0.6fr 0.9fr 0.7fr 0.8fr 0.6fr !important;
gap: 0 8pt !important;
padding: 3pt 0 !important;
border-bottom: 0.25pt solid #eee !important;
align-items: center !important;
}
.gauge-head {
font-weight: 700 !important;
color: #666 !important;
font-size: 6pt !important;
letter-spacing: 0.08em !important;
}
.gauge-name { font-weight: 600 !important; color: #111 !important; }
.gauge-val { color: #333 !important; text-align: right !important; }
.flood-normal { color: #16a34a !important; font-weight: 700 !important; }
.flood-action { color: #ca8a04 !important; font-weight: 700 !important; }
.flood-flood { color: #dc2626 !important; font-weight: 700 !important; }
.flood-moderate { color: #dc2626 !important; font-weight: 700 !important; }
.flood-major { color: #7c3aed !important; font-weight: 700 !important; }
.flood-unknown { color: #888 !important; }
/* ── Control points page ───────────────────────────── */
.control-page-wrap {
font-size: 8pt !important;
page-break-before: always !important;
break-before: always !important;
}
.control-page-title {
font-family: 'Space Mono', monospace !important;
font-size: 7pt !important;
letter-spacing: 0.15em !important;
color: #111 !important;
font-weight: 700 !important;
border-bottom: 1.5pt solid #111 !important;
padding-bottom: 5pt !important;
margin-bottom: 8pt !important;
}
.control-section-head {
font-family: 'Space Mono', monospace !important;
font-size: 6.5pt !important;
font-weight: 700 !important;
letter-spacing: 0.12em !important;
color: #444 !important;
margin: 8pt 0 4pt !important;
text-transform: uppercase !important;
}
.control-table {
width: 100% !important;
border-collapse: collapse !important;
font-size: 7.5pt !important;
font-family: 'IBM Plex Mono', monospace !important;
margin-bottom: 10pt !important;
}
.control-table th {
font-size: 6pt !important;
font-weight: 700 !important;
color: #666 !important;
border-bottom: 0.5pt solid #ccc !important;
padding: 2pt 4pt !important;
text-align: left !important;
letter-spacing: 0.1em !important;
text-transform: uppercase !important;
}
.control-table td {
padding: 2pt 4pt !important;
border-bottom: 0.25pt solid #eee !important;
vertical-align: middle !important;
color: #111 !important;
}
.control-id {
font-weight: 700 !important;
color: #000 !important;
}
.control-qr img, .control-qr canvas {
width: 32pt !important;
height: 32pt !important;
}
.fema-box {
display: flex !important;
gap: 10pt !important;
align-items: flex-start !important;
background: #f8f8f8 !important;
padding: 6pt 10pt !important;
border: 0.5pt solid #ddd !important;
page-break-inside: avoid !important;
}
.fema-zone-badge {
font-family: 'Space Mono', monospace !important;
font-size: 8pt !important;
font-weight: 700 !important;
color: #111 !important;
background: transparent !important;
}
.fema-meta {
font-size: 7pt !important;
color: #333 !important;
}
.static-window-inner {
page-break-inside: avoid !important;
break-inside: avoid !important;
}
.static-window-card-title {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6.5pt !important;
font-weight: 700 !important;
letter-spacing: 2pt !important;
text-transform: uppercase !important;
color: #666 !important;
margin-bottom: 8pt !important;
border: none !important;
page-break-after: avoid !important;
break-after: avoid !important;
}
.static-window-card-title::after {
content: '' !important;
flex: 1 !important;
height: 0.5pt !important;
background: #ddd !important;
}
.static-window-grid {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
gap: 12pt !important;
}
.static-window-primary {
background: #f0f0f0 !important;
border: none !important;
border-top: 3pt solid #111 !important;
padding: 8pt 10pt !important;
}
.static-window-backup {
background: transparent !important;
border: none !important;
border-top: 1pt solid #bbb !important;
padding: 8pt 10pt !important;
}
.static-window-rec-label {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 6pt !important;
font-weight: 900 !important;
letter-spacing: 2pt !important;
color: #000 !important;
border-bottom: 1.5pt solid #111 !important;
padding-bottom: 3pt !important;
margin-bottom: 5pt !important;
}
.static-window-rec-label-alt {
color: #666 !important;
border-bottom-color: #bbb !important;
font-weight: 700 !important;
border-bottom-width: 0.5pt !important;
}
.static-window-date {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
color: #555 !important;
margin-bottom: 3pt !important;
}
.static-window-time {
font-family: 'Barlow', 'Arial Black', sans-serif !important;
font-size: 20pt !important;
font-weight: 900 !important;
color: #111 !important;
letter-spacing: -0.5pt !important;
line-height: 1.1 !important;
margin-bottom: 3pt !important;
}
.static-window-time.backup {
font-size: 14pt !important;
color: #444 !important;
}
.static-window-meta {
font-family: 'Space Mono', 'Courier New', monospace !important;
font-size: 7pt !important;
color: #333 !important;
margin-bottom: 3pt !important;
}
.static-window-reason {
font-family: 'Georgia', serif !important;
font-size: 7.5pt !important;
color: #444 !important;
font-style: italic !important;
}
}
/* ═══════════════════════════════════════════════════════
COVER SHEET — screen hidden, print only
═══════════════════════════════════════════════════════ */
#report-cover { display: none; }
/* Cover on-screen summary table styles */
#report-cover .cover-day-row { display: grid; grid-template-columns: 22px 100px 120px 80px 56px 1fr auto; align-items: center; padding: 7px 0; border-bottom: 1px solid #333; gap: 10px; font-family: "IBM Plex Mono", monospace; font-size: 12px; color: var(--text); }
#report-cover .cover-day-row:first-child { border-top: 1px solid #333; }
#report-cover .cover-rank-num { font-size: 16px; font-weight: 700; color: var(--amber); }
#report-cover .cover-day-dow { font-size: 10px; font-weight: 700; letter-spacing: .1em; }
#report-cover .cover-day-fulldate { font-size: 11px; color: var(--text-dim); }
#report-cover .cover-day-gnss-window { font-size: 12px; }
#report-cover .cover-day-pdop-sats { font-size: 10px; color: var(--text-dim); }
#report-cover .cover-day-wx-col { font-size: 11px; color: var(--text-dim); }
#report-cover .cover-day-note { font-size: 10px; color: var(--text-dim); }
#report-cover .cover-badge-go { background: rgba(34,197,94,.15); color: var(--green); border: 1px solid rgba(34,197,94,.3); font-size: 9px; font-weight: 700; padding: 3px 8px; letter-spacing: .1em; }
#report-cover .cover-badge-caution { background: rgba(234,179,8,.15); color: var(--yellow); border: 1px solid rgba(234,179,8,.3); font-size: 9px; font-weight: 700; padding: 3px 8px; letter-spacing: .1em; }
#report-cover .cover-badge-nogo { background: rgba(239,68,68,.15); color: var(--red); border: 1px solid rgba(239,68,68,.3); font-size: 9px; font-weight: 700; padding: 3px 8px; letter-spacing: .1em; }
#report-cover .cover-summary-table { padding: 0 20px; display: flex; flex-direction: column; }
#report-cover .cover-job-meta { display: flex; gap: 8px; font-family: "IBM Plex Mono", monospace; font-size: 12px; color: var(--text-dim); flex-wrap: wrap; }
#report-cover .cover-aqi-val { font-size: 11px; font-weight: 700; }
#report-cover .cover-aqi-alert { background: var(--red); color: #fff; padding: 2px 5px; }
.cover-page {
width: 100%;
height: auto;
max-height: none;
background: #fff;
display: flex;
flex-direction: column;
padding: 0;
box-sizing: border-box;
font-family: 'Barlow', Arial, sans-serif;
color: #111;
overflow: hidden;
}
.cover-top-rule {
height: 5px;
background: #111;
width: 100%;
flex-shrink: 0;
}
.cover-logo-block {
padding: 28px 52px 0;
display: flex;
flex-direction: column;
gap: 4px;
flex-shrink: 0;
}
.cover-globe {
font-size: 36px;
line-height: 1;
margin-bottom: 6px;
}
.cover-wordmark {
font-family: 'Barlow', Arial, sans-serif;
font-size: 54px;
font-weight: 900;
letter-spacing: -2px;
color: #111;
line-height: 0.9;
}
.cover-tagline {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
font-weight: 400;
letter-spacing: 0.25em;
color: #666;
margin-top: 4px;
}
.cover-rule {
height: 1px;
background: #ddd;
margin: 18px 52px;
}
.cover-job-block {
padding: 0 52px;
display: flex;
flex-direction: column;
gap: 4px;
flex-shrink: 0;
}
.cover-job-company {
font-family: 'Barlow', Arial, sans-serif;
font-size: 24px;
font-weight: 700;
color: #111;
line-height: 1.1;
}
.cover-job-name {
font-family: 'Barlow', Arial, sans-serif;
font-size: 15px;
font-weight: 400;
color: #444;
}
.cover-job-meta {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
color: #888;
margin-top: 3px;
display: flex;
gap: 8px;
flex-wrap: wrap;
align-items: center;
}
.cover-meta-sep { color: #ccc; }
.cover-section-label {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.2em;
color: #999;
text-transform: uppercase;
padding: 16px 52px 10px;
border-top: 0.5px solid #eee;
margin-top: 16px;
flex-shrink: 0;
}
/* Summary table */
.cover-summary-table {
padding: 0 52px;
display: flex;
flex-direction: column;
gap: 0;
flex: 0 0 auto;
}
.cover-day-row {
display: grid;
grid-template-columns: 22px 100px 120px 80px 56px 1fr auto;
align-items: center;
padding: 7px 0;
border-bottom: 0.5px solid #eee;
gap: 10px;
}
.cover-day-row.no-aqi {
grid-template-columns: 22px 100px 120px 80px 1fr auto;
}
.cover-day-row:first-child { border-top: 0.5px solid #eee; }
/* Rank 1 gets a subtle highlight */
.cover-rank-1 { background: #f5f5f5; margin: 0 -12px; padding: 8px 12px; }
.cover-rank-wknd .cover-day-fulldate,
.cover-rank-wknd .cover-day-dow { opacity: 0.55; }
/* AQI badge */
.cover-aqi {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 3px 6px;
border-radius: 3px;
min-width: 44px;
text-align: center;
}
.cover-aqi-val {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 11px;
font-weight: 700;
line-height: 1;
}
.cover-aqi-cat {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 6px;
margin-top: 2px;
line-height: 1.2;
text-align: center;
}
.cover-aqi-ok { background: transparent; color: #666; }
.cover-aqi-alert { background: #c62828; color: #fff; border-radius: 3px; }
.cover-aqi-nokey { background: #f0f0f0; color: #bbb; border: 1px dashed #ddd; }
.cover-rank-num {
font-family: 'Barlow', Arial, sans-serif;
font-size: 16px;
font-weight: 900;
color: #111;
line-height: 1;
}
.cover-rank-1 .cover-rank-num { color: #111; }
.cover-rank-wknd .cover-rank-num { color: #bbb; }
.cover-day-dowcol {
display: flex;
flex-direction: column;
gap: 1px;
}
.cover-day-dow {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.1em;
color: #111;
}
.cover-day-fulldate {
font-family: 'Barlow', Arial, sans-serif;
font-size: 12px;
font-weight: 400;
color: #555;
}
.cover-wknd-tag {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 7px;
color: #999;
border: 0.5px solid #ddd;
padding: 1px 4px;
margin-top: 2px;
display: inline-block;
letter-spacing: 0.5px;
}
.cover-day-gnss-col {
display: flex;
flex-direction: column;
gap: 2px;
}
.cover-day-gnss-window {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
font-weight: 700;
color: #111;
white-space: nowrap;
}
.cover-day-pdop-sats {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 8px;
color: #888;
}
.cover-day-wx-col {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 8px;
color: #666;
}
.cover-day-note {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 8px;
color: #888;
font-style: italic;
}
.cover-day-badge {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.08em;
padding: 4px 10px;
border-radius: 2px;
min-width: 72px;
text-align: center;
}
.cover-badge-go {
background: #111;
color: #fff;
}
.cover-badge-caution {
background: #fff;
color: #111;
border: 1.5px solid #111;
}
.cover-badge-nogo {
background: #fff;
color: #999;
border: 1.5px solid #ccc;
}
/* Bottom row */
.cover-bottom-row {
display: flex;
align-items: flex-end;
justify-content: space-between;
padding: 16px 52px 22px;
margin-top: 24px;
flex-shrink: 0;
}
.cover-qr-block {
display: flex;
align-items: center;
gap: 16px;
}
#cover-qr-canvas {
width: 80px;
height: 80px;
flex-shrink: 0;
}
#cover-qr-canvas canvas,
#cover-qr-canvas img {
width: 80px !important;
height: 80px !important;
}
.cover-qr-note {
display: flex;
flex-direction: column;
gap: 4px;
}
.cover-qr-line1 {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
font-weight: 700;
color: #111;
letter-spacing: 0.05em;
}
.cover-qr-line2 {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
color: #888;
}
.cover-report-label {
text-align: right;
}
.cover-report-type {
font-family: 'Barlow', Arial, sans-serif;
font-size: 13px;
font-weight: 700;
color: #111;
letter-spacing: 0.02em;
}
.cover-report-sub {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 9px;
color: #999;
margin-top: 3px;
}
.cover-report-accuracy {
font-family: 'Space Mono', 'Courier New', monospace;
font-size: 7px;
color: #bbb;
margin-top: 4px;
letter-spacing: 0.02em;
line-height: 1.5;
}
.cover-bottom-rule {
height: 4px;
background: #111;
width: 100%;
}
/* ── PRINT OVERRIDES FOR COVER ───────────────────────────────── */
@media print {
#report-cover {
display: block !important;
page-break-after: always !important;
}
.cover-page {
width: 100% !important;
min-height: 0 !important;
height: auto !important;
max-height: none !important;
overflow: visible !important;
page-break-after: always !important;
break-after: always !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
.cover-top-rule,
.cover-bottom-rule {
background: #111 !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
.cover-badge-go {
background: #111 !important;
color: #fff !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
/* Ranked cover row — print layout */
.cover-day-row {
grid-template-columns: 16pt 78pt 98pt 56pt 38pt 1fr auto !important;
padding: 5pt 0 !important;
gap: 5pt !important;
}
/* When AQI column has no data, collapse it */
.cover-day-row:has(.no-print) {
grid-template-columns: 16pt 78pt 98pt 56pt 0 1fr auto !important;
}
.cover-aqi {
padding: 2pt 4pt !important;
border-radius: 2pt !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
.cover-aqi-val { font-size: 8pt !important; }
.cover-aqi-cat { font-size: 5pt !important; }
.cover-rank-1 {
background: #f0f0f0 !important;
margin: 0 -8pt !important;
padding: 5pt 8pt !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
.cover-rank-num {
font-size: 13pt !important;
font-weight: 900 !important;
color: #111 !important;
line-height: 1 !important;
}
.cover-rank-wknd .cover-rank-num { color: #bbb !important; }
.cover-day-dow {
font-size: 7pt !important;
font-weight: 700 !important;
letter-spacing: 0.5pt !important;
color: #111 !important;
}
.cover-day-fulldate {
font-size: 8.5pt !important;
color: #333 !important;
}
.cover-wknd-tag {
font-size: 5pt !important;
color: #999 !important;
border-color: #ddd !important;
}
.cover-day-gnss-window {
font-size: 8pt !important;
font-weight: 700 !important;
color: #111 !important;
}
.cover-day-pdop-sats {
font-size: 6.5pt !important;
color: #666 !important;
}
.cover-day-wx-col {
font-size: 7pt !important;
color: #444 !important;
}
.cover-aqi.no-print { display: none !important; }
.cover-day-note {
font-size: 6.5pt !important;
color: #666 !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
}
.cover-day-badge {
font-size: 6.5pt !important;
padding: 2pt 5pt !important;
}
#cover-qr-canvas canvas,
#cover-qr-canvas img {
width: 80px !important;
height: 80px !important;
}
/* Force each day card onto its own page after the cover */
.day-card {
page-break-before: always !important;
page-break-inside: auto !important;
break-before: always !important;
}
/* ── COMPACT DAY LAYOUT — fit each day on one page ──── */
/* Day card structure */
.day-card-header { padding: 3pt 7pt !important; margin-bottom: 1pt !important; }
.day-num { font-size: 7pt !important; padding: 1.5pt 4pt !important; }
.day-title { font-size: 11pt !important; }
.day-card-body { padding: 0 5pt 1pt 5pt !important; }
/* Stat badges row */
.day-stats-row { gap: 2pt !important; margin-bottom: 2pt !important; flex-wrap: wrap !important; }
.day-stat { padding: 1.5pt 4pt !important; font-size: 6pt !important; }
/* wx pills row — shrink and wrap */
.wx-pills { gap: 3pt !important; margin-bottom: 3pt !important; flex-wrap: wrap !important; }
.wx-pill { padding: 1.5pt 5pt !important; font-size: 6pt !important; }
.wx-pill span { font-size: 6pt !important; }
/* GNSS summary line above hourly table */
[style*="Avg PDOP"] { font-size: 6.5pt !important; margin-bottom: 2pt !important; }
/* Hourly DOP block — tighten rows significantly */
.gnss-hourly-block { margin-bottom: 3pt !important; padding: 4pt 6pt !important; }
.ghb-header { padding: 0 0 3pt 0 !important; margin-bottom: 2pt !important; }
.ghb-header * { font-size: 6pt !important; }
.ghb-col-heads { padding: 0 0 1pt 0 !important; margin-bottom: 1pt !important; }
.ghb-col-heads * { font-size: 5.5pt !important; }
/* Override inline margin-bottom:3px on each row */
.ghb-row { margin-bottom: 0 !important; padding-top: 0 !important; padding-bottom: 0 !important; }
/* Override inline height on bar track */
.ghb-bar-track { height: 10px !important; min-height: 0 !important; background: #d0d0d0 !important; }
.ghb-bar-fill { height: 10px !important; opacity: 1 !important; background: #444 !important; }
.ghb-pdop-val { line-height: 10px !important; font-size: 6pt !important; color: #000 !important; font-weight: 700 !important; }
.ghb-time { font-size: 6pt !important; color: #333 !important; }
.ghb-sats { font-size: 6pt !important; color: #333 !important; font-weight: 600 !important; }
.ghb-rating { font-size: 5.5pt !important; color: #000 !important; font-weight: 700 !important; }
/* Weather callout box */
.weather-callout { padding: 4pt 6pt !important; margin: 2pt 0 !important; }
.weather-callout * { font-size: 6.5pt !important; }
/* Drone wind box — shrink hard, allow break if needed */
.drone-wind-box {
padding: 4pt 6pt !important;
margin-top: 2pt !important;
margin-bottom: 2pt !important;
page-break-inside: avoid !important;
break-inside: avoid !important;
}
.drone-wind-box > * { font-size: 6pt !important; line-height: 1.25 !important; }
/* Wind bar rows — tighter */
.wind-bar-row {
margin-bottom: 0 !important;
min-height: 0 !important;
padding: 0 !important;
}
.wind-bar-label { font-size: 5.5pt !important; min-width: 22pt !important; width: 22pt !important; }
.wind-bar-track { height: 8px !important; }
.wind-bar-fill { height: 8px !important; }
.wind-threshold-line { height: 8px !important; }
/* Drone wind bar track (inline-styled divs) — override via class */
.wbar-track { height: 10px !important; }
.wbar-wind,
.wbar-gust { top: 1px !important; height: 8px !important; }
.wbar-label { font-size: 5.5pt !important; line-height: 10px !important; }
/* Drone wind bar wrapper rows use inline margin-bottom:4px — shrink via container */
.drone-wind-box > div > div { margin-bottom: 0 !important; }
.wind-val { font-size: 5.5pt !important; min-width: 36pt !important; }
.wind-dir-label { font-size: 5.5pt !important; width: 18pt !important; }
.wbar-row { min-height: 12px !important; height: 12px !important; }
/* Best window callout */
.best-window { padding: 4pt 6pt !important; margin-top: 2pt !important; }
.best-window-time { font-size: 14pt !important; line-height: 1.1 !important; }
.best-window-label { font-size: 5.5pt !important; margin-bottom: 1.5pt !important; }
.best-window-reason { font-size: 6pt !important; margin-top: 1.5pt !important; }
/* ── END COMPACT RULES ───────────────────────────── */
/* Iono + DOP on page 2, right after cover */
#iono-panel {
page-break-inside: avoid !important;
}
#ranking-page { display: none !important; }
#dop-section {
page-break-inside: avoid !important;
page-break-before: avoid !important;
break-before: avoid !important;
}
/* Expand all day cards for print */
.day-card-body {
display: block !important;
}
.day-card-chevron { display: none !important; }
}
/* ═══════════════════════════════════════════════════════
RANKING PAGE — screen styles
═══════════════════════════════════════════════════════ */
#ranking-page {
background: var(--bg2);
border: 1px solid var(--border);
padding: 20px 24px;
margin-bottom: 14px;
}
#ranking-page .ranking-page-header {
display: flex;
align-items: baseline;
gap: 12px;
margin-bottom: 6px;
padding-bottom: 8px;
border-bottom: 2px solid var(--amber);
}
#ranking-page .ranking-page-title {
font-family: 'Barlow', Arial, sans-serif;
font-size: 20px;
font-weight: 900;
color: var(--text);
letter-spacing: -0.3px;
text-transform: uppercase;
}
#ranking-page .ranking-page-sub {
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
color: var(--text-dim);
text-transform: uppercase;
letter-spacing: 1px;
}
#ranking-page .ranking-meta-note {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-muted);
font-style: italic;
margin-bottom: 12px;
}
#ranking-page .ranking-table {
width: 100%;
border-collapse: collapse;
font-family: 'IBM Plex Mono', monospace;
font-size: 11px;
}
#ranking-page .ranking-table th {
font-size: 9px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--text-dim);
padding: 6px 8px;
text-align: left;
border-bottom: 1px solid var(--border-bright);
background: var(--bg3);
vertical-align: bottom;
}
#ranking-page .rh-sub { font-size: 8px; color: var(--text-muted); font-weight: 400; display: block; }
#ranking-page .rank-row td {
padding: 8px 8px;
border-bottom: 1px solid var(--border);
vertical-align: top;
color: var(--text);
}
#ranking-page .rank-row-top:first-child td { background: rgba(245,158,11,0.04); }
#ranking-page .rank-row-low td { opacity: 0.6; }
#ranking-page .rank-n {
font-family: 'Barlow', Arial, sans-serif;
font-size: 22px;
font-weight: 900;
color: var(--amber);
line-height: 1;
width: 28px;
padding-top: 4px;
}
#ranking-page .rank-row-low .rank-n { color: var(--text-muted); }
#ranking-page .rank-date {
font-family: 'Barlow', Arial, sans-serif;
font-size: 13px;
font-weight: 700;
color: var(--text);
white-space: nowrap;
}
#ranking-page .rank-dow {
display: block;
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
color: var(--text-muted);
margin-top: 2px;
}
#ranking-page .rank-weekend-tag {
display: inline-block;
font-family: 'IBM Plex Mono', monospace;
font-size: 8px;
color: var(--amber-dim);
border: 1px solid var(--border);
padding: 1px 4px;
margin-top: 3px;
letter-spacing: 0.5px;
}
#ranking-page .rank-pdop {
font-family: 'Barlow', Arial, sans-serif;
font-size: 15px;
font-weight: 700;
color: var(--text);
white-space: nowrap;
}
#ranking-page .rank-sats {
font-family: 'IBM Plex Mono', monospace;
font-size: 11px;
color: var(--text-dim);
}
#ranking-page .rank-wx {
font-size: 11px;
color: var(--text-dim);
white-space: nowrap;
}
#ranking-page .rank-badge { font-size: 9px; font-weight: 700; letter-spacing: 1px; padding: 3px 7px; white-space: nowrap; }
#ranking-page .rank-go { background: var(--amber); color: #000; }
#ranking-page .rank-caution { background: transparent; color: var(--amber); border: 1px solid var(--amber); }
#ranking-page .rank-nogo { background: transparent; color: var(--text-muted); border: 1px solid var(--border); }
#ranking-page .rank-notes {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-dim);
font-style: italic;
line-height: 1.5;
}
.control-qr { display:inline-block; vertical-align:top; }
.control-qr img, .control-qr canvas { width:36px !important; height:36px !important; }
.ctrl-link { display:block; font-family:'IBM Plex Mono',monospace; font-size:7px; color:var(--amber); text-decoration:none; margin-top:2px; opacity:0.8; }
.ctrl-link:hover { opacity:1; text-decoration:underline; }
@media print { .ctrl-link { color:#555 !important; font-size:6pt !important; } }
/* ═══════════════════════════════════════════════════════
FIELD RESOURCE LINKS — screen + print
═══════════════════════════════════════════════════════ */
.resource-section {
margin-top: 32px;
border-top: 1px solid var(--border);
padding-top: 24px;
}
.resource-section-title {
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
font-weight: 600;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--text-dim);
margin-bottom: 20px;
}
.resource-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 24px;
}
.resource-category {
display: flex;
flex-direction: column;
gap: 8px;
}
.resource-cat-title {
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--amber);
padding-bottom: 6px;
border-bottom: 1px solid var(--border);
margin-bottom: 2px;
}
.resource-link {
display: flex;
flex-direction: column;
gap: 2px;
}
.resource-link a {
font-family: 'Barlow', sans-serif;
font-size: 13px;
font-weight: 600;
color: var(--text);
text-decoration: none;
transition: color 0.15s;
}
.resource-link a:hover {
color: var(--amber);
}
.resource-link-desc {
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
color: var(--text-dim);
line-height: 1.4;
}
.resource-verified {
font-family: 'IBM Plex Mono', monospace;
font-size: 8px;
color: var(--text-dim);
margin-top: 20px;
padding-top: 12px;
border-top: 1px solid var(--border);
opacity: 0.6;
}
/* ── PRINT styles for resource section ── */
@media print {
.resource-section {
page-break-before: always !important;
border-top: 2pt solid #111 !important;
padding-top: 12pt !important;
margin-top: 0 !important;
}
.resource-section-title {
font-family: 'Space Mono', monospace !important;
font-size: 8pt !important;
color: #666 !important;
letter-spacing: 0.2em !important;
margin-bottom: 16pt !important;
page-break-after: avoid !important;
}
.resource-grid {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
gap: 10pt 20pt !important;
}
.resource-cat-title {
font-family: 'Space Mono', monospace !important;
font-size: 7pt !important;
color: #111 !important;
border-bottom: 0.5pt solid #ccc !important;
padding-bottom: 4pt !important;
letter-spacing: 0.15em !important;
}
.resource-link a {
font-family: 'Barlow', Arial, sans-serif !important;
font-size: 9.5pt !important;
font-weight: 700 !important;
color: #000 !important;
text-decoration: none !important;
}
.resource-link-desc {
font-family: 'Space Mono', monospace !important;
font-size: 6.5pt !important;
color: #444 !important;
font-weight: 500 !important;
}
/* Print the URL after each link name so it's usable on paper */
.resource-link a::after {
content: " — " attr(href) !important;
font-family: 'Space Mono', monospace !important;
font-size: 6pt !important;
color: #999 !important;
font-weight: 400 !important;
}
.resource-verified {
font-family: 'Space Mono', monospace !important;
font-size: 6.5pt !important;
color: #aaa !important;
border-top: 0.5pt solid #eee !important;
page-break-before: avoid !important;
page-break-inside: avoid !important;
page-break-after: avoid !important;
break-after: avoid !important;
}
.resource-section {
page-break-inside: avoid !important;
}
}
/* ── DRONE WIND BARS — screen colors ── */
.wbar-track {
background: #1e2535;
border-radius: 3px;
overflow: hidden;
}
.wbar-gust {
background: #2a3348;
}
.wbar-go { background: #00c853; }
.wbar-caution { background: #ffd600; }
.wbar-highrisk{ background: #ff6d00; }
.wbar-grounded{ background: #d50000; }
.wbar-label { color: #fff; font-size: 10px; }
/* Drone wind box screen styles */
.drone-wind-box {
background: var(--bg2);
border: 1px solid var(--border);
border-left: 3px solid var(--amber);
border-radius: 6px;
padding: 14px 16px;
margin-top: 12px;
}
/* ── STATIC BASE WINDOW CARD ── */
.static-window-card {
background: var(--bg2);
border: 1px solid var(--border);
border-left: 4px solid var(--amber);
padding: 20px 24px;
margin-bottom: 14px;
}
.static-window-card-title {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
font-weight: 600;
color: var(--amber);
letter-spacing: 0.28em;
text-transform: uppercase;
margin-bottom: 14px;
display: flex;
align-items: center;
gap: 10px;
}
.static-window-card-title::after {
content: '';
flex: 1;
height: 1px;
background: var(--border);
}
.static-window-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
.static-window-primary {
background: var(--bg3);
border: 1px solid var(--border-hi);
border-top: 3px solid var(--amber);
padding: 14px 16px;
}
.static-window-backup {
background: var(--bg3);
border: 1px solid var(--border);
padding: 14px 16px;
}
.static-window-rec-label {
font-family: 'IBM Plex Mono', monospace;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--amber);
margin-bottom: 6px;
padding-bottom: 6px;
border-bottom: 1px solid var(--border);
}
.static-window-rec-label-alt {
color: var(--text-dim);
}
.static-window-date {
font-family: 'IBM Plex Mono', monospace;
font-size: 11px;
color: var(--text-dim);
margin-bottom: 4px;
}
.static-window-time {
font-family: 'IBM Plex Mono', monospace;
font-size: 22px;
font-weight: 600;
color: var(--amber);
letter-spacing: 0.05em;
line-height: 1.1;
margin-bottom: 6px;
}
.static-window-time.backup {
font-size: 16px;
color: var(--text-dim);
}
.static-window-meta {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-dim);
margin-bottom: 4px;
}
.static-window-reason {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-dim);
font-style: italic;
margin-top: 4px;
}
.drone-wind-title {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.15em;
color: var(--amber);
margin-bottom: 10px;
text-transform: uppercase;
}
.wbar-row {
display: grid;
grid-template-columns: 52px 1fr 48px;
align-items: center;
gap: 8px;
margin-bottom: 4px;
}
.wbar-hour {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-dim);
text-align: right;
}
.wbar-dir {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
color: var(--text-dim);
text-align: right;
}
/* Weather summary screen */
.weather-summary-box {
background: var(--bg2);
border: 1px solid var(--border);
border-radius: 6px;
padding: 14px 16px;
margin-bottom: 10px;
}
/* Field warnings screen */
.field-warnings {
background: rgba(255,109,0,0.08);
border: 1px solid rgba(255,109,0,0.3);
border-left: 3px solid #ff6d00;
border-radius: 6px;
padding: 12px 14px;
margin-bottom: 10px;
}
.fw-title {
font-family: 'IBM Plex Mono', monospace;
font-size: 10px;
font-weight: 700;
color: #ff6d00;
margin-bottom: 6px;
letter-spacing: 0.1em;
}
.fw-item {
font-family: 'Barlow', sans-serif;
font-size: 13px;
color: var(--text);
padding: 3px 0;
}
</style>
</head>
<body>
<div id="app">
<div class="hdr">
<div class="hdr-logo">
<span class="hdr-title">SKYGRID</span>
<span class="hdr-sub">GNSS Survey Planning System</span>
</div>
<span class="hdr-v">v2.9</span>
</div>
<div class="mode-toggle">
<button class="mode-btn active" onclick="switchMode('auto')" id="btn-auto">⚡ Auto Report <span class="new-badge">NEW</span></button>
<button class="mode-btn" onclick="switchMode('manual')" id="btn-manual">📊 Upload Charts</button>
<button class="mode-btn" onclick="switchMode('batch')" id="btn-batch">📋 Batch</button>
</div>
<!-- ═══════════════════════════════════════
AUTO MODE
═══════════════════════════════════════ -->
<div class="mode-panel active" id="auto-panel">
<div class="sec">
<div class="sec-title">Job Information</div>
<div class="form-grid">
<div class="form-group">
<label>Company Name</label>
<input type="text" id="a-company" placeholder="Survey Co. Ltd" oninput="syncJobInfo('company',this.value)">
</div>
<div class="form-group">
<label>Job Name / Number</label>
<input type="text" id="a-jobname" placeholder="Project Alpha 2024" oninput="syncJobInfo('jobname',this.value)">
</div>
<div class="form-group" style="grid-column:1/-1">
<label>Site Description</label>
<textarea id="a-sitedesc" rows="2" placeholder="Urban corridor, open sky, known obstructions…" oninput="syncJobInfo('sitedesc',this.value)"></textarea>
</div>
</div>
</div>
<div class="sec">
<div class="sec-title">Location</div>
<div class="loc-row" style="margin-bottom:10px">
<div class="form-group addr-wrap" style="flex:1">
<label>Address Search</label>
<input type="text" id="a-address" placeholder="123 Main St, City, State…" autocomplete="off" oninput="debounceGeocode(this.value)">
<div class="addr-suggestions" id="addr-suggestions" style="display:none"></div>
</div>
<button class="loc-btn" onclick="geocodeAddress()">Search</button>
</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-muted);text-align:center;margin:10px 0;letter-spacing:.15em">— OR ENTER COORDINATES —</div>
<div class="form-grid">
<div class="form-group">
<label>Latitude (decimal)</label>
<input type="number" id="a-lat" placeholder="39.7392" step="0.0001" min="-90" max="90">
</div>
<div class="form-group">
<label>Longitude (decimal)</label>
<input type="number" id="a-lng" placeholder="-104.9903" step="0.0001" min="-180" max="180">
</div>
</div>
<div id="loc-confirmed" style="display:none;margin-top:10px;font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--green);letter-spacing:.1em">✓ <span id="loc-confirmed-text"></span></div>
</div>
<div class="sec">
<div class="sec-title">Analysis Window</div>
<div style="display:flex;align-items:center;gap:24px;flex-wrap:wrap">
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase;margin-bottom:8px">Number of Days</div>
<div class="days-sel">
<button class="day-opt active" onclick="selectDays(1,this)">1 Day</button>
<button class="day-opt" onclick="selectDays(3,this)">3 Days</button>
<button class="day-opt" onclick="selectDays(7,this)">7 Days</button>
</div>
</div>
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase;margin-bottom:8px">Start Date</div>
<div style="display:flex;align-items:center;gap:10px">
<input type="date" id="a-startdate"
style="background:var(--bg2);border:1px solid var(--border);color:var(--text);font-family:'IBM Plex Mono',monospace;font-size:12px;padding:8px 12px;border-radius:4px;outline:none;cursor:pointer"
oninput="updateStartDateLabel()">
<span id="start-date-label" style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim)">defaults to today</span>
</div>
</div>
</div>
<div class="form-grid" style="margin-top:14px">
<div class="form-group" style="grid-column:1/-1">
<label>Anthropic API Key</label>
<input type="password" id="a-apikey" placeholder="sk-ant-api03-…" oninput="saveApiKey(this.value)">
</div>
<div class="form-group" style="grid-column:1/-1">
<label>AirNow API Key <span style="font-weight:400;opacity:0.6;font-size:10px">— optional · free at airnowapi.org · enables AQI on cover</span></label>
<input type="password" id="a-airnow-key" placeholder="AirNow API key…" oninput="ls('airnow_key', this.value.trim())" style="font-family:'IBM Plex Mono',monospace;font-size:12px">
</div>
</div>
</div>
<div class="status-bar">
<div class="status-item"><span class="dot idle" id="dot-gnss"></span>GNSS / DOP</div>
<div class="status-item"><span class="dot idle" id="dot-iono"></span>Ionosphere</div>
<div class="status-item"><span class="dot idle" id="dot-wx"></span>Weather</div>
<div class="status-item"><span class="dot idle" id="dot-ai"></span>AI Analysis</div>
</div>
<button class="run-btn" id="run-btn" onclick="analyzeAuto()">GENERATE REPORT</button>
<div class="progress-box" id="progress-box">
<div class="sec-title">Processing</div>
<div class="progress-step idle" id="ps-gnss">Fetching GNSS almanac (gnssplanning.com)…</div>
<div class="progress-step idle" id="ps-dop">Computing DOP geometry (per-day independent, spike detection)…</div>
<div class="progress-step idle" id="ps-iono">Fetching ionospheric Kp + TEC (NOAA SWPC)…</div>
<div class="progress-step idle" id="ps-flux">Fetching solar flux F10.7 (NOAA)…</div>
<div class="progress-step idle" id="ps-wx">Fetching weather + hourly wind (Open-Meteo)…</div>
<div class="progress-step idle" id="ps-aqi">Fetching air quality index (AirNow)…</div>
<div class="progress-step idle" id="ps-faa">Checking FAA airspace + TFRs…</div>
<div class="progress-step idle" id="ps-fire">Checking wildfire proximity (NIFC)…</div>
<div class="progress-step idle" id="ps-nanu">Checking GPS satellite health (NAVCEN)…</div>
<div class="progress-step idle" id="ps-landcover">Checking land cover + multipath risk (NLCD)…</div>
<div class="progress-step idle" id="ps-ai">Sending to Claude AI for analysis…</div>
</div>
<!-- ═══ PRINT COVER SHEET (hidden on screen, shown when printing ≥3 days) ═══ -->
<div id="report-cover" style="display:none">
<div class="cover-page">
<!-- TOP RULE -->
<div class="cover-top-rule"></div>
<!-- LOGO BLOCK -->
<div class="cover-logo-block">
<div class="cover-globe">🌐</div>
<div class="cover-wordmark">SKYGRID</div>
<div class="cover-tagline">GNSS SURVEY PLANNING SYSTEM</div>
</div>
<!-- DIVIDER -->
<div class="cover-rule"></div>
<!-- JOB INFO -->
<div class="cover-job-block">
<div class="cover-job-company" id="cover-company"></div>
<div class="cover-job-name" id="cover-jobname"></div>
<div class="cover-job-meta">
<span id="cover-location"></span>
<span class="cover-meta-sep">·</span>
<span id="cover-coords"></span>
<span id="cover-elev-sep" class="cover-meta-sep" style="display:none">·</span>
<span id="cover-elev" style="display:none"></span>
<span id="cover-decl-sep" class="cover-meta-sep" style="display:none">·</span>
<span id="cover-decl" style="display:none"></span>
<span class="cover-meta-sep">·</span>
<span id="cover-gendate"></span>
</div>
<div class="cover-job-meta" id="cover-recorder-row" style="display:none;margin-top:4px">
<span style="color:#aaa;min-width:70px;flex-shrink:0">Recorder:</span>
<span id="cover-recorder-text" style="color:#888"></span>
</div>
<div class="cover-job-meta" id="cover-assessor-row" style="display:none;margin-top:2px">
<span style="color:#aaa;min-width:70px;flex-shrink:0">Assessor:</span>
<span id="cover-assessor-text" style="color:#888"></span>
</div>
<div class="cover-job-meta" id="cover-elev-temp-row" style="display:none;margin-top:2px">
<span style="color:#aaa;min-width:70px;flex-shrink:0">Weather:</span>
<span id="cover-elev-temp-text" style="color:#888"></span>
</div>
</div>
<!-- CORS ELEVATION DELTA -->
<div id="cover-elev-delta-row" style="display:none;margin:8px 0 2px 0;padding:6px 12px;border-radius:6px;font-size:0.78rem;align-items:center;gap:8px">
<span id="cover-elev-delta-icon" style="font-size:1rem;flex-shrink:0"></span>
<span id="cover-elev-delta-text" style="color:#aaa;line-height:1.4"></span>
</div>
<!-- SECTION LABEL -->
<div class="cover-section-label" id="cover-section-label">7-DAY FIELD SUMMARY</div>
<!-- SUMMARY TABLE -->
<div class="cover-summary-table" id="cover-summary-table">
<!-- Populated by JS -->
</div>
<!-- BOTTOM ROW: QR + note -->
<div class="cover-bottom-row">
<div class="cover-qr-block">
<div id="cover-qr-canvas"></div>
<div class="cover-qr-note">
<div class="cover-qr-line1">Scan for ranked GNSS windows</div>
<div class="cover-qr-line2">Best days, times & PDOP on your phone</div>
</div>
</div>
<div class="cover-report-label">
<div class="cover-report-type" id="cover-report-type"></div>
<div class="cover-report-sub">Field Planning Report</div>
<div class="cover-report-accuracy">GNSS geometry valid within 50-mile radius · 15° elevation mask · Weather at entered location</div>
<div class="cover-report-accuracy" style="margin-top:3px">Air quality data: EPA AirNow · Preliminary data, subject to change · Not for regulatory use</div>
</div>
</div>
<!-- BOTTOM RULE -->
<div class="cover-bottom-rule"></div>
</div>
</div>
<div class="results-area" id="auto-results">
<div id="ranking-page" style="display:none"></div>
<div class="site-signal-header" id="site-signal-header" style="display:none">
<div class="site-signal-title">SITE & SIGNAL REPORT</div>
<div class="site-signal-facts" id="site-signal-facts"></div>
</div>
<div class="iono-panel" id="iono-panel"></div>
<div class="result-section" id="dop-section" style="display:none">
<div style="display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap">
<h3 style="margin:0">GNSS / DOP Summary</h3>
<div class="mask-selector-wrap">
<span class="mask-label">Elevation Mask</span>
<div class="mask-btn-group">
<button class="mask-btn" data-mask="10" onclick="setElevMask(10)">10°</button>
<button class="mask-btn mask-btn-active" data-mask="15" onclick="setElevMask(15)">15°</button>
<button class="mask-btn" data-mask="20" onclick="setElevMask(20)">20°</button>
<button class="mask-btn" data-mask="25" onclick="setElevMask(25)">25°</button>
</div>
<span class="mask-hint" id="mask-hint">Standard field practice</span>
</div>
</div>
<div class="dop-table-wrap" id="dop-table-wrap"></div>
</div>
<div id="static-window-card" style="display:none"></div>
<div id="wildfire-card" style="display:none"></div>
<div id="nanu-card" style="display:none"></div>
<div id="landcover-card" style="display:none"></div>
<div id="week-grid-area"></div>
<div id="ai-summary-card"></div>
<div id="county-offices-block" style="display:none;background:var(--bg2);border:1px solid var(--border);padding:20px 24px;margin-bottom:14px">
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:600;color:var(--amber);letter-spacing:.28em;text-transform:uppercase;margin-bottom:14px;display:flex;align-items:center;gap:10px">
County Recording Offices
<span style="flex:1;height:1px;background:var(--border);display:block"></span>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px">
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase;margin-bottom:6px">Recorder / Register of Deeds</div>
<div id="screen-recorder-name" style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--text);margin-bottom:3px"></div>
<div id="screen-recorder-addr" style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim)"></div>
</div>
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:9px;color:var(--text-dim);letter-spacing:.18em;text-transform:uppercase;margin-bottom:6px">Assessor / Tax Office</div>
<div id="screen-assessor-name" style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--text);margin-bottom:3px"></div>
<div id="screen-assessor-addr" style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim)"></div>
</div>
</div>
</div>
<div class="export-row">
<button class="export-btn" onclick="window.print()">🖨 Print / PDF</button>
<button class="export-btn" onclick="exportEmailAuto()">✉ Copy Email Text</button>
</div>
</div>
</div>
<!-- ═══════════════════════════════════════
MANUAL MODE
═══════════════════════════════════════ -->
<div class="mode-panel" id="manual-panel">
<div class="sec">
<div class="sec-title">Job Information</div>
<div class="form-grid">
<div class="form-group">
<label>Company Name</label>
<input type="text" id="m-company" placeholder="Survey Co. Ltd" oninput="syncJobInfo('company',this.value)">
</div>
<div class="form-group">
<label>Job Name / Number</label>
<input type="text" id="m-jobname" placeholder="Project Alpha 2024" oninput="syncJobInfo('jobname',this.value)">
</div>
<div class="form-group" style="grid-column:1/-1">
<label>Site Description</label>
<textarea id="m-sitedesc" rows="2" placeholder="Urban corridor, open sky, known obstructions…" oninput="syncJobInfo('sitedesc',this.value)"></textarea>
</div>
</div>
</div>
<div class="sec">
<div class="sec-title">Job Location</div>
<div class="loc-row" style="margin-bottom:10px">
<div class="form-group" style="flex:1">
<label>Address</label>
<input type="text" id="m-address" placeholder="123 Main St, City, State…">
</div>
<button class="loc-btn" onclick="geocodeManual()">Search</button>
</div>
<div class="form-grid">
<div class="form-group"><label>Latitude</label><input type="number" id="m-lat" placeholder="39.7392" step="0.0001"></div>
<div class="form-group"><label>Longitude</label><input type="number" id="m-lng" placeholder="-104.9903" step="0.0001"></div>
</div>
</div>
<div class="sec">
<div class="sec-title">Trimble GNSS Planning Charts</div>
<div class="upload-grid">
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);letter-spacing:.15em;text-transform:uppercase;margin-bottom:8px">DOP Chart</div>
<div class="upload-zone" onclick="document.getElementById('dop-upload').click()" id="dop-zone">
<div class="upload-zone-title">DOP / Satellite Chart</div>
<div class="upload-zone-sub">Click to upload PNG/JPG screenshot</div>
<img class="img-preview" id="dop-preview" style="display:none">
</div>
<input type="file" id="dop-upload" accept="image/*" style="display:none" onchange="previewImage(this,'dop-preview','dop-zone')">
</div>
<div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim);letter-spacing:.15em;text-transform:uppercase;margin-bottom:8px">Iono Chart</div>
<div class="upload-zone" onclick="document.getElementById('iono-upload').click()" id="iono-zone">
<div class="upload-zone-title">Ionospheric Chart</div>
<div class="upload-zone-sub">Click to upload PNG/JPG screenshot</div>
<img class="img-preview" id="iono-preview" style="display:none">
</div>
<input type="file" id="iono-upload" accept="image/*" style="display:none" onchange="previewImage(this,'iono-preview','iono-zone')">
</div>
</div>
</div>
<div class="sec">
<div class="sec-title">Survey Dates</div>
<div id="date-rows"></div>
<button class="add-date-btn" onclick="addDateRow()">+ Add Date</button>
</div>
<div class="sec">
<div class="sec-title">API Configuration</div>
<div class="form-group">
<label>Anthropic API Key</label>
<input type="password" id="m-apikey" placeholder="sk-ant-api03-…" oninput="saveApiKey(this.value)">
</div>
</div>
<button class="manual-analyze-btn" id="manual-run-btn" onclick="analyzeManual()">📊 ANALYZE CHARTS</button>
<div class="results-area" id="manual-results">
<div id="manual-result-area"></div>
<div class="export-row">
<button class="export-btn" onclick="window.print()">🖨 Print / PDF</button>
<button class="export-btn" onclick="exportEmailManual()">✉ Copy Email Text</button>
</div>
</div>
</div>
<!-- ═══════════════════════════════════════
BATCH MODE
═══════════════════════════════════════ -->
<div class="mode-panel" id="batch-panel">
<div class="sec">
<div class="sec-title">Batch Report Generator</div>
<p style="color:var(--text-dim);font-size:13px;margin-bottom:16px">
Upload a CSV to generate individual PDF reports for multiple clients. Iono data (Kp, TEC) is fetched once and shared across all jobs. GNSS and weather are fetched per location.
</p>
<!-- API Key -->
<div class="form-grid" style="margin-bottom:16px">
<div class="form-group">
<label class="form-label">Anthropic API Key</label>
<input type="password" id="b-apikey" placeholder="sk-ant-api03-…" oninput="saveBatchApiKey(this.value)" style="width:100%">
</div>
<div class="form-group">
<label class="form-label">Survey Start Date</label>
<input type="date" id="b-startdate" style="width:100%">
</div>
</div>
<!-- CSV Drop Zone -->
<div id="batch-drop" onclick="document.getElementById('batch-file').click()"
style="border:2px dashed var(--border);border-radius:8px;padding:32px;text-align:center;cursor:pointer;background:var(--bg2);transition:border-color .2s;margin-bottom:16px">
<div style="font-size:28px;margin-bottom:8px">📄</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--amber);letter-spacing:.1em">DROP CSV HERE OR CLICK TO BROWSE</div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px">company, address · zip works too</div>
</div>
<input type="file" id="batch-file" accept=".csv" style="display:none" onchange="loadBatchCSV(this)">
<!-- Template download + preview -->
<div style="display:flex;gap:10px;margin-bottom:16px;flex-wrap:wrap">
<button class="export-btn" onclick="downloadBatchTemplate()" style="font-size:11px">⬇ Download CSV Template</button>
<button class="export-btn" onclick="clearBatch()" style="font-size:11px">✕ Clear</button>
</div>
<!-- Client table preview -->
<div id="batch-preview" style="display:none;margin-bottom:20px">
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--amber);letter-spacing:.15em;margin-bottom:8px">LOADED CLIENTS</div>
<div style="overflow-x:auto">
<table class="dop-table" id="batch-table">
<thead><tr>
<th>#</th><th>Company</th><th>Address / Location</th><th>Geocode</th><th>Status</th>
</tr></thead>
<tbody id="batch-tbody"></tbody>
</table>
</div>
</div>
<!-- Geocode status -->
<div id="batch-geocode-status" style="display:none;font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim);margin-bottom:10px"></div>
<!-- Run button -->
<button class="analyze-btn" id="batch-run-btn" onclick="runBatch()" style="display:none;width:100%;margin-top:8px">
⚡ RUN BATCH — GENERATE ALL REPORTS
</button>
<!-- Progress area -->
<div id="batch-progress" style="display:none;margin-top:20px">
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--amber);letter-spacing:.15em;margin-bottom:12px">BATCH PROGRESS</div>
<div id="batch-progress-list" style="display:flex;flex-direction:column;gap:8px"></div>
<div id="batch-summary" style="display:none;margin-top:16px;padding:14px 16px;background:var(--bg3);border:1px solid var(--border);border-radius:6px;font-family:'IBM Plex Mono',monospace;font-size:12px"></div>
</div>
</div>
</div>
<!-- ═══════════════════════════════════════════════════════════
NEARBY CONTROL POINTS PAGE — prints before resource links
═══════════════════════════════════════════════════════════ -->
<div id="control-page" style="display:none">
</div>
<!-- ═══════════════════════════════════════════════════════════
SITE CONDITIONS PAGE — stream gauges, lakes, soil (future)
═══════════════════════════════════════════════════════════ -->
<div id="site-conditions-page" style="display:none">
</div>
<!-- ═══════════════════════════════════════════════════════════
FIELD RESOURCE LINKS — appears in both modes, prints at end
═══════════════════════════════════════════════════════════ -->
<div class="resource-section" id="resource-links">
<div class="resource-section-title">⚡ Field Resource Links</div>
<div class="resource-grid">
<!-- PRE-MISSION PLANNING -->
<div class="resource-category">
<div class="resource-cat-title">Pre-Mission Planning</div>
<div class="resource-link">
<a href="https://trimblegnssplanningonline.com" target="_blank" rel="noopener">Trimble GNSS Planning Online</a>
<div class="resource-link-desc">Satellite visibility, DOP charts, sky plots</div>
</div>
<div class="resource-link">
<a href="https://www.faa.gov/uas/recreational_flyers/where_can_i_fly/b4ufly" target="_blank" rel="noopener">FAA B4UFLY</a>
<div class="resource-link-desc">Drone airspace authorization, TFRs, restricted areas</div>
</div>
<div class="resource-link">
<a href="https://www.aloft.ai" target="_blank" rel="noopener">Aloft (Kittyhawk)</a>
<div class="resource-link-desc">Field-friendly drone airspace map and LAANC authorization</div>
</div>
<div class="resource-link">
<a href="https://www.swpc.noaa.gov/products/planetary-k-index" target="_blank" rel="noopener">NOAA Space Weather — Live Kp</a>
<div class="resource-link-desc">Real-time Kp index, geomagnetic storm alerts</div>
</div>
</div>
<!-- BASE STATION & NETWORK -->
<div class="resource-category">
<div class="resource-cat-title">Base Station & Network</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/CORS/cors-data.shtml" target="_blank" rel="noopener">NOAA CORS Network</a>
<div class="resource-link-desc">Continuously operating reference stations, data download</div>
</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/CORS/GoogleMap/CORSmap.shtml" target="_blank" rel="noopener">NGS CORS Station Map</a>
<div class="resource-link-desc">Interactive map of all CORS stations with status</div>
</div>
<div class="resource-link">
<a href="https://www.igs.org/network" target="_blank" rel="noopener">IGS Station Monitor</a>
<div class="resource-link-desc">International GNSS Service — global base station health</div>
</div>
</div>
<!-- POST-PROCESSING -->
<div class="resource-category">
<div class="resource-cat-title">Post-Processing</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/OPUS/index.jsp" target="_blank" rel="noopener">NGS OPUS</a>
<div class="resource-link-desc">Online Positioning User Service — static GNSS processing</div>
</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/OPUSI/index.jsp" target="_blank" rel="noopener">NGS OPUS-RS</a>
<div class="resource-link-desc">Rapid static processing — sessions as short as 15 minutes</div>
</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/CORS/cors-data.shtml" target="_blank" rel="noopener">CORS Data Download</a>
<div class="resource-link-desc">Raw RINEX observation files from CORS stations</div>
</div>
</div>
<!-- REFERENCE & CALCULATIONS -->
<div class="resource-category">
<div class="resource-cat-title">Reference & Calculations</div>
<div class="resource-link">
<a href="https://www.ngs.noaa.gov/cgi-bin/datasheet.prl" target="_blank" rel="noopener">NGS Datasheets</a>
<div class="resource-link-desc">Benchmarks, control points, passive monuments</div>
</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/NCAT/" target="_blank" rel="noopener">NGS Coordinate Conversion (NCAT)</a>
<div class="resource-link-desc">NADCON5, datum transforms, state plane conversions</div>
</div>
<div class="resource-link">
<a href="https://www.ngdc.noaa.gov/geomag/calculators/magcalc.shtml" target="_blank" rel="noopener">NOAA Magnetic Declination</a>
<div class="resource-link-desc">Declination calculator for any location and date</div>
</div>
<div class="resource-link">
<a href="https://geodesy.noaa.gov/GEOID/" target="_blank" rel="noopener">NGS Geoid Models</a>
<div class="resource-link-desc">GEOID18 and current model downloads, GEOID calculator</div>
</div>
</div>
<!-- FEMA & FLOOD -->
<div class="resource-category">
<div class="resource-cat-title">FEMA & Flood</div>
<div class="resource-link">
<a href="https://msc.fema.gov/portal/home" target="_blank" rel="noopener">FEMA Flood Map Service Center</a>
<div class="resource-link-desc">FIRM panels, flood zone lookup by address or coordinates</div>
</div>
<div class="resource-link">
<a href="https://www.fema.gov/flood-insurance/work-with-nfip/elevation-certificate" target="_blank" rel="noopener">FEMA Elevation Certificate</a>
<div class="resource-link-desc">Current EC form, instructions, LOMA/LOMR submission guidance</div>
</div>
</div>
<!-- DRONE OPERATIONS -->
<div class="resource-category">
<div class="resource-cat-title">Drone Operations</div>
<div class="resource-link">
<a href="https://www.faa.gov/uas/commercial_operators" target="_blank" rel="noopener">FAA Part 107 — Commercial Rules</a>
<div class="resource-link-desc">Full Part 107 regulatory summary for commercial UAS operations</div>
</div>
<div class="resource-link">
<a href="https://faadronezone.faa.gov" target="_blank" rel="noopener">FAA DroneZone</a>
<div class="resource-link-desc">Drone registration, operator certificates, waiver management</div>
</div>
<div class="resource-link">
<a href="https://www.faa.gov/uas/recreational_flyers/where_can_i_fly/b4ufly" target="_blank" rel="noopener">FAA B4UFLY</a>
<div class="resource-link-desc">Pre-flight airspace check, TFRs, LAANC authorization</div>
</div>
<div class="resource-link">
<a href="https://www.faa.gov/uas/commercial_operators/part_107_waivers" target="_blank" rel="noopener">FAA Part 107 Waivers</a>
<div class="resource-link-desc">Waiver applications for operations beyond standard 107 rules</div>
</div>
<div class="resource-link">
<a href="https://www.aloft.ai" target="_blank" rel="noopener">Aloft — Field Airspace Map</a>
<div class="resource-link-desc">Mobile-friendly real-time airspace, LAANC, flight logging</div>
</div>
</div>
<!-- AIR QUALITY -->
<div class="resource-col" style="grid-column: 1 / -1; border-top: 1px solid #e5e5e5; padding-top: 18px; margin-top: 4px; page-break-inside: avoid;">
<div class="resource-cat">AIR QUALITY & WILDFIRE SMOKE</div>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:0 32px;">
<div class="resource-link-item">
<div class="resource-link-title">
<a href="https://www.fire.airnow.gov" target="_blank" rel="noopener">AirNow Fire & Smoke Map</a>
</div>
<div class="resource-link-url">https://www.fire.airnow.gov</div>
<div class="resource-link-desc">Current fire locations, smoke plumes, PM2.5 readings by location</div>
</div>
<div class="resource-link-item">
<div class="resource-link-title">
<a href="https://gispub.epa.gov/airnow" target="_blank" rel="noopener">AirNow Interactive Map</a>
</div>
<div class="resource-link-url">https://gispub.epa.gov/airnow</div>
<div class="resource-link-desc">Real-time AQI monitors, hourly NowCast, 48-hr forecast overlays</div>
</div>
<div class="resource-link-item">
<div class="resource-link-title">
<a href="https://airquality.weather.gov" target="_blank" rel="noopener">NOAA Smoke Forecast</a>
</div>
<div class="resource-link-url">https://airquality.weather.gov</div>
<div class="resource-link-desc">48-hr smoke concentration forecast, HRRR-Smoke model</div>
</div>
</div>
</div>
</div><!-- /resource-grid -->
<div class="resource-verified">Links verified: February 2026 · Check quarterly · SkyGrid GNSS Planning System</div>
</div><!-- /resource-section -->
</div><!-- /app -->
<script>
// ================================================================
// SKYGRID v2 — FULL ENGINE
// ================================================================
let selectedDays = 1;
let autoLat = null, autoLng = null, autoLocLabel = '';
let siteElevFt = null; // elevation in feet from Open-Meteo
let siteDeclDeg = null; // magnetic declination in degrees from NOAA
let autoLastResult = {};
let coverQrTimer = null; // tracks pending cover QR render to prevent double-fire
let geocodeTimer = null;
let manualDates = [];
let currentElevMask = 15; // degrees — standard field practice
// ── INIT ─────────────────────────────────────────────────────────
window.addEventListener('DOMContentLoaded', () => {
loadSaved();
addDateRow();
// Set today as default start date (prevents stale/future dates)
const sdInput = document.getElementById('a-startdate');
if (sdInput && !sdInput.value) {
const now = new Date();
const y = now.getFullYear();
const m = String(now.getMonth()+1).padStart(2,'0');
const d = String(now.getDate()).padStart(2,'0');
sdInput.value = `${y}-${m}-${d}`;
}
});
function loadSaved() {
['company','jobname','sitedesc'].forEach(k => {
const v = ls(k);
if (v) { setVal('a-'+k, v); setVal('m-'+k, v); }
});
const key = ls('apikey');
if (key) { setVal('a-apikey', key); setVal('m-apikey', key); }
const airnowKey = ls('airnow_key');
if (airnowKey) { setVal('a-airnow-key', airnowKey); }
}
function ls(k, v) {
if (v === undefined) return localStorage.getItem('sg_'+k) || '';
localStorage.setItem('sg_'+k, v);
}
function setVal(id, v) { const el = document.getElementById(id); if (el) el.value = v; }
function syncJobInfo(key, val) {
ls(key, val);
['a','m'].forEach(p => { const el = document.getElementById(p+'-'+key); if (el && el.value !== val) el.value = val; });
}
function saveApiKey(val) {
ls('apikey', val);
['a-apikey','m-apikey'].forEach(id => { const el = document.getElementById(id); if (el && el.value !== val) el.value = val; });
}
function switchMode(mode) {
['auto','manual','batch'].forEach(m => {
document.getElementById(m+'-panel').classList.toggle('active', m === mode);
document.getElementById('btn-'+m).classList.toggle('active', m === mode);
});
}
function selectDays(n, el) {
selectedDays = n;
document.querySelectorAll('.day-opt').forEach(b => b.classList.remove('active'));
el.classList.add('active');
}
function updateStartDateLabel() {
const input = document.getElementById('a-startdate');
const label = document.getElementById('start-date-label');
if (!input || !label) return;
if (!input.value) { label.textContent = 'defaults to today'; return; }
// Parse both as local midnight to get an exact day difference
const d = new Date(input.value + 'T00:00:00');
const today = new Date(); today.setHours(0,0,0,0);
const diff = Math.round((d - today) / 86400000);
const dow = d.toLocaleDateString('en-US', {weekday:'long'});
const dateStr = d.toLocaleDateString('en-US', {month:'short', day:'numeric'});
if (diff === 0) label.textContent = 'today — ' + dow;
else if (diff === 1) label.textContent = 'tomorrow — ' + dow;
else if (diff > 0) label.textContent = 'in ' + diff + ' days — ' + dow + ', ' + dateStr;
else label.textContent = dow + ', ' + dateStr;
}
function getStartDate() {
const input = document.getElementById('a-startdate');
if (!input || !input.value) return new Date();
const d = new Date(input.value + 'T06:00:00');
// Sanity check: if date is more than 14 days in future or in the past >1 day, use today
const now = new Date();
const diffDays = (d - now) / 86400000;
if (diffDays > 14 || diffDays < -1) {
console.warn('[SkyGrid] Start date out of range (' + input.value + '), using today');
const y = now.getFullYear(), m = String(now.getMonth()+1).padStart(2,'0'), day = String(now.getDate()).padStart(2,'0');
input.value = `${y}-${m}-${day}`;
return new Date(`${y}-${m}-${day}T06:00:00`);
}
return d;
}
// ── GEOCODING ─────────────────────────────────────────────────────
function updateCoverDeclination(deg) {
siteDeclDeg = deg;
const fmt = formatDeclination(deg);
if (!fmt) return;
// Cover line
const declEl = document.getElementById('cover-decl');
const declSep = document.getElementById('cover-decl-sep');
if (declEl) { declEl.textContent = 'Decl ' + fmt; declEl.style.display = ''; }
if (declSep) declSep.style.display = '';
// Site & Signal header
const facts = document.getElementById('site-signal-facts');
if (facts) {
const existing = facts.querySelector('[data-ssf="decl"]');
const note = deg >= 0
? `Compass reads ${Math.abs(deg).toFixed(1)}° too far W`
: `Compass reads ${Math.abs(deg).toFixed(1)}° too far E`;
const html = `<div class="ssf-item" data-ssf="decl">
<div class="ssf-label">Magnetic Declination</div>
<div class="ssf-value">${fmt}</div>
<div class="ssf-note">${note}</div>
</div>`;
if (existing) existing.outerHTML = html;
else {
// Insert after elevation if present
const elevEl = facts.querySelector('[data-ssf="elev"]');
if (elevEl) elevEl.insertAdjacentHTML('afterend', html);
else facts.insertAdjacentHTML('afterbegin', html);
}
}
}
async function fetchDeclination(lat, lng) {
// NOAA World Magnetic Model — open CORS, browser-side fetch
try {
const year = new Date().getFullYear();
const url = `https://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination?lat1=${lat}&lon1=${lng}&key=zNEw7&resultFormat=json&startYear=${year}&startMonth=${new Date().getMonth()+1}&startDay=${new Date().getDate()}`;
const res = await fetch(url, { signal: AbortSignal.timeout(8000) });
if (!res.ok) return null;
const data = await res.json();
const decl = data?.result?.[0]?.declination;
if (decl === undefined || decl === null) return null;
siteDeclDeg = decl;
console.log('[SkyGrid] Declination:', decl.toFixed(2), '°');
return decl;
} catch(e) {
console.warn('[SkyGrid] Declination fetch failed:', e.message);
return null;
}
}
function formatDeclination(deg) {
if (deg === null || deg === undefined) return null;
const abs = Math.abs(deg).toFixed(1);
const dir = deg >= 0 ? 'E' : 'W';
return abs + '° ' + dir;
}
function cleanAddress(display_name) {
// Nominatim returns: "1025, Clay Street, Arbee, Colusa, Colusa County, California, 95932, United States"
// We want: "1025 Clay Street, Colusa, CA 95932"
const stateAbbr = {
'Alabama':'AL','Alaska':'AK','Arizona':'AZ','Arkansas':'AR','California':'CA',
'Colorado':'CO','Connecticut':'CT','Delaware':'DE','Florida':'FL','Georgia':'GA',
'Hawaii':'HI','Idaho':'ID','Illinois':'IL','Indiana':'IN','Iowa':'IA','Kansas':'KS',
'Kentucky':'KY','Louisiana':'LA','Maine':'ME','Maryland':'MD','Massachusetts':'MA',
'Michigan':'MI','Minnesota':'MN','Mississippi':'MS','Missouri':'MO','Montana':'MT',
'Nebraska':'NE','Nevada':'NV','New Hampshire':'NH','New Jersey':'NJ','New Mexico':'NM',
'New York':'NY','North Carolina':'NC','North Dakota':'ND','Ohio':'OH','Oklahoma':'OK',
'Oregon':'OR','Pennsylvania':'PA','Rhode Island':'RI','South Carolina':'SC',
'South Dakota':'SD','Tennessee':'TN','Texas':'TX','Utah':'UT','Vermont':'VT',
'Virginia':'VA','Washington':'WA','West Virginia':'WV','Wisconsin':'WI','Wyoming':'WY'
};
try {
const parts = display_name.split(', ').map(p => p.trim());
// Find state, zip, city
let state = '', zip = '', city = '', streetParts = [];
const stateNames = Object.keys(stateAbbr);
for (let i = 0; i < parts.length; i++) {
const p = parts[i];
if (stateNames.includes(p)) { state = stateAbbr[p]; continue; }
if (/^\d{5}(-\d{4})?$/.test(p)) { zip = p; continue; }
if (p === 'United States') continue;
if (p.endsWith(' County')) continue; // skip county
// Skip neighborhood/suburb (short names between street and city)
// Keep: house number, street name, city
streetParts.push(p);
}
// streetParts is now: [housenum, street, suburb?, city, ...]
// Remove known suburb/neighborhood duplicates — if a part appears as substring of another, remove the shorter
const filtered = streetParts.filter((p, i) => {
// Remove if it looks like a suburb (no numbers, not the last meaningful part)
return true;
});
// Simple heuristic: take first 2 parts as street address, last unique part before state as city
let street = '';
let cityPart = '';
if (filtered.length >= 2) {
// Check if first part is a house number
if (/^\d+$/.test(filtered[0])) {
street = filtered[0] + ' ' + filtered[1];
// City = last part that isn't the street
// Find the actual city by looking for a part that matches the zip's city
// Simple: use the part just before the county or state
const nonStreet = filtered.slice(2);
cityPart = nonStreet[nonStreet.length - 1] || nonStreet[0] || '';
} else {
street = filtered[0];
cityPart = filtered[filtered.length - 1] || '';
}
} else {
street = filtered.join(', ');
}
const result = [street, cityPart, state, zip].filter(Boolean);
// Format: "1025 Clay Street, Colusa, CA 95932"
if (result.length >= 2) {
return street + ', ' + [cityPart, state, zip].filter(Boolean).join(' ');
}
return display_name; // fallback
} catch(e) {
return display_name;
}
}
async function geocodeAddress() {
const addr = document.getElementById('a-address').value.trim();
if (!addr) return;
try {
const res = await fetch(`/.netlify/functions/nominatim?limit=1&q=${encodeURIComponent(addr)}`, { signal: AbortSignal.timeout(10000) });
const data = await res.json();
if (data.length) {
autoLat = parseFloat(data[0].lat); autoLng = parseFloat(data[0].lon);
autoLocLabel = cleanAddress(data[0].display_name);
setVal('a-lat', autoLat.toFixed(5)); setVal('a-lng', autoLng.toFixed(5));
showLocConfirmed(autoLocLabel);
extractCountyFromAddress(data[0].display_name);
}
} catch(e) {}
hideSuggestions();
}
async function geocodeManual() {
const addr = document.getElementById('m-address').value.trim();
if (!addr) return;
try {
const res = await fetch(`/.netlify/functions/nominatim?limit=1&q=${encodeURIComponent(addr)}`, { signal: AbortSignal.timeout(10000) });
const data = await res.json();
if (data.length) { setVal('m-lat', parseFloat(data[0].lat).toFixed(5)); setVal('m-lng', parseFloat(data[0].lon).toFixed(5)); }
} catch(e) {}
}
function debounceGeocode(val) {
clearTimeout(geocodeTimer);
if (val.length < 3) { hideSuggestions(); return; }
geocodeTimer = setTimeout(() => fetchSuggestions(val), 480);
}
async function fetchSuggestions(val) {
try {
const res = await fetch(`/.netlify/functions/nominatim?limit=5&q=${encodeURIComponent(val)}`, { signal: AbortSignal.timeout(10000) });
const data = await res.json();
const box = document.getElementById('addr-suggestions');
if (!data.length) { hideSuggestions(); return; }
box.innerHTML = data.map(d => `<div class="addr-suggestion" data-raw="${d.display_name.replace(/"/g,'"')}" onclick="selectSuggestion('${cleanAddress(d.display_name).replace(/'/g,"'")}',${d.lat},${d.lon},this)">${cleanAddress(d.display_name)}</div>`).join('');
box.style.display = 'block';
} catch(e) {}
}
function hideSuggestions() { const b = document.getElementById('addr-suggestions'); if(b) b.style.display='none'; }
function selectSuggestion(label, lat, lng, el) {
setVal('a-address', label);
autoLat = parseFloat(lat); autoLng = parseFloat(lng); autoLocLabel = label;
setVal('a-lat', autoLat.toFixed(5)); setVal('a-lng', autoLng.toFixed(5));
showLocConfirmed(label); hideSuggestions();
extractCountyFromAddress(el && el.dataset.raw ? el.dataset.raw : label);
}
function showLocConfirmed(label) {
document.getElementById('loc-confirmed-text').textContent = label.length > 80 ? label.slice(0,80)+'…' : label;
document.getElementById('loc-confirmed').style.display = 'block';
}
document.addEventListener('click', e => { if (!e.target.closest('.addr-wrap')) hideSuggestions(); });
// ── MANUAL DATE ROWS ──────────────────────────────────────────────
function addDateRow() {
const id = Date.now(); manualDates.push(id);
const today = new Date().toISOString().split('T')[0];
const wrap = document.getElementById('date-rows');
const row = document.createElement('div');
row.className = 'date-row'; row.id = 'date-row-'+id;
row.innerHTML = `
<div class="form-group"><label>Date</label><input type="date" id="date-${id}" value="${today}"></div>
<div class="form-group"><label>Label (optional)</label><input type="text" id="datelbl-${id}" placeholder="e.g. Day 1"></div>
${manualDates.length > 1 ? `<button class="remove-date-btn" onclick="removeDateRow(${id})">✕</button>` : ''}
`;
wrap.appendChild(row);
}
function removeDateRow(id) {
manualDates = manualDates.filter(d => d !== id);
const el = document.getElementById('date-row-'+id); if(el) el.remove();
}
function previewImage(input, previewId, zoneId) {
const file = input.files[0]; if(!file) return;
const reader = new FileReader();
reader.onload = e => {
const p = document.getElementById(previewId); p.src = e.target.result; p.style.display = 'block';
const z = document.getElementById(zoneId);
z.querySelector('.upload-zone-title').style.display = 'none';
z.querySelector('.upload-zone-sub').style.display = 'none';
};
reader.readAsDataURL(file);
}
// ================================================================
// GNSS DOP ENGINE — gnssplanning.com API + almanac propagator
// ================================================================
// Strategy:
// 1. Fetch gnssplanning.com/api/almanac/YYYY/M/D for the Wednesday
// of the report week — same data source Trimble uses
// 2. Propagate satellite positions using Keplerian orbital mechanics
// (same math as gnssplanning's Calculator, extracted from their source)
// 3. Compute PDOP hourly independently for each day using real UTC times
// 4. Accurately captures per-day geometry spikes and dead zones
// ================================================================
// WGS84 constants (from gnssplanning source)
const WGS_MU = 3.986005e14; // m^3/s^2
const WGS_OE = 7.2921151467e-5; // rad/s Earth rotation rate
const WGS_A = 6378137.0; // m semi-major axis
const WGS_E2 = 0.00669437999014; // first eccentricity squared
const D2R = Math.PI / 180;
// ── Fetch almanac from gnssplanning API ─────────────────────────
async function fetchGNSSAlmanac(dateISO) {
const [y, m, d] = dateISO.split('-').map(Number);
// Their API: /api/almanac/YYYY/M/D (no zero-padding on month/day)
const url = `https://www.gnssplanning.com/api/almanac/${y}/${m}/${d}`;
const res = await fetch(url, { signal: AbortSignal.timeout(10000) });
if (!res.ok) throw new Error(`Almanac API ${res.status}`);
const data = await res.json();
if (!data.satellites || !data.satellites.length) throw new Error('Empty almanac');
return data;
}
// ── Parse almanac JSON into orbital elements ─────────────────────
// Mirrors gnssplanning's p() function exactly
function parseAlmanacSats(data) {
return data.satellites
.filter(s => s.health === 0 || (s.code === 'J' && s.health === 1))
.filter(s => ['G','R','E','C'].includes(s.code)) // GPS,GLONASS,Galileo,BeiDou
// Filter BeiDou GEO/near-GEO: true incl ~0°, stored as delta from 54° → ~-54 to -48
// Keeps MEO/IGSO (delta > -40 = true incl > 14°) for accurate geometry
.filter(s => !(s.code === 'C' && s.inclination < -40))
.map(s => ({
code: s.code,
prn: s.prn,
inc: (54 + s.inclination) * D2R, // delta from 54°, then to rad
sqrtA: s.semiMajorAxis, // stored as sqrt(a) in meters^0.5
ecc: s.eccentricity,
raan: s.rightAscension * D2R,
aop: s.perigee * D2R,
m0: s.meanAnomaly * D2R,
omegaDot: s.ascensionRate * D2R / 1000, // millirad/s → rad/s
gpsWeek: s.gpsWeek,
toa: s.timeOfAlmanac // seconds into GPS week
}));
}
// ── GPS week/second → JS Date ────────────────────────────────────
function gpsToDate(week, sec) {
const GPS_EPOCH = 315964800000; // Jan 6 1980 UTC in ms
return new Date(GPS_EPOCH + (week * 604800 + sec) * 1000);
}
// ── Solve Kepler's equation iteratively ─────────────────────────
function solveKepler(M, e) {
let E = M;
for (let i = 0; i < 30; i++) {
const dE = (M - E + e * Math.sin(E)) / (1 - e * Math.cos(E));
E += dE;
if (Math.abs(dE) < 1e-12) break;
}
return E;
}
// ── Compute ECEF position for one satellite at given time ────────
function satECEF(sat, tUTC) {
const a = sat.sqrtA * sat.sqrtA; // semi-major axis in meters
const n = Math.sqrt(WGS_MU / (a * a * a)); // mean motion rad/s
// Time since almanac epoch
const toaDate = gpsToDate(sat.gpsWeek, sat.toa);
const dt = (tUTC - toaDate) / 1000; // seconds
// Mean anomaly at time t
const M = sat.m0 + n * dt;
// Eccentric anomaly
const E = solveKepler(M, sat.ecc);
// True anomaly
const sinV = Math.sqrt(1 - sat.ecc * sat.ecc) * Math.sin(E) / (1 - sat.ecc * Math.cos(E));
const cosV = (Math.cos(E) - sat.ecc) / (1 - sat.ecc * Math.cos(E));
const v = Math.atan2(sinV, cosV);
// Argument of latitude
const u = v + sat.aop;
// Radius
const r = a * (1 - sat.ecc * Math.cos(E));
// Position in orbital plane
const x0 = r * Math.cos(u);
const y0 = r * Math.sin(u);
// Corrected RAAN (accounting for Earth rotation)
const tGPS = (tUTC - new Date('1980-01-06T00:00:00Z')) / 1000;
const raan = sat.raan + (sat.omegaDot - WGS_OE) * dt - WGS_OE * sat.toa;
// ECEF position (meters)
const cosR = Math.cos(raan), sinR = Math.sin(raan);
const cosI = Math.cos(sat.inc), sinI = Math.sin(sat.inc);
return [
x0 * cosR - y0 * cosI * sinR,
x0 * sinR + y0 * cosI * cosR,
y0 * sinI
];
}
// ── ECEF → elevation/azimuth from observer ───────────────────────
function ecefToElAz(satECEF, latDeg, lngDeg, altM) {
const lat = latDeg * D2R, lng = lngDeg * D2R;
const sinLat = Math.sin(lat), cosLat = Math.cos(lat);
const sinLng = Math.sin(lng), cosLng = Math.cos(lng);
const N = WGS_A / Math.sqrt(1 - WGS_E2 * sinLat * sinLat);
const obsX = (N + altM) * cosLat * cosLng;
const obsY = (N + altM) * cosLat * sinLng;
const obsZ = (N * (1 - WGS_E2) + altM) * sinLat;
const dx = satECEF[0] - obsX;
const dy = satECEF[1] - obsY;
const dz = satECEF[2] - obsZ;
// Local ENU
const e = -sinLng * dx + cosLng * dy;
const n = -sinLat * cosLng * dx - sinLat * sinLng * dy + cosLat * dz;
const u = cosLat * cosLng * dx + cosLat * sinLng * dy + sinLat * dz;
const rng = Math.sqrt(e*e + n*n + u*u);
const el = Math.asin(u / rng) / D2R;
const az = (Math.atan2(e, n) / D2R + 360) % 360;
return { el, az };
}
// ── 4x4 matrix helpers for DOP calculation ───────────────────────
function matMul4(A, B) {
const C = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]];
for (let i=0;i<4;i++) for (let j=0;j<4;j++) for (let k=0;k<4;k++) C[i][j]+=A[i][k]*B[k][j];
return C;
}
function invert4(m) {
const a = m.map(r => [...r]);
const inv = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];
for (let col=0; col<4; col++) {
let pivot = col;
for (let row=col+1; row<4; row++) if (Math.abs(a[row][col]) > Math.abs(a[pivot][col])) pivot = row;
[a[col], a[pivot]] = [a[pivot], a[col]];
[inv[col], inv[pivot]] = [inv[pivot], inv[col]];
const d = a[col][col];
if (Math.abs(d) < 1e-12) return null;
for (let j=0; j<4; j++) { a[col][j]/=d; inv[col][j]/=d; }
for (let row=0; row<4; row++) {
if (row === col) continue;
const f = a[row][col];
for (let j=0; j<4; j++) { a[row][j]-=f*a[col][j]; inv[row][j]-=f*inv[col][j]; }
}
}
return inv;
}
// ── Compute PDOP from visible satellites ─────────────────────────
function computePDOP(sats, latDeg, lngDeg, altM, tUTC, maskDeg) {
const H = [];
let visCount = 0;
for (const sat of sats) {
try {
const pos = satECEF(sat, tUTC);
if (!pos || isNaN(pos[0])) continue;
const { el } = ecefToElAz(pos, latDeg, lngDeg, altM);
if (el < maskDeg) continue;
visCount++;
const elR = el * D2R;
const az = ecefToElAz(pos, latDeg, lngDeg, altM).az * D2R;
H.push([
Math.cos(elR) * Math.sin(az),
Math.cos(elR) * Math.cos(az),
Math.sin(elR),
1
]);
} catch(e) { continue; }
}
if (H.length < 4) return null;
// H^T * H
const n = H.length;
const HTH = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]];
for (let i = 0; i < 4; i++)
for (let j = 0; j < 4; j++)
for (let k = 0; k < n; k++)
HTH[i][j] += H[k][i] * H[k][j];
const Q = invert4(HTH);
if (!Q) return null;
const pdop = Math.sqrt(Q[0][0] + Q[1][1] + Q[2][2]);
return { pdop: parseFloat(pdop.toFixed(2)), sats: visCount };
}
// ── Compute 24 hourly DOP values for one day ─────────────────────
function computeDailyDOP(almanacSats, latDeg, lngDeg, dateISO, driftMinutes) {
const hours = [];
for (let h = 0; h < 24; h++) {
// Apply sidereal drift: subtract driftMinutes from actual time
// (earlier in the day = same geometry as reference day)
const tUTC = new Date(`${dateISO}T${String(h).padStart(2,'0')}:00:00Z`);
tUTC.setMinutes(tUTC.getMinutes() - driftMinutes);
const dop = computePDOP(almanacSats, latDeg, lngDeg, 0, tUTC, currentElevMask);
hours.push({ hour: h, pdop: dop?.pdop ?? null, sats: dop?.sats ?? 0 });
}
return hours;
}
// ── Build full dopData — true per-day independent computation ─────
// Each day uses real UTC times for that date, no drift approximation.
// This means spikes and dead zones are accurately located per day.
function almanacToDopData(almanacSats, latDeg, lngDeg, startDate, days, refDateISO) {
const fmtISO = d => {
const y = d.getFullYear(), m = String(d.getMonth()+1).padStart(2,'0'), day = String(d.getDate()).padStart(2,'0');
return `${y}-${m}-${day}`;
};
return Array.from({ length: days }, (_, i) => {
const dayDate = new Date(startDate);
dayDate.setDate(dayDate.getDate() + i);
const dateISO = fmtISO(dayDate);
// Compute each hour independently using the actual date — no drift
const hours = [];
for (let h = 0; h < 24; h++) {
const tUTC = new Date(`${dateISO}T${String(h).padStart(2,'0')}:00:00Z`);
const dop = computePDOP(almanacSats, latDeg, lngDeg, 0, tUTC, currentElevMask);
hours.push({ hour: h, pdop: dop?.pdop ?? null, sats: dop?.sats ?? 0 });
}
const valid = hours.filter(h => h.pdop !== null);
if (!valid.length) return { date: dayDate, avgPdop: null, bestWindow: null, source: 'gnssplanning' };
// Field hours only (6AM-7PM) for avg — same as display
const fieldValid = hours.filter(h => h.hour >= 6 && h.hour <= 19 && h.pdop !== null);
const avgPdop = (fieldValid.length ? fieldValid : valid)
.reduce((s, h) => s + h.pdop, 0) / (fieldValid.length || valid.length);
// Find best 4-hour window (field hours 6AM–7PM = indices 6–19)
let bestWindow = null, bestScore = Infinity;
for (let s = 6; s <= 16; s++) { // start 6AM, latest start 4PM for 4hr ending at 7PM
const win = hours.slice(s, s + 4).filter(h => h.pdop !== null);
if (win.length < 3) continue;
const score = win.reduce((a, h) => a + h.pdop, 0) / win.length;
if (score < bestScore) {
bestScore = score;
bestWindow = {
label: fmtHr(s) + ' – ' + fmtHr(s + 4),
startHour: s,
avgPdop: parseFloat(score.toFixed(2)),
sats: Math.round(win.reduce((a, h) => a + h.sats, 0) / win.length)
};
}
}
return {
date: dayDate,
avgPdop: parseFloat(avgPdop.toFixed(2)),
bestWindow,
hours,
source: 'gnssplanning'
};
});
}
// ── Find the Wednesday of the report week ────────────────────────
function getRefDay(startDate) {
// Reference day = startDate + 2 days
// Centering on day 3 of a 7-day report keeps max drift to ±2 days (~8 min error)
// For any report length, +2 from start puts us near the middle
const d = new Date(startDate);
d.setDate(d.getDate() + 2);
const y = d.getFullYear(), m = String(d.getMonth()+1).padStart(2,'0'), day = String(d.getDate()).padStart(2,'0');
return `${y}-${m}-${day}`;
}
function fmtHr(h) { const hh=h%24, ap=hh<12?'AM':'PM', hd=hh%12||12; return `${hd}:00 ${ap}`; }
// ================================================================
// IONOSPHERE
// ================================================================
async function fetchIonoData() {
const res=await fetch('https://services.swpc.noaa.gov/products/noaa-planetary-k-index-forecast.json', { signal: AbortSignal.timeout(8000) });
return res.json();
}
async function fetchSolarFlux() {
const res=await fetch('https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json', { signal: AbortSignal.timeout(8000) });
const data=await res.json();
const last=data[data.length-1];
return parseFloat(last['f10.7'] || last['observed_ssn'] || 0);
}
async function fetchTEC(lat, lng) {
// NOAA GloTEC — fetch via Netlify proxy function (avoids all CORS issues)
// Falls back to direct third-party proxies if Netlify function not available
let geojson = null;
try {
// Primary: Netlify function proxy
const proxyRes = await fetch('/.netlify/functions/glotec', { signal: AbortSignal.timeout(12000) });
if (proxyRes.ok) {
const proxyData = await proxyRes.json();
if (proxyData.geojson && proxyData.geojson.features) {
geojson = proxyData.geojson;
console.log('[SkyGrid] GloTEC loaded via Netlify proxy, time:', proxyData.time_tag);
}
}
} catch(e) {
console.warn('[SkyGrid] GloTEC Netlify proxy failed:', e.message);
}
// Fallback: try direct NOAA + third-party proxies
if (!geojson) {
const BASE = 'https://services.swpc.noaa.gov';
const INDEX_PATH = '/products/glotec/geojson_2d_urt.json';
const PROXY_FNS = [
u => u,
u => 'https://corsproxy.io/?' + encodeURIComponent(u),
u => 'https://api.allorigins.win/raw?url=' + encodeURIComponent(u),
];
async function tryOne(rawUrl, proxyFn) {
try {
const res = await fetch(proxyFn(rawUrl), { signal: AbortSignal.timeout(12000) });
if (!res.ok) return null;
return await res.json();
} catch(e) { return null; }
}
let index = null, workingProxy = null;
for (const proxyFn of PROXY_FNS) {
index = await tryOne(BASE + INDEX_PATH, proxyFn);
if (Array.isArray(index) && index.length) { workingProxy = proxyFn; break; }
index = null;
}
if (index && workingProxy) {
const latest = index[index.length - 1];
console.log('[SkyGrid] GloTEC latest entry:', latest.time_tag, latest.url);
const dataUrl = latest.url.startsWith('http') ? latest.url : BASE + latest.url;
geojson = await tryOne(dataUrl, workingProxy);
}
}
if (!geojson || !geojson.features) { console.warn('[SkyGrid] GloTEC index unavailable'); return null; }
console.log('[SkyGrid] GloTEC data type:', geojson.type, '| feature count:', geojson.features.length);
const features = geojson.features;
// Find nearest grid cell
let best = null, bestDist = Infinity;
for (const feat of features) {
let fLat, fLng;
if (feat.geometry && feat.geometry.coordinates) {
fLng = feat.geometry.coordinates[0]; fLat = feat.geometry.coordinates[1];
} else if (feat.latitude !== undefined) {
fLat = feat.latitude; fLng = feat.longitude != null ? feat.longitude : (feat.lon != null ? feat.lon : feat.lng);
} else continue;
const dist = Math.abs(fLat - lat) + Math.abs(fLng - lng);
if (dist < bestDist) { bestDist = dist; best = feat; }
}
if (!best) { console.warn('[SkyGrid] GloTEC: no matching feature'); return null; }
const props = best.properties || best;
const tec = props.tec != null ? props.tec : (props.TEC != null ? props.TEC : (props.vtec != null ? props.vtec : (props.VTEC != null ? props.VTEC : null)));
const anomaly = (props.anomaly !== undefined && props.anomaly !== null) ? parseFloat(props.anomaly) : null;
const qualityFlag = props.quality_flag != null ? props.quality_flag : null;
console.log('[SkyGrid] TEC fetched:', tec, 'TECU | anomaly:', anomaly, '| quality_flag:', qualityFlag, '| dist:', bestDist.toFixed(2));
if (tec === null) return null;
return { tec: parseFloat(tec), anomaly, qualityFlag };
}
function interpretIono(kpData, f107, tecRaw) {
const forecasts=kpData.slice(1);
const kpVals=forecasts.map(r=>parseFloat(r[1])).filter(v=>!isNaN(v));
const maxKp=Math.max(...kpVals), avgKp=kpVals.reduce((a,b)=>a+b,0)/kpVals.length;
const f107val=typeof f107==='number'?f107:null;
// Unpack tecRaw — fetchTEC returns {tec, anomaly, qualityFlag} or null
const tecVal = tecRaw && typeof tecRaw==='object' ? tecRaw.tec : (typeof tecRaw==='number' ? tecRaw : null);
const tecAnomaly = tecRaw && typeof tecRaw==='object' ? tecRaw.anomaly : null;
const tecQualityFlag = tecRaw && typeof tecRaw==='object' ? tecRaw.qualityFlag : null;
const tecDegraded = tecQualityFlag !== null && tecQualityFlag !== 0;
let level,label,color;
if(maxKp>=5||(f107val&&f107val>180)){level='elevated';label='ELEVATED ACTIVITY';color='#ef4444';}
else if(maxKp>=3.5||(f107val&&f107val>150)){level='moderate';label='MODERATE ACTIVITY';color='#eab308';}
else{level='quiet';label='QUIET CONDITIONS';color='#22c55e';}
const parts=[`Peak Kp ${maxKp.toFixed(1)} (avg ${avgKp.toFixed(1)}).`];
if(f107val) parts.push(`Solar flux F10.7 = ${f107val.toFixed(0)} sfu.`);
if(level==='quiet') parts.push('Ionospheric conditions favorable for GNSS. No significant signal distortion expected.');
else if(level==='moderate') parts.push('Moderate geomagnetic activity. Some ionospheric delay possible. Static sessions should use longer occupation times.');
else parts.push('Elevated geomagnetic activity. Potential for significant ionospheric delays and cycle slips. Consider postponing precision work if possible.');
return {maxKp,avgKp,f107:f107val,tec:tecVal,tecAnomaly,tecDegraded,level,label,color,summary:parts.join(' ')};
}
// ================================================================
// AIR QUALITY INDEX (AirNow API)
// ================================================================
async function fetchAQI(lat, lng, days) {
const apiKey = (typeof ls === 'function' ? ls('airnow_key') : '') || 'BCE0E778-7D73-47B9-A45D-C88A3ADB6C84';
try {
// Try Netlify proxy first (avoids CORS when deployed with functions)
let url = `/.netlify/functions/aqi?lat=${lat.toFixed(4)}&lng=${lng.toFixed(4)}`;
console.log('[SkyGrid] AQI fetch via proxy:', url);
let res = await fetch(url, { signal: AbortSignal.timeout(8000) });
// If proxy returns 404 (not deployed), fall back to direct call
if (res.status === 404) {
console.log('[SkyGrid] AQI proxy not found, trying direct...');
url = `https://www.airnowapi.org/aq/forecast/latLong/?format=application/json` +
`&latitude=${lat.toFixed(4)}&longitude=${lng.toFixed(4)}` +
`&distance=25&API_KEY=${apiKey}`;
res = await fetch(url, { signal: AbortSignal.timeout(8000) });
}
if (!res.ok) throw new Error('AirNow HTTP ' + res.status);
const data = await res.json();
console.log('[SkyGrid] AQI raw response:', JSON.stringify(data).substring(0, 500));
console.log('[SkyGrid] AQI data received:', data?.length, 'entries');
if (!Array.isArray(data) || !data.length) return null;
// Build a map of date → max AQI for that day
const byDate = {};
data.forEach(entry => {
const rawDate = entry.DateForecast?.trim();
if (!rawDate) return;
// Normalize to YYYY-MM-DD regardless of AirNow format (MM/DD/YYYY or YYYY-MM-DD)
let d = rawDate;
if (rawDate.includes('/')) {
const [m, day, yr] = rawDate.split('/');
d = `${yr}-${m.padStart(2,'0')}-${day.padStart(2,'0')}`;
}
const aqi = entry.AQI;
if (!d || aqi === undefined || aqi < 0) return;
if (!byDate[d] || aqi > byDate[d].aqi) {
byDate[d] = {
aqi,
category: entry.Category?.Name || aqiCategory(aqi),
pollutant: entry.ParameterName || ''
};
}
});
byDate['__avg__'] = null;
console.log('[SkyGrid] AQI byDate keys:', Object.keys(byDate));
return byDate;
} catch(e) {
console.warn('[SkyGrid] AQI fetch failed:', e.message);
return null;
}
}
// ── FAA AIRSPACE + TFR ────────────────────────────────────────────────────
async function fetchFAA(lat, lng) {
try {
// Try Netlify proxy first
let url = `/.netlify/functions/tfr?lat=${lat.toFixed(4)}&lng=${lng.toFixed(4)}`;
let res = await fetch(url, { signal: AbortSignal.timeout(8000) });
if (res.status === 404) {
// Proxy not available — return null gracefully
console.warn('[SkyGrid] FAA TFR proxy not found');
return null;
}
if (!res.ok) throw new Error('FAA TFR HTTP ' + res.status);
const data = await res.json();
console.log('[SkyGrid] FAA TFR result:', data.tfrs?.length, 'nearby TFRs of', data.total, 'total');
return data;
} catch(e) {
console.warn('[SkyGrid] FAA TFR fetch failed:', e.message);
return null;
}
}
async function fetchAirspace(lat, lng) {
try {
// 6 second hard timeout — never hold up the report for airspace
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 6000);
const res = await fetch(`/.netlify/functions/airspace?lat=${lat.toFixed(4)}&lng=${lng.toFixed(4)}`, { signal: AbortSignal.timeout(8000),
signal: controller.signal
});
clearTimeout(timer);
if (!res.ok) return null;
const data = await res.json();
if (data.error) return null;
console.log('[SkyGrid] Airspace class:', data.airspaceClass, '|', data.droneStatus);
return data;
} catch(e) {
console.warn('[SkyGrid] Airspace fetch skipped (timeout or error):', e.message);
return null; // always graceful — report runs without it
}
}
function buildFAABlock(faaData, airspaceData, lat, lng) {
const b4uflyUrl = `https://b4ufly.aloft.ai/?lat=${lat || 0}&lng=${lng || 0}`;
const hasTFR = faaData && faaData.tfrs && faaData.tfrs.length > 0;
const tfrStatus = hasTFR ? '⚠ TFR ACTIVE' : (faaData ? '✅ NO TFRs WITHIN 30 MI' : 'TFR status unavailable');
const tfrColor = hasTFR ? '#ef4444' : (faaData ? '#22c55e' : '#888');
// Airspace class display
let airspaceHtml = '';
const cls = (airspaceData?.airspaceClass || '').replace(/^CLASS\s*/i, '').trim() || 'G';
if (airspaceData && airspaceData.airspaceClass) {
const clsColors = { 'B':'#ef4444','C':'#f97316','D':'#3b82f6','E':'#a855f7','G':'#22c55e' };
const clsColor = clsColors[cls] || '#888';
const droneColors = { 'red':'#ef4444','orange':'#f97316','yellow':'#eab308','green':'#22c55e' };
const droneColor = droneColors[airspaceData.droneColor] || '#888';
// UAS ceiling note
const ceilingNote = airspaceData.uasCeiling != null
? `<span style="color:#fbbf24;margin-left:8px">Max UAS: ${airspaceData.uasCeiling}ft AGL${airspaceData.uasAirport ? ' near ' + airspaceData.uasAirport : ''}</span>`
: '';
// Nearby controlled airspace
const nearbyHtml = (airspaceData.nearbyControlled || []).map(n =>
`<div style="color:#888;margin-top:2px">Class ${n.class} · ${n.name} nearby</div>`
).join('');
airspaceHtml = `
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px">
<span style="color:#f59e0b;letter-spacing:.5px">AIRSPACE</span>
<span style="color:${clsColor};font-weight:700;font-size:.7rem">CLASS ${cls}</span>
<span style="color:${droneColor};margin-left:4px">▶ ${airspaceData.droneStatus}</span>
${ceilingNote}
</div>
<div style="color:#aaa;margin-bottom:4px">${airspaceData.droneNote || ''}</div>
${nearbyHtml}`;
}
// TFR list
const tfrList = (faaData?.tfrs || []).slice(0, 3).map(t => {
const typeLabel = t.type === 'HAZARDS' ? '🔥 Hazard' :
t.type === 'VIP' ? '🔒 VIP' :
t.type === 'SECURITY' ? '🔒 Security' :
t.type === 'STADIUM' ? '🏟 Stadium' : t.type || 'TFR';
return `<div style="margin-top:3px;color:#fbbf24">${typeLabel} · NOTAM ${t.notam} · ${t.distance} mi away</div>`;
}).join('');
const borderColor = hasTFR ? '#7f1d1d' : (cls === 'G' ? '#14532d' : '#1d3557');
const bgColor = hasTFR ? '#1a0a0a' : (cls === 'G' ? '#0a1a0a' : '#0a0f1a');
return `<div style="font-family:monospace;font-size:.6rem;margin:6px 0 4px;padding:8px 10px;border:1px solid ${borderColor};border-radius:6px;background:${bgColor}">
${airspaceHtml}
<div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:${airspaceHtml ? '6px' : '0'}">
<span style="color:#f59e0b;letter-spacing:.5px">✈ TFR STATUS</span>
<span style="color:${tfrColor};font-weight:700">${tfrStatus}</span>
<a href="${b4uflyUrl}" target="_blank" style="color:#4a9eff;margin-left:auto">Check B4UFLY ↗</a>
</div>
${tfrList}
${hasTFR ? '<div style="color:#ef4444;margin-top:4px;font-weight:700">⚠ Verify TFR details before flight</div>' : ''}
<div style="color:#555;margin-top:4px">Current TFRs only · Always verify airspace day-of with B4UFLY or Aloft</div>
</div>`;
}
// ───────────────────────────────────────────────────────────────────────────
function moonPhase(date) {
// Calculate moon age in days (0-29.53)
const known = new Date(2000, 0, 6, 18, 14, 0); // known new moon Jan 6 2000
const synodic = 29.53058867;
const diff = (date - known) / (1000 * 60 * 60 * 24);
let age = ((diff % synodic) + synodic) % synodic;
const illumination = Math.round((1 - Math.cos((age / synodic) * 2 * Math.PI)) / 2 * 100);
let name, emoji;
if (age < 1.85) { name = 'New Moon'; emoji = '🌑'; }
else if (age < 7.38) { name = 'Waxing Crescent'; emoji = '🌒'; }
else if (age < 9.22) { name = 'First Quarter'; emoji = '🌓'; }
else if (age < 14.77) { name = 'Waxing Gibbous'; emoji = '🌔'; }
else if (age < 16.61) { name = 'Full Moon'; emoji = '🌕'; }
else if (age < 22.15) { name = 'Waning Gibbous'; emoji = '🌖'; }
else if (age < 23.99) { name = 'Last Quarter'; emoji = '🌗'; }
else if (age < 29.53) { name = 'Waning Crescent'; emoji = '🌘'; }
else { name = 'New Moon'; emoji = '🌑'; }
return { age: Math.round(age), name, emoji, illumination };
}
// ───────────────────────────────────────────────────────────────────────────
function aqiCategory(v) {
if (v <= 50) return 'Good';
if (v <= 100) return 'Moderate';
if (v <= 150) return 'Unhealthy for Sensitive';
if (v <= 200) return 'Unhealthy';
if (v <= 300) return 'Very Unhealthy';
return 'Hazardous';
}
function aqiLevel(v) {
if (v === null || v === undefined) return 'unknown';
if (v <= 50) return 'good';
if (v <= 100) return 'moderate';
if (v <= 150) return 'sensitive';
if (v <= 200) return 'unhealthy';
return 'hazardous';
}
function aqiLabel(v) {
if (v === null || v === undefined) return '—';
return v + ' · ' + aqiCategory(v);
}
// ================================================================
// WEATHER
// ================================================================
async function fetchWeather(lat, lng, days, startDate) {
const d = Math.min(days, 16);
const start = startDate || new Date();
// Use local date (not UTC) to avoid timezone off-by-one where toISOString() returns tomorrow
const fmtLocal = dt => {
const y = dt.getFullYear();
const m = String(dt.getMonth() + 1).padStart(2, '0');
const day = String(dt.getDate()).padStart(2, '0');
return `${y}-${m}-${day}`;
};
const endDate = new Date(start);
endDate.setDate(endDate.getDate() + d - 1);
const target = `https://api.open-meteo.com/v1/forecast?latitude=${lat}&longitude=${lng}`
+ `&daily=weathercode,temperature_2m_max,temperature_2m_min,precipitation_sum,windspeed_10m_max,windgusts_10m_max,winddirection_10m_dominant,sunrise,sunset`
+ `&hourly=windspeed_10m,winddirection_10m,windgusts_10m,weathercode`
+ `&wind_speed_unit=mph&temperature_unit=fahrenheit&timezone=auto`
+ `&start_date=${fmtLocal(start)}&end_date=${fmtLocal(endDate)}`;
// Open-Meteo fully supports CORS — try direct first (works from any hosted origin).
// Proxies are fallback only for edge cases (strict corporate networks, etc).
const attempts = [
{ url: target, label: 'direct' },
{ url: 'https://corsproxy.io/?' + encodeURIComponent(target), label: 'corsproxy.io' },
{ url: 'https://api.allorigins.win/raw?url=' + encodeURIComponent(target), label: 'allorigins' },
{ url: 'https://thingproxy.freeboard.io/fetch/' + encodeURIComponent(target), label: 'thingproxy' },
{ url: 'https://api.codetabs.com/v1/proxy?quest=' + encodeURIComponent(target), label: 'codetabs' },
];
for (const attempt of attempts) {
try {
console.log('[SkyGrid] Weather trying:', attempt.label);
const res = await fetch(attempt.url, { signal: AbortSignal.timeout(12000),
signal: AbortSignal.timeout(attempt.label === 'direct' ? 8000 : 14000),
cache: 'no-cache'
});
if (!res.ok) { console.warn('[SkyGrid] HTTP', res.status, 'from', attempt.label); continue; }
const data = await res.json();
if (data && data.daily) {
console.log('[SkyGrid] Weather OK via:', attempt.label);
// Extract site elevation from Open-Meteo response
if (data.elevation !== undefined && data.elevation !== null) {
siteElevFt = Math.round(data.elevation * 3.28084);
console.log('[SkyGrid] Site elevation:', siteElevFt, 'ft');
}
return data;
}
console.warn('[SkyGrid] No daily data from', attempt.label);
} catch(e) {
console.warn('[SkyGrid] Weather failed via', attempt.label + ':', e.message);
}
}
throw new Error('All weather fetch attempts failed');
}
// ── v1 WEATHER + WIND HELPERS ────────────────────────────────────────
function windStatus(wind, gusts) {
if (gusts > 45 || wind > 35) return {status:'GROUNDED', color:'#c62828', bg:'#ffebee', icon:'🚫', rank:3};
if (gusts > 30 || wind > 22) return {status:'HIGH RISK', color:'#e65100', bg:'#fff3e0', icon:'⛔', rank:2};
if (gusts > 20 || wind > 15) return {status:'CAUTION', color:'#f57c00', bg:'#fff8e1', icon:'⚠️', rank:1};
return {status:'GO', color:'#2e7d32', bg:'#f1f8f1', icon:'✅', rank:0};
}
function compassDir(deg) {
if (deg === null || deg === undefined) return '';
return ['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','WNW','NW','NNW'][Math.round(deg/22.5)%16];
}
function weatherRating(w) {
if (!w) return { rating: 'unknown', label: 'No Data', color: '#64748b' };
if (w.code >= 80) return { rating: 'avoid', label: 'AVOID — Storms/Heavy Rain', color: '#ff4444' };
if (w.windGusts > 35) return { rating: 'caution', label: 'CAUTION — High Gusts', color: '#ffb800' };
if (w.code >= 60 || w.precip > 0.1) return { rating: 'caution', label: 'CAUTION — Rain Expected', color: '#ffb800' };
if (w.windMax > 20) return { rating: 'caution', label: 'CAUTION — Windy', color: '#ffb800' };
return { rating: 'go', label: 'GO — Good Conditions', color: '#00ff9d' };
}
function weatherCodeDesc(code) {
if (code === 0) return 'Clear sky';
if (code <= 3) return 'Partly cloudy';
if (code <= 49) return 'Foggy';
if (code <= 59) return 'Drizzle';
if (code <= 69) return 'Rain';
if (code <= 79) return 'Snow';
if (code <= 82) return 'Rain showers';
if (code <= 86) return 'Snow showers';
if (code <= 99) return 'Thunderstorm ⚡';
return 'Unknown';
}
function weatherEmoji(code) {
if (code === 0) return '☀️';
if (code <= 3) return '⛅';
if (code <= 49) return '🌫️';
if (code <= 69) return '🌧️';
if (code <= 79) return '❄️';
if (code <= 82) return '🌦️';
if (code <= 99) return '⛈️';
return '🌤️';
}
// Convert v2 raw wxData + dayIdx into v1-compatible weather object
function buildDayWeather(wxData, dayIdx) {
if(!wxData || !wxData.daily) return null;
const daily = wxData.daily;
const hourly = wxData.hourly;
const code = daily.weathercode?.[dayIdx] ?? 0;
const windMax = daily.windspeed_10m_max?.[dayIdx] ?? 0;
const windGusts = daily.windgusts_10m_max?.[dayIdx] ?? 0;
const windDir = daily.winddirection_10m_dominant?.[dayIdx] ?? 0;
const tempMax = daily.temperature_2m_max?.[dayIdx] ?? 70;
const tempMin = daily.temperature_2m_min?.[dayIdx] ?? 50;
const precip = daily.precipitation_sum?.[dayIdx] ?? 0;
const srStr = daily.sunrise?.[dayIdx] ?? null;
const ssStr = daily.sunset?.[dayIdx] ?? null;
const srHour = srStr ? parseInt(srStr.slice(11,13)) : 6;
const srMin = srStr ? parseInt(srStr.slice(14,16)) : 0;
const ssHour = ssStr ? parseInt(ssStr.slice(11,13)) : 19;
const ssMin = ssStr ? parseInt(ssStr.slice(14,16)) : 0;
const fmtSun = (h,m) => { const ap=h<12?'AM':'PM', hh=h%12||12, mm=m>0?':'+String(m).padStart(2,'0'):':00'; return hh+mm+' '+ap; };
// Build hourly array for this day (5am–8pm)
const hourOffset = dayIdx * 24;
const hourlyArr = [];
if(hourly && hourly.windspeed_10m) {
for(let h=5; h<=20; h++) {
const idx = hourOffset + h;
if(idx < hourly.windspeed_10m.length) {
hourlyArr.push({
hour: h,
wind: Math.round(hourly.windspeed_10m[idx] ?? 0),
gusts: Math.round(hourly.windgusts_10m?.[idx] ?? hourly.windspeed_10m[idx] ?? 0),
dir: hourly.winddirection_10m?.[idx] ?? 0
});
}
}
}
return { code, windMax, windGusts, windDir, tempMax, tempMin, precip,
sunriseHour: srHour, sunriseMin: srMin, sunsetHour: ssHour, sunsetMin: ssMin,
sunriseStr: srStr ? fmtSun(srHour, srMin) : null,
sunsetStr: ssStr ? fmtSun(ssHour, ssMin) : null,
hourly: hourlyArr };
}
function formatWeatherHTML(w, wr) {
if (!w) return '';
const bgColor = wr.rating==='go' ? '#f1f8f1' : wr.rating==='caution' ? '#fff8e1' : '#ffebee';
const bdColor = wr.rating==='go' ? '#388e3c' : wr.rating==='caution' ? '#f57c00' : '#c62828';
return '<div class="weather-strip" style="border-color:'+bdColor+';background:'+bgColor+'">'
+'<div class="weather-emoji">'+weatherEmoji(w.code)+'</div>'
+'<div class="weather-info">'
+'<div class="weather-status" style="color:'+bdColor+'">'+wr.label+'</div>'
+'<div class="weather-details">'+weatherCodeDesc(w.code)+' | Wind: '+w.windMax+' mph (gusts '+w.windGusts+' mph) | Precip: '+w.precip+'" | Temp: '+w.tempMin+'°–'+w.tempMax+'°F</div>'
+'</div></div>';
}
function buildFieldWarningsHTML(w) {
if(!w) return '';
const warns=[];
if(w.code>=95) warns.push('⛈️ THUNDERSTORMS — Do not operate in the field');
else if(w.code>=80) warns.push('🌧️ HEAVY RAIN/SHOWERS — Equipment exposure risk');
else if(w.code>=61) warns.push('🌧️ RAIN — Protect equipment, slippery conditions');
if(w.code>=71&&w.code<=77) warns.push('❄️ SNOW — Check site access and road conditions');
if(w.windGusts>45) warns.push(`💨 EXTREME WIND GUSTS ${w.windGusts} mph — Do not set up equipment`);
else if(w.windGusts>30) warns.push(`💨 HIGH WIND GUSTS ${w.windGusts} mph — Secure all tripods`);
if(w.tempMax>105) warns.push(`🌡️ EXTREME HEAT ${w.tempMax}°F — Heat safety protocols required`);
else if(w.tempMax>95) warns.push(`🌡️ HIGH HEAT ${w.tempMax}°F — Monitor crew for heat stress`);
if(w.tempMin<20) warns.push(`🥶 EXTREME COLD ${w.tempMin}°F — Battery and equipment severely degraded`);
else if(w.tempMin<32) warns.push(`🥶 FREEZING TEMPS ${w.tempMin}°F — Monitor batteries, ice possible`);
if(!warns.length) return '';
return '<div class="field-warnings"><div class="fw-title">⚠️ Field Safety Warnings</div>'+warns.map(x=>'<div class="fw-item">'+x+'</div>').join('')+'</div>';
}
function formatDroneWindHTML(w) {
if (!w) return '';
const daily = windStatus(w.windMax || 0, w.windGusts || 0);
const hourly = w.hourly || [];
console.log('[SkyGrid] drone wind: hourly='+hourly.length+' windMax='+w.windMax);
// Turbulence: gust-to-sustained ratio
const turbHours = hourly.filter(h => (h.gusts - h.wind) > 15);
const turbulent = turbHours.length >= 3;
const maxTurbSpike = turbulent ? Math.round(Math.max(...turbHours.map(h => h.gusts - h.wind))) : 0;
// Best flyable window: longest consecutive GO streak within daylight hours
const srH = w.sunriseHour != null ? w.sunriseHour : 5;
const srM = w.sunriseMin != null ? w.sunriseMin : 0;
const ssH = w.sunsetHour != null ? w.sunsetHour : 20;
const ssM = w.sunsetMin != null ? w.sunsetMin : 0;
// Convert to decimal for fractional hour comparison
const srDec = srH + srM/60;
const ssDec = ssH + ssM/60;
let flyStart = null, flyEnd = null, bestRun = 0, curRun = 0, curStart = null;
hourly.forEach(h => {
// Only consider hours within civil daylight (sunrise to sunset)
if (h.hour < srDec || h.hour > ssDec) { curRun = 0; curStart = null; return; }
if (windStatus(h.wind, h.gusts).rank === 0) {
curRun++;
if (!curStart) curStart = h.hour;
if (curRun > bestRun) { bestRun = curRun; flyStart = curStart; flyEnd = h.hour; }
} else { curRun = 0; curStart = null; }
});
// Direction consistency
let dirShift = false;
if (hourly.length >= 2) {
const dirs = hourly.map(h => h.dir || 0);
let spread = Math.max(...dirs) - Math.min(...dirs);
if (spread > 180) spread = 360 - spread;
dirShift = spread > 60;
}
const fmt12 = h => { const ap = h < 12 ? 'AM' : 'PM'; return (h % 12 || 12) + ':00 ' + ap; };
const flyWindow = (flyStart !== null && bestRun >= 2)
? fmt12(flyStart) + ' \u2013 ' + fmt12(flyEnd + 1) + (bestRun >= 4 ? ' (' + bestRun + ' hrs)' : '')
: null;
// Bar chart
const maxBar = Math.max(35, ...hourly.map(h => h.gusts || 0));
const bars = hourly.map(h => {
const s = windStatus(h.wind, h.gusts);
const wPct = Math.round((h.wind / maxBar) * 100);
const gPct = Math.round((h.gusts / maxBar) * 100);
const turb = (h.gusts - h.wind) > 15 ? '<span style="color:#ff6b00;margin-left:3px">⚡</span>' : '';
const rankCls = ['wbar-go','wbar-caution','wbar-highrisk','wbar-grounded'][s.rank];
return '<div style="display:grid;grid-template-columns:46px 1fr 44px;align-items:center;gap:3px;margin-bottom:1px">'
+ '<div style="font-family:monospace;font-size:.62rem;color:#888;text-align:right;padding-right:4px">' + fmt12(h.hour).replace(':00','') + '</div>'
+ '<div class="wbar-track" style="position:relative;height:12px;border-radius:3px;overflow:hidden">'
+ '<div class="wbar-gust" style="position:absolute;inset:0;width:' + gPct + '%;border-radius:3px"></div>'
+ '<div class="wbar-wind ' + rankCls + '" style="position:absolute;top:2px;left:0;height:13px;width:' + wPct + '%;border-radius:2px;"></div>'
+ '<span class="wbar-label" style="position:absolute;left:5px;top:0;font-size:.65rem;font-family:monospace;line-height:17px">'
+ h.wind + '/' + h.gusts + ' mph' + turb
+ '</span>'
+ '</div>'
+ '<div style="font-family:monospace;font-size:.6rem;color:#999;text-align:center">' + compassDir(h.dir) + '</div>'
+ '</div>';
}).join('');
// Sunrise/sunset line
const sunLine = (w.sunriseStr && w.sunsetStr)
? '<div style="font-family:monospace;font-size:.6rem;color:#888;margin-bottom:6px;letter-spacing:.5px">'
+ '☀ Sunrise: <strong style="color:#ccc">' + w.sunriseStr + '</strong>'
+ ' ☾ Sunset: <strong style="color:#ccc">' + w.sunsetStr + '</strong>'
+ ' <span style="color:#666">fly window clipped to daylight</span>'
+ '</div>'
: '';
return '<div class="drone-wind-box" style="border:1px solid ' + daily.color + ';background:#0d1117;border-radius:10px;padding:14px 16px;margin-bottom:14px;page-break-inside:avoid">'
// Header
+ '<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;flex-wrap:wrap;gap:6px">'
+ '<span style="font-family:monospace;font-size:.63rem;text-transform:uppercase;letter-spacing:1.5px;color:' + daily.color + ';font-weight:700">🚁 Drone Wind Analysis</span>'
+ '<span style="font-size:.78rem;color:#aaa">' + daily.icon + ' <strong style="color:' + daily.color + '">' + daily.status + '</strong> Peak: ' + (w.windMax||0) + '/' + (w.windGusts||0) + ' mph ' + compassDir(w.windDir) + '</span>'
+ '</div>'
+ sunLine
// Fly window
+ (hourly.length === 0
? '<div style="color:#888;font-size:.8rem;margin-bottom:10px">No hourly data \u2014 check that a location is set before analyzing</div>'
: flyWindow
? '<div style="background:rgba(0,255,157,.07);border:1px solid rgba(0,255,157,.2);border-radius:6px;padding:6px 12px;margin-bottom:8px;font-size:.78rem;color:#00ff9d">✅ Best flight window: <strong>' + flyWindow + '</strong></div>'
: '<div style="background:rgba(255,68,68,.07);border:1px solid rgba(255,68,68,.2);border-radius:6px;padding:6px 12px;margin-bottom:8px;font-size:.78rem;color:#ff6b6b">⛔ No clean flyable window today</div>')
// Turbulence
+ (turbulent ? '<div style="background:rgba(255,107,0,.1);border:1px solid rgba(255,107,0,.25);border-radius:6px;padding:6px 12px;margin-bottom:8px;font-size:.75rem;color:#ff6b00">⚡ Turbulence risk \u2014 gust spikes up to ' + maxTurbSpike + ' mph above sustained</div>' : '')
// Direction shift
+ (dirShift ? '<div style="background:rgba(255,184,0,.07);border:1px solid rgba(255,184,0,.2);border-radius:6px;padding:6px 12px;margin-bottom:8px;font-size:.75rem;color:#ffb800">🔄 Wind direction shifting \u2014 plan mission headings carefully</div>' : '')
// Legend + bars
+ (hourly.length > 0
? '<div style="display:grid;grid-template-columns:46px 1fr 44px;gap:5px;margin-bottom:5px">'
+ '<div></div>'
+ '<div style="font-size:.58rem;color:#555;font-family:monospace">SUSTAINED / GUSTS mph ⚡=turbulence</div>'
+ '<div style="font-size:.58rem;color:#555;font-family:monospace;text-align:center">DIR</div>'
+ '</div>' + bars
: '')
+ '</div>';
}
const WX_CODES={0:'Clear sky',1:'Mainly clear',2:'Partly cloudy',3:'Overcast',45:'Foggy',48:'Rime fog',51:'Light drizzle',53:'Moderate drizzle',55:'Dense drizzle',61:'Slight rain',63:'Moderate rain',65:'Heavy rain',71:'Slight snow',73:'Moderate snow',75:'Heavy snow',77:'Snow grains',80:'Rain showers',81:'Moderate showers',82:'Violent showers',85:'Snow showers',86:'Heavy snow showers',95:'Thunderstorm',96:'Thunderstorm + hail',99:'Thunderstorm + heavy hail'};
function wxDesc(code){return WX_CODES[code]||`Code ${code}`;}
function buildFieldWarnings(wxData, dayIdx) {
const warnings=[], daily=wxData.daily;
const code=daily.weathercode[dayIdx], maxWind=daily.windspeed_10m_max[dayIdx], gusts=daily.windgusts_10m_max[dayIdx], maxT=daily.temperature_2m_max[dayIdx], minT=daily.temperature_2m_min[dayIdx];
if(code>=95) warnings.push({level:'critical',msg:'Thunderstorm forecast. Do NOT fly or operate equipment outdoors.'});
else if(code>=71&&code<=77) warnings.push({level:'critical',msg:'Snow forecast. GNSS multipath from accumulation likely.'});
else if(code>=61&&code<=65) warnings.push({level:'caution',msg:'Rain forecast. Protect equipment; PPP initialization delay possible.'});
if(maxWind>30) warnings.push({level:'critical',msg:`High winds ${maxWind?.toFixed(0)} mph — drone operations unsafe.`});
else if(maxWind>20) warnings.push({level:'caution',msg:`Breezy ${maxWind?.toFixed(0)} mph (gusts ${gusts?.toFixed(0)||'?'} mph). Monitor drone conditions.`});
if(maxT>100) warnings.push({level:'caution',msg:`Extreme heat ${maxT?.toFixed(0)}°F. Heat stroke risk.`});
if(minT<20) warnings.push({level:'caution',msg:`Extreme cold ${minT?.toFixed(0)}°F. Battery performance degraded.`});
return warnings;
}
// Score a day for ranking (lower is better)
function scoreDayConditions(wxData, dayIdx, dopDay) {
let score = 0;
const daily = wxData.daily;
const code = daily.weathercode[dayIdx];
const maxWind = daily.windspeed_10m_max[dayIdx] || 0;
// Weather penalty
if (code >= 95) score += 100;
else if (code >= 71 && code <= 77) score += 60;
else if (code >= 61 && code <= 65) score += 40;
else if (code >= 51 && code <= 55) score += 20;
else if (code === 3) score += 5;
// Wind penalty
if (maxWind > 30) score += 50;
else if (maxWind > 20) score += 25;
else if (maxWind > 15) score += 10;
// DOP penalty
if (dopDay && dopDay.avgPdop) {
score += Math.max(0, (dopDay.avgPdop - 1.5) * 10);
}
return score;
}
async function fetchFemaDirect(lat, lng) {
// FEMA blocks server-to-server — fetch directly from browser (CORS is open)
try {
const base = 'https://hazards.fema.gov/arcgis/rest/services/public/NFHL/MapServer';
const geom = `where=1%3D1&geometry=${lng}%2C${lat}&geometryType=esriGeometryPoint&inSR=4269&spatialRel=esriSpatialRelIntersects&returnGeometry=false&f=json`;
const [zoneRes, panelRes] = await Promise.allSettled([
fetch(`${base}/28/query?${geom}&outFields=FLD_ZONE%2CZONE_SUBTY%2CDFIRM_ID%2CSFHA_TF`, { signal: AbortSignal.timeout(8000) }),
fetch(`${base}/3/query?${geom}&outFields=FIRM_PAN%2CPANEL%2CSUFFIX%2CEFF_DATE`, { signal: AbortSignal.timeout(8000) })
]);
let zone=null, subtype=null, dfirmId=null, firmPan=null, effDate=null;
if (zoneRes.status==='fulfilled' && zoneRes.value.ok) {
const d = await zoneRes.value.json();
const f = d.features?.[0]?.attributes;
if (f) { zone=f.FLD_ZONE; subtype=f.ZONE_SUBTY||''; dfirmId=f.DFIRM_ID; }
}
if (panelRes.status==='fulfilled' && panelRes.value.ok) {
const d = await panelRes.value.json();
const f = d.features?.[0]?.attributes;
if (f) {
firmPan = f.FIRM_PAN || f.PANEL || null;
if (firmPan && f.SUFFIX) firmPan += f.SUFFIX;
if (f.EFF_DATE) effDate = new Date(f.EFF_DATE).toLocaleDateString('en-US',{year:'numeric',month:'short',day:'numeric'});
}
}
if (!zone) return null;
console.log('[SkyGrid] FEMA direct:', zone, dfirmId);
return {
zone, subtype, panel: firmPan || dfirmId || 'N/A', effDate: effDate || 'N/A',
url: `https://msc.fema.gov/portal/search?AddressQuery=${lat},${lng}`
};
} catch(e) {
console.warn('[SkyGrid] FEMA direct fetch failed:', e.message);
return null;
}
}
async function fetchControl(lat, lng) {
try {
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 10000);
const res = await fetch(`/.netlify/functions/control?lat=${lat.toFixed(4)}&lng=${lng.toFixed(4)}`, {
signal: controller.signal
});
clearTimeout(timer);
if (!res.ok) return null;
const data = await res.json();
// Fetch FEMA directly from browser (bypasses server-side block)
data.femaZone = await fetchFemaDirect(lat, lng);
console.log('[SkyGrid] Control: CORS:', data.corsStations?.length, '| BM:', data.benchmarks?.length, '| FEMA:', data.femaZone?.zone);
return data;
} catch(e) {
console.warn('[SkyGrid] Control fetch skipped:', e.message);
return null;
}
}
// ================================================================
// AUTO MODE ORCHESTRATOR
// ================================================================
// ── WILDFIRE PROXIMITY (NIFC AGOL) ──────────────────────────────────────────
async function fetchWildfire(lat, lng) {
console.log('[SkyGrid] fetchWildfire called:', lat, lng);
try {
const res = await fetch(`/.netlify/functions/wildfire?lat=${lat.toFixed(4)}&lng=${lng.toFixed(4)}`, { signal: AbortSignal.timeout(10000) });
if (!res.ok) throw new Error('Wildfire function HTTP ' + res.status);
const data = await res.json();
console.log('[SkyGrid] Wildfire result:', data.fires?.length, 'fires', data.error || '');
return data;
} catch(e) {
console.warn('[SkyGrid] Wildfire fetch failed:', e.message);
return { fires: [], error: e.message };
}
}
async function analyzeAuto() {
const lat = parseFloat(document.getElementById('a-lat').value);
const lng = parseFloat(document.getElementById('a-lng').value);
if (isNaN(lat) || isNaN(lng) || lat < -90 || lat > 90 || lng < -180 || lng > 180) {
alert('Invalid coordinates. Please search for a valid address or enter lat/lng manually.');
return;
}
const apiKey = document.getElementById('a-apikey').value.trim() || ls('apikey');
if (!apiKey) { alert('Please enter your Anthropic API key.'); return; }
const btn = document.getElementById('run-btn');
btn.disabled = true;
['gnss','iono','wx','ai'].forEach(k => setDot(k,'idle'));
showProgress(true);
document.getElementById('auto-results').classList.remove('visible');
let dopData = null, ionoResult = null, wxData = null;
let almanacSats = null, refDateISO = null;
const company=ls('company')||'', jobname=ls('jobname')||'', sitedesc=ls('sitedesc')||'';
const startDate = getStartDate(); // user-selected or today
// 1. GNSS DOP — fetch gnssplanning almanac for the center reference day,
// then compute DOP independently for each day using real UTC times.
// This accurately captures per-day spikes and geometry dead zones.
setStep('ps-gnss','active'); setDot('gnss','loading');
try {
refDateISO = getRefDay(startDate);
console.log('[SkyGrid] Fetching almanac for reference day:', refDateISO);
const almanacData = await fetchGNSSAlmanac(refDateISO);
almanacSats = parseAlmanacSats(almanacData);
console.log('[SkyGrid] Almanac loaded:', almanacSats.length, 'healthy satellites');
setStep('ps-gnss','done'); setStep('ps-dop','active');
dopData = almanacToDopData(almanacSats, lat, lng, startDate, selectedDays, refDateISO);
setStep('ps-dop','done'); setDot('gnss','ok');
console.log('[SkyGrid] DOP computed for', selectedDays, 'days — true per-day independent computation (no drift approximation)');
} catch(e) {
setStep('ps-gnss','err'); setStep('ps-dop','err'); setDot('gnss','err');
console.error('[SkyGrid] GNSS almanac fetch failed:', e.message);
}
// 2. Ionosphere
setStep('ps-iono','active'); setDot('iono','loading');
try {
const [kpRaw, fluxRaw, tecRaw] = await Promise.all([fetchIonoData().catch(()=>null), fetchSolarFlux().catch(()=>null), fetchTEC(lat, lng).catch(()=>null)]);
if (!kpRaw && !fluxRaw && !tecRaw) { throw new Error('All iono sources failed'); }
ionoResult = interpretIono(kpRaw, fluxRaw, tecRaw);
setStep('ps-iono','done'); setStep('ps-flux','done');
setDot('iono', ionoResult.level==='elevated' ? 'warn' : 'ok');
} catch(e) { setStep('ps-iono','err'); setStep('ps-flux','err'); setDot('iono','err'); }
// 3. Weather + AQI + FAA — fetch in parallel
setStep('ps-wx','active'); setDot('wx','loading');
// Show AQI step if key is present
const aqiKey = (typeof ls === 'function' ? ls('airnow_key') : '') || 'BCE0E778-7D73-47B9-A45D-C88A3ADB6C84';
if (aqiKey) setStep('ps-aqi','active');
setStep('ps-faa','active');
setStep('ps-fire','active');
setStep('ps-nanu','active');
setStep('ps-landcover','active');
let wxFailed = false;
let aqiData = null;
let faaData = null;
let airspaceData = null;
let controlData = null;
let fireData = null;
let nanuData = null;
let landCoverData = null;
let streamGaugeData = null;
let cdecData = null;
let usbrData = null;
let armyCorpsData = null;
try {
// Fetch declination in parallel (non-blocking — failure is OK)
fetchDeclination(lat, lng).then(decl => {
if (decl !== null) updateCoverDeclination(decl);
});
[wxData, aqiData, faaData, airspaceData, controlData, fireData, nanuData, landCoverData, streamGaugeData, cdecData, usbrData, armyCorpsData] = await Promise.all([
fetchWeather(lat, lng, selectedDays, startDate).catch(e => { console.warn('[SkyGrid] Weather failed:', e.message); return null; }),
fetchAQI(lat, lng, selectedDays).catch(() => null),
fetchFAA(lat, lng).catch(() => null),
fetchAirspace(lat, lng).catch(() => null),
fetchControl(lat, lng).catch(() => null),
fetchWildfire(lat, lng).catch(() => { return { fires: [], error: 'fetch failed' }; }),
fetchNanu().catch(() => null),
fetchLandCover(lat, lng).catch(() => null),
fetchStreamGauges(lat, lng).catch(() => null),
fetchCDEC(lat, lng).catch(() => null),
fetchUSBR(lat, lng).catch(() => null),
fetchArmyCorps(lat, lng).catch(() => null)
]);
if (!wxData || !wxData.daily || !wxData.daily.time || !wxData.daily.time.length) {
throw new Error('Empty response from Open-Meteo');
}
setStep('ps-wx','done'); setDot('wx','ok');
if (aqiData) { setStep('ps-aqi','done'); console.log('[SkyGrid] AQI data mapped:', Object.keys(aqiData)); }
else { setStep('ps-aqi','err'); console.warn('[SkyGrid] AQI returned null'); }
if (faaData) { setStep('ps-faa', faaData.tfrs?.length > 0 ? 'warn' : 'done'); }
else { setStep('ps-faa','err'); }
if (fireData && Array.isArray(fireData.fires)) {
const dangerFires = fireData.fires.filter(f => f.distMi < 50);
setStep('ps-fire', dangerFires.length > 0 ? 'warn' : 'done');
} else { setStep('ps-fire','err'); }
if (nanuData && !nanuData.error) {
setStep('ps-nanu', nanuData.activeCount > 0 ? 'warn' : 'done');
} else if (nanuData && nanuData.error) {
setStep('ps-nanu', 'err');
} else {
setStep('ps-nanu', 'err');
}
if (landCoverData && !landCoverData.error) {
const obs = landCoverData.worstObstruction;
setStep('ps-landcover', (obs === 'high' || obs === 'moderate') ? 'warn' : 'done');
} else {
setStep('ps-landcover', 'err');
}
// check for critical warnings
for (let d=0;d<selectedDays;d++) {
const w = buildFieldWarnings(wxData, d);
if (w.some(x=>x.level==='critical')) { setDot('wx','warn'); break; }
}
} catch(e) {
wxFailed = true;
setStep('ps-wx','err'); setDot('wx','err');
setStep('ps-ai','err');
document.getElementById('auto-results').classList.add('visible');
document.getElementById('ai-summary-card').innerHTML = `
<div class="warn-banner" style="border-left:3px solid #ef4444;padding:16px 20px">
<strong>⚠ Weather fetch failed — report cannot be generated.</strong><br><br>
Open-Meteo weather could not be reached. Tried direct + 4 proxy fallbacks. This usually means:<br>
· You are offline or on a restricted network<br>
· All public proxy services are temporarily down<br><br>
<strong>Fix:</strong> Check your internet connection and try again. Open your browser DevTools (F12 → Console) to see which specific attempt failed and why.<br><br>
<em style="font-size:11px;color:#888">Error detail: ${e.message}</em>
</div>`;
showProgress(false);
btn.disabled = false; btn.textContent = 'GENERATE REPORT';
return;
}
// 4. AI
setStep('ps-ai','active'); setDot('ai','loading');
const prompt = buildAutoPrompt(lat, lng, selectedDays, dopData, ionoResult, wxData, company, jobname, sitedesc, startDate, nanuData, fireData, landCoverData, aqiData);
try {
const aiText = await callClaudeAPI(prompt, apiKey);
setStep('ps-ai','done'); setDot('ai','ok');
document.getElementById('auto-results').classList.add('visible');
// Populate print header
const co_p = ls('company'), jn_p = ls('jobname');
const ph1 = document.getElementById('printHeaderPrepared');
const ph2 = document.getElementById('printHeaderProject');
const ph3 = document.getElementById('printHeaderDate');
const pf = document.getElementById('printFooterDate');
const pl = document.getElementById('printLocation');
const pd = document.getElementById('printDate');
if (ph1) ph1.textContent = co_p ? 'Prepared for: '+co_p : 'SkyGrid — GNSS Survey Planning';
if (ph2) ph2.textContent = jn_p || '';
if (ph3) ph3.textContent = 'Generated: '+new Date().toLocaleDateString('en-US',{weekday:'long',year:'numeric',month:'long',day:'numeric'});
if (pf) pf.textContent = new Date().toLocaleDateString();
if (pl) pl.textContent = lat && lng ? 'Coordinates: '+lat.toFixed(4)+', '+lng.toFixed(4) : '';
if (pd) pd.textContent = 'Generated: '+new Date().toLocaleString();
// Update page title for clean PDF header
document.title = 'SkyGrid Report'+(co_p?' — '+co_p:'')+(jn_p?' | '+jn_p:'');
console.log('[SkyGrid] Rendering iono...');
if (ionoResult) renderIonoPanel(ionoResult);
renderSiteSignalHeader(lat, lng, controlData, fireData);
console.log('[SkyGrid] Rendering DOP table...');
if (dopData) renderDopTable(dopData, wxData, selectedDays);
console.log('[SkyGrid] Rendering week grid...');
renderWeekGrid(wxData, dopData, selectedDays, faaData, airspaceData, lat, lng);
console.log('[SkyGrid] Rendering static window card...');
console.log('[SkyGrid] Rendering static window card...');
if (selectedDays >= 2) renderStaticWindowCard(wxData, dopData, selectedDays);
console.log('[SkyGrid] Rendering wildfire card...');
renderWildfireCard(fireData);
console.log('[SkyGrid] Rendering NANU card...');
renderNanuCard(nanuData);
console.log('[SkyGrid] Rendering land cover card...');
renderLandCoverCard(landCoverData, dopData, almanacSats, lat, lng);
console.log('[SkyGrid] Rendering AI summary...');
renderAISummary(aiText);
applyCountyToReport();
renderControlPage(controlData, lat, lng);
renderSiteConditionsPage(streamGaugeData, cdecData, usbrData, armyCorpsData);
console.log('[SkyGrid] Rendering cover sheet...');
// Cover sheet — only for 3+ day reports
if (selectedDays >= 3) {
renderCoverSheet(wxData, dopData, selectedDays, lat, lng, company, jobname, sitedesc, aqiData, controlData);
} else {
document.getElementById('report-cover').style.display = 'none';
}
console.log('[SkyGrid] All rendering complete.');
autoLastResult = { lat, lng, dopData, ionoResult, wxData, aqiData, faaData, airspaceData, controlData, streamGaugeData, aiText, company, jobname, sitedesc, selectedDays,
almanacSats: almanacSats || null, startDate, refDateISO: refDateISO || null };
} catch(e) {
setStep('ps-ai','err'); setDot('ai','err');
document.getElementById('auto-results').classList.add('visible');
document.getElementById('ai-summary-card').innerHTML = `<div class="warn-banner">AI analysis failed: ${e.message}</div>`;
}
btn.disabled = false;
}
function buildAutoPrompt(lat, lng, days, dopData, iono, wx, company, jobname, sitedesc, startDate, nanuData, fireData, landCoverData, aqiData) {
const today = new Date();
const start = startDate || today;
const DOW = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
const fmtDate = d => d.toLocaleDateString('en-US',{weekday:'long',month:'long',day:'numeric',year:'numeric'});
const isFuture = (start - today) > 86400000;
let p = `You are a senior GNSS survey operations expert. Produce a professional, concise field planning report.\n\n`;
p += `JOB: ${company||'N/A'} — ${jobname||'N/A'}\n`;
p += `SITE: ${sitedesc||'N/A'}\n`;
p += `LOCATION: ${lat.toFixed(4)}, ${lng.toFixed(4)}\n`;
p += `REPORT GENERATED: ${fmtDate(today)}\n`;
p += `SURVEY START DATE: ${fmtDate(start)}${isFuture?' (planned future date)':''}\n`;
p += `ANALYSIS WINDOW: ${days} day(s)\n\n`;
if (iono) {
p += `IONOSPHERIC CONDITIONS\nPeak Kp: ${iono.maxKp.toFixed(1)} | Avg Kp: ${iono.avgKp.toFixed(1)} | Status: ${iono.label}\n`;
if (iono.f107) p += `Solar Flux F10.7: ${iono.f107.toFixed(0)} sfu\n`;
if (iono.tec != null) {
let tecLine = 'TEC (Vertical Total Electron Content): ' + iono.tec.toFixed(1) + ' TECU';
if (iono.tecAnomaly !== null) tecLine += ' (anomaly vs 30-day median: ' + (iono.tecAnomaly >= 0 ? '+' : '') + iono.tecAnomaly.toFixed(1) + ' TECU)';
if (iono.tecDegraded) tecLine += ' [DATA QUALITY DEGRADED - quality_flag non-zero, treat as estimate only]';
p += tecLine + '\n';
} else {
p += 'TEC (Vertical Total Electron Content): UNAVAILABLE (fetch failed — note in analysis)\n';
}
p += `${iono.summary}\n\n`;
}
if (dopData && dopData.length) {
const src = dopData[0]?.source === 'gnssplanning' ? 'GNSS Planning Online (multi-constellation GPS+GLONASS+Galileo+BeiDou)' : 'GPS TLE static model';
p += `GNSS / DOP (source: ${src}, ${currentElevMask}° elevation mask)\n`;
dopData.forEach((d,i) => {
const dow = DOW[d.date.getDay()];
const tags = [];
if (i===0 && d.date.getDay()===new Date().getDay()) {} // date shown inline
if (d.date.getDay()===0||d.date.getDay()===6) tags.push('WEEKEND');
p += ` ${dow} ${d.date.toLocaleDateString('en-US',{month:'short',day:'numeric'})}${tags.length?' ['+tags.join(',')+']':''}: Avg PDOP ${d.avgPdop?.toFixed(2)||'N/A'}, Best window ${d.bestWindow?.label||'N/A'} (PDOP ${d.bestWindow?.avgPdop?.toFixed(2)||'N/A'}, ${d.bestWindow?.sats||'?'} sats)\n`;
});
p += '\n';
}
// NANU satellite health
if (nanuData && !nanuData.error) {
p += `GPS SATELLITE HEALTH (NAVCEN)\n`;
if (nanuData.activeCount === 0 && nanuData.scheduledCount === 0) {
p += ` All GPS satellites healthy — full constellation operational.\n`;
} else {
if (nanuData.activeCount > 0) {
nanuData.active.forEach(o => {
p += ` PRN ${o.prn} — CURRENTLY UNHEALTHY (${o.type})${o.openEnded ? ', no estimated return time' : ''}. Receivers should auto-exclude this satellite.\n`;
});
}
if (nanuData.scheduledCount > 0) {
nanuData.scheduled.forEach(o => {
let timeStr = '';
if (o.startISO && o.endISO) {
const start = new Date(o.startISO);
const end = new Date(o.endISO);
const fmt = d => d.toUTCString().replace(' GMT','').replace(':00 ',' ').slice(0,-3);
timeStr = ` — Scheduled outage: ${fmt(start)} UTC to ${fmt(end)} UTC`;
} else if (o.startISO) {
const start = new Date(o.startISO);
timeStr = ` — Scheduled outage starts: ${start.toUTCString().slice(0,-4)}`;
}
p += ` PRN ${o.prn} — SCHEDULED MAINTENANCE (${o.type})${timeStr}. Informational only — mention in narrative but do not affect day ranking.\n`;
});
}
}
p += '\n';
}
// Wildfire proximity — context only
if (fireData && !fireData.error && fireData.fires !== undefined) {
const nearest = fireData.fires.length > 0
? fireData.fires.reduce((a,b) => a.distMi < b.distMi ? a : b)
: null;
p += `WILDFIRE PROXIMITY (NIFC)\n`;
if (!nearest) {
p += ` No active fires detected within reporting range. Mention briefly as all-clear.\n`;
} else if (nearest.distMi < 25) {
p += ` ⚠ Active fire ${nearest.distMi.toFixed(0)} miles from site — smoke/AQI impact likely. Mention as field safety concern. Do not affect day ranking unless AQI confirms degradation.\n`;
} else if (nearest.distMi < 50) {
p += ` Active fire ${nearest.distMi.toFixed(0)} miles from site — monitor conditions. Informational only.\n`;
} else {
p += ` Nearest active fire ${nearest.distMi.toFixed(0)} miles away — no immediate concern. Brief mention only.\n`;
}
p += ` Note: Wildfire proximity is site context, not a day-ranking factor.\n\n`;
}
// Land cover + mask — context only
if (landCoverData && !landCoverData.error) {
p += `SITE LAND COVER & ELEVATION MASK (USGS NLCD)\n`;
p += ` Dominant cover: ${landCoverData.dominantLabel}\n`;
p += ` Sky obstruction: ${landCoverData.worstObstruction} | Multipath risk: ${landCoverData.worstMultipath}\n`;
p += ` Recommended elevation mask: ${landCoverData.recMask || 'see report'}° based on terrain\n`;
p += ` Note: Land cover is site context. Mention in site conditions summary. Do not affect day ranking.\n\n`;
}
// AQI — context only
if (aqiData) {
const aqiVals = Object.values(aqiData).filter(v => v && typeof v.aqi === 'number');
if (aqiVals.length) {
const maxAqi = Math.max(...aqiVals.map(v => v.aqi));
const aqiLabel = maxAqi <= 50 ? 'Good' : maxAqi <= 100 ? 'Moderate' : maxAqi <= 150 ? 'Unhealthy for Sensitive Groups' : 'Unhealthy';
p += `AIR QUALITY INDEX (AirNow)\n`;
p += ` Peak AQI across survey window: ${maxAqi} (${aqiLabel})\n`;
if (maxAqi > 150) {
p += ` ⚠ Unhealthy air quality — mention as field crew health concern. Do not affect day ranking.\n`;
} else {
p += ` Air quality acceptable for field operations. Brief mention only.\n`;
}
p += ` Note: AQI is crew comfort/safety context, not a day-ranking factor.\n\n`;
}
}
if (wx) {
p += `WEATHER FORECAST\n`;
const daily = wx.daily;
for (let d=0;d<Math.min(days,daily.time.length);d++) {
const dt = new Date(daily.time[d]+'T12:00:00');
const dow = DOW[dt.getDay()];
const tags = [];
if (dt.getDay()===0||dt.getDay()===6) tags.push('WEEKEND');
p += ` ${dow} ${daily.time[d]}${tags.length?' ['+tags.join(',')+']':''}: ${wxDesc(daily.weathercode[d])}, H ${daily.temperature_2m_max[d]?.toFixed(0)}°F L ${daily.temperature_2m_min[d]?.toFixed(0)}°F, Wind max ${daily.windspeed_10m_max[d]?.toFixed(0)} mph, Precip ${daily.precipitation_sum[d]?.toFixed(2)}"\n`;
}
p += '\n';
}
p += `INSTRUCTIONS\n`;
p += `RANKING RULE: Day rankings must be based ONLY on: PDOP geometry, weather conditions, and ionospheric activity. ` +
`Satellite health (NANU), wildfire proximity, land cover, and AQI are SITE CONTEXT — mention them in narrative but DO NOT use them to raise or lower any day's ranking. ` +
`PDOP scores already reflect any reduced constellation from unhealthy satellites.\n`;
if (days === 1) {
p += `Provide:\n1. GO / CAUTION / NO-GO verdict with one clear reason\n2. Best survey window (time range + why)\n3. Best 4-hour static GNSS window\n4. Drone operations assessment\n5. Field safety warnings (if any)\n6. One-paragraph summary\nUse ALL CAPS section labels. Be direct. No markdown.`;
} else if (days === 7) {
p += `Today is Sunday — this report is being distributed Sunday morning to crews for the coming week.\n\nProvide:\n1. TODAY (Sunday) — full GO/CAUTION/NO-GO with rationale\n2. MONDAY CALL — most urgent decision, clear GO/CAUTION/NO-GO since crews mobilize tomorrow\n3. WEEK RANKING — rank all 7 days 1 (best) to 7 (worst) for GNSS survey conditions. Note weekend days. Top 5 are the recommended work candidates.\n4. BEST STATIC WINDOW — best consecutive 4-hour static GNSS session across the whole week\n5. DRONE ASSESSMENT — day-by-day flyable/caution/no-fly\n6. FIELD WARNINGS — any critical safety issues\n7. OVERALL RECOMMENDATION — 2-3 sentences for the crew chief\nUse ALL CAPS section labels. Be concise and field-ready. No markdown.`;
} else {
p += `Provide:\n1. Day ranking best to worst for GNSS survey work, with GO/CAUTION/NO-GO and one-line rationale each. Flag any weekend days.\n2. Best 4-hour static GNSS window across all days\n3. Drone assessment per day\n4. Field safety warnings\n5. Summary recommendation\nUse ALL CAPS section labels. No markdown.`;
}
return p;
}
async function callClaudeAPI(prompt, apiKey) {
console.log('[SkyGrid] Claude API starting, prompt chars:', prompt.length, 'key chars:', apiKey ? apiKey.length : 'NO KEY');
try {
const res = await fetch('https://api.anthropic.com/v1/messages', {
method: 'POST',
signal: AbortSignal.timeout(45000),
headers: { 'Content-Type':'application/json','x-api-key':apiKey,'anthropic-version':'2023-06-01','anthropic-dangerous-direct-browser-access':'true' },
body: JSON.stringify({ model:'claude-haiku-4-5-20251001', max_tokens:2400, messages:[{role:'user',content:prompt}] })
});
console.log('[SkyGrid] Claude API status:', res.status);
if (!res.ok) { const e=await res.json().catch(()=>({})); throw new Error(e.error?.message||`HTTP ${res.status}`); }
const data = await res.json();
console.log('[SkyGrid] Claude API success');
if (!data.content || !data.content[0] || !data.content[0].text) throw new Error('Empty API response');
return data.content[0].text;
} catch(err) {
console.error('[SkyGrid] Claude API FAILED:', err.message);
throw err;
}
}
// ================================================================
// FETCH + RENDER: GPS SATELLITE HEALTH (NANU)
// ================================================================
async function fetchNanu() {
try {
const res = await fetch('/.netlify/functions/nanu', { signal: AbortSignal.timeout(10000) });
if (!res.ok) throw new Error(`NANU function ${res.status}`);
return await res.json();
} catch(e) {
console.warn('[SkyGrid] NANU fetch failed:', e.message);
return null;
}
}
async function fetchLandCover(lat, lon) {
try {
const res = await fetch(`/.netlify/functions/landcover?lat=${lat}&lon=${lon}`, { signal: AbortSignal.timeout(10000) });
if (!res.ok) throw new Error(`LandCover function ${res.status}`);
return await res.json();
} catch(e) {
console.warn('[SkyGrid] LandCover fetch failed:', e.message);
return null;
}
}
// ── Stream Gauge + Lake fetch ─────────────────────────────────────
async function fetchStreamGauges(lat, lng) {
try {
const res = await fetch(`/.netlify/functions/streamgauge?lat=${lat}&lng=${lng}`, { signal: AbortSignal.timeout(15000) });
if (!res.ok) throw new Error(`StreamGauge function ${res.status}`);
const data = await res.json();
console.log(`[SkyGrid] StreamGauge: ${data.streams?.length || 0} streams, ${data.lakes?.length || 0} lakes`);
return data;
} catch(e) {
console.warn('[SkyGrid] StreamGauge fetch failed:', e.message);
return null;
}
}
// ── CDEC California Reservoir fetch ──────────────────────────────
async function fetchCDEC(lat, lng) {
try {
const res = await fetch(`/.netlify/functions/cdec?lat=${lat}&lng=${lng}`, { signal: AbortSignal.timeout(20000) });
if (!res.ok) throw new Error(`CDEC function ${res.status}`);
const data = await res.json();
console.log(`[SkyGrid] CDEC: ${data.reservoirs?.length || 0} reservoirs`);
return data;
} catch(e) {
console.warn('[SkyGrid] CDEC fetch failed:', e.message);
return null;
}
}
async function fetchUSBR(lat, lng) {
try {
const res = await fetch(`/.netlify/functions/usbr?lat=${lat}&lng=${lng}`, { signal: AbortSignal.timeout(20000) });
if (!res.ok) throw new Error(`USBR function ${res.status}`);
const data = await res.json();
console.log(`[SkyGrid] USBR: ${data.reservoirs?.length || 0} reservoirs`);
return data;
} catch(e) {
console.warn('[SkyGrid] USBR fetch failed:', e.message);
return null;
}
}
async function fetchArmyCorps(lat, lng) {
try {
const res = await fetch(`/.netlify/functions/armycorps?lat=${lat}&lng=${lng}`, { signal: AbortSignal.timeout(20000) });
if (!res.ok) throw new Error(`ArmyCorps function ${res.status}`);
const data = await res.json();
console.log(`[SkyGrid] Army Corps: ${data.reservoirs?.length || 0} reservoirs`);
return data;
} catch(e) {
console.warn('[SkyGrid] Army Corps fetch failed:', e.message);
return null;
}
}
// ── Site Conditions Page render ───────────────────────────────────
function renderSiteConditionsPage(data, cdecData, usbrData, armyCorpsData) {
const wrap = document.getElementById('site-conditions-page');
if (!wrap) return;
const streams = data?.streams || [];
const usgsLakes = data?.lakes || [];
const cdecResv = cdecData?.reservoirs || [];
if (!streams.length && !usgsLakes.length && !cdecResv.length &&
!usbrData?.reservoirs?.length && !armyCorpsData?.reservoirs?.length) {
wrap.style.display = 'none';
return;
}
const FLOOD_LABEL = {
NORMAL: '<span class="flood-normal">● Normal</span>',
ACTION: '<span class="flood-action">▲ Action Stage</span>',
FLOOD: '<span class="flood-flood">⚠ Flood Stage</span>',
MODERATE: '<span class="flood-moderate">⚠ Moderate Flood</span>',
MAJOR: '<span class="flood-major">⬆ Major Flood</span>',
UNKNOWN: '<span class="flood-unknown">— Unknown</span>'
};
let html = `<div class="site-cond-wrap">
<div class="site-cond-title">🌊 SITE CONDITIONS · STREAM GAUGES & WATER LEVELS</div>`;
// ── Streams ──────────────────────────────────────────────────────
if (streams.length) {
html += `<div class="site-cond-section-head">USGS STREAM GAUGES — within 25 miles</div>`;
html += `<div class="gauge-row">
<span class="gauge-head">STATION</span>
<span class="gauge-head" style="text-align:right">DIST</span>
<span class="gauge-head" style="text-align:right">LEVEL</span>
<span class="gauge-head" style="text-align:right">FLOW</span>
<span class="gauge-head">FLOOD STATUS</span>
</div>`;
for (const s of streams) {
const ht = s.gageHt !== null ? s.gageHt.toFixed(2) + ' ft' : '—';
const cfs = s.cfs !== null ? s.cfs.toLocaleString() + ' cfs' : '—';
const status = FLOOD_LABEL[s.floodStatus || 'UNKNOWN'] || FLOOD_LABEL.UNKNOWN;
html += `<div class="gauge-row">
<span class="gauge-name"><a href="${s.url}" style="color:#111;text-decoration:none">${s.name}</a> <span style="color:#888;font-size:6pt">#${s.id}</span></span>
<span class="gauge-val">${s.distMi} mi</span>
<span class="gauge-val">${ht}</span>
<span class="gauge-val">${cfs}</span>
<span>${status}</span>
</div>`;
}
// Flood stage thresholds note for first gauge
const first = streams[0];
if (first?.floodThresholds) {
const t = first.floodThresholds;
const parts = [];
if (t.action !== null) parts.push(`Action: ${t.action}ft`);
if (t.flood !== null) parts.push(`Flood: ${t.flood}ft`);
if (t.moderate !== null) parts.push(`Moderate: ${t.moderate}ft`);
if (t.major !== null) parts.push(`Major: ${t.major}ft`);
if (parts.length) {
html += `<div style="font-size:6pt;color:#888;margin-top:4pt;padding-top:3pt;border-top:0.25pt solid #eee">
Flood thresholds for ${first.name}: ${parts.join(' · ')}
</div>`;
}
}
}
// ── USGS Lakes ────────────────────────────────────────────────────────
const usgsLakesWithData = usgsLakes.filter(l => l.levelFt !== null || l.gageHt !== null);
if (usgsLakesWithData.length) {
html += `<div class="site-cond-section-head">USGS LAKES & RESERVOIRS — within 150 miles</div>`;
html += `<div class="gauge-row">
<span class="gauge-head">STATION</span>
<span class="gauge-head" style="text-align:right">DIST</span>
<span class="gauge-head" style="text-align:right">LEVEL</span>
<span class="gauge-head" style="text-align:right">FULL POOL</span>
<span class="gauge-head">LINK</span>
</div>`;
for (const l of usgsLakesWithData) {
const lvl = l.levelFt !== null ? l.levelFt.toFixed(2) + ' ft' : (l.gageHt !== null ? l.gageHt.toFixed(2) + ' ft' : null);
if (lvl === null) continue; // skip rows with no data
html += `<div class="gauge-row">
<span class="gauge-name"><a href="${l.url}" style="color:#111;text-decoration:none">${l.name}</a> <span style="color:#888;font-size:6pt">#${l.id}</span></span>
<span class="gauge-val">${l.distMi} mi</span>
<span class="gauge-val">${lvl}</span>
<span class="gauge-val">N/R</span>
<span style="font-size:6pt"><a href="${l.url}" style="color:#555">USGS ↗</a></span>
</div>`;
}
}
// ── CDEC California Reservoirs ────────────────────────────────────────
if (cdecResv.length) {
html += `<div class="site-cond-section-head">CALIFORNIA RESERVOIRS (DWR/CDEC) — within 150 miles</div>`;
html += `<div class="cdec-row">
<span class="gauge-head">RESERVOIR</span>
<span class="gauge-head" style="text-align:right">DIST</span>
<span class="gauge-head" style="text-align:right">ELEVATION</span>
<span class="gauge-head" style="text-align:right">FULL POOL</span>
<span class="gauge-head" style="text-align:right">STORAGE</span>
<span class="gauge-head" style="text-align:right">% CAP</span>
</div>`;
for (const r of cdecResv) {
const elev = r.elevFt !== null ? r.elevFt.toLocaleString() + ' ft' : '—';
const fp = r.fullPool ? r.fullPool.toLocaleString() + ' ft' : 'N/R';
const stor = r.storageAF !== null ? (Math.round(r.storageAF/1000)).toLocaleString() + 'K af' : '—';
const pct = r.pctCapacity !== null ? r.pctCapacity + '%' : '—';
const delta = r.deltaFt !== null ? ' (' + (r.deltaFt >= 0 ? '+' : '') + r.deltaFt + ' ft)' : '';
const pctColor = r.pctCapacity !== null
? (r.pctCapacity >= 80 ? '#16a34a' : r.pctCapacity >= 40 ? '#ca8a04' : '#dc2626')
: '#333';
html += `<div class="cdec-row">
<span class="gauge-name"><a href="${r.url}" style="color:#111;text-decoration:none">${r.name}</a></span>
<span class="gauge-val">${r.distMi} mi</span>
<span class="gauge-val">${elev}${delta}</span>
<span class="gauge-val">${fp}</span>
<span class="gauge-val">${stor}</span>
<span class="gauge-val" style="color:${pctColor};font-weight:700">${pct}</span>
</div>`;
}
}
// ── USBR Reservoirs ────────────────────────────────────────────────────
const usbrResv = usbrData?.reservoirs || [];
if (usbrResv.length) {
html += `<div class="site-cond-section-head">USBR RESERVOIRS (Bureau of Reclamation) — within 150 miles</div>`;
html += `<div class="cdec-row">
<span class="gauge-head">RESERVOIR</span>
<span class="gauge-head" style="text-align:right">DIST</span>
<span class="gauge-head" style="text-align:right">ELEVATION</span>
<span class="gauge-head" style="text-align:right">FULL POOL</span>
<span class="gauge-head" style="text-align:right">STORAGE</span>
<span class="gauge-head" style="text-align:right">% CAP</span>
</div>`;
for (const r of usbrResv) {
const elev = r.elevFt !== null
? r.elevFt.toLocaleString() + ' ft'
: (r.fullPool ? `<span style="color:#aaa">${r.fullPool.toLocaleString()} ft*</span>` : '—');
const fp = r.fullPool ? r.fullPool.toLocaleString() + ' ft' : 'N/R';
const stor = r.storageAF !== null ? (Math.round(r.storageAF / 1000)).toLocaleString() + 'K af' : '—';
const pct = r.pctCapacity !== null ? r.pctCapacity + '%' : '—';
const pctColor = r.pctCapacity !== null
? (r.pctCapacity >= 80 ? '#16a34a' : r.pctCapacity >= 40 ? '#ca8a04' : '#dc2626')
: '#333';
html += `<div class="cdec-row">
<span class="gauge-name"><a href="${r.url}" target="_blank" style="color:#111;text-decoration:none">${r.name}</a></span>
<span class="gauge-val">${r.distMi} mi</span>
<span class="gauge-val">${elev}</span>
<span class="gauge-val">${fp}</span>
<span class="gauge-val">${stor}</span>
<span class="gauge-val" style="color:${pctColor};font-weight:700">${pct}</span>
</div>`;
}
}
// ── Army Corps Reservoirs ──────────────────────────────────────────────
const corpsResv = armyCorpsData?.reservoirs || [];
if (corpsResv.length) {
html += `<div class="site-cond-section-head">ARMY CORPS RESERVOIRS (USACE) — within 150 miles</div>`;
html += `<div class="cdec-row">
<span class="gauge-head">RESERVOIR</span>
<span class="gauge-head" style="text-align:right">DIST</span>
<span class="gauge-head" style="text-align:right">POOL ELEV</span>
<span class="gauge-head" style="text-align:right">FULL POOL</span>
<span class="gauge-head" style="text-align:right">STORAGE</span>
<span class="gauge-head" style="text-align:right">% CAP</span>
</div>`;
for (const r of corpsResv) {
const elev = r.elevFt !== null
? r.elevFt.toLocaleString() + ' ft'
: (r.fullPool ? `<span style="color:#aaa">${r.fullPool.toLocaleString()} ft*</span>` : '—');
const fp = r.fullPool ? r.fullPool.toLocaleString() + ' ft' : 'N/R';
const stor = r.storageAF !== null ? (Math.round(r.storageAF / 1000)).toLocaleString() + 'K af' : '—';
const pct = r.pctCapacity !== null ? r.pctCapacity + '%' : '—';
const pctColor = r.pctCapacity !== null
? (r.pctCapacity >= 80 ? '#16a34a' : r.pctCapacity >= 40 ? '#ca8a04' : '#dc2626')
: '#333';
html += `<div class="cdec-row">
<span class="gauge-name"><a href="${r.url}" target="_blank" style="color:#111;text-decoration:none">${r.name}</a></span>
<span class="gauge-val">${r.distMi} mi</span>
<span class="gauge-val">${elev}</span>
<span class="gauge-val">${fp}</span>
<span class="gauge-val">${stor}</span>
<span class="gauge-val" style="color:${pctColor};font-weight:700">${pct}</span>
</div>`;
}
}
// ── Footer ─────────────────────────────────────────────────────────────
const sources = [];
if (streams.length || usgsLakes.length) sources.push('USGS National Water Information System · waterdata.usgs.gov');
if (cdecResv.length) sources.push('California DWR / CDEC · cdec.water.ca.gov');
if (usbrResv.length) sources.push('USBR RISE · data.usbr.gov');
if (corpsResv.length) sources.push('USACE CWMS · water.usace.army.mil');
const reportTime = new Date().toLocaleString('en-US', { month:'short', day:'numeric', year:'numeric', hour:'numeric', minute:'2-digit', timeZoneName:'short' });
html += `<div style="font-size:5.5pt;color:#aaa;margin-top:8pt;border-top:0.25pt solid #eee;padding-top:4pt">
Data sources: ${sources.join(' · ')} · Real-time data subject to revision<br>
<span style="color:#bbb">Water levels current as of report run: ${reportTime}</span><br>
<span style="color:#ccc">* Live pool elevation not reported by this reservoir — full pool design elevation shown</span>
</div>`;
html += `</div>`;
wrap.innerHTML = html;
wrap.style.display = 'block';
}
function renderNanuCard(data) {
const card = document.getElementById('nanu-card');
if (!card) return;
let statusColor, statusText, statusNote, borderColor, icon;
if (!data || data.error) {
// Fetch failed — show neutral unavailable state
statusColor = 'var(--text-dim)';
statusText = 'Satellite Health Data Unavailable';
statusNote = 'Could not reach NAVCEN — check navcen.uscg.gov manually';
borderColor = 'var(--border)';
icon = '🛰';
} else if (data.activeCount === 0 && data.scheduledCount === 0) {
statusColor = 'var(--green)';
statusText = 'All GPS Satellites Healthy';
statusNote = `Full constellation operational · ${data.scheduled?.length === 0 ? 'No scheduled maintenance' : 'No active outages'} · Source: NAVCEN`;
borderColor = 'var(--green)';
icon = '🛰';
} else if (data.activeCount > 0) {
const prnList = data.active.map(o => `PRN ${o.prn}`).join(', ');
statusColor = 'var(--red)';
statusText = `⚠ ${data.activeCount} Satellite${data.activeCount > 1 ? 's' : ''} Currently Unhealthy — ${prnList}`;
statusNote = `Active outage${data.activeCount > 1 ? 's' : ''} per NAVCEN · Affected satellites auto-excluded by receiver`;
borderColor = 'var(--red)';
icon = '🛰';
} else {
// Only scheduled outages — build per-PRN detail with dates
const details = data.scheduled.map(o => {
let when = '';
if (o.startISO && o.endISO) {
const s = new Date(o.startISO);
const e = new Date(o.endISO);
const fmtShort = d => d.toUTCString().slice(5,22) + ' UTC';
when = ` (${fmtShort(s)} – ${fmtShort(e)})`;
} else if (o.startISO) {
when = ` (from ${new Date(o.startISO).toUTCString().slice(5,22)} UTC)`;
}
return `PRN ${o.prn}${when}`;
}).join(' · ');
statusColor = 'var(--yellow)';
statusText = `${data.scheduledCount} Satellite${data.scheduledCount > 1 ? 's' : ''} Scheduled for Maintenance`;
statusNote = details + ' · May temporarily reduce satellite count during outage window';
borderColor = 'var(--yellow)';
icon = '🛰';
}
card.style.display = 'block';
card.innerHTML = `
<div style="border:1px solid ${borderColor};padding:20px 24px;margin-bottom:14px;page-break-before:avoid !important;background:var(--bg2)">
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:600;color:var(--amber);letter-spacing:.28em;text-transform:uppercase;margin-bottom:14px;display:flex;align-items:center;gap:10px">
${icon} GPS Constellation Health
<span style="flex:1;height:1px;background:var(--border);display:block"></span>
</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:16px;font-weight:600;color:${statusColor};margin-bottom:6px">${statusText}</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim)">${statusNote}</div>
</div>`;
}
// ================================================================
// RENDER: IONO PANEL
// ================================================================
// ================================================================
// ELEVATION MASK SELECTOR
// ================================================================
const MASK_HINTS = {
10: 'Trimble default — theoretical max sat count',
15: 'Standard field practice — recommended',
20: 'Urban canyon / tree canopy',
25: 'Heavy obstruction / deep valley'
};
function setElevMask(deg) {
currentElevMask = deg;
// Update button states
document.querySelectorAll('.mask-btn').forEach(btn => {
btn.classList.toggle('mask-btn-active', parseInt(btn.dataset.mask) === deg);
});
// Update hint text
const hint = document.getElementById('mask-hint');
if (hint) hint.textContent = MASK_HINTS[deg] || '';
// Re-run DOP from cached almanac data if available
const r = autoLastResult;
if (!r || !r.wxData || !r.almanacSats) {
console.log('[SkyGrid] No cached almanac — re-run report to apply new mask');
return;
}
// Recompute DOP with new mask
const newDopData = almanacToDopData(
r.almanacSats, r.lat, r.lng,
r.startDate, r.selectedDays, r.refDateISO
);
// Update cached result
autoLastResult.dopData = newDopData;
// Re-render affected sections
renderDOPSummaryTable(r.wxData, newDopData, r.selectedDays);
renderWeekGrid(r.wxData, newDopData, r.selectedDays, r.faaData, r.airspaceData, r.lat, r.lng);
renderStaticWindowCard(r.wxData, newDopData, r.selectedDays);
if (r.selectedDays >= 3) {
renderCoverSheet(r.wxData, newDopData, r.selectedDays, r.lat, r.lng, r.company, r.jobname, r.sitedesc, r.aqiData, r.controlData);
}
// Update mask label in footnote
const footNote = document.querySelector('#dop-table-wrap span[style*="opacity"]');
// Will naturally update on next renderDOPSummaryTable call
}
function renderSiteSignalHeader(lat, lng, controlData, fireData) {
const hdr = document.getElementById('site-signal-header');
const facts = document.getElementById('site-signal-facts');
if (!hdr || !facts) return;
const items = [];
// Coordinates — always first
if (!isNaN(lat) && !isNaN(lng)) {
items.push(`<div class="ssf-item" data-ssf="coords">
<div class="ssf-label">Coordinates</div>
<div class="ssf-value">${lat.toFixed(4)}, ${lng.toFixed(4)}</div>
<div class="ssf-note">WGS84 / NAD83</div>
</div>`);
}
// Elevation
if (siteElevFt !== null) {
items.push(`<div class="ssf-item" data-ssf="elev">
<div class="ssf-label">Elevation</div>
<div class="ssf-value">${siteElevFt.toLocaleString()} ft</div>
<div class="ssf-note">Above MSL (approx)</div>
</div>`);
}
// Magnetic Declination (may also arrive via updateCoverDeclination async)
if (siteDeclDeg !== null) {
const fmt = formatDeclination(siteDeclDeg);
const note = siteDeclDeg >= 0
? `Compass reads ${Math.abs(siteDeclDeg).toFixed(1)}° too far W`
: `Compass reads ${Math.abs(siteDeclDeg).toFixed(1)}° too far E`;
items.push(`<div class="ssf-item" data-ssf="decl">
<div class="ssf-label">Magnetic Declination</div>
<div class="ssf-value">${fmt}</div>
<div class="ssf-note">${note}</div>
</div>`);
}
// FEMA one-liner from control data
const fema = controlData?.femaZone;
if (fema) {
const zoneLabel = fema.zone + (fema.subtype ? ' — ' + fema.subtype : '');
items.push(`<div class="ssf-item">
<div class="ssf-label">FEMA Flood Zone</div>
<div class="ssf-value">${fema.zone}</div>
<div class="ssf-note">${fema.subtype || 'See control points page'} · Panel ${fema.panel}</div>
</div>`);
}
// Always show if we have at least coords
if (items.length === 0) {
// Add placeholder for elev/decl that arrive async
items.push(`<div class="ssf-item" data-ssf="coords">
<div class="ssf-label">Coordinates</div>
<div class="ssf-value">${lat.toFixed(4)}, ${lng.toFixed(4)}</div>
<div class="ssf-note">WGS84 / NAD83 (NSRS2007)</div>
</div>`);
}
facts.innerHTML = items.join('');
hdr.style.display = 'block';
}
function renderIonoPanel(iono) {
document.getElementById('iono-panel').innerHTML = `
<div class="sec-title">Ionospheric Conditions</div>
<div class="iono-grid">
<div class="iono-metric"><div class="iono-metric-label">Peak Kp Index</div><div class="iono-metric-val" style="color:${iono.color}">${iono.maxKp.toFixed(1)}</div></div>
<div class="iono-metric"><div class="iono-metric-label">Avg Kp</div><div class="iono-metric-val" style="color:${iono.color}">${iono.avgKp.toFixed(1)}</div></div>
${iono.f107?`<div class="iono-metric"><div class="iono-metric-label">Solar Flux F10.7</div><div class="iono-metric-val" style="color:var(--text)">${iono.f107.toFixed(0)}<span class="iono-metric-unit">sfu</span></div></div>`:''}
${(()=>{
const tecColor = iono.tecDegraded ? 'var(--text-dim)' : (iono.tec>40?'#ef4444':iono.tec>20?'#eab308':'#22c55e');
const degradedBadge = iono.tecDegraded ? ' <span style="color:#ef4444;font-size:8px;letter-spacing:.05em">⚠ DEGRADED</span>' : '';
const anomalyColor = iono.tecAnomaly>5?'#ef4444':iono.tecAnomaly>2?'#eab308':iono.tecAnomaly<-2?'#60a5fa':'var(--text-dim)';
const anomalyLine = iono.tecAnomaly!==null ? '<div style="font-family:\'IBM Plex Mono\',monospace;font-size:10px;color:'+anomalyColor+';margin-top:4px">'+(iono.tecAnomaly>=0?'+':'')+iono.tecAnomaly.toFixed(1)+' TECU vs median</div>' : '';
if (iono.tec!=null) {
return '<div class="iono-metric"><div class="iono-metric-label">TEC (VTEC)'+degradedBadge+'</div><div class="iono-metric-val" style="color:'+tecColor+'">'+iono.tec.toFixed(1)+'<span class="iono-metric-unit">TECU</span></div>'+anomalyLine+'</div>';
} else {
return '<div class="iono-metric"><div class="iono-metric-label">TEC (VTEC)</div><div class="iono-metric-val" style="color:var(--text-dim);font-size:16px">— <span style="font-size:10px">UNAVAILABLE</span></div></div>';
}
})()}
<div class="iono-metric" style="grid-column:1/-1"><div class="iono-metric-label">Assessment</div><span class="iono-level ${iono.level}">${iono.label}</span><p class="iono-summary">${iono.summary}</p></div>
</div>`;
}
// ================================================================
// RENDER: DOP TABLE
// ================================================================
let dopTableData = null;
let dopTableWx = null;
let dopTableDays = 0;
function renderDopTable(dopData, wxData, days) {
dopTableData = dopData;
dopTableWx = wxData;
dopTableDays = days || (dopData ? dopData.length : 0);
const sec = document.getElementById('dop-section'); sec.style.display = 'block';
let html = `<table class="dop-table"><thead><tr><th>Date</th><th>Avg PDOP</th><th>Best 4-hr Window</th><th>Avg Sats</th><th>Rating</th></tr></thead><tbody>`;
dopData.forEach(d => {
const dateStr = d.date.toLocaleDateString('en-US',{weekday:'short',month:'short',day:'numeric'});
const pdop = d.avgPdop;
let cls='dop-na',rating='N/A';
if(pdop){if(pdop<1.0){cls='dop-good';rating='Ideal';}else if(pdop<1.5){cls='dop-good';rating='Good';}else if(pdop<2.0){cls='dop-ok';rating='Fair';}else if(pdop<3.0){cls='dop-ok';rating='Poor';}else{cls='dop-poor';rating='Avoid';}}
html+=`<tr><td>${dateStr}</td><td class="${cls}">${pdop?pdop.toFixed(2):'—'}</td><td>${d.bestWindow?d.bestWindow.label:'—'}</td><td>${d.bestWindow?d.bestWindow.sats:'—'}</td><td class="${cls}">${rating}</td></tr>`;
});
html += '</tbody></table>';
html += '<div class="dop-footnote" style="margin-top:8px;font-family:\'IBM Plex Mono\',monospace;font-size:10px;color:var(--text-dim);line-height:1.6">';
html += 'GPS + GLONASS + Galileo + BeiDou MEO · Full multi-constellation model · ' + currentElevMask + '° elevation mask · Per-day independent computation';
html += '<br><span style="opacity:0.6">GNSS satellite geometry is accurate within a 50-mile radius of the entered location — orbital mechanics do not change meaningfully at ground-level distances. Weather data is specific to the entered coordinates. For site-specific weather, terrain mask angle, and nearest CORS station, order an On-Demand Site Report.</span>';
html += '</div>';
// Add week stats bar below DOP table
if (dopTableWx && dopTableWx.daily && dopTableDays >= 3) {
const goCount = Array.from({length: dopTableDays}, (_, d) => d)
.filter(d => scoreDayConditions(dopTableWx, d, dopTableData?.[d]) < 30).length;
const bestPdop = dopTableData
? Math.min(...dopTableData.filter(d => d && d.avgPdop).map(d => d.avgPdop))
: null;
html += `<div class="week-summary">
<div class="week-summary-item">Days analyzed: <span>${dopTableDays}</span></div>
<div class="week-summary-item">Recommended work days: <span>${Math.min(goCount, 5)} of ${dopTableDays}</span></div>
${bestPdop ? `<div class="week-summary-item">Best PDOP: <span>${bestPdop.toFixed(2)}</span></div>` : ''}
</div>`;
}
document.getElementById('dop-table-wrap').innerHTML = html;
}
// ================================================================
// RENDER: 7-DAY WEEK GRID (the big new feature)
// ================================================================
function buildHourlyDOPBlock(dopDay) {
if (!dopDay || !dopDay.hours) return '';
const hours = dopDay.hours;
const fmt12 = h => { const hh = h % 12 || 12, ap = h < 12 ? 'AM' : 'PM'; return hh + ':00 ' + ap; };
// Only show 6AM–7PM (field hours)
const fieldHours = hours.filter(h => h.hour >= 6 && h.hour <= 19);
if (!fieldHours.length) return '';
const maxPdop = Math.max(...fieldHours.filter(h => h.pdop).map(h => h.pdop), 2.5);
function pdopRating(pdop) {
if (!pdop) return { label: '—', color: '#555', cls: 'dop-na', spike: false };
if (pdop < 1.0) return { label: 'IDEAL', color: '#22c55e', cls: 'dop-good', spike: false };
if (pdop < 1.5) return { label: 'GOOD', color: '#86efac', cls: 'dop-good', spike: false };
if (pdop < 2.0) return { label: 'FAIR', color: '#eab308', cls: 'dop-ok', spike: false };
if (pdop < 3.0) return { label: 'POOR', color: '#f97316', cls: 'dop-ok', spike: true };
return { label: 'AVOID', color: '#ef4444', cls: 'dop-poor', spike: true };
}
let rows = fieldHours.map(h => {
const r = pdopRating(h.pdop);
const pct = h.pdop ? Math.min(100, Math.round((h.pdop / maxPdop) * 100)) : 0;
// Bar fill: wider = worse PDOP (inverted — shorter bar = better)
const fillPct = h.pdop ? Math.max(8, Math.round((h.pdop / 4.0) * 100)) : 0;
const rowBg = r.spike ? 'background:rgba(245,158,11,0.08);border-radius:3px;' : '';
const timeCl = r.spike ? r.color : '#888';
const spikeClass = r.spike ? ' spike-row' : '';
return '<div class="ghb-row' + spikeClass + '" style="display:grid;grid-template-columns:52px 1fr 60px 70px;align-items:center;gap:6px;margin-bottom:1px;' + rowBg + '">' + '<div class="ghb-time" style="font-family:\'IBM Plex Mono\',monospace;font-size:9px;color:' + timeCl + ';text-align:right;padding-right:4px;font-weight:' + (r.spike?'700':'400') + '">' + fmt12(h.hour) + '</div>' + '<div class="ghb-bar-track" style="position:relative;height:11px;background:var(--bg4);border:1px solid ' + (r.spike ? r.color : 'var(--border)') + ';border-radius:2px;overflow:hidden">' + '<div class="ghb-bar-fill" style="position:absolute;inset:0;width:' + fillPct + '%;background:' + r.color + ';opacity:' + (r.spike ? '0.35' : '0.25') + ';border-radius:2px"></div>' + '<span class="ghb-pdop-val" style="position:absolute;left:6px;top:0;font-size:9px;font-family:\'IBM Plex Mono\',monospace;line-height:11px;color:' + r.color + ';font-weight:' + (r.spike?'700':'400') + '">' + (h.pdop ? h.pdop.toFixed(2) : '—') + '</span>' + '</div>' + '<div class="ghb-sats" style="font-family:\'IBM Plex Mono\',monospace;font-size:9px;color:' + (r.spike ? r.color : '#666') + ';text-align:center;font-weight:' + (r.spike?'700':'400') + '">' + (h.sats || '—') + ' sv</div>' + '<div class="ghb-rating ' + r.cls + '" style="font-family:\'IBM Plex Mono\',monospace;font-size:8px;color:' + r.color + ';text-align:right;letter-spacing:.05em;font-weight:700">' + r.label + '</div>' + '</div>';
}).join('');
return '<div class="gnss-hourly-block" style="background:var(--bg3);border:1px solid var(--border);border-radius:8px;padding:12px 14px;margin-bottom:12px;page-break-inside:avoid">' + '<div class="ghb-header" style="font-family:\'IBM Plex Mono\',monospace;font-size:9px;color:var(--amber);letter-spacing:.15em;text-transform:uppercase;margin-bottom:8px">GNSS / DOP — Hourly</div>' + '<div class="ghb-col-heads" style="display:grid;grid-template-columns:52px 1fr 60px 70px;gap:6px;margin-bottom:5px">' + '<div></div>' + '<div class="ghb-col-lbl" style="font-size:8px;color:#555;font-family:\'IBM Plex Mono\',monospace">PDOP</div>' + '<div class="ghb-col-lbl" style="font-size:8px;color:#555;font-family:\'IBM Plex Mono\',monospace;text-align:center">SATS</div>' + '<div class="ghb-col-lbl" style="font-size:8px;color:#555;font-family:\'IBM Plex Mono\',monospace;text-align:right">RATING</div>' + '</div>' + rows + '</div>';
}
function buildBestWindowBlock(wxData, dayIdx) {
// Compute best flyable window for this specific day
// Reuses the same logic as formatDroneWindHTML but renders as a standalone hero block
const dayW = buildDayWeather(wxData, dayIdx);
if (!dayW || !dayW.hourly || dayW.hourly.length === 0) return '';
const srDec = (dayW.sunriseHour || 5) + (dayW.sunriseMin || 0) / 60;
const ssDec = (dayW.sunsetHour || 20) + (dayW.sunsetMin || 0) / 60;
const fmt12 = h => { const ap = h < 12 ? 'AM' : 'PM'; return (h % 12 || 12) + ':00 ' + ap; };
// Find longest consecutive flyable window within daylight
let bestRun = 0, curRun = 0, flyStart = null, flyEnd = null, curStart = null;
dayW.hourly.forEach(h => {
if (h.hour < srDec || h.hour > ssDec) { curRun = 0; curStart = null; return; }
if (windStatus(h.wind, h.gusts).rank === 0) {
curRun++;
if (!curStart) curStart = h.hour;
if (curRun > bestRun) { bestRun = curRun; flyStart = curStart; flyEnd = h.hour; }
} else { curRun = 0; curStart = null; }
});
if (flyStart === null || bestRun < 1) {
return '<div class="best-window" style="background:var(--bg3);border:1px solid var(--border);border-radius:6px;padding:14px 16px;margin-top:10px">'
+ '<div class="best-window-label" style="font-family:\'IBM Plex Mono\',monospace;font-size:9px;letter-spacing:.15em;color:var(--text-dim);margin-bottom:6px">BEST WINDOW</div>'
+ '<div class="best-window-time" style="font-size:22px;font-weight:900;color:#ef4444;letter-spacing:-.5px">NO CLEAN WINDOW</div>'
+ '<div class="best-window-reason" style="font-size:11px;color:var(--text-dim);margin-top:4px;font-style:italic">Wind or precipitation prevents safe drone operations today</div>'
+ '</div>';
}
const windowStr = fmt12(flyStart) + ' – ' + fmt12(flyEnd + 1);
const hrs = bestRun;
// Build a reason string based on conditions
const wr = weatherRating(dayW);
let reason = '';
if (wr === 'excellent') reason = 'Ideal conditions — calm winds, clear operations all day';
else if (wr === 'good') reason = 'Good conditions with ' + hrs + '-hr clean window available';
else reason = 'Best available ' + hrs + '-hr window given forecast conditions';
return '<div class="best-window" style="background:var(--bg3);border:1px solid var(--border);border-left:3px solid var(--amber);border-radius:6px;padding:14px 16px;margin-top:10px;page-break-inside:avoid">'
+ '<div class="best-window-label" style="font-family:\'IBM Plex Mono\',monospace;font-size:9px;letter-spacing:.15em;color:var(--amber);margin-bottom:6px">BEST WINDOW</div>'
+ '<div class="best-window-time" style="font-size:28px;font-weight:900;color:var(--text);letter-spacing:-.5px;line-height:1.1">' + windowStr + '</div>'
+ '<div class="best-window-reason" style="font-size:11px;color:var(--text-dim);margin-top:6px;font-style:italic">' + reason + '</div>'
+ '</div>';
}
function renderWeekGrid(wxData, dopData, days, faaData, airspaceData, lat, lng) {
if (!wxData) return;
const area = document.getElementById('week-grid-area');
const daily = wxData.daily;
const hourly = wxData.hourly;
const today = new Date();
const todayDow = today.getDay(); // 0=Sun
// Score and rank each day
const dayScores = [];
for (let d = 0; d < Math.min(days, daily.time.length); d++) {
const dopDay = dopData ? dopData[d] : null;
const score = scoreDayConditions(wxData, d, dopDay);
const dt = new Date(daily.time[d]+'T12:00:00');
dayScores.push({ d, score, dow: dt.getDay(), dt, dateStr: daily.time[d] });
}
// Sort by score to get ranking, then map back
const sorted = [...dayScores].sort((a,b) => a.score - b.score);
const rankMap = {}; // d => rank (1=best)
sorted.forEach((item, idx) => { rankMap[item.d] = idx + 1; });
// Parse sunrise/sunset times
function parseSunTime(str) {
if (!str) return null;
const d = new Date(str); return isNaN(d) ? null : d;
}
let html = '';
html += `<div class="week-grid">`;
for (let d = 0; d < Math.min(days, daily.time.length); d++) {
const rank = rankMap[d];
const isTop5 = rank <= 5;
const isBottom2 = rank > 5 && days >= 7;
const isRank1 = rank === 1;
const dt = new Date(daily.time[d]+'T12:00:00');
const dow = dt.getDay();
const isToday = d === 0;
const isWeekend = dow === 0 || dow === 6;
const DOW_FULL = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
const DOW_SHORT = ['SUN','MON','TUE','WED','THU','FRI','SAT'];
// Tags
const tags = [];
if (isWeekend) tags.push('<span class="tag tag-weekend">WEEKEND</span>');
// Rank badge
const rankClass = rank <= 2 ? `rank-b${rank}` : rank <= 5 ? `rank-b${rank}` : `rank-b${rank}`;
const rankLabel = days >= 3 ? `#${rank}` : '—';
// GO/NO-GO signal from score
const score = dayScores[d].score;
let gonogoClass, gonogoLabel;
if (score < 30) { gonogoClass='gonogo-go'; gonogoLabel='GO'; }
else if (score < 60) { gonogoClass='gonogo-caution'; gonogoLabel='CAUTION'; }
else { gonogoClass='gonogo-nogo'; gonogoLabel='NO-GO'; }
// Weather pills
const code = daily.weathercode[d];
const maxWind = daily.windspeed_10m_max[d];
const gusts = daily.windgusts_10m_max[d];
const maxT = daily.temperature_2m_max[d];
const minT = daily.temperature_2m_min[d];
const precip = daily.precipitation_sum[d];
const sunrise = parseSunTime(daily.sunrise?.[d]);
const sunset = parseSunTime(daily.sunset?.[d]);
const srStr = sunrise ? sunrise.toLocaleTimeString('en-US',{hour:'numeric',minute:'2-digit'}) : '—';
const ssStr = sunset ? sunset.toLocaleTimeString('en-US',{hour:'numeric',minute:'2-digit'}) : '—';
// Field warnings for this day
const warnings = buildFieldWarnings(wxData, d);
// Hourly wind chart — daylight hours only
let windChartHtml = '';
if (hourly && hourly.windspeed_10m) {
const hourOffset = d * 24;
const dayWinds = hourly.windspeed_10m.slice(hourOffset, hourOffset + 24);
const dayDirs = hourly.winddirection_10m ? hourly.winddirection_10m.slice(hourOffset, hourOffset + 24) : [];
// Determine daylight window
const srHour = sunrise ? sunrise.getHours() : 6;
const ssHour = sunset ? sunset.getHours() : 19;
// Get hours in daylight range
const daylightWinds = [];
for (let h = srHour; h <= ssHour && h < 24; h++) {
daylightWinds.push({ hour: h, speed: dayWinds[h] || 0, dir: dayDirs[h] || 0 });
}
const maxW = Math.max(...daylightWinds.map(w => w.speed), 25);
const threshold20Pct = Math.min(100, (20 / maxW) * 100);
windChartHtml = `<div class="wind-chart">
<div class="wind-chart-title">
<span>Hourly Wind — Daylight Hours (${srStr} – ${ssStr})</span>
<span class="threshold-note">▶ 20 mph drone limit</span>
</div>`;
daylightWinds.forEach(w => {
const pct = Math.min(100, (w.speed / maxW) * 100);
const cls = w.speed < 10 ? 'calm' : w.speed < 20 ? 'breezy' : 'strong';
const dirArrow = degToArrow(w.dir);
windChartHtml += `<div class="wind-bar-row">
<div class="wind-bar-label">${fmtHr(w.hour)}</div>
<div class="wind-bar-track">
<div class="wind-bar-fill ${cls}" style="width:${pct}%"></div>
<div class="wind-threshold-line" style="left:${threshold20Pct}%"></div>
</div>
<div class="wind-val">${w.speed.toFixed(0)} mph ${dirArrow}</div>
</div>`;
});
windChartHtml += '</div>';
}
// DOP info for this day
const dopDay = dopData ? dopData[d] : null;
let dopHtml = '';
if (dopDay) {
const pCls = dopDay.avgPdop
? (dopDay.avgPdop < 1.0 ? 'dop-good'
: dopDay.avgPdop < 1.5 ? 'dop-good'
: dopDay.avgPdop < 2.0 ? 'dop-ok'
: dopDay.avgPdop < 3.0 ? 'dop-ok'
: 'dop-poor')
: 'dop-na';
dopHtml = `<div style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim);margin-bottom:10px">
GNSS: Avg PDOP <span class="${pCls}">${dopDay.avgPdop?.toFixed(2)||'—'}</span>
${dopDay.bestWindow ? ` · Best 4-hr window <span style="color:var(--text)">${dopDay.bestWindow.label}</span> (PDOP ${dopDay.bestWindow.avgPdop.toFixed(2)}, ${dopDay.bestWindow.sats} sats avg)` : ''}
</div>`;
}
// Drone assessment
// Build full v1-quality weather + drone wind block
const dayW = buildDayWeather(wxData, d);
const droneWindHtml = dayW
? formatWeatherHTML(dayW, weatherRating(dayW)) + buildFieldWarningsHTML(dayW) + formatDroneWindHTML(dayW)
: '';
// Card classes
let cardClass = 'day-card';
if (isRank1) cardClass += ' rank1 top5';
else if (isTop5) cardClass += ' top5';
else if (isBottom2) cardClass += ' bottom2';
// Auto-expand today and tomorrow, and rank 1
const expanded = (isToday || isRank1) ? ' expanded' : '';
html += `<div class="${cardClass}${expanded}" id="daycard-${d}">
<div class="day-card-header" onclick="toggleDayCard(${d})">
${days>=3 ? `<span class="day-rank-badge rank-b${Math.min(rank,7)}">#${d+1}</span>` : ''}
<div class="day-card-dateblock">
<div class="day-card-datestr">${DOW_FULL[dow]}, ${dt.toLocaleDateString('en-US',{month:'short',day:'numeric'})}</div>
<div class="day-card-tags">${tags.join('')}</div>
</div>
<div style="display:flex;align-items:center;gap:10px;flex-shrink:0">
<span class="wx-pill" style="font-size:10px">${wxDesc(code)}</span>
<span class="wx-pill" style="font-size:10px">💨 ${maxWind?.toFixed(0)} mph</span>
<span class="day-card-gonogo ${gonogoClass}">${gonogoLabel}</span>
<span class="day-card-chevron">▶</span>
</div>
</div>
<div class="day-card-body">
<div class="wx-pills">
<div class="wx-pill">High <span>${maxT?.toFixed(0)}°F</span></div>
<div class="wx-pill">Low <span>${minT?.toFixed(0)}°F</span></div>
<div class="wx-pill">Wind max <span>${maxWind?.toFixed(0)} mph</span></div>
${gusts ? `<div class="wx-pill">Gusts <span>${gusts?.toFixed(0)} mph</span></div>` : ''}
<div class="wx-pill">Precip <span>${precip?.toFixed(2)}"</span></div>
<div class="wx-pill">Sunrise <span>${srStr}</span></div>
<div class="wx-pill">Sunset <span>${ssStr}</span></div>
${(() => { const m = moonPhase(new Date(daily.time[d]+'T12:00:00')); return `<div class="wx-pill">${m.emoji} <span>${m.name} ${m.illumination}%</span></div>`; })()}
</div>
${dopHtml}
${dopDay && dopDay.hours ? buildHourlyDOPBlock(dopDay) : ''}
${droneWindHtml}
${buildBestWindowBlock(wxData, d)}
${buildFAABlock(faaData, airspaceData, lat, lng)}
</div>
</div>`;
}
html += '</div>';
area.innerHTML = html;
}
// ================================================================
// RENDER: NEARBY CONTROL POINTS PAGE
// ================================================================
function renderControlPage(controlData, lat, lng) {
const wrap = document.getElementById('control-page');
if (!wrap) return;
if (!controlData || (!controlData.corsStations?.length && !controlData.benchmarks?.length && !controlData.femaZone)) {
wrap.style.display = 'none';
return;
}
wrap.style.display = 'block';
const cors = controlData.corsStations || [];
const bms = controlData.benchmarks || [];
const fema = controlData.femaZone;
const locStr = `${lat.toFixed(4)}, ${lng.toFixed(4)}`;
let html = `<div class="control-page-wrap">
<div class="control-page-title">⚡ Nearby Control Points · ${locStr}</div>`;
// ── CORS STATIONS ──────────────────────────────────────────────
if (cors.length) {
html += `<div class="control-section-head">CORS Stations — within 30 miles</div>
<table class="control-table">
<thead><tr>
<th style="width:56px">QR / Link</th>
<th>Station ID</th>
<th>Name / Location</th>
<th>Distance</th>
</tr></thead>
<tbody>`;
cors.forEach((s, i) => {
html += `<tr>
<td><div class="control-qr" id="cors-qr-${i}"></div><a href="${s.url}" target="_blank" class="ctrl-link">NGS ↗</a></td>
<td><span class="control-id">${s.id}</span></td>
<td>${s.name}${s.state ? ', ' + s.state : ''}</td>
<td>${s.dist} mi</td>
</tr>`;
});
html += `</tbody></table>`;
}
// ── BENCHMARKS ─────────────────────────────────────────────────
if (bms.length) {
html += `<div class="control-section-head">NGS Benchmarks — within 10 miles</div>
<table class="control-table">
<thead><tr>
<th style="width:56px">QR / Link</th>
<th>PID</th>
<th>Designation</th>
<th>Elevation</th>
<th>Order</th>
<th>Distance</th>
</tr></thead>
<tbody>`;
bms.forEach((m, i) => {
html += `<tr>
<td><div class="control-qr" id="bm-qr-${i}"></div><a href="${m.url}" target="_blank" class="ctrl-link">Datasheet ↗</a></td>
<td><span class="control-id">${m.pid}</span></td>
<td>"${m.name}"</td>
<td>${m.elev}</td>
<td>${m.order}</td>
<td>${m.dist} mi</td>
</tr>`;
});
html += `</tbody></table>`;
}
// ── FEMA FLOOD ZONE ────────────────────────────────────────────
if (fema) {
const zClass = 'fema-zone-' + (fema.zone || 'x').toLowerCase().replace(/[^a-z]/g,'');
html += `<div class="control-section-head">FEMA Flood Zone</div>
<div class="fema-box">
<div class="fema-zone-badge ${zClass}">${fema.zone}${fema.subtype ? ' — ' + fema.subtype : ''}</div>
<div class="fema-meta">
Panel: <strong>${fema.panel}</strong><br>
Effective: ${fema.effDate}<br>
<a href="${fema.url}" target="_blank" style="color:var(--amber)">View FEMA Map ↗</a>
</div>
<div class="control-qr" id="fema-qr"></div>
</div>`;
}
html += `</div>`;
wrap.innerHTML = html;
// Generate QR codes after DOM insertion
setTimeout(() => {
cors.forEach((s, i) => {
const el = document.getElementById('cors-qr-' + i);
if (el && s.url) { try { new QRCode(el, { text: s.url, width: 36, height: 36, colorDark: '#111', colorLight: '#fff', correctLevel: QRCode.CorrectLevel.M }); } catch(e) {} }
});
bms.forEach((m, i) => {
const el = document.getElementById('bm-qr-' + i);
if (el && m.url) { try { new QRCode(el, { text: m.url, width: 36, height: 36, colorDark: '#111', colorLight: '#fff', correctLevel: QRCode.CorrectLevel.M }); } catch(e) {} }
});
const femaEl = document.getElementById('fema-qr');
if (femaEl && fema?.url) { try { new QRCode(femaEl, { text: fema.url, width: 36, height: 36, colorDark: '#111', colorLight: '#fff', correctLevel: QRCode.CorrectLevel.M }); } catch(e) {} }
}, 400);
}
function toggleDayCard(d) {
const card = document.getElementById('daycard-'+d);
if (card) card.classList.toggle('expanded');
}
function degToArrow(deg) {
const dirs = ['N','NE','E','SE','S','SW','W','NW'];
return dirs[Math.round(deg/45)%8] || '—';
}
// ================================================================
// RENDER: STATIC BASE OBSERVATION WINDOW CARD
// Shows best 4-hour window across all days (2+ day reports)
// ================================================================
function renderStaticWindowCard(wxData, dopData, days) {
const card = document.getElementById('static-window-card');
if (!card) return;
if (days < 2) { card.style.display = 'none'; return; }
// Find best 4-hour static windows across all days
// Scoring: lowest wind average + no precipitation + good conditions
const daily = wxData.daily;
const hourly = wxData.hourly;
const candidates = [];
for (let d = 0; d < Math.min(days, daily.time.length); d++) {
const dt = new Date(daily.time[d] + 'T12:00:00');
const hourOffset = d * 24;
// Get sunrise/sunset for this day
const srRaw = daily.sunrise ? new Date(daily.sunrise[d]) : null;
const ssRaw = daily.sunset ? new Date(daily.sunset[d]) : null;
const srHour = srRaw ? srRaw.getHours() : 6;
const ssHour = ssRaw ? ssRaw.getHours() : 19;
// Build hourly data for this day
const dayHourly = [];
for (let h = srHour; h <= ssHour && h < 24; h++) {
const idx = hourOffset + h;
const wind = hourly.windspeed_10m?.[idx] || 0;
const gusts = hourly.windgusts_10m?.[idx] || 0;
const wxCode = hourly.weathercode?.[idx] || 0;
dayHourly.push({ hour: h, wind, gusts, wxCode });
}
// Score each possible 4-hour window
for (let startH = 0; startH <= dayHourly.length - 4; startH++) {
const window4 = dayHourly.slice(startH, startH + 4);
const avgWind = window4.reduce((s, h) => s + h.wind, 0) / 4;
const maxGusts = Math.max(...window4.map(h => h.gusts));
const maxWxCode = Math.max(...window4.map(h => h.wxCode));
const badWx = maxWxCode >= 61; // rain or worse
const score = avgWind + maxGusts * 0.5 + (badWx ? 200 : 0);
// DOP bonus — if we have DOP data, prefer windows with better PDOP
let dopBonus = 0;
if (dopData && dopData[d] && dopData[d].bestWindow) {
const bwStart = dopData[d].bestWindow.startHour;
const wStart = window4[0].hour;
if (Math.abs(bwStart - wStart) <= 1) dopBonus = -5; // slight preference for DOP-aligned window
}
const label = fmtHr(window4[0].hour) + ' – ' + fmtHr(window4[3].hour + 1);
candidates.push({ d, dt, window4, avgWind, maxGusts, badWx, score: score + dopBonus, label });
}
}
if (!candidates.length) { card.style.display = 'none'; return; }
// Sort by score (lower = better)
candidates.sort((a, b) => a.score - b.score);
const best = candidates[0];
// Find a backup from a DIFFERENT day
const backup = candidates.find(c => c.d !== best.d) || null;
const DOW_FULL = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
function buildWindowBlock(c, isPrimary) {
const dow = c.dt.getDay();
const dateStr = c.dt.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });
const ws = c.avgWind.toFixed(0);
const gs = c.maxGusts.toFixed(0);
const condNote = c.badWx ? 'Weather concern' : (c.avgWind < 8 ? 'Ideal conditions' : c.avgWind < 15 ? 'Light wind' : 'Moderate wind');
const labelClass = isPrimary ? 'static-window-rec-label' : 'static-window-rec-label static-window-rec-label-alt';
const timeClass = isPrimary ? 'static-window-time' : 'static-window-time backup';
const blockClass = isPrimary ? 'static-window-primary' : 'static-window-backup';
const recLabel = isPrimary ? '▶ RECOMMENDED WINDOW' : 'ALTERNATE WINDOW';
return `<div class="${blockClass}">
<div class="${labelClass}">${recLabel}</div>
<div class="static-window-date">${dateStr}</div>
<div class="${timeClass}">${c.label}</div>
<div class="static-window-meta">Avg wind ${ws} mph · Gusts ${gs} mph</div>
<div class="static-window-reason">${condNote} — 4-hr static occupation</div>
</div>`;
}
card.style.display = 'block';
card.innerHTML = `<div class="static-window-card">
<div class="static-window-inner">
<div class="static-window-card-title">⚡ Best 4-Hour Static Base Observation Window</div>
<div class="static-window-grid">
${buildWindowBlock(best, true)}
${backup ? buildWindowBlock(backup, false) : '<div class="static-window-backup"><div class="static-window-rec-label static-window-rec-label-alt">ALTERNATE WINDOW</div><div class="static-window-reason">No alternate available.</div></div>'}
</div>
</div>
</div>`;
}
// ================================================================
// RENDER: LAND COVER CARD
// ================================================================
function renderLandCoverCard(data, dopData, almanacSats, lat, lng) {
const card = document.getElementById('landcover-card');
if (!card) return;
const RANK = { none: 0, low: 1, moderate: 2, high: 3 };
const OBS_LABEL = { none: 'Clear Sky View', low: 'Minor Obstruction', moderate: 'Moderate Obstruction', high: 'Heavy Obstruction' };
const MULTI_LABEL= { none: 'Minimal Multipath', low: 'Low Multipath', moderate: 'Moderate Multipath', high: 'High Multipath Risk' };
const OBS_NOTE = {
none: 'Open terrain — excellent satellite visibility in all directions.',
low: 'Low vegetation or sparse development nearby — minor sky obstruction possible.',
moderate: 'Moderate vegetation or urban development — elevation mask will be affected.',
high: 'Dense forest or tall structures within 100 m — significant sky obstruction likely. Consider elevated antenna or alternate benchmark.'
};
const MULTI_NOTE = {
none: 'No significant reflective surfaces detected.',
low: 'Minor reflective surfaces present — multipath generally manageable.',
moderate: 'Urban or wetland environment — multipath possible at low elevations.',
high: 'High-density development detected — multipath mitigation recommended (choke ring antenna, elevation mask ≥20°).'
};
if (!data || data.error) {
card.style.display = 'block';
card.innerHTML = `
<div class="info-card" style="border-color:var(--border)">
<div class="card-header" style="color:var(--text-dim)">🌿 Land Cover & Multipath Risk</div>
<p style="color:var(--text-dim);font-size:12px;margin:8px 0 0">Land cover data unavailable — verify site conditions manually · Source: USGS NLCD</p>
</div>`;
return;
}
const obs = data.worstObstruction || 'none';
const multi = data.worstMultipath || 'none';
const domLabel = data.dominantLabel || 'Unknown';
const obsRank = RANK[obs];
const multiRank= RANK[multi];
const maxRank = Math.max(obsRank, multiRank);
// ── Recommended elevation mask (industry standard logic) ──────────
// Base mask from obstruction
let recMask = 10;
if (obsRank >= 3) recMask = 20; // high obstruction
else if (obsRank >= 2) recMask = 15; // moderate
else if (obsRank >= 1) recMask = 13; // low
else recMask = 10; // clear
// Multipath penalty
if (multiRank >= 3) recMask = Math.min(recMask + 5, 25);
else if (multiRank >= 2) recMask = Math.min(recMask + 3, 25);
// Round to nearest standard value: 10, 13, 15, 20, 25
const STANDARD_MASKS = [10, 13, 15, 20, 25];
recMask = STANDARD_MASKS.reduce((prev, curr) =>
Math.abs(curr - recMask) < Math.abs(prev - recMask) ? curr : prev
);
const MASK_REASON = {
10: 'Open sky, no obstructions — NGS default',
13: 'Minor vegetation — slight horizon reduction',
15: 'Moderate terrain or light development — standard field practice',
20: 'Significant obstruction or urban environment',
25: 'Heavy obstruction and/or high multipath — maximum practical mask'
};
// ── PDOP cross-check at recommended mask ─────────────────────────
let maskPdopHtml = '';
try {
if (almanacSats && almanacSats.length && lat != null && lng != null) {
// Sample PDOP at recMask across all days' best window hours
// Use dopData to find best window hours, then re-compute at recMask
const baseMask = currentElevMask;
let bestPdopAtRec = null;
let worstPdopAtRec = null;
let conflictDays = 0;
const totalDays = dopData ? dopData.length : 0;
if (dopData && dopData.length) {
dopData.forEach(day => {
// Find the best 4-hour window for this day (lowest avg PDOP at current mask)
const hours = day.hours || [];
const goodHours = hours.filter(h => h.pdop !== null && h.pdop > 0 && h.pdop < 10);
if (!goodHours.length) return;
// Best single hour at current mask
const bestHour = goodHours.reduce((b, h) => h.pdop < b.pdop ? h : b, goodHours[0]);
// Re-compute PDOP at recMask for that same hour
// day.date may be a Date object or ISO string — normalize to ISO
const dayISO = (day.date instanceof Date)
? day.date.toISOString().slice(0,10)
: String(day.date).slice(0,10);
const tUTC = new Date(dayISO + 'T' + String(bestHour.hour).padStart(2,'0') + ':30:00Z');
const result = computePDOP(almanacSats, lat, lng, 0, tUTC, recMask);
if (!result || !result.pdop) return;
const p = result.pdop;
if (bestPdopAtRec === null || p < bestPdopAtRec) bestPdopAtRec = p;
if (worstPdopAtRec === null || p > worstPdopAtRec) worstPdopAtRec = p;
if (p > 3.0) conflictDays++;
});
}
if (bestPdopAtRec !== null) {
const pdopOk = worstPdopAtRec <= 3.0;
const pdopColor = pdopOk ? 'var(--green)' : 'var(--yellow)';
const pdopIcon = pdopOk ? '✓' : '⚠';
const pdopNote = pdopOk
? `PDOP remains ≤ ${worstPdopAtRec.toFixed(1)} at ${recMask}° — geometry confirmed acceptable`
: `PDOP reaches ${worstPdopAtRec.toFixed(1)} on ${conflictDays} day${conflictDays>1?'s':''} at ${recMask}° — consider ${recMask-5}° mask with extended occupation time`;
maskPdopHtml = `
<div style="margin-top:4px;padding:8px 10px;background:rgba(255,255,255,.04);border-radius:4px;border-left:3px solid ${pdopColor}">
<div style="font-size:11px;color:${pdopColor};font-weight:600">${pdopIcon} PDOP Check at ${recMask}°: ${bestPdopAtRec.toFixed(1)}–${worstPdopAtRec.toFixed(1)} across survey window${totalDays > 1 ? 's' : ''}</div>
<div style="font-size:10px;color:var(--text-dim);margin-top:3px">${pdopNote}</div>
</div>`;
}
}
} catch(e) { console.warn('[LandCover] PDOP check failed:', e.message); }
// Store recMask on data object so AI prompt can read it
if (data) data.recMask = recMask;
// ── Colors ────────────────────────────────────────────────────────
const borderColor = maxRank >= 3 ? 'var(--red)' : maxRank >= 2 ? 'var(--yellow)' : 'var(--green)';
const obsColor = obsRank >= 3 ? 'var(--red)' : obsRank >= 2 ? 'var(--yellow)' : 'var(--green)';
const multiColor = multiRank >= 3 ? 'var(--red)' : multiRank >= 2 ? 'var(--yellow)' : 'var(--green)';
const maskColor = recMask >= 20 ? 'var(--yellow)' : recMask >= 15 ? 'var(--text)' : 'var(--green)';
// ── Point breakdown table ─────────────────────────────────────────
const pointRows = (data.points || []).map(p => {
if (!p.info) return `<tr><td style="padding:2px 8px 2px 0;color:var(--text-dim);text-transform:capitalize">${p.label}</td><td style="color:var(--text-dim)">No data</td><td></td><td></td></tr>`;
const oc = RANK[p.info.obstruction] >= 3 ? 'var(--red)' : RANK[p.info.obstruction] >= 2 ? 'var(--yellow)' : 'var(--green)';
const mc = RANK[p.info.multipath] >= 3 ? 'var(--red)' : RANK[p.info.multipath] >= 2 ? 'var(--yellow)' : 'var(--green)';
return `<tr>
<td style="padding:2px 8px 2px 0;color:var(--text-dim);text-transform:capitalize">${p.label}</td>
<td style="padding:2px 8px 2px 0;color:var(--text)">${p.info.label}</td>
<td style="padding:2px 8px 2px 0;color:${oc};text-transform:capitalize">${p.info.obstruction}</td>
<td style="padding:2px 0;color:${mc};text-transform:capitalize">${p.info.multipath}</td>
</tr>`;
}).join('');
card.style.display = 'block';
card.innerHTML = `
<div class="info-card" style="border-color:${borderColor};page-break-before:avoid">
<div class="card-header" style="color:${borderColor}">🌿 Land Cover & Multipath Risk</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:12px 0 8px">
<div>
<div style="font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px">Sky Obstruction</div>
<div style="font-size:15px;font-weight:700;color:${obsColor}">${OBS_LABEL[obs]}</div>
<div style="font-size:11px;color:var(--text-dim);margin-top:4px">${OBS_NOTE[obs]}</div>
</div>
<div>
<div style="font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px">Multipath Risk</div>
<div style="font-size:15px;font-weight:700;color:${multiColor}">${MULTI_LABEL[multi]}</div>
<div style="font-size:11px;color:var(--text-dim);margin-top:4px">${MULTI_NOTE[multi]}</div>
</div>
</div>
<div style="margin:12px 0;padding:10px 12px;background:rgba(255,255,255,.05);border-radius:6px;border:1px solid ${maskColor}">
<div style="font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;margin-bottom:6px">Recommended Elevation Mask</div>
<div style="display:flex;align-items:baseline;gap:8px">
<span style="font-size:28px;font-weight:800;color:${maskColor};font-family:'IBM Plex Mono',monospace">${recMask}°</span>
<span style="font-size:11px;color:var(--text-dim)">${MASK_REASON[recMask]}</span>
</div>
${maskPdopHtml}
</div>
<div style="margin-top:10px">
<div style="font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;margin-bottom:6px">5-Point Sample (Center + N/S/E/W · ~100 m)</div>
<table style="font-size:11px;width:100%;border-collapse:collapse">
<thead><tr>
<th style="text-align:left;color:var(--text-dim);font-weight:500;padding:0 8px 4px 0">Point</th>
<th style="text-align:left;color:var(--text-dim);font-weight:500;padding:0 8px 4px 0">Cover Type</th>
<th style="text-align:left;color:var(--text-dim);font-weight:500;padding:0 8px 4px 0">Obstruction</th>
<th style="text-align:left;color:var(--text-dim);font-weight:500;padding:0">Multipath</th>
</tr></thead>
<tbody>${pointRows}</tbody>
</table>
</div>
<div style="margin-top:10px;font-size:10px;color:var(--text-dim)">Dominant cover: ${domLabel} · Source: USGS NLCD 2024 via MRLC · 30 m resolution · Industry standard mask guidance per NGS field procedures</div>
</div>`;
}
// ================================================================
// RENDER: AI SUMMARY
// ================================================================
function renderWildfireCard(fireData) {
const card = document.getElementById('wildfire-card');
if (!card || !fireData) return;
const fires = fireData.fires;
let statusColor, statusText, statusNote, borderColor;
if (fires.length === 0) {
statusColor = 'var(--green)';
statusText = 'No Active Fires Within 150 Miles';
const today = new Date().toLocaleDateString('en-US', {month:'long', day:'numeric', year:'numeric'});
statusNote = `No active fires as of report date (${today}) · Conditions may change — verify before fieldwork`;
borderColor = 'var(--green)';
} else {
const closest = fires[0];
const distStr = closest.distMi.toFixed(1) + ' mi';
const extraFires = fires.length > 1 ? ` · +${fires.length - 1} additional fire${fires.length > 2 ? 's' : ''} within 150 mi` : '';
if (closest.distMi < 25) {
statusColor = 'var(--red)'; borderColor = 'var(--red)';
statusText = `⚠ CRITICAL — ${closest.name} · ${distStr}`;
} else if (closest.distMi < 50) {
statusColor = '#f97316'; borderColor = '#f97316';
statusText = `⚠ WARNING — ${closest.name} · ${distStr}`;
} else {
statusColor = 'var(--yellow)'; borderColor = 'var(--yellow)';
statusText = `CAUTION — ${closest.name} · ${distStr}`;
}
statusNote = `${closest.acres} acres · NIFC current perimeters${extraFires}`;
}
card.style.display = 'block';
card.innerHTML = `
<div style="border:1px solid ${borderColor};padding:20px 24px;margin-bottom:14px;page-break-before:avoid !important;page-break-inside:avoid;background:var(--bg2)">
<div style="font-family:'IBM Plex Mono',monospace;font-size:10px;font-weight:600;color:var(--amber);letter-spacing:.28em;text-transform:uppercase;margin-bottom:14px;display:flex;align-items:center;gap:10px">
🔥 Wildfire Proximity
<span style="flex:1;height:1px;background:var(--border);display:block"></span>
</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:18px;font-weight:600;color:${statusColor};margin-bottom:6px">${statusText}</div>
<div style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim)">${statusNote}</div>
</div>`;
}
function renderAISummary(text) {
const formatted = text.replace(/^([A-Z][A-Z\s\/\-]{2,}[A-Z]):?\s*$/gm, m => `<strong>${m.trim()}</strong>`).replace(/\n/g, '<br>');
document.getElementById('ai-summary-card').innerHTML = `
<div class="ai-card">
<h3>AI Field Analysis — Claude Opus</h3>
<div class="ai-card-body">${formatted}</div>
</div>`;
}
// ================================================================
// PROGRESS / STATUS
// ================================================================
function showProgress(show) {
document.getElementById('progress-box').classList.toggle('visible', show);
if (show) ['ps-gnss','ps-dop','ps-iono','ps-flux','ps-wx','ps-aqi','ps-faa','ps-fire','ps-nanu','ps-landcover','ps-ai'].forEach(id => setStep(id,'idle'));
}
function setStep(id, state) { const el=document.getElementById(id); if(el) el.className='progress-step '+state; }
function setDot(name, state) { const el=document.getElementById('dot-'+name); if(el) el.className='dot '+state; }
// ================================================================
// MANUAL MODE
// ================================================================
async function analyzeManual() {
const lat=parseFloat(document.getElementById('m-lat').value);
const lng=parseFloat(document.getElementById('m-lng').value);
const apiKey=document.getElementById('m-apikey').value.trim()||ls('apikey');
if(!apiKey){alert('Please enter your Anthropic API key.');return;}
const dopFile=document.getElementById('dop-upload').files[0];
const ionoFile=document.getElementById('iono-upload').files[0];
if(!dopFile&&!ionoFile){alert('Please upload at least one chart image.');return;}
const btn=document.getElementById('manual-run-btn');
btn.disabled=true; btn.textContent='⏳ ANALYZING…';
try {
const company=ls('company')||'', jobname=ls('jobname')||'', sitedesc=ls('sitedesc')||'';
const dates=manualDates.map(id=>{
const dv=document.getElementById('date-'+id)?.value;
const lv=document.getElementById('datelbl-'+id)?.value;
return dv?`${dv}${lv?' ('+lv+')':''}`:null;
}).filter(Boolean);
let wxData=null;
if(!isNaN(lat)&&!isNaN(lng)){try{wxData=await fetchWeather(lat,lng,Math.max(dates.length,1));}catch(e){}}
const content=[];
let ctx=`You are a senior GNSS survey operations expert analyzing Trimble GNSS Planning screenshots.\n\nJOB: ${company||'N/A'} — ${jobname||'N/A'}\nSITE: ${sitedesc||'N/A'}\n`;
if(!isNaN(lat)) ctx+=`LOCATION: ${lat.toFixed(4)}, ${lng.toFixed(4)}\n`;
if(dates.length) ctx+=`SURVEY DATES: ${dates.join(', ')}\n`;
ctx+='\n';
if(wxData){
ctx+=`WEATHER FORECAST:\n`;
const daily=wxData.daily;
for(let d=0;d<Math.min(dates.length||1,daily.time.length);d++){
ctx+=`${daily.time[d]}: ${wxDesc(daily.weathercode[d])}, High ${daily.temperature_2m_max[d]?.toFixed(0)}°F, Wind ${daily.windspeed_10m_max[d]?.toFixed(0)} mph\n`;
}
ctx+='\n';
}
ctx+=`Analyze the attached Trimble GNSS Planning chart(s) and provide:\n`;
if(dates.length>1){ctx+=`1. Day ranking best to worst with GO/CAUTION/NO-GO and rationale\n2. Best survey window per day\n3. Best 4-hour static GNSS window\n4. Drone assessment\n5. Field safety warnings\n6. Summary\nALL CAPS section labels. No markdown.`;}
else{ctx+=`1. GO / CAUTION / NO-GO recommendation\n2. Best survey window\n3. Best 4-hour static GNSS window\n4. Drone assessment\n5. Field safety warnings\n6. Summary\nALL CAPS section labels. No markdown.`;}
content.push({type:'text',text:ctx});
for(const file of [dopFile,ionoFile].filter(Boolean)){
const b64=await fileToBase64(file);
content.push({type:'image',source:{type:'base64',media_type:file.type||'image/png',data:b64}});
}
const res=await fetch('https://api.anthropic.com/v1/messages',{method:'POST',signal:AbortSignal.timeout(45000),headers:{'Content-Type':'application/json','x-api-key':apiKey,'anthropic-version':'2023-06-01','anthropic-dangerous-direct-browser-access':'true'},body:JSON.stringify({model:'claude-opus-4-5',max_tokens:1800,messages:[{role:'user',content}]})});
if(!res.ok){const e=await res.json().catch(()=>({}));throw new Error(e.error?.message||`HTTP ${res.status}`);}
const data=await res.json(), aiText=data.content[0].text;
document.getElementById('manual-results').classList.add('visible');
let html='';
if(wxData){
const numDays=Math.max(dates.length,1);
for(let d=0;d<numDays;d++){
const dayW=buildDayWeather(wxData,d);
if(dayW){
const wr=weatherRating(dayW);
const dateLabel=wxData.daily.time?.[d]||dates[d]||`Day ${d+1}`;
html+=`<div class="section-title">Weather — ${dateLabel}</div>`;
html+=formatWeatherHTML(dayW,wr)+buildFieldWarningsHTML(dayW)+formatDroneWindHTML(dayW);
}
}
}
const formatted=aiText.replace(/^([A-Z][A-Z\s\/\-]{2,}[A-Z]):?\s*$/gm,m=>`<strong>${m.trim()}</strong>`).replace(/\n/g,'<br>');
html+=`<div class="ai-card"><h3>AI Field Analysis — Claude Opus</h3><div class="ai-card-body">${formatted}</div></div>`;
document.getElementById('manual-result-area').innerHTML=html;
} catch(e) {
document.getElementById('manual-results').classList.add('visible');
document.getElementById('manual-result-area').innerHTML=`<div class="warn-banner">Analysis failed: ${e.message}</div>`;
}
btn.disabled=false; btn.textContent='📊 ANALYZE CHARTS';
}
function fileToBase64(file) {
return new Promise((resolve,reject)=>{
const r=new FileReader();
r.onload=e=>resolve(e.target.result.split(',')[1]);
r.onerror=reject;
r.readAsDataURL(file);
});
}
// ================================================================
// EXPORT
// ================================================================
// ================================================================
// COVER SHEET — generates for reports with 3+ days
// ================================================================
// ================================================================
// RENDER: RANKING PAGE (print page 2)
// ================================================================
function renderRankingPage(wxData, dopData, days) {
const el = document.getElementById('ranking-page');
if (!el || days < 3) { if (el) el.style.display = 'none'; return; }
el.style.display = 'block';
const daily = wxData.daily;
const DOW_FULL = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
const DOW_SHORT = ['SUN','MON','TUE','WED','THU','FRI','SAT'];
const WEEKEND = [0, 6]; // Sun, Sat
// Build scored list
const days_arr = [];
for (let d = 0; d < Math.min(days, daily.time.length); d++) {
const dopDay = dopData ? dopData[d] : null;
const score = scoreDayConditions(wxData, d, dopDay);
const dt = new Date(daily.time[d] + 'T12:00:00');
const dow = dt.getDay();
const isWeekend = WEEKEND.includes(dow);
const code = daily.weathercode[d];
const maxWind = daily.windspeed_10m_max[d] || 0;
const precip = daily.precipitation_sum?.[d] || 0;
const bestPdop = dopDay?.bestWindow?.avgPdop ?? dopDay?.avgPdop ?? null;
const bestSats = dopDay?.bestWindow?.sats ?? null;
const avgPdop = dopDay?.avgPdop ?? null;
days_arr.push({ d, score, dt, dow, isWeekend,
dateStr: dt.toLocaleDateString('en-US', {month:'short', day:'numeric'}),
dowFull: DOW_FULL[dow], dowShort: DOW_SHORT[dow],
code, wxLabel: wxDesc(code), maxWind, precip,
bestPdop, bestSats, avgPdop });
}
// Sort best→worst
const ranked = [...days_arr].sort((a, b) => a.score - b.score);
// Auto-generate notes per day
function makeNote(r, rank) {
const notes = [];
if (r.bestPdop !== null && r.bestPdop <= 0.78) notes.push('Best DOP window of the week');
if (r.bestSats !== null && r.bestSats >= 39) notes.push(`High sat count (${r.bestSats} sv)`);
if (r.precip > 0) notes.push(`Precip ${r.precip.toFixed(2)}" — moisture risk`);
if (r.maxWind > 20) notes.push(`High wind ${r.maxWind.toFixed(0)} mph — caution`);
else if (r.maxWind > 14) notes.push(`Wind ${r.maxWind.toFixed(0)} mph — slightly elevated`);
else if (r.maxWind <= 8) notes.push(`Low wind ${r.maxWind.toFixed(0)} mph`);
else notes.push(`Wind ${r.maxWind.toFixed(0)} mph`);
if (r.code === 45 || r.code === 48) notes.push('Fog — does not affect GNSS; may limit visibility');
if (r.code >= 61 && r.code <= 65) notes.push('Rain forecast');
if (r.code >= 71 && r.code <= 77) notes.push('Snow forecast');
if (r.isWeekend) notes.push('Weekend — overtime/premium labor costs apply');
if (rank === 1) notes.push('Top pick');
return notes.join('. ');
}
// GO/CAUTION/NO-GO badge
function goBadge(score) {
if (score < 30) return ['GO', 'rank-go'];
if (score < 60) return ['CAUTION', 'rank-caution'];
return ['NO-GO', 'rank-nogo'];
}
const rows = ranked.map((r, i) => {
const rank = i + 1;
const [badge, badgeCls] = goBadge(r.score);
const note = makeNote(r, rank);
const pdopStr = r.bestPdop !== null ? r.bestPdop.toFixed(2) : '—';
const satsStr = r.bestSats !== null ? r.bestSats : (r.avgPdop ? '~37' : '—');
const wknd = r.isWeekend ? `<span class="rank-weekend-tag">WEEKEND</span>` : '';
return `
<tr class="rank-row rank-row-${rank <= 3 ? 'top' : rank >= 6 ? 'low' : 'mid'}">
<td class="rank-n">${rank}</td>
<td class="rank-date">${r.dateStr}<br><span class="rank-dow">${r.dowFull}</span>${wknd}</td>
<td class="rank-pdop">${pdopStr}</td>
<td class="rank-sats">${satsStr}</td>
<td class="rank-wx">${r.wxLabel}</td>
<td class="rank-badge-cell"><span class="rank-badge ${badgeCls}">${badge}</span></td>
<td class="rank-notes">${note}</td>
</tr>`;
}).join('');
el.innerHTML = `
<div class="ranking-page-inner">
<div class="ranking-page-header">
<div class="ranking-page-title">WEEK RANKING</div>
<div class="ranking-page-sub">Best to worst for GNSS survey operations</div>
</div>
<div class="ranking-meta-note">Ranking considers PDOP, satellite count, weather, precipitation, wind, and operational day status.</div>
<div class="ranking-table-wrap">
<table class="ranking-table">
<thead>
<tr>
<th class="rh-rank">RANK</th>
<th class="rh-date">DATE / DAY</th>
<th class="rh-pdop">PDOP<br><span class="rh-sub">BEST 4-HR</span></th>
<th class="rh-sats">SATS</th>
<th class="rh-wx">WEATHER</th>
<th class="rh-badge">STATUS</th>
<th class="rh-notes">NOTES</th>
</tr>
</thead>
<tbody>${rows}</tbody>
</table>
</div>
</div>`;
}
function renderCoverSheet(wxData, dopData, days, lat, lng, company, jobname, sitedesc, aqiData, controlData) {
if (days < 3) {
document.getElementById('report-cover').style.display = 'none';
return;
}
const cover = document.getElementById('report-cover');
cover.style.display = 'block';
// ── Job info ────────────────────────────────────────────────────
const el = id => document.getElementById(id);
el('cover-company').textContent = company || 'GNSS Survey Report';
el('cover-jobname').textContent = jobname || '';
el('cover-location').textContent = autoLocLabel || sitedesc || '';
el('cover-coords').textContent = (!isNaN(lat) && !isNaN(lng))
? lat.toFixed(4) + ', ' + lng.toFixed(4) : '';
// Elevation
if (siteElevFt !== null) {
const elevEl = document.getElementById('cover-elev');
const elevSep = document.getElementById('cover-elev-sep');
if (elevEl) { elevEl.textContent = siteElevFt.toLocaleString() + ' ft'; elevEl.style.display = ''; }
if (elevSep) elevSep.style.display = '';
}
// ── High Elevation Weather Warning ──────────────────────────────
if (siteElevFt !== null && siteElevFt >= 5000) {
const row = document.getElementById('cover-elev-temp-row');
const txt = document.getElementById('cover-elev-temp-text');
if (row && txt) {
txt.textContent = `Site at ${siteElevFt.toLocaleString()} ft — weather model data may not fully reflect high-elevation conditions. Expect cooler temperatures, stronger winds, and faster-changing weather than forecast.`;
row.style.display = '';
}
}
// ── CORS Elevation Delta Warning ────────────────────────────────
(function() {
const deltaRow = document.getElementById('cover-elev-delta-row');
const deltaIcon = document.getElementById('cover-elev-delta-icon');
const deltaTxt = document.getElementById('cover-elev-delta-text');
if (!deltaRow || !deltaIcon || !deltaTxt) return;
const cors = (controlData && controlData.corsStations) ? controlData.corsStations : [];
const nearestRefElevFt = controlData?.nearestCorsElevFt ?? null;
const nearest = cors.length > 0 ? cors[0] : null;
if (siteElevFt !== null && nearestRefElevFt !== null && nearest) {
const delta = siteElevFt - nearestRefElevFt;
const absDelta = Math.abs(delta);
const dir = delta >= 0 ? 'above' : 'below';
let icon, bg, textColor, msg;
if (absDelta >= 4000) {
icon = '🔴'; bg = 'rgba(239,68,68,0.12)'; textColor = '#ef4444';
msg = `Site is ${absDelta.toLocaleString()} ft ${dir} nearest CORS station (${nearest.id}, ${nearest.dist} mi) — Significant elevation difference. Use dual-frequency receiver, plan extended occupation (2+ hrs), and verify atmosphere modeling.`;
} else if (absDelta >= 2000) {
icon = '⚠️'; bg = 'rgba(234,179,8,0.12)'; textColor = '#ca8a04';
msg = `Site is ${absDelta.toLocaleString()} ft ${dir} nearest CORS station (${nearest.id}, ${nearest.dist} mi) — Elevated baseline difference. Extended occupation recommended. Monitor tropospheric correction in processing.`;
} else {
icon = '✅'; bg = 'rgba(34,197,94,0.10)'; textColor = '#16a34a';
msg = `CORS Elev Delta: ${absDelta.toLocaleString()} ft ${dir} nearest CORS station (${nearest.id}, ${nearest.dist} mi) — Good baseline geometry.`;
}
deltaRow.style.background = bg;
deltaRow.style.display = 'flex';
deltaIcon.textContent = icon;
deltaTxt.style.color = textColor;
deltaTxt.textContent = msg;
} else if (siteElevFt !== null && nearest) {
deltaRow.style.background = 'rgba(100,116,139,0.10)';
deltaRow.style.display = 'flex';
deltaIcon.textContent = '📡';
deltaTxt.style.color = '#94a3b8';
deltaTxt.textContent = `Nearest CORS: ${nearest.id} (${nearest.dist} mi) — Elevation delta unavailable.`;
}
})();
// Declination (may arrive async — also called via updateCoverDeclination)
if (siteDeclDeg !== null) updateCoverDeclination(siteDeclDeg);
el('cover-gendate').textContent = new Date().toLocaleDateString('en-US',
{weekday:'short', month:'short', day:'numeric', year:'numeric'});
applyCountyToReport();
el('cover-report-type').textContent = days + '-DAY ANALYSIS';
const labelEl = document.getElementById('cover-section-label');
if (labelEl) labelEl.textContent = days + '-DAY FIELD RANKING · RANKED BEST TO WORST FOR GNSS OPERATIONS';
// ── Build and RANK all days ─────────────────────────────────────
const daily = wxData.daily;
const DOW_FULL = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
const DOW_SHORT = ['SUN','MON','TUE','WED','THU','FRI','SAT'];
const WEEKEND = [0, 6];
const rows = [];
for (let d = 0; d < Math.min(days, daily.time.length); d++) {
const score = scoreDayConditions(wxData, d, dopData ? dopData[d] : null);
const dopDay = dopData ? dopData[d] : null;
const dt = new Date(daily.time[d] + 'T12:00:00');
const dow = dt.getDay();
const isWeekend = WEEKEND.includes(dow);
const code = daily.weathercode[d];
const maxWind = daily.windspeed_10m_max?.[d] || 0;
const precip = daily.precipitation_sum?.[d] || 0;
// Best GNSS window from DOP data
let windowStr = '—';
if (dopDay && dopDay.bestWindow && dopDay.bestWindow.label) {
windowStr = dopDay.bestWindow.label;
} else if (dopDay && dopDay.hours && dopDay.hours.length) {
const fmtH = h => { const hh = h % 12 || 12, ap = h < 12 ? 'AM' : 'PM'; return hh + ':00 ' + ap; };
const fieldHours = dopDay.hours.filter(h => h.hour >= 6 && h.hour <= 19);
let bestScore = Infinity, bestStart = null, bestEnd = null;
for (let i = 0; i <= fieldHours.length - 4; i++) {
const win4 = fieldHours.slice(i, i + 4);
const avg = win4.reduce((s, h) => s + (h.pdop || 3), 0) / 4;
if (avg < bestScore) { bestScore = avg; bestStart = win4[0].hour; bestEnd = win4[3].hour; }
}
if (bestStart !== null) windowStr = fmtH(bestStart) + ' – ' + fmtH(bestEnd + 1);
}
// Best PDOP and sats
const bestPdop = dopDay?.bestWindow?.avgPdop ?? dopDay?.avgPdop ?? null;
const bestSats = dopDay?.bestWindow?.sats ?? null;
// GO/CAUTION/NO-GO
let badge, badgeClass;
if (score < 30) { badge = 'GO'; badgeClass = 'cover-badge-go'; }
else if (score < 60) { badge = 'CAUTION'; badgeClass = 'cover-badge-caution'; }
else { badge = 'NO-GO'; badgeClass = 'cover-badge-nogo'; }
// One-line note
const noteParts = [];
if (precip > 0) noteParts.push(`Precip ${precip.toFixed(2)}"`);
if (code === 45 || code === 48) noteParts.push('Fog AM');
if (maxWind > 20) noteParts.push(`Wind ${maxWind.toFixed(0)} mph — high`);
else if (maxWind > 14) noteParts.push(`Wind ${maxWind.toFixed(0)} mph`);
else if (maxWind <= 8) noteParts.push(`Wind ${maxWind.toFixed(0)} mph — calm`);
else noteParts.push(`Wind ${maxWind.toFixed(0)} mph`);
if (isWeekend) noteParts.push('Weekend');
const note = noteParts.join(' · ');
// AQI for this day — forecast only, blank if unavailable
const dateKey = daily.time[d]; // "2026-02-26"
const aqiDay = aqiData ? aqiData[dateKey] : null;
const aqiVal = aqiDay?.aqi ?? null;
const aqiEst = false;
const aqiCat = aqiDay?.category ?? null;
// Bump score for bad air quality
let aqiScorePenalty = 0;
if (aqiVal !== null) {
if (aqiVal > 200) aqiScorePenalty = 40;
else if (aqiVal > 150) aqiScorePenalty = 20;
else if (aqiVal > 100) aqiScorePenalty = 5;
}
rows.push({ d, score: score + aqiScorePenalty, dow, isWeekend,
dowShort: DOW_SHORT[dow], fullDow: DOW_FULL[dow],
dateStr: dt.toLocaleDateString('en-US', {month:'short', day:'numeric'}),
badge, badgeClass, windowStr, bestPdop, bestSats,
wxLabel: wxDesc(code), note, aqiVal, aqiCat });
}
// Sort best → worst by score, preserve original calendar order as tiebreak
rows.sort((a, b) => a.score - b.score || a.d - b.d);
// ── Render ranked table ─────────────────────────────────────────
const table = el('cover-summary-table');
table.innerHTML = rows.map((r, i) => {
const rank = i + 1;
const hasAqi = rows.some(r => r.aqiVal !== null);
const noKey = !ls('airnow_key');
const rankClass = rank === 1 ? 'cover-rank-1' : rank <= 3 ? 'cover-rank-top' : r.isWeekend ? 'cover-rank-wknd' : '';
const aqiLevel = r.aqiVal === null ? 'unknown' :
r.aqiVal <= 50 ? 'good' :
r.aqiVal <= 100 ? 'moderate' :
r.aqiVal <= 150 ? 'sensitive' :
r.aqiVal <= 200 ? 'unhealthy' : 'hazardous';
let aqiHtml;
if (r.aqiVal !== null) {
// Have real data — number only, red badge if unhealthy+
const isAlert = r.aqiVal > 150;
aqiHtml = `<div class="cover-aqi ${isAlert ? 'cover-aqi-alert' : 'cover-aqi-ok'}">
<div class="cover-aqi-val">${r.aqiVal}</div>
</div>`;
} else {
// No key or no data — empty cell, hidden in print
aqiHtml = `<div class="cover-aqi cover-aqi-nokey no-print"><div class="cover-aqi-val">—</div></div>`;
}
return `
<div class="cover-day-row ${rankClass}">
<div class="cover-rank-num">${rank}</div>
<div class="cover-day-dowcol">
<div class="cover-day-dow">${r.dowShort}</div>
<div class="cover-day-fulldate">${r.fullDow}, ${r.dateStr}</div>
${r.isWeekend ? '<div class="cover-wknd-tag">WEEKEND</div>' : ''}
</div>
<div class="cover-day-gnss-col">
<div class="cover-day-gnss-window">${r.windowStr}</div>
<div class="cover-day-pdop-sats">
${r.bestPdop ? `PDOP ${r.bestPdop.toFixed(2)}` : ''}${r.bestSats ? ` · ${r.bestSats} sv` : ''}
</div>
</div>
<div class="cover-day-wx-col">${r.wxLabel}</div>
${aqiHtml}
<div class="cover-day-note">${r.note}</div>
<div class="cover-day-badge ${r.badgeClass}">${r.badge}</div>
</div>`;
}).join('');
// ── QR Code ────────────────────────────────────────────────────
// Payload: human-readable ranked field summary the crew can read on their phone
const co_qr = (company||'').slice(0, 24);
const jn_qr = (jobname||'').slice(0, 24);
const dateStr_qr = new Date().toLocaleDateString('en-US',
{ weekday:'short', month:'short', day:'numeric', year:'numeric' });
let qrText = 'SKYGRID GNSS FIELD REPORT\n';
if (co_qr) qrText += co_qr + '\n';
if (jn_qr) qrText += jn_qr + '\n';
qrText += dateStr_qr + '\n';
qrText += '-------------------------\n';
qrText += 'RANK DAY WINDOW PDOP AQI STATUS\n';
rows.forEach((r, i) => {
const rank = String(i + 1).padEnd(5);
const day = (r.dowShort + ' ' + r.dateStr).padEnd(11);
const win = r.windowStr.replace(' AM',' AM').replace(' PM',' PM').padEnd(16);
const pdop = r.bestPdop ? r.bestPdop.toFixed(2).padEnd(6) : '— ';
const aqi = r.aqiVal !== null ? String(r.aqiVal).padEnd(6) : '— ';
const status = r.badge + (r.isWeekend ? ' [WKND]' : '') + (r.aqiVal > 150 ? ' ⚠SMOKE' : '');
qrText += rank + day + win + pdop + aqi + status + '\n';
});
qrText += '-------------------------\n';
// Best day callout
if (rows.length > 0) {
const best = rows[0];
qrText += 'TOP PICK: ' + best.fullDow + ' ' + best.dateStr + '\n';
qrText += 'WINDOW: ' + best.windowStr + '\n';
if (best.bestPdop) qrText += 'PDOP: ' + best.bestPdop.toFixed(2);
if (best.bestSats) qrText += ' / ' + best.bestSats + ' sv';
if (best.aqiVal !== null) qrText += '\nAQI: ' + best.aqiVal + ' ' + (best.aqiCat || '');
qrText += '\n';
}
// QR has ~900 char limit — trim and use lowest correction level
// Strip non-ASCII chars (unicode symbols blow up QR byte count)
const qrPayload = qrText.replace(/[^\x00-\x7F]/g, '').replace(/[ \t]+\n/g, '\n').slice(0, 700);
console.log('[SkyGrid] Cover QR payload length:', qrPayload.length);
if (coverQrTimer) { clearTimeout(coverQrTimer); coverQrTimer = null; }
coverQrTimer = setTimeout(() => {
coverQrTimer = null;
const qrDiv = el('cover-qr-canvas');
if (!qrDiv) { console.warn('[SkyGrid] cover-qr-canvas not found'); return; }
qrDiv.innerHTML = '';
try {
new QRCode(qrDiv, {
text: qrPayload, width: 80, height: 80,
colorDark: '#111111', colorLight: '#ffffff',
correctLevel: QRCode.CorrectLevel.L
});
console.log('[SkyGrid] Cover QR generated OK');
} catch(e) {
console.warn('[SkyGrid] Cover QR failed:', e.message);
}
}, 800);
}
function exportEmailAuto() {
const r = autoLastResult;
if (!r || !r.aiText) { alert('Generate a report first.'); return; }
const co = r.company || ls('company') || '';
const jn = r.jobname || ls('jobname') || '';
const now = new Date().toLocaleDateString('en-US', {weekday:'short', month:'short', day:'numeric', year:'numeric'});
const div = '─'.repeat(44);
function wEm(code) {
if (!code && code !== 0) return '';
if (code === 0) return '☀'; if (code <= 3) return '⛅';
if (code <= 49) return '🌫'; if (code <= 69) return '🌧';
if (code <= 79) return '❄'; if (code <= 82) return '🌧'; return '⛈';
}
function droneStr(dayW) {
if (!dayW) return '';
const s = windStatus(dayW.windMax||0, dayW.windGusts||0);
const hourly = dayW.hourly||[];
const srDec = (dayW.sunriseHour||5)+(dayW.sunriseMin||0)/60;
const ssDec = (dayW.sunsetHour||20)+(dayW.sunsetMin||0)/60;
let flyStart=null, flyEnd=null, bestRun=0, curRun=0, curStart=null;
hourly.forEach(h => {
if (h.hour < srDec || h.hour > ssDec) { curRun=0; curStart=null; return; }
if (windStatus(h.wind, h.gusts).rank === 0) {
curRun++; if (!curStart) curStart=h.hour;
if (curRun > bestRun) { bestRun=curRun; flyStart=curStart; flyEnd=h.hour; }
} else { curRun=0; curStart=null;
// ================================================================
// BATCH MODE
// ================================================================
let batchClients = [];
let batchSharedIono = null;
function saveBatchApiKey(v) {
try { localStorage.setItem('apikey', v); } catch(e) {}
// sync with auto panel key too
['a-apikey','m-apikey'].forEach(id => {
const el = document.getElementById(id);
if (el && el.value !== v) el.value = v;
});
}
function downloadBatchTemplate() {
// Format: company, address (street/city/zip — anything Nominatim can geocode)
const csv = [
'company,address',
'OutKast Designs,Colusa CA 95932',
'Survey Co,Reno NV 89501',
'Pacific Survey,Medford OR 97501',
'Smith & Associates,Sacramento CA 95814',
'Valley Survey,Fresno CA 93721',
].join('\n') + '\n';
const a = document.createElement('a');
a.href = 'data:text/csv;charset=utf-8,' + encodeURIComponent(csv);
a.download = 'SkyGrid_Batch_Template.csv';
a.click();
}
function parseCSVLine(line) {
// Handle quoted fields with commas inside
const result = [];
let cur = '', inQuote = false;
for (let i = 0; i < line.length; i++) {
const ch = line[i];
if (ch === '"') { inQuote = !inQuote; }
else if (ch === ',' && !inQuote) { result.push(cur.trim()); cur = ''; }
else { cur += ch; }
}
result.push(cur.trim());
return result;
}
async function geocodeBatchAddress(address) {
// Use Nominatim via CORS proxy (direct Nominatim is blocked on localhost)
const q = encodeURIComponent(address);
const proxies = [
`/.netlify/functions/nominatim?limit=1&q=${encodeURIComponent(address)}`,
];
for (const url of proxies) {
try {
const res = await fetch(url, { signal: AbortSignal.timeout(8000) });
if (!res.ok) continue;
const data = await res.json();
if (data && data.length) {
return { lat: parseFloat(data[0].lat), lng: parseFloat(data[0].lon), display: cleanAddress(data[0].display_name) };
}
} catch(e) { /* try next proxy */ }
}
return null;
}
async function loadBatchCSV(input) {
const file = input.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = async e => {
const lines = e.target.result.split('\n').map(l => l.trim()).filter(Boolean);
if (!lines.length) { alert('Empty CSV'); return; }
const firstLow = lines[0].toLowerCase();
const hasHeader = firstLow.includes('company') || firstLow.includes('address') || firstLow.includes('zip');
const dataLines = hasHeader ? lines.slice(1) : lines;
batchClients = [];
for (const line of dataLines) {
const cols = parseCSVLine(line);
if (cols.length < 2) continue;
const company = cols[0] || '';
// Everything after the first column is the address — join back with comma
const address = cols.slice(1).join(', ').trim();
if (!company || !address) continue;
batchClients.push({ company, address, lat: null, lng: null, displayAddr: '', geocodeStatus: 'pending' });
}
if (!batchClients.length) { alert('No valid rows found.\nFormat: company,address\nExample: OutKast Designs,Colusa CA 95932'); return; }
renderBatchTable();
document.getElementById('batch-preview').style.display = 'block';
document.getElementById('batch-run-btn').style.display = 'none'; // hide until geocoded
document.getElementById('batch-progress').style.display = 'none';
document.getElementById('batch-summary').style.display = 'none';
// Geocode all addresses
document.getElementById('batch-geocode-status').style.display = 'block';
let ok = 0, fail = 0;
for (let i = 0; i < batchClients.length; i++) {
const c = batchClients[i];
setBatchGeoStatus(i, '⏳', '#eab308', 'Geocoding…');
const geo = await geocodeBatchAddress(c.address);
if (geo) {
c.lat = geo.lat; c.lng = geo.lng; c.displayAddr = geo.display;
c.geocodeStatus = 'ok';
setBatchGeoStatus(i, '✓', '#22c55e', geo.lat.toFixed(4) + ', ' + geo.lng.toFixed(4));
ok++;
} else {
c.geocodeStatus = 'failed';
setBatchGeoStatus(i, '✗', '#ef4444', 'Not found — check address');
fail++;
}
// Small pause to be polite to Nominatim
await new Promise(r => setTimeout(r, 500));
}
document.getElementById('batch-geocode-status').textContent =
'Geocoding complete: ' + ok + ' found, ' + fail + ' failed' + (fail > 0 ? ' — fix failed rows before running' : '');
document.getElementById('batch-geocode-status').style.color = fail > 0 ? '#eab308' : '#22c55e';
const readyCount = batchClients.filter(c => c.geocodeStatus === 'ok').length;
if (readyCount > 0) {
document.getElementById('batch-run-btn').style.display = 'block';
document.getElementById('batch-run-btn').textContent =
'⚡ RUN BATCH — GENERATE ' + readyCount + ' REPORT' + (readyCount > 1 ? 'S' : '');
}
};
reader.readAsText(file);
}
function renderBatchTable() {
const tbody = document.getElementById('batch-tbody');
tbody.innerHTML = batchClients.map((c, i) => `
<tr id="batch-row-${i}">
<td style="color:var(--text-dim)">${i+1}</td>
<td>${c.company}</td>
<td style="color:var(--text-dim);font-size:11px">${c.address}</td>
<td id="batch-geo-${i}" style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim)">—</td>
<td id="batch-status-${i}"><span style="color:var(--text-dim)">Pending</span></td>
</tr>`).join('');
}
function setBatchGeoStatus(i, icon, color, text) {
const el = document.getElementById('batch-geo-' + i);
if (el) el.innerHTML = '<span style="color:' + color + '">' + icon + '</span> <span style="font-size:10px;color:var(--text-dim)">' + text + '</span>';
}
function setBatchStatus(i, html) {
const el = document.getElementById('batch-status-' + i);
if (el) el.innerHTML = html;
}
function clearBatch() {
batchClients = [];
batchSharedIono = null;
document.getElementById('batch-preview').style.display = 'none';
document.getElementById('batch-run-btn').style.display = 'none';
document.getElementById('batch-progress').style.display = 'none';
document.getElementById('batch-file').value = '';
}
function getBatchStartDate() {
const input = document.getElementById('b-startdate');
if (input && input.value) return new Date(input.value + 'T12:00:00Z');
const d = new Date(); d.setDate(d.getDate() + 1); return d;
}
async function runBatch() {
if (!batchClients.length) return;
const apiKey = document.getElementById('b-apikey').value.trim() || ls('apikey');
if (!apiKey) { alert('Please enter your Anthropic API key.'); return; }
const btn = document.getElementById('batch-run-btn');
btn.disabled = true;
btn.textContent = '⏳ Running…';
const progDiv = document.getElementById('batch-progress');
const progList = document.getElementById('batch-progress-list');
progDiv.style.display = 'block';
progList.innerHTML = '';
document.getElementById('batch-summary').style.display = 'none';
// Build progress rows
batchClients.forEach((c, i) => {
progList.innerHTML += `<div id="bprog-${i}" style="display:flex;align-items:center;gap:10px;padding:8px 12px;background:var(--bg3);border:1px solid var(--border);border-radius:5px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--text-dim);min-width:20px">${i+1}</span>
<span style="flex:1;font-size:12px">${c.company} — ${c.job}</span>
<span id="bprog-status-${i}" style="font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-dim)">Waiting…</span>
</div>`;
});
// Step 1: Fetch shared iono data ONCE
setBprogStatus(0, 'Fetching iono…', '#eab308');
try {
const [kpRaw, fluxRaw, tecRaw] = await Promise.all([fetchIonoData(), fetchSolarFlux(), fetchTEC(batchClients[0].lat, batchClients[0].lng)]);
batchSharedIono = interpretIono(kpRaw, fluxRaw, tecRaw);
} catch(e) {
batchSharedIono = null;
console.warn('[Batch] Iono fetch failed:', e.message);
}
// Fetch NANU ONCE for all batch clients (same constellation for all locations)
let batchNanuData = null;
try { batchNanuData = await fetchNanu(); } catch(e) { console.warn('[Batch] NANU fetch failed:', e.message); }
let batchLandCoverData = null;
// Step 2: Fetch almanac ONCE for the reference day (same for all locations)
const startDate = getBatchStartDate();
const refDateISO = getRefDay(startDate);
let almanacSats = null;
try {
const almanacData = await fetchGNSSAlmanac(refDateISO);
almanacSats = parseAlmanacSats(almanacData);
} catch(e) {
console.warn('[Batch] Almanac fetch failed:', e.message);
}
let passed = 0, failed = 0;
// Step 3: Run each client
for (let i = 0; i < batchClients.length; i++) {
const c = batchClients[i];
setBprogStatus(i, 'Running…', '#eab308');
setBatchStatus(i, '<span style="color:#eab308">⏳ Running</span>');
try {
// Skip clients that failed geocoding
if (c.geocodeStatus !== 'ok' || c.lat === null || c.lng === null) {
throw new Error('Geocoding failed — address not found');
}
// GNSS DOP — per location
let dopData = null;
if (almanacSats) {
dopData = almanacToDopData(almanacSats, c.lat, c.lng, startDate, selectedDays, refDateISO);
}
// Weather — per location
const wxData = await fetchWeather(c.lat, c.lng, selectedDays, startDate);
if (!wxData || !wxData.daily) throw new Error('Weather fetch failed');
// Land Cover — per location
try { batchLandCoverData = await fetchLandCover(c.lat, c.lng); } catch(e) { batchLandCoverData = null; }
// Use address as job/site description
const jobName = c.address;
const siteName = c.displayAddr ? c.displayAddr.split(',').slice(0,3).join(',') : c.address;
// AI prompt
const prompt = buildAutoPrompt(c.lat, c.lng, selectedDays, dopData, batchSharedIono, wxData, c.company, jobName, siteName, startDate, batchNanuData, fireData, batchLandCoverData, aqiData);
const aiText = await callClaudeAPI(prompt, apiKey);
// Render report into DOM
if (batchSharedIono) renderIonoPanel(batchSharedIono);
if (dopData) renderDopTable(dopData, wxData, selectedDays);
renderWeekGrid(wxData, dopData, selectedDays, faaData, airspaceData, lat, lng);
if (selectedDays >= 2) renderStaticWindowCard(wxData, dopData, selectedDays);
renderWildfireCard(fireData);
renderNanuCard(batchNanuData);
renderLandCoverCard(batchLandCoverData, dopData, almanacSats, c.lat, c.lng);
renderAISummary(aiText);
if (selectedDays >= 3) renderCoverSheet(wxData, dopData, selectedDays, c.lat, c.lng, c.company, jobName, siteName, aqiData, controlData);
// Update print header fields
document.title = 'SkyGrid Report — ' + c.company + ' | ' + c.job;
const ph1 = document.getElementById('printHeaderPrepared');
const ph2 = document.getElementById('printHeaderProject');
const ph3 = document.getElementById('printHeaderDate');
if (ph1) ph1.textContent = 'Prepared for: ' + c.company;
if (ph2) ph2.textContent = c.job;
if (ph3) ph3.textContent = 'Generated: ' + new Date().toLocaleDateString('en-US',{weekday:'long',year:'numeric',month:'long',day:'numeric'});
document.getElementById('auto-results').classList.add('visible');
// Brief pause to let DOM settle, then print
await new Promise(r => setTimeout(r, 800));
window.print();
// Wait for print dialog to close before continuing
await new Promise(r => setTimeout(r, 2000));
setBprogStatus(i, '✓ Done', '#22c55e');
setBatchStatus(i, '<span style="color:#22c55e">✓ Done</span>');
passed++;
} catch(e) {
console.error('[Batch] Client', i, 'failed:', e.message);
setBprogStatus(i, '✗ Failed: ' + e.message.substring(0,40), '#ef4444');
setBatchStatus(i, '<span style="color:#ef4444">✗ Failed</span>');
failed++;
}
// Small pause between jobs to avoid rate limiting
if (i < batchClients.length - 1) {
setBprogStatus(i+1, 'Starting in 3s…', '#eab308');
await new Promise(r => setTimeout(r, 3000));
}
}
// Summary
const sumDiv = document.getElementById('batch-summary');
sumDiv.style.display = 'block';
sumDiv.innerHTML = `<span style="color:${failed===0?'#22c55e':'#eab308'}">Batch complete: ${passed} succeeded, ${failed} failed.</span>${failed>0?' Check failed rows above.':''}`;
btn.disabled = false;
btn.textContent = '⚡ RUN BATCH — GENERATE ALL REPORTS';
document.title = 'SkyGrid — GNSS Survey Planning System';
}
function setBprogStatus(i, text, color) {
const el = document.getElementById('bprog-status-' + i);
if (el) { el.textContent = text; el.style.color = color || 'var(--text-dim)'; }
}
// Drag-and-drop on batch drop zone
document.addEventListener('DOMContentLoaded', () => {
const drop = document.getElementById('batch-drop');
if (!drop) return;
drop.addEventListener('dragover', e => { e.preventDefault(); drop.style.borderColor = 'var(--amber)'; });
drop.addEventListener('dragleave', () => { drop.style.borderColor = 'var(--border)'; });
drop.addEventListener('drop', e => {
e.preventDefault();
drop.style.borderColor = 'var(--border)';
const file = e.dataTransfer.files[0];
if (file) {
const input = document.getElementById('batch-file');
const dt = new DataTransfer(); dt.items.add(file);
input.files = dt.files;
loadBatchCSV(input);
}
});
// Sync API key from auto panel
const autoKey = document.getElementById('a-apikey');
const batchKey = document.getElementById('b-apikey');
if (autoKey && batchKey) {
const stored = (() => { try { return localStorage.getItem('apikey')||''; } catch(e){return '';} })();
if (stored) batchKey.value = stored;
}
});
}
});
const fmt12 = h => (h%12||12)+':00 '+(h<12?'AM':'PM');
const sunInfo = dayW.sunriseStr ? ' (sun '+dayW.sunriseStr+'-'+dayW.sunsetStr+')' : '';
const fly = flyStart !== null && bestRun >= 2
? fmt12(flyStart)+' - '+fmt12(flyEnd+1)+(bestRun>=4?' ('+bestRun+' hrs)':'')
: 'no daylight window';
return s.status+' - Fly: '+fly+sunInfo;
}
function wxLine(w, date) {
if (!w) return ' '+String(date).padEnd(12)+' (no weather data)';
const flags = [];
if (w.code >= 95) flags.push('!! THUNDERSTORMS');
else if (w.code >= 80) flags.push('! HEAVY RAIN');
else if (w.code >= 61) flags.push('! RAIN');
if (w.windGusts > 45) flags.push('!! EXTREME WIND');
else if (w.windGusts > 30) flags.push('! HIGH GUSTS');
if (w.tempMin < 32) flags.push('! FREEZING');
if (w.tempMax > 95) flags.push('! HEAT');
const sky = w.code===0?'Clear':w.code<=3?'Partly cloudy':w.code<=49?'Foggy':w.code<=69?'Rain':w.code<=79?'Snow':w.code<=82?'Showers':'Storms';
return ' '+String(date).padEnd(12)
+' '+sky.padEnd(14)
+' '+Math.round(w.tempMin)+'–'+Math.round(w.tempMax)+'°F'
+' Wind '+Math.round(w.windMax||0)+'/'+Math.round(w.windGusts||0)+' mph'
+(flags.length ? ' '+flags.join(' ') : '');
}
let body = '';
body += 'GNSS SURVEY PLANNING REPORT';
if (co) body += ' — '+co;
body += '\n';
if (jn) body += jn+'\n';
body += now;
if (r.selectedDays > 1) body += ' | '+r.selectedDays+'-Day Analysis';
body += '\n'+div+'\n\n';
// Iono summary
if (r.ionoResult) {
body += 'IONOSPHERIC CONDITIONS\n'+div+'\n';
body += ' Kp Peak: '+r.ionoResult.maxKp.toFixed(1)+' | Avg: '+r.ionoResult.avgKp.toFixed(1);
if (r.ionoResult.f107) body += ' | F10.7: '+r.ionoResult.f107.toFixed(0)+' sfu';
body += '\n Status: '+r.ionoResult.label+'\n';
body += ' '+r.ionoResult.summary+'\n\n';
}
// Weather at a glance
if (r.wxData && r.wxData.daily) {
const daily = r.wxData.daily;
const numDays = Math.min(r.selectedDays || 1, daily.time.length);
body += 'WEATHER AT A GLANCE\n'+div+'\n';
for (let d = 0; d < numDays; d++) {
const dayW = buildDayWeather(r.wxData, d);
body += wxLine(dayW, daily.time[d])+'\n';
}
body += '\n';
// Drone per day
body += 'DRONE / WIND STATUS\n'+div+'\n';
for (let d = 0; d < numDays; d++) {
const dayW = buildDayWeather(r.wxData, d);
body += ' '+String(daily.time[d]).padEnd(12)+' '+droneStr(dayW)+'\n';
}
body += '\n';
}
// AI analysis
body += 'FIELD ANALYSIS\n'+div+'\n';
body += r.aiText+'\n\n';
body += div+'\n';
body += 'See attached PDF for full analysis and DOP charts.\n';
body += div+'\n\nSent via SkyGrid GNSS Planning System\n';
navigator.clipboard.writeText(body).then(() => {
const btn = document.querySelector('#auto-panel .export-btn.email');
if (btn) { const orig=btn.textContent; btn.textContent='✓ Copied!'; setTimeout(()=>btn.textContent=orig, 2500); }
}).catch(() => alert('Copy failed.\n\n'+body));
}
function exportEmailManual() {
const area=document.getElementById('manual-result-area');
if(!area||!area.innerText){alert('Generate a report first.');return;}
const company=ls('company')||'', jobname=ls('jobname')||'';
const txt=`SKYGRID GNSS SURVEY PLANNING REPORT\n======================================\nDate: ${new Date().toLocaleDateString()}\n${company?'Company: '+company+'\n':''}${jobname?'Job: '+jobname+'\n':''}\n${area.innerText}\n\n---\nGenerated by SkyGrid v2`;
navigator.clipboard.writeText(txt).catch(()=>{});
alert('Copied!');
}
// ═══════════════════════════════════════════════════════════════
// SKYGRID COUNTY OFFICE LOOKUP
// 3,050 US jurisdictions embedded — ZERO external API calls
// County detected from Nominatim address string (already available)
// ═══════════════════════════════════════════════════════════════
const COUNTY_DATA = {"Aleutians East Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Aleutians East Borough Assessor","address":"3380 C St. Suite 205, Anchorage, AK 99503"}},"Aleutians West Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Anchorage Municipality, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Anchorage Municipal Assessor","address":"632 W 6th Ave. Suite 300, Anchorage, AK 99501"}},"Bethel Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Bristol Bay Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Bristol Bay Borough Assessor","address":"P.O. Box 189, Naknek, AK 99633"}},"Chugach Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Copper River Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Denali Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Denali Borough Assessor","address":"P.O. Box 480, Healy, AK 99743"}},"Dillingham Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Fairbanks North Star Borough, AK":{"recorder":{"name":"Fairbanks Recording District (DNR)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"},"assessor":{"name":"Fairbanks North Star Borough Assessor","address":"809 Pioneer Rd., Fairbanks, AK 99701"}},"Haines Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Haines Borough Assessor","address":"103 3rd Ave. S, Haines, AK 99827"}},"Hoonah-Angoon Census Area, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"}},"Juneau City and Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Juneau Borough Assessor","address":"155 S Seward St., Juneau, AK 99801"}},"Kenai Peninsula Borough, AK":{"recorder":{"name":"Kenai Recording District (DNR)","address":"120 Trading Bay Rd. Suite 160, Kenai, AK 99611"},"assessor":{"name":"Kenai Peninsula Borough Assessor","address":"144 N Binkley St., Soldotna, AK 99669"}},"Ketchikan Gateway Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Ketchikan Gateway Borough Assessor","address":"344 Front St., Ketchikan, AK 99901"}},"Kodiak Island Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Kodiak Island Borough Assessor","address":"710 Mill Bay Rd., Kodiak, AK 99615"}},"Kusilvak Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Lake and Peninsula Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Lake and Peninsula Borough Assessor","address":"P.O. Box 495, King Salmon, AK 99613"}},"Matanuska-Susitna Borough, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Matanuska-Susitna Borough Assessor","address":"350 E Dahlia Ave., Palmer, AK 99645"}},"Nome Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"North Slope Borough, AK":{"recorder":{"name":"Fairbanks Recording District (DNR)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"},"assessor":{"name":"North Slope Borough Assessor","address":"P.O. Box 69, Barrow, AK 99723"}},"Northwest Arctic Borough, AK":{"recorder":{"name":"Fairbanks Recording District (DNR)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"},"assessor":{"name":"Northwest Arctic Borough Assessor","address":"P.O. Box 1110, Kotzebue, AK 99752"}},"Petersburg Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Petersburg Borough Assessor","address":"12 S Nordic Dr., Petersburg, AK 99833"}},"Prince of Wales-Hyder Census Area, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"}},"Sitka City and Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Sitka Borough Assessor","address":"100 Lincoln St., Sitka, AK 99835"}},"Skagway Municipality, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Skagway Municipality Assessor","address":"700 Spring St., Skagway, AK 99840"}},"Southeast Fairbanks Census Area, AK":{"recorder":{"name":"Fairbanks Recording District (DNR)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"}},"Valdez-Cordova Census Area, AK":{"recorder":{"name":"Anchorage Recording District (DNR)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"550 W 7th Ave. Suite 1260, Anchorage, AK 99501"}},"Wrangell City and Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Wrangell Borough Assessor","address":"205 Brueger St., Wrangell, AK 99929"}},"Yakutat City and Borough, AK":{"recorder":{"name":"Southeast Recording District (DNR)","address":"400 Willoughby Ave. Suite 400, Juneau, AK 99801"},"assessor":{"name":"Yakutat Borough Assessor","address":"712 Ocean Cape Rd., Yakutat, AK 99689"}},"Yukon-Koyukuk Census Area, AK":{"recorder":{"name":"Fairbanks Recording District (DNR)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"},"assessor":{"name":"Alaska State Assessment (Unorganized)","address":"1648 S Cushman St. Suite 201, Fairbanks, AK 99701"}},"Autauga County, AL":{"recorder":{"name":"Autauga County Judge of Probate","address":"176 W 5th St., Prattville, AL 36067"},"assessor":{"name":"Autauga County Tax Assessor","address":"176 W 5th St., Prattville, AL 36067"}},"Baldwin County, AL":{"recorder":{"name":"Baldwin County Judge of Probate","address":"312 Courthouse Square Suite 10, Bay Minette, AL 36507"},"assessor":{"name":"Baldwin County Tax Assessor","address":"312 Courthouse Square Suite 10, Bay Minette, AL 36507"}},"Barbour County, AL":{"recorder":{"name":"Barbour County Judge of Probate","address":"303 E Broad St., Eufaula, AL 36027"},"assessor":{"name":"Barbour County Tax Assessor","address":"303 E Broad St., Eufaula, AL 36027"}},"Bibb County, AL":{"recorder":{"name":"Bibb County Judge of Probate","address":"8 Court Square Suite A, Centreville, AL 35042"},"assessor":{"name":"Bibb County Tax Assessor","address":"8 Court Square Suite A, Centreville, AL 35042"}},"Blount County, AL":{"recorder":{"name":"Blount County Judge of Probate","address":"220 2nd Ave E Suite 106, Oneonta, AL 35121"},"assessor":{"name":"Blount County Tax Assessor","address":"220 2nd Ave E Suite 106, Oneonta, AL 35121"}},"Bullock County, AL":{"recorder":{"name":"Bullock County Judge of Probate","address":"217 N Prairie St., Union Springs, AL 36089"},"assessor":{"name":"Bullock County Tax Assessor","address":"217 N Prairie St., Union Springs, AL 36089"}},"Butler County, AL":{"recorder":{"name":"Butler County Judge of Probate","address":"700 Court Square, Greenville, AL 36037"},"assessor":{"name":"Butler County Tax Assessor","address":"700 Court Square, Greenville, AL 36037"}},"Calhoun County, AL":{"recorder":{"name":"Calhoun County Judge of Probate","address":"25 W 11th St., Anniston, AL 36201"},"assessor":{"name":"Calhoun County Tax Assessor","address":"25 W 11th St., Anniston, AL 36201"}},"Chambers County, AL":{"recorder":{"name":"Chambers County Judge of Probate","address":"2 LaFayette St., LaFayette, AL 36862"},"assessor":{"name":"Chambers County Tax Assessor","address":"2 LaFayette St., LaFayette, AL 36862"}},"Cherokee County, AL":{"recorder":{"name":"Cherokee County Judge of Probate","address":"100 Main St. Suite 1, Centre, AL 35960"},"assessor":{"name":"Cherokee County Tax Assessor","address":"100 Main St. Suite 1, Centre, AL 35960"}},"Chilton County, AL":{"recorder":{"name":"Chilton County Judge of Probate","address":"500 2nd Ave N, Clanton, AL 35045"},"assessor":{"name":"Chilton County Tax Assessor","address":"500 2nd Ave N, Clanton, AL 35045"}},"Choctaw County, AL":{"recorder":{"name":"Choctaw County Judge of Probate","address":"117 S Mulberry Ave., Butler, AL 36904"},"assessor":{"name":"Choctaw County Tax Assessor","address":"117 S Mulberry Ave., Butler, AL 36904"}},"Clarke County, AL":{"recorder":{"name":"Clarke County Judge of Probate","address":"114 Court St., Grove Hill, AL 36451"},"assessor":{"name":"Clarke County Tax Assessor","address":"114 Court St., Grove Hill, AL 36451"}},"Clay County, AL":{"recorder":{"name":"Clay County Judge of Probate","address":"1 Court Square Suite B, Ashland, AL 36251"},"assessor":{"name":"Clay County Tax Assessor","address":"1 Court Square Suite B, Ashland, AL 36251"}},"Cleburne County, AL":{"recorder":{"name":"Cleburne County Judge of Probate","address":"406 Vickery St. Suite 1, Heflin, AL 36264"},"assessor":{"name":"Cleburne County Tax Assessor","address":"406 Vickery St. Suite 1, Heflin, AL 36264"}},"Coffee County, AL":{"recorder":{"name":"Coffee County Judge of Probate","address":"230 N Court Ave., Elba, AL 36323"},"assessor":{"name":"Coffee County Tax Assessor","address":"230 N Court Ave., Elba, AL 36323"}},"Colbert County, AL":{"recorder":{"name":"Colbert County Judge of Probate","address":"201 N Main St., Tuscumbia, AL 35674"},"assessor":{"name":"Colbert County Tax Assessor","address":"201 N Main St., Tuscumbia, AL 35674"}},"Conecuh County, AL":{"recorder":{"name":"Conecuh County Judge of Probate","address":"1 Courthouse Square, Evergreen, AL 36401"},"assessor":{"name":"Conecuh County Tax Assessor","address":"1 Courthouse Square, Evergreen, AL 36401"}},"Coosa County, AL":{"recorder":{"name":"Coosa County Judge of Probate","address":"9 Court Square Suite A, Rockford, AL 35136"},"assessor":{"name":"Coosa County Tax Assessor","address":"9 Court Square Suite A, Rockford, AL 35136"}},"Covington County, AL":{"recorder":{"name":"Covington County Judge of Probate","address":"1 Court Square, Andalusia, AL 36420"},"assessor":{"name":"Covington County Tax Assessor","address":"1 Court Square, Andalusia, AL 36420"}},"Crenshaw County, AL":{"recorder":{"name":"Crenshaw County Judge of Probate","address":"29 S Glenwood Ave., Luverne, AL 36049"},"assessor":{"name":"Crenshaw County Tax Assessor","address":"29 S Glenwood Ave., Luverne, AL 36049"}},"Cullman County, AL":{"recorder":{"name":"Cullman County Judge of Probate","address":"500 2nd Ave SW Suite 102, Cullman, AL 35055"},"assessor":{"name":"Cullman County Tax Assessor","address":"500 2nd Ave SW Suite 102, Cullman, AL 35055"}},"Dale County, AL":{"recorder":{"name":"Dale County Judge of Probate","address":"100 S Main St., Ozark, AL 36360"},"assessor":{"name":"Dale County Tax Assessor","address":"100 S Main St., Ozark, AL 36360"}},"Dallas County, AL":{"recorder":{"name":"Dallas County Judge of Probate","address":"105 Lauderdale St., Selma, AL 36701"},"assessor":{"name":"Dallas County Tax Assessor","address":"105 Lauderdale St., Selma, AL 36701"}},"DeKalb County, AL":{"recorder":{"name":"DeKalb County Judge of Probate","address":"111 Grand Ave. SW Suite 1, Fort Payne, AL 35967"},"assessor":{"name":"DeKalb County Tax Assessor","address":"111 Grand Ave. SW Suite 1, Fort Payne, AL 35967"}},"Elmore County, AL":{"recorder":{"name":"Elmore County Judge of Probate","address":"100 E Commerce St., Wetumpka, AL 36092"},"assessor":{"name":"Elmore County Tax Assessor","address":"100 E Commerce St., Wetumpka, AL 36092"}},"Escambia County, AL":{"recorder":{"name":"Escambia County Judge of Probate","address":"314 Belleville Ave., Brewton, AL 36426"},"assessor":{"name":"Escambia County Tax Assessor","address":"314 Belleville Ave., Brewton, AL 36426"}},"Etowah County, AL":{"recorder":{"name":"Etowah County Judge of Probate","address":"800 Forrest Ave. Suite 203, Gadsden, AL 35901"},"assessor":{"name":"Etowah County Tax Assessor","address":"800 Forrest Ave. Suite 203, Gadsden, AL 35901"}},"Fayette County, AL":{"recorder":{"name":"Fayette County Judge of Probate","address":"113 1st Ave NW, Fayette, AL 35555"},"assessor":{"name":"Fayette County Tax Assessor","address":"113 1st Ave NW, Fayette, AL 35555"}},"Franklin County, AL":{"recorder":{"name":"Franklin County Judge of Probate","address":"410 N Jackson Ave. Suite 5, Russellville, AL 35653"},"assessor":{"name":"Franklin County Tax Assessor","address":"410 N Jackson Ave. Suite 5, Russellville, AL 35653"}},"Geneva County, AL":{"recorder":{"name":"Geneva County Judge of Probate","address":"200 N Commerce St., Geneva, AL 36340"},"assessor":{"name":"Geneva County Tax Assessor","address":"200 N Commerce St., Geneva, AL 36340"}},"Greene County, AL":{"recorder":{"name":"Greene County Judge of Probate","address":"400 Morrow Ave., Eutaw, AL 35462"},"assessor":{"name":"Greene County Tax Assessor","address":"400 Morrow Ave., Eutaw, AL 35462"}},"Hale County, AL":{"recorder":{"name":"Hale County Judge of Probate","address":"1001 Main St., Greensboro, AL 36744"},"assessor":{"name":"Hale County Tax Assessor","address":"1001 Main St., Greensboro, AL 36744"}},"Henry County, AL":{"recorder":{"name":"Henry County Judge of Probate","address":"101 Court Square Suite A, Abbeville, AL 36310"},"assessor":{"name":"Henry County Tax Assessor","address":"101 Court Square Suite A, Abbeville, AL 36310"}},"Houston County, AL":{"recorder":{"name":"Houston County Judge of Probate","address":"462 N Oates St., Dothan, AL 36303"},"assessor":{"name":"Houston County Tax Assessor","address":"462 N Oates St., Dothan, AL 36303"}},"Jackson County, AL":{"recorder":{"name":"Jackson County Judge of Probate","address":"102 E Laurel St., Scottsboro, AL 35768"},"assessor":{"name":"Jackson County Tax Assessor","address":"102 E Laurel St., Scottsboro, AL 35768"}},"Jefferson County, AL":{"recorder":{"name":"Jefferson County Judge of Probate","address":"716 N 21st St., Birmingham, AL 35203"},"assessor":{"name":"Jefferson County Tax Assessor","address":"716 N 21st St., Birmingham, AL 35203"}},"Lamar County, AL":{"recorder":{"name":"Lamar County Judge of Probate","address":"330 1st St. NE, Vernon, AL 35592"},"assessor":{"name":"Lamar County Tax Assessor","address":"330 1st St. NE, Vernon, AL 35592"}},"Lauderdale County, AL":{"recorder":{"name":"Lauderdale County Judge of Probate","address":"200 S Court St., Florence, AL 35630"},"assessor":{"name":"Lauderdale County Tax Assessor","address":"200 S Court St., Florence, AL 35630"}},"Lawrence County, AL":{"recorder":{"name":"Lawrence County Judge of Probate","address":"14001 Market St. Suite B, Moulton, AL 35650"},"assessor":{"name":"Lawrence County Tax Assessor","address":"14001 Market St. Suite B, Moulton, AL 35650"}},"Lee County, AL":{"recorder":{"name":"Lee County Judge of Probate","address":"215 S 9th St., Opelika, AL 36801"},"assessor":{"name":"Lee County Tax Assessor","address":"215 S 9th St., Opelika, AL 36801"}},"Limestone County, AL":{"recorder":{"name":"Limestone County Judge of Probate","address":"200 W Washington St. Suite 2, Athens, AL 35611"},"assessor":{"name":"Limestone County Tax Assessor","address":"200 W Washington St. Suite 2, Athens, AL 35611"}},"Lowndes County, AL":{"recorder":{"name":"Lowndes County Judge of Probate","address":"1 Courthouse Square, Hayneville, AL 36040"},"assessor":{"name":"Lowndes County Tax Assessor","address":"1 Courthouse Square, Hayneville, AL 36040"}},"Macon County, AL":{"recorder":{"name":"Macon County Judge of Probate","address":"101 E Rosa Parks Ave., Tuskegee, AL 36083"},"assessor":{"name":"Macon County Tax Assessor","address":"101 E Rosa Parks Ave., Tuskegee, AL 36083"}},"Madison County, AL":{"recorder":{"name":"Madison County Judge of Probate","address":"100 Northside Square Suite 542, Huntsville, AL 35801"},"assessor":{"name":"Madison County Tax Assessor","address":"100 Northside Square Suite 136, Huntsville, AL 35801"}},"Marengo County, AL":{"recorder":{"name":"Marengo County Judge of Probate","address":"101 E Coats Ave., Linden, AL 36748"},"assessor":{"name":"Marengo County Tax Assessor","address":"101 E Coats Ave., Linden, AL 36748"}},"Marion County, AL":{"recorder":{"name":"Marion County Judge of Probate","address":"132 Military St. S, Hamilton, AL 35570"},"assessor":{"name":"Marion County Tax Assessor","address":"132 Military St. S, Hamilton, AL 35570"}},"Marshall County, AL":{"recorder":{"name":"Marshall County Judge of Probate","address":"425 Gunter Ave., Guntersville, AL 35976"},"assessor":{"name":"Marshall County Tax Assessor","address":"425 Gunter Ave., Guntersville, AL 35976"}},"Mobile County, AL":{"recorder":{"name":"Mobile County Judge of Probate","address":"205 Government St. Room S-11, Mobile, AL 36644"},"assessor":{"name":"Mobile County Tax Assessor","address":"3925 Michael Blvd. Suite G, Mobile, AL 36609"}},"Monroe County, AL":{"recorder":{"name":"Monroe County Judge of Probate","address":"65 N Alabama Ave., Monroeville, AL 36460"},"assessor":{"name":"Monroe County Tax Assessor","address":"65 N Alabama Ave., Monroeville, AL 36460"}},"Montgomery County, AL":{"recorder":{"name":"Montgomery County Judge of Probate","address":"100 S Lawrence St., Montgomery, AL 36104"},"assessor":{"name":"Montgomery County Tax Assessor","address":"100 S Lawrence St., Montgomery, AL 36104"}},"Morgan County, AL":{"recorder":{"name":"Morgan County Judge of Probate","address":"302 Lee St. NE Suite 100, Decatur, AL 35601"},"assessor":{"name":"Morgan County Tax Assessor","address":"302 Lee St. NE Suite 100, Decatur, AL 35601"}},"Perry County, AL":{"recorder":{"name":"Perry County Judge of Probate","address":"300 Washington St., Marion, AL 36756"},"assessor":{"name":"Perry County Tax Assessor","address":"300 Washington St., Marion, AL 36756"}},"Pickens County, AL":{"recorder":{"name":"Pickens County Judge of Probate","address":"1 Courthouse Square, Carrollton, AL 35447"},"assessor":{"name":"Pickens County Tax Assessor","address":"1 Courthouse Square, Carrollton, AL 35447"}},"Pike County, AL":{"recorder":{"name":"Pike County Judge of Probate","address":"120 W Church St. Suite 41, Troy, AL 36081"},"assessor":{"name":"Pike County Tax Assessor","address":"120 W Church St. Suite 41, Troy, AL 36081"}},"Randolph County, AL":{"recorder":{"name":"Randolph County Judge of Probate","address":"1 Main St., Wedowee, AL 36278"},"assessor":{"name":"Randolph County Tax Assessor","address":"1 Main St., Wedowee, AL 36278"}},"Russell County, AL":{"recorder":{"name":"Russell County Judge of Probate","address":"501 14th St., Phenix City, AL 36867"},"assessor":{"name":"Russell County Tax Assessor","address":"501 14th St., Phenix City, AL 36867"}},"St. Clair County, AL":{"recorder":{"name":"St. Clair County Judge of Probate","address":"1815 Cogswell Ave. Suite 210, Pell City, AL 35125"},"assessor":{"name":"St. Clair County Tax Assessor","address":"1815 Cogswell Ave. Suite 210, Pell City, AL 35125"}},"Shelby County, AL":{"recorder":{"name":"Shelby County Judge of Probate","address":"112 N Main St., Columbiana, AL 35051"},"assessor":{"name":"Shelby County Tax Assessor","address":"112 N Main St., Columbiana, AL 35051"}},"Sumter County, AL":{"recorder":{"name":"Sumter County Judge of Probate","address":"Franklin St., Livingston, AL 35470"},"assessor":{"name":"Sumter County Tax Assessor","address":"Franklin St., Livingston, AL 35470"}},"Talladega County, AL":{"recorder":{"name":"Talladega County Judge of Probate","address":"315 W Oak St. Suite 1, Talladega, AL 35160"},"assessor":{"name":"Talladega County Tax Assessor","address":"315 W Oak St. Suite 1, Talladega, AL 35160"}},"Tallapoosa County, AL":{"recorder":{"name":"Tallapoosa County Judge of Probate","address":"125 N Broadnax St. Suite 105, Dadeville, AL 36853"},"assessor":{"name":"Tallapoosa County Tax Assessor","address":"125 N Broadnax St. Suite 105, Dadeville, AL 36853"}},"Tuscaloosa County, AL":{"recorder":{"name":"Tuscaloosa County Judge of Probate","address":"714 Greensboro Ave., Tuscaloosa, AL 35401"},"assessor":{"name":"Tuscaloosa County Tax Assessor","address":"714 Greensboro Ave., Tuscaloosa, AL 35401"}},"Walker County, AL":{"recorder":{"name":"Walker County Judge of Probate","address":"1803 3rd Ave., Jasper, AL 35501"},"assessor":{"name":"Walker County Tax Assessor","address":"1803 3rd Ave., Jasper, AL 35501"}},"Washington County, AL":{"recorder":{"name":"Washington County Judge of Probate","address":"101 Court St., Chatom, AL 36518"},"assessor":{"name":"Washington County Tax Assessor","address":"101 Court St., Chatom, AL 36518"}},"Wilcox County, AL":{"recorder":{"name":"Wilcox County Judge of Probate","address":"100 Broad St., Camden, AL 36726"},"assessor":{"name":"Wilcox County Tax Assessor","address":"100 Broad St., Camden, AL 36726"}},"Winston County, AL":{"recorder":{"name":"Winston County Judge of Probate","address":"Double Springs, AL 35553"},"assessor":{"name":"Winston County Tax Assessor","address":"Double Springs, AL 35553"}},"Arkansas County, AR":{"recorder":{"name":"Arkansas County Circuit Clerk","address":"101 Court Square, DeWitt, AR 72042"},"assessor":{"name":"Arkansas County Assessor","address":"101 Court Square, DeWitt, AR 72042"}},"Ashley County, AR":{"recorder":{"name":"Ashley County Circuit Clerk","address":"205 E Jefferson St., Hamburg, AR 71646"},"assessor":{"name":"Ashley County Assessor","address":"205 E Jefferson St., Hamburg, AR 71646"}},"Baxter County, AR":{"recorder":{"name":"Baxter County Circuit Clerk","address":"1 E 7th St., Mountain Home, AR 72653"},"assessor":{"name":"Baxter County Assessor","address":"1 E 7th St., Mountain Home, AR 72653"}},"Benton County, AR":{"recorder":{"name":"Benton County Circuit Clerk","address":"215 E Central Ave., Bentonville, AR 72712"},"assessor":{"name":"Benton County Assessor","address":"215 E Central Ave., Bentonville, AR 72712"}},"Boone County, AR":{"recorder":{"name":"Boone County Circuit Clerk","address":"100 N Main St., Harrison, AR 72601"},"assessor":{"name":"Boone County Assessor","address":"100 N Main St., Harrison, AR 72601"}},"Bradley County, AR":{"recorder":{"name":"Bradley County Circuit Clerk","address":"101 E Cedar St., Warren, AR 71671"},"assessor":{"name":"Bradley County Assessor","address":"101 E Cedar St., Warren, AR 71671"}},"Calhoun County, AR":{"recorder":{"name":"Calhoun County Circuit Clerk","address":"250 Pine St. Suite 4, Hampton, AR 71744"},"assessor":{"name":"Calhoun County Assessor","address":"250 Pine St. Suite 4, Hampton, AR 71744"}},"Carroll County, AR":{"recorder":{"name":"Carroll County Circuit Clerk","address":"210 W Church Ave., Berryville, AR 72616"},"assessor":{"name":"Carroll County Assessor","address":"210 W Church Ave., Berryville, AR 72616"}},"Chicot County, AR":{"recorder":{"name":"Chicot County Circuit Clerk","address":"108 Main St., Lake Village, AR 71653"},"assessor":{"name":"Chicot County Assessor","address":"108 Main St., Lake Village, AR 71653"}},"Clark County, AR":{"recorder":{"name":"Clark County Circuit Clerk","address":"401 Clay St., Arkadelphia, AR 71923"},"assessor":{"name":"Clark County Assessor","address":"401 Clay St., Arkadelphia, AR 71923"}},"Clay County, AR":{"recorder":{"name":"Clay County Circuit Clerk","address":"151 S Second St., Piggott, AR 72454"},"assessor":{"name":"Clay County Assessor","address":"151 S Second St., Piggott, AR 72454"}},"Cleburne County, AR":{"recorder":{"name":"Cleburne County Circuit Clerk","address":"301 W Main St., Heber Springs, AR 72543"},"assessor":{"name":"Cleburne County Assessor","address":"301 W Main St., Heber Springs, AR 72543"}},"Cleveland County, AR":{"recorder":{"name":"Cleveland County Circuit Clerk","address":"100 Courthouse Square, Rison, AR 71665"},"assessor":{"name":"Cleveland County Assessor","address":"100 Courthouse Square, Rison, AR 71665"}},"Columbia County, AR":{"recorder":{"name":"Columbia County Circuit Clerk","address":"1 Court Square Suite 1, Magnolia, AR 71753"},"assessor":{"name":"Columbia County Assessor","address":"1 Court Square Suite 1, Magnolia, AR 71753"}},"Conway County, AR":{"recorder":{"name":"Conway County Circuit Clerk","address":"117 S Moose St., Morrilton, AR 72110"},"assessor":{"name":"Conway County Assessor","address":"117 S Moose St., Morrilton, AR 72110"}},"Craighead County, AR":{"recorder":{"name":"Craighead County Circuit Clerk","address":"511 Union St., Jonesboro, AR 72401"},"assessor":{"name":"Craighead County Assessor","address":"511 Union St., Jonesboro, AR 72401"}},"Crawford County, AR":{"recorder":{"name":"Crawford County Circuit Clerk","address":"300 Main St., Van Buren, AR 72956"},"assessor":{"name":"Crawford County Assessor","address":"300 Main St., Van Buren, AR 72956"}},"Crittenden County, AR":{"recorder":{"name":"Crittenden County Circuit Clerk","address":"100 Court St., Marion, AR 72364"},"assessor":{"name":"Crittenden County Assessor","address":"100 Court St., Marion, AR 72364"}},"Cross County, AR":{"recorder":{"name":"Cross County Circuit Clerk","address":"705 Union Ave E, Wynne, AR 72396"},"assessor":{"name":"Cross County Assessor","address":"705 Union Ave E, Wynne, AR 72396"}},"Dallas County, AR":{"recorder":{"name":"Dallas County Circuit Clerk","address":"206 W 3rd St., Fordyce, AR 71742"},"assessor":{"name":"Dallas County Assessor","address":"206 W 3rd St., Fordyce, AR 71742"}},"Desha County, AR":{"recorder":{"name":"Desha County Circuit Clerk","address":"302 S Main St., Arkansas City, AR 71630"},"assessor":{"name":"Desha County Assessor","address":"302 S Main St., Arkansas City, AR 71630"}},"Drew County, AR":{"recorder":{"name":"Drew County Circuit Clerk","address":"210 S Main St., Monticello, AR 71655"},"assessor":{"name":"Drew County Assessor","address":"210 S Main St., Monticello, AR 71655"}},"Faulkner County, AR":{"recorder":{"name":"Faulkner County Circuit Clerk","address":"801 Locust St., Conway, AR 72034"},"assessor":{"name":"Faulkner County Assessor","address":"801 Locust St., Conway, AR 72034"}},"Franklin County, AR":{"recorder":{"name":"Franklin County Circuit Clerk","address":"211 W Commercial St., Ozark, AR 72949"},"assessor":{"name":"Franklin County Assessor","address":"211 W Commercial St., Ozark, AR 72949"}},"Fulton County, AR":{"recorder":{"name":"Fulton County Circuit Clerk","address":"Box 485, Salem, AR 72576"},"assessor":{"name":"Fulton County Assessor","address":"Salem, AR 72576"}},"Garland County, AR":{"recorder":{"name":"Garland County Circuit Clerk","address":"501 Ouachita Ave., Hot Springs, AR 71901"},"assessor":{"name":"Garland County Assessor","address":"501 Ouachita Ave., Hot Springs, AR 71901"}},"Grant County, AR":{"recorder":{"name":"Grant County Circuit Clerk","address":"101 W Center St., Sheridan, AR 72150"},"assessor":{"name":"Grant County Assessor","address":"101 W Center St., Sheridan, AR 72150"}},"Greene County, AR":{"recorder":{"name":"Greene County Circuit Clerk","address":"320 W Court St., Paragould, AR 72450"},"assessor":{"name":"Greene County Assessor","address":"320 W Court St., Paragould, AR 72450"}},"Hempstead County, AR":{"recorder":{"name":"Hempstead County Circuit Clerk","address":"400 S Washington St., Hope, AR 71801"},"assessor":{"name":"Hempstead County Assessor","address":"400 S Washington St., Hope, AR 71801"}},"Hot Spring County, AR":{"recorder":{"name":"Hot Spring County Circuit Clerk","address":"210 Locust St., Malvern, AR 72104"},"assessor":{"name":"Hot Spring County Assessor","address":"210 Locust St., Malvern, AR 72104"}},"Howard County, AR":{"recorder":{"name":"Howard County Circuit Clerk","address":"421 N Main St., Nashville, AR 71852"},"assessor":{"name":"Howard County Assessor","address":"421 N Main St., Nashville, AR 71852"}},"Independence County, AR":{"recorder":{"name":"Independence County Circuit Clerk","address":"192 E Main St., Batesville, AR 72501"},"assessor":{"name":"Independence County Assessor","address":"192 E Main St., Batesville, AR 72501"}},"Izard County, AR":{"recorder":{"name":"Izard County Circuit Clerk","address":"1 E Front St., Melbourne, AR 72556"},"assessor":{"name":"Izard County Assessor","address":"1 E Front St., Melbourne, AR 72556"}},"Jackson County, AR":{"recorder":{"name":"Jackson County Circuit Clerk","address":"208 Main St., Newport, AR 72112"},"assessor":{"name":"Jackson County Assessor","address":"208 Main St., Newport, AR 72112"}},"Jefferson County, AR":{"recorder":{"name":"Jefferson County Circuit Clerk","address":"101 W Barraque St., Pine Bluff, AR 71601"},"assessor":{"name":"Jefferson County Assessor","address":"101 W Barraque St., Pine Bluff, AR 71601"}},"Johnson County, AR":{"recorder":{"name":"Johnson County Circuit Clerk","address":"215 W Main St., Clarksville, AR 72830"},"assessor":{"name":"Johnson County Assessor","address":"215 W Main St., Clarksville, AR 72830"}},"Lafayette County, AR":{"recorder":{"name":"Lafayette County Circuit Clerk","address":"2 Courthouse Square, Lewisville, AR 71845"},"assessor":{"name":"Lafayette County Assessor","address":"2 Courthouse Square, Lewisville, AR 71845"}},"Lawrence County, AR":{"recorder":{"name":"Lawrence County Circuit Clerk","address":"315 W Main St., Walnut Ridge, AR 72476"},"assessor":{"name":"Lawrence County Assessor","address":"315 W Main St., Walnut Ridge, AR 72476"}},"Lee County, AR":{"recorder":{"name":"Lee County Circuit Clerk","address":"15 E Chestnut St., Marianna, AR 72360"},"assessor":{"name":"Lee County Assessor","address":"15 E Chestnut St., Marianna, AR 72360"}},"Lincoln County, AR":{"recorder":{"name":"Lincoln County Circuit Clerk","address":"300 S Drew St., Star City, AR 71667"},"assessor":{"name":"Lincoln County Assessor","address":"300 S Drew St., Star City, AR 71667"}},"Little River County, AR":{"recorder":{"name":"Little River County Circuit Clerk","address":"351 N 2nd St., Ashdown, AR 71822"},"assessor":{"name":"Little River County Assessor","address":"351 N 2nd St., Ashdown, AR 71822"}},"Logan County, AR":{"recorder":{"name":"Logan County Circuit Clerk","address":"25 W Walnut St., Paris, AR 72855"},"assessor":{"name":"Logan County Assessor","address":"25 W Walnut St., Paris, AR 72855"}},"Lonoke County, AR":{"recorder":{"name":"Lonoke County Circuit Clerk","address":"301 N Center St., Lonoke, AR 72086"},"assessor":{"name":"Lonoke County Assessor","address":"301 N Center St., Lonoke, AR 72086"}},"Madison County, AR":{"recorder":{"name":"Madison County Circuit Clerk","address":"201 W Main St., Huntsville, AR 72740"},"assessor":{"name":"Madison County Assessor","address":"201 W Main St., Huntsville, AR 72740"}},"Marion County, AR":{"recorder":{"name":"Marion County Circuit Clerk","address":"310 E Old Main St., Yellville, AR 72687"},"assessor":{"name":"Marion County Assessor","address":"310 E Old Main St., Yellville, AR 72687"}},"Miller County, AR":{"recorder":{"name":"Miller County Circuit Clerk","address":"400 Laurel St., Texarkana, AR 71854"},"assessor":{"name":"Miller County Assessor","address":"400 Laurel St., Texarkana, AR 71854"}},"Mississippi County, AR":{"recorder":{"name":"Mississippi County Circuit Clerk","address":"200 W Walnut St., Blytheville, AR 72315"},"assessor":{"name":"Mississippi County Assessor","address":"200 W Walnut St., Blytheville, AR 72315"}},"Monroe County, AR":{"recorder":{"name":"Monroe County Circuit Clerk","address":"123 Madison St., Clarendon, AR 72029"},"assessor":{"name":"Monroe County Assessor","address":"123 Madison St., Clarendon, AR 72029"}},"Montgomery County, AR":{"recorder":{"name":"Montgomery County Circuit Clerk","address":"105 Hwy 270 E, Mount Ida, AR 71957"},"assessor":{"name":"Montgomery County Assessor","address":"105 Hwy 270 E, Mount Ida, AR 71957"}},"Nevada County, AR":{"recorder":{"name":"Nevada County Circuit Clerk","address":"215 E 2nd St. N, Prescott, AR 71857"},"assessor":{"name":"Nevada County Assessor","address":"215 E 2nd St. N, Prescott, AR 71857"}},"Newton County, AR":{"recorder":{"name":"Newton County Circuit Clerk","address":"100 E Court St., Jasper, AR 72641"},"assessor":{"name":"Newton County Assessor","address":"100 E Court St., Jasper, AR 72641"}},"Ouachita County, AR":{"recorder":{"name":"Ouachita County Circuit Clerk","address":"145 Jefferson St. SW, Camden, AR 71701"},"assessor":{"name":"Ouachita County Assessor","address":"145 Jefferson St. SW, Camden, AR 71701"}},"Perry County, AR":{"recorder":{"name":"Perry County Circuit Clerk","address":"310 W Main St., Perryville, AR 72126"},"assessor":{"name":"Perry County Assessor","address":"310 W Main St., Perryville, AR 72126"}},"Phillips County, AR":{"recorder":{"name":"Phillips County Circuit Clerk","address":"620 Cherry St., Helena, AR 72342"},"assessor":{"name":"Phillips County Assessor","address":"620 Cherry St., Helena, AR 72342"}},"Pike County, AR":{"recorder":{"name":"Pike County Circuit Clerk","address":"100 State Hwy 195 S, Murfreesboro, AR 71958"},"assessor":{"name":"Pike County Assessor","address":"100 State Hwy 195 S, Murfreesboro, AR 71958"}},"Poinsett County, AR":{"recorder":{"name":"Poinsett County Circuit Clerk","address":"401 Market St., Harrisburg, AR 72432"},"assessor":{"name":"Poinsett County Assessor","address":"401 Market St., Harrisburg, AR 72432"}},"Polk County, AR":{"recorder":{"name":"Polk County Circuit Clerk","address":"507 Church Ave., Mena, AR 71953"},"assessor":{"name":"Polk County Assessor","address":"507 Church Ave., Mena, AR 71953"}},"Pope County, AR":{"recorder":{"name":"Pope County Circuit Clerk","address":"100 W Main St., Russellville, AR 72801"},"assessor":{"name":"Pope County Assessor","address":"100 W Main St., Russellville, AR 72801"}},"Prairie County, AR":{"recorder":{"name":"Prairie County Circuit Clerk","address":"200 Court St., Des Arc, AR 72040"},"assessor":{"name":"Prairie County Assessor","address":"200 Court St., Des Arc, AR 72040"}},"Pulaski County, AR":{"recorder":{"name":"Pulaski County Circuit Clerk","address":"401 W Markham St., Little Rock, AR 72201"},"assessor":{"name":"Pulaski County Assessor","address":"201 S Broadway Suite 310, Little Rock, AR 72201"}},"Randolph County, AR":{"recorder":{"name":"Randolph County Circuit Clerk","address":"107 W Broadway St., Pocahontas, AR 72455"},"assessor":{"name":"Randolph County Assessor","address":"107 W Broadway St., Pocahontas, AR 72455"}},"Saline County, AR":{"recorder":{"name":"Saline County Circuit Clerk","address":"200 N Main St., Benton, AR 72015"},"assessor":{"name":"Saline County Assessor","address":"200 N Main St., Benton, AR 72015"}},"Scott County, AR":{"recorder":{"name":"Scott County Circuit Clerk","address":"190 W 1st St., Waldron, AR 72958"},"assessor":{"name":"Scott County Assessor","address":"190 W 1st St., Waldron, AR 72958"}},"Searcy County, AR":{"recorder":{"name":"Searcy County Circuit Clerk","address":"George St., Marshall, AR 72650"},"assessor":{"name":"Searcy County Assessor","address":"George St., Marshall, AR 72650"}},"Sebastian County, AR":{"recorder":{"name":"Sebastian County Circuit Clerk","address":"35 S 6th St., Fort Smith, AR 72901"},"assessor":{"name":"Sebastian County Assessor","address":"35 S 6th St., Fort Smith, AR 72901"}},"Sevier County, AR":{"recorder":{"name":"Sevier County Circuit Clerk","address":"115 N 3rd St., De Queen, AR 71832"},"assessor":{"name":"Sevier County Assessor","address":"115 N 3rd St., De Queen, AR 71832"}},"Sharp County, AR":{"recorder":{"name":"Sharp County Circuit Clerk","address":"718 Ash Flat Dr., Ash Flat, AR 72513"},"assessor":{"name":"Sharp County Assessor","address":"718 Ash Flat Dr., Ash Flat, AR 72513"}},"St. Francis County, AR":{"recorder":{"name":"St. Francis County Circuit Clerk","address":"313 S Izard St., Forrest City, AR 72335"},"assessor":{"name":"St. Francis County Assessor","address":"313 S Izard St., Forrest City, AR 72335"}},"Stone County, AR":{"recorder":{"name":"Stone County Circuit Clerk","address":"107 W Main St., Mountain View, AR 72560"},"assessor":{"name":"Stone County Assessor","address":"107 W Main St., Mountain View, AR 72560"}},"Union County, AR":{"recorder":{"name":"Union County Circuit Clerk","address":"101 N Washington St., El Dorado, AR 71730"},"assessor":{"name":"Union County Assessor","address":"101 N Washington St., El Dorado, AR 71730"}},"Van Buren County, AR":{"recorder":{"name":"Van Buren County Circuit Clerk","address":"6 Court Square, Clinton, AR 72031"},"assessor":{"name":"Van Buren County Assessor","address":"6 Court Square, Clinton, AR 72031"}},"Washington County, AR":{"recorder":{"name":"Washington County Circuit Clerk","address":"280 N College Ave., Fayetteville, AR 72701"},"assessor":{"name":"Washington County Assessor","address":"280 N College Ave., Fayetteville, AR 72701"}},"White County, AR":{"recorder":{"name":"White County Circuit Clerk","address":"300 N Spruce St., Searcy, AR 72143"},"assessor":{"name":"White County Assessor","address":"300 N Spruce St., Searcy, AR 72143"}},"Woodruff County, AR":{"recorder":{"name":"Woodruff County Circuit Clerk","address":"500 N 3rd St., Augusta, AR 72006"},"assessor":{"name":"Woodruff County Assessor","address":"500 N 3rd St., Augusta, AR 72006"}},"Yell County, AR":{"recorder":{"name":"Yell County Circuit Clerk","address":"101 Courthouse Square, Danville, AR 72833"},"assessor":{"name":"Yell County Assessor","address":"101 Courthouse Square, Danville, AR 72833"}},"Apache County, AZ":{"recorder":{"name":"Apache County Recorder","address":"75 W Cleveland St., St. Johns, AZ 85936"},"assessor":{"name":"Apache County Assessor","address":"75 W Cleveland St., St. Johns, AZ 85936"}},"Cochise County, AZ":{"recorder":{"name":"Cochise County Recorder","address":"1415 W Melody Lane Bldg. B, Bisbee, AZ 85603"},"assessor":{"name":"Cochise County Assessor","address":"1415 W Melody Lane Bldg. A, Bisbee, AZ 85603"}},"Coconino County, AZ":{"recorder":{"name":"Coconino County Recorder","address":"110 E Cherry Ave., Flagstaff, AZ 86001"},"assessor":{"name":"Coconino County Assessor","address":"110 E Cherry Ave., Flagstaff, AZ 86001"}},"Gila County, AZ":{"recorder":{"name":"Gila County Recorder","address":"1400 E Ash St., Globe, AZ 85501"},"assessor":{"name":"Gila County Assessor","address":"1400 E Ash St., Globe, AZ 85501"}},"Graham County, AZ":{"recorder":{"name":"Graham County Recorder","address":"921 Thatcher Blvd., Safford, AZ 85546"},"assessor":{"name":"Graham County Assessor","address":"921 Thatcher Blvd., Safford, AZ 85546"}},"Greenlee County, AZ":{"recorder":{"name":"Greenlee County Recorder","address":"253 5th St., Clifton, AZ 85533"},"assessor":{"name":"Greenlee County Assessor","address":"253 5th St., Clifton, AZ 85533"}},"La Paz County, AZ":{"recorder":{"name":"La Paz County Recorder","address":"1112 Joshua Ave. Suite 201, Parker, AZ 85344"},"assessor":{"name":"La Paz County Assessor","address":"1112 Joshua Ave., Parker, AZ 85344"}},"Maricopa County, AZ":{"recorder":{"name":"Maricopa County Recorder","address":"111 S 3rd Ave Suite 103, Phoenix, AZ 85003"},"assessor":{"name":"Maricopa County Assessor","address":"301 W Jefferson St., Phoenix, AZ 85003"}},"Mohave County, AZ":{"recorder":{"name":"Mohave County Recorder","address":"700 W Beale St., Kingman, AZ 86401"},"assessor":{"name":"Mohave County Assessor","address":"700 W Beale St., Kingman, AZ 86401"}},"Navajo County, AZ":{"recorder":{"name":"Navajo County Recorder","address":"100 E Code Talkers Dr., Holbrook, AZ 86025"},"assessor":{"name":"Navajo County Assessor","address":"100 E Code Talkers Dr., Holbrook, AZ 86025"}},"Pima County, AZ":{"recorder":{"name":"Pima County Recorder","address":"240 N Stone Ave., Tucson, AZ 85701"},"assessor":{"name":"Pima County Assessor","address":"240 N Stone Ave., Tucson, AZ 85701"}},"Pinal County, AZ":{"recorder":{"name":"Pinal County Recorder","address":"31 N Pinal St. Bldg. E, Florence, AZ 85132"},"assessor":{"name":"Pinal County Assessor","address":"31 N Pinal St., Florence, AZ 85132"}},"Santa Cruz County, AZ":{"recorder":{"name":"Santa Cruz County Recorder","address":"2150 N Congress Dr., Nogales, AZ 85621"},"assessor":{"name":"Santa Cruz County Assessor","address":"2150 N Congress Dr., Nogales, AZ 85621"}},"Yavapai County, AZ":{"recorder":{"name":"Yavapai County Recorder","address":"1015 Fair St. Room 228, Prescott, AZ 86305"},"assessor":{"name":"Yavapai County Assessor","address":"1015 Fair St., Prescott, AZ 86305"}},"Yuma County, AZ":{"recorder":{"name":"Yuma County Recorder","address":"410 S Maiden Lane Suite B, Yuma, AZ 85364"},"assessor":{"name":"Yuma County Assessor","address":"410 S Maiden Lane, Yuma, AZ 85364"}},"Alameda County, CA":{"recorder":{"name":"Alameda County Clerk-Recorder","address":"1106 Madison St, Oakland, CA 94607"},"assessor":{"name":"Alameda County Assessor","address":"1221 Oak St, Oakland, CA 94612"}},"Alpine County, CA":{"recorder":{"name":"Alpine County Assessor-Recorder","address":"99 Water St, Markleeville, CA 96120"},"assessor":{"name":"Alpine County Assessor","address":"99 Water St, Markleeville, CA 96120"}},"Amador County, CA":{"recorder":{"name":"Amador County Clerk-Recorder","address":"810 Court St, Jackson, CA 95642"},"assessor":{"name":"Amador County Assessor","address":"810 Court St, Jackson, CA 95642"}},"Butte County, CA":{"recorder":{"name":"Butte County Clerk-Recorder","address":"155 Nelson Ave, Oroville, CA 95965"},"assessor":{"name":"Butte County Assessor","address":"25 County Center Dr, Oroville, CA 95965"}},"Calaveras County, CA":{"recorder":{"name":"Calaveras County Clerk-Recorder","address":"891 Mountain Ranch Rd, San Andreas, CA 95249"},"assessor":{"name":"Calaveras County Assessor","address":"891 Mountain Ranch Rd, San Andreas, CA 95249"}},"Colusa County, CA":{"recorder":{"name":"Colusa County Clerk-Recorder","address":"546 Jay St, Colusa, CA 95932"},"assessor":{"name":"Colusa County Assessor","address":"546 Jay St, Colusa, CA 95932"}},"Contra Costa County, CA":{"recorder":{"name":"Contra Costa County Clerk-Recorder","address":"555 Escobar St, Martinez, CA 94553"},"assessor":{"name":"Contra Costa County Assessor","address":"2530 Arnold Dr, Martinez, CA 94553"}},"Del Norte County, CA":{"recorder":{"name":"Del Norte County Clerk-Recorder","address":"981 H St, Crescent City, CA 95531"},"assessor":{"name":"Del Norte County Assessor","address":"981 H St, Crescent City, CA 95531"}},"El Dorado County, CA":{"recorder":{"name":"El Dorado County Clerk-Recorder","address":"360 Fair Ln, Placerville, CA 95667"},"assessor":{"name":"El Dorado County Assessor","address":"360 Fair Ln, Placerville, CA 95667"}},"Fresno County, CA":{"recorder":{"name":"Fresno County Assessor-Recorder","address":"2281 Tulare St, Fresno, CA 93721"},"assessor":{"name":"Fresno County Assessor","address":"2281 Tulare St, Fresno, CA 93721"}},"Glenn County, CA":{"recorder":{"name":"Glenn County Clerk-Recorder","address":"516 W Sycamore St, Willows, CA 95988"},"assessor":{"name":"Glenn County Assessor","address":"516 W Sycamore St, Willows, CA 95988"}},"Humboldt County, CA":{"recorder":{"name":"Humboldt County Clerk-Recorder","address":"825 Fifth St, Eureka, CA 95501"},"assessor":{"name":"Humboldt County Assessor","address":"825 Fifth St, Eureka, CA 95501"}},"Imperial County, CA":{"recorder":{"name":"Imperial County Clerk-Recorder","address":"940 Main St, El Centro, CA 92243"},"assessor":{"name":"Imperial County Assessor","address":"940 Main St, El Centro, CA 92243"}},"Inyo County, CA":{"recorder":{"name":"Inyo County Clerk-Recorder","address":"168 N Edwards St, Independence, CA 93526"},"assessor":{"name":"Inyo County Assessor","address":"168 N Edwards St, Independence, CA 93526"}},"Kern County, CA":{"recorder":{"name":"Kern County Assessor-Recorder","address":"1115 Truxtun Ave, Bakersfield, CA 93301"},"assessor":{"name":"Kern County Assessor","address":"1115 Truxtun Ave, Bakersfield, CA 93301"}},"Kings County, CA":{"recorder":{"name":"Kings County Assessor-Clerk-Recorder","address":"1400 W Lacey Blvd, Hanford, CA 93230"},"assessor":{"name":"Kings County Assessor","address":"1400 W Lacey Blvd, Hanford, CA 93230"}},"Lake County, CA":{"recorder":{"name":"Lake County Assessor-Recorder","address":"255 N Forbes St, Lakeport, CA 95453"},"assessor":{"name":"Lake County Assessor","address":"255 N Forbes St, Lakeport, CA 95453"}},"Lassen County, CA":{"recorder":{"name":"Lassen County Clerk-Recorder","address":"220 S Lassen St, Susanville, CA 96130"},"assessor":{"name":"Lassen County Assessor","address":"220 S Lassen St, Susanville, CA 96130"}},"Los Angeles County, CA":{"recorder":{"name":"LA County Registrar-Recorder","address":"12400 Imperial Hwy, Norwalk, CA 90650"},"assessor":{"name":"LA County Assessor","address":"500 W Temple St, Los Angeles, CA 90012"}},"Madera County, CA":{"recorder":{"name":"Madera County Clerk-Recorder","address":"200 W Fourth St, Madera, CA 93637"},"assessor":{"name":"Madera County Assessor","address":"200 W Fourth St, Madera, CA 93637"}},"Marin County, CA":{"recorder":{"name":"Marin County Assessor-Recorder","address":"3501 Civic Center Dr, San Rafael, CA 94903"},"assessor":{"name":"Marin County Assessor","address":"3501 Civic Center Dr, San Rafael, CA 94903"}},"Mariposa County, CA":{"recorder":{"name":"Mariposa County Assessor-Recorder","address":"4982 10th St, Mariposa, CA 95338"},"assessor":{"name":"Mariposa County Assessor","address":"4982 10th St, Mariposa, CA 95338"}},"Mendocino County, CA":{"recorder":{"name":"Mendocino County Clerk-Recorder","address":"501 Low Gap Rd, Ukiah, CA 95482"},"assessor":{"name":"Mendocino County Assessor","address":"501 Low Gap Rd, Ukiah, CA 95482"}},"Merced County, CA":{"recorder":{"name":"Merced County Assessor-Clerk-Recorder","address":"2222 M St, Merced, CA 95340"},"assessor":{"name":"Merced County Assessor","address":"2222 M St, Merced, CA 95340"}},"Modoc County, CA":{"recorder":{"name":"Modoc County Assessor-Recorder","address":"204 S Court St, Alturas, CA 96101"},"assessor":{"name":"Modoc County Assessor","address":"204 S Court St, Alturas, CA 96101"}},"Mono County, CA":{"recorder":{"name":"Mono County Clerk-Recorder","address":"74 N School St, Bridgeport, CA 93517"},"assessor":{"name":"Mono County Assessor","address":"74 N School St, Bridgeport, CA 93517"}},"Monterey County, CA":{"recorder":{"name":"Monterey County Recorder","address":"168 W Alisal St, Salinas, CA 93901"},"assessor":{"name":"Monterey County Assessor","address":"168 W Alisal St, Salinas, CA 93901"}},"Napa County, CA":{"recorder":{"name":"Napa County Recorder-Clerk","address":"1127 First St, Napa, CA 94559"},"assessor":{"name":"Napa County Assessor","address":"1127 First St, Napa, CA 94559"}},"Nevada County, CA":{"recorder":{"name":"Nevada County Clerk-Recorder","address":"950 Maidu Ave, Nevada City, CA 95959"},"assessor":{"name":"Nevada County Assessor","address":"950 Maidu Ave, Nevada City, CA 95959"}},"Orange County, CA":{"recorder":{"name":"Orange County Clerk-Recorder","address":"12 Civic Center Plaza, Santa Ana, CA 92701"},"assessor":{"name":"Orange County Assessor","address":"500 N State College Blvd, Orange, CA 92868"}},"Placer County, CA":{"recorder":{"name":"Placer County Clerk-Recorder","address":"2954 Richardson Dr, Auburn, CA 95603"},"assessor":{"name":"Placer County Assessor","address":"2976 Richardson Dr, Auburn, CA 95603"}},"Plumas County, CA":{"recorder":{"name":"Plumas County Clerk-Recorder","address":"520 Main St, Quincy, CA 95971"},"assessor":{"name":"Plumas County Assessor","address":"520 Main St, Quincy, CA 95971"}},"Riverside County, CA":{"recorder":{"name":"Riverside County Assessor-Clerk-Recorder","address":"2724 Gateway Dr, Riverside, CA 92507"},"assessor":{"name":"Riverside County Assessor","address":"2724 Gateway Dr, Riverside, CA 92507"}},"Sacramento County, CA":{"recorder":{"name":"Sacramento County Clerk-Recorder","address":"600 8th St, Sacramento, CA 95814"},"assessor":{"name":"Sacramento County Assessor","address":"3636 American River Dr, Sacramento, CA 95864"}},"San Benito County, CA":{"recorder":{"name":"San Benito County Clerk-Recorder","address":"440 Fifth St, Hollister, CA 95023"},"assessor":{"name":"San Benito County Assessor","address":"440 Fifth St, Hollister, CA 95023"}},"San Bernardino County, CA":{"recorder":{"name":"San Bernardino County Assessor-Recorder-Clerk","address":"222 W Hospitality Ln, San Bernardino, CA 92415"},"assessor":{"name":"San Bernardino County Assessor","address":"222 W Hospitality Ln, San Bernardino, CA 92415"}},"San Diego County, CA":{"recorder":{"name":"San Diego County Assessor-Recorder-Clerk","address":"1600 Pacific Hwy, San Diego, CA 92101"},"assessor":{"name":"San Diego County Assessor","address":"1600 Pacific Hwy, San Diego, CA 92101"}},"San Francisco County, CA":{"recorder":{"name":"SF Assessor-Recorder","address":"1 Dr Carlton B Goodlett Pl, San Francisco, CA 94102"},"assessor":{"name":"SF Assessor","address":"1 Dr Carlton B Goodlett Pl, San Francisco, CA 94102"}},"San Joaquin County, CA":{"recorder":{"name":"San Joaquin County Assessor-Recorder-Clerk","address":"44 N San Joaquin St, Stockton, CA 95202"},"assessor":{"name":"San Joaquin County Assessor","address":"44 N San Joaquin St, Stockton, CA 95202"}},"San Luis Obispo County, CA":{"recorder":{"name":"SLO County Clerk-Recorder","address":"1055 Monterey St, San Luis Obispo, CA 93408"},"assessor":{"name":"SLO County Assessor","address":"1055 Monterey St, San Luis Obispo, CA 93408"}},"San Mateo County, CA":{"recorder":{"name":"San Mateo County Assessor-Clerk-Recorder","address":"555 County Center, Redwood City, CA 94063"},"assessor":{"name":"San Mateo County Assessor","address":"555 County Center, Redwood City, CA 94063"}},"Santa Barbara County, CA":{"recorder":{"name":"Santa Barbara County Clerk-Recorder","address":"105 E Anapamu St, Santa Barbara, CA 93101"},"assessor":{"name":"Santa Barbara County Assessor","address":"105 E Anapamu St, Santa Barbara, CA 93101"}},"Santa Clara County, CA":{"recorder":{"name":"Santa Clara County Clerk-Recorder","address":"70 W Hedding St, San Jose, CA 95110"},"assessor":{"name":"Santa Clara County Assessor","address":"70 W Hedding St, San Jose, CA 95110"}},"Santa Cruz County, CA":{"recorder":{"name":"Santa Cruz County Assessor-Recorder","address":"701 Ocean St, Santa Cruz, CA 95060"},"assessor":{"name":"Santa Cruz County Assessor","address":"701 Ocean St, Santa Cruz, CA 95060"}},"Shasta County, CA":{"recorder":{"name":"Shasta County Assessor-Recorder","address":"1450 Court St, Redding, CA 96001"},"assessor":{"name":"Shasta County Assessor","address":"1450 Court St, Redding, CA 96001"}},"Sierra County, CA":{"recorder":{"name":"Sierra County Clerk-Recorder","address":"100 Courthouse Sq, Downieville, CA 95936"},"assessor":{"name":"Sierra County Assessor","address":"100 Courthouse Sq, Downieville, CA 95936"}},"Siskiyou County, CA":{"recorder":{"name":"Siskiyou County Assessor-Recorder","address":"311 Fourth St, Yreka, CA 96097"},"assessor":{"name":"Siskiyou County Assessor","address":"311 Fourth St, Yreka, CA 96097"}},"Solano County, CA":{"recorder":{"name":"Solano County Assessor-Recorder","address":"675 Texas St, Fairfield, CA 94533"},"assessor":{"name":"Solano County Assessor","address":"675 Texas St, Fairfield, CA 94533"}},"Sonoma County, CA":{"recorder":{"name":"Sonoma County Clerk-Recorder-Assessor","address":"585 Fiscal Dr, Santa Rosa, CA 95403"},"assessor":{"name":"Sonoma County Assessor","address":"585 Fiscal Dr, Santa Rosa, CA 95403"}},"Stanislaus County, CA":{"recorder":{"name":"Stanislaus County Clerk-Recorder","address":"1021 I St, Modesto, CA 95354"},"assessor":{"name":"Stanislaus County Assessor","address":"1010 10th St, Modesto, CA 95354"}},"Sutter County, CA":{"recorder":{"name":"Sutter County Clerk-Recorder","address":"433 Second St, Yuba City, CA 95991"},"assessor":{"name":"Sutter County Assessor","address":"433 Second St, Yuba City, CA 95991"}},"Tehama County, CA":{"recorder":{"name":"Tehama County Clerk-Recorder","address":"633 Washington St, Red Bluff, CA 96080"},"assessor":{"name":"Tehama County Assessor","address":"633 Washington St, Red Bluff, CA 96080"}},"Trinity County, CA":{"recorder":{"name":"Trinity County Clerk-Recorder","address":"11 Court St, Weaverville, CA 96093"},"assessor":{"name":"Trinity County Assessor","address":"11 Court St, Weaverville, CA 96093"}},"Tulare County, CA":{"recorder":{"name":"Tulare County Assessor-Clerk-Recorder","address":"221 S Mooney Blvd, Visalia, CA 93291"},"assessor":{"name":"Tulare County Assessor","address":"221 S Mooney Blvd, Visalia, CA 93291"}},"Tuolumne County, CA":{"recorder":{"name":"Tuolumne County Assessor-Recorder","address":"2 S Green St, Sonora, CA 95370"},"assessor":{"name":"Tuolumne County Assessor","address":"2 S Green St, Sonora, CA 95370"}},"Ventura County, CA":{"recorder":{"name":"Ventura County Clerk-Recorder","address":"800 S Victoria Ave, Ventura, CA 93009"},"assessor":{"name":"Ventura County Assessor","address":"800 S Victoria Ave, Ventura, CA 93009"}},"Yolo County, CA":{"recorder":{"name":"Yolo County Clerk-Recorder","address":"625 Court St, Woodland, CA 95695"},"assessor":{"name":"Yolo County Assessor","address":"625 Court St, Woodland, CA 95695"}},"Yuba County, CA":{"recorder":{"name":"Yuba County Clerk-Recorder","address":"915 8th St, Marysville, CA 95901"},"assessor":{"name":"Yuba County Assessor","address":"915 8th St, Marysville, CA 95901"}},"Adams County, CO":{"recorder":{"name":"Adams County Clerk & Recorder","address":"4430 S Adams County Pkwy Suite E3000, Brighton, CO 80601"},"assessor":{"name":"Adams County Assessor","address":"4430 S Adams County Pkwy Suite E2000, Brighton, CO 80601"}},"Alamosa County, CO":{"recorder":{"name":"Alamosa County Clerk & Recorder","address":"402 Edison Ave., Alamosa, CO 81101"},"assessor":{"name":"Alamosa County Assessor","address":"402 Edison Ave., Alamosa, CO 81101"}},"Arapahoe County, CO":{"recorder":{"name":"Arapahoe County Clerk & Recorder","address":"5334 S Prince St., Littleton, CO 80120"},"assessor":{"name":"Arapahoe County Assessor","address":"5334 S Prince St., Littleton, CO 80120"}},"Archuleta County, CO":{"recorder":{"name":"Archuleta County Clerk & Recorder","address":"449 San Juan St., Pagosa Springs, CO 81147"},"assessor":{"name":"Archuleta County Assessor","address":"449 San Juan St., Pagosa Springs, CO 81147"}},"Baca County, CO":{"recorder":{"name":"Baca County Clerk & Recorder","address":"741 Main St. Suite 3, Springfield, CO 81073"},"assessor":{"name":"Baca County Assessor","address":"741 Main St., Springfield, CO 81073"}},"Bent County, CO":{"recorder":{"name":"Bent County Clerk & Recorder","address":"725 Bent Ave., Las Animas, CO 81054"},"assessor":{"name":"Bent County Assessor","address":"725 Bent Ave., Las Animas, CO 81054"}},"Boulder County, CO":{"recorder":{"name":"Boulder County Clerk & Recorder","address":"1750 33rd St. Suite 200, Boulder, CO 80301"},"assessor":{"name":"Boulder County Assessor","address":"1750 33rd St. Suite 200, Boulder, CO 80301"}},"Broomfield County, CO":{"recorder":{"name":"Broomfield County Clerk & Recorder","address":"1 DesCombes Dr., Broomfield, CO 80020"},"assessor":{"name":"Broomfield County Assessor","address":"1 DesCombes Dr., Broomfield, CO 80020"}},"Chaffee County, CO":{"recorder":{"name":"Chaffee County Clerk & Recorder","address":"104 Crestone Ave., Salida, CO 81201"},"assessor":{"name":"Chaffee County Assessor","address":"104 Crestone Ave., Salida, CO 81201"}},"Cheyenne County, CO":{"recorder":{"name":"Cheyenne County Clerk & Recorder","address":"51 S 1st St., Cheyenne Wells, CO 80810"},"assessor":{"name":"Cheyenne County Assessor","address":"51 S 1st St., Cheyenne Wells, CO 80810"}},"Clear Creek County, CO":{"recorder":{"name":"Clear Creek County Clerk & Recorder","address":"405 Argentine St., Georgetown, CO 80444"},"assessor":{"name":"Clear Creek County Assessor","address":"405 Argentine St., Georgetown, CO 80444"}},"Conejos County, CO":{"recorder":{"name":"Conejos County Clerk & Recorder","address":"6683 County Rd. 13, Conejos, CO 81129"},"assessor":{"name":"Conejos County Assessor","address":"6683 County Rd. 13, Conejos, CO 81129"}},"Costilla County, CO":{"recorder":{"name":"Costilla County Clerk & Recorder","address":"400 Gascon St., San Luis, CO 81152"},"assessor":{"name":"Costilla County Assessor","address":"400 Gascon St., San Luis, CO 81152"}},"Crowley County, CO":{"recorder":{"name":"Crowley County Clerk & Recorder","address":"631 Main St., Ordway, CO 81063"},"assessor":{"name":"Crowley County Assessor","address":"631 Main St., Ordway, CO 81063"}},"Custer County, CO":{"recorder":{"name":"Custer County Clerk & Recorder","address":"205 S 6th St., Westcliffe, CO 81252"},"assessor":{"name":"Custer County Assessor","address":"205 S 6th St., Westcliffe, CO 81252"}},"Delta County, CO":{"recorder":{"name":"Delta County Clerk & Recorder","address":"501 Palmer St. Suite 211, Delta, CO 81416"},"assessor":{"name":"Delta County Assessor","address":"501 Palmer St. Suite 214, Delta, CO 81416"}},"Denver County, CO":{"recorder":{"name":"Denver Clerk & Recorder","address":"201 W Colfax Ave. Dept 101, Denver, CO 80202"},"assessor":{"name":"Denver Manager of Finance / Assessor","address":"201 W Colfax Ave., Denver, CO 80202"}},"Dolores County, CO":{"recorder":{"name":"Dolores County Clerk & Recorder","address":"409 N Main St., Dove Creek, CO 81324"},"assessor":{"name":"Dolores County Assessor","address":"409 N Main St., Dove Creek, CO 81324"}},"Douglas County, CO":{"recorder":{"name":"Douglas County Clerk & Recorder","address":"301 Wilcox St., Castle Rock, CO 80104"},"assessor":{"name":"Douglas County Assessor","address":"301 Wilcox St., Castle Rock, CO 80104"}},"Eagle County, CO":{"recorder":{"name":"Eagle County Clerk & Recorder","address":"500 Broadway, Eagle, CO 81631"},"assessor":{"name":"Eagle County Assessor","address":"500 Broadway, Eagle, CO 81631"}},"Elbert County, CO":{"recorder":{"name":"Elbert County Clerk & Recorder","address":"215 Comanche St., Kiowa, CO 80117"},"assessor":{"name":"Elbert County Assessor","address":"215 Comanche St., Kiowa, CO 80117"}},"El Paso County, CO":{"recorder":{"name":"El Paso County Clerk & Recorder","address":"1675 W Garden of the Gods Rd., Colorado Springs, CO 80907"},"assessor":{"name":"El Paso County Assessor","address":"1675 W Garden of the Gods Rd., Colorado Springs, CO 80907"}},"Fremont County, CO":{"recorder":{"name":"Fremont County Clerk & Recorder","address":"615 Macon Ave. Room 102, Canon City, CO 81212"},"assessor":{"name":"Fremont County Assessor","address":"615 Macon Ave. Room 100, Canon City, CO 81212"}},"Garfield County, CO":{"recorder":{"name":"Garfield County Clerk & Recorder","address":"109 8th St. Suite 200, Glenwood Springs, CO 81601"},"assessor":{"name":"Garfield County Assessor","address":"109 8th St. Suite 207, Glenwood Springs, CO 81601"}},"Gilpin County, CO":{"recorder":{"name":"Gilpin County Clerk & Recorder","address":"203 Eureka St., Central City, CO 80427"},"assessor":{"name":"Gilpin County Assessor","address":"203 Eureka St., Central City, CO 80427"}},"Grand County, CO":{"recorder":{"name":"Grand County Clerk & Recorder","address":"308 Byers Ave., Hot Sulphur Springs, CO 80451"},"assessor":{"name":"Grand County Assessor","address":"308 Byers Ave., Hot Sulphur Springs, CO 80451"}},"Gunnison County, CO":{"recorder":{"name":"Gunnison County Clerk & Recorder","address":"200 E Virginia Ave., Gunnison, CO 81230"},"assessor":{"name":"Gunnison County Assessor","address":"200 E Virginia Ave., Gunnison, CO 81230"}},"Hinsdale County, CO":{"recorder":{"name":"Hinsdale County Clerk & Recorder","address":"317 Henson St., Lake City, CO 81235"},"assessor":{"name":"Hinsdale County Assessor","address":"317 Henson St., Lake City, CO 81235"}},"Huerfano County, CO":{"recorder":{"name":"Huerfano County Clerk & Recorder","address":"401 Main St. Suite 201, Walsenburg, CO 81089"},"assessor":{"name":"Huerfano County Assessor","address":"401 Main St. Suite 204, Walsenburg, CO 81089"}},"Jackson County, CO":{"recorder":{"name":"Jackson County Clerk & Recorder","address":"396 LaFever St., Walden, CO 80480"},"assessor":{"name":"Jackson County Assessor","address":"396 LaFever St., Walden, CO 80480"}},"Jefferson County, CO":{"recorder":{"name":"Jefferson County Clerk & Recorder","address":"100 Jefferson County Pkwy Suite 1580, Golden, CO 80419"},"assessor":{"name":"Jefferson County Assessor","address":"100 Jefferson County Pkwy Suite 2500, Golden, CO 80419"}},"Kiowa County, CO":{"recorder":{"name":"Kiowa County Clerk & Recorder","address":"1305 Goff St., Eads, CO 81036"},"assessor":{"name":"Kiowa County Assessor","address":"1305 Goff St., Eads, CO 81036"}},"Kit Carson County, CO":{"recorder":{"name":"Kit Carson County Clerk & Recorder","address":"251 16th St. Suite 301, Burlington, CO 80807"},"assessor":{"name":"Kit Carson County Assessor","address":"251 16th St. Suite 301, Burlington, CO 80807"}},"Lake County, CO":{"recorder":{"name":"Lake County Clerk & Recorder","address":"505 Harrison Ave., Leadville, CO 80461"},"assessor":{"name":"Lake County Assessor","address":"505 Harrison Ave., Leadville, CO 80461"}},"La Plata County, CO":{"recorder":{"name":"La Plata County Clerk & Recorder","address":"1101 E 2nd Ave., Durango, CO 81301"},"assessor":{"name":"La Plata County Assessor","address":"1101 E 2nd Ave., Durango, CO 81301"}},"Larimer County, CO":{"recorder":{"name":"Larimer County Clerk & Recorder","address":"200 W Oak St. Suite 1000, Fort Collins, CO 80521"},"assessor":{"name":"Larimer County Assessor","address":"200 W Oak St. Suite 2000, Fort Collins, CO 80521"}},"Las Animas County, CO":{"recorder":{"name":"Las Animas County Clerk & Recorder","address":"200 E 1st St. Room 203, Trinidad, CO 81082"},"assessor":{"name":"Las Animas County Assessor","address":"200 E 1st St. Room 204, Trinidad, CO 81082"}},"Lincoln County, CO":{"recorder":{"name":"Lincoln County Clerk & Recorder","address":"103 3rd Ave., Hugo, CO 80821"},"assessor":{"name":"Lincoln County Assessor","address":"103 3rd Ave., Hugo, CO 80821"}},"Logan County, CO":{"recorder":{"name":"Logan County Clerk & Recorder","address":"315 Main St. Room 1, Sterling, CO 80751"},"assessor":{"name":"Logan County Assessor","address":"315 Main St. Room 3, Sterling, CO 80751"}},"Mesa County, CO":{"recorder":{"name":"Mesa County Clerk & Recorder","address":"544 Rood Ave. Suite 200, Grand Junction, CO 81501"},"assessor":{"name":"Mesa County Assessor","address":"544 Rood Ave. Suite 140, Grand Junction, CO 81501"}},"Mineral County, CO":{"recorder":{"name":"Mineral County Clerk & Recorder","address":"1201 N Main St., Creede, CO 81130"},"assessor":{"name":"Mineral County Assessor","address":"1201 N Main St., Creede, CO 81130"}},"Moffat County, CO":{"recorder":{"name":"Moffat County Clerk & Recorder","address":"221 W Victory Way, Craig, CO 81625"},"assessor":{"name":"Moffat County Assessor","address":"221 W Victory Way, Craig, CO 81625"}},"Montezuma County, CO":{"recorder":{"name":"Montezuma County Clerk & Recorder","address":"109 W Main St. Room 104, Cortez, CO 81321"},"assessor":{"name":"Montezuma County Assessor","address":"109 W Main St. Room 105, Cortez, CO 81321"}},"Montrose County, CO":{"recorder":{"name":"Montrose County Clerk & Recorder","address":"317 S 2nd St., Montrose, CO 81401"},"assessor":{"name":"Montrose County Assessor","address":"317 S 2nd St., Montrose, CO 81401"}},"Morgan County, CO":{"recorder":{"name":"Morgan County Clerk & Recorder","address":"231 Ensign St., Fort Morgan, CO 80701"},"assessor":{"name":"Morgan County Assessor","address":"231 Ensign St., Fort Morgan, CO 80701"}},"Otero County, CO":{"recorder":{"name":"Otero County Clerk & Recorder","address":"13 W 3rd St. Room 207, La Junta, CO 81050"},"assessor":{"name":"Otero County Assessor","address":"13 W 3rd St. Room 213, La Junta, CO 81050"}},"Ouray County, CO":{"recorder":{"name":"Ouray County Clerk & Recorder","address":"541 4th St., Ouray, CO 81427"},"assessor":{"name":"Ouray County Assessor","address":"541 4th St., Ouray, CO 81427"}},"Park County, CO":{"recorder":{"name":"Park County Clerk & Recorder","address":"501 Main St., Fairplay, CO 80440"},"assessor":{"name":"Park County Assessor","address":"501 Main St., Fairplay, CO 80440"}},"Phillips County, CO":{"recorder":{"name":"Phillips County Clerk & Recorder","address":"221 S Interocean Ave., Holyoke, CO 80734"},"assessor":{"name":"Phillips County Assessor","address":"221 S Interocean Ave., Holyoke, CO 80734"}},"Pitkin County, CO":{"recorder":{"name":"Pitkin County Clerk & Recorder","address":"530 E Main St. Suite 101, Aspen, CO 81611"},"assessor":{"name":"Pitkin County Assessor","address":"530 E Main St. Suite 100, Aspen, CO 81611"}},"Prowers County, CO":{"recorder":{"name":"Prowers County Clerk & Recorder","address":"301 S Main St. Suite 215, Lamar, CO 81052"},"assessor":{"name":"Prowers County Assessor","address":"301 S Main St. Suite 218, Lamar, CO 81052"}},"Pueblo County, CO":{"recorder":{"name":"Pueblo County Clerk & Recorder","address":"215 W 10th St., Pueblo, CO 81003"},"assessor":{"name":"Pueblo County Assessor","address":"215 W 10th St. Room 140, Pueblo, CO 81003"}},"Rio Blanco County, CO":{"recorder":{"name":"Rio Blanco County Clerk & Recorder","address":"555 Main St., Meeker, CO 81641"},"assessor":{"name":"Rio Blanco County Assessor","address":"555 Main St., Meeker, CO 81641"}},"Rio Grande County, CO":{"recorder":{"name":"Rio Grande County Clerk & Recorder","address":"965 6th St., Del Norte, CO 81132"},"assessor":{"name":"Rio Grande County Assessor","address":"965 6th St., Del Norte, CO 81132"}},"Routt County, CO":{"recorder":{"name":"Routt County Clerk & Recorder","address":"136 6th St. Suite 101, Steamboat Springs, CO 80487"},"assessor":{"name":"Routt County Assessor","address":"136 6th St. Suite 103, Steamboat Springs, CO 80487"}},"Saguache County, CO":{"recorder":{"name":"Saguache County Clerk & Recorder","address":"501 4th St., Saguache, CO 81149"},"assessor":{"name":"Saguache County Assessor","address":"501 4th St., Saguache, CO 81149"}},"San Juan County, CO":{"recorder":{"name":"San Juan County Clerk & Recorder","address":"1557 Greene St., Silverton, CO 81433"},"assessor":{"name":"San Juan County Assessor","address":"1557 Greene St., Silverton, CO 81433"}},"San Miguel County, CO":{"recorder":{"name":"San Miguel County Clerk & Recorder","address":"305 W Colorado Ave., Telluride, CO 81435"},"assessor":{"name":"San Miguel County Assessor","address":"305 W Colorado Ave., Telluride, CO 81435"}},"Sedgwick County, CO":{"recorder":{"name":"Sedgwick County Clerk & Recorder","address":"315 Cedar St. Suite 5, Julesburg, CO 80737"},"assessor":{"name":"Sedgwick County Assessor","address":"315 Cedar St., Julesburg, CO 80737"}},"Summit County, CO":{"recorder":{"name":"Summit County Clerk & Recorder","address":"208 E Lincoln Ave., Breckenridge, CO 80424"},"assessor":{"name":"Summit County Assessor","address":"208 E Lincoln Ave., Breckenridge, CO 80424"}},"Teller County, CO":{"recorder":{"name":"Teller County Clerk & Recorder","address":"101 W Bennett Ave., Cripple Creek, CO 80813"},"assessor":{"name":"Teller County Assessor","address":"101 W Bennett Ave., Cripple Creek, CO 80813"}},"Washington County, CO":{"recorder":{"name":"Washington County Clerk & Recorder","address":"150 Ash Ave. Suite F, Akron, CO 80720"},"assessor":{"name":"Washington County Assessor","address":"150 Ash Ave., Akron, CO 80720"}},"Weld County, CO":{"recorder":{"name":"Weld County Clerk & Recorder","address":"1402 N 17th Ave., Greeley, CO 80631"},"assessor":{"name":"Weld County Assessor","address":"1402 N 17th Ave., Greeley, CO 80631"}},"Yuma County, CO":{"recorder":{"name":"Yuma County Clerk & Recorder","address":"310 Ash St. Suite D, Wray, CO 80758"},"assessor":{"name":"Yuma County Assessor","address":"310 Ash St., Wray, CO 80758"}},"Fairfield County, CT":{"recorder":{"name":"Bridgeport Town Clerk (Fairfield County Seat)","address":"45 Lyon Terrace Room 122, Bridgeport, CT 06604"},"assessor":{"name":"Bridgeport Tax Assessor (Fairfield County Seat)","address":"45 Lyon Terrace Room 106, Bridgeport, CT 06604"}},"Hartford County, CT":{"recorder":{"name":"Hartford Town Clerk (Hartford County Seat)","address":"550 Main St. Room 106, Hartford, CT 06103"},"assessor":{"name":"Hartford Tax Assessor (Hartford County Seat)","address":"550 Main St. Room 108, Hartford, CT 06103"}},"Litchfield County, CT":{"recorder":{"name":"Litchfield Town Clerk (Litchfield County Seat)","address":"74 West St., Litchfield, CT 06759"},"assessor":{"name":"Litchfield Tax Assessor (Litchfield County Seat)","address":"74 West St., Litchfield, CT 06759"}},"Middlesex County, CT":{"recorder":{"name":"Middletown Town Clerk (Middlesex County Seat)","address":"245 DeKoven Dr., Middletown, CT 06457"},"assessor":{"name":"Middletown Tax Assessor (Middlesex County Seat)","address":"245 DeKoven Dr., Middletown, CT 06457"}},"New Haven County, CT":{"recorder":{"name":"New Haven Town Clerk (New Haven County Seat)","address":"200 Orange St. Room 202, New Haven, CT 06510"},"assessor":{"name":"New Haven Tax Assessor (New Haven County Seat)","address":"165 Church St. 4th Floor, New Haven, CT 06510"}},"New London County, CT":{"recorder":{"name":"New London Town Clerk (New London County Seat)","address":"181 State St., New London, CT 06320"},"assessor":{"name":"New London Tax Assessor (New London County Seat)","address":"181 State St., New London, CT 06320"}},"Tolland County, CT":{"recorder":{"name":"Tolland Town Clerk (Tolland County Seat)","address":"21 Tolland Green 5th Floor, Tolland, CT 06084"},"assessor":{"name":"Tolland Tax Assessor (Tolland County Seat)","address":"21 Tolland Green 5th Floor, Tolland, CT 06084"}},"Windham County, CT":{"recorder":{"name":"Windham Town Clerk (Windham County Seat)","address":"979 Main St., Willimantic, CT 06226"},"assessor":{"name":"Windham Tax Assessor (Windham County Seat)","address":"979 Main St., Willimantic, CT 06226"}},"Kent County, DE":{"recorder":{"name":"Kent County Recorder of Deeds","address":"555 Bay Rd., Dover, DE 19901"},"assessor":{"name":"Kent County Assessment Division","address":"555 Bay Rd., Dover, DE 19901"}},"New Castle County, DE":{"recorder":{"name":"New Castle County Recorder of Deeds","address":"800 N French St. 4th Floor, Wilmington, DE 19801"},"assessor":{"name":"New Castle County Assessment Division","address":"87 Reads Way, New Castle, DE 19720"}},"Sussex County, DE":{"recorder":{"name":"Sussex County Recorder of Deeds","address":"2 The Circle Suite 2, Georgetown, DE 19947"},"assessor":{"name":"Sussex County Assessment Division","address":"2 The Circle Suite 3, Georgetown, DE 19947"}},"Alachua County, FL":{"recorder":{"name":"Alachua County Clerk of Circuit Court","address":"201 E University Ave., Gainesville, FL 32601"},"assessor":{"name":"Alachua County Property Appraiser","address":"12 SE 1st St., Gainesville, FL 32601"}},"Baker County, FL":{"recorder":{"name":"Baker County Clerk of Circuit Court","address":"339 E Macclenny Ave., Macclenny, FL 32063"},"assessor":{"name":"Baker County Property Appraiser","address":"339 E Macclenny Ave. Suite 1, Macclenny, FL 32063"}},"Bay County, FL":{"recorder":{"name":"Bay County Clerk of Circuit Court","address":"300 E 4th St., Panama City, FL 32401"},"assessor":{"name":"Bay County Property Appraiser","address":"860 W 11th St., Panama City, FL 32401"}},"Bradford County, FL":{"recorder":{"name":"Bradford County Clerk of Circuit Court","address":"945 N Temple Ave., Starke, FL 32091"},"assessor":{"name":"Bradford County Property Appraiser","address":"945 N Temple Ave., Starke, FL 32091"}},"Brevard County, FL":{"recorder":{"name":"Brevard County Clerk of Circuit Court","address":"700 S Park Ave. Suite 100, Titusville, FL 32780"},"assessor":{"name":"Brevard County Property Appraiser","address":"400 S St., Titusville, FL 32780"}},"Broward County, FL":{"recorder":{"name":"Broward County Clerk of Circuit Court","address":"201 SE 6th St. Room 03150, Fort Lauderdale, FL 33301"},"assessor":{"name":"Broward County Property Appraiser","address":"115 S Andrews Ave. Room 111, Fort Lauderdale, FL 33301"}},"Calhoun County, FL":{"recorder":{"name":"Calhoun County Clerk of Circuit Court","address":"20859 Central Ave. E, Blountstown, FL 32424"},"assessor":{"name":"Calhoun County Property Appraiser","address":"20859 Central Ave. E Suite 221, Blountstown, FL 32424"}},"Charlotte County, FL":{"recorder":{"name":"Charlotte County Clerk of Circuit Court","address":"350 E Marion Ave., Punta Gorda, FL 33950"},"assessor":{"name":"Charlotte County Property Appraiser","address":"18500 Murdock Circle Suite 501, Port Charlotte, FL 33948"}},"Citrus County, FL":{"recorder":{"name":"Citrus County Clerk of Circuit Court","address":"110 N Apopka Ave., Inverness, FL 34450"},"assessor":{"name":"Citrus County Property Appraiser","address":"210 N Apopka Ave. Suite 200, Inverness, FL 34450"}},"Clay County, FL":{"recorder":{"name":"Clay County Clerk of Circuit Court","address":"825 N Orange Ave., Green Cove Springs, FL 32043"},"assessor":{"name":"Clay County Property Appraiser","address":"477 Houston St., Green Cove Springs, FL 32043"}},"Collier County, FL":{"recorder":{"name":"Collier County Clerk of Circuit Court","address":"3315 Tamiami Trail E Suite 102, Naples, FL 34112"},"assessor":{"name":"Collier County Property Appraiser","address":"3950 Radio Rd., Naples, FL 34104"}},"Columbia County, FL":{"recorder":{"name":"Columbia County Clerk of Circuit Court","address":"173 NE Hernando Ave. Suite 221, Lake City, FL 32055"},"assessor":{"name":"Columbia County Property Appraiser","address":"135 NE Hernando Ave. Suite 238, Lake City, FL 32055"}},"DeSoto County, FL":{"recorder":{"name":"DeSoto County Clerk of Circuit Court","address":"115 E Oak St. Suite 202, Arcadia, FL 34266"},"assessor":{"name":"DeSoto County Property Appraiser","address":"201 E Oak St. Suite 103, Arcadia, FL 34266"}},"Dixie County, FL":{"recorder":{"name":"Dixie County Clerk of Circuit Court","address":"214 NE 351 Hwy, Cross City, FL 32628"},"assessor":{"name":"Dixie County Property Appraiser","address":"214 NE 351 Hwy, Cross City, FL 32628"}},"Duval County, FL":{"recorder":{"name":"Duval County Clerk of Circuit Court","address":"501 W Adams St. Suite 1163, Jacksonville, FL 32202"},"assessor":{"name":"Duval County Property Appraiser","address":"231 E Forsyth St. Suite 270, Jacksonville, FL 32202"}},"Escambia County, FL":{"recorder":{"name":"Escambia County Clerk of Circuit Court","address":"190 Governmental Center Suite 4, Pensacola, FL 32502"},"assessor":{"name":"Escambia County Property Appraiser","address":"221 Palafox Pl. Suite 300, Pensacola, FL 32502"}},"Flagler County, FL":{"recorder":{"name":"Flagler County Clerk of Circuit Court","address":"1769 E Moody Blvd. Bldg 1, Bunnell, FL 32110"},"assessor":{"name":"Flagler County Property Appraiser","address":"1769 E Moody Blvd. Suite 102, Bunnell, FL 32110"}},"Franklin County, FL":{"recorder":{"name":"Franklin County Clerk of Circuit Court","address":"33 Market St. Suite 203, Apalachicola, FL 32320"},"assessor":{"name":"Franklin County Property Appraiser","address":"33 Market St. Suite 203, Apalachicola, FL 32320"}},"Gadsden County, FL":{"recorder":{"name":"Gadsden County Clerk of Circuit Court","address":"10 E Jefferson St., Quincy, FL 32351"},"assessor":{"name":"Gadsden County Property Appraiser","address":"10 E Jefferson St., Quincy, FL 32351"}},"Gilchrist County, FL":{"recorder":{"name":"Gilchrist County Clerk of Circuit Court","address":"112 S Main St., Trenton, FL 32693"},"assessor":{"name":"Gilchrist County Property Appraiser","address":"112 S Main St., Trenton, FL 32693"}},"Glades County, FL":{"recorder":{"name":"Glades County Clerk of Circuit Court","address":"500 Ave J Suite 350, Moore Haven, FL 33471"},"assessor":{"name":"Glades County Property Appraiser","address":"500 Ave J Suite 350, Moore Haven, FL 33471"}},"Gulf County, FL":{"recorder":{"name":"Gulf County Clerk of Circuit Court","address":"1000 Cecil G Costin Sr Blvd., Port St. Joe, FL 32456"},"assessor":{"name":"Gulf County Property Appraiser","address":"1000 Cecil G Costin Sr Blvd. Suite 110, Port St. Joe, FL 32456"}},"Hamilton County, FL":{"recorder":{"name":"Hamilton County Clerk of Circuit Court","address":"207 NE 1st St. Suite 106, Jasper, FL 32052"},"assessor":{"name":"Hamilton County Property Appraiser","address":"207 NE 1st St. Suite 106, Jasper, FL 32052"}},"Hardee County, FL":{"recorder":{"name":"Hardee County Clerk of Circuit Court","address":"417 W Main St., Wauchula, FL 33873"},"assessor":{"name":"Hardee County Property Appraiser","address":"205 S 4th Ave. Suite F, Wauchula, FL 33873"}},"Hendry County, FL":{"recorder":{"name":"Hendry County Clerk of Circuit Court","address":"25 E Hickpochee Ave., LaBelle, FL 33935"},"assessor":{"name":"Hendry County Property Appraiser","address":"25 E Hickpochee Ave., LaBelle, FL 33935"}},"Hernando County, FL":{"recorder":{"name":"Hernando County Clerk of Circuit Court","address":"20 N Main St. Suite 129, Brooksville, FL 34601"},"assessor":{"name":"Hernando County Property Appraiser","address":"201 Howell Ave. Suite 300, Brooksville, FL 34601"}},"Highlands County, FL":{"recorder":{"name":"Highlands County Clerk of Circuit Court","address":"590 S Commerce Ave., Sebring, FL 33870"},"assessor":{"name":"Highlands County Property Appraiser","address":"560 S Commerce Ave., Sebring, FL 33870"}},"Hillsborough County, FL":{"recorder":{"name":"Hillsborough County Clerk of Circuit Court","address":"419 Pierce St. Suite 140, Tampa, FL 33602"},"assessor":{"name":"Hillsborough County Property Appraiser","address":"601 E Kennedy Blvd., Tampa, FL 33602"}},"Holmes County, FL":{"recorder":{"name":"Holmes County Clerk of Circuit Court","address":"201 N Oklahoma St. Suite 204, Bonifay, FL 32425"},"assessor":{"name":"Holmes County Property Appraiser","address":"201 N Oklahoma St. Suite 204, Bonifay, FL 32425"}},"Indian River County, FL":{"recorder":{"name":"Indian River County Clerk of Circuit Court","address":"2000 16th Ave., Vero Beach, FL 32960"},"assessor":{"name":"Indian River County Property Appraiser","address":"1800 27th St. Bldg B, Vero Beach, FL 32960"}},"Jackson County, FL":{"recorder":{"name":"Jackson County Clerk of Circuit Court","address":"4445 Lafayette St. Suite 100, Marianna, FL 32446"},"assessor":{"name":"Jackson County Property Appraiser","address":"4445 Lafayette St. Suite 100, Marianna, FL 32446"}},"Jefferson County, FL":{"recorder":{"name":"Jefferson County Clerk of Circuit Court","address":"1 Courthouse Circle, Monticello, FL 32344"},"assessor":{"name":"Jefferson County Property Appraiser","address":"1 Courthouse Circle Suite B, Monticello, FL 32344"}},"Lafayette County, FL":{"recorder":{"name":"Lafayette County Clerk of Circuit Court","address":"120 W Main St., Mayo, FL 32066"},"assessor":{"name":"Lafayette County Property Appraiser","address":"120 W Main St., Mayo, FL 32066"}},"Lake County, FL":{"recorder":{"name":"Lake County Clerk of Circuit Court","address":"550 W Main St., Tavares, FL 32778"},"assessor":{"name":"Lake County Property Appraiser","address":"320 W Main St. Suite 2, Tavares, FL 32778"}},"Lee County, FL":{"recorder":{"name":"Lee County Clerk of Circuit Court","address":"2115 2nd St. Suite 201, Fort Myers, FL 33901"},"assessor":{"name":"Lee County Property Appraiser","address":"2480 Thompson St., Fort Myers, FL 33901"}},"Leon County, FL":{"recorder":{"name":"Leon County Clerk of Circuit Court","address":"301 S Monroe St. Suite 100, Tallahassee, FL 32301"},"assessor":{"name":"Leon County Property Appraiser","address":"315 S Calhoun St. Suite 500, Tallahassee, FL 32301"}},"Levy County, FL":{"recorder":{"name":"Levy County Clerk of Circuit Court","address":"355 S Court St. Suite 1, Bronson, FL 32621"},"assessor":{"name":"Levy County Property Appraiser","address":"355 S Court St. Suite 2, Bronson, FL 32621"}},"Liberty County, FL":{"recorder":{"name":"Liberty County Clerk of Circuit Court","address":"10818 NW Theo Jacobs Way, Bristol, FL 32321"},"assessor":{"name":"Liberty County Property Appraiser","address":"10818 NW Theo Jacobs Way, Bristol, FL 32321"}},"Madison County, FL":{"recorder":{"name":"Madison County Clerk of Circuit Court","address":"125 SW Range Ave., Madison, FL 32340"},"assessor":{"name":"Madison County Property Appraiser","address":"125 SW Range Ave., Madison, FL 32340"}},"Manatee County, FL":{"recorder":{"name":"Manatee County Clerk of Circuit Court","address":"1115 Manatee Ave. W, Bradenton, FL 34205"},"assessor":{"name":"Manatee County Property Appraiser","address":"915 4th Ave. W, Bradenton, FL 34205"}},"Marion County, FL":{"recorder":{"name":"Marion County Clerk of Circuit Court","address":"110 NW 1st Ave., Ocala, FL 34475"},"assessor":{"name":"Marion County Property Appraiser","address":"3100 SE 27th Ave., Ocala, FL 34471"}},"Martin County, FL":{"recorder":{"name":"Martin County Clerk of Circuit Court","address":"100 E Ocean Blvd., Stuart, FL 34994"},"assessor":{"name":"Martin County Property Appraiser","address":"1111 SE Federal Hwy Suite 330, Stuart, FL 34994"}},"Miami-Dade County, FL":{"recorder":{"name":"Miami-Dade County Clerk of Circuit Court","address":"22 NW 1st St. Suite 1510, Miami, FL 33128"},"assessor":{"name":"Miami-Dade County Property Appraiser","address":"111 NW 1st St. Suite 710, Miami, FL 33128"}},"Monroe County, FL":{"recorder":{"name":"Monroe County Clerk of Circuit Court","address":"500 Whitehead St., Key West, FL 33040"},"assessor":{"name":"Monroe County Property Appraiser","address":"500 Whitehead St. Suite 101, Key West, FL 33040"}},"Nassau County, FL":{"recorder":{"name":"Nassau County Clerk of Circuit Court","address":"76347 Veterans Way Suite 456, Yulee, FL 32097"},"assessor":{"name":"Nassau County Property Appraiser","address":"96135 Nassau Place Suite 4, Yulee, FL 32097"}},"Okaloosa County, FL":{"recorder":{"name":"Okaloosa County Clerk of Circuit Court","address":"101 E James Lee Blvd. Suite 108, Crestview, FL 32536"},"assessor":{"name":"Okaloosa County Property Appraiser","address":"73 Eglin Pkwy NE Suite 202, Fort Walton Beach, FL 32548"}},"Okeechobee County, FL":{"recorder":{"name":"Okeechobee County Clerk of Circuit Court","address":"312 NW 3rd St., Okeechobee, FL 34972"},"assessor":{"name":"Okeechobee County Property Appraiser","address":"409 NW 2nd Ave. Suite A, Okeechobee, FL 34972"}},"Orange County, FL":{"recorder":{"name":"Orange County Clerk of Circuit Court","address":"425 N Orange Ave. Suite 310, Orlando, FL 32801"},"assessor":{"name":"Orange County Property Appraiser","address":"200 S Orange Ave. Suite 1700, Orlando, FL 32801"}},"Osceola County, FL":{"recorder":{"name":"Osceola County Clerk of Circuit Court","address":"2 Courthouse Square Suite 2000, Kissimmee, FL 34741"},"assessor":{"name":"Osceola County Property Appraiser","address":"2505 E Irlo Bronson Memorial Hwy, Kissimmee, FL 34744"}},"Palm Beach County, FL":{"recorder":{"name":"Palm Beach County Clerk of Circuit Court","address":"205 N Dixie Hwy Room 4.2400, West Palm Beach, FL 33401"},"assessor":{"name":"Palm Beach County Property Appraiser","address":"301 N Olive Ave. Suite 900, West Palm Beach, FL 33401"}},"Pasco County, FL":{"recorder":{"name":"Pasco County Clerk of Circuit Court","address":"38053 Live Oak Ave. Suite 201, Dade City, FL 33523"},"assessor":{"name":"Pasco County Property Appraiser","address":"14236 6th St. Suite 101, Dade City, FL 33523"}},"Pinellas County, FL":{"recorder":{"name":"Pinellas County Clerk of Circuit Court","address":"315 Court St. Room 161, Clearwater, FL 33756"},"assessor":{"name":"Pinellas County Property Appraiser","address":"315 Court St., Clearwater, FL 33756"}},"Polk County, FL":{"recorder":{"name":"Polk County Clerk of Circuit Court","address":"255 N Broadway Ave., Bartow, FL 33830"},"assessor":{"name":"Polk County Property Appraiser","address":"255 N Wilson Ave., Bartow, FL 33830"}},"Putnam County, FL":{"recorder":{"name":"Putnam County Clerk of Circuit Court","address":"410 St. Johns Ave., Palatka, FL 32177"},"assessor":{"name":"Putnam County Property Appraiser","address":"312 Oak St., Palatka, FL 32177"}},"Santa Rosa County, FL":{"recorder":{"name":"Santa Rosa County Clerk of Circuit Court","address":"6865 Caroline St. Suite A, Milton, FL 32570"},"assessor":{"name":"Santa Rosa County Property Appraiser","address":"6495 Caroline St. Suite K, Milton, FL 32570"}},"Sarasota County, FL":{"recorder":{"name":"Sarasota County Clerk of Circuit Court","address":"2000 Main St. Suite 200, Sarasota, FL 34237"},"assessor":{"name":"Sarasota County Property Appraiser","address":"101 S Washington Blvd., Sarasota, FL 34236"}},"Seminole County, FL":{"recorder":{"name":"Seminole County Clerk of Circuit Court","address":"301 N Park Ave., Sanford, FL 32771"},"assessor":{"name":"Seminole County Property Appraiser","address":"1101 E 1st St., Sanford, FL 32771"}},"St. Johns County, FL":{"recorder":{"name":"St. Johns County Clerk of Circuit Court","address":"4010 Lewis Speedway, St. Augustine, FL 32084"},"assessor":{"name":"St. Johns County Property Appraiser","address":"4030 Lewis Speedway, St. Augustine, FL 32084"}},"St. Lucie County, FL":{"recorder":{"name":"St. Lucie County Clerk of Circuit Court","address":"201 S Indian River Dr., Fort Pierce, FL 34950"},"assessor":{"name":"St. Lucie County Property Appraiser","address":"2300 Virginia Ave. Room 107, Fort Pierce, FL 34982"}},"Sumter County, FL":{"recorder":{"name":"Sumter County Clerk of Circuit Court","address":"215 E McCollum Ave., Bushnell, FL 33513"},"assessor":{"name":"Sumter County Property Appraiser","address":"7375 Powell Rd., Wildwood, FL 34785"}},"Suwannee County, FL":{"recorder":{"name":"Suwannee County Clerk of Circuit Court","address":"200 S Ohio Ave., Live Oak, FL 32064"},"assessor":{"name":"Suwannee County Property Appraiser","address":"200 S Ohio Ave. Suite 2, Live Oak, FL 32064"}},"Taylor County, FL":{"recorder":{"name":"Taylor County Clerk of Circuit Court","address":"108 N Jefferson St. Suite 102, Perry, FL 32347"},"assessor":{"name":"Taylor County Property Appraiser","address":"108 N Jefferson St. Suite 102, Perry, FL 32347"}},"Union County, FL":{"recorder":{"name":"Union County Clerk of Circuit Court","address":"55 W Main St. Room 103, Lake Butler, FL 32054"},"assessor":{"name":"Union County Property Appraiser","address":"55 W Main St. Room 103, Lake Butler, FL 32054"}},"Volusia County, FL":{"recorder":{"name":"Volusia County Clerk of Circuit Court","address":"101 N Alabama Ave., DeLand, FL 32724"},"assessor":{"name":"Volusia County Property Appraiser","address":"123 W Indiana Ave., DeLand, FL 32720"}},"Wakulla County, FL":{"recorder":{"name":"Wakulla County Clerk of Circuit Court","address":"3056 Crawfordville Hwy, Crawfordville, FL 32327"},"assessor":{"name":"Wakulla County Property Appraiser","address":"3115 Crawfordville Hwy, Crawfordville, FL 32327"}},"Walton County, FL":{"recorder":{"name":"Walton County Clerk of Circuit Court","address":"571 US Hwy 90 E, DeFuniak Springs, FL 32433"},"assessor":{"name":"Walton County Property Appraiser","address":"571 US Hwy 90 E, DeFuniak Springs, FL 32433"}},"Washington County, FL":{"recorder":{"name":"Washington County Clerk of Circuit Court","address":"1293 Jackson Ave. Suite 101, Chipley, FL 32428"},"assessor":{"name":"Washington County Property Appraiser","address":"1293 Jackson Ave. Suite 101, Chipley, FL 32428"}},"Appling County, GA":{"recorder":{"name":"Appling County Clerk of Superior Court","address":"69 Tippins St. Suite 201, Baxley, GA 31513"},"assessor":{"name":"Appling County Tax Assessor","address":"69 Tippins St. Suite 201, Baxley, GA 31513"}},"Atkinson County, GA":{"recorder":{"name":"Atkinson County Clerk of Superior Court","address":"18 Court Square, Pearson, GA 31642"},"assessor":{"name":"Atkinson County Tax Assessor","address":"18 Court Square, Pearson, GA 31642"}},"Bacon County, GA":{"recorder":{"name":"Bacon County Clerk of Superior Court","address":"502 W 12th St. Suite 4, Alma, GA 31510"},"assessor":{"name":"Bacon County Tax Assessor","address":"502 W 12th St. Suite 4, Alma, GA 31510"}},"Baker County, GA":{"recorder":{"name":"Baker County Clerk of Superior Court","address":"Baker County Courthouse, Newton, GA 39870"},"assessor":{"name":"Baker County Tax Assessor","address":"Baker County Courthouse, Newton, GA 39870"}},"Baldwin County, GA":{"recorder":{"name":"Baldwin County Clerk of Superior Court","address":"121 N Wilkinson St. Suite 124, Milledgeville, GA 31061"},"assessor":{"name":"Baldwin County Tax Assessor","address":"121 N Wilkinson St. Suite 124, Milledgeville, GA 31061"}},"Banks County, GA":{"recorder":{"name":"Banks County Clerk of Superior Court","address":"144 Yonah Homer Rd., Homer, GA 30547"},"assessor":{"name":"Banks County Tax Assessor","address":"144 Yonah Homer Rd., Homer, GA 30547"}},"Barrow County, GA":{"recorder":{"name":"Barrow County Clerk of Superior Court","address":"30 N Broad St., Winder, GA 30680"},"assessor":{"name":"Barrow County Tax Assessor","address":"30 N Broad St., Winder, GA 30680"}},"Bartow County, GA":{"recorder":{"name":"Bartow County Clerk of Superior Court","address":"135 W Cherokee Ave. Suite 233, Cartersville, GA 30120"},"assessor":{"name":"Bartow County Tax Assessor","address":"135 W Cherokee Ave. Suite 233, Cartersville, GA 30120"}},"Ben Hill County, GA":{"recorder":{"name":"Ben Hill County Clerk of Superior Court","address":"401 E Central Ave., Fitzgerald, GA 31750"},"assessor":{"name":"Ben Hill County Tax Assessor","address":"401 E Central Ave., Fitzgerald, GA 31750"}},"Berrien County, GA":{"recorder":{"name":"Berrien County Clerk of Superior Court","address":"101 E Marion Ave. Suite 1, Nashville, GA 31639"},"assessor":{"name":"Berrien County Tax Assessor","address":"101 E Marion Ave. Suite 1, Nashville, GA 31639"}},"Bibb County, GA":{"recorder":{"name":"Bibb County Clerk of Superior Court","address":"601 Mulberry St., Macon, GA 31201"},"assessor":{"name":"Bibb County Tax Assessor","address":"601 Mulberry St., Macon, GA 31201"}},"Bleckley County, GA":{"recorder":{"name":"Bleckley County Clerk of Superior Court","address":"306 SE 2nd St., Cochran, GA 31014"},"assessor":{"name":"Bleckley County Tax Assessor","address":"306 SE 2nd St., Cochran, GA 31014"}},"Brantley County, GA":{"recorder":{"name":"Brantley County Clerk of Superior Court","address":"117 Brantley Ave., Nahunta, GA 31553"},"assessor":{"name":"Brantley County Tax Assessor","address":"117 Brantley Ave., Nahunta, GA 31553"}},"Brooks County, GA":{"recorder":{"name":"Brooks County Clerk of Superior Court","address":"610 S Highland Ave., Quitman, GA 31643"},"assessor":{"name":"Brooks County Tax Assessor","address":"610 S Highland Ave., Quitman, GA 31643"}},"Bryan County, GA":{"recorder":{"name":"Bryan County Clerk of Superior Court","address":"W State St., Pembroke, GA 31321"},"assessor":{"name":"Bryan County Tax Assessor","address":"W State St., Pembroke, GA 31321"}},"Bulloch County, GA":{"recorder":{"name":"Bulloch County Clerk of Superior Court","address":"20 Siebald St., Statesboro, GA 30458"},"assessor":{"name":"Bulloch County Tax Assessor","address":"20 Siebald St., Statesboro, GA 30458"}},"Burke County, GA":{"recorder":{"name":"Burke County Clerk of Superior Court","address":"602 Liberty St., Waynesboro, GA 30830"},"assessor":{"name":"Burke County Tax Assessor","address":"602 Liberty St., Waynesboro, GA 30830"}},"Butts County, GA":{"recorder":{"name":"Butts County Clerk of Superior Court","address":"25 3rd St. Suite 107, Jackson, GA 30233"},"assessor":{"name":"Butts County Tax Assessor","address":"25 3rd St. Suite 107, Jackson, GA 30233"}},"Calhoun County, GA":{"recorder":{"name":"Calhoun County Clerk of Superior Court","address":"Morgan, GA 39866"},"assessor":{"name":"Calhoun County Tax Assessor","address":"Morgan, GA 39866"}},"Camden County, GA":{"recorder":{"name":"Camden County Clerk of Superior Court","address":"200 E 4th St., Woodbine, GA 31569"},"assessor":{"name":"Camden County Tax Assessor","address":"200 E 4th St., Woodbine, GA 31569"}},"Candler County, GA":{"recorder":{"name":"Candler County Clerk of Superior Court","address":"355 S Church St., Metter, GA 30439"},"assessor":{"name":"Candler County Tax Assessor","address":"355 S Church St., Metter, GA 30439"}},"Carroll County, GA":{"recorder":{"name":"Carroll County Clerk of Superior Court","address":"323 Newnan St., Carrollton, GA 30117"},"assessor":{"name":"Carroll County Tax Assessor","address":"323 Newnan St., Carrollton, GA 30117"}},"Catoosa County, GA":{"recorder":{"name":"Catoosa County Clerk of Superior Court","address":"875 Lafayette St., Ringgold, GA 30736"},"assessor":{"name":"Catoosa County Tax Assessor","address":"875 Lafayette St., Ringgold, GA 30736"}},"Charlton County, GA":{"recorder":{"name":"Charlton County Clerk of Superior Court","address":"100 S 3rd St., Folkston, GA 31537"},"assessor":{"name":"Charlton County Tax Assessor","address":"100 S 3rd St., Folkston, GA 31537"}},"Chatham County, GA":{"recorder":{"name":"Chatham County Clerk of Superior Court","address":"133 Montgomery St. Suite 3100, Savannah, GA 31401"},"assessor":{"name":"Chatham County Tax Assessor","address":"133 Montgomery St. Suite 3100, Savannah, GA 31401"}},"Chattahoochee County, GA":{"recorder":{"name":"Chattahoochee County Clerk of Superior Court","address":"Harrison, GA 31849"},"assessor":{"name":"Chattahoochee County Tax Assessor","address":"Harrison, GA 31849"}},"Chattooga County, GA":{"recorder":{"name":"Chattooga County Clerk of Superior Court","address":"10 Commerce St., Summerville, GA 30747"},"assessor":{"name":"Chattooga County Tax Assessor","address":"10 Commerce St., Summerville, GA 30747"}},"Cherokee County, GA":{"recorder":{"name":"Cherokee County Clerk of Superior Court","address":"90 North St. Suite G170, Canton, GA 30114"},"assessor":{"name":"Cherokee County Tax Assessor","address":"2780 Marietta Hwy Suite 200, Canton, GA 30114"}},"Clarke County, GA":{"recorder":{"name":"Clarke County Clerk of Superior Court","address":"325 E Washington St. Suite 211, Athens, GA 30601"},"assessor":{"name":"Clarke County Tax Assessor","address":"325 E Washington St. Suite 211, Athens, GA 30601"}},"Clay County, GA":{"recorder":{"name":"Clay County Clerk of Superior Court","address":"210 S Washington St., Fort Gaines, GA 39851"},"assessor":{"name":"Clay County Tax Assessor","address":"210 S Washington St., Fort Gaines, GA 39851"}},"Clayton County, GA":{"recorder":{"name":"Clayton County Clerk of Superior Court","address":"9151 Tara Blvd., Jonesboro, GA 30236"},"assessor":{"name":"Clayton County Tax Assessor","address":"121 S McDonough St., Jonesboro, GA 30236"}},"Clinch County, GA":{"recorder":{"name":"Clinch County Clerk of Superior Court","address":"100 Court Square, Homerville, GA 31634"},"assessor":{"name":"Clinch County Tax Assessor","address":"100 Court Square, Homerville, GA 31634"}},"Cobb County, GA":{"recorder":{"name":"Cobb County Clerk of Superior Court","address":"70 Haynes St., Marietta, GA 30090"},"assessor":{"name":"Cobb County Tax Assessor","address":"736 Whitlock Ave. Suite 200, Marietta, GA 30064"}},"Coffee County, GA":{"recorder":{"name":"Coffee County Clerk of Superior Court","address":"101 S Peterson Ave., Douglas, GA 31533"},"assessor":{"name":"Coffee County Tax Assessor","address":"101 S Peterson Ave., Douglas, GA 31533"}},"Colquitt County, GA":{"recorder":{"name":"Colquitt County Clerk of Superior Court","address":"101 E Central Ave. Suite A, Moultrie, GA 31768"},"assessor":{"name":"Colquitt County Tax Assessor","address":"101 E Central Ave. Suite A, Moultrie, GA 31768"}},"Columbia County, GA":{"recorder":{"name":"Columbia County Clerk of Superior Court","address":"640 Ronald Reagan Dr. Bldg C, Evans, GA 30809"},"assessor":{"name":"Columbia County Tax Assessor","address":"630 Ronald Reagan Dr. Bldg A, Evans, GA 30809"}},"Cook County, GA":{"recorder":{"name":"Cook County Clerk of Superior Court","address":"212 N Hutchinson Ave., Adel, GA 31620"},"assessor":{"name":"Cook County Tax Assessor","address":"212 N Hutchinson Ave., Adel, GA 31620"}},"Coweta County, GA":{"recorder":{"name":"Coweta County Clerk of Superior Court","address":"72 Greenville St., Newnan, GA 30264"},"assessor":{"name":"Coweta County Tax Assessor","address":"37 Perry St., Newnan, GA 30263"}},"Crawford County, GA":{"recorder":{"name":"Crawford County Clerk of Superior Court","address":"1 Courthouse Square, Knoxville, GA 31050"},"assessor":{"name":"Crawford County Tax Assessor","address":"1 Courthouse Square, Knoxville, GA 31050"}},"Crisp County, GA":{"recorder":{"name":"Crisp County Clerk of Superior Court","address":"210 S 7th St., Cordele, GA 31015"},"assessor":{"name":"Crisp County Tax Assessor","address":"210 S 7th St., Cordele, GA 31015"}},"Dade County, GA":{"recorder":{"name":"Dade County Clerk of Superior Court","address":"71 Case Ave., Trenton, GA 30752"},"assessor":{"name":"Dade County Tax Assessor","address":"71 Case Ave., Trenton, GA 30752"}},"Dawson County, GA":{"recorder":{"name":"Dawson County Clerk of Superior Court","address":"25 Justice Way Suite 1322, Dawsonville, GA 30534"},"assessor":{"name":"Dawson County Tax Assessor","address":"25 Justice Way Suite 1322, Dawsonville, GA 30534"}},"Decatur County, GA":{"recorder":{"name":"Decatur County Clerk of Superior Court","address":"112 W Water St., Bainbridge, GA 39817"},"assessor":{"name":"Decatur County Tax Assessor","address":"112 W Water St., Bainbridge, GA 39817"}},"DeKalb County, GA":{"recorder":{"name":"DeKalb County Clerk of Superior Court","address":"556 N McDonough St. Suite 1100, Decatur, GA 30030"},"assessor":{"name":"DeKalb County Tax Assessor","address":"4380 Memorial Dr. Suite 100, Decatur, GA 30032"}},"Dodge County, GA":{"recorder":{"name":"Dodge County Clerk of Superior Court","address":"5401 Anson Ave., Eastman, GA 31023"},"assessor":{"name":"Dodge County Tax Assessor","address":"5401 Anson Ave., Eastman, GA 31023"}},"Dooly County, GA":{"recorder":{"name":"Dooly County Clerk of Superior Court","address":"105 Cotton St., Vienna, GA 31092"},"assessor":{"name":"Dooly County Tax Assessor","address":"105 Cotton St., Vienna, GA 31092"}},"Dougherty County, GA":{"recorder":{"name":"Dougherty County Clerk of Superior Court","address":"225 Pine Ave. Suite 131, Albany, GA 31701"},"assessor":{"name":"Dougherty County Tax Assessor","address":"225 Pine Ave. Suite 131, Albany, GA 31701"}},"Douglas County, GA":{"recorder":{"name":"Douglas County Clerk of Superior Court","address":"8700 Hospital Dr., Douglasville, GA 30134"},"assessor":{"name":"Douglas County Tax Assessor","address":"8700 Hospital Dr., Douglasville, GA 30134"}},"Early County, GA":{"recorder":{"name":"Early County Clerk of Superior Court","address":"111 Court Square Suite 1, Blakely, GA 39823"},"assessor":{"name":"Early County Tax Assessor","address":"111 Court Square Suite 1, Blakely, GA 39823"}},"Echols County, GA":{"recorder":{"name":"Echols County Clerk of Superior Court","address":"Statenville, GA 31648"},"assessor":{"name":"Echols County Tax Assessor","address":"Statenville, GA 31648"}},"Effingham County, GA":{"recorder":{"name":"Effingham County Clerk of Superior Court","address":"700 N Pine St. Suite 142, Springfield, GA 31329"},"assessor":{"name":"Effingham County Tax Assessor","address":"700 N Pine St. Suite 142, Springfield, GA 31329"}},"Elbert County, GA":{"recorder":{"name":"Elbert County Clerk of Superior Court","address":"45 Forest Ave. Suite 300, Elberton, GA 30635"},"assessor":{"name":"Elbert County Tax Assessor","address":"45 Forest Ave. Suite 300, Elberton, GA 30635"}},"Emanuel County, GA":{"recorder":{"name":"Emanuel County Clerk of Superior Court","address":"125 S Main St., Swainsboro, GA 30401"},"assessor":{"name":"Emanuel County Tax Assessor","address":"125 S Main St., Swainsboro, GA 30401"}},"Evans County, GA":{"recorder":{"name":"Evans County Clerk of Superior Court","address":"200 Freeman St., Claxton, GA 30417"},"assessor":{"name":"Evans County Tax Assessor","address":"200 Freeman St., Claxton, GA 30417"}},"Fannin County, GA":{"recorder":{"name":"Fannin County Clerk of Superior Court","address":"400 West Main St. Suite 101, Blue Ridge, GA 30513"},"assessor":{"name":"Fannin County Tax Assessor","address":"400 West Main St. Suite 101, Blue Ridge, GA 30513"}},"Fayette County, GA":{"recorder":{"name":"Fayette County Clerk of Superior Court","address":"1 Center Dr. Suite 1245, Fayetteville, GA 30214"},"assessor":{"name":"Fayette County Tax Assessor","address":"140 Stonewall Ave. W Suite 208, Fayetteville, GA 30214"}},"Floyd County, GA":{"recorder":{"name":"Floyd County Clerk of Superior Court","address":"3 Government Plaza Suite 101, Rome, GA 30161"},"assessor":{"name":"Floyd County Tax Assessor","address":"4 Government Plaza Suite 203, Rome, GA 30161"}},"Forsyth County, GA":{"recorder":{"name":"Forsyth County Clerk of Superior Court","address":"100 Courthouse Square Suite 010, Cumming, GA 30040"},"assessor":{"name":"Forsyth County Tax Assessor","address":"110 E Main St. Suite 260, Cumming, GA 30040"}},"Franklin County, GA":{"recorder":{"name":"Franklin County Clerk of Superior Court","address":"11 N Boyd St., Carnesville, GA 30521"},"assessor":{"name":"Franklin County Tax Assessor","address":"11 N Boyd St., Carnesville, GA 30521"}},"Fulton County, GA":{"recorder":{"name":"Fulton County Clerk of Superior Court","address":"136 Pryor St. SW Suite C-301, Atlanta, GA 30303"},"assessor":{"name":"Fulton County Tax Assessor","address":"235 Peachtree St. NE Suite 1400, Atlanta, GA 30303"}},"Gilmer County, GA":{"recorder":{"name":"Gilmer County Clerk of Superior Court","address":"1 Broad St. Suite 201, Ellijay, GA 30540"},"assessor":{"name":"Gilmer County Tax Assessor","address":"1 Broad St. Suite 201, Ellijay, GA 30540"}},"Glascock County, GA":{"recorder":{"name":"Glascock County Clerk of Superior Court","address":"62 E Main St., Gibson, GA 30810"},"assessor":{"name":"Glascock County Tax Assessor","address":"62 E Main St., Gibson, GA 30810"}},"Glynn County, GA":{"recorder":{"name":"Glynn County Clerk of Superior Court","address":"701 H St., Brunswick, GA 31520"},"assessor":{"name":"Glynn County Tax Assessor","address":"1725 Reynolds St. Suite 100, Brunswick, GA 31520"}},"Gordon County, GA":{"recorder":{"name":"Gordon County Clerk of Superior Court","address":"100 Wall St. Suite 105, Calhoun, GA 30701"},"assessor":{"name":"Gordon County Tax Assessor","address":"100 Wall St. Suite 105, Calhoun, GA 30701"}},"Grady County, GA":{"recorder":{"name":"Grady County Clerk of Superior Court","address":"250 N Broad St., Cairo, GA 39827"},"assessor":{"name":"Grady County Tax Assessor","address":"250 N Broad St., Cairo, GA 39827"}},"Greene County, GA":{"recorder":{"name":"Greene County Clerk of Superior Court","address":"113 N Main St. Suite 123, Greensboro, GA 30642"},"assessor":{"name":"Greene County Tax Assessor","address":"113 N Main St. Suite 123, Greensboro, GA 30642"}},"Gwinnett County, GA":{"recorder":{"name":"Gwinnett County Clerk of Superior Court","address":"75 Langley Dr., Lawrenceville, GA 30046"},"assessor":{"name":"Gwinnett County Tax Assessor","address":"75 Langley Dr., Lawrenceville, GA 30046"}},"Habersham County, GA":{"recorder":{"name":"Habersham County Clerk of Superior Court","address":"555 Monroe St. Unit 26, Clarkesville, GA 30523"},"assessor":{"name":"Habersham County Tax Assessor","address":"555 Monroe St. Unit 26, Clarkesville, GA 30523"}},"Hall County, GA":{"recorder":{"name":"Hall County Clerk of Superior Court","address":"225 Green St. SE Suite 2120, Gainesville, GA 30501"},"assessor":{"name":"Hall County Tax Assessor","address":"2875 Browns Bridge Rd., Gainesville, GA 30504"}},"Hancock County, GA":{"recorder":{"name":"Hancock County Clerk of Superior Court","address":"12630 Broad St., Sparta, GA 31087"},"assessor":{"name":"Hancock County Tax Assessor","address":"12630 Broad St., Sparta, GA 31087"}},"Haralson County, GA":{"recorder":{"name":"Haralson County Clerk of Superior Court","address":"4485 Georgia Hwy 120, Buchanan, GA 30113"},"assessor":{"name":"Haralson County Tax Assessor","address":"4485 Georgia Hwy 120, Buchanan, GA 30113"}},"Harris County, GA":{"recorder":{"name":"Harris County Clerk of Superior Court","address":"102 College St., Hamilton, GA 31811"},"assessor":{"name":"Harris County Tax Assessor","address":"102 College St., Hamilton, GA 31811"}},"Hart County, GA":{"recorder":{"name":"Hart County Clerk of Superior Court","address":"165 W Franklin St. Suite 301, Hartwell, GA 30643"},"assessor":{"name":"Hart County Tax Assessor","address":"165 W Franklin St. Suite 301, Hartwell, GA 30643"}},"Heard County, GA":{"recorder":{"name":"Heard County Clerk of Superior Court","address":"215 E Court Square, Franklin, GA 30217"},"assessor":{"name":"Heard County Tax Assessor","address":"215 E Court Square, Franklin, GA 30217"}},"Henry County, GA":{"recorder":{"name":"Henry County Clerk of Superior Court","address":"1 Courthouse Square Suite 1007, McDonough, GA 30253"},"assessor":{"name":"Henry County Tax Assessor","address":"140 Henry Pkwy Suite D, McDonough, GA 30253"}},"Houston County, GA":{"recorder":{"name":"Houston County Clerk of Superior Court","address":"201 Perry Pkwy, Perry, GA 31069"},"assessor":{"name":"Houston County Tax Assessor","address":"201 Perry Pkwy, Perry, GA 31069"}},"Irwin County, GA":{"recorder":{"name":"Irwin County Clerk of Superior Court","address":"107 N Irwin Ave., Ocilla, GA 31774"},"assessor":{"name":"Irwin County Tax Assessor","address":"107 N Irwin Ave., Ocilla, GA 31774"}},"Jackson County, GA":{"recorder":{"name":"Jackson County Clerk of Superior Court","address":"67 Athens St., Jefferson, GA 30549"},"assessor":{"name":"Jackson County Tax Assessor","address":"67 Athens St., Jefferson, GA 30549"}},"Jasper County, GA":{"recorder":{"name":"Jasper County Clerk of Superior Court","address":"126 W Greene St., Monticello, GA 31064"},"assessor":{"name":"Jasper County Tax Assessor","address":"126 W Greene St., Monticello, GA 31064"}},"Jeff Davis County, GA":{"recorder":{"name":"Jeff Davis County Clerk of Superior Court","address":"14 Jeff Davis St. Suite 108, Hazlehurst, GA 31539"},"assessor":{"name":"Jeff Davis County Tax Assessor","address":"14 Jeff Davis St. Suite 108, Hazlehurst, GA 31539"}},"Jefferson County, GA":{"recorder":{"name":"Jefferson County Clerk of Superior Court","address":"202 E Broad St., Louisville, GA 30434"},"assessor":{"name":"Jefferson County Tax Assessor","address":"202 E Broad St., Louisville, GA 30434"}},"Jenkins County, GA":{"recorder":{"name":"Jenkins County Clerk of Superior Court","address":"524 Cotton Ave., Millen, GA 30442"},"assessor":{"name":"Jenkins County Tax Assessor","address":"524 Cotton Ave., Millen, GA 30442"}},"Johnson County, GA":{"recorder":{"name":"Johnson County Clerk of Superior Court","address":"291 N Marcus St., Wrightsville, GA 31096"},"assessor":{"name":"Johnson County Tax Assessor","address":"291 N Marcus St., Wrightsville, GA 31096"}},"Jones County, GA":{"recorder":{"name":"Jones County Clerk of Superior Court","address":"166 Industrial Blvd. Suite B, Gray, GA 31032"},"assessor":{"name":"Jones County Tax Assessor","address":"166 Industrial Blvd. Suite B, Gray, GA 31032"}},"Lamar County, GA":{"recorder":{"name":"Lamar County Clerk of Superior Court","address":"408 Thomaston St. Suite A, Barnesville, GA 30204"},"assessor":{"name":"Lamar County Tax Assessor","address":"408 Thomaston St. Suite A, Barnesville, GA 30204"}},"Lanier County, GA":{"recorder":{"name":"Lanier County Clerk of Superior Court","address":"100 Main St., Lakeland, GA 31635"},"assessor":{"name":"Lanier County Tax Assessor","address":"100 Main St., Lakeland, GA 31635"}},"Laurens County, GA":{"recorder":{"name":"Laurens County Clerk of Superior Court","address":"101 N Jefferson St., Dublin, GA 31021"},"assessor":{"name":"Laurens County Tax Assessor","address":"101 N Jefferson St., Dublin, GA 31021"}},"Lee County, GA":{"recorder":{"name":"Lee County Clerk of Superior Court","address":"100 Starksville Ave. N Suite 102, Leesburg, GA 31763"},"assessor":{"name":"Lee County Tax Assessor","address":"100 Starksville Ave. N Suite 102, Leesburg, GA 31763"}},"Liberty County, GA":{"recorder":{"name":"Liberty County Clerk of Superior Court","address":"112 N Main St., Hinesville, GA 31313"},"assessor":{"name":"Liberty County Tax Assessor","address":"112 N Main St., Hinesville, GA 31313"}},"Lincoln County, GA":{"recorder":{"name":"Lincoln County Clerk of Superior Court","address":"210 Humphrey St., Lincolnton, GA 30817"},"assessor":{"name":"Lincoln County Tax Assessor","address":"210 Humphrey St., Lincolnton, GA 30817"}},"Long County, GA":{"recorder":{"name":"Long County Clerk of Superior Court","address":"65 N McDonald St., Ludowici, GA 31316"},"assessor":{"name":"Long County Tax Assessor","address":"65 N McDonald St., Ludowici, GA 31316"}},"Lowndes County, GA":{"recorder":{"name":"Lowndes County Clerk of Superior Court","address":"327 N Ashley St., Valdosta, GA 31601"},"assessor":{"name":"Lowndes County Tax Assessor","address":"327 N Ashley St., Valdosta, GA 31601"}},"Lumpkin County, GA":{"recorder":{"name":"Lumpkin County Clerk of Superior Court","address":"99 Courthouse Hill Suite B, Dahlonega, GA 30533"},"assessor":{"name":"Lumpkin County Tax Assessor","address":"99 Courthouse Hill Suite B, Dahlonega, GA 30533"}},"Macon County, GA":{"recorder":{"name":"Macon County Clerk of Superior Court","address":"121 S Main St., Oglethorpe, GA 31068"},"assessor":{"name":"Macon County Tax Assessor","address":"121 S Main St., Oglethorpe, GA 31068"}},"Madison County, GA":{"recorder":{"name":"Madison County Clerk of Superior Court","address":"91 Albany Ave. Suite 103, Danielsville, GA 30633"},"assessor":{"name":"Madison County Tax Assessor","address":"91 Albany Ave. Suite 103, Danielsville, GA 30633"}},"Marion County, GA":{"recorder":{"name":"Marion County Clerk of Superior Court","address":"100 Burkhalter Ave., Buena Vista, GA 31803"},"assessor":{"name":"Marion County Tax Assessor","address":"100 Burkhalter Ave., Buena Vista, GA 31803"}},"McDuffie County, GA":{"recorder":{"name":"McDuffie County Clerk of Superior Court","address":"339 Main St., Thomson, GA 30824"},"assessor":{"name":"McDuffie County Tax Assessor","address":"339 Main St., Thomson, GA 30824"}},"McIntosh County, GA":{"recorder":{"name":"McIntosh County Clerk of Superior Court","address":"310 Northway, Darien, GA 31305"},"assessor":{"name":"McIntosh County Tax Assessor","address":"310 Northway, Darien, GA 31305"}},"Meriwether County, GA":{"recorder":{"name":"Meriwether County Clerk of Superior Court","address":"1 Court Square Suite 200, Greenville, GA 30222"},"assessor":{"name":"Meriwether County Tax Assessor","address":"1 Court Square Suite 200, Greenville, GA 30222"}},"Miller County, GA":{"recorder":{"name":"Miller County Clerk of Superior Court","address":"155 S 1st Ave., Colquitt, GA 39837"},"assessor":{"name":"Miller County Tax Assessor","address":"155 S 1st Ave., Colquitt, GA 39837"}},"Mitchell County, GA":{"recorder":{"name":"Mitchell County Clerk of Superior Court","address":"12 N Court Square Suite 103, Camilla, GA 31730"},"assessor":{"name":"Mitchell County Tax Assessor","address":"12 N Court Square Suite 103, Camilla, GA 31730"}},"Monroe County, GA":{"recorder":{"name":"Monroe County Clerk of Superior Court","address":"1 Courthouse Square, Forsyth, GA 31029"},"assessor":{"name":"Monroe County Tax Assessor","address":"1 Courthouse Square, Forsyth, GA 31029"}},"Montgomery County, GA":{"recorder":{"name":"Montgomery County Clerk of Superior Court","address":"300 S Railroad Ave., Mount Vernon, GA 30445"},"assessor":{"name":"Montgomery County Tax Assessor","address":"300 S Railroad Ave., Mount Vernon, GA 30445"}},"Morgan County, GA":{"recorder":{"name":"Morgan County Clerk of Superior Court","address":"149 E Jefferson St. Suite 103, Madison, GA 30650"},"assessor":{"name":"Morgan County Tax Assessor","address":"149 E Jefferson St. Suite 103, Madison, GA 30650"}},"Murray County, GA":{"recorder":{"name":"Murray County Clerk of Superior Court","address":"121 N 4th Ave., Chatsworth, GA 30705"},"assessor":{"name":"Murray County Tax Assessor","address":"121 N 4th Ave., Chatsworth, GA 30705"}},"Muscogee County, GA":{"recorder":{"name":"Muscogee County Clerk of Superior Court","address":"100 10th St., Columbus, GA 31901"},"assessor":{"name":"Muscogee County Tax Assessor","address":"3111 Citizens Way, Columbus, GA 31906"}},"Newton County, GA":{"recorder":{"name":"Newton County Clerk of Superior Court","address":"1132 Usher St. Suite 100, Covington, GA 30014"},"assessor":{"name":"Newton County Tax Assessor","address":"1113 Usher St. Suite 101, Covington, GA 30014"}},"Oconee County, GA":{"recorder":{"name":"Oconee County Clerk of Superior Court","address":"23 N Main St. Suite 101, Watkinsville, GA 30677"},"assessor":{"name":"Oconee County Tax Assessor","address":"23 N Main St. Suite 101, Watkinsville, GA 30677"}},"Oglethorpe County, GA":{"recorder":{"name":"Oglethorpe County Clerk of Superior Court","address":"105 W Liberty St., Lexington, GA 30648"},"assessor":{"name":"Oglethorpe County Tax Assessor","address":"105 W Liberty St., Lexington, GA 30648"}},"Paulding County, GA":{"recorder":{"name":"Paulding County Clerk of Superior Court","address":"11 Courthouse Square, Dallas, GA 30132"},"assessor":{"name":"Paulding County Tax Assessor","address":"25 Courthouse Square Suite 203, Dallas, GA 30132"}},"Peach County, GA":{"recorder":{"name":"Peach County Clerk of Superior Court","address":"205 W Church St., Fort Valley, GA 31030"},"assessor":{"name":"Peach County Tax Assessor","address":"205 W Church St., Fort Valley, GA 31030"}},"Pickens County, GA":{"recorder":{"name":"Pickens County Clerk of Superior Court","address":"50 N Main St. Suite 105, Jasper, GA 30143"},"assessor":{"name":"Pickens County Tax Assessor","address":"50 N Main St. Suite 105, Jasper, GA 30143"}},"Pierce County, GA":{"recorder":{"name":"Pierce County Clerk of Superior Court","address":"312 Nichols St. Suite 5, Blackshear, GA 31516"},"assessor":{"name":"Pierce County Tax Assessor","address":"312 Nichols St. Suite 5, Blackshear, GA 31516"}},"Pike County, GA":{"recorder":{"name":"Pike County Clerk of Superior Court","address":"16001 Barnesville St. Suite 201, Zebulon, GA 30295"},"assessor":{"name":"Pike County Tax Assessor","address":"16001 Barnesville St. Suite 201, Zebulon, GA 30295"}},"Polk County, GA":{"recorder":{"name":"Polk County Clerk of Superior Court","address":"100 Prior St., Cedartown, GA 30125"},"assessor":{"name":"Polk County Tax Assessor","address":"100 Prior St., Cedartown, GA 30125"}},"Pulaski County, GA":{"recorder":{"name":"Pulaski County Clerk of Superior Court","address":"152 N Lumpkin St., Hawkinsville, GA 31036"},"assessor":{"name":"Pulaski County Tax Assessor","address":"152 N Lumpkin St., Hawkinsville, GA 31036"}},"Putnam County, GA":{"recorder":{"name":"Putnam County Clerk of Superior Court","address":"100 S Jefferson Ave. Suite 203, Eatonton, GA 31024"},"assessor":{"name":"Putnam County Tax Assessor","address":"100 S Jefferson Ave. Suite 203, Eatonton, GA 31024"}},"Quitman County, GA":{"recorder":{"name":"Quitman County Clerk of Superior Court","address":"Georgetown, GA 39854"},"assessor":{"name":"Quitman County Tax Assessor","address":"Georgetown, GA 39854"}},"Rabun County, GA":{"recorder":{"name":"Rabun County Clerk of Superior Court","address":"25 Courthouse Square Suite 105, Clayton, GA 30525"},"assessor":{"name":"Rabun County Tax Assessor","address":"25 Courthouse Square Suite 105, Clayton, GA 30525"}},"Randolph County, GA":{"recorder":{"name":"Randolph County Clerk of Superior Court","address":"1 Court Square Suite 2, Cuthbert, GA 39840"},"assessor":{"name":"Randolph County Tax Assessor","address":"1 Court Square Suite 2, Cuthbert, GA 39840"}},"Richmond County, GA":{"recorder":{"name":"Richmond County Clerk of Superior Court","address":"735 James Brown Blvd. Suite 1300, Augusta, GA 30901"},"assessor":{"name":"Richmond County Tax Assessor","address":"535 Telfair St. Suite 120, Augusta, GA 30901"}},"Rockdale County, GA":{"recorder":{"name":"Rockdale County Clerk of Superior Court","address":"922 Court St. NE Suite 101, Conyers, GA 30012"},"assessor":{"name":"Rockdale County Tax Assessor","address":"958 Milstead Ave. Suite 201, Conyers, GA 30012"}},"Schley County, GA":{"recorder":{"name":"Schley County Clerk of Superior Court","address":"Ellaville, GA 31806"},"assessor":{"name":"Schley County Tax Assessor","address":"Ellaville, GA 31806"}},"Screven County, GA":{"recorder":{"name":"Screven County Clerk of Superior Court","address":"216 Mims Rd. Suite 104, Sylvania, GA 30467"},"assessor":{"name":"Screven County Tax Assessor","address":"216 Mims Rd. Suite 104, Sylvania, GA 30467"}},"Seminole County, GA":{"recorder":{"name":"Seminole County Clerk of Superior Court","address":"200 S Knox Ave., Donalsonville, GA 39845"},"assessor":{"name":"Seminole County Tax Assessor","address":"200 S Knox Ave., Donalsonville, GA 39845"}},"Spalding County, GA":{"recorder":{"name":"Spalding County Clerk of Superior Court","address":"132 E Solomon St., Griffin, GA 30223"},"assessor":{"name":"Spalding County Tax Assessor","address":"132 E Solomon St., Griffin, GA 30223"}},"Stephens County, GA":{"recorder":{"name":"Stephens County Clerk of Superior Court","address":"90 N Alexander St. Suite 103, Toccoa, GA 30577"},"assessor":{"name":"Stephens County Tax Assessor","address":"90 N Alexander St. Suite 103, Toccoa, GA 30577"}},"Stewart County, GA":{"recorder":{"name":"Stewart County Clerk of Superior Court","address":"Lumpkin, GA 31815"},"assessor":{"name":"Stewart County Tax Assessor","address":"Lumpkin, GA 31815"}},"Sumter County, GA":{"recorder":{"name":"Sumter County Clerk of Superior Court","address":"500 W Lamar St., Americus, GA 31709"},"assessor":{"name":"Sumter County Tax Assessor","address":"500 W Lamar St., Americus, GA 31709"}},"Talbot County, GA":{"recorder":{"name":"Talbot County Clerk of Superior Court","address":"Courthouse Square, Talbotton, GA 31827"},"assessor":{"name":"Talbot County Tax Assessor","address":"Courthouse Square, Talbotton, GA 31827"}},"Taliaferro County, GA":{"recorder":{"name":"Taliaferro County Clerk of Superior Court","address":"Crawfordville, GA 30631"},"assessor":{"name":"Taliaferro County Tax Assessor","address":"Crawfordville, GA 30631"}},"Tattnall County, GA":{"recorder":{"name":"Tattnall County Clerk of Superior Court","address":"108 W Brazell St., Reidsville, GA 30453"},"assessor":{"name":"Tattnall County Tax Assessor","address":"108 W Brazell St., Reidsville, GA 30453"}},"Taylor County, GA":{"recorder":{"name":"Taylor County Clerk of Superior Court","address":"1 Courthouse Square Suite 102, Butler, GA 31006"},"assessor":{"name":"Taylor County Tax Assessor","address":"1 Courthouse Square Suite 102, Butler, GA 31006"}},"Telfair County, GA":{"recorder":{"name":"Telfair County Clerk of Superior Court","address":"128 E Oak St. Suite 1, McRae-Helena, GA 31055"},"assessor":{"name":"Telfair County Tax Assessor","address":"128 E Oak St. Suite 1, McRae-Helena, GA 31055"}},"Terrell County, GA":{"recorder":{"name":"Terrell County Clerk of Superior Court","address":"955 Forrester Dr. SE, Dawson, GA 39842"},"assessor":{"name":"Terrell County Tax Assessor","address":"955 Forrester Dr. SE, Dawson, GA 39842"}},"Thomas County, GA":{"recorder":{"name":"Thomas County Clerk of Superior Court","address":"225 N Broad St., Thomasville, GA 31792"},"assessor":{"name":"Thomas County Tax Assessor","address":"225 N Broad St., Thomasville, GA 31792"}},"Tift County, GA":{"recorder":{"name":"Tift County Clerk of Superior Court","address":"225 N Tift Ave., Tifton, GA 31794"},"assessor":{"name":"Tift County Tax Assessor","address":"225 N Tift Ave., Tifton, GA 31794"}},"Toombs County, GA":{"recorder":{"name":"Toombs County Clerk of Superior Court","address":"100 Courthouse Square Suite 1, Lyons, GA 30436"},"assessor":{"name":"Toombs County Tax Assessor","address":"100 Courthouse Square Suite 1, Lyons, GA 30436"}},"Towns County, GA":{"recorder":{"name":"Towns County Clerk of Superior Court","address":"48 River St. Suite E, Hiawassee, GA 30546"},"assessor":{"name":"Towns County Tax Assessor","address":"48 River St. Suite E, Hiawassee, GA 30546"}},"Treutlen County, GA":{"recorder":{"name":"Treutlen County Clerk of Superior Court","address":"650 2nd St. Suite 105, Soperton, GA 30457"},"assessor":{"name":"Treutlen County Tax Assessor","address":"650 2nd St. Suite 105, Soperton, GA 30457"}},"Troup County, GA":{"recorder":{"name":"Troup County Clerk of Superior Court","address":"900 Dallis St., LaGrange, GA 30240"},"assessor":{"name":"Troup County Tax Assessor","address":"100 Ridley Ave., LaGrange, GA 30240"}},"Turner County, GA":{"recorder":{"name":"Turner County Clerk of Superior Court","address":"219 E College Ave. Suite 3, Ashburn, GA 31714"},"assessor":{"name":"Turner County Tax Assessor","address":"219 E College Ave. Suite 3, Ashburn, GA 31714"}},"Twiggs County, GA":{"recorder":{"name":"Twiggs County Clerk of Superior Court","address":"425 Railroad St., Jeffersonville, GA 31044"},"assessor":{"name":"Twiggs County Tax Assessor","address":"425 Railroad St., Jeffersonville, GA 31044"}},"Union County, GA":{"recorder":{"name":"Union County Clerk of Superior Court","address":"114 Courthouse St. Suite 5, Blairsville, GA 30512"},"assessor":{"name":"Union County Tax Assessor","address":"114 Courthouse St. Suite 5, Blairsville, GA 30512"}},"Upson County, GA":{"recorder":{"name":"Upson County Clerk of Superior Court","address":"116 W Main St., Thomaston, GA 30286"},"assessor":{"name":"Upson County Tax Assessor","address":"116 W Main St., Thomaston, GA 30286"}},"Walker County, GA":{"recorder":{"name":"Walker County Clerk of Superior Court","address":"103 S Duke St., LaFayette, GA 30728"},"assessor":{"name":"Walker County Tax Assessor","address":"103 S Duke St., LaFayette, GA 30728"}},"Walton County, GA":{"recorder":{"name":"Walton County Clerk of Superior Court","address":"303 S Hammond Dr. Suite 330, Monroe, GA 30655"},"assessor":{"name":"Walton County Tax Assessor","address":"303 S Hammond Dr. Suite 330, Monroe, GA 30655"}},"Ware County, GA":{"recorder":{"name":"Ware County Clerk of Superior Court","address":"800 Church St. Suite C, Waycross, GA 31501"},"assessor":{"name":"Ware County Tax Assessor","address":"800 Church St. Suite C, Waycross, GA 31501"}},"Warren County, GA":{"recorder":{"name":"Warren County Clerk of Superior Court","address":"100 Main St., Warrenton, GA 30828"},"assessor":{"name":"Warren County Tax Assessor","address":"100 Main St., Warrenton, GA 30828"}},"Washington County, GA":{"recorder":{"name":"Washington County Clerk of Superior Court","address":"115 Jones St., Sandersville, GA 31082"},"assessor":{"name":"Washington County Tax Assessor","address":"115 Jones St., Sandersville, GA 31082"}},"Wayne County, GA":{"recorder":{"name":"Wayne County Clerk of Superior Court","address":"174 N Brunswick St. Suite 105, Jesup, GA 31545"},"assessor":{"name":"Wayne County Tax Assessor","address":"174 N Brunswick St. Suite 105, Jesup, GA 31545"}},"Webster County, GA":{"recorder":{"name":"Webster County Clerk of Superior Court","address":"Preston, GA 31824"},"assessor":{"name":"Webster County Tax Assessor","address":"Preston, GA 31824"}},"Wheeler County, GA":{"recorder":{"name":"Wheeler County Clerk of Superior Court","address":"101 S Railroad Ave., Alamo, GA 30411"},"assessor":{"name":"Wheeler County Tax Assessor","address":"101 S Railroad Ave., Alamo, GA 30411"}},"White County, GA":{"recorder":{"name":"White County Clerk of Superior Court","address":"59 S Main St. Suite 103, Cleveland, GA 30528"},"assessor":{"name":"White County Tax Assessor","address":"59 S Main St. Suite 103, Cleveland, GA 30528"}},"Whitfield County, GA":{"recorder":{"name":"Whitfield County Clerk of Superior Court","address":"205 N Selvidge St. Suite F, Dalton, GA 30720"},"assessor":{"name":"Whitfield County Tax Assessor","address":"205 N Selvidge St. Suite F, Dalton, GA 30720"}},"Wilcox County, GA":{"recorder":{"name":"Wilcox County Clerk of Superior Court","address":"103 N Broad St., Abbeville, GA 31001"},"assessor":{"name":"Wilcox County Tax Assessor","address":"103 N Broad St., Abbeville, GA 31001"}},"Wilkes County, GA":{"recorder":{"name":"Wilkes County Clerk of Superior Court","address":"23 E Court St. Suite 205, Washington, GA 30673"},"assessor":{"name":"Wilkes County Tax Assessor","address":"23 E Court St. Suite 205, Washington, GA 30673"}},"Wilkinson County, GA":{"recorder":{"name":"Wilkinson County Clerk of Superior Court","address":"100 W Gordon St., Irwinton, GA 31042"},"assessor":{"name":"Wilkinson County Tax Assessor","address":"100 W Gordon St., Irwinton, GA 31042"}},"Worth County, GA":{"recorder":{"name":"Worth County Clerk of Superior Court","address":"201 N Main Ave. Suite 3, Sylvester, GA 31791"},"assessor":{"name":"Worth County Tax Assessor","address":"201 N Main Ave. Suite 3, Sylvester, GA 31791"}},"Hawaii County, HI":{"recorder":{"name":"Hawaii Bureau of Conveyances (Statewide Recorder)","address":"1151 Punchbowl St. Suite 120, Honolulu, HI 96813","note":"Hawaii uses a single statewide recording system. All documents recorded at state BOC."},"assessor":{"name":"Hawaii County Real Property Tax Office","address":"74 Pu'uhonu Pl. Suite 4, Hilo, HI 96720"}},"Honolulu County, HI":{"recorder":{"name":"Hawaii Bureau of Conveyances (Statewide Recorder)","address":"1151 Punchbowl St. Suite 120, Honolulu, HI 96813","note":"Hawaii uses a single statewide recording system. All documents recorded at state BOC."},"assessor":{"name":"City & County of Honolulu Real Property Assessment Division","address":"842 Bethel St. Basement, Honolulu, HI 96813"}},"Kalawao County, HI":{"recorder":{"name":"Hawaii Bureau of Conveyances (Statewide Recorder)","address":"1151 Punchbowl St. Suite 120, Honolulu, HI 96813","note":"Hawaii uses a single statewide recording system. All documents recorded at state BOC."},"assessor":{"name":"Maui County Real Property Assessment Division (administers Kalawao)","address":"110 'Ala'ihi St. Suite 110, Kahului, HI 96732","note":"Kalawao County has no independent county government. Real property administered by Maui County RPAD."}},"Kauai County, HI":{"recorder":{"name":"Hawaii Bureau of Conveyances (Statewide Recorder)","address":"1151 Punchbowl St. Suite 120, Honolulu, HI 96813","note":"Hawaii uses a single statewide recording system. All documents recorded at state BOC."},"assessor":{"name":"Kauai County Real Property Assessment Division","address":"4444 Rice St. Suite 463, Lihue, HI 96766"}},"Maui County, HI":{"recorder":{"name":"Hawaii Bureau of Conveyances (Statewide Recorder)","address":"1151 Punchbowl St. Suite 120, Honolulu, HI 96813","note":"Hawaii uses a single statewide recording system. All documents recorded at state BOC."},"assessor":{"name":"Maui County Real Property Assessment Division","address":"110 'Ala'ihi St. Suite 110, Kahului, HI 96732"}},"Adair County, IA":{"recorder":{"name":"Adair County Recorder","address":"400 Public Square Suite 5, Greenfield, IA 50849"},"assessor":{"name":"Adair County Assessor","address":"400 Public Square Suite 5, Greenfield, IA 50849"}},"Adams County, IA":{"recorder":{"name":"Adams County Recorder","address":"500 9th St., Corning, IA 50841"},"assessor":{"name":"Adams County Assessor","address":"500 9th St., Corning, IA 50841"}},"Allamakee County, IA":{"recorder":{"name":"Allamakee County Recorder","address":"110 Allamakee St., Waukon, IA 52172"},"assessor":{"name":"Allamakee County Assessor","address":"110 Allamakee St., Waukon, IA 52172"}},"Appanoose County, IA":{"recorder":{"name":"Appanoose County Recorder","address":"201 N 12th St., Centerville, IA 52544"},"assessor":{"name":"Appanoose County Assessor","address":"201 N 12th St., Centerville, IA 52544"}},"Audubon County, IA":{"recorder":{"name":"Audubon County Recorder","address":"318 Leroy St., Audubon, IA 50025"},"assessor":{"name":"Audubon County Assessor","address":"318 Leroy St., Audubon, IA 50025"}},"Benton County, IA":{"recorder":{"name":"Benton County Recorder","address":"111 E 4th St., Vinton, IA 52349"},"assessor":{"name":"Benton County Assessor","address":"111 E 4th St., Vinton, IA 52349"}},"Black Hawk County, IA":{"recorder":{"name":"Black Hawk County Recorder","address":"316 E 5th St., Waterloo, IA 50703"},"assessor":{"name":"Black Hawk County Assessor","address":"316 E 5th St., Waterloo, IA 50703"}},"Boone County, IA":{"recorder":{"name":"Boone County Recorder","address":"201 State St., Boone, IA 50036"},"assessor":{"name":"Boone County Assessor","address":"201 State St., Boone, IA 50036"}},"Bremer County, IA":{"recorder":{"name":"Bremer County Recorder","address":"415 E Bremer Ave., Waverly, IA 50677"},"assessor":{"name":"Bremer County Assessor","address":"415 E Bremer Ave., Waverly, IA 50677"}},"Buchanan County, IA":{"recorder":{"name":"Buchanan County Recorder","address":"210 5th Ave NE, Independence, IA 50644"},"assessor":{"name":"Buchanan County Assessor","address":"210 5th Ave NE, Independence, IA 50644"}},"Buena Vista County, IA":{"recorder":{"name":"Buena Vista County Recorder","address":"215 E 5th St., Storm Lake, IA 50588"},"assessor":{"name":"Buena Vista County Assessor","address":"215 E 5th St., Storm Lake, IA 50588"}},"Butler County, IA":{"recorder":{"name":"Butler County Recorder","address":"428 6th St., Allison, IA 50602"},"assessor":{"name":"Butler County Assessor","address":"428 6th St., Allison, IA 50602"}},"Calhoun County, IA":{"recorder":{"name":"Calhoun County Recorder","address":"416 4th St., Rockwell City, IA 50579"},"assessor":{"name":"Calhoun County Assessor","address":"416 4th St., Rockwell City, IA 50579"}},"Carroll County, IA":{"recorder":{"name":"Carroll County Recorder","address":"114 E 6th St., Carroll, IA 51401"},"assessor":{"name":"Carroll County Assessor","address":"114 E 6th St., Carroll, IA 51401"}},"Cass County, IA":{"recorder":{"name":"Cass County Recorder","address":"5 W 7th St., Atlantic, IA 50022"},"assessor":{"name":"Cass County Assessor","address":"5 W 7th St., Atlantic, IA 50022"}},"Cedar County, IA":{"recorder":{"name":"Cedar County Recorder","address":"400 Cedar St., Tipton, IA 52772"},"assessor":{"name":"Cedar County Assessor","address":"400 Cedar St., Tipton, IA 52772"}},"Cerro Gordo County, IA":{"recorder":{"name":"Cerro Gordo County Recorder","address":"220 N Washington Ave., Mason City, IA 50401"},"assessor":{"name":"Cerro Gordo County Assessor","address":"220 N Washington Ave., Mason City, IA 50401"}},"Cherokee County, IA":{"recorder":{"name":"Cherokee County Recorder","address":"520 W Main St., Cherokee, IA 51012"},"assessor":{"name":"Cherokee County Assessor","address":"520 W Main St., Cherokee, IA 51012"}},"Chickasaw County, IA":{"recorder":{"name":"Chickasaw County Recorder","address":"8 E Prospect St., New Hampton, IA 50659"},"assessor":{"name":"Chickasaw County Assessor","address":"8 E Prospect St., New Hampton, IA 50659"}},"Clarke County, IA":{"recorder":{"name":"Clarke County Recorder","address":"100 S Main St., Osceola, IA 50213"},"assessor":{"name":"Clarke County Assessor","address":"100 S Main St., Osceola, IA 50213"}},"Clay County, IA":{"recorder":{"name":"Clay County Recorder","address":"215 W 4th St. Suite 6, Spencer, IA 51301"},"assessor":{"name":"Clay County Assessor","address":"215 W 4th St. Suite 6, Spencer, IA 51301"}},"Clayton County, IA":{"recorder":{"name":"Clayton County Recorder","address":"111 High St. NE, Elkader, IA 52043"},"assessor":{"name":"Clayton County Assessor","address":"111 High St. NE, Elkader, IA 52043"}},"Clinton County, IA":{"recorder":{"name":"Clinton County Recorder","address":"612 N 2nd St., Clinton, IA 52732"},"assessor":{"name":"Clinton County Assessor","address":"612 N 2nd St., Clinton, IA 52732"}},"Crawford County, IA":{"recorder":{"name":"Crawford County Recorder","address":"1202 Broadway, Denison, IA 51442"},"assessor":{"name":"Crawford County Assessor","address":"1202 Broadway, Denison, IA 51442"}},"Dallas County, IA":{"recorder":{"name":"Dallas County Recorder","address":"801 Court St., Adel, IA 50003"},"assessor":{"name":"Dallas County Assessor","address":"801 Court St., Adel, IA 50003"}},"Davis County, IA":{"recorder":{"name":"Davis County Recorder","address":"100 Courthouse Square, Bloomfield, IA 52537"},"assessor":{"name":"Davis County Assessor","address":"100 Courthouse Square, Bloomfield, IA 52537"}},"Decatur County, IA":{"recorder":{"name":"Decatur County Recorder","address":"207 N Main St., Leon, IA 50144"},"assessor":{"name":"Decatur County Assessor","address":"207 N Main St., Leon, IA 50144"}},"Delaware County, IA":{"recorder":{"name":"Delaware County Recorder","address":"301 E Main St., Manchester, IA 52057"},"assessor":{"name":"Delaware County Assessor","address":"301 E Main St., Manchester, IA 52057"}},"Des Moines County, IA":{"recorder":{"name":"Des Moines County Recorder","address":"513 N Main St., Burlington, IA 52601"},"assessor":{"name":"Des Moines County Assessor","address":"513 N Main St., Burlington, IA 52601"}},"Dickinson County, IA":{"recorder":{"name":"Dickinson County Recorder","address":"1802 Hill Ave. Suite 1400, Spirit Lake, IA 51360"},"assessor":{"name":"Dickinson County Assessor","address":"1802 Hill Ave. Suite 1400, Spirit Lake, IA 51360"}},"Dubuque County, IA":{"recorder":{"name":"Dubuque County Recorder","address":"720 Central Ave., Dubuque, IA 52001"},"assessor":{"name":"Dubuque County Assessor","address":"720 Central Ave., Dubuque, IA 52001"}},"Emmet County, IA":{"recorder":{"name":"Emmet County Recorder","address":"609 1st Ave N, Estherville, IA 51334"},"assessor":{"name":"Emmet County Assessor","address":"609 1st Ave N, Estherville, IA 51334"}},"Fayette County, IA":{"recorder":{"name":"Fayette County Recorder","address":"114 N Vine St., West Union, IA 52175"},"assessor":{"name":"Fayette County Assessor","address":"114 N Vine St., West Union, IA 52175"}},"Floyd County, IA":{"recorder":{"name":"Floyd County Recorder","address":"101 S Main St., Charles City, IA 50616"},"assessor":{"name":"Floyd County Assessor","address":"101 S Main St., Charles City, IA 50616"}},"Franklin County, IA":{"recorder":{"name":"Franklin County Recorder","address":"12 1st Ave NW, Hampton, IA 50441"},"assessor":{"name":"Franklin County Assessor","address":"12 1st Ave NW, Hampton, IA 50441"}},"Fremont County, IA":{"recorder":{"name":"Fremont County Recorder","address":"506 Filmore St., Sidney, IA 51652"},"assessor":{"name":"Fremont County Assessor","address":"506 Filmore St., Sidney, IA 51652"}},"Greene County, IA":{"recorder":{"name":"Greene County Recorder","address":"114 N Chestnut St., Jefferson, IA 50129"},"assessor":{"name":"Greene County Assessor","address":"114 N Chestnut St., Jefferson, IA 50129"}},"Grundy County, IA":{"recorder":{"name":"Grundy County Recorder","address":"706 G Ave., Grundy Center, IA 50638"},"assessor":{"name":"Grundy County Assessor","address":"706 G Ave., Grundy Center, IA 50638"}},"Guthrie County, IA":{"recorder":{"name":"Guthrie County Recorder","address":"200 N 5th St., Guthrie Center, IA 50115"},"assessor":{"name":"Guthrie County Assessor","address":"200 N 5th St., Guthrie Center, IA 50115"}},"Hamilton County, IA":{"recorder":{"name":"Hamilton County Recorder","address":"2300 Superior St., Webster City, IA 50595"},"assessor":{"name":"Hamilton County Assessor","address":"2300 Superior St., Webster City, IA 50595"}},"Hancock County, IA":{"recorder":{"name":"Hancock County Recorder","address":"855 State St., Garner, IA 50438"},"assessor":{"name":"Hancock County Assessor","address":"855 State St., Garner, IA 50438"}},"Hardin County, IA":{"recorder":{"name":"Hardin County Recorder","address":"1215 Edgington Ave., Eldora, IA 50627"},"assessor":{"name":"Hardin County Assessor","address":"1215 Edgington Ave., Eldora, IA 50627"}},"Harrison County, IA":{"recorder":{"name":"Harrison County Recorder","address":"111 N 2nd Ave., Logan, IA 51546"},"assessor":{"name":"Harrison County Assessor","address":"111 N 2nd Ave., Logan, IA 51546"}},"Henry County, IA":{"recorder":{"name":"Henry County Recorder","address":"100 E Washington St., Mount Pleasant, IA 52641"},"assessor":{"name":"Henry County Assessor","address":"100 E Washington St., Mount Pleasant, IA 52641"}},"Howard County, IA":{"recorder":{"name":"Howard County Recorder","address":"137 N Elm St., Cresco, IA 52136"},"assessor":{"name":"Howard County Assessor","address":"137 N Elm St., Cresco, IA 52136"}},"Humboldt County, IA":{"recorder":{"name":"Humboldt County Recorder","address":"203 Main St., Dakota City, IA 50529"},"assessor":{"name":"Humboldt County Assessor","address":"203 Main St., Dakota City, IA 50529"}},"Ida County, IA":{"recorder":{"name":"Ida County Recorder","address":"401 Moorehead St., Ida Grove, IA 51445"},"assessor":{"name":"Ida County Assessor","address":"401 Moorehead St., Ida Grove, IA 51445"}},"Iowa County, IA":{"recorder":{"name":"Iowa County Recorder","address":"901 Court Ave., Marengo, IA 52301"},"assessor":{"name":"Iowa County Assessor","address":"901 Court Ave., Marengo, IA 52301"}},"Jackson County, IA":{"recorder":{"name":"Jackson County Recorder","address":"201 W Platt St., Maquoketa, IA 52060"},"assessor":{"name":"Jackson County Assessor","address":"201 W Platt St., Maquoketa, IA 52060"}},"Jasper County, IA":{"recorder":{"name":"Jasper County Recorder","address":"101 1st St N, Newton, IA 50208"},"assessor":{"name":"Jasper County Assessor","address":"101 1st St N, Newton, IA 50208"}},"Jefferson County, IA":{"recorder":{"name":"Jefferson County Recorder","address":"51 W Briggs Ave., Fairfield, IA 52556"},"assessor":{"name":"Jefferson County Assessor","address":"51 W Briggs Ave., Fairfield, IA 52556"}},"Johnson County, IA":{"recorder":{"name":"Johnson County Recorder","address":"913 S Dubuque St., Iowa City, IA 52240"},"assessor":{"name":"Johnson County Assessor","address":"913 S Dubuque St., Iowa City, IA 52240"}},"Jones County, IA":{"recorder":{"name":"Jones County Recorder","address":"500 W Main St., Anamosa, IA 52205"},"assessor":{"name":"Jones County Assessor","address":"500 W Main St., Anamosa, IA 52205"}},"Keokuk County, IA":{"recorder":{"name":"Keokuk County Recorder","address":"101 S Main St., Sigourney, IA 52591"},"assessor":{"name":"Keokuk County Assessor","address":"101 S Main St., Sigourney, IA 52591"}},"Kossuth County, IA":{"recorder":{"name":"Kossuth County Recorder","address":"114 W State St., Algona, IA 50511"},"assessor":{"name":"Kossuth County Assessor","address":"114 W State St., Algona, IA 50511"}},"Lee County, IA":{"recorder":{"name":"Lee County Recorder","address":"25 N 7th St., Keokuk, IA 52632"},"assessor":{"name":"Lee County Assessor","address":"25 N 7th St., Keokuk, IA 52632"}},"Linn County, IA":{"recorder":{"name":"Linn County Recorder","address":"935 2nd St SW, Cedar Rapids, IA 52404"},"assessor":{"name":"Linn County Assessor","address":"935 2nd St SW, Cedar Rapids, IA 52404"}},"Louisa County, IA":{"recorder":{"name":"Louisa County Recorder","address":"117 S Main St., Wapello, IA 52653"},"assessor":{"name":"Louisa County Assessor","address":"117 S Main St., Wapello, IA 52653"}},"Lucas County, IA":{"recorder":{"name":"Lucas County Recorder","address":"916 Braden Ave., Chariton, IA 50049"},"assessor":{"name":"Lucas County Assessor","address":"916 Braden Ave., Chariton, IA 50049"}},"Lyon County, IA":{"recorder":{"name":"Lyon County Recorder","address":"206 S 2nd Ave., Rock Rapids, IA 51246"},"assessor":{"name":"Lyon County Assessor","address":"206 S 2nd Ave., Rock Rapids, IA 51246"}},"Madison County, IA":{"recorder":{"name":"Madison County Recorder","address":"112 N John Wayne Dr., Winterset, IA 50273"},"assessor":{"name":"Madison County Assessor","address":"112 N John Wayne Dr., Winterset, IA 50273"}},"Mahaska County, IA":{"recorder":{"name":"Mahaska County Recorder","address":"106 S 1st St., Oskaloosa, IA 52577"},"assessor":{"name":"Mahaska County Assessor","address":"106 S 1st St., Oskaloosa, IA 52577"}},"Marion County, IA":{"recorder":{"name":"Marion County Recorder","address":"214 E Main St., Knoxville, IA 50138"},"assessor":{"name":"Marion County Assessor","address":"214 E Main St., Knoxville, IA 50138"}},"Marshall County, IA":{"recorder":{"name":"Marshall County Recorder","address":"1 E Main St., Marshalltown, IA 50158"},"assessor":{"name":"Marshall County Assessor","address":"1 E Main St., Marshalltown, IA 50158"}},"Mills County, IA":{"recorder":{"name":"Mills County Recorder","address":"418 Sharp St., Glenwood, IA 51534"},"assessor":{"name":"Mills County Assessor","address":"418 Sharp St., Glenwood, IA 51534"}},"Mitchell County, IA":{"recorder":{"name":"Mitchell County Recorder","address":"508 State St., Osage, IA 50461"},"assessor":{"name":"Mitchell County Assessor","address":"508 State St., Osage, IA 50461"}},"Monona County, IA":{"recorder":{"name":"Monona County Recorder","address":"610 Iowa Ave., Onawa, IA 51040"},"assessor":{"name":"Monona County Assessor","address":"610 Iowa Ave., Onawa, IA 51040"}},"Monroe County, IA":{"recorder":{"name":"Monroe County Recorder","address":"10 Benton Ave E, Albia, IA 52531"},"assessor":{"name":"Monroe County Assessor","address":"10 Benton Ave E, Albia, IA 52531"}},"Montgomery County, IA":{"recorder":{"name":"Montgomery County Recorder","address":"105 E Coolbaugh St., Red Oak, IA 51566"},"assessor":{"name":"Montgomery County Assessor","address":"105 E Coolbaugh St., Red Oak, IA 51566"}},"Muscatine County, IA":{"recorder":{"name":"Muscatine County Recorder","address":"401 E 3rd St., Muscatine, IA 52761"},"assessor":{"name":"Muscatine County Assessor","address":"401 E 3rd St., Muscatine, IA 52761"}},"O'Brien County, IA":{"recorder":{"name":"O'Brien County Recorder","address":"155 S Hayes Ave., Primghar, IA 51245"},"assessor":{"name":"O'Brien County Assessor","address":"155 S Hayes Ave., Primghar, IA 51245"}},"Osceola County, IA":{"recorder":{"name":"Osceola County Recorder","address":"300 7th St., Sibley, IA 51249"},"assessor":{"name":"Osceola County Assessor","address":"300 7th St., Sibley, IA 51249"}},"Page County, IA":{"recorder":{"name":"Page County Recorder","address":"112 E Main St., Clarinda, IA 51632"},"assessor":{"name":"Page County Assessor","address":"112 E Main St., Clarinda, IA 51632"}},"Palo Alto County, IA":{"recorder":{"name":"Palo Alto County Recorder","address":"1010 Broadway St., Emmetsburg, IA 50536"},"assessor":{"name":"Palo Alto County Assessor","address":"1010 Broadway St., Emmetsburg, IA 50536"}},"Plymouth County, IA":{"recorder":{"name":"Plymouth County Recorder","address":"215 4th Ave SE, Le Mars, IA 51031"},"assessor":{"name":"Plymouth County Assessor","address":"215 4th Ave SE, Le Mars, IA 51031"}},"Pocahontas County, IA":{"recorder":{"name":"Pocahontas County Recorder","address":"99 Court Square, Pocahontas, IA 50574"},"assessor":{"name":"Pocahontas County Assessor","address":"99 Court Square, Pocahontas, IA 50574"}},"Polk County, IA":{"recorder":{"name":"Polk County Recorder","address":"111 Court Ave. Suite 240, Des Moines, IA 50309"},"assessor":{"name":"Polk County Assessor","address":"111 Court Ave. Suite 195, Des Moines, IA 50309"}},"Pottawattamie County, IA":{"recorder":{"name":"Pottawattamie County Recorder","address":"227 S 6th St., Council Bluffs, IA 51501"},"assessor":{"name":"Pottawattamie County Assessor","address":"227 S 6th St., Council Bluffs, IA 51501"}},"Poweshiek County, IA":{"recorder":{"name":"Poweshiek County Recorder","address":"302 E Main St., Montezuma, IA 50171"},"assessor":{"name":"Poweshiek County Assessor","address":"302 E Main St., Montezuma, IA 50171"}},"Ringgold County, IA":{"recorder":{"name":"Ringgold County Recorder","address":"109 W Madison St., Mount Ayr, IA 50854"},"assessor":{"name":"Ringgold County Assessor","address":"109 W Madison St., Mount Ayr, IA 50854"}},"Sac County, IA":{"recorder":{"name":"Sac County Recorder","address":"100 NW State St. Suite 9, Sac City, IA 50583"},"assessor":{"name":"Sac County Assessor","address":"100 NW State St. Suite 9, Sac City, IA 50583"}},"Scott County, IA":{"recorder":{"name":"Scott County Recorder","address":"600 W 4th St., Davenport, IA 52801"},"assessor":{"name":"Scott County Assessor","address":"600 W 4th St., Davenport, IA 52801"}},"Shelby County, IA":{"recorder":{"name":"Shelby County Recorder","address":"612 Court St., Harlan, IA 51537"},"assessor":{"name":"Shelby County Assessor","address":"612 Court St., Harlan, IA 51537"}},"Sioux County, IA":{"recorder":{"name":"Sioux County Recorder","address":"210 Central Ave SW, Orange City, IA 51041"},"assessor":{"name":"Sioux County Assessor","address":"210 Central Ave SW, Orange City, IA 51041"}},"Story County, IA":{"recorder":{"name":"Story County Recorder","address":"900 6th St., Nevada, IA 50201"},"assessor":{"name":"Story County Assessor","address":"900 6th St., Nevada, IA 50201"}},"Tama County, IA":{"recorder":{"name":"Tama County Recorder","address":"100 W High St., Toledo, IA 52342"},"assessor":{"name":"Tama County Assessor","address":"100 W High St., Toledo, IA 52342"}},"Taylor County, IA":{"recorder":{"name":"Taylor County Recorder","address":"405 Jefferson St., Bedford, IA 50833"},"assessor":{"name":"Taylor County Assessor","address":"405 Jefferson St., Bedford, IA 50833"}},"Union County, IA":{"recorder":{"name":"Union County Recorder","address":"300 N Pine St., Creston, IA 50801"},"assessor":{"name":"Union County Assessor","address":"300 N Pine St., Creston, IA 50801"}},"Van Buren County, IA":{"recorder":{"name":"Van Buren County Recorder","address":"4 Dodge St., Keosauqua, IA 52565"},"assessor":{"name":"Van Buren County Assessor","address":"4 Dodge St., Keosauqua, IA 52565"}},"Wapello County, IA":{"recorder":{"name":"Wapello County Recorder","address":"101 W 4th St., Ottumwa, IA 52501"},"assessor":{"name":"Wapello County Assessor","address":"101 W 4th St., Ottumwa, IA 52501"}},"Warren County, IA":{"recorder":{"name":"Warren County Recorder","address":"301 N Buxton St., Indianola, IA 50125"},"assessor":{"name":"Warren County Assessor","address":"301 N Buxton St., Indianola, IA 50125"}},"Washington County, IA":{"recorder":{"name":"Washington County Recorder","address":"222 W Main St., Washington, IA 52353"},"assessor":{"name":"Washington County Assessor","address":"222 W Main St., Washington, IA 52353"}},"Wayne County, IA":{"recorder":{"name":"Wayne County Recorder","address":"100 N Lafayette St., Corydon, IA 50060"},"assessor":{"name":"Wayne County Assessor","address":"100 N Lafayette St., Corydon, IA 50060"}},"Webster County, IA":{"recorder":{"name":"Webster County Recorder","address":"701 Central Ave., Fort Dodge, IA 50501"},"assessor":{"name":"Webster County Assessor","address":"701 Central Ave., Fort Dodge, IA 50501"}},"Winnebago County, IA":{"recorder":{"name":"Winnebago County Recorder","address":"126 S Clark St., Forest City, IA 50436"},"assessor":{"name":"Winnebago County Assessor","address":"126 S Clark St., Forest City, IA 50436"}},"Winneshiek County, IA":{"recorder":{"name":"Winneshiek County Recorder","address":"201 W Main St., Decorah, IA 52101"},"assessor":{"name":"Winneshiek County Assessor","address":"201 W Main St., Decorah, IA 52101"}},"Woodbury County, IA":{"recorder":{"name":"Woodbury County Recorder","address":"620 Douglas St. Suite 115, Sioux City, IA 51101"},"assessor":{"name":"Woodbury County Assessor","address":"620 Douglas St. Suite 115, Sioux City, IA 51101"}},"Worth County, IA":{"recorder":{"name":"Worth County Recorder","address":"1000 Central Ave., Northwood, IA 50459"},"assessor":{"name":"Worth County Assessor","address":"1000 Central Ave., Northwood, IA 50459"}},"Wright County, IA":{"recorder":{"name":"Wright County Recorder","address":"115 N Main Ave., Clarion, IA 50525"},"assessor":{"name":"Wright County Assessor","address":"115 N Main Ave., Clarion, IA 50525"}},"Ada County, ID":{"recorder":{"name":"Ada County Clerk","address":"200 W Front St., Boise, ID 83702"},"assessor":{"name":"Ada County Assessor","address":"190 E Front St. Suite 107, Boise, ID 83702"}},"Adams County, ID":{"recorder":{"name":"Adams County Clerk","address":"201 Industrial Ave., Council, ID 83612"},"assessor":{"name":"Adams County Assessor","address":"201 Industrial Ave., Council, ID 83612"}},"Bannock County, ID":{"recorder":{"name":"Bannock County Clerk","address":"624 E Center St., Pocatello, ID 83201"},"assessor":{"name":"Bannock County Assessor","address":"624 E Center St., Pocatello, ID 83201"}},"Bear Lake County, ID":{"recorder":{"name":"Bear Lake County Clerk","address":"7 E Center St., Paris, ID 83261"},"assessor":{"name":"Bear Lake County Assessor","address":"7 E Center St., Paris, ID 83261"}},"Benewah County, ID":{"recorder":{"name":"Benewah County Clerk","address":"701 W College Ave., St. Maries, ID 83861"},"assessor":{"name":"Benewah County Assessor","address":"701 W College Ave., St. Maries, ID 83861"}},"Bingham County, ID":{"recorder":{"name":"Bingham County Clerk","address":"501 N Maple St., Blackfoot, ID 83221"},"assessor":{"name":"Bingham County Assessor","address":"501 N Maple St., Blackfoot, ID 83221"}},"Blaine County, ID":{"recorder":{"name":"Blaine County Clerk","address":"206 1st Ave S., Hailey, ID 83333"},"assessor":{"name":"Blaine County Assessor","address":"206 1st Ave S., Hailey, ID 83333"}},"Boise County, ID":{"recorder":{"name":"Boise County Clerk","address":"419 Main St., Idaho City, ID 83631"},"assessor":{"name":"Boise County Assessor","address":"419 Main St., Idaho City, ID 83631"}},"Bonner County, ID":{"recorder":{"name":"Bonner County Clerk","address":"215 S 1st Ave., Sandpoint, ID 83864"},"assessor":{"name":"Bonner County Assessor","address":"215 S 1st Ave., Sandpoint, ID 83864"}},"Bonneville County, ID":{"recorder":{"name":"Bonneville County Clerk","address":"605 N Capital Ave., Idaho Falls, ID 83402"},"assessor":{"name":"Bonneville County Assessor","address":"605 N Capital Ave., Idaho Falls, ID 83402"}},"Boundary County, ID":{"recorder":{"name":"Boundary County Clerk","address":"6452 Kootenai St., Bonners Ferry, ID 83805"},"assessor":{"name":"Boundary County Assessor","address":"6452 Kootenai St., Bonners Ferry, ID 83805"}},"Butte County, ID":{"recorder":{"name":"Butte County Clerk","address":"248 W Grand Ave., Arco, ID 83213"},"assessor":{"name":"Butte County Assessor","address":"248 W Grand Ave., Arco, ID 83213"}},"Camas County, ID":{"recorder":{"name":"Camas County Clerk","address":"501 Soldier Rd., Fairfield, ID 83327"},"assessor":{"name":"Camas County Assessor","address":"501 Soldier Rd., Fairfield, ID 83327"}},"Canyon County, ID":{"recorder":{"name":"Canyon County Clerk","address":"1115 Albany St., Caldwell, ID 83605"},"assessor":{"name":"Canyon County Assessor","address":"111 N 11th Ave. Suite 240, Caldwell, ID 83605"}},"Caribou County, ID":{"recorder":{"name":"Caribou County Clerk","address":"159 S Main St., Soda Springs, ID 83276"},"assessor":{"name":"Caribou County Assessor","address":"159 S Main St., Soda Springs, ID 83276"}},"Cassia County, ID":{"recorder":{"name":"Cassia County Clerk","address":"1459 Overland Rd., Burley, ID 83318"},"assessor":{"name":"Cassia County Assessor","address":"1459 Overland Rd., Burley, ID 83318"}},"Clark County, ID":{"recorder":{"name":"Clark County Clerk","address":"224 W Main St., Dubois, ID 83423"},"assessor":{"name":"Clark County Assessor","address":"224 W Main St., Dubois, ID 83423"}},"Clearwater County, ID":{"recorder":{"name":"Clearwater County Clerk","address":"150 Michigan Ave., Orofino, ID 83544"},"assessor":{"name":"Clearwater County Assessor","address":"150 Michigan Ave., Orofino, ID 83544"}},"Custer County, ID":{"recorder":{"name":"Custer County Clerk","address":"801 E Main Ave., Challis, ID 83226"},"assessor":{"name":"Custer County Assessor","address":"801 E Main Ave., Challis, ID 83226"}},"Elmore County, ID":{"recorder":{"name":"Elmore County Clerk","address":"150 S 4th E Suite 5, Mountain Home, ID 83647"},"assessor":{"name":"Elmore County Assessor","address":"150 S 4th E Suite 5, Mountain Home, ID 83647"}},"Franklin County, ID":{"recorder":{"name":"Franklin County Clerk","address":"39 W Oneida St., Preston, ID 83263"},"assessor":{"name":"Franklin County Assessor","address":"39 W Oneida St., Preston, ID 83263"}},"Fremont County, ID":{"recorder":{"name":"Fremont County Clerk","address":"151 W 1st N, St. Anthony, ID 83445"},"assessor":{"name":"Fremont County Assessor","address":"151 W 1st N, St. Anthony, ID 83445"}},"Gem County, ID":{"recorder":{"name":"Gem County Clerk","address":"415 E Main St., Emmett, ID 83617"},"assessor":{"name":"Gem County Assessor","address":"415 E Main St., Emmett, ID 83617"}},"Gooding County, ID":{"recorder":{"name":"Gooding County Clerk","address":"624 Main St., Gooding, ID 83330"},"assessor":{"name":"Gooding County Assessor","address":"624 Main St., Gooding, ID 83330"}},"Idaho County, ID":{"recorder":{"name":"Idaho County Clerk","address":"320 W Main St. Suite 23, Grangeville, ID 83530"},"assessor":{"name":"Idaho County Assessor","address":"320 W Main St. Suite 23, Grangeville, ID 83530"}},"Jefferson County, ID":{"recorder":{"name":"Jefferson County Clerk","address":"210 Courthouse Way Suite 120, Rigby, ID 83442"},"assessor":{"name":"Jefferson County Assessor","address":"210 Courthouse Way Suite 120, Rigby, ID 83442"}},"Jerome County, ID":{"recorder":{"name":"Jerome County Clerk","address":"300 N Lincoln Ave., Jerome, ID 83338"},"assessor":{"name":"Jerome County Assessor","address":"300 N Lincoln Ave., Jerome, ID 83338"}},"Kootenai County, ID":{"recorder":{"name":"Kootenai County Clerk","address":"451 N Government Way, Coeur d'Alene, ID 83814"},"assessor":{"name":"Kootenai County Assessor","address":"451 N Government Way, Coeur d'Alene, ID 83814"}},"Latah County, ID":{"recorder":{"name":"Latah County Clerk","address":"522 S Adams St., Moscow, ID 83843"},"assessor":{"name":"Latah County Assessor","address":"522 S Adams St., Moscow, ID 83843"}},"Lemhi County, ID":{"recorder":{"name":"Lemhi County Clerk","address":"206 Courthouse Dr., Salmon, ID 83467"},"assessor":{"name":"Lemhi County Assessor","address":"206 Courthouse Dr., Salmon, ID 83467"}},"Lewis County, ID":{"recorder":{"name":"Lewis County Clerk","address":"510 Oak St., Nezperce, ID 83543"},"assessor":{"name":"Lewis County Assessor","address":"510 Oak St., Nezperce, ID 83543"}},"Lincoln County, ID":{"recorder":{"name":"Lincoln County Clerk","address":"111 W B St., Shoshone, ID 83352"},"assessor":{"name":"Lincoln County Assessor","address":"111 W B St., Shoshone, ID 83352"}},"Madison County, ID":{"recorder":{"name":"Madison County Clerk","address":"134 E Main St., Rexburg, ID 83440"},"assessor":{"name":"Madison County Assessor","address":"134 E Main St., Rexburg, ID 83440"}},"Minidoka County, ID":{"recorder":{"name":"Minidoka County Clerk","address":"715 G St., Rupert, ID 83350"},"assessor":{"name":"Minidoka County Assessor","address":"715 G St., Rupert, ID 83350"}},"Nez Perce County, ID":{"recorder":{"name":"Nez Perce County Clerk","address":"1230 Main St., Lewiston, ID 83501"},"assessor":{"name":"Nez Perce County Assessor","address":"1230 Main St., Lewiston, ID 83501"}},"Oneida County, ID":{"recorder":{"name":"Oneida County Clerk","address":"10 Courthouse Way, Malad City, ID 83252"},"assessor":{"name":"Oneida County Assessor","address":"10 Courthouse Way, Malad City, ID 83252"}},"Owyhee County, ID":{"recorder":{"name":"Owyhee County Clerk","address":"20381 State Hwy 78, Murphy, ID 83650"},"assessor":{"name":"Owyhee County Assessor","address":"20381 State Hwy 78, Murphy, ID 83650"}},"Payette County, ID":{"recorder":{"name":"Payette County Clerk","address":"1130 3rd Ave N, Payette, ID 83661"},"assessor":{"name":"Payette County Assessor","address":"1130 3rd Ave N, Payette, ID 83661"}},"Power County, ID":{"recorder":{"name":"Power County Clerk","address":"543 Bannock Ave., American Falls, ID 83211"},"assessor":{"name":"Power County Assessor","address":"543 Bannock Ave., American Falls, ID 83211"}},"Shoshone County, ID":{"recorder":{"name":"Shoshone County Clerk","address":"700 Bank St., Wallace, ID 83873"},"assessor":{"name":"Shoshone County Assessor","address":"700 Bank St., Wallace, ID 83873"}},"Teton County, ID":{"recorder":{"name":"Teton County Clerk","address":"150 Courthouse Dr., Driggs, ID 83422"},"assessor":{"name":"Teton County Assessor","address":"150 Courthouse Dr., Driggs, ID 83422"}},"Twin Falls County, ID":{"recorder":{"name":"Twin Falls County Clerk","address":"630 Addison Ave W, Twin Falls, ID 83301"},"assessor":{"name":"Twin Falls County Assessor","address":"630 Addison Ave W, Twin Falls, ID 83301"}},"Valley County, ID":{"recorder":{"name":"Valley County Clerk","address":"219 N Main St., Cascade, ID 83611"},"assessor":{"name":"Valley County Assessor","address":"219 N Main St., Cascade, ID 83611"}},"Washington County, ID":{"recorder":{"name":"Washington County Clerk","address":"256 E Court St., Weiser, ID 83672"},"assessor":{"name":"Washington County Assessor","address":"256 E Court St., Weiser, ID 83672"}},"Adams County, IL":{"recorder":{"name":"Adams County Recorder","address":"521 Vermont St., Quincy, IL 62301"},"assessor":{"name":"Adams County Assessor","address":"521 Vermont St., Quincy, IL 62301"}},"Alexander County, IL":{"recorder":{"name":"Alexander County Recorder","address":"2000 Washington Ave., Cairo, IL 62914"},"assessor":{"name":"Alexander County Assessor","address":"2000 Washington Ave., Cairo, IL 62914"}},"Bond County, IL":{"recorder":{"name":"Bond County Recorder","address":"200 W College Ave., Greenville, IL 62246"},"assessor":{"name":"Bond County Assessor","address":"200 W College Ave., Greenville, IL 62246"}},"Boone County, IL":{"recorder":{"name":"Boone County Recorder","address":"601 N Main St. Suite 302, Belvidere, IL 61008"},"assessor":{"name":"Boone County Assessor","address":"601 N Main St. Suite 302, Belvidere, IL 61008"}},"Brown County, IL":{"recorder":{"name":"Brown County Recorder","address":"200 Court St., Mount Sterling, IL 62353"},"assessor":{"name":"Brown County Assessor","address":"200 Court St., Mount Sterling, IL 62353"}},"Bureau County, IL":{"recorder":{"name":"Bureau County Recorder","address":"700 S Main St., Princeton, IL 61356"},"assessor":{"name":"Bureau County Assessor","address":"700 S Main St., Princeton, IL 61356"}},"Calhoun County, IL":{"recorder":{"name":"Calhoun County Recorder","address":"102 County Road, Hardin, IL 62047"},"assessor":{"name":"Calhoun County Assessor","address":"102 County Road, Hardin, IL 62047"}},"Carroll County, IL":{"recorder":{"name":"Carroll County Recorder","address":"301 N Main St., Mount Carroll, IL 61053"},"assessor":{"name":"Carroll County Assessor","address":"301 N Main St., Mount Carroll, IL 61053"}},"Cass County, IL":{"recorder":{"name":"Cass County Recorder","address":"100 E Springfield St., Virginia, IL 62691"},"assessor":{"name":"Cass County Assessor","address":"100 E Springfield St., Virginia, IL 62691"}},"Champaign County, IL":{"recorder":{"name":"Champaign County Recorder","address":"1776 E Washington St., Urbana, IL 61802"},"assessor":{"name":"Champaign County Assessor","address":"1776 E Washington St., Urbana, IL 61802"}},"Christian County, IL":{"recorder":{"name":"Christian County Recorder","address":"101 S Main St., Taylorville, IL 62568"},"assessor":{"name":"Christian County Assessor","address":"101 S Main St., Taylorville, IL 62568"}},"Clark County, IL":{"recorder":{"name":"Clark County Recorder","address":"501 Archer Ave., Marshall, IL 62441"},"assessor":{"name":"Clark County Assessor","address":"501 Archer Ave., Marshall, IL 62441"}},"Clay County, IL":{"recorder":{"name":"Clay County Recorder","address":"111 Chestnut St., Louisville, IL 62858"},"assessor":{"name":"Clay County Assessor","address":"111 Chestnut St., Louisville, IL 62858"}},"Clinton County, IL":{"recorder":{"name":"Clinton County Recorder","address":"850 Fairfax St., Carlyle, IL 62231"},"assessor":{"name":"Clinton County Assessor","address":"850 Fairfax St., Carlyle, IL 62231"}},"Coles County, IL":{"recorder":{"name":"Coles County Recorder","address":"651 Jackson Ave. Suite 133, Charleston, IL 61920"},"assessor":{"name":"Coles County Assessor","address":"651 Jackson Ave. Suite 133, Charleston, IL 61920"}},"Cook County, IL":{"recorder":{"name":"Cook County Recorder of Deeds","address":"118 N Clark St. Room 120, Chicago, IL 60602"},"assessor":{"name":"Cook County Assessor","address":"118 N Clark St. Room 320, Chicago, IL 60602"}},"Crawford County, IL":{"recorder":{"name":"Crawford County Recorder","address":"112 E Walnut St., Robinson, IL 62454"},"assessor":{"name":"Crawford County Assessor","address":"112 E Walnut St., Robinson, IL 62454"}},"Cumberland County, IL":{"recorder":{"name":"Cumberland County Recorder","address":"Toledo, IL 62468"},"assessor":{"name":"Cumberland County Assessor","address":"Toledo, IL 62468"}},"DeKalb County, IL":{"recorder":{"name":"DeKalb County Recorder","address":"110 E Sycamore St., Sycamore, IL 60178"},"assessor":{"name":"DeKalb County Assessor","address":"110 E Sycamore St., Sycamore, IL 60178"}},"DeWitt County, IL":{"recorder":{"name":"DeWitt County Recorder","address":"201 W Washington St., Clinton, IL 61727"},"assessor":{"name":"DeWitt County Assessor","address":"201 W Washington St., Clinton, IL 61727"}},"Douglas County, IL":{"recorder":{"name":"Douglas County Recorder","address":"401 S Center St., Tuscola, IL 61953"},"assessor":{"name":"Douglas County Assessor","address":"401 S Center St., Tuscola, IL 61953"}},"DuPage County, IL":{"recorder":{"name":"DuPage County Recorder","address":"421 N County Farm Rd., Wheaton, IL 60187"},"assessor":{"name":"DuPage County Assessor","address":"421 N County Farm Rd., Wheaton, IL 60187"}},"Edgar County, IL":{"recorder":{"name":"Edgar County Recorder","address":"115 W Court St., Paris, IL 61944"},"assessor":{"name":"Edgar County Assessor","address":"115 W Court St., Paris, IL 61944"}},"Edwards County, IL":{"recorder":{"name":"Edwards County Recorder","address":"50 E Main St., Albion, IL 62806"},"assessor":{"name":"Edwards County Assessor","address":"50 E Main St., Albion, IL 62806"}},"Effingham County, IL":{"recorder":{"name":"Effingham County Recorder","address":"101 N 4th St., Effingham, IL 62401"},"assessor":{"name":"Effingham County Assessor","address":"101 N 4th St., Effingham, IL 62401"}},"Fayette County, IL":{"recorder":{"name":"Fayette County Recorder","address":"221 S 7th St., Vandalia, IL 62471"},"assessor":{"name":"Fayette County Assessor","address":"221 S 7th St., Vandalia, IL 62471"}},"Ford County, IL":{"recorder":{"name":"Ford County Recorder","address":"200 W State St., Paxton, IL 60957"},"assessor":{"name":"Ford County Assessor","address":"200 W State St., Paxton, IL 60957"}},"Franklin County, IL":{"recorder":{"name":"Franklin County Recorder","address":"202 W Main St., Benton, IL 62812"},"assessor":{"name":"Franklin County Assessor","address":"202 W Main St., Benton, IL 62812"}},"Fulton County, IL":{"recorder":{"name":"Fulton County Recorder","address":"100 N Main St., Lewistown, IL 61542"},"assessor":{"name":"Fulton County Assessor","address":"100 N Main St., Lewistown, IL 61542"}},"Gallatin County, IL":{"recorder":{"name":"Gallatin County Recorder","address":"484 Lincoln Blvd., Shawneetown, IL 62984"},"assessor":{"name":"Gallatin County Assessor","address":"484 Lincoln Blvd., Shawneetown, IL 62984"}},"Greene County, IL":{"recorder":{"name":"Greene County Recorder","address":"519 N Main St., Carrollton, IL 62016"},"assessor":{"name":"Greene County Assessor","address":"519 N Main St., Carrollton, IL 62016"}},"Grundy County, IL":{"recorder":{"name":"Grundy County Recorder","address":"111 E Washington St., Morris, IL 60450"},"assessor":{"name":"Grundy County Assessor","address":"111 E Washington St., Morris, IL 60450"}},"Hamilton County, IL":{"recorder":{"name":"Hamilton County Recorder","address":"100 S Jackson St., McLeansboro, IL 62859"},"assessor":{"name":"Hamilton County Assessor","address":"100 S Jackson St., McLeansboro, IL 62859"}},"Hancock County, IL":{"recorder":{"name":"Hancock County Recorder","address":"500 Main St., Carthage, IL 62321"},"assessor":{"name":"Hancock County Assessor","address":"500 Main St., Carthage, IL 62321"}},"Hardin County, IL":{"recorder":{"name":"Hardin County Recorder","address":"Elizabethtown, IL 62931"},"assessor":{"name":"Hardin County Assessor","address":"Elizabethtown, IL 62931"}},"Henderson County, IL":{"recorder":{"name":"Henderson County Recorder","address":"Oquawka, IL 61469"},"assessor":{"name":"Henderson County Assessor","address":"Oquawka, IL 61469"}},"Henry County, IL":{"recorder":{"name":"Henry County Recorder","address":"307 W Center St., Cambridge, IL 61238"},"assessor":{"name":"Henry County Assessor","address":"307 W Center St., Cambridge, IL 61238"}},"Iroquois County, IL":{"recorder":{"name":"Iroquois County Recorder","address":"550 S 10th St., Watseka, IL 60970"},"assessor":{"name":"Iroquois County Assessor","address":"550 S 10th St., Watseka, IL 60970"}},"Jackson County, IL":{"recorder":{"name":"Jackson County Recorder","address":"1001 Walnut St., Murphysboro, IL 62966"},"assessor":{"name":"Jackson County Assessor","address":"1001 Walnut St., Murphysboro, IL 62966"}},"Jasper County, IL":{"recorder":{"name":"Jasper County Recorder","address":"100 W Jourdan St., Newton, IL 62448"},"assessor":{"name":"Jasper County Assessor","address":"100 W Jourdan St., Newton, IL 62448"}},"Jefferson County, IL":{"recorder":{"name":"Jefferson County Recorder","address":"100 S 10th St., Mount Vernon, IL 62864"},"assessor":{"name":"Jefferson County Assessor","address":"100 S 10th St., Mount Vernon, IL 62864"}},"Jersey County, IL":{"recorder":{"name":"Jersey County Recorder","address":"201 W Pearl St., Jerseyville, IL 62052"},"assessor":{"name":"Jersey County Assessor","address":"201 W Pearl St., Jerseyville, IL 62052"}},"Jo Daviess County, IL":{"recorder":{"name":"Jo Daviess County Recorder","address":"330 N Bench St., Galena, IL 61036"},"assessor":{"name":"Jo Daviess County Assessor","address":"330 N Bench St., Galena, IL 61036"}},"Johnson County, IL":{"recorder":{"name":"Johnson County Recorder","address":"511 Broadway, Vienna, IL 62995"},"assessor":{"name":"Johnson County Assessor","address":"511 Broadway, Vienna, IL 62995"}},"Kane County, IL":{"recorder":{"name":"Kane County Recorder","address":"719 S Batavia Ave. Bldg B, Geneva, IL 60134"},"assessor":{"name":"Kane County Assessor","address":"719 S Batavia Ave. Bldg B, Geneva, IL 60134"}},"Kankakee County, IL":{"recorder":{"name":"Kankakee County Recorder","address":"189 E Court St., Kankakee, IL 60901"},"assessor":{"name":"Kankakee County Assessor","address":"189 E Court St., Kankakee, IL 60901"}},"Kendall County, IL":{"recorder":{"name":"Kendall County Recorder","address":"111 W Fox St., Yorkville, IL 60560"},"assessor":{"name":"Kendall County Assessor","address":"111 W Fox St., Yorkville, IL 60560"}},"Knox County, IL":{"recorder":{"name":"Knox County Recorder","address":"200 S Cherry St., Galesburg, IL 61401"},"assessor":{"name":"Knox County Assessor","address":"200 S Cherry St., Galesburg, IL 61401"}},"Lake County, IL":{"recorder":{"name":"Lake County Recorder","address":"18 N County St., Waukegan, IL 60085"},"assessor":{"name":"Lake County Assessor","address":"18 N County St., Waukegan, IL 60085"}},"LaSalle County, IL":{"recorder":{"name":"LaSalle County Recorder","address":"707 E Etna Rd., Ottawa, IL 61350"},"assessor":{"name":"LaSalle County Assessor","address":"707 E Etna Rd., Ottawa, IL 61350"}},"Lawrence County, IL":{"recorder":{"name":"Lawrence County Recorder","address":"1100 State St., Lawrenceville, IL 62439"},"assessor":{"name":"Lawrence County Assessor","address":"1100 State St., Lawrenceville, IL 62439"}},"Lee County, IL":{"recorder":{"name":"Lee County Recorder","address":"112 E 2nd St., Dixon, IL 61021"},"assessor":{"name":"Lee County Assessor","address":"112 E 2nd St., Dixon, IL 61021"}},"Livingston County, IL":{"recorder":{"name":"Livingston County Recorder","address":"112 W Madison St., Pontiac, IL 61764"},"assessor":{"name":"Livingston County Assessor","address":"112 W Madison St., Pontiac, IL 61764"}},"Logan County, IL":{"recorder":{"name":"Logan County Recorder","address":"601 Broadway St., Lincoln, IL 62656"},"assessor":{"name":"Logan County Assessor","address":"601 Broadway St., Lincoln, IL 62656"}},"Macon County, IL":{"recorder":{"name":"Macon County Recorder","address":"141 S Main St., Decatur, IL 62523"},"assessor":{"name":"Macon County Assessor","address":"141 S Main St., Decatur, IL 62523"}},"Macoupin County, IL":{"recorder":{"name":"Macoupin County Recorder","address":"201 E Main St., Carlinville, IL 62626"},"assessor":{"name":"Macoupin County Assessor","address":"201 E Main St., Carlinville, IL 62626"}},"Madison County, IL":{"recorder":{"name":"Madison County Recorder","address":"157 N Main St. Suite 131, Edwardsville, IL 62025"},"assessor":{"name":"Madison County Assessor","address":"157 N Main St. Suite 131, Edwardsville, IL 62025"}},"Marion County, IL":{"recorder":{"name":"Marion County Recorder","address":"100 E Main St., Salem, IL 62881"},"assessor":{"name":"Marion County Assessor","address":"100 E Main St., Salem, IL 62881"}},"Marshall County, IL":{"recorder":{"name":"Marshall County Recorder","address":"122 N Prairie St., Lacon, IL 61540"},"assessor":{"name":"Marshall County Assessor","address":"122 N Prairie St., Lacon, IL 61540"}},"Mason County, IL":{"recorder":{"name":"Mason County Recorder","address":"125 N Plum St., Havana, IL 62644"},"assessor":{"name":"Mason County Assessor","address":"125 N Plum St., Havana, IL 62644"}},"Massac County, IL":{"recorder":{"name":"Massac County Recorder","address":"1 Superman Square, Metropolis, IL 62960"},"assessor":{"name":"Massac County Assessor","address":"1 Superman Square, Metropolis, IL 62960"}},"McDonough County, IL":{"recorder":{"name":"McDonough County Recorder","address":"1 Courthouse Square, Macomb, IL 61455"},"assessor":{"name":"McDonough County Assessor","address":"1 Courthouse Square, Macomb, IL 61455"}},"McHenry County, IL":{"recorder":{"name":"McHenry County Recorder","address":"667 Ware Rd., Woodstock, IL 60098"},"assessor":{"name":"McHenry County Assessor","address":"667 Ware Rd., Woodstock, IL 60098"}},"McLean County, IL":{"recorder":{"name":"McLean County Recorder","address":"115 E Washington St. Suite 102, Bloomington, IL 61701"},"assessor":{"name":"McLean County Assessor","address":"115 E Washington St. Suite 102, Bloomington, IL 61701"}},"Menard County, IL":{"recorder":{"name":"Menard County Recorder","address":"102 S Seventh St., Petersburg, IL 62675"},"assessor":{"name":"Menard County Assessor","address":"102 S Seventh St., Petersburg, IL 62675"}},"Mercer County, IL":{"recorder":{"name":"Mercer County Recorder","address":"100 SE 3rd St., Aledo, IL 61231"},"assessor":{"name":"Mercer County Assessor","address":"100 SE 3rd St., Aledo, IL 61231"}},"Monroe County, IL":{"recorder":{"name":"Monroe County Recorder","address":"100 S Main St., Waterloo, IL 62298"},"assessor":{"name":"Monroe County Assessor","address":"100 S Main St., Waterloo, IL 62298"}},"Montgomery County, IL":{"recorder":{"name":"Montgomery County Recorder","address":"120 N Main St., Hillsboro, IL 62049"},"assessor":{"name":"Montgomery County Assessor","address":"120 N Main St., Hillsboro, IL 62049"}},"Morgan County, IL":{"recorder":{"name":"Morgan County Recorder","address":"300 W State St., Jacksonville, IL 62650"},"assessor":{"name":"Morgan County Assessor","address":"300 W State St., Jacksonville, IL 62650"}},"Moultrie County, IL":{"recorder":{"name":"Moultrie County Recorder","address":"10 S Main St., Sullivan, IL 61951"},"assessor":{"name":"Moultrie County Assessor","address":"10 S Main St., Sullivan, IL 61951"}},"Ogle County, IL":{"recorder":{"name":"Ogle County Recorder","address":"105 S 5th St., Oregon, IL 61061"},"assessor":{"name":"Ogle County Assessor","address":"105 S 5th St., Oregon, IL 61061"}},"Peoria County, IL":{"recorder":{"name":"Peoria County Recorder","address":"324 Main St. Room G22, Peoria, IL 61602"},"assessor":{"name":"Peoria County Assessor","address":"324 Main St. Room G22, Peoria, IL 61602"}},"Perry County, IL":{"recorder":{"name":"Perry County Recorder","address":"1 Public Square, Pinckneyville, IL 62274"},"assessor":{"name":"Perry County Assessor","address":"1 Public Square, Pinckneyville, IL 62274"}},"Piatt County, IL":{"recorder":{"name":"Piatt County Recorder","address":"101 W Washington St., Monticello, IL 61856"},"assessor":{"name":"Piatt County Assessor","address":"101 W Washington St., Monticello, IL 61856"}},"Pike County, IL":{"recorder":{"name":"Pike County Recorder","address":"121 E Washington St., Pittsfield, IL 62363"},"assessor":{"name":"Pike County Assessor","address":"121 E Washington St., Pittsfield, IL 62363"}},"Pope County, IL":{"recorder":{"name":"Pope County Recorder","address":"Golconda, IL 62938"},"assessor":{"name":"Pope County Assessor","address":"Golconda, IL 62938"}},"Pulaski County, IL":{"recorder":{"name":"Pulaski County Recorder","address":"500 Illinois Ave., Mound City, IL 62963"},"assessor":{"name":"Pulaski County Assessor","address":"500 Illinois Ave., Mound City, IL 62963"}},"Putnam County, IL":{"recorder":{"name":"Putnam County Recorder","address":"120 N 4th St., Hennepin, IL 61327"},"assessor":{"name":"Putnam County Assessor","address":"120 N 4th St., Hennepin, IL 61327"}},"Randolph County, IL":{"recorder":{"name":"Randolph County Recorder","address":"1 Taylor St., Chester, IL 62233"},"assessor":{"name":"Randolph County Assessor","address":"1 Taylor St., Chester, IL 62233"}},"Richland County, IL":{"recorder":{"name":"Richland County Recorder","address":"103 W Main St., Olney, IL 62450"},"assessor":{"name":"Richland County Assessor","address":"103 W Main St., Olney, IL 62450"}},"Rock Island County, IL":{"recorder":{"name":"Rock Island County Recorder","address":"1504 3rd Ave., Rock Island, IL 61201"},"assessor":{"name":"Rock Island County Assessor","address":"1504 3rd Ave., Rock Island, IL 61201"}},"Saline County, IL":{"recorder":{"name":"Saline County Recorder","address":"10 E Poplar St., Harrisburg, IL 62946"},"assessor":{"name":"Saline County Assessor","address":"10 E Poplar St., Harrisburg, IL 62946"}},"Sangamon County, IL":{"recorder":{"name":"Sangamon County Recorder","address":"200 S 9th St. Room 101, Springfield, IL 62701"},"assessor":{"name":"Sangamon County Assessor","address":"200 S 9th St. Room 101, Springfield, IL 62701"}},"Schuyler County, IL":{"recorder":{"name":"Schuyler County Recorder","address":"102 S Congress St., Rushville, IL 62681"},"assessor":{"name":"Schuyler County Assessor","address":"102 S Congress St., Rushville, IL 62681"}},"Scott County, IL":{"recorder":{"name":"Scott County Recorder","address":"35 E Market St., Winchester, IL 62694"},"assessor":{"name":"Scott County Assessor","address":"35 E Market St., Winchester, IL 62694"}},"Shelby County, IL":{"recorder":{"name":"Shelby County Recorder","address":"301 E Main St., Shelbyville, IL 62565"},"assessor":{"name":"Shelby County Assessor","address":"301 E Main St., Shelbyville, IL 62565"}},"St. Clair County, IL":{"recorder":{"name":"St. Clair County Recorder","address":"10 Public Square, Belleville, IL 62220"},"assessor":{"name":"St. Clair County Assessor","address":"10 Public Square, Belleville, IL 62220"}},"Stark County, IL":{"recorder":{"name":"Stark County Recorder","address":"130 W Main St., Toulon, IL 61483"},"assessor":{"name":"Stark County Assessor","address":"130 W Main St., Toulon, IL 61483"}},"Stephenson County, IL":{"recorder":{"name":"Stephenson County Recorder","address":"15 N Galena Ave., Freeport, IL 61032"},"assessor":{"name":"Stephenson County Assessor","address":"15 N Galena Ave., Freeport, IL 61032"}},"Tazewell County, IL":{"recorder":{"name":"Tazewell County Recorder","address":"11 S 4th St., Pekin, IL 61554"},"assessor":{"name":"Tazewell County Assessor","address":"11 S 4th St., Pekin, IL 61554"}},"Union County, IL":{"recorder":{"name":"Union County Recorder","address":"309 W Market St., Jonesboro, IL 62952"},"assessor":{"name":"Union County Assessor","address":"309 W Market St., Jonesboro, IL 62952"}},"Vermilion County, IL":{"recorder":{"name":"Vermilion County Recorder","address":"6 N Vermilion St., Danville, IL 61832"},"assessor":{"name":"Vermilion County Assessor","address":"6 N Vermilion St., Danville, IL 61832"}},"Wabash County, IL":{"recorder":{"name":"Wabash County Recorder","address":"401 Market St., Mount Carmel, IL 62863"},"assessor":{"name":"Wabash County Assessor","address":"401 Market St., Mount Carmel, IL 62863"}},"Warren County, IL":{"recorder":{"name":"Warren County Recorder","address":"100 W Broadway, Monmouth, IL 61462"},"assessor":{"name":"Warren County Assessor","address":"100 W Broadway, Monmouth, IL 61462"}},"Washington County, IL":{"recorder":{"name":"Washington County Recorder","address":"101 E St. Louis St., Nashville, IL 62263"},"assessor":{"name":"Washington County Assessor","address":"101 E St. Louis St., Nashville, IL 62263"}},"Wayne County, IL":{"recorder":{"name":"Wayne County Recorder","address":"301 E Main St., Fairfield, IL 62837"},"assessor":{"name":"Wayne County Assessor","address":"301 E Main St., Fairfield, IL 62837"}},"White County, IL":{"recorder":{"name":"White County Recorder","address":"301 E Main St., Carmi, IL 62821"},"assessor":{"name":"White County Assessor","address":"301 E Main St., Carmi, IL 62821"}},"Whiteside County, IL":{"recorder":{"name":"Whiteside County Recorder","address":"200 E Knox St., Morrison, IL 61270"},"assessor":{"name":"Whiteside County Assessor","address":"200 E Knox St., Morrison, IL 61270"}},"Will County, IL":{"recorder":{"name":"Will County Recorder","address":"302 N Chicago St., Joliet, IL 60432"},"assessor":{"name":"Will County Assessor","address":"302 N Chicago St., Joliet, IL 60432"}},"Williamson County, IL":{"recorder":{"name":"Williamson County Recorder","address":"200 W Jefferson St., Marion, IL 62959"},"assessor":{"name":"Williamson County Assessor","address":"200 W Jefferson St., Marion, IL 62959"}},"Winnebago County, IL":{"recorder":{"name":"Winnebago County Recorder","address":"404 Elm St. Room 111, Rockford, IL 61101"},"assessor":{"name":"Winnebago County Assessor","address":"404 Elm St. Room 111, Rockford, IL 61101"}},"Woodford County, IL":{"recorder":{"name":"Woodford County Recorder","address":"115 N Main St., Eureka, IL 61530"},"assessor":{"name":"Woodford County Assessor","address":"115 N Main St., Eureka, IL 61530"}},"Adams County, IN":{"recorder":{"name":"Adams County Recorder","address":"112 S 2nd St., Decatur, IN 46733"},"assessor":{"name":"Adams County Assessor","address":"112 S 2nd St., Decatur, IN 46733"}},"Allen County, IN":{"recorder":{"name":"Allen County Recorder","address":"1 E Main St. Suite 102, Fort Wayne, IN 46802"},"assessor":{"name":"Allen County Assessor","address":"1 E Main St. Suite 415, Fort Wayne, IN 46802"}},"Bartholomew County, IN":{"recorder":{"name":"Bartholomew County Recorder","address":"440 3rd St., Columbus, IN 47201"},"assessor":{"name":"Bartholomew County Assessor","address":"440 3rd St., Columbus, IN 47201"}},"Benton County, IN":{"recorder":{"name":"Benton County Recorder","address":"706 E 5th St. Suite 12, Fowler, IN 47944"},"assessor":{"name":"Benton County Assessor","address":"706 E 5th St. Suite 12, Fowler, IN 47944"}},"Blackford County, IN":{"recorder":{"name":"Blackford County Recorder","address":"110 W Washington St., Hartford City, IN 47348"},"assessor":{"name":"Blackford County Assessor","address":"110 W Washington St., Hartford City, IN 47348"}},"Boone County, IN":{"recorder":{"name":"Boone County Recorder","address":"1 Courthouse Square Suite 140, Lebanon, IN 46052"},"assessor":{"name":"Boone County Assessor","address":"1 Courthouse Square Suite 105, Lebanon, IN 46052"}},"Brown County, IN":{"recorder":{"name":"Brown County Recorder","address":"201 Locust Ln., Nashville, IN 47448"},"assessor":{"name":"Brown County Assessor","address":"201 Locust Ln., Nashville, IN 47448"}},"Carroll County, IN":{"recorder":{"name":"Carroll County Recorder","address":"101 W Main St., Delphi, IN 46923"},"assessor":{"name":"Carroll County Assessor","address":"101 W Main St., Delphi, IN 46923"}},"Cass County, IN":{"recorder":{"name":"Cass County Recorder","address":"200 Court Park, Logansport, IN 46947"},"assessor":{"name":"Cass County Assessor","address":"200 Court Park, Logansport, IN 46947"}},"Clark County, IN":{"recorder":{"name":"Clark County Recorder","address":"501 E Court Ave. Room 130, Jeffersonville, IN 47130"},"assessor":{"name":"Clark County Assessor","address":"501 E Court Ave. Room 130, Jeffersonville, IN 47130"}},"Clay County, IN":{"recorder":{"name":"Clay County Recorder","address":"609 E National Ave., Brazil, IN 47834"},"assessor":{"name":"Clay County Assessor","address":"609 E National Ave., Brazil, IN 47834"}},"Clinton County, IN":{"recorder":{"name":"Clinton County Recorder","address":"265 Courthouse Square, Frankfort, IN 46041"},"assessor":{"name":"Clinton County Assessor","address":"265 Courthouse Square, Frankfort, IN 46041"}},"Crawford County, IN":{"recorder":{"name":"Crawford County Recorder","address":"715 Judicial Center Dr., English, IN 47118"},"assessor":{"name":"Crawford County Assessor","address":"715 Judicial Center Dr., English, IN 47118"}},"Daviess County, IN":{"recorder":{"name":"Daviess County Recorder","address":"200 E Walnut St., Washington, IN 47501"},"assessor":{"name":"Daviess County Assessor","address":"200 E Walnut St., Washington, IN 47501"}},"Dearborn County, IN":{"recorder":{"name":"Dearborn County Recorder","address":"165 Mary St., Lawrenceburg, IN 47025"},"assessor":{"name":"Dearborn County Assessor","address":"165 Mary St., Lawrenceburg, IN 47025"}},"Decatur County, IN":{"recorder":{"name":"Decatur County Recorder","address":"150 Courthouse Square Suite 4, Greensburg, IN 47240"},"assessor":{"name":"Decatur County Assessor","address":"150 Courthouse Square Suite 4, Greensburg, IN 47240"}},"DeKalb County, IN":{"recorder":{"name":"DeKalb County Recorder","address":"100 S Main St., Auburn, IN 46706"},"assessor":{"name":"DeKalb County Assessor","address":"100 S Main St., Auburn, IN 46706"}},"Delaware County, IN":{"recorder":{"name":"Delaware County Recorder","address":"100 W Main St. Room 102, Muncie, IN 47305"},"assessor":{"name":"Delaware County Assessor","address":"100 W Main St. Room 102, Muncie, IN 47305"}},"Dubois County, IN":{"recorder":{"name":"Dubois County Recorder","address":"1 Courthouse Square Suite 202, Jasper, IN 47546"},"assessor":{"name":"Dubois County Assessor","address":"1 Courthouse Square Suite 202, Jasper, IN 47546"}},"Elkhart County, IN":{"recorder":{"name":"Elkhart County Recorder","address":"117 N 2nd St. Room 201, Goshen, IN 46526"},"assessor":{"name":"Elkhart County Assessor","address":"117 N 2nd St. Room 201, Goshen, IN 46526"}},"Fayette County, IN":{"recorder":{"name":"Fayette County Recorder","address":"401 N Central Ave., Connersville, IN 47331"},"assessor":{"name":"Fayette County Assessor","address":"401 N Central Ave., Connersville, IN 47331"}},"Floyd County, IN":{"recorder":{"name":"Floyd County Recorder","address":"311 Hauss Square Room 104, New Albany, IN 47150"},"assessor":{"name":"Floyd County Assessor","address":"311 Hauss Square Room 104, New Albany, IN 47150"}},"Fountain County, IN":{"recorder":{"name":"Fountain County Recorder","address":"301 4th St., Covington, IN 47932"},"assessor":{"name":"Fountain County Assessor","address":"301 4th St., Covington, IN 47932"}},"Franklin County, IN":{"recorder":{"name":"Franklin County Recorder","address":"459 Main St., Brookville, IN 47012"},"assessor":{"name":"Franklin County Assessor","address":"459 Main St., Brookville, IN 47012"}},"Fulton County, IN":{"recorder":{"name":"Fulton County Recorder","address":"815 Main St., Rochester, IN 46975"},"assessor":{"name":"Fulton County Assessor","address":"815 Main St., Rochester, IN 46975"}},"Gibson County, IN":{"recorder":{"name":"Gibson County Recorder","address":"101 N Main St., Princeton, IN 47670"},"assessor":{"name":"Gibson County Assessor","address":"101 N Main St., Princeton, IN 47670"}},"Grant County, IN":{"recorder":{"name":"Grant County Recorder","address":"401 S Adams St. Room 415, Marion, IN 46953"},"assessor":{"name":"Grant County Assessor","address":"401 S Adams St. Room 415, Marion, IN 46953"}},"Greene County, IN":{"recorder":{"name":"Greene County Recorder","address":"204 N Main St., Bloomfield, IN 47424"},"assessor":{"name":"Greene County Assessor","address":"204 N Main St., Bloomfield, IN 47424"}},"Hamilton County, IN":{"recorder":{"name":"Hamilton County Recorder","address":"1 Hamilton County Square Suite 106, Noblesville, IN 46060"},"assessor":{"name":"Hamilton County Assessor","address":"1 Hamilton County Square Suite 106, Noblesville, IN 46060"}},"Hancock County, IN":{"recorder":{"name":"Hancock County Recorder","address":"9 E Main St. Suite 201, Greenfield, IN 46140"},"assessor":{"name":"Hancock County Assessor","address":"9 E Main St. Suite 201, Greenfield, IN 46140"}},"Harrison County, IN":{"recorder":{"name":"Harrison County Recorder","address":"300 N Capitol Ave. Suite 8, Corydon, IN 47112"},"assessor":{"name":"Harrison County Assessor","address":"300 N Capitol Ave. Suite 8, Corydon, IN 47112"}},"Hendricks County, IN":{"recorder":{"name":"Hendricks County Recorder","address":"355 S Washington St. Room 215, Danville, IN 46122"},"assessor":{"name":"Hendricks County Assessor","address":"355 S Washington St. Room 215, Danville, IN 46122"}},"Henry County, IN":{"recorder":{"name":"Henry County Recorder","address":"101 S Main St. Suite 209, New Castle, IN 47362"},"assessor":{"name":"Henry County Assessor","address":"101 S Main St. Suite 209, New Castle, IN 47362"}},"Howard County, IN":{"recorder":{"name":"Howard County Recorder","address":"220 N Main St. Room 226, Kokomo, IN 46901"},"assessor":{"name":"Howard County Assessor","address":"220 N Main St. Room 226, Kokomo, IN 46901"}},"Huntington County, IN":{"recorder":{"name":"Huntington County Recorder","address":"201 N Jefferson St. Suite 101, Huntington, IN 46750"},"assessor":{"name":"Huntington County Assessor","address":"201 N Jefferson St. Suite 101, Huntington, IN 46750"}},"Jackson County, IN":{"recorder":{"name":"Jackson County Recorder","address":"111 S Main St. Suite 110, Brownstown, IN 47220"},"assessor":{"name":"Jackson County Assessor","address":"111 S Main St. Suite 110, Brownstown, IN 47220"}},"Jasper County, IN":{"recorder":{"name":"Jasper County Recorder","address":"115 W Washington St. Suite B, Rensselaer, IN 47978"},"assessor":{"name":"Jasper County Assessor","address":"115 W Washington St. Suite B, Rensselaer, IN 47978"}},"Jay County, IN":{"recorder":{"name":"Jay County Recorder","address":"120 N Court St., Portland, IN 47371"},"assessor":{"name":"Jay County Assessor","address":"120 N Court St., Portland, IN 47371"}},"Jefferson County, IN":{"recorder":{"name":"Jefferson County Recorder","address":"300 E Main St. Suite 103, Madison, IN 47250"},"assessor":{"name":"Jefferson County Assessor","address":"300 E Main St. Suite 103, Madison, IN 47250"}},"Jennings County, IN":{"recorder":{"name":"Jennings County Recorder","address":"5 E Main St., Vernon, IN 47282"},"assessor":{"name":"Jennings County Assessor","address":"5 E Main St., Vernon, IN 47282"}},"Johnson County, IN":{"recorder":{"name":"Johnson County Recorder","address":"86 W Court St., Franklin, IN 46131"},"assessor":{"name":"Johnson County Assessor","address":"86 W Court St., Franklin, IN 46131"}},"Knox County, IN":{"recorder":{"name":"Knox County Recorder","address":"111 N 7th St., Vincennes, IN 47591"},"assessor":{"name":"Knox County Assessor","address":"111 N 7th St., Vincennes, IN 47591"}},"Kosciusko County, IN":{"recorder":{"name":"Kosciusko County Recorder","address":"100 W Center St. Room 210, Warsaw, IN 46580"},"assessor":{"name":"Kosciusko County Assessor","address":"100 W Center St. Room 210, Warsaw, IN 46580"}},"LaGrange County, IN":{"recorder":{"name":"LaGrange County Recorder","address":"105 N Detroit St., LaGrange, IN 46761"},"assessor":{"name":"LaGrange County Assessor","address":"105 N Detroit St., LaGrange, IN 46761"}},"Lake County, IN":{"recorder":{"name":"Lake County Recorder","address":"2293 N Main St., Crown Point, IN 46307"},"assessor":{"name":"Lake County Assessor","address":"2293 N Main St., Crown Point, IN 46307"}},"LaPorte County, IN":{"recorder":{"name":"LaPorte County Recorder","address":"813 Lincoln Way Suite 206, LaPorte, IN 46350"},"assessor":{"name":"LaPorte County Assessor","address":"813 Lincoln Way Suite 206, LaPorte, IN 46350"}},"Lawrence County, IN":{"recorder":{"name":"Lawrence County Recorder","address":"916 15th St. Room 12, Bedford, IN 47421"},"assessor":{"name":"Lawrence County Assessor","address":"916 15th St. Room 12, Bedford, IN 47421"}},"Madison County, IN":{"recorder":{"name":"Madison County Recorder","address":"16 E 9th St. Suite 106, Anderson, IN 46016"},"assessor":{"name":"Madison County Assessor","address":"16 E 9th St. Suite 106, Anderson, IN 46016"}},"Marion County, IN":{"recorder":{"name":"Marion County Recorder","address":"200 E Washington St. Suite W122, Indianapolis, IN 46204"},"assessor":{"name":"Marion County Assessor","address":"200 E Washington St. Suite 1360, Indianapolis, IN 46204"}},"Marshall County, IN":{"recorder":{"name":"Marshall County Recorder","address":"112 W Jefferson St. Room 202, Plymouth, IN 46563"},"assessor":{"name":"Marshall County Assessor","address":"112 W Jefferson St. Room 202, Plymouth, IN 46563"}},"Martin County, IN":{"recorder":{"name":"Martin County Recorder","address":"129 Main St., Shoals, IN 47581"},"assessor":{"name":"Martin County Assessor","address":"129 Main St., Shoals, IN 47581"}},"Miami County, IN":{"recorder":{"name":"Miami County Recorder","address":"25 N Broadway St., Peru, IN 46970"},"assessor":{"name":"Miami County Assessor","address":"25 N Broadway St., Peru, IN 46970"}},"Monroe County, IN":{"recorder":{"name":"Monroe County Recorder","address":"100 W Kirkwood Ave. Suite 215, Bloomington, IN 47404"},"assessor":{"name":"Monroe County Assessor","address":"100 W Kirkwood Ave. Suite 215, Bloomington, IN 47404"}},"Montgomery County, IN":{"recorder":{"name":"Montgomery County Recorder","address":"100 E Main St., Crawfordsville, IN 47933"},"assessor":{"name":"Montgomery County Assessor","address":"100 E Main St., Crawfordsville, IN 47933"}},"Morgan County, IN":{"recorder":{"name":"Morgan County Recorder","address":"180 S Main St. Suite 211, Martinsville, IN 46151"},"assessor":{"name":"Morgan County Assessor","address":"180 S Main St. Suite 211, Martinsville, IN 46151"}},"Newton County, IN":{"recorder":{"name":"Newton County Recorder","address":"201 N 3rd St., Kentland, IN 47951"},"assessor":{"name":"Newton County Assessor","address":"201 N 3rd St., Kentland, IN 47951"}},"Noble County, IN":{"recorder":{"name":"Noble County Recorder","address":"101 N Orange St., Albion, IN 46701"},"assessor":{"name":"Noble County Assessor","address":"101 N Orange St., Albion, IN 46701"}},"Ohio County, IN":{"recorder":{"name":"Ohio County Recorder","address":"413 Main St., Rising Sun, IN 47040"},"assessor":{"name":"Ohio County Assessor","address":"413 Main St., Rising Sun, IN 47040"}},"Orange County, IN":{"recorder":{"name":"Orange County Recorder","address":"205 E Main St. Suite 7, Paoli, IN 47454"},"assessor":{"name":"Orange County Assessor","address":"205 E Main St. Suite 7, Paoli, IN 47454"}},"Owen County, IN":{"recorder":{"name":"Owen County Recorder","address":"60 S Main St. Suite 103, Spencer, IN 47460"},"assessor":{"name":"Owen County Assessor","address":"60 S Main St. Suite 103, Spencer, IN 47460"}},"Parke County, IN":{"recorder":{"name":"Parke County Recorder","address":"116 W High St. Suite 204, Rockville, IN 47872"},"assessor":{"name":"Parke County Assessor","address":"116 W High St. Suite 204, Rockville, IN 47872"}},"Perry County, IN":{"recorder":{"name":"Perry County Recorder","address":"2219 Payne St., Tell City, IN 47586"},"assessor":{"name":"Perry County Assessor","address":"2219 Payne St., Tell City, IN 47586"}},"Pike County, IN":{"recorder":{"name":"Pike County Recorder","address":"801 E Poplar St., Petersburg, IN 47567"},"assessor":{"name":"Pike County Assessor","address":"801 E Poplar St., Petersburg, IN 47567"}},"Porter County, IN":{"recorder":{"name":"Porter County Recorder","address":"155 Indiana Ave. Suite 203, Valparaiso, IN 46383"},"assessor":{"name":"Porter County Assessor","address":"155 Indiana Ave. Suite 203, Valparaiso, IN 46383"}},"Posey County, IN":{"recorder":{"name":"Posey County Recorder","address":"300 Main St. Suite 206, Mount Vernon, IN 47620"},"assessor":{"name":"Posey County Assessor","address":"300 Main St. Suite 206, Mount Vernon, IN 47620"}},"Pulaski County, IN":{"recorder":{"name":"Pulaski County Recorder","address":"112 E Main St. Suite 232, Winamac, IN 46996"},"assessor":{"name":"Pulaski County Assessor","address":"112 E Main St. Suite 232, Winamac, IN 46996"}},"Putnam County, IN":{"recorder":{"name":"Putnam County Recorder","address":"1 Courthouse Square Suite 340, Greencastle, IN 46135"},"assessor":{"name":"Putnam County Assessor","address":"1 Courthouse Square Suite 340, Greencastle, IN 46135"}},"Randolph County, IN":{"recorder":{"name":"Randolph County Recorder","address":"100 S Main St. Suite 102, Winchester, IN 47394"},"assessor":{"name":"Randolph County Assessor","address":"100 S Main St. Suite 102, Winchester, IN 47394"}},"Ripley County, IN":{"recorder":{"name":"Ripley County Recorder","address":"115 N Main St., Versailles, IN 47042"},"assessor":{"name":"Ripley County Assessor","address":"115 N Main St., Versailles, IN 47042"}},"Rush County, IN":{"recorder":{"name":"Rush County Recorder","address":"101 E 2nd St., Rushville, IN 46173"},"assessor":{"name":"Rush County Assessor","address":"101 E 2nd St., Rushville, IN 46173"}},"St. Joseph County, IN":{"recorder":{"name":"St. Joseph County Recorder","address":"101 S Main St. Suite 104, South Bend, IN 46601"},"assessor":{"name":"St. Joseph County Assessor","address":"101 S Main St. Suite 104, South Bend, IN 46601"}},"Scott County, IN":{"recorder":{"name":"Scott County Recorder","address":"1 E McClain Ave. Suite 140, Scottsburg, IN 47170"},"assessor":{"name":"Scott County Assessor","address":"1 E McClain Ave. Suite 140, Scottsburg, IN 47170"}},"Shelby County, IN":{"recorder":{"name":"Shelby County Recorder","address":"407 S Harrison St. Suite 102, Shelbyville, IN 46176"},"assessor":{"name":"Shelby County Assessor","address":"407 S Harrison St. Suite 102, Shelbyville, IN 46176"}},"Spencer County, IN":{"recorder":{"name":"Spencer County Recorder","address":"200 Main St. Suite 8, Rockport, IN 47635"},"assessor":{"name":"Spencer County Assessor","address":"200 Main St. Suite 8, Rockport, IN 47635"}},"Starke County, IN":{"recorder":{"name":"Starke County Recorder","address":"53 E Mound St., Knox, IN 46534"},"assessor":{"name":"Starke County Assessor","address":"53 E Mound St., Knox, IN 46534"}},"Steuben County, IN":{"recorder":{"name":"Steuben County Recorder","address":"317 S Wayne St. Suite 2K, Angola, IN 46703"},"assessor":{"name":"Steuben County Assessor","address":"317 S Wayne St. Suite 2K, Angola, IN 46703"}},"Sullivan County, IN":{"recorder":{"name":"Sullivan County Recorder","address":"100 Courthouse Square Suite 302, Sullivan, IN 47882"},"assessor":{"name":"Sullivan County Assessor","address":"100 Courthouse Square Suite 302, Sullivan, IN 47882"}},"Switzerland County, IN":{"recorder":{"name":"Switzerland County Recorder","address":"212 W Main St., Vevay, IN 47043"},"assessor":{"name":"Switzerland County Assessor","address":"212 W Main St., Vevay, IN 47043"}},"Tippecanoe County, IN":{"recorder":{"name":"Tippecanoe County Recorder","address":"20 N 3rd St., Lafayette, IN 47901"},"assessor":{"name":"Tippecanoe County Assessor","address":"20 N 3rd St., Lafayette, IN 47901"}},"Tipton County, IN":{"recorder":{"name":"Tipton County Recorder","address":"101 E Jefferson St., Tipton, IN 46072"},"assessor":{"name":"Tipton County Assessor","address":"101 E Jefferson St., Tipton, IN 46072"}},"Union County, IN":{"recorder":{"name":"Union County Recorder","address":"26 W Union St., Liberty, IN 47353"},"assessor":{"name":"Union County Assessor","address":"26 W Union St., Liberty, IN 47353"}},"Vanderburgh County, IN":{"recorder":{"name":"Vanderburgh County Recorder","address":"1 NW Martin Luther King Jr Blvd Suite 216, Evansville, IN 47708"},"assessor":{"name":"Vanderburgh County Assessor","address":"1 NW Martin Luther King Jr Blvd Suite 216, Evansville, IN 47708"}},"Vermillion County, IN":{"recorder":{"name":"Vermillion County Recorder","address":"255 S Main St., Newport, IN 47966"},"assessor":{"name":"Vermillion County Assessor","address":"255 S Main St., Newport, IN 47966"}},"Vigo County, IN":{"recorder":{"name":"Vigo County Recorder","address":"33 S 3rd St. Suite 407, Terre Haute, IN 47807"},"assessor":{"name":"Vigo County Assessor","address":"33 S 3rd St. Suite 407, Terre Haute, IN 47807"}},"Wabash County, IN":{"recorder":{"name":"Wabash County Recorder","address":"1 W Hill St. Suite 104, Wabash, IN 46992"},"assessor":{"name":"Wabash County Assessor","address":"1 W Hill St. Suite 104, Wabash, IN 46992"}},"Warren County, IN":{"recorder":{"name":"Warren County Recorder","address":"125 N Monroe St. Suite 22, Williamsport, IN 47993"},"assessor":{"name":"Warren County Assessor","address":"125 N Monroe St. Suite 22, Williamsport, IN 47993"}},"Warrick County, IN":{"recorder":{"name":"Warrick County Recorder","address":"1 County Square Suite 240, Boonville, IN 47601"},"assessor":{"name":"Warrick County Assessor","address":"1 County Square Suite 240, Boonville, IN 47601"}},"Washington County, IN":{"recorder":{"name":"Washington County Recorder","address":"99 Public Square Suite 202, Salem, IN 47167"},"assessor":{"name":"Washington County Assessor","address":"99 Public Square Suite 202, Salem, IN 47167"}},"Wayne County, IN":{"recorder":{"name":"Wayne County Recorder","address":"401 E Main St. Suite 105, Richmond, IN 47374"},"assessor":{"name":"Wayne County Assessor","address":"401 E Main St. Suite 105, Richmond, IN 47374"}},"Wells County, IN":{"recorder":{"name":"Wells County Recorder","address":"102 W Market St. Suite 204, Bluffton, IN 46714"},"assessor":{"name":"Wells County Assessor","address":"102 W Market St. Suite 204, Bluffton, IN 46714"}},"White County, IN":{"recorder":{"name":"White County Recorder","address":"110 N Main St. Suite 24, Monticello, IN 47960"},"assessor":{"name":"White County Assessor","address":"110 N Main St. Suite 24, Monticello, IN 47960"}},"Whitley County, IN":{"recorder":{"name":"Whitley County Recorder","address":"220 N Line St. Suite 201, Columbia City, IN 46725"},"assessor":{"name":"Whitley County Assessor","address":"220 N Line St. Suite 201, Columbia City, IN 46725"}},"Allen County, KS":{"recorder":{"name":"Allen County Register of Deeds","address":"1 N Washington Ave., Iola, KS 66749"},"assessor":{"name":"Allen County Appraiser","address":"1 N Washington Ave., Iola, KS 66749"}},"Anderson County, KS":{"recorder":{"name":"Anderson County Register of Deeds","address":"100 E 4th Ave., Garnett, KS 66032"},"assessor":{"name":"Anderson County Appraiser","address":"100 E 4th Ave., Garnett, KS 66032"}},"Atchison County, KS":{"recorder":{"name":"Atchison County Register of Deeds","address":"423 N 5th St., Atchison, KS 66002"},"assessor":{"name":"Atchison County Appraiser","address":"423 N 5th St., Atchison, KS 66002"}},"Barber County, KS":{"recorder":{"name":"Barber County Register of Deeds","address":"120 E Washington St., Medicine Lodge, KS 67104"},"assessor":{"name":"Barber County Appraiser","address":"120 E Washington St., Medicine Lodge, KS 67104"}},"Barton County, KS":{"recorder":{"name":"Barton County Register of Deeds","address":"1400 Main St. Suite 206, Great Bend, KS 67530"},"assessor":{"name":"Barton County Appraiser","address":"1400 Main St. Suite 205, Great Bend, KS 67530"}},"Bourbon County, KS":{"recorder":{"name":"Bourbon County Register of Deeds","address":"210 S National Ave., Fort Scott, KS 66701"},"assessor":{"name":"Bourbon County Appraiser","address":"210 S National Ave., Fort Scott, KS 66701"}},"Brown County, KS":{"recorder":{"name":"Brown County Register of Deeds","address":"601 Oregon St., Hiawatha, KS 66434"},"assessor":{"name":"Brown County Appraiser","address":"601 Oregon St., Hiawatha, KS 66434"}},"Butler County, KS":{"recorder":{"name":"Butler County Register of Deeds","address":"205 W Central Ave., El Dorado, KS 67042"},"assessor":{"name":"Butler County Appraiser","address":"205 W Central Ave., El Dorado, KS 67042"}},"Chase County, KS":{"recorder":{"name":"Chase County Register of Deeds","address":"300 Broadway, Cottonwood Falls, KS 66845"},"assessor":{"name":"Chase County Appraiser","address":"300 Broadway, Cottonwood Falls, KS 66845"}},"Chautauqua County, KS":{"recorder":{"name":"Chautauqua County Register of Deeds","address":"215 N Cherry St., Sedan, KS 67361"},"assessor":{"name":"Chautauqua County Appraiser","address":"215 N Cherry St., Sedan, KS 67361"}},"Cherokee County, KS":{"recorder":{"name":"Cherokee County Register of Deeds","address":"110 W Maple St., Columbus, KS 66725"},"assessor":{"name":"Cherokee County Appraiser","address":"110 W Maple St., Columbus, KS 66725"}},"Cheyenne County, KS":{"recorder":{"name":"Cheyenne County Register of Deeds","address":"212 E Washington St., St. Francis, KS 67756"},"assessor":{"name":"Cheyenne County Appraiser","address":"212 E Washington St., St. Francis, KS 67756"}},"Clark County, KS":{"recorder":{"name":"Clark County Register of Deeds","address":"913 Highland St., Ashland, KS 67831"},"assessor":{"name":"Clark County Appraiser","address":"913 Highland St., Ashland, KS 67831"}},"Clay County, KS":{"recorder":{"name":"Clay County Register of Deeds","address":"712 5th St., Clay Center, KS 67432"},"assessor":{"name":"Clay County Appraiser","address":"712 5th St., Clay Center, KS 67432"}},"Cloud County, KS":{"recorder":{"name":"Cloud County Register of Deeds","address":"811 Washington St., Concordia, KS 66901"},"assessor":{"name":"Cloud County Appraiser","address":"811 Washington St., Concordia, KS 66901"}},"Coffey County, KS":{"recorder":{"name":"Coffey County Register of Deeds","address":"110 S 6th St., Burlington, KS 66839"},"assessor":{"name":"Coffey County Appraiser","address":"110 S 6th St., Burlington, KS 66839"}},"Comanche County, KS":{"recorder":{"name":"Comanche County Register of Deeds","address":"201 S New York Ave., Coldwater, KS 67029"},"assessor":{"name":"Comanche County Appraiser","address":"201 S New York Ave., Coldwater, KS 67029"}},"Cowley County, KS":{"recorder":{"name":"Cowley County Register of Deeds","address":"311 E 9th Ave., Winfield, KS 67156"},"assessor":{"name":"Cowley County Appraiser","address":"311 E 9th Ave., Winfield, KS 67156"}},"Crawford County, KS":{"recorder":{"name":"Crawford County Register of Deeds","address":"111 E Forest St., Girard, KS 66743"},"assessor":{"name":"Crawford County Appraiser","address":"111 E Forest St., Girard, KS 66743"}},"Decatur County, KS":{"recorder":{"name":"Decatur County Register of Deeds","address":"120 E Hall St., Oberlin, KS 67749"},"assessor":{"name":"Decatur County Appraiser","address":"120 E Hall St., Oberlin, KS 67749"}},"Dickinson County, KS":{"recorder":{"name":"Dickinson County Register of Deeds","address":"109 E 1st St. Suite 201, Abilene, KS 67410"},"assessor":{"name":"Dickinson County Appraiser","address":"109 E 1st St. Suite 207, Abilene, KS 67410"}},"Doniphan County, KS":{"recorder":{"name":"Doniphan County Register of Deeds","address":"120 E Chestnut St., Troy, KS 66087"},"assessor":{"name":"Doniphan County Appraiser","address":"120 E Chestnut St., Troy, KS 66087"}},"Douglas County, KS":{"recorder":{"name":"Douglas County Register of Deeds","address":"1100 Massachusetts St., Lawrence, KS 66044"},"assessor":{"name":"Douglas County Appraiser","address":"1100 Massachusetts St., Lawrence, KS 66044"}},"Edwards County, KS":{"recorder":{"name":"Edwards County Register of Deeds","address":"312 Massachusetts Ave., Kinsley, KS 67547"},"assessor":{"name":"Edwards County Appraiser","address":"312 Massachusetts Ave., Kinsley, KS 67547"}},"Elk County, KS":{"recorder":{"name":"Elk County Register of Deeds","address":"127 N Pine St., Howard, KS 67349"},"assessor":{"name":"Elk County Appraiser","address":"127 N Pine St., Howard, KS 67349"}},"Ellis County, KS":{"recorder":{"name":"Ellis County Register of Deeds","address":"1204 Fort St., Hays, KS 67601"},"assessor":{"name":"Ellis County Appraiser","address":"1204 Fort St., Hays, KS 67601"}},"Ellsworth County, KS":{"recorder":{"name":"Ellsworth County Register of Deeds","address":"210 N Kansas Ave., Ellsworth, KS 67439"},"assessor":{"name":"Ellsworth County Appraiser","address":"210 N Kansas Ave., Ellsworth, KS 67439"}},"Finney County, KS":{"recorder":{"name":"Finney County Register of Deeds","address":"311 N 9th St., Garden City, KS 67846"},"assessor":{"name":"Finney County Appraiser","address":"311 N 9th St., Garden City, KS 67846"}},"Ford County, KS":{"recorder":{"name":"Ford County Register of Deeds","address":"100 Gunsmoke St., Dodge City, KS 67801"},"assessor":{"name":"Ford County Appraiser","address":"100 Gunsmoke St., Dodge City, KS 67801"}},"Franklin County, KS":{"recorder":{"name":"Franklin County Register of Deeds","address":"315 S Main St., Ottawa, KS 66067"},"assessor":{"name":"Franklin County Appraiser","address":"315 S Main St., Ottawa, KS 66067"}},"Geary County, KS":{"recorder":{"name":"Geary County Register of Deeds","address":"139 E 8th St., Junction City, KS 66441"},"assessor":{"name":"Geary County Appraiser","address":"139 E 8th St., Junction City, KS 66441"}},"Gove County, KS":{"recorder":{"name":"Gove County Register of Deeds","address":"520 Washington St., Gove, KS 67736"},"assessor":{"name":"Gove County Appraiser","address":"520 Washington St., Gove, KS 67736"}},"Graham County, KS":{"recorder":{"name":"Graham County Register of Deeds","address":"410 N Pomeroy St., Hill City, KS 67642"},"assessor":{"name":"Graham County Appraiser","address":"410 N Pomeroy St., Hill City, KS 67642"}},"Grant County, KS":{"recorder":{"name":"Grant County Register of Deeds","address":"108 S Glenn St., Ulysses, KS 67880"},"assessor":{"name":"Grant County Appraiser","address":"108 S Glenn St., Ulysses, KS 67880"}},"Gray County, KS":{"recorder":{"name":"Gray County Register of Deeds","address":"300 S Main St., Cimarron, KS 67835"},"assessor":{"name":"Gray County Appraiser","address":"300 S Main St., Cimarron, KS 67835"}},"Greeley County, KS":{"recorder":{"name":"Greeley County Register of Deeds","address":"208 Harper Ave., Tribune, KS 67879"},"assessor":{"name":"Greeley County Appraiser","address":"208 Harper Ave., Tribune, KS 67879"}},"Greenwood County, KS":{"recorder":{"name":"Greenwood County Register of Deeds","address":"311 N Main St., Eureka, KS 67045"},"assessor":{"name":"Greenwood County Appraiser","address":"311 N Main St., Eureka, KS 67045"}},"Hamilton County, KS":{"recorder":{"name":"Hamilton County Register of Deeds","address":"219 N Main St., Syracuse, KS 67878"},"assessor":{"name":"Hamilton County Appraiser","address":"219 N Main St., Syracuse, KS 67878"}},"Harper County, KS":{"recorder":{"name":"Harper County Register of Deeds","address":"201 N Jennings Ave., Anthony, KS 67003"},"assessor":{"name":"Harper County Appraiser","address":"201 N Jennings Ave., Anthony, KS 67003"}},"Harvey County, KS":{"recorder":{"name":"Harvey County Register of Deeds","address":"800 N Main St., Newton, KS 67114"},"assessor":{"name":"Harvey County Appraiser","address":"800 N Main St., Newton, KS 67114"}},"Haskell County, KS":{"recorder":{"name":"Haskell County Register of Deeds","address":"300 S Inman St., Sublette, KS 67877"},"assessor":{"name":"Haskell County Appraiser","address":"300 S Inman St., Sublette, KS 67877"}},"Hodgeman County, KS":{"recorder":{"name":"Hodgeman County Register of Deeds","address":"500 Main St., Jetmore, KS 67854"},"assessor":{"name":"Hodgeman County Appraiser","address":"500 Main St., Jetmore, KS 67854"}},"Jackson County, KS":{"recorder":{"name":"Jackson County Register of Deeds","address":"400 New York Ave., Holton, KS 66436"},"assessor":{"name":"Jackson County Appraiser","address":"400 New York Ave., Holton, KS 66436"}},"Jefferson County, KS":{"recorder":{"name":"Jefferson County Register of Deeds","address":"300 Jefferson St., Oskaloosa, KS 66066"},"assessor":{"name":"Jefferson County Appraiser","address":"300 Jefferson St., Oskaloosa, KS 66066"}},"Jewell County, KS":{"recorder":{"name":"Jewell County Register of Deeds","address":"307 N Commercial St., Mankato, KS 66956"},"assessor":{"name":"Jewell County Appraiser","address":"307 N Commercial St., Mankato, KS 66956"}},"Johnson County, KS":{"recorder":{"name":"Johnson County Register of Deeds","address":"111 S Cherry St. Suite 3200, Olathe, KS 66061"},"assessor":{"name":"Johnson County Appraiser","address":"11811 S Sunset Dr. Suite 2100, Olathe, KS 66061"}},"Kearny County, KS":{"recorder":{"name":"Kearny County Register of Deeds","address":"304 N Main St., Lakin, KS 67860"},"assessor":{"name":"Kearny County Appraiser","address":"304 N Main St., Lakin, KS 67860"}},"Kingman County, KS":{"recorder":{"name":"Kingman County Register of Deeds","address":"130 N Spruce St., Kingman, KS 67068"},"assessor":{"name":"Kingman County Appraiser","address":"130 N Spruce St., Kingman, KS 67068"}},"Kiowa County, KS":{"recorder":{"name":"Kiowa County Register of Deeds","address":"211 E Florida Ave., Greensburg, KS 67054"},"assessor":{"name":"Kiowa County Appraiser","address":"211 E Florida Ave., Greensburg, KS 67054"}},"Labette County, KS":{"recorder":{"name":"Labette County Register of Deeds","address":"501 Merchant St., Oswego, KS 67356"},"assessor":{"name":"Labette County Appraiser","address":"501 Merchant St., Oswego, KS 67356"}},"Lane County, KS":{"recorder":{"name":"Lane County Register of Deeds","address":"144 S Lane Ave., Dighton, KS 67839"},"assessor":{"name":"Lane County Appraiser","address":"144 S Lane Ave., Dighton, KS 67839"}},"Leavenworth County, KS":{"recorder":{"name":"Leavenworth County Register of Deeds","address":"300 Walnut St. Suite 106, Leavenworth, KS 66048"},"assessor":{"name":"Leavenworth County Appraiser","address":"300 Walnut St. Suite 204, Leavenworth, KS 66048"}},"Lincoln County, KS":{"recorder":{"name":"Lincoln County Register of Deeds","address":"216 E Lincoln Ave., Lincoln, KS 67455"},"assessor":{"name":"Lincoln County Appraiser","address":"216 E Lincoln Ave., Lincoln, KS 67455"}},"Linn County, KS":{"recorder":{"name":"Linn County Register of Deeds","address":"315 Main St., Mound City, KS 66056"},"assessor":{"name":"Linn County Appraiser","address":"315 Main St., Mound City, KS 66056"}},"Logan County, KS":{"recorder":{"name":"Logan County Register of Deeds","address":"710 W 2nd St., Oakley, KS 67748"},"assessor":{"name":"Logan County Appraiser","address":"710 W 2nd St., Oakley, KS 67748"}},"Lyon County, KS":{"recorder":{"name":"Lyon County Register of Deeds","address":"430 Commercial St., Emporia, KS 66801"},"assessor":{"name":"Lyon County Appraiser","address":"430 Commercial St., Emporia, KS 66801"}},"Marion County, KS":{"recorder":{"name":"Marion County Register of Deeds","address":"200 S 3rd St., Marion, KS 66861"},"assessor":{"name":"Marion County Appraiser","address":"200 S 3rd St., Marion, KS 66861"}},"Marshall County, KS":{"recorder":{"name":"Marshall County Register of Deeds","address":"1201 Broadway St., Marysville, KS 66508"},"assessor":{"name":"Marshall County Appraiser","address":"1201 Broadway St., Marysville, KS 66508"}},"McPherson County, KS":{"recorder":{"name":"McPherson County Register of Deeds","address":"117 N Maple St., McPherson, KS 67460"},"assessor":{"name":"McPherson County Appraiser","address":"117 N Maple St., McPherson, KS 67460"}},"Meade County, KS":{"recorder":{"name":"Meade County Register of Deeds","address":"200 N Fowler St., Meade, KS 67864"},"assessor":{"name":"Meade County Appraiser","address":"200 N Fowler St., Meade, KS 67864"}},"Miami County, KS":{"recorder":{"name":"Miami County Register of Deeds","address":"201 S Pearl St. Suite 203, Paola, KS 66071"},"assessor":{"name":"Miami County Appraiser","address":"201 S Pearl St. Suite 201, Paola, KS 66071"}},"Mitchell County, KS":{"recorder":{"name":"Mitchell County Register of Deeds","address":"111 S Hersey Ave., Beloit, KS 67420"},"assessor":{"name":"Mitchell County Appraiser","address":"111 S Hersey Ave., Beloit, KS 67420"}},"Montgomery County, KS":{"recorder":{"name":"Montgomery County Register of Deeds","address":"300 E Main St., Independence, KS 67301"},"assessor":{"name":"Montgomery County Appraiser","address":"300 E Main St., Independence, KS 67301"}},"Morris County, KS":{"recorder":{"name":"Morris County Register of Deeds","address":"501 W Main St., Council Grove, KS 66846"},"assessor":{"name":"Morris County Appraiser","address":"501 W Main St., Council Grove, KS 66846"}},"Morton County, KS":{"recorder":{"name":"Morton County Register of Deeds","address":"1025 Morton St., Elkhart, KS 67950"},"assessor":{"name":"Morton County Appraiser","address":"1025 Morton St., Elkhart, KS 67950"}},"Nemaha County, KS":{"recorder":{"name":"Nemaha County Register of Deeds","address":"607 Nemaha St., Seneca, KS 66538"},"assessor":{"name":"Nemaha County Appraiser","address":"607 Nemaha St., Seneca, KS 66538"}},"Neosho County, KS":{"recorder":{"name":"Neosho County Register of Deeds","address":"100 S Main St., Erie, KS 66733"},"assessor":{"name":"Neosho County Appraiser","address":"100 S Main St., Erie, KS 66733"}},"Ness County, KS":{"recorder":{"name":"Ness County Register of Deeds","address":"202 W Sycamore St., Ness City, KS 67560"},"assessor":{"name":"Ness County Appraiser","address":"202 W Sycamore St., Ness City, KS 67560"}},"Norton County, KS":{"recorder":{"name":"Norton County Register of Deeds","address":"105 S Kansas Ave., Norton, KS 67654"},"assessor":{"name":"Norton County Appraiser","address":"105 S Kansas Ave., Norton, KS 67654"}},"Osage County, KS":{"recorder":{"name":"Osage County Register of Deeds","address":"717 Topeka Ave., Lyndon, KS 66451"},"assessor":{"name":"Osage County Appraiser","address":"717 Topeka Ave., Lyndon, KS 66451"}},"Osborne County, KS":{"recorder":{"name":"Osborne County Register of Deeds","address":"423 W Main St., Osborne, KS 67473"},"assessor":{"name":"Osborne County Appraiser","address":"423 W Main St., Osborne, KS 67473"}},"Ottawa County, KS":{"recorder":{"name":"Ottawa County Register of Deeds","address":"307 N Concord St., Minneapolis, KS 67467"},"assessor":{"name":"Ottawa County Appraiser","address":"307 N Concord St., Minneapolis, KS 67467"}},"Pawnee County, KS":{"recorder":{"name":"Pawnee County Register of Deeds","address":"715 Broadway St., Larned, KS 67550"},"assessor":{"name":"Pawnee County Appraiser","address":"715 Broadway St., Larned, KS 67550"}},"Phillips County, KS":{"recorder":{"name":"Phillips County Register of Deeds","address":"301 State St., Phillipsburg, KS 67661"},"assessor":{"name":"Phillips County Appraiser","address":"301 State St., Phillipsburg, KS 67661"}},"Pottawatomie County, KS":{"recorder":{"name":"Pottawatomie County Register of Deeds","address":"207 N 1st St., Westmoreland, KS 66549"},"assessor":{"name":"Pottawatomie County Appraiser","address":"207 N 1st St., Westmoreland, KS 66549"}},"Pratt County, KS":{"recorder":{"name":"Pratt County Register of Deeds","address":"300 S Ninnescah St., Pratt, KS 67124"},"assessor":{"name":"Pratt County Appraiser","address":"300 S Ninnescah St., Pratt, KS 67124"}},"Rawlins County, KS":{"recorder":{"name":"Rawlins County Register of Deeds","address":"607 Main St., Atwood, KS 67730"},"assessor":{"name":"Rawlins County Appraiser","address":"607 Main St., Atwood, KS 67730"}},"Reno County, KS":{"recorder":{"name":"Reno County Register of Deeds","address":"206 W 1st Ave., Hutchinson, KS 67501"},"assessor":{"name":"Reno County Appraiser","address":"206 W 1st Ave., Hutchinson, KS 67501"}},"Republic County, KS":{"recorder":{"name":"Republic County Register of Deeds","address":"1815 M St., Belleville, KS 66935"},"assessor":{"name":"Republic County Appraiser","address":"1815 M St., Belleville, KS 66935"}},"Rice County, KS":{"recorder":{"name":"Rice County Register of Deeds","address":"101 W Commercial St., Lyons, KS 67554"},"assessor":{"name":"Rice County Appraiser","address":"101 W Commercial St., Lyons, KS 67554"}},"Riley County, KS":{"recorder":{"name":"Riley County Register of Deeds","address":"110 Courthouse Plaza, Manhattan, KS 66502"},"assessor":{"name":"Riley County Appraiser","address":"110 Courthouse Plaza, Manhattan, KS 66502"}},"Rooks County, KS":{"recorder":{"name":"Rooks County Register of Deeds","address":"115 N Walnut St., Stockton, KS 67669"},"assessor":{"name":"Rooks County Appraiser","address":"115 N Walnut St., Stockton, KS 67669"}},"Rush County, KS":{"recorder":{"name":"Rush County Register of Deeds","address":"715 Elm St., La Crosse, KS 67548"},"assessor":{"name":"Rush County Appraiser","address":"715 Elm St., La Crosse, KS 67548"}},"Russell County, KS":{"recorder":{"name":"Russell County Register of Deeds","address":"401 N Main St., Russell, KS 67665"},"assessor":{"name":"Russell County Appraiser","address":"401 N Main St., Russell, KS 67665"}},"Saline County, KS":{"recorder":{"name":"Saline County Register of Deeds","address":"300 W Ash St. Room 214, Salina, KS 67401"},"assessor":{"name":"Saline County Appraiser","address":"300 W Ash St. Room 209, Salina, KS 67401"}},"Scott County, KS":{"recorder":{"name":"Scott County Register of Deeds","address":"303 Court St., Scott City, KS 67871"},"assessor":{"name":"Scott County Appraiser","address":"303 Court St., Scott City, KS 67871"}},"Sedgwick County, KS":{"recorder":{"name":"Sedgwick County Register of Deeds","address":"525 N Main St. Suite 227, Wichita, KS 67203"},"assessor":{"name":"Sedgwick County Appraiser","address":"271 W 3rd St. N Suite 501, Wichita, KS 67202"}},"Seward County, KS":{"recorder":{"name":"Seward County Register of Deeds","address":"415 N Washington St., Liberal, KS 67901"},"assessor":{"name":"Seward County Appraiser","address":"415 N Washington St., Liberal, KS 67901"}},"Shawnee County, KS":{"recorder":{"name":"Shawnee County Register of Deeds","address":"200 SE 7th St. Room 108, Topeka, KS 66603"},"assessor":{"name":"Shawnee County Appraiser","address":"1515 NW Saline St., Topeka, KS 66618"}},"Sheridan County, KS":{"recorder":{"name":"Sheridan County Register of Deeds","address":"925 9th St., Hoxie, KS 67740"},"assessor":{"name":"Sheridan County Appraiser","address":"925 9th St., Hoxie, KS 67740"}},"Sherman County, KS":{"recorder":{"name":"Sherman County Register of Deeds","address":"813 Broadway St., Goodland, KS 67735"},"assessor":{"name":"Sherman County Appraiser","address":"813 Broadway St., Goodland, KS 67735"}},"Smith County, KS":{"recorder":{"name":"Smith County Register of Deeds","address":"218 S Grant Ave., Smith Center, KS 66967"},"assessor":{"name":"Smith County Appraiser","address":"218 S Grant Ave., Smith Center, KS 66967"}},"Stafford County, KS":{"recorder":{"name":"Stafford County Register of Deeds","address":"209 N Broadway Ave., St. John, KS 67576"},"assessor":{"name":"Stafford County Appraiser","address":"209 N Broadway Ave., St. John, KS 67576"}},"Stanton County, KS":{"recorder":{"name":"Stanton County Register of Deeds","address":"201 N Main St., Johnson, KS 67855"},"assessor":{"name":"Stanton County Appraiser","address":"201 N Main St., Johnson, KS 67855"}},"Stevens County, KS":{"recorder":{"name":"Stevens County Register of Deeds","address":"200 E 6th St., Hugoton, KS 67951"},"assessor":{"name":"Stevens County Appraiser","address":"200 E 6th St., Hugoton, KS 67951"}},"Sumner County, KS":{"recorder":{"name":"Sumner County Register of Deeds","address":"501 N Washington Ave., Wellington, KS 67152"},"assessor":{"name":"Sumner County Appraiser","address":"501 N Washington Ave., Wellington, KS 67152"}},"Thomas County, KS":{"recorder":{"name":"Thomas County Register of Deeds","address":"300 N Court Ave., Colby, KS 67701"},"assessor":{"name":"Thomas County Appraiser","address":"300 N Court Ave., Colby, KS 67701"}},"Trego County, KS":{"recorder":{"name":"Trego County Register of Deeds","address":"216 N Main St., WaKeeney, KS 67672"},"assessor":{"name":"Trego County Appraiser","address":"216 N Main St., WaKeeney, KS 67672"}},"Wabaunsee County, KS":{"recorder":{"name":"Wabaunsee County Register of Deeds","address":"215 Kansas Ave., Alma, KS 66401"},"assessor":{"name":"Wabaunsee County Appraiser","address":"215 Kansas Ave., Alma, KS 66401"}},"Wallace County, KS":{"recorder":{"name":"Wallace County Register of Deeds","address":"313 Main St., Sharon Springs, KS 67758"},"assessor":{"name":"Wallace County Appraiser","address":"313 Main St., Sharon Springs, KS 67758"}},"Washington County, KS":{"recorder":{"name":"Washington County Register of Deeds","address":"214 C St., Washington, KS 66968"},"assessor":{"name":"Washington County Appraiser","address":"214 C St., Washington, KS 66968"}},"Wichita County, KS":{"recorder":{"name":"Wichita County Register of Deeds","address":"206 S 4th St., Leoti, KS 67861"},"assessor":{"name":"Wichita County Appraiser","address":"206 S 4th St., Leoti, KS 67861"}},"Wilson County, KS":{"recorder":{"name":"Wilson County Register of Deeds","address":"615 Madison St., Fredonia, KS 66736"},"assessor":{"name":"Wilson County Appraiser","address":"615 Madison St., Fredonia, KS 66736"}},"Woodson County, KS":{"recorder":{"name":"Woodson County Register of Deeds","address":"105 W Rutledge St., Yates Center, KS 66783"},"assessor":{"name":"Woodson County Appraiser","address":"105 W Rutledge St., Yates Center, KS 66783"}},"Wyandotte County, KS":{"recorder":{"name":"Wyandotte County Register of Deeds","address":"710 N 7th St. Suite 240, Kansas City, KS 66101"},"assessor":{"name":"Wyandotte County Appraiser","address":"8200 State Ave., Kansas City, KS 66112"}},"Adair County, KY":{"recorder":{"name":"Adair County Clerk","address":"424 Public Square Suite 2, Columbia, KY 42728"},"assessor":{"name":"Adair County PVA","address":"424 Public Square Suite 5, Columbia, KY 42728"}},"Allen County, KY":{"recorder":{"name":"Allen County Clerk","address":"201 W Main St., Scottsville, KY 42164"},"assessor":{"name":"Allen County PVA","address":"201 W Main St. Suite 4, Scottsville, KY 42164"}},"Anderson County, KY":{"recorder":{"name":"Anderson County Clerk","address":"151 S Main St., Lawrenceburg, KY 40342"},"assessor":{"name":"Anderson County PVA","address":"151 S Main St. Suite 6, Lawrenceburg, KY 40342"}},"Ballard County, KY":{"recorder":{"name":"Ballard County Clerk","address":"132 N 4th St., Wickliffe, KY 42087"},"assessor":{"name":"Ballard County PVA","address":"132 N 4th St., Wickliffe, KY 42087"}},"Barren County, KY":{"recorder":{"name":"Barren County Clerk","address":"117 N Public Square Suite 1, Glasgow, KY 42141"},"assessor":{"name":"Barren County PVA","address":"117 N Public Square Suite 2, Glasgow, KY 42141"}},"Bath County, KY":{"recorder":{"name":"Bath County Clerk","address":"19 E Main St., Owingsville, KY 40360"},"assessor":{"name":"Bath County PVA","address":"19 E Main St., Owingsville, KY 40360"}},"Bell County, KY":{"recorder":{"name":"Bell County Clerk","address":"101 Courthouse Square, Pineville, KY 40977"},"assessor":{"name":"Bell County PVA","address":"101 Courthouse Square, Pineville, KY 40977"}},"Boone County, KY":{"recorder":{"name":"Boone County Clerk","address":"2950 Washington St., Burlington, KY 41005"},"assessor":{"name":"Boone County PVA","address":"2950 Washington St., Burlington, KY 41005"}},"Bourbon County, KY":{"recorder":{"name":"Bourbon County Clerk","address":"301 Main St. Suite 102, Paris, KY 40361"},"assessor":{"name":"Bourbon County PVA","address":"301 Main St. Suite 102, Paris, KY 40361"}},"Boyd County, KY":{"recorder":{"name":"Boyd County Clerk","address":"2800 Louisa St., Catlettsburg, KY 41129"},"assessor":{"name":"Boyd County PVA","address":"2800 Louisa St., Catlettsburg, KY 41129"}},"Boyle County, KY":{"recorder":{"name":"Boyle County Clerk","address":"321 W Main St. Suite 123, Danville, KY 40422"},"assessor":{"name":"Boyle County PVA","address":"321 W Main St. Suite 123, Danville, KY 40422"}},"Bracken County, KY":{"recorder":{"name":"Bracken County Clerk","address":"116 W Miami St., Brooksville, KY 41004"},"assessor":{"name":"Bracken County PVA","address":"116 W Miami St., Brooksville, KY 41004"}},"Breathitt County, KY":{"recorder":{"name":"Breathitt County Clerk","address":"1137 Main St., Jackson, KY 41339"},"assessor":{"name":"Breathitt County PVA","address":"1137 Main St., Jackson, KY 41339"}},"Breckinridge County, KY":{"recorder":{"name":"Breckinridge County Clerk","address":"208 S Main St., Hardinsburg, KY 40143"},"assessor":{"name":"Breckinridge County PVA","address":"208 S Main St., Hardinsburg, KY 40143"}},"Bullitt County, KY":{"recorder":{"name":"Bullitt County Clerk","address":"149 N Walnut St., Shepherdsville, KY 40165"},"assessor":{"name":"Bullitt County PVA","address":"149 N Walnut St., Shepherdsville, KY 40165"}},"Butler County, KY":{"recorder":{"name":"Butler County Clerk","address":"110 N Main St., Morgantown, KY 42261"},"assessor":{"name":"Butler County PVA","address":"110 N Main St., Morgantown, KY 42261"}},"Caldwell County, KY":{"recorder":{"name":"Caldwell County Clerk","address":"100 E Market St., Princeton, KY 42445"},"assessor":{"name":"Caldwell County PVA","address":"100 E Market St., Princeton, KY 42445"}},"Calloway County, KY":{"recorder":{"name":"Calloway County Clerk","address":"101 S 5th St., Murray, KY 42071"},"assessor":{"name":"Calloway County PVA","address":"101 S 5th St., Murray, KY 42071"}},"Campbell County, KY":{"recorder":{"name":"Campbell County Clerk","address":"330 York St., Newport, KY 41071"},"assessor":{"name":"Campbell County PVA","address":"330 York St., Newport, KY 41071"}},"Carlisle County, KY":{"recorder":{"name":"Carlisle County Clerk","address":"Bardwell, KY 42023"},"assessor":{"name":"Carlisle County PVA","address":"Bardwell, KY 42023"}},"Carroll County, KY":{"recorder":{"name":"Carroll County Clerk","address":"440 Main St., Carrollton, KY 41008"},"assessor":{"name":"Carroll County PVA","address":"440 Main St., Carrollton, KY 41008"}},"Carter County, KY":{"recorder":{"name":"Carter County Clerk","address":"300 W Main St., Grayson, KY 41143"},"assessor":{"name":"Carter County PVA","address":"300 W Main St., Grayson, KY 41143"}},"Casey County, KY":{"recorder":{"name":"Casey County Clerk","address":"100 S Jefferson St., Liberty, KY 42539"},"assessor":{"name":"Casey County PVA","address":"100 S Jefferson St., Liberty, KY 42539"}},"Christian County, KY":{"recorder":{"name":"Christian County Clerk","address":"511 S Main St., Hopkinsville, KY 42240"},"assessor":{"name":"Christian County PVA","address":"511 S Main St., Hopkinsville, KY 42240"}},"Clark County, KY":{"recorder":{"name":"Clark County Clerk","address":"34 S Main St., Winchester, KY 40391"},"assessor":{"name":"Clark County PVA","address":"34 S Main St., Winchester, KY 40391"}},"Clay County, KY":{"recorder":{"name":"Clay County Clerk","address":"102 Richmond Rd. Suite 100, Manchester, KY 40962"},"assessor":{"name":"Clay County PVA","address":"102 Richmond Rd. Suite 100, Manchester, KY 40962"}},"Clinton County, KY":{"recorder":{"name":"Clinton County Clerk","address":"100 S Cross St., Albany, KY 42602"},"assessor":{"name":"Clinton County PVA","address":"100 S Cross St., Albany, KY 42602"}},"Crittenden County, KY":{"recorder":{"name":"Crittenden County Clerk","address":"107 S Main St., Marion, KY 42064"},"assessor":{"name":"Crittenden County PVA","address":"107 S Main St., Marion, KY 42064"}},"Cumberland County, KY":{"recorder":{"name":"Cumberland County Clerk","address":"1 Court Square Suite 2, Burkesville, KY 42717"},"assessor":{"name":"Cumberland County PVA","address":"1 Court Square Suite 2, Burkesville, KY 42717"}},"Daviess County, KY":{"recorder":{"name":"Daviess County Clerk","address":"212 St. Ann St., Owensboro, KY 42303"},"assessor":{"name":"Daviess County PVA","address":"212 St. Ann St., Owensboro, KY 42303"}},"Edmonson County, KY":{"recorder":{"name":"Edmonson County Clerk","address":"Main St., Brownsville, KY 42210"},"assessor":{"name":"Edmonson County PVA","address":"Main St., Brownsville, KY 42210"}},"Elliott County, KY":{"recorder":{"name":"Elliott County Clerk","address":"Main St., Sandy Hook, KY 41171"},"assessor":{"name":"Elliott County PVA","address":"Main St., Sandy Hook, KY 41171"}},"Estill County, KY":{"recorder":{"name":"Estill County Clerk","address":"130 Main St., Irvine, KY 40336"},"assessor":{"name":"Estill County PVA","address":"130 Main St., Irvine, KY 40336"}},"Fayette County, KY":{"recorder":{"name":"Fayette County Clerk","address":"162 E Main St., Lexington, KY 40507"},"assessor":{"name":"Fayette County PVA","address":"101 E Vine St. Suite 600, Lexington, KY 40507"}},"Fleming County, KY":{"recorder":{"name":"Fleming County Clerk","address":"100 Court Square, Flemingsburg, KY 41041"},"assessor":{"name":"Fleming County PVA","address":"100 Court Square, Flemingsburg, KY 41041"}},"Floyd County, KY":{"recorder":{"name":"Floyd County Clerk","address":"149 S Central Ave., Prestonsburg, KY 41653"},"assessor":{"name":"Floyd County PVA","address":"149 S Central Ave., Prestonsburg, KY 41653"}},"Franklin County, KY":{"recorder":{"name":"Franklin County Clerk","address":"315 W Main St. Suite 103, Frankfort, KY 40601"},"assessor":{"name":"Franklin County PVA","address":"315 W Main St. Suite 103, Frankfort, KY 40601"}},"Fulton County, KY":{"recorder":{"name":"Fulton County Clerk","address":"2216 E State Line Rd., Hickman, KY 42050"},"assessor":{"name":"Fulton County PVA","address":"2216 E State Line Rd., Hickman, KY 42050"}},"Gallatin County, KY":{"recorder":{"name":"Gallatin County Clerk","address":"100 Main St., Warsaw, KY 41095"},"assessor":{"name":"Gallatin County PVA","address":"100 Main St., Warsaw, KY 41095"}},"Garrard County, KY":{"recorder":{"name":"Garrard County Clerk","address":"15 Public Square, Lancaster, KY 40444"},"assessor":{"name":"Garrard County PVA","address":"15 Public Square, Lancaster, KY 40444"}},"Grant County, KY":{"recorder":{"name":"Grant County Clerk","address":"101 N Main St., Williamstown, KY 41097"},"assessor":{"name":"Grant County PVA","address":"101 N Main St., Williamstown, KY 41097"}},"Graves County, KY":{"recorder":{"name":"Graves County Clerk","address":"100 E Broadway, Mayfield, KY 42066"},"assessor":{"name":"Graves County PVA","address":"100 E Broadway, Mayfield, KY 42066"}},"Grayson County, KY":{"recorder":{"name":"Grayson County Clerk","address":"10 Public Square, Leitchfield, KY 42754"},"assessor":{"name":"Grayson County PVA","address":"10 Public Square, Leitchfield, KY 42754"}},"Green County, KY":{"recorder":{"name":"Green County Clerk","address":"203 W Court St., Greensburg, KY 42743"},"assessor":{"name":"Green County PVA","address":"203 W Court St., Greensburg, KY 42743"}},"Greenup County, KY":{"recorder":{"name":"Greenup County Clerk","address":"301 Main St., Greenup, KY 41144"},"assessor":{"name":"Greenup County PVA","address":"301 Main St., Greenup, KY 41144"}},"Hancock County, KY":{"recorder":{"name":"Hancock County Clerk","address":"225 Main Cross St., Hawesville, KY 42348"},"assessor":{"name":"Hancock County PVA","address":"225 Main Cross St., Hawesville, KY 42348"}},"Hardin County, KY":{"recorder":{"name":"Hardin County Clerk","address":"14 Public Square, Elizabethtown, KY 42701"},"assessor":{"name":"Hardin County PVA","address":"14 Public Square, Elizabethtown, KY 42701"}},"Harlan County, KY":{"recorder":{"name":"Harlan County Clerk","address":"205 W Central St., Harlan, KY 40831"},"assessor":{"name":"Harlan County PVA","address":"205 W Central St., Harlan, KY 40831"}},"Harrison County, KY":{"recorder":{"name":"Harrison County Clerk","address":"111 S Main St. Suite 1, Cynthiana, KY 41031"},"assessor":{"name":"Harrison County PVA","address":"111 S Main St. Suite 1, Cynthiana, KY 41031"}},"Hart County, KY":{"recorder":{"name":"Hart County Clerk","address":"Main St., Munfordville, KY 42765"},"assessor":{"name":"Hart County PVA","address":"Main St., Munfordville, KY 42765"}},"Henderson County, KY":{"recorder":{"name":"Henderson County Clerk","address":"20 N Main St., Henderson, KY 42420"},"assessor":{"name":"Henderson County PVA","address":"20 N Main St., Henderson, KY 42420"}},"Henry County, KY":{"recorder":{"name":"Henry County Clerk","address":"27 Main St., New Castle, KY 40050"},"assessor":{"name":"Henry County PVA","address":"27 Main St., New Castle, KY 40050"}},"Hickman County, KY":{"recorder":{"name":"Hickman County Clerk","address":"110 E Clay St., Clinton, KY 42031"},"assessor":{"name":"Hickman County PVA","address":"110 E Clay St., Clinton, KY 42031"}},"Hopkins County, KY":{"recorder":{"name":"Hopkins County Clerk","address":"25 E Center St., Madisonville, KY 42431"},"assessor":{"name":"Hopkins County PVA","address":"25 E Center St., Madisonville, KY 42431"}},"Jackson County, KY":{"recorder":{"name":"Jackson County Clerk","address":"Main St., McKee, KY 40447"},"assessor":{"name":"Jackson County PVA","address":"Main St., McKee, KY 40447"}},"Jefferson County, KY":{"recorder":{"name":"Jefferson County Clerk","address":"527 W Jefferson St. Suite 100, Louisville, KY 40202"},"assessor":{"name":"Jefferson County PVA","address":"815 W Market St. Suite 400, Louisville, KY 40202"}},"Jessamine County, KY":{"recorder":{"name":"Jessamine County Clerk","address":"101 N Main St., Nicholasville, KY 40356"},"assessor":{"name":"Jessamine County PVA","address":"101 N Main St., Nicholasville, KY 40356"}},"Johnson County, KY":{"recorder":{"name":"Johnson County Clerk","address":"230 Court St. Suite 201, Paintsville, KY 41240"},"assessor":{"name":"Johnson County PVA","address":"230 Court St. Suite 201, Paintsville, KY 41240"}},"Kenton County, KY":{"recorder":{"name":"Kenton County Clerk","address":"303 Court St., Covington, KY 41011"},"assessor":{"name":"Kenton County PVA","address":"303 Court St., Covington, KY 41011"}},"Knott County, KY":{"recorder":{"name":"Knott County Clerk","address":"54 W Courthouse Sq., Hindman, KY 41822"},"assessor":{"name":"Knott County PVA","address":"54 W Courthouse Sq., Hindman, KY 41822"}},"Knox County, KY":{"recorder":{"name":"Knox County Clerk","address":"401 Court Square Suite 102, Barbourville, KY 40906"},"assessor":{"name":"Knox County PVA","address":"401 Court Square Suite 102, Barbourville, KY 40906"}},"Larue County, KY":{"recorder":{"name":"Larue County Clerk","address":"209 W High St., Hodgenville, KY 42748"},"assessor":{"name":"Larue County PVA","address":"209 W High St., Hodgenville, KY 42748"}},"Laurel County, KY":{"recorder":{"name":"Laurel County Clerk","address":"101 S Main St. Suite 203, London, KY 40741"},"assessor":{"name":"Laurel County PVA","address":"101 S Main St. Suite 203, London, KY 40741"}},"Lawrence County, KY":{"recorder":{"name":"Lawrence County Clerk","address":"122 S Main Cross St., Louisa, KY 41230"},"assessor":{"name":"Lawrence County PVA","address":"122 S Main Cross St., Louisa, KY 41230"}},"Lee County, KY":{"recorder":{"name":"Lee County Clerk","address":"38 Main St., Beattyville, KY 41311"},"assessor":{"name":"Lee County PVA","address":"38 Main St., Beattyville, KY 41311"}},"Leslie County, KY":{"recorder":{"name":"Leslie County Clerk","address":"22010 Main St., Hyden, KY 41749"},"assessor":{"name":"Leslie County PVA","address":"22010 Main St., Hyden, KY 41749"}},"Letcher County, KY":{"recorder":{"name":"Letcher County Clerk","address":"156 Main St. Suite 100, Whitesburg, KY 41858"},"assessor":{"name":"Letcher County PVA","address":"156 Main St. Suite 100, Whitesburg, KY 41858"}},"Lewis County, KY":{"recorder":{"name":"Lewis County Clerk","address":"510 Second St., Vanceburg, KY 41179"},"assessor":{"name":"Lewis County PVA","address":"510 Second St., Vanceburg, KY 41179"}},"Lincoln County, KY":{"recorder":{"name":"Lincoln County Clerk","address":"102 E Main St. Suite 1, Stanford, KY 40484"},"assessor":{"name":"Lincoln County PVA","address":"102 E Main St. Suite 1, Stanford, KY 40484"}},"Livingston County, KY":{"recorder":{"name":"Livingston County Clerk","address":"100 Court St., Smithland, KY 42081"},"assessor":{"name":"Livingston County PVA","address":"100 Court St., Smithland, KY 42081"}},"Logan County, KY":{"recorder":{"name":"Logan County Clerk","address":"200 W 4th St., Russellville, KY 42276"},"assessor":{"name":"Logan County PVA","address":"200 W 4th St., Russellville, KY 42276"}},"Lyon County, KY":{"recorder":{"name":"Lyon County Clerk","address":"Main St., Eddyville, KY 42038"},"assessor":{"name":"Lyon County PVA","address":"Main St., Eddyville, KY 42038"}},"Madison County, KY":{"recorder":{"name":"Madison County Clerk","address":"101 W Main St., Richmond, KY 40475"},"assessor":{"name":"Madison County PVA","address":"101 W Main St., Richmond, KY 40475"}},"Magoffin County, KY":{"recorder":{"name":"Magoffin County Clerk","address":"Main St., Salyersville, KY 41465"},"assessor":{"name":"Magoffin County PVA","address":"Main St., Salyersville, KY 41465"}},"Marion County, KY":{"recorder":{"name":"Marion County Clerk","address":"223 N Spalding Ave. Suite 203, Lebanon, KY 40033"},"assessor":{"name":"Marion County PVA","address":"223 N Spalding Ave. Suite 203, Lebanon, KY 40033"}},"Marshall County, KY":{"recorder":{"name":"Marshall County Clerk","address":"1101 Main St., Benton, KY 42025"},"assessor":{"name":"Marshall County PVA","address":"1101 Main St., Benton, KY 42025"}},"Martin County, KY":{"recorder":{"name":"Martin County Clerk","address":"Main St., Inez, KY 41224"},"assessor":{"name":"Martin County PVA","address":"Main St., Inez, KY 41224"}},"Mason County, KY":{"recorder":{"name":"Mason County Clerk","address":"27 W 3rd St., Maysville, KY 41056"},"assessor":{"name":"Mason County PVA","address":"27 W 3rd St., Maysville, KY 41056"}},"McCracken County, KY":{"recorder":{"name":"McCracken County Clerk","address":"300 S 7th St. Room 109, Paducah, KY 42003"},"assessor":{"name":"McCracken County PVA","address":"300 S 7th St. Room 109, Paducah, KY 42003"}},"McCreary County, KY":{"recorder":{"name":"McCreary County Clerk","address":"Main St., Whitley City, KY 42653"},"assessor":{"name":"McCreary County PVA","address":"Main St., Whitley City, KY 42653"}},"McLean County, KY":{"recorder":{"name":"McLean County Clerk","address":"210 Main St., Calhoun, KY 42327"},"assessor":{"name":"McLean County PVA","address":"210 Main St., Calhoun, KY 42327"}},"Meade County, KY":{"recorder":{"name":"Meade County Clerk","address":"516 Hillcrest Dr., Brandenburg, KY 40108"},"assessor":{"name":"Meade County PVA","address":"516 Hillcrest Dr., Brandenburg, KY 40108"}},"Menifee County, KY":{"recorder":{"name":"Menifee County Clerk","address":"Frenchburg, KY 40322"},"assessor":{"name":"Menifee County PVA","address":"Frenchburg, KY 40322"}},"Mercer County, KY":{"recorder":{"name":"Mercer County Clerk","address":"207 W Lexington St. Suite 9, Harrodsburg, KY 40330"},"assessor":{"name":"Mercer County PVA","address":"207 W Lexington St. Suite 9, Harrodsburg, KY 40330"}},"Metcalfe County, KY":{"recorder":{"name":"Metcalfe County Clerk","address":"100 E Stockton St., Edmonton, KY 42129"},"assessor":{"name":"Metcalfe County PVA","address":"100 E Stockton St., Edmonton, KY 42129"}},"Monroe County, KY":{"recorder":{"name":"Monroe County Clerk","address":"200 N Main St., Tompkinsville, KY 42167"},"assessor":{"name":"Monroe County PVA","address":"200 N Main St., Tompkinsville, KY 42167"}},"Montgomery County, KY":{"recorder":{"name":"Montgomery County Clerk","address":"1 Court St., Mount Sterling, KY 40353"},"assessor":{"name":"Montgomery County PVA","address":"1 Court St., Mount Sterling, KY 40353"}},"Morgan County, KY":{"recorder":{"name":"Morgan County Clerk","address":"505 Prestonsburg St., West Liberty, KY 41472"},"assessor":{"name":"Morgan County PVA","address":"505 Prestonsburg St., West Liberty, KY 41472"}},"Muhlenberg County, KY":{"recorder":{"name":"Muhlenberg County Clerk","address":"100 W Main St., Greenville, KY 42345"},"assessor":{"name":"Muhlenberg County PVA","address":"100 W Main St., Greenville, KY 42345"}},"Nelson County, KY":{"recorder":{"name":"Nelson County Clerk","address":"113 E Stephen Foster Ave., Bardstown, KY 40004"},"assessor":{"name":"Nelson County PVA","address":"113 E Stephen Foster Ave., Bardstown, KY 40004"}},"Nicholas County, KY":{"recorder":{"name":"Nicholas County Clerk","address":"125 E Main St., Carlisle, KY 40311"},"assessor":{"name":"Nicholas County PVA","address":"125 E Main St., Carlisle, KY 40311"}},"Ohio County, KY":{"recorder":{"name":"Ohio County Clerk","address":"Main St., Hartford, KY 42347"},"assessor":{"name":"Ohio County PVA","address":"Main St., Hartford, KY 42347"}},"Oldham County, KY":{"recorder":{"name":"Oldham County Clerk","address":"100 W Jefferson St., LaGrange, KY 40031"},"assessor":{"name":"Oldham County PVA","address":"100 W Jefferson St., LaGrange, KY 40031"}},"Owen County, KY":{"recorder":{"name":"Owen County Clerk","address":"135 W Bryan St., Owenton, KY 40359"},"assessor":{"name":"Owen County PVA","address":"135 W Bryan St., Owenton, KY 40359"}},"Owsley County, KY":{"recorder":{"name":"Owsley County Clerk","address":"154 Main St., Booneville, KY 41314"},"assessor":{"name":"Owsley County PVA","address":"154 Main St., Booneville, KY 41314"}},"Pendleton County, KY":{"recorder":{"name":"Pendleton County Clerk","address":"233 Main St., Falmouth, KY 41040"},"assessor":{"name":"Pendleton County PVA","address":"233 Main St., Falmouth, KY 41040"}},"Perry County, KY":{"recorder":{"name":"Perry County Clerk","address":"481 Main St., Hazard, KY 41701"},"assessor":{"name":"Perry County PVA","address":"481 Main St., Hazard, KY 41701"}},"Pike County, KY":{"recorder":{"name":"Pike County Clerk","address":"320 Main St., Pikeville, KY 41501"},"assessor":{"name":"Pike County PVA","address":"320 Main St., Pikeville, KY 41501"}},"Powell County, KY":{"recorder":{"name":"Powell County Clerk","address":"525 Washington St., Stanton, KY 40380"},"assessor":{"name":"Powell County PVA","address":"525 Washington St., Stanton, KY 40380"}},"Pulaski County, KY":{"recorder":{"name":"Pulaski County Clerk","address":"100 N Main St. Suite 200, Somerset, KY 42501"},"assessor":{"name":"Pulaski County PVA","address":"100 N Main St. Suite 200, Somerset, KY 42501"}},"Robertson County, KY":{"recorder":{"name":"Robertson County Clerk","address":"57 N Main St., Mount Olivet, KY 41064"},"assessor":{"name":"Robertson County PVA","address":"57 N Main St., Mount Olivet, KY 41064"}},"Rockcastle County, KY":{"recorder":{"name":"Rockcastle County Clerk","address":"205 E Main St. Suite 4, Mount Vernon, KY 40456"},"assessor":{"name":"Rockcastle County PVA","address":"205 E Main St. Suite 4, Mount Vernon, KY 40456"}},"Rowan County, KY":{"recorder":{"name":"Rowan County Clerk","address":"600 W Main St. Suite 102, Morehead, KY 40351"},"assessor":{"name":"Rowan County PVA","address":"600 W Main St. Suite 102, Morehead, KY 40351"}},"Russell County, KY":{"recorder":{"name":"Russell County Clerk","address":"410 Monument Square Suite 203, Jamestown, KY 42629"},"assessor":{"name":"Russell County PVA","address":"410 Monument Square Suite 203, Jamestown, KY 42629"}},"Scott County, KY":{"recorder":{"name":"Scott County Clerk","address":"101 E Main St., Georgetown, KY 40324"},"assessor":{"name":"Scott County PVA","address":"101 E Main St., Georgetown, KY 40324"}},"Shelby County, KY":{"recorder":{"name":"Shelby County Clerk","address":"501 Main St., Shelbyville, KY 40065"},"assessor":{"name":"Shelby County PVA","address":"501 Main St., Shelbyville, KY 40065"}},"Simpson County, KY":{"recorder":{"name":"Simpson County Clerk","address":"103 W Cedar St., Franklin, KY 42134"},"assessor":{"name":"Simpson County PVA","address":"103 W Cedar St., Franklin, KY 42134"}},"Spencer County, KY":{"recorder":{"name":"Spencer County Clerk","address":"20 Main St., Taylorsville, KY 40071"},"assessor":{"name":"Spencer County PVA","address":"20 Main St., Taylorsville, KY 40071"}},"Taylor County, KY":{"recorder":{"name":"Taylor County Clerk","address":"203 N Court St., Campbellsville, KY 42718"},"assessor":{"name":"Taylor County PVA","address":"203 N Court St., Campbellsville, KY 42718"}},"Todd County, KY":{"recorder":{"name":"Todd County Clerk","address":"P.O. Box 307, Elkton, KY 42220"},"assessor":{"name":"Todd County PVA","address":"Elkton, KY 42220"}},"Trigg County, KY":{"recorder":{"name":"Trigg County Clerk","address":"35 Main St., Cadiz, KY 42211"},"assessor":{"name":"Trigg County PVA","address":"35 Main St., Cadiz, KY 42211"}},"Trimble County, KY":{"recorder":{"name":"Trimble County Clerk","address":"Bedford, KY 40006"},"assessor":{"name":"Trimble County PVA","address":"Bedford, KY 40006"}},"Union County, KY":{"recorder":{"name":"Union County Clerk","address":"100 W Main St., Morganfield, KY 42437"},"assessor":{"name":"Union County PVA","address":"100 W Main St., Morganfield, KY 42437"}},"Warren County, KY":{"recorder":{"name":"Warren County Clerk","address":"429 E 10th Ave., Bowling Green, KY 42101"},"assessor":{"name":"Warren County PVA","address":"429 E 10th Ave., Bowling Green, KY 42101"}},"Washington County, KY":{"recorder":{"name":"Washington County Clerk","address":"105 Court Square, Springfield, KY 40069"},"assessor":{"name":"Washington County PVA","address":"105 Court Square, Springfield, KY 40069"}},"Wayne County, KY":{"recorder":{"name":"Wayne County Clerk","address":"109 N Main St., Monticello, KY 42633"},"assessor":{"name":"Wayne County PVA","address":"109 N Main St., Monticello, KY 42633"}},"Webster County, KY":{"recorder":{"name":"Webster County Clerk","address":"25 US 41A S, Dixon, KY 42409"},"assessor":{"name":"Webster County PVA","address":"25 US 41A S, Dixon, KY 42409"}},"Whitley County, KY":{"recorder":{"name":"Whitley County Clerk","address":"100 Main St. Suite 2, Williamsburg, KY 40769"},"assessor":{"name":"Whitley County PVA","address":"100 Main St. Suite 2, Williamsburg, KY 40769"}},"Wolfe County, KY":{"recorder":{"name":"Wolfe County Clerk","address":"10 Court St., Campton, KY 41301"},"assessor":{"name":"Wolfe County PVA","address":"10 Court St., Campton, KY 41301"}},"Woodford County, KY":{"recorder":{"name":"Woodford County Clerk","address":"103 S Main St., Versailles, KY 40383"},"assessor":{"name":"Woodford County PVA","address":"103 S Main St., Versailles, KY 40383"}},"Acadia Parish, LA":{"recorder":{"name":"Acadia Parish Clerk of Court","address":"500 NE Court Circle, Crowley, LA 70526"},"assessor":{"name":"Acadia Parish Assessor","address":"500 NE Court Circle, Crowley, LA 70526"}},"Allen Parish, LA":{"recorder":{"name":"Allen Parish Clerk of Court","address":"400 W 6th Ave., Oberlin, LA 70655"},"assessor":{"name":"Allen Parish Assessor","address":"400 W 6th Ave., Oberlin, LA 70655"}},"Ascension Parish, LA":{"recorder":{"name":"Ascension Parish Clerk of Court","address":"828 S Irma Blvd., Gonzales, LA 70737"},"assessor":{"name":"Ascension Parish Assessor","address":"300 Houmas St., Donaldsonville, LA 70346"}},"Assumption Parish, LA":{"recorder":{"name":"Assumption Parish Clerk of Court","address":"4809 Hwy 308, Napoleonville, LA 70390"},"assessor":{"name":"Assumption Parish Assessor","address":"4809 Hwy 308, Napoleonville, LA 70390"}},"Avoyelles Parish, LA":{"recorder":{"name":"Avoyelles Parish Clerk of Court","address":"312 N Main St., Marksville, LA 71351"},"assessor":{"name":"Avoyelles Parish Assessor","address":"312 N Main St., Marksville, LA 71351"}},"Beauregard Parish, LA":{"recorder":{"name":"Beauregard Parish Clerk of Court","address":"201 W 1st St., De Ridder, LA 70634"},"assessor":{"name":"Beauregard Parish Assessor","address":"201 W 1st St., De Ridder, LA 70634"}},"Bienville Parish, LA":{"recorder":{"name":"Bienville Parish Clerk of Court","address":"100 Courthouse Dr. Suite 100, Arcadia, LA 71001"},"assessor":{"name":"Bienville Parish Assessor","address":"100 Courthouse Dr. Suite 100, Arcadia, LA 71001"}},"Bossier Parish, LA":{"recorder":{"name":"Bossier Parish Clerk of Court","address":"204 Burt Blvd., Benton, LA 71006"},"assessor":{"name":"Bossier Parish Assessor","address":"204 Burt Blvd., Benton, LA 71006"}},"Caddo Parish, LA":{"recorder":{"name":"Caddo Parish Clerk of Court","address":"501 Texas St. Room 103, Shreveport, LA 71101"},"assessor":{"name":"Caddo Parish Assessor","address":"501 Texas St. Room 101, Shreveport, LA 71101"}},"Calcasieu Parish, LA":{"recorder":{"name":"Calcasieu Parish Clerk of Court","address":"1000 Ryan St., Lake Charles, LA 70601"},"assessor":{"name":"Calcasieu Parish Assessor","address":"1000 Ryan St., Lake Charles, LA 70601"}},"Caldwell Parish, LA":{"recorder":{"name":"Caldwell Parish Clerk of Court","address":"201 Main St. Suite 3, Columbia, LA 71418"},"assessor":{"name":"Caldwell Parish Assessor","address":"201 Main St. Suite 3, Columbia, LA 71418"}},"Cameron Parish, LA":{"recorder":{"name":"Cameron Parish Clerk of Court","address":"119 Smith Circle Suite 1, Cameron, LA 70631"},"assessor":{"name":"Cameron Parish Assessor","address":"119 Smith Circle Suite 1, Cameron, LA 70631"}},"Catahoula Parish, LA":{"recorder":{"name":"Catahoula Parish Clerk of Court","address":"301 Bushley St., Harrisonburg, LA 71340"},"assessor":{"name":"Catahoula Parish Assessor","address":"301 Bushley St., Harrisonburg, LA 71340"}},"Claiborne Parish, LA":{"recorder":{"name":"Claiborne Parish Clerk of Court","address":"512 E Main St., Homer, LA 71040"},"assessor":{"name":"Claiborne Parish Assessor","address":"512 E Main St., Homer, LA 71040"}},"Concordia Parish, LA":{"recorder":{"name":"Concordia Parish Clerk of Court","address":"4001 Carter St. Room 1, Vidalia, LA 71373"},"assessor":{"name":"Concordia Parish Assessor","address":"4001 Carter St. Room 1, Vidalia, LA 71373"}},"De Soto Parish, LA":{"recorder":{"name":"De Soto Parish Clerk of Court","address":"201 Texas St., Mansfield, LA 71052"},"assessor":{"name":"De Soto Parish Assessor","address":"201 Texas St., Mansfield, LA 71052"}},"East Baton Rouge Parish, LA":{"recorder":{"name":"East Baton Rouge Parish Clerk of Court","address":"222 St. Louis St. Room 238, Baton Rouge, LA 70802"},"assessor":{"name":"East Baton Rouge Parish Assessor","address":"222 St. Louis St. Room 126, Baton Rouge, LA 70802"}},"East Carroll Parish, LA":{"recorder":{"name":"East Carroll Parish Clerk of Court","address":"400 1st St., Lake Providence, LA 71254"},"assessor":{"name":"East Carroll Parish Assessor","address":"400 1st St., Lake Providence, LA 71254"}},"East Feliciana Parish, LA":{"recorder":{"name":"East Feliciana Parish Clerk of Court","address":"12305 St. Helena St., Clinton, LA 70722"},"assessor":{"name":"East Feliciana Parish Assessor","address":"12305 St. Helena St., Clinton, LA 70722"}},"Evangeline Parish, LA":{"recorder":{"name":"Evangeline Parish Clerk of Court","address":"200 Court St., Ville Platte, LA 70586"},"assessor":{"name":"Evangeline Parish Assessor","address":"200 Court St., Ville Platte, LA 70586"}},"Franklin Parish, LA":{"recorder":{"name":"Franklin Parish Clerk of Court","address":"6552 Main St., Winnsboro, LA 71295"},"assessor":{"name":"Franklin Parish Assessor","address":"6552 Main St., Winnsboro, LA 71295"}},"Grant Parish, LA":{"recorder":{"name":"Grant Parish Clerk of Court","address":"200 Main St. Suite 2, Colfax, LA 71417"},"assessor":{"name":"Grant Parish Assessor","address":"200 Main St. Suite 2, Colfax, LA 71417"}},"Iberia Parish, LA":{"recorder":{"name":"Iberia Parish Clerk of Court","address":"300 Iberia St. Suite 400, New Iberia, LA 70560"},"assessor":{"name":"Iberia Parish Assessor","address":"300 Iberia St. Suite 400, New Iberia, LA 70560"}},"Iberville Parish, LA":{"recorder":{"name":"Iberville Parish Clerk of Court","address":"58050 Meriam St., Plaquemine, LA 70764"},"assessor":{"name":"Iberville Parish Assessor","address":"58050 Meriam St., Plaquemine, LA 70764"}},"Jackson Parish, LA":{"recorder":{"name":"Jackson Parish Clerk of Court","address":"500 E Court St. Suite 101, Jonesboro, LA 71251"},"assessor":{"name":"Jackson Parish Assessor","address":"500 E Court St. Suite 101, Jonesboro, LA 71251"}},"Jefferson Parish, LA":{"recorder":{"name":"Jefferson Parish Clerk of Court","address":"200 Derbigny St. Suite 3200, Gretna, LA 70053"},"assessor":{"name":"Jefferson Parish Assessor","address":"200 Derbigny St. Suite 1100, Gretna, LA 70053"}},"Jefferson Davis Parish, LA":{"recorder":{"name":"Jefferson Davis Parish Clerk of Court","address":"300 N State St. Suite 103, Jennings, LA 70546"},"assessor":{"name":"Jefferson Davis Parish Assessor","address":"300 N State St. Suite 103, Jennings, LA 70546"}},"Lafayette Parish, LA":{"recorder":{"name":"Lafayette Parish Clerk of Court","address":"800 S Buchanan St., Lafayette, LA 70501"},"assessor":{"name":"Lafayette Parish Assessor","address":"1010 Lafayette St. Suite 402, Lafayette, LA 70501"}},"Lafourche Parish, LA":{"recorder":{"name":"Lafourche Parish Clerk of Court","address":"309 W 3rd St., Thibodaux, LA 70301"},"assessor":{"name":"Lafourche Parish Assessor","address":"403 Saint Mary St., Thibodaux, LA 70301"}},"LaSalle Parish, LA":{"recorder":{"name":"LaSalle Parish Clerk of Court","address":"14 Courthouse Square Suite 100, Jena, LA 71342"},"assessor":{"name":"LaSalle Parish Assessor","address":"14 Courthouse Square Suite 100, Jena, LA 71342"}},"Lincoln Parish, LA":{"recorder":{"name":"Lincoln Parish Clerk of Court","address":"100 W Texas Ave. Suite 200, Ruston, LA 71270"},"assessor":{"name":"Lincoln Parish Assessor","address":"100 W Texas Ave. Suite 200, Ruston, LA 71270"}},"Livingston Parish, LA":{"recorder":{"name":"Livingston Parish Clerk of Court","address":"20180 Iowa St., Livingston, LA 70754"},"assessor":{"name":"Livingston Parish Assessor","address":"20180 Iowa St., Livingston, LA 70754"}},"Madison Parish, LA":{"recorder":{"name":"Madison Parish Clerk of Court","address":"100 N Cedar St., Tallulah, LA 71282"},"assessor":{"name":"Madison Parish Assessor","address":"100 N Cedar St., Tallulah, LA 71282"}},"Morehouse Parish, LA":{"recorder":{"name":"Morehouse Parish Clerk of Court","address":"100 E Madison Ave. Suite 100, Bastrop, LA 71220"},"assessor":{"name":"Morehouse Parish Assessor","address":"100 E Madison Ave. Suite 100, Bastrop, LA 71220"}},"Natchitoches Parish, LA":{"recorder":{"name":"Natchitoches Parish Clerk of Court","address":"200 Church St. Suite 100, Natchitoches, LA 71457"},"assessor":{"name":"Natchitoches Parish Assessor","address":"200 Church St. Suite 100, Natchitoches, LA 71457"}},"Orleans Parish, LA":{"recorder":{"name":"Orleans Parish Clerk of Civil District Court","address":"421 Loyola Ave. Room 402, New Orleans, LA 70112"},"assessor":{"name":"Orleans Parish Assessor","address":"1300 Perdido St. Room 4E01, New Orleans, LA 70112"}},"Ouachita Parish, LA":{"recorder":{"name":"Ouachita Parish Clerk of Court","address":"300 St. John St. Room 101, Monroe, LA 71201"},"assessor":{"name":"Ouachita Parish Assessor","address":"300 St. John St. Room 101, Monroe, LA 71201"}},"Plaquemines Parish, LA":{"recorder":{"name":"Plaquemines Parish Clerk of Court","address":"301 Main St., Belle Chasse, LA 70037"},"assessor":{"name":"Plaquemines Parish Assessor","address":"301 Main St., Belle Chasse, LA 70037"}},"Pointe Coupee Parish, LA":{"recorder":{"name":"Pointe Coupee Parish Clerk of Court","address":"160 E Main St., New Roads, LA 70760"},"assessor":{"name":"Pointe Coupee Parish Assessor","address":"160 E Main St., New Roads, LA 70760"}},"Rapides Parish, LA":{"recorder":{"name":"Rapides Parish Clerk of Court","address":"701 Murray St. Suite 100, Alexandria, LA 71301"},"assessor":{"name":"Rapides Parish Assessor","address":"701 Murray St. Suite 101, Alexandria, LA 71301"}},"Red River Parish, LA":{"recorder":{"name":"Red River Parish Clerk of Court","address":"615 E Carroll St., Coushatta, LA 71019"},"assessor":{"name":"Red River Parish Assessor","address":"615 E Carroll St., Coushatta, LA 71019"}},"Richland Parish, LA":{"recorder":{"name":"Richland Parish Clerk of Court","address":"708 S Julia St. Suite 150, Rayville, LA 71269"},"assessor":{"name":"Richland Parish Assessor","address":"708 S Julia St. Suite 150, Rayville, LA 71269"}},"Sabine Parish, LA":{"recorder":{"name":"Sabine Parish Clerk of Court","address":"400 S Capitol St. Suite A, Many, LA 71449"},"assessor":{"name":"Sabine Parish Assessor","address":"400 S Capitol St. Suite A, Many, LA 71449"}},"St. Bernard Parish, LA":{"recorder":{"name":"St. Bernard Parish Clerk of Court","address":"8201 W Judge Perez Dr., Chalmette, LA 70043"},"assessor":{"name":"St. Bernard Parish Assessor","address":"8201 W Judge Perez Dr., Chalmette, LA 70043"}},"St. Charles Parish, LA":{"recorder":{"name":"St. Charles Parish Clerk of Court","address":"15045 River Rd., Hahnville, LA 70057"},"assessor":{"name":"St. Charles Parish Assessor","address":"15045 River Rd., Hahnville, LA 70057"}},"St. Helena Parish, LA":{"recorder":{"name":"St. Helena Parish Clerk of Court","address":"19845 Central Ave., Greensburg, LA 70441"},"assessor":{"name":"St. Helena Parish Assessor","address":"19845 Central Ave., Greensburg, LA 70441"}},"St. James Parish, LA":{"recorder":{"name":"St. James Parish Clerk of Court","address":"5800 Hwy 44, Convent, LA 70723"},"assessor":{"name":"St. James Parish Assessor","address":"5800 Hwy 44, Convent, LA 70723"}},"St. John the Baptist Parish, LA":{"recorder":{"name":"St. John the Baptist Parish Clerk of Court","address":"2393 Hwy 18 Suite 100, Edgard, LA 70049"},"assessor":{"name":"St. John the Baptist Parish Assessor","address":"2393 Hwy 18 Suite 100, Edgard, LA 70049"}},"St. Landry Parish, LA":{"recorder":{"name":"St. Landry Parish Clerk of Court","address":"118 N Court St., Opelousas, LA 70570"},"assessor":{"name":"St. Landry Parish Assessor","address":"118 N Court St., Opelousas, LA 70570"}},"St. Martin Parish, LA":{"recorder":{"name":"St. Martin Parish Clerk of Court","address":"415 S Main St., St. Martinville, LA 70582"},"assessor":{"name":"St. Martin Parish Assessor","address":"415 S Main St., St. Martinville, LA 70582"}},"St. Mary Parish, LA":{"recorder":{"name":"St. Mary Parish Clerk of Court","address":"500 Main St. Suite 1, Franklin, LA 70538"},"assessor":{"name":"St. Mary Parish Assessor","address":"500 Main St. Suite 1, Franklin, LA 70538"}},"St. Tammany Parish, LA":{"recorder":{"name":"St. Tammany Parish Clerk of Court","address":"701 N Columbia St., Covington, LA 70433"},"assessor":{"name":"St. Tammany Parish Assessor","address":"701 N Columbia St., Covington, LA 70433"}},"Tangipahoa Parish, LA":{"recorder":{"name":"Tangipahoa Parish Clerk of Court","address":"110 N Bay St. Suite 100, Amite City, LA 70422"},"assessor":{"name":"Tangipahoa Parish Assessor","address":"110 N Bay St. Suite 100, Amite City, LA 70422"}},"Tensas Parish, LA":{"recorder":{"name":"Tensas Parish Clerk of Court","address":"201 Courthouse Square, St. Joseph, LA 71366"},"assessor":{"name":"Tensas Parish Assessor","address":"201 Courthouse Square, St. Joseph, LA 71366"}},"Terrebonne Parish, LA":{"recorder":{"name":"Terrebonne Parish Clerk of Court","address":"301 Goode St., Houma, LA 70360"},"assessor":{"name":"Terrebonne Parish Assessor","address":"8026 Main St. Suite 501, Houma, LA 70360"}},"Union Parish, LA":{"recorder":{"name":"Union Parish Clerk of Court","address":"100 E Bayou St. Suite 103, Farmerville, LA 71241"},"assessor":{"name":"Union Parish Assessor","address":"100 E Bayou St. Suite 103, Farmerville, LA 71241"}},"Vermilion Parish, LA":{"recorder":{"name":"Vermilion Parish Clerk of Court","address":"100 N State St. Suite 101, Abbeville, LA 70510"},"assessor":{"name":"Vermilion Parish Assessor","address":"100 N State St. Suite 101, Abbeville, LA 70510"}},"Vernon Parish, LA":{"recorder":{"name":"Vernon Parish Clerk of Court","address":"201 S 3rd St. Suite 1, Leesville, LA 71446"},"assessor":{"name":"Vernon Parish Assessor","address":"201 S 3rd St. Suite 1, Leesville, LA 71446"}},"Washington Parish, LA":{"recorder":{"name":"Washington Parish Clerk of Court","address":"908 Washington St., Franklinton, LA 70438"},"assessor":{"name":"Washington Parish Assessor","address":"908 Washington St., Franklinton, LA 70438"}},"Webster Parish, LA":{"recorder":{"name":"Webster Parish Clerk of Court","address":"410 Main St., Minden, LA 71055"},"assessor":{"name":"Webster Parish Assessor","address":"410 Main St., Minden, LA 71055"}},"West Baton Rouge Parish, LA":{"recorder":{"name":"West Baton Rouge Parish Clerk of Court","address":"850 8th St., Port Allen, LA 70767"},"assessor":{"name":"West Baton Rouge Parish Assessor","address":"850 8th St., Port Allen, LA 70767"}},"West Carroll Parish, LA":{"recorder":{"name":"West Carroll Parish Clerk of Court","address":"305 E Main St., Oak Grove, LA 71263"},"assessor":{"name":"West Carroll Parish Assessor","address":"305 E Main St., Oak Grove, LA 71263"}},"West Feliciana Parish, LA":{"recorder":{"name":"West Feliciana Parish Clerk of Court","address":"4789 Prosperity St., St. Francisville, LA 70775"},"assessor":{"name":"West Feliciana Parish Assessor","address":"4789 Prosperity St., St. Francisville, LA 70775"}},"Winn Parish, LA":{"recorder":{"name":"Winn Parish Clerk of Court","address":"119 W Main St. Suite 101, Winnfield, LA 71483"},"assessor":{"name":"Winn Parish Assessor","address":"119 W Main St. Suite 101, Winnfield, LA 71483"}},"Barnstable County, MA":{"recorder":{"name":"Barnstable County Registry of Deeds","address":"3195 Main St., Barnstable, MA 02630"},"assessor":{"name":"Barnstable Town Assessor","address":"367 Main St., Hyannis, MA 02601"}},"Berkshire County, MA":{"recorder":{"name":"Berkshire County Registry of Deeds (Middle)","address":"44 Bank Row, Pittsfield, MA 01201"},"assessor":{"name":"Pittsfield Assessor","address":"70 Allen St., Pittsfield, MA 01201"}},"Bristol County, MA":{"recorder":{"name":"Bristol County Registry of Deeds (Northern)","address":"11 Court St., Taunton, MA 02780"},"assessor":{"name":"Taunton Assessor","address":"15 Summer St., Taunton, MA 02780"}},"Dukes County, MA":{"recorder":{"name":"Dukes County Registry of Deeds","address":"81 Main St., Edgartown, MA 02539"},"assessor":{"name":"Edgartown Assessor","address":"1 Veterans Memorial Way, Edgartown, MA 02539"}},"Essex County, MA":{"recorder":{"name":"Essex County Registry of Deeds (Northern)","address":"381 Common St., Lawrence, MA 01840"},"assessor":{"name":"Salem Assessor","address":"93 Washington St., Salem, MA 01970"}},"Franklin County, MA":{"recorder":{"name":"Franklin County Registry of Deeds","address":"425 Main St., Greenfield, MA 01301"},"assessor":{"name":"Greenfield Assessor","address":"14 Court Square, Greenfield, MA 01301"}},"Hampden County, MA":{"recorder":{"name":"Hampden County Registry of Deeds","address":"50 State St., Springfield, MA 01103"},"assessor":{"name":"Springfield Assessor","address":"36 Court St. Room 1006, Springfield, MA 01103"}},"Hampshire County, MA":{"recorder":{"name":"Hampshire County Registry of Deeds","address":"33 King St., Northampton, MA 01060"},"assessor":{"name":"Northampton Assessor","address":"212 Main St. Room 107, Northampton, MA 01060"}},"Middlesex County, MA":{"recorder":{"name":"Middlesex County Registry of Deeds (Northern)","address":"370 Jackson St., Lowell, MA 01852"},"assessor":{"name":"Cambridge Assessor","address":"795 Massachusetts Ave., Cambridge, MA 02139"}},"Nantucket County, MA":{"recorder":{"name":"Nantucket County Registry of Deeds","address":"16 Broad St., Nantucket, MA 02554"},"assessor":{"name":"Nantucket Assessor","address":"16 Broad St., Nantucket, MA 02554"}},"Norfolk County, MA":{"recorder":{"name":"Norfolk County Registry of Deeds","address":"649 High St., Dedham, MA 02026"},"assessor":{"name":"Dedham Assessor","address":"26 Bryant St., Dedham, MA 02026"}},"Plymouth County, MA":{"recorder":{"name":"Plymouth County Registry of Deeds","address":"7 Russell St., Plymouth, MA 02360"},"assessor":{"name":"Plymouth Assessor","address":"26 Court St., Plymouth, MA 02360"}},"Suffolk County, MA":{"recorder":{"name":"Suffolk County Registry of Deeds","address":"24 New Chardon St., Boston, MA 02114"},"assessor":{"name":"Boston Assessing Department","address":"1 City Hall Square Room 301, Boston, MA 02201"}},"Worcester County, MA":{"recorder":{"name":"Worcester County Registry of Deeds","address":"90 Front St., Worcester, MA 01608"},"assessor":{"name":"Worcester Assessor","address":"455 Main St. Room 209, Worcester, MA 01608"}},"Allegany County, MD":{"recorder":{"name":"Allegany County Circuit Court Clerk","address":"30 Washington St., Cumberland, MD 21502"},"assessor":{"name":"SDAT Allegany County Office","address":"30 Washington St. Suite 1000, Cumberland, MD 21502"}},"Anne Arundel County, MD":{"recorder":{"name":"Anne Arundel County Circuit Court Clerk","address":"8 Church Circle, Annapolis, MD 21401"},"assessor":{"name":"SDAT Anne Arundel County Office","address":"45 Calvert St., Annapolis, MD 21401"}},"Baltimore City, MD":{"recorder":{"name":"Baltimore City Circuit Court Clerk","address":"111 N Calvert St., Baltimore, MD 21202"},"assessor":{"name":"SDAT Baltimore City Office","address":"417 E Fayette St. Suite 1100, Baltimore, MD 21202"}},"Baltimore County, MD":{"recorder":{"name":"Baltimore County Circuit Court Clerk","address":"401 Bosley Ave., Towson, MD 21204"},"assessor":{"name":"SDAT Baltimore County Office","address":"6 E Chesapeake Ave., Towson, MD 21286"}},"Calvert County, MD":{"recorder":{"name":"Calvert County Circuit Court Clerk","address":"175 Main St., Prince Frederick, MD 20678"},"assessor":{"name":"SDAT Calvert County Office","address":"205 Main St., Prince Frederick, MD 20678"}},"Caroline County, MD":{"recorder":{"name":"Caroline County Circuit Court Clerk","address":"109 Market St. Suite 104, Denton, MD 21629"},"assessor":{"name":"SDAT Caroline County Office","address":"109 Market St., Denton, MD 21629"}},"Carroll County, MD":{"recorder":{"name":"Carroll County Circuit Court Clerk","address":"55 N Court St., Westminster, MD 21157"},"assessor":{"name":"SDAT Carroll County Office","address":"225 N Center St. Suite 110, Westminster, MD 21157"}},"Cecil County, MD":{"recorder":{"name":"Cecil County Circuit Court Clerk","address":"129 E Main St., Elkton, MD 21921"},"assessor":{"name":"SDAT Cecil County Office","address":"129 E Main St. Suite 116, Elkton, MD 21921"}},"Charles County, MD":{"recorder":{"name":"Charles County Circuit Court Clerk","address":"200 Charles St., La Plata, MD 20646"},"assessor":{"name":"SDAT Charles County Office","address":"200 Baltimore St., La Plata, MD 20646"}},"Dorchester County, MD":{"recorder":{"name":"Dorchester County Circuit Court Clerk","address":"206 High St., Cambridge, MD 21613"},"assessor":{"name":"SDAT Dorchester County Office","address":"501 Court Ln. Suite 102, Cambridge, MD 21613"}},"Frederick County, MD":{"recorder":{"name":"Frederick County Circuit Court Clerk","address":"100 W Patrick St., Frederick, MD 21701"},"assessor":{"name":"SDAT Frederick County Office","address":"100 W Patrick St. Suite 1400, Frederick, MD 21701"}},"Garrett County, MD":{"recorder":{"name":"Garrett County Circuit Court Clerk","address":"203 S 4th St. Suite 109, Oakland, MD 21550"},"assessor":{"name":"SDAT Garrett County Office","address":"203 S 4th St. Suite 210, Oakland, MD 21550"}},"Harford County, MD":{"recorder":{"name":"Harford County Circuit Court Clerk","address":"20 W Courtland St., Bel Air, MD 21014"},"assessor":{"name":"SDAT Harford County Office","address":"220 S Main St. Suite 101, Bel Air, MD 21014"}},"Howard County, MD":{"recorder":{"name":"Howard County Circuit Court Clerk","address":"8360 Court Ave., Ellicott City, MD 21043"},"assessor":{"name":"SDAT Howard County Office","address":"3430 Court House Dr., Ellicott City, MD 21043"}},"Kent County, MD":{"recorder":{"name":"Kent County Circuit Court Clerk","address":"103 N Cross St., Chestertown, MD 21620"},"assessor":{"name":"SDAT Kent County Office","address":"103 N Cross St., Chestertown, MD 21620"}},"Montgomery County, MD":{"recorder":{"name":"Montgomery County Circuit Court Clerk","address":"50 Maryland Ave. Room 322, Rockville, MD 20850"},"assessor":{"name":"SDAT Montgomery County Office","address":"30 W Gude Dr. Suite 400, Rockville, MD 20850"}},"Prince George's County, MD":{"recorder":{"name":"Prince George's County Circuit Court Clerk","address":"14735 Main St. Suite 178B, Upper Marlboro, MD 20772"},"assessor":{"name":"SDAT Prince George's County Office","address":"14735 Main St. Suite 356B, Upper Marlboro, MD 20772"}},"Queen Anne's County, MD":{"recorder":{"name":"Queen Anne's County Circuit Court Clerk","address":"100 Courthouse Square, Centreville, MD 21617"},"assessor":{"name":"SDAT Queen Anne's County Office","address":"107 N Liberty St., Centreville, MD 21617"}},"St. Mary's County, MD":{"recorder":{"name":"St. Mary's County Circuit Court Clerk","address":"41605 Courthouse Dr., Leonardtown, MD 20650"},"assessor":{"name":"SDAT St. Mary's County Office","address":"23150 Leonard Hall Dr. Suite 1100, Leonardtown, MD 20650"}},"Somerset County, MD":{"recorder":{"name":"Somerset County Circuit Court Clerk","address":"30512 Prince William St., Princess Anne, MD 21853"},"assessor":{"name":"SDAT Somerset County Office","address":"30512 Prince William St., Princess Anne, MD 21853"}},"Talbot County, MD":{"recorder":{"name":"Talbot County Circuit Court Clerk","address":"11 N Washington St., Easton, MD 21601"},"assessor":{"name":"SDAT Talbot County Office","address":"29 S Washington St., Easton, MD 21601"}},"Washington County, MD":{"recorder":{"name":"Washington County Circuit Court Clerk","address":"95 W Washington St., Hagerstown, MD 21740"},"assessor":{"name":"SDAT Washington County Office","address":"35 W Washington St. Suite 102, Hagerstown, MD 21740"}},"Wicomico County, MD":{"recorder":{"name":"Wicomico County Circuit Court Clerk","address":"101 N Division St., Salisbury, MD 21801"},"assessor":{"name":"SDAT Wicomico County Office","address":"201 Baptist St. Suite 27, Salisbury, MD 21801"}},"Worcester County, MD":{"recorder":{"name":"Worcester County Circuit Court Clerk","address":"One W Market St. Room 1021, Snow Hill, MD 21863"},"assessor":{"name":"SDAT Worcester County Office","address":"1 W Market St. Room 1102, Snow Hill, MD 21863"}},"Androscoggin County, ME":{"recorder":{"name":"Androscoggin County Register of Deeds","address":"2 Turner St. Unit 4, Auburn, ME 04210"},"assessor":{"name":"Androscoggin County Assessment","address":"2 Turner St., Auburn, ME 04210"}},"Aroostook County, ME":{"recorder":{"name":"Aroostook County Register of Deeds","address":"144 Sweden St. Suite 1, Caribou, ME 04736"},"assessor":{"name":"Aroostook County Assessment","address":"144 Sweden St. Suite 1, Caribou, ME 04736"}},"Cumberland County, ME":{"recorder":{"name":"Cumberland County Register of Deeds","address":"1 Courthouse Square, Portland, ME 04101"},"assessor":{"name":"Portland City Assessor","address":"389 Congress St. Room 115, Portland, ME 04101"}},"Franklin County, ME":{"recorder":{"name":"Franklin County Register of Deeds","address":"38 Main St., Farmington, ME 04938"},"assessor":{"name":"Franklin County Assessment","address":"38 Main St., Farmington, ME 04938"}},"Hancock County, ME":{"recorder":{"name":"Hancock County Register of Deeds","address":"50 State St. Suite 4, Ellsworth, ME 04605"},"assessor":{"name":"Hancock County Assessment","address":"50 State St. Suite 4, Ellsworth, ME 04605"}},"Kennebec County, ME":{"recorder":{"name":"Kennebec County Register of Deeds","address":"125 State St., Augusta, ME 04330"},"assessor":{"name":"Augusta City Assessor","address":"16 Cony St., Augusta, ME 04330"}},"Knox County, ME":{"recorder":{"name":"Knox County Register of Deeds","address":"62 Union St., Rockland, ME 04841"},"assessor":{"name":"Knox County Assessment","address":"62 Union St., Rockland, ME 04841"}},"Lincoln County, ME":{"recorder":{"name":"Lincoln County Register of Deeds","address":"32 High St., Wiscasset, ME 04578"},"assessor":{"name":"Lincoln County Assessment","address":"32 High St., Wiscasset, ME 04578"}},"Oxford County, ME":{"recorder":{"name":"Oxford County Register of Deeds","address":"26 Western Ave., South Paris, ME 04281"},"assessor":{"name":"Oxford County Assessment","address":"26 Western Ave., South Paris, ME 04281"}},"Penobscot County, ME":{"recorder":{"name":"Penobscot County Register of Deeds","address":"97 Hammond St., Bangor, ME 04401"},"assessor":{"name":"Bangor City Assessor","address":"73 Harlow St., Bangor, ME 04401"}},"Piscataquis County, ME":{"recorder":{"name":"Piscataquis County Register of Deeds","address":"51 E Main St., Dover-Foxcroft, ME 04426"},"assessor":{"name":"Piscataquis County Assessment","address":"51 E Main St., Dover-Foxcroft, ME 04426"}},"Sagadahoc County, ME":{"recorder":{"name":"Sagadahoc County Register of Deeds","address":"752 High St., Bath, ME 04530"},"assessor":{"name":"Bath City Assessor","address":"55 Front St., Bath, ME 04530"}},"Somerset County, ME":{"recorder":{"name":"Somerset County Register of Deeds","address":"41 Court St., Skowhegan, ME 04976"},"assessor":{"name":"Somerset County Assessment","address":"41 Court St., Skowhegan, ME 04976"}},"Waldo County, ME":{"recorder":{"name":"Waldo County Register of Deeds","address":"137 Church St., Belfast, ME 04915"},"assessor":{"name":"Waldo County Assessment","address":"137 Church St., Belfast, ME 04915"}},"Washington County, ME":{"recorder":{"name":"Washington County Register of Deeds","address":"85 Court St. Suite 4, Machias, ME 04654"},"assessor":{"name":"Washington County Assessment","address":"85 Court St. Suite 4, Machias, ME 04654"}},"York County, ME":{"recorder":{"name":"York County Register of Deeds","address":"45 Kennebunk Rd., Alfred, ME 04002"},"assessor":{"name":"York County Assessment","address":"45 Kennebunk Rd., Alfred, ME 04002"}},"Alcona County, MI":{"recorder":{"name":"Alcona County Register of Deeds","address":"106 5th St., Harrisville, MI 48740"},"assessor":{"name":"Alcona County Equalization","address":"106 5th St., Harrisville, MI 48740"}},"Alger County, MI":{"recorder":{"name":"Alger County Register of Deeds","address":"101 Court St., Munising, MI 49862"},"assessor":{"name":"Alger County Equalization","address":"101 Court St., Munising, MI 49862"}},"Allegan County, MI":{"recorder":{"name":"Allegan County Register of Deeds","address":"113 Chestnut St., Allegan, MI 49010"},"assessor":{"name":"Allegan County Equalization","address":"113 Chestnut St., Allegan, MI 49010"}},"Alpena County, MI":{"recorder":{"name":"Alpena County Register of Deeds","address":"720 W Chisholm St., Alpena, MI 49707"},"assessor":{"name":"Alpena County Equalization","address":"720 W Chisholm St., Alpena, MI 49707"}},"Antrim County, MI":{"recorder":{"name":"Antrim County Register of Deeds","address":"203 E Cayuga St., Bellaire, MI 49615"},"assessor":{"name":"Antrim County Equalization","address":"203 E Cayuga St., Bellaire, MI 49615"}},"Arenac County, MI":{"recorder":{"name":"Arenac County Register of Deeds","address":"120 N Grove St., Standish, MI 48658"},"assessor":{"name":"Arenac County Equalization","address":"120 N Grove St., Standish, MI 48658"}},"Baraga County, MI":{"recorder":{"name":"Baraga County Register of Deeds","address":"16 N 3rd St., L'Anse, MI 49946"},"assessor":{"name":"Baraga County Equalization","address":"16 N 3rd St., L'Anse, MI 49946"}},"Barry County, MI":{"recorder":{"name":"Barry County Register of Deeds","address":"220 W State St., Hastings, MI 49058"},"assessor":{"name":"Barry County Equalization","address":"220 W State St., Hastings, MI 49058"}},"Bay County, MI":{"recorder":{"name":"Bay County Register of Deeds","address":"515 Center Ave., Bay City, MI 48708"},"assessor":{"name":"Bay County Equalization","address":"515 Center Ave., Bay City, MI 48708"}},"Benzie County, MI":{"recorder":{"name":"Benzie County Register of Deeds","address":"448 Court Pl., Beulah, MI 49617"},"assessor":{"name":"Benzie County Equalization","address":"448 Court Pl., Beulah, MI 49617"}},"Berrien County, MI":{"recorder":{"name":"Berrien County Register of Deeds","address":"811 Port St., St. Joseph, MI 49085"},"assessor":{"name":"Berrien County Equalization","address":"811 Port St., St. Joseph, MI 49085"}},"Branch County, MI":{"recorder":{"name":"Branch County Register of Deeds","address":"31 Division St., Coldwater, MI 49036"},"assessor":{"name":"Branch County Equalization","address":"31 Division St., Coldwater, MI 49036"}},"Calhoun County, MI":{"recorder":{"name":"Calhoun County Register of Deeds","address":"315 W Green St., Marshall, MI 49068"},"assessor":{"name":"Calhoun County Equalization","address":"315 W Green St., Marshall, MI 49068"}},"Cass County, MI":{"recorder":{"name":"Cass County Register of Deeds","address":"120 N Broadway St., Cassopolis, MI 49031"},"assessor":{"name":"Cass County Equalization","address":"120 N Broadway St., Cassopolis, MI 49031"}},"Charlevoix County, MI":{"recorder":{"name":"Charlevoix County Register of Deeds","address":"203 Antrim St., Charlevoix, MI 49720"},"assessor":{"name":"Charlevoix County Equalization","address":"203 Antrim St., Charlevoix, MI 49720"}},"Cheboygan County, MI":{"recorder":{"name":"Cheboygan County Register of Deeds","address":"870 S Main St., Cheboygan, MI 49721"},"assessor":{"name":"Cheboygan County Equalization","address":"870 S Main St., Cheboygan, MI 49721"}},"Chippewa County, MI":{"recorder":{"name":"Chippewa County Register of Deeds","address":"319 Court St., Sault Ste. Marie, MI 49783"},"assessor":{"name":"Chippewa County Equalization","address":"319 Court St., Sault Ste. Marie, MI 49783"}},"Clare County, MI":{"recorder":{"name":"Clare County Register of Deeds","address":"225 W Main St., Harrison, MI 48625"},"assessor":{"name":"Clare County Equalization","address":"225 W Main St., Harrison, MI 48625"}},"Clinton County, MI":{"recorder":{"name":"Clinton County Register of Deeds","address":"100 E State St. Suite 2400, St. Johns, MI 48879"},"assessor":{"name":"Clinton County Equalization","address":"100 E State St. Suite 2400, St. Johns, MI 48879"}},"Crawford County, MI":{"recorder":{"name":"Crawford County Register of Deeds","address":"200 W Michigan Ave., Grayling, MI 49738"},"assessor":{"name":"Crawford County Equalization","address":"200 W Michigan Ave., Grayling, MI 49738"}},"Delta County, MI":{"recorder":{"name":"Delta County Register of Deeds","address":"310 Ludington St., Escanaba, MI 49829"},"assessor":{"name":"Delta County Equalization","address":"310 Ludington St., Escanaba, MI 49829"}},"Dickinson County, MI":{"recorder":{"name":"Dickinson County Register of Deeds","address":"705 S Stephenson Ave., Iron Mountain, MI 49801"},"assessor":{"name":"Dickinson County Equalization","address":"705 S Stephenson Ave., Iron Mountain, MI 49801"}},"Eaton County, MI":{"recorder":{"name":"Eaton County Register of Deeds","address":"1045 Independence Blvd., Charlotte, MI 48813"},"assessor":{"name":"Eaton County Equalization","address":"1045 Independence Blvd., Charlotte, MI 48813"}},"Emmet County, MI":{"recorder":{"name":"Emmet County Register of Deeds","address":"200 Division St., Petoskey, MI 49770"},"assessor":{"name":"Emmet County Equalization","address":"200 Division St., Petoskey, MI 49770"}},"Genesee County, MI":{"recorder":{"name":"Genesee County Register of Deeds","address":"1101 Beach St., Flint, MI 48502"},"assessor":{"name":"Genesee County Equalization","address":"1101 Beach St., Flint, MI 48502"}},"Gladwin County, MI":{"recorder":{"name":"Gladwin County Register of Deeds","address":"401 W Cedar Ave., Gladwin, MI 48624"},"assessor":{"name":"Gladwin County Equalization","address":"401 W Cedar Ave., Gladwin, MI 48624"}},"Gogebic County, MI":{"recorder":{"name":"Gogebic County Register of Deeds","address":"200 N Moore St., Bessemer, MI 49911"},"assessor":{"name":"Gogebic County Equalization","address":"200 N Moore St., Bessemer, MI 49911"}},"Grand Traverse County, MI":{"recorder":{"name":"Grand Traverse County Register of Deeds","address":"400 Boardman Ave., Traverse City, MI 49684"},"assessor":{"name":"Grand Traverse County Equalization","address":"400 Boardman Ave., Traverse City, MI 49684"}},"Gratiot County, MI":{"recorder":{"name":"Gratiot County Register of Deeds","address":"214 E Center St., Ithaca, MI 48847"},"assessor":{"name":"Gratiot County Equalization","address":"214 E Center St., Ithaca, MI 48847"}},"Hillsdale County, MI":{"recorder":{"name":"Hillsdale County Register of Deeds","address":"29 N Howell St., Hillsdale, MI 49242"},"assessor":{"name":"Hillsdale County Equalization","address":"29 N Howell St., Hillsdale, MI 49242"}},"Houghton County, MI":{"recorder":{"name":"Houghton County Register of Deeds","address":"401 E Houghton Ave., Houghton, MI 49931"},"assessor":{"name":"Houghton County Equalization","address":"401 E Houghton Ave., Houghton, MI 49931"}},"Huron County, MI":{"recorder":{"name":"Huron County Register of Deeds","address":"250 E Huron Ave., Bad Axe, MI 48413"},"assessor":{"name":"Huron County Equalization","address":"250 E Huron Ave., Bad Axe, MI 48413"}},"Ingham County, MI":{"recorder":{"name":"Ingham County Register of Deeds","address":"341 S Jefferson St., Mason, MI 48854"},"assessor":{"name":"Ingham County Equalization","address":"341 S Jefferson St., Mason, MI 48854"}},"Ionia County, MI":{"recorder":{"name":"Ionia County Register of Deeds","address":"100 W Main St., Ionia, MI 48846"},"assessor":{"name":"Ionia County Equalization","address":"100 W Main St., Ionia, MI 48846"}},"Iosco County, MI":{"recorder":{"name":"Iosco County Register of Deeds","address":"422 W Lake St., Tawas City, MI 48763"},"assessor":{"name":"Iosco County Equalization","address":"422 W Lake St., Tawas City, MI 48763"}},"Iron County, MI":{"recorder":{"name":"Iron County Register of Deeds","address":"2 S 6th Ave., Crystal Falls, MI 49920"},"assessor":{"name":"Iron County Equalization","address":"2 S 6th Ave., Crystal Falls, MI 49920"}},"Isabella County, MI":{"recorder":{"name":"Isabella County Register of Deeds","address":"200 N Main St., Mount Pleasant, MI 48858"},"assessor":{"name":"Isabella County Equalization","address":"200 N Main St., Mount Pleasant, MI 48858"}},"Jackson County, MI":{"recorder":{"name":"Jackson County Register of Deeds","address":"120 W Michigan Ave., Jackson, MI 49201"},"assessor":{"name":"Jackson County Equalization","address":"120 W Michigan Ave., Jackson, MI 49201"}},"Kalamazoo County, MI":{"recorder":{"name":"Kalamazoo County Register of Deeds","address":"201 W Kalamazoo Ave., Kalamazoo, MI 49007"},"assessor":{"name":"Kalamazoo County Equalization","address":"201 W Kalamazoo Ave., Kalamazoo, MI 49007"}},"Kalkaska County, MI":{"recorder":{"name":"Kalkaska County Register of Deeds","address":"605 N Birch St., Kalkaska, MI 49646"},"assessor":{"name":"Kalkaska County Equalization","address":"605 N Birch St., Kalkaska, MI 49646"}},"Kent County, MI":{"recorder":{"name":"Kent County Register of Deeds","address":"300 Monroe Ave. NW, Grand Rapids, MI 49503"},"assessor":{"name":"Kent County Equalization","address":"300 Monroe Ave. NW, Grand Rapids, MI 49503"}},"Keweenaw County, MI":{"recorder":{"name":"Keweenaw County Register of Deeds","address":"5095 4th St., Eagle River, MI 49950"},"assessor":{"name":"Keweenaw County Equalization","address":"5095 4th St., Eagle River, MI 49950"}},"Lake County, MI":{"recorder":{"name":"Lake County Register of Deeds","address":"800 10th St., Baldwin, MI 49304"},"assessor":{"name":"Lake County Equalization","address":"800 10th St., Baldwin, MI 49304"}},"Lapeer County, MI":{"recorder":{"name":"Lapeer County Register of Deeds","address":"255 Clay St., Lapeer, MI 48446"},"assessor":{"name":"Lapeer County Equalization","address":"255 Clay St., Lapeer, MI 48446"}},"Leelanau County, MI":{"recorder":{"name":"Leelanau County Register of Deeds","address":"8527 E Government Center Dr., Suttons Bay, MI 49682"},"assessor":{"name":"Leelanau County Equalization","address":"8527 E Government Center Dr., Suttons Bay, MI 49682"}},"Lenawee County, MI":{"recorder":{"name":"Lenawee County Register of Deeds","address":"301 N Main St., Adrian, MI 49221"},"assessor":{"name":"Lenawee County Equalization","address":"301 N Main St., Adrian, MI 49221"}},"Livingston County, MI":{"recorder":{"name":"Livingston County Register of Deeds","address":"200 E Grand River Ave., Howell, MI 48843"},"assessor":{"name":"Livingston County Equalization","address":"200 E Grand River Ave., Howell, MI 48843"}},"Luce County, MI":{"recorder":{"name":"Luce County Register of Deeds","address":"407 W Harrie St., Newberry, MI 49868"},"assessor":{"name":"Luce County Equalization","address":"407 W Harrie St., Newberry, MI 49868"}},"Mackinac County, MI":{"recorder":{"name":"Mackinac County Register of Deeds","address":"100 S Marley St., St. Ignace, MI 49781"},"assessor":{"name":"Mackinac County Equalization","address":"100 S Marley St., St. Ignace, MI 49781"}},"Macomb County, MI":{"recorder":{"name":"Macomb County Register of Deeds","address":"120 N Main St., Mount Clemens, MI 48043"},"assessor":{"name":"Macomb County Equalization","address":"120 N Main St., Mount Clemens, MI 48043"}},"Manistee County, MI":{"recorder":{"name":"Manistee County Register of Deeds","address":"415 3rd St., Manistee, MI 49660"},"assessor":{"name":"Manistee County Equalization","address":"415 3rd St., Manistee, MI 49660"}},"Marquette County, MI":{"recorder":{"name":"Marquette County Register of Deeds","address":"234 W Baraga Ave., Marquette, MI 49855"},"assessor":{"name":"Marquette County Equalization","address":"234 W Baraga Ave., Marquette, MI 49855"}},"Mason County, MI":{"recorder":{"name":"Mason County Register of Deeds","address":"304 E Ludington Ave., Ludington, MI 49431"},"assessor":{"name":"Mason County Equalization","address":"304 E Ludington Ave., Ludington, MI 49431"}},"Mecosta County, MI":{"recorder":{"name":"Mecosta County Register of Deeds","address":"400 Elm St., Big Rapids, MI 49307"},"assessor":{"name":"Mecosta County Equalization","address":"400 Elm St., Big Rapids, MI 49307"}},"Menominee County, MI":{"recorder":{"name":"Menominee County Register of Deeds","address":"839 10th Ave., Menominee, MI 49858"},"assessor":{"name":"Menominee County Equalization","address":"839 10th Ave., Menominee, MI 49858"}},"Midland County, MI":{"recorder":{"name":"Midland County Register of Deeds","address":"220 W Ellsworth St., Midland, MI 48640"},"assessor":{"name":"Midland County Equalization","address":"220 W Ellsworth St., Midland, MI 48640"}},"Missaukee County, MI":{"recorder":{"name":"Missaukee County Register of Deeds","address":"111 S Canal St., Lake City, MI 49651"},"assessor":{"name":"Missaukee County Equalization","address":"111 S Canal St., Lake City, MI 49651"}},"Monroe County, MI":{"recorder":{"name":"Monroe County Register of Deeds","address":"125 E Second St., Monroe, MI 48161"},"assessor":{"name":"Monroe County Equalization","address":"125 E Second St., Monroe, MI 48161"}},"Montcalm County, MI":{"recorder":{"name":"Montcalm County Register of Deeds","address":"211 W Main St., Stanton, MI 48888"},"assessor":{"name":"Montcalm County Equalization","address":"211 W Main St., Stanton, MI 48888"}},"Montmorency County, MI":{"recorder":{"name":"Montmorency County Register of Deeds","address":"12265 M-32, Atlanta, MI 49709"},"assessor":{"name":"Montmorency County Equalization","address":"12265 M-32, Atlanta, MI 49709"}},"Muskegon County, MI":{"recorder":{"name":"Muskegon County Register of Deeds","address":"990 Terrace St., Muskegon, MI 49442"},"assessor":{"name":"Muskegon County Equalization","address":"990 Terrace St., Muskegon, MI 49442"}},"Newaygo County, MI":{"recorder":{"name":"Newaygo County Register of Deeds","address":"1087 Newell St., White Cloud, MI 49349"},"assessor":{"name":"Newaygo County Equalization","address":"1087 Newell St., White Cloud, MI 49349"}},"Oakland County, MI":{"recorder":{"name":"Oakland County Register of Deeds","address":"1200 N Telegraph Rd., Pontiac, MI 48341"},"assessor":{"name":"Oakland County Equalization","address":"1200 N Telegraph Rd., Pontiac, MI 48341"}},"Oceana County, MI":{"recorder":{"name":"Oceana County Register of Deeds","address":"100 S State St., Hart, MI 49420"},"assessor":{"name":"Oceana County Equalization","address":"100 S State St., Hart, MI 49420"}},"Ogemaw County, MI":{"recorder":{"name":"Ogemaw County Register of Deeds","address":"806 W Houghton Ave., West Branch, MI 48661"},"assessor":{"name":"Ogemaw County Equalization","address":"806 W Houghton Ave., West Branch, MI 48661"}},"Ontonagon County, MI":{"recorder":{"name":"Ontonagon County Register of Deeds","address":"725 Greenland Rd., Ontonagon, MI 49953"},"assessor":{"name":"Ontonagon County Equalization","address":"725 Greenland Rd., Ontonagon, MI 49953"}},"Osceola County, MI":{"recorder":{"name":"Osceola County Register of Deeds","address":"301 W Upton Ave., Reed City, MI 49677"},"assessor":{"name":"Osceola County Equalization","address":"301 W Upton Ave., Reed City, MI 49677"}},"Oscoda County, MI":{"recorder":{"name":"Oscoda County Register of Deeds","address":"311 Morenci Ave., Mio, MI 48647"},"assessor":{"name":"Oscoda County Equalization","address":"311 Morenci Ave., Mio, MI 48647"}},"Otsego County, MI":{"recorder":{"name":"Otsego County Register of Deeds","address":"225 W Main St., Gaylord, MI 49735"},"assessor":{"name":"Otsego County Equalization","address":"225 W Main St., Gaylord, MI 49735"}},"Ottawa County, MI":{"recorder":{"name":"Ottawa County Register of Deeds","address":"414 Washington Ave., Grand Haven, MI 49417"},"assessor":{"name":"Ottawa County Equalization","address":"414 Washington Ave., Grand Haven, MI 49417"}},"Presque Isle County, MI":{"recorder":{"name":"Presque Isle County Register of Deeds","address":"151 E Huron Ave., Rogers City, MI 49779"},"assessor":{"name":"Presque Isle County Equalization","address":"151 E Huron Ave., Rogers City, MI 49779"}},"Roscommon County, MI":{"recorder":{"name":"Roscommon County Register of Deeds","address":"500 Lake St., Roscommon, MI 48653"},"assessor":{"name":"Roscommon County Equalization","address":"500 Lake St., Roscommon, MI 48653"}},"Saginaw County, MI":{"recorder":{"name":"Saginaw County Register of Deeds","address":"111 S Michigan Ave., Saginaw, MI 48602"},"assessor":{"name":"Saginaw County Equalization","address":"111 S Michigan Ave., Saginaw, MI 48602"}},"St. Clair County, MI":{"recorder":{"name":"St. Clair County Register of Deeds","address":"201 McMorran Blvd., Port Huron, MI 48060"},"assessor":{"name":"St. Clair County Equalization","address":"201 McMorran Blvd., Port Huron, MI 48060"}},"St. Joseph County, MI":{"recorder":{"name":"St. Joseph County Register of Deeds","address":"125 W Main St., Centreville, MI 49032"},"assessor":{"name":"St. Joseph County Equalization","address":"125 W Main St., Centreville, MI 49032"}},"Sanilac County, MI":{"recorder":{"name":"Sanilac County Register of Deeds","address":"60 W Sanilac Ave., Sandusky, MI 48471"},"assessor":{"name":"Sanilac County Equalization","address":"60 W Sanilac Ave., Sandusky, MI 48471"}},"Schoolcraft County, MI":{"recorder":{"name":"Schoolcraft County Register of Deeds","address":"300 Walnut St., Manistique, MI 49854"},"assessor":{"name":"Schoolcraft County Equalization","address":"300 Walnut St., Manistique, MI 49854"}},"Shiawassee County, MI":{"recorder":{"name":"Shiawassee County Register of Deeds","address":"208 N Shiawassee St., Corunna, MI 48817"},"assessor":{"name":"Shiawassee County Equalization","address":"208 N Shiawassee St., Corunna, MI 48817"}},"Tuscola County, MI":{"recorder":{"name":"Tuscola County Register of Deeds","address":"440 N State St., Caro, MI 48723"},"assessor":{"name":"Tuscola County Equalization","address":"440 N State St., Caro, MI 48723"}},"Van Buren County, MI":{"recorder":{"name":"Van Buren County Register of Deeds","address":"212 E Paw Paw St., Paw Paw, MI 49079"},"assessor":{"name":"Van Buren County Equalization","address":"212 E Paw Paw St., Paw Paw, MI 49079"}},"Washtenaw County, MI":{"recorder":{"name":"Washtenaw County Register of Deeds","address":"200 N Main St., Ann Arbor, MI 48107"},"assessor":{"name":"Washtenaw County Equalization","address":"200 N Main St., Ann Arbor, MI 48107"}},"Wayne County, MI":{"recorder":{"name":"Wayne County Register of Deeds","address":"400 Monroe St. Suite 510, Detroit, MI 48226"},"assessor":{"name":"Wayne County Equalization","address":"400 Monroe St. Suite 510, Detroit, MI 48226"}},"Wexford County, MI":{"recorder":{"name":"Wexford County Register of Deeds","address":"437 E Division St., Cadillac, MI 49601"},"assessor":{"name":"Wexford County Equalization","address":"437 E Division St., Cadillac, MI 49601"}},"Aitkin County, MN":{"recorder":{"name":"Aitkin County Recorder","address":"209 2nd St NW, Aitkin, MN 56431"},"assessor":{"name":"Aitkin County Assessor","address":"209 2nd St NW, Aitkin, MN 56431"}},"Anoka County, MN":{"recorder":{"name":"Anoka County Recorder","address":"2100 3rd Ave. Suite 160, Anoka, MN 55303"},"assessor":{"name":"Anoka County Assessor","address":"2100 3rd Ave. Suite 230, Anoka, MN 55303"}},"Becker County, MN":{"recorder":{"name":"Becker County Recorder","address":"915 Lake Ave., Detroit Lakes, MN 56501"},"assessor":{"name":"Becker County Assessor","address":"915 Lake Ave., Detroit Lakes, MN 56501"}},"Beltrami County, MN":{"recorder":{"name":"Beltrami County Recorder","address":"701 Minnesota Ave NW, Bemidji, MN 56601"},"assessor":{"name":"Beltrami County Assessor","address":"701 Minnesota Ave NW, Bemidji, MN 56601"}},"Benton County, MN":{"recorder":{"name":"Benton County Recorder","address":"531 Dewey St., Foley, MN 56329"},"assessor":{"name":"Benton County Assessor","address":"531 Dewey St., Foley, MN 56329"}},"Big Stone County, MN":{"recorder":{"name":"Big Stone County Recorder","address":"20 SE 2nd St., Ortonville, MN 56278"},"assessor":{"name":"Big Stone County Assessor","address":"20 SE 2nd St., Ortonville, MN 56278"}},"Blue Earth County, MN":{"recorder":{"name":"Blue Earth County Recorder","address":"410 S 5th St., Mankato, MN 56001"},"assessor":{"name":"Blue Earth County Assessor","address":"410 S 5th St., Mankato, MN 56001"}},"Brown County, MN":{"recorder":{"name":"Brown County Recorder","address":"14 S State St., New Ulm, MN 56073"},"assessor":{"name":"Brown County Assessor","address":"14 S State St., New Ulm, MN 56073"}},"Carlton County, MN":{"recorder":{"name":"Carlton County Recorder","address":"301 Walnut Ave., Carlton, MN 55718"},"assessor":{"name":"Carlton County Assessor","address":"301 Walnut Ave., Carlton, MN 55718"}},"Carver County, MN":{"recorder":{"name":"Carver County Recorder","address":"600 E 4th St., Chaska, MN 55318"},"assessor":{"name":"Carver County Assessor","address":"600 E 4th St., Chaska, MN 55318"}},"Cass County, MN":{"recorder":{"name":"Cass County Recorder","address":"303 Minnesota Ave W, Walker, MN 56484"},"assessor":{"name":"Cass County Assessor","address":"303 Minnesota Ave W, Walker, MN 56484"}},"Chippewa County, MN":{"recorder":{"name":"Chippewa County Recorder","address":"629 N 11th St., Montevideo, MN 56265"},"assessor":{"name":"Chippewa County Assessor","address":"629 N 11th St., Montevideo, MN 56265"}},"Chisago County, MN":{"recorder":{"name":"Chisago County Recorder","address":"313 N Main St., Center City, MN 55012"},"assessor":{"name":"Chisago County Assessor","address":"313 N Main St., Center City, MN 55012"}},"Clay County, MN":{"recorder":{"name":"Clay County Recorder","address":"807 11th St N, Moorhead, MN 56560"},"assessor":{"name":"Clay County Assessor","address":"807 11th St N, Moorhead, MN 56560"}},"Clearwater County, MN":{"recorder":{"name":"Clearwater County Recorder","address":"213 Main Ave N, Bagley, MN 56621"},"assessor":{"name":"Clearwater County Assessor","address":"213 Main Ave N, Bagley, MN 56621"}},"Cook County, MN":{"recorder":{"name":"Cook County Recorder","address":"411 W 2nd St., Grand Marais, MN 55604"},"assessor":{"name":"Cook County Assessor","address":"411 W 2nd St., Grand Marais, MN 55604"}},"Cottonwood County, MN":{"recorder":{"name":"Cottonwood County Recorder","address":"900 3rd Ave., Windom, MN 56101"},"assessor":{"name":"Cottonwood County Assessor","address":"900 3rd Ave., Windom, MN 56101"}},"Crow Wing County, MN":{"recorder":{"name":"Crow Wing County Recorder","address":"326 Laurel St., Brainerd, MN 56401"},"assessor":{"name":"Crow Wing County Assessor","address":"326 Laurel St., Brainerd, MN 56401"}},"Dakota County, MN":{"recorder":{"name":"Dakota County Recorder","address":"1590 W Hwy 55, Hastings, MN 55033"},"assessor":{"name":"Dakota County Assessor","address":"1590 W Hwy 55, Hastings, MN 55033"}},"Dodge County, MN":{"recorder":{"name":"Dodge County Recorder","address":"22 E 6th St., Mantorville, MN 55955"},"assessor":{"name":"Dodge County Assessor","address":"22 E 6th St., Mantorville, MN 55955"}},"Douglas County, MN":{"recorder":{"name":"Douglas County Recorder","address":"305 8th Ave W, Alexandria, MN 56308"},"assessor":{"name":"Douglas County Assessor","address":"305 8th Ave W, Alexandria, MN 56308"}},"Faribault County, MN":{"recorder":{"name":"Faribault County Recorder","address":"415 N Main St., Blue Earth, MN 56013"},"assessor":{"name":"Faribault County Assessor","address":"415 N Main St., Blue Earth, MN 56013"}},"Fillmore County, MN":{"recorder":{"name":"Fillmore County Recorder","address":"101 Fillmore St., Preston, MN 55965"},"assessor":{"name":"Fillmore County Assessor","address":"101 Fillmore St., Preston, MN 55965"}},"Freeborn County, MN":{"recorder":{"name":"Freeborn County Recorder","address":"411 S Broadway Ave., Albert Lea, MN 56007"},"assessor":{"name":"Freeborn County Assessor","address":"411 S Broadway Ave., Albert Lea, MN 56007"}},"Goodhue County, MN":{"recorder":{"name":"Goodhue County Recorder","address":"509 W 5th St., Red Wing, MN 55066"},"assessor":{"name":"Goodhue County Assessor","address":"509 W 5th St., Red Wing, MN 55066"}},"Grant County, MN":{"recorder":{"name":"Grant County Recorder","address":"10 2nd St NE, Elbow Lake, MN 56531"},"assessor":{"name":"Grant County Assessor","address":"10 2nd St NE, Elbow Lake, MN 56531"}},"Hennepin County, MN":{"recorder":{"name":"Hennepin County Recorder","address":"300 S 6th St. Suite A-703, Minneapolis, MN 55487"},"assessor":{"name":"Hennepin County Assessor","address":"300 S 6th St. Suite A-2103, Minneapolis, MN 55487"}},"Houston County, MN":{"recorder":{"name":"Houston County Recorder","address":"304 S Marshall St., Caledonia, MN 55921"},"assessor":{"name":"Houston County Assessor","address":"304 S Marshall St., Caledonia, MN 55921"}},"Hubbard County, MN":{"recorder":{"name":"Hubbard County Recorder","address":"301 Court Ave., Park Rapids, MN 56470"},"assessor":{"name":"Hubbard County Assessor","address":"301 Court Ave., Park Rapids, MN 56470"}},"Isanti County, MN":{"recorder":{"name":"Isanti County Recorder","address":"555 18th Ave SW, Cambridge, MN 55008"},"assessor":{"name":"Isanti County Assessor","address":"555 18th Ave SW, Cambridge, MN 55008"}},"Itasca County, MN":{"recorder":{"name":"Itasca County Recorder","address":"123 NE 4th St., Grand Rapids, MN 55744"},"assessor":{"name":"Itasca County Assessor","address":"123 NE 4th St., Grand Rapids, MN 55744"}},"Jackson County, MN":{"recorder":{"name":"Jackson County Recorder","address":"405 4th St., Jackson, MN 56143"},"assessor":{"name":"Jackson County Assessor","address":"405 4th St., Jackson, MN 56143"}},"Kanabec County, MN":{"recorder":{"name":"Kanabec County Recorder","address":"18 N Vine St., Mora, MN 55051"},"assessor":{"name":"Kanabec County Assessor","address":"18 N Vine St., Mora, MN 55051"}},"Kandiyohi County, MN":{"recorder":{"name":"Kandiyohi County Recorder","address":"400 Benson Ave SW, Willmar, MN 56201"},"assessor":{"name":"Kandiyohi County Assessor","address":"400 Benson Ave SW, Willmar, MN 56201"}},"Kittson County, MN":{"recorder":{"name":"Kittson County Recorder","address":"410 S 5th St., Hallock, MN 56728"},"assessor":{"name":"Kittson County Assessor","address":"410 S 5th St., Hallock, MN 56728"}},"Koochiching County, MN":{"recorder":{"name":"Koochiching County Recorder","address":"715 4th St., International Falls, MN 56649"},"assessor":{"name":"Koochiching County Assessor","address":"715 4th St., International Falls, MN 56649"}},"Lac qui Parle County, MN":{"recorder":{"name":"Lac qui Parle County Recorder","address":"600 6th St., Madison, MN 56256"},"assessor":{"name":"Lac qui Parle County Assessor","address":"600 6th St., Madison, MN 56256"}},"Lake County, MN":{"recorder":{"name":"Lake County Recorder","address":"601 3rd Ave., Two Harbors, MN 55616"},"assessor":{"name":"Lake County Assessor","address":"601 3rd Ave., Two Harbors, MN 55616"}},"Lake of the Woods County, MN":{"recorder":{"name":"Lake of the Woods County Recorder","address":"206 8th Ave SE, Baudette, MN 56623"},"assessor":{"name":"Lake of the Woods County Assessor","address":"206 8th Ave SE, Baudette, MN 56623"}},"Le Sueur County, MN":{"recorder":{"name":"Le Sueur County Recorder","address":"88 S Park Ave., Le Center, MN 56057"},"assessor":{"name":"Le Sueur County Assessor","address":"88 S Park Ave., Le Center, MN 56057"}},"Lincoln County, MN":{"recorder":{"name":"Lincoln County Recorder","address":"319 N Rebecca St., Ivanhoe, MN 56142"},"assessor":{"name":"Lincoln County Assessor","address":"319 N Rebecca St., Ivanhoe, MN 56142"}},"Lyon County, MN":{"recorder":{"name":"Lyon County Recorder","address":"607 W Main St., Marshall, MN 56258"},"assessor":{"name":"Lyon County Assessor","address":"607 W Main St., Marshall, MN 56258"}},"Mahnomen County, MN":{"recorder":{"name":"Mahnomen County Recorder","address":"311 N Main St., Mahnomen, MN 56557"},"assessor":{"name":"Mahnomen County Assessor","address":"311 N Main St., Mahnomen, MN 56557"}},"Marshall County, MN":{"recorder":{"name":"Marshall County Recorder","address":"208 E Colvin Ave., Warren, MN 56762"},"assessor":{"name":"Marshall County Assessor","address":"208 E Colvin Ave., Warren, MN 56762"}},"Martin County, MN":{"recorder":{"name":"Martin County Recorder","address":"201 Lake Ave., Fairmont, MN 56031"},"assessor":{"name":"Martin County Assessor","address":"201 Lake Ave., Fairmont, MN 56031"}},"McLeod County, MN":{"recorder":{"name":"McLeod County Recorder","address":"830 11th St E, Glencoe, MN 55336"},"assessor":{"name":"McLeod County Assessor","address":"830 11th St E, Glencoe, MN 55336"}},"Meeker County, MN":{"recorder":{"name":"Meeker County Recorder","address":"325 N Sibley Ave., Litchfield, MN 55355"},"assessor":{"name":"Meeker County Assessor","address":"325 N Sibley Ave., Litchfield, MN 55355"}},"Mille Lacs County, MN":{"recorder":{"name":"Mille Lacs County Recorder","address":"635 2nd St SE, Milaca, MN 56353"},"assessor":{"name":"Mille Lacs County Assessor","address":"635 2nd St SE, Milaca, MN 56353"}},"Morrison County, MN":{"recorder":{"name":"Morrison County Recorder","address":"213 1st Ave SE, Little Falls, MN 56345"},"assessor":{"name":"Morrison County Assessor","address":"213 1st Ave SE, Little Falls, MN 56345"}},"Mower County, MN":{"recorder":{"name":"Mower County Recorder","address":"201 1st St NE, Austin, MN 55912"},"assessor":{"name":"Mower County Assessor","address":"201 1st St NE, Austin, MN 55912"}},"Murray County, MN":{"recorder":{"name":"Murray County Recorder","address":"2500 28th St., Slayton, MN 56172"},"assessor":{"name":"Murray County Assessor","address":"2500 28th St., Slayton, MN 56172"}},"Nicollet County, MN":{"recorder":{"name":"Nicollet County Recorder","address":"501 S Minnesota Ave., Saint Peter, MN 56082"},"assessor":{"name":"Nicollet County Assessor","address":"501 S Minnesota Ave., Saint Peter, MN 56082"}},"Nobles County, MN":{"recorder":{"name":"Nobles County Recorder","address":"315 10th St., Worthington, MN 56187"},"assessor":{"name":"Nobles County Assessor","address":"315 10th St., Worthington, MN 56187"}},"Norman County, MN":{"recorder":{"name":"Norman County Recorder","address":"16 3rd Ave E, Ada, MN 56510"},"assessor":{"name":"Norman County Assessor","address":"16 3rd Ave E, Ada, MN 56510"}},"Olmsted County, MN":{"recorder":{"name":"Olmsted County Recorder","address":"151 4th St SE, Rochester, MN 55904"},"assessor":{"name":"Olmsted County Assessor","address":"151 4th St SE, Rochester, MN 55904"}},"Otter Tail County, MN":{"recorder":{"name":"Otter Tail County Recorder","address":"121 W Junius Ave., Fergus Falls, MN 56537"},"assessor":{"name":"Otter Tail County Assessor","address":"121 W Junius Ave., Fergus Falls, MN 56537"}},"Pennington County, MN":{"recorder":{"name":"Pennington County Recorder","address":"101 N Main Ave., Thief River Falls, MN 56701"},"assessor":{"name":"Pennington County Assessor","address":"101 N Main Ave., Thief River Falls, MN 56701"}},"Pine County, MN":{"recorder":{"name":"Pine County Recorder","address":"315 Main St S, Pine City, MN 55063"},"assessor":{"name":"Pine County Assessor","address":"315 Main St S, Pine City, MN 55063"}},"Pipestone County, MN":{"recorder":{"name":"Pipestone County Recorder","address":"416 S Hiawatha Ave., Pipestone, MN 56164"},"assessor":{"name":"Pipestone County Assessor","address":"416 S Hiawatha Ave., Pipestone, MN 56164"}},"Polk County, MN":{"recorder":{"name":"Polk County Recorder","address":"612 N Broadway Suite 303, Crookston, MN 56716"},"assessor":{"name":"Polk County Assessor","address":"612 N Broadway Suite 303, Crookston, MN 56716"}},"Pope County, MN":{"recorder":{"name":"Pope County Recorder","address":"130 E Minnesota Ave., Glenwood, MN 56334"},"assessor":{"name":"Pope County Assessor","address":"130 E Minnesota Ave., Glenwood, MN 56334"}},"Ramsey County, MN":{"recorder":{"name":"Ramsey County Recorder","address":"90 W Plato Blvd. Suite 100, Saint Paul, MN 55107"},"assessor":{"name":"Ramsey County Assessor","address":"90 W Plato Blvd. Suite 400, Saint Paul, MN 55107"}},"Red Lake County, MN":{"recorder":{"name":"Red Lake County Recorder","address":"124 N Main Ave., Red Lake Falls, MN 56750"},"assessor":{"name":"Red Lake County Assessor","address":"124 N Main Ave., Red Lake Falls, MN 56750"}},"Redwood County, MN":{"recorder":{"name":"Redwood County Recorder","address":"250 S Jefferson St., Redwood Falls, MN 56283"},"assessor":{"name":"Redwood County Assessor","address":"250 S Jefferson St., Redwood Falls, MN 56283"}},"Renville County, MN":{"recorder":{"name":"Renville County Recorder","address":"500 DePue Ave E, Olivia, MN 56277"},"assessor":{"name":"Renville County Assessor","address":"500 DePue Ave E, Olivia, MN 56277"}},"Rice County, MN":{"recorder":{"name":"Rice County Recorder","address":"218 NW 3rd St., Faribault, MN 55021"},"assessor":{"name":"Rice County Assessor","address":"218 NW 3rd St., Faribault, MN 55021"}},"Rock County, MN":{"recorder":{"name":"Rock County Recorder","address":"204 E Brown Ave., Luverne, MN 56156"},"assessor":{"name":"Rock County Assessor","address":"204 E Brown Ave., Luverne, MN 56156"}},"Roseau County, MN":{"recorder":{"name":"Roseau County Recorder","address":"606 5th Ave SW Suite 2, Roseau, MN 56751"},"assessor":{"name":"Roseau County Assessor","address":"606 5th Ave SW Suite 2, Roseau, MN 56751"}},"Scott County, MN":{"recorder":{"name":"Scott County Recorder","address":"200 4th Ave W, Shakopee, MN 55379"},"assessor":{"name":"Scott County Assessor","address":"200 4th Ave W, Shakopee, MN 55379"}},"Sherburne County, MN":{"recorder":{"name":"Sherburne County Recorder","address":"13880 Business Center Dr NW, Elk River, MN 55330"},"assessor":{"name":"Sherburne County Assessor","address":"13880 Business Center Dr NW, Elk River, MN 55330"}},"Sibley County, MN":{"recorder":{"name":"Sibley County Recorder","address":"400 Court Ave., Gaylord, MN 55334"},"assessor":{"name":"Sibley County Assessor","address":"400 Court Ave., Gaylord, MN 55334"}},"St. Louis County, MN":{"recorder":{"name":"St. Louis County Recorder","address":"100 N 5th Ave W, Duluth, MN 55802"},"assessor":{"name":"St. Louis County Assessor","address":"100 N 5th Ave W, Duluth, MN 55802"}},"Stearns County, MN":{"recorder":{"name":"Stearns County Recorder","address":"705 Courthouse Sq. Suite 248, St. Cloud, MN 56303"},"assessor":{"name":"Stearns County Assessor","address":"705 Courthouse Sq. Suite 246, St. Cloud, MN 56303"}},"Steele County, MN":{"recorder":{"name":"Steele County Recorder","address":"630 Florence Ave., Owatonna, MN 55060"},"assessor":{"name":"Steele County Assessor","address":"630 Florence Ave., Owatonna, MN 55060"}},"Stevens County, MN":{"recorder":{"name":"Stevens County Recorder","address":"400 Colorado Ave., Morris, MN 56267"},"assessor":{"name":"Stevens County Assessor","address":"400 Colorado Ave., Morris, MN 56267"}},"Swift County, MN":{"recorder":{"name":"Swift County Recorder","address":"301 14th St N, Benson, MN 56215"},"assessor":{"name":"Swift County Assessor","address":"301 14th St N, Benson, MN 56215"}},"Todd County, MN":{"recorder":{"name":"Todd County Recorder","address":"215 1st Ave S, Long Prairie, MN 56347"},"assessor":{"name":"Todd County Assessor","address":"215 1st Ave S, Long Prairie, MN 56347"}},"Traverse County, MN":{"recorder":{"name":"Traverse County Recorder","address":"702 2nd Ave N, Wheaton, MN 56296"},"assessor":{"name":"Traverse County Assessor","address":"702 2nd Ave N, Wheaton, MN 56296"}},"Wabasha County, MN":{"recorder":{"name":"Wabasha County Recorder","address":"625 Jefferson Ave., Wabasha, MN 55981"},"assessor":{"name":"Wabasha County Assessor","address":"625 Jefferson Ave., Wabasha, MN 55981"}},"Wadena County, MN":{"recorder":{"name":"Wadena County Recorder","address":"415 Jefferson St N, Wadena, MN 56482"},"assessor":{"name":"Wadena County Assessor","address":"415 Jefferson St N, Wadena, MN 56482"}},"Waseca County, MN":{"recorder":{"name":"Waseca County Recorder","address":"307 N State St., Waseca, MN 56093"},"assessor":{"name":"Waseca County Assessor","address":"307 N State St., Waseca, MN 56093"}},"Washington County, MN":{"recorder":{"name":"Washington County Recorder","address":"14949 62nd St N, Stillwater, MN 55082"},"assessor":{"name":"Washington County Assessor","address":"14949 62nd St N, Stillwater, MN 55082"}},"Watonwan County, MN":{"recorder":{"name":"Watonwan County Recorder","address":"710 2nd Ave S, St. James, MN 56081"},"assessor":{"name":"Watonwan County Assessor","address":"710 2nd Ave S, St. James, MN 56081"}},"Wilkin County, MN":{"recorder":{"name":"Wilkin County Recorder","address":"300 S 5th St., Breckenridge, MN 56520"},"assessor":{"name":"Wilkin County Assessor","address":"300 S 5th St., Breckenridge, MN 56520"}},"Winona County, MN":{"recorder":{"name":"Winona County Recorder","address":"171 W 3rd St., Winona, MN 55987"},"assessor":{"name":"Winona County Assessor","address":"171 W 3rd St., Winona, MN 55987"}},"Wright County, MN":{"recorder":{"name":"Wright County Recorder","address":"10 NW 2nd St., Buffalo, MN 55313"},"assessor":{"name":"Wright County Assessor","address":"10 NW 2nd St., Buffalo, MN 55313"}},"Yellow Medicine County, MN":{"recorder":{"name":"Yellow Medicine County Recorder","address":"415 9th Ave., Granite Falls, MN 56241"},"assessor":{"name":"Yellow Medicine County Assessor","address":"415 9th Ave., Granite Falls, MN 56241"}},"Adair County, MO":{"recorder":{"name":"Adair County Recorder of Deeds","address":"106 W Washington St., Kirksville, MO 63501"},"assessor":{"name":"Adair County Assessor","address":"106 W Washington St., Kirksville, MO 63501"}},"Andrew County, MO":{"recorder":{"name":"Andrew County Recorder of Deeds","address":"400 Court St., Savannah, MO 64485"},"assessor":{"name":"Andrew County Assessor","address":"400 Court St., Savannah, MO 64485"}},"Atchison County, MO":{"recorder":{"name":"Atchison County Recorder of Deeds","address":"400 S Washington St., Rock Port, MO 64482"},"assessor":{"name":"Atchison County Assessor","address":"400 S Washington St., Rock Port, MO 64482"}},"Audrain County, MO":{"recorder":{"name":"Audrain County Recorder of Deeds","address":"101 N Jefferson Rm 105, Mexico, MO 65265"},"assessor":{"name":"Audrain County Assessor","address":"101 N Jefferson Rm 106, Mexico, MO 65265"}},"Barry County, MO":{"recorder":{"name":"Barry County Recorder of Deeds","address":"700 Main St. Suite 6, Cassville, MO 65625"},"assessor":{"name":"Barry County Assessor","address":"700 Main St. Suite 7, Cassville, MO 65625"}},"Barton County, MO":{"recorder":{"name":"Barton County Recorder of Deeds","address":"1004 Gulf Rm 107, Lamar, MO 64759"},"assessor":{"name":"Barton County Assessor","address":"1004 Gulf Rm 109, Lamar, MO 64759"}},"Bates County, MO":{"recorder":{"name":"Bates County Recorder of Deeds","address":"103 W Dakota Rm 3, Butler, MO 64730"},"assessor":{"name":"Bates County Assessor","address":"103 W Dakota Rm 4, Butler, MO 64730"}},"Benton County, MO":{"recorder":{"name":"Benton County Recorder of Deeds","address":"316 Van Buren St., Warsaw, MO 65355"},"assessor":{"name":"Benton County Assessor","address":"316 Van Buren St., Warsaw, MO 65355"}},"Bollinger County, MO":{"recorder":{"name":"Bollinger County Recorder of Deeds","address":"204 High St. Suite 7, Marble Hill, MO 63764"},"assessor":{"name":"Bollinger County Assessor","address":"204 High St. Suite 1, Marble Hill, MO 63764"}},"Boone County, MO":{"recorder":{"name":"Boone County Recorder of Deeds","address":"801 E Walnut Rm 132, Columbia, MO 65201"},"assessor":{"name":"Boone County Assessor","address":"801 E Walnut Rm 143, Columbia, MO 65201"}},"Buchanan County, MO":{"recorder":{"name":"Buchanan County Recorder of Deeds","address":"411 Jules Rm 103, St. Joseph, MO 64501"},"assessor":{"name":"Buchanan County Assessor","address":"411 Jules Rm 222, St. Joseph, MO 64501"}},"Butler County, MO":{"recorder":{"name":"Butler County Recorder of Deeds","address":"100 N Main Rm 103, Poplar Bluff, MO 63901"},"assessor":{"name":"Butler County Assessor","address":"100 N Main Rm 201, Poplar Bluff, MO 63901"}},"Caldwell County, MO":{"recorder":{"name":"Caldwell County Recorder of Deeds","address":"49 E Main St., Kingston, MO 64650"},"assessor":{"name":"Caldwell County Assessor","address":"49 E Main St., Kingston, MO 64650"}},"Callaway County, MO":{"recorder":{"name":"Callaway County Recorder of Deeds","address":"10 E 5th St., Fulton, MO 65251"},"assessor":{"name":"Callaway County Assessor","address":"10 E 5th St., Fulton, MO 65251"}},"Camden County, MO":{"recorder":{"name":"Camden County Recorder of Deeds","address":"1 Courthouse Dr., Camdenton, MO 65020"},"assessor":{"name":"Camden County Assessor","address":"1 Courthouse Dr., Camdenton, MO 65020"}},"Cape Girardeau County, MO":{"recorder":{"name":"Cape Girardeau County Recorder of Deeds","address":"1 Barton Square Suite 202, Jackson, MO 63755"},"assessor":{"name":"Cape Girardeau County Assessor","address":"1 Barton Square Suite 202, Jackson, MO 63755"}},"Carroll County, MO":{"recorder":{"name":"Carroll County Recorder of Deeds","address":"8 S Main Suite 6, Carrollton, MO 64633"},"assessor":{"name":"Carroll County Assessor","address":"8 S Main Suite 3, Carrollton, MO 64633"}},"Carter County, MO":{"recorder":{"name":"Carter County Recorder of Deeds","address":"105 N Casey, Van Buren, MO 63965"},"assessor":{"name":"Carter County Assessor","address":"105 N Casey, Van Buren, MO 63965"}},"Cass County, MO":{"recorder":{"name":"Cass County Recorder of Deeds","address":"102 E Wall St., Harrisonville, MO 64701"},"assessor":{"name":"Cass County Assessor","address":"102 E Wall St., Harrisonville, MO 64701"}},"Cedar County, MO":{"recorder":{"name":"Cedar County Recorder of Deeds","address":"113 S Street, Stockton, MO 65785"},"assessor":{"name":"Cedar County Assessor","address":"113 S Street, Stockton, MO 65785"}},"Chariton County, MO":{"recorder":{"name":"Chariton County Recorder of Deeds","address":"306 S Cherry St., Keytesville, MO 65261"},"assessor":{"name":"Chariton County Assessor","address":"306 S Cherry St., Keytesville, MO 65261"}},"Christian County, MO":{"recorder":{"name":"Christian County Recorder of Deeds","address":"100 W Church St., Ozark, MO 65721"},"assessor":{"name":"Christian County Assessor","address":"100 W Church St., Ozark, MO 65721"}},"Clark County, MO":{"recorder":{"name":"Clark County Recorder of Deeds","address":"111 E Court St., Kahoka, MO 63445"},"assessor":{"name":"Clark County Assessor","address":"111 E Court St., Kahoka, MO 63445"}},"Clay County, MO":{"recorder":{"name":"Clay County Recorder of Deeds","address":"1 Courthouse Square, Liberty, MO 64068"},"assessor":{"name":"Clay County Assessor","address":"1 Courthouse Square, Liberty, MO 64068"}},"Clinton County, MO":{"recorder":{"name":"Clinton County Recorder of Deeds","address":"207 N Main St., Plattsburg, MO 64477"},"assessor":{"name":"Clinton County Assessor","address":"207 N Main St., Plattsburg, MO 64477"}},"Cole County, MO":{"recorder":{"name":"Cole County Recorder of Deeds","address":"311 E High St., Jefferson City, MO 65101"},"assessor":{"name":"Cole County Assessor","address":"311 E High St., Jefferson City, MO 65101"}},"Cooper County, MO":{"recorder":{"name":"Cooper County Recorder of Deeds","address":"200 Main St., Boonville, MO 65233"},"assessor":{"name":"Cooper County Assessor","address":"200 Main St., Boonville, MO 65233"}},"Crawford County, MO":{"recorder":{"name":"Crawford County Recorder of Deeds","address":"302 W Main St., Steelville, MO 65565"},"assessor":{"name":"Crawford County Assessor","address":"302 W Main St., Steelville, MO 65565"}},"Dade County, MO":{"recorder":{"name":"Dade County Recorder of Deeds","address":"300 W Water St., Greenfield, MO 65661"},"assessor":{"name":"Dade County Assessor","address":"300 W Water St., Greenfield, MO 65661"}},"Dallas County, MO":{"recorder":{"name":"Dallas County Recorder of Deeds","address":"Buffalo, MO 65622"},"assessor":{"name":"Dallas County Assessor","address":"Buffalo, MO 65622"}},"Daviess County, MO":{"recorder":{"name":"Daviess County Recorder of Deeds","address":"102 N Main St., Gallatin, MO 64640"},"assessor":{"name":"Daviess County Assessor","address":"102 N Main St., Gallatin, MO 64640"}},"DeKalb County, MO":{"recorder":{"name":"DeKalb County Recorder of Deeds","address":"109 W Main St., Maysville, MO 64469"},"assessor":{"name":"DeKalb County Assessor","address":"109 W Main St., Maysville, MO 64469"}},"Dent County, MO":{"recorder":{"name":"Dent County Recorder of Deeds","address":"400 N Main St., Salem, MO 65560"},"assessor":{"name":"Dent County Assessor","address":"400 N Main St., Salem, MO 65560"}},"Douglas County, MO":{"recorder":{"name":"Douglas County Recorder of Deeds","address":"203 SE 2nd Ave., Ava, MO 65608"},"assessor":{"name":"Douglas County Assessor","address":"203 SE 2nd Ave., Ava, MO 65608"}},"Dunklin County, MO":{"recorder":{"name":"Dunklin County Recorder of Deeds","address":"221 S Main St., Kennett, MO 63857"},"assessor":{"name":"Dunklin County Assessor","address":"221 S Main St., Kennett, MO 63857"}},"Franklin County, MO":{"recorder":{"name":"Franklin County Recorder of Deeds","address":"400 E Locust St., Union, MO 63084"},"assessor":{"name":"Franklin County Assessor","address":"400 E Locust St., Union, MO 63084"}},"Gasconade County, MO":{"recorder":{"name":"Gasconade County Recorder of Deeds","address":"119 E 1st St., Hermann, MO 65041"},"assessor":{"name":"Gasconade County Assessor","address":"119 E 1st St., Hermann, MO 65041"}},"Gentry County, MO":{"recorder":{"name":"Gentry County Recorder of Deeds","address":"200 W Clay St., Albany, MO 64402"},"assessor":{"name":"Gentry County Assessor","address":"200 W Clay St., Albany, MO 64402"}},"Greene County, MO":{"recorder":{"name":"Greene County Recorder of Deeds","address":"940 N Boonville Ave., Springfield, MO 65802"},"assessor":{"name":"Greene County Assessor","address":"940 N Boonville Ave., Springfield, MO 65802"}},"Grundy County, MO":{"recorder":{"name":"Grundy County Recorder of Deeds","address":"700 Main St., Trenton, MO 64683"},"assessor":{"name":"Grundy County Assessor","address":"700 Main St., Trenton, MO 64683"}},"Harrison County, MO":{"recorder":{"name":"Harrison County Recorder of Deeds","address":"1500 Central St., Bethany, MO 64424"},"assessor":{"name":"Harrison County Assessor","address":"1500 Central St., Bethany, MO 64424"}},"Henry County, MO":{"recorder":{"name":"Henry County Recorder of Deeds","address":"100 W Franklin St., Clinton, MO 64735"},"assessor":{"name":"Henry County Assessor","address":"100 W Franklin St., Clinton, MO 64735"}},"Hickory County, MO":{"recorder":{"name":"Hickory County Recorder of Deeds","address":"Hermitage, MO 65668"},"assessor":{"name":"Hickory County Assessor","address":"Hermitage, MO 65668"}},"Holt County, MO":{"recorder":{"name":"Holt County Recorder of Deeds","address":"102 W Nodaway St., Oregon, MO 64473"},"assessor":{"name":"Holt County Assessor","address":"102 W Nodaway St., Oregon, MO 64473"}},"Howard County, MO":{"recorder":{"name":"Howard County Recorder of Deeds","address":"1 Courthouse Square, Fayette, MO 65248"},"assessor":{"name":"Howard County Assessor","address":"1 Courthouse Square, Fayette, MO 65248"}},"Howell County, MO":{"recorder":{"name":"Howell County Recorder of Deeds","address":"2 Court Square Suite 3, West Plains, MO 65775"},"assessor":{"name":"Howell County Assessor","address":"2 Court Square Suite 3, West Plains, MO 65775"}},"Iron County, MO":{"recorder":{"name":"Iron County Recorder of Deeds","address":"250 S Main St., Ironton, MO 63650"},"assessor":{"name":"Iron County Assessor","address":"250 S Main St., Ironton, MO 63650"}},"Jackson County, MO":{"recorder":{"name":"Jackson County Recorder of Deeds","address":"415 E 12th St., Kansas City, MO 64106"},"assessor":{"name":"Jackson County Assessor","address":"415 E 12th St., Kansas City, MO 64106"}},"Jasper County, MO":{"recorder":{"name":"Jasper County Recorder of Deeds","address":"601 S Pearl Ave., Joplin, MO 64801"},"assessor":{"name":"Jasper County Assessor","address":"601 S Pearl Ave., Joplin, MO 64801"}},"Jefferson County, MO":{"recorder":{"name":"Jefferson County Recorder of Deeds","address":"729 Maple St., Hillsboro, MO 63050"},"assessor":{"name":"Jefferson County Assessor","address":"729 Maple St., Hillsboro, MO 63050"}},"Johnson County, MO":{"recorder":{"name":"Johnson County Recorder of Deeds","address":"300 N Holden St. Suite 6, Warrensburg, MO 64093"},"assessor":{"name":"Johnson County Assessor","address":"300 N Holden St. Suite 6, Warrensburg, MO 64093"}},"Knox County, MO":{"recorder":{"name":"Knox County Recorder of Deeds","address":"107 N 4th St., Edina, MO 63537"},"assessor":{"name":"Knox County Assessor","address":"107 N 4th St., Edina, MO 63537"}},"Laclede County, MO":{"recorder":{"name":"Laclede County Recorder of Deeds","address":"200 N Adams Ave., Lebanon, MO 65536"},"assessor":{"name":"Laclede County Assessor","address":"200 N Adams Ave., Lebanon, MO 65536"}},"Lafayette County, MO":{"recorder":{"name":"Lafayette County Recorder of Deeds","address":"1001 Main St., Lexington, MO 64067"},"assessor":{"name":"Lafayette County Assessor","address":"1001 Main St., Lexington, MO 64067"}},"Lawrence County, MO":{"recorder":{"name":"Lawrence County Recorder of Deeds","address":"1 Courthouse Square, Mount Vernon, MO 65712"},"assessor":{"name":"Lawrence County Assessor","address":"1 Courthouse Square, Mount Vernon, MO 65712"}},"Lewis County, MO":{"recorder":{"name":"Lewis County Recorder of Deeds","address":"100 E Lafayette St., Monticello, MO 63457"},"assessor":{"name":"Lewis County Assessor","address":"100 E Lafayette St., Monticello, MO 63457"}},"Lincoln County, MO":{"recorder":{"name":"Lincoln County Recorder of Deeds","address":"201 Main St., Troy, MO 63379"},"assessor":{"name":"Lincoln County Assessor","address":"201 Main St., Troy, MO 63379"}},"Linn County, MO":{"recorder":{"name":"Linn County Recorder of Deeds","address":"108 N High St., Linneus, MO 64653"},"assessor":{"name":"Linn County Assessor","address":"108 N High St., Linneus, MO 64653"}},"Livingston County, MO":{"recorder":{"name":"Livingston County Recorder of Deeds","address":"700 Webster St., Chillicothe, MO 64601"},"assessor":{"name":"Livingston County Assessor","address":"700 Webster St., Chillicothe, MO 64601"}},"Macon County, MO":{"recorder":{"name":"Macon County Recorder of Deeds","address":"101 E Washington St., Macon, MO 63552"},"assessor":{"name":"Macon County Assessor","address":"101 E Washington St., Macon, MO 63552"}},"Madison County, MO":{"recorder":{"name":"Madison County Recorder of Deeds","address":"1 Courthouse Square, Fredericktown, MO 63645"},"assessor":{"name":"Madison County Assessor","address":"1 Courthouse Square, Fredericktown, MO 63645"}},"Maries County, MO":{"recorder":{"name":"Maries County Recorder of Deeds","address":"211 4th St., Vienna, MO 65582"},"assessor":{"name":"Maries County Assessor","address":"211 4th St., Vienna, MO 65582"}},"Marion County, MO":{"recorder":{"name":"Marion County Recorder of Deeds","address":"906 Broadway Rm 102, Hannibal, MO 63401"},"assessor":{"name":"Marion County Assessor","address":"906 Broadway Rm 102, Hannibal, MO 63401"}},"McDonald County, MO":{"recorder":{"name":"McDonald County Recorder of Deeds","address":"601 S Main St., Pineville, MO 64856"},"assessor":{"name":"McDonald County Assessor","address":"601 S Main St., Pineville, MO 64856"}},"Mercer County, MO":{"recorder":{"name":"Mercer County Recorder of Deeds","address":"802 E Main St., Princeton, MO 64673"},"assessor":{"name":"Mercer County Assessor","address":"802 E Main St., Princeton, MO 64673"}},"Miller County, MO":{"recorder":{"name":"Miller County Recorder of Deeds","address":"2001 E Main St., Tuscumbia, MO 65082"},"assessor":{"name":"Miller County Assessor","address":"2001 E Main St., Tuscumbia, MO 65082"}},"Mississippi County, MO":{"recorder":{"name":"Mississippi County Recorder of Deeds","address":"200 N Washington St., Charleston, MO 63834"},"assessor":{"name":"Mississippi County Assessor","address":"200 N Washington St., Charleston, MO 63834"}},"Moniteau County, MO":{"recorder":{"name":"Moniteau County Recorder of Deeds","address":"200 E Main St., California, MO 65018"},"assessor":{"name":"Moniteau County Assessor","address":"200 E Main St., California, MO 65018"}},"Monroe County, MO":{"recorder":{"name":"Monroe County Recorder of Deeds","address":"300 N Main St., Paris, MO 65275"},"assessor":{"name":"Monroe County Assessor","address":"300 N Main St., Paris, MO 65275"}},"Montgomery County, MO":{"recorder":{"name":"Montgomery County Recorder of Deeds","address":"211 E 3rd St., Montgomery City, MO 63361"},"assessor":{"name":"Montgomery County Assessor","address":"211 E 3rd St., Montgomery City, MO 63361"}},"Morgan County, MO":{"recorder":{"name":"Morgan County Recorder of Deeds","address":"100 E Newton St., Versailles, MO 65084"},"assessor":{"name":"Morgan County Assessor","address":"100 E Newton St., Versailles, MO 65084"}},"New Madrid County, MO":{"recorder":{"name":"New Madrid County Recorder of Deeds","address":"450 Main St., New Madrid, MO 63869"},"assessor":{"name":"New Madrid County Assessor","address":"450 Main St., New Madrid, MO 63869"}},"Newton County, MO":{"recorder":{"name":"Newton County Recorder of Deeds","address":"101 S Wood St., Neosho, MO 64850"},"assessor":{"name":"Newton County Assessor","address":"101 S Wood St., Neosho, MO 64850"}},"Nodaway County, MO":{"recorder":{"name":"Nodaway County Recorder of Deeds","address":"305 N Main St., Maryville, MO 64468"},"assessor":{"name":"Nodaway County Assessor","address":"305 N Main St., Maryville, MO 64468"}},"Oregon County, MO":{"recorder":{"name":"Oregon County Recorder of Deeds","address":"Alton, MO 65606"},"assessor":{"name":"Oregon County Assessor","address":"Alton, MO 65606"}},"Osage County, MO":{"recorder":{"name":"Osage County Recorder of Deeds","address":"1 Courthouse Square, Linn, MO 65051"},"assessor":{"name":"Osage County Assessor","address":"1 Courthouse Square, Linn, MO 65051"}},"Ozark County, MO":{"recorder":{"name":"Ozark County Recorder of Deeds","address":"Gainesville, MO 65655"},"assessor":{"name":"Ozark County Assessor","address":"Gainesville, MO 65655"}},"Pemiscot County, MO":{"recorder":{"name":"Pemiscot County Recorder of Deeds","address":"610 Ward Ave., Caruthersville, MO 63830"},"assessor":{"name":"Pemiscot County Assessor","address":"610 Ward Ave., Caruthersville, MO 63830"}},"Perry County, MO":{"recorder":{"name":"Perry County Recorder of Deeds","address":"321 N Main St., Perryville, MO 63775"},"assessor":{"name":"Perry County Assessor","address":"321 N Main St., Perryville, MO 63775"}},"Pettis County, MO":{"recorder":{"name":"Pettis County Recorder of Deeds","address":"415 S Ohio Ave., Sedalia, MO 65301"},"assessor":{"name":"Pettis County Assessor","address":"415 S Ohio Ave., Sedalia, MO 65301"}},"Phelps County, MO":{"recorder":{"name":"Phelps County Recorder of Deeds","address":"200 N Main St., Rolla, MO 65401"},"assessor":{"name":"Phelps County Assessor","address":"200 N Main St., Rolla, MO 65401"}},"Pike County, MO":{"recorder":{"name":"Pike County Recorder of Deeds","address":"115 W Main St., Bowling Green, MO 63334"},"assessor":{"name":"Pike County Assessor","address":"115 W Main St., Bowling Green, MO 63334"}},"Platte County, MO":{"recorder":{"name":"Platte County Recorder of Deeds","address":"415 3rd St., Platte City, MO 64079"},"assessor":{"name":"Platte County Assessor","address":"415 3rd St., Platte City, MO 64079"}},"Polk County, MO":{"recorder":{"name":"Polk County Recorder of Deeds","address":"102 E Broadway St., Bolivar, MO 65613"},"assessor":{"name":"Polk County Assessor","address":"102 E Broadway St., Bolivar, MO 65613"}},"Pulaski County, MO":{"recorder":{"name":"Pulaski County Recorder of Deeds","address":"301 Historic Rt 66 E Suite 121, Waynesville, MO 65583"},"assessor":{"name":"Pulaski County Assessor","address":"301 Historic Rt 66 E Suite 121, Waynesville, MO 65583"}},"Putnam County, MO":{"recorder":{"name":"Putnam County Recorder of Deeds","address":"1601 Main St., Unionville, MO 63565"},"assessor":{"name":"Putnam County Assessor","address":"1601 Main St., Unionville, MO 63565"}},"Ralls County, MO":{"recorder":{"name":"Ralls County Recorder of Deeds","address":"311 S Main St., New London, MO 63459"},"assessor":{"name":"Ralls County Assessor","address":"311 S Main St., New London, MO 63459"}},"Randolph County, MO":{"recorder":{"name":"Randolph County Recorder of Deeds","address":"372 S Main St. Suite 1, Huntsville, MO 65259"},"assessor":{"name":"Randolph County Assessor","address":"372 S Main St. Suite 1, Huntsville, MO 65259"}},"Ray County, MO":{"recorder":{"name":"Ray County Recorder of Deeds","address":"100 W Main St., Richmond, MO 64085"},"assessor":{"name":"Ray County Assessor","address":"100 W Main St., Richmond, MO 64085"}},"Reynolds County, MO":{"recorder":{"name":"Reynolds County Recorder of Deeds","address":"1 Main St., Centerville, MO 63633"},"assessor":{"name":"Reynolds County Assessor","address":"1 Main St., Centerville, MO 63633"}},"Ripley County, MO":{"recorder":{"name":"Ripley County Recorder of Deeds","address":"100 Courthouse Square, Doniphan, MO 63935"},"assessor":{"name":"Ripley County Assessor","address":"100 Courthouse Square, Doniphan, MO 63935"}},"St. Charles County, MO":{"recorder":{"name":"St. Charles County Recorder of Deeds","address":"201 N 2nd St. Suite 321, St. Charles, MO 63301"},"assessor":{"name":"St. Charles County Assessor","address":"201 N 2nd St. Suite 321, St. Charles, MO 63301"}},"St. Clair County, MO":{"recorder":{"name":"St. Clair County Recorder of Deeds","address":"655 2nd St., Osceola, MO 64776"},"assessor":{"name":"St. Clair County Assessor","address":"655 2nd St., Osceola, MO 64776"}},"St. Francois County, MO":{"recorder":{"name":"St. Francois County Recorder of Deeds","address":"1 W Liberty St. Suite 100, Farmington, MO 63640"},"assessor":{"name":"St. Francois County Assessor","address":"1 W Liberty St. Suite 100, Farmington, MO 63640"}},"St. Louis City, MO":{"recorder":{"name":"St. Louis City Recorder of Deeds","address":"1200 Market St. Room 126, St. Louis, MO 63103"},"assessor":{"name":"St. Louis City Assessor","address":"1200 Market St. Room 110, St. Louis, MO 63103"}},"St. Louis County, MO":{"recorder":{"name":"St. Louis County Recorder of Deeds","address":"41 S Central Ave., Clayton, MO 63105"},"assessor":{"name":"St. Louis County Assessor","address":"41 S Central Ave., Clayton, MO 63105"}},"Ste. Genevieve County, MO":{"recorder":{"name":"Ste. Genevieve County Recorder of Deeds","address":"55 S 3rd St., Ste. Genevieve, MO 63670"},"assessor":{"name":"Ste. Genevieve County Assessor","address":"55 S 3rd St., Ste. Genevieve, MO 63670"}},"Saline County, MO":{"recorder":{"name":"Saline County Recorder of Deeds","address":"101 E Arrow St., Marshall, MO 65340"},"assessor":{"name":"Saline County Assessor","address":"101 E Arrow St., Marshall, MO 65340"}},"Schuyler County, MO":{"recorder":{"name":"Schuyler County Recorder of Deeds","address":"9 N Washington St., Lancaster, MO 63548"},"assessor":{"name":"Schuyler County Assessor","address":"9 N Washington St., Lancaster, MO 63548"}},"Scotland County, MO":{"recorder":{"name":"Scotland County Recorder of Deeds","address":"117 S Market St., Memphis, MO 63555"},"assessor":{"name":"Scotland County Assessor","address":"117 S Market St., Memphis, MO 63555"}},"Scott County, MO":{"recorder":{"name":"Scott County Recorder of Deeds","address":"131 S Winchester St., Benton, MO 63736"},"assessor":{"name":"Scott County Assessor","address":"131 S Winchester St., Benton, MO 63736"}},"Shannon County, MO":{"recorder":{"name":"Shannon County Recorder of Deeds","address":"Eminence, MO 65466"},"assessor":{"name":"Shannon County Assessor","address":"Eminence, MO 65466"}},"Shelby County, MO":{"recorder":{"name":"Shelby County Recorder of Deeds","address":"100 E Center St., Shelbyville, MO 63469"},"assessor":{"name":"Shelby County Assessor","address":"100 E Center St., Shelbyville, MO 63469"}},"Stoddard County, MO":{"recorder":{"name":"Stoddard County Recorder of Deeds","address":"401 S Prairie St., Bloomfield, MO 63825"},"assessor":{"name":"Stoddard County Assessor","address":"401 S Prairie St., Bloomfield, MO 63825"}},"Stone County, MO":{"recorder":{"name":"Stone County Recorder of Deeds","address":"108 E 4th St., Galena, MO 65656"},"assessor":{"name":"Stone County Assessor","address":"108 E 4th St., Galena, MO 65656"}},"Sullivan County, MO":{"recorder":{"name":"Sullivan County Recorder of Deeds","address":"109 N Main, Milan, MO 63556"},"assessor":{"name":"Sullivan County Assessor","address":"109 N Main, Milan, MO 63556"}},"Taney County, MO":{"recorder":{"name":"Taney County Recorder of Deeds","address":"132 David St., Forsyth, MO 65653"},"assessor":{"name":"Taney County Assessor","address":"132 David St., Forsyth, MO 65653"}},"Texas County, MO":{"recorder":{"name":"Texas County Recorder of Deeds","address":"210 N Grand Ave., Houston, MO 65483"},"assessor":{"name":"Texas County Assessor","address":"210 N Grand Ave., Houston, MO 65483"}},"Vernon County, MO":{"recorder":{"name":"Vernon County Recorder of Deeds","address":"100 W Cherry St., Nevada, MO 64772"},"assessor":{"name":"Vernon County Assessor","address":"100 W Cherry St., Nevada, MO 64772"}},"Warren County, MO":{"recorder":{"name":"Warren County Recorder of Deeds","address":"104 W Main St., Warrenton, MO 63383"},"assessor":{"name":"Warren County Assessor","address":"104 W Main St., Warrenton, MO 63383"}},"Washington County, MO":{"recorder":{"name":"Washington County Recorder of Deeds","address":"102 N Missouri St., Potosi, MO 63664"},"assessor":{"name":"Washington County Assessor","address":"102 N Missouri St., Potosi, MO 63664"}},"Wayne County, MO":{"recorder":{"name":"Wayne County Recorder of Deeds","address":"109 Walnut St., Greenville, MO 63944"},"assessor":{"name":"Wayne County Assessor","address":"109 Walnut St., Greenville, MO 63944"}},"Webster County, MO":{"recorder":{"name":"Webster County Recorder of Deeds","address":"101 S Jefferson Ave., Marshfield, MO 65706"},"assessor":{"name":"Webster County Assessor","address":"101 S Jefferson Ave., Marshfield, MO 65706"}},"Worth County, MO":{"recorder":{"name":"Worth County Recorder of Deeds","address":"Grant City, MO 64456"},"assessor":{"name":"Worth County Assessor","address":"Grant City, MO 64456"}},"Wright County, MO":{"recorder":{"name":"Wright County Recorder of Deeds","address":"125 Court Square, Hartville, MO 65667"},"assessor":{"name":"Wright County Assessor","address":"125 Court Square, Hartville, MO 65667"}},"Adams County, MS":{"recorder":{"name":"Adams County Chancery Clerk","address":"115 S Wall St., Natchez, MS 39120"},"assessor":{"name":"Adams County Tax Assessor","address":"115 S Wall St., Natchez, MS 39120"}},"Alcorn County, MS":{"recorder":{"name":"Alcorn County Chancery Clerk","address":"501 Waldron St., Corinth, MS 38834"},"assessor":{"name":"Alcorn County Tax Assessor","address":"501 Waldron St., Corinth, MS 38834"}},"Amite County, MS":{"recorder":{"name":"Amite County Chancery Clerk","address":"243 W Main St., Liberty, MS 39645"},"assessor":{"name":"Amite County Tax Assessor","address":"243 W Main St., Liberty, MS 39645"}},"Attala County, MS":{"recorder":{"name":"Attala County Chancery Clerk","address":"230 W Washington St., Kosciusko, MS 39090"},"assessor":{"name":"Attala County Tax Assessor","address":"230 W Washington St., Kosciusko, MS 39090"}},"Benton County, MS":{"recorder":{"name":"Benton County Chancery Clerk","address":"Box 218, Ashland, MS 38603"},"assessor":{"name":"Benton County Tax Assessor","address":"Ashland, MS 38603"}},"Bolivar County, MS":{"recorder":{"name":"Bolivar County Chancery Clerk","address":"400 S Court St., Cleveland, MS 38732"},"assessor":{"name":"Bolivar County Tax Assessor","address":"400 S Court St., Cleveland, MS 38732"}},"Calhoun County, MS":{"recorder":{"name":"Calhoun County Chancery Clerk","address":"201 S. Jefferson, Pittsboro, MS 38951"},"assessor":{"name":"Calhoun County Tax Assessor","address":"201 S. Jefferson, Pittsboro, MS 38951"}},"Carroll County, MS":{"recorder":{"name":"Carroll County Chancery Clerk","address":"Carrollton, MS 38917"},"assessor":{"name":"Carroll County Tax Assessor","address":"Carrollton, MS 38917"}},"Chickasaw County, MS":{"recorder":{"name":"Chickasaw County Chancery Clerk","address":"1 Pinson Square, Houston, MS 38851"},"assessor":{"name":"Chickasaw County Tax Assessor","address":"1 Pinson Square, Houston, MS 38851"}},"Choctaw County, MS":{"recorder":{"name":"Choctaw County Chancery Clerk","address":"112 Quinn St., Ackerman, MS 39735"},"assessor":{"name":"Choctaw County Tax Assessor","address":"112 Quinn St., Ackerman, MS 39735"}},"Claiborne County, MS":{"recorder":{"name":"Claiborne County Chancery Clerk","address":"410 Market St., Port Gibson, MS 39150"},"assessor":{"name":"Claiborne County Tax Assessor","address":"410 Market St., Port Gibson, MS 39150"}},"Clarke County, MS":{"recorder":{"name":"Clarke County Chancery Clerk","address":"101 Enterprise Ave., Quitman, MS 39355"},"assessor":{"name":"Clarke County Tax Assessor","address":"101 Enterprise Ave., Quitman, MS 39355"}},"Clay County, MS":{"recorder":{"name":"Clay County Chancery Clerk","address":"Main St., West Point, MS 39773"},"assessor":{"name":"Clay County Tax Assessor","address":"Main St., West Point, MS 39773"}},"Coahoma County, MS":{"recorder":{"name":"Coahoma County Chancery Clerk","address":"115 First St., Clarksdale, MS 38614"},"assessor":{"name":"Coahoma County Tax Assessor","address":"115 First St., Clarksdale, MS 38614"}},"Copiah County, MS":{"recorder":{"name":"Copiah County Chancery Clerk","address":"100 Caldwell Dr., Hazlehurst, MS 39083"},"assessor":{"name":"Copiah County Tax Assessor","address":"100 Caldwell Dr., Hazlehurst, MS 39083"}},"Covington County, MS":{"recorder":{"name":"Covington County Chancery Clerk","address":"101 S Dogwood Ave., Collins, MS 39428"},"assessor":{"name":"Covington County Tax Assessor","address":"101 S Dogwood Ave., Collins, MS 39428"}},"DeSoto County, MS":{"recorder":{"name":"DeSoto County Chancery Clerk","address":"365 Losher St., Hernando, MS 38632"},"assessor":{"name":"DeSoto County Tax Assessor","address":"365 Losher St., Hernando, MS 38632"}},"Forrest County, MS":{"recorder":{"name":"Forrest County Chancery Clerk","address":"641 Main St., Hattiesburg, MS 39401"},"assessor":{"name":"Forrest County Tax Assessor","address":"641 Main St., Hattiesburg, MS 39401"}},"Franklin County, MS":{"recorder":{"name":"Franklin County Chancery Clerk","address":"Main St., Meadville, MS 39653"},"assessor":{"name":"Franklin County Tax Assessor","address":"Main St., Meadville, MS 39653"}},"George County, MS":{"recorder":{"name":"George County Chancery Clerk","address":"355 Cox St., Lucedale, MS 39452"},"assessor":{"name":"George County Tax Assessor","address":"355 Cox St., Lucedale, MS 39452"}},"Greene County, MS":{"recorder":{"name":"Greene County Chancery Clerk","address":"400 Main St., Leakesville, MS 39451"},"assessor":{"name":"Greene County Tax Assessor","address":"400 Main St., Leakesville, MS 39451"}},"Grenada County, MS":{"recorder":{"name":"Grenada County Chancery Clerk","address":"59 Green St., Grenada, MS 38901"},"assessor":{"name":"Grenada County Tax Assessor","address":"59 Green St., Grenada, MS 38901"}},"Hancock County, MS":{"recorder":{"name":"Hancock County Chancery Clerk","address":"152 Main St., Bay St. Louis, MS 39520"},"assessor":{"name":"Hancock County Tax Assessor","address":"152 Main St., Bay St. Louis, MS 39520"}},"Harrison County, MS":{"recorder":{"name":"Harrison County Chancery Clerk","address":"1801 23rd Ave., Gulfport, MS 39501"},"assessor":{"name":"Harrison County Tax Assessor","address":"1801 23rd Ave., Gulfport, MS 39501"}},"Hinds County, MS":{"recorder":{"name":"Hinds County Chancery Clerk","address":"316 S President St., Jackson, MS 39201"},"assessor":{"name":"Hinds County Tax Assessor","address":"316 S President St., Jackson, MS 39201"}},"Holmes County, MS":{"recorder":{"name":"Holmes County Chancery Clerk","address":"20 Court St., Lexington, MS 39095"},"assessor":{"name":"Holmes County Tax Assessor","address":"20 Court St., Lexington, MS 39095"}},"Humphreys County, MS":{"recorder":{"name":"Humphreys County Chancery Clerk","address":"102 Castleman St., Belzoni, MS 39038"},"assessor":{"name":"Humphreys County Tax Assessor","address":"102 Castleman St., Belzoni, MS 39038"}},"Issaquena County, MS":{"recorder":{"name":"Issaquena County Chancery Clerk","address":"Main St., Mayersville, MS 39113"},"assessor":{"name":"Issaquena County Tax Assessor","address":"Main St., Mayersville, MS 39113"}},"Itawamba County, MS":{"recorder":{"name":"Itawamba County Chancery Clerk","address":"201 W Main St., Fulton, MS 38843"},"assessor":{"name":"Itawamba County Tax Assessor","address":"201 W Main St., Fulton, MS 38843"}},"Jackson County, MS":{"recorder":{"name":"Jackson County Chancery Clerk","address":"3104 Magnolia St., Pascagoula, MS 39567"},"assessor":{"name":"Jackson County Tax Assessor","address":"3104 Magnolia St., Pascagoula, MS 39567"}},"Jasper County, MS":{"recorder":{"name":"Jasper County Chancery Clerk","address":"Bay Springs, MS 39422"},"assessor":{"name":"Jasper County Tax Assessor","address":"Bay Springs, MS 39422"}},"Jefferson County, MS":{"recorder":{"name":"Jefferson County Chancery Clerk","address":"1483 Main St., Fayette, MS 39069"},"assessor":{"name":"Jefferson County Tax Assessor","address":"1483 Main St., Fayette, MS 39069"}},"Jefferson Davis County, MS":{"recorder":{"name":"Jefferson Davis County Chancery Clerk","address":"1025 3rd St., Prentiss, MS 39474"},"assessor":{"name":"Jefferson Davis County Tax Assessor","address":"1025 3rd St., Prentiss, MS 39474"}},"Jones County, MS":{"recorder":{"name":"Jones County Chancery Clerk","address":"415 N 5th Ave., Laurel, MS 39441"},"assessor":{"name":"Jones County Tax Assessor","address":"415 N 5th Ave., Laurel, MS 39441"}},"Kemper County, MS":{"recorder":{"name":"Kemper County Chancery Clerk","address":"DeKalb, MS 39328"},"assessor":{"name":"Kemper County Tax Assessor","address":"DeKalb, MS 39328"}},"Lafayette County, MS":{"recorder":{"name":"Lafayette County Chancery Clerk","address":"300 N Lamar Blvd., Oxford, MS 38655"},"assessor":{"name":"Lafayette County Tax Assessor","address":"300 N Lamar Blvd., Oxford, MS 38655"}},"Lamar County, MS":{"recorder":{"name":"Lamar County Chancery Clerk","address":"203 Main St., Purvis, MS 39475"},"assessor":{"name":"Lamar County Tax Assessor","address":"203 Main St., Purvis, MS 39475"}},"Lauderdale County, MS":{"recorder":{"name":"Lauderdale County Chancery Clerk","address":"500 Constitution Ave., Meridian, MS 39301"},"assessor":{"name":"Lauderdale County Tax Assessor","address":"500 Constitution Ave., Meridian, MS 39301"}},"Lawrence County, MS":{"recorder":{"name":"Lawrence County Chancery Clerk","address":"517 E Jefferson St., Monticello, MS 39654"},"assessor":{"name":"Lawrence County Tax Assessor","address":"517 E Jefferson St., Monticello, MS 39654"}},"Leake County, MS":{"recorder":{"name":"Leake County Chancery Clerk","address":"101 E Centreville St., Carthage, MS 39051"},"assessor":{"name":"Leake County Tax Assessor","address":"101 E Centreville St., Carthage, MS 39051"}},"Lee County, MS":{"recorder":{"name":"Lee County Chancery Clerk","address":"200 Jefferson St., Tupelo, MS 38804"},"assessor":{"name":"Lee County Tax Assessor","address":"200 Jefferson St., Tupelo, MS 38804"}},"Leflore County, MS":{"recorder":{"name":"Leflore County Chancery Clerk","address":"317 W Market St., Greenwood, MS 38930"},"assessor":{"name":"Leflore County Tax Assessor","address":"317 W Market St., Greenwood, MS 38930"}},"Lincoln County, MS":{"recorder":{"name":"Lincoln County Chancery Clerk","address":"300 S 1st St., Brookhaven, MS 39601"},"assessor":{"name":"Lincoln County Tax Assessor","address":"300 S 1st St., Brookhaven, MS 39601"}},"Lowndes County, MS":{"recorder":{"name":"Lowndes County Chancery Clerk","address":"505 2nd Ave N, Columbus, MS 39701"},"assessor":{"name":"Lowndes County Tax Assessor","address":"505 2nd Ave N, Columbus, MS 39701"}},"Madison County, MS":{"recorder":{"name":"Madison County Chancery Clerk","address":"146 W Center St., Canton, MS 39046"},"assessor":{"name":"Madison County Tax Assessor","address":"146 W Center St., Canton, MS 39046"}},"Marion County, MS":{"recorder":{"name":"Marion County Chancery Clerk","address":"250 Broad St. Suite 2, Columbia, MS 39429"},"assessor":{"name":"Marion County Tax Assessor","address":"250 Broad St. Suite 2, Columbia, MS 39429"}},"Marshall County, MS":{"recorder":{"name":"Marshall County Chancery Clerk","address":"Holly Springs, MS 38635"},"assessor":{"name":"Marshall County Tax Assessor","address":"Holly Springs, MS 38635"}},"Monroe County, MS":{"recorder":{"name":"Monroe County Chancery Clerk","address":"301 S Commerce St., Aberdeen, MS 39730"},"assessor":{"name":"Monroe County Tax Assessor","address":"301 S Commerce St., Aberdeen, MS 39730"}},"Montgomery County, MS":{"recorder":{"name":"Montgomery County Chancery Clerk","address":"Winona, MS 38967"},"assessor":{"name":"Montgomery County Tax Assessor","address":"Winona, MS 38967"}},"Neshoba County, MS":{"recorder":{"name":"Neshoba County Chancery Clerk","address":"401 E Beacon St. Suite 201, Philadelphia, MS 39350"},"assessor":{"name":"Neshoba County Tax Assessor","address":"401 E Beacon St. Suite 201, Philadelphia, MS 39350"}},"Newton County, MS":{"recorder":{"name":"Newton County Chancery Clerk","address":"92 W Broad St., Decatur, MS 39327"},"assessor":{"name":"Newton County Tax Assessor","address":"92 W Broad St., Decatur, MS 39327"}},"Noxubee County, MS":{"recorder":{"name":"Noxubee County Chancery Clerk","address":"505 S Jefferson St., Macon, MS 39341"},"assessor":{"name":"Noxubee County Tax Assessor","address":"505 S Jefferson St., Macon, MS 39341"}},"Oktibbeha County, MS":{"recorder":{"name":"Oktibbeha County Chancery Clerk","address":"101 E Main St., Starkville, MS 39759"},"assessor":{"name":"Oktibbeha County Tax Assessor","address":"101 E Main St., Starkville, MS 39759"}},"Panola County, MS":{"recorder":{"name":"Panola County Chancery Clerk","address":"151 Public Square, Batesville, MS 38606"},"assessor":{"name":"Panola County Tax Assessor","address":"151 Public Square, Batesville, MS 38606"}},"Pearl River County, MS":{"recorder":{"name":"Pearl River County Chancery Clerk","address":"200 S Main St., Poplarville, MS 39470"},"assessor":{"name":"Pearl River County Tax Assessor","address":"200 S Main St., Poplarville, MS 39470"}},"Perry County, MS":{"recorder":{"name":"Perry County Chancery Clerk","address":"101 Main St., New Augusta, MS 39462"},"assessor":{"name":"Perry County Tax Assessor","address":"101 Main St., New Augusta, MS 39462"}},"Pike County, MS":{"recorder":{"name":"Pike County Chancery Clerk","address":"200 E Bay St., Magnolia, MS 39652"},"assessor":{"name":"Pike County Tax Assessor","address":"200 E Bay St., Magnolia, MS 39652"}},"Pontotoc County, MS":{"recorder":{"name":"Pontotoc County Chancery Clerk","address":"11 N Main St., Pontotoc, MS 38863"},"assessor":{"name":"Pontotoc County Tax Assessor","address":"11 N Main St., Pontotoc, MS 38863"}},"Prentiss County, MS":{"recorder":{"name":"Prentiss County Chancery Clerk","address":"101 N Main St., Booneville, MS 38829"},"assessor":{"name":"Prentiss County Tax Assessor","address":"101 N Main St., Booneville, MS 38829"}},"Quitman County, MS":{"recorder":{"name":"Quitman County Chancery Clerk","address":"230 Chestnut St., Marks, MS 38646"},"assessor":{"name":"Quitman County Tax Assessor","address":"230 Chestnut St., Marks, MS 38646"}},"Rankin County, MS":{"recorder":{"name":"Rankin County Chancery Clerk","address":"211 E Government St., Brandon, MS 39042"},"assessor":{"name":"Rankin County Tax Assessor","address":"211 E Government St., Brandon, MS 39042"}},"Scott County, MS":{"recorder":{"name":"Scott County Chancery Clerk","address":"100 E 1st St. Suite 1, Forest, MS 39074"},"assessor":{"name":"Scott County Tax Assessor","address":"100 E 1st St. Suite 1, Forest, MS 39074"}},"Sharkey County, MS":{"recorder":{"name":"Sharkey County Chancery Clerk","address":"400 Locust St., Rolling Fork, MS 39159"},"assessor":{"name":"Sharkey County Tax Assessor","address":"400 Locust St., Rolling Fork, MS 39159"}},"Simpson County, MS":{"recorder":{"name":"Simpson County Chancery Clerk","address":"109 W Pine Ave., Mendenhall, MS 39114"},"assessor":{"name":"Simpson County Tax Assessor","address":"109 W Pine Ave., Mendenhall, MS 39114"}},"Smith County, MS":{"recorder":{"name":"Smith County Chancery Clerk","address":"Box 39, Raleigh, MS 39153"},"assessor":{"name":"Smith County Tax Assessor","address":"Raleigh, MS 39153"}},"Stone County, MS":{"recorder":{"name":"Stone County Chancery Clerk","address":"323 Cavers Ave., Wiggins, MS 39577"},"assessor":{"name":"Stone County Tax Assessor","address":"323 Cavers Ave., Wiggins, MS 39577"}},"Sunflower County, MS":{"recorder":{"name":"Sunflower County Chancery Clerk","address":"200 Main St., Indianola, MS 38751"},"assessor":{"name":"Sunflower County Tax Assessor","address":"200 Main St., Indianola, MS 38751"}},"Tallahatchie County, MS":{"recorder":{"name":"Tallahatchie County Chancery Clerk","address":"1 Court Square, Charleston, MS 38921"},"assessor":{"name":"Tallahatchie County Tax Assessor","address":"1 Court Square, Charleston, MS 38921"}},"Tate County, MS":{"recorder":{"name":"Tate County Chancery Clerk","address":"201 Ward St., Senatobia, MS 38668"},"assessor":{"name":"Tate County Tax Assessor","address":"201 Ward St., Senatobia, MS 38668"}},"Tippah County, MS":{"recorder":{"name":"Tippah County Chancery Clerk","address":"101 S Court St., Ripley, MS 38663"},"assessor":{"name":"Tippah County Tax Assessor","address":"101 S Court St., Ripley, MS 38663"}},"Tishomingo County, MS":{"recorder":{"name":"Tishomingo County Chancery Clerk","address":"1008 Battleground Dr., Iuka, MS 38852"},"assessor":{"name":"Tishomingo County Tax Assessor","address":"1008 Battleground Dr., Iuka, MS 38852"}},"Tunica County, MS":{"recorder":{"name":"Tunica County Chancery Clerk","address":"1 Court Square Suite 1, Tunica, MS 38676"},"assessor":{"name":"Tunica County Tax Assessor","address":"1 Court Square Suite 1, Tunica, MS 38676"}},"Union County, MS":{"recorder":{"name":"Union County Chancery Clerk","address":"109 Main St. W, New Albany, MS 38652"},"assessor":{"name":"Union County Tax Assessor","address":"109 Main St. W, New Albany, MS 38652"}},"Walthall County, MS":{"recorder":{"name":"Walthall County Chancery Clerk","address":"200 Ball Ave., Tylertown, MS 39667"},"assessor":{"name":"Walthall County Tax Assessor","address":"200 Ball Ave., Tylertown, MS 39667"}},"Warren County, MS":{"recorder":{"name":"Warren County Chancery Clerk","address":"1009 Cherry St., Vicksburg, MS 39183"},"assessor":{"name":"Warren County Tax Assessor","address":"1009 Cherry St., Vicksburg, MS 39183"}},"Washington County, MS":{"recorder":{"name":"Washington County Chancery Clerk","address":"300 Main St., Greenville, MS 38701"},"assessor":{"name":"Washington County Tax Assessor","address":"300 Main St., Greenville, MS 38701"}},"Wayne County, MS":{"recorder":{"name":"Wayne County Chancery Clerk","address":"609 Azalea Dr., Waynesboro, MS 39367"},"assessor":{"name":"Wayne County Tax Assessor","address":"609 Azalea Dr., Waynesboro, MS 39367"}},"Webster County, MS":{"recorder":{"name":"Webster County Chancery Clerk","address":"1 Court Square Suite A, Walthall, MS 39771"},"assessor":{"name":"Webster County Tax Assessor","address":"1 Court Square Suite A, Walthall, MS 39771"}},"Wilkinson County, MS":{"recorder":{"name":"Wilkinson County Chancery Clerk","address":"525 Main St., Woodville, MS 39669"},"assessor":{"name":"Wilkinson County Tax Assessor","address":"525 Main St., Woodville, MS 39669"}},"Winston County, MS":{"recorder":{"name":"Winston County Chancery Clerk","address":"Main St., Louisville, MS 39339"},"assessor":{"name":"Winston County Tax Assessor","address":"Main St., Louisville, MS 39339"}},"Yalobusha County, MS":{"recorder":{"name":"Yalobusha County Chancery Clerk","address":"Coffeeville, MS 38922"},"assessor":{"name":"Yalobusha County Tax Assessor","address":"Coffeeville, MS 38922"}},"Yazoo County, MS":{"recorder":{"name":"Yazoo County Chancery Clerk","address":"211 E Broadway St., Yazoo City, MS 39194"},"assessor":{"name":"Yazoo County Tax Assessor","address":"211 E Broadway St., Yazoo City, MS 39194"}},"Beaverhead County, MT":{"recorder":{"name":"Beaverhead County Clerk & Recorder","address":"2 S Pacific St., Dillon, MT 59725"},"assessor":{"name":"MT Dept. of Revenue - Beaverhead County","address":"2 S Pacific St., Dillon, MT 59725"}},"Big Horn County, MT":{"recorder":{"name":"Big Horn County Clerk & Recorder","address":"121 W 3rd St., Hardin, MT 59034"},"assessor":{"name":"MT Dept. of Revenue - Big Horn County","address":"121 W 3rd St., Hardin, MT 59034"}},"Blaine County, MT":{"recorder":{"name":"Blaine County Clerk & Recorder","address":"400 Ohio St., Chinook, MT 59523"},"assessor":{"name":"MT Dept. of Revenue - Blaine County","address":"400 Ohio St., Chinook, MT 59523"}},"Broadwater County, MT":{"recorder":{"name":"Broadwater County Clerk & Recorder","address":"515 Broadway St., Townsend, MT 59644"},"assessor":{"name":"MT Dept. of Revenue - Broadwater County","address":"515 Broadway St., Townsend, MT 59644"}},"Carbon County, MT":{"recorder":{"name":"Carbon County Clerk & Recorder","address":"17 W 11th St., Red Lodge, MT 59068"},"assessor":{"name":"MT Dept. of Revenue - Carbon County","address":"17 W 11th St., Red Lodge, MT 59068"}},"Carter County, MT":{"recorder":{"name":"Carter County Clerk & Recorder","address":"214 Park St., Ekalaka, MT 59324"},"assessor":{"name":"MT Dept. of Revenue - Carter County","address":"214 Park St., Ekalaka, MT 59324"}},"Cascade County, MT":{"recorder":{"name":"Cascade County Clerk & Recorder","address":"325 2nd Ave N, Great Falls, MT 59401"},"assessor":{"name":"MT Dept. of Revenue - Cascade County","address":"400 Central Ave Suite 125, Great Falls, MT 59401"}},"Chouteau County, MT":{"recorder":{"name":"Chouteau County Clerk & Recorder","address":"1308 Franklin St., Fort Benton, MT 59442"},"assessor":{"name":"MT Dept. of Revenue - Chouteau County","address":"1308 Franklin St., Fort Benton, MT 59442"}},"Custer County, MT":{"recorder":{"name":"Custer County Clerk & Recorder","address":"1010 Main St., Miles City, MT 59301"},"assessor":{"name":"MT Dept. of Revenue - Custer County","address":"1010 Main St., Miles City, MT 59301"}},"Daniels County, MT":{"recorder":{"name":"Daniels County Clerk & Recorder","address":"213 Main St., Scobey, MT 59263"},"assessor":{"name":"MT Dept. of Revenue - Daniels County","address":"213 Main St., Scobey, MT 59263"}},"Dawson County, MT":{"recorder":{"name":"Dawson County Clerk & Recorder","address":"207 W Bell St., Glendive, MT 59330"},"assessor":{"name":"MT Dept. of Revenue - Dawson County","address":"207 W Bell St., Glendive, MT 59330"}},"Deer Lodge County, MT":{"recorder":{"name":"Deer Lodge County Clerk & Recorder","address":"800 S Main St., Anaconda, MT 59711"},"assessor":{"name":"MT Dept. of Revenue - Deer Lodge County","address":"800 S Main St., Anaconda, MT 59711"}},"Fallon County, MT":{"recorder":{"name":"Fallon County Clerk & Recorder","address":"10 W Fallon Ave., Baker, MT 59313"},"assessor":{"name":"MT Dept. of Revenue - Fallon County","address":"10 W Fallon Ave., Baker, MT 59313"}},"Fergus County, MT":{"recorder":{"name":"Fergus County Clerk & Recorder","address":"712 W Main St., Lewistown, MT 59457"},"assessor":{"name":"MT Dept. of Revenue - Fergus County","address":"712 W Main St., Lewistown, MT 59457"}},"Flathead County, MT":{"recorder":{"name":"Flathead County Clerk & Recorder","address":"800 S Main St., Kalispell, MT 59901"},"assessor":{"name":"MT Dept. of Revenue - Flathead County","address":"100 Financial Dr. Suite 110, Kalispell, MT 59901"}},"Gallatin County, MT":{"recorder":{"name":"Gallatin County Clerk & Recorder","address":"311 W Main St. Room 203, Bozeman, MT 59715"},"assessor":{"name":"MT Dept. of Revenue - Gallatin County","address":"2273 Bootlegger Trail, Bozeman, MT 59715"}},"Garfield County, MT":{"recorder":{"name":"Garfield County Clerk & Recorder","address":"507 Main St., Jordan, MT 59337"},"assessor":{"name":"MT Dept. of Revenue - Garfield County","address":"507 Main St., Jordan, MT 59337"}},"Glacier County, MT":{"recorder":{"name":"Glacier County Clerk & Recorder","address":"512 E Main St., Cut Bank, MT 59427"},"assessor":{"name":"MT Dept. of Revenue - Glacier County","address":"512 E Main St., Cut Bank, MT 59427"}},"Golden Valley County, MT":{"recorder":{"name":"Golden Valley County Clerk & Recorder","address":"107 Kemp St., Ryegate, MT 59074"},"assessor":{"name":"MT Dept. of Revenue - Golden Valley County","address":"107 Kemp St., Ryegate, MT 59074"}},"Granite County, MT":{"recorder":{"name":"Granite County Clerk & Recorder","address":"220 N Sansome St., Philipsburg, MT 59858"},"assessor":{"name":"MT Dept. of Revenue - Granite County","address":"220 N Sansome St., Philipsburg, MT 59858"}},"Hill County, MT":{"recorder":{"name":"Hill County Clerk & Recorder","address":"315 4th St., Havre, MT 59501"},"assessor":{"name":"MT Dept. of Revenue - Hill County","address":"315 4th St., Havre, MT 59501"}},"Jefferson County, MT":{"recorder":{"name":"Jefferson County Clerk & Recorder","address":"201 Centennial St., Boulder, MT 59632"},"assessor":{"name":"MT Dept. of Revenue - Jefferson County","address":"201 Centennial St., Boulder, MT 59632"}},"Judith Basin County, MT":{"recorder":{"name":"Judith Basin County Clerk & Recorder","address":"11 3rd St N, Stanford, MT 59479"},"assessor":{"name":"MT Dept. of Revenue - Judith Basin County","address":"11 3rd St N, Stanford, MT 59479"}},"Lake County, MT":{"recorder":{"name":"Lake County Clerk & Recorder","address":"106 4th Ave E, Polson, MT 59860"},"assessor":{"name":"MT Dept. of Revenue - Lake County","address":"106 4th Ave E, Polson, MT 59860"}},"Lewis and Clark County, MT":{"recorder":{"name":"Lewis and Clark County Clerk & Recorder","address":"316 N Park Ave., Helena, MT 59601"},"assessor":{"name":"MT Dept. of Revenue - Lewis and Clark County","address":"340 N Last Chance Gulch Suite 2A, Helena, MT 59601"}},"Liberty County, MT":{"recorder":{"name":"Liberty County Clerk & Recorder","address":"111 1st St E, Chester, MT 59522"},"assessor":{"name":"MT Dept. of Revenue - Liberty County","address":"111 1st St E, Chester, MT 59522"}},"Lincoln County, MT":{"recorder":{"name":"Lincoln County Clerk & Recorder","address":"512 California Ave., Libby, MT 59923"},"assessor":{"name":"MT Dept. of Revenue - Lincoln County","address":"512 California Ave., Libby, MT 59923"}},"Madison County, MT":{"recorder":{"name":"Madison County Clerk & Recorder","address":"110 W Wallace St., Virginia City, MT 59755"},"assessor":{"name":"MT Dept. of Revenue - Madison County","address":"110 W Wallace St., Virginia City, MT 59755"}},"McCone County, MT":{"recorder":{"name":"McCone County Clerk & Recorder","address":"1004 C Ave., Circle, MT 59215"},"assessor":{"name":"MT Dept. of Revenue - McCone County","address":"1004 C Ave., Circle, MT 59215"}},"Meagher County, MT":{"recorder":{"name":"Meagher County Clerk & Recorder","address":"15 W Main St., White Sulphur Springs, MT 59645"},"assessor":{"name":"MT Dept. of Revenue - Meagher County","address":"15 W Main St., White Sulphur Springs, MT 59645"}},"Mineral County, MT":{"recorder":{"name":"Mineral County Clerk & Recorder","address":"300 River St., Superior, MT 59872"},"assessor":{"name":"MT Dept. of Revenue - Mineral County","address":"300 River St., Superior, MT 59872"}},"Missoula County, MT":{"recorder":{"name":"Missoula County Clerk & Recorder","address":"200 W Broadway St., Missoula, MT 59802"},"assessor":{"name":"MT Dept. of Revenue - Missoula County","address":"3100 N Reserve St. Suite A, Missoula, MT 59808"}},"Musselshell County, MT":{"recorder":{"name":"Musselshell County Clerk & Recorder","address":"506 Main St., Roundup, MT 59072"},"assessor":{"name":"MT Dept. of Revenue - Musselshell County","address":"506 Main St., Roundup, MT 59072"}},"Park County, MT":{"recorder":{"name":"Park County Clerk & Recorder","address":"414 E Callender St., Livingston, MT 59047"},"assessor":{"name":"MT Dept. of Revenue - Park County","address":"414 E Callender St., Livingston, MT 59047"}},"Petroleum County, MT":{"recorder":{"name":"Petroleum County Clerk & Recorder","address":"201 E Main St., Winnett, MT 59087"},"assessor":{"name":"MT Dept. of Revenue - Petroleum County","address":"201 E Main St., Winnett, MT 59087"}},"Phillips County, MT":{"recorder":{"name":"Phillips County Clerk & Recorder","address":"314 S 2nd Ave W, Malta, MT 59538"},"assessor":{"name":"MT Dept. of Revenue - Phillips County","address":"314 S 2nd Ave W, Malta, MT 59538"}},"Pondera County, MT":{"recorder":{"name":"Pondera County Clerk & Recorder","address":"20 4th Ave SW, Conrad, MT 59425"},"assessor":{"name":"MT Dept. of Revenue - Pondera County","address":"20 4th Ave SW, Conrad, MT 59425"}},"Powder River County, MT":{"recorder":{"name":"Powder River County Clerk & Recorder","address":"119 Centre Ave., Broadus, MT 59317"},"assessor":{"name":"MT Dept. of Revenue - Powder River County","address":"119 Centre Ave., Broadus, MT 59317"}},"Powell County, MT":{"recorder":{"name":"Powell County Clerk & Recorder","address":"409 Missouri Ave., Deer Lodge, MT 59722"},"assessor":{"name":"MT Dept. of Revenue - Powell County","address":"409 Missouri Ave., Deer Lodge, MT 59722"}},"Prairie County, MT":{"recorder":{"name":"Prairie County Clerk & Recorder","address":"217 W Park St., Terry, MT 59349"},"assessor":{"name":"MT Dept. of Revenue - Prairie County","address":"217 W Park St., Terry, MT 59349"}},"Ravalli County, MT":{"recorder":{"name":"Ravalli County Clerk & Recorder","address":"215 S 4th St. Suite A, Hamilton, MT 59840"},"assessor":{"name":"MT Dept. of Revenue - Ravalli County","address":"225 Bedford St. Suite D, Hamilton, MT 59840"}},"Richland County, MT":{"recorder":{"name":"Richland County Clerk & Recorder","address":"201 W Main St., Sidney, MT 59270"},"assessor":{"name":"MT Dept. of Revenue - Richland County","address":"201 W Main St., Sidney, MT 59270"}},"Roosevelt County, MT":{"recorder":{"name":"Roosevelt County Clerk & Recorder","address":"400 2nd Ave S, Wolf Point, MT 59201"},"assessor":{"name":"MT Dept. of Revenue - Roosevelt County","address":"400 2nd Ave S, Wolf Point, MT 59201"}},"Rosebud County, MT":{"recorder":{"name":"Rosebud County Clerk & Recorder","address":"1 S Main St., Forsyth, MT 59327"},"assessor":{"name":"MT Dept. of Revenue - Rosebud County","address":"1 S Main St., Forsyth, MT 59327"}},"Sanders County, MT":{"recorder":{"name":"Sanders County Clerk & Recorder","address":"1111 Main St., Thompson Falls, MT 59873"},"assessor":{"name":"MT Dept. of Revenue - Sanders County","address":"1111 Main St., Thompson Falls, MT 59873"}},"Sheridan County, MT":{"recorder":{"name":"Sheridan County Clerk & Recorder","address":"100 W Laurel Ave., Plentywood, MT 59254"},"assessor":{"name":"MT Dept. of Revenue - Sheridan County","address":"100 W Laurel Ave., Plentywood, MT 59254"}},"Silver Bow County, MT":{"recorder":{"name":"Silver Bow County Clerk & Recorder","address":"155 W Granite St., Butte, MT 59701"},"assessor":{"name":"MT Dept. of Revenue - Silver Bow County","address":"155 W Granite St., Butte, MT 59701"}},"Stillwater County, MT":{"recorder":{"name":"Stillwater County Clerk & Recorder","address":"400 E 3rd Ave N, Columbus, MT 59019"},"assessor":{"name":"MT Dept. of Revenue - Stillwater County","address":"400 E 3rd Ave N, Columbus, MT 59019"}},"Sweet Grass County, MT":{"recorder":{"name":"Sweet Grass County Clerk & Recorder","address":"1 American Legion St., Big Timber, MT 59011"},"assessor":{"name":"MT Dept. of Revenue - Sweet Grass County","address":"1 American Legion St., Big Timber, MT 59011"}},"Teton County, MT":{"recorder":{"name":"Teton County Clerk & Recorder","address":"1 Main Ave N, Choteau, MT 59422"},"assessor":{"name":"MT Dept. of Revenue - Teton County","address":"1 Main Ave N, Choteau, MT 59422"}},"Toole County, MT":{"recorder":{"name":"Toole County Clerk & Recorder","address":"226 1st St S, Shelby, MT 59474"},"assessor":{"name":"MT Dept. of Revenue - Toole County","address":"226 1st St S, Shelby, MT 59474"}},"Treasure County, MT":{"recorder":{"name":"Treasure County Clerk & Recorder","address":"307 Rapelje Ave., Hysham, MT 59038"},"assessor":{"name":"MT Dept. of Revenue - Treasure County","address":"307 Rapelje Ave., Hysham, MT 59038"}},"Valley County, MT":{"recorder":{"name":"Valley County Clerk & Recorder","address":"501 Court Square, Glasgow, MT 59230"},"assessor":{"name":"MT Dept. of Revenue - Valley County","address":"501 Court Square, Glasgow, MT 59230"}},"Wheatland County, MT":{"recorder":{"name":"Wheatland County Clerk & Recorder","address":"201 A Ave NW, Harlowton, MT 59036"},"assessor":{"name":"MT Dept. of Revenue - Wheatland County","address":"201 A Ave NW, Harlowton, MT 59036"}},"Wibaux County, MT":{"recorder":{"name":"Wibaux County Clerk & Recorder","address":"200 S Wibaux St., Wibaux, MT 59353"},"assessor":{"name":"MT Dept. of Revenue - Wibaux County","address":"200 S Wibaux St., Wibaux, MT 59353"}},"Yellowstone County, MT":{"recorder":{"name":"Yellowstone County Clerk & Recorder","address":"217 N 27th St., Billings, MT 59101"},"assessor":{"name":"MT Dept. of Revenue - Yellowstone County","address":"1111 Main St. Suite 300, Billings, MT 59105"}},"Alamance County, NC":{"recorder":{"name":"Alamance County Register of Deeds","address":"124 W Elm St., Graham, NC 27253"},"assessor":{"name":"Alamance County Tax Assessor","address":"124 W Elm St., Graham, NC 27253"}},"Alexander County, NC":{"recorder":{"name":"Alexander County Register of Deeds","address":"77 1st St. SW Suite 6, Taylorsville, NC 28681"},"assessor":{"name":"Alexander County Tax Assessor","address":"77 1st St. SW Suite 6, Taylorsville, NC 28681"}},"Alleghany County, NC":{"recorder":{"name":"Alleghany County Register of Deeds","address":"12 N Main St. Suite 4, Sparta, NC 28675"},"assessor":{"name":"Alleghany County Tax Assessor","address":"12 N Main St. Suite 4, Sparta, NC 28675"}},"Anson County, NC":{"recorder":{"name":"Anson County Register of Deeds","address":"101 S Greene St. Suite 30, Wadesboro, NC 28170"},"assessor":{"name":"Anson County Tax Assessor","address":"101 S Greene St. Suite 30, Wadesboro, NC 28170"}},"Ashe County, NC":{"recorder":{"name":"Ashe County Register of Deeds","address":"150 Government Circle Suite 2300, Jefferson, NC 28640"},"assessor":{"name":"Ashe County Tax Assessor","address":"150 Government Circle Suite 2300, Jefferson, NC 28640"}},"Avery County, NC":{"recorder":{"name":"Avery County Register of Deeds","address":"200 Montezuma St., Newland, NC 28657"},"assessor":{"name":"Avery County Tax Assessor","address":"200 Montezuma St., Newland, NC 28657"}},"Beaufort County, NC":{"recorder":{"name":"Beaufort County Register of Deeds","address":"112 W 2nd St., Washington, NC 27889"},"assessor":{"name":"Beaufort County Tax Assessor","address":"112 W 2nd St., Washington, NC 27889"}},"Bertie County, NC":{"recorder":{"name":"Bertie County Register of Deeds","address":"106 Dundee St., Windsor, NC 27983"},"assessor":{"name":"Bertie County Tax Assessor","address":"106 Dundee St., Windsor, NC 27983"}},"Bladen County, NC":{"recorder":{"name":"Bladen County Register of Deeds","address":"106 E Broad St., Elizabethtown, NC 28337"},"assessor":{"name":"Bladen County Tax Assessor","address":"106 E Broad St., Elizabethtown, NC 28337"}},"Brunswick County, NC":{"recorder":{"name":"Brunswick County Register of Deeds","address":"75 Courthouse Dr. Suite 130, Bolivia, NC 28422"},"assessor":{"name":"Brunswick County Tax Assessor","address":"75 Courthouse Dr. Suite 130, Bolivia, NC 28422"}},"Buncombe County, NC":{"recorder":{"name":"Buncombe County Register of Deeds","address":"205 College St., Asheville, NC 28801"},"assessor":{"name":"Buncombe County Tax Assessor","address":"94 Coxe Ave., Asheville, NC 28801"}},"Burke County, NC":{"recorder":{"name":"Burke County Register of Deeds","address":"201 S Green St., Morganton, NC 28655"},"assessor":{"name":"Burke County Tax Assessor","address":"201 S Green St., Morganton, NC 28655"}},"Cabarrus County, NC":{"recorder":{"name":"Cabarrus County Register of Deeds","address":"65 Church St. SE, Concord, NC 28025"},"assessor":{"name":"Cabarrus County Tax Assessor","address":"65 Church St. SE, Concord, NC 28025"}},"Caldwell County, NC":{"recorder":{"name":"Caldwell County Register of Deeds","address":"905 W Ave. NW, Lenoir, NC 28645"},"assessor":{"name":"Caldwell County Tax Assessor","address":"905 W Ave. NW, Lenoir, NC 28645"}},"Camden County, NC":{"recorder":{"name":"Camden County Register of Deeds","address":"117 NC-343, Camden, NC 27921"},"assessor":{"name":"Camden County Tax Assessor","address":"117 NC-343, Camden, NC 27921"}},"Carteret County, NC":{"recorder":{"name":"Carteret County Register of Deeds","address":"302 Courthouse Square, Beaufort, NC 28516"},"assessor":{"name":"Carteret County Tax Assessor","address":"302 Courthouse Square, Beaufort, NC 28516"}},"Caswell County, NC":{"recorder":{"name":"Caswell County Register of Deeds","address":"144 Court Square, Yanceyville, NC 27379"},"assessor":{"name":"Caswell County Tax Assessor","address":"144 Court Square, Yanceyville, NC 27379"}},"Catawba County, NC":{"recorder":{"name":"Catawba County Register of Deeds","address":"100 SW Blvd. Suite 100, Newton, NC 28658"},"assessor":{"name":"Catawba County Tax Assessor","address":"100 SW Blvd. Suite 100, Newton, NC 28658"}},"Chatham County, NC":{"recorder":{"name":"Chatham County Register of Deeds","address":"12 E St., Pittsboro, NC 27312"},"assessor":{"name":"Chatham County Tax Assessor","address":"12 E St., Pittsboro, NC 27312"}},"Cherokee County, NC":{"recorder":{"name":"Cherokee County Register of Deeds","address":"75 Peachtree St. Suite 112, Murphy, NC 28906"},"assessor":{"name":"Cherokee County Tax Assessor","address":"75 Peachtree St. Suite 112, Murphy, NC 28906"}},"Chowan County, NC":{"recorder":{"name":"Chowan County Register of Deeds","address":"305 King St. Suite 1, Edenton, NC 27932"},"assessor":{"name":"Chowan County Tax Assessor","address":"305 King St. Suite 1, Edenton, NC 27932"}},"Clay County, NC":{"recorder":{"name":"Clay County Register of Deeds","address":"261 Courthouse Dr. Suite 10, Hayesville, NC 28904"},"assessor":{"name":"Clay County Tax Assessor","address":"261 Courthouse Dr. Suite 10, Hayesville, NC 28904"}},"Cleveland County, NC":{"recorder":{"name":"Cleveland County Register of Deeds","address":"311 E Marion St., Shelby, NC 28150"},"assessor":{"name":"Cleveland County Tax Assessor","address":"311 E Marion St., Shelby, NC 28150"}},"Columbus County, NC":{"recorder":{"name":"Columbus County Register of Deeds","address":"111 Washington St., Whiteville, NC 28472"},"assessor":{"name":"Columbus County Tax Assessor","address":"111 Washington St., Whiteville, NC 28472"}},"Craven County, NC":{"recorder":{"name":"Craven County Register of Deeds","address":"302 Broad St., New Bern, NC 28560"},"assessor":{"name":"Craven County Tax Assessor","address":"226 Middle St. Suite 121, New Bern, NC 28560"}},"Cumberland County, NC":{"recorder":{"name":"Cumberland County Register of Deeds","address":"117 Dick St., Fayetteville, NC 28301"},"assessor":{"name":"Cumberland County Tax Assessor","address":"117 Dick St., Fayetteville, NC 28301"}},"Currituck County, NC":{"recorder":{"name":"Currituck County Register of Deeds","address":"153 Courthouse Rd. Suite 101, Currituck, NC 27929"},"assessor":{"name":"Currituck County Tax Assessor","address":"153 Courthouse Rd. Suite 101, Currituck, NC 27929"}},"Dare County, NC":{"recorder":{"name":"Dare County Register of Deeds","address":"954 Marshall C Collins Dr., Manteo, NC 27954"},"assessor":{"name":"Dare County Tax Assessor","address":"954 Marshall C Collins Dr., Manteo, NC 27954"}},"Davidson County, NC":{"recorder":{"name":"Davidson County Register of Deeds","address":"913 Greensboro St., Lexington, NC 27292"},"assessor":{"name":"Davidson County Tax Assessor","address":"913 Greensboro St., Lexington, NC 27292"}},"Davie County, NC":{"recorder":{"name":"Davie County Register of Deeds","address":"123 S Main St., Mocksville, NC 27028"},"assessor":{"name":"Davie County Tax Assessor","address":"123 S Main St., Mocksville, NC 27028"}},"Duplin County, NC":{"recorder":{"name":"Duplin County Register of Deeds","address":"224 Seminary St., Kenansville, NC 28349"},"assessor":{"name":"Duplin County Tax Assessor","address":"224 Seminary St., Kenansville, NC 28349"}},"Durham County, NC":{"recorder":{"name":"Durham County Register of Deeds","address":"201 E Main St. 2nd Floor, Durham, NC 27701"},"assessor":{"name":"Durham County Tax Assessor","address":"201 E Main St. 3rd Floor, Durham, NC 27701"}},"Edgecombe County, NC":{"recorder":{"name":"Edgecombe County Register of Deeds","address":"301 St. Andrew St., Tarboro, NC 27886"},"assessor":{"name":"Edgecombe County Tax Assessor","address":"301 St. Andrew St., Tarboro, NC 27886"}},"Forsyth County, NC":{"recorder":{"name":"Forsyth County Register of Deeds","address":"201 N Chestnut St., Winston-Salem, NC 27101"},"assessor":{"name":"Forsyth County Tax Assessor","address":"201 N Chestnut St., Winston-Salem, NC 27101"}},"Franklin County, NC":{"recorder":{"name":"Franklin County Register of Deeds","address":"113 Market St. Suite 101, Louisburg, NC 27549"},"assessor":{"name":"Franklin County Tax Assessor","address":"113 Market St. Suite 101, Louisburg, NC 27549"}},"Gaston County, NC":{"recorder":{"name":"Gaston County Register of Deeds","address":"325 N Marietta St., Gastonia, NC 28052"},"assessor":{"name":"Gaston County Tax Assessor","address":"128 W Main Ave., Gastonia, NC 28052"}},"Gates County, NC":{"recorder":{"name":"Gates County Register of Deeds","address":"123 Court St., Gatesville, NC 27938"},"assessor":{"name":"Gates County Tax Assessor","address":"123 Court St., Gatesville, NC 27938"}},"Graham County, NC":{"recorder":{"name":"Graham County Register of Deeds","address":"12 N Main St., Robbinsville, NC 28771"},"assessor":{"name":"Graham County Tax Assessor","address":"12 N Main St., Robbinsville, NC 28771"}},"Granville County, NC":{"recorder":{"name":"Granville County Register of Deeds","address":"101 Main St. Suite 103, Oxford, NC 27565"},"assessor":{"name":"Granville County Tax Assessor","address":"101 Main St. Suite 103, Oxford, NC 27565"}},"Greene County, NC":{"recorder":{"name":"Greene County Register of Deeds","address":"229 Kingold Blvd. Suite A, Snow Hill, NC 28580"},"assessor":{"name":"Greene County Tax Assessor","address":"229 Kingold Blvd. Suite A, Snow Hill, NC 28580"}},"Guilford County, NC":{"recorder":{"name":"Guilford County Register of Deeds","address":"201 W Market St., Greensboro, NC 27401"},"assessor":{"name":"Guilford County Tax Assessor","address":"400 W Market St. Suite 100, Greensboro, NC 27401"}},"Halifax County, NC":{"recorder":{"name":"Halifax County Register of Deeds","address":"357 Ferrell Ln., Halifax, NC 27839"},"assessor":{"name":"Halifax County Tax Assessor","address":"357 Ferrell Ln., Halifax, NC 27839"}},"Harnett County, NC":{"recorder":{"name":"Harnett County Register of Deeds","address":"305 W Cornelius Harnett Blvd. Suite 100, Lillington, NC 27546"},"assessor":{"name":"Harnett County Tax Assessor","address":"305 W Cornelius Harnett Blvd. Suite 100, Lillington, NC 27546"}},"Haywood County, NC":{"recorder":{"name":"Haywood County Register of Deeds","address":"215 N Main St., Waynesville, NC 28786"},"assessor":{"name":"Haywood County Tax Assessor","address":"215 N Main St., Waynesville, NC 28786"}},"Henderson County, NC":{"recorder":{"name":"Henderson County Register of Deeds","address":"200 N Grove St. Suite 129, Hendersonville, NC 28792"},"assessor":{"name":"Henderson County Tax Assessor","address":"200 N Grove St. Suite 129, Hendersonville, NC 28792"}},"Hertford County, NC":{"recorder":{"name":"Hertford County Register of Deeds","address":"301 N Washington St. Suite 110, Winton, NC 27986"},"assessor":{"name":"Hertford County Tax Assessor","address":"301 N Washington St. Suite 110, Winton, NC 27986"}},"Hoke County, NC":{"recorder":{"name":"Hoke County Register of Deeds","address":"304 N Main St., Raeford, NC 28376"},"assessor":{"name":"Hoke County Tax Assessor","address":"304 N Main St., Raeford, NC 28376"}},"Hyde County, NC":{"recorder":{"name":"Hyde County Register of Deeds","address":"30 Oyster Creek Rd., Swan Quarter, NC 27885"},"assessor":{"name":"Hyde County Tax Assessor","address":"30 Oyster Creek Rd., Swan Quarter, NC 27885"}},"Iredell County, NC":{"recorder":{"name":"Iredell County Register of Deeds","address":"203 Stockton St., Statesville, NC 28677"},"assessor":{"name":"Iredell County Tax Assessor","address":"203 Stockton St., Statesville, NC 28677"}},"Jackson County, NC":{"recorder":{"name":"Jackson County Register of Deeds","address":"401 Grindstaff Cove Rd. Suite A-140, Sylva, NC 28779"},"assessor":{"name":"Jackson County Tax Assessor","address":"401 Grindstaff Cove Rd. Suite A-140, Sylva, NC 28779"}},"Johnston County, NC":{"recorder":{"name":"Johnston County Register of Deeds","address":"207 E Johnston St., Smithfield, NC 27577"},"assessor":{"name":"Johnston County Tax Assessor","address":"207 E Johnston St., Smithfield, NC 27577"}},"Jones County, NC":{"recorder":{"name":"Jones County Register of Deeds","address":"101 Market St., Trenton, NC 28585"},"assessor":{"name":"Jones County Tax Assessor","address":"101 Market St., Trenton, NC 28585"}},"Lee County, NC":{"recorder":{"name":"Lee County Register of Deeds","address":"105 Courthouse Square, Sanford, NC 27330"},"assessor":{"name":"Lee County Tax Assessor","address":"105 Courthouse Square, Sanford, NC 27330"}},"Lenoir County, NC":{"recorder":{"name":"Lenoir County Register of Deeds","address":"130 S Queen St., Kinston, NC 28501"},"assessor":{"name":"Lenoir County Tax Assessor","address":"130 S Queen St., Kinston, NC 28501"}},"Lincoln County, NC":{"recorder":{"name":"Lincoln County Register of Deeds","address":"302 N Academy St. Suite 100, Lincolnton, NC 28092"},"assessor":{"name":"Lincoln County Tax Assessor","address":"302 N Academy St. Suite 100, Lincolnton, NC 28092"}},"Macon County, NC":{"recorder":{"name":"Macon County Register of Deeds","address":"5 W Main St., Franklin, NC 28734"},"assessor":{"name":"Macon County Tax Assessor","address":"5 W Main St., Franklin, NC 28734"}},"Madison County, NC":{"recorder":{"name":"Madison County Register of Deeds","address":"2 N Main St. Suite 209, Marshall, NC 28753"},"assessor":{"name":"Madison County Tax Assessor","address":"2 N Main St. Suite 209, Marshall, NC 28753"}},"Martin County, NC":{"recorder":{"name":"Martin County Register of Deeds","address":"305 E Main St., Williamston, NC 27892"},"assessor":{"name":"Martin County Tax Assessor","address":"305 E Main St., Williamston, NC 27892"}},"McDowell County, NC":{"recorder":{"name":"McDowell County Register of Deeds","address":"1 S Main St. Suite 119, Marion, NC 28752"},"assessor":{"name":"McDowell County Tax Assessor","address":"1 S Main St. Suite 119, Marion, NC 28752"}},"Mecklenburg County, NC":{"recorder":{"name":"Mecklenburg County Register of Deeds","address":"720 E 4th St., Charlotte, NC 28202"},"assessor":{"name":"Mecklenburg County Tax Assessor","address":"700 E Stonewall St., Charlotte, NC 28202"}},"Mitchell County, NC":{"recorder":{"name":"Mitchell County Register of Deeds","address":"11 Crimson Laurel Circle Suite 1, Bakersville, NC 28705"},"assessor":{"name":"Mitchell County Tax Assessor","address":"11 Crimson Laurel Circle Suite 1, Bakersville, NC 28705"}},"Montgomery County, NC":{"recorder":{"name":"Montgomery County Register of Deeds","address":"102 E Spring St. Suite 203, Troy, NC 27371"},"assessor":{"name":"Montgomery County Tax Assessor","address":"102 E Spring St. Suite 203, Troy, NC 27371"}},"Moore County, NC":{"recorder":{"name":"Moore County Register of Deeds","address":"1 Courthouse Square Suite 1, Carthage, NC 28327"},"assessor":{"name":"Moore County Tax Assessor","address":"1 Courthouse Square Suite 1, Carthage, NC 28327"}},"Nash County, NC":{"recorder":{"name":"Nash County Register of Deeds","address":"120 W Washington St. Suite 6010, Nashville, NC 27856"},"assessor":{"name":"Nash County Tax Assessor","address":"120 W Washington St. Suite 6010, Nashville, NC 27856"}},"New Hanover County, NC":{"recorder":{"name":"New Hanover County Register of Deeds","address":"216 N 2nd St., Wilmington, NC 28401"},"assessor":{"name":"New Hanover County Tax Assessor","address":"230 Government Center Dr. Suite 190, Wilmington, NC 28403"}},"Northampton County, NC":{"recorder":{"name":"Northampton County Register of Deeds","address":"211 N Piedmont Ave. Suite A, Jackson, NC 27845"},"assessor":{"name":"Northampton County Tax Assessor","address":"211 N Piedmont Ave. Suite A, Jackson, NC 27845"}},"Onslow County, NC":{"recorder":{"name":"Onslow County Register of Deeds","address":"109 Old Bridge St. Suite 101, Jacksonville, NC 28540"},"assessor":{"name":"Onslow County Tax Assessor","address":"234 NW Corridor Blvd., Jacksonville, NC 28540"}},"Orange County, NC":{"recorder":{"name":"Orange County Register of Deeds","address":"228 S Churton St. Suite 200, Hillsborough, NC 27278"},"assessor":{"name":"Orange County Tax Assessor","address":"228 S Churton St. Suite 200, Hillsborough, NC 27278"}},"Pamlico County, NC":{"recorder":{"name":"Pamlico County Register of Deeds","address":"202 Main St., Bayboro, NC 28515"},"assessor":{"name":"Pamlico County Tax Assessor","address":"202 Main St., Bayboro, NC 28515"}},"Pasquotank County, NC":{"recorder":{"name":"Pasquotank County Register of Deeds","address":"206 E Main St., Elizabeth City, NC 27909"},"assessor":{"name":"Pasquotank County Tax Assessor","address":"206 E Main St., Elizabeth City, NC 27909"}},"Pender County, NC":{"recorder":{"name":"Pender County Register of Deeds","address":"300 E Fremont St., Burgaw, NC 28425"},"assessor":{"name":"Pender County Tax Assessor","address":"300 E Fremont St., Burgaw, NC 28425"}},"Perquimans County, NC":{"recorder":{"name":"Perquimans County Register of Deeds","address":"128 N Church St., Hertford, NC 27944"},"assessor":{"name":"Perquimans County Tax Assessor","address":"128 N Church St., Hertford, NC 27944"}},"Person County, NC":{"recorder":{"name":"Person County Register of Deeds","address":"105 S Main St. Suite 106, Roxboro, NC 27573"},"assessor":{"name":"Person County Tax Assessor","address":"105 S Main St. Suite 106, Roxboro, NC 27573"}},"Pitt County, NC":{"recorder":{"name":"Pitt County Register of Deeds","address":"1717 W 5th St., Greenville, NC 27834"},"assessor":{"name":"Pitt County Tax Assessor","address":"111 S Washington St., Greenville, NC 27834"}},"Polk County, NC":{"recorder":{"name":"Polk County Register of Deeds","address":"40 Courthouse St. Suite 1, Columbus, NC 28722"},"assessor":{"name":"Polk County Tax Assessor","address":"40 Courthouse St. Suite 1, Columbus, NC 28722"}},"Randolph County, NC":{"recorder":{"name":"Randolph County Register of Deeds","address":"725 McDowell Rd., Asheboro, NC 27205"},"assessor":{"name":"Randolph County Tax Assessor","address":"725 McDowell Rd., Asheboro, NC 27205"}},"Richmond County, NC":{"recorder":{"name":"Richmond County Register of Deeds","address":"114 E Franklin St. Suite 205, Rockingham, NC 28379"},"assessor":{"name":"Richmond County Tax Assessor","address":"114 E Franklin St. Suite 205, Rockingham, NC 28379"}},"Robeson County, NC":{"recorder":{"name":"Robeson County Register of Deeds","address":"500 N Elm St., Lumberton, NC 28358"},"assessor":{"name":"Robeson County Tax Assessor","address":"500 N Elm St., Lumberton, NC 28358"}},"Rockingham County, NC":{"recorder":{"name":"Rockingham County Register of Deeds","address":"371 NC-65, Wentworth, NC 27375"},"assessor":{"name":"Rockingham County Tax Assessor","address":"371 NC-65, Wentworth, NC 27375"}},"Rowan County, NC":{"recorder":{"name":"Rowan County Register of Deeds","address":"402 N Main St. Suite 105, Salisbury, NC 28144"},"assessor":{"name":"Rowan County Tax Assessor","address":"402 N Main St. Suite 105, Salisbury, NC 28144"}},"Rutherford County, NC":{"recorder":{"name":"Rutherford County Register of Deeds","address":"229 N Main St., Rutherfordton, NC 28139"},"assessor":{"name":"Rutherford County Tax Assessor","address":"229 N Main St., Rutherfordton, NC 28139"}},"Sampson County, NC":{"recorder":{"name":"Sampson County Register of Deeds","address":"435 Rowan Rd. Suite 1, Clinton, NC 28328"},"assessor":{"name":"Sampson County Tax Assessor","address":"435 Rowan Rd. Suite 1, Clinton, NC 28328"}},"Scotland County, NC":{"recorder":{"name":"Scotland County Register of Deeds","address":"212 Biggs St. Suite 100, Laurinburg, NC 28352"},"assessor":{"name":"Scotland County Tax Assessor","address":"507 W Covington St., Laurinburg, NC 28352"}},"Stanly County, NC":{"recorder":{"name":"Stanly County Register of Deeds","address":"201 S 2nd St. Suite 9, Albemarle, NC 28001"},"assessor":{"name":"Stanly County Tax Assessor","address":"201 S 2nd St. Suite 9, Albemarle, NC 28001"}},"Stokes County, NC":{"recorder":{"name":"Stokes County Register of Deeds","address":"1014 Main St., Danbury, NC 27016"},"assessor":{"name":"Stokes County Tax Assessor","address":"1014 Main St., Danbury, NC 27016"}},"Surry County, NC":{"recorder":{"name":"Surry County Register of Deeds","address":"201 E Kapp St., Dobson, NC 27017"},"assessor":{"name":"Surry County Tax Assessor","address":"201 E Kapp St., Dobson, NC 27017"}},"Swain County, NC":{"recorder":{"name":"Swain County Register of Deeds","address":"101 Mitchell St. Suite B-101, Bryson City, NC 28713"},"assessor":{"name":"Swain County Tax Assessor","address":"101 Mitchell St. Suite B-101, Bryson City, NC 28713"}},"Transylvania County, NC":{"recorder":{"name":"Transylvania County Register of Deeds","address":"12 E Main St., Brevard, NC 28712"},"assessor":{"name":"Transylvania County Tax Assessor","address":"12 E Main St., Brevard, NC 28712"}},"Tyrrell County, NC":{"recorder":{"name":"Tyrrell County Register of Deeds","address":"108 S Water St., Columbia, NC 27925"},"assessor":{"name":"Tyrrell County Tax Assessor","address":"108 S Water St., Columbia, NC 27925"}},"Union County, NC":{"recorder":{"name":"Union County Register of Deeds","address":"500 N Main St. Suite 300, Monroe, NC 28112"},"assessor":{"name":"Union County Tax Assessor","address":"500 N Main St. Suite 236, Monroe, NC 28112"}},"Vance County, NC":{"recorder":{"name":"Vance County Register of Deeds","address":"122 Young St. Suite A, Henderson, NC 27536"},"assessor":{"name":"Vance County Tax Assessor","address":"122 Young St. Suite A, Henderson, NC 27536"}},"Wake County, NC":{"recorder":{"name":"Wake County Register of Deeds","address":"301 S McDowell St. Suite 3600, Raleigh, NC 27601"},"assessor":{"name":"Wake County Tax Assessor","address":"301 S McDowell St. Suite 3800, Raleigh, NC 27601"}},"Warren County, NC":{"recorder":{"name":"Warren County Register of Deeds","address":"121 S Front St. Suite 3, Warrenton, NC 27589"},"assessor":{"name":"Warren County Tax Assessor","address":"121 S Front St. Suite 3, Warrenton, NC 27589"}},"Washington County, NC":{"recorder":{"name":"Washington County Register of Deeds","address":"120 Adams St., Plymouth, NC 27962"},"assessor":{"name":"Washington County Tax Assessor","address":"120 Adams St., Plymouth, NC 27962"}},"Watauga County, NC":{"recorder":{"name":"Watauga County Register of Deeds","address":"842 W King St. Suite 4, Boone, NC 28607"},"assessor":{"name":"Watauga County Tax Assessor","address":"842 W King St. Suite 4, Boone, NC 28607"}},"Wayne County, NC":{"recorder":{"name":"Wayne County Register of Deeds","address":"224 E Walnut St., Goldsboro, NC 27530"},"assessor":{"name":"Wayne County Tax Assessor","address":"224 E Walnut St., Goldsboro, NC 27530"}},"Wilkes County, NC":{"recorder":{"name":"Wilkes County Register of Deeds","address":"500 Courthouse Dr. Suite 1150, Wilkesboro, NC 28697"},"assessor":{"name":"Wilkes County Tax Assessor","address":"500 Courthouse Dr. Suite 1150, Wilkesboro, NC 28697"}},"Wilson County, NC":{"recorder":{"name":"Wilson County Register of Deeds","address":"113 Nash St. E Suite 127, Wilson, NC 27893"},"assessor":{"name":"Wilson County Tax Assessor","address":"113 Nash St. E Suite 127, Wilson, NC 27893"}},"Yadkin County, NC":{"recorder":{"name":"Yadkin County Register of Deeds","address":"101 S State St., Yadkinville, NC 27055"},"assessor":{"name":"Yadkin County Tax Assessor","address":"101 S State St., Yadkinville, NC 27055"}},"Yancey County, NC":{"recorder":{"name":"Yancey County Register of Deeds","address":"110 Town Square Room 7, Burnsville, NC 28714"},"assessor":{"name":"Yancey County Tax Assessor","address":"110 Town Square Room 7, Burnsville, NC 28714"}},"Adams County, ND":{"recorder":{"name":"Adams County Recorder","address":"602 Adams Ave., Hettinger, ND 58639"},"assessor":{"name":"Adams County Tax Equalization","address":"602 Adams Ave., Hettinger, ND 58639"}},"Barnes County, ND":{"recorder":{"name":"Barnes County Recorder","address":"230 4th St NW, Valley City, ND 58072"},"assessor":{"name":"Barnes County Tax Equalization","address":"230 4th St NW, Valley City, ND 58072"}},"Benson County, ND":{"recorder":{"name":"Benson County Recorder","address":"311 B Ave S, Minnewaukan, ND 58351"},"assessor":{"name":"Benson County Tax Equalization","address":"311 B Ave S, Minnewaukan, ND 58351"}},"Billings County, ND":{"recorder":{"name":"Billings County Recorder","address":"495 4th St., Medora, ND 58645"},"assessor":{"name":"Billings County Tax Equalization","address":"495 4th St., Medora, ND 58645"}},"Bottineau County, ND":{"recorder":{"name":"Bottineau County Recorder","address":"314 W 5th St., Bottineau, ND 58318"},"assessor":{"name":"Bottineau County Tax Equalization","address":"314 W 5th St., Bottineau, ND 58318"}},"Bowman County, ND":{"recorder":{"name":"Bowman County Recorder","address":"104 1st St NE, Bowman, ND 58623"},"assessor":{"name":"Bowman County Tax Equalization","address":"104 1st St NE, Bowman, ND 58623"}},"Burke County, ND":{"recorder":{"name":"Burke County Recorder","address":"103 N Main Ave., Bowbells, ND 58721"},"assessor":{"name":"Burke County Tax Equalization","address":"103 N Main Ave., Bowbells, ND 58721"}},"Burleigh County, ND":{"recorder":{"name":"Burleigh County Recorder","address":"221 N 5th St., Bismarck, ND 58501"},"assessor":{"name":"Burleigh County Tax Equalization","address":"221 N 5th St., Bismarck, ND 58501"}},"Cass County, ND":{"recorder":{"name":"Cass County Recorder","address":"211 9th St S, Fargo, ND 58103"},"assessor":{"name":"Cass County Tax Equalization","address":"211 9th St S, Fargo, ND 58103"}},"Cavalier County, ND":{"recorder":{"name":"Cavalier County Recorder","address":"901 3rd St., Langdon, ND 58249"},"assessor":{"name":"Cavalier County Tax Equalization","address":"901 3rd St., Langdon, ND 58249"}},"Dickey County, ND":{"recorder":{"name":"Dickey County Recorder","address":"309 N 2nd St., Ellendale, ND 58436"},"assessor":{"name":"Dickey County Tax Equalization","address":"309 N 2nd St., Ellendale, ND 58436"}},"Divide County, ND":{"recorder":{"name":"Divide County Recorder","address":"300 N Main St., Crosby, ND 58730"},"assessor":{"name":"Divide County Tax Equalization","address":"300 N Main St., Crosby, ND 58730"}},"Dunn County, ND":{"recorder":{"name":"Dunn County Recorder","address":"205 Owens St., Manning, ND 58642"},"assessor":{"name":"Dunn County Tax Equalization","address":"205 Owens St., Manning, ND 58642"}},"Eddy County, ND":{"recorder":{"name":"Eddy County Recorder","address":"524 Central Ave., New Rockford, ND 58356"},"assessor":{"name":"Eddy County Tax Equalization","address":"524 Central Ave., New Rockford, ND 58356"}},"Emmons County, ND":{"recorder":{"name":"Emmons County Recorder","address":"100 4th Ave NW, Linton, ND 58552"},"assessor":{"name":"Emmons County Tax Equalization","address":"100 4th Ave NW, Linton, ND 58552"}},"Foster County, ND":{"recorder":{"name":"Foster County Recorder","address":"1000 Central Ave NE, Carrington, ND 58421"},"assessor":{"name":"Foster County Tax Equalization","address":"1000 Central Ave NE, Carrington, ND 58421"}},"Golden Valley County, ND":{"recorder":{"name":"Golden Valley County Recorder","address":"150 1st Ave SE, Beach, ND 58621"},"assessor":{"name":"Golden Valley County Tax Equalization","address":"150 1st Ave SE, Beach, ND 58621"}},"Grand Forks County, ND":{"recorder":{"name":"Grand Forks County Recorder","address":"151 S 4th St., Grand Forks, ND 58201"},"assessor":{"name":"Grand Forks County Tax Equalization","address":"151 S 4th St., Grand Forks, ND 58201"}},"Grant County, ND":{"recorder":{"name":"Grant County Recorder","address":"106 2nd Ave NE, Carson, ND 58529"},"assessor":{"name":"Grant County Tax Equalization","address":"106 2nd Ave NE, Carson, ND 58529"}},"Griggs County, ND":{"recorder":{"name":"Griggs County Recorder","address":"808 Rollin Ave NE, Cooperstown, ND 58425"},"assessor":{"name":"Griggs County Tax Equalization","address":"808 Rollin Ave NE, Cooperstown, ND 58425"}},"Hettinger County, ND":{"recorder":{"name":"Hettinger County Recorder","address":"336 Pacific Ave., Mott, ND 58646"},"assessor":{"name":"Hettinger County Tax Equalization","address":"336 Pacific Ave., Mott, ND 58646"}},"Kidder County, ND":{"recorder":{"name":"Kidder County Recorder","address":"120 E Broadway, Steele, ND 58482"},"assessor":{"name":"Kidder County Tax Equalization","address":"120 E Broadway, Steele, ND 58482"}},"LaMoure County, ND":{"recorder":{"name":"LaMoure County Recorder","address":"202 4th Ave NE, LaMoure, ND 58458"},"assessor":{"name":"LaMoure County Tax Equalization","address":"202 4th Ave NE, LaMoure, ND 58458"}},"Logan County, ND":{"recorder":{"name":"Logan County Recorder","address":"301 Broadway, Napoleon, ND 58561"},"assessor":{"name":"Logan County Tax Equalization","address":"301 Broadway, Napoleon, ND 58561"}},"McHenry County, ND":{"recorder":{"name":"McHenry County Recorder","address":"407 Main St S, Towner, ND 58788"},"assessor":{"name":"McHenry County Tax Equalization","address":"407 Main St S, Towner, ND 58788"}},"McIntosh County, ND":{"recorder":{"name":"McIntosh County Recorder","address":"112 NE 1st St., Ashley, ND 58413"},"assessor":{"name":"McIntosh County Tax Equalization","address":"112 NE 1st St., Ashley, ND 58413"}},"McKenzie County, ND":{"recorder":{"name":"McKenzie County Recorder","address":"201 5th St NW, Watford City, ND 58854"},"assessor":{"name":"McKenzie County Tax Equalization","address":"201 5th St NW, Watford City, ND 58854"}},"McLean County, ND":{"recorder":{"name":"McLean County Recorder","address":"712 5th Ave, Washburn, ND 58577"},"assessor":{"name":"McLean County Tax Equalization","address":"712 5th Ave, Washburn, ND 58577"}},"Mercer County, ND":{"recorder":{"name":"Mercer County Recorder","address":"1021 Arthur St., Stanton, ND 58571"},"assessor":{"name":"Mercer County Tax Equalization","address":"1021 Arthur St., Stanton, ND 58571"}},"Morton County, ND":{"recorder":{"name":"Morton County Recorder","address":"210 2nd Ave NW, Mandan, ND 58554"},"assessor":{"name":"Morton County Tax Equalization","address":"210 2nd Ave NW, Mandan, ND 58554"}},"Mountrail County, ND":{"recorder":{"name":"Mountrail County Recorder","address":"101 1st Ave NW, Stanley, ND 58784"},"assessor":{"name":"Mountrail County Tax Equalization","address":"101 1st Ave NW, Stanley, ND 58784"}},"Nelson County, ND":{"recorder":{"name":"Nelson County Recorder","address":"210 B Ave W, Lakota, ND 58344"},"assessor":{"name":"Nelson County Tax Equalization","address":"210 B Ave W, Lakota, ND 58344"}},"Oliver County, ND":{"recorder":{"name":"Oliver County Recorder","address":"115 W Main St., Center, ND 58530"},"assessor":{"name":"Oliver County Tax Equalization","address":"115 W Main St., Center, ND 58530"}},"Pembina County, ND":{"recorder":{"name":"Pembina County Recorder","address":"301 Dakota St W, Cavalier, ND 58220"},"assessor":{"name":"Pembina County Tax Equalization","address":"301 Dakota St W, Cavalier, ND 58220"}},"Pierce County, ND":{"recorder":{"name":"Pierce County Recorder","address":"240 SE 2nd St., Rugby, ND 58368"},"assessor":{"name":"Pierce County Tax Equalization","address":"240 SE 2nd St., Rugby, ND 58368"}},"Ramsey County, ND":{"recorder":{"name":"Ramsey County Recorder","address":"524 4th Ave, Devils Lake, ND 58301"},"assessor":{"name":"Ramsey County Tax Equalization","address":"524 4th Ave, Devils Lake, ND 58301"}},"Ransom County, ND":{"recorder":{"name":"Ransom County Recorder","address":"204 5th Ave W, Lisbon, ND 58054"},"assessor":{"name":"Ransom County Tax Equalization","address":"204 5th Ave W, Lisbon, ND 58054"}},"Renville County, ND":{"recorder":{"name":"Renville County Recorder","address":"205 Main St E, Mohall, ND 58761"},"assessor":{"name":"Renville County Tax Equalization","address":"205 Main St E, Mohall, ND 58761"}},"Richland County, ND":{"recorder":{"name":"Richland County Recorder","address":"418 2nd Ave N, Wahpeton, ND 58075"},"assessor":{"name":"Richland County Tax Equalization","address":"418 2nd Ave N, Wahpeton, ND 58075"}},"Rolette County, ND":{"recorder":{"name":"Rolette County Recorder","address":"102 NE 2nd St., Rolla, ND 58367"},"assessor":{"name":"Rolette County Tax Equalization","address":"102 NE 2nd St., Rolla, ND 58367"}},"Sargent County, ND":{"recorder":{"name":"Sargent County Recorder","address":"355 Main St., Forman, ND 58032"},"assessor":{"name":"Sargent County Tax Equalization","address":"355 Main St., Forman, ND 58032"}},"Sheridan County, ND":{"recorder":{"name":"Sheridan County Recorder","address":"215 2nd St., McClusky, ND 58463"},"assessor":{"name":"Sheridan County Tax Equalization","address":"215 2nd St., McClusky, ND 58463"}},"Sioux County, ND":{"recorder":{"name":"Sioux County Recorder","address":"209 2nd Ave, Fort Yates, ND 58538"},"assessor":{"name":"Sioux County Tax Equalization","address":"209 2nd Ave, Fort Yates, ND 58538"}},"Slope County, ND":{"recorder":{"name":"Slope County Recorder","address":"206 S Main St., Amidon, ND 58620"},"assessor":{"name":"Slope County Tax Equalization","address":"206 S Main St., Amidon, ND 58620"}},"Stark County, ND":{"recorder":{"name":"Stark County Recorder","address":"51 3rd St E, Dickinson, ND 58601"},"assessor":{"name":"Stark County Tax Equalization","address":"51 3rd St E, Dickinson, ND 58601"}},"Steele County, ND":{"recorder":{"name":"Steele County Recorder","address":"217 2nd Ave NE, Finley, ND 58230"},"assessor":{"name":"Steele County Tax Equalization","address":"217 2nd Ave NE, Finley, ND 58230"}},"Stutsman County, ND":{"recorder":{"name":"Stutsman County Recorder","address":"511 2nd Ave SE, Jamestown, ND 58401"},"assessor":{"name":"Stutsman County Tax Equalization","address":"511 2nd Ave SE, Jamestown, ND 58401"}},"Towner County, ND":{"recorder":{"name":"Towner County Recorder","address":"315 2nd St., Cando, ND 58324"},"assessor":{"name":"Towner County Tax Equalization","address":"315 2nd St., Cando, ND 58324"}},"Traill County, ND":{"recorder":{"name":"Traill County Recorder","address":"114 W Caledonia Ave., Hillsboro, ND 58045"},"assessor":{"name":"Traill County Tax Equalization","address":"114 W Caledonia Ave., Hillsboro, ND 58045"}},"Walsh County, ND":{"recorder":{"name":"Walsh County Recorder","address":"600 Cooper Ave., Grafton, ND 58237"},"assessor":{"name":"Walsh County Tax Equalization","address":"600 Cooper Ave., Grafton, ND 58237"}},"Ward County, ND":{"recorder":{"name":"Ward County Recorder","address":"315 3rd St SE, Minot, ND 58701"},"assessor":{"name":"Ward County Tax Equalization","address":"315 3rd St SE, Minot, ND 58701"}},"Wells County, ND":{"recorder":{"name":"Wells County Recorder","address":"700 Railway St N, Fessenden, ND 58438"},"assessor":{"name":"Wells County Tax Equalization","address":"700 Railway St N, Fessenden, ND 58438"}},"Williams County, ND":{"recorder":{"name":"Williams County Recorder","address":"206 E Broadway, Williston, ND 58801"},"assessor":{"name":"Williams County Tax Equalization","address":"206 E Broadway, Williston, ND 58801"}},"Belknap County, NH":{"recorder":{"name":"Belknap County Register of Deeds","address":"64 Court St., Laconia, NH 03246"},"assessor":{"name":"Belknap County Assessment","address":"64 Court St., Laconia, NH 03246"}},"Carroll County, NH":{"recorder":{"name":"Carroll County Register of Deeds","address":"95 Water Village Rd., Ossipee, NH 03864"},"assessor":{"name":"Carroll County Assessment","address":"95 Water Village Rd., Ossipee, NH 03864"}},"Cheshire County, NH":{"recorder":{"name":"Cheshire County Register of Deeds","address":"12 Court St., Keene, NH 03431"},"assessor":{"name":"Cheshire County Assessment","address":"12 Court St., Keene, NH 03431"}},"Coos County, NH":{"recorder":{"name":"Coos County Register of Deeds","address":"55 School St. Suite 103, Lancaster, NH 03584"},"assessor":{"name":"Coos County Assessment","address":"55 School St. Suite 103, Lancaster, NH 03584"}},"Grafton County, NH":{"recorder":{"name":"Grafton County Register of Deeds","address":"3785 Dartmouth College Hwy Suite 3, North Haverhill, NH 03774"},"assessor":{"name":"Grafton County Assessment","address":"3785 Dartmouth College Hwy Suite 3, North Haverhill, NH 03774"}},"Hillsborough County, NH":{"recorder":{"name":"Hillsborough County Register of Deeds","address":"19 Temple St., Nashua, NH 03060"},"assessor":{"name":"Hillsborough County Assessment","address":"19 Temple St., Nashua, NH 03060"}},"Merrimack County, NH":{"recorder":{"name":"Merrimack County Register of Deeds","address":"163 N Main St., Concord, NH 03301"},"assessor":{"name":"Merrimack County Assessment","address":"163 N Main St., Concord, NH 03301"}},"Rockingham County, NH":{"recorder":{"name":"Rockingham County Register of Deeds","address":"119 North Rd. Suite 201, Brentwood, NH 03833"},"assessor":{"name":"Rockingham County Assessment","address":"119 North Rd. Suite 201, Brentwood, NH 03833"}},"Strafford County, NH":{"recorder":{"name":"Strafford County Register of Deeds","address":"259 County Farm Rd. Suite 301, Dover, NH 03820"},"assessor":{"name":"Strafford County Assessment","address":"259 County Farm Rd. Suite 301, Dover, NH 03820"}},"Sullivan County, NH":{"recorder":{"name":"Sullivan County Register of Deeds","address":"22 Main St., Newport, NH 03773"},"assessor":{"name":"Sullivan County Assessment","address":"22 Main St., Newport, NH 03773"}},"Atlantic County, NJ":{"recorder":{"name":"Atlantic County Clerk","address":"5901 Main St., Mays Landing, NJ 08330"},"assessor":{"name":"Atlantic County Tax Assessor","address":"5901 Main St., Mays Landing, NJ 08330"}},"Bergen County, NJ":{"recorder":{"name":"Bergen County Clerk","address":"1 Bergen County Plaza Room 170, Hackensack, NJ 07601"},"assessor":{"name":"Bergen County Tax Assessor","address":"1 Bergen County Plaza Room 170, Hackensack, NJ 07601"}},"Burlington County, NJ":{"recorder":{"name":"Burlington County Clerk","address":"49 Rancocas Rd. Room 133, Mount Holly, NJ 08060"},"assessor":{"name":"Burlington County Tax Assessor","address":"49 Rancocas Rd. Room 133, Mount Holly, NJ 08060"}},"Camden County, NJ":{"recorder":{"name":"Camden County Clerk","address":"520 Market St. Suite 9100, Camden, NJ 08102"},"assessor":{"name":"Camden County Tax Assessor","address":"520 Market St. Suite 9100, Camden, NJ 08102"}},"Cape May County, NJ":{"recorder":{"name":"Cape May County Clerk","address":"7 N Main St. Suite 3, Cape May Court House, NJ 08210"},"assessor":{"name":"Cape May County Tax Assessor","address":"7 N Main St. Suite 3, Cape May Court House, NJ 08210"}},"Cumberland County, NJ":{"recorder":{"name":"Cumberland County Clerk","address":"60 W Broad St., Bridgeton, NJ 08302"},"assessor":{"name":"Cumberland County Tax Assessor","address":"60 W Broad St., Bridgeton, NJ 08302"}},"Essex County, NJ":{"recorder":{"name":"Essex County Clerk","address":"465 Dr. Martin Luther King Jr Blvd. Room 131, Newark, NJ 07102"},"assessor":{"name":"Essex County Tax Assessor","address":"465 Dr. Martin Luther King Jr Blvd. Room 131, Newark, NJ 07102"}},"Gloucester County, NJ":{"recorder":{"name":"Gloucester County Clerk","address":"1 N Broad St. Suite 1300, Woodbury, NJ 08096"},"assessor":{"name":"Gloucester County Tax Assessor","address":"1 N Broad St. Suite 1300, Woodbury, NJ 08096"}},"Hudson County, NJ":{"recorder":{"name":"Hudson County Clerk","address":"257 Cornelison Ave. Suite 109, Jersey City, NJ 07302"},"assessor":{"name":"Hudson County Tax Assessor","address":"257 Cornelison Ave. Suite 109, Jersey City, NJ 07302"}},"Hunterdon County, NJ":{"recorder":{"name":"Hunterdon County Clerk","address":"71 Main St. Suite 1, Flemington, NJ 08822"},"assessor":{"name":"Hunterdon County Tax Assessor","address":"71 Main St. Suite 1, Flemington, NJ 08822"}},"Mercer County, NJ":{"recorder":{"name":"Mercer County Clerk","address":"209 S Broad St., Trenton, NJ 08608"},"assessor":{"name":"Mercer County Tax Assessor","address":"209 S Broad St., Trenton, NJ 08608"}},"Middlesex County, NJ":{"recorder":{"name":"Middlesex County Clerk","address":"75 Bayard St., New Brunswick, NJ 08903"},"assessor":{"name":"Middlesex County Tax Assessor","address":"75 Bayard St., New Brunswick, NJ 08903"}},"Monmouth County, NJ":{"recorder":{"name":"Monmouth County Clerk","address":"1 E Main St., Freehold, NJ 07728"},"assessor":{"name":"Monmouth County Tax Assessor","address":"1 E Main St., Freehold, NJ 07728"}},"Morris County, NJ":{"recorder":{"name":"Morris County Clerk","address":"10 Court St. Suite 1300, Morristown, NJ 07963"},"assessor":{"name":"Morris County Tax Assessor","address":"10 Court St. Suite 1300, Morristown, NJ 07963"}},"Ocean County, NJ":{"recorder":{"name":"Ocean County Clerk","address":"118 Washington St. Suite 102, Toms River, NJ 08753"},"assessor":{"name":"Ocean County Tax Assessor","address":"118 Washington St. Suite 102, Toms River, NJ 08753"}},"Passaic County, NJ":{"recorder":{"name":"Passaic County Clerk","address":"401 Grand St. Room 130, Paterson, NJ 07505"},"assessor":{"name":"Passaic County Tax Assessor","address":"401 Grand St. Room 130, Paterson, NJ 07505"}},"Salem County, NJ":{"recorder":{"name":"Salem County Clerk","address":"92 Market St., Salem, NJ 08079"},"assessor":{"name":"Salem County Tax Assessor","address":"92 Market St., Salem, NJ 08079"}},"Somerset County, NJ":{"recorder":{"name":"Somerset County Clerk","address":"20 Grove St., Somerville, NJ 08876"},"assessor":{"name":"Somerset County Tax Assessor","address":"20 Grove St., Somerville, NJ 08876"}},"Sussex County, NJ":{"recorder":{"name":"Sussex County Clerk","address":"83 Spring St. Suite 304, Newton, NJ 07860"},"assessor":{"name":"Sussex County Tax Assessor","address":"83 Spring St. Suite 304, Newton, NJ 07860"}},"Union County, NJ":{"recorder":{"name":"Union County Clerk","address":"2 Broad St. Room 115, Elizabeth, NJ 07207"},"assessor":{"name":"Union County Tax Assessor","address":"2 Broad St. Room 115, Elizabeth, NJ 07207"}},"Warren County, NJ":{"recorder":{"name":"Warren County Clerk","address":"413 Second St., Belvidere, NJ 07823"},"assessor":{"name":"Warren County Tax Assessor","address":"413 Second St., Belvidere, NJ 07823"}},"Bernalillo County, NM":{"recorder":{"name":"Bernalillo County Clerk","address":"415 Silver Ave SW 2nd Floor, Albuquerque, NM 87102"},"assessor":{"name":"Bernalillo County Assessor","address":"415 Silver Ave SW, Albuquerque, NM 87102"}},"Catron County, NM":{"recorder":{"name":"Catron County Clerk","address":"Catron County Courthouse, Reserve, NM 87830"},"assessor":{"name":"Catron County Assessor","address":"Catron County Courthouse, Reserve, NM 87830"}},"Chaves County, NM":{"recorder":{"name":"Chaves County Clerk","address":"One St. Mary's Place, Roswell, NM 88201"},"assessor":{"name":"Chaves County Assessor","address":"One St. Mary's Place, Roswell, NM 88201"}},"Cibola County, NM":{"recorder":{"name":"Cibola County Clerk","address":"700 E Roosevelt Suite 50, Grants, NM 87020"},"assessor":{"name":"Cibola County Assessor","address":"700 E Roosevelt, Grants, NM 87020"}},"Colfax County, NM":{"recorder":{"name":"Colfax County Clerk","address":"230 N 3rd St., Raton, NM 87740"},"assessor":{"name":"Colfax County Assessor","address":"230 N 3rd St., Raton, NM 87740"}},"Curry County, NM":{"recorder":{"name":"Curry County Clerk","address":"417 Gidding St. Suite 130, Clovis, NM 88101"},"assessor":{"name":"Curry County Assessor","address":"417 Gidding St. Suite 110, Clovis, NM 88101"}},"De Baca County, NM":{"recorder":{"name":"De Baca County Clerk","address":"514 Ave C, Fort Sumner, NM 88119"},"assessor":{"name":"De Baca County Assessor","address":"514 Ave C, Fort Sumner, NM 88119"}},"Do\u00f1a Ana County, NM":{"recorder":{"name":"Do\u00f1a Ana County Clerk","address":"845 N Motel Blvd., Las Cruces, NM 88007"},"assessor":{"name":"Do\u00f1a Ana County Assessor","address":"845 N Motel Blvd., Las Cruces, NM 88007"}},"Eddy County, NM":{"recorder":{"name":"Eddy County Clerk","address":"325 S Main St., Carlsbad, NM 88220"},"assessor":{"name":"Eddy County Assessor","address":"325 S Main St., Carlsbad, NM 88220"}},"Grant County, NM":{"recorder":{"name":"Grant County Clerk","address":"201 N Cooper St., Silver City, NM 88061"},"assessor":{"name":"Grant County Assessor","address":"201 N Cooper St., Silver City, NM 88061"}},"Guadalupe County, NM":{"recorder":{"name":"Guadalupe County Clerk","address":"420 Parker Ave Suite 6, Santa Rosa, NM 88435"},"assessor":{"name":"Guadalupe County Assessor","address":"420 Parker Ave, Santa Rosa, NM 88435"}},"Harding County, NM":{"recorder":{"name":"Harding County Clerk","address":"35 Pine St., Mosquero, NM 87733"},"assessor":{"name":"Harding County Assessor","address":"35 Pine St., Mosquero, NM 87733"}},"Hidalgo County, NM":{"recorder":{"name":"Hidalgo County Clerk","address":"300 S Shakespeare St., Lordsburg, NM 88045"},"assessor":{"name":"Hidalgo County Assessor","address":"300 S Shakespeare St., Lordsburg, NM 88045"}},"Lea County, NM":{"recorder":{"name":"Lea County Clerk","address":"100 N Main Suite 19, Lovington, NM 88260"},"assessor":{"name":"Lea County Assessor","address":"100 N Main Suite 7, Lovington, NM 88260"}},"Lincoln County, NM":{"recorder":{"name":"Lincoln County Clerk","address":"300 Central Ave., Carrizozo, NM 88301"},"assessor":{"name":"Lincoln County Assessor","address":"300 Central Ave., Carrizozo, NM 88301"}},"Los Alamos County, NM":{"recorder":{"name":"Los Alamos County Clerk","address":"1000 Central Ave Suite 240, Los Alamos, NM 87544"},"assessor":{"name":"Los Alamos County Assessor","address":"1000 Central Ave Suite 130, Los Alamos, NM 87544"}},"Luna County, NM":{"recorder":{"name":"Luna County Clerk","address":"700 S Silver Ave., Deming, NM 88030"},"assessor":{"name":"Luna County Assessor","address":"700 S Silver Ave., Deming, NM 88030"}},"McKinley County, NM":{"recorder":{"name":"McKinley County Clerk","address":"207 W Hill Ave Suite 100, Gallup, NM 87301"},"assessor":{"name":"McKinley County Assessor","address":"207 W Hill Ave Suite 108, Gallup, NM 87301"}},"Mora County, NM":{"recorder":{"name":"Mora County Clerk","address":"Courthouse Plaza, Mora, NM 87732"},"assessor":{"name":"Mora County Assessor","address":"Courthouse Plaza, Mora, NM 87732"}},"Otero County, NM":{"recorder":{"name":"Otero County Clerk","address":"1000 New York Ave Suite 108, Alamogordo, NM 88310"},"assessor":{"name":"Otero County Assessor","address":"1000 New York Ave Suite 108, Alamogordo, NM 88310"}},"Quay County, NM":{"recorder":{"name":"Quay County Clerk","address":"300 S 3rd St., Tucumcari, NM 88401"},"assessor":{"name":"Quay County Assessor","address":"300 S 3rd St., Tucumcari, NM 88401"}},"Rio Arriba County, NM":{"recorder":{"name":"Rio Arriba County Clerk","address":"7 Main St., Tierra Amarilla, NM 87575"},"assessor":{"name":"Rio Arriba County Assessor","address":"7 Main St., Tierra Amarilla, NM 87575"}},"Roosevelt County, NM":{"recorder":{"name":"Roosevelt County Clerk","address":"109 W 1st St Suite 1, Portales, NM 88130"},"assessor":{"name":"Roosevelt County Assessor","address":"109 W 1st St Suite 4, Portales, NM 88130"}},"Sandoval County, NM":{"recorder":{"name":"Sandoval County Clerk","address":"1500 Idalia Rd. Bldg. D, Bernalillo, NM 87004"},"assessor":{"name":"Sandoval County Assessor","address":"1500 Idalia Rd. Bldg. D, Bernalillo, NM 87004"}},"San Juan County, NM":{"recorder":{"name":"San Juan County Clerk","address":"100 S Oliver Dr. Suite 200, Aztec, NM 87410"},"assessor":{"name":"San Juan County Assessor","address":"100 S Oliver Dr. Suite 204, Aztec, NM 87410"}},"San Miguel County, NM":{"recorder":{"name":"San Miguel County Clerk","address":"500 W National Ave., Las Vegas, NM 87701"},"assessor":{"name":"San Miguel County Assessor","address":"500 W National Ave., Las Vegas, NM 87701"}},"Santa Fe County, NM":{"recorder":{"name":"Santa Fe County Clerk","address":"102 Grant Ave., Santa Fe, NM 87501"},"assessor":{"name":"Santa Fe County Assessor","address":"100 Catron St., Santa Fe, NM 87501"}},"Sierra County, NM":{"recorder":{"name":"Sierra County Clerk","address":"1712 N Date St., Truth or Consequences, NM 87901"},"assessor":{"name":"Sierra County Assessor","address":"1712 N Date St., Truth or Consequences, NM 87901"}},"Socorro County, NM":{"recorder":{"name":"Socorro County Clerk","address":"200 Church St., Socorro, NM 87801"},"assessor":{"name":"Socorro County Assessor","address":"200 Church St., Socorro, NM 87801"}},"Taos County, NM":{"recorder":{"name":"Taos County Clerk","address":"105 Albright St. Suite E, Taos, NM 87571"},"assessor":{"name":"Taos County Assessor","address":"105 Albright St. Suite G, Taos, NM 87571"}},"Torrance County, NM":{"recorder":{"name":"Torrance County Clerk","address":"9th St. & Allen Ave., Estancia, NM 87016"},"assessor":{"name":"Torrance County Assessor","address":"9th St. & Allen Ave., Estancia, NM 87016"}},"Union County, NM":{"recorder":{"name":"Union County Clerk","address":"200 Court St., Clayton, NM 88415"},"assessor":{"name":"Union County Assessor","address":"200 Court St., Clayton, NM 88415"}},"Valencia County, NM":{"recorder":{"name":"Valencia County Clerk","address":"444 Luna Ave., Los Lunas, NM 87031"},"assessor":{"name":"Valencia County Assessor","address":"444 Luna Ave., Los Lunas, NM 87031"}},"Carson City, NV":{"recorder":{"name":"Carson City Clerk-Recorder","address":"885 E. Musser St. Ste. 1028, Carson City, NV 89701"},"assessor":{"name":"Carson City Assessor","address":"201 North Carson St. Suite 6, Carson City, NV 89701"}},"Churchill County, NV":{"recorder":{"name":"Churchill County Recorder","address":"155 N. Taylor St. Ste. 131, Fallon, NV 89406"},"assessor":{"name":"Churchill County Assessor","address":"155 North Taylor St. #200, Fallon, NV 89406"}},"Clark County, NV":{"recorder":{"name":"Clark County Recorder","address":"500 S. Grand Central Pkwy 2nd Floor, Las Vegas, NV 89155"},"assessor":{"name":"Clark County Assessor","address":"500 S. Grand Central Pkwy 2nd Floor, Las Vegas, NV 89155"}},"Douglas County, NV":{"recorder":{"name":"Douglas County Recorder","address":"1616 Eighth St., Minden, NV 89423"},"assessor":{"name":"Douglas County Assessor","address":"1616 8th St., Minden, NV 89423"}},"Elko County, NV":{"recorder":{"name":"Elko County Recorder","address":"571 Idaho St. Room 103, Elko, NV 89801"},"assessor":{"name":"Elko County Assessor","address":"550 Court St., Elko, NV 89801"}},"Esmeralda County, NV":{"recorder":{"name":"Esmeralda County Recorder","address":"PO Box 458, Goldfield, NV 89013"},"assessor":{"name":"Esmeralda County Assessor","address":"PO Box 471, Hwy 95 & Euclid, Goldfield, NV 89013"}},"Eureka County, NV":{"recorder":{"name":"Eureka County Recorder","address":"PO Box 540, Eureka, NV 89316"},"assessor":{"name":"Eureka County Assessor","address":"20 S. Main St., Eureka, NV 89316"}},"Humboldt County, NV":{"recorder":{"name":"Humboldt County Recorder","address":"25 W. Fourth St., Winnemucca, NV 89445"},"assessor":{"name":"Humboldt County Assessor","address":"50 West 5th St., Winnemucca, NV 89445"}},"Lander County, NV":{"recorder":{"name":"Lander County Recorder","address":"50 State Route 305, Battle Mountain, NV 89820"},"assessor":{"name":"Lander County Assessor","address":"50 State Route 305, Battle Mountain, NV 89820"}},"Lincoln County, NV":{"recorder":{"name":"Lincoln County Recorder","address":"181 North Main St. Suite 202, Pioche, NV 89043"},"assessor":{"name":"Lincoln County Assessor","address":"181 Main St., Pioche, NV 89043"}},"Lyon County, NV":{"recorder":{"name":"Lyon County Recorder","address":"27 S. Main St., Yerington, NV 89447"},"assessor":{"name":"Lyon County Assessor","address":"27 S. Main St., Yerington, NV 89447"}},"Mineral County, NV":{"recorder":{"name":"Mineral County Recorder","address":"105 South A St., Hawthorne, NV 89415"},"assessor":{"name":"Mineral County Assessor","address":"105 South A St., Hawthorne, NV 89415"}},"Nye County, NV":{"recorder":{"name":"Nye County Recorder","address":"101 Radar Rd., Tonopah, NV 89049"},"assessor":{"name":"Nye County Assessor","address":"101 Radar Rd., Tonopah, NV 89049"}},"Pershing County, NV":{"recorder":{"name":"Pershing County Recorder","address":"398 Main St., Lovelock, NV 89419"},"assessor":{"name":"Pershing County Assessor","address":"398 Main St., Lovelock, NV 89419"}},"Storey County, NV":{"recorder":{"name":"Storey County Recorder","address":"26 South B St., Virginia City, NV 89440"},"assessor":{"name":"Storey County Assessor","address":"26 South B St. Second Floor, Virginia City, NV 89440"}},"Washoe County, NV":{"recorder":{"name":"Washoe County Recorder","address":"1001 E. Ninth St. Bldg. A, Reno, NV 89512"},"assessor":{"name":"Washoe County Assessor","address":"1001 E. 9th St. Bldg. D, Reno, NV 89512"}},"White Pine County, NV":{"recorder":{"name":"White Pine County Recorder","address":"801 Clark St. Suite 1, Ely, NV 89301"},"assessor":{"name":"White Pine County Assessor","address":"297 Nevada Northern Railway Suite 3, Ely, NV 89301"}},"Albany County, NY":{"recorder":{"name":"Albany County Clerk","address":"112 State St. Room 128, Albany, NY 12207"},"assessor":{"name":"Albany County Real Property Tax Service","address":"112 State St. Room 128, Albany, NY 12207"}},"Allegany County, NY":{"recorder":{"name":"Allegany County Clerk","address":"7 Court St. Room 18, Belmont, NY 14813"},"assessor":{"name":"Allegany County Real Property Tax Service","address":"7 Court St. Room 18, Belmont, NY 14813"}},"Bronx County, NY":{"recorder":{"name":"Bronx County Clerk","address":"851 Grand Concourse Room 118, Bronx, NY 10451"},"assessor":{"name":"NYC Department of Finance (Bronx)","address":"3030 3rd Ave. 2nd Floor, Bronx, NY 10455"}},"Broome County, NY":{"recorder":{"name":"Broome County Clerk","address":"60 Hawley St., Binghamton, NY 13901"},"assessor":{"name":"Broome County Real Property Tax Service","address":"60 Hawley St., Binghamton, NY 13901"}},"Cattaraugus County, NY":{"recorder":{"name":"Cattaraugus County Clerk","address":"303 Court St., Little Valley, NY 14755"},"assessor":{"name":"Cattaraugus County Real Property Tax Service","address":"303 Court St., Little Valley, NY 14755"}},"Cayuga County, NY":{"recorder":{"name":"Cayuga County Clerk","address":"160 Genesee St., Auburn, NY 13021"},"assessor":{"name":"Cayuga County Real Property Tax Service","address":"160 Genesee St., Auburn, NY 13021"}},"Chautauqua County, NY":{"recorder":{"name":"Chautauqua County Clerk","address":"1 N Erie St., Mayville, NY 14757"},"assessor":{"name":"Chautauqua County Real Property Tax Service","address":"1 N Erie St., Mayville, NY 14757"}},"Chemung County, NY":{"recorder":{"name":"Chemung County Clerk","address":"210 Lake St., Elmira, NY 14902"},"assessor":{"name":"Chemung County Real Property Tax Service","address":"210 Lake St., Elmira, NY 14902"}},"Chenango County, NY":{"recorder":{"name":"Chenango County Clerk","address":"5 Court St., Norwich, NY 13815"},"assessor":{"name":"Chenango County Real Property Tax Service","address":"5 Court St., Norwich, NY 13815"}},"Clinton County, NY":{"recorder":{"name":"Clinton County Clerk","address":"137 Margaret St. Suite 208, Plattsburgh, NY 12901"},"assessor":{"name":"Clinton County Real Property Tax Service","address":"137 Margaret St. Suite 208, Plattsburgh, NY 12901"}},"Columbia County, NY":{"recorder":{"name":"Columbia County Clerk","address":"560 Warren St., Hudson, NY 12534"},"assessor":{"name":"Columbia County Real Property Tax Service","address":"560 Warren St., Hudson, NY 12534"}},"Cortland County, NY":{"recorder":{"name":"Cortland County Clerk","address":"46 Greenbush St. Suite 105, Cortland, NY 13045"},"assessor":{"name":"Cortland County Real Property Tax Service","address":"46 Greenbush St. Suite 105, Cortland, NY 13045"}},"Delaware County, NY":{"recorder":{"name":"Delaware County Clerk","address":"3 Court St., Delhi, NY 13753"},"assessor":{"name":"Delaware County Real Property Tax Service","address":"3 Court St., Delhi, NY 13753"}},"Dutchess County, NY":{"recorder":{"name":"Dutchess County Clerk","address":"22 Market St., Poughkeepsie, NY 12601"},"assessor":{"name":"Dutchess County Real Property Tax Service","address":"22 Market St., Poughkeepsie, NY 12601"}},"Erie County, NY":{"recorder":{"name":"Erie County Clerk","address":"92 Franklin St., Buffalo, NY 14202"},"assessor":{"name":"Erie County Real Property Tax Service","address":"95 Franklin St. Room 100, Buffalo, NY 14202"}},"Essex County, NY":{"recorder":{"name":"Essex County Clerk","address":"7559 Court St., Elizabethtown, NY 12932"},"assessor":{"name":"Essex County Real Property Tax Service","address":"7559 Court St., Elizabethtown, NY 12932"}},"Franklin County, NY":{"recorder":{"name":"Franklin County Clerk","address":"355 W Main St. Suite 147, Malone, NY 12953"},"assessor":{"name":"Franklin County Real Property Tax Service","address":"355 W Main St. Suite 147, Malone, NY 12953"}},"Fulton County, NY":{"recorder":{"name":"Fulton County Clerk","address":"223 W Main St., Johnstown, NY 12095"},"assessor":{"name":"Fulton County Real Property Tax Service","address":"223 W Main St., Johnstown, NY 12095"}},"Genesee County, NY":{"recorder":{"name":"Genesee County Clerk","address":"15 Main St., Batavia, NY 14020"},"assessor":{"name":"Genesee County Real Property Tax Service","address":"15 Main St., Batavia, NY 14020"}},"Greene County, NY":{"recorder":{"name":"Greene County Clerk","address":"411 Main St. Suite 443, Catskill, NY 12414"},"assessor":{"name":"Greene County Real Property Tax Service","address":"411 Main St. Suite 443, Catskill, NY 12414"}},"Hamilton County, NY":{"recorder":{"name":"Hamilton County Clerk","address":"White Birch Ln., Lake Pleasant, NY 12108"},"assessor":{"name":"Hamilton County Real Property Tax Service","address":"White Birch Ln., Lake Pleasant, NY 12108"}},"Herkimer County, NY":{"recorder":{"name":"Herkimer County Clerk","address":"109 Mary St. Suite 1111, Herkimer, NY 13350"},"assessor":{"name":"Herkimer County Real Property Tax Service","address":"109 Mary St. Suite 1111, Herkimer, NY 13350"}},"Jefferson County, NY":{"recorder":{"name":"Jefferson County Clerk","address":"175 Arsenal St., Watertown, NY 13601"},"assessor":{"name":"Jefferson County Real Property Tax Service","address":"175 Arsenal St., Watertown, NY 13601"}},"Kings County, NY":{"recorder":{"name":"Kings County Clerk","address":"360 Adams St. Room 189, Brooklyn, NY 11201"},"assessor":{"name":"NYC Department of Finance (Brooklyn)","address":"210 Joralemon St., Brooklyn, NY 11201"}},"Lewis County, NY":{"recorder":{"name":"Lewis County Clerk","address":"7660 N State St., Lowville, NY 13367"},"assessor":{"name":"Lewis County Real Property Tax Service","address":"7660 N State St., Lowville, NY 13367"}},"Livingston County, NY":{"recorder":{"name":"Livingston County Clerk","address":"6 Court St. Room 201, Geneseo, NY 14454"},"assessor":{"name":"Livingston County Real Property Tax Service","address":"6 Court St. Room 201, Geneseo, NY 14454"}},"Madison County, NY":{"recorder":{"name":"Madison County Clerk","address":"138 N Court St., Wampsville, NY 13163"},"assessor":{"name":"Madison County Real Property Tax Service","address":"138 N Court St., Wampsville, NY 13163"}},"Monroe County, NY":{"recorder":{"name":"Monroe County Clerk","address":"39 W Main St. Room 101, Rochester, NY 14614"},"assessor":{"name":"Monroe County Real Property Tax Service","address":"39 W Main St. Room 101, Rochester, NY 14614"}},"Montgomery County, NY":{"recorder":{"name":"Montgomery County Clerk","address":"64 Broadway Suite 103, Fonda, NY 12068"},"assessor":{"name":"Montgomery County Real Property Tax Service","address":"64 Broadway Suite 103, Fonda, NY 12068"}},"Nassau County, NY":{"recorder":{"name":"Nassau County Clerk","address":"240 Old Country Rd., Mineola, NY 11501"},"assessor":{"name":"Nassau County Assessor","address":"240 Old Country Rd. Suite 101, Mineola, NY 11501"}},"New York County, NY":{"recorder":{"name":"New York County Clerk","address":"60 Centre St. Room 161, New York, NY 10007"},"assessor":{"name":"NYC Department of Finance (Manhattan)","address":"66 John St. 2nd Floor, New York, NY 10038"}},"Niagara County, NY":{"recorder":{"name":"Niagara County Clerk","address":"175 Hawley St., Lockport, NY 14094"},"assessor":{"name":"Niagara County Real Property Tax Service","address":"175 Hawley St., Lockport, NY 14094"}},"Oneida County, NY":{"recorder":{"name":"Oneida County Clerk","address":"800 Park Ave., Utica, NY 13501"},"assessor":{"name":"Oneida County Real Property Tax Service","address":"800 Park Ave., Utica, NY 13501"}},"Onondaga County, NY":{"recorder":{"name":"Onondaga County Clerk","address":"401 Montgomery St. Room 200, Syracuse, NY 13202"},"assessor":{"name":"Onondaga County Real Property Tax Service","address":"421 Montgomery St. 10th Floor, Syracuse, NY 13202"}},"Ontario County, NY":{"recorder":{"name":"Ontario County Clerk","address":"20 Ontario St. Suite 1, Canandaigua, NY 14424"},"assessor":{"name":"Ontario County Real Property Tax Service","address":"20 Ontario St. Suite 1, Canandaigua, NY 14424"}},"Orange County, NY":{"recorder":{"name":"Orange County Clerk","address":"255 Main St., Goshen, NY 10924"},"assessor":{"name":"Orange County Real Property Tax Service","address":"255 Main St., Goshen, NY 10924"}},"Orleans County, NY":{"recorder":{"name":"Orleans County Clerk","address":"3 S Main St. Suite 1, Albion, NY 14411"},"assessor":{"name":"Orleans County Real Property Tax Service","address":"3 S Main St. Suite 1, Albion, NY 14411"}},"Oswego County, NY":{"recorder":{"name":"Oswego County Clerk","address":"46 E Bridge St., Oswego, NY 13126"},"assessor":{"name":"Oswego County Real Property Tax Service","address":"46 E Bridge St., Oswego, NY 13126"}},"Otsego County, NY":{"recorder":{"name":"Otsego County Clerk","address":"197 Main St., Cooperstown, NY 13326"},"assessor":{"name":"Otsego County Real Property Tax Service","address":"197 Main St., Cooperstown, NY 13326"}},"Putnam County, NY":{"recorder":{"name":"Putnam County Clerk","address":"40 Gleneida Ave., Carmel, NY 10512"},"assessor":{"name":"Putnam County Real Property Tax Service","address":"40 Gleneida Ave., Carmel, NY 10512"}},"Queens County, NY":{"recorder":{"name":"Queens County Clerk","address":"88-11 Sutphin Blvd., Jamaica, NY 11435"},"assessor":{"name":"NYC Department of Finance (Queens)","address":"144-06 94th Ave., Jamaica, NY 11435"}},"Rensselaer County, NY":{"recorder":{"name":"Rensselaer County Clerk","address":"105 3rd St., Troy, NY 12180"},"assessor":{"name":"Rensselaer County Real Property Tax Service","address":"1600 7th Ave., Troy, NY 12180"}},"Richmond County, NY":{"recorder":{"name":"Richmond County Clerk","address":"130 Stuyvesant Pl., Staten Island, NY 10301"},"assessor":{"name":"NYC Department of Finance (Staten Island)","address":"350 St. Marks Pl., Staten Island, NY 10301"}},"Rockland County, NY":{"recorder":{"name":"Rockland County Clerk","address":"1 S Main St. Suite 100, New City, NY 10956"},"assessor":{"name":"Rockland County Real Property Tax Service","address":"1 S Main St. Suite 100, New City, NY 10956"}},"St. Lawrence County, NY":{"recorder":{"name":"St. Lawrence County Clerk","address":"48 Court St., Canton, NY 13617"},"assessor":{"name":"St. Lawrence County Real Property Tax Service","address":"48 Court St., Canton, NY 13617"}},"Saratoga County, NY":{"recorder":{"name":"Saratoga County Clerk","address":"40 McMaster St. Suite 2, Ballston Spa, NY 12020"},"assessor":{"name":"Saratoga County Real Property Tax Service","address":"40 McMaster St. Suite 2, Ballston Spa, NY 12020"}},"Schenectady County, NY":{"recorder":{"name":"Schenectady County Clerk","address":"620 State St., Schenectady, NY 12305"},"assessor":{"name":"Schenectady County Real Property Tax Service","address":"620 State St., Schenectady, NY 12305"}},"Schoharie County, NY":{"recorder":{"name":"Schoharie County Clerk","address":"300 Main St., Schoharie, NY 12157"},"assessor":{"name":"Schoharie County Real Property Tax Service","address":"300 Main St., Schoharie, NY 12157"}},"Schuyler County, NY":{"recorder":{"name":"Schuyler County Clerk","address":"105 9th St. Unit 8, Watkins Glen, NY 14891"},"assessor":{"name":"Schuyler County Real Property Tax Service","address":"105 9th St. Unit 8, Watkins Glen, NY 14891"}},"Seneca County, NY":{"recorder":{"name":"Seneca County Clerk","address":"1 DiPronio Dr., Waterloo, NY 13165"},"assessor":{"name":"Seneca County Real Property Tax Service","address":"1 DiPronio Dr., Waterloo, NY 13165"}},"Steuben County, NY":{"recorder":{"name":"Steuben County Clerk","address":"3 E Pulteney Square, Bath, NY 14810"},"assessor":{"name":"Steuben County Real Property Tax Service","address":"3 E Pulteney Square, Bath, NY 14810"}},"Suffolk County, NY":{"recorder":{"name":"Suffolk County Clerk","address":"310 Center Dr., Riverhead, NY 11901"},"assessor":{"name":"Suffolk County Real Property Tax Service","address":"300 Center Dr., Riverhead, NY 11901"}},"Sullivan County, NY":{"recorder":{"name":"Sullivan County Clerk","address":"100 North St., Monticello, NY 12701"},"assessor":{"name":"Sullivan County Real Property Tax Service","address":"100 North St., Monticello, NY 12701"}},"Tioga County, NY":{"recorder":{"name":"Tioga County Clerk","address":"56 Main St., Owego, NY 13827"},"assessor":{"name":"Tioga County Real Property Tax Service","address":"56 Main St., Owego, NY 13827"}},"Tompkins County, NY":{"recorder":{"name":"Tompkins County Clerk","address":"320 N Tioga St., Ithaca, NY 14850"},"assessor":{"name":"Tompkins County Assessment","address":"128 E Buffalo St., Ithaca, NY 14850"}},"Ulster County, NY":{"recorder":{"name":"Ulster County Clerk","address":"244 Fair St., Kingston, NY 12401"},"assessor":{"name":"Ulster County Real Property Tax Service","address":"244 Fair St., Kingston, NY 12401"}},"Warren County, NY":{"recorder":{"name":"Warren County Clerk","address":"1340 State Route 9, Lake George, NY 12845"},"assessor":{"name":"Warren County Real Property Tax Service","address":"1340 State Route 9, Lake George, NY 12845"}},"Washington County, NY":{"recorder":{"name":"Washington County Clerk","address":"383 Broadway Fort Edward, NY 12828"},"assessor":{"name":"Washington County Real Property Tax Service","address":"383 Broadway, Fort Edward, NY 12828"}},"Wayne County, NY":{"recorder":{"name":"Wayne County Clerk","address":"9 Pearl St., Lyons, NY 14489"},"assessor":{"name":"Wayne County Real Property Tax Service","address":"9 Pearl St., Lyons, NY 14489"}},"Westchester County, NY":{"recorder":{"name":"Westchester County Clerk","address":"110 Dr. Martin Luther King Jr Blvd., White Plains, NY 10601"},"assessor":{"name":"Westchester County Real Property Tax Service","address":"110 Dr. Martin Luther King Jr Blvd., White Plains, NY 10601"}},"Wyoming County, NY":{"recorder":{"name":"Wyoming County Clerk","address":"143 N Main St., Warsaw, NY 14569"},"assessor":{"name":"Wyoming County Real Property Tax Service","address":"143 N Main St., Warsaw, NY 14569"}},"Yates County, NY":{"recorder":{"name":"Yates County Clerk","address":"417 Liberty St. Suite 1107, Penn Yan, NY 14527"},"assessor":{"name":"Yates County Real Property Tax Service","address":"417 Liberty St. Suite 1107, Penn Yan, NY 14527"}},"Adams County, OH":{"recorder":{"name":"Adams County Recorder","address":"110 W Main St., West Union, OH 45693"},"assessor":{"name":"Adams County Auditor","address":"110 W Main St., West Union, OH 45693"}},"Allen County, OH":{"recorder":{"name":"Allen County Recorder","address":"301 N Main St. Suite 204, Lima, OH 45801"},"assessor":{"name":"Allen County Auditor","address":"301 N Main St. Suite 203, Lima, OH 45801"}},"Ashland County, OH":{"recorder":{"name":"Ashland County Recorder","address":"142 W 2nd St., Ashland, OH 44805"},"assessor":{"name":"Ashland County Auditor","address":"142 W 2nd St., Ashland, OH 44805"}},"Ashtabula County, OH":{"recorder":{"name":"Ashtabula County Recorder","address":"25 W Jefferson St., Jefferson, OH 44047"},"assessor":{"name":"Ashtabula County Auditor","address":"25 W Jefferson St., Jefferson, OH 44047"}},"Athens County, OH":{"recorder":{"name":"Athens County Recorder","address":"15 S Court St., Athens, OH 45701"},"assessor":{"name":"Athens County Auditor","address":"15 S Court St., Athens, OH 45701"}},"Auglaize County, OH":{"recorder":{"name":"Auglaize County Recorder","address":"201 Willipie St. Suite 207, Wapakoneta, OH 45895"},"assessor":{"name":"Auglaize County Auditor","address":"201 Willipie St. Suite 207, Wapakoneta, OH 45895"}},"Belmont County, OH":{"recorder":{"name":"Belmont County Recorder","address":"101 W Main St., St. Clairsville, OH 43950"},"assessor":{"name":"Belmont County Auditor","address":"101 W Main St., St. Clairsville, OH 43950"}},"Brown County, OH":{"recorder":{"name":"Brown County Recorder","address":"800 Mt. Orab Pike Suite 1, Georgetown, OH 45121"},"assessor":{"name":"Brown County Auditor","address":"800 Mt. Orab Pike Suite 1, Georgetown, OH 45121"}},"Butler County, OH":{"recorder":{"name":"Butler County Recorder","address":"130 High St., Hamilton, OH 45011"},"assessor":{"name":"Butler County Auditor","address":"130 High St., Hamilton, OH 45011"}},"Carroll County, OH":{"recorder":{"name":"Carroll County Recorder","address":"119 Public Square, Carrollton, OH 44615"},"assessor":{"name":"Carroll County Auditor","address":"119 Public Square, Carrollton, OH 44615"}},"Champaign County, OH":{"recorder":{"name":"Champaign County Recorder","address":"200 N Main St., Urbana, OH 43078"},"assessor":{"name":"Champaign County Auditor","address":"200 N Main St., Urbana, OH 43078"}},"Clark County, OH":{"recorder":{"name":"Clark County Recorder","address":"31 N Limestone St., Springfield, OH 45502"},"assessor":{"name":"Clark County Auditor","address":"31 N Limestone St., Springfield, OH 45502"}},"Clermont County, OH":{"recorder":{"name":"Clermont County Recorder","address":"101 E Main St., Batavia, OH 45103"},"assessor":{"name":"Clermont County Auditor","address":"101 E Main St., Batavia, OH 45103"}},"Clinton County, OH":{"recorder":{"name":"Clinton County Recorder","address":"46 S South St., Wilmington, OH 45177"},"assessor":{"name":"Clinton County Auditor","address":"46 S South St., Wilmington, OH 45177"}},"Columbiana County, OH":{"recorder":{"name":"Columbiana County Recorder","address":"105 S Market St., Lisbon, OH 44432"},"assessor":{"name":"Columbiana County Auditor","address":"105 S Market St., Lisbon, OH 44432"}},"Coshocton County, OH":{"recorder":{"name":"Coshocton County Recorder","address":"349 Main St., Coshocton, OH 43812"},"assessor":{"name":"Coshocton County Auditor","address":"349 Main St., Coshocton, OH 43812"}},"Crawford County, OH":{"recorder":{"name":"Crawford County Recorder","address":"112 E Mansfield St., Bucyrus, OH 44820"},"assessor":{"name":"Crawford County Auditor","address":"112 E Mansfield St., Bucyrus, OH 44820"}},"Cuyahoga County, OH":{"recorder":{"name":"Cuyahoga County Fiscal Officer (Recording)","address":"2079 E 9th St., Cleveland, OH 44115"},"assessor":{"name":"Cuyahoga County Fiscal Officer (Assessment)","address":"2079 E 9th St., Cleveland, OH 44115"}},"Darke County, OH":{"recorder":{"name":"Darke County Recorder","address":"504 S Broadway, Greenville, OH 45331"},"assessor":{"name":"Darke County Auditor","address":"504 S Broadway, Greenville, OH 45331"}},"Defiance County, OH":{"recorder":{"name":"Defiance County Recorder","address":"500 Court St. Suite B, Defiance, OH 43512"},"assessor":{"name":"Defiance County Auditor","address":"500 Court St. Suite B, Defiance, OH 43512"}},"Delaware County, OH":{"recorder":{"name":"Delaware County Recorder","address":"91 N Sandusky St., Delaware, OH 43015"},"assessor":{"name":"Delaware County Auditor","address":"91 N Sandusky St., Delaware, OH 43015"}},"Erie County, OH":{"recorder":{"name":"Erie County Recorder","address":"247 Columbus Ave. Suite 210, Sandusky, OH 44870"},"assessor":{"name":"Erie County Auditor","address":"247 Columbus Ave. Suite 210, Sandusky, OH 44870"}},"Fairfield County, OH":{"recorder":{"name":"Fairfield County Recorder","address":"210 E Main St. Suite 201, Lancaster, OH 43130"},"assessor":{"name":"Fairfield County Auditor","address":"210 E Main St. Suite 201, Lancaster, OH 43130"}},"Fayette County, OH":{"recorder":{"name":"Fayette County Recorder","address":"110 E Court St., Washington Court House, OH 43160"},"assessor":{"name":"Fayette County Auditor","address":"110 E Court St., Washington Court House, OH 43160"}},"Franklin County, OH":{"recorder":{"name":"Franklin County Recorder","address":"373 S High St. 18th Floor, Columbus, OH 43215"},"assessor":{"name":"Franklin County Auditor","address":"373 S High St. 21st Floor, Columbus, OH 43215"}},"Fulton County, OH":{"recorder":{"name":"Fulton County Recorder","address":"152 S Fulton St. Suite 250, Wauseon, OH 43567"},"assessor":{"name":"Fulton County Auditor","address":"152 S Fulton St. Suite 250, Wauseon, OH 43567"}},"Gallia County, OH":{"recorder":{"name":"Gallia County Recorder","address":"18 Locust St. Room 1293, Gallipolis, OH 45631"},"assessor":{"name":"Gallia County Auditor","address":"18 Locust St. Room 1293, Gallipolis, OH 45631"}},"Geauga County, OH":{"recorder":{"name":"Geauga County Recorder","address":"231 Main St. Suite 1-C, Chardon, OH 44024"},"assessor":{"name":"Geauga County Auditor","address":"231 Main St. Suite 1-A, Chardon, OH 44024"}},"Greene County, OH":{"recorder":{"name":"Greene County Recorder","address":"45 N Detroit St., Xenia, OH 45385"},"assessor":{"name":"Greene County Auditor","address":"45 N Detroit St., Xenia, OH 45385"}},"Guernsey County, OH":{"recorder":{"name":"Guernsey County Recorder","address":"801 Wheeling Ave. Suite 304, Cambridge, OH 43725"},"assessor":{"name":"Guernsey County Auditor","address":"801 Wheeling Ave. Suite 304, Cambridge, OH 43725"}},"Hamilton County, OH":{"recorder":{"name":"Hamilton County Recorder","address":"138 E Court St. Room 202, Cincinnati, OH 45202"},"assessor":{"name":"Hamilton County Auditor","address":"138 E Court St. Room 304, Cincinnati, OH 45202"}},"Hancock County, OH":{"recorder":{"name":"Hancock County Recorder","address":"300 S Main St., Findlay, OH 45840"},"assessor":{"name":"Hancock County Auditor","address":"300 S Main St., Findlay, OH 45840"}},"Hardin County, OH":{"recorder":{"name":"Hardin County Recorder","address":"1 Courthouse Square Suite 140, Kenton, OH 43326"},"assessor":{"name":"Hardin County Auditor","address":"1 Courthouse Square Suite 140, Kenton, OH 43326"}},"Harrison County, OH":{"recorder":{"name":"Harrison County Recorder","address":"100 W Market St., Cadiz, OH 43907"},"assessor":{"name":"Harrison County Auditor","address":"100 W Market St., Cadiz, OH 43907"}},"Henry County, OH":{"recorder":{"name":"Henry County Recorder","address":"660 N Perry St. Suite 203, Napoleon, OH 43545"},"assessor":{"name":"Henry County Auditor","address":"660 N Perry St. Suite 203, Napoleon, OH 43545"}},"Highland County, OH":{"recorder":{"name":"Highland County Recorder","address":"114 Governor Foraker Pl., Hillsboro, OH 45133"},"assessor":{"name":"Highland County Auditor","address":"114 Governor Foraker Pl., Hillsboro, OH 45133"}},"Hocking County, OH":{"recorder":{"name":"Hocking County Recorder","address":"1 E Main St., Logan, OH 43138"},"assessor":{"name":"Hocking County Auditor","address":"1 E Main St., Logan, OH 43138"}},"Holmes County, OH":{"recorder":{"name":"Holmes County Recorder","address":"1 E Jackson St. Suite 200, Millersburg, OH 44654"},"assessor":{"name":"Holmes County Auditor","address":"1 E Jackson St. Suite 200, Millersburg, OH 44654"}},"Huron County, OH":{"recorder":{"name":"Huron County Recorder","address":"12 E Main St., Norwalk, OH 44857"},"assessor":{"name":"Huron County Auditor","address":"12 E Main St., Norwalk, OH 44857"}},"Jackson County, OH":{"recorder":{"name":"Jackson County Recorder","address":"226 E Main St., Jackson, OH 45640"},"assessor":{"name":"Jackson County Auditor","address":"226 E Main St., Jackson, OH 45640"}},"Jefferson County, OH":{"recorder":{"name":"Jefferson County Recorder","address":"301 Market St., Steubenville, OH 43952"},"assessor":{"name":"Jefferson County Auditor","address":"301 Market St., Steubenville, OH 43952"}},"Knox County, OH":{"recorder":{"name":"Knox County Recorder","address":"117 E High St. Suite 102, Mount Vernon, OH 43050"},"assessor":{"name":"Knox County Auditor","address":"117 E High St. Suite 102, Mount Vernon, OH 43050"}},"Lake County, OH":{"recorder":{"name":"Lake County Recorder","address":"105 Main St., Painesville, OH 44077"},"assessor":{"name":"Lake County Auditor","address":"105 Main St., Painesville, OH 44077"}},"Lawrence County, OH":{"recorder":{"name":"Lawrence County Recorder","address":"111 S 4th St., Ironton, OH 45638"},"assessor":{"name":"Lawrence County Auditor","address":"111 S 4th St., Ironton, OH 45638"}},"Licking County, OH":{"recorder":{"name":"Licking County Recorder","address":"20 S 2nd St., Newark, OH 43055"},"assessor":{"name":"Licking County Auditor","address":"20 S 2nd St., Newark, OH 43055"}},"Logan County, OH":{"recorder":{"name":"Logan County Recorder","address":"101 S Main St. Suite 28, Bellefontaine, OH 43311"},"assessor":{"name":"Logan County Auditor","address":"101 S Main St. Suite 28, Bellefontaine, OH 43311"}},"Lorain County, OH":{"recorder":{"name":"Lorain County Recorder","address":"226 Middle Ave. 3rd Floor, Elyria, OH 44035"},"assessor":{"name":"Lorain County Auditor","address":"226 Middle Ave. 3rd Floor, Elyria, OH 44035"}},"Lucas County, OH":{"recorder":{"name":"Lucas County Recorder","address":"1 Government Center Suite 700, Toledo, OH 43604"},"assessor":{"name":"Lucas County Auditor","address":"1 Government Center Suite 600, Toledo, OH 43604"}},"Madison County, OH":{"recorder":{"name":"Madison County Recorder","address":"1 N Main St., London, OH 43140"},"assessor":{"name":"Madison County Auditor","address":"1 N Main St., London, OH 43140"}},"Mahoning County, OH":{"recorder":{"name":"Mahoning County Recorder","address":"120 Market St., Youngstown, OH 44503"},"assessor":{"name":"Mahoning County Auditor","address":"120 Market St., Youngstown, OH 44503"}},"Marion County, OH":{"recorder":{"name":"Marion County Recorder","address":"222 W Center St., Marion, OH 43302"},"assessor":{"name":"Marion County Auditor","address":"222 W Center St., Marion, OH 43302"}},"Medina County, OH":{"recorder":{"name":"Medina County Recorder","address":"144 N Broadway St., Medina, OH 44256"},"assessor":{"name":"Medina County Auditor","address":"144 N Broadway St., Medina, OH 44256"}},"Meigs County, OH":{"recorder":{"name":"Meigs County Recorder","address":"100 E 2nd St., Pomeroy, OH 45769"},"assessor":{"name":"Meigs County Auditor","address":"100 E 2nd St., Pomeroy, OH 45769"}},"Mercer County, OH":{"recorder":{"name":"Mercer County Recorder","address":"101 N Main St. Room 103, Celina, OH 45822"},"assessor":{"name":"Mercer County Auditor","address":"101 N Main St. Room 103, Celina, OH 45822"}},"Miami County, OH":{"recorder":{"name":"Miami County Recorder","address":"201 W Main St., Troy, OH 45373"},"assessor":{"name":"Miami County Auditor","address":"201 W Main St., Troy, OH 45373"}},"Monroe County, OH":{"recorder":{"name":"Monroe County Recorder","address":"101 N Main St., Woodsfield, OH 43793"},"assessor":{"name":"Monroe County Auditor","address":"101 N Main St., Woodsfield, OH 43793"}},"Montgomery County, OH":{"recorder":{"name":"Montgomery County Recorder","address":"451 W 3rd St., Dayton, OH 45422"},"assessor":{"name":"Montgomery County Auditor","address":"451 W 3rd St., Dayton, OH 45422"}},"Morgan County, OH":{"recorder":{"name":"Morgan County Recorder","address":"19 E Main St., McConnelsville, OH 43756"},"assessor":{"name":"Morgan County Auditor","address":"19 E Main St., McConnelsville, OH 43756"}},"Morrow County, OH":{"recorder":{"name":"Morrow County Recorder","address":"48 E High St., Mount Gilead, OH 43338"},"assessor":{"name":"Morrow County Auditor","address":"48 E High St., Mount Gilead, OH 43338"}},"Muskingum County, OH":{"recorder":{"name":"Muskingum County Recorder","address":"401 Main St., Zanesville, OH 43701"},"assessor":{"name":"Muskingum County Auditor","address":"401 Main St., Zanesville, OH 43701"}},"Noble County, OH":{"recorder":{"name":"Noble County Recorder","address":"260 Courthouse, Caldwell, OH 43724"},"assessor":{"name":"Noble County Auditor","address":"260 Courthouse, Caldwell, OH 43724"}},"Ottawa County, OH":{"recorder":{"name":"Ottawa County Recorder","address":"315 Madison St. Room 203, Port Clinton, OH 43452"},"assessor":{"name":"Ottawa County Auditor","address":"315 Madison St. Room 203, Port Clinton, OH 43452"}},"Paulding County, OH":{"recorder":{"name":"Paulding County Recorder","address":"115 N Williams St., Paulding, OH 45879"},"assessor":{"name":"Paulding County Auditor","address":"115 N Williams St., Paulding, OH 45879"}},"Perry County, OH":{"recorder":{"name":"Perry County Recorder","address":"121 W Brown St., New Lexington, OH 43764"},"assessor":{"name":"Perry County Auditor","address":"121 W Brown St., New Lexington, OH 43764"}},"Pickaway County, OH":{"recorder":{"name":"Pickaway County Recorder","address":"207 S Court St., Circleville, OH 43113"},"assessor":{"name":"Pickaway County Auditor","address":"207 S Court St., Circleville, OH 43113"}},"Pike County, OH":{"recorder":{"name":"Pike County Recorder","address":"230 Waverly Plaza Suite 500, Waverly, OH 45690"},"assessor":{"name":"Pike County Auditor","address":"230 Waverly Plaza Suite 500, Waverly, OH 45690"}},"Portage County, OH":{"recorder":{"name":"Portage County Recorder","address":"449 S Meridian St., Ravenna, OH 44266"},"assessor":{"name":"Portage County Auditor","address":"449 S Meridian St., Ravenna, OH 44266"}},"Preble County, OH":{"recorder":{"name":"Preble County Recorder","address":"101 E Main St., Eaton, OH 45320"},"assessor":{"name":"Preble County Auditor","address":"101 E Main St., Eaton, OH 45320"}},"Putnam County, OH":{"recorder":{"name":"Putnam County Recorder","address":"245 E Main St. Suite 102, Ottawa, OH 45875"},"assessor":{"name":"Putnam County Auditor","address":"245 E Main St. Suite 102, Ottawa, OH 45875"}},"Richland County, OH":{"recorder":{"name":"Richland County Recorder","address":"50 Park Ave. E, Mansfield, OH 44902"},"assessor":{"name":"Richland County Auditor","address":"50 Park Ave. E, Mansfield, OH 44902"}},"Ross County, OH":{"recorder":{"name":"Ross County Recorder","address":"2 N Paint St. Suite D, Chillicothe, OH 45601"},"assessor":{"name":"Ross County Auditor","address":"2 N Paint St. Suite D, Chillicothe, OH 45601"}},"Sandusky County, OH":{"recorder":{"name":"Sandusky County Recorder","address":"100 N Park Ave. Suite 216, Fremont, OH 43420"},"assessor":{"name":"Sandusky County Auditor","address":"100 N Park Ave. Suite 216, Fremont, OH 43420"}},"Scioto County, OH":{"recorder":{"name":"Scioto County Recorder","address":"602 7th St., Portsmouth, OH 45662"},"assessor":{"name":"Scioto County Auditor","address":"602 7th St., Portsmouth, OH 45662"}},"Seneca County, OH":{"recorder":{"name":"Seneca County Recorder","address":"71 S Washington St. Suite 1101, Tiffin, OH 44883"},"assessor":{"name":"Seneca County Auditor","address":"71 S Washington St. Suite 1101, Tiffin, OH 44883"}},"Shelby County, OH":{"recorder":{"name":"Shelby County Recorder","address":"129 E Court St., Sidney, OH 45365"},"assessor":{"name":"Shelby County Auditor","address":"129 E Court St., Sidney, OH 45365"}},"Stark County, OH":{"recorder":{"name":"Stark County Recorder","address":"110 Central Plaza S Suite 210, Canton, OH 44702"},"assessor":{"name":"Stark County Auditor","address":"110 Central Plaza S Suite 210, Canton, OH 44702"}},"Summit County, OH":{"recorder":{"name":"Summit County Fiscal Officer (Recording)","address":"175 S Main St., Akron, OH 44308"},"assessor":{"name":"Summit County Fiscal Officer (Assessment)","address":"175 S Main St., Akron, OH 44308"}},"Trumbull County, OH":{"recorder":{"name":"Trumbull County Recorder","address":"160 High St. NW, Warren, OH 44481"},"assessor":{"name":"Trumbull County Auditor","address":"160 High St. NW, Warren, OH 44481"}},"Tuscarawas County, OH":{"recorder":{"name":"Tuscarawas County Recorder","address":"125 E High Ave., New Philadelphia, OH 44663"},"assessor":{"name":"Tuscarawas County Auditor","address":"125 E High Ave., New Philadelphia, OH 44663"}},"Union County, OH":{"recorder":{"name":"Union County Recorder","address":"233 W 6th St., Marysville, OH 43040"},"assessor":{"name":"Union County Auditor","address":"233 W 6th St., Marysville, OH 43040"}},"Van Wert County, OH":{"recorder":{"name":"Van Wert County Recorder","address":"121 E Main St., Van Wert, OH 45891"},"assessor":{"name":"Van Wert County Auditor","address":"121 E Main St., Van Wert, OH 45891"}},"Vinton County, OH":{"recorder":{"name":"Vinton County Recorder","address":"100 E Main St., McArthur, OH 45651"},"assessor":{"name":"Vinton County Auditor","address":"100 E Main St., McArthur, OH 45651"}},"Warren County, OH":{"recorder":{"name":"Warren County Recorder","address":"406 Justice Dr., Lebanon, OH 45036"},"assessor":{"name":"Warren County Auditor","address":"406 Justice Dr., Lebanon, OH 45036"}},"Washington County, OH":{"recorder":{"name":"Washington County Recorder","address":"205 Putnam St., Marietta, OH 45750"},"assessor":{"name":"Washington County Auditor","address":"205 Putnam St., Marietta, OH 45750"}},"Wayne County, OH":{"recorder":{"name":"Wayne County Recorder","address":"428 W Liberty St., Wooster, OH 44691"},"assessor":{"name":"Wayne County Auditor","address":"428 W Liberty St., Wooster, OH 44691"}},"Williams County, OH":{"recorder":{"name":"Williams County Recorder","address":"1 Courthouse Square, Bryan, OH 43506"},"assessor":{"name":"Williams County Auditor","address":"1 Courthouse Square, Bryan, OH 43506"}},"Wood County, OH":{"recorder":{"name":"Wood County Recorder","address":"1 Courthouse Square Suite 121, Bowling Green, OH 43402"},"assessor":{"name":"Wood County Auditor","address":"1 Courthouse Square Suite 121, Bowling Green, OH 43402"}},"Wyandot County, OH":{"recorder":{"name":"Wyandot County Recorder","address":"109 S Sandusky Ave. Room 23, Upper Sandusky, OH 43351"},"assessor":{"name":"Wyandot County Auditor","address":"109 S Sandusky Ave. Room 23, Upper Sandusky, OH 43351"}},"Adair County, OK":{"recorder":{"name":"Adair County Clerk","address":"220 W Division St., Stilwell, OK 74960"},"assessor":{"name":"Adair County Assessor","address":"220 W Division St., Stilwell, OK 74960"}},"Alfalfa County, OK":{"recorder":{"name":"Alfalfa County Clerk","address":"300 S Grand Ave. Suite 1, Cherokee, OK 73728"},"assessor":{"name":"Alfalfa County Assessor","address":"300 S Grand Ave. Suite 1, Cherokee, OK 73728"}},"Atoka County, OK":{"recorder":{"name":"Atoka County Clerk","address":"200 E Court St., Atoka, OK 74525"},"assessor":{"name":"Atoka County Assessor","address":"200 E Court St., Atoka, OK 74525"}},"Beaver County, OK":{"recorder":{"name":"Beaver County Clerk","address":"111 W 2nd St., Beaver, OK 73932"},"assessor":{"name":"Beaver County Assessor","address":"111 W 2nd St., Beaver, OK 73932"}},"Beckham County, OK":{"recorder":{"name":"Beckham County Clerk","address":"302 E Main St., Sayre, OK 73662"},"assessor":{"name":"Beckham County Assessor","address":"302 E Main St., Sayre, OK 73662"}},"Blaine County, OK":{"recorder":{"name":"Blaine County Clerk","address":"212 N Weigle Ave., Watonga, OK 73772"},"assessor":{"name":"Blaine County Assessor","address":"212 N Weigle Ave., Watonga, OK 73772"}},"Bryan County, OK":{"recorder":{"name":"Bryan County Clerk","address":"402 W Evergreen St., Durant, OK 74701"},"assessor":{"name":"Bryan County Assessor","address":"402 W Evergreen St., Durant, OK 74701"}},"Caddo County, OK":{"recorder":{"name":"Caddo County Clerk","address":"201 W Oklahoma Ave., Anadarko, OK 73005"},"assessor":{"name":"Caddo County Assessor","address":"201 W Oklahoma Ave., Anadarko, OK 73005"}},"Canadian County, OK":{"recorder":{"name":"Canadian County Clerk","address":"201 N Choctaw Ave., El Reno, OK 73036"},"assessor":{"name":"Canadian County Assessor","address":"201 N Choctaw Ave., El Reno, OK 73036"}},"Carter County, OK":{"recorder":{"name":"Carter County Clerk","address":"20 B St. SW, Ardmore, OK 73401"},"assessor":{"name":"Carter County Assessor","address":"20 B St. SW, Ardmore, OK 73401"}},"Cherokee County, OK":{"recorder":{"name":"Cherokee County Clerk","address":"213 W Delaware St., Tahlequah, OK 74464"},"assessor":{"name":"Cherokee County Assessor","address":"213 W Delaware St., Tahlequah, OK 74464"}},"Choctaw County, OK":{"recorder":{"name":"Choctaw County Clerk","address":"300 E Duke St., Hugo, OK 74743"},"assessor":{"name":"Choctaw County Assessor","address":"300 E Duke St., Hugo, OK 74743"}},"Cimarron County, OK":{"recorder":{"name":"Cimarron County Clerk","address":"100 S Boise St., Boise City, OK 73933"},"assessor":{"name":"Cimarron County Assessor","address":"100 S Boise St., Boise City, OK 73933"}},"Cleveland County, OK":{"recorder":{"name":"Cleveland County Clerk","address":"201 S Jones Ave., Norman, OK 73069"},"assessor":{"name":"Cleveland County Assessor","address":"201 S Jones Ave., Norman, OK 73069"}},"Coal County, OK":{"recorder":{"name":"Coal County Clerk","address":"4 N Main St., Coalgate, OK 74538"},"assessor":{"name":"Coal County Assessor","address":"4 N Main St., Coalgate, OK 74538"}},"Comanche County, OK":{"recorder":{"name":"Comanche County Clerk","address":"315 SW 5th St., Lawton, OK 73501"},"assessor":{"name":"Comanche County Assessor","address":"315 SW 5th St., Lawton, OK 73501"}},"Cotton County, OK":{"recorder":{"name":"Cotton County Clerk","address":"301 N Broadway St., Walters, OK 73572"},"assessor":{"name":"Cotton County Assessor","address":"301 N Broadway St., Walters, OK 73572"}},"Craig County, OK":{"recorder":{"name":"Craig County Clerk","address":"301 W Canadian Ave., Vinita, OK 74301"},"assessor":{"name":"Craig County Assessor","address":"301 W Canadian Ave., Vinita, OK 74301"}},"Creek County, OK":{"recorder":{"name":"Creek County Clerk","address":"317 E Lee Ave., Sapulpa, OK 74066"},"assessor":{"name":"Creek County Assessor","address":"317 E Lee Ave., Sapulpa, OK 74066"}},"Custer County, OK":{"recorder":{"name":"Custer County Clerk","address":"675 B St., Arapaho, OK 73620"},"assessor":{"name":"Custer County Assessor","address":"675 B St., Arapaho, OK 73620"}},"Delaware County, OK":{"recorder":{"name":"Delaware County Clerk","address":"1 Courthouse Dr., Jay, OK 74346"},"assessor":{"name":"Delaware County Assessor","address":"1 Courthouse Dr., Jay, OK 74346"}},"Dewey County, OK":{"recorder":{"name":"Dewey County Clerk","address":"213 W Prairie Ave., Taloga, OK 73667"},"assessor":{"name":"Dewey County Assessor","address":"213 W Prairie Ave., Taloga, OK 73667"}},"Ellis County, OK":{"recorder":{"name":"Ellis County Clerk","address":"100 S Washington St., Arnett, OK 73832"},"assessor":{"name":"Ellis County Assessor","address":"100 S Washington St., Arnett, OK 73832"}},"Garfield County, OK":{"recorder":{"name":"Garfield County Clerk","address":"114 W Broadway Ave., Enid, OK 73701"},"assessor":{"name":"Garfield County Assessor","address":"114 W Broadway Ave., Enid, OK 73701"}},"Garvin County, OK":{"recorder":{"name":"Garvin County Clerk","address":"201 W Grant Ave., Pauls Valley, OK 73075"},"assessor":{"name":"Garvin County Assessor","address":"201 W Grant Ave., Pauls Valley, OK 73075"}},"Grady County, OK":{"recorder":{"name":"Grady County Clerk","address":"326 W Choctaw Ave., Chickasha, OK 73018"},"assessor":{"name":"Grady County Assessor","address":"326 W Choctaw Ave., Chickasha, OK 73018"}},"Grant County, OK":{"recorder":{"name":"Grant County Clerk","address":"112 E Guthrie Ave., Medford, OK 73759"},"assessor":{"name":"Grant County Assessor","address":"112 E Guthrie Ave., Medford, OK 73759"}},"Greer County, OK":{"recorder":{"name":"Greer County Clerk","address":"106 E Jefferson St., Mangum, OK 73554"},"assessor":{"name":"Greer County Assessor","address":"106 E Jefferson St., Mangum, OK 73554"}},"Harmon County, OK":{"recorder":{"name":"Harmon County Clerk","address":"114 W Hollis St., Hollis, OK 73550"},"assessor":{"name":"Harmon County Assessor","address":"114 W Hollis St., Hollis, OK 73550"}},"Harper County, OK":{"recorder":{"name":"Harper County Clerk","address":"311 SE 1st St., Buffalo, OK 73834"},"assessor":{"name":"Harper County Assessor","address":"311 SE 1st St., Buffalo, OK 73834"}},"Haskell County, OK":{"recorder":{"name":"Haskell County Clerk","address":"202 E Main St., Stigler, OK 74462"},"assessor":{"name":"Haskell County Assessor","address":"202 E Main St., Stigler, OK 74462"}},"Hughes County, OK":{"recorder":{"name":"Hughes County Clerk","address":"200 N Broadway St., Holdenville, OK 74848"},"assessor":{"name":"Hughes County Assessor","address":"200 N Broadway St., Holdenville, OK 74848"}},"Jackson County, OK":{"recorder":{"name":"Jackson County Clerk","address":"101 N 5th St., Altus, OK 73521"},"assessor":{"name":"Jackson County Assessor","address":"101 N 5th St., Altus, OK 73521"}},"Jefferson County, OK":{"recorder":{"name":"Jefferson County Clerk","address":"220 N Main St., Waurika, OK 73573"},"assessor":{"name":"Jefferson County Assessor","address":"220 N Main St., Waurika, OK 73573"}},"Johnston County, OK":{"recorder":{"name":"Johnston County Clerk","address":"403 W Main St., Tishomingo, OK 73460"},"assessor":{"name":"Johnston County Assessor","address":"403 W Main St., Tishomingo, OK 73460"}},"Kay County, OK":{"recorder":{"name":"Kay County Clerk","address":"201 S Main St., Newkirk, OK 74647"},"assessor":{"name":"Kay County Assessor","address":"201 S Main St., Newkirk, OK 74647"}},"Kingfisher County, OK":{"recorder":{"name":"Kingfisher County Clerk","address":"101 S Main St., Kingfisher, OK 73750"},"assessor":{"name":"Kingfisher County Assessor","address":"101 S Main St., Kingfisher, OK 73750"}},"Kiowa County, OK":{"recorder":{"name":"Kiowa County Clerk","address":"316 S Main St., Hobart, OK 73651"},"assessor":{"name":"Kiowa County Assessor","address":"316 S Main St., Hobart, OK 73651"}},"Latimer County, OK":{"recorder":{"name":"Latimer County Clerk","address":"109 N Central St., Wilburton, OK 74578"},"assessor":{"name":"Latimer County Assessor","address":"109 N Central St., Wilburton, OK 74578"}},"Le Flore County, OK":{"recorder":{"name":"Le Flore County Clerk","address":"100 S Broadway St., Poteau, OK 74953"},"assessor":{"name":"Le Flore County Assessor","address":"100 S Broadway St., Poteau, OK 74953"}},"Lincoln County, OK":{"recorder":{"name":"Lincoln County Clerk","address":"811 Manvel Ave., Chandler, OK 74834"},"assessor":{"name":"Lincoln County Assessor","address":"811 Manvel Ave., Chandler, OK 74834"}},"Logan County, OK":{"recorder":{"name":"Logan County Clerk","address":"301 E Harrison Ave., Guthrie, OK 73044"},"assessor":{"name":"Logan County Assessor","address":"301 E Harrison Ave., Guthrie, OK 73044"}},"Love County, OK":{"recorder":{"name":"Love County Clerk","address":"405 W Main St., Marietta, OK 73448"},"assessor":{"name":"Love County Assessor","address":"405 W Main St., Marietta, OK 73448"}},"Major County, OK":{"recorder":{"name":"Major County Clerk","address":"500 E Broadway St., Fairview, OK 73737"},"assessor":{"name":"Major County Assessor","address":"500 E Broadway St., Fairview, OK 73737"}},"Marshall County, OK":{"recorder":{"name":"Marshall County Clerk","address":"1 Courthouse Dr., Madill, OK 73446"},"assessor":{"name":"Marshall County Assessor","address":"1 Courthouse Dr., Madill, OK 73446"}},"Mayes County, OK":{"recorder":{"name":"Mayes County Clerk","address":"1 Court Pl., Pryor, OK 74361"},"assessor":{"name":"Mayes County Assessor","address":"1 Court Pl., Pryor, OK 74361"}},"McClain County, OK":{"recorder":{"name":"McClain County Clerk","address":"121 N 2nd Ave., Purcell, OK 73080"},"assessor":{"name":"McClain County Assessor","address":"121 N 2nd Ave., Purcell, OK 73080"}},"McCurtain County, OK":{"recorder":{"name":"McCurtain County Clerk","address":"108 N Central Ave., Idabel, OK 74745"},"assessor":{"name":"McCurtain County Assessor","address":"108 N Central Ave., Idabel, OK 74745"}},"McIntosh County, OK":{"recorder":{"name":"McIntosh County Clerk","address":"110 N 1st St., Eufaula, OK 74432"},"assessor":{"name":"McIntosh County Assessor","address":"110 N 1st St., Eufaula, OK 74432"}},"Murray County, OK":{"recorder":{"name":"Murray County Clerk","address":"1 Courthouse Sq., Sulphur, OK 73086"},"assessor":{"name":"Murray County Assessor","address":"1 Courthouse Sq., Sulphur, OK 73086"}},"Muskogee County, OK":{"recorder":{"name":"Muskogee County Clerk","address":"400 W Broadway St., Muskogee, OK 74401"},"assessor":{"name":"Muskogee County Assessor","address":"400 W Broadway St., Muskogee, OK 74401"}},"Noble County, OK":{"recorder":{"name":"Noble County Clerk","address":"300 Courthouse Dr., Perry, OK 73077"},"assessor":{"name":"Noble County Assessor","address":"300 Courthouse Dr., Perry, OK 73077"}},"Nowata County, OK":{"recorder":{"name":"Nowata County Clerk","address":"229 N Maple St., Nowata, OK 74048"},"assessor":{"name":"Nowata County Assessor","address":"229 N Maple St., Nowata, OK 74048"}},"Okfuskee County, OK":{"recorder":{"name":"Okfuskee County Clerk","address":"200 S 3rd St., Okemah, OK 74859"},"assessor":{"name":"Okfuskee County Assessor","address":"200 S 3rd St., Okemah, OK 74859"}},"Oklahoma County, OK":{"recorder":{"name":"Oklahoma County Clerk","address":"320 Robert S Kerr Ave. Suite 203, Oklahoma City, OK 73102"},"assessor":{"name":"Oklahoma County Assessor","address":"320 Robert S Kerr Ave. Suite 313, Oklahoma City, OK 73102"}},"Okmulgee County, OK":{"recorder":{"name":"Okmulgee County Clerk","address":"314 W 7th St., Okmulgee, OK 74447"},"assessor":{"name":"Okmulgee County Assessor","address":"314 W 7th St., Okmulgee, OK 74447"}},"Osage County, OK":{"recorder":{"name":"Osage County Clerk","address":"600 Grandview Ave., Pawhuska, OK 74056"},"assessor":{"name":"Osage County Assessor","address":"600 Grandview Ave., Pawhuska, OK 74056"}},"Ottawa County, OK":{"recorder":{"name":"Ottawa County Clerk","address":"102 E Central Ave. Suite 106, Miami, OK 74354"},"assessor":{"name":"Ottawa County Assessor","address":"102 E Central Ave., Miami, OK 74354"}},"Pawnee County, OK":{"recorder":{"name":"Pawnee County Clerk","address":"500 Harrison St., Pawnee, OK 74058"},"assessor":{"name":"Pawnee County Assessor","address":"500 Harrison St., Pawnee, OK 74058"}},"Payne County, OK":{"recorder":{"name":"Payne County Clerk","address":"606 S Husband St., Stillwater, OK 74074"},"assessor":{"name":"Payne County Assessor","address":"606 S Husband St., Stillwater, OK 74074"}},"Pittsburg County, OK":{"recorder":{"name":"Pittsburg County Clerk","address":"115 E Carl Albert Pkwy., McAlester, OK 74501"},"assessor":{"name":"Pittsburg County Assessor","address":"115 E Carl Albert Pkwy., McAlester, OK 74501"}},"Pontotoc County, OK":{"recorder":{"name":"Pontotoc County Clerk","address":"120 W 13th St., Ada, OK 74820"},"assessor":{"name":"Pontotoc County Assessor","address":"120 W 13th St., Ada, OK 74820"}},"Pottawatomie County, OK":{"recorder":{"name":"Pottawatomie County Clerk","address":"325 N Broadway St., Shawnee, OK 74801"},"assessor":{"name":"Pottawatomie County Assessor","address":"325 N Broadway St., Shawnee, OK 74801"}},"Pushmataha County, OK":{"recorder":{"name":"Pushmataha County Clerk","address":"203 SW 3rd St., Antlers, OK 74523"},"assessor":{"name":"Pushmataha County Assessor","address":"203 SW 3rd St., Antlers, OK 74523"}},"Roger Mills County, OK":{"recorder":{"name":"Roger Mills County Clerk","address":"Cheyenne, OK 73628"},"assessor":{"name":"Roger Mills County Assessor","address":"Cheyenne, OK 73628"}},"Rogers County, OK":{"recorder":{"name":"Rogers County Clerk","address":"219 S Missouri Ave., Claremore, OK 74017"},"assessor":{"name":"Rogers County Assessor","address":"219 S Missouri Ave., Claremore, OK 74017"}},"Seminole County, OK":{"recorder":{"name":"Seminole County Clerk","address":"524 S Wewoka Ave., Wewoka, OK 74884"},"assessor":{"name":"Seminole County Assessor","address":"524 S Wewoka Ave., Wewoka, OK 74884"}},"Sequoyah County, OK":{"recorder":{"name":"Sequoyah County Clerk","address":"120 E Chickasaw Ave., Sallisaw, OK 74955"},"assessor":{"name":"Sequoyah County Assessor","address":"120 E Chickasaw Ave., Sallisaw, OK 74955"}},"Stephens County, OK":{"recorder":{"name":"Stephens County Clerk","address":"101 S 11th St., Duncan, OK 73533"},"assessor":{"name":"Stephens County Assessor","address":"101 S 11th St., Duncan, OK 73533"}},"Texas County, OK":{"recorder":{"name":"Texas County Clerk","address":"319 N Main St., Guymon, OK 73942"},"assessor":{"name":"Texas County Assessor","address":"319 N Main St., Guymon, OK 73942"}},"Tillman County, OK":{"recorder":{"name":"Tillman County Clerk","address":"201 N Main St., Frederick, OK 73542"},"assessor":{"name":"Tillman County Assessor","address":"201 N Main St., Frederick, OK 73542"}},"Tulsa County, OK":{"recorder":{"name":"Tulsa County Clerk","address":"500 S Denver Ave., Tulsa, OK 74103"},"assessor":{"name":"Tulsa County Assessor","address":"500 S Denver Ave. Suite 215, Tulsa, OK 74103"}},"Wagoner County, OK":{"recorder":{"name":"Wagoner County Clerk","address":"307 E Cherokee St., Wagoner, OK 74467"},"assessor":{"name":"Wagoner County Assessor","address":"307 E Cherokee St., Wagoner, OK 74467"}},"Washington County, OK":{"recorder":{"name":"Washington County Clerk","address":"420 S Johnstone Ave., Bartlesville, OK 74003"},"assessor":{"name":"Washington County Assessor","address":"420 S Johnstone Ave., Bartlesville, OK 74003"}},"Washita County, OK":{"recorder":{"name":"Washita County Clerk","address":"111 E Main St., Cordell, OK 73632"},"assessor":{"name":"Washita County Assessor","address":"111 E Main St., Cordell, OK 73632"}},"Woods County, OK":{"recorder":{"name":"Woods County Clerk","address":"407 Government St., Alva, OK 73717"},"assessor":{"name":"Woods County Assessor","address":"407 Government St., Alva, OK 73717"}},"Woodward County, OK":{"recorder":{"name":"Woodward County Clerk","address":"1600 Main St., Woodward, OK 73801"},"assessor":{"name":"Woodward County Assessor","address":"1600 Main St., Woodward, OK 73801"}},"Baker County, OR":{"recorder":{"name":"Baker County Clerk","address":"1995 3rd St. Suite 150, Baker City, OR 97814"},"assessor":{"name":"Baker County Assessor","address":"1995 3rd St. Suite 190, Baker City, OR 97814"}},"Benton County, OR":{"recorder":{"name":"Benton County Clerk","address":"4500 SW Research Way 2nd Floor, Corvallis, OR 97333"},"assessor":{"name":"Benton County Assessor","address":"4500 SW Research Way, Corvallis, OR 97333"}},"Clackamas County, OR":{"recorder":{"name":"Clackamas County Clerk","address":"1710 Red Soils Ct Suite 100, Oregon City, OR 97045"},"assessor":{"name":"Clackamas County Assessor","address":"150 Beavercreek Rd., Oregon City, OR 97045"}},"Clatsop County, OR":{"recorder":{"name":"Clatsop County Clerk","address":"820 Exchange St. Suite 220, Astoria, OR 97103"},"assessor":{"name":"Clatsop County Assessor","address":"820 Exchange St. Suite 210, Astoria, OR 97103"}},"Columbia County, OR":{"recorder":{"name":"Columbia County Clerk","address":"230 Strand St., St. Helens, OR 97051"},"assessor":{"name":"Columbia County Assessor","address":"230 Strand St., St. Helens, OR 97051"}},"Coos County, OR":{"recorder":{"name":"Coos County Clerk","address":"250 N. Baxter St., Coquille, OR 97423"},"assessor":{"name":"Coos County Assessor","address":"250 N. Baxter St., Coquille, OR 97423"}},"Crook County, OR":{"recorder":{"name":"Crook County Clerk","address":"300 NE 3rd St. Room 23, Prineville, OR 97754"},"assessor":{"name":"Crook County Assessor","address":"300 NE 3rd St. Room 24, Prineville, OR 97754"}},"Curry County, OR":{"recorder":{"name":"Curry County Clerk","address":"29821 Ellensburg Ave. 2nd Floor, Gold Beach, OR 97444"},"assessor":{"name":"Curry County Assessor","address":"29821 Ellensburg Ave., Gold Beach, OR 97444"}},"Deschutes County, OR":{"recorder":{"name":"Deschutes County Clerk","address":"1300 NW Wall St Suite 202, Bend, OR 97703"},"assessor":{"name":"Deschutes County Assessor","address":"1300 NW Wall St Suite 200, Bend, OR 97703"}},"Douglas County, OR":{"recorder":{"name":"Douglas County Clerk","address":"1036 SE Douglas Room 124, Roseburg, OR 97470"},"assessor":{"name":"Douglas County Assessor","address":"1036 SE Douglas Room 106, Roseburg, OR 97470"}},"Gilliam County, OR":{"recorder":{"name":"Gilliam County Clerk","address":"221 S. Oregon St. Room 200, Condon, OR 97823"},"assessor":{"name":"Gilliam County Assessor","address":"221 S. Oregon St., Condon, OR 97823"}},"Grant County, OR":{"recorder":{"name":"Grant County Clerk","address":"201 S. Humbolt Suite 290, Canyon City, OR 97820"},"assessor":{"name":"Grant County Assessor","address":"201 S. Humbolt Suite 270, Canyon City, OR 97820"}},"Harney County, OR":{"recorder":{"name":"Harney County Clerk","address":"450 N. Buena Vista Ave Suite 14, Burns, OR 97720"},"assessor":{"name":"Harney County Assessor","address":"450 N. Buena Vista Ave Suite 32, Burns, OR 97720"}},"Hood River County, OR":{"recorder":{"name":"Hood River County Clerk","address":"601 State St., Hood River, OR 97031"},"assessor":{"name":"Hood River County Assessor","address":"601 State St., Hood River, OR 97031"}},"Jackson County, OR":{"recorder":{"name":"Jackson County Clerk","address":"1101 W. Main St. Suite 201, Medford, OR 97501"},"assessor":{"name":"Jackson County Assessor","address":"10 S. Oakdale Ave. Room 300, Medford, OR 97501"}},"Jefferson County, OR":{"recorder":{"name":"Jefferson County Clerk","address":"66 SE D St. Suite C, Madras, OR 97741"},"assessor":{"name":"Jefferson County Assessor","address":"66 SE D St. Suite A, Madras, OR 97741"}},"Josephine County, OR":{"recorder":{"name":"Josephine County Clerk","address":"500 NW 6th St. Room 170, Grants Pass, OR 97526"},"assessor":{"name":"Josephine County Assessor","address":"500 NW 6th St. Room 175, Grants Pass, OR 97526"}},"Klamath County, OR":{"recorder":{"name":"Klamath County Clerk","address":"305 Main St., Klamath Falls, OR 97601"},"assessor":{"name":"Klamath County Assessor","address":"305 Main St., Klamath Falls, OR 97601"}},"Lake County, OR":{"recorder":{"name":"Lake County Clerk","address":"513 Center St., Lakeview, OR 97630"},"assessor":{"name":"Lake County Assessor","address":"513 Center St., Lakeview, OR 97630"}},"Lane County, OR":{"recorder":{"name":"Lane County Clerk","address":"275 W. 10th Ave., Eugene, OR 97401"},"assessor":{"name":"Lane County Assessor","address":"125 E. 8th Ave., Eugene, OR 97401"}},"Lincoln County, OR":{"recorder":{"name":"Lincoln County Clerk","address":"225 W. Olive St. Suite 201, Newport, OR 97365"},"assessor":{"name":"Lincoln County Assessor","address":"225 W. Olive St. Suite 103, Newport, OR 97365"}},"Linn County, OR":{"recorder":{"name":"Linn County Clerk","address":"421 Water Ave. NE Suite 1300, Albany, OR 97321"},"assessor":{"name":"Linn County Assessor","address":"300 4th Ave. SW Room 214, Albany, OR 97321"}},"Malheur County, OR":{"recorder":{"name":"Malheur County Clerk","address":"251 B St. W Suite 4, Vale, OR 97918"},"assessor":{"name":"Malheur County Assessor","address":"251 B St. W, Vale, OR 97918"}},"Marion County, OR":{"recorder":{"name":"Marion County Clerk","address":"555 Court St. NE Suite 2130, Salem, OR 97301"},"assessor":{"name":"Marion County Assessor","address":"PO Box 14500, Salem, OR 97309"}},"Morrow County, OR":{"recorder":{"name":"Morrow County Clerk","address":"100 S. Court St. Suite 102, Heppner, OR 97836"},"assessor":{"name":"Morrow County Assessor","address":"100 S. Court St., Heppner, OR 97836"}},"Multnomah County, OR":{"recorder":{"name":"Multnomah County Elections","address":"1040 SE Morrison St., Portland, OR 97214"},"assessor":{"name":"Multnomah County Assessor","address":"501 SE Hawthorne Blvd. Suite 175, Portland, OR 97214"}},"Polk County, OR":{"recorder":{"name":"Polk County Clerk","address":"850 Main St. Room 201, Dallas, OR 97338"},"assessor":{"name":"Polk County Assessor","address":"850 Main St. Room 202, Dallas, OR 97338"}},"Sherman County, OR":{"recorder":{"name":"Sherman County Clerk","address":"500 Court St., Moro, OR 97039"},"assessor":{"name":"Sherman County Assessor","address":"500 Court St., Moro, OR 97039"}},"Tillamook County, OR":{"recorder":{"name":"Tillamook County Clerk","address":"201 Laurel Ave., Tillamook, OR 97141"},"assessor":{"name":"Tillamook County Assessor","address":"201 Laurel Ave., Tillamook, OR 97141"}},"Umatilla County, OR":{"recorder":{"name":"Umatilla County Clerk","address":"216 SE 4th St. Suite 18, Pendleton, OR 97801"},"assessor":{"name":"Umatilla County Assessor","address":"216 SE 4th St., Pendleton, OR 97801"}},"Union County, OR":{"recorder":{"name":"Union County Clerk","address":"1001 4th St. Suite D, La Grande, OR 97850"},"assessor":{"name":"Union County Assessor","address":"1001 4th St. Suite A, La Grande, OR 97850"}},"Wallowa County, OR":{"recorder":{"name":"Wallowa County Clerk","address":"101 S. River St. Suite 100, Enterprise, OR 97828"},"assessor":{"name":"Wallowa County Assessor","address":"101 S. River St. Suite 201, Enterprise, OR 97828"}},"Wasco County, OR":{"recorder":{"name":"Wasco County Clerk","address":"401 E. 3rd St. Suite 100, The Dalles, OR 97058"},"assessor":{"name":"Wasco County Assessor","address":"511 Washington St. Suite 100, The Dalles, OR 97058"}},"Washington County, OR":{"recorder":{"name":"Washington County Elections","address":"2925 NE Aloclek Dr. Suite 170, Hillsboro, OR 97124"},"assessor":{"name":"Washington County Assessor","address":"155 N. First Ave. Suite 130, Hillsboro, OR 97124"}},"Wheeler County, OR":{"recorder":{"name":"Wheeler County Clerk","address":"701 Adams St. Suite 204, Fossil, OR 97830"},"assessor":{"name":"Wheeler County Assessor","address":"701 Adams St., Fossil, OR 97830"}},"Yamhill County, OR":{"recorder":{"name":"Yamhill County Clerk","address":"414 NE Evans St., McMinnville, OR 97128"},"assessor":{"name":"Yamhill County Assessor","address":"535 NE 5th St., McMinnville, OR 97128"}},"Adams County, PA":{"recorder":{"name":"Adams County Recorder of Deeds","address":"117 Baltimore St. Room 202, Gettysburg, PA 17325"},"assessor":{"name":"Adams County Assessment Office","address":"117 Baltimore St. Room 202, Gettysburg, PA 17325"}},"Allegheny County, PA":{"recorder":{"name":"Allegheny County Recorder of Deeds","address":"542 Forbes Ave. Room 101, Pittsburgh, PA 15219"},"assessor":{"name":"Allegheny County Office of Property Assessments","address":"542 Forbes Ave. Room 347, Pittsburgh, PA 15219"}},"Armstrong County, PA":{"recorder":{"name":"Armstrong County Recorder of Deeds","address":"500 E Market St. Suite 104, Kittanning, PA 16201"},"assessor":{"name":"Armstrong County Assessment Office","address":"500 E Market St. Suite 104, Kittanning, PA 16201"}},"Beaver County, PA":{"recorder":{"name":"Beaver County Recorder of Deeds","address":"810 3rd St., Beaver, PA 15009"},"assessor":{"name":"Beaver County Assessment Office","address":"810 3rd St., Beaver, PA 15009"}},"Bedford County, PA":{"recorder":{"name":"Bedford County Recorder of Deeds","address":"200 S Juliana St., Bedford, PA 15522"},"assessor":{"name":"Bedford County Assessment Office","address":"200 S Juliana St., Bedford, PA 15522"}},"Berks County, PA":{"recorder":{"name":"Berks County Recorder of Deeds","address":"633 Court St. 2nd Floor, Reading, PA 19601"},"assessor":{"name":"Berks County Assessment Office","address":"633 Court St. 3rd Floor, Reading, PA 19601"}},"Blair County, PA":{"recorder":{"name":"Blair County Recorder of Deeds","address":"423 Allegheny St. Suite 143, Hollidaysburg, PA 16648"},"assessor":{"name":"Blair County Assessment Office","address":"423 Allegheny St. Suite 143, Hollidaysburg, PA 16648"}},"Bradford County, PA":{"recorder":{"name":"Bradford County Recorder of Deeds","address":"301 Main St., Towanda, PA 18848"},"assessor":{"name":"Bradford County Assessment Office","address":"301 Main St., Towanda, PA 18848"}},"Bucks County, PA":{"recorder":{"name":"Bucks County Recorder of Deeds","address":"55 E Court St., Doylestown, PA 18901"},"assessor":{"name":"Bucks County Assessment Office","address":"55 E Court St., Doylestown, PA 18901"}},"Butler County, PA":{"recorder":{"name":"Butler County Recorder of Deeds","address":"124 W Diamond St., Butler, PA 16001"},"assessor":{"name":"Butler County Assessment Office","address":"124 W Diamond St., Butler, PA 16001"}},"Cambria County, PA":{"recorder":{"name":"Cambria County Recorder of Deeds","address":"200 S Center St., Ebensburg, PA 15931"},"assessor":{"name":"Cambria County Assessment Office","address":"200 S Center St., Ebensburg, PA 15931"}},"Cameron County, PA":{"recorder":{"name":"Cameron County Recorder of Deeds","address":"20 E 5th St., Emporium, PA 15834"},"assessor":{"name":"Cameron County Assessment Office","address":"20 E 5th St., Emporium, PA 15834"}},"Carbon County, PA":{"recorder":{"name":"Carbon County Recorder of Deeds","address":"2 Hazard Square Suite 3, Jim Thorpe, PA 18229"},"assessor":{"name":"Carbon County Assessment Office","address":"2 Hazard Square Suite 3, Jim Thorpe, PA 18229"}},"Centre County, PA":{"recorder":{"name":"Centre County Recorder of Deeds","address":"414 Holmes St. Suite 1, Bellefonte, PA 16823"},"assessor":{"name":"Centre County Assessment Office","address":"414 Holmes St. Suite 1, Bellefonte, PA 16823"}},"Chester County, PA":{"recorder":{"name":"Chester County Recorder of Deeds","address":"313 W Market St. Suite 3302, West Chester, PA 19380"},"assessor":{"name":"Chester County Assessment Office","address":"313 W Market St. Suite 4202, West Chester, PA 19380"}},"Clarion County, PA":{"recorder":{"name":"Clarion County Recorder of Deeds","address":"421 Main St. Suite 43, Clarion, PA 16214"},"assessor":{"name":"Clarion County Assessment Office","address":"421 Main St. Suite 43, Clarion, PA 16214"}},"Clearfield County, PA":{"recorder":{"name":"Clearfield County Recorder of Deeds","address":"1 N 2nd St. Suite 1, Clearfield, PA 16830"},"assessor":{"name":"Clearfield County Assessment Office","address":"1 N 2nd St. Suite 1, Clearfield, PA 16830"}},"Clinton County, PA":{"recorder":{"name":"Clinton County Recorder of Deeds","address":"230 E Water St., Lock Haven, PA 17745"},"assessor":{"name":"Clinton County Assessment Office","address":"230 E Water St., Lock Haven, PA 17745"}},"Columbia County, PA":{"recorder":{"name":"Columbia County Recorder of Deeds","address":"11 W Main St. Room 12, Bloomsburg, PA 17815"},"assessor":{"name":"Columbia County Assessment Office","address":"11 W Main St. Room 12, Bloomsburg, PA 17815"}},"Crawford County, PA":{"recorder":{"name":"Crawford County Recorder of Deeds","address":"903 Diamond Park, Meadville, PA 16335"},"assessor":{"name":"Crawford County Assessment Office","address":"903 Diamond Park, Meadville, PA 16335"}},"Cumberland County, PA":{"recorder":{"name":"Cumberland County Recorder of Deeds","address":"1 Courthouse Square Suite 120, Carlisle, PA 17013"},"assessor":{"name":"Cumberland County Assessment Office","address":"1 Courthouse Square Suite 120, Carlisle, PA 17013"}},"Dauphin County, PA":{"recorder":{"name":"Dauphin County Recorder of Deeds","address":"101 Market St. Room 102, Harrisburg, PA 17101"},"assessor":{"name":"Dauphin County Assessment Office","address":"2 S 2nd St., Harrisburg, PA 17101"}},"Delaware County, PA":{"recorder":{"name":"Delaware County Recorder of Deeds","address":"201 W Front St., Media, PA 19063"},"assessor":{"name":"Delaware County Assessment Office","address":"201 W Front St., Media, PA 19063"}},"Elk County, PA":{"recorder":{"name":"Elk County Recorder of Deeds","address":"250 Main St., Ridgway, PA 15853"},"assessor":{"name":"Elk County Assessment Office","address":"250 Main St., Ridgway, PA 15853"}},"Erie County, PA":{"recorder":{"name":"Erie County Recorder of Deeds","address":"140 W 6th St. Room 121, Erie, PA 16501"},"assessor":{"name":"Erie County Assessment Office","address":"140 W 6th St. Room 121, Erie, PA 16501"}},"Fayette County, PA":{"recorder":{"name":"Fayette County Recorder of Deeds","address":"61 E Main St., Uniontown, PA 15401"},"assessor":{"name":"Fayette County Assessment Office","address":"61 E Main St., Uniontown, PA 15401"}},"Forest County, PA":{"recorder":{"name":"Forest County Recorder of Deeds","address":"526 Elm St. Suite 1, Tionesta, PA 16353"},"assessor":{"name":"Forest County Assessment Office","address":"526 Elm St. Suite 1, Tionesta, PA 16353"}},"Franklin County, PA":{"recorder":{"name":"Franklin County Recorder of Deeds","address":"157 Lincoln Way E, Chambersburg, PA 17201"},"assessor":{"name":"Franklin County Assessment Office","address":"157 Lincoln Way E, Chambersburg, PA 17201"}},"Fulton County, PA":{"recorder":{"name":"Fulton County Recorder of Deeds","address":"201 N 2nd St. Suite 4, McConnellsburg, PA 17233"},"assessor":{"name":"Fulton County Assessment Office","address":"201 N 2nd St. Suite 4, McConnellsburg, PA 17233"}},"Greene County, PA":{"recorder":{"name":"Greene County Recorder of Deeds","address":"93 E High St. Room 106, Waynesburg, PA 15370"},"assessor":{"name":"Greene County Assessment Office","address":"93 E High St. Room 106, Waynesburg, PA 15370"}},"Huntingdon County, PA":{"recorder":{"name":"Huntingdon County Recorder of Deeds","address":"223 Penn St., Huntingdon, PA 16652"},"assessor":{"name":"Huntingdon County Assessment Office","address":"223 Penn St., Huntingdon, PA 16652"}},"Indiana County, PA":{"recorder":{"name":"Indiana County Recorder of Deeds","address":"825 Philadelphia St., Indiana, PA 15701"},"assessor":{"name":"Indiana County Assessment Office","address":"825 Philadelphia St., Indiana, PA 15701"}},"Jefferson County, PA":{"recorder":{"name":"Jefferson County Recorder of Deeds","address":"155 Main St. Suite 103, Brookville, PA 15825"},"assessor":{"name":"Jefferson County Assessment Office","address":"155 Main St. Suite 103, Brookville, PA 15825"}},"Juniata County, PA":{"recorder":{"name":"Juniata County Recorder of Deeds","address":"1 Bridge St., Mifflintown, PA 17059"},"assessor":{"name":"Juniata County Assessment Office","address":"1 Bridge St., Mifflintown, PA 17059"}},"Lackawanna County, PA":{"recorder":{"name":"Lackawanna County Recorder of Deeds","address":"135 Jefferson Ave., Scranton, PA 18503"},"assessor":{"name":"Lackawanna County Assessment Office","address":"135 Jefferson Ave., Scranton, PA 18503"}},"Lancaster County, PA":{"recorder":{"name":"Lancaster County Recorder of Deeds","address":"50 N Duke St., Lancaster, PA 17602"},"assessor":{"name":"Lancaster County Assessment Office","address":"150 N Queen St. Suite 310, Lancaster, PA 17603"}},"Lawrence County, PA":{"recorder":{"name":"Lawrence County Recorder of Deeds","address":"430 Court St., New Castle, PA 16101"},"assessor":{"name":"Lawrence County Assessment Office","address":"430 Court St., New Castle, PA 16101"}},"Lebanon County, PA":{"recorder":{"name":"Lebanon County Recorder of Deeds","address":"400 S 8th St. Room 103, Lebanon, PA 17042"},"assessor":{"name":"Lebanon County Assessment Office","address":"400 S 8th St. Room 103, Lebanon, PA 17042"}},"Lehigh County, PA":{"recorder":{"name":"Lehigh County Recorder of Deeds","address":"17 S 7th St., Allentown, PA 18101"},"assessor":{"name":"Lehigh County Assessment Office","address":"17 S 7th St., Allentown, PA 18101"}},"Luzerne County, PA":{"recorder":{"name":"Luzerne County Recorder of Deeds","address":"200 N River St., Wilkes-Barre, PA 18711"},"assessor":{"name":"Luzerne County Assessment Office","address":"200 N River St., Wilkes-Barre, PA 18711"}},"Lycoming County, PA":{"recorder":{"name":"Lycoming County Recorder of Deeds","address":"48 W 3rd St., Williamsport, PA 17701"},"assessor":{"name":"Lycoming County Assessment Office","address":"48 W 3rd St., Williamsport, PA 17701"}},"McKean County, PA":{"recorder":{"name":"McKean County Recorder of Deeds","address":"500 W Main St., Smethport, PA 16749"},"assessor":{"name":"McKean County Assessment Office","address":"500 W Main St., Smethport, PA 16749"}},"Mercer County, PA":{"recorder":{"name":"Mercer County Recorder of Deeds","address":"105 Mercer County Courthouse, Mercer, PA 16137"},"assessor":{"name":"Mercer County Assessment Office","address":"105 Mercer County Courthouse, Mercer, PA 16137"}},"Mifflin County, PA":{"recorder":{"name":"Mifflin County Recorder of Deeds","address":"20 N Wayne St., Lewistown, PA 17044"},"assessor":{"name":"Mifflin County Assessment Office","address":"20 N Wayne St., Lewistown, PA 17044"}},"Monroe County, PA":{"recorder":{"name":"Monroe County Recorder of Deeds","address":"1 Quaker Plaza Suite 103, Stroudsburg, PA 18360"},"assessor":{"name":"Monroe County Assessment Office","address":"1 Quaker Plaza Suite 103, Stroudsburg, PA 18360"}},"Montgomery County, PA":{"recorder":{"name":"Montgomery County Recorder of Deeds","address":"1 Montgomery Plaza Suite 303, Norristown, PA 19401"},"assessor":{"name":"Montgomery County Assessment Office","address":"1 Montgomery Plaza Suite 303, Norristown, PA 19401"}},"Montour County, PA":{"recorder":{"name":"Montour County Recorder of Deeds","address":"29 Mill St., Danville, PA 17821"},"assessor":{"name":"Montour County Assessment Office","address":"29 Mill St., Danville, PA 17821"}},"Northampton County, PA":{"recorder":{"name":"Northampton County Recorder of Deeds","address":"669 Washington St., Easton, PA 18042"},"assessor":{"name":"Northampton County Assessment Office","address":"669 Washington St., Easton, PA 18042"}},"Northumberland County, PA":{"recorder":{"name":"Northumberland County Recorder of Deeds","address":"201 Market St., Sunbury, PA 17801"},"assessor":{"name":"Northumberland County Assessment Office","address":"201 Market St., Sunbury, PA 17801"}},"Perry County, PA":{"recorder":{"name":"Perry County Recorder of Deeds","address":"2 E Main St. Suite 105, New Bloomfield, PA 17068"},"assessor":{"name":"Perry County Assessment Office","address":"2 E Main St. Suite 105, New Bloomfield, PA 17068"}},"Philadelphia County, PA":{"recorder":{"name":"Philadelphia Department of Records","address":"City Hall Room 154, Philadelphia, PA 19107"},"assessor":{"name":"Philadelphia Office of Property Assessment","address":"601 Walnut St. Suite 300W, Philadelphia, PA 19106"}},"Pike County, PA":{"recorder":{"name":"Pike County Recorder of Deeds","address":"410 Broad St., Milford, PA 18337"},"assessor":{"name":"Pike County Assessment Office","address":"410 Broad St., Milford, PA 18337"}},"Potter County, PA":{"recorder":{"name":"Potter County Recorder of Deeds","address":"1 E 2nd St. Suite 24, Coudersport, PA 16915"},"assessor":{"name":"Potter County Assessment Office","address":"1 E 2nd St. Suite 24, Coudersport, PA 16915"}},"Schuylkill County, PA":{"recorder":{"name":"Schuylkill County Recorder of Deeds","address":"401 N 2nd St., Pottsville, PA 17901"},"assessor":{"name":"Schuylkill County Assessment Office","address":"401 N 2nd St., Pottsville, PA 17901"}},"Snyder County, PA":{"recorder":{"name":"Snyder County Recorder of Deeds","address":"9 W Market St. Suite 121, Middleburg, PA 17842"},"assessor":{"name":"Snyder County Assessment Office","address":"9 W Market St. Suite 121, Middleburg, PA 17842"}},"Somerset County, PA":{"recorder":{"name":"Somerset County Recorder of Deeds","address":"111 E Union St. Suite 160, Somerset, PA 15501"},"assessor":{"name":"Somerset County Assessment Office","address":"111 E Union St. Suite 160, Somerset, PA 15501"}},"Sullivan County, PA":{"recorder":{"name":"Sullivan County Recorder of Deeds","address":"245 Muncy St. Suite 3, Laporte, PA 18626"},"assessor":{"name":"Sullivan County Assessment Office","address":"245 Muncy St. Suite 3, Laporte, PA 18626"}},"Susquehanna County, PA":{"recorder":{"name":"Susquehanna County Recorder of Deeds","address":"31 Lake Ave. Suite 2, Montrose, PA 18801"},"assessor":{"name":"Susquehanna County Assessment Office","address":"31 Lake Ave. Suite 2, Montrose, PA 18801"}},"Tioga County, PA":{"recorder":{"name":"Tioga County Recorder of Deeds","address":"118 Main St., Wellsboro, PA 16901"},"assessor":{"name":"Tioga County Assessment Office","address":"118 Main St., Wellsboro, PA 16901"}},"Union County, PA":{"recorder":{"name":"Union County Recorder of Deeds","address":"103 S 2nd St., Lewisburg, PA 17837"},"assessor":{"name":"Union County Assessment Office","address":"103 S 2nd St., Lewisburg, PA 17837"}},"Venango County, PA":{"recorder":{"name":"Venango County Recorder of Deeds","address":"1168 Liberty St. Suite 119, Franklin, PA 16323"},"assessor":{"name":"Venango County Assessment Office","address":"1168 Liberty St. Suite 119, Franklin, PA 16323"}},"Warren County, PA":{"recorder":{"name":"Warren County Recorder of Deeds","address":"204 4th Ave., Warren, PA 16365"},"assessor":{"name":"Warren County Assessment Office","address":"204 4th Ave., Warren, PA 16365"}},"Washington County, PA":{"recorder":{"name":"Washington County Recorder of Deeds","address":"100 W Beau St. Suite 203, Washington, PA 15301"},"assessor":{"name":"Washington County Assessment Office","address":"100 W Beau St. Suite 203, Washington, PA 15301"}},"Wayne County, PA":{"recorder":{"name":"Wayne County Recorder of Deeds","address":"925 Court St., Honesdale, PA 18431"},"assessor":{"name":"Wayne County Assessment Office","address":"925 Court St., Honesdale, PA 18431"}},"Westmoreland County, PA":{"recorder":{"name":"Westmoreland County Recorder of Deeds","address":"2 N Main St. Suite 503, Greensburg, PA 15601"},"assessor":{"name":"Westmoreland County Assessment Office","address":"2 N Main St. Suite 503, Greensburg, PA 15601"}},"Wyoming County, PA":{"recorder":{"name":"Wyoming County Recorder of Deeds","address":"1 Courthouse Square, Tunkhannock, PA 18657"},"assessor":{"name":"Wyoming County Assessment Office","address":"1 Courthouse Square, Tunkhannock, PA 18657"}},"York County, PA":{"recorder":{"name":"York County Recorder of Deeds","address":"28 E Market St., York, PA 17401"},"assessor":{"name":"York County Assessment Office","address":"28 E Market St., York, PA 17401"}},"Bristol County, RI":{"recorder":{"name":"Bristol Town Clerk (Bristol County Seat)","address":"10 Court St., Bristol, RI 02809"},"assessor":{"name":"Bristol Tax Assessor (Bristol County Seat)","address":"10 Court St., Bristol, RI 02809"}},"Kent County, RI":{"recorder":{"name":"East Greenwich Town Clerk (Kent County Seat)","address":"125 Main St., East Greenwich, RI 02818"},"assessor":{"name":"East Greenwich Tax Assessor (Kent County Seat)","address":"125 Main St., East Greenwich, RI 02818"}},"Newport County, RI":{"recorder":{"name":"Newport City Clerk (Newport County Seat)","address":"43 Broadway, Newport, RI 02840"},"assessor":{"name":"Newport Tax Assessor (Newport County Seat)","address":"43 Broadway, Newport, RI 02840"}},"Providence County, RI":{"recorder":{"name":"Providence City Clerk (Providence County Seat)","address":"25 Dorrance St. Room 300, Providence, RI 02903"},"assessor":{"name":"Providence Tax Assessor (Providence County Seat)","address":"25 Dorrance St. Room 208, Providence, RI 02903"}},"Washington County, RI":{"recorder":{"name":"West Kingston Town Clerk (Washington County Seat)","address":"4800 Tower Hill Rd., Wakefield, RI 02879"},"assessor":{"name":"South Kingstown Tax Assessor (Washington County Seat)","address":"180 High St., Wakefield, RI 02879"}},"Abbeville County, SC":{"recorder":{"name":"Abbeville County Register of Deeds","address":"102 Courthouse Square, Abbeville, SC 29620"},"assessor":{"name":"Abbeville County Assessor","address":"102 Courthouse Square, Abbeville, SC 29620"}},"Aiken County, SC":{"recorder":{"name":"Aiken County Register of Deeds","address":"828 Richland Ave., Aiken, SC 29801"},"assessor":{"name":"Aiken County Assessor","address":"828 Richland Ave., Aiken, SC 29801"}},"Allendale County, SC":{"recorder":{"name":"Allendale County Register of Deeds","address":"292 Barnwell Hwy, Allendale, SC 29810"},"assessor":{"name":"Allendale County Assessor","address":"292 Barnwell Hwy, Allendale, SC 29810"}},"Anderson County, SC":{"recorder":{"name":"Anderson County Register of Deeds","address":"100 S Main St., Anderson, SC 29624"},"assessor":{"name":"Anderson County Assessor","address":"401 E River St., Anderson, SC 29624"}},"Bamberg County, SC":{"recorder":{"name":"Bamberg County Register of Deeds","address":"1234 Courthouse Dr., Bamberg, SC 29003"},"assessor":{"name":"Bamberg County Assessor","address":"1234 Courthouse Dr., Bamberg, SC 29003"}},"Barnwell County, SC":{"recorder":{"name":"Barnwell County Register of Deeds","address":"141 Main St. Suite 4, Barnwell, SC 29812"},"assessor":{"name":"Barnwell County Assessor","address":"141 Main St. Suite 4, Barnwell, SC 29812"}},"Beaufort County, SC":{"recorder":{"name":"Beaufort County Register of Deeds","address":"100 Ribaut Rd., Beaufort, SC 29902"},"assessor":{"name":"Beaufort County Assessor","address":"100 Ribaut Rd., Beaufort, SC 29902"}},"Berkeley County, SC":{"recorder":{"name":"Berkeley County Register of Deeds","address":"223 N Live Oak Dr., Moncks Corner, SC 29461"},"assessor":{"name":"Berkeley County Assessor","address":"223 N Live Oak Dr., Moncks Corner, SC 29461"}},"Calhoun County, SC":{"recorder":{"name":"Calhoun County Register of Deeds","address":"302 S Railroad Ave., St. Matthews, SC 29135"},"assessor":{"name":"Calhoun County Assessor","address":"302 S Railroad Ave., St. Matthews, SC 29135"}},"Charleston County, SC":{"recorder":{"name":"Charleston County Register of Deeds","address":"4045 Bridge View Dr., North Charleston, SC 29405"},"assessor":{"name":"Charleston County Assessor","address":"3875 Faber Place Dr. Suite 100, North Charleston, SC 29405"}},"Cherokee County, SC":{"recorder":{"name":"Cherokee County Register of Deeds","address":"110 Railroad Ave., Gaffney, SC 29340"},"assessor":{"name":"Cherokee County Assessor","address":"110 Railroad Ave., Gaffney, SC 29340"}},"Chester County, SC":{"recorder":{"name":"Chester County Register of Deeds","address":"1476 J.A. Cochran Bypass, Chester, SC 29706"},"assessor":{"name":"Chester County Assessor","address":"1476 J.A. Cochran Bypass, Chester, SC 29706"}},"Chesterfield County, SC":{"recorder":{"name":"Chesterfield County Register of Deeds","address":"200 W Main St., Chesterfield, SC 29709"},"assessor":{"name":"Chesterfield County Assessor","address":"200 W Main St., Chesterfield, SC 29709"}},"Clarendon County, SC":{"recorder":{"name":"Clarendon County Register of Deeds","address":"411 Sunset Dr., Manning, SC 29102"},"assessor":{"name":"Clarendon County Assessor","address":"411 Sunset Dr., Manning, SC 29102"}},"Colleton County, SC":{"recorder":{"name":"Colleton County Register of Deeds","address":"31 Klein St., Walterboro, SC 29488"},"assessor":{"name":"Colleton County Assessor","address":"31 Klein St., Walterboro, SC 29488"}},"Darlington County, SC":{"recorder":{"name":"Darlington County Register of Deeds","address":"1 Public Square Room 210, Darlington, SC 29532"},"assessor":{"name":"Darlington County Assessor","address":"1 Public Square Room 210, Darlington, SC 29532"}},"Dillon County, SC":{"recorder":{"name":"Dillon County Register of Deeds","address":"405 W Main St., Dillon, SC 29536"},"assessor":{"name":"Dillon County Assessor","address":"405 W Main St., Dillon, SC 29536"}},"Dorchester County, SC":{"recorder":{"name":"Dorchester County Register of Deeds","address":"201 Johnston St., St. George, SC 29477"},"assessor":{"name":"Dorchester County Assessor","address":"201 Johnston St., St. George, SC 29477"}},"Edgefield County, SC":{"recorder":{"name":"Edgefield County Register of Deeds","address":"129 Courthouse Square, Edgefield, SC 29824"},"assessor":{"name":"Edgefield County Assessor","address":"129 Courthouse Square, Edgefield, SC 29824"}},"Fairfield County, SC":{"recorder":{"name":"Fairfield County Register of Deeds","address":"350 Columbia Rd., Winnsboro, SC 29180"},"assessor":{"name":"Fairfield County Assessor","address":"350 Columbia Rd., Winnsboro, SC 29180"}},"Florence County, SC":{"recorder":{"name":"Florence County Register of Deeds","address":"180 N Irby St. MSC-K, Florence, SC 29501"},"assessor":{"name":"Florence County Assessor","address":"180 N Irby St. MSC-R, Florence, SC 29501"}},"Georgetown County, SC":{"recorder":{"name":"Georgetown County Register of Deeds","address":"129 Screven St., Georgetown, SC 29440"},"assessor":{"name":"Georgetown County Assessor","address":"129 Screven St., Georgetown, SC 29440"}},"Greenville County, SC":{"recorder":{"name":"Greenville County Register of Deeds","address":"301 University Ridge Suite 1300, Greenville, SC 29601"},"assessor":{"name":"Greenville County Assessor","address":"301 University Ridge Suite 1000, Greenville, SC 29601"}},"Greenwood County, SC":{"recorder":{"name":"Greenwood County Register of Deeds","address":"528 Monument St., Greenwood, SC 29646"},"assessor":{"name":"Greenwood County Assessor","address":"528 Monument St., Greenwood, SC 29646"}},"Hampton County, SC":{"recorder":{"name":"Hampton County Register of Deeds","address":"1 Courthouse Square, Hampton, SC 29924"},"assessor":{"name":"Hampton County Assessor","address":"1 Courthouse Square, Hampton, SC 29924"}},"Horry County, SC":{"recorder":{"name":"Horry County Register of Deeds","address":"1301 2nd Ave., Conway, SC 29526"},"assessor":{"name":"Horry County Assessor","address":"1301 2nd Ave., Conway, SC 29526"}},"Jasper County, SC":{"recorder":{"name":"Jasper County Register of Deeds","address":"358 3rd Ave., Ridgeland, SC 29936"},"assessor":{"name":"Jasper County Assessor","address":"358 3rd Ave., Ridgeland, SC 29936"}},"Kershaw County, SC":{"recorder":{"name":"Kershaw County Register of Deeds","address":"1121 Broad St., Camden, SC 29020"},"assessor":{"name":"Kershaw County Assessor","address":"1121 Broad St., Camden, SC 29020"}},"Lancaster County, SC":{"recorder":{"name":"Lancaster County Register of Deeds","address":"101 N Main St., Lancaster, SC 29720"},"assessor":{"name":"Lancaster County Assessor","address":"101 N Main St., Lancaster, SC 29720"}},"Laurens County, SC":{"recorder":{"name":"Laurens County Register of Deeds","address":"100 Hillcrest Square Suite B, Laurens, SC 29360"},"assessor":{"name":"Laurens County Assessor","address":"100 Hillcrest Square Suite B, Laurens, SC 29360"}},"Lee County, SC":{"recorder":{"name":"Lee County Register of Deeds","address":"123 S Main St., Bishopville, SC 29010"},"assessor":{"name":"Lee County Assessor","address":"123 S Main St., Bishopville, SC 29010"}},"Lexington County, SC":{"recorder":{"name":"Lexington County Register of Deeds","address":"212 S Lake Dr. Suite 301, Lexington, SC 29072"},"assessor":{"name":"Lexington County Assessor","address":"212 S Lake Dr. Suite 201, Lexington, SC 29072"}},"Marion County, SC":{"recorder":{"name":"Marion County Register of Deeds","address":"P.O. Box 183, Marion, SC 29571"},"assessor":{"name":"Marion County Assessor","address":"2523 E Hwy 76, Marion, SC 29571"}},"Marlboro County, SC":{"recorder":{"name":"Marlboro County Register of Deeds","address":"105 Main St., Bennettsville, SC 29512"},"assessor":{"name":"Marlboro County Assessor","address":"105 Main St., Bennettsville, SC 29512"}},"McCormick County, SC":{"recorder":{"name":"McCormick County Register of Deeds","address":"133 S Mine St., McCormick, SC 29835"},"assessor":{"name":"McCormick County Assessor","address":"133 S Mine St., McCormick, SC 29835"}},"Newberry County, SC":{"recorder":{"name":"Newberry County Register of Deeds","address":"1539 Bypass 76, Newberry, SC 29108"},"assessor":{"name":"Newberry County Assessor","address":"1539 Bypass 76, Newberry, SC 29108"}},"Oconee County, SC":{"recorder":{"name":"Oconee County Register of Deeds","address":"415 S Pine St. Suite 107, Walhalla, SC 29691"},"assessor":{"name":"Oconee County Assessor","address":"415 S Pine St. Suite 107, Walhalla, SC 29691"}},"Orangeburg County, SC":{"recorder":{"name":"Orangeburg County Register of Deeds","address":"1437 Amelia St., Orangeburg, SC 29115"},"assessor":{"name":"Orangeburg County Assessor","address":"1437 Amelia St., Orangeburg, SC 29115"}},"Pickens County, SC":{"recorder":{"name":"Pickens County Register of Deeds","address":"222 McDaniel Ave. Bldg B, Pickens, SC 29671"},"assessor":{"name":"Pickens County Assessor","address":"222 McDaniel Ave. Bldg B, Pickens, SC 29671"}},"Richland County, SC":{"recorder":{"name":"Richland County Register of Deeds","address":"2020 Hampton St., Columbia, SC 29204"},"assessor":{"name":"Richland County Assessor","address":"2020 Hampton St., Columbia, SC 29204"}},"Saluda County, SC":{"recorder":{"name":"Saluda County Register of Deeds","address":"100 E Church St. Suite 4, Saluda, SC 29138"},"assessor":{"name":"Saluda County Assessor","address":"100 E Church St. Suite 4, Saluda, SC 29138"}},"Spartanburg County, SC":{"recorder":{"name":"Spartanburg County Register of Deeds","address":"366 N Church St. Suite 200, Spartanburg, SC 29303"},"assessor":{"name":"Spartanburg County Assessor","address":"366 N Church St. Suite 200, Spartanburg, SC 29303"}},"Sumter County, SC":{"recorder":{"name":"Sumter County Register of Deeds","address":"141 N Main St., Sumter, SC 29150"},"assessor":{"name":"Sumter County Assessor","address":"141 N Main St., Sumter, SC 29150"}},"Union County, SC":{"recorder":{"name":"Union County Register of Deeds","address":"210 W Main St., Union, SC 29379"},"assessor":{"name":"Union County Assessor","address":"210 W Main St., Union, SC 29379"}},"Williamsburg County, SC":{"recorder":{"name":"Williamsburg County Register of Deeds","address":"125 W Main St., Kingstree, SC 29556"},"assessor":{"name":"Williamsburg County Assessor","address":"125 W Main St., Kingstree, SC 29556"}},"York County, SC":{"recorder":{"name":"York County Register of Deeds","address":"1070 Heckle Blvd. Suite 107, Rock Hill, SC 29732"},"assessor":{"name":"York County Assessor","address":"1070 Heckle Blvd. Suite 107, Rock Hill, SC 29732"}},"Aurora County, SD":{"recorder":{"name":"Aurora County Register of Deeds","address":"401 N Main St., Plankinton, SD 57368"},"assessor":{"name":"Aurora County Director of Equalization","address":"401 N Main St., Plankinton, SD 57368"}},"Beadle County, SD":{"recorder":{"name":"Beadle County Register of Deeds","address":"450 3rd St SW, Huron, SD 57350"},"assessor":{"name":"Beadle County Director of Equalization","address":"450 3rd St SW, Huron, SD 57350"}},"Bennett County, SD":{"recorder":{"name":"Bennett County Register of Deeds","address":"202 Main St., Martin, SD 57551"},"assessor":{"name":"Bennett County Director of Equalization","address":"202 Main St., Martin, SD 57551"}},"Bon Homme County, SD":{"recorder":{"name":"Bon Homme County Register of Deeds","address":"300 W 18th Ave., Tyndall, SD 57066"},"assessor":{"name":"Bon Homme County Director of Equalization","address":"300 W 18th Ave., Tyndall, SD 57066"}},"Brookings County, SD":{"recorder":{"name":"Brookings County Register of Deeds","address":"314 6th Ave., Brookings, SD 57006"},"assessor":{"name":"Brookings County Director of Equalization","address":"314 6th Ave., Brookings, SD 57006"}},"Brown County, SD":{"recorder":{"name":"Brown County Register of Deeds","address":"25 Market St., Aberdeen, SD 57401"},"assessor":{"name":"Brown County Director of Equalization","address":"25 Market St., Aberdeen, SD 57401"}},"Brule County, SD":{"recorder":{"name":"Brule County Register of Deeds","address":"300 S Courtland St., Chamberlain, SD 57325"},"assessor":{"name":"Brule County Director of Equalization","address":"300 S Courtland St., Chamberlain, SD 57325"}},"Buffalo County, SD":{"recorder":{"name":"Buffalo County Register of Deeds","address":"101 Ash Ave., Gann Valley, SD 57341"},"assessor":{"name":"Buffalo County Director of Equalization","address":"101 Ash Ave., Gann Valley, SD 57341"}},"Butte County, SD":{"recorder":{"name":"Butte County Register of Deeds","address":"839 5th Ave., Belle Fourche, SD 57717"},"assessor":{"name":"Butte County Director of Equalization","address":"839 5th Ave., Belle Fourche, SD 57717"}},"Campbell County, SD":{"recorder":{"name":"Campbell County Register of Deeds","address":"111 2nd St., Mound City, SD 57646"},"assessor":{"name":"Campbell County Director of Equalization","address":"111 2nd St., Mound City, SD 57646"}},"Charles Mix County, SD":{"recorder":{"name":"Charles Mix County Register of Deeds","address":"400 Main St., Lake Andes, SD 57356"},"assessor":{"name":"Charles Mix County Director of Equalization","address":"400 Main St., Lake Andes, SD 57356"}},"Clark County, SD":{"recorder":{"name":"Clark County Register of Deeds","address":"200 N Commercial St., Clark, SD 57225"},"assessor":{"name":"Clark County Director of Equalization","address":"200 N Commercial St., Clark, SD 57225"}},"Clay County, SD":{"recorder":{"name":"Clay County Register of Deeds","address":"211 W Main St., Vermillion, SD 57069"},"assessor":{"name":"Clay County Director of Equalization","address":"211 W Main St., Vermillion, SD 57069"}},"Codington County, SD":{"recorder":{"name":"Codington County Register of Deeds","address":"14 1st Ave SE, Watertown, SD 57201"},"assessor":{"name":"Codington County Director of Equalization","address":"14 1st Ave SE, Watertown, SD 57201"}},"Corson County, SD":{"recorder":{"name":"Corson County Register of Deeds","address":"101 E Main St., McIntosh, SD 57641"},"assessor":{"name":"Corson County Director of Equalization","address":"101 E Main St., McIntosh, SD 57641"}},"Custer County, SD":{"recorder":{"name":"Custer County Register of Deeds","address":"420 Mt. Rushmore Rd., Custer, SD 57730"},"assessor":{"name":"Custer County Director of Equalization","address":"420 Mt. Rushmore Rd., Custer, SD 57730"}},"Davison County, SD":{"recorder":{"name":"Davison County Register of Deeds","address":"200 E 4th Ave., Mitchell, SD 57301"},"assessor":{"name":"Davison County Director of Equalization","address":"200 E 4th Ave., Mitchell, SD 57301"}},"Day County, SD":{"recorder":{"name":"Day County Register of Deeds","address":"711 W 1st St. Suite 202, Webster, SD 57274"},"assessor":{"name":"Day County Director of Equalization","address":"711 W 1st St., Webster, SD 57274"}},"Deuel County, SD":{"recorder":{"name":"Deuel County Register of Deeds","address":"687 4th Ave S, Clear Lake, SD 57226"},"assessor":{"name":"Deuel County Director of Equalization","address":"687 4th Ave S, Clear Lake, SD 57226"}},"Dewey County, SD":{"recorder":{"name":"Dewey County Register of Deeds","address":"1 Main Ave., Timber Lake, SD 57656"},"assessor":{"name":"Dewey County Director of Equalization","address":"1 Main Ave., Timber Lake, SD 57656"}},"Douglas County, SD":{"recorder":{"name":"Douglas County Register of Deeds","address":"710 Braddock St., Armour, SD 57313"},"assessor":{"name":"Douglas County Director of Equalization","address":"710 Braddock St., Armour, SD 57313"}},"Edmunds County, SD":{"recorder":{"name":"Edmunds County Register of Deeds","address":"210 2nd Ave. Suite 205, Ipswich, SD 57451"},"assessor":{"name":"Edmunds County Director of Equalization","address":"210 2nd Ave., Ipswich, SD 57451"}},"Fall River County, SD":{"recorder":{"name":"Fall River County Register of Deeds","address":"906 N River St., Hot Springs, SD 57747"},"assessor":{"name":"Fall River County Director of Equalization","address":"906 N River St., Hot Springs, SD 57747"}},"Faulk County, SD":{"recorder":{"name":"Faulk County Register of Deeds","address":"800 Main Ave., Faulkton, SD 57438"},"assessor":{"name":"Faulk County Director of Equalization","address":"800 Main Ave., Faulkton, SD 57438"}},"Grant County, SD":{"recorder":{"name":"Grant County Register of Deeds","address":"210 E 5th Ave., Milbank, SD 57252"},"assessor":{"name":"Grant County Director of Equalization","address":"210 E 5th Ave., Milbank, SD 57252"}},"Gregory County, SD":{"recorder":{"name":"Gregory County Register of Deeds","address":"221 Main St., Burke, SD 57523"},"assessor":{"name":"Gregory County Director of Equalization","address":"221 Main St., Burke, SD 57523"}},"Haakon County, SD":{"recorder":{"name":"Haakon County Register of Deeds","address":"140 S Howard Ave., Philip, SD 57567"},"assessor":{"name":"Haakon County Director of Equalization","address":"140 S Howard Ave., Philip, SD 57567"}},"Hamlin County, SD":{"recorder":{"name":"Hamlin County Register of Deeds","address":"300 E 3rd St., Hayti, SD 57241"},"assessor":{"name":"Hamlin County Director of Equalization","address":"300 E 3rd St., Hayti, SD 57241"}},"Hand County, SD":{"recorder":{"name":"Hand County Register of Deeds","address":"415 W 1st Ave., Miller, SD 57362"},"assessor":{"name":"Hand County Director of Equalization","address":"415 W 1st Ave., Miller, SD 57362"}},"Hanson County, SD":{"recorder":{"name":"Hanson County Register of Deeds","address":"720 5th St., Alexandria, SD 57311"},"assessor":{"name":"Hanson County Director of Equalization","address":"720 5th St., Alexandria, SD 57311"}},"Harding County, SD":{"recorder":{"name":"Harding County Register of Deeds","address":"920 Main St., Buffalo, SD 57720"},"assessor":{"name":"Harding County Director of Equalization","address":"920 Main St., Buffalo, SD 57720"}},"Hughes County, SD":{"recorder":{"name":"Hughes County Register of Deeds","address":"104 E Capitol Ave., Pierre, SD 57501"},"assessor":{"name":"Hughes County Director of Equalization","address":"104 E Capitol Ave., Pierre, SD 57501"}},"Hutchinson County, SD":{"recorder":{"name":"Hutchinson County Register of Deeds","address":"140 Euclid Dr., Olivet, SD 57052"},"assessor":{"name":"Hutchinson County Director of Equalization","address":"140 Euclid Dr., Olivet, SD 57052"}},"Hyde County, SD":{"recorder":{"name":"Hyde County Register of Deeds","address":"412 Commercial Ave., Highmore, SD 57345"},"assessor":{"name":"Hyde County Director of Equalization","address":"412 Commercial Ave., Highmore, SD 57345"}},"Jackson County, SD":{"recorder":{"name":"Jackson County Register of Deeds","address":"700 Main St., Kadoka, SD 57543"},"assessor":{"name":"Jackson County Director of Equalization","address":"700 Main St., Kadoka, SD 57543"}},"Jerauld County, SD":{"recorder":{"name":"Jerauld County Register of Deeds","address":"205 S Wallace St., Wessington Springs, SD 57382"},"assessor":{"name":"Jerauld County Director of Equalization","address":"205 S Wallace St., Wessington Springs, SD 57382"}},"Jones County, SD":{"recorder":{"name":"Jones County Register of Deeds","address":"710 Main St., Murdo, SD 57559"},"assessor":{"name":"Jones County Director of Equalization","address":"710 Main St., Murdo, SD 57559"}},"Kingsbury County, SD":{"recorder":{"name":"Kingsbury County Register of Deeds","address":"202 2nd St. SE, De Smet, SD 57231"},"assessor":{"name":"Kingsbury County Director of Equalization","address":"202 2nd St. SE, De Smet, SD 57231"}},"Lake County, SD":{"recorder":{"name":"Lake County Register of Deeds","address":"200 E Center St., Madison, SD 57042"},"assessor":{"name":"Lake County Director of Equalization","address":"200 E Center St., Madison, SD 57042"}},"Lawrence County, SD":{"recorder":{"name":"Lawrence County Register of Deeds","address":"90 Sherman St., Deadwood, SD 57732"},"assessor":{"name":"Lawrence County Director of Equalization","address":"90 Sherman St., Deadwood, SD 57732"}},"Lincoln County, SD":{"recorder":{"name":"Lincoln County Register of Deeds","address":"104 N Main Ave., Canton, SD 57013"},"assessor":{"name":"Lincoln County Director of Equalization","address":"104 N Main Ave., Canton, SD 57013"}},"Lyman County, SD":{"recorder":{"name":"Lyman County Register of Deeds","address":"300 Main St., Kennebec, SD 57544"},"assessor":{"name":"Lyman County Director of Equalization","address":"300 Main St., Kennebec, SD 57544"}},"Marshall County, SD":{"recorder":{"name":"Marshall County Register of Deeds","address":"911 Vander Horck St., Britton, SD 57430"},"assessor":{"name":"Marshall County Director of Equalization","address":"911 Vander Horck St., Britton, SD 57430"}},"McCook County, SD":{"recorder":{"name":"McCook County Register of Deeds","address":"130 W Essex Ave., Salem, SD 57058"},"assessor":{"name":"McCook County Director of Equalization","address":"130 W Essex Ave., Salem, SD 57058"}},"McPherson County, SD":{"recorder":{"name":"McPherson County Register of Deeds","address":"105 Main St., Leola, SD 57456"},"assessor":{"name":"McPherson County Director of Equalization","address":"105 Main St., Leola, SD 57456"}},"Meade County, SD":{"recorder":{"name":"Meade County Register of Deeds","address":"1425 Sherman St., Sturgis, SD 57785"},"assessor":{"name":"Meade County Director of Equalization","address":"1425 Sherman St., Sturgis, SD 57785"}},"Mellette County, SD":{"recorder":{"name":"Mellette County Register of Deeds","address":"1 Main Ave. N, White River, SD 57579"},"assessor":{"name":"Mellette County Director of Equalization","address":"1 Main Ave. N, White River, SD 57579"}},"Miner County, SD":{"recorder":{"name":"Miner County Register of Deeds","address":"235 E 2nd Ave., Howard, SD 57349"},"assessor":{"name":"Miner County Director of Equalization","address":"235 E 2nd Ave., Howard, SD 57349"}},"Minnehaha County, SD":{"recorder":{"name":"Minnehaha County Register of Deeds","address":"415 N Dakota Ave., Sioux Falls, SD 57104"},"assessor":{"name":"Minnehaha County Director of Equalization","address":"415 N Dakota Ave., Sioux Falls, SD 57104"}},"Moody County, SD":{"recorder":{"name":"Moody County Register of Deeds","address":"101 E Pipestone Ave., Flandreau, SD 57028"},"assessor":{"name":"Moody County Director of Equalization","address":"101 E Pipestone Ave., Flandreau, SD 57028"}},"Oglala Lakota County, SD":{"recorder":{"name":"Oglala Lakota County Register of Deeds","address":"101 N River Rd., Pine Ridge, SD 57770"},"assessor":{"name":"Oglala Lakota County Director of Equalization","address":"101 N River Rd., Pine Ridge, SD 57770"}},"Pennington County, SD":{"recorder":{"name":"Pennington County Register of Deeds","address":"315 Saint Joseph St., Rapid City, SD 57701"},"assessor":{"name":"Pennington County Director of Equalization","address":"315 Saint Joseph St., Rapid City, SD 57701"}},"Perkins County, SD":{"recorder":{"name":"Perkins County Register of Deeds","address":"1001 1st Ave., Bison, SD 57620"},"assessor":{"name":"Perkins County Director of Equalization","address":"1001 1st Ave., Bison, SD 57620"}},"Potter County, SD":{"recorder":{"name":"Potter County Register of Deeds","address":"201 S Exene St., Gettysburg, SD 57442"},"assessor":{"name":"Potter County Director of Equalization","address":"201 S Exene St., Gettysburg, SD 57442"}},"Roberts County, SD":{"recorder":{"name":"Roberts County Register of Deeds","address":"411 2nd Ave E, Sisseton, SD 57262"},"assessor":{"name":"Roberts County Director of Equalization","address":"411 2nd Ave E, Sisseton, SD 57262"}},"Sanborn County, SD":{"recorder":{"name":"Sanborn County Register of Deeds","address":"604 W 6th St., Woonsocket, SD 57385"},"assessor":{"name":"Sanborn County Director of Equalization","address":"604 W 6th St., Woonsocket, SD 57385"}},"Spink County, SD":{"recorder":{"name":"Spink County Register of Deeds","address":"210 E 7th Ave., Redfield, SD 57469"},"assessor":{"name":"Spink County Director of Equalization","address":"210 E 7th Ave., Redfield, SD 57469"}},"Stanley County, SD":{"recorder":{"name":"Stanley County Register of Deeds","address":"8 E 2nd Ave., Fort Pierre, SD 57532"},"assessor":{"name":"Stanley County Director of Equalization","address":"8 E 2nd Ave., Fort Pierre, SD 57532"}},"Sully County, SD":{"recorder":{"name":"Sully County Register of Deeds","address":"700 Ash Ave., Onida, SD 57564"},"assessor":{"name":"Sully County Director of Equalization","address":"700 Ash Ave., Onida, SD 57564"}},"Todd County, SD":{"recorder":{"name":"Todd County Register of Deeds","address":"200 E 3rd St., Winner, SD 57580"},"assessor":{"name":"Todd County Director of Equalization","address":"200 E 3rd St., Winner, SD 57580"}},"Tripp County, SD":{"recorder":{"name":"Tripp County Register of Deeds","address":"200 E 3rd St., Winner, SD 57580"},"assessor":{"name":"Tripp County Director of Equalization","address":"200 E 3rd St., Winner, SD 57580"}},"Turner County, SD":{"recorder":{"name":"Turner County Register of Deeds","address":"400 S Main St., Parker, SD 57053"},"assessor":{"name":"Turner County Director of Equalization","address":"400 S Main St., Parker, SD 57053"}},"Union County, SD":{"recorder":{"name":"Union County Register of Deeds","address":"209 E Main St., Elk Point, SD 57025"},"assessor":{"name":"Union County Director of Equalization","address":"209 E Main St., Elk Point, SD 57025"}},"Walworth County, SD":{"recorder":{"name":"Walworth County Register of Deeds","address":"1004 W 4th Ave., Selby, SD 57472"},"assessor":{"name":"Walworth County Director of Equalization","address":"1004 W 4th Ave., Selby, SD 57472"}},"Yankton County, SD":{"recorder":{"name":"Yankton County Register of Deeds","address":"321 W 3rd St., Yankton, SD 57078"},"assessor":{"name":"Yankton County Director of Equalization","address":"321 W 3rd St., Yankton, SD 57078"}},"Ziebach County, SD":{"recorder":{"name":"Ziebach County Register of Deeds","address":"100 Main St., Dupree, SD 57623"},"assessor":{"name":"Ziebach County Director of Equalization","address":"100 Main St., Dupree, SD 57623"}},"Anderson County, TN":{"recorder":{"name":"Anderson County Register of Deeds","address":"100 N Main St. Suite 203, Clinton, TN 37716"},"assessor":{"name":"Anderson County Assessor","address":"100 N Main St. Suite 202, Clinton, TN 37716"}},"Bedford County, TN":{"recorder":{"name":"Bedford County Register of Deeds","address":"1 Public Square Suite 105, Shelbyville, TN 37160"},"assessor":{"name":"Bedford County Assessor","address":"1 Public Square Suite 106, Shelbyville, TN 37160"}},"Benton County, TN":{"recorder":{"name":"Benton County Register of Deeds","address":"1 E Court Square Suite 101, Camden, TN 38320"},"assessor":{"name":"Benton County Assessor","address":"1 E Court Square Suite 203, Camden, TN 38320"}},"Bledsoe County, TN":{"recorder":{"name":"Bledsoe County Register of Deeds","address":"Courthouse Square, Pikeville, TN 37367"},"assessor":{"name":"Bledsoe County Assessor","address":"Courthouse Square, Pikeville, TN 37367"}},"Blount County, TN":{"recorder":{"name":"Blount County Register of Deeds","address":"345 Court St., Maryville, TN 37804"},"assessor":{"name":"Blount County Assessor","address":"345 Court St., Maryville, TN 37804"}},"Bradley County, TN":{"recorder":{"name":"Bradley County Register of Deeds","address":"155 Broad St. NW, Cleveland, TN 37311"},"assessor":{"name":"Bradley County Assessor","address":"155 Broad St. NW, Cleveland, TN 37311"}},"Campbell County, TN":{"recorder":{"name":"Campbell County Register of Deeds","address":"570 Main St., Jacksboro, TN 37757"},"assessor":{"name":"Campbell County Assessor","address":"570 Main St., Jacksboro, TN 37757"}},"Cannon County, TN":{"recorder":{"name":"Cannon County Register of Deeds","address":"200 W Main St., Woodbury, TN 37190"},"assessor":{"name":"Cannon County Assessor","address":"200 W Main St., Woodbury, TN 37190"}},"Carroll County, TN":{"recorder":{"name":"Carroll County Register of Deeds","address":"625 High St., Huntingdon, TN 38344"},"assessor":{"name":"Carroll County Assessor","address":"625 High St., Huntingdon, TN 38344"}},"Carter County, TN":{"recorder":{"name":"Carter County Register of Deeds","address":"801 E Elk Ave., Elizabethton, TN 37643"},"assessor":{"name":"Carter County Assessor","address":"801 E Elk Ave., Elizabethton, TN 37643"}},"Cheatham County, TN":{"recorder":{"name":"Cheatham County Register of Deeds","address":"100 Public Square Suite 101, Ashland City, TN 37015"},"assessor":{"name":"Cheatham County Assessor","address":"100 Public Square Suite 106, Ashland City, TN 37015"}},"Chester County, TN":{"recorder":{"name":"Chester County Register of Deeds","address":"133 E Main St., Henderson, TN 38340"},"assessor":{"name":"Chester County Assessor","address":"133 E Main St., Henderson, TN 38340"}},"Claiborne County, TN":{"recorder":{"name":"Claiborne County Register of Deeds","address":"1740 Main St., Tazewell, TN 37879"},"assessor":{"name":"Claiborne County Assessor","address":"1740 Main St., Tazewell, TN 37879"}},"Clay County, TN":{"recorder":{"name":"Clay County Register of Deeds","address":"145 Cordell Hull Dr., Celina, TN 38551"},"assessor":{"name":"Clay County Assessor","address":"145 Cordell Hull Dr., Celina, TN 38551"}},"Cocke County, TN":{"recorder":{"name":"Cocke County Register of Deeds","address":"111 Court Ave. Suite 104, Newport, TN 37821"},"assessor":{"name":"Cocke County Assessor","address":"111 Court Ave. Suite 104, Newport, TN 37821"}},"Coffee County, TN":{"recorder":{"name":"Coffee County Register of Deeds","address":"300 Hillsboro Blvd. Suite 9, Manchester, TN 37355"},"assessor":{"name":"Coffee County Assessor","address":"300 Hillsboro Blvd. Suite 9, Manchester, TN 37355"}},"Crockett County, TN":{"recorder":{"name":"Crockett County Register of Deeds","address":"1 S Bells St., Alamo, TN 38001"},"assessor":{"name":"Crockett County Assessor","address":"1 S Bells St., Alamo, TN 38001"}},"Cumberland County, TN":{"recorder":{"name":"Cumberland County Register of Deeds","address":"2 N Main St. Suite 205, Crossville, TN 38555"},"assessor":{"name":"Cumberland County Assessor","address":"2 N Main St. Suite 206, Crossville, TN 38555"}},"Davidson County, TN":{"recorder":{"name":"Davidson County Register of Deeds","address":"501 Broadway Suite 501, Nashville, TN 37203"},"assessor":{"name":"Davidson County Assessor","address":"700 2nd Ave S Suite 210, Nashville, TN 37210"}},"Decatur County, TN":{"recorder":{"name":"Decatur County Register of Deeds","address":"22 W Main St., Decaturville, TN 38329"},"assessor":{"name":"Decatur County Assessor","address":"22 W Main St., Decaturville, TN 38329"}},"DeKalb County, TN":{"recorder":{"name":"DeKalb County Register of Deeds","address":"1 Public Square Suite 101, Smithville, TN 37166"},"assessor":{"name":"DeKalb County Assessor","address":"1 Public Square Suite 101, Smithville, TN 37166"}},"Dickson County, TN":{"recorder":{"name":"Dickson County Register of Deeds","address":"4 Court Square Suite 201, Charlotte, TN 37036"},"assessor":{"name":"Dickson County Assessor","address":"4 Court Square Suite 201, Charlotte, TN 37036"}},"Dyer County, TN":{"recorder":{"name":"Dyer County Register of Deeds","address":"1 Veterans Square, Dyersburg, TN 38024"},"assessor":{"name":"Dyer County Assessor","address":"1 Veterans Square, Dyersburg, TN 38024"}},"Fayette County, TN":{"recorder":{"name":"Fayette County Register of Deeds","address":"1 Court Square Suite 100, Somerville, TN 38068"},"assessor":{"name":"Fayette County Assessor","address":"1 Court Square Suite 100, Somerville, TN 38068"}},"Fentress County, TN":{"recorder":{"name":"Fentress County Register of Deeds","address":"101 Main St., Jamestown, TN 38556"},"assessor":{"name":"Fentress County Assessor","address":"101 Main St., Jamestown, TN 38556"}},"Franklin County, TN":{"recorder":{"name":"Franklin County Register of Deeds","address":"1 S Jefferson St. Suite 101, Winchester, TN 37398"},"assessor":{"name":"Franklin County Assessor","address":"1 S Jefferson St. Suite 103, Winchester, TN 37398"}},"Gibson County, TN":{"recorder":{"name":"Gibson County Register of Deeds","address":"1 Court Square, Trenton, TN 38382"},"assessor":{"name":"Gibson County Assessor","address":"1 Court Square, Trenton, TN 38382"}},"Giles County, TN":{"recorder":{"name":"Giles County Register of Deeds","address":"1 Public Square Suite 200, Pulaski, TN 38478"},"assessor":{"name":"Giles County Assessor","address":"1 Public Square Suite 200, Pulaski, TN 38478"}},"Grainger County, TN":{"recorder":{"name":"Grainger County Register of Deeds","address":"Main St., Rutledge, TN 37861"},"assessor":{"name":"Grainger County Assessor","address":"Main St., Rutledge, TN 37861"}},"Greene County, TN":{"recorder":{"name":"Greene County Register of Deeds","address":"101 S Main St. Suite 111, Greeneville, TN 37743"},"assessor":{"name":"Greene County Assessor","address":"101 S Main St. Suite 111, Greeneville, TN 37743"}},"Grundy County, TN":{"recorder":{"name":"Grundy County Register of Deeds","address":"Altamont, TN 37301"},"assessor":{"name":"Grundy County Assessor","address":"Altamont, TN 37301"}},"Hamblen County, TN":{"recorder":{"name":"Hamblen County Register of Deeds","address":"511 W 2nd N St., Morristown, TN 37814"},"assessor":{"name":"Hamblen County Assessor","address":"511 W 2nd N St., Morristown, TN 37814"}},"Hamilton County, TN":{"recorder":{"name":"Hamilton County Register of Deeds","address":"625 Georgia Ave. Suite 200, Chattanooga, TN 37402"},"assessor":{"name":"Hamilton County Assessor","address":"6135 Heritage Park Dr., Chattanooga, TN 37416"}},"Hancock County, TN":{"recorder":{"name":"Hancock County Register of Deeds","address":"Main St., Sneedville, TN 37869"},"assessor":{"name":"Hancock County Assessor","address":"Main St., Sneedville, TN 37869"}},"Hardeman County, TN":{"recorder":{"name":"Hardeman County Register of Deeds","address":"100 N Main St., Bolivar, TN 38008"},"assessor":{"name":"Hardeman County Assessor","address":"100 N Main St., Bolivar, TN 38008"}},"Hardin County, TN":{"recorder":{"name":"Hardin County Register of Deeds","address":"601 Main St., Savannah, TN 38372"},"assessor":{"name":"Hardin County Assessor","address":"601 Main St., Savannah, TN 38372"}},"Hawkins County, TN":{"recorder":{"name":"Hawkins County Register of Deeds","address":"100 E Main St., Rogersville, TN 37857"},"assessor":{"name":"Hawkins County Assessor","address":"100 E Main St., Rogersville, TN 37857"}},"Haywood County, TN":{"recorder":{"name":"Haywood County Register of Deeds","address":"1 N Washington Ave., Brownsville, TN 38012"},"assessor":{"name":"Haywood County Assessor","address":"1 N Washington Ave., Brownsville, TN 38012"}},"Henderson County, TN":{"recorder":{"name":"Henderson County Register of Deeds","address":"17 Monroe Ave., Lexington, TN 38351"},"assessor":{"name":"Henderson County Assessor","address":"17 Monroe Ave., Lexington, TN 38351"}},"Henry County, TN":{"recorder":{"name":"Henry County Register of Deeds","address":"101 W Washington St. Suite 106, Paris, TN 38242"},"assessor":{"name":"Henry County Assessor","address":"101 W Washington St. Suite 106, Paris, TN 38242"}},"Hickman County, TN":{"recorder":{"name":"Hickman County Register of Deeds","address":"1 Public Square Suite 4, Centerville, TN 37033"},"assessor":{"name":"Hickman County Assessor","address":"1 Public Square Suite 4, Centerville, TN 37033"}},"Houston County, TN":{"recorder":{"name":"Houston County Register of Deeds","address":"Main St., Erin, TN 37061"},"assessor":{"name":"Houston County Assessor","address":"Main St., Erin, TN 37061"}},"Humphreys County, TN":{"recorder":{"name":"Humphreys County Register of Deeds","address":"1 Courthouse Square, Waverly, TN 37185"},"assessor":{"name":"Humphreys County Assessor","address":"1 Courthouse Square, Waverly, TN 37185"}},"Jackson County, TN":{"recorder":{"name":"Jackson County Register of Deeds","address":"101 Main St., Gainesboro, TN 38562"},"assessor":{"name":"Jackson County Assessor","address":"101 Main St., Gainesboro, TN 38562"}},"Jefferson County, TN":{"recorder":{"name":"Jefferson County Register of Deeds","address":"300 E Main St. Suite 210, Dandridge, TN 37725"},"assessor":{"name":"Jefferson County Assessor","address":"300 E Main St. Suite 210, Dandridge, TN 37725"}},"Johnson County, TN":{"recorder":{"name":"Johnson County Register of Deeds","address":"222 W Main St., Mountain City, TN 37683"},"assessor":{"name":"Johnson County Assessor","address":"222 W Main St., Mountain City, TN 37683"}},"Knox County, TN":{"recorder":{"name":"Knox County Register of Deeds","address":"400 W Main Ave. Suite 221, Knoxville, TN 37902"},"assessor":{"name":"Knox County Assessor","address":"400 W Main Ave. Suite 221, Knoxville, TN 37902"}},"Lake County, TN":{"recorder":{"name":"Lake County Register of Deeds","address":"229 Church St., Tiptonville, TN 38079"},"assessor":{"name":"Lake County Assessor","address":"229 Church St., Tiptonville, TN 38079"}},"Lauderdale County, TN":{"recorder":{"name":"Lauderdale County Register of Deeds","address":"100 Court Square Suite 3, Ripley, TN 38063"},"assessor":{"name":"Lauderdale County Assessor","address":"100 Court Square Suite 3, Ripley, TN 38063"}},"Lawrence County, TN":{"recorder":{"name":"Lawrence County Register of Deeds","address":"240 W Gaines St. Suite 101, Lawrenceburg, TN 38464"},"assessor":{"name":"Lawrence County Assessor","address":"240 W Gaines St. Suite 101, Lawrenceburg, TN 38464"}},"Lewis County, TN":{"recorder":{"name":"Lewis County Register of Deeds","address":"110 N Park Ave., Hohenwald, TN 38462"},"assessor":{"name":"Lewis County Assessor","address":"110 N Park Ave., Hohenwald, TN 38462"}},"Lincoln County, TN":{"recorder":{"name":"Lincoln County Register of Deeds","address":"112 Main Ave S Suite 101, Fayetteville, TN 37334"},"assessor":{"name":"Lincoln County Assessor","address":"112 Main Ave S Suite 101, Fayetteville, TN 37334"}},"Loudon County, TN":{"recorder":{"name":"Loudon County Register of Deeds","address":"101 Mulberry St. Suite 104, Loudon, TN 37774"},"assessor":{"name":"Loudon County Assessor","address":"101 Mulberry St. Suite 104, Loudon, TN 37774"}},"McMinn County, TN":{"recorder":{"name":"McMinn County Register of Deeds","address":"6 E Madison Ave., Athens, TN 37303"},"assessor":{"name":"McMinn County Assessor","address":"6 E Madison Ave., Athens, TN 37303"}},"McNairy County, TN":{"recorder":{"name":"McNairy County Register of Deeds","address":"300 Industrial Park Dr., Selmer, TN 38375"},"assessor":{"name":"McNairy County Assessor","address":"300 Industrial Park Dr., Selmer, TN 38375"}},"Macon County, TN":{"recorder":{"name":"Macon County Register of Deeds","address":"104 County Courthouse, Lafayette, TN 37083"},"assessor":{"name":"Macon County Assessor","address":"104 County Courthouse, Lafayette, TN 37083"}},"Madison County, TN":{"recorder":{"name":"Madison County Register of Deeds","address":"100 E Main St. Room 201, Jackson, TN 38301"},"assessor":{"name":"Madison County Assessor","address":"100 E Main St. Room 107, Jackson, TN 38301"}},"Marion County, TN":{"recorder":{"name":"Marion County Register of Deeds","address":"1 Courthouse Square Suite 2, Jasper, TN 37347"},"assessor":{"name":"Marion County Assessor","address":"1 Courthouse Square Suite 2, Jasper, TN 37347"}},"Marshall County, TN":{"recorder":{"name":"Marshall County Register of Deeds","address":"1 Public Square Suite 101, Lewisburg, TN 37091"},"assessor":{"name":"Marshall County Assessor","address":"1 Public Square Suite 101, Lewisburg, TN 37091"}},"Maury County, TN":{"recorder":{"name":"Maury County Register of Deeds","address":"41 Public Square Suite 201, Columbia, TN 38401"},"assessor":{"name":"Maury County Assessor","address":"41 Public Square Suite 101, Columbia, TN 38401"}},"Meigs County, TN":{"recorder":{"name":"Meigs County Register of Deeds","address":"17214 Hwy 58 N, Decatur, TN 37322"},"assessor":{"name":"Meigs County Assessor","address":"17214 Hwy 58 N, Decatur, TN 37322"}},"Monroe County, TN":{"recorder":{"name":"Monroe County Register of Deeds","address":"105 College St. Suite 1, Madisonville, TN 37354"},"assessor":{"name":"Monroe County Assessor","address":"105 College St. Suite 1, Madisonville, TN 37354"}},"Montgomery County, TN":{"recorder":{"name":"Montgomery County Register of Deeds","address":"350 Pageant Ln. Suite 101, Clarksville, TN 37040"},"assessor":{"name":"Montgomery County Assessor","address":"350 Pageant Ln. Suite 101, Clarksville, TN 37040"}},"Moore County, TN":{"recorder":{"name":"Moore County Register of Deeds","address":"196 Majors Blvd., Lynchburg, TN 37352"},"assessor":{"name":"Moore County Assessor","address":"196 Majors Blvd., Lynchburg, TN 37352"}},"Morgan County, TN":{"recorder":{"name":"Morgan County Register of Deeds","address":"415 N Kingston St., Wartburg, TN 37887"},"assessor":{"name":"Morgan County Assessor","address":"415 N Kingston St., Wartburg, TN 37887"}},"Obion County, TN":{"recorder":{"name":"Obion County Register of Deeds","address":"2 Bill Burnett Circle, Union City, TN 38261"},"assessor":{"name":"Obion County Assessor","address":"2 Bill Burnett Circle, Union City, TN 38261"}},"Overton County, TN":{"recorder":{"name":"Overton County Register of Deeds","address":"317 E University St., Livingston, TN 38570"},"assessor":{"name":"Overton County Assessor","address":"317 E University St., Livingston, TN 38570"}},"Perry County, TN":{"recorder":{"name":"Perry County Register of Deeds","address":"121 W Tennessee St., Linden, TN 37096"},"assessor":{"name":"Perry County Assessor","address":"121 W Tennessee St., Linden, TN 37096"}},"Pickett County, TN":{"recorder":{"name":"Pickett County Register of Deeds","address":"1 Courthouse Square, Byrdstown, TN 38549"},"assessor":{"name":"Pickett County Assessor","address":"1 Courthouse Square, Byrdstown, TN 38549"}},"Polk County, TN":{"recorder":{"name":"Polk County Register of Deeds","address":"P.O. Box 636, Benton, TN 37307"},"assessor":{"name":"Polk County Assessor","address":"Benton, TN 37307"}},"Putnam County, TN":{"recorder":{"name":"Putnam County Register of Deeds","address":"421 E Spring St. Suite 1, Cookeville, TN 38501"},"assessor":{"name":"Putnam County Assessor","address":"421 E Spring St. Suite 1, Cookeville, TN 38501"}},"Rhea County, TN":{"recorder":{"name":"Rhea County Register of Deeds","address":"375 Church St. Suite 16, Dayton, TN 37321"},"assessor":{"name":"Rhea County Assessor","address":"375 Church St. Suite 16, Dayton, TN 37321"}},"Roane County, TN":{"recorder":{"name":"Roane County Register of Deeds","address":"200 E Race St., Kingston, TN 37763"},"assessor":{"name":"Roane County Assessor","address":"200 E Race St., Kingston, TN 37763"}},"Robertson County, TN":{"recorder":{"name":"Robertson County Register of Deeds","address":"501 Main St. Suite 108, Springfield, TN 37172"},"assessor":{"name":"Robertson County Assessor","address":"501 Main St. Suite 108, Springfield, TN 37172"}},"Rutherford County, TN":{"recorder":{"name":"Rutherford County Register of Deeds","address":"319 N Maple St. Suite 218, Murfreesboro, TN 37130"},"assessor":{"name":"Rutherford County Assessor","address":"319 N Maple St. Suite 218, Murfreesboro, TN 37130"}},"Scott County, TN":{"recorder":{"name":"Scott County Register of Deeds","address":"88 Justice Center Ln., Huntsville, TN 37756"},"assessor":{"name":"Scott County Assessor","address":"88 Justice Center Ln., Huntsville, TN 37756"}},"Sequatchie County, TN":{"recorder":{"name":"Sequatchie County Register of Deeds","address":"Main St., Dunlap, TN 37327"},"assessor":{"name":"Sequatchie County Assessor","address":"Main St., Dunlap, TN 37327"}},"Sevier County, TN":{"recorder":{"name":"Sevier County Register of Deeds","address":"125 Court Ave. Suite 202E, Sevierville, TN 37862"},"assessor":{"name":"Sevier County Assessor","address":"125 Court Ave. Suite 202E, Sevierville, TN 37862"}},"Shelby County, TN":{"recorder":{"name":"Shelby County Register of Deeds","address":"1075 Mullins Station Rd., Memphis, TN 38134"},"assessor":{"name":"Shelby County Assessor","address":"1075 Mullins Station Rd., Memphis, TN 38134"}},"Smith County, TN":{"recorder":{"name":"Smith County Register of Deeds","address":"122 Turner High Circle Suite 107, Carthage, TN 37030"},"assessor":{"name":"Smith County Assessor","address":"122 Turner High Circle Suite 107, Carthage, TN 37030"}},"Stewart County, TN":{"recorder":{"name":"Stewart County Register of Deeds","address":"Main St., Dover, TN 37058"},"assessor":{"name":"Stewart County Assessor","address":"Main St., Dover, TN 37058"}},"Sullivan County, TN":{"recorder":{"name":"Sullivan County Register of Deeds","address":"3258 Highway 126 Suite 102, Blountville, TN 37617"},"assessor":{"name":"Sullivan County Assessor","address":"3258 Highway 126 Suite 102, Blountville, TN 37617"}},"Sumner County, TN":{"recorder":{"name":"Sumner County Register of Deeds","address":"355 N Belvedere Dr., Gallatin, TN 37066"},"assessor":{"name":"Sumner County Assessor","address":"355 N Belvedere Dr., Gallatin, TN 37066"}},"Tipton County, TN":{"recorder":{"name":"Tipton County Register of Deeds","address":"1801 S College St., Covington, TN 38019"},"assessor":{"name":"Tipton County Assessor","address":"1801 S College St., Covington, TN 38019"}},"Trousdale County, TN":{"recorder":{"name":"Trousdale County Register of Deeds","address":"328 E Main St. Suite 103, Hartsville, TN 37074"},"assessor":{"name":"Trousdale County Assessor","address":"328 E Main St. Suite 103, Hartsville, TN 37074"}},"Unicoi County, TN":{"recorder":{"name":"Unicoi County Register of Deeds","address":"100 Main Ave., Erwin, TN 37650"},"assessor":{"name":"Unicoi County Assessor","address":"100 Main Ave., Erwin, TN 37650"}},"Union County, TN":{"recorder":{"name":"Union County Register of Deeds","address":"901 Main St. Suite 201, Maynardville, TN 37807"},"assessor":{"name":"Union County Assessor","address":"901 Main St. Suite 201, Maynardville, TN 37807"}},"Van Buren County, TN":{"recorder":{"name":"Van Buren County Register of Deeds","address":"Courthouse Square, Spencer, TN 38585"},"assessor":{"name":"Van Buren County Assessor","address":"Courthouse Square, Spencer, TN 38585"}},"Warren County, TN":{"recorder":{"name":"Warren County Register of Deeds","address":"111 S Court Square Suite 201, McMinnville, TN 37110"},"assessor":{"name":"Warren County Assessor","address":"111 S Court Square Suite 201, McMinnville, TN 37110"}},"Washington County, TN":{"recorder":{"name":"Washington County Register of Deeds","address":"100 E Main St. Suite 203, Jonesborough, TN 37659"},"assessor":{"name":"Washington County Assessor","address":"100 E Main St. Suite 203, Jonesborough, TN 37659"}},"Wayne County, TN":{"recorder":{"name":"Wayne County Register of Deeds","address":"100 Court Circle Suite 5, Waynesboro, TN 38485"},"assessor":{"name":"Wayne County Assessor","address":"100 Court Circle Suite 5, Waynesboro, TN 38485"}},"Weakley County, TN":{"recorder":{"name":"Weakley County Register of Deeds","address":"116 W Main St. Suite 104, Dresden, TN 38225"},"assessor":{"name":"Weakley County Assessor","address":"116 W Main St. Suite 104, Dresden, TN 38225"}},"White County, TN":{"recorder":{"name":"White County Register of Deeds","address":"1 S Main St. Suite 3, Sparta, TN 38583"},"assessor":{"name":"White County Assessor","address":"1 S Main St. Suite 3, Sparta, TN 38583"}},"Williamson County, TN":{"recorder":{"name":"Williamson County Register of Deeds","address":"1320 W Main St. Suite 105, Franklin, TN 37064"},"assessor":{"name":"Williamson County Assessor","address":"1320 W Main St. Suite 105, Franklin, TN 37064"}},"Wilson County, TN":{"recorder":{"name":"Wilson County Register of Deeds","address":"228 E Main St., Lebanon, TN 37087"},"assessor":{"name":"Wilson County Assessor","address":"228 E Main St., Lebanon, TN 37087"}},"Anderson County, TX":{"recorder":{"name":"Anderson County Clerk","address":"500 N. Church St. #10, Palestine, TX 75801"},"assessor":{"name":"Anderson CAD","address":"PO Box 279, Palestine, TX 75802"}},"Andrews County, TX":{"recorder":{"name":"Andrews County Clerk","address":"PO Box 727, Andrews, TX 79714"},"assessor":{"name":"Andrews CAD","address":"600 N. Main, Andrews, TX 79714"}},"Angelina County, TX":{"recorder":{"name":"Angelina County Clerk","address":"PO Box 908, Lufkin, TX 75902"},"assessor":{"name":"Angelina CAD","address":"PO Box 2357, Lufkin, TX 75902"}},"Aransas County, TX":{"recorder":{"name":"Aransas County Clerk","address":"301 N. Live Oak St., Rockport, TX 78382"},"assessor":{"name":"Aransas CAD","address":"11 Highway 35 North, Rockport, TX 78382"}},"Archer County, TX":{"recorder":{"name":"Archer County Clerk","address":"PO Box 427, Archer City, TX 76351"},"assessor":{"name":"Archer CAD","address":"PO Box 1141, Archer City, TX 76351"}},"Armstrong County, TX":{"recorder":{"name":"Armstrong County Clerk","address":"PO Box 309, Claude, TX 79019"},"assessor":{"name":"Armstrong CAD","address":"PO Box 149, Claude, TX 79019"}},"Atascosa County, TX":{"recorder":{"name":"Atascosa County Clerk","address":"1 Courthouse Circle Dr., Jourdanton, TX 78026"},"assessor":{"name":"Atascosa CAD","address":"PO Box 600, Pleasanton, TX 78064"}},"Austin County, TX":{"recorder":{"name":"Austin County Clerk","address":"1 E. Main St., Bellville, TX 77418"},"assessor":{"name":"Austin CAD","address":"906 E. Amelia St., Bellville, TX 77418"}},"Bailey County, TX":{"recorder":{"name":"Bailey County Clerk","address":"300 S. 1st St., Muleshoe, TX 79347"},"assessor":{"name":"Bailey CAD","address":"302 Main St., Muleshoe, TX 79347"}},"Bandera County, TX":{"recorder":{"name":"Bandera County Clerk","address":"PO Box 823, Bandera, TX 78003"},"assessor":{"name":"Bandera CAD","address":"PO Box 1119, Bandera, TX 78003"}},"Bastrop County, TX":{"recorder":{"name":"Bastrop County Clerk","address":"803 Pine St. Ste 112, Bastrop, TX 78602"},"assessor":{"name":"Bastrop CAD","address":"PO Drawer 578, Bastrop, TX 78602"}},"Baylor County, TX":{"recorder":{"name":"Baylor County Clerk","address":"101 S. Washington, Seymour, TX 76380"},"assessor":{"name":"Baylor CAD","address":"211 N. Washington, Seymour, TX 76380"}},"Bee County, TX":{"recorder":{"name":"Bee County Clerk","address":"105 W. Corpus Christi St. Rm. 108, Beeville, TX 78102"},"assessor":{"name":"Bee CAD","address":"401 N. Washington, Beeville, TX 78102"}},"Bell County, TX":{"recorder":{"name":"Bell County Clerk","address":"PO Box 480, Belton, TX 76513"},"assessor":{"name":"Bell CAD","address":"PO Box 390, Belton, TX 76513"}},"Bexar County, TX":{"recorder":{"name":"Bexar County Clerk","address":"100 Dolorosa Ste. 104, San Antonio, TX 78205"},"assessor":{"name":"Bexar Appraisal District","address":"PO Box 830248, San Antonio, TX 78283"}},"Blanco County, TX":{"recorder":{"name":"Blanco County Clerk","address":"PO Box 65, Johnson City, TX 78636"},"assessor":{"name":"Blanco CAD","address":"PO Box 338, Johnson City, TX 78636"}},"Borden County, TX":{"recorder":{"name":"Borden County Clerk","address":"PO Box 124, Gail, TX 79738"},"assessor":{"name":"Borden CAD","address":"PO Box 298, Gail, TX 79738"}},"Bosque County, TX":{"recorder":{"name":"Bosque County Clerk","address":"PO Box 617, Meridian, TX 76665"},"assessor":{"name":"Bosque CAD","address":"PO Box 393, Meridian, TX 76665"}},"Bowie County, TX":{"recorder":{"name":"Bowie County Clerk","address":"710 James Bowie Dr., New Boston, TX 75570"},"assessor":{"name":"Bowie CAD","address":"122 Plaza West Suite A, Texarkana, TX 75501"}},"Brazoria County, TX":{"recorder":{"name":"Brazoria County Clerk","address":"111 E. Locust St., Angleton, TX 77515"},"assessor":{"name":"Brazoria CAD","address":"500 N. Chenango, Angleton, TX 77515"}},"Brazos County, TX":{"recorder":{"name":"Brazos County Clerk","address":"300 E. 26th St., Bryan, TX 77803"},"assessor":{"name":"Brazos CAD","address":"4051 Pendleton Drive, Bryan, TX 77802"}},"Brewster County, TX":{"recorder":{"name":"Brewster County Clerk","address":"PO Box 119, Alpine, TX 79831"},"assessor":{"name":"Brewster CAD","address":"107 W Ave E Box 2, Alpine, TX 79830"}},"Briscoe County, TX":{"recorder":{"name":"Briscoe County Clerk","address":"PO Box 555, Silverton, TX 79257"},"assessor":{"name":"Briscoe CAD","address":"PO Box 728, Silverton, TX 79257"}},"Brooks County, TX":{"recorder":{"name":"Brooks County Clerk","address":"PO Box 427, Falfurrias, TX 78355"},"assessor":{"name":"Brooks CAD","address":"PO Drawer A, Falfurrias, TX 78355"}},"Brown County, TX":{"recorder":{"name":"Brown County Clerk","address":"200 S. Broadway, Brownwood, TX 76801"},"assessor":{"name":"Brown CAD","address":"403 Fisk Ave., Brownwood, TX 76801"}},"Burleson County, TX":{"recorder":{"name":"Burleson County Clerk","address":"100 W. Buck St., Caldwell, TX 77836"},"assessor":{"name":"Burleson CAD","address":"PO Box 1000, Caldwell, TX 77836"}},"Burnet County, TX":{"recorder":{"name":"Burnet County Clerk","address":"220 S. Pierce St., Burnet, TX 78611"},"assessor":{"name":"Burnet CAD","address":"PO Box 908, Burnet, TX 78611"}},"Caldwell County, TX":{"recorder":{"name":"Caldwell County Clerk","address":"110 S. Main St., Lockhart, TX 78644"},"assessor":{"name":"Caldwell CAD","address":"PO Box 900, Lockhart, TX 78644"}},"Calhoun County, TX":{"recorder":{"name":"Calhoun County Clerk","address":"211 S. Ann St., Port Lavaca, TX 77979"},"assessor":{"name":"Calhoun CAD","address":"426 W. Main St., Port Lavaca, TX 77979"}},"Callahan County, TX":{"recorder":{"name":"Callahan County Clerk","address":"100 W. 4th St., Baird, TX 79504"},"assessor":{"name":"Callahan CAD","address":"302 Chestnut St., Baird, TX 79504"}},"Cameron County, TX":{"recorder":{"name":"Cameron County Clerk","address":"835 E. Levee St., Brownsville, TX 78520"},"assessor":{"name":"Cameron Appraisal District","address":"PO Box 1010, San Benito, TX 78586"}},"Camp County, TX":{"recorder":{"name":"Camp County Clerk","address":"126 Church St., Pittsburg, TX 75686"},"assessor":{"name":"Camp CAD","address":"143 Quitman St., Pittsburg, TX 75686"}},"Carson County, TX":{"recorder":{"name":"Carson County Clerk","address":"PO Box 487, Panhandle, TX 79068"},"assessor":{"name":"Carson CAD","address":"PO Box 970, Panhandle, TX 79068"}},"Cass County, TX":{"recorder":{"name":"Cass County Clerk","address":"PO Box 468, Linden, TX 75563"},"assessor":{"name":"Cass CAD","address":"502 N. Main St., Linden, TX 75563"}},"Castro County, TX":{"recorder":{"name":"Castro County Clerk","address":"100 E. Bedford St., Dimmitt, TX 79027"},"assessor":{"name":"Castro CAD","address":"204 SE 3rd (Rear), Dimmitt, TX 79027"}},"Chambers County, TX":{"recorder":{"name":"Chambers County Clerk","address":"PO Box 728, Anahuac, TX 77514"},"assessor":{"name":"Chambers CAD","address":"PO Box 1520, Anahuac, TX 77514"}},"Cherokee County, TX":{"recorder":{"name":"Cherokee County Clerk","address":"135 S. Main St., Rusk, TX 75785"},"assessor":{"name":"Cherokee CAD","address":"PO Box 494, Rusk, TX 75785"}},"Childress County, TX":{"recorder":{"name":"Childress County Clerk","address":"100 Ave E NW, Childress, TX 79201"},"assessor":{"name":"Childress CAD","address":"1710 Ave. F NW, Childress, TX 79201"}},"Clay County, TX":{"recorder":{"name":"Clay County Clerk","address":"PO Box 548, Henrietta, TX 76365"},"assessor":{"name":"Clay CAD","address":"PO Box 108, Henrietta, TX 76365"}},"Cochran County, TX":{"recorder":{"name":"Cochran County Clerk","address":"100 N. Main St., Morton, TX 79346"},"assessor":{"name":"Cochran CAD","address":"109 SE First St., Morton, TX 79346"}},"Coke County, TX":{"recorder":{"name":"Coke County Clerk","address":"13 E. 7th St., Robert Lee, TX 76945"},"assessor":{"name":"Coke CAD","address":"PO Box 2, Robert Lee, TX 76945"}},"Coleman County, TX":{"recorder":{"name":"Coleman County Clerk","address":"100 W. Liveoak St., Coleman, TX 76834"},"assessor":{"name":"Coleman CAD","address":"PO Box 914, Coleman, TX 76834"}},"Collin County, TX":{"recorder":{"name":"Collin County Clerk","address":"2300 Bloomdale Rd., McKinney, TX 75071"},"assessor":{"name":"Collin CAD","address":"250 Eldorado Pkwy., McKinney, TX 75069"}},"Collingsworth County, TX":{"recorder":{"name":"Collingsworth County Clerk","address":"800 West Ave., Wellington, TX 79095"},"assessor":{"name":"Collingsworth CAD","address":"800 W. Ave. Box 9, Wellington, TX 79095"}},"Colorado County, TX":{"recorder":{"name":"Colorado County Clerk","address":"400 Spring St., Columbus, TX 78934"},"assessor":{"name":"Colorado CAD","address":"PO Box 10, Columbus, TX 78934"}},"Comal County, TX":{"recorder":{"name":"Comal County Clerk","address":"150 N. Seguin Ave., New Braunfels, TX 78130"},"assessor":{"name":"Comal Appraisal District","address":"900 S. Seguin Ave., New Braunfels, TX 78130"}},"Comanche County, TX":{"recorder":{"name":"Comanche County Clerk","address":"101 W. Central Ave., Comanche, TX 76442"},"assessor":{"name":"Comanche CAD","address":"8 Huett Circle, Comanche, TX 76442"}},"Concho County, TX":{"recorder":{"name":"Concho County Clerk","address":"PO Box 98, Paint Rock, TX 76866"},"assessor":{"name":"Concho CAD","address":"PO Box 68, Paint Rock, TX 76866"}},"Cooke County, TX":{"recorder":{"name":"Cooke County Clerk","address":"100 S. Dixon St., Gainesville, TX 76240"},"assessor":{"name":"Cooke CAD","address":"201 North Dixon, Gainesville, TX 76240"}},"Coryell County, TX":{"recorder":{"name":"Coryell County Clerk","address":"PO Box 237, Gatesville, TX 76528"},"assessor":{"name":"Coryell CAD","address":"705 E. Main St., Gatesville, TX 76528"}},"Cottle County, TX":{"recorder":{"name":"Cottle County Clerk","address":"PO Box 717, Paducah, TX 79248"},"assessor":{"name":"Cottle CAD","address":"PO Box 459, Paducah, TX 79248"}},"Crane County, TX":{"recorder":{"name":"Crane County Clerk","address":"PO Box 578, Crane, TX 79731"},"assessor":{"name":"Crane CAD","address":"511 West 8th St., Crane, TX 79731"}},"Crockett County, TX":{"recorder":{"name":"Crockett County Clerk","address":"PO Box 185, Ozona, TX 76943"},"assessor":{"name":"Crockett CAD","address":"PO Box 1569, Ozona, TX 76943"}},"Crosby County, TX":{"recorder":{"name":"Crosby County Clerk","address":"201 W. Aspen St., Crosbyton, TX 79322"},"assessor":{"name":"Crosby CAD","address":"PO Box 505, Crosbyton, TX 79322"}},"Culberson County, TX":{"recorder":{"name":"Culberson County Clerk","address":"PO Box 158, Van Horn, TX 79855"},"assessor":{"name":"Culberson CAD","address":"PO Box 550, Van Horn, TX 79855"}},"Dallam County, TX":{"recorder":{"name":"Dallam County Clerk","address":"PO Box 835, Dalhart, TX 79022"},"assessor":{"name":"Dallam CAD","address":"PO Box 579, Dalhart, TX 79022"}},"Dallas County, TX":{"recorder":{"name":"Dallas County Clerk","address":"500 Elm St. Ste 2100, Dallas, TX 75202"},"assessor":{"name":"Dallas CAD","address":"2949 North Stemmons Fwy., Dallas, TX 75247"}},"Dawson County, TX":{"recorder":{"name":"Dawson County Clerk","address":"PO Box 1268, Lamesa, TX 79331"},"assessor":{"name":"Dawson CAD","address":"PO Box 797, Lamesa, TX 79331"}},"Deaf Smith County, TX":{"recorder":{"name":"Deaf Smith County Clerk","address":"235 E. 3rd St., Hereford, TX 79045"},"assessor":{"name":"Deaf Smith CAD","address":"PO Box 2298, Hereford, TX 79045"}},"Delta County, TX":{"recorder":{"name":"Delta County Clerk","address":"200 W. Dallas Ave., Cooper, TX 75432"},"assessor":{"name":"Delta CAD","address":"PO Box 47, Cooper, TX 75432"}},"Denton County, TX":{"recorder":{"name":"Denton County Clerk","address":"1450 E. McKinney St., Denton, TX 76201"},"assessor":{"name":"Denton CAD","address":"PO Box 2816, Denton, TX 76202"}},"De Witt County, TX":{"recorder":{"name":"De Witt County Clerk","address":"307 N. Gonzales St., Cuero, TX 77954"},"assessor":{"name":"DeWitt CAD","address":"103 E. Bailey St., Cuero, TX 77954"}},"Dickens County, TX":{"recorder":{"name":"Dickens County Clerk","address":"PO Box 120, Dickens, TX 79229"},"assessor":{"name":"Dickens CAD","address":"PO Box 180, Dickens, TX 79229"}},"Dimmit County, TX":{"recorder":{"name":"Dimmit County Clerk","address":"103 N. 5th St., Carrizo Springs, TX 78834"},"assessor":{"name":"Dimmit CAD","address":"404 West Pena, Carrizo Springs, TX 78834"}},"Donley County, TX":{"recorder":{"name":"Donley County Clerk","address":"PO Box 825, Clarendon, TX 79226"},"assessor":{"name":"Donley CAD","address":"PO Box 1220, Clarendon, TX 79226"}},"Duval County, TX":{"recorder":{"name":"Duval County Clerk","address":"PO Box 248, San Diego, TX 78384"},"assessor":{"name":"Duval CAD","address":"PO Box 809, San Diego, TX 78384"}},"Eastland County, TX":{"recorder":{"name":"Eastland County Clerk","address":"PO Box 110, Eastland, TX 76448"},"assessor":{"name":"Eastland CAD","address":"PO Box 914, Eastland, TX 76448"}},"Ector County, TX":{"recorder":{"name":"Ector County Clerk","address":"300 N. Grant Ave., Odessa, TX 79761"},"assessor":{"name":"Ector CAD","address":"1301 E. 8th, Odessa, TX 79761"}},"Edwards County, TX":{"recorder":{"name":"Edwards County Clerk","address":"PO Box 184, Rocksprings, TX 78880"},"assessor":{"name":"Edwards CAD","address":"PO Box 858, Rocksprings, TX 78880"}},"El Paso County, TX":{"recorder":{"name":"El Paso County Clerk","address":"500 E. San Antonio Ave., El Paso, TX 79901"},"assessor":{"name":"El Paso CAD","address":"5801 Trowbridge, El Paso, TX 79925"}},"Ellis County, TX":{"recorder":{"name":"Ellis County Clerk","address":"1201 N. Hwy 77, Waxahachie, TX 75165"},"assessor":{"name":"Ellis CAD","address":"PO Box 878, Waxahachie, TX 75165"}},"Erath County, TX":{"recorder":{"name":"Erath County Clerk","address":"222 E. College St., Stephenville, TX 76401"},"assessor":{"name":"Erath CAD","address":"1195 West South Loop, Stephenville, TX 76401"}},"Falls County, TX":{"recorder":{"name":"Falls County Clerk","address":"PO Box 458, Marlin, TX 76661"},"assessor":{"name":"Falls CAD","address":"403 Craik Street, Marlin, TX 76661"}},"Fannin County, TX":{"recorder":{"name":"Fannin County Clerk","address":"101 E. Sam Rayburn Dr., Bonham, TX 75418"},"assessor":{"name":"Fannin CAD","address":"831 W. State Hwy 56, Bonham, TX 75418"}},"Fayette County, TX":{"recorder":{"name":"Fayette County Clerk","address":"PO Box 59, La Grange, TX 78945"},"assessor":{"name":"Fayette CAD","address":"PO Box 836, La Grange, TX 78945"}},"Fisher County, TX":{"recorder":{"name":"Fisher County Clerk","address":"PO Box 368, Roby, TX 79543"},"assessor":{"name":"Fisher CAD","address":"PO Box 516, Roby, TX 79543"}},"Floyd County, TX":{"recorder":{"name":"Floyd County Clerk","address":"105 S. Main St., Floydada, TX 79235"},"assessor":{"name":"Floyd CAD","address":"PO Box 249, Floydada, TX 79235"}},"Foard County, TX":{"recorder":{"name":"Foard County Clerk","address":"PO Box 539, Crowell, TX 79227"},"assessor":{"name":"Foard CAD","address":"PO Box 419, Crowell, TX 79227"}},"Fort Bend County, TX":{"recorder":{"name":"Fort Bend County Clerk","address":"301 Jackson St., Richmond, TX 77469"},"assessor":{"name":"Fort Bend CAD","address":"2801 BF Terry Blvd., Rosenberg, TX 77471"}},"Franklin County, TX":{"recorder":{"name":"Franklin County Clerk","address":"PO Box 68, Mount Vernon, TX 75457"},"assessor":{"name":"Franklin CAD","address":"PO Box 720, Mt. Vernon, TX 75457"}},"Freestone County, TX":{"recorder":{"name":"Freestone County Clerk","address":"PO Box 307, Fairfield, TX 75840"},"assessor":{"name":"Freestone CAD","address":"218 N. Mount, Fairfield, TX 75840"}},"Frio County, TX":{"recorder":{"name":"Frio County Clerk","address":"500 E. San Antonio St., Pearsall, TX 78061"},"assessor":{"name":"Frio CAD","address":"PO Box 1129, Pearsall, TX 78061"}},"Gaines County, TX":{"recorder":{"name":"Gaines County Clerk","address":"PO Box 789, Seminole, TX 79360"},"assessor":{"name":"Gaines CAD","address":"PO Box 490, Seminole, TX 79360"}},"Galveston County, TX":{"recorder":{"name":"Galveston County Clerk","address":"PO Box 17253, Galveston, TX 77552"},"assessor":{"name":"Galveston CAD","address":"9850 Emmett F. Lowry Expy Ste A101, Texas City, TX 77591"}},"Garza County, TX":{"recorder":{"name":"Garza County Clerk","address":"300 W. Main St., Post, TX 79356"},"assessor":{"name":"Garza CAD","address":"PO Drawer F, Post, TX 79356"}},"Gillespie County, TX":{"recorder":{"name":"Gillespie County Clerk","address":"101 W. Main St., Fredericksburg, TX 78624"},"assessor":{"name":"Gillespie CAD","address":"1159 South Milam St., Fredericksburg, TX 78624"}},"Glasscock County, TX":{"recorder":{"name":"Glasscock County Clerk","address":"PO Box 190, Garden City, TX 79739"},"assessor":{"name":"Glasscock CAD","address":"PO Box 155, Garden City, TX 79739"}},"Goliad County, TX":{"recorder":{"name":"Goliad County Clerk","address":"PO Box 50, Goliad, TX 77963"},"assessor":{"name":"Goliad CAD","address":"PO Box 34, Goliad, TX 77963"}},"Gonzales County, TX":{"recorder":{"name":"Gonzales County Clerk","address":"PO Box 77, Gonzales, TX 78629"},"assessor":{"name":"Gonzales CAD","address":"PO Box 867, Gonzales, TX 78629"}},"Gray County, TX":{"recorder":{"name":"Gray County Clerk","address":"PO Box 1902, Pampa, TX 79066"},"assessor":{"name":"Gray CAD","address":"PO Box 836, Pampa, TX 79066"}},"Grayson County, TX":{"recorder":{"name":"Grayson County Clerk","address":"100 W. Houston St., Sherman, TX 75090"},"assessor":{"name":"Grayson CAD","address":"512 North Travis St., Sherman, TX 75090"}},"Gregg County, TX":{"recorder":{"name":"Gregg County Clerk","address":"PO Box 3049, Longview, TX 75606"},"assessor":{"name":"Gregg CAD","address":"4367 W. Loop 281, Longview, TX 75604"}},"Grimes County, TX":{"recorder":{"name":"Grimes County Clerk","address":"PO Box 209, Anderson, TX 77830"},"assessor":{"name":"Grimes CAD","address":"PO Box 489, Anderson, TX 77830"}},"Guadalupe County, TX":{"recorder":{"name":"Guadalupe County Clerk","address":"211 W. Court St., Seguin, TX 78155"},"assessor":{"name":"Guadalupe Appraisal District","address":"3000 N. Austin St., Seguin, TX 78155"}},"Hale County, TX":{"recorder":{"name":"Hale County Clerk","address":"500 Broadway St., Plainview, TX 79072"},"assessor":{"name":"Hale CAD","address":"PO Box 29, Plainview, TX 79073"}},"Hall County, TX":{"recorder":{"name":"Hall County Clerk","address":"PO Box 879, Memphis, TX 79245"},"assessor":{"name":"Hall CAD","address":"112 S. 5th St., Memphis, TX 79245"}},"Hamilton County, TX":{"recorder":{"name":"Hamilton County Clerk","address":"PO Box 365, Hamilton, TX 76531"},"assessor":{"name":"Hamilton CAD","address":"119 E. Henry St., Hamilton, TX 76531"}},"Hansford County, TX":{"recorder":{"name":"Hansford County Clerk","address":"PO Box 397, Spearman, TX 79081"},"assessor":{"name":"Hansford CAD","address":"709 W. 7th Ave., Spearman, TX 79081"}},"Hardeman County, TX":{"recorder":{"name":"Hardeman County Clerk","address":"PO Box 30, Quanah, TX 79252"},"assessor":{"name":"Hardeman CAD","address":"PO Box 388, Quanah, TX 79252"}},"Hardin County, TX":{"recorder":{"name":"Hardin County Clerk","address":"PO Box 38, Kountze, TX 77625"},"assessor":{"name":"Hardin CAD","address":"PO Box 670, Kountze, TX 77625"}},"Harris County, TX":{"recorder":{"name":"Harris County Clerk","address":"PO Box 1525, Houston, TX 77251"},"assessor":{"name":"Harris CAD","address":"13013 Northwest Freeway, Houston, TX 77040"}},"Harrison County, TX":{"recorder":{"name":"Harrison County Clerk","address":"PO Box 1365, Marshall, TX 75671"},"assessor":{"name":"Harrison CAD","address":"PO Box 818, Marshall, TX 75671"}},"Hartley County, TX":{"recorder":{"name":"Hartley County Clerk","address":"PO Box 189, Channing, TX 79018"},"assessor":{"name":"Hartley CAD","address":"PO Box 405, Hartley, TX 79044"}},"Haskell County, TX":{"recorder":{"name":"Haskell County Clerk","address":"PO Box 1007, Haskell, TX 79521"},"assessor":{"name":"Haskell CAD","address":"PO Box 467, Haskell, TX 79521"}},"Hays County, TX":{"recorder":{"name":"Hays County Clerk","address":"712 S. Stagecoach Trail, San Marcos, TX 78666"},"assessor":{"name":"Hays CAD","address":"21001 N. IH 35, Kyle, TX 78640"}},"Hemphill County, TX":{"recorder":{"name":"Hemphill County Clerk","address":"PO Box 867, Canadian, TX 79014"},"assessor":{"name":"Hemphill CAD","address":"223 Main St., Canadian, TX 79014"}},"Henderson County, TX":{"recorder":{"name":"Henderson County Clerk","address":"PO Box 632, Athens, TX 75751"},"assessor":{"name":"Henderson CAD","address":"PO Box 430, Athens, TX 75751"}},"Hidalgo County, TX":{"recorder":{"name":"Hidalgo County Clerk","address":"PO Box 58, Edinburg, TX 78540"},"assessor":{"name":"Hidalgo CAD","address":"PO Box 208, Edinburg, TX 78540"}},"Hill County, TX":{"recorder":{"name":"Hill County Clerk","address":"PO Box 398, Hillsboro, TX 76645"},"assessor":{"name":"Hill CAD","address":"PO Box 416, Hillsboro, TX 76645"}},"Hockley County, TX":{"recorder":{"name":"Hockley County Clerk","address":"802 Houston St., Levelland, TX 79336"},"assessor":{"name":"Hockley CAD","address":"PO Box 1090, Levelland, TX 79336"}},"Hood County, TX":{"recorder":{"name":"Hood County Clerk","address":"201 W. Bridge St., Granbury, TX 76048"},"assessor":{"name":"Hood CAD","address":"PO Box 819, Granbury, TX 76048"}},"Hopkins County, TX":{"recorder":{"name":"Hopkins County Clerk","address":"PO Box 288, Sulphur Springs, TX 75483"},"assessor":{"name":"Hopkins CAD","address":"PO Box 753, Sulphur Springs, TX 75482"}},"Houston County, TX":{"recorder":{"name":"Houston County Clerk","address":"PO Box 370, Crockett, TX 75835"},"assessor":{"name":"Houston CAD","address":"PO Box 112, Crockett, TX 75835"}},"Howard County, TX":{"recorder":{"name":"Howard County Clerk","address":"PO Box 1468, Big Spring, TX 79721"},"assessor":{"name":"Howard CAD","address":"PO Box 1151, Big Spring, TX 79721"}},"Hudspeth County, TX":{"recorder":{"name":"Hudspeth County Clerk","address":"PO Box 58, Sierra Blanca, TX 79851"},"assessor":{"name":"Hudspeth CAD","address":"PO Box 429, Sierra Blanca, TX 79851"}},"Hunt County, TX":{"recorder":{"name":"Hunt County Clerk","address":"PO Box 1316, Greenville, TX 75403"},"assessor":{"name":"Hunt CAD","address":"PO Box 1339, Greenville, TX 75403"}},"Hutchinson County, TX":{"recorder":{"name":"Hutchinson County Clerk","address":"PO Box 1186, Stinnett, TX 79083"},"assessor":{"name":"Hutchinson CAD","address":"PO Box 5065, Borger, TX 79008"}},"Irion County, TX":{"recorder":{"name":"Irion County Clerk","address":"PO Box 228, Mertzon, TX 76941"},"assessor":{"name":"Irion CAD","address":"PO Box 980, Mertzon, TX 76941"}},"Jack County, TX":{"recorder":{"name":"Jack County Clerk","address":"100 N. Main St., Jacksboro, TX 76458"},"assessor":{"name":"Jack CAD","address":"PO Box 958, Jacksboro, TX 76458"}},"Jackson County, TX":{"recorder":{"name":"Jackson County Clerk","address":"115 W. Main St., Edna, TX 77957"},"assessor":{"name":"Jackson CAD","address":"404 North Allen, Edna, TX 77957"}},"Jasper County, TX":{"recorder":{"name":"Jasper County Clerk","address":"PO Box 2070, Jasper, TX 75951"},"assessor":{"name":"Jasper CAD","address":"PO Box 1300, Jasper, TX 75951"}},"Jeff Davis County, TX":{"recorder":{"name":"Jeff Davis County Clerk","address":"PO Box 398, Fort Davis, TX 79734"},"assessor":{"name":"Jeff Davis CAD","address":"PO Box 373, Fort Davis, TX 79734"}},"Jefferson County, TX":{"recorder":{"name":"Jefferson County Clerk","address":"PO Box 1151, Beaumont, TX 77704"},"assessor":{"name":"Jefferson CAD","address":"PO Box 21337, Beaumont, TX 77720"}},"Jim Hogg County, TX":{"recorder":{"name":"Jim Hogg County Clerk","address":"PO Box 729, Hebbronville, TX 78361"},"assessor":{"name":"Jim Hogg CAD","address":"PO Box 459, Hebbronville, TX 78361"}},"Jim Wells County, TX":{"recorder":{"name":"Jim Wells County Clerk","address":"PO Box 1459, Alice, TX 78333"},"assessor":{"name":"Jim Wells CAD","address":"PO Box 607, Alice, TX 78333"}},"Johnson County, TX":{"recorder":{"name":"Johnson County Clerk","address":"2 N. Main St., Cleburne, TX 76033"},"assessor":{"name":"Johnson CAD","address":"109 N. Main, Cleburne, TX 76033"}},"Jones County, TX":{"recorder":{"name":"Jones County Clerk","address":"PO Box 552, Anson, TX 79501"},"assessor":{"name":"Jones CAD","address":"PO Box 348, Anson, TX 79501"}},"Karnes County, TX":{"recorder":{"name":"Karnes County Clerk","address":"101 N. Panna Maria Ave., Karnes City, TX 78118"},"assessor":{"name":"Karnes CAD","address":"915 S. Panna Maria Ave., Karnes City, TX 78118"}},"Kaufman County, TX":{"recorder":{"name":"Kaufman County Clerk","address":"100 W. Mulberry St., Kaufman, TX 75142"},"assessor":{"name":"Kaufman CAD","address":"PO Box 819, Kaufman, TX 75142"}},"Kendall County, TX":{"recorder":{"name":"Kendall County Clerk","address":"201 E. San Antonio Ave., Boerne, TX 78006"},"assessor":{"name":"Kendall CAD","address":"118 Market Ave., Boerne, TX 78006"}},"Kenedy County, TX":{"recorder":{"name":"Kenedy County Clerk","address":"PO Box 37, Sarita, TX 78385"},"assessor":{"name":"Kenedy CAD","address":"PO Box 39, Sarita, TX 78385"}},"Kent County, TX":{"recorder":{"name":"Kent County Clerk","address":"PO Box 9, Jayton, TX 79528"},"assessor":{"name":"Kent CAD","address":"PO Box 68, Jayton, TX 79528"}},"Kerr County, TX":{"recorder":{"name":"Kerr County Clerk","address":"700 Main St., Kerrville, TX 78028"},"assessor":{"name":"Kerr CAD","address":"PO Box 294387, Kerrville, TX 78029"}},"Kimble County, TX":{"recorder":{"name":"Kimble County Clerk","address":"501 Main St., Junction, TX 76849"},"assessor":{"name":"Kimble CAD","address":"PO Box 307, Junction, TX 76849"}},"King County, TX":{"recorder":{"name":"King County Clerk","address":"PO Box 135, Guthrie, TX 79236"},"assessor":{"name":"King CAD","address":"PO Box 117, Guthrie, TX 79236"}},"Kinney County, TX":{"recorder":{"name":"Kinney County Clerk","address":"PO Box 9, Brackettville, TX 78832"},"assessor":{"name":"Kinney CAD","address":"PO Box 1377, Bracketville, TX 78832"}},"Kleberg County, TX":{"recorder":{"name":"Kleberg County Clerk","address":"PO Box 312, Kingsville, TX 78364"},"assessor":{"name":"Kleberg CAD","address":"502 E. Kleberg Ave., Kingsville, TX 78363"}},"Knox County, TX":{"recorder":{"name":"Knox County Clerk","address":"PO Box 196, Benjamin, TX 79505"},"assessor":{"name":"Knox CAD","address":"PO Box 47, Benjamin, TX 79505"}},"Lamar County, TX":{"recorder":{"name":"Lamar County Clerk","address":"119 N. Main St., Paris, TX 75460"},"assessor":{"name":"Lamar CAD","address":"521 Bonham St., Paris, TX 75460"}},"Lamb County, TX":{"recorder":{"name":"Lamb County Clerk","address":"100 6th Dr., Littlefield, TX 79339"},"assessor":{"name":"Lamb CAD","address":"PO Box 950, Littlefield, TX 79339"}},"Lampasas County, TX":{"recorder":{"name":"Lampasas County Clerk","address":"PO Box 347, Lampasas, TX 76550"},"assessor":{"name":"Lampasas CAD","address":"PO Box 175, Lampasas, TX 76550"}},"La Salle County, TX":{"recorder":{"name":"La Salle County Clerk","address":"101 Courthouse Sq., Cotulla, TX 78014"},"assessor":{"name":"LaSalle CAD","address":"PO Box 1530, Cotulla, TX 78014"}},"Lavaca County, TX":{"recorder":{"name":"Lavaca County Clerk","address":"PO Box 326, Hallettsville, TX 77964"},"assessor":{"name":"Lavaca CAD","address":"PO Box 386, Hallettsville, TX 77964"}},"Lee County, TX":{"recorder":{"name":"Lee County Clerk","address":"PO Box 419, Giddings, TX 78942"},"assessor":{"name":"Lee CAD","address":"898 E. Richmond St. Ste 100, Giddings, TX 78942"}},"Leon County, TX":{"recorder":{"name":"Leon County Clerk","address":"PO Box 98, Centerville, TX 75833"},"assessor":{"name":"Leon CAD","address":"PO Box 536, Centerville, TX 75833"}},"Liberty County, TX":{"recorder":{"name":"Liberty County Clerk","address":"PO Box 369, Liberty, TX 77575"},"assessor":{"name":"Liberty CAD","address":"PO Box 10016, Liberty, TX 77575"}},"Limestone County, TX":{"recorder":{"name":"Limestone County Clerk","address":"PO Box 350, Groesbeck, TX 76642"},"assessor":{"name":"Limestone CAD","address":"PO Drawer 831, Groesbeck, TX 76642"}},"Lipscomb County, TX":{"recorder":{"name":"Lipscomb County Clerk","address":"PO Box 70, Lipscomb, TX 79056"},"assessor":{"name":"Lipscomb CAD","address":"PO Box 128, Darrouzett, TX 79024"}},"Live Oak County, TX":{"recorder":{"name":"Live Oak County Clerk","address":"PO Box 280, George West, TX 78022"},"assessor":{"name":"Live Oak CAD","address":"PO Box 2370, George West, TX 78022"}},"Llano County, TX":{"recorder":{"name":"Llano County Clerk","address":"107 W. Sandstone St., Llano, TX 78643"},"assessor":{"name":"Llano CAD","address":"103 E. Sandstone, Llano, TX 78643"}},"Loving County, TX":{"recorder":{"name":"Loving County Clerk","address":"PO Box 194, Mentone, TX 79754"},"assessor":{"name":"Loving CAD","address":"PO Box 352, Mentone, TX 79751"}},"Lubbock County, TX":{"recorder":{"name":"Lubbock County Clerk","address":"PO Box 10536, Lubbock, TX 79408"},"assessor":{"name":"Lubbock CAD","address":"2109 Avenue Q, Lubbock, TX 79411"}},"Lynn County, TX":{"recorder":{"name":"Lynn County Clerk","address":"PO Box 937, Tahoka, TX 79373"},"assessor":{"name":"Lynn CAD","address":"PO Box 789, Tahoka, TX 79373"}},"Madison County, TX":{"recorder":{"name":"Madison County Clerk","address":"PO Box 607, Madisonville, TX 77864"},"assessor":{"name":"Madison CAD","address":"PO Box 1328, Madisonville, TX 77864"}},"Marion County, TX":{"recorder":{"name":"Marion County Clerk","address":"102 W. Austin St., Jefferson, TX 75657"},"assessor":{"name":"Marion CAD","address":"801 North Tuttle, Jefferson, TX 75657"}},"Martin County, TX":{"recorder":{"name":"Martin County Clerk","address":"PO Box 906, Stanton, TX 79782"},"assessor":{"name":"Martin CAD","address":"PO Box 1349, Stanton, TX 79782"}},"Mason County, TX":{"recorder":{"name":"Mason County Clerk","address":"PO Box 554, Mason, TX 76856"},"assessor":{"name":"Mason CAD","address":"PO Drawer 1119, Mason, TX 76856"}},"Matagorda County, TX":{"recorder":{"name":"Matagorda County Clerk","address":"1700 7th St., Bay City, TX 77414"},"assessor":{"name":"Matagorda CAD","address":"2225 Avenue G, Bay City, TX 77414"}},"Maverick County, TX":{"recorder":{"name":"Maverick County Clerk","address":"PO Box 4050, Eagle Pass, TX 78853"},"assessor":{"name":"Maverick CAD","address":"PO Box 2628, Eagle Pass, TX 78853"}},"McCulloch County, TX":{"recorder":{"name":"McCulloch County Clerk","address":"199 Courthouse Sq., Brady, TX 76825"},"assessor":{"name":"McCulloch CAD","address":"306 W. Lockhart, Brady, TX 76825"}},"McLennan County, TX":{"recorder":{"name":"McLennan County Clerk","address":"PO Box 1727, Waco, TX 76703"},"assessor":{"name":"McLennan CAD","address":"PO Box 2297, Waco, TX 76703"}},"McMullen County, TX":{"recorder":{"name":"McMullen County Clerk","address":"PO Box 237, Tilden, TX 78072"},"assessor":{"name":"McMullen CAD","address":"PO Box 338, Tilden, TX 78072"}},"Medina County, TX":{"recorder":{"name":"Medina County Clerk","address":"1100 16th St., Hondo, TX 78861"},"assessor":{"name":"Medina CAD","address":"1410 Ave K, Hondo, TX 78861"}},"Menard County, TX":{"recorder":{"name":"Menard County Clerk","address":"PO Box 1028, Menard, TX 76859"},"assessor":{"name":"Menard CAD","address":"PO Box 1008, Menard, TX 76859"}},"Midland County, TX":{"recorder":{"name":"Midland County Clerk","address":"PO Box 1350, Midland, TX 79702"},"assessor":{"name":"Midland CAD","address":"PO Box 908002, Midland, TX 79708"}},"Milam County, TX":{"recorder":{"name":"Milam County Clerk","address":"102 S. Fannin Ave., Cameron, TX 76520"},"assessor":{"name":"Milam CAD","address":"PO Box 769, Cameron, TX 76520"}},"Mills County, TX":{"recorder":{"name":"Mills County Clerk","address":"PO Box 646, Goldthwaite, TX 76844"},"assessor":{"name":"Mills CAD","address":"PO Box 565, Goldthwaite, TX 76844"}},"Mitchell County, TX":{"recorder":{"name":"Mitchell County Clerk","address":"349 Oak St., Colorado City, TX 79512"},"assessor":{"name":"Mitchell CAD","address":"2112 Hickory St., Colorado City, TX 79512"}},"Montague County, TX":{"recorder":{"name":"Montague County Clerk","address":"PO Box 77, Montague, TX 76251"},"assessor":{"name":"Montague CAD","address":"PO Box 121, Montague, TX 76251"}},"Montgomery County, TX":{"recorder":{"name":"Montgomery County Clerk","address":"PO Box 959, Conroe, TX 77305"},"assessor":{"name":"Montgomery CAD","address":"PO Box 2233, Conroe, TX 77305"}},"Moore County, TX":{"recorder":{"name":"Moore County Clerk","address":"715 S. Dumas Ave., Dumas, TX 79029"},"assessor":{"name":"Moore CAD","address":"419 Success Blvd., Dumas, TX 79029"}},"Morris County, TX":{"recorder":{"name":"Morris County Clerk","address":"500 Broadnax St., Daingerfield, TX 75638"},"assessor":{"name":"Morris CAD","address":"PO Box 563, Daingerfield, TX 75638"}},"Motley County, TX":{"recorder":{"name":"Motley County Clerk","address":"PO Box 66, Matador, TX 79244"},"assessor":{"name":"Motley CAD","address":"PO Box 779, Matador, TX 79244"}},"Nacogdoches County, TX":{"recorder":{"name":"Nacogdoches County Clerk","address":"101 W. Main St., Nacogdoches, TX 75961"},"assessor":{"name":"Nacogdoches CAD","address":"216 W. Hospital, Nacogdoches, TX 75961"}},"Navarro County, TX":{"recorder":{"name":"Navarro County Clerk","address":"PO Box 423, Corsicana, TX 75151"},"assessor":{"name":"Navarro CAD","address":"PO Box 3118, Corsicana, TX 75151"}},"Newton County, TX":{"recorder":{"name":"Newton County Clerk","address":"PO Box 484, Newton, TX 75966"},"assessor":{"name":"Newton CAD","address":"109 Court St., Newton, TX 75966"}},"Nolan County, TX":{"recorder":{"name":"Nolan County Clerk","address":"100 E. 3rd St., Sweetwater, TX 79556"},"assessor":{"name":"Nolan CAD","address":"PO Box 1256, Sweetwater, TX 79556"}},"Nueces County, TX":{"recorder":{"name":"Nueces County Clerk","address":"PO Box 2627, Corpus Christi, TX 78403"},"assessor":{"name":"Nueces CAD","address":"201 N. Chapparal Ste 206, Corpus Christi, TX 78401"}},"Ochiltree County, TX":{"recorder":{"name":"Ochiltree County Clerk","address":"511 S. Main St., Perryton, TX 79070"},"assessor":{"name":"Ochiltree CAD","address":"825 S. Main St. Ste 100, Perryton, TX 79070"}},"Oldham County, TX":{"recorder":{"name":"Oldham County Clerk","address":"PO Box 360, Vega, TX 79092"},"assessor":{"name":"Oldham CAD","address":"PO Box 310, Vega, TX 79092"}},"Orange County, TX":{"recorder":{"name":"Orange County Clerk","address":"123 S. 6th St., Orange, TX 77630"},"assessor":{"name":"Orange CAD","address":"PO Box 457, Orange, TX 77631"}},"Palo Pinto County, TX":{"recorder":{"name":"Palo Pinto County Clerk","address":"PO Box 219, Palo Pinto, TX 76484"},"assessor":{"name":"Palo Pinto CAD","address":"PO Box 250, Palo Pinto, TX 76484"}},"Panola County, TX":{"recorder":{"name":"Panola County Clerk","address":"110 S. Sycamore St., Carthage, TX 75633"},"assessor":{"name":"Panola CAD","address":"1736 Ballpark Dr., Carthage, TX 75633"}},"Parker County, TX":{"recorder":{"name":"Parker County Clerk","address":"1112 Santa Fe Dr., Weatherford, TX 76086"},"assessor":{"name":"Parker CAD","address":"1108 Santa Fe Dr., Weatherford, TX 76086"}},"Parmer County, TX":{"recorder":{"name":"Parmer County Clerk","address":"PO Box 356, Farwell, TX 79325"},"assessor":{"name":"Parmer CAD","address":"PO Box 56, Bovina, TX 79009"}},"Pecos County, TX":{"recorder":{"name":"Pecos County Clerk","address":"103 W. Callaghan St., Fort Stockton, TX 79735"},"assessor":{"name":"Pecos CAD","address":"PO Box 237, Fort Stockton, TX 79735"}},"Polk County, TX":{"recorder":{"name":"Polk County Clerk","address":"101 W. Church St., Livingston, TX 77351"},"assessor":{"name":"Polk CAD","address":"114 Matthew St., Livingston, TX 77351"}},"Potter County, TX":{"recorder":{"name":"Potter County Clerk","address":"PO Box 9638, Amarillo, TX 79105"},"assessor":{"name":"Potter/Randall CAD","address":"PO Box 7190, Amarillo, TX 79114"}},"Presidio County, TX":{"recorder":{"name":"Presidio County Clerk","address":"PO Box 789, Marfa, TX 79843"},"assessor":{"name":"Presidio CAD","address":"PO Box 879, Marfa, TX 79843"}},"Rains County, TX":{"recorder":{"name":"Rains County Clerk","address":"PO Box 187, Emory, TX 75440"},"assessor":{"name":"Rains CAD","address":"PO Box 70, Emory, TX 75440"}},"Randall County, TX":{"recorder":{"name":"Randall County Clerk","address":"PO Box 660, Canyon, TX 79015"},"assessor":{"name":"Potter/Randall CAD","address":"PO Box 7190, Amarillo, TX 79114"}},"Reagan County, TX":{"recorder":{"name":"Reagan County Clerk","address":"PO Box 100, Big Lake, TX 76932"},"assessor":{"name":"Reagan CAD","address":"PO Box 8, Big Lake, TX 76932"}},"Real County, TX":{"recorder":{"name":"Real County Clerk","address":"PO Box 750, Leakey, TX 78873"},"assessor":{"name":"Real CAD","address":"PO Box 158, Leakey, TX 78873"}},"Red River County, TX":{"recorder":{"name":"Red River County Clerk","address":"200 N. Walnut St., Clarksville, TX 75426"},"assessor":{"name":"Red River CAD","address":"PO Box 461, Clarksville, TX 75426"}},"Reeves County, TX":{"recorder":{"name":"Reeves County Clerk","address":"PO Box 867, Pecos, TX 79772"},"assessor":{"name":"Reeves CAD","address":"PO Box 1229, Pecos, TX 79772"}},"Refugio County, TX":{"recorder":{"name":"Refugio County Clerk","address":"PO Box 704, Refugio, TX 78377"},"assessor":{"name":"Refugio CAD","address":"PO Box 156, Refugio, TX 78377"}},"Roberts County, TX":{"recorder":{"name":"Roberts County Clerk","address":"PO Box 477, Miami, TX 79059"},"assessor":{"name":"Roberts CAD","address":"PO Box 458, Miami, TX 79059"}},"Robertson County, TX":{"recorder":{"name":"Robertson County Clerk","address":"PO Box 998, Franklin, TX 77856"},"assessor":{"name":"Robertson CAD","address":"PO Box 998, Franklin, TX 77856"}},"Rockwall County, TX":{"recorder":{"name":"Rockwall County Clerk","address":"1111 E. Yellowjacket Ln., Rockwall, TX 75087"},"assessor":{"name":"Rockwall CAD","address":"841 Justin Rd., Rockwall, TX 75087"}},"Runnels County, TX":{"recorder":{"name":"Runnels County Clerk","address":"PO Box 189, Ballinger, TX 76821"},"assessor":{"name":"Runnels CAD","address":"PO Box 524, Ballinger, TX 76821"}},"Rusk County, TX":{"recorder":{"name":"Rusk County Clerk","address":"115 N. Main St., Henderson, TX 75652"},"assessor":{"name":"Rusk CAD","address":"PO Box 7, Henderson, TX 75653"}},"Sabine County, TX":{"recorder":{"name":"Sabine County Clerk","address":"PO Box 580, Hemphill, TX 75948"},"assessor":{"name":"Sabine CAD","address":"PO Box 137, Hemphill, TX 75948"}},"San Augustine County, TX":{"recorder":{"name":"San Augustine County Clerk","address":"223 N. Harrison St., San Augustine, TX 75972"},"assessor":{"name":"San Augustine CAD","address":"122 N. Harrison, San Augustine, TX 75972"}},"San Jacinto County, TX":{"recorder":{"name":"San Jacinto County Clerk","address":"PO Box 696, Coldspring, TX 77331"},"assessor":{"name":"San Jacinto CAD","address":"PO Box 1170, Coldspring, TX 77331"}},"San Patricio County, TX":{"recorder":{"name":"San Patricio County Clerk","address":"400 W. Sinton St., Sinton, TX 78387"},"assessor":{"name":"San Patricio CAD","address":"1301 E. Sinton Ste. B, Sinton, TX 78387"}},"San Saba County, TX":{"recorder":{"name":"San Saba County Clerk","address":"500 E. Wallace St., San Saba, TX 76877"},"assessor":{"name":"San Saba CAD","address":"423 E. Wallace, San Saba, TX 76877"}},"Schleicher County, TX":{"recorder":{"name":"Schleicher County Clerk","address":"PO Box 537, Eldorado, TX 76936"},"assessor":{"name":"Schleicher CAD","address":"PO Box 936, Eldorado, TX 76936"}},"Scurry County, TX":{"recorder":{"name":"Scurry County Clerk","address":"1806 25th St., Snyder, TX 79549"},"assessor":{"name":"Scurry CAD","address":"2612 College Ave., Snyder, TX 79549"}},"Shackelford County, TX":{"recorder":{"name":"Shackelford County Clerk","address":"PO Box 2109, Albany, TX 76430"},"assessor":{"name":"Shackelford CAD","address":"PO Box 2247, Albany, TX 76430"}},"Shelby County, TX":{"recorder":{"name":"Shelby County Clerk","address":"PO Box 1987, Center, TX 75935"},"assessor":{"name":"Shelby CAD","address":"724 Shelbyville St., Center, TX 75935"}},"Sherman County, TX":{"recorder":{"name":"Sherman County Clerk","address":"PO Box 270, Stratford, TX 79084"},"assessor":{"name":"Sherman CAD","address":"PO Box 239, Stratford, TX 79084"}},"Smith County, TX":{"recorder":{"name":"Smith County Clerk","address":"200 E. Ferguson St., Tyler, TX 75702"},"assessor":{"name":"Smith CAD","address":"245 S. SE Loop 323, Tyler, TX 75702"}},"Somervell County, TX":{"recorder":{"name":"Somervell County Clerk","address":"PO Box 662, Glen Rose, TX 76043"},"assessor":{"name":"Somervell CAD","address":"112 Allen Dr., Glen Rose, TX 76043"}},"Starr County, TX":{"recorder":{"name":"Starr County Clerk","address":"401 N. Britton Ave., Rio Grande City, TX 78582"},"assessor":{"name":"Starr CAD","address":"100 N. FM 3167 Ste 300, Rio Grande City, TX 78582"}},"Stephens County, TX":{"recorder":{"name":"Stephens County Clerk","address":"200 W. Walker St., Breckenridge, TX 76424"},"assessor":{"name":"Stephens CAD","address":"PO Box 351, Breckenridge, TX 76424"}},"Sterling County, TX":{"recorder":{"name":"Sterling County Clerk","address":"PO Box 55, Sterling City, TX 76951"},"assessor":{"name":"Sterling CAD","address":"PO Box 28, Sterling City, TX 76951"}},"Stonewall County, TX":{"recorder":{"name":"Stonewall County Clerk","address":"PO Box 300, Aspermont, TX 79502"},"assessor":{"name":"Stonewall CAD","address":"PO Box 308, Aspermont, TX 79502"}},"Sutton County, TX":{"recorder":{"name":"Sutton County Clerk","address":"300 E. Oak St., Sonora, TX 76950"},"assessor":{"name":"Sutton CAD","address":"300 E. Oak St. Ste 2, Sonora, TX 76950"}},"Swisher County, TX":{"recorder":{"name":"Swisher County Clerk","address":"119 S. Maxwell Ave., Tulia, TX 79088"},"assessor":{"name":"Swisher CAD","address":"PO Box 8, Tulia, TX 79088"}},"Tarrant County, TX":{"recorder":{"name":"Tarrant County Clerk","address":"100 W. Weatherford St., Fort Worth, TX 76196"},"assessor":{"name":"Tarrant Appraisal District","address":"2500 Handley-Ederville Rd., Fort Worth, TX 76118"}},"Taylor County, TX":{"recorder":{"name":"Taylor County Clerk","address":"400 Oak St., Abilene, TX 79602"},"assessor":{"name":"Taylor CAD","address":"PO Box 1800, Abilene, TX 79604"}},"Terrell County, TX":{"recorder":{"name":"Terrell County Clerk","address":"105 E. Hackberry St., Sanderson, TX 79848"},"assessor":{"name":"Terrell CAD","address":"PO Box 747, Sanderson, TX 79848"}},"Terry County, TX":{"recorder":{"name":"Terry County Clerk","address":"500 W. Main St., Brownfield, TX 79316"},"assessor":{"name":"Terry CAD","address":"PO Box 426, Brownfield, TX 79316"}},"Throckmorton County, TX":{"recorder":{"name":"Throckmorton County Clerk","address":"PO Box 309, Throckmorton, TX 76483"},"assessor":{"name":"Throckmorton CAD","address":"PO Box 788, Throckmorton, TX 76483"}},"Titus County, TX":{"recorder":{"name":"Titus County Clerk","address":"100 W. 1st St., Mt. Pleasant, TX 75455"},"assessor":{"name":"Titus CAD","address":"PO Box 528, Mount Pleasant, TX 75456"}},"Tom Green County, TX":{"recorder":{"name":"Tom Green County Clerk","address":"124 W. Beauregard Ave., San Angelo, TX 76903"},"assessor":{"name":"Tom Green CAD","address":"2302 Pulliam St., San Angelo, TX 76905"}},"Travis County, TX":{"recorder":{"name":"Travis County Clerk","address":"PO Box 149325, Austin, TX 78714"},"assessor":{"name":"Travis CAD","address":"PO Box 149012, Austin, TX 78714"}},"Trinity County, TX":{"recorder":{"name":"Trinity County Clerk","address":"PO Box 456, Groveton, TX 75845"},"assessor":{"name":"Trinity CAD","address":"PO Box 950, Groveton, TX 75845"}},"Tyler County, TX":{"recorder":{"name":"Tyler County Clerk","address":"100 W. Bluff St., Woodville, TX 75979"},"assessor":{"name":"Tyler CAD","address":"PO Box 9, Woodville, TX 75979"}},"Upshur County, TX":{"recorder":{"name":"Upshur County Clerk","address":"PO Box 730, Gilmer, TX 75644"},"assessor":{"name":"Upshur CAD","address":"105 Diamond Loch, Gilmer, TX 75644"}},"Upton County, TX":{"recorder":{"name":"Upton County Clerk","address":"PO Box 373, Rankin, TX 79778"},"assessor":{"name":"Upton CAD","address":"PO Box 1110, McCamey, TX 79752"}},"Uvalde County, TX":{"recorder":{"name":"Uvalde County Clerk","address":"PO Box 284, Uvalde, TX 78802"},"assessor":{"name":"Uvalde CAD","address":"209 North High St., Uvalde, TX 78801"}},"Val Verde County, TX":{"recorder":{"name":"Val Verde County Clerk","address":"400 Pecan St., Del Rio, TX 78840"},"assessor":{"name":"Val Verde CAD","address":"417 W. Cantu Rd., Del Rio, TX 78844"}},"Van Zandt County, TX":{"recorder":{"name":"Van Zandt County Clerk","address":"121 E. Dallas St., Canton, TX 75103"},"assessor":{"name":"Van Zandt CAD","address":"PO Box 926, Canton, TX 75103"}},"Victoria County, TX":{"recorder":{"name":"Victoria County Clerk","address":"115 N. Bridge St., Victoria, TX 77901"},"assessor":{"name":"Victoria CAD","address":"2805 N. Navarro Suite 300, Victoria, TX 77901"}},"Walker County, TX":{"recorder":{"name":"Walker County Clerk","address":"1100 University Ave., Huntsville, TX 77340"},"assessor":{"name":"Walker CAD","address":"PO Box 1798, Huntsville, TX 77342"}},"Waller County, TX":{"recorder":{"name":"Waller County Clerk","address":"836 Austin St., Hempstead, TX 77445"},"assessor":{"name":"Waller CAD","address":"PO Box 887, Hempstead, TX 77445"}},"Ward County, TX":{"recorder":{"name":"Ward County Clerk","address":"400 S. Allen St., Monahans, TX 79756"},"assessor":{"name":"Ward CAD","address":"PO Box 905, Monahans, TX 79756"}},"Washington County, TX":{"recorder":{"name":"Washington County Clerk","address":"100 E. Main St., Brenham, TX 77833"},"assessor":{"name":"Washington CAD","address":"PO Box 681, Brenham, TX 77834"}},"Webb County, TX":{"recorder":{"name":"Webb County Clerk","address":"1110 Victoria St., Laredo, TX 78040"},"assessor":{"name":"Webb CAD","address":"3302 Clark Blvd., Laredo, TX 78043"}},"Wharton County, TX":{"recorder":{"name":"Wharton County Clerk","address":"103 S. Fulton St., Wharton, TX 77488"},"assessor":{"name":"Wharton CAD","address":"308 E. Milam, Wharton, TX 77488"}},"Wheeler County, TX":{"recorder":{"name":"Wheeler County Clerk","address":"PO Box 465, Wheeler, TX 79096"},"assessor":{"name":"Wheeler CAD","address":"PO Box 1200, Wheeler, TX 79096"}},"Wichita County, TX":{"recorder":{"name":"Wichita County Clerk","address":"PO Box 1679, Wichita Falls, TX 76307"},"assessor":{"name":"Wichita CAD","address":"PO Box 5172, Wichita Falls, TX 76307"}},"Wilbarger County, TX":{"recorder":{"name":"Wilbarger County Clerk","address":"1700 Wilbarger St., Vernon, TX 76384"},"assessor":{"name":"Wilbarger CAD","address":"PO Box 1519, Vernon, TX 76385"}},"Willacy County, TX":{"recorder":{"name":"Willacy County Clerk","address":"576 W. Main Ave., Raymondville, TX 78580"},"assessor":{"name":"Willacy CAD","address":"688 FM 3168, Raymondville, TX 78580"}},"Williamson County, TX":{"recorder":{"name":"Williamson County Clerk","address":"405 Martin Luther King St., Georgetown, TX 78626"},"assessor":{"name":"Williamson CAD","address":"625 FM 1460, Georgetown, TX 78626"}},"Wilson County, TX":{"recorder":{"name":"Wilson County Clerk","address":"1420 3rd St., Floresville, TX 78114"},"assessor":{"name":"Wilson CAD","address":"1611 Railroad St., Floresville, TX 78114"}},"Winkler County, TX":{"recorder":{"name":"Winkler County Clerk","address":"PO Box 1007, Kermit, TX 79745"},"assessor":{"name":"Winkler CAD","address":"PO Box 1219, Kermit, TX 79745"}},"Wise County, TX":{"recorder":{"name":"Wise County Clerk","address":"PO Box 359, Decatur, TX 76234"},"assessor":{"name":"Wise CAD","address":"400 E. Business Hwy 380, Decatur, TX 76234"}},"Wood County, TX":{"recorder":{"name":"Wood County Clerk","address":"PO Box 1796, Quitman, TX 75783"},"assessor":{"name":"Wood CAD","address":"PO Box 1706, Quitman, TX 75783"}},"Yoakum County, TX":{"recorder":{"name":"Yoakum County Clerk","address":"PO Box 309, Plains, TX 79355"},"assessor":{"name":"Yoakum CAD","address":"PO Box 748, Plains, TX 79355"}},"Young County, TX":{"recorder":{"name":"Young County Clerk","address":"516 4th St., Graham, TX 76450"},"assessor":{"name":"Young CAD","address":"PO Box 337, Graham, TX 79049"}},"Zapata County, TX":{"recorder":{"name":"Zapata County Clerk","address":"PO Box 789, Zapata, TX 78076"},"assessor":{"name":"Zapata CAD","address":"200 E. 7th Ave. Ste 240, Zapata, TX 78076"}},"Zavala County, TX":{"recorder":{"name":"Zavala County Clerk","address":"200 E. Uvalde St., Crystal City, TX 78839"},"assessor":{"name":"Zavala CAD","address":"200 E. Uvalde St., Crystal City, TX 78839"}},"Beaver County, UT":{"recorder":{"name":"Beaver County Recorder","address":"105 E Center St., Beaver, UT 84713"},"assessor":{"name":"Beaver County Assessor","address":"105 E Center St., Beaver, UT 84713"}},"Box Elder County, UT":{"recorder":{"name":"Box Elder County Recorder","address":"01 S Main St., Brigham City, UT 84302"},"assessor":{"name":"Box Elder County Assessor","address":"01 S Main St., Brigham City, UT 84302"}},"Cache County, UT":{"recorder":{"name":"Cache County Recorder","address":"179 N Main St. Suite 201, Logan, UT 84321"},"assessor":{"name":"Cache County Assessor","address":"179 N Main St. Suite 302, Logan, UT 84321"}},"Carbon County, UT":{"recorder":{"name":"Carbon County Recorder","address":"120 E Main St., Price, UT 84501"},"assessor":{"name":"Carbon County Assessor","address":"120 E Main St., Price, UT 84501"}},"Daggett County, UT":{"recorder":{"name":"Daggett County Recorder","address":"95 N 1st W, Manila, UT 84046"},"assessor":{"name":"Daggett County Assessor","address":"95 N 1st W, Manila, UT 84046"}},"Davis County, UT":{"recorder":{"name":"Davis County Recorder","address":"61 S Main St., Farmington, UT 84025"},"assessor":{"name":"Davis County Assessor","address":"61 S Main St., Farmington, UT 84025"}},"Duchesne County, UT":{"recorder":{"name":"Duchesne County Recorder","address":"734 N Center St., Duchesne, UT 84021"},"assessor":{"name":"Duchesne County Assessor","address":"734 N Center St., Duchesne, UT 84021"}},"Emery County, UT":{"recorder":{"name":"Emery County Recorder","address":"75 E Main St., Castle Dale, UT 84513"},"assessor":{"name":"Emery County Assessor","address":"75 E Main St., Castle Dale, UT 84513"}},"Garfield County, UT":{"recorder":{"name":"Garfield County Recorder","address":"55 S Main St., Panguitch, UT 84759"},"assessor":{"name":"Garfield County Assessor","address":"55 S Main St., Panguitch, UT 84759"}},"Grand County, UT":{"recorder":{"name":"Grand County Recorder","address":"125 E Center St., Moab, UT 84532"},"assessor":{"name":"Grand County Assessor","address":"125 E Center St., Moab, UT 84532"}},"Iron County, UT":{"recorder":{"name":"Iron County Recorder","address":"68 S 100 E, Parowan, UT 84761"},"assessor":{"name":"Iron County Assessor","address":"68 S 100 E, Parowan, UT 84761"}},"Juab County, UT":{"recorder":{"name":"Juab County Recorder","address":"160 N Main St., Nephi, UT 84648"},"assessor":{"name":"Juab County Assessor","address":"160 N Main St., Nephi, UT 84648"}},"Kane County, UT":{"recorder":{"name":"Kane County Recorder","address":"76 N Main St., Kanab, UT 84741"},"assessor":{"name":"Kane County Assessor","address":"76 N Main St., Kanab, UT 84741"}},"Millard County, UT":{"recorder":{"name":"Millard County Recorder","address":"765 S Hwy 99 Suite 6, Fillmore, UT 84631"},"assessor":{"name":"Millard County Assessor","address":"765 S Hwy 99 Suite 3, Fillmore, UT 84631"}},"Morgan County, UT":{"recorder":{"name":"Morgan County Recorder","address":"48 W Young St., Morgan, UT 84050"},"assessor":{"name":"Morgan County Assessor","address":"48 W Young St., Morgan, UT 84050"}},"Piute County, UT":{"recorder":{"name":"Piute County Recorder","address":"550 N Main St., Junction, UT 84740"},"assessor":{"name":"Piute County Assessor","address":"550 N Main St., Junction, UT 84740"}},"Rich County, UT":{"recorder":{"name":"Rich County Recorder","address":"20 S Main St., Randolph, UT 84064"},"assessor":{"name":"Rich County Assessor","address":"20 S Main St., Randolph, UT 84064"}},"Salt Lake County, UT":{"recorder":{"name":"Salt Lake County Recorder","address":"2001 S State St. Suite N1-600, Salt Lake City, UT 84190"},"assessor":{"name":"Salt Lake County Assessor","address":"2001 S State St. Suite N2-600, Salt Lake City, UT 84190"}},"San Juan County, UT":{"recorder":{"name":"San Juan County Recorder","address":"117 S Main St., Monticello, UT 84535"},"assessor":{"name":"San Juan County Assessor","address":"117 S Main St., Monticello, UT 84535"}},"Sanpete County, UT":{"recorder":{"name":"Sanpete County Recorder","address":"160 N Main St., Manti, UT 84642"},"assessor":{"name":"Sanpete County Assessor","address":"160 N Main St., Manti, UT 84642"}},"Sevier County, UT":{"recorder":{"name":"Sevier County Recorder","address":"250 N Main St., Richfield, UT 84701"},"assessor":{"name":"Sevier County Assessor","address":"250 N Main St., Richfield, UT 84701"}},"Summit County, UT":{"recorder":{"name":"Summit County Recorder","address":"60 N Main St., Coalville, UT 84017"},"assessor":{"name":"Summit County Assessor","address":"60 N Main St., Coalville, UT 84017"}},"Tooele County, UT":{"recorder":{"name":"Tooele County Recorder","address":"47 S Main St., Tooele, UT 84074"},"assessor":{"name":"Tooele County Assessor","address":"47 S Main St., Tooele, UT 84074"}},"Uintah County, UT":{"recorder":{"name":"Uintah County Recorder","address":"147 E Main St., Vernal, UT 84078"},"assessor":{"name":"Uintah County Assessor","address":"147 E Main St., Vernal, UT 84078"}},"Utah County, UT":{"recorder":{"name":"Utah County Recorder","address":"100 E Center St. Suite 1200, Provo, UT 84606"},"assessor":{"name":"Utah County Assessor","address":"100 E Center St. Suite 1100, Provo, UT 84606"}},"Wasatch County, UT":{"recorder":{"name":"Wasatch County Recorder","address":"25 N Main St., Heber City, UT 84032"},"assessor":{"name":"Wasatch County Assessor","address":"25 N Main St., Heber City, UT 84032"}},"Washington County, UT":{"recorder":{"name":"Washington County Recorder","address":"111 E Tabernacle St., St. George, UT 84770"},"assessor":{"name":"Washington County Assessor","address":"111 E Tabernacle St., St. George, UT 84770"}},"Wayne County, UT":{"recorder":{"name":"Wayne County Recorder","address":"18 S Main St., Loa, UT 84747"},"assessor":{"name":"Wayne County Assessor","address":"18 S Main St., Loa, UT 84747"}},"Weber County, UT":{"recorder":{"name":"Weber County Recorder","address":"2380 Washington Blvd. Suite 320, Ogden, UT 84401"},"assessor":{"name":"Weber County Assessor","address":"2380 Washington Blvd. Suite 380, Ogden, UT 84401"}},"Accomack County, VA":{"recorder":{"name":"Accomack County Circuit Court Clerk","address":"23296 Courthouse Ave., Accomac, VA 23301"},"assessor":{"name":"Accomack County Commissioner of Revenue","address":"23296 Courthouse Ave., Accomac, VA 23301"}},"Albemarle County, VA":{"recorder":{"name":"Albemarle County Circuit Court Clerk","address":"501 E Jefferson St., Charlottesville, VA 22902"},"assessor":{"name":"Albemarle County Commissioner of Revenue","address":"401 McIntire Rd. Suite 228, Charlottesville, VA 22902"}},"Alleghany County, VA":{"recorder":{"name":"Alleghany County Circuit Court Clerk","address":"266 W Main St., Covington, VA 24426"},"assessor":{"name":"Alleghany County Commissioner of Revenue","address":"266 W Main St., Covington, VA 24426"}},"Amelia County, VA":{"recorder":{"name":"Amelia County Circuit Court Clerk","address":"16441 Court St., Amelia Court House, VA 23002"},"assessor":{"name":"Amelia County Commissioner of Revenue","address":"16441 Court St., Amelia Court House, VA 23002"}},"Amherst County, VA":{"recorder":{"name":"Amherst County Circuit Court Clerk","address":"113 Taylor St., Amherst, VA 24521"},"assessor":{"name":"Amherst County Commissioner of Revenue","address":"113 Taylor St., Amherst, VA 24521"}},"Appomattox County, VA":{"recorder":{"name":"Appomattox County Circuit Court Clerk","address":"Main & Court St., Appomattox, VA 24522"},"assessor":{"name":"Appomattox County Commissioner of Revenue","address":"Main & Court St., Appomattox, VA 24522"}},"Arlington County, VA":{"recorder":{"name":"Arlington County Circuit Court Clerk","address":"1425 N Courthouse Rd. Suite 6700, Arlington, VA 22201"},"assessor":{"name":"Arlington County Commissioner of Revenue","address":"2100 Clarendon Blvd. Suite 200, Arlington, VA 22201"}},"Augusta County, VA":{"recorder":{"name":"Augusta County Circuit Court Clerk","address":"6 E Johnson St., Staunton, VA 24401"},"assessor":{"name":"Augusta County Commissioner of Revenue","address":"6 E Johnson St., Staunton, VA 24401"}},"Bath County, VA":{"recorder":{"name":"Bath County Circuit Court Clerk","address":"Courthouse Square, Warm Springs, VA 24484"},"assessor":{"name":"Bath County Commissioner of Revenue","address":"Courthouse Square, Warm Springs, VA 24484"}},"Bedford County, VA":{"recorder":{"name":"Bedford County Circuit Court Clerk","address":"123 E Main St. Suite 201, Bedford, VA 24523"},"assessor":{"name":"Bedford County Commissioner of Revenue","address":"123 E Main St. Suite 201, Bedford, VA 24523"}},"Bland County, VA":{"recorder":{"name":"Bland County Circuit Court Clerk","address":"612 Main St., Bland, VA 24315"},"assessor":{"name":"Bland County Commissioner of Revenue","address":"612 Main St., Bland, VA 24315"}},"Botetourt County, VA":{"recorder":{"name":"Botetourt County Circuit Court Clerk","address":"1 W Main St., Fincastle, VA 24090"},"assessor":{"name":"Botetourt County Commissioner of Revenue","address":"1 W Main St., Fincastle, VA 24090"}},"Brunswick County, VA":{"recorder":{"name":"Brunswick County Circuit Court Clerk","address":"216 N Main St., Lawrenceville, VA 23868"},"assessor":{"name":"Brunswick County Commissioner of Revenue","address":"216 N Main St., Lawrenceville, VA 23868"}},"Buchanan County, VA":{"recorder":{"name":"Buchanan County Circuit Court Clerk","address":"Grundy, VA 24614"},"assessor":{"name":"Buchanan County Commissioner of Revenue","address":"Grundy, VA 24614"}},"Buckingham County, VA":{"recorder":{"name":"Buckingham County Circuit Court Clerk","address":"13062 W James Anderson Hwy, Buckingham, VA 23921"},"assessor":{"name":"Buckingham County Commissioner of Revenue","address":"13062 W James Anderson Hwy, Buckingham, VA 23921"}},"Campbell County, VA":{"recorder":{"name":"Campbell County Circuit Court Clerk","address":"735 Village Hwy, Rustburg, VA 24588"},"assessor":{"name":"Campbell County Commissioner of Revenue","address":"735 Village Hwy, Rustburg, VA 24588"}},"Caroline County, VA":{"recorder":{"name":"Caroline County Circuit Court Clerk","address":"112 Courthouse Ln. Suite B, Bowling Green, VA 22427"},"assessor":{"name":"Caroline County Commissioner of Revenue","address":"112 Courthouse Ln. Suite B, Bowling Green, VA 22427"}},"Carroll County, VA":{"recorder":{"name":"Carroll County Circuit Court Clerk","address":"605 Pine St. Suite 201, Hillsville, VA 24343"},"assessor":{"name":"Carroll County Commissioner of Revenue","address":"605 Pine St. Suite 201, Hillsville, VA 24343"}},"Charles City County, VA":{"recorder":{"name":"Charles City County Circuit Court Clerk","address":"10760 Courthouse Rd., Charles City, VA 23030"},"assessor":{"name":"Charles City County Commissioner of Revenue","address":"10760 Courthouse Rd., Charles City, VA 23030"}},"Charlotte County, VA":{"recorder":{"name":"Charlotte County Circuit Court Clerk","address":"138 David Bruce Ave., Charlotte Court House, VA 23923"},"assessor":{"name":"Charlotte County Commissioner of Revenue","address":"138 David Bruce Ave., Charlotte Court House, VA 23923"}},"Chesterfield County, VA":{"recorder":{"name":"Chesterfield County Circuit Court Clerk","address":"9500 Courthouse Rd., Chesterfield, VA 23832"},"assessor":{"name":"Chesterfield County Commissioner of Revenue","address":"9500 Courthouse Rd., Chesterfield, VA 23832"}},"Clarke County, VA":{"recorder":{"name":"Clarke County Circuit Court Clerk","address":"102 E Main St., Berryville, VA 22611"},"assessor":{"name":"Clarke County Commissioner of Revenue","address":"102 E Main St., Berryville, VA 22611"}},"Craig County, VA":{"recorder":{"name":"Craig County Circuit Court Clerk","address":"303 Court St., New Castle, VA 24127"},"assessor":{"name":"Craig County Commissioner of Revenue","address":"303 Court St., New Castle, VA 24127"}},"Culpeper County, VA":{"recorder":{"name":"Culpeper County Circuit Court Clerk","address":"135 W Cameron St., Culpeper, VA 22701"},"assessor":{"name":"Culpeper County Commissioner of Revenue","address":"135 W Cameron St., Culpeper, VA 22701"}},"Cumberland County, VA":{"recorder":{"name":"Cumberland County Circuit Court Clerk","address":"1 Courthouse Circle, Cumberland, VA 23040"},"assessor":{"name":"Cumberland County Commissioner of Revenue","address":"1 Courthouse Circle, Cumberland, VA 23040"}},"Dickenson County, VA":{"recorder":{"name":"Dickenson County Circuit Court Clerk","address":"293 Clintwood Main St., Clintwood, VA 24228"},"assessor":{"name":"Dickenson County Commissioner of Revenue","address":"293 Clintwood Main St., Clintwood, VA 24228"}},"Dinwiddie County, VA":{"recorder":{"name":"Dinwiddie County Circuit Court Clerk","address":"14016 Boydton Plank Rd., Dinwiddie, VA 23841"},"assessor":{"name":"Dinwiddie County Commissioner of Revenue","address":"14016 Boydton Plank Rd., Dinwiddie, VA 23841"}},"Essex County, VA":{"recorder":{"name":"Essex County Circuit Court Clerk","address":"305 Prince St., Tappahannock, VA 22560"},"assessor":{"name":"Essex County Commissioner of Revenue","address":"305 Prince St., Tappahannock, VA 22560"}},"Fairfax County, VA":{"recorder":{"name":"Fairfax County Circuit Court Clerk","address":"4110 Chain Bridge Rd. Suite 317, Fairfax, VA 22030"},"assessor":{"name":"Fairfax County Department of Tax Administration","address":"12000 Government Center Pkwy Suite 223, Fairfax, VA 22035"}},"Fauquier County, VA":{"recorder":{"name":"Fauquier County Circuit Court Clerk","address":"40 Culpeper St., Warrenton, VA 20186"},"assessor":{"name":"Fauquier County Commissioner of Revenue","address":"40 Culpeper St., Warrenton, VA 20186"}},"Floyd County, VA":{"recorder":{"name":"Floyd County Circuit Court Clerk","address":"100 E Main St. Suite 200, Floyd, VA 24091"},"assessor":{"name":"Floyd County Commissioner of Revenue","address":"100 E Main St. Suite 200, Floyd, VA 24091"}},"Fluvanna County, VA":{"recorder":{"name":"Fluvanna County Circuit Court Clerk","address":"72 Main St., Palmyra, VA 22963"},"assessor":{"name":"Fluvanna County Commissioner of Revenue","address":"72 Main St., Palmyra, VA 22963"}},"Franklin County, VA":{"recorder":{"name":"Franklin County Circuit Court Clerk","address":"275 S Main St. Suite 117, Rocky Mount, VA 24151"},"assessor":{"name":"Franklin County Commissioner of Revenue","address":"275 S Main St. Suite 117, Rocky Mount, VA 24151"}},"Frederick County, VA":{"recorder":{"name":"Frederick County Circuit Court Clerk","address":"5 N Kent St., Winchester, VA 22601"},"assessor":{"name":"Frederick County Commissioner of Revenue","address":"107 N Kent St., Winchester, VA 22601"}},"Giles County, VA":{"recorder":{"name":"Giles County Circuit Court Clerk","address":"501 Wenonah Ave., Pearisburg, VA 24134"},"assessor":{"name":"Giles County Commissioner of Revenue","address":"501 Wenonah Ave., Pearisburg, VA 24134"}},"Gloucester County, VA":{"recorder":{"name":"Gloucester County Circuit Court Clerk","address":"7400 Justice Dr., Gloucester, VA 23061"},"assessor":{"name":"Gloucester County Commissioner of Revenue","address":"6489 Main St. Suite 116, Gloucester, VA 23061"}},"Goochland County, VA":{"recorder":{"name":"Goochland County Circuit Court Clerk","address":"2938 River Rd. W, Goochland, VA 23063"},"assessor":{"name":"Goochland County Commissioner of Revenue","address":"2938 River Rd. W, Goochland, VA 23063"}},"Grayson County, VA":{"recorder":{"name":"Grayson County Circuit Court Clerk","address":"129 Davis St. Suite 101, Independence, VA 24348"},"assessor":{"name":"Grayson County Commissioner of Revenue","address":"129 Davis St. Suite 101, Independence, VA 24348"}},"Greene County, VA":{"recorder":{"name":"Greene County Circuit Court Clerk","address":"22 Court St. Suite 201, Stanardsville, VA 22973"},"assessor":{"name":"Greene County Commissioner of Revenue","address":"22 Court St. Suite 201, Stanardsville, VA 22973"}},"Greensville County, VA":{"recorder":{"name":"Greensville County Circuit Court Clerk","address":"337 S Main St., Emporia, VA 23847"},"assessor":{"name":"Greensville County Commissioner of Revenue","address":"337 S Main St., Emporia, VA 23847"}},"Halifax County, VA":{"recorder":{"name":"Halifax County Circuit Court Clerk","address":"1 S Main St., Halifax, VA 24558"},"assessor":{"name":"Halifax County Commissioner of Revenue","address":"1 S Main St., Halifax, VA 24558"}},"Hanover County, VA":{"recorder":{"name":"Hanover County Circuit Court Clerk","address":"7507 Library Dr., Hanover, VA 23069"},"assessor":{"name":"Hanover County Commissioner of Revenue","address":"7507 Library Dr., Hanover, VA 23069"}},"Henrico County, VA":{"recorder":{"name":"Henrico County Circuit Court Clerk","address":"4301 E Parham Rd., Richmond, VA 23228"},"assessor":{"name":"Henrico County Department of Finance","address":"4301 E Parham Rd., Richmond, VA 23228"}},"Henry County, VA":{"recorder":{"name":"Henry County Circuit Court Clerk","address":"1 N Main St., Martinsville, VA 24112"},"assessor":{"name":"Henry County Commissioner of Revenue","address":"1 N Main St., Martinsville, VA 24112"}},"Highland County, VA":{"recorder":{"name":"Highland County Circuit Court Clerk","address":"165 W Main St., Monterey, VA 24465"},"assessor":{"name":"Highland County Commissioner of Revenue","address":"165 W Main St., Monterey, VA 24465"}},"Isle of Wight County, VA":{"recorder":{"name":"Isle of Wight County Circuit Court Clerk","address":"17000 Josiah Parker Circle, Isle of Wight, VA 23397"},"assessor":{"name":"Isle of Wight County Commissioner of Revenue","address":"17000 Josiah Parker Circle, Isle of Wight, VA 23397"}},"James City County, VA":{"recorder":{"name":"James City County Circuit Court Clerk","address":"5201 Monticello Ave. Suite 5, Williamsburg, VA 23188"},"assessor":{"name":"James City County Commissioner of Revenue","address":"5201 Monticello Ave. Suite 5, Williamsburg, VA 23188"}},"King and Queen County, VA":{"recorder":{"name":"King and Queen County Circuit Court Clerk","address":"242 Allens Circle Suite 5, King and Queen Court House, VA 23085"},"assessor":{"name":"King and Queen County Commissioner of Revenue","address":"242 Allens Circle Suite 5, King and Queen Court House, VA 23085"}},"King George County, VA":{"recorder":{"name":"King George County Circuit Court Clerk","address":"9483 Kings Hwy Suite 2, King George, VA 22485"},"assessor":{"name":"King George County Commissioner of Revenue","address":"9483 Kings Hwy Suite 2, King George, VA 22485"}},"King William County, VA":{"recorder":{"name":"King William County Circuit Court Clerk","address":"351 Courthouse Ln. Suite 201, King William, VA 23086"},"assessor":{"name":"King William County Commissioner of Revenue","address":"351 Courthouse Ln. Suite 201, King William, VA 23086"}},"Lancaster County, VA":{"recorder":{"name":"Lancaster County Circuit Court Clerk","address":"8311 Mary Ball Rd., Lancaster, VA 22503"},"assessor":{"name":"Lancaster County Commissioner of Revenue","address":"8311 Mary Ball Rd., Lancaster, VA 22503"}},"Lee County, VA":{"recorder":{"name":"Lee County Circuit Court Clerk","address":"Main St., Jonesville, VA 24263"},"assessor":{"name":"Lee County Commissioner of Revenue","address":"Main St., Jonesville, VA 24263"}},"Loudoun County, VA":{"recorder":{"name":"Loudoun County Circuit Court Clerk","address":"18 E Market St., Leesburg, VA 20176"},"assessor":{"name":"Loudoun County Commissioner of Revenue","address":"1 Harrison St. SE MSC #31, Leesburg, VA 20175"}},"Louisa County, VA":{"recorder":{"name":"Louisa County Circuit Court Clerk","address":"100 W Main St., Louisa, VA 23093"},"assessor":{"name":"Louisa County Commissioner of Revenue","address":"100 W Main St., Louisa, VA 23093"}},"Lunenburg County, VA":{"recorder":{"name":"Lunenburg County Circuit Court Clerk","address":"11420 Courthouse Dr., Lunenburg, VA 23952"},"assessor":{"name":"Lunenburg County Commissioner of Revenue","address":"11420 Courthouse Dr., Lunenburg, VA 23952"}},"Madison County, VA":{"recorder":{"name":"Madison County Circuit Court Clerk","address":"1 Main St., Madison, VA 22727"},"assessor":{"name":"Madison County Commissioner of Revenue","address":"1 Main St., Madison, VA 22727"}},"Mathews County, VA":{"recorder":{"name":"Mathews County Circuit Court Clerk","address":"10622 Buckley Hall Rd., Mathews, VA 23109"},"assessor":{"name":"Mathews County Commissioner of Revenue","address":"10622 Buckley Hall Rd., Mathews, VA 23109"}},"Mecklenburg County, VA":{"recorder":{"name":"Mecklenburg County Circuit Court Clerk","address":"393 Washington St., Boydton, VA 23917"},"assessor":{"name":"Mecklenburg County Commissioner of Revenue","address":"393 Washington St., Boydton, VA 23917"}},"Middlesex County, VA":{"recorder":{"name":"Middlesex County Circuit Court Clerk","address":"73 Bowden St., Saluda, VA 23149"},"assessor":{"name":"Middlesex County Commissioner of Revenue","address":"73 Bowden St., Saluda, VA 23149"}},"Montgomery County, VA":{"recorder":{"name":"Montgomery County Circuit Court Clerk","address":"55 E Main St. Suite 201, Christiansburg, VA 24073"},"assessor":{"name":"Montgomery County Commissioner of Revenue","address":"755 Roanoke St. Suite 1B, Christiansburg, VA 24073"}},"Nelson County, VA":{"recorder":{"name":"Nelson County Circuit Court Clerk","address":"84 Courthouse Square, Lovingston, VA 22949"},"assessor":{"name":"Nelson County Commissioner of Revenue","address":"84 Courthouse Square, Lovingston, VA 22949"}},"New Kent County, VA":{"recorder":{"name":"New Kent County Circuit Court Clerk","address":"12001 Courthouse Circle Suite 1, New Kent, VA 23124"},"assessor":{"name":"New Kent County Commissioner of Revenue","address":"12001 Courthouse Circle Suite 1, New Kent, VA 23124"}},"Northampton County, VA":{"recorder":{"name":"Northampton County Circuit Court Clerk","address":"5229 The Hornes Ln., Eastville, VA 23347"},"assessor":{"name":"Northampton County Commissioner of Revenue","address":"5229 The Hornes Ln., Eastville, VA 23347"}},"Northumberland County, VA":{"recorder":{"name":"Northumberland County Circuit Court Clerk","address":"220 Judicial Pl. Suite 301, Heathsville, VA 22473"},"assessor":{"name":"Northumberland County Commissioner of Revenue","address":"220 Judicial Pl. Suite 301, Heathsville, VA 22473"}},"Nottoway County, VA":{"recorder":{"name":"Nottoway County Circuit Court Clerk","address":"290 W Courthouse Rd., Nottoway, VA 23955"},"assessor":{"name":"Nottoway County Commissioner of Revenue","address":"290 W Courthouse Rd., Nottoway, VA 23955"}},"Orange County, VA":{"recorder":{"name":"Orange County Circuit Court Clerk","address":"110 N Madison Rd., Orange, VA 22960"},"assessor":{"name":"Orange County Commissioner of Revenue","address":"112 W Main St., Orange, VA 22960"}},"Page County, VA":{"recorder":{"name":"Page County Circuit Court Clerk","address":"116 S Court St., Luray, VA 22835"},"assessor":{"name":"Page County Commissioner of Revenue","address":"116 S Court St., Luray, VA 22835"}},"Patrick County, VA":{"recorder":{"name":"Patrick County Circuit Court Clerk","address":"106 Rucker St., Stuart, VA 24171"},"assessor":{"name":"Patrick County Commissioner of Revenue","address":"106 Rucker St., Stuart, VA 24171"}},"Pittsylvania County, VA":{"recorder":{"name":"Pittsylvania County Circuit Court Clerk","address":"11 Bank St. Suite 201, Chatham, VA 24531"},"assessor":{"name":"Pittsylvania County Commissioner of Revenue","address":"11 Bank St. Suite 201, Chatham, VA 24531"}},"Powhatan County, VA":{"recorder":{"name":"Powhatan County Circuit Court Clerk","address":"3880 Old Buckingham Rd., Powhatan, VA 23139"},"assessor":{"name":"Powhatan County Commissioner of Revenue","address":"3880 Old Buckingham Rd., Powhatan, VA 23139"}},"Prince Edward County, VA":{"recorder":{"name":"Prince Edward County Circuit Court Clerk","address":"111 S Main St., Farmville, VA 23901"},"assessor":{"name":"Prince Edward County Commissioner of Revenue","address":"111 S Main St., Farmville, VA 23901"}},"Prince George County, VA":{"recorder":{"name":"Prince George County Circuit Court Clerk","address":"6601 Courts Dr., Prince George, VA 23875"},"assessor":{"name":"Prince George County Commissioner of Revenue","address":"6601 Courts Dr., Prince George, VA 23875"}},"Prince William County, VA":{"recorder":{"name":"Prince William County Circuit Court Clerk","address":"9311 Lee Ave., Manassas, VA 20110"},"assessor":{"name":"Prince William County Office of Finance","address":"1 County Complex Court, Prince William, VA 22192"}},"Pulaski County, VA":{"recorder":{"name":"Pulaski County Circuit Court Clerk","address":"45 3rd St. NW Suite 101, Pulaski, VA 24301"},"assessor":{"name":"Pulaski County Commissioner of Revenue","address":"143 3rd St. NW Suite 1, Pulaski, VA 24301"}},"Rappahannock County, VA":{"recorder":{"name":"Rappahannock County Circuit Court Clerk","address":"238 Gay St., Washington, VA 22747"},"assessor":{"name":"Rappahannock County Commissioner of Revenue","address":"238 Gay St., Washington, VA 22747"}},"Richmond County, VA":{"recorder":{"name":"Richmond County Circuit Court Clerk","address":"101 Court Circle, Warsaw, VA 22572"},"assessor":{"name":"Richmond County Commissioner of Revenue","address":"101 Court Circle, Warsaw, VA 22572"}},"Roanoke County, VA":{"recorder":{"name":"Roanoke County Circuit Court Clerk","address":"305 E Main St., Salem, VA 24153"},"assessor":{"name":"Roanoke County Commissioner of Revenue","address":"5204 Bernard Dr. Suite 200, Roanoke, VA 24018"}},"Rockbridge County, VA":{"recorder":{"name":"Rockbridge County Circuit Court Clerk","address":"20 S Randolph St., Lexington, VA 24450"},"assessor":{"name":"Rockbridge County Commissioner of Revenue","address":"20 S Randolph St., Lexington, VA 24450"}},"Rockingham County, VA":{"recorder":{"name":"Rockingham County Circuit Court Clerk","address":"53 Court Square, Harrisonburg, VA 22801"},"assessor":{"name":"Rockingham County Commissioner of Revenue","address":"20 E Gay St., Harrisonburg, VA 22802"}},"Russell County, VA":{"recorder":{"name":"Russell County Circuit Court Clerk","address":"55 E Main St. Suite 101, Lebanon, VA 24266"},"assessor":{"name":"Russell County Commissioner of Revenue","address":"55 E Main St. Suite 101, Lebanon, VA 24266"}},"Scott County, VA":{"recorder":{"name":"Scott County Circuit Court Clerk","address":"104 E Jackson St. Suite 2, Gate City, VA 24251"},"assessor":{"name":"Scott County Commissioner of Revenue","address":"104 E Jackson St. Suite 2, Gate City, VA 24251"}},"Shenandoah County, VA":{"recorder":{"name":"Shenandoah County Circuit Court Clerk","address":"112 S Main St., Woodstock, VA 22664"},"assessor":{"name":"Shenandoah County Commissioner of Revenue","address":"600 N Main St. Suite 101, Woodstock, VA 22664"}},"Smyth County, VA":{"recorder":{"name":"Smyth County Circuit Court Clerk","address":"109 W Main St. Room 143, Marion, VA 24354"},"assessor":{"name":"Smyth County Commissioner of Revenue","address":"109 W Main St. Room 143, Marion, VA 24354"}},"Southampton County, VA":{"recorder":{"name":"Southampton County Circuit Court Clerk","address":"22350 Main St., Courtland, VA 23837"},"assessor":{"name":"Southampton County Commissioner of Revenue","address":"22350 Main St., Courtland, VA 23837"}},"Spotsylvania County, VA":{"recorder":{"name":"Spotsylvania County Circuit Court Clerk","address":"9115 Courthouse Rd. Suite 201, Spotsylvania, VA 22553"},"assessor":{"name":"Spotsylvania County Commissioner of Revenue","address":"9104 Courthouse Rd., Spotsylvania, VA 22553"}},"Stafford County, VA":{"recorder":{"name":"Stafford County Circuit Court Clerk","address":"1300 Courthouse Rd., Stafford, VA 22554"},"assessor":{"name":"Stafford County Commissioner of Revenue","address":"1300 Courthouse Rd., Stafford, VA 22554"}},"Surry County, VA":{"recorder":{"name":"Surry County Circuit Court Clerk","address":"45 School St., Surry, VA 23883"},"assessor":{"name":"Surry County Commissioner of Revenue","address":"45 School St., Surry, VA 23883"}},"Sussex County, VA":{"recorder":{"name":"Sussex County Circuit Court Clerk","address":"15088 Courthouse Rd., Sussex, VA 23884"},"assessor":{"name":"Sussex County Commissioner of Revenue","address":"15088 Courthouse Rd., Sussex, VA 23884"}},"Tazewell County, VA":{"recorder":{"name":"Tazewell County Circuit Court Clerk","address":"101 E Main St. Suite 201, Tazewell, VA 24651"},"assessor":{"name":"Tazewell County Commissioner of Revenue","address":"108 E Main St., Tazewell, VA 24651"}},"Warren County, VA":{"recorder":{"name":"Warren County Circuit Court Clerk","address":"1 E Main St., Front Royal, VA 22630"},"assessor":{"name":"Warren County Commissioner of Revenue","address":"220 N Commerce Ave. Suite 800, Front Royal, VA 22630"}},"Washington County, VA":{"recorder":{"name":"Washington County Circuit Court Clerk","address":"205 Academy Dr. Suite 102, Abingdon, VA 24210"},"assessor":{"name":"Washington County Commissioner of Revenue","address":"205 Academy Dr. Suite 102, Abingdon, VA 24210"}},"Westmoreland County, VA":{"recorder":{"name":"Westmoreland County Circuit Court Clerk","address":"111 Polk St. Suite 9, Montross, VA 22520"},"assessor":{"name":"Westmoreland County Commissioner of Revenue","address":"111 Polk St. Suite 9, Montross, VA 22520"}},"Wise County, VA":{"recorder":{"name":"Wise County Circuit Court Clerk","address":"206 E Main St., Wise, VA 24293"},"assessor":{"name":"Wise County Commissioner of Revenue","address":"206 E Main St., Wise, VA 24293"}},"Wythe County, VA":{"recorder":{"name":"Wythe County Circuit Court Clerk","address":"225 S 4th St. Room 105, Wytheville, VA 24382"},"assessor":{"name":"Wythe County Commissioner of Revenue","address":"340 S 4th St., Wytheville, VA 24382"}},"York County, VA":{"recorder":{"name":"York County Circuit Court Clerk","address":"300 Ballard St., Yorktown, VA 23690"},"assessor":{"name":"York County Commissioner of Revenue","address":"224 Ballard St., Yorktown, VA 23690"}},"Alexandria City, VA":{"recorder":{"name":"Alexandria Circuit Court Clerk","address":"520 King St. Suite 307, Alexandria, VA 22314"},"assessor":{"name":"Alexandria Commissioner of Revenue","address":"301 King St. Room 1700, Alexandria, VA 22314"}},"Bristol City, VA":{"recorder":{"name":"Bristol Circuit Court Clerk","address":"497 Cumberland St. Suite 1, Bristol, VA 24201"},"assessor":{"name":"Bristol Commissioner of Revenue","address":"497 Cumberland St. Suite 1, Bristol, VA 24201"}},"Buena Vista City, VA":{"recorder":{"name":"Buena Vista Circuit Court Clerk","address":"2039 Sycamore Ave., Buena Vista, VA 24416"},"assessor":{"name":"Buena Vista Commissioner of Revenue","address":"2039 Sycamore Ave., Buena Vista, VA 24416"}},"Charlottesville City, VA":{"recorder":{"name":"Charlottesville Circuit Court Clerk","address":"315 E High St., Charlottesville, VA 22902"},"assessor":{"name":"Charlottesville Commissioner of Revenue","address":"605 E Main St., Charlottesville, VA 22902"}},"Chesapeake City, VA":{"recorder":{"name":"Chesapeake Circuit Court Clerk","address":"307 Albemarle Dr. Suite 300A, Chesapeake, VA 23322"},"assessor":{"name":"Chesapeake Commissioner of Revenue","address":"306 Cedar Rd., Chesapeake, VA 23322"}},"Colonial Heights City, VA":{"recorder":{"name":"Colonial Heights Circuit Court Clerk","address":"401 Temple Ave., Colonial Heights, VA 23834"},"assessor":{"name":"Colonial Heights Commissioner of Revenue","address":"401 Temple Ave., Colonial Heights, VA 23834"}},"Covington City, VA":{"recorder":{"name":"Covington Circuit Court Clerk","address":"266 W Main St., Covington, VA 24426"},"assessor":{"name":"Covington Commissioner of Revenue","address":"266 W Main St., Covington, VA 24426"}},"Danville City, VA":{"recorder":{"name":"Danville Circuit Court Clerk","address":"401 Patton St., Danville, VA 24541"},"assessor":{"name":"Danville Commissioner of Revenue","address":"427 Patton St., Danville, VA 24541"}},"Emporia City, VA":{"recorder":{"name":"Emporia Circuit Court Clerk","address":"145 N Main St., Emporia, VA 23847"},"assessor":{"name":"Emporia Commissioner of Revenue","address":"201 S Main St., Emporia, VA 23847"}},"Fairfax City, VA":{"recorder":{"name":"Fairfax City Circuit Court Clerk","address":"4000 Chain Bridge Rd., Fairfax, VA 22030"},"assessor":{"name":"Fairfax City Commissioner of Revenue","address":"10455 Armstrong St., Fairfax, VA 22030"}},"Falls Church City, VA":{"recorder":{"name":"Falls Church Circuit Court Clerk","address":"300 Park Ave. Suite 103W, Falls Church, VA 22046"},"assessor":{"name":"Falls Church Commissioner of Revenue","address":"300 Park Ave. Suite 104E, Falls Church, VA 22046"}},"Franklin City, VA":{"recorder":{"name":"Franklin Circuit Court Clerk","address":"207 W 2nd Ave., Franklin, VA 23851"},"assessor":{"name":"Franklin Commissioner of Revenue","address":"207 W 2nd Ave., Franklin, VA 23851"}},"Fredericksburg City, VA":{"recorder":{"name":"Fredericksburg Circuit Court Clerk","address":"815 Princess Anne St., Fredericksburg, VA 22401"},"assessor":{"name":"Fredericksburg Commissioner of Revenue","address":"601 Caroline St., Fredericksburg, VA 22401"}},"Galax City, VA":{"recorder":{"name":"Galax Circuit Court Clerk","address":"200 S Main St., Galax, VA 24333"},"assessor":{"name":"Galax Commissioner of Revenue","address":"200 S Main St., Galax, VA 24333"}},"Hampton City, VA":{"recorder":{"name":"Hampton Circuit Court Clerk","address":"101 Kings Way Suite 2200, Hampton, VA 23669"},"assessor":{"name":"Hampton Commissioner of Revenue","address":"1 Franklin St. Suite 100, Hampton, VA 23669"}},"Harrisonburg City, VA":{"recorder":{"name":"Harrisonburg Circuit Court Clerk","address":"53 Court Square Suite B, Harrisonburg, VA 22801"},"assessor":{"name":"Harrisonburg Commissioner of Revenue","address":"409 S Main St., Harrisonburg, VA 22801"}},"Hopewell City, VA":{"recorder":{"name":"Hopewell Circuit Court Clerk","address":"100 E Broadway Suite 256, Hopewell, VA 23860"},"assessor":{"name":"Hopewell Commissioner of Revenue","address":"300 N Main St., Hopewell, VA 23860"}},"Lexington City, VA":{"recorder":{"name":"Lexington Circuit Court Clerk","address":"2 S Main St. Suite 201, Lexington, VA 24450"},"assessor":{"name":"Lexington Commissioner of Revenue","address":"300 E Washington St., Lexington, VA 24450"}},"Lynchburg City, VA":{"recorder":{"name":"Lynchburg Circuit Court Clerk","address":"900 Court St., Lynchburg, VA 24504"},"assessor":{"name":"Lynchburg Commissioner of Revenue","address":"900 Church St. 1st Floor, Lynchburg, VA 24504"}},"Manassas City, VA":{"recorder":{"name":"Manassas Circuit Court Clerk","address":"9311 Lee Ave., Manassas, VA 20110"},"assessor":{"name":"Manassas Commissioner of Revenue","address":"9027 Center St. Suite 104, Manassas, VA 20110"}},"Manassas Park City, VA":{"recorder":{"name":"Manassas Park Circuit Court Clerk","address":"1 Park Center Ct., Manassas Park, VA 20111"},"assessor":{"name":"Manassas Park Commissioner of Revenue","address":"1 Park Center Ct., Manassas Park, VA 20111"}},"Martinsville City, VA":{"recorder":{"name":"Martinsville Circuit Court Clerk","address":"55 W Church St., Martinsville, VA 24112"},"assessor":{"name":"Martinsville Commissioner of Revenue","address":"55 W Church St., Martinsville, VA 24112"}},"Newport News City, VA":{"recorder":{"name":"Newport News Circuit Court Clerk","address":"2500 Washington Ave., Newport News, VA 23607"},"assessor":{"name":"Newport News Commissioner of Revenue","address":"2400 Washington Ave., Newport News, VA 23607"}},"Norfolk City, VA":{"recorder":{"name":"Norfolk Circuit Court Clerk","address":"150 St. Paul's Blvd. Room 202, Norfolk, VA 23510"},"assessor":{"name":"Norfolk Commissioner of Revenue","address":"810 Union St. Suite 400, Norfolk, VA 23510"}},"Norton City, VA":{"recorder":{"name":"Norton Circuit Court Clerk","address":"618 Virginia Ave. NW Suite 210, Norton, VA 24273"},"assessor":{"name":"Norton Commissioner of Revenue","address":"618 Virginia Ave. NW Suite 210, Norton, VA 24273"}},"Petersburg City, VA":{"recorder":{"name":"Petersburg Circuit Court Clerk","address":"7 Courthouse Ave. Suite 101, Petersburg, VA 23803"},"assessor":{"name":"Petersburg Commissioner of Revenue","address":"135 N Union St., Petersburg, VA 23803"}},"Poquoson City, VA":{"recorder":{"name":"Poquoson Circuit Court Clerk","address":"500 City Hall Ave., Poquoson, VA 23662"},"assessor":{"name":"Poquoson Commissioner of Revenue","address":"500 City Hall Ave., Poquoson, VA 23662"}},"Portsmouth City, VA":{"recorder":{"name":"Portsmouth Circuit Court Clerk","address":"1345 Court St., Portsmouth, VA 23704"},"assessor":{"name":"Portsmouth Commissioner of Revenue","address":"801 Crawford St., Portsmouth, VA 23704"}},"Radford City, VA":{"recorder":{"name":"Radford Circuit Court Clerk","address":"619 2nd St. Room 244, Radford, VA 24141"},"assessor":{"name":"Radford Commissioner of Revenue","address":"10 Robertson St., Radford, VA 24141"}},"Richmond City, VA":{"recorder":{"name":"Richmond Circuit Court Clerk","address":"400 N 9th St. Suite 203, Richmond, VA 23219"},"assessor":{"name":"Richmond Commissioner of Revenue","address":"900 E Broad St. Suite 100, Richmond, VA 23219"}},"Roanoke City, VA":{"recorder":{"name":"Roanoke Circuit Court Clerk","address":"315 W Church Ave. Room 450, Roanoke, VA 24016"},"assessor":{"name":"Roanoke Commissioner of Revenue","address":"215 W Church Ave. Room 254, Roanoke, VA 24011"}},"Salem City, VA":{"recorder":{"name":"Salem Circuit Court Clerk","address":"2 E Calhoun St., Salem, VA 24153"},"assessor":{"name":"Salem Commissioner of Revenue","address":"114 N Broad St., Salem, VA 24153"}},"Staunton City, VA":{"recorder":{"name":"Staunton Circuit Court Clerk","address":"113 E Beverly St. Suite 201, Staunton, VA 24401"},"assessor":{"name":"Staunton Commissioner of Revenue","address":"116 W Beverley St., Staunton, VA 24401"}},"Suffolk City, VA":{"recorder":{"name":"Suffolk Circuit Court Clerk","address":"150 N Main St., Suffolk, VA 23434"},"assessor":{"name":"Suffolk Commissioner of Revenue","address":"441 Market St., Suffolk, VA 23434"}},"Virginia Beach City, VA":{"recorder":{"name":"Virginia Beach Circuit Court Clerk","address":"2425 Nimmo Pkwy Bldg 10B, Virginia Beach, VA 23456"},"assessor":{"name":"Virginia Beach Commissioner of Revenue","address":"2401 Courthouse Dr. Bldg 1, Virginia Beach, VA 23456"}},"Waynesboro City, VA":{"recorder":{"name":"Waynesboro Circuit Court Clerk","address":"250 S Wayne Ave., Waynesboro, VA 22980"},"assessor":{"name":"Waynesboro Commissioner of Revenue","address":"503 W Main St., Waynesboro, VA 22980"}},"Williamsburg City, VA":{"recorder":{"name":"Williamsburg Circuit Court Clerk","address":"5201 Monticello Ave. Suite 5, Williamsburg, VA 23188"},"assessor":{"name":"Williamsburg Commissioner of Revenue","address":"401 Lafayette St., Williamsburg, VA 23185"}},"Winchester City, VA":{"recorder":{"name":"Winchester Circuit Court Clerk","address":"5 N Kent St., Winchester, VA 22601"},"assessor":{"name":"Winchester Commissioner of Revenue","address":"400 W Jubal Early Dr. Suite 100, Winchester, VA 22601"}},"Addison County, VT":{"recorder":{"name":"Addison County Clerk","address":"5 Court St., Middlebury, VT 05753"},"assessor":{"name":"Middlebury Town Listers","address":"77 Main St., Middlebury, VT 05753"}},"Bennington County, VT":{"recorder":{"name":"Bennington County Clerk","address":"207 South St., Bennington, VT 05201"},"assessor":{"name":"Bennington Town Listers","address":"205 South St., Bennington, VT 05201"}},"Caledonia County, VT":{"recorder":{"name":"Caledonia County Clerk","address":"27 Main St. Suite 3, St. Johnsbury, VT 05819"},"assessor":{"name":"St. Johnsbury Town Listers","address":"1187 Main St. Suite 1, St. Johnsbury, VT 05819"}},"Chittenden County, VT":{"recorder":{"name":"Chittenden County Clerk","address":"175 Main St., Burlington, VT 05401"},"assessor":{"name":"Burlington City Assessor","address":"149 Church St., Burlington, VT 05401"}},"Essex County, VT":{"recorder":{"name":"Essex County Clerk","address":"75 Court St., Guildhall, VT 05905"},"assessor":{"name":"Guildhall Town Listers","address":"75 Court St., Guildhall, VT 05905"}},"Franklin County, VT":{"recorder":{"name":"Franklin County Clerk","address":"17 Church St., St. Albans, VT 05478"},"assessor":{"name":"St. Albans Town Listers","address":"579 Lake Rd., St. Albans, VT 05478"}},"Grand Isle County, VT":{"recorder":{"name":"Grand Isle County Clerk","address":"9 Hyde Rd., North Hero, VT 05474"},"assessor":{"name":"North Hero Town Listers","address":"9 Hyde Rd., North Hero, VT 05474"}},"Lamoille County, VT":{"recorder":{"name":"Lamoille County Clerk","address":"154 Hyde Park Way, Hyde Park, VT 05655"},"assessor":{"name":"Hyde Park Town Listers","address":"454 VT Route 100, Hyde Park, VT 05655"}},"Orange County, VT":{"recorder":{"name":"Orange County Clerk","address":"5 Court St., Chelsea, VT 05038"},"assessor":{"name":"Chelsea Town Listers","address":"P.O. Box 266, Chelsea, VT 05038"}},"Orleans County, VT":{"recorder":{"name":"Orleans County Clerk","address":"247 Main St., Newport, VT 05855"},"assessor":{"name":"Newport City Assessor","address":"222 Main St., Newport, VT 05855"}},"Rutland County, VT":{"recorder":{"name":"Rutland County Clerk","address":"83 Center St., Rutland, VT 05701"},"assessor":{"name":"Rutland City Assessor","address":"1 Strongs Ave., Rutland, VT 05701"}},"Washington County, VT":{"recorder":{"name":"Washington County Clerk","address":"10 Elm St., Montpelier, VT 05602"},"assessor":{"name":"Montpelier City Assessor","address":"39 Main St., Montpelier, VT 05602"}},"Windham County, VT":{"recorder":{"name":"Windham County Clerk","address":"30 Putney Rd., Brattleboro, VT 05301"},"assessor":{"name":"Brattleboro Town Listers","address":"230 Main St. Suite 108, Brattleboro, VT 05301"}},"Windsor County, VT":{"recorder":{"name":"Windsor County Clerk","address":"12 The Green, Woodstock, VT 05091"},"assessor":{"name":"Woodstock Town Listers","address":"31 The Green, Woodstock, VT 05091"}},"Adams County, WA":{"recorder":{"name":"Adams County Auditor","address":"210 W Broadway Ave Suite 300, Ritzville, WA 99169"},"assessor":{"name":"Adams County Assessor","address":"210 W Broadway Ave Suite 200, Ritzville, WA 99169"}},"Asotin County, WA":{"recorder":{"name":"Asotin County Auditor","address":"135 2nd St., Asotin, WA 99402"},"assessor":{"name":"Asotin County Assessor","address":"135 2nd St., Asotin, WA 99402"}},"Benton County, WA":{"recorder":{"name":"Benton County Auditor","address":"620 Market St., Prosser, WA 99350"},"assessor":{"name":"Benton County Assessor","address":"620 Market St., Prosser, WA 99350"}},"Chelan County, WA":{"recorder":{"name":"Chelan County Auditor","address":"350 Orondo Ave., Wenatchee, WA 98801"},"assessor":{"name":"Chelan County Assessor","address":"350 Orondo Ave., Wenatchee, WA 98801"}},"Clallam County, WA":{"recorder":{"name":"Clallam County Auditor","address":"223 E 4th St. Suite 1, Port Angeles, WA 98362"},"assessor":{"name":"Clallam County Assessor","address":"223 E 4th St. Suite 4, Port Angeles, WA 98362"}},"Clark County, WA":{"recorder":{"name":"Clark County Auditor","address":"1408 Franklin St., Vancouver, WA 98660"},"assessor":{"name":"Clark County Assessor","address":"1300 Franklin St. Suite 650, Vancouver, WA 98660"}},"Columbia County, WA":{"recorder":{"name":"Columbia County Auditor","address":"341 E Main St., Dayton, WA 99328"},"assessor":{"name":"Columbia County Assessor","address":"341 E Main St., Dayton, WA 99328"}},"Cowlitz County, WA":{"recorder":{"name":"Cowlitz County Auditor","address":"207 4th Ave N., Kelso, WA 98626"},"assessor":{"name":"Cowlitz County Assessor","address":"207 4th Ave N. Room 201, Kelso, WA 98626"}},"Douglas County, WA":{"recorder":{"name":"Douglas County Auditor","address":"203 Rainier St., Waterville, WA 98858"},"assessor":{"name":"Douglas County Assessor","address":"203 Rainier St., Waterville, WA 98858"}},"Ferry County, WA":{"recorder":{"name":"Ferry County Auditor","address":"350 E Delaware Ave Suite 11, Republic, WA 99166"},"assessor":{"name":"Ferry County Assessor","address":"350 E Delaware Ave Suite 18, Republic, WA 99166"}},"Franklin County, WA":{"recorder":{"name":"Franklin County Auditor","address":"1016 N 4th Ave., Pasco, WA 99301"},"assessor":{"name":"Franklin County Assessor","address":"1016 N 4th Ave., Pasco, WA 99301"}},"Garfield County, WA":{"recorder":{"name":"Garfield County Auditor","address":"789 Main St., Pomeroy, WA 99347"},"assessor":{"name":"Garfield County Assessor","address":"789 Main St., Pomeroy, WA 99347"}},"Grant County, WA":{"recorder":{"name":"Grant County Auditor","address":"35 C St NW, Ephrata, WA 98823"},"assessor":{"name":"Grant County Assessor","address":"35 C St NW, Ephrata, WA 98823"}},"Grays Harbor County, WA":{"recorder":{"name":"Grays Harbor County Auditor","address":"100 W Broadway Suite 3, Montesano, WA 98563"},"assessor":{"name":"Grays Harbor County Assessor","address":"100 W Broadway Suite 4, Montesano, WA 98563"}},"Island County, WA":{"recorder":{"name":"Island County Auditor","address":"1 NE 7th St. Suite 103, Coupeville, WA 98239"},"assessor":{"name":"Island County Assessor","address":"1 NE 7th St. Suite 111, Coupeville, WA 98239"}},"Jefferson County, WA":{"recorder":{"name":"Jefferson County Auditor","address":"1820 Jefferson St., Port Townsend, WA 98368"},"assessor":{"name":"Jefferson County Assessor","address":"1820 Jefferson St., Port Townsend, WA 98368"}},"King County, WA":{"recorder":{"name":"King County Records & Licensing Services","address":"500 4th Ave Room 311, Seattle, WA 98104"},"assessor":{"name":"King County Assessor","address":"500 4th Ave Suite 700, Seattle, WA 98104"}},"Kitsap County, WA":{"recorder":{"name":"Kitsap County Auditor","address":"614 Division St. MS-31, Port Orchard, WA 98366"},"assessor":{"name":"Kitsap County Assessor","address":"614 Division St. MS-22, Port Orchard, WA 98366"}},"Kittitas County, WA":{"recorder":{"name":"Kittitas County Auditor","address":"205 W 5th Ave Suite 104, Ellensburg, WA 98926"},"assessor":{"name":"Kittitas County Assessor","address":"205 W 5th Ave Suite 101, Ellensburg, WA 98926"}},"Klickitat County, WA":{"recorder":{"name":"Klickitat County Auditor","address":"205 S Columbus Ave, Goldendale, WA 98620"},"assessor":{"name":"Klickitat County Assessor","address":"205 S Columbus Ave, Goldendale, WA 98620"}},"Lewis County, WA":{"recorder":{"name":"Lewis County Auditor","address":"351 NW North St. MS-ADR01, Chehalis, WA 98532"},"assessor":{"name":"Lewis County Assessor","address":"351 NW North St., Chehalis, WA 98532"}},"Lincoln County, WA":{"recorder":{"name":"Lincoln County Auditor","address":"450 Logan St., Davenport, WA 99122"},"assessor":{"name":"Lincoln County Assessor","address":"450 Logan St., Davenport, WA 99122"}},"Mason County, WA":{"recorder":{"name":"Mason County Auditor","address":"411 N 5th St., Shelton, WA 98584"},"assessor":{"name":"Mason County Assessor","address":"411 N 5th St., Shelton, WA 98584"}},"Okanogan County, WA":{"recorder":{"name":"Okanogan County Auditor","address":"149 3rd N Suite 1, Okanogan, WA 98840"},"assessor":{"name":"Okanogan County Assessor","address":"149 3rd N Suite 2, Okanogan, WA 98840"}},"Pacific County, WA":{"recorder":{"name":"Pacific County Auditor","address":"300 Memorial Dr., South Bend, WA 98586"},"assessor":{"name":"Pacific County Assessor","address":"300 Memorial Dr., South Bend, WA 98586"}},"Pend Oreille County, WA":{"recorder":{"name":"Pend Oreille County Auditor","address":"625 W 4th St., Newport, WA 99156"},"assessor":{"name":"Pend Oreille County Assessor","address":"625 W 4th St., Newport, WA 99156"}},"Pierce County, WA":{"recorder":{"name":"Pierce County Auditor","address":"2401 S 35th St., Tacoma, WA 98409"},"assessor":{"name":"Pierce County Assessor","address":"2401 S 35th St., Tacoma, WA 98409"}},"San Juan County, WA":{"recorder":{"name":"San Juan County Auditor","address":"350 Court St Suite 6, Friday Harbor, WA 98250"},"assessor":{"name":"San Juan County Assessor","address":"350 Court St Suite 9, Friday Harbor, WA 98250"}},"Skagit County, WA":{"recorder":{"name":"Skagit County Auditor","address":"700 S 2nd St Suite 105, Mount Vernon, WA 98273"},"assessor":{"name":"Skagit County Assessor","address":"700 S 2nd St Suite 204, Mount Vernon, WA 98273"}},"Skamania County, WA":{"recorder":{"name":"Skamania County Auditor","address":"240 Vancouver Ave., Stevenson, WA 98648"},"assessor":{"name":"Skamania County Assessor","address":"240 Vancouver Ave., Stevenson, WA 98648"}},"Snohomish County, WA":{"recorder":{"name":"Snohomish County Auditor","address":"3000 Rockefeller Ave. M/S 204, Everett, WA 98201"},"assessor":{"name":"Snohomish County Assessor","address":"3000 Rockefeller Ave. M/S 510, Everett, WA 98201"}},"Spokane County, WA":{"recorder":{"name":"Spokane County Auditor","address":"1116 W Broadway Ave, Spokane, WA 99260"},"assessor":{"name":"Spokane County Assessor","address":"824 N Adams St., Spokane, WA 99260"}},"Stevens County, WA":{"recorder":{"name":"Stevens County Auditor","address":"215 S Oak St. Room 106, Colville, WA 99114"},"assessor":{"name":"Stevens County Assessor","address":"215 S Oak St. Room 108, Colville, WA 99114"}},"Thurston County, WA":{"recorder":{"name":"Thurston County Auditor","address":"2000 Lakeridge Dr. SW Bldg 1, Olympia, WA 98502"},"assessor":{"name":"Thurston County Assessor","address":"2000 Lakeridge Dr. SW Bldg 1, Olympia, WA 98502"}},"Wahkiakum County, WA":{"recorder":{"name":"Wahkiakum County Auditor","address":"64 Main St., Cathlamet, WA 98612"},"assessor":{"name":"Wahkiakum County Assessor","address":"64 Main St., Cathlamet, WA 98612"}},"Walla Walla County, WA":{"recorder":{"name":"Walla Walla County Auditor","address":"315 W Main St Suite 201, Walla Walla, WA 99362"},"assessor":{"name":"Walla Walla County Assessor","address":"315 W Main St Suite 100, Walla Walla, WA 99362"}},"Whatcom County, WA":{"recorder":{"name":"Whatcom County Auditor","address":"311 Grand Ave Suite 103, Bellingham, WA 98225"},"assessor":{"name":"Whatcom County Assessor","address":"311 Grand Ave Suite 104, Bellingham, WA 98225"}},"Whitman County, WA":{"recorder":{"name":"Whitman County Auditor","address":"400 N Main St., Colfax, WA 99111"},"assessor":{"name":"Whitman County Assessor","address":"400 N Main St., Colfax, WA 99111"}},"Yakima County, WA":{"recorder":{"name":"Yakima County Auditor","address":"128 N 2nd St Room 117, Yakima, WA 98901"},"assessor":{"name":"Yakima County Assessor","address":"128 N 2nd St Room 112, Yakima, WA 98901"}},"Adams County, WI":{"recorder":{"name":"Adams County Register of Deeds","address":"402 Main St., Friendship, WI 53934"},"assessor":{"name":"Adams County Land Information","address":"402 Main St., Friendship, WI 53934"}},"Ashland County, WI":{"recorder":{"name":"Ashland County Register of Deeds","address":"201 W Main St., Ashland, WI 54806"},"assessor":{"name":"Ashland County Land Information","address":"201 W Main St., Ashland, WI 54806"}},"Barron County, WI":{"recorder":{"name":"Barron County Register of Deeds","address":"330 E LaSalle Ave., Barron, WI 54812"},"assessor":{"name":"Barron County Land Information","address":"330 E LaSalle Ave., Barron, WI 54812"}},"Bayfield County, WI":{"recorder":{"name":"Bayfield County Register of Deeds","address":"117 E 5th St., Washburn, WI 54891"},"assessor":{"name":"Bayfield County Land Information","address":"117 E 5th St., Washburn, WI 54891"}},"Brown County, WI":{"recorder":{"name":"Brown County Register of Deeds","address":"305 E Walnut St. Suite 100, Green Bay, WI 54301"},"assessor":{"name":"Brown County Land Information","address":"305 E Walnut St. Suite 100, Green Bay, WI 54301"}},"Buffalo County, WI":{"recorder":{"name":"Buffalo County Register of Deeds","address":"407 S 2nd St., Alma, WI 54610"},"assessor":{"name":"Buffalo County Land Information","address":"407 S 2nd St., Alma, WI 54610"}},"Burnett County, WI":{"recorder":{"name":"Burnett County Register of Deeds","address":"7410 County Rd K Suite 107, Siren, WI 54872"},"assessor":{"name":"Burnett County Land Information","address":"7410 County Rd K Suite 107, Siren, WI 54872"}},"Calumet County, WI":{"recorder":{"name":"Calumet County Register of Deeds","address":"206 Court St., Chilton, WI 53014"},"assessor":{"name":"Calumet County Land Information","address":"206 Court St., Chilton, WI 53014"}},"Chippewa County, WI":{"recorder":{"name":"Chippewa County Register of Deeds","address":"711 N Bridge St., Chippewa Falls, WI 54729"},"assessor":{"name":"Chippewa County Land Information","address":"711 N Bridge St., Chippewa Falls, WI 54729"}},"Clark County, WI":{"recorder":{"name":"Clark County Register of Deeds","address":"517 Court St. Room 406, Neillsville, WI 54456"},"assessor":{"name":"Clark County Land Information","address":"517 Court St. Room 406, Neillsville, WI 54456"}},"Columbia County, WI":{"recorder":{"name":"Columbia County Register of Deeds","address":"400 DeWitt St., Portage, WI 53901"},"assessor":{"name":"Columbia County Land Information","address":"400 DeWitt St., Portage, WI 53901"}},"Crawford County, WI":{"recorder":{"name":"Crawford County Register of Deeds","address":"225 N Beaumont Rd., Prairie du Chien, WI 53821"},"assessor":{"name":"Crawford County Land Information","address":"225 N Beaumont Rd., Prairie du Chien, WI 53821"}},"Dane County, WI":{"recorder":{"name":"Dane County Register of Deeds","address":"210 Martin Luther King Jr Blvd Room 110, Madison, WI 53703"},"assessor":{"name":"Dane County Land Information","address":"210 Martin Luther King Jr Blvd Room 110, Madison, WI 53703"}},"Dodge County, WI":{"recorder":{"name":"Dodge County Register of Deeds","address":"127 E Oak St., Juneau, WI 53039"},"assessor":{"name":"Dodge County Land Information","address":"127 E Oak St., Juneau, WI 53039"}},"Door County, WI":{"recorder":{"name":"Door County Register of Deeds","address":"421 Nebraska St., Sturgeon Bay, WI 54235"},"assessor":{"name":"Door County Land Information","address":"421 Nebraska St., Sturgeon Bay, WI 54235"}},"Douglas County, WI":{"recorder":{"name":"Douglas County Register of Deeds","address":"1313 Belknap St. Room 201, Superior, WI 54880"},"assessor":{"name":"Douglas County Land Information","address":"1313 Belknap St. Room 201, Superior, WI 54880"}},"Dunn County, WI":{"recorder":{"name":"Dunn County Register of Deeds","address":"800 Wilson Ave., Menomonie, WI 54751"},"assessor":{"name":"Dunn County Land Information","address":"800 Wilson Ave., Menomonie, WI 54751"}},"Eau Claire County, WI":{"recorder":{"name":"Eau Claire County Register of Deeds","address":"721 Oxford Ave., Eau Claire, WI 54703"},"assessor":{"name":"Eau Claire County Land Information","address":"721 Oxford Ave., Eau Claire, WI 54703"}},"Florence County, WI":{"recorder":{"name":"Florence County Register of Deeds","address":"501 Lake Ave., Florence, WI 54121"},"assessor":{"name":"Florence County Land Information","address":"501 Lake Ave., Florence, WI 54121"}},"Fond du Lac County, WI":{"recorder":{"name":"Fond du Lac County Register of Deeds","address":"160 S Macy St., Fond du Lac, WI 54935"},"assessor":{"name":"Fond du Lac County Land Information","address":"160 S Macy St., Fond du Lac, WI 54935"}},"Forest County, WI":{"recorder":{"name":"Forest County Register of Deeds","address":"200 E Madison St., Crandon, WI 54520"},"assessor":{"name":"Forest County Land Information","address":"200 E Madison St., Crandon, WI 54520"}},"Grant County, WI":{"recorder":{"name":"Grant County Register of Deeds","address":"130 W Maple St., Lancaster, WI 53813"},"assessor":{"name":"Grant County Land Information","address":"130 W Maple St., Lancaster, WI 53813"}},"Green County, WI":{"recorder":{"name":"Green County Register of Deeds","address":"1016 16th Ave., Monroe, WI 53566"},"assessor":{"name":"Green County Land Information","address":"1016 16th Ave., Monroe, WI 53566"}},"Green Lake County, WI":{"recorder":{"name":"Green Lake County Register of Deeds","address":"571 County Rd A, Green Lake, WI 54941"},"assessor":{"name":"Green Lake County Land Information","address":"571 County Rd A, Green Lake, WI 54941"}},"Iowa County, WI":{"recorder":{"name":"Iowa County Register of Deeds","address":"222 N Iowa St., Dodgeville, WI 53533"},"assessor":{"name":"Iowa County Land Information","address":"222 N Iowa St., Dodgeville, WI 53533"}},"Iron County, WI":{"recorder":{"name":"Iron County Register of Deeds","address":"300 Taconite St. Suite 101, Hurley, WI 54534"},"assessor":{"name":"Iron County Land Information","address":"300 Taconite St. Suite 101, Hurley, WI 54534"}},"Jackson County, WI":{"recorder":{"name":"Jackson County Register of Deeds","address":"307 Main St., Black River Falls, WI 54615"},"assessor":{"name":"Jackson County Land Information","address":"307 Main St., Black River Falls, WI 54615"}},"Jefferson County, WI":{"recorder":{"name":"Jefferson County Register of Deeds","address":"311 S Center Ave., Jefferson, WI 53549"},"assessor":{"name":"Jefferson County Land Information","address":"311 S Center Ave., Jefferson, WI 53549"}},"Juneau County, WI":{"recorder":{"name":"Juneau County Register of Deeds","address":"220 E State St., Mauston, WI 53948"},"assessor":{"name":"Juneau County Land Information","address":"220 E State St., Mauston, WI 53948"}},"Kenosha County, WI":{"recorder":{"name":"Kenosha County Register of Deeds","address":"1010 56th St., Kenosha, WI 53140"},"assessor":{"name":"Kenosha County Land Information","address":"1010 56th St., Kenosha, WI 53140"}},"Kewaunee County, WI":{"recorder":{"name":"Kewaunee County Register of Deeds","address":"613 Dodge St., Kewaunee, WI 54216"},"assessor":{"name":"Kewaunee County Land Information","address":"613 Dodge St., Kewaunee, WI 54216"}},"La Crosse County, WI":{"recorder":{"name":"La Crosse County Register of Deeds","address":"212 6th St. N, La Crosse, WI 54601"},"assessor":{"name":"La Crosse County Land Information","address":"212 6th St. N, La Crosse, WI 54601"}},"Lafayette County, WI":{"recorder":{"name":"Lafayette County Register of Deeds","address":"626 Main St., Darlington, WI 53530"},"assessor":{"name":"Lafayette County Land Information","address":"626 Main St., Darlington, WI 53530"}},"Langlade County, WI":{"recorder":{"name":"Langlade County Register of Deeds","address":"800 Clermont St., Antigo, WI 54409"},"assessor":{"name":"Langlade County Land Information","address":"800 Clermont St., Antigo, WI 54409"}},"Lincoln County, WI":{"recorder":{"name":"Lincoln County Register of Deeds","address":"1110 E Main St. Suite 205, Merrill, WI 54452"},"assessor":{"name":"Lincoln County Land Information","address":"1110 E Main St. Suite 205, Merrill, WI 54452"}},"Manitowoc County, WI":{"recorder":{"name":"Manitowoc County Register of Deeds","address":"1010 S 8th St., Manitowoc, WI 54220"},"assessor":{"name":"Manitowoc County Land Information","address":"1010 S 8th St., Manitowoc, WI 54220"}},"Marathon County, WI":{"recorder":{"name":"Marathon County Register of Deeds","address":"500 Forest St., Wausau, WI 54403"},"assessor":{"name":"Marathon County Land Information","address":"500 Forest St., Wausau, WI 54403"}},"Marinette County, WI":{"recorder":{"name":"Marinette County Register of Deeds","address":"1926 Hall Ave., Marinette, WI 54143"},"assessor":{"name":"Marinette County Land Information","address":"1926 Hall Ave., Marinette, WI 54143"}},"Marquette County, WI":{"recorder":{"name":"Marquette County Register of Deeds","address":"77 W Park St., Montello, WI 53949"},"assessor":{"name":"Marquette County Land Information","address":"77 W Park St., Montello, WI 53949"}},"Menominee County, WI":{"recorder":{"name":"Menominee County Register of Deeds","address":"W3269 Courthouse Ln., Keshena, WI 54135"},"assessor":{"name":"Menominee County Land Information","address":"W3269 Courthouse Ln., Keshena, WI 54135"}},"Milwaukee County, WI":{"recorder":{"name":"Milwaukee County Register of Deeds","address":"901 N 9th St. Room 103, Milwaukee, WI 53233"},"assessor":{"name":"Milwaukee County Land Information","address":"901 N 9th St. Room 103, Milwaukee, WI 53233"}},"Monroe County, WI":{"recorder":{"name":"Monroe County Register of Deeds","address":"202 S K St. Suite 1, Sparta, WI 54656"},"assessor":{"name":"Monroe County Land Information","address":"202 S K St. Suite 1, Sparta, WI 54656"}},"Oconto County, WI":{"recorder":{"name":"Oconto County Register of Deeds","address":"301 Washington St., Oconto, WI 54153"},"assessor":{"name":"Oconto County Land Information","address":"301 Washington St., Oconto, WI 54153"}},"Oneida County, WI":{"recorder":{"name":"Oneida County Register of Deeds","address":"1 S Oneida Ave., Rhinelander, WI 54501"},"assessor":{"name":"Oneida County Land Information","address":"1 S Oneida Ave., Rhinelander, WI 54501"}},"Outagamie County, WI":{"recorder":{"name":"Outagamie County Register of Deeds","address":"410 S Walnut St., Appleton, WI 54911"},"assessor":{"name":"Outagamie County Land Information","address":"410 S Walnut St., Appleton, WI 54911"}},"Ozaukee County, WI":{"recorder":{"name":"Ozaukee County Register of Deeds","address":"121 W Main St., Port Washington, WI 53074"},"assessor":{"name":"Ozaukee County Land Information","address":"121 W Main St., Port Washington, WI 53074"}},"Pepin County, WI":{"recorder":{"name":"Pepin County Register of Deeds","address":"740 7th Ave W, Durand, WI 54736"},"assessor":{"name":"Pepin County Land Information","address":"740 7th Ave W, Durand, WI 54736"}},"Pierce County, WI":{"recorder":{"name":"Pierce County Register of Deeds","address":"414 W Main St., Ellsworth, WI 54011"},"assessor":{"name":"Pierce County Land Information","address":"414 W Main St., Ellsworth, WI 54011"}},"Polk County, WI":{"recorder":{"name":"Polk County Register of Deeds","address":"100 Polk County Plaza Suite 110, Balsam Lake, WI 54810"},"assessor":{"name":"Polk County Land Information","address":"100 Polk County Plaza Suite 110, Balsam Lake, WI 54810"}},"Portage County, WI":{"recorder":{"name":"Portage County Register of Deeds","address":"1516 Church St., Stevens Point, WI 54481"},"assessor":{"name":"Portage County Land Information","address":"1516 Church St., Stevens Point, WI 54481"}},"Price County, WI":{"recorder":{"name":"Price County Register of Deeds","address":"126 Cherry St., Phillips, WI 54555"},"assessor":{"name":"Price County Land Information","address":"126 Cherry St., Phillips, WI 54555"}},"Racine County, WI":{"recorder":{"name":"Racine County Register of Deeds","address":"730 Wisconsin Ave., Racine, WI 53403"},"assessor":{"name":"Racine County Land Information","address":"730 Wisconsin Ave., Racine, WI 53403"}},"Richland County, WI":{"recorder":{"name":"Richland County Register of Deeds","address":"181 W Seminary St., Richland Center, WI 53581"},"assessor":{"name":"Richland County Land Information","address":"181 W Seminary St., Richland Center, WI 53581"}},"Rock County, WI":{"recorder":{"name":"Rock County Register of Deeds","address":"51 S Main St., Janesville, WI 53545"},"assessor":{"name":"Rock County Land Information","address":"51 S Main St., Janesville, WI 53545"}},"Rusk County, WI":{"recorder":{"name":"Rusk County Register of Deeds","address":"311 Miner Ave E Suite C150, Ladysmith, WI 54848"},"assessor":{"name":"Rusk County Land Information","address":"311 Miner Ave E Suite C150, Ladysmith, WI 54848"}},"Sauk County, WI":{"recorder":{"name":"Sauk County Register of Deeds","address":"505 Broadway Suite 114, Baraboo, WI 53913"},"assessor":{"name":"Sauk County Land Information","address":"505 Broadway Suite 114, Baraboo, WI 53913"}},"Sawyer County, WI":{"recorder":{"name":"Sawyer County Register of Deeds","address":"10610 Main St. Suite 10, Hayward, WI 54843"},"assessor":{"name":"Sawyer County Land Information","address":"10610 Main St. Suite 10, Hayward, WI 54843"}},"Shawano County, WI":{"recorder":{"name":"Shawano County Register of Deeds","address":"311 N Main St., Shawano, WI 54166"},"assessor":{"name":"Shawano County Land Information","address":"311 N Main St., Shawano, WI 54166"}},"Sheboygan County, WI":{"recorder":{"name":"Sheboygan County Register of Deeds","address":"508 New York Ave., Sheboygan, WI 53081"},"assessor":{"name":"Sheboygan County Land Information","address":"508 New York Ave., Sheboygan, WI 53081"}},"St. Croix County, WI":{"recorder":{"name":"St. Croix County Register of Deeds","address":"1101 Carmichael Rd., Hudson, WI 54016"},"assessor":{"name":"St. Croix County Land Information","address":"1101 Carmichael Rd., Hudson, WI 54016"}},"Taylor County, WI":{"recorder":{"name":"Taylor County Register of Deeds","address":"224 S 2nd St., Medford, WI 54451"},"assessor":{"name":"Taylor County Land Information","address":"224 S 2nd St., Medford, WI 54451"}},"Trempealeau County, WI":{"recorder":{"name":"Trempealeau County Register of Deeds","address":"36245 Main St., Whitehall, WI 54773"},"assessor":{"name":"Trempealeau County Land Information","address":"36245 Main St., Whitehall, WI 54773"}},"Vernon County, WI":{"recorder":{"name":"Vernon County Register of Deeds","address":"400 Courthouse Square, Viroqua, WI 54665"},"assessor":{"name":"Vernon County Land Information","address":"400 Courthouse Square, Viroqua, WI 54665"}},"Vilas County, WI":{"recorder":{"name":"Vilas County Register of Deeds","address":"330 Court St., Eagle River, WI 54521"},"assessor":{"name":"Vilas County Land Information","address":"330 Court St., Eagle River, WI 54521"}},"Walworth County, WI":{"recorder":{"name":"Walworth County Register of Deeds","address":"100 W Walworth St., Elkhorn, WI 53121"},"assessor":{"name":"Walworth County Land Information","address":"100 W Walworth St., Elkhorn, WI 53121"}},"Washburn County, WI":{"recorder":{"name":"Washburn County Register of Deeds","address":"10 4th Ave., Shell Lake, WI 54871"},"assessor":{"name":"Washburn County Land Information","address":"10 4th Ave., Shell Lake, WI 54871"}},"Washington County, WI":{"recorder":{"name":"Washington County Register of Deeds","address":"432 E Washington St. Room 1073, West Bend, WI 53095"},"assessor":{"name":"Washington County Land Information","address":"432 E Washington St. Room 1073, West Bend, WI 53095"}},"Waukesha County, WI":{"recorder":{"name":"Waukesha County Register of Deeds","address":"515 W Moreland Blvd. Room AC150, Waukesha, WI 53188"},"assessor":{"name":"Waukesha County Land Information","address":"515 W Moreland Blvd. Room AC150, Waukesha, WI 53188"}},"Waupaca County, WI":{"recorder":{"name":"Waupaca County Register of Deeds","address":"811 Harding St., Waupaca, WI 54981"},"assessor":{"name":"Waupaca County Land Information","address":"811 Harding St., Waupaca, WI 54981"}},"Waushara County, WI":{"recorder":{"name":"Waushara County Register of Deeds","address":"209 S Saint Marie St., Wautoma, WI 54982"},"assessor":{"name":"Waushara County Land Information","address":"209 S Saint Marie St., Wautoma, WI 54982"}},"Winnebago County, WI":{"recorder":{"name":"Winnebago County Register of Deeds","address":"415 Jackson St., Oshkosh, WI 54901"},"assessor":{"name":"Winnebago County Land Information","address":"415 Jackson St., Oshkosh, WI 54901"}},"Wood County, WI":{"recorder":{"name":"Wood County Register of Deeds","address":"400 Market St., Wisconsin Rapids, WI 54494"},"assessor":{"name":"Wood County Land Information","address":"400 Market St., Wisconsin Rapids, WI 54494"}},"Barbour County, WV":{"recorder":{"name":"Barbour County Clerk","address":"8 N Main St. Suite 1, Philippi, WV 26416"},"assessor":{"name":"Barbour County Assessor","address":"8 N Main St. Suite 1, Philippi, WV 26416"}},"Berkeley County, WV":{"recorder":{"name":"Berkeley County Clerk","address":"100 W King St. Suite 2, Martinsburg, WV 25401"},"assessor":{"name":"Berkeley County Assessor","address":"400 W Stephen St. Suite 209, Martinsburg, WV 25401"}},"Boone County, WV":{"recorder":{"name":"Boone County Clerk","address":"200 State St. Suite 4, Madison, WV 25130"},"assessor":{"name":"Boone County Assessor","address":"200 State St. Suite 4, Madison, WV 25130"}},"Braxton County, WV":{"recorder":{"name":"Braxton County Clerk","address":"300 Main St., Sutton, WV 26601"},"assessor":{"name":"Braxton County Assessor","address":"300 Main St., Sutton, WV 26601"}},"Brooke County, WV":{"recorder":{"name":"Brooke County Clerk","address":"632 Main St., Wellsburg, WV 26070"},"assessor":{"name":"Brooke County Assessor","address":"632 Main St., Wellsburg, WV 26070"}},"Cabell County, WV":{"recorder":{"name":"Cabell County Clerk","address":"750 5th Ave. Room 108, Huntington, WV 25701"},"assessor":{"name":"Cabell County Assessor","address":"750 5th Ave. Room 108, Huntington, WV 25701"}},"Calhoun County, WV":{"recorder":{"name":"Calhoun County Clerk","address":"Court St., Grantsville, WV 26147"},"assessor":{"name":"Calhoun County Assessor","address":"Court St., Grantsville, WV 26147"}},"Clay County, WV":{"recorder":{"name":"Clay County Clerk","address":"246 Main St., Clay, WV 25043"},"assessor":{"name":"Clay County Assessor","address":"246 Main St., Clay, WV 25043"}},"Doddridge County, WV":{"recorder":{"name":"Doddridge County Clerk","address":"118 E Court St., West Union, WV 26456"},"assessor":{"name":"Doddridge County Assessor","address":"118 E Court St., West Union, WV 26456"}},"Fayette County, WV":{"recorder":{"name":"Fayette County Clerk","address":"100 Court St. Suite 302, Fayetteville, WV 25840"},"assessor":{"name":"Fayette County Assessor","address":"100 Court St. Suite 302, Fayetteville, WV 25840"}},"Gilmer County, WV":{"recorder":{"name":"Gilmer County Clerk","address":"10 Howard St., Glenville, WV 26351"},"assessor":{"name":"Gilmer County Assessor","address":"10 Howard St., Glenville, WV 26351"}},"Grant County, WV":{"recorder":{"name":"Grant County Clerk","address":"5 Highland Ave., Petersburg, WV 26847"},"assessor":{"name":"Grant County Assessor","address":"5 Highland Ave., Petersburg, WV 26847"}},"Greenbrier County, WV":{"recorder":{"name":"Greenbrier County Clerk","address":"912 N Court St., Lewisburg, WV 24901"},"assessor":{"name":"Greenbrier County Assessor","address":"912 N Court St., Lewisburg, WV 24901"}},"Hampshire County, WV":{"recorder":{"name":"Hampshire County Clerk","address":"66 N High St. Suite 3, Romney, WV 26757"},"assessor":{"name":"Hampshire County Assessor","address":"66 N High St. Suite 3, Romney, WV 26757"}},"Hancock County, WV":{"recorder":{"name":"Hancock County Clerk","address":"102 N Court St., New Cumberland, WV 26047"},"assessor":{"name":"Hancock County Assessor","address":"102 N Court St., New Cumberland, WV 26047"}},"Hardy County, WV":{"recorder":{"name":"Hardy County Clerk","address":"204 Washington St. Suite 6, Moorefield, WV 26836"},"assessor":{"name":"Hardy County Assessor","address":"204 Washington St. Suite 6, Moorefield, WV 26836"}},"Harrison County, WV":{"recorder":{"name":"Harrison County Clerk","address":"301 W Main St. Suite 10, Clarksburg, WV 26301"},"assessor":{"name":"Harrison County Assessor","address":"301 W Main St. Suite 10, Clarksburg, WV 26301"}},"Jackson County, WV":{"recorder":{"name":"Jackson County Clerk","address":"200 Main St. Suite 100, Ripley, WV 25271"},"assessor":{"name":"Jackson County Assessor","address":"200 Main St. Suite 100, Ripley, WV 25271"}},"Jefferson County, WV":{"recorder":{"name":"Jefferson County Clerk","address":"100 E Washington St. Suite 200, Charles Town, WV 25414"},"assessor":{"name":"Jefferson County Assessor","address":"100 E Washington St. Suite 200, Charles Town, WV 25414"}},"Kanawha County, WV":{"recorder":{"name":"Kanawha County Clerk","address":"409 Virginia St. E Suite 120, Charleston, WV 25301"},"assessor":{"name":"Kanawha County Assessor","address":"409 Virginia St. E Suite 120, Charleston, WV 25301"}},"Lewis County, WV":{"recorder":{"name":"Lewis County Clerk","address":"110 Center Ave. Suite 1, Weston, WV 26452"},"assessor":{"name":"Lewis County Assessor","address":"110 Center Ave. Suite 1, Weston, WV 26452"}},"Lincoln County, WV":{"recorder":{"name":"Lincoln County Clerk","address":"8000 Court Ave., Hamlin, WV 25523"},"assessor":{"name":"Lincoln County Assessor","address":"8000 Court Ave., Hamlin, WV 25523"}},"Logan County, WV":{"recorder":{"name":"Logan County Clerk","address":"300 Stratton St. Room 203, Logan, WV 25601"},"assessor":{"name":"Logan County Assessor","address":"300 Stratton St. Room 203, Logan, WV 25601"}},"Marion County, WV":{"recorder":{"name":"Marion County Clerk","address":"200 Jackson St. Suite 202, Fairmont, WV 26554"},"assessor":{"name":"Marion County Assessor","address":"200 Jackson St. Suite 202, Fairmont, WV 26554"}},"Marshall County, WV":{"recorder":{"name":"Marshall County Clerk","address":"600 7th St., Moundsville, WV 26041"},"assessor":{"name":"Marshall County Assessor","address":"600 7th St., Moundsville, WV 26041"}},"Mason County, WV":{"recorder":{"name":"Mason County Clerk","address":"200 6th St., Point Pleasant, WV 25550"},"assessor":{"name":"Mason County Assessor","address":"200 6th St., Point Pleasant, WV 25550"}},"McDowell County, WV":{"recorder":{"name":"McDowell County Clerk","address":"90 Wyoming St. Suite 109, Welch, WV 24801"},"assessor":{"name":"McDowell County Assessor","address":"90 Wyoming St. Suite 109, Welch, WV 24801"}},"Mercer County, WV":{"recorder":{"name":"Mercer County Clerk","address":"1501 W Main St. Suite 115, Princeton, WV 24740"},"assessor":{"name":"Mercer County Assessor","address":"1501 W Main St. Suite 115, Princeton, WV 24740"}},"Mineral County, WV":{"recorder":{"name":"Mineral County Clerk","address":"150 Armstrong St., Keyser, WV 26726"},"assessor":{"name":"Mineral County Assessor","address":"150 Armstrong St., Keyser, WV 26726"}},"Mingo County, WV":{"recorder":{"name":"Mingo County Clerk","address":"75 E 2nd Ave. Suite 117, Williamson, WV 25661"},"assessor":{"name":"Mingo County Assessor","address":"75 E 2nd Ave. Suite 117, Williamson, WV 25661"}},"Monongalia County, WV":{"recorder":{"name":"Monongalia County Clerk","address":"243 High St. Room 123, Morgantown, WV 26505"},"assessor":{"name":"Monongalia County Assessor","address":"243 High St. Room 123, Morgantown, WV 26505"}},"Monroe County, WV":{"recorder":{"name":"Monroe County Clerk","address":"200 Main St., Union, WV 24983"},"assessor":{"name":"Monroe County Assessor","address":"200 Main St., Union, WV 24983"}},"Morgan County, WV":{"recorder":{"name":"Morgan County Clerk","address":"77 Fairfax St. Room 104, Berkeley Springs, WV 25411"},"assessor":{"name":"Morgan County Assessor","address":"77 Fairfax St. Room 104, Berkeley Springs, WV 25411"}},"Nicholas County, WV":{"recorder":{"name":"Nicholas County Clerk","address":"700 Main St., Summersville, WV 26651"},"assessor":{"name":"Nicholas County Assessor","address":"700 Main St., Summersville, WV 26651"}},"Ohio County, WV":{"recorder":{"name":"Ohio County Clerk","address":"1500 Chapline St. Suite 201, Wheeling, WV 26003"},"assessor":{"name":"Ohio County Assessor","address":"1500 Chapline St. Suite 201, Wheeling, WV 26003"}},"Pendleton County, WV":{"recorder":{"name":"Pendleton County Clerk","address":"100 S Main St. Suite 3, Franklin, WV 26807"},"assessor":{"name":"Pendleton County Assessor","address":"100 S Main St. Suite 3, Franklin, WV 26807"}},"Pleasants County, WV":{"recorder":{"name":"Pleasants County Clerk","address":"301 Court Ln. Suite 101, St. Marys, WV 26170"},"assessor":{"name":"Pleasants County Assessor","address":"301 Court Ln. Suite 101, St. Marys, WV 26170"}},"Pocahontas County, WV":{"recorder":{"name":"Pocahontas County Clerk","address":"900 10th Ave. Suite A, Marlinton, WV 24954"},"assessor":{"name":"Pocahontas County Assessor","address":"900 10th Ave. Suite A, Marlinton, WV 24954"}},"Preston County, WV":{"recorder":{"name":"Preston County Clerk","address":"101 W Main St. Suite 202, Kingwood, WV 26537"},"assessor":{"name":"Preston County Assessor","address":"101 W Main St. Suite 202, Kingwood, WV 26537"}},"Putnam County, WV":{"recorder":{"name":"Putnam County Clerk","address":"3389 Winfield Rd., Winfield, WV 25213"},"assessor":{"name":"Putnam County Assessor","address":"3389 Winfield Rd., Winfield, WV 25213"}},"Raleigh County, WV":{"recorder":{"name":"Raleigh County Clerk","address":"215 Main St. Suite 100, Beckley, WV 25801"},"assessor":{"name":"Raleigh County Assessor","address":"215 Main St. Suite 100, Beckley, WV 25801"}},"Randolph County, WV":{"recorder":{"name":"Randolph County Clerk","address":"2 Randolph Ave., Elkins, WV 26241"},"assessor":{"name":"Randolph County Assessor","address":"2 Randolph Ave., Elkins, WV 26241"}},"Ritchie County, WV":{"recorder":{"name":"Ritchie County Clerk","address":"115 E Main St., Harrisville, WV 26362"},"assessor":{"name":"Ritchie County Assessor","address":"115 E Main St., Harrisville, WV 26362"}},"Roane County, WV":{"recorder":{"name":"Roane County Clerk","address":"200 Main St., Spencer, WV 25276"},"assessor":{"name":"Roane County Assessor","address":"200 Main St., Spencer, WV 25276"}},"Summers County, WV":{"recorder":{"name":"Summers County Clerk","address":"120 Ballengee St. Suite 105, Hinton, WV 25951"},"assessor":{"name":"Summers County Assessor","address":"120 Ballengee St. Suite 105, Hinton, WV 25951"}},"Taylor County, WV":{"recorder":{"name":"Taylor County Clerk","address":"214 W Main St. Suite 101, Grafton, WV 26354"},"assessor":{"name":"Taylor County Assessor","address":"214 W Main St. Suite 101, Grafton, WV 26354"}},"Tucker County, WV":{"recorder":{"name":"Tucker County Clerk","address":"215 1st St., Parsons, WV 26287"},"assessor":{"name":"Tucker County Assessor","address":"215 1st St., Parsons, WV 26287"}},"Tyler County, WV":{"recorder":{"name":"Tyler County Clerk","address":"Main St., Middlebourne, WV 26149"},"assessor":{"name":"Tyler County Assessor","address":"Main St., Middlebourne, WV 26149"}},"Upshur County, WV":{"recorder":{"name":"Upshur County Clerk","address":"38 W Main St. Suite 101, Buckhannon, WV 26201"},"assessor":{"name":"Upshur County Assessor","address":"38 W Main St. Suite 101, Buckhannon, WV 26201"}},"Wayne County, WV":{"recorder":{"name":"Wayne County Clerk","address":"700 Hendricks St., Wayne, WV 25570"},"assessor":{"name":"Wayne County Assessor","address":"700 Hendricks St., Wayne, WV 25570"}},"Webster County, WV":{"recorder":{"name":"Webster County Clerk","address":"2 Court Square, Webster Springs, WV 26288"},"assessor":{"name":"Webster County Assessor","address":"2 Court Square, Webster Springs, WV 26288"}},"Wetzel County, WV":{"recorder":{"name":"Wetzel County Clerk","address":"Main St., New Martinsville, WV 26155"},"assessor":{"name":"Wetzel County Assessor","address":"Main St., New Martinsville, WV 26155"}},"Wirt County, WV":{"recorder":{"name":"Wirt County Clerk","address":"Courthouse Square, Elizabeth, WV 26143"},"assessor":{"name":"Wirt County Assessor","address":"Courthouse Square, Elizabeth, WV 26143"}},"Wood County, WV":{"recorder":{"name":"Wood County Clerk","address":"1 Court Square Suite 101, Parkersburg, WV 26101"},"assessor":{"name":"Wood County Assessor","address":"1 Court Square Suite 101, Parkersburg, WV 26101"}},"Wyoming County, WV":{"recorder":{"name":"Wyoming County Clerk","address":"24 Courthouse Ave., Pineville, WV 24874"},"assessor":{"name":"Wyoming County Assessor","address":"24 Courthouse Ave., Pineville, WV 24874"}},"Albany County, WY":{"recorder":{"name":"Albany County Clerk","address":"525 Grand Ave. Suite 202, Laramie, WY 82070"},"assessor":{"name":"Albany County Assessor","address":"525 Grand Ave. Suite 300, Laramie, WY 82070"}},"Big Horn County, WY":{"recorder":{"name":"Big Horn County Clerk","address":"420 W C St., Basin, WY 82410"},"assessor":{"name":"Big Horn County Assessor","address":"420 W C St., Basin, WY 82410"}},"Campbell County, WY":{"recorder":{"name":"Campbell County Clerk","address":"500 S Gillette Ave. Suite 1602, Gillette, WY 82716"},"assessor":{"name":"Campbell County Assessor","address":"500 S Gillette Ave. Suite 1100, Gillette, WY 82716"}},"Carbon County, WY":{"recorder":{"name":"Carbon County Clerk","address":"415 W Pine St., Rawlins, WY 82301"},"assessor":{"name":"Carbon County Assessor","address":"415 W Pine St., Rawlins, WY 82301"}},"Converse County, WY":{"recorder":{"name":"Converse County Clerk","address":"107 N 5th St. Suite 114, Douglas, WY 82633"},"assessor":{"name":"Converse County Assessor","address":"107 N 5th St. Suite 138, Douglas, WY 82633"}},"Crook County, WY":{"recorder":{"name":"Crook County Clerk","address":"309 Cleveland St., Sundance, WY 82729"},"assessor":{"name":"Crook County Assessor","address":"309 Cleveland St., Sundance, WY 82729"}},"Fremont County, WY":{"recorder":{"name":"Fremont County Clerk","address":"450 N 2nd St. Room 220, Lander, WY 82520"},"assessor":{"name":"Fremont County Assessor","address":"450 N 2nd St. Room 235, Lander, WY 82520"}},"Goshen County, WY":{"recorder":{"name":"Goshen County Clerk","address":"2125 E A St., Torrington, WY 82240"},"assessor":{"name":"Goshen County Assessor","address":"2125 E A St., Torrington, WY 82240"}},"Hot Springs County, WY":{"recorder":{"name":"Hot Springs County Clerk","address":"415 Arapahoe St., Thermopolis, WY 82443"},"assessor":{"name":"Hot Springs County Assessor","address":"415 Arapahoe St., Thermopolis, WY 82443"}},"Johnson County, WY":{"recorder":{"name":"Johnson County Clerk","address":"76 N Main St., Buffalo, WY 82834"},"assessor":{"name":"Johnson County Assessor","address":"76 N Main St., Buffalo, WY 82834"}},"Laramie County, WY":{"recorder":{"name":"Laramie County Clerk","address":"309 W 20th St., Cheyenne, WY 82001"},"assessor":{"name":"Laramie County Assessor","address":"309 W 20th St., Cheyenne, WY 82001"}},"Lincoln County, WY":{"recorder":{"name":"Lincoln County Clerk","address":"925 Sage Ave. Suite 101, Kemmerer, WY 83101"},"assessor":{"name":"Lincoln County Assessor","address":"925 Sage Ave. Suite 103, Kemmerer, WY 83101"}},"Natrona County, WY":{"recorder":{"name":"Natrona County Clerk","address":"200 N Center St. Room 154, Casper, WY 82601"},"assessor":{"name":"Natrona County Assessor","address":"200 N Center St. Room 140, Casper, WY 82601"}},"Niobrara County, WY":{"recorder":{"name":"Niobrara County Clerk","address":"424 S Elm St., Lusk, WY 82225"},"assessor":{"name":"Niobrara County Assessor","address":"424 S Elm St., Lusk, WY 82225"}},"Park County, WY":{"recorder":{"name":"Park County Clerk","address":"1002 Sheridan Ave., Cody, WY 82414"},"assessor":{"name":"Park County Assessor","address":"1002 Sheridan Ave., Cody, WY 82414"}},"Platte County, WY":{"recorder":{"name":"Platte County Clerk","address":"800 9th St., Wheatland, WY 82201"},"assessor":{"name":"Platte County Assessor","address":"800 9th St., Wheatland, WY 82201"}},"Sheridan County, WY":{"recorder":{"name":"Sheridan County Clerk","address":"224 S Main St. Suite B-17, Sheridan, WY 82801"},"assessor":{"name":"Sheridan County Assessor","address":"224 S Main St. Suite B-14, Sheridan, WY 82801"}},"Sublette County, WY":{"recorder":{"name":"Sublette County Clerk","address":"21 S Tyler Ave., Pinedale, WY 82941"},"assessor":{"name":"Sublette County Assessor","address":"21 S Tyler Ave., Pinedale, WY 82941"}},"Sweetwater County, WY":{"recorder":{"name":"Sweetwater County Clerk","address":"80 W Flaming Gorge Way Suite 150, Green River, WY 82935"},"assessor":{"name":"Sweetwater County Assessor","address":"80 W Flaming Gorge Way Suite 220, Green River, WY 82935"}},"Teton County, WY":{"recorder":{"name":"Teton County Clerk","address":"200 S Willow St., Jackson, WY 83001"},"assessor":{"name":"Teton County Assessor","address":"200 S Willow St., Jackson, WY 83001"}},"Uinta County, WY":{"recorder":{"name":"Uinta County Clerk","address":"225 9th St., Evanston, WY 82930"},"assessor":{"name":"Uinta County Assessor","address":"225 9th St., Evanston, WY 82930"}},"Washakie County, WY":{"recorder":{"name":"Washakie County Clerk","address":"1001 Big Horn Ave., Worland, WY 82401"},"assessor":{"name":"Washakie County Assessor","address":"1001 Big Horn Ave., Worland, WY 82401"}},"Weston County, WY":{"recorder":{"name":"Weston County Clerk","address":"1 W Main St., Newcastle, WY 82701"},"assessor":{"name":"Weston County Assessor","address":"1 W Main St., Newcastle, WY 82701"}}};
var _countyInfo = null;
var _STATE_MAP = {
'Alabama':'AL','Alaska':'AK','Arizona':'AZ','Arkansas':'AR','California':'CA',
'Colorado':'CO','Connecticut':'CT','Delaware':'DE','Florida':'FL','Georgia':'GA',
'Hawaii':'HI','Idaho':'ID','Illinois':'IL','Indiana':'IN','Iowa':'IA','Kansas':'KS',
'Kentucky':'KY','Louisiana':'LA','Maine':'ME','Maryland':'MD','Massachusetts':'MA',
'Michigan':'MI','Minnesota':'MN','Mississippi':'MS','Missouri':'MO','Montana':'MT',
'Nebraska':'NE','Nevada':'NV','New Hampshire':'NH','New Jersey':'NJ','New Mexico':'NM',
'New York':'NY','North Carolina':'NC','North Dakota':'ND','Ohio':'OH','Oklahoma':'OK',
'Oregon':'OR','Pennsylvania':'PA','Rhode Island':'RI','South Carolina':'SC',
'South Dakota':'SD','Tennessee':'TN','Texas':'TX','Utah':'UT','Vermont':'VT',
'Virginia':'VA','Washington':'WA','West Virginia':'WV','Wisconsin':'WI','Wyoming':'WY'
};
function extractCountyFromAddress(address) {
console.log('[County] STEP 1 — input address:', address);
if (!address) { console.warn('[County] STEP 1 FAIL — address is empty'); return; }
// Find state abbreviation — check full name first, then abbreviation
var stateAbbr = null;
var stateNames = Object.keys(_STATE_MAP);
for (var i = 0; i < stateNames.length; i++) {
if (address.indexOf(stateNames[i]) !== -1) {
stateAbbr = _STATE_MAP[stateNames[i]];
console.log('[County] STEP 2 — state found by full name:', stateNames[i], '→', stateAbbr);
break;
}
}
// Fallback: check for state abbreviation directly (e.g. "Colusa CA 95932")
if (!stateAbbr) {
var abbrVals = Object.values(_STATE_MAP);
for (var j = 0; j < abbrVals.length; j++) {
var abbr = abbrVals[j];
if (new RegExp('\\b' + abbr + '\\b').test(address)) {
stateAbbr = abbr;
console.log('[County] STEP 2 — state found by abbreviation:', stateAbbr);
break;
}
}
}
if (!stateAbbr) {
console.warn('[County] STEP 2 FAIL — no state found in:', address);
return;
}
// Split by comma and look for jurisdiction part
var suffixes = ['City and Borough', 'Census Area', 'Municipality', 'Borough', 'Parish', 'County', 'City'];
var parts = address.split(',');
console.log('[County] STEP 3 — address parts:', parts);
var countyKey = null;
for (var p = 0; p < parts.length; p++) {
var part = parts[p].trim();
for (var s = 0; s < suffixes.length; s++) {
if (part.indexOf(suffixes[s]) !== -1) {
countyKey = part + ', ' + stateAbbr;
console.log('[County] STEP 3 — county key from suffix match:', countyKey);
break;
}
}
if (countyKey) break;
}
// If no county suffix found, try matching comma-parts against COUNTY_DATA keys
// Uses comma-split (not space-split) to preserve multi-word names like "San Luis Obispo"
if (!countyKey) {
console.log('[County] STEP 3 — no suffix match, trying name match against COUNTY_DATA...');
var commaParts = address.split(',').map(function(p) { return p.trim(); });
console.log('[County] STEP 3 — comma parts:', commaParts);
var allKeys2 = Object.keys(COUNTY_DATA);
var caKeys = allKeys2.filter(function(k) { return k.slice(-3) === ', ' + stateAbbr; });
console.log('[County] STEP 3 — COUNTY_DATA keys for', stateAbbr + ':', caKeys);
for (var k2 = 0; k2 < allKeys2.length; k2++) {
if (allKeys2[k2].slice(-3) !== ', ' + stateAbbr) continue;
var keyName2 = allKeys2[k2].replace(', ' + stateAbbr, '').replace(' County','').trim().toLowerCase();
for (var p2 = 0; p2 < commaParts.length; p2++) {
// Check exact match OR if the part contains the county name
var part2lower = commaParts[p2].toLowerCase().replace(' county','').trim();
if (part2lower === keyName2 || part2lower.indexOf(keyName2) !== -1) {
countyKey = allKeys2[k2];
console.log('[County] STEP 3 — county key from name match:', countyKey);
break;
}
}
if (countyKey) break;
}
}
if (!countyKey) {
console.warn('[County] STEP 3 FAIL — could not build countyKey from address:', address);
return;
}
console.log('[County] STEP 4 — looking up countyKey:', countyKey, '| COUNTY_DATA has it?', !!COUNTY_DATA[countyKey]);
// Direct lookup
if (COUNTY_DATA[countyKey]) {
_countyInfo = Object.assign({}, COUNTY_DATA[countyKey]);
_countyInfo._key = countyKey;
console.log('[County] STEP 4 — SUCCESS direct lookup:', countyKey);
return;
}
// Fuzzy fallback
console.log('[County] STEP 4 — direct miss, trying fuzzy...');
var allKeys = Object.keys(COUNTY_DATA);
for (var k = 0; k < allKeys.length; k++) {
if (allKeys[k].slice(-3) === ', ' + stateAbbr) {
var keyName = allKeys[k].replace(', ' + stateAbbr, '');
var searchName = countyKey.replace(', ' + stateAbbr, '');
if (keyName.indexOf(searchName) !== -1 || searchName.indexOf(keyName) !== -1) {
_countyInfo = Object.assign({}, COUNTY_DATA[allKeys[k]]);
_countyInfo._key = allKeys[k];
console.log('[County] STEP 4 — SUCCESS fuzzy:', allKeys[k]);
return;
}
}
}
console.warn('[County] STEP 4 FAIL — not found. countyKey was:', countyKey, '| stateAbbr:', stateAbbr);
console.warn('[County] STEP 4 — first 5 COUNTY_DATA keys for this state:', Object.keys(COUNTY_DATA).filter(function(k){ return k.slice(-3) === ', '+stateAbbr; }).slice(0,5));
}
function applyCountyToReport() {
if (!_countyInfo) return;
// Cover sheet
var recRow = document.getElementById('cover-recorder-row');
var assRow = document.getElementById('cover-assessor-row');
var recText = document.getElementById('cover-recorder-text');
var assText = document.getElementById('cover-assessor-text');
if (recText) recText.textContent = _countyInfo.recorder.name + ' · ' + _countyInfo.recorder.address;
if (assText) assText.textContent = _countyInfo.assessor.name + ' · ' + _countyInfo.assessor.address;
if (recRow) recRow.style.display = 'flex';
if (assRow) assRow.style.display = 'flex';
// On-screen block
var block = document.getElementById('county-offices-block');
var scrRName = document.getElementById('screen-recorder-name');
var scrRAddr = document.getElementById('screen-recorder-addr');
var scrAName = document.getElementById('screen-assessor-name');
var scrAAddr = document.getElementById('screen-assessor-addr');
if (scrRName) scrRName.textContent = _countyInfo.recorder.name;
if (scrRAddr) scrRAddr.textContent = _countyInfo.recorder.address;
if (scrAName) scrAName.textContent = _countyInfo.assessor.name;
if (scrAAddr) scrAAddr.textContent = _countyInfo.assessor.address;
if (block) block.style.display = 'block';
console.log('[SkyGrid] County offices displayed:', _countyInfo._key);
}
</script>
</body>
</html>