{"version":3,"sources":["webpack:///./app/scripts/components/EmptyTable.js","webpack:///./app/scripts/components/Contest.tsx","webpack:///./app/scripts/components/HeadshotCandidateRow.tsx","webpack:///./app/scripts/utils/format-percent.ts","webpack:///./app/scripts/components/PureCanvas.tsx","webpack:///./app/scripts/components/CanvasLayer.tsx","webpack:///./app/scripts/components/Places.tsx","webpack:///./app/scripts/components/SvgLayer.tsx","webpack:///./app/scripts/colors.ts","webpack:///./app/scripts/components/MapLegend.tsx","webpack:///./app/scripts/components/Tooltip.tsx","webpack:///./app/scripts/components/TooltipTable.tsx","webpack:///./app/scripts/utils/get-point.ts","webpack:///./app/scripts/vendor/flatqueue.js","webpack:///./app/scripts/vendor/flatbush.js","webpack:///./app/scripts/utils/prepare-topojson.ts","webpack:///./app/scripts/components/LayeredMap.tsx","webpack:///./app/scripts/utils/clamp.js","webpack:///./app/scripts/components/TinyMap.tsx","webpack:///./app/scripts/components/MiniBarChart.js","webpack:///./app/scripts/utils/format-numbers.js","webpack:///./app/scripts/components/AnalysisTableRow.tsx","webpack:///./app/scripts/components/AnalysisTable.tsx","webpack:///./app/scripts/utils/platform.ts","webpack:///./app/scripts/components/NewContestShowcase.tsx","webpack:///./config/modern-polyfills.js","webpack:///./app/scripts/election-candidate-colors.ts","webpack:///./app/scripts/components/Portal.js","webpack:///./app/scripts/kickstart.js","webpack:///../../src/util.js","webpack:///../../src/index.js","webpack:///./app/scripts/utils/debounce.js","webpack:///./app/scripts/utils/noop.js","webpack:///./app/scripts/components/Typeahead.js","webpack:///./app/scripts/components/YourRaces.js","webpack:///./app/scripts/utils/load-asset-url.js","webpack:///./app/scripts/utils/legislative-districts.js","webpack:///./app/scripts/components/Ad.js","webpack:///./app/scripts/ResultsApp.tsx","webpack:///./app/scripts/packs/main.js","webpack:///./app/scripts/endpoints.ts","webpack:///./app/scripts/utils/load-json-script.js","webpack:///./app/scripts/components/CandidateRow.tsx","webpack:///./app/scripts/utils/select-all.js","webpack:///./app/scripts/constants.ts","webpack:///./app/scripts/utils/select.js","webpack:///./app/scripts/packs/sticky-nav-bar.js","webpack:///./app/scripts/election-utils.ts","webpack:///./app/scripts/utils/get-json.js","webpack:///./app/scripts/components/OtherCandidate.js","webpack:///./app/scripts/components/SeatPartyDivider.tsx","webpack:///./app/scripts/utils/sum-values.js","webpack:///./app/scripts/utils/shallow-equal.ts","webpack:///./app/scripts/components/PureComponent.tsx","webpack:///./node_modules/@babel/runtime/helpers/esm/extends.js","webpack:///./app/scripts/utils/find.ts","webpack:///./app/scripts/components/PartyPill.tsx"],"names":["EmptyTable","_ref","party","h","class","CandidateRow","Header","PreactHTMLConverter","Contest","Component","render","onePrimaryParty","contest","columnCount","contestTitle","isShowcaseRace","showContestTitleInShowcase","renderParty","hideEmptyParty","embedType","this","props","onePrimary","length","directory_slug","shouldCenter","office","rowClass","cx","seat__races","seat__highlight_races","get_directory_slug","href","concat","title","xlinkHref","map","index","defaultProps","includeCountyRundown","HeadshotCandidateRow","PureComponent","getColor","candidateColors","ballotName","candidateMatch","find","colorObj","name","color","candidateId","contestIsCalled","contestResult","isIncumbent","isWinner","isViewable","numDelegates","totalVotesInContest","votes","divStyle","checkStyle","checkClass","PartyPill","style","isCanvass","intcomma","formatPercent","cand","candidate","_defineProperty","isCalled","colSpan","Header_Prez","n","d","toFixed","PureCanvas","shouldComponentUpdate","ref","canvas","contextRef","getContext","CanvasLayer","constructor","super","setContextRef","bind","ctx","draw","geoPath","pixelRatio","scaleCanvas","width","height","window","devicePixelRatio","scale","updateCanvas","componentDidMount","d3GeoPath","projection","componentDidUpdate","position","top","left","zIndex","Places","places","place","idx","key","transform","centroid","dx","properties","dy","text-anchor","anchor","SvgLayer","handleMouseMove","handleMouseLeave","event","onMouseMove","onMouseLeave","setState","strokeLinecap","strokeLinejoin","pointerEvents","viewBox","preserveAspectRatio","state","TIE","MapLegend","candidates","includesNoResult","includesTie","backgroundColor","Tooltip","cls","isHidden","tooltipRef","klass","Portal","children","TooltipTable","_county$eevp","candidatesMap","county","candidatesRender","source","sortedResults","entries","results","sort","a","b","value","pct_votes","total_votes","estimated_votes_mid","eevp","contestMetricsClass","contest__metrics__canvass","pct_votes_turnout","hasResults","firstThreeResults","slice","county_pollinglocationsreporting","total_county_pollinglocations","countyHeader","result","get","colorMatch","candColor","undefined","id","candidateColor","is_incumbent","is_winner","isMapRow","values","getPoint","node","x","y","rect","getBoundingClientRect","clientLeft","clientTop","FlatQueue","ids","clear","push","pos","parent","parentValue","pop","halfLength","right","bestIndex","bestValue","rightValue","peek","peekValue","ARRAY_TYPES","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","Flatbush","data","ArrayBuffer","Error","magic","versionAndType","nodeSize","numItems","arguments","ArrayType","isNaN","Math","min","max","numNodes","_levelBounds","ceil","IndexArrayType","arrayTypeIndex","indexOf","nodesByteSize","BYTES_PER_ELEMENT","_boxes","_indices","_pos","minX","minY","maxX","maxY","Infinity","set","_queue","add","finish","hilbertValues","i","floor","hilbert","boxes","indices","pivot","j","swap","end","nodeMinX","nodeMinY","nodeMaxX","nodeMaxY","nodeIndex","search","filterFn","level","queue","neighbors","maxResults","maxDistance","q","maxDistSquared","upperBound","axisDist","dist","k","arr","m","temp","c","e","A","B","C","D","i0","i1","prepareTopoJSON","topology","object","objects","Object","keys","roadsObject","placesObject","urbanAreasObject","collection","feature","roads","urban_areas","bbox","getBBox","features","forEach","bounds","heightRatio","relocateTooltip","tooltip","innerWidth","innerHeight","LayeredMap","param","typeMap","activeBtn","activeGeometry","candidatesOnMap","geos","onDocumentTouch","getTooltipRef","canvasRenderer","xScale","scaleLinear","yScale","el","setUpCountyMap","counties","countyMap","fips","setUpCandidateMap","candidateMap","clientX","clientY","target","point","coords","invert","found","booleanPointInPolygon","activeCounty","base","contains","clearRect","fillStyle","leader","second","colors","leadingId","filter","beginPath","fill","closePath","lineCap","lineJoin","strokeStyle","lineWidth","stroke","places_mappable","arc","PI","componentWillReceiveProps","nextProps","getContainerDimensions","offsetWidth","rawWidth","clientWidth","domain","range","fitSize","bboxPolygon","document","addEventListener","precinctsReporting","totalVotes","boxSizing","stroke-width","totalPrecincts","mapType","invisible","Boolean","_ref2","has","countiesData","appData","TinyMap","createMap","redrawMap","findLeading","category","candidacies","candidateObj","d3","office_slug","toLowerCase","remove","container","reflectY","pathGenerator","append","attr","selectAll","enter","foundCounty","MiniBarChart","bodyWidth","breakPoint","createGraphic","redrawGraphic","getContainerWidth","className","categoryNumbers","officeSlug","maxNum","partySlug","chartSelector","margin","svg","diagonalStripePattern","g","newcand","obj","_objectSpread","last_name","split","join","category_votes","domainMax","entry","padding","bandwidth","call","tickValues","tickFormat","toUpperCase","tickSize","foundCandidate","text","intword","replace","customBarNumFormat","isMobile","componentWillUnmount","AnalysisTableRow","categoryClass","category_text","geocategories","type","category_explain","geocategories_explain","AnalysisTable","countiesData_safe","colorLookup","raceCandidateColors","match","criteria","newObj","summedEntries","arrayByCategories","reduce","acc","currentValue","item","totals","total","arrayToGetMost","parseFloat","sum","votes_still_to_count","estimated_votes","largest_number","createArray","findCounties","findCounties2","APTotalVotesToCount","arrayCounties","val","r","parseInt","objectCategories","arrayToGetLargest","context","categories_headline","categories","userAgent","navigator","isIE","test","ContestShowcase","geoIdentity","contestContainer","querySelector","mapContainer","countiesContainer","sourceMap","ShowcaseRaceWinner","asOf","notes","annotations","showDelegates","headerUsed","_contestPortal","determineContestTitle","SeatPartyDivider","partyName","partyBallot","tableHeader","renderCandidate","viewAllCandidates","is_called","contest_result","visibleCandidatesCount","_mapPortal","precincts_reporting","_countiesPortal","require","renderPortal","defaultNode","body","removeChild","portal","createElement","appendChild","ttData","relatedContentContainer","getElementById","related_category","then","default","RelatedContent","AdLoader","targetingKey","targetingValue","init","getScroll","w","ret","method","documentElement","getScrollLeft","getScrollTop","getOffset","elem","box","doc","ownerDocument","docElem","getClientPosition","defaultView","parentWindow","getComputedStyleX","_RE_NUM_NO_PX","RegExp","RE_POS","LEFT","each","fn","isBorderBoxFn","getComputedStyle","computedStyle_","computedStyle","getPropertyValue","rsLeft","pixelLeft","BOX_MODELS","options","callback","old","hasOwnProperty","getPBMWidth","which","prop","cssProp","isWindow","domUtils","getWH","extra","viewportWidth","viewportHeight","nodeType","docWidth","docHeight","borderBoxValue","offsetHeight","isBorderBox","cssBoxValue","Number","borderBoxValueOrIsBorderBox","refWin","win","documentElementProp","compatMode","cssShow","visibility","display","getWHIgnoreDisplay","args","apply","css","v","_typeof","first","charAt","includeMargin","util","_objectSpread2","getWindow","offset","current","setOffset","clone","overflow","_i","scrollLeft","scrollTo","scrollTop","config","allowHorizontalScroll","onlyScrollIfNeeded","alignWithTop","alignWithLeft","offsetTop","offsetLeft","offsetBottom","offsetRight","containerOffset","ch","cw","containerScroll","diffTop","diffBottom","winScroll","ww","wh","isWin","elemOffset","eh","outerHeight","ew","outerWidth","clientHeight","debounce","func","wait","immediate","timeout","timestamp","later","last","Date","now","setTimeout","callNow","Typeahead","highlightedIndex","isOpen","handleOnBlur","handleOnClear","handleOnFocus","handleOnInput","debouncedHandleOnInput","debounceDuration","handleKeyDown","setInputRef","setMenuRef","setItemRef","listRefs","_","prevState","count","getFilteredItems","maybeScrollItemIntoView","element","inputRef","menuRef","itemNode","menuNode","scrollIntoView","items","shouldItemRender","sortItems","highlightItemOnMouseEnter","selectItemOnClick","getItemValue","onSelect","blur","renderList","onMouseDown","preventDefault","cloneElement","renderItem","onClick","onMouseEnter","renderAttribution","onClear","onBlur","inputProps","onFocus","onChange","keyEvents","renderInput","role","String","autocomplete","onInput","onKeyDown","aria-label","aria-hidden","noop","ArrowDown","itemsCount","newIndex","ArrowUp","Enter","keyCode","select","setSelectionRange","Escape","elementId","googleIMG","getAttribute","JSON","parse","textContent","asset_url","PlacesLib","east","west","south","north","YourRaces","contests","coordinates","lookupError","lookupPending","lookedFoundStored","redirectFish","placeholder","handleGeocode","debouncedHandleGeocode","sessionToken","input","async","trim","request","locationRestriction","includedPrimaryTypes","region","suggestions","AutocompleteSuggestion","fetchAutocompleteSuggestions","s","placePrediction","placeId","description","toString","place_id","_prediction","getPredictions","toPlace","Place","fetchFields","fields","latLng","location","latitude","lat","longitude","lng","getJSON","includeGeography","LOOKUP_URL","lookup","catch","google","maps","importLibrary","addressFeedback","matches","sboe","noteMatches","annoMatches","excludedUsHouseGopSlugs","office_division","us_house","district","includes","tx_senate","tx_house","findIsCalled","race","findContestResult","for","isHighlighted","src","alt","_extends","_resultsPortal","determineContestTitleYourRaces","_ref3","candidatesNum","_ref4","_ref5","_ref6","Ad","classes","App","timer","fetchData","console","info","lastUpdatedFormat","showLastUpdated","innerHTML","RESULTS_IN_USE","startTimer","LENGTH_OF_CHECK_INTERVAL","clearTimer","clearTimeout","unique","array","propertyName","findIndex","texasHouseGroups","usHouseGroups","unique_seats","number","texasHouse","usHouseFilteredData","usHouse","chunk","_yourPortal","NewContestShowcase","_supremePortal","_usPortal","contestGroup","_sboePortal","_ref8","_crimPortal","_ref0","_senatePortal","_ref10","_housePortal","_ref12","loadJsonScript","uncontested","IsAsterisk","Node","Window","Array","prototype","querySelectorAll","appNav","appNavHeight","round","appNavJumps","anchorJumps","pageYOffset","journalize","apdate","formatted_time","aptime","apmonth","getDate","size","NaN","TT_directory_slugs","slug","CandidateColorsRace1","CandidateColorsRace2","PRESIDENT_ORDER","sort_candidates_presidential","alert_conditionals","vote_pct","cand_num","label_conditionals","alert_winners","winner_conditionals","text_conditionals","text_conditional_winner_zero","determineDistrictTitle","division_type","capfirst","jsonResponse","res","ok","status","statusText","json","fetch","OtherCandidate","candidateCount","onViewableToggle","_partyBallot$eevp","firstShowcaseRace","isHomepage","converter","shouldDisplayResult","pct_votes_turnout_zero_winner","pct_votes_turnout_w_uncontested","pct_votes_explain","winner","colorWinner","ManualoverrideSource","klaxon","homepage__metrics","precinctsClass","IsAnnotations","IsNoted","pollinglocationsreporting","total_pollinglocations","pollinglocations_reporting_percent","convert","hOP","is","shallowEqual","objA","objB","keysA","keysB","assign","t","predicate","TypeError","excludeInitial","partyPrefix","partyInitial","memoize"],"mappings":"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","file":"main.d9e9c3ebda.mjs","sourcesContent":["import { h } from 'preact';\nimport CandidateRow from './CandidateRow';\n\nconst EmptyTable = ({ party }) => {\n  return (\n    <div class=\"seat__race\">\n      <div class=\"race\">\n        <h4 class=\"race__title\">\n          <span>{party}</span>\n        </h4>\n        <table class=\"race__candidates\">{CandidateRow.Header}</table>\n        <div class=\"no_primary_candidates\">No primary candidates running</div>\n      </div>\n    </div>\n  );\n};\n\nexport default EmptyTable;\n","import cx from 'classnames';\nimport { Component, h } from 'preact';\nimport { PreactHTMLConverter } from 'preact-html-converter';\n\n// components\nimport EmptyTable from './EmptyTable';\n\n// internal\nimport { get_directory_slug } from '../election-utils';\n\nconst converter = PreactHTMLConverter();\n\ntype Props = {\n  contest: { [key: string]: any };\n  columnCount: number;\n  contestTitle: string;\n  includeCountyRundown?: boolean;\n  isShowcaseRace?: boolean;\n  renderParty: any;\n  renderCandidate: any;\n  embedType: string;\n  broadcastHeaderImage: string;\n  activeContestId: string;\n  showContestTitleInShowcase?: boolean;\n  hideEmptyParty?: boolean;\n};\n\nclass Contest extends Component<Props> {\n  render() {\n    const {\n      contest,\n      columnCount,\n      contestTitle,\n      isShowcaseRace,\n      showContestTitleInShowcase,\n      renderParty,\n      hideEmptyParty,\n      embedType,\n    } = this.props;\n\n    const onePrimary = contest.length == 1;\n\n    let onePrimaryParty;\n\n    if (onePrimary) {\n      onePrimaryParty = contest[0].party;\n    }\n\n    // Center if only one contest and not Senate or AG (never center in embed)\n    const shouldCenter =\n      embedType !== 'internal' &&\n      onePrimary &&\n      contest[0] &&\n      contest[0].office !== 'U.S. Senate' &&\n      contest[0].office !== 'Attorney General';\n\n    const rowClass = cx({\n      seat__races: !isShowcaseRace,\n      seat__highlight_races: isShowcaseRace,\n      'seat__races--centered': shouldCenter && !isShowcaseRace,\n    });\n\n    let directory_slug;\n\n    if (contest[0]) {\n      directory_slug = get_directory_slug(contest[0].office);\n    }\n\n    return (\n      <div class=\"seat\">\n        {!isShowcaseRace && (\n          <h3 class=\"seat__title\">\n            <span>{contestTitle}</span>\n            {directory_slug[0] != null && (\n              <a\n                class=\"t-links-unset\"\n                href={`https://directory.texastribune.org/districts/${directory_slug[0]['directory-slug']}/${contest[0]['office_division']}/`}\n              >\n                <span\n                  class=\"icon-div\"\n                  title=\"Click to learn more about this district\"\n                >\n                  <svg class=\"icon icon-info\">\n                    <use xlinkHref=\"#icon-info\"></use>\n                  </svg>\n                </span>\n              </a>\n            )}\n          </h3>\n        )}\n        <div class={rowClass}>\n          {onePrimary &&\n            onePrimaryParty == 'Republican' &&\n            !isShowcaseRace &&\n            !hideEmptyParty && <EmptyTable party={'Democrat'} />}\n\n          {!isShowcaseRace &&\n            contest.map((party: any, index) => renderParty(party, index))}\n\n          {isShowcaseRace && (\n            <div>\n              {renderParty(contest)}\n            </div>\n          )}\n          {onePrimary &&\n            onePrimaryParty == 'Democrat' &&\n            !isShowcaseRace &&\n            !hideEmptyParty && <EmptyTable party={'Republican'} />}\n        </div>\n      </div>\n    );\n  }\n}\n\nContest.defaultProps = {\n  isShowcaseRace: false,\n  includeCountyRundown: false,\n  hideEmptyParty: true,\n};\n\nexport default Contest;\n","import cx from 'classnames';\nimport { intcomma } from 'journalize';\nimport { h, VNode } from 'preact';\n\nimport PureComponent from './PureComponent';\n\nimport formatPercent from '../utils/format-percent';\nimport { isCanvass } from '../endpoints';\nimport PartyPill from './PartyPill';\n\ninterface Props {\n  ballotName: string;\n  candidateId: string;\n  contestIsCalled: boolean;\n  contestResult: string;\n  isIncumbent: boolean;\n  isWinner: boolean;\n  numDelegates: any | null;\n  candidateColors: { [key: string]: any };\n  party: string;\n  totalVotesInContest: number;\n  votes: number;\n}\n\nclass HeadshotCandidateRow extends PureComponent<Props> {\n  static columnCount: number;\n  static Header: VNode;\n  static Header_Prez: VNode;\n\n  getColor(candidateColors, ballotName, party) {\n    if (candidateColors.length === 0) {\n      return party === 'Republican' ? '#EF564A' : '#1755c5';\n    }\n\n    const candidateMatch = candidateColors.find(\n      colorObj => colorObj.name === ballotName\n    );\n    if (!candidateMatch) return party === 'Republican' ? '#EF564A' : '#1755c5';\n    return candidateMatch.color;\n  }\n\n  render() {\n    const {\n      ballotName,\n      candidateId,\n      contestIsCalled,\n      contestResult,\n      isIncumbent,\n      isWinner,\n      party,\n      isViewable,\n      office,\n      numDelegates,\n      totalVotesInContest,\n      candidateColors,\n      votes,\n    } = this.props;\n\n    const color = this.getColor(candidateColors, ballotName, party);\n\n    const divStyle = {\n      'background-color': color,\n    };\n\n    const checkStyle = {\n      color: color,\n    };\n\n    const IsAsterisk = false;\n\n    let rowClass = cx(\n      'candidate',\n      'contest__candidate-row',\n      'contest__candidate-row--headshot',\n      {\n        'contest__candidate-row--winner dem--border':\n          contestIsCalled && isWinner && party == 'Democrat',\n        'contest__candidate-row--winner rep--border':\n          contestIsCalled && isWinner && party == 'Republican',\n      }\n    );\n\n    let checkClass = cx('check', {\n      'dem-winner': party == 'Democrat',\n      'rep-winner': party == 'Republican',\n      'runoff-winner': contestResult == 'runoff',\n    });\n\n    if (!isViewable) {\n      rowClass += ' race__candidate-row--hidden';\n    }\n\n    const checkmark = '\\u2713';\n\n    return (\n      <tr class={rowClass}>\n        <td class=\"candidate__cell candidate__party\">\n          {party == 'Republican' && (\n            <PartyPill party={party} style={divStyle} />\n          )}\n          {party == 'Democrat' && <PartyPill party={party} style={divStyle} />}\n        </td>\n        <th class=\"candidate__cell candidate__name\">\n          {contestIsCalled && isWinner && contestResult != 'runoff' && (\n            <span class={checkClass} style={checkStyle}>\n              {checkmark}\n            </span>\n          )}\n          {contestIsCalled && isWinner && contestResult == 'runoff' && (\n            <span class={checkClass} style={checkStyle}>\n              {checkmark}\n            </span>\n          )}\n          {contestIsCalled &&\n          isWinner &&\n          isCanvass == true &&\n          contestResult != 'runoff' ? (\n            <span class={checkClass}>{ballotName}</span>\n          ) : (\n            ballotName\n          )}\n          {IsAsterisk && <span class=\"asterisk\">*</span>}{' '}\n          {isIncumbent && (\n            <span class=\"pill pill--basic\" title=\"Currently holds this seat\">\n              Incumbent\n            </span>\n          )}\n        </th>\n        <td class=\"candidate__cell candidate__votes\">{intcomma(votes)}</td>\n        <td class=\"candidate__cell candidate__pct\">\n          {formatPercent(votes, totalVotesInContest)}\n          <span class=\"candidate__pct-symbol\">%</span>\n        </td>\n        {numDelegates && (\n          <td class=\"candidate__cell candidate__votes\">\n            {\n              numDelegates.find(cand => cand.candidate == ballotName)[\n                'delegate-count'\n              ]\n            }\n          </td>\n        )}\n      </tr>\n    );\n  }\n}\n\nHeadshotCandidateRow.defaultProps = {\n  isIncumbent: false,\n  isCalled: false,\n  isWinner: false,\n  isViewable: true,\n};\n\nHeadshotCandidateRow.Header = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Votes\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Pct.\n        <span class=\"candidate__pct-symbol\">%</span>\n      </th>\n    </tr>\n  </thead>\n);\n\nHeadshotCandidateRow.Header_Prez = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Votes\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Pct.\n        <span class=\"candidate__pct-symbol\">%</span>\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Delegates\n      </th>\n    </tr>\n  </thead>\n);\n\nHeadshotCandidateRow.columnCount = 6;\n\nexport default HeadshotCandidateRow;\n","function formatPercent(n: number, d: number): string {\n  if (d == null || d <= 0) return '0.0';\n\n  return ((n / d) * 100).toFixed(1);\n}\n\nexport default formatPercent;\n","import { Component, h } from 'preact';\n\ninterface Props {\n  style?: any;\n  contextRef: (\n    context: CanvasRenderingContext2D,\n    canvas: HTMLCanvasElement\n  ) => void;\n}\n\nclass PureCanvas extends Component<Props> {\n  shouldComponentUpdate() {\n    return false;\n  }\n\n  render() {\n    return (\n      <canvas\n        style={this.props.style}\n        ref={canvas =>\n          canvas ? this.props.contextRef(canvas.getContext('2d'), canvas) : null\n        }\n      />\n    );\n  }\n}\n\nPureCanvas.defaultProps = {\n  style: {},\n};\n\nexport default PureCanvas;\n","import {\n  geoPath as d3GeoPath,\n  GeoPath,\n  GeoProjection,\n  GeoIdentityTransform,\n} from 'd3-geo';\nimport { h } from 'preact';\n\nimport PureComponent from './PureComponent';\nimport PureCanvas from './PureCanvas';\n\nexport interface CanvasLayerProps {\n  projection: GeoProjection | GeoIdentityTransform;\n  width: number;\n  height: number;\n  typeMap: string;\n  render: (\n    ctx: CanvasRenderingContext2D,\n    geoPath: GeoPath,\n    pixelRatio: number\n  ) => void;\n}\n\nclass CanvasLayer extends PureComponent<CanvasLayerProps> {\n  ctx!: CanvasRenderingContext2D;\n  canvas!: HTMLCanvasElement;\n  geoPath!: GeoPath;\n  pixelRatio!: number;\n\n  constructor() {\n    super();\n\n    this.setContextRef = this.setContextRef.bind(this);\n  }\n\n  setContextRef(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement) {\n    this.ctx = ctx;\n    this.canvas = canvas;\n  }\n\n  draw() {\n    const ctx = this.ctx;\n    const geoPath = this.geoPath;\n    const pixelRatio = this.pixelRatio;\n    const { render } = this.props;\n\n    render(ctx, geoPath, pixelRatio);\n  }\n\n  scaleCanvas(\n    canvas: HTMLCanvasElement,\n    ctx: CanvasRenderingContext2D,\n    width: number,\n    height: number\n  ) {\n    const pixelRatio = window.devicePixelRatio || 1;\n    this.pixelRatio = pixelRatio;\n\n    canvas.width = width * pixelRatio;\n    canvas.height = height * pixelRatio;\n\n    canvas.style.width = `${width}px`;\n    canvas.style.height = `${height}px`;\n\n    ctx.scale(pixelRatio, pixelRatio);\n  }\n\n  updateCanvas() {\n    this.scaleCanvas(\n      this.canvas,\n      this.ctx,\n      this.props.width,\n      this.props.height\n    );\n    this.draw();\n  }\n\n  componentDidMount() {\n    // we cannot set up our geoPath until we have a context\n    this.geoPath = d3GeoPath(this.props.projection, this.ctx);\n\n    this.updateCanvas();\n  }\n\n  componentDidUpdate() {\n    this.updateCanvas();\n  }\n\n  render() {\n    return (\n      <PureCanvas\n        style={{ position: 'absolute', top: 0, left: 0, zIndex: 1 }}\n        contextRef={this.setContextRef}\n      />\n    );\n  }\n}\n\nexport default CanvasLayer;\n","import { h } from 'preact';\nimport { GeoPath } from 'd3';\nimport PureComponent from './PureComponent';\nimport { Feature } from 'geojson';\n\nclass Places extends PureComponent<{ geoPath: GeoPath; places: Feature[] }> {\n  render() {\n    const { geoPath, places } = this.props;\n\n    return (\n      <g class=\"places\">\n        <g class=\"place-background-labels\">\n          {places.map((place, idx) => (\n            <text\n              key={`bg-${idx}`}\n              class=\"place-background-label\"\n              transform={`translate(${geoPath.centroid(place)})`}\n              dx={place.properties.dx}\n              dy={place.properties.dy}\n              text-anchor={place.properties.anchor}\n            >\n              {place.properties.name}\n            </text>\n          ))}\n        </g>\n        <g class=\"place-labels\">\n          {places.map((place, idx) => (\n            <text\n              key={`fg-${idx}`}\n              class=\"place-label\"\n              transform={`translate(${geoPath.centroid(place)})`}\n              dx={place.properties.dx}\n              dy={place.properties.dy}\n              text-anchor={place.properties.anchor}\n            >\n              {place.properties.name}\n            </text>\n          ))}\n        </g>\n      </g>\n    );\n  }\n}\n\nexport default Places;\n","import {\n  geoPath as d3GeoPath,\n  GeoPath,\n  GeoIdentityTransform,\n  GeoProjection,\n} from 'd3-geo';\nimport { Component, h, VNode } from 'preact';\n\nimport PureComponent from './PureComponent';\n\nexport interface SvgLayerProps {\n  projection: GeoProjection | GeoIdentityTransform;\n  width: number;\n  height: number;\n  render: (state: SvgLayerState) => VNode | null;\n  onMouseMove?: (event: MouseEvent) => void;\n  onMouseLeave?: (event: MouseEvent) => void;\n}\n\ninterface SvgLayerState {\n  geoPath: GeoPath;\n}\n\nclass SvgLayer extends PureComponent<SvgLayerProps, SvgLayerState> {\n  constructor() {\n    super();\n\n    this.handleMouseMove = this.handleMouseMove.bind(this);\n    this.handleMouseLeave = this.handleMouseLeave.bind(this);\n  }\n\n  handleMouseMove(event: MouseEvent) {\n    const { onMouseMove } = this.props;\n\n    if (onMouseMove) {\n      onMouseMove(event);\n    } else {\n      return;\n    }\n  }\n\n  handleMouseLeave(event: MouseEvent) {\n    const { onMouseLeave } = this.props;\n\n    if (onMouseLeave) {\n      onMouseLeave(event);\n    }\n  }\n\n  componentDidMount() {\n    const geoPath = d3GeoPath(this.props.projection);\n\n    this.setState({ geoPath });\n  }\n\n  render() {\n    const { width, height } = this.props;\n\n    return (\n      <svg\n        width={width}\n        height={height}\n        style={{\n          position: 'relative',\n          top: 0,\n          left: 0,\n          zIndex: 2,\n          strokeLinecap: 'round',\n          strokeLinejoin: 'round',\n          pointerEvents: 'none',\n        }}\n        viewBox={`0 0 ${width} ${height}`}\n        preserveAspectRatio=\"xMidYMid\"\n        onMouseMove={this.handleMouseMove}\n        onMouseLeave={this.handleMouseLeave}\n      >\n        <g>{this.props.render(this.state)}</g>\n      </svg>\n    );\n  }\n}\n\nexport default SvgLayer;\n","const DEMOCRAT = [\n  '#1755c5',\n  '#ffc200',\n  '#91dfe5',\n  '#fcbec3',\n  '#5acc7d',\n  '#182b4b',\n];\n\nconst REPUBLICAN = [\n  '#1755c5',\n  '#ffc200',\n  '#91dfe5',\n  '#fcbec3',\n  '#5acc7d',\n  '#182b4b',\n];\n\nconst OTHER = '#888888';\n\nconst NEUTRAL = '#F2F2F2';\nconst TIE = '#8264B0';\n\nexport { DEMOCRAT, REPUBLICAN, NEUTRAL, TIE, OTHER };\n","import cx from 'classnames';\nimport { h } from 'preact';\n\nimport { DEMOCRAT, NEUTRAL, REPUBLICAN, TIE } from '../colors';\n\nfunction MapLegend({ candidates, includesNoResult, includesTie }) {\n  return (\n    <div class=\"results-map__legend\">\n      {/* <p class=\"results-map__legend-title\">Leader</p> */}\n      <div class=\"results-map__legend-items\">\n        {/* {candidates.map(candidate => {\n          return (\n            <div class=\"results-map__legend-item\">\n              <span\n                class={cx(\n                  'circle-pill',\n                  `pill--${candidate.party.slice(0, 3)}`\n                )}\n              />{' '}\n              <p class=\"results-map__legend-label\">\n                {candidate.ballot_sort_name}\n              </p>\n            </div>\n          );\n        })} */}\n        {includesTie && (\n          <div class=\"results-map__legend-item\">\n            <span class=\"circle-pill\" style={{ backgroundColor: TIE }} />{' '}\n            <p class=\"results-map__legend-label\">Tied</p>\n          </div>\n        )}\n        {includesNoResult && (\n          <div class=\"results-map__legend-item\">\n            <span class=\"circle-pill\" style={{ backgroundColor: NEUTRAL }} />{' '}\n            <p class=\"results-map__legend-label\">No votes</p>\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n\nexport default MapLegend;\n","import cx from 'classnames';\nimport { h } from 'preact';\n\nimport Portal from './Portal';\n\ninterface Props {\n  class: string;\n  tooltipRef(any): void;\n  style?: { [key: string]: string };\n  isHidden?: boolean;\n}\n\nfunction Tooltip({ class: cls, style, isHidden, tooltipRef }: Props) {\n  const klass = cx(cls, { 'display-none': isHidden });\n\n  return (\n    <Portal>\n      <div class={klass} style={style} ref={tooltipRef}>\n        {this.props.children}\n      </div>\n    </Portal>\n  );\n}\n\nTooltip.defaultProps = {\n  class: 'tooltip',\n  isHidden: false,\n};\n\nexport default Tooltip;\n","// packages\nimport { entries } from 'd3-collection';\nimport cx from 'classnames';\nimport { h } from 'preact';\n\nimport { isCanvass } from '../endpoints';\n\n// components\nimport CandidateRow from './CandidateRow';\nimport PureComponent from './PureComponent';\n\n// internal\nimport formatPercent from '../utils/format-percent';\n\nclass TooltipTable extends PureComponent<any> {\n  render() {\n    const { candidatesMap, county, candidatesRender, source } = this.props;\n\n    const sortedResults = entries(county.results).sort(\n      (a, b) => b.value - a.value\n    );\n\n    const pct_votes =\n      source == 'Decision Desk HQ'\n        ? formatPercent(county.total_votes, county.estimated_votes_mid)\n        : county.eevp ?? 0;\n\n    let contestMetricsClass = cx('contest__metrics', {\n      contest__metrics__canvass: isCanvass == true,\n    });\n\n    const pct_votes_turnout =\n      pct_votes < 100\n        ? `An estimated ${pct_votes}% of votes counted`\n        : `An estimated >99% of votes counted`;\n\n    // If no results yet, fall back to showing all candidates from candidatesRender with 0 votes\n    const hasResults = sortedResults.length > 0;\n    const firstThreeResults = sortedResults.slice(0, 3);\n\n    return (\n      <div class=\"contest\">\n        <table class=\"contest__candidates contest__candidates--tooltip\">\n          <caption>\n            <p class=\"county__title\">{county.county} County</p>\n            <div class={contestMetricsClass}>\n              {isCanvass == false && (\n                <p class=\"contest__precincts\">\n                  {source != 'Associated Press' && source != 'Decision Desk HQ'\n                    ? `${formatPercent(\n                        county.county_pollinglocationsreporting,\n                        county.total_county_pollinglocations\n                      )}% reporting`\n                    : pct_votes_turnout}\n                </p>\n              )}\n            </div>\n          </caption>\n          {CandidateRow.countyHeader}\n          <tbody>\n            {hasResults && firstThreeResults.map(result => {\n              const candidate = candidatesMap.get(result.key);\n              const colorMatch = candidatesRender.find(cand => cand.name == candidate.name);\n              const candColor = colorMatch ? colorMatch.color : undefined;\n\n              return (\n                <CandidateRow\n                  key={candidate.id}\n                  ballotName={candidate.name}\n                  candidateId={candidate.id}\n                  contestIsCalled={false}\n                  candidateColor={candColor}\n                  isIncumbent={candidate.is_incumbent}\n                  isWinner={candidate.is_winner}\n                  isMapRow\n                  party={candidate.party}\n                  totalVotesInContest={county.total_votes}\n                  votes={result.value}\n                />\n              );\n            })}\n            {!hasResults && candidatesMap.values().slice(0, 3).map(candidate => {\n              const colorMatch = candidatesRender.find(cand => cand.name == candidate.name);\n              const candColor = colorMatch ? colorMatch.color : undefined;\n              return (\n                <CandidateRow\n                  key={candidate.id}\n                  ballotName={candidate.name}\n                  candidateId={candidate.id}\n                  contestIsCalled={false}\n                  candidateColor={candColor}\n                  isIncumbent={candidate.is_incumbent}\n                  isWinner={false}\n                  isMapRow\n                  party={candidate.party}\n                  totalVotesInContest={0}\n                  votes={0}\n                />\n              );\n            })}\n          </tbody>\n        </table>\n      </div>\n    );\n  }\n}\n\nexport default TooltipTable;\n","function getPoint(node: HTMLElement, x: number, y: number): [number, number] {\n  const rect = node.getBoundingClientRect();\n  return [x - rect.left - node.clientLeft, y - rect.top - node.clientTop];\n}\n\nexport default getPoint;\n","export default class FlatQueue {\n  constructor() {\n    this.ids = [];\n    this.values = [];\n    this.length = 0;\n  }\n\n  clear() {\n    this.length = this.ids.length = this.values.length = 0;\n  }\n\n  push(id, value) {\n    this.ids.push(id);\n    this.values.push(value);\n\n    let pos = this.length++;\n    while (pos > 0) {\n      const parent = (pos - 1) >> 1;\n      const parentValue = this.values[parent];\n      if (value >= parentValue) break;\n      this.ids[pos] = this.ids[parent];\n      this.values[pos] = parentValue;\n      pos = parent;\n    }\n\n    this.ids[pos] = id;\n    this.values[pos] = value;\n  }\n\n  pop() {\n    if (this.length === 0) return undefined;\n\n    const top = this.ids[0];\n    this.length--;\n\n    if (this.length > 0) {\n      const id = (this.ids[0] = this.ids[this.length]);\n      const value = (this.values[0] = this.values[this.length]);\n      const halfLength = this.length >> 1;\n      let pos = 0;\n\n      while (pos < halfLength) {\n        let left = (pos << 1) + 1;\n        const right = left + 1;\n        let bestIndex = this.ids[left];\n        let bestValue = this.values[left];\n        const rightValue = this.values[right];\n\n        if (right < this.length && rightValue < bestValue) {\n          left = right;\n          bestIndex = this.ids[right];\n          bestValue = rightValue;\n        }\n        if (bestValue >= value) break;\n\n        this.ids[pos] = bestIndex;\n        this.values[pos] = bestValue;\n        pos = left;\n      }\n\n      this.ids[pos] = id;\n      this.values[pos] = value;\n    }\n\n    this.ids.pop();\n    this.values.pop();\n\n    return top;\n  }\n\n  peek() {\n    return this.ids[0];\n  }\n\n  peekValue() {\n    return this.values[0];\n  }\n}\n","import FlatQueue from './flatqueue';\n\nconst ARRAY_TYPES = [\n  Int8Array,\n  Uint8Array,\n  Uint8ClampedArray,\n  Int16Array,\n  Uint16Array,\n  Int32Array,\n  Uint32Array,\n  Float32Array,\n  Float64Array,\n];\n\nconst VERSION = 3; // serialized format version\n\nexport default class Flatbush {\n  static from(data) {\n    if (!(data instanceof ArrayBuffer)) {\n      throw new Error('Data must be an instance of ArrayBuffer.');\n    }\n    const [magic, versionAndType] = new Uint8Array(data, 0, 2);\n    if (magic !== 0xfb) {\n      throw new Error('Data does not appear to be in a Flatbush format.');\n    }\n    if (versionAndType >> 4 !== VERSION) {\n      throw new Error(\n        `Got v${versionAndType >> 4} data when expected v${VERSION}.`\n      );\n    }\n    const [nodeSize] = new Uint16Array(data, 2, 1);\n    const [numItems] = new Uint32Array(data, 4, 1);\n\n    return new Flatbush(\n      numItems,\n      nodeSize,\n      ARRAY_TYPES[versionAndType & 0x0f],\n      data\n    );\n  }\n\n  constructor(numItems, nodeSize = 16, ArrayType = Float64Array, data) {\n    if (numItems === undefined)\n      throw new Error('Missing required argument: numItems.');\n    if (isNaN(numItems) || numItems <= 0)\n      throw new Error(`Unpexpected numItems value: ${numItems}.`);\n\n    this.numItems = +numItems;\n    this.nodeSize = Math.min(Math.max(+nodeSize, 2), 65535);\n\n    // calculate the total number of nodes in the R-tree to allocate space for\n    // and the index of each tree level (used in search later)\n    let n = numItems;\n    let numNodes = n;\n    this._levelBounds = [n * 4];\n    do {\n      n = Math.ceil(n / this.nodeSize);\n      numNodes += n;\n      this._levelBounds.push(numNodes * 4);\n    } while (n !== 1);\n\n    this.ArrayType = ArrayType || Float64Array;\n    this.IndexArrayType = numNodes < 16384 ? Uint16Array : Uint32Array;\n\n    const arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType);\n    const nodesByteSize = numNodes * 4 * this.ArrayType.BYTES_PER_ELEMENT;\n\n    if (arrayTypeIndex < 0) {\n      throw new Error(`Unexpected typed array class: ${ArrayType}.`);\n    }\n\n    if (data && data instanceof ArrayBuffer) {\n      this.data = data;\n      this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n      this._indices = new this.IndexArrayType(\n        this.data,\n        8 + nodesByteSize,\n        numNodes\n      );\n\n      this._pos = numNodes * 4;\n      this.minX = this._boxes[this._pos - 4];\n      this.minY = this._boxes[this._pos - 3];\n      this.maxX = this._boxes[this._pos - 2];\n      this.maxY = this._boxes[this._pos - 1];\n    } else {\n      this.data = new ArrayBuffer(\n        8 + nodesByteSize + numNodes * this.IndexArrayType.BYTES_PER_ELEMENT\n      );\n      this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n      this._indices = new this.IndexArrayType(\n        this.data,\n        8 + nodesByteSize,\n        numNodes\n      );\n      this._pos = 0;\n      this.minX = Infinity;\n      this.minY = Infinity;\n      this.maxX = -Infinity;\n      this.maxY = -Infinity;\n\n      new Uint8Array(this.data, 0, 2).set([\n        0xfb,\n        (VERSION << 4) + arrayTypeIndex,\n      ]);\n      new Uint16Array(this.data, 2, 1)[0] = nodeSize;\n      new Uint32Array(this.data, 4, 1)[0] = numItems;\n    }\n\n    // a priority queue for k-nearest-neighbors queries\n    this._queue = new FlatQueue();\n  }\n\n  add(minX, minY, maxX, maxY) {\n    const index = this._pos >> 2;\n    this._indices[index] = index;\n    this._boxes[this._pos++] = minX;\n    this._boxes[this._pos++] = minY;\n    this._boxes[this._pos++] = maxX;\n    this._boxes[this._pos++] = maxY;\n\n    if (minX < this.minX) this.minX = minX;\n    if (minY < this.minY) this.minY = minY;\n    if (maxX > this.maxX) this.maxX = maxX;\n    if (maxY > this.maxY) this.maxY = maxY;\n  }\n\n  finish() {\n    if (this._pos >> 2 !== this.numItems) {\n      throw new Error(\n        `Added ${this._pos >> 2} items when expected ${this.numItems}.`\n      );\n    }\n\n    const width = this.maxX - this.minX;\n    const height = this.maxY - this.minY;\n    const hilbertValues = new Uint32Array(this.numItems);\n    const hilbertMax = (1 << 16) - 1;\n\n    // map item centers into Hilbert coordinate space and calculate Hilbert values\n    for (let i = 0; i < this.numItems; i++) {\n      let pos = 4 * i;\n      const minX = this._boxes[pos++];\n      const minY = this._boxes[pos++];\n      const maxX = this._boxes[pos++];\n      const maxY = this._boxes[pos++];\n      const x = Math.floor(\n        (hilbertMax * ((minX + maxX) / 2 - this.minX)) / width\n      );\n      const y = Math.floor(\n        (hilbertMax * ((minY + maxY) / 2 - this.minY)) / height\n      );\n      hilbertValues[i] = hilbert(x, y);\n    }\n\n    // sort items by their Hilbert value (for packing later)\n    sort(hilbertValues, this._boxes, this._indices, 0, this.numItems - 1);\n\n    // generate nodes at each tree level, bottom-up\n    for (let i = 0, pos = 0; i < this._levelBounds.length - 1; i++) {\n      const end = this._levelBounds[i];\n\n      // generate a parent node for each block of consecutive <nodeSize> nodes\n      while (pos < end) {\n        let nodeMinX = Infinity;\n        let nodeMinY = Infinity;\n        let nodeMaxX = -Infinity;\n        let nodeMaxY = -Infinity;\n        const nodeIndex = pos;\n\n        // calculate bbox for the new node\n        for (let i = 0; i < this.nodeSize && pos < end; i++) {\n          const minX = this._boxes[pos++];\n          const minY = this._boxes[pos++];\n          const maxX = this._boxes[pos++];\n          const maxY = this._boxes[pos++];\n          if (minX < nodeMinX) nodeMinX = minX;\n          if (minY < nodeMinY) nodeMinY = minY;\n          if (maxX > nodeMaxX) nodeMaxX = maxX;\n          if (maxY > nodeMaxY) nodeMaxY = maxY;\n        }\n\n        // add the new node to the tree data\n        this._indices[this._pos >> 2] = nodeIndex;\n        this._boxes[this._pos++] = nodeMinX;\n        this._boxes[this._pos++] = nodeMinY;\n        this._boxes[this._pos++] = nodeMaxX;\n        this._boxes[this._pos++] = nodeMaxY;\n      }\n    }\n  }\n\n  search(minX, minY, maxX, maxY, filterFn) {\n    if (this._pos !== this._boxes.length) {\n      throw new Error('Data not yet indexed - call index.finish().');\n    }\n\n    let nodeIndex = this._boxes.length - 4;\n    let level = this._levelBounds.length - 1;\n    const queue = [];\n    const results = [];\n\n    while (nodeIndex !== undefined) {\n      // find the end index of the node\n      const end = Math.min(\n        nodeIndex + this.nodeSize * 4,\n        this._levelBounds[level]\n      );\n\n      // search through child nodes\n      for (let pos = nodeIndex; pos < end; pos += 4) {\n        const index = this._indices[pos >> 2];\n\n        // check if node bbox intersects with query bbox\n        if (maxX < this._boxes[pos]) continue; // maxX < nodeMinX\n        if (maxY < this._boxes[pos + 1]) continue; // maxY < nodeMinY\n        if (minX > this._boxes[pos + 2]) continue; // minX > nodeMaxX\n        if (minY > this._boxes[pos + 3]) continue; // minY > nodeMaxY\n\n        if (nodeIndex < this.numItems * 4) {\n          if (filterFn === undefined || filterFn(index)) {\n            results.push(index); // leaf item\n          }\n        } else {\n          queue.push(index); // node; add it to the search queue\n          queue.push(level - 1);\n        }\n      }\n\n      level = queue.pop();\n      nodeIndex = queue.pop();\n    }\n\n    return results;\n  }\n\n  neighbors(x, y, maxResults = Infinity, maxDistance = Infinity, filterFn) {\n    if (this._pos !== this._boxes.length) {\n      throw new Error('Data not yet indexed - call index.finish().');\n    }\n\n    let nodeIndex = this._boxes.length - 4;\n    const q = this._queue;\n    const results = [];\n    const maxDistSquared = maxDistance * maxDistance;\n\n    while (nodeIndex !== undefined) {\n      // find the end index of the node\n      const end = Math.min(\n        nodeIndex + this.nodeSize * 4,\n        upperBound(nodeIndex, this._levelBounds)\n      );\n\n      // add child nodes to the queue\n      for (let pos = nodeIndex; pos < end; pos += 4) {\n        const index = this._indices[pos >> 2];\n\n        const dx = axisDist(x, this._boxes[pos], this._boxes[pos + 2]);\n        const dy = axisDist(y, this._boxes[pos + 1], this._boxes[pos + 3]);\n        const dist = dx * dx + dy * dy;\n\n        if (nodeIndex < this.numItems * 4) {\n          // leaf node\n          if (filterFn === undefined || filterFn(index)) {\n            // put a negative index if it's an item rather than a node, to recognize later\n            q.push(-index - 1, dist);\n          }\n        } else {\n          q.push(index, dist);\n        }\n      }\n\n      // pop items from the queue\n      while (q.length && q.peek() < 0) {\n        const dist = q.peekValue();\n        if (dist > maxDistSquared) {\n          q.clear();\n          return results;\n        }\n        results.push(-q.pop() - 1);\n\n        if (results.length === maxResults) {\n          q.clear();\n          return results;\n        }\n      }\n\n      nodeIndex = q.pop();\n    }\n\n    q.clear();\n    return results;\n  }\n}\n\nfunction axisDist(k, min, max) {\n  return k < min ? min - k : k <= max ? 0 : k - max;\n}\n\n// binary search for the first value in the array bigger than the given\nfunction upperBound(value, arr) {\n  let i = 0;\n  let j = arr.length - 1;\n  while (i < j) {\n    const m = (i + j) >> 1;\n    if (arr[m] > value) {\n      j = m;\n    } else {\n      i = m + 1;\n    }\n  }\n  return arr[i];\n}\n\n// custom quicksort that sorts bbox data alongside the hilbert values\nfunction sort(values, boxes, indices, left, right) {\n  if (left >= right) return;\n\n  const pivot = values[(left + right) >> 1];\n  let i = left - 1;\n  let j = right + 1;\n\n  while (true) {\n    do i++;\n    while (values[i] < pivot);\n    do j--;\n    while (values[j] > pivot);\n    if (i >= j) break;\n    swap(values, boxes, indices, i, j);\n  }\n\n  sort(values, boxes, indices, left, j);\n  sort(values, boxes, indices, j + 1, right);\n}\n\n// swap two values and two corresponding boxes\nfunction swap(values, boxes, indices, i, j) {\n  const temp = values[i];\n  values[i] = values[j];\n  values[j] = temp;\n\n  const k = 4 * i;\n  const m = 4 * j;\n\n  const a = boxes[k];\n  const b = boxes[k + 1];\n  const c = boxes[k + 2];\n  const d = boxes[k + 3];\n  boxes[k] = boxes[m];\n  boxes[k + 1] = boxes[m + 1];\n  boxes[k + 2] = boxes[m + 2];\n  boxes[k + 3] = boxes[m + 3];\n  boxes[m] = a;\n  boxes[m + 1] = b;\n  boxes[m + 2] = c;\n  boxes[m + 3] = d;\n\n  const e = indices[i];\n  indices[i] = indices[j];\n  indices[j] = e;\n}\n\n// Fast Hilbert curve algorithm by http://threadlocalmutex.com/\n// Ported from C++ https://github.com/rawrunprotected/hilbert_curves (public domain)\nfunction hilbert(x, y) {\n  let a = x ^ y;\n  let b = 0xffff ^ a;\n  let c = 0xffff ^ (x | y);\n  let d = x & (y ^ 0xffff);\n\n  let A = a | (b >> 1);\n  let B = (a >> 1) ^ a;\n  let C = (c >> 1) ^ (b & (d >> 1)) ^ c;\n  let D = (a & (c >> 1)) ^ (d >> 1) ^ d;\n\n  a = A;\n  b = B;\n  c = C;\n  d = D;\n  A = (a & (a >> 2)) ^ (b & (b >> 2));\n  B = (a & (b >> 2)) ^ (b & ((a ^ b) >> 2));\n  C ^= (a & (c >> 2)) ^ (b & (d >> 2));\n  D ^= (b & (c >> 2)) ^ ((a ^ b) & (d >> 2));\n\n  a = A;\n  b = B;\n  c = C;\n  d = D;\n  A = (a & (a >> 4)) ^ (b & (b >> 4));\n  B = (a & (b >> 4)) ^ (b & ((a ^ b) >> 4));\n  C ^= (a & (c >> 4)) ^ (b & (d >> 4));\n  D ^= (b & (c >> 4)) ^ ((a ^ b) & (d >> 4));\n\n  a = A;\n  b = B;\n  c = C;\n  d = D;\n  C ^= (a & (c >> 8)) ^ (b & (d >> 8));\n  D ^= (b & (c >> 8)) ^ ((a ^ b) & (d >> 8));\n\n  a = C ^ (C >> 1);\n  b = D ^ (D >> 1);\n\n  let i0 = x ^ y;\n  let i1 = b | (0xffff ^ (i0 | a));\n\n  i0 = (i0 | (i0 << 8)) & 0x00ff00ff;\n  i0 = (i0 | (i0 << 4)) & 0x0f0f0f0f;\n  i0 = (i0 | (i0 << 2)) & 0x33333333;\n  i0 = (i0 | (i0 << 1)) & 0x55555555;\n\n  i1 = (i1 | (i1 << 8)) & 0x00ff00ff;\n  i1 = (i1 | (i1 << 4)) & 0x0f0f0f0f;\n  i1 = (i1 | (i1 << 2)) & 0x33333333;\n  i1 = (i1 | (i1 << 1)) & 0x55555555;\n\n  return ((i1 << 1) | i0) >>> 0;\n}\n","import { feature, mesh } from 'topojson-client';\nimport getBBox from '@turf/bbox';\n\nimport Flatbush from '../vendor/flatbush';\n\nconst innerCompare = (a: TopoJSON.GeometryObject, b: TopoJSON.GeometryObject) =>\n  a !== b;\nconst outerCompare = (a: TopoJSON.GeometryObject, b: TopoJSON.GeometryObject) =>\n  a === b;\n\nfunction prepareTopoJSON(topology: TopoJSON.Topology, key?: string) {\n  const object = topology.objects[\n    key || Object.keys(topology.objects)[0]\n  ] as TopoJSON.GeometryCollection;\n  const roadsObject = topology.objects['roads'] as TopoJSON.GeometryCollection;\n  const placesObject = topology.objects[\n    'places'\n  ] as TopoJSON.GeometryCollection;\n  const urbanAreasObject = topology.objects[\n    'urban_areas'\n  ] as TopoJSON.GeometryCollection;\n\n  const collection = feature(topology, object);\n  const roads = feature(topology, roadsObject);\n  const places = feature(topology, placesObject);\n  const urban_areas = feature(topology, urbanAreasObject);\n  // const innerlines = mesh(topology, object, innerCompare);\n  // const outerlines = mesh(topology, object, outerCompare);\n  const bbox = topology.bbox || getBBox(collection);\n\n  const index = new Flatbush(collection.features.length);\n  collection.features.forEach(feature => {\n    const bounds = getBBox(feature);\n    index.add(...bounds);\n  });\n  index.finish();\n\n  const heightRatio = (bbox[3] - bbox[1]) / (bbox[2] - bbox[0]);\n\n  return {\n    collection,\n    // features,\n    // innerlines,\n    // outerlines,\n    bbox,\n    heightRatio,\n    index,\n    roads,\n    places,\n    urban_areas,\n  };\n}\n\nexport default prepareTopoJSON;\n","// packages\nimport cx from 'classnames';\nimport { entries, map, Map, set, Set } from 'd3-collection';\nimport { GeoPath, GeoIdentityTransform, GeoProjection } from 'd3-geo';\nimport { scaleLinear, ScaleLinear } from 'd3-scale';\nimport { Feature, Point } from 'geojson';\nimport { Component, h } from 'preact';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport booleanPointInPolygon from '@turf/boolean-point-in-polygon';\n\n// components\nimport CanvasLayer from './CanvasLayer';\nimport Places from './Places';\nimport Portal from './Portal';\nimport SvgLayer from './SvgLayer';\nimport MapLegend from './MapLegend';\nimport Tooltip from './Tooltip';\nimport TooltipTable from './TooltipTable';\n\n// internal\nimport clamp from '../utils/clamp';\nimport * as colors from '../colors';\nimport find from '../utils/find';\nimport getPoint from '../utils/get-point';\nimport prepareTopoJSON from '../utils/prepare-topojson';\nimport { Topology } from 'topojson-specification';\n\ninterface LayeredMapProps {\n  projection: GeoProjection | GeoIdentityTransform;\n  topology: Topology;\n  precinctsReporting: number;\n  totalVotes: number;\n  source: string;\n  candidatesRender: { [key: string]: any };\n}\n\ninterface LayeredMapState {\n  activeGeometry: Feature | null;\n  candidatesOnMap: Set;\n  geos: any;\n  width: number;\n  height: number;\n  x: number;\n  y: number;\n  activeBtn: boolean;\n  includesTie: boolean;\n  typeMap: string;\n}\n\nconst tooltipPush = 20;\n\nconst relocateTooltip = (tooltip, x, y) => {\n  const { height, width } = tooltip.getBoundingClientRect();\n\n  const innerWidth = window.innerWidth;\n  const innerHeight = window.innerHeight;\n\n  const left = clamp(\n    x - width / 2,\n    tooltipPush,\n    innerWidth - width - tooltipPush\n  );\n  const top =\n    innerHeight > y + tooltipPush + height\n      ? y + tooltipPush\n      : y - height - tooltipPush;\n\n  tooltip.style.left = `${left}px`;\n  tooltip.style.top = `${top}px`;\n};\n\nclass LayeredMap extends Component<LayeredMapProps, LayeredMapState> {\n  xScale: ScaleLinear<number, number>;\n  yScale: ScaleLinear<number, number>;\n  tooltip!: HTMLElement;\n  candidateMap!: Map<any>;\n  countyMap!: Map<any>;\n  embedType: string;\n  candidatesRender: { [key: string]: any };\n\n  constructor() {\n    super();\n\n    this.state = {\n      activeGeometry: null,\n      candidatesOnMap: set(),\n      geos: {},\n      width: 0,\n      height: 0,\n      includesNoResult: false,\n      includesTie: false,\n      typeMap: 'categorical',\n      activeBtn: 'categorical',\n      x: 0,\n      y: 0,\n    };\n\n    this.onMouseMove = this.onMouseMove.bind(this);\n    this.onMouseLeave = this.onMouseLeave.bind(this);\n    this.onDocumentTouch = this.onDocumentTouch.bind(this);\n    this.getTooltipRef = this.getTooltipRef.bind(this);\n    this.canvasRenderer = this.canvasRenderer.bind(this);\n\n    this.xScale = scaleLinear();\n    this.yScale = scaleLinear();\n  }\n\n  getTooltipRef(el: HTMLElement) {\n    this.tooltip = el;\n  }\n\n  setUpCountyMap(counties: any) {\n    this.countyMap = map(counties, d => d.fips);\n  }\n\n  setUpCandidateMap(candidates: any) {\n    this.candidateMap = map(candidates, d => d.id);\n  }\n\n  handleClick = param => event => {\n    this.setState({\n      typeMap: param,\n      activeBtn: param,\n    });\n  };\n\n  onMouseMove(event: MouseEvent) {\n    const { clientX: x, clientY: y, target } = event;\n    const point = getPoint(target as HTMLElement, x, y);\n\n    const coords = [this.xScale.invert(point[0]), this.yScale.invert(point[1])];\n\n    const { collection, index } = this.state.geos;\n\n    const found = index\n      .search(...coords, ...coords)\n      .map((i: number) => collection.features[i]);\n\n    const activeGeometry = find(\n      found,\n      (feature: Feature<GeoJSON.Polygon | GeoJSON.MultiPolygon>) =>\n        booleanPointInPolygon(coords, feature)\n    );\n\n    let activeCounty = null;\n\n    if (activeGeometry) {\n      const { fips, name } = activeGeometry.properties;\n      activeCounty = this.countyMap.get(fips) || {\n        county: name,\n        fips,\n        total_votes: 0,\n        results: {},\n        county_pollinglocationsreporting: 0,\n        total_county_pollinglocations: 0,\n      };\n    }\n\n    this.setState({ activeCounty, activeGeometry }, () =>\n      relocateTooltip(this.tooltip, x, y)\n    );\n  }\n\n  onMouseLeave() {\n    this.setState({ activeCounty: null, activeGeometry: null });\n  }\n\n  onDocumentTouch(e) {\n    if (!this.base.contains(e.target)) this.onMouseLeave();\n  }\n\n  canvasRenderer(ctx: CanvasRenderingContext2D, geoPath: GeoPath) {\n    const { geos, width, height, typeMap } = this.state;\n\n    const { candidatesRender, embedType } = this.props;\n\n    ctx.clearRect(0, 0, width, height);\n\n    if (!geos.collection) return;\n\n    const candidatesOnMap = set();\n    let includesNoResult = false;\n    let includesTie = false;\n\n    geos.collection.features.forEach((feature: Feature) => {\n      const { fips } = feature.properties;\n      const county = this.countyMap.get(fips);\n\n      let fillStyle;\n\n      if (!county || county.total_votes <= 0) {\n        includesNoResult = true;\n        fillStyle = colors.NEUTRAL;\n      } else {\n        const sortedResults = entries(county.results).sort(\n          (a, b) => b.value - a.value\n        );\n\n        const leader = sortedResults[0];\n        const second = sortedResults[1];\n\n        if (leader.value === second.value) {\n          includesTie = true;\n          fillStyle = colors.TIE;\n        } else {\n          const leadingId = leader.key;\n          candidatesOnMap.add(leadingId);\n\n          const { id, name } = this.candidateMap.get(leadingId);\n          const result = candidatesRender.filter(cand => cand.name == name);\n          fillStyle = result.length > 0 ? result[0]['color'] : colors.NEUTRAL;\n        }\n      }\n\n      ctx.beginPath();\n      geoPath(feature);\n\n      ctx.fillStyle = fillStyle;\n      ctx.fill();\n      ctx.closePath();\n    });\n\n    ctx.beginPath();\n    geoPath(geos.collection);\n\n    ctx.lineCap = 'round';\n    ctx.lineJoin = 'round';\n    ctx.strokeStyle = 'rgba(255, 255, 255, .6)'; //255, 255, 255\n    ctx.lineWidth = 0.8;\n\n    ctx.stroke();\n    ctx.closePath();\n\n    geos.roads.features.forEach((feature: Feature) => {\n      if (feature.properties.level !== 'Interstate') return;\n      ctx.beginPath();\n      geoPath(feature);\n\n      ctx.lineCap = 'round';\n      ctx.lineJoin = 'round';\n\n      if (feature.properties.level === 'Interstate') {\n        ctx.strokeStyle = 'rgba(0, 0, 0, .12)';\n        ctx.lineWidth = 1;\n      } else {\n        ctx.strokeStyle = 'rgba(0, 0, 0, .08)';\n        ctx.lineWidth = 0.8;\n      }\n\n      ctx.stroke();\n      ctx.closePath();\n    });\n\n    let places_mappable = geos.places;\n\n    geos.places = places_mappable;\n\n    geos.places.features.forEach((feature: Feature<Point>) => {\n      const [x, y] = geoPath.centroid(feature);\n\n      ctx.beginPath();\n      ctx.arc(x, y, 3, 0, Math.PI * 2, true);\n      ctx.strokeStyle = 'rgba(33, 33, 33, .75)';\n      ctx.lineWidth = 1.25;\n      ctx.stroke();\n      ctx.closePath();\n    });\n\n    geos.urban_areas.features.forEach((feature: Feature) => {\n      ctx.beginPath();\n      geoPath(feature);\n\n      ctx.fillStyle = 'rgba(153, 160, 175, 0.2)';\n      ctx.fill();\n      ctx.closePath();\n    });\n\n    this.setState({ candidatesOnMap, includesNoResult, includesTie });\n  }\n\n  componentWillReceiveProps(nextProps) {\n    const { candidates, counties } = nextProps;\n\n    this.setUpCandidateMap(candidates);\n    this.setUpCountyMap(counties);\n  }\n\n  getContainerDimensions() {\n    const base = this.base!;\n    const rawWidth = base.offsetWidth;\n\n    this.setState({ width });\n  }\n\n  componentDidMount() {\n    const { candidates, counties, candidatesRender } = this.props;\n\n    this.setUpCandidateMap(candidates);\n    this.setUpCountyMap(counties);\n\n    const base = this.base!;\n    const rawWidth = Math.floor(base.clientWidth);\n\n    const { topology } = this.props;\n    const geos = prepareTopoJSON(topology);\n\n    const { bbox, heightRatio } = geos;\n    const rawHeight = Math.floor(rawWidth * heightRatio);\n\n    const width = rawWidth;\n    const height = rawHeight;\n\n    this.xScale.domain([bbox[0], bbox[2]]).range([0, width]);\n    this.yScale.domain([bbox[1], bbox[3]]).range([height, 0]);\n\n    // Took away a few pixels from the fitSize because of the bubbles. There has to be a better way to do this.\n\n    this.props.projection.fitSize([width - 6, height - 20], bboxPolygon(bbox));\n\n    document.addEventListener('touchstart', this.onDocumentTouch, false);\n\n    this.setState({ geos, width, height });\n  }\n\n  render() {\n    const {\n      candidates,\n      projection,\n      precinctsReporting,\n      totalVotes,\n      candidatesRender,\n      embedType,\n      source,\n    } = this.props;\n    const {\n      activeCounty,\n      activeBtn,\n      activeGeometry,\n      candidatesOnMap,\n      geos,\n      includesNoResult,\n      includesTie,\n      width,\n      height,\n      x,\n      y,\n      typeMap,\n    } = this.state;\n\n    return (\n      <div class=\"all-map-stuff\">\n        <div\n          class=\"layers-map\"\n          style={{\n            boxSizing: 'border-box',\n            width: '100%',\n            height: '100%',\n            position: 'relative',\n          }}\n          onMouseMove={this.onMouseMove}\n          onMouseLeave={this.onMouseLeave}\n        >\n          <SvgLayer\n            width={width}\n            height={height}\n            projection={projection}\n            render={({ geoPath }) => (\n              <g>\n                {geos.places && (\n                  <Places geoPath={geoPath} places={geos.places.features} />\n                )}\n                {activeGeometry && (\n                  <path\n                    fill=\"none\"\n                    stroke=\"black\"\n                    stroke-width=\"2\"\n                    d={geoPath(activeGeometry) || undefined}\n                  />\n                )}\n              </g>\n            )}\n          />\n          <CanvasLayer\n            totalPrecincts={precinctsReporting}\n            totalVotes={totalVotes}\n            projection={projection}\n            width={width}\n            height={height}\n            render={this.canvasRenderer}\n            mapType={typeMap}\n          />\n          <Tooltip\n            class={cx('tooltip map__tooltip', {\n              invisible: !Boolean(activeCounty),\n            })}\n            tooltipRef={this.getTooltipRef}\n          >\n            {activeCounty && (\n              <TooltipTable\n                candidatesRender={candidatesRender}\n                candidatesMap={this.candidateMap}\n                county={activeCounty}\n                source={source}\n              />\n            )}\n          </Tooltip>\n        </div>\n        {/* <MapText\n          typeMap={typeMap}\n        /> */}\n        <MapLegend\n          candidates={candidates.filter(({ id }: { id: string }) =>\n            candidatesOnMap.has(id)\n          )}\n          includesNoResult={includesNoResult}\n          includesTie={includesTie}\n        />\n      </div>\n    );\n  }\n}\n\nexport default LayeredMap;\n","/**\n * Returns the minimum if n is less than the minimum.\n * Returns the maximum if n is more than the maximum.\n * Returns n if n is between the minimum and maximum.\n *\n * @param {Number} n\n * @param {Number} min\n * @param {Number} max\n * @return {Number}\n */\nexport default function clamp(n, min, max) {\n  return Math.min(Math.max(n, min), max);\n}\n","import * as d3 from 'd3';\nimport { entries, map, Map } from 'd3-collection';\nimport { Component, h } from 'preact';\n\nimport topology from 'Assets/geography/texas_urban.json';\n\nimport appData from 'Data/data.json';\n\nconst countiesData = appData;\n\nimport prepareTopoJSON from '../utils/prepare-topojson';\n\nimport { TIE } from '../colors';\n\ninterface Props {\n  category: string;\n  contest: { [key: string]: any };\n  candidatesRender: any;\n}\n\nclass TinyMap extends Component<Props> {\n  candidateMap!: Map<any>;\n  countyMap!: Map<any>;\n\n  constructor() {\n    super();\n\n    this.createMap = this.createMap.bind(this);\n    this.redrawMap = this.redrawMap.bind(this);\n    this.findLeading = this.findLeading.bind(this);\n  }\n\n  setUpCandidateMap(candidates: any) {\n    this.candidateMap = map(candidates, (d) => d.id);\n  }\n\n  setUpCountyMap(counties: any) {\n    this.countyMap = map(counties, (d) => d.fips);\n  }\n\n  componentDidMount() {\n    const { category, contest } = this.props;\n\n    this.setUpCandidateMap(contest.candidacies);\n    this.setUpCountyMap(contest.counties);\n\n    this.createMap(contest, category);\n\n    window.addEventListener('resize', () => {\n      this.redrawMap();\n    });\n  }\n\n  componentDidUpdate() {\n    const { category, contest } = this.props;\n\n    this.setUpCandidateMap(contest.candidacies);\n    this.setUpCountyMap(contest.counties);\n\n    this.createMap(contest, category);\n  }\n\n  findLeading(fips) {\n    const { candidatesRender } = this.props;\n\n    const county = this.countyMap.get(fips);\n\n    let fillStyle;\n\n    if (!county || county.total_votes <= 0) {\n      fillStyle = '#666';\n    } else {\n      const sortedResults = entries(county.results).sort(\n        (a, b) => b.value - a.value\n      );\n\n      const leader = sortedResults[0];\n      const second = sortedResults[1];\n\n      if (!leader || !second) {\n        fillStyle = '#666';\n      } else if (leader.value === second.value) {\n        fillStyle = TIE;\n      } else {\n        const leadingId = leader.key;\n\n        const candidateObj = this.candidateMap.get(leadingId);\n        if (!candidateObj) {\n          fillStyle = '#666';\n        } else {\n          const result = candidatesRender.filter((cand) => cand.id == candidateObj.id);\n          fillStyle = result.length > 0 ? result[0]['color'] : '#bdbdbd';\n        }\n      }\n    }\n\n    return fillStyle;\n  }\n\n  createMap(contest, category) {\n    d3.selectAll(`.${category}-${contest.office_slug}-${contest.party.toLowerCase()} svg`).remove();\n\n    const container = d3.select(`.${category}-${contest.office_slug}-${contest.party.toLowerCase()}`);\n\n    const geos = prepareTopoJSON(topology);\n\n    let projection = d3\n      .geoIdentity()\n      .reflectY(true)\n      .fitSize([75, 75], geos.collection);\n\n    let pathGenerator = d3.geoPath().projection(projection);\n\n    let tinymap = container\n      .append('svg')\n      .attr('id', 'tinymap')\n      .attr('role', 'presentation')\n      .attr('width', 75)\n      .attr('height', 75);\n\n    let g_tinymap = tinymap\n      .append('g')\n      .attr('class', 'tinymap')\n      .attr('width', 75)\n      .attr('height', 75);\n\n    g_tinymap\n      .selectAll('.tinycounties')\n      .data(geos.collection.features)\n      .enter()\n      .append('path')\n      .attr('d', pathGenerator)\n      .attr('stroke', (d) => {\n        let foundCounty = countiesData.counties.find(\n          (a) => a.county == d.properties.name\n        );\n        if (foundCounty && foundCounty.category == category)\n          return this.findLeading(d.properties.fips);\n        else return '#d0d0d0';\n      })\n      .attr('stroke-width', '1')\n      .attr('class', 'tinycounties')\n      .attr('fill', (d) => {\n        let foundCounty = countiesData.counties.find(\n          (a) => a.county == d.properties.name\n        );\n        if (foundCounty && foundCounty.category == category)\n          return this.findLeading(d.properties.fips);\n        else return '#d0d0d0';\n      });\n  }\n\n  redrawMap() {\n    const { category, contest } = this.props;\n\n    d3.selectAll(`.${category}-${contest.office_slug}-${contest.party.toLowerCase()} svg`).remove();\n    this.createMap(contest, category);\n  }\n\n  render() {\n    const { category, contest } = this.props;\n\n    return (\n      <div\n        id='tinymapcontainer'\n        class={`${category}-${contest.office_slug}-${contest.party.toLowerCase()}`}\n      ></div>\n    );\n  }\n}\n\nexport default TinyMap;\n","import * as d3 from 'd3';\nimport { Component, h } from 'preact';\n\nimport { showPrecinctsReporting } from '../endpoints';\n\nimport { customNumFormat, customBarNumFormat } from '../utils/format-numbers';\n\nclass MiniBarChart extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      width: null,\n      height: 90,\n      bodyWidth: null,\n      breakPoint: 768,\n    };\n\n    this.createGraphic = this.createGraphic.bind(this);\n    this.redrawGraphic = this.redrawGraphic.bind(this);\n    this.getContainerWidth = this.getContainerWidth.bind(this);\n  }\n\n  componentDidMount() {\n    const {\n      className,\n      categoryNumbers,\n      candidatesRender,\n      candidates,\n      officeSlug,\n      party,\n      maxNum,\n    } = this.props;\n    let { width, bodyWidth } = this.getContainerWidth(officeSlug);\n\n    this.setState({ width: width, bodyWidth: bodyWidth }, () => {\n      this.createGraphic(\n        className,\n        categoryNumbers,\n        candidatesRender,\n        candidates,\n        officeSlug,\n        party,\n        maxNum\n      );\n    });\n\n    window.addEventListener('resize', () => {\n      this.redrawGraphic();\n    });\n  }\n\n  componentDidUpdate() {\n    const {\n      className,\n      categoryNumbers,\n      candidatesRender,\n      candidates,\n      officeSlug,\n      party,\n      maxNum,\n    } = this.props;\n\n    this.createGraphic(\n      className,\n      categoryNumbers,\n      candidatesRender,\n      candidates,\n      officeSlug,\n      party,\n      maxNum\n    );\n  }\n\n  createGraphic(\n    className,\n    categoryNumbers,\n    candidatesRender,\n    candidates,\n    officeSlug,\n    party,\n    maxNum\n  ) {\n    let { width, bodyWidth } = this.getContainerWidth(officeSlug);\n\n    let { height, breakPoint } = this.state;\n\n    const partySlug = party ? party.toLowerCase() : '';\n    const chartSelector = `.bar-chart-${className}-${officeSlug}-${partySlug}`;\n\n    d3.selectAll(`${chartSelector} svg`).remove();\n\n    const container = d3.select(chartSelector);\n\n    // chart setup\n    let margin = { top: 0, bottom: 20, right: 60, left: 70 };\n\n    width = width - margin.left - margin.right;\n    height = 68 - margin.top - margin.bottom;\n\n    const isMobile = bodyWidth < breakPoint;\n\n    let svg = container\n      .append('svg')\n      .attr('width', width + margin.left + margin.right)\n      .attr('height', height + margin.top + margin.bottom);\n\n    let diagonalStripePattern = svg\n      .append('defs')\n      .append('pattern')\n      .attr('id', 'diagonal-stripe')\n      .attr('patternUnits', 'userSpaceOnUse')\n      .attr('patternTransform', 'rotate(45 0 0)')\n      .attr('width', 6)\n      .attr('height', 6);\n\n    diagonalStripePattern\n      .append('rect')\n      .attr('width', 6)\n      .attr('height', 6)\n      .style('fill', '#d9d9d9');\n\n    diagonalStripePattern\n      .append('line')\n      .attr('x1', 0)\n      .attr('y1', 0)\n      .attr('x2', 0)\n      .attr('y2', 6)\n      .style('stroke', 'black')\n      .style('stroke-width', 0.5);\n\n    let g = svg\n      .append('g')\n      .attr('class', `bar-chart-${className}-${officeSlug}-${partySlug}-group`)\n      .attr('width', width)\n      .attr('transform', `translate(${margin.left},${margin.top})`);\n\n    let newcand = candidates.map((obj) => ({\n      ...obj,\n      last_name: obj.name.split(' ').slice(-1).join(' '),\n      category_votes: categoryNumbers[1][0][obj.id],\n    }));\n\n    newcand = newcand.sort(function (a, b) {\n      return (b.category_votes || 0) - (a.category_votes || 0);\n    });\n\n    // Use a reasonable alt max for primary elections\n    let altMaxNum = 600000;\n\n    const domainMax = isNaN(maxNum) ? altMaxNum : Math.max(maxNum, altMaxNum);\n\n    var x = d3.scaleLinear().range([0, width]).domain([0, domainMax]);\n\n    var y = d3\n      .scaleBand()\n      .domain(\n        newcand.map(function (entry) {\n          return entry.last_name;\n        })\n      )\n      .range([height, 0])\n      .padding(0.4);\n\n    // light gray bar underneath\n    g\n      .selectAll('.bar-gray')\n      .data(newcand)\n      .enter()\n      .append('rect')\n      .attr('class', 'bar-light-gray')\n      .attr('fill', '#F5F5F5')\n      .attr('width', x(domainMax))\n      .attr('y', (d) => y(d.last_name))\n      .attr('height', y.bandwidth());\n\n    // add the x Axis\n    g.append('g')\n      .attr('transform', 'translate(0,' + height + ')')\n      .call(\n        d3.axisBottom(x).tickValues([300000, 600000]).tickFormat(d => d3.format('~s')(d).toUpperCase()).tickSize(-height)\n      )\n      .attr('class', 'axis axis--x')\n      .selectAll('text')\n      .attr('dy', '0.99em');\n\n    // add the y Axis\n    g.append('g')\n      .attr('class', 'axis axis--y')\n      .style('text-anchor', 'end')\n      .call(d3.axisLeft(y))\n      .selectAll('text')\n      .attr('y', 0)\n      .attr('dy', '.35em')\n      .attr('x', -10)\n      .attr('text-anchor', 'end');\n\n    // append the rectangles for the bar chart\n    g\n      .selectAll('.bar')\n      .data(newcand)\n      .enter()\n      .append('rect')\n      .attr('class', 'bar-category')\n      .attr('fill', (d) => {\n        let foundCandidate = candidatesRender.find((a) => a.id == d.id);\n        if (foundCandidate) return foundCandidate.color;\n        else return '#bdbdbd';\n      })\n      .attr('width', (d) => x(d.category_votes || 0))\n      .attr('y', (d) => y(d.last_name))\n      .attr('height', y.bandwidth());\n\n    g.selectAll('.bar')\n      .data(newcand)\n      .enter()\n      .append('text')\n      .attr('x', (d) => x(d.category_votes || 0) + 3)\n      .attr('text-anchor', 'start')\n      .attr('y', (d) => y(d.last_name) + y.bandwidth() / 2)\n      .attr('dy', '.35em')\n      .text((d) => customBarNumFormat(d.category_votes || 0));\n  }\n\n  getContainerWidth(office_slug) {\n    const body = d3.select('body');\n    const bodyWidth = body.node().offsetWidth;\n    const isMobile = bodyWidth < this.state.breakPoint;\n    const width = this.base ? this.base.offsetWidth - (isMobile ? 10 : 80) : 300;\n    return { width, bodyWidth };\n  }\n\n  redrawGraphic() {\n    const {\n      className,\n      categoryNumbers,\n      candidatesRender,\n      candidates,\n      officeSlug,\n      party,\n      maxNum,\n    } = this.props;\n\n    let { width, bodyWidth } = this.getContainerWidth(officeSlug);\n\n    this.setState({ width: width, bodyWidth: bodyWidth });\n    this.createGraphic(\n      className,\n      categoryNumbers,\n      candidatesRender,\n      candidates,\n      officeSlug,\n      party,\n      maxNum\n    );\n  }\n\n  componentWillUnmount() {\n    window.addEventListener('resize', () => {\n      this.redrawGraphic();\n    });\n  }\n\n  render() {\n    const { className, officeSlug, party } = this.props;\n    const partySlug = party ? party.toLowerCase() : '';\n\n    return (\n      <div\n        class={`category-bar-chart bar-chart-${className}-${officeSlug}-${partySlug}`}\n      ></div>\n    );\n  }\n}\n\nexport default MiniBarChart;\n","import { intword, intcomma } from 'journalize';\nimport * as d3 from 'd3';\n\nexport function customNumFormat(d, i) {\n  if (i == 0) {\n    return ``;\n  } else if (i == 1) {\n    return `${d3.format('~s')(d)}`;\n  } else if (i == 2) {\n    return `${intcomma(intword(d)).replace(' million', 'M')}`;\n  } else if (i == 3) {\n    return `${intcomma(intword(d)).replace(' million', 'M')}`;\n  }\n}\n\nexport function customNumFormatMini(d, i) {\n  if (i == 0) {\n    return ``;\n  } else if (i == 1) {\n    return `${d3.format('~s')(d)}`;\n  } else if (i == 2) {\n    return `${intcomma(intword(d)).replace(' million', 'M')}`;\n  }\n}\n\nexport function customBarNumFormat(d) {\n  return `${intcomma(intword(d)).replace(' million', 'M')}`;\n}\n","import cx from 'classnames';\nimport { Component, h } from 'preact';\n\nimport TinyMap from './TinyMap';\n\nimport text from 'Data/text.json';\nimport MiniBarChart from './MiniBarChart';\n\ninterface Props {\n  category: string;\n  maxNum: number;\n  categoryNumbers: { [key: string]: any };\n  contest: { [key: string]: any };\n  candidates: { [key: string]: any };\n  candidatesRender: any;\n}\n\nclass AnalysisTableRow extends Component<Props> {\n  constructor() {\n    super();\n  }\n\n  render() {\n    const {\n      category,\n      categoryNumbers,\n      candidatesRender,\n      contest,\n      maxNum,\n      candidates,\n    } = this.props;\n\n    let categoryClass = cx(\n      'category-bar-chart-' +\n        category +\n        '-' +\n        contest.office_slug +\n        '-' +\n        contest.party.toLowerCase()\n    );\n\n    const category_text = text.geocategories\n      ? (text.geocategories.find(a => a.type == category) || {})['value'] ||\n        category\n      : category;\n\n    const category_explain = text.geocategories_explain\n      ? (text.geocategories_explain.find(a => a.type == category) || {})[\n          'value'\n        ] || ''\n      : '';\n\n    return (\n      <div class=\"category-grid t-sans\">\n        <h4 class=\"map__title\">{category_text}</h4>\n        <p class=\"map__explain\">{category_explain}</p>\n        <div class=\"category-inline-grid\">\n          <TinyMap\n            contest={contest}\n            category={category}\n            candidatesRender={candidatesRender}\n          />\n          <div class={categoryClass}>\n            <MiniBarChart\n              className={category}\n              maxNum={maxNum}\n              officeSlug={contest.office_slug}\n              party={contest.party}\n              categoryNumbers={categoryNumbers}\n              candidatesRender={candidatesRender}\n              candidates={candidates}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default AnalysisTableRow;\n","import { Component, h } from 'preact';\n\nimport AnalysisTableRow from './AnalysisTableRow';\n\nimport { APTotalVotesToCount } from '../election-utils';\n\nimport raceCandidateColors from '../election-candidate-colors';\n\nimport appData from 'Data/data.json';\nimport context from 'Data/text.json';\n\nconst countiesData = appData;\n\ntype Props = {\n  contest: { [key: string]: any };\n  candidates: { [key: string]: any };\n  counties: { [key: string]: any };\n};\n\nclass AnalysisTable extends Component<Props> {\n  constructor() {\n    super();\n  }\n\n  render() {\n    const { contest, candidates, counties } = this.props;\n\n    if (!contest) return null;\n\n    const countiesData_safe = counties || [];\n\n    // Build candidatesRender: match color definitions to actual candidate IDs from the API\n    const colorLookup = [contest.office_slug, '-', contest.party].join('');\n    const colorDefs = raceCandidateColors[colorLookup] || [];\n\n    const candidatesRender = colorDefs\n      .map(object => {\n        const match = contest.candidacies.find(obj => obj.name === object.name);\n        return match ? { ...object, id: match.id } : null;\n      })\n      .filter(Boolean);\n\n    // groupBy: divides counties into categories, sums votes per candidate per category\n    function groupBy(arr, criteria) {\n      const newObj = arr.reduce(function(acc, currentValue) {\n        if (!acc[currentValue[criteria]]) {\n          acc[currentValue[criteria]] = [];\n        }\n        const findCounties = countiesData_safe\n          .filter(county => county.county == currentValue['county'])\n          .map(obj => obj.results)[0];\n        const findCounties2 = countiesData_safe\n          .filter(county => county.county == currentValue['county'])\n          .map(obj => APTotalVotesToCount(obj['eevp'], obj['total_votes']))[0];\n        let arrayCounties = {\n          ...currentValue,\n          ...findCounties,\n          estimated_votes: findCounties2,\n        };\n\n        acc[currentValue[criteria]].push(arrayCounties);\n        return acc;\n      }, {});\n\n      const summedEntries = [];\n\n      Object.entries(newObj).forEach(function(val: any) {\n        const result = val[1].reduce((r, e, i, a) => {\n          const candidateIds = Object.keys(e);\n          candidateIds.forEach(k => (r[k] = (r[k] || 0) + parseInt(e[k])));\n\n          if (!a[i + 1])\n            Object.keys(e)\n              .filter(k => typeof e[k] == 'string')\n              .forEach(k => (r[k] /= val[1].length));\n          r['category'] = e.category;\n          delete r['county'];\n          delete r['county_CAPS'];\n\n          return r;\n        });\n\n        summedEntries.push(result);\n      });\n      return summedEntries;\n    }\n\n    // createArray: adds total_votes, votes_still_to_count, largest_number per category\n    function createArray(arr, criteria) {\n      const newObj = arr.reduce(function(acc, currentValue) {\n        if (!acc[currentValue[criteria]]) {\n          acc[currentValue[criteria]] = [];\n        }\n        acc[currentValue[criteria]].push(currentValue);\n        return acc;\n      }, []);\n\n      Object.entries(newObj).forEach(function(item: any) {\n        function sum(obj) {\n          var total = 0;\n          var arrayToGetMost = [];\n          for (var el in obj) {\n            if (el !== 'category' && el !== 'estimated_votes') {\n              total += parseFloat(obj[el]);\n              arrayToGetMost.push(obj[el]);\n            }\n          }\n          return [total, arrayToGetMost];\n        }\n        var totals = sum(item[1][0]);\n        item[1][0].total_votes = totals[0];\n        item[1][0].votes_still_to_count =\n          item[1][0].estimated_votes - totals[0];\n        totals[1].push(item[1][0].estimated_votes - totals[0]);\n        item[1][0].largest_number = Math.max(...totals[1]);\n        delete item[1][0].category;\n      });\n      return newObj;\n    }\n\n    const countiesByCategory = groupBy(countiesData.counties, 'category');\n    const arrayByCategories = createArray(countiesByCategory, 'category');\n    const objectCategories = Object.entries(arrayByCategories);\n\n    let arrayToGetLargest = [];\n    objectCategories.forEach((item: any) => {\n      arrayToGetLargest.push(item[1][0].largest_number);\n    });\n\n    return (\n      <span>\n        <h3 class=\"category__title t-sans\">{context.categories_headline}</h3>\n        <div class=\"category-grids t-sans\">\n          {objectCategories &&\n            objectCategories.map(categories => (\n              <AnalysisTableRow\n                contest={contest}\n                category={categories[0] as string}\n                maxNum={Math.max(...arrayToGetLargest)}\n                categoryNumbers={categories}\n                candidates={candidates}\n                candidatesRender={candidatesRender}\n              />\n            ))}\n        </div>\n      </span>\n    );\n  }\n}\n\nexport default AnalysisTable;\n","const userAgent = navigator.userAgent;\n\nexport function isThisIE(): boolean {\n  return /Trident|MSIE|IEMobile/i.test(userAgent);\n}\n","// packages\nimport { geoIdentity, GeoIdentityTransform } from 'd3-geo';\nimport { Component, h } from 'preact';\n\n// components\nimport Contest from './Contest';\nimport HeadshotCandidateRow from './HeadshotCandidateRow';\nimport SeatPartyDivider from './SeatPartyDivider';\nimport LayeredMap from './LayeredMap';\nimport Portal from './Portal';\nimport AnalysisTable from './AnalysisTable';\n\n// utils\nimport { isThisIE } from '../utils/platform';\nimport {\n  determineContestTitle\n} from '../election-utils';\n\nimport raceCandidateColors from '../election-candidate-colors';\n\nimport { visibleCandidatesCount } from '../endpoints';\n\nimport find from '../utils/find';\n\nimport topology from 'Assets/geography/texas_urban.json';\n\nimport delegates from 'Data/delegates.json';\n\nconst isIE = isThisIE();\n\ninterface ContestShowcaseProps {\n  container: Element;\n  contest: any | null;\n  showDelegates: boolean;\n  showContestTitleInShowcase: boolean;\n  notes: { [key: string]: any };\n  asOf: string;\n  annotations: { [key: string]: any };\n}\n\ninterface ContestShowcaseState {\n  contestContainer: Element;\n  mapContainer: Element;\n  countiesContainer: Element;\n}\n\nclass ContestShowcase extends Component<\n  ContestShowcaseProps,\n  ContestShowcaseState\n> {\n  projection: GeoIdentityTransform;\n  _countiesPortal: any;\n\n  constructor() {\n    super();\n\n    this.projection = geoIdentity().reflectY(true);\n  }\n\n  componentDidMount() {\n    const { container } = this.props;\n\n    const contestContainer = container.querySelector('.contest-container');\n    const mapContainer = container.querySelector('.contest-map-container');\n    const countiesContainer = container.querySelector(\n      '.contest-counties-container'\n    );\n\n    this.setState({ contestContainer, mapContainer, countiesContainer });\n  }\n\n  render() {\n    const {\n      contest,\n      asOf,\n      notes,\n      annotations,\n      showDelegates,\n      showContestTitleInShowcase,\n    } = this.props;\n    const { contestContainer, mapContainer, countiesContainer } = this.state;\n\n    // const firstShowcaseRace =\n    // const numDelegates = false;\n    //   contest && contest.office == 'President'\n    //     ? delegates[\n    //         `${contest.office.toLowerCase()}-${contest.party.toLowerCase()}`\n    //       ]\n    //     : false;\n\n\n    // const headerUsed =\n    //   showDelegates == true\n    //     ? HeadshotCandidateRow.Header_Prez\n    //     : HeadshotCandidateRow.Header;\n\n    const numDelegates = false;\n    const headerUsed = HeadshotCandidateRow.Header;\n\n    let candidateColors, sourceMap, ShowcaseRaceWinner;\n\n    if (!contest) return null;\n\n    if (contest) {\n      let candidates = contest.candidacies;\n\n      const colorLookup = [contest.office_slug, '-', contest.party].join('')\n\n      candidateColors = raceCandidateColors[colorLookup] || [];\n\n      sourceMap = contest.source;\n\n      ShowcaseRaceWinner = find(\n        candidates,\n        candidate => candidate.is_winner === true\n      );\n    }\n\n    return (\n      <span>\n        {contestContainer && (\n          <Portal\n            node={contestContainer}\n            ref={ref => (this._contestPortal = ref)}\n          >\n            <Contest\n              contest={contest}\n              contestTitle={determineContestTitle(contest)}\n              showContestTitleInShowcase={showContestTitleInShowcase}\n              isShowcaseRace\n              renderParty={party => (\n                <SeatPartyDivider\n                  partyName={party.party}\n                  partyBallot={party}\n                  isShowcaseRace\n                  annotations={annotations}\n                  notes={notes}\n                  asOf={asOf}\n                  showDelegates={showDelegates == true ? true : false}\n                  ShowcaseRaceWinner={ShowcaseRaceWinner}\n                  source={party.source}\n                  tableHeader={headerUsed}\n                  columnCount={HeadshotCandidateRow.columnCount}\n                  contestTitle={contest.office}\n                  showContestTitleInShowcase={showContestTitleInShowcase}\n                  candidateColors={candidateColors}\n                  renderCandidate={(\n                    candidate: any,\n                    idx: number,\n                    candidatesRender: any,\n                    viewAllCandidates: any,\n                    { totalVotes }: { totalVotes: number }\n                  ) => (\n                    <HeadshotCandidateRow\n                      key={candidate.id}\n                      ballotName={candidate.name}\n                      candidateId={candidate.id}\n                      office={party['office']}\n                      contestIsCalled={contest.is_called}\n                      contestResult={contest.contest_result}\n                      isIncumbent={candidate.is_incumbent}\n                      isWinner={candidate.is_winner}\n                      numDelegates={numDelegates}\n                      isViewable={\n                        viewAllCandidates || idx < visibleCandidatesCount\n                      }\n                      party={candidate.party}\n                      candidateColors={candidateColors}\n                      totalVotesInContest={totalVotes}\n                      votes={candidate.votes}\n                    />\n                  )}\n                />\n              )}\n            />\n          </Portal>\n        )}\n        {!isIE && mapContainer && (\n          <Portal node={mapContainer} ref={ref => (this._mapPortal = ref)}>\n            <LayeredMap\n              topology={topology}\n              projection={this.projection}\n              candidates={contest.candidacies}\n              candidatesRender={candidateColors}\n              source={sourceMap}\n              counties={contest.counties}\n              precinctsReporting={contest.precincts_reporting}\n              totalVotes={contest.total_votes}\n            />\n          </Portal>\n        )}\n        {countiesContainer && contest && (\n          <Portal\n            node={countiesContainer}\n            ref={ref => (this._countiesPortal = ref)}\n          >\n            <AnalysisTable\n              contest={contest}\n              candidates={contest.candidacies}\n              counties={contest.counties}\n            />\n          </Portal>\n        )}\n      </span>\n    );\n  }\n}\n\nexport default ContestShowcase;\n","'use strict';\n\n// We depend on intersection-observer enough that it should just be assumed as necessary\nrequire('intersection-observer');\n","const colors = {\n  red: '#EF564A',\n  pink: '#fcbec3',\n  orange: '#f5af76',\n  green: '#5acc7d',\n  gray: '#bababa',\n  blue: '#1755c5',\n  lightblue: '#5E9BDB',\n};\n\nconst raceCandidateColors = {\n  'us-senate-class-2-Republican': [\n    {\n      name: 'Ken Paxton',\n      color: colors.pink,\n    },\n    {\n      name: 'John Cornyn',\n      color: colors.red,\n    },\n  ],\n  'attorney-general-Democrat': [\n    {\n      name: 'Nathan Johnson',\n      color: colors.lightblue,\n    },\n    {\n      name: 'Joe Jaworski',\n      color: colors.blue,\n    },\n  ],\n  'attorney-general-Republican': [\n    {\n      name: 'Chip Roy',\n      color: colors.pink,\n    },\n    {\n      name: 'Mayes Middleton',\n      color: colors.red,\n    },\n  ],\n  'comptroller-Republican': [\n    {\n      name: 'Kelly Hancock',\n      color: colors.red,\n    },\n    {\n      name: 'Michael Berlanga',\n      color: colors.gray,\n    },\n    {\n      name: 'Christi Craddick',\n      color: colors.orange,\n    },\n    {\n      name: 'Don Huffines',\n      color: colors.pink,\n    },\n  ],\n};\n\nexport default raceCandidateColors;\n","import { Component, h, render } from 'preact';\n\nclass Portal extends Component {\n  componentDidMount() {\n    this.renderPortal();\n  }\n\n  componentWillUnmount() {\n    if (this.defaultNode) {\n      document.body.removeChild(this.defaultNode);\n    } else {\n      // Unmount the children rendered in custom node\n      render(null, this.props.node, this.portal);\n    }\n\n    this.defaultNode = null;\n    this.portal = null;\n  }\n\n  componentDidUpdate() {\n    this.renderPortal();\n  }\n\n  renderPortal() {\n    if (!this.props.node && !this.defaultNode) {\n      this.defaultNode = document.createElement('div');\n      document.body.appendChild(this.defaultNode);\n    }\n\n    const children = this.props.children;\n\n    this.portal = render(\n      (children && children[0]) || null,\n      this.props.node || this.defaultNode,\n      this.portal\n    );\n  }\n\n  render() {\n    return null;\n  }\n}\n\nexport default Portal;\n","import { h, render } from 'preact';\n\n// just in case this gets removed\nwindow.ttData = window.ttData || {};\n\n// related content\nconst relatedContentContainer = document.getElementById(\n  'related-content-container'\n);\n\nif (relatedContentContainer && window.ttData.related_category) {\n  import(\n    /* webpackChunkName: \"RelatedContent\" */ './components/RelatedContent'\n  ).then(({ default: RelatedContent }) =>\n    render(\n      <RelatedContent\n        title={'Read more'}\n        related_category={window.ttData.related_category}\n      />,\n      relatedContentContainer\n    )\n  );\n}\n\n// trending ribbon\n// const ribbonContainer = document.getElementById('ribbon-container');\n\n// if (ribbonContainer) {\n//   import(/* webpackChunkName: \"Ribbon\" */ './components/Ribbon').then(\n//     ({ default: Ribbon }) => render(<Ribbon />, ribbonContainer)\n//   );\n// }\n\n// ads\nimport(/* webpackChunkName: \"ads\" */ './utils/ad-loader').then(\n  ({ default: AdLoader }) => {\n    const ads = new AdLoader({\n      targetingKey: 'tribpedia',\n      targetingValue: window.ttData.targetingValue,\n    });\n    ads.init();\n  }\n);\n","const RE_NUM = /[\\-+]?(?:\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/.source;\n\nfunction getClientPosition(elem) {\n  let box;\n  let x;\n  let y;\n  const doc = elem.ownerDocument;\n  const body = doc.body;\n  const docElem = doc && doc.documentElement;\n  // 根据 GBS 最新数据，A-Grade Browsers 都已支持 getBoundingClientRect 方法，不用再考虑传统的实现方式\n  box = elem.getBoundingClientRect();\n\n  // 注：jQuery 还考虑减去 docElem.clientLeft/clientTop\n  // 但测试发现，这样反而会导致当 html 和 body 有边距/边框样式时，获取的值不正确\n  // 此外，ie6 会忽略 html 的 margin 值，幸运地是没有谁会去设置 html 的 margin\n\n  x = box.left;\n  y = box.top;\n\n  // In IE, most of the time, 2 extra pixels are added to the top and left\n  // due to the implicit 2-pixel inset border.  In IE6/7 quirks mode and\n  // IE6 standards mode, this border can be overridden by setting the\n  // document element's border to zero -- thus, we cannot rely on the\n  // offset always being 2 pixels.\n\n  // In quirks mode, the offset can be determined by querying the body's\n  // clientLeft/clientTop, but in standards mode, it is found by querying\n  // the document element's clientLeft/clientTop.  Since we already called\n  // getClientBoundingRect we have already forced a reflow, so it is not\n  // too expensive just to query them all.\n\n  // ie 下应该减去窗口的边框吧，毕竟默认 absolute 都是相对窗口定位的\n  // 窗口边框标准是设 documentElement ,quirks 时设置 body\n  // 最好禁止在 body 和 html 上边框 ，但 ie < 9 html 默认有 2px ，减去\n  // 但是非 ie 不可能设置窗口边框，body html 也不是窗口 ,ie 可以通过 html,body 设置\n  // 标准 ie 下 docElem.clientTop 就是 border-top\n  // ie7 html 即窗口边框改变不了。永远为 2\n  // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框，即使设了 border-top 也为 0\n\n  x -= docElem.clientLeft || body.clientLeft || 0;\n  y -= docElem.clientTop || body.clientTop || 0;\n\n  return {\n    left: x,\n    top: y,\n  };\n}\n\nfunction getScroll(w, top) {\n  let ret = w[`page${top ? 'Y' : 'X'}Offset`];\n  const method = `scroll${top ? 'Top' : 'Left'}`;\n  if (typeof ret !== 'number') {\n    const d = w.document;\n    // ie6,7,8 standard mode\n    ret = d.documentElement[method];\n    if (typeof ret !== 'number') {\n      // quirks mode\n      ret = d.body[method];\n    }\n  }\n  return ret;\n}\n\nfunction getScrollLeft(w) {\n  return getScroll(w);\n}\n\nfunction getScrollTop(w) {\n  return getScroll(w, true);\n}\n\nfunction getOffset(el) {\n  const pos = getClientPosition(el);\n  const doc = el.ownerDocument;\n  const w = doc.defaultView || doc.parentWindow;\n  pos.left += getScrollLeft(w);\n  pos.top += getScrollTop(w);\n  return pos;\n}\nfunction _getComputedStyle(elem, name, computedStyle_) {\n  let val = '';\n  const d = elem.ownerDocument;\n  const computedStyle =\n    computedStyle_ || d.defaultView.getComputedStyle(elem, null);\n\n  // https://github.com/kissyteam/kissy/issues/61\n  if (computedStyle) {\n    val = computedStyle.getPropertyValue(name) || computedStyle[name];\n  }\n\n  return val;\n}\n\nconst _RE_NUM_NO_PX = new RegExp(`^(${RE_NUM})(?!px)[a-z%]+$`, 'i');\nconst RE_POS = /^(top|right|bottom|left)$/;\nconst CURRENT_STYLE = 'currentStyle';\nconst RUNTIME_STYLE = 'runtimeStyle';\nconst LEFT = 'left';\nconst PX = 'px';\n\nfunction _getComputedStyleIE(elem, name) {\n  // currentStyle maybe null\n  // http://msdn.microsoft.com/en-us/library/ms535231.aspx\n  let ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name];\n\n  // 当 width/height 设置为百分比时，通过 pixelLeft 方式转换的 width/height 值\n  // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19\n  // 在 ie 下不对，需要直接用 offset 方式\n  // borderWidth 等值也有问题，但考虑到 borderWidth 设为百分比的概率很小，这里就不考虑了\n\n  // From the awesome hack by Dean Edwards\n  // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n  // If we're not dealing with a regular pixel number\n  // but a number that has a weird ending, we need to convert it to pixels\n  // exclude left right for relativity\n  if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) {\n    // Remember the original values\n    const style = elem.style;\n    const left = style[LEFT];\n    const rsLeft = elem[RUNTIME_STYLE][LEFT];\n\n    // prevent flashing of content\n    elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT];\n\n    // Put in the new values to get a computed value out\n    style[LEFT] = name === 'fontSize' ? '1em' : ret || 0;\n    ret = style.pixelLeft + PX;\n\n    // Revert the changed values\n    style[LEFT] = left;\n\n    elem[RUNTIME_STYLE][LEFT] = rsLeft;\n  }\n  return ret === '' ? 'auto' : ret;\n}\n\nlet getComputedStyleX;\nif (typeof window !== 'undefined') {\n  getComputedStyleX = window.getComputedStyle\n    ? _getComputedStyle\n    : _getComputedStyleIE;\n}\n\nfunction each(arr, fn) {\n  for (let i = 0; i < arr.length; i++) {\n    fn(arr[i]);\n  }\n}\n\nfunction isBorderBoxFn(elem) {\n  return getComputedStyleX(elem, 'boxSizing') === 'border-box';\n}\n\nconst BOX_MODELS = ['margin', 'border', 'padding'];\nconst CONTENT_INDEX = -1;\nconst PADDING_INDEX = 2;\nconst BORDER_INDEX = 1;\nconst MARGIN_INDEX = 0;\n\nfunction swap(elem, options, callback) {\n  const old = {};\n  const style = elem.style;\n  let name;\n\n  // Remember the old values, and insert the new ones\n  for (name in options) {\n    if (options.hasOwnProperty(name)) {\n      old[name] = style[name];\n      style[name] = options[name];\n    }\n  }\n\n  callback.call(elem);\n\n  // Revert the old values\n  for (name in options) {\n    if (options.hasOwnProperty(name)) {\n      style[name] = old[name];\n    }\n  }\n}\n\nfunction getPBMWidth(elem, props, which) {\n  let value = 0;\n  let prop;\n  let j;\n  let i;\n  for (j = 0; j < props.length; j++) {\n    prop = props[j];\n    if (prop) {\n      for (i = 0; i < which.length; i++) {\n        let cssProp;\n        if (prop === 'border') {\n          cssProp = `${prop + which[i]}Width`;\n        } else {\n          cssProp = prop + which[i];\n        }\n        value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;\n      }\n    }\n  }\n  return value;\n}\n\n/**\n * A crude way of determining if an object is a window\n * @member util\n */\nfunction isWindow(obj) {\n  // must use == for ie8\n  /* eslint eqeqeq:0 */\n  return obj != null && obj == obj.window;\n}\n\nconst domUtils = {};\n\neach(['Width', 'Height'], name => {\n  domUtils[`doc${name}`] = refWin => {\n    const d = refWin.document;\n    return Math.max(\n      // firefox chrome documentElement.scrollHeight< body.scrollHeight\n      // ie standard mode : documentElement.scrollHeight> body.scrollHeight\n      d.documentElement[`scroll${name}`],\n      // quirks : documentElement.scrollHeight 最大等于可视窗口多一点？\n      d.body[`scroll${name}`],\n      domUtils[`viewport${name}`](d),\n    );\n  };\n\n  domUtils[`viewport${name}`] = win => {\n    // pc browser includes scrollbar in window.innerWidth\n    const prop = `client${name}`;\n    const doc = win.document;\n    const body = doc.body;\n    const documentElement = doc.documentElement;\n    const documentElementProp = documentElement[prop];\n    // 标准模式取 documentElement\n    // backcompat 取 body\n    return (\n      (doc.compatMode === 'CSS1Compat' && documentElementProp) ||\n      (body && body[prop]) ||\n      documentElementProp\n    );\n  };\n});\n\n/*\n 得到元素的大小信息\n @param elem\n @param name\n @param {String} [extra]  'padding' : (css width) + padding\n 'border' : (css width) + padding + border\n 'margin' : (css width) + padding + border + margin\n */\nfunction getWH(elem, name, extra) {\n  if (isWindow(elem)) {\n    return name === 'width'\n      ? domUtils.viewportWidth(elem)\n      : domUtils.viewportHeight(elem);\n  } else if (elem.nodeType === 9) {\n    return name === 'width'\n      ? domUtils.docWidth(elem)\n      : domUtils.docHeight(elem);\n  }\n  const which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n  let borderBoxValue = name === 'width' ? elem.offsetWidth : elem.offsetHeight;\n  const computedStyle = getComputedStyleX(elem);\n  const isBorderBox = isBorderBoxFn(elem, computedStyle);\n  let cssBoxValue = 0;\n  if (borderBoxValue == null || borderBoxValue <= 0) {\n    borderBoxValue = undefined;\n    // Fall back to computed then un computed css if necessary\n    cssBoxValue = getComputedStyleX(elem, name);\n    if (cssBoxValue == null || Number(cssBoxValue) < 0) {\n      cssBoxValue = elem.style[name] || 0;\n    }\n    // Normalize '', auto, and prepare for extra\n    cssBoxValue = parseFloat(cssBoxValue) || 0;\n  }\n  if (extra === undefined) {\n    extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;\n  }\n  const borderBoxValueOrIsBorderBox =\n    borderBoxValue !== undefined || isBorderBox;\n  const val = borderBoxValue || cssBoxValue;\n  if (extra === CONTENT_INDEX) {\n    if (borderBoxValueOrIsBorderBox) {\n      return (\n        val - getPBMWidth(elem, ['border', 'padding'], which, computedStyle)\n      );\n    }\n    return cssBoxValue;\n  }\n  if (borderBoxValueOrIsBorderBox) {\n    const padding =\n      extra === PADDING_INDEX\n        ? -getPBMWidth(elem, ['border'], which, computedStyle)\n        : getPBMWidth(elem, ['margin'], which, computedStyle);\n    return val + (extra === BORDER_INDEX ? 0 : padding);\n  }\n  return (\n    cssBoxValue +\n    getPBMWidth(elem, BOX_MODELS.slice(extra), which, computedStyle)\n  );\n}\n\nconst cssShow = {\n  position: 'absolute',\n  visibility: 'hidden',\n  display: 'block',\n};\n\n// fix #119 : https://github.com/kissyteam/kissy/issues/119\nfunction getWHIgnoreDisplay(elem) {\n  let val;\n  const args = arguments;\n  // in case elem is window\n  // elem.offsetWidth === undefined\n  if (elem.offsetWidth !== 0) {\n    val = getWH.apply(undefined, args);\n  } else {\n    swap(elem, cssShow, () => {\n      val = getWH.apply(undefined, args);\n    });\n  }\n  return val;\n}\n\nfunction css(el, name, v) {\n  let value = v;\n  if (typeof name === 'object') {\n    for (const i in name) {\n      if (name.hasOwnProperty(i)) {\n        css(el, i, name[i]);\n      }\n    }\n    return undefined;\n  }\n  if (typeof value !== 'undefined') {\n    if (typeof value === 'number') {\n      value += 'px';\n    }\n    el.style[name] = value;\n    return undefined;\n  }\n  return getComputedStyleX(el, name);\n}\n\neach(['width', 'height'], name => {\n  const first = name.charAt(0).toUpperCase() + name.slice(1);\n  domUtils[`outer${first}`] = (el, includeMargin) => {\n    return (\n      el &&\n      getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX)\n    );\n  };\n  const which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n\n  domUtils[name] = (elem, val) => {\n    if (val !== undefined) {\n      if (elem) {\n        const computedStyle = getComputedStyleX(elem);\n        const isBorderBox = isBorderBoxFn(elem);\n        if (isBorderBox) {\n          val += getPBMWidth(elem, ['padding', 'border'], which, computedStyle);\n        }\n        return css(elem, name, val);\n      }\n      return undefined;\n    }\n    return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX);\n  };\n});\n\n// 设置 elem 相对 elem.ownerDocument 的坐标\nfunction setOffset(elem, offset) {\n  // set position first, in-case top/left are set even on static elem\n  if (css(elem, 'position') === 'static') {\n    elem.style.position = 'relative';\n  }\n\n  const old = getOffset(elem);\n  const ret = {};\n  let current;\n  let key;\n\n  for (key in offset) {\n    if (offset.hasOwnProperty(key)) {\n      current = parseFloat(css(elem, key)) || 0;\n      ret[key] = current + offset[key] - old[key];\n    }\n  }\n  css(elem, ret);\n}\n\nexport default {\n  getWindow(node) {\n    const doc = node.ownerDocument || node;\n    return doc.defaultView || doc.parentWindow;\n  },\n  offset(el, value) {\n    if (typeof value !== 'undefined') {\n      setOffset(el, value);\n    } else {\n      return getOffset(el);\n    }\n  },\n  isWindow,\n  each,\n  css,\n  clone(obj) {\n    const ret = {};\n    for (const i in obj) {\n      if (obj.hasOwnProperty(i)) {\n        ret[i] = obj[i];\n      }\n    }\n    const overflow = obj.overflow;\n    if (overflow) {\n      for (const i in obj) {\n        if (obj.hasOwnProperty(i)) {\n          ret.overflow[i] = obj.overflow[i];\n        }\n      }\n    }\n    return ret;\n  },\n  scrollLeft(w, v) {\n    if (isWindow(w)) {\n      if (v === undefined) {\n        return getScrollLeft(w);\n      }\n      window.scrollTo(v, getScrollTop(w));\n    } else {\n      if (v === undefined) {\n        return w.scrollLeft;\n      }\n      w.scrollLeft = v;\n    }\n  },\n  scrollTop(w, v) {\n    if (isWindow(w)) {\n      if (v === undefined) {\n        return getScrollTop(w);\n      }\n      window.scrollTo(getScrollLeft(w), v);\n    } else {\n      if (v === undefined) {\n        return w.scrollTop;\n      }\n      w.scrollTop = v;\n    }\n  },\n  viewportWidth: 0,\n  viewportHeight: 0,\n  ...domUtils,\n};\n","import util from './util';\n\nfunction scrollIntoView(elem, container, config) {\n  config = config || {};\n  // document 归一化到 window\n  if (container.nodeType === 9) {\n    container = util.getWindow(container);\n  }\n\n  let allowHorizontalScroll = config.allowHorizontalScroll;\n  const onlyScrollIfNeeded = config.onlyScrollIfNeeded;\n  let alignWithTop = config.alignWithTop;\n  let alignWithLeft = config.alignWithLeft;\n  const offsetTop = config.offsetTop || 0;\n  const offsetLeft = config.offsetLeft || 0;\n  const offsetBottom = config.offsetBottom || 0;\n  const offsetRight = config.offsetRight || 0;\n\n  allowHorizontalScroll =\n    allowHorizontalScroll === undefined ? true : allowHorizontalScroll;\n\n  const isWin = util.isWindow(container);\n  const elemOffset = util.offset(elem);\n  const eh = util.outerHeight(elem);\n  const ew = util.outerWidth(elem);\n  let containerOffset;\n  let ch;\n  let cw;\n  let containerScroll;\n  let diffTop;\n  let diffBottom;\n  let win;\n  let winScroll;\n  let ww;\n  let wh;\n\n  if (isWin) {\n    win = container;\n    wh = util.height(win);\n    ww = util.width(win);\n    winScroll = {\n      left: util.scrollLeft(win),\n      top: util.scrollTop(win),\n    };\n    // elem 相对 container 可视视窗的距离\n    diffTop = {\n      left: elemOffset.left - winScroll.left - offsetLeft,\n      top: elemOffset.top - winScroll.top - offsetTop,\n    };\n    diffBottom = {\n      left: elemOffset.left + ew - (winScroll.left + ww) + offsetRight,\n      top: elemOffset.top + eh - (winScroll.top + wh) + offsetBottom,\n    };\n    containerScroll = winScroll;\n  } else {\n    containerOffset = util.offset(container);\n    ch = container.clientHeight;\n    cw = container.clientWidth;\n    containerScroll = {\n      left: container.scrollLeft,\n      top: container.scrollTop,\n    };\n    // elem 相对 container 可视视窗的距离\n    // 注意边框, offset 是边框到根节点\n    diffTop = {\n      left:\n        elemOffset.left -\n        (containerOffset.left +\n          (parseFloat(util.css(container, 'borderLeftWidth')) || 0)) -\n        offsetLeft,\n      top:\n        elemOffset.top -\n        (containerOffset.top +\n          (parseFloat(util.css(container, 'borderTopWidth')) || 0)) -\n        offsetTop,\n    };\n    diffBottom = {\n      left:\n        elemOffset.left +\n        ew -\n        (containerOffset.left +\n          cw +\n          (parseFloat(util.css(container, 'borderRightWidth')) || 0)) +\n        offsetRight,\n      top:\n        elemOffset.top +\n        eh -\n        (containerOffset.top +\n          ch +\n          (parseFloat(util.css(container, 'borderBottomWidth')) || 0)) +\n        offsetBottom,\n    };\n  }\n\n  if (diffTop.top < 0 || diffBottom.top > 0) {\n    // 强制向上\n    if (alignWithTop === true) {\n      util.scrollTop(container, containerScroll.top + diffTop.top);\n    } else if (alignWithTop === false) {\n      util.scrollTop(container, containerScroll.top + diffBottom.top);\n    } else {\n      // 自动调整\n      if (diffTop.top < 0) {\n        util.scrollTop(container, containerScroll.top + diffTop.top);\n      } else {\n        util.scrollTop(container, containerScroll.top + diffBottom.top);\n      }\n    }\n  } else {\n    if (!onlyScrollIfNeeded) {\n      alignWithTop = alignWithTop === undefined ? true : !!alignWithTop;\n      if (alignWithTop) {\n        util.scrollTop(container, containerScroll.top + diffTop.top);\n      } else {\n        util.scrollTop(container, containerScroll.top + diffBottom.top);\n      }\n    }\n  }\n\n  if (allowHorizontalScroll) {\n    if (diffTop.left < 0 || diffBottom.left > 0) {\n      // 强制向上\n      if (alignWithLeft === true) {\n        util.scrollLeft(container, containerScroll.left + diffTop.left);\n      } else if (alignWithLeft === false) {\n        util.scrollLeft(container, containerScroll.left + diffBottom.left);\n      } else {\n        // 自动调整\n        if (diffTop.left < 0) {\n          util.scrollLeft(container, containerScroll.left + diffTop.left);\n        } else {\n          util.scrollLeft(container, containerScroll.left + diffBottom.left);\n        }\n      }\n    } else {\n      if (!onlyScrollIfNeeded) {\n        alignWithLeft = alignWithLeft === undefined ? true : !!alignWithLeft;\n        if (alignWithLeft) {\n          util.scrollLeft(container, containerScroll.left + diffTop.left);\n        } else {\n          util.scrollLeft(container, containerScroll.left + diffBottom.left);\n        }\n      }\n    }\n  }\n}\n\nexport default scrollIntoView;\n","export default function debounce(func, wait, immediate) {\n  var timeout, args, context, timestamp, result;\n\n  var later = function() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      }\n    }\n  };\n\n  return function() {\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n}\n","export default () => {};\n","// packages\nimport { cloneElement, Component, h } from 'preact';\nimport scrollIntoView from 'dom-scroll-into-view';\n\n// internal\nimport debounce from '../utils/debounce';\nimport noop from '../utils/noop';\n\nclass Typeahead extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      highlightedIndex: null,\n      isOpen: false,\n    };\n\n    this.handleOnBlur = this.handleOnBlur.bind(this);\n    this.handleOnClear = this.handleOnClear.bind(this);\n    this.handleOnFocus = this.handleOnFocus.bind(this);\n    this.handleOnInput = this.handleOnInput.bind(this);\n    this.debouncedHandleOnInput = debounce(\n      this.handleOnInput,\n      this.props.debounceDuration\n    );\n    this.handleKeyDown = this.handleKeyDown.bind(this);\n    this.setInputRef = this.setInputRef.bind(this);\n    this.setMenuRef = this.setMenuRef.bind(this);\n    this.setItemRef = this.setItemRef.bind(this);\n\n    this.listRefs = {};\n  }\n\n  static getDerivedStateFromProps(_, prevState) {\n    if (prevState.highlightedIndex == null) {\n      return { highlightedIndex: 0 };\n    }\n  }\n\n  componentDidUpdate() {\n    const { highlightedIndex } = this.state;\n    const count = this.getFilteredItems(this.props).length;\n\n    if (Boolean(highlightedIndex) && highlightedIndex >= count) {\n      this.setState({ highlightedIndex: 0 });\n    }\n\n    this.maybeScrollItemIntoView();\n  }\n\n  setInputRef(element) {\n    this.inputRef = element;\n  }\n\n  setMenuRef(element) {\n    this.menuRef = element;\n  }\n\n  setItemRef(element, idx) {\n    this.listRefs[`item-${idx}`] = element;\n  }\n\n  maybeScrollItemIntoView() {\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (isOpen && highlightedIndex != null) {\n      const itemNode = this.listRefs[`item-${this.state.highlightedIndex}`];\n      const menuNode = this.menuRef;\n\n      if (itemNode && menuNode) {\n        scrollIntoView(itemNode, menuNode, {\n          onlyScrollIfNeeded: true,\n        });\n      }\n    }\n  }\n\n  getFilteredItems(props) {\n    let { items } = props;\n\n    const { shouldItemRender, sortItems } = props;\n\n    if (shouldItemRender) {\n      items = items.filter(item => shouldItemRender(item, props.value));\n    }\n\n    if (sortItems) {\n      items = items.sort((a, b) => sortItems(a, b, props.value));\n    }\n\n    return items;\n  }\n\n  highlightItemOnMouseEnter(highlightedIndex) {\n    this.setState({ highlightedIndex });\n  }\n\n  selectItemOnClick(item) {\n    const { getItemValue, onSelect } = this.props;\n\n    const value = getItemValue(item);\n\n    this.setState(\n      {\n        highlightedIndex: null,\n        isOpen: false,\n      },\n      () => {\n        this.inputRef.blur();\n        onSelect(value, item);\n      }\n    );\n  }\n\n  renderList() {\n    const { highlightedIndex } = this.state;\n    const props = this.props;\n\n    if (!props.value) return null;\n\n    const items = this.getFilteredItems(props);\n\n    return (\n      <ul\n        class=\"listbox\"\n        ref={this.setMenuRef}\n        onMouseDown={event => event.preventDefault()}\n      >\n        {items.map((item, idx) => {\n          return cloneElement(\n            props.renderItem(item, idx === highlightedIndex),\n            {\n              onClick: () => this.selectItemOnClick(item),\n              onMouseEnter: () => this.highlightItemOnMouseEnter(idx),\n              ref: el => this.setItemRef(el, idx),\n            }\n          );\n        })}\n        {items.length > 0 && props.renderAttribution()}\n      </ul>\n    );\n  }\n\n  handleOnClear(event) {\n    this.setState({ isOpen: false });\n\n    this.props.onClear(event);\n  }\n\n  handleOnBlur() {\n    this.setState({ isOpen: false });\n\n    const { onBlur } = this.props.inputProps;\n    if (onBlur) onBlur(event);\n  }\n\n  handleOnFocus(event) {\n    const { value } = this.props;\n\n    if (value.length > 0) this.setState({ isOpen: true });\n\n    const { onFocus } = this.props.inputProps;\n    if (onFocus) onFocus(event);\n  }\n\n  handleOnInput(event) {\n    const { value } = event.target;\n\n    this.props.onChange(value, event);\n\n    if (value.length <= 0) {\n      this.setState({ highlightedIndex: null });\n    }\n  }\n\n  handleKeyDown(event) {\n    const { isOpen } = this.state;\n\n    if (isOpen && Typeahead.keyEvents[event.key]) {\n      Typeahead.keyEvents[event.key].call(this, event);\n    } else if (!isOpen) {\n      this.setState({ isOpen: true });\n    }\n  }\n\n  render() {\n    const { inputProps, onClear, renderInput, value } = this.props;\n    const { isOpen } = this.state;\n\n    return (\n      <div class=\"typeahead\">\n        <div class=\"typeahead__input-wrapper\">\n          {renderInput({\n            ...inputProps,\n            role: 'combobox',\n            'aria-autocomplete': 'list',\n            'aria-expanded': String(isOpen),\n            autocomplete: 'off',\n            onBlur: this.handleOnBlur,\n            onFocus: this.handleOnFocus,\n            onInput: this.handleOnInput,\n            onKeyDown: this.handleKeyDown,\n            value,\n            ref: this.setInputRef,\n          })}\n          {onClear && value && (\n            <button\n              onClick={this.handleOnClear}\n              type=\"button\"\n              class=\"close\"\n              aria-label=\"Clear\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n          )}\n        </div>\n        {isOpen && this.renderList()}\n      </div>\n    );\n  }\n}\n\nTypeahead.defaultProps = {\n  debounceDuration: 150,\n  inputProps: {},\n  onChange: noop,\n  onClear: noop,\n  onSelect: noop,\n  renderInput: props => <input {...props} />,\n  value: '',\n};\n\nTypeahead.keyEvents = {\n  ArrowDown(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex < itemsCount - 1\n        ? highlightedIndex + 1\n        : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  ArrowUp(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex > 0 ? highlightedIndex - 1 : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  Enter(event) {\n    // not the right kind of Enter, abort\n    if (event.keyCode !== 13) return;\n\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (!isOpen) {\n      // the menu is not open\n      return;\n    } else if (highlightedIndex == null) {\n      // input has control, but there's nothing selected\n      this.setState({ isOpen: false }, () => this.inputRef.select());\n    } else {\n      // the input has control and we have an item\n      event.preventDefault();\n\n      const item = this.getFilteredItems(this.props)[highlightedIndex];\n      const value = this.props.getItemValue(item);\n\n      this.setState(\n        {\n          highlightedIndex: null,\n          isOpen: false,\n        },\n        () => {\n          this.inputRef.setSelectionRange(value.length, value.length);\n          this.props.onSelect(value, item);\n        }\n      );\n    }\n  },\n\n  Escape() {\n    this.setState({\n      highlightedIndex: null,\n      isOpen: false,\n    });\n  },\n};\n\nexport default Typeahead;\n","// packages\nimport cx from 'classnames';\nimport { get, set } from '../vendor/idb-keyval';\nimport { h } from 'preact';\n\n// components\nimport CandidateRow from './CandidateRow';\nimport Contest from './Contest';\nimport SeatPartyDivider from './SeatPartyDivider';\nimport Portal from './Portal';\nimport PureComponent from './PureComponent';\nimport Typeahead from './Typeahead';\n\n// internal\nimport debounce from '../utils/debounce';\nimport { determineContestTitleYourRaces } from '../election-utils';\nimport { visibleCandidatesCount } from '../endpoints';\nimport { lookup } from '../utils/legislative-districts';\nimport loadAssetURL from '../utils/load-asset-url';\n\nconst googleIMG = loadAssetURL('powered-by-google');\n\nlet PlacesLib = null; // { AutocompleteSessionToken, AutocompleteSuggestion, Place } loaded via importLibrary()\n\nconst bounds = {\n  east: -93.514764,\n  west: -106.662177,\n  south: 25.843902,\n  north: 36.500199,\n};\n\nconst toLocationRestriction = b => ({\n  west: b.west,\n  east: b.east,\n  south: b.south,\n  north: b.north,\n});\n\nconst getPredictions = async (input, sessionToken) => {\n  if (!input || input.trim().length < 2) return [];\n\n  const request = {\n    input,\n    locationRestriction: toLocationRestriction(bounds),\n    includedPrimaryTypes: ['street_address', 'premise', 'route'],\n    region: 'us',\n    sessionToken,\n  };\n\n  const {\n    suggestions,\n  } = await PlacesLib.AutocompleteSuggestion.fetchAutocompleteSuggestions(\n    request\n  );\n\n  return suggestions.map(s => ({\n    id: s.placePrediction.placeId,\n    description: s.placePrediction.text.toString(),\n    place_id: s.placePrediction.placeId,\n    _prediction: s.placePrediction,\n  }));\n};\n\n// always render what's provided, the geocoder decides\nconst shouldItemRender = () => true;\n\nclass YourRaces extends PureComponent {\n  constructor() {\n    super();\n\n    this.state = {\n      contests: [],\n      coordinates: null,\n      data: null,\n      lookupError: false,\n      lookupPending: false,\n      lookedFoundStored: false,\n      redirectFish: false,\n      results: [],\n      value: '',\n      // default placeholder\n      placeholder: '1010 Colorado St, Austin, TX, 78701',\n    };\n\n    this.handleGeocode = this.handleGeocode.bind(this);\n    this.debouncedHandleGeocode = debounce(this.handleGeocode, 300);\n    this.onChange = this.onChange.bind(this);\n    this.onClear = this.onClear.bind(this);\n    this.onSelect = this.onSelect.bind(this);\n    this.sessionToken = null;\n  }\n\n  onClear(value) {\n    this.setState({ value: '' });\n  }\n\n  onChange(value) {\n    this.setState({ value }, this.debouncedHandleGeocode);\n  }\n\n  async handleGeocode() {\n    if (!PlacesLib) return;\n    const { value: input } = this.state;\n    try {\n      const results = await getPredictions(input, this.sessionToken);\n      this.setState({ results });\n    } catch (e) {\n      this.setState({ results: [] });\n    }\n  }\n\n  async onSelect({ name, placeId, _prediction }) {\n    this.setState({ lookupError: false, lookupPending: true, value: name });\n\n    try {\n      // New flow: prediction -> Place -> fetchFields({ fields: ['location'] })\n      const place = _prediction\n        ? _prediction.toPlace()\n        : new PlacesLib.Place({ id: placeId });\n\n      await place.fetchFields({ fields: ['location'] }); // ends the session\n\n      const latLng = place.location;\n      const coordinates = {\n        latitude: typeof latLng.lat === 'function' ? latLng.lat() : latLng.lat,\n        longitude: typeof latLng.lng === 'function' ? latLng.lng() : latLng.lng,\n      };\n\n      // Reset session so the next keystroke starts a fresh token\n      this.sessionToken = null;\n\n      lookup(coordinates)\n        .then(({ data }) => {\n          this.setState({\n            coordinates,\n            data,\n            lookupPending: false,\n            lookedFoundStored: false,\n          });\n        })\n        .catch(() =>\n          this.setState({\n            data: null,\n            lookupError: true,\n            lookupPending: false,\n          })\n        );\n    } catch (e) {\n      this.setState({\n        data: null,\n        lookupError: true,\n        lookupPending: false,\n      });\n      this.sessionToken = null;\n    }\n  }\n\n  async componentDidMount() {\n    // New: load the modern Places library classes\n    // eslint-disable-next-line no-undef\n    PlacesLib = await google.maps.importLibrary('places');\n\n    // // If we ever wanted to show a default location, coordinates for Governor mansion in Austin\n    // let latitude = 30.2730665;\n    // let longitude = -97.74341629999999;\n    // let coordinates = { latitude, longitude };\n\n    // lookup(coordinates)\n    //   .then(({ data }) => {\n    //     this.setState({\n    //       coordinates,\n    //       data,\n    //       lookupPending: false,\n    //       lookedFoundStored: false,\n    //     });\n    //   })\n    //   .catch(() =>\n    //     this.setState({\n    //       data: null,\n    //       lookupError: true,\n    //       lookupPending: false,\n    //     })\n    //   );  }\n  }\n\n  render() {\n    const { contests, notes, annotations, asOf } = this.props;\n    const {\n      coordinates,\n      data,\n      lookupError,\n      lookupPending,\n      lookedFoundStored,\n      results,\n      value,\n      placeholder,\n      redirectFish,\n    } = this.state;\n\n    let addressFeedback = null;\n\n    const matches = {\n      'us-house': null,\n      sboe: null,\n      'tx-senate': null,\n      'tx-house': null,\n    };\n\n    const noteMatches = {\n      'us-house': null,\n      sboe: null,\n      'tx-senate': null,\n      'tx-house': null,\n    };\n\n    const annoMatches = {\n      'us-house': null,\n      sboe: null,\n      'tx-senate': null,\n      'tx-house': null,\n    };\n\n    if (data) {\n      const excludedUsHouseGopSlugs = [\n        'us-house-district-23',\n        'us-house-district-32',\n      ];\n\n      matches['us-house'] = contests.filter(\n        contest =>\n          contest.office === 'U.S. House' &&\n          contest.office_division === data.us_house.district &&\n          !(\n            contest.party === 'Republican' &&\n            excludedUsHouseGopSlugs.includes(contest.office_slug)\n          )\n      );\n\n      matches['sboe'] = contests.filter(\n        contest =>\n          contest.office === 'State Board of Education' &&\n          contest.office_division === data.sboe.district\n      );\n\n      matches['tx-senate'] = contests.filter(\n        contest =>\n          contest.office === 'Texas Senate' &&\n          contest.office_division === data.tx_senate.district\n      );\n\n      matches['tx-house'] = contests.filter(\n        contest =>\n          contest.office === 'Texas House' &&\n          contest.office_division === data.tx_house.district\n      );\n\n      noteMatches['us-house'] = notes.filter(\n        contest =>\n          contest.type ===\n            'us-house-district-' + data.us_house.district + '-Democrat' ||\n          contest.type ===\n            'us-house-district-' + data.us_house.district + '-Republican'\n      );\n\n      noteMatches['sboe'] = notes.filter(\n        contest =>\n          contest.type ===\n            'state-board-of-education-district-' +\n              data.sboe.district +\n              '-Democrat' ||\n          contest.type ===\n            'state-board-of-education-district-' +\n              data.sboe.district +\n              '-Republican'\n      );\n\n      noteMatches['tx-senate'] = notes.filter(\n        contest =>\n          contest.type ===\n            'texas-senate-district-' + data.tx_senate.district + '-Democrat' ||\n          contest.type ===\n            'texas-senate-district-' + data.tx_senate.district + '-Republican'\n      );\n\n      noteMatches['tx-house'] = notes.filter(\n        contest =>\n          contest.type ===\n            'texas-house-district-' + data.tx_house.district + '-Democrat' ||\n          contest.type ===\n            'texas-house-district-' + data.tx_house.district + '-Republican'\n      );\n\n      annoMatches['us-house'] = annotations.filter(\n        contest =>\n          contest.type ===\n            'us-house-district-' + data.us_house.district + '-Democrat' ||\n          contest.type ===\n            'us-house-district-' + data.us_house.district + '-Republican'\n      );\n\n      annoMatches['sboe'] = annotations.filter(\n        contest =>\n          contest.type ===\n            'state-board-of-education-district-' +\n              data.sboe.district +\n              '-Democrat' ||\n          contest.type ===\n            'state-board-of-education-district-' +\n              data.sboe.district +\n              '-Republican'\n      );\n\n      annoMatches['tx-senate'] = annotations.filter(\n        contest =>\n          contest.type ===\n            'texas-senate-district-' + data.tx_senate.district + '-Democrat' ||\n          contest.type ===\n            'texas-senate-district-' + data.tx_senate.district + '-Republican'\n      );\n\n      annoMatches['tx-house'] = annotations.filter(\n        contest =>\n          contest.type ===\n            'texas-house-district-' + data.tx_house.district + '-Democrat' ||\n          contest.type ===\n            'texas-house-district-' + data.tx_house.district + '-Republican'\n      );\n    }\n\n    if (lookupPending) {\n      addressFeedback = (\n        <p class=\"has-padding t-serif t-weight-bold t-align-center\">\n          Finding your details...{' '}\n          <svg class=\"icon icon-spinner animate-pulse\">\n            <use xlinkHref=\"#icon-spinner\" />\n          </svg>\n        </p>\n      );\n    }\n\n    if (lookupError) {\n      addressFeedback = (\n        <p class=\"has-padding t-serif t-weight-bold t-align-center\">\n          Hmm... we were unable to find you in Texas. Please check your address\n          and try again!\n        </p>\n      );\n    }\n\n    if ((coordinates && !lookupPending && !lookupError) || redirectFish) {\n      addressFeedback = (\n        <p class=\"has-padding t-serif t-weight-bold t-align-center\">\n          We found your information! These races have been personalized for you.\n        </p>\n      );\n    }\n\n    if (lookedFoundStored && !lookupPending && !lookupError && !redirectFish) {\n      addressFeedback = (\n        <p class=\"has-padding t-serif t-weight-bold t-align-center\">\n          Welcome back! We remembered the districts you found last time.\n        </p>\n      );\n    }\n\n    const inputProps = {\n      id: 'address-input',\n      class: 'address-input__input',\n      placeholder: placeholder,\n    };\n\n    function findIsCalled(party, matches) {\n      const race = matches.filter(race => race.party === party);\n      return race[0].is_called;\n    }\n\n    function findContestResult(party, matches) {\n      const race = matches.filter(race => race.party === party);\n      return race[0].contest_result;\n    }\n\n    return (\n      <div class=\"address-input t-sans\">\n        <svg class=\"icon icon-drawn-left-arrow\">\n          <use xlinkHref=\"#icon-drawn-left-arrow\"></use>\n        </svg>\n        <label class=\"address-input__label\" for=\"address-input\">\n          Enter your address\n        </label>\n        <Typeahead\n          inputProps={inputProps}\n          items={results}\n          getItemValue={item => ({\n            name: item.description,\n            placeId: item.place_id,\n            _prediction: item._prediction,\n          })}\n          value={value}\n          onChange={this.onChange}\n          onClear={this.onClear}\n          onSelect={this.onSelect}\n          renderItem={(item, isHighlighted) => (\n            <li\n              class={cx('listbox__item', {\n                'listbox__item--highlighted': isHighlighted,\n              })}\n              key={item.id}\n            >\n              {item.description}\n            </li>\n          )}\n          renderAttribution={() => (\n            <li class=\"listbox__item listbox__item--attribution\">\n              <img src={googleIMG} alt=\"Powered by Google\" />\n            </li>\n          )}\n          shouldItemRender={shouldItemRender}\n          renderInput={props => (\n            <input\n              {...props}\n              ref={el => {\n                props.ref(el);\n                this.inputRef = el;\n              }}\n            />\n          )}\n        />\n        {addressFeedback}\n        {data && contests.length > 0 && (\n          <Portal\n            node={document.getElementById('your-races-results')}\n            ref={ref => (this._resultsPortal = ref)}\n          >\n            <div class=\"representative-districts contest-list\">\n              {matches['us-house'].length > 0 && <Contest\n                key={matches['us-house'][0].office_slug}\n                contest={matches['us-house']}\n                contestTitle={determineContestTitleYourRaces(\n                  matches['us-house'][0]\n                )}\n                tableHeader={CandidateRow.Header}\n                columnCount={CandidateRow.columnCount}\n                renderParty={party => (\n                  <SeatPartyDivider\n                    partyName={party.party}\n                    partyBallot={party}\n                    tableHeader={CandidateRow.Header}\n                    annotations={annoMatches['us-house'].filter(\n                      contest =>\n                        contest.type === party.office_slug + '-' + party.party\n                    )}\n                    notes={noteMatches['us-house'].filter(\n                      contest =>\n                        contest.type === party.office_slug + '-' + party.party\n                    )}\n                    source={party.source}\n                    asOf={asOf}\n                    columnCount={CandidateRow.columnCount}\n                    renderCandidate={(\n                      candidate,\n                      idx,\n                      viewAllCandidates,\n                      { totalVotes }\n                    ) => (\n                      <CandidateRow\n                        key={candidate.id}\n                        ballotName={candidate.name}\n                        candidateId={candidate.id}\n                        contestIsCalled={findIsCalled(\n                          candidate.party,\n                          matches['us-house']\n                        )}\n                        isIncumbent={candidate.is_incumbent}\n                        contestResult={findContestResult(\n                          candidate.party,\n                          matches['us-house']\n                        )}\n                        candidatesNum={party.candidacies.length}\n                        isWinner={candidate.is_winner}\n                        isViewable={\n                          viewAllCandidates || idx < visibleCandidatesCount\n                        }\n                        party={candidate.party}\n                        totalVotesInContest={totalVotes}\n                        votes={candidate.votes}\n                      />\n                    )}\n                  />\n                )}\n              />}\n              {matches['tx-senate'].length > 0 && (\n                <Contest\n                  key={matches['tx-senate'].id}\n                  contest={matches['tx-senate']}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitleYourRaces(\n                    matches['tx-senate'][0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      annotations={annoMatches['tx-senate'].filter(\n                        contest =>\n                          contest.type === party.office_slug + '-' + party.party\n                      )}\n                      notes={noteMatches['tx-senate'].filter(\n                        contest =>\n                          contest.type === party.office_slug + '-' + party.party\n                      )}\n                      source={party.source}\n                      asOf={asOf}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={findIsCalled(\n                            candidate.party,\n                            matches['tx-senate']\n                          )}\n                          contestResult={findContestResult(\n                            candidate.party,\n                            matches['tx-senate']\n                          )}\n                          candidatesNum={party.candidacies.length}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={\n                            viewAllCandidates || idx < visibleCandidatesCount\n                          }\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              )}\n              {matches['tx-house'].length > 0 && <Contest\n                key={matches['tx-house'].id}\n                contest={matches['tx-house']}\n                tableHeader={CandidateRow.Header}\n                columnCount={CandidateRow.columnCount}\n                contestTitle={determineContestTitleYourRaces(\n                  matches['tx-house'][0]\n                )}\n                renderParty={party => (\n                  <SeatPartyDivider\n                    partyName={party.party}\n                    partyBallot={party}\n                    tableHeader={CandidateRow.Header}\n                    annotations={annoMatches['tx-house'].filter(\n                      contest =>\n                        contest.type === party.office_slug + '-' + party.party\n                    )}\n                    notes={noteMatches['tx-house'].filter(\n                      contest =>\n                        contest.type === party.office_slug + '-' + party.party\n                    )}\n                    source={party.source}\n                    asOf={asOf}\n                    columnCount={CandidateRow.columnCount}\n                    renderCandidate={(\n                      candidate,\n                      idx,\n                      viewAllCandidates,\n                      { totalVotes }\n                    ) => (\n                      <CandidateRow\n                        key={candidate.id}\n                        ballotName={candidate.name}\n                        candidateId={candidate.id}\n                        contestIsCalled={findIsCalled(\n                          candidate.party,\n                          matches['tx-house']\n                        )}\n                        contestResult={findContestResult(\n                          candidate.party,\n                          matches['tx-house']\n                        )}\n                        candidatesNum={party.candidacies.length}\n                        isIncumbent={candidate.is_incumbent}\n                        isViewable={\n                          viewAllCandidates || idx < visibleCandidatesCount\n                        }\n                        isWinner={candidate.is_winner}\n                        party={candidate.party}\n                        totalVotesInContest={totalVotes}\n                        votes={candidate.votes}\n                      />\n                    )}\n                  />\n                )}\n              />}\n              {matches['sboe'].length > 0 && (\n                <Contest\n                  key={matches['sboe'][0].office_slug}\n                  contest={matches['sboe']}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitleYourRaces(\n                    matches['sboe'][0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      annotations={annoMatches['sboe'].filter(\n                        contest =>\n                          contest.type === party.office_slug + '-' + party.party\n                      )}\n                      notes={noteMatches['sboe'].filter(\n                        contest =>\n                          contest.type === party.office_slug + '-' + party.party\n                      )}\n                      source={party.source}\n                      asOf={asOf}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={findIsCalled(\n                            candidate.party,\n                            matches['sboe']\n                          )}\n                          contestResult={findContestResult(\n                            candidate.party,\n                            matches['sboe']\n                          )}\n                          candidatesNum={party.candidacies.length}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={\n                            viewAllCandidates || idx < visibleCandidatesCount\n                          }\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              )}\n              {data &&\n                matches['us-house'].length === 0 &&\n                matches['tx-senate'].length === 0 &&\n                matches['tx-house'].length === 0 &&\n                matches['sboe'].length === 0 && (\n                  <p class=\"has-padding t-serif t-align-center\">\n                    There are no runoff races in your district.\n                  </p>\n                )}\n            </div>\n          </Portal>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default YourRaces;\n","/**\n * Grabs the contents of a `jsonScript` created JSON inline string and returns\n * it as a JSON object. If the element does not exist, or if the script\n * element does not have the JSON MIME type, null is returned instead.\n *\n * @param  {String} elementId the ID of the JSON script element\n * @return {Object|null}\n */\nexport default function loadAssetURL(elementId) {\n  const element = document.getElementById(elementId);\n\n  if (element && element.getAttribute('type') === 'application/json') {\n    return JSON.parse(element.textContent).asset_url;\n  } else {\n    return null;\n  }\n}\n","import getJSON from './get-json';\n\nconst LOOKUP_URL = ({ latitude, longitude, includeGeography = false }) =>\n  `https://dv-dev.texastribune.org/legislative-lookup-2025/?latitude=${latitude}&longitude=${longitude}`;\n\nexport function lookup({ latitude, longitude }) {\n  return getJSON(LOOKUP_URL({ latitude, longitude }));\n}\n","import cx from 'classnames';\nimport { h } from 'preact';\n\nfunction Ad() {\n  const classes = cx('c-ad-flex_bg--gray preact__ad');\n\n  return (\n    <div class=\"plugin plugin--centered\">\n      <div class={classes}>\n        <div class=\"c-ad-flex__inner\">\n          <p class=\"c-ad-flex__thanks\">\n            The Texas Tribune thanks its sponsors.\n            <a href=\"https://mediakit.texastribune.org/\">\n              <strong>Become one</strong>\n            </a>\n            .\n          </p>\n          <div class=\"c-ad-flex__unit\">\n            <div class=\"dv-gpt-ad\"></div>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default Ad;\n","// packages\nimport cx from 'classnames';\nimport { Component, h } from 'preact';\n\n// components\nimport CandidateRow from './components/CandidateRow';\nimport Contest from './components/Contest';\nimport NewContestShowcase from './components/NewContestShowcase';\nimport YourRaces from './components/YourRaces';\nimport Portal from './components/Portal';\nimport SeatPartyDivider from './components/SeatPartyDivider';\nimport Ad from './components/Ad';\n\nimport find from './utils/find';\nimport {\n  determineContestTitle,\n  chunk,\n  lastUpdatedFormat,\n} from './election-utils';\nimport { RESULTS_IN_USE, visibleCandidatesCount, showLastUpdated } from './endpoints';\nimport getJSON from './utils/get-json';\nimport { LENGTH_OF_CHECK_INTERVAL } from './constants';\n\ntype State = {\n  data: { [key: string]: any };\n  now: Date | null;\n};\n\nclass App extends Component<{}, State> {\n  timer!: number;\n\n  constructor() {\n    super();\n\n    this.state = {\n      data: [],\n      now: null,\n      timer: 0,\n    };\n\n    this.fetchData = this.fetchData.bind(this);\n  }\n\n  fetchData() {\n    const now = new Date();\n    console.info('Requesting:', now);\n\n    const asOf = lastUpdatedFormat(now);\n\n    if (showLastUpdated) {\n      document.querySelector('.counter').innerHTML = asOf;\n      document.querySelector('.counter-mobile .counter').innerHTML = asOf;\n    }\n\n    getJSON(RESULTS_IN_USE).then(data =>\n      this.setState({ data, asOf }, this.startTimer)\n    );\n  }\n\n  startTimer() {\n    this.timer = window.setTimeout(this.fetchData, LENGTH_OF_CHECK_INTERVAL);\n  }\n\n  clearTimer() {\n    window.clearTimeout(this.timer);\n  }\n\n  componentDidMount() {\n    this.fetchData();\n  }\n\n  componentWillUnmount() {\n    this.clearTimer();\n  }\n\n  componentDidUpdate() {}\n\n  render() {\n    const { notes, annotations } = this.props;\n    const { data, asOf } = this.state;\n\n    const seats_mapped = data.map(number => ({\n      office: number.office,\n      office_slug: number.office_slug,\n    }));\n\n    function unique(array, propertyName) {\n      return array.filter(\n        (e, i) =>\n          array.findIndex(a => a[propertyName] === e[propertyName]) === i\n      );\n    }\n\n    let unique_seats = unique(seats_mapped, 'office_slug');\n\n    // In order to sprinkle ads between races in sections where there a lot of races like the Texas House, we need to divide them into groups of nth races to make it into different divs\n\n    const texasHouse = unique_seats.filter(\n      contest => contest.office === 'Texas House'\n    );\n\n    const excludedUsHouseGopSlugs = ['us-house-district-23', 'us-house-district-32'];\n\n    const usHouseFilteredData = data.filter(item =>\n      !(item.office === 'U.S. House' &&\n        item.party === 'Republican' &&\n        excludedUsHouseGopSlugs.includes(item.office_slug))\n    );\n\n    const usHouse = unique(\n      usHouseFilteredData\n        .map(item => ({ office: item.office, office_slug: item.office_slug }))\n        .filter(item => item.office === 'U.S. House'),\n      'office_slug'\n    );\n\n    let texasHouseGroups, usHouseGroups;\n\n    if (texasHouse.length) {\n      texasHouseGroups = chunk(texasHouse, 28);\n      usHouseGroups = chunk(usHouse, 24);\n    }\n\n    return (\n      <div class=\"results\">\n        <Portal\n          node={document.getElementById('lookup-select')}\n          ref={ref => (this._yourPortal = ref)}\n        >\n          <YourRaces\n            contests={data}\n            notes={notes}\n            annotations={annotations}\n            asOf={asOf}\n          />\n        </Portal>\n\n        {/* SENATE DEMS */}\n        <NewContestShowcase\n          contest={find(\n            data,\n            contest =>\n              contest.office === 'U.S. Senate' && contest.party === 'Democrat'\n          )}\n          container={document.querySelector('#us-senate .democrat')}\n          notes={notes.filter(item => item.type === 'us-senate-Democrat')}\n          annotations={annotations.filter(\n            item => item.type === 'us-senate-Democrat'\n          )}\n          asOf={asOf}\n        />\n\n        {/* SENATE GOP */}\n        <NewContestShowcase\n          contest={find(\n            data,\n            contest =>\n              contest.office === 'U.S. Senate' && contest.party === 'Republican'\n          )}\n          container={document.querySelector('#us-senate .republican')}\n          notes={notes.filter(item => item.type === 'us-senate-Republican')}\n          annotations={annotations.filter(item => item.type === 'us-senate-Republican')}\n          asOf={asOf}\n        />\n\n        {/* AG GOP */}\n        <NewContestShowcase\n          contest={find(\n            data,\n            contest =>\n              contest.office === 'Attorney General' && contest.party === 'Republican')}\n          container={document.querySelector('#attorney-general .republican')}\n          asOf={asOf}\n        />\n\n        {/* AG DEM */}\n        <NewContestShowcase\n          contest={find(\n            data,\n            contest =>\n              contest.office === 'Attorney General' && contest.party === 'Democrat')}\n          container={document.querySelector('#attorney-general .democrat')}\n          asOf={asOf}\n        />\n\n        <Portal\n          node={document.querySelector(\n            '#lieutenant-governor .contests'\n          )}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Lieutenant Governor')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  // includeCountyRundown\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      annotations={annotations.filter(\n                        item =>\n                          item.type === party.office_slug + '-' + party.party\n                      )}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      source={party.source}\n                      asOf={asOf}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          contestResult={party.contest_result}\n                          candidatesNum={party.candidacies.length}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={\n                            viewAllCandidates || idx < visibleCandidatesCount\n                          }\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n\n        <Portal\n          node={document.querySelector('#us-house .contests')}\n          ref={ref => (this._usPortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {usHouse.length > 0 &&\n              usHouseGroups.map(contestGroup => (\n                <div class=\"contest-group\">\n                  <div class=\"seat__contests-double\">\n                    {contestGroup.map(contest => (\n                      <Contest\n                        key={contest.id}\n                        contest={usHouseFilteredData.filter(\n                          item => item.office_slug === contest.office_slug\n                        )}\n                        tableHeader={CandidateRow.Header}\n                        columnCount={CandidateRow.columnCount}\n                        contestTitle={determineContestTitle(\n                          usHouseFilteredData.filter(\n                            item => item.office_slug === contest.office_slug\n                          )[0]\n                        )}\n                        renderParty={party => (\n                          <SeatPartyDivider\n                            partyName={party.party}\n                            partyBallot={party}\n                            tableHeader={CandidateRow.Header}\n                            annotations={annotations.filter(\n                              item =>\n                                item.type ===\n                                party.office_slug + '-' + party.party\n                            )}\n                            notes={notes.filter(\n                              item =>\n                                item.type ===\n                                contest.office_slug + '-' + party.party\n                            )}\n                            source={party.source}\n                            columnCount={CandidateRow.columnCount}\n                            asOf={asOf}\n                            renderCandidate={(\n                              candidate,\n                              idx,\n                              viewAllCandidates,\n                              { totalVotes }\n                            ) => (\n                              <CandidateRow\n                                key={candidate.id}\n                                ballotName={candidate.name}\n                                candidateId={candidate.id}\n                                contestIsCalled={party.is_called}\n                                contestResult={party.contest_result}\n                                candidatesNum={party.candidacies.length}\n                                isIncumbent={candidate.is_incumbent}\n                                isWinner={candidate.is_winner}\n                                isViewable={\n                                  viewAllCandidates ||\n                                  idx < visibleCandidatesCount\n                                }\n                                party={candidate.party}\n                                totalVotesInContest={totalVotes}\n                                votes={candidate.votes}\n                              />\n                            )}\n                          />\n                        )}\n                      />\n                    ))}\n                  </div>\n                  <Ad />\n                </div>\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector(\n            '#railroad-commission-of-texas .contests'\n          )}\n          ref={ref => (this._supremePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Texas Railroad Commission')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  // includeCountyRundown\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      annotations={annotations.filter(\n                        item =>\n                          item.type === party.office_slug + '-' + party.party\n                      )}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      source={party.source}\n                      asOf={asOf}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          contestResult={party.contest_result}\n                          candidatesNum={party.candidacies.length}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={\n                            viewAllCandidates || idx < visibleCandidatesCount\n                          }\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#state-board-of-education .contests')}\n          ref={ref => (this._sboePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'State Board of Education')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      annotations={annotations.filter(\n                        item =>\n                          item.type === party.office_slug + '-' + party.party\n                      )}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      source={party.source}\n                      asOf={asOf}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          contestResult={party.contest_result}\n                          candidatesNum={party.candidacies.length}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={\n                            viewAllCandidates || idx < visibleCandidatesCount\n                          }\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector(\n            '#texas-court-of-criminal-appeals .contests'\n          )}\n          ref={ref => (this._crimPortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(\n                contest => contest.office === 'Texas Court of Criminal Appeals'\n              )\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      annotations={annotations.filter(\n                        item =>\n                          item.type === party.office_slug + '-' + party.party\n                      )}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      source={party.source}\n                      asOf={asOf}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          contestResult={party.contest_result}\n                          candidatesNum={party.candidacies.length}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={\n                            viewAllCandidates || idx < visibleCandidatesCount\n                          }\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#texas-senate .contests')}\n          ref={ref => (this._senatePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {unique_seats\n              .filter(contest => contest.office === 'Texas Senate')\n              .map(contest => (\n                <Contest\n                  key={contest.id}\n                  contest={data.filter(\n                    item => item.office_slug === contest.office_slug\n                  )}\n                  notes={notes.filter(\n                    item => item.type === contest.office_slug\n                  )}\n                  tableHeader={CandidateRow.Header}\n                  columnCount={CandidateRow.columnCount}\n                  contestTitle={determineContestTitle(\n                    data.filter(\n                      item => item.office_slug === contest.office_slug\n                    )[0]\n                  )}\n                  renderParty={party => (\n                    <SeatPartyDivider\n                      partyName={party.party}\n                      partyBallot={party}\n                      tableHeader={CandidateRow.Header}\n                      annotations={annotations.filter(\n                        item =>\n                          item.type === party.office_slug + '-' + party.party\n                      )}\n                      notes={notes.filter(\n                        item =>\n                          item.type === contest.office_slug + '-' + party.party\n                      )}\n                      source={party.source}\n                      asOf={asOf}\n                      columnCount={CandidateRow.columnCount}\n                      renderCandidate={(\n                        candidate,\n                        idx,\n                        viewAllCandidates,\n                        { totalVotes }\n                      ) => (\n                        <CandidateRow\n                          key={candidate.id}\n                          ballotName={candidate.name}\n                          candidateId={candidate.id}\n                          contestIsCalled={party.is_called}\n                          contestResult={party.contest_result}\n                          candidatesNum={party.candidacies.length}\n                          isIncumbent={candidate.is_incumbent}\n                          isWinner={candidate.is_winner}\n                          isViewable={\n                            viewAllCandidates || idx < visibleCandidatesCount\n                          }\n                          party={candidate.party}\n                          totalVotesInContest={totalVotes}\n                          votes={candidate.votes}\n                        />\n                      )}\n                    />\n                  )}\n                />\n              ))}\n          </div>\n        </Portal>\n        <Portal\n          node={document.querySelector('#texas-house .contests')}\n          ref={ref => (this._housePortal = ref)}\n        >\n          <div class=\"office__contests\">\n            {texasHouse.length > 0 &&\n              texasHouseGroups.map(contestGroup => (\n                <div class=\"contest-group\">\n                  <div class=\"seat__contests-double\">\n                    {contestGroup.map(contest => (\n                      <Contest\n                        key={contest.id}\n                        contest={data.filter(\n                          item => item.office_slug === contest.office_slug\n                        )}\n                        notes={notes.filter(\n                          item => item.type === contest.office_slug\n                        )}\n                        tableHeader={CandidateRow.Header}\n                        columnCount={CandidateRow.columnCount}\n                        contestTitle={determineContestTitle(\n                          data.filter(\n                            item => item.office_slug === contest.office_slug\n                          )[0]\n                        )}\n                        renderParty={party => (\n                          <SeatPartyDivider\n                            partyName={party.party}\n                            partyBallot={party}\n                            tableHeader={CandidateRow.Header}\n                            annotations={annotations.filter(\n                              item =>\n                                item.type ===\n                                party.office_slug + '-' + party.party\n                            )}\n                            notes={notes.filter(\n                              item =>\n                                item.type ===\n                                contest.office_slug + '-' + party.party\n                            )}\n                            source={party.source}\n                            asOf={asOf}\n                            columnCount={CandidateRow.columnCount}\n                            renderCandidate={(\n                              candidate,\n                              idx,\n                              viewAllCandidates,\n                              { totalVotes }\n                            ) => (\n                              <CandidateRow\n                                key={candidate.id}\n                                ballotName={candidate.name}\n                                candidateId={candidate.id}\n                                contestIsCalled={party.is_called}\n                                contestResult={party.contest_result}\n                                candidatesNum={party.candidacies.length}\n                                isIncumbent={candidate.is_incumbent}\n                                isWinner={candidate.is_winner}\n                                isViewable={\n                                  viewAllCandidates ||\n                                  idx < visibleCandidatesCount\n                                }\n                                party={candidate.party}\n                                totalVotesInContest={totalVotes}\n                                votes={candidate.votes}\n                              />\n                            )}\n                          />\n                        )}\n                      />\n                    ))}\n                  </div>\n                  <Ad />\n                </div>\n              ))}\n          </div>\n        </Portal>\n      </div>\n    );\n  }\n}\n\nexport default App;\n","// import JS files\nimport '../kickstart';\nimport './sticky-nav-bar';\n\nimport { h, render } from 'preact';\n\n// Components\nimport App from '../ResultsApp';\nimport loadJsonScript from '../utils/load-json-script';\n\nconst notes = loadJsonScript('notes_data');\n\nconst annotations = loadJsonScript('annotations_data');\n\nrender(\n  <App notes={notes} annotations={annotations} />,\n  document.getElementById('app')\n);\n","// Live results being updated by Republic\nconst FLAT_RESULTS_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_runoff/republic_json/results_FLAT.json';\n\n// This has emptied out results i.e. is static\nconst STATIC_FLAT_RESULTS_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_runoff/republic_json/results_FLAT_STATIC.json';\n\n// This has the final certified results and is static\nconst FINAL_RESULTS_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_primary/republic_json/results_FLAT_FINAL_RESULTS.json';\n\n// Includes fake results data for testing\nconst FAKE_RESULTS_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_primary/republic_json/results_FLAT_TEST.json';\n\nconst FAKE_RESULTS_URL_TWO =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_primary/republic_json/results_FLAT_AP_test.json';\n\nconst FAKE_RESULTS_MIDDLE =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_primary/republic_json/results_FLAT_AP_test_middle.json';\n\nconst FAKE_RESULTS_LATE =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_primary/republic_json/results_FLAT_AP_test_late_night.json';\n\nconst FAKE_RESULTS_LATE_2 =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_primary/republic_json/results_FLAT_COMPLETE_FEB_23_test.json';\n\n// Used for homepage takeover\nconst HOMEPAGE_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_primary/homepage_takeover/2024-primary.json';\n\n// Calls TT stories using the API\nconst STORY_API_URL = (id: number): string =>\n  `https://www.texastribune.org/api/v2/articles/${id}/?format=json&fields=sitewide_image,summary,authors,url,pub_date,updated_date,homepage_headline`;\n\n// This is for the other candidates for the hide/show toggle\nconst visibleCandidatesCount = 4;\n\n// This is for the other candidates for the hide/show toggle just in the homepage\nconst visibleCandidatesCountHomepage = 2;\n\n// Show bubble map toggle option. Set to false if we want to hide it.\nconst showBubbleMap = true;\n\n// Show precincts or estimated votes still being counted text\nconst showPrecinctsReporting = true;\n\n// Adds the checkmark if this is the final official results from local canvass\nconst isCanvass = false;\n\n// Show last updated timestamp, set to true to last updated text\nconst showLastUpdated = false;\n\n// What we are using across the ap\n// will be used on the results page, in the homepage takeover\n// and in the embeds\nconst RESULTS_IN_USE = FLAT_RESULTS_URL;\n\nexport {\n  RESULTS_IN_USE,\n  HOMEPAGE_URL,\n  STORY_API_URL,\n  visibleCandidatesCount,\n  visibleCandidatesCountHomepage,\n  showPrecinctsReporting,\n  isCanvass,\n  showLastUpdated,\n  showBubbleMap,\n};\n","/**\n * Grabs the contents of a `jsonScript` created JSON inline string and returns\n * it as a JSON object. If the element does not exist, or if the script\n * element does not have the JSON MIME type, null is returned instead.\n *\n * @param  {String} elementId the ID of the JSON script element\n * @return {Object|null}\n */\nexport default function loadJsonScript(elementId) {\n  const element = document.getElementById(elementId);\n\n  if (element && element.getAttribute('type') === 'application/json') {\n    return JSON.parse(element.textContent);\n  } else {\n    return null;\n  }\n}\n","import cx from 'classnames';\nimport { capfirst, intcomma } from 'journalize';\nimport { Component, h, VNode } from 'preact';\n\nimport PartyPill from './PartyPill';\nimport PureComponent from './PureComponent';\n\nimport { isCanvass } from '../endpoints';\n\nimport formatPercent from '../utils/format-percent';\n\ninterface Props {\n  ballotName: string;\n  candidateId: string;\n  contestIsCalled: boolean;\n  contestResult: string;\n  isIncumbent: boolean;\n  isWinner: boolean;\n  isMapRow: boolean;\n  candidatesNum: number;\n  party: string;\n  totalVotesInContest: number;\n  votes: number;\n}\n\nclass CandidateRow extends Component<Props> {\n  static Header: VNode;\n  static countyHeader: VNode;\n  static columnCount: number;\n\n  render() {\n    const {\n      ballotName,\n      contestIsCalled,\n      contestResult,\n      isIncumbent,\n      isWinner,\n      isViewable,\n      candidateColor,\n      candidatesNum,\n      isMapRow,\n      party,\n      totalVotesInContest,\n      votes,\n    } = this.props;\n\n    let divStyle;\n\n    let checkStyle;\n\n    if (candidateColor) {\n      divStyle = {\n        'background-color': candidateColor,\n      };\n      checkStyle = {\n        color: candidateColor,\n      };\n    }\n\n    let rowClass = cx('candidate', 'contest__candidate-row', {\n      'contest__candidate-row--winner dem--border':\n        contestIsCalled && isWinner && party == 'Democrat',\n      'contest__candidate-row--winner rep--border':\n        contestIsCalled && isWinner && party == 'Republican',\n    });\n\n    let checkClass = cx('check', {\n      'dem-winner': party == 'Democrat' && contestResult != 'runoff',\n      'rep-winner': party == 'Republican' && contestResult != 'runoff',\n      'runoff-winner': contestResult == 'runoff',\n    });\n\n    if (!isViewable) {\n      rowClass += ' race__candidate-row--hidden';\n    }\n\n    const checkmark = '\\u2713';\n\n    const uncontested = candidatesNum == 1;\n\n    const asteriskNames = [\n      'Andrew White',\n      'Amanda Edwards',\n      'Scott Mandel',\n      'Jay Nagy',\n    ];\n\n    const IsAsterisk = asteriskNames.includes(ballotName);\n\n    return (\n      <tr class={rowClass}>\n        <td class=\"candidate__cell candidate__party\">\n          {!candidateColor && <PartyPill party={party} />}\n          {candidateColor && <PartyPill party={party} style={divStyle} />}\n        </td>\n        <th class=\"candidate__cell candidate__name\">\n          {isWinner &&\n            (contestResult == 'winner' || contestResult == 'uncontested') && (\n              <span class={checkClass} style={checkStyle}>\n                {checkmark}\n              </span>\n            )}\n          {isWinner && contestResult == 'runoff' && (\n            <span class={checkClass} style={checkStyle}>\n              {checkmark}\n            </span>\n          )}\n          {isWinner &&\n          isMapRow == null &&\n          isCanvass == true &&\n          contestResult != 'runoff' ? (\n            <span class={checkClass}>{ballotName}</span>\n          ) : (\n            ballotName\n          )}\n          {IsAsterisk && <span class=\"asterisk_out\">*</span>}{' '}\n          {isIncumbent && (\n            <span class=\"pill pill--basic\" title=\"Currently holds this seat\">\n              Incumbent\n            </span>\n          )}\n        </th>\n        <td class=\"candidate__cell candidate__votes\">\n          {uncontested == false ? intcomma(votes) : '—'}\n        </td>\n        <td class=\"candidate__cell candidate__pct\">\n          {uncontested == false\n            ? formatPercent(votes, totalVotesInContest)\n            : '—'}\n          <span class=\"candidate__pct-symbol\">%</span>\n        </td>\n      </tr>\n    );\n  }\n}\n\nCandidateRow.defaultProps = {\n  contestIsCalled: false,\n  isViewable: true,\n};\n\nCandidateRow.Header = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Votes\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Pct.\n        <span class=\"candidate__pct-symbol\">%</span>\n      </th>\n    </tr>\n  </thead>\n);\n\nCandidateRow.countyHeader = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Votes\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Pct.\n        <span class=\"candidate__pct-symbol\">%</span>\n      </th>\n    </tr>\n  </thead>\n);\n\nCandidateRow.columnCount = 4;\n\nexport default CandidateRow;\n","/* global Node, Window */\n\n/**\n * Select all matching elements on the page. Uses `document.querySelectorAll`.\n *\n * @param {String} el The CSS selector to search for.\n * @param {Element} [context] The container to search within. Defaults to\n * `document`.\n * @returns {Element[]}\n */\nfunction selectAll(el, context) {\n  // if `el` is a Node or Window, return it in an Array\n  if (el instanceof Node || el instanceof Window) return [el];\n\n  return Array.prototype.slice.call(\n    typeof el === 'string'\n      ? (context || document).querySelectorAll(el)\n      : el || []\n  );\n}\n\nexport default selectAll;\n","const LENGTH_OF_CHECK_INTERVAL = 1000 * 60 * 2; // 2 minutes\nconst TIMERS_SHOULD_RUN = true;\n\nexport { LENGTH_OF_CHECK_INTERVAL, TIMERS_SHOULD_RUN };\n","/**\n * Select an element on the page. Uses `document.querySelector`, meaning it\n * will only return the first element that matches.\n *\n * @param {String} el The CSS selector to search for.\n * @param {Element} [context] The container to search within. Defaults to\n * `document`.\n * @returns {Element|null}\n */\nfunction select(el, context) {\n  return typeof el === 'string'\n    ? (context || document).querySelector(el)\n    : el || null;\n}\n\nexport default select;\n","// The sticky top nav bar\n\nimport select from '../utils/select';\nimport selectAll from '../utils/select-all';\n\nconst appNav = document.getElementById('app-nav');\nconst { height } = appNav.getBoundingClientRect();\nconst appNavHeight = Math.round(height) + 10;\n\nconst appNavJumps = selectAll('.navbar__item a', appNav);\n\n// These are for anchor links so that they also take into account the height of the sticky bar\nconst anchorJumps = selectAll('a.anchor', document);\n\nappNavJumps.concat(anchorJumps).forEach(el => {\n  el.addEventListener('click', e => {\n    e.preventDefault();\n    const target = select(e.target.getAttribute('href'));\n\n    // var current = appNav.getElementsByClassName('active-nav');\n\n    // current[0].className = current[0].className.replace(' active-nav', '');\n\n    // var path =\n    //   e.path || (e.composedPath && e.composedPath()) || composedPath(e.target);\n    // path[1].className += ' active-nav';\n\n    window.scrollTo(\n      0,\n      window.pageYOffset + target.getBoundingClientRect().top - appNavHeight\n    );\n  });\n});\n","var journalize = require('journalize');\n\nimport { capfirst, apdate, aptime, apmonth } from 'journalize';\n\nimport context from 'Data/text.json';\n\nexport function lastUpdatedFormat(now) {\n  // format dates to ap style\n  const formatted_date = journalize.apdate(now),\n    formatted_time = journalize.aptime(now),\n    formatted_month = journalize.apmonth(now),\n    just_day = now.getDate();\n\n  return formatted_time;\n}\n\nexport function format(num) {\n  return num < 10 ? '0' + num : num;\n}\n\nexport const chunk = (arr, size) =>\n  arr.reduce((acc, _, i) => {\n    if (i % size === 0) acc.push(arr.slice(i, i + size));\n    return acc;\n  }, []);\n\nexport function APTotalVotesToCount(eevp, total_votes) {\n  return eevp > 0 ? Math.round((100 * total_votes) / eevp) : NaN;\n}\n\nexport const delay = (function() {\n  var timer = 0;\n  return function(callback, ms) {\n    clearTimeout(timer);\n    timer = setTimeout(callback, ms);\n  };\n})();\n\nconst PARTY_SORT_ORDER = [\n  'democrat',\n  'republican',\n  'libertarian',\n  'independent',\n  'write-in',\n];\n\nconst TT_directory_slugs = [\n  { office: 'Texas House', 'directory-slug': 'tx-house' },\n  { office: 'Texas Senate', 'directory-slug': 'tx-senate' },\n  { office: 'U.S. House', 'directory-slug': 'us-house' },\n  { office: 'State Board of Education', 'directory-slug': 'sboe' },\n];\n\nexport function get_directory_slug(office) {\n  return TT_directory_slugs.filter(slug => slug.office == office);\n}\n\nlet opacity = '0.4';\n\nexport const CandidateColorsRace1 = [\n  {\n    name: 'Ken Paxton',\n    color: '#f5af76',\n  },\n  {\n    name: 'Wesley Hunt',\n    color: '#bababa',\n  },\n  {\n    name: 'John Cornyn',\n    color: '#EF564A',\n  },\n  {\n    name: 'Virgil Bierschwale',\n    color: '#bababa',\n  },\n  {\n    name: 'Anne Bender',\n    color: '#bababa',\n  },\n  {\n    name: 'Gulrez \"Gus\" Khan',\n    color: '#bababa',\n  },\n  {\n    name: 'Sara Canady',\n    color: '#bababa',\n  },\n  {\n    name: 'John O. Adefope',\n    color: '#bababa',\n  },\n  {\n    name: 'Uncommitted',\n    color: '#bababa',\n  },\n];\n\nexport const CandidateColorsRace2 = [\n  {\n    name: 'Jasmine Crockett',\n    color: '#fcbec3',\n  },\n  {\n    name: 'James Talarico',\n    color: '#5acc7d',\n  },\n  {\n    name: 'Ahmad R. Hassan',\n    color: '#1755c5',\n  },\n];\n\n// If we need light blue #99d2da; background-color:rgba(153, 210, 218, .1)\n// If we need dark blue #325ba8; background-color:rgba(90, 137, 204, .1)\n\nexport function sort_candidates_by_party(candidates) {\n  return candidates.sort(\n    (a, b) =>\n      PARTY_SORT_ORDER.indexOf(a.party) - PARTY_SORT_ORDER.indexOf(b.party)\n  );\n}\n\nconst PRESIDENT_ORDER = [\n  'Donald J. Trump',\n  'Nikki Haley',\n  'Ron DeSantis',\n  'Vivek Ramaswamy',\n  'Ryan Binkley',\n  'Chris Christie',\n  'Asa Hutchinson',\n  'David Stuckenberg',\n  'Uncommitted',\n];\n\nexport function sort_candidates_presidential(candidates) {\n  return candidates.sort(\n    (a, b) => PRESIDENT_ORDER.indexOf(a.name) - PRESIDENT_ORDER.indexOf(b.name)\n  );\n}\n\nexport function alert_conditionals(vote_pct, cand_num) {\n  if (vote_pct == 0 && cand_num > 1) {\n    return context.label_conditionals['zero-results'];\n  } else if (vote_pct > 0 && vote_pct <= 50 && cand_num > 1) {\n    return context.label_conditionals['more-than-0-less-than-50'];\n  } else if (vote_pct > 50 && vote_pct < 99 && cand_num > 1) {\n    return context.label_conditionals['more-than-50-no-winner'];\n  } else if (vote_pct >= 99 && cand_num > 1) {\n    return context.label_conditionals['all-results-in-no-winner'];\n  } else if (cand_num == 1) {\n    return context.label_conditionals['uncontested'];\n  }\n}\n\nexport function alert_winners(result, office) {\n  if (result == 'winner' && office != 'President') {\n    return context.winner_conditionals['winner'];\n  } else if (result == 'winner' && office == 'President') {\n    return context.winner_conditionals['winner_prez'];\n  } else if (result == 'uncontested') {\n    return context.winner_conditionals['uncontested'];\n  } else if (result == 'runoff') {\n    return context.winner_conditionals['runoff'];\n  }\n}\n\nexport function text_conditionals(vote_pct, cand_num) {\n  if (vote_pct == 0 && cand_num > 1) {\n    return context.text_conditionals['zero-results'];\n  } else if (vote_pct > 1 && vote_pct <= 50 && cand_num > 1) {\n    return context.text_conditionals['more-than-0-less-than-50'];\n  } else if (vote_pct > 50 && vote_pct < 99 && cand_num > 1) {\n    return context.text_conditionals['more-than-50-no-winner'];\n  } else if (vote_pct >= 99 && cand_num > 1) {\n    return context.text_conditionals['all-results-in-no-winner'];\n  } else if (cand_num == 1) {\n    return context.text_conditionals['uncontested'];\n  }\n}\n\nexport function text_conditional_winner_zero(vote_pct, cand_num) {\n  if (vote_pct == 0 && cand_num > 1) {\n    return context.text_conditionals['zero-results_winner'];\n  } else {\n    return ``;\n  }\n}\n\nexport function determineDistrictTitle(contest) {\n  return `${contest.office} ${\n    contest.office === 'President' ||\n    contest.division_type === 'class' ||\n    contest.division_type === 'statewide'\n      ? ''\n      : contest.division_type === 'place' && contest.office_division === 1\n      ? 'Chief Justice'\n      : capfirst(contest.division_type) + ' ' + contest.office_division\n  }`.trim();\n}\n\nexport function determineContestTitle(contest) {\n  if (contest.division_type === 'statewide' || contest.division_type === 'seat')\n    return '';\n\n  return determineDistrictTitle(contest);\n}\n\nexport function determineContestTitleYourRaces(contest) {\n  return determineDistrictTitle(contest);\n}\n","/**\n * A wrapper for the initial response from a fetch call that funnels to\n * res.json().\n *\n * @private\n * @param {Response} res\n * @returns {Promise}\n */\nfunction jsonResponse(res) {\n  if (!res.ok) throw new Error(`${res.status}: ${res.statusText}`);\n\n  return res.json();\n}\n\n/**\n * A light wrapper around fetch that assumes you're seeking a JSON response.\n *\n * @param {String|Request} input\n * @param {Object} init\n * @returns {Promise}\n */\nexport default function getJSON(input, init) {\n  return fetch(input, init).then(jsonResponse);\n}\n","import cx from 'classnames';\nimport { h } from 'preact';\n\nfunction OtherCandidate({\n  isViewable,\n  candidateCount,\n  embedType,\n  onClick,\n  showDelegates,\n}) {\n  const classes = cx('candidate race__candidate-row', {\n    'race__candidate-row--hidden': !isViewable,\n  });\n\n  return (\n    <tr class={classes}>\n      <td\n        class=\"candidate__cell candidate__party t-align-center\"\n        onClick={onClick}\n      >\n        <svg class=\"icon icon-angle-down\">\n          <use xlinkHref=\"#icon-angle-down\" />\n        </svg>\n      </td>\n      <th class=\"candidate__cell candidate__name\">\n        <button class={embedType} onClick={onClick}>\n          Show All ({candidateCount}){' '}\n        </button>\n      </th>\n      <th class=\"candidate__cell candidate__votes\"></th>\n      <th class=\"candidate__cell candidate__pct\"></th>\n      {showDelegates && <td class=\"candidate__cell candidate__votes\">{}</td>}\n    </tr>\n  );\n}\n\nexport default OtherCandidate;\n","import cx from 'classnames';\nimport { intcomma } from 'journalize';\nimport { Component, h } from 'preact';\n\nimport OtherCandidate from './OtherCandidate';\nimport { PreactHTMLConverter } from 'preact-html-converter';\n\n// internal\nimport {\n  sort_candidates_presidential,\n  CandidateColorsRace1,\n  CandidateColorsRace2,\n  alert_conditionals,\n  alert_winners,\n  text_conditionals,\n  text_conditional_winner_zero,\n} from '../election-utils';\nimport sumValues from '../utils/sum-values';\nimport formatPercent from '../utils/format-percent';\n\nimport find from '../utils/find';\n\nimport { isCanvass, visibleCandidatesCount } from '../endpoints';\n\ninterface Props {\n  partyName: string;\n  tableHeader: JSX.Element;\n  annotations: { [key: string]: any };\n  notes: { [key: string]: any };\n  isShowcaseRace?: boolean;\n  isHomepage?: boolean;\n  asOf: string;\n  source: string;\n  showDelegates: boolean;\n  columnCount: number;\n  ShowcaseRaceWinner: any;\n  partyBallot: { [key: string]: any };\n  renderCandidate: any;\n  contestTitle: string;\n  embedType: string;\n  showContestTitleInShowcase?: boolean;\n  candidateColors?: { name: string; color: string }[];\n}\n\nclass SeatPartyDivider extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      viewAllCandidates: false,\n    };\n    this.onViewableToggle = this.onViewableToggle.bind(this);\n  }\n\n  onViewableToggle() {\n    this.setState(prevState => ({\n      viewAllCandidates: !prevState.viewAllCandidates, // set viewAllCandidates to what is wasn't before\n    }));\n  }\n  render() {\n    const {\n      partyName,\n      annotations,\n      notes,\n      partyBallot,\n      tableHeader,\n      isShowcaseRace,\n      isHomepage,\n      columnCount,\n      showDelegates,\n      ShowcaseRaceWinner,\n      asOf,\n      source,\n      renderCandidate,\n      contestTitle,\n      embedType,\n      showContestTitleInShowcase,\n      candidateColors,\n    } = this.props;\n\n    const { viewAllCandidates } = this.state;\n\n    const converter = PreactHTMLConverter();\n\n    const shouldDisplayResult = partyBallot.contest_result !== 'not called';\n\n    // console.log(partyBallot.contest_result);\n\n    const totalVotes = sumValues(partyBallot.candidacies, 'votes');\n\n    let candidates = partyBallot.candidacies;\n\n    const uncontested = candidates.length == 1;\n\n    let ap_eevp = partyBallot.eevp;\n\n    const pct_votes =\n      source == 'Decision Desk HQ'\n        ? formatPercent(totalVotes, partyBallot.estimated_votes_mid)\n        : partyBallot.eevp ?? 0;\n\n    const pct_votes_turnout =\n      pct_votes < 100\n        ? `An estimated ${pct_votes}% of votes have been counted, according to the ${source}.`\n        : `An estimated >99% of votes have been counted, according to the ${source}.`;\n\n    const pct_votes_turnout_zero_winner =\n      pct_votes == 0 && shouldDisplayResult ? `` : pct_votes_turnout;\n\n    const pct_votes_turnout_w_uncontested =\n      uncontested == true\n        ? text_conditionals(pct_votes, partyBallot.candidacies.length)\n        : pct_votes_turnout_zero_winner;\n\n    const pct_votes_explain = !shouldDisplayResult\n      ? text_conditionals(pct_votes, partyBallot.candidacies.length)\n      : text_conditional_winner_zero(pct_votes, partyBallot.candidacies.length);\n\n    let candidatesRender;\n\n    let firstShowcaseRace;\n\n    let embedTypeUsable = 'none';\n\n    if (typeof embedType !== 'undefined') {\n      embedTypeUsable = embedType;\n    }\n\n    let checkStyle;\n\n    if (isShowcaseRace) {\n      firstShowcaseRace =\n        partyBallot.office == 'President' && partyBallot.party == 'Republican';\n      // !isHomepage;\n\n      candidatesRender = firstShowcaseRace\n        ? CandidateColorsRace1\n        : CandidateColorsRace2;\n    }\n\n    if (candidateColors && candidateColors.length > 0) {\n      const winner = isShowcaseRace\n        ? ShowcaseRaceWinner\n        : find(\n            partyBallot.candidacies,\n            (candidate: any) => candidate.is_winner === true\n          );\n\n      if (winner) {\n        const colorWinner = find(\n          candidateColors,\n          (c: any) => c.name === winner.name\n        );\n        if (colorWinner) {\n          checkStyle = { color: colorWinner['color'] };\n        }\n      }\n    }\n\n    if (\n      !checkStyle &&\n      isShowcaseRace &&\n      ShowcaseRaceWinner &&\n      candidatesRender\n    ) {\n      const colorWinner = find(\n        candidatesRender,\n        (candidate: any) => candidate.name === ShowcaseRaceWinner['name']\n      );\n      if (colorWinner) {\n        checkStyle = { color: colorWinner['color'] };\n      }\n    }\n\n    if (\n      partyBallot.office == 'President' &&\n      partyBallot.party == 'Republican' &&\n      totalVotes == 0\n    ) {\n      candidates = sort_candidates_presidential(candidates);\n    }\n\n    const rowClass = cx('seat__race', {\n      'seat__race--Democrat': partyName == 'Democrat',\n      'seat__race--Republican': partyName == 'Republican',\n    });\n\n    const klaxon_sos = 'Race has been declared'; // if we switch sources to TX SOS and someone else has declared the winner\n\n    const klaxon = shouldDisplayResult\n      ? source == 'Decision Desk HQ' || source == 'Associated Press'\n        ? alert_winners(partyBallot.contest_result, partyBallot.office)\n        : klaxon_sos\n      : alert_conditionals(pct_votes, partyBallot.candidacies.length);\n\n    const checkmark = '\\u2713';\n\n    let checkClass = cx('check', {\n      'dem-winner':\n        partyBallot.party == 'Democrat' &&\n        partyBallot.contest_result != 'runoff',\n      'rep-winner':\n        partyBallot.party == 'Republican' &&\n        partyBallot.contest_result != 'runoff',\n      'runoff-winner': partyBallot.contest_result == 'runoff',\n    });\n\n    const contestMetricsClass = cx('contest__metrics', {\n      homepage__metrics: isHomepage,\n      'non-homepage__metrics': !isHomepage,\n    });\n\n    let hasTurnoutmodel =\n      source == 'Decision Desk HQ' || source == 'Associated Press'\n        ? true\n        : false;\n\n    const precinctsClass = cx('contest__precincts');\n\n    let ManualoverrideSource;\n\n    // If there is a race, that's being manually updated, you can change the Source to whatever the new votes are coming from here if you uncomment the code below. This is only if the source isn't Texas Secretary of State. If it is, then you don't have to do anything.\n\n    // if (partyBallot.office == 'U.S. House' && partyBallot.office_division == 37 && partyBallot.party == 'Republican') {\n    //   ManualoverrideSource = 'Travis County Elections'\n    // }\n    // else {\n    //   ManualoverrideSource = ''\n    // }\n\n    ManualoverrideSource = '';\n\n    const IsAnnotations =\n      annotations && annotations.length > 0 && annotations[0].value != ''\n        ? true\n        : false;\n\n    const IsNoted = notes && notes.length > 0 ? true : false;\n\n    return (\n      <div class={rowClass}>\n        <div class=\"race\">\n          {isHomepage ? (\n            <span>\n              <h2 class=\"office__title\">{contestTitle}</h2>\n              <h3 class=\"race__title\">\n                {partyName}\n                {partyName == 'Democrat' && <span>ic</span>} Primary{' '}\n              </h3>\n            </span>\n          ) : showContestTitleInShowcase ? (\n            <span>\n              <h4 class=\"race__title\">\n                {partyName}: {contestTitle}\n              </h4>\n            </span>\n          ) : (\n            <span>\n              <h4 class=\"race__title\">{partyName} </h4>\n            </span>\n          )}\n\n          <div class={contestMetricsClass}>\n            {isCanvass == false && (\n              <h4 class=\"klaxon__text\">\n                {shouldDisplayResult &&\n                (source == 'Decision Desk HQ' ||\n                  source == 'Associated Press') ? (\n                  <span class={checkClass} style={checkStyle}>\n                    {checkmark}\n                  </span>\n                ) : (\n                  ''\n                )}\n                {klaxon}\n              </h4>\n            )}\n            {isCanvass == true &&\n              shouldDisplayResult &&\n              partyBallot.contest_result == 'runoff' && (\n                <h4 class=\"klaxon__text klaxon__runoff\">\n                  Nominee to be decided in May runoff\n                </h4>\n              )}\n            {ManualoverrideSource == '' && isCanvass == false && (\n              <p class={precinctsClass}>\n                {source == 'Texas Secretary of State'\n                  ? `${intcomma(\n                      partyBallot.pollinglocationsreporting\n                    )} of ${intcomma(\n                      partyBallot.total_pollinglocations\n                    )} polling locations reporting (${partyBallot.pollinglocations_reporting_percent.toFixed(\n                      1\n                    )}%)`\n                  : pct_votes_turnout_w_uncontested}{' '}\n                {converter.convert(pct_votes_explain)}\n              </p>\n            )}\n            {\n              (ManualoverrideSource = !'' &&\n                source != 'Texas Secretary of State' &&\n                source != 'Decision Desk HQ' &&\n                source != 'Associated Press' &&\n                isCanvass == false && (\n                  <p class={precinctsClass}>\n                    {`${intcomma(\n                      partyBallot.pollinglocationsreporting\n                    )} of ${intcomma(\n                      partyBallot.total_pollinglocations\n                    )} polling locations reporting (${partyBallot.pollinglocations_reporting_percent.toFixed(\n                      1\n                    )}%)`}\n\n                    {/* <span class=\"source\">{` Source: ${ManualoverrideSource}`}</span> */}\n                  </p>\n                ))\n            }\n          </div>\n\n          <table class=\"race__candidates\">\n            {tableHeader}\n            <tbody>\n              {isShowcaseRace &&\n                candidates.map((candidate: any, idx: any) =>\n                  renderCandidate(\n                    candidate,\n                    idx,\n                    candidatesRender,\n                    viewAllCandidates,\n                    { totalVotes }\n                  )\n                )}\n\n              {!isShowcaseRace &&\n                candidates.map((candidate: any, idx: any) =>\n                  renderCandidate(candidate, idx, viewAllCandidates, {\n                    totalVotes,\n                  })\n                )}\n              {candidates.length > visibleCandidatesCount && (\n                <OtherCandidate\n                  isViewable={!viewAllCandidates}\n                  candidateCount={candidates.length}\n                  embedType={embedType}\n                  onClick={() => {\n                    this.onViewableToggle();\n                  }}\n                  showDelegates={showDelegates}\n                />\n              )}\n            </tbody>\n\n            {candidates.length > visibleCandidatesCount && viewAllCandidates && (\n              <tr class=\"candidate race__candidate-row\">\n                <td\n                  class=\"candidate__cell candidate__party t-align-center\"\n                  onClick={() => {\n                    this.onViewableToggle();\n                  }}\n                >\n                  <svg class=\"icon icon-angle-up\">\n                    <use xlinkHref=\"#icon-angle-up\" />\n                  </svg>\n                </td>\n                <th class=\"candidate__cell candidate__name\">\n                  <button\n                    class={embedType}\n                    onClick={() => {\n                      this.onViewableToggle();\n                    }}\n                  >\n                    Show fewer ({visibleCandidatesCount})\n                  </button>\n                </th>\n                <th class=\"candidate__cell candidate__votes\"> </th>\n                <th class=\"candidate__cell candidate__pct\"></th>\n                {showDelegates && (\n                  <td class=\"candidate__cell candidate__votes\"></td>\n                )}\n              </tr>\n            )}\n          </table>\n\n          {IsNoted == true && (\n            <p class=\"note__text\">{converter.convert(notes[0].value)}</p>\n          )}\n          {IsAnnotations == true && (\n            <div class=\"anno-text notes-annotations\">\n              <span class=\"is-sr-only\">Note:</span>\n              <svg class=\"icon note-icon anno-div\" aria-hidden=\"true\">\n                <use xlinkHref=\"#note-icon\" />\n              </svg>\n\n              <p class=\"annotations t-links-underlined\">\n                <span class=\"font-weight-bold\">Noteworthy: </span>\n                {converter.convert(annotations[0].value)}\n              </p>\n            </div>\n          )}\n          <div class=\"below-races\">\n            <div class=\"source\">{` Source: ${source}`}</div>\n\n            {(isHomepage || embedType == 'internal') && (\n              <div class=\"countdown\">\n                <span class=\"counter-homepage\">LAST UPDATED {asOf}</span>\n              </div>\n            )}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nSeatPartyDivider.defaultProps = {\n  isShowcaseRace: false,\n  isHomepage: false,\n};\n\nexport default SeatPartyDivider;\n","/**\n * Sums up values of a property across objects in an array.\n *\n * @param {Array} arr An array of objects.\n * @param {String} key The property to sum across objects.\n * @return {Number}\n */\nexport default function sumValues(arr, key) {\n  return arr.reduce((acc, obj) => acc + obj[key], 0);\n}\n","const hOP = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x: any, y: any): boolean {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    // Added the nonzero y check to make Flow happy, but it is redundant\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  }\n  // Step 6.a: NaN == NaN\n  return x !== x && y !== y;\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA: object, objB: object): boolean {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if (\n    typeof objA !== 'object' ||\n    objA === null ||\n    typeof objB !== 'object' ||\n    objB === null\n  ) {\n    return false;\n  }\n\n  const keysA = Object.keys(objA);\n  const keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  for (let i = 0; i < keysA.length; i++) {\n    if (!hOP.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nexport default shallowEqual;\n","// packages\nimport { Component } from 'preact';\n\n// internal\nimport shallowEqual from '../utils/shallow-equal';\n\nabstract class PureComponent<P = {}, S = {}> extends Component<P, S> {\n  shouldComponentUpdate(props, state) {\n    const check =\n      shallowEqual(props, this.props) && shallowEqual(state, this.state);\n    // if (props.projection)\n    //   console.log(\n    //     'projection check:',\n    //     props.projection === this.props.projection,\n    //     !check\n    //   );\n    return !check;\n  }\n}\n\nexport default PureComponent;\n","function _extends() {\n  return _extends = Object.assign ? Object.assign.bind() : function (n) {\n    for (var e = 1; e < arguments.length; e++) {\n      var t = arguments[e];\n      for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n    }\n    return n;\n  }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","/**\n * A for-loop version of Array.prototype.find so IE and friends can play.\n *\n * @private\n * @param  {Array} arr\n * @param  {Function} predicate\n * @return {*|undefined}\n * @throws {TypeError} Argument predicate must be a function\n */\nexport default function find(\n  arr: Array<any>,\n  predicate: Function\n): any | undefined {\n  if (typeof predicate !== 'function') {\n    throw new TypeError('predicate must be a function');\n  }\n\n  for (let i = 0; i < arr.length; i++) {\n    if (predicate(arr[i], i, arr)) {\n      return arr[i];\n    }\n  }\n\n  return undefined;\n}\n","// packages\nimport cx from 'classnames';\nimport { capfirst } from 'journalize';\nimport memoize from 'lodash/memoize';\nimport { h } from 'preact';\n\ntype Props = {\n  excludeInitial?: boolean;\n  party: string;\n  style: string;\n};\n\nfunction PartyPill({ excludeInitial, party, style }: Props) {\n  const partyPrefix = party.slice(0, 3).toLowerCase();\n  const partyInitial = party[0].toUpperCase();\n\n  const classes = cx('circle-pill', `pill--${partyPrefix}`);\n\n  return (\n    <span class={classes} style={style} title={capfirst(party)}>\n      {!excludeInitial && partyInitial}\n    </span>\n  );\n}\n\nPartyPill.defaultProps = {\n  excludeInitial: false,\n};\n\nexport default memoize(PartyPill, ({ party, style }) => ({\n  party: party,\n  style: style,\n}));\n"],"sourceRoot":""}