{"id":1781,"date":"2026-07-11T17:24:57","date_gmt":"2026-07-12T00:24:57","guid":{"rendered":"https:\/\/socodsa.org\/?page_id=1781"},"modified":"2026-07-20T15:36:44","modified_gmt":"2026-07-20T22:36:44","slug":"flock","status":"publish","type":"page","link":"https:\/\/socodsa.org\/es\/flock\/","title":{"rendered":"Flock"},"content":{"rendered":"<div class=\"address-wrapper\">\n  <h3>Flock OUT of Sonoma County! Generate an email to send to your local representative!<\/h3>\n  <label for=\"address-input\" class=\"address-label\">Enter Your Address<\/label>\n  <input id=\"address-input\" tabindex=\"0\" type=\"text\" placeholder=\"e.g. 5400 Dowdell Ave, Rohnert Park\" autocomplete=\"street-address\"\/>\n  <div class = \"button-wrapper\">\n    <div id=\"lookup-btn\" tabindex=\"0\" class=\"lookup-btn show-text\">Find My District<\/div>\n    <div id=\"button-loader\" class=\"loader invisible\">\n      <div><\/div>\n      <div><\/div>\n      <div><\/div>\n      <div><\/div>\n    <\/div>\n  <\/div>\n  <div id=\"error-container\" class=\"error-container\">\n    <span id=\"error-msg\"><\/p>\n  <\/div>\n  <div class=\"loading-container\">\n    <span id=\"loading-msg\" class=\"loading-msg\"><\/p>\n  <\/div>\n<\/div>\n<div id=\"results\" class=\"results visible\">\n  <div class=\"result-row\">\n    <span class=\"result-label\">County District:<\/span>\n    <span id=\"county-district-value\" class=\"result-value\"><\/span>\n  <\/div>\n  <div class=\"result-row\">\n    <span id=\"city-district-name\" class=\"result-label\">District:<\/span>\n    <span id=\"city-district-value\" class=\"result-value\"><\/span>\n  <\/div>\n  <div class=\"result-row\">\n    <span class=\"result-label\">Representative(s):<\/span>\n    <span id=\"representative-value\" class=\"result-value\"><\/span>\n  <\/div>\n<\/div>\n<div id=\"action-container\" class=\"action-container\">\n  <div class = \"button-wrapper\">\n    <div id=\"action-btn\" tabindex=\"0\" class=\"action-btn\">\u2709\ufe0f Email them about Flock!<\/div>\n  <\/div>\n<\/div>\n\n<script>\nconst apiKey = \"AIzaSyAD_s6bRwKviEMyHYNLDsdryFuWQoSDAbU\";\n\nlet regionMap = null;\nlet regionMapPromise = getRegionMapping();\n\nconst cityDistrictElement    = document.getElementById(\"city-district-value\");\nconst cityDistrictNameElement = document.getElementById(\"city-district-name\");\nconst countyDistrictElement  = document.getElementById(\"county-district-value\");\nconst representativeElement = document.getElementById(\"representative-value\");\nlet city = null;\nlet representatives = []\nlet emailUrl = \"mailto:someone@example.com\";\n\nlet mutableElementMap = new Map([\n  [cityDistrictElement, \"\"],\n  [cityDistrictNameElement, \"City District:\"],\n  [countyDistrictElement, \"\"],\n  [representativeElement, \"\"]\n]);\n\nlet lastAddress = '';\nlet completed = false;\nlet initiated = false;\n\nconst results          = document.getElementById(\"results\");\nconst errorContainer   = document.getElementById(\"error-container\");\nconst actionContainer   = document.getElementById(\"action-container\");\nconst button = document.querySelector(\"#lookup-btn\");\nconst actionButton = document.querySelector(\"#action-btn\");\nconst loader = document.querySelector(\".loader\");\nconst loadingContainer = document.querySelector(\".loading-container\");\nconst loadingText      = document.querySelector(\"#loading-msg\");\nconst input = document.getElementById(\"address-input\");\nconst error = document.getElementById(\"error-msg\");\n\ninput.focus();\n\nbutton.addEventListener('click', initiateRetrieval);\nbutton.addEventListener('keydown', (e) => {\n    if (e.key === 'Enter') {\n        initiateRetrieval();\n    }\n});\ninput.addEventListener('keydown', (e) => {\n    if (e.key === 'Enter') {\n        initiateRetrieval();\n    }\n});\n\nactionButton.addEventListener('click', sendEmail);\nactionButton.addEventListener('keydown', (e) => {\n    if (e.key === 'Enter') {\n        sendEmail();\n    }\n});\n\nfunction sendEmail() {\n  window.open(emailUrl, \"_blank\");\n}\n\nasync function initiateRetrieval() {\n  if(initiated) {\n    return;\n  }\n  let address = input.value.trim();\n  if (!address) {\n    error.textContent = \"Please enter an address.\";\n    errorContainer.classList.add('error-visible');\n    return;\n  } else if (address == lastAddress) {\n    error.textContent = \"Information already retrieved for this address.\";\n    errorContainer.classList.add('error-visible');\n    return;\n  }\n  initiated = true;\n  if(completed) {\n    mutableElementMap.set(cityDistrictElement, \"\");\n    mutableElementMap.set(cityDistrictNameElement, \"City District:\");\n    mutableElementMap.set(countyDistrictElement, \"\");\n    mutableElementMap.set(representativeElement, \"\");\n    completed = false;\n    updateElements();\n    actionContainer.classList.remove(\"action-container-visible\");\n  }\n\n  errorContainer.classList.remove('error-visible');\n  address = normalizeAddress(address);\n  lastAddress = address;\n  \n  regionMap = await regionMapPromise;\n\n  const response = await fetch(`https:\/\/www.googleapis.com\/civicinfo\/v2\/divisionsByAddress?address=${encodeURIComponent(address)}&key=${apiKey}`);\n  if(response.ok) {\n    const data = await response.json();\n    getCivicData(data);\n    updateElements();\n    if(mutableElementMap.get(cityDistrictElement) == \"Retrieving...\" || mutableElementMap.get(countyDistrictElement) == \"Retrieving...\") {\n      if(city != null) {\n        initiateLoadingCues();\n      }\n      loader.classList.add(\"visible\");\n      loader.classList.remove(\"invisible\");\n      button.classList.add(\"hide-text\");\n      button.classList.remove(\"show-text\");\n      \n     let cityName = city != null && mutableElementMap.get(cityDistrictElement) != \"N\/A\" ? city[\"Name\"] : null;\n\n      payload = {\"address\": address, \"city\": cityName};\n      const response = await fetch(\"https:\/\/karlbot.kaiserarts.com\/get_district\", {\n        method: \"POST\",\n        headers: {'Content-Type': 'application\/json'},\n        body: JSON.stringify(payload) });\n\n      if(response.ok) { \n        const data = await response.json();\n        console.log(data);\n        getKarlData(data);\n      } else {\n        const data = await response.json();\n        if(data){\n          console.log(data);\n        }\n      }\n      loader.classList.add(\"invisible\");\n      loader.classList.remove(\"visible\");\n      button.classList.add(\"show-text\");\n      button.classList.remove(\"hide-text\");\n    }\n    console.log(\"here\");\n    completed = true;\n    loadingContainer.classList.remove(\"loading-visible\");\n    assignRepresentatives();\n    updateElements();\n    prepareActionContainer();\n    \n  } else {\n    if(response.status == 400) {\n      error.textContent = 'Unable to find address - please check for typos';\n    } else {\n      error.textContent = 'API call failed - try again later';\n    }\n    errorContainer.classList.add('error-visible');\n    \n  }\n  initiated = false;\n}\n\nfunction normalizeAddress(address) {\n  return address\n    .replace(\/\\s+\/g, \" \")         \n    .replace(\/,\/g, \", \")     \n    .replace(\/\\s{2,}\/g, \" \")  \n    .trim();\n}\n\nfunction updateElements() {\n  console.log(mutableElementMap);\n  for(const element of mutableElementMap.keys()) {\n    console.log(`before: \"${element.textContent}\" | new: \"{mutableElementMap.get(element)\"`);\n    if(element.textContent != mutableElementMap.get(element)) {\n      updateElement(element, mutableElementMap.get(element));\n    }\n  }\n}\n\nfunction updateElement(element, value) {\n  element.classList.add(\"invisible\")\n  setTimeout(() => {\n    element.innerHTML = value\n    element.classList.remove(\"invisible\")\n  }, 201);\n}\n\nfunction getCivicData(data) {\n  city = null;\n  representatives = []\n  mutableElementMap.set(cityDistrictElement  , \"Unincorporated\");\n  mutableElementMap.set(countyDistrictElement, \"Retrieving...\");\n  const divisions = data.divisions || {};\n  console.log(divisions);\n  for(let divisionType in divisions) {\n    division = divisions[divisionType]\n    if(divisionType.includes(\"county\") && divisionType.includes(\"council_district\")) {\n    \/\/County Detected\n      mutableElementMap.set(countyDistrictElement, division.name.toLowerCase().split(\"district \")[1]);\n    } else if (divisionType.includes(\"place\")) {\n      if(divisionType.includes(\"council_district\")) {\n        mutableElementMap.set(cityDistrictElement, division.name.toLowerCase().split(\"district \")[1]);\n      } else {\n          let cityName = division.name.split(\" city\")[0];\n\t\t  let cityRecords = regionMap[\"cities\"];\n                  console.log(regionMap);\n                  console.log(cityRecords);\n\t\t  let citySlug        = cityName.replaceAll(' ', '_').toLowerCase();\n\t\t  for(let record of cityRecords) {\n\t\t\tfor(let alias of record[\"Aliases\"]) {\n\t\t\t  if(alias.replaceAll(' ', '_').toLowerCase() == citySlug) {\n\t\t\t\tcity = record;\n\t\t\t\tbreak;\n\t\t\t  }\n\t\t\t}\n\t\t  }\n      }\n    }\n  }\n  if(city != null){\n\tmutableElementMap.set(cityDistrictNameElement, `${city[\"Name\"]} District:`);\n\tif(city[\"Type\"] == \"At large\") {\n\t\tmutableElementMap.set(cityDistrictElement, \"N\/A\");\n\t} else {\n          mutableElementMap.set(cityDistrictElement, \"Retrieving...\");\n        }\n  }\n}\nfunction getKarlData(data) {\n  if(data.district != null) {\n\t  mutableElementMap.set(cityDistrictElement  , data[\"district\"]);\n  } else {\n\t  mutableElementMap.set(countyDistrictElement, data[\"county_district\"]);\n  }\n  \n}\nfunction assignRepresentatives() {\n  let districtToFind = null;\n  let typeToFind = \"Councilor\";\n  let cityToFind = city != null ? city[\"Name\"] : null;\n  if(mutableElementMap.get(cityDistrictElement) == \"Unincorporated\") {\n\t  typeToFind = \"Supervisor\";\n\t  districtToFind = mutableElementMap.get(countyDistrictElement);\n  } else {\n\tif(mutableElementMap.get(cityDistrictElement) != \"N\/A\") {\n\t  districtToFind = mutableElementMap.get(cityDistrictElement);\n\t}\n  }\n  \n  let representativeRecords = regionMap[\"representatives\"];\n  representative_names = [];\n  representatives = [];\n  console.log(`District to find: ${districtToFind} | Type to find: ${typeToFind}`);\n  for(let record of representativeRecords) {\n    console.log(record);\n    if(record[\"Type\"] == typeToFind && record[\"District\"] == districtToFind && cityToFind == record[\"City\"]) {\n      representatives.push(record);\n\t  representative_names.push(record[\"Name\"]);\n    }\n  }\n  \n  mutableElementMap.set(representativeElement, representative_names.join(\"<br>\"));\n}\n\nfunction prepareActionContainer() {\n  emails = [];\n  firstNames = [];\n  for(let representative of representatives) {\n    emails.push(representative[\"Email\"] + \"TESTRUN\");\n    firstNames.push(representative[\"First Name\"]);\n  }\n\n  emailUrl = `mailto:${encodeURIComponent(emails.join(\",\"))}?subject=${encodeURIComponent(\"Please vote to terminate all Flock contracts\")}&body=${encodeURIComponent(firstNames.join(\", \") + \", do the right thing and protect our people from the dangers of mass surveillance! I am urging you to vote to terminate our Flock Contract! Test email. Don't send, it won't go anywhere meaningful.\")}`\n  actionContainer.classList.add(\"action-container-visible\");\n}\n\nasync function getRegionMapping() {\n  try {\n    const response = await fetch('https:\/\/karlbot.kaiserarts.com\/get_region_mapping');\n    if (!response.ok) {\n      throw new Error(`HTTP error! Status: ${response.status}`);\n    }\n    \n    const data     = await response.json();\n    console.log(data);\n    return data;\n  } catch (error) {\n    console.error('Fetch failed:', error);\n  }\n}\nfunction initiateLoadingCues() {\n  setTimeout(() => {\n    if(!completed) {\n      loadingText.textContent = \"Hang tight, this usually takes 5-10s...\";\n      loadingContainer.classList.add(\"loading-visible\");\n      setTimeout(() => {\n        if(!completed) {\n          loadingText.classList.add(\"loading-cue-invisible\")\n          setTimeout(() => {\n            loadingText.textContent = \"Matching address to councilor...\"\n            loadingText.classList.remove(\"loading-cue-invisible\")\n          }, 301); \n          setTimeout(() => {\n            if(!completed) {\n              loadingText.classList.add(\"loading-cue-invisible\")\n              setTimeout(() => {\n                loadingText.textContent = \"Almost there...\"\n                loadingText.classList.remove(\"loading-cue-invisible\")\n              }, 301); \n              setTimeout(() => {\n                if(!completed) {\n                  loadingText.classList.add(\"loading-cue-invisible\")\n                  setTimeout(() => {\n                    loadingText.textContent = \"Done! Generating email...\"\n                    loadingText.classList.remove(\"loading-cue-invisible\")\n                  }, 301); \n                }\n              }, 3000);     \n            }\n          }, 3000);     \n        }\n      }, 2500);     \n    }\n  }, 2000);\n}\n<\/script>\n<style>\n.lookup-btn, .loader {\n    grid-area: 1 \/ 1;\n    padding: 0;\n}\n.lookup-btn.hide-text, .lookup-btn.hide-text:hover {\n    color: transparent;\n    transition: color linear .2s, background-color ease-in-out .2s;\n}\n.lookup-btn.show-text, .lookup-btn.show-text:hover {\n    color: white;\n    transition: color .2s .2s linear, background-color ease-in-out .2s;\n}\n.button-wrapper {\n    display: grid;\n    float: left;\n    overflow: hidden;\n    max-width: 420px;\n    height: 44px;\n    margin-bottom: 12px;\n}\n.address-wrapper {\n  max-width: 420px;\n  padding: 0px, 20px, 0px, 20px;\n  margin-left: auto;\n  margin-right: auto;\n  margin-bottom: 0px;\n  display: flex;\n  justify-content: center;\n  flex-direction: column;\n  font-family: system-ui, sans-serif;\n}\n.action-container {\n  max-width: 420px;\n  padding: 0px, 20px, 0px, 20px;\n  margin-left: auto;\n  margin-right: auto;\n  margin-bottom: 0px;\n  display: flex;\n  justify-content: center;\n  flex-direction: column;\n  font-family: system-ui, sans-serif;\n  max-height: 0px;\n  transition: max-height 0.35s ease;\n}\n.action-container-visible {\n  max-height: 1000px;\n}\n.address-label {\n  font-size: 0.9rem;\n  font-weight: 600;\n  color: #333;\n}\n#address-input {\n  padding: 14px 16px;\n  font-size: 1rem;\n  border: 1px solid #ccc;\n  border-radius: 10px;\n  transition: border-color 0.2s, box-shadow 0.2s;\n  margin-bottom: 12px;\n}\n#address-input:focus {\n  border-color: #4a7aff;\n  box-shadow: 0 0 0 3px rgba(74, 122, 255, 0.25);\n  outline: none;\n}\n.lookup-btn {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  height: 44px;\n  padding: 14px;\n  font-size: 1rem;\n  background: #EC1F27;\n  color: white;\n  border: none;\n  border-radius: 10px;\n  cursor: pointer;\n  transition: background 0.2s;\n}\n.action-btn {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  height: 44px;\n  padding: 14px;\n  font-size: 1rem;\n  background: #001CFF;\n  color: white;\n  border: none;\n  border-radius: 10px;\n  cursor: pointer;\n  transition: background 0.2s;\n}\n.lookup-btn:hover, .lookup-btn:focus-visible {\n  background: #B9181F;\n}\n.action-btn:hover, .action-btn:focus-visible {\n  background: #0016C5;\n}\n.error-container {\n  display: flex;\n  transition: max-height 0.35s ease, margin-bottom 0.35s ease;\n  max-height: 0px;\n  overflow: hidden;\n  margin-bottom:0px;\n}\n.error-container.error-visible {\n  transition: max-height 0.35s ease, margin-bottom 0.35s ease;\n  max-height: 20px;\n  overflow: hidden;\n  display: flex;\n  margin-bottom: 12px;\n}\n#error-msg {\n  color: #d33;\n  font-size: 0.85rem;\n}\n.loading-container {\n  display: flex;\n  transition: max-height 0.5s ease, margin-bottom 0.5s ease;\n  max-height: 0px;\n  overflow: hidden;\n  margin-bottom:0px;\n}\n.loading-container.loading-visible {\n  transition: max-height 0.5s ease, margin-bottom 0.5s ease;\n  max-height: 30px;\n  overflow: hidden;\n  display: flex;\n  margin-bottom: 12px;\n}\n.loading-msg {\n  color: #ec1f8d;\n  font-size: 1.10rem;\n  font-weight: 500;\n  opacity: 1;\n  transition: opacity .3s linear;\n}\n.results {\n  max-width: 420px;\n  padding: 20px;\n  margin-left: auto;\n  margin-right: auto;\n  margin-bottom: 12px;\n  border-radius: 10px;\n  background: #f7f9fc;\n  border: 1px solid #e3e7ef;\n  opacity: 0;\n  transition: opacity 0.35s ease;\n}\n.results.visible {\n  opacity: 1;\n}\n.result-row {\n  display: flex;\n  justify-content: space-between;\n  padding: 8px 0;\n  font-size: 1rem;\n}\n.result-label {\n  font-weight: 600;\n  color: #333;\n  opacity: 1;\n  transition: opacity .2s linear .2s;\n}\n\n.result-value {\n  color: #EC1F27;\n  font-weight: 500;\n  opacity: 1;\n  transition: opacity .2s linear .2s;\n  text-align: right;\n}\n.hidden {\n  display: none;\n}\n\n.loader {\n    display: inline-block;\n    position: relative;\n    width: 80px;\n    height: 80px;\n    pointer-events: none;\n    top: 28%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n}\n.loader div {\n    position: absolute;\n    top: 33px;\n    width: 13px;\n    height: 13px;\n    border-radius: 50%;\n    background: #fff;\n    animation-timing-function: cubic-bezier(0, 1, 1, 0);\n}\n.loader div:nth-child(1) {\n    left: 8px;\n    animation: lds-ellipsis1 0.6s infinite;\n}\n.loader div:nth-child(2) {\n    left: 8px;\n    animation: lds-ellipsis2 0.6s infinite;\n}\n.loader div:nth-child(3) {\n    left: 32px;\n    animation: lds-ellipsis2 0.6s infinite;\n}\n.loader div:nth-child(4) {\n    left: 56px;\n    animation: lds-ellipsis3 0.6s infinite;\n}\n@keyframes lds-ellipsis1 {\n  0% {\n    transform: scale(0);\n  }\n  100% {\n    transform: scale(1);\n  }\n}\n@keyframes lds-ellipsis3 {\n  0% {\n    transform: scale(1);\n  }\n  100% {\n    transform: scale(0);\n  }\n}\n@keyframes lds-ellipsis2 {\n  0% {\n    transform: translate(0, 0);\n  }\n  100% {\n    transform: translate(24px, 0);\n  }\n}\n.visible {\n    opacity: 1;\n    transition: opacity .2s linear .2s;\n}\n.invisible {\n    user-select: none;\n    opacity: 0;\n    transition: opacity .2s linear;\n    -webkit-user-select: none;\n}\n.loading-cue-invisible {\n    user-select: none;\n    opacity: 0;\n    transition: opacity .3s linear;\n    -webkit-user-select: none;\n}\n.loader.visible {\n    opacity: 1;\n    transition: opacity .2s linear .2s;\n}\n.loader.invisible {\n    user-select: none;\n    opacity: 0;\n    transition: opacity .2s linear;\n    -webkit-user-select: none;\n}\n<\/style>\n","protected":false},"excerpt":{"rendered":"<p>Flock OUT of Sonoma County! Generate an email to send to your local representative! Enter Your Address Find My District County District: District: Representative(s): \u2709\ufe0f Email them about Flock!<\/p>\n","protected":false},"author":9,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1781","page","type-page","status-publish","hentry"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Flock<\/title>\n<meta name=\"description\" content=\"Learn more about Flock cameras\/ALPRs, what&#039;s wrong with them, and what you can do about it!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/socodsa.org\/es\/flock\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flock\" \/>\n<meta property=\"og:description\" content=\"Learn more about Flock cameras\/ALPRs, what&#039;s wrong with them, and what you can do about it!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/socodsa.org\/es\/flock\/\" \/>\n<meta property=\"og:site_name\" content=\"Sonoma County Democratic Socialists of America\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-20T22:36:44+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minuto\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/socodsa.org\\\/es\\\/flock\\\/\",\"url\":\"https:\\\/\\\/socodsa.org\\\/es\\\/flock\\\/\",\"name\":\"Flock - Sonoma County Democratic Socialists of America\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/socodsa.org\\\/#website\"},\"datePublished\":\"2026-07-12T00:24:57+00:00\",\"dateModified\":\"2026-07-20T22:36:44+00:00\",\"description\":\"Learn more about Flock cameras\\\/ALPRs, what's wrong with them, and what you can do about it!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/socodsa.org\\\/es\\\/flock\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/socodsa.org\\\/es\\\/flock\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/socodsa.org\\\/es\\\/flock\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"P\u00e1gina Principal\",\"item\":\"https:\\\/\\\/socodsa.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flock\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/socodsa.org\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/socodsa.org\\\/es\\\/\",\"name\":\"Sonoma County Democratic Socialists of America\",\"description\":\"Socialism, it&#039;s how we were meant to live together!\",\"publisher\":{\"@id\":\"https:\\\/\\\/socodsa.org\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/socodsa.org\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/socodsa.org\\\/es\\\/#organization\",\"name\":\"Sonoma County Democratic Socialists of America\",\"url\":\"https:\\\/\\\/socodsa.org\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/socodsa.org\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/socodsa.org\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-socodsa-logo-full.webp\",\"contentUrl\":\"https:\\\/\\\/socodsa.org\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-socodsa-logo-full.webp\",\"width\":512,\"height\":512,\"caption\":\"Sonoma County Democratic Socialists of America\"},\"image\":{\"@id\":\"https:\\\/\\\/socodsa.org\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Flock","description":"Learn more about Flock cameras\/ALPRs, what's wrong with them, and what you can do about it!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/socodsa.org\/es\/flock\/","og_locale":"es_MX","og_type":"article","og_title":"Flock","og_description":"Learn more about Flock cameras\/ALPRs, what's wrong with them, and what you can do about it!","og_url":"https:\/\/socodsa.org\/es\/flock\/","og_site_name":"Sonoma County Democratic Socialists of America","article_modified_time":"2026-07-20T22:36:44+00:00","twitter_card":"summary_large_image","twitter_misc":{"Tiempo de lectura":"1 minuto"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/socodsa.org\/es\/flock\/","url":"https:\/\/socodsa.org\/es\/flock\/","name":"Flock - Sonoma County Democratic Socialists of America","isPartOf":{"@id":"https:\/\/socodsa.org\/#website"},"datePublished":"2026-07-12T00:24:57+00:00","dateModified":"2026-07-20T22:36:44+00:00","description":"Learn more about Flock cameras\/ALPRs, what's wrong with them, and what you can do about it!","breadcrumb":{"@id":"https:\/\/socodsa.org\/es\/flock\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/socodsa.org\/es\/flock\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/socodsa.org\/es\/flock\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"P\u00e1gina Principal","item":"https:\/\/socodsa.org\/"},{"@type":"ListItem","position":2,"name":"Flock"}]},{"@type":"WebSite","@id":"https:\/\/socodsa.org\/es\/#website","url":"https:\/\/socodsa.org\/es\/","name":"Sonoma County Democratic Socialists of America","description":"Socialism, it&#039;s how we were meant to live together!","publisher":{"@id":"https:\/\/socodsa.org\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/socodsa.org\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/socodsa.org\/es\/#organization","name":"Sonoma County Democratic Socialists of America","url":"https:\/\/socodsa.org\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/socodsa.org\/es\/#\/schema\/logo\/image\/","url":"https:\/\/socodsa.org\/wp-content\/uploads\/2025\/03\/cropped-socodsa-logo-full.webp","contentUrl":"https:\/\/socodsa.org\/wp-content\/uploads\/2025\/03\/cropped-socodsa-logo-full.webp","width":512,"height":512,"caption":"Sonoma County Democratic Socialists of America"},"image":{"@id":"https:\/\/socodsa.org\/es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/socodsa.org\/es\/wp-json\/wp\/v2\/pages\/1781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/socodsa.org\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/socodsa.org\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/socodsa.org\/es\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/socodsa.org\/es\/wp-json\/wp\/v2\/comments?post=1781"}],"version-history":[{"count":157,"href":"https:\/\/socodsa.org\/es\/wp-json\/wp\/v2\/pages\/1781\/revisions"}],"predecessor-version":[{"id":2013,"href":"https:\/\/socodsa.org\/es\/wp-json\/wp\/v2\/pages\/1781\/revisions\/2013"}],"wp:attachment":[{"href":"https:\/\/socodsa.org\/es\/wp-json\/wp\/v2\/media?parent=1781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}