@dra2020/district-analytics 12.1.0 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -44,6 +44,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
44
44
  Object.defineProperty(exports, "__esModule", ({ value: true }));
45
45
  exports.AnalyticsSession = void 0;
46
46
  const baseclient_1 = __webpack_require__(/*! @dra2020/baseclient */ "@dra2020/baseclient");
47
+ // import * as DT from '@dra2020/dra-types';
47
48
  const Score = __importStar(__webpack_require__(/*! @dra2020/dra-score */ "@dra2020/dra-score"));
48
49
  const preprocess_1 = __webpack_require__(/*! ./preprocess */ "./src/preprocess.ts");
49
50
  const analyze_1 = __webpack_require__(/*! ./analyze */ "./src/analyze.ts");
@@ -53,6 +54,7 @@ const results_2 = __webpack_require__(/*! ./results */ "./src/results.ts");
53
54
  const minority_1 = __webpack_require__(/*! ./minority */ "./src/minority.ts");
54
55
  const D = __importStar(__webpack_require__(/*! ./_data */ "./src/_data.ts"));
55
56
  const U = __importStar(__webpack_require__(/*! ./utils */ "./src/utils.ts"));
57
+ // import * as S from './settings';
56
58
  class AnalyticsSession {
57
59
  constructor(SessionRequest) {
58
60
  this.legislativeDistricts = false; // 2020
@@ -74,7 +76,7 @@ class AnalyticsSession {
74
76
  this.legislativeDistricts = SessionRequest['legislativeDistricts'];
75
77
  this.state = new D.State(this, SessionRequest['stateXX'], SessionRequest['nDistricts']);
76
78
  this.counties = new D.Counties(this, SessionRequest['counties']);
77
- this.graph = new D.Graph(this, SessionRequest['graph']);
79
+ this.graph = new D.GraphClass(this, SessionRequest['graph']);
78
80
  this.features = new D.Features(this, SessionRequest['data'], this.config['datasets']);
79
81
  this.plan = new D.Plan(this, SessionRequest['plan']);
80
82
  this.districts = new D.Districts(this, SessionRequest['districtShapes']);
@@ -102,12 +104,12 @@ class AnalyticsSession {
102
104
  // Guard against being handed a map w/o any precincts assigned
103
105
  if (U.isObjectEmpty(this.plan._planByGeoID))
104
106
  return false;
105
- preprocess_1.doPreprocessData(this, bLog);
106
- analyze_1.doAnalyzeDistricts(this, bLog);
107
- analyze_1.doAnalyzePlan(this, bLog);
108
- this._profile = score_1.profilePlan(this, bLog);
109
- this._scorecard = score_1.scorePlan(this, this._profile, bLog, overridesJSON);
110
- results_1.doAnalyzePostProcessing(this, bLog);
107
+ (0, preprocess_1.doPreprocessData)(this, bLog);
108
+ (0, analyze_1.doAnalyzeDistricts)(this, bLog);
109
+ (0, analyze_1.doAnalyzePlan)(this, bLog);
110
+ this._profile = (0, score_1.profilePlan)(this, bLog);
111
+ this._scorecard = (0, score_1.scorePlan)(this, this._profile, bLog, overridesJSON);
112
+ (0, results_1.doAnalyzePostProcessing)(this, bLog);
111
113
  }
112
114
  catch (e) {
113
115
  console.log("Exception caught by analyzePlan().");
@@ -119,11 +121,11 @@ class AnalyticsSession {
119
121
  // 11-03-2020 - Added for racially polarized voting analysis
120
122
  // NOTE - This assumes that analyzePlan() has been run!
121
123
  analyzeRacialPolarization(districtID, groups, bLog = false) {
122
- return minority_1.doAnalyzeRacialPolarization(this, districtID, groups, bLog);
124
+ return (0, minority_1.doAnalyzeRacialPolarization)(this, districtID, groups, bLog);
123
125
  }
124
126
  // NOTE - This assumes that analyzePlan() has been run!
125
127
  getDistrictStatistics(bLog = false) {
126
- return results_2.prepareDistrictStatistics(this, bLog);
128
+ return (0, results_2.prepareDistrictStatistics)(this, bLog);
127
129
  }
128
130
  getPlanProfile(bLog = false) {
129
131
  return this._profile;
@@ -144,7 +146,7 @@ class AnalyticsSession {
144
146
  }
145
147
  // NOTE - This assumes that analyzePlan() has been run!
146
148
  getRequirementsChecklist(bLog = false) {
147
- return results_2.prepareRequirementsChecklist(this, bLog);
149
+ return (0, results_2.prepareRequirementsChecklist)(this, bLog);
148
150
  }
149
151
  // NOTE - This assumes that analyzePlan() has been run!
150
152
  getDiscontiguousDistrictFeatures(bLog = false) {
@@ -231,8 +233,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
231
233
  return result;
232
234
  };
233
235
  Object.defineProperty(exports, "__esModule", ({ value: true }));
234
- exports.Graph = exports.invertPlan = exports.Plan = exports.State = exports.Counties = exports.fieldForFeature = exports.geoIDForFeature = exports.Features = exports.inferSelectedMinority = exports.Districts = void 0;
235
- const G = __importStar(__webpack_require__(/*! @dra2020/dra-graph */ "@dra2020/dra-graph"));
236
+ exports.GraphClass = exports.invertPlan = exports.Plan = exports.State = exports.Counties = exports.fieldForFeature = exports.geoIDForFeature = exports.Features = exports.inferSelectedMinority = exports.Districts = void 0;
237
+ const dra_analytics_1 = __webpack_require__(/*! @dra2020/dra-analytics */ "@dra2020/dra-analytics");
236
238
  const U = __importStar(__webpack_require__(/*! ./utils */ "./src/utils.ts"));
237
239
  const S = __importStar(__webpack_require__(/*! ./settings */ "./src/settings.ts"));
238
240
  const compact_1 = __webpack_require__(/*! ./compact */ "./src/compact.ts");
@@ -470,7 +472,7 @@ class Districts {
470
472
  demPct = demVotes / totVotes;
471
473
  repPct = repVotes / totVotes;
472
474
  othPct = othVotes / totVotes;
473
- DemSeat = political_1.fptpWin(demPct);
475
+ DemSeat = (0, political_1.fptpWin)(demPct);
474
476
  }
475
477
  // Total minority VAP
476
478
  let minorityPop = totalVAP - whitePop;
@@ -503,8 +505,8 @@ class Districts {
503
505
  const features = geoIDs;
504
506
  const nakedGraph = graph._graph;
505
507
  const nakedPlan = plan._planByGeoID;
506
- bContiguous = G.isConnected(features, nakedGraph, bLog);
507
- bNotEmbedded = (!G.isEmbedded(i, features, nakedPlan, nakedGraph, bLog));
508
+ bContiguous = dra_analytics_1.Graph.isConnected(features, nakedGraph, bLog);
509
+ bNotEmbedded = (!dra_analytics_1.Graph.isEmbedded(i, features, nakedPlan, nakedGraph, bLog));
508
510
  }
509
511
  { // UPDATE THE DISTRICT STATISTICS
510
512
  // NOTE - These are set below for both non-empty & empty districts:
@@ -619,7 +621,7 @@ class Districts {
619
621
  // the underlying function and exposing it here to illustrate the parallelism
620
622
  // with recalcStatistics(). These are called in tandem by doAnalyzeDistricts().
621
623
  extractDistrictShapeProperties(bLog = false) {
622
- compact_1.extractDistrictProperties(this._session, bLog);
624
+ (0, compact_1.extractDistrictProperties)(this._session, bLog);
623
625
  }
624
626
  getCountyIndex(geoID) {
625
627
  let countyFIPS = U.parseGeoID(geoID)['county'];
@@ -903,6 +905,26 @@ function fieldForFeature(f, dk /* dt: T.Dataset */, fk) {
903
905
  }
904
906
  // result = (_getFeatures(f, dk, (fk === 'D' ? 'D12' : 'R12')) + _getFeatures(f, dk, (fk === 'D' ? 'D16' : 'R16'))) / 2;
905
907
  }
908
+ else if (dk === 'P20GPR') {
909
+ switch (fk) {
910
+ case 'D': {
911
+ result = (_getFeatures(f, 'E16GPR', 'D') + _getFeatures(f, 'E20GPR', 'D')) / 2;
912
+ break;
913
+ }
914
+ case 'R': {
915
+ result = (_getFeatures(f, 'E16GPR', 'R') + _getFeatures(f, 'E20GPR', 'R')) / 2;
916
+ break;
917
+ }
918
+ case 'Tot': {
919
+ result = (_getFeatures(f, 'E16GPR', 'D') + _getFeatures(f, 'E20GPR', 'D') + _getFeatures(f, 'E16GPR', 'R') + _getFeatures(f, 'E20GPR', 'R')) / 2;
920
+ break;
921
+ }
922
+ default: {
923
+ console.log("Field not recognized.");
924
+ break;
925
+ }
926
+ }
927
+ }
906
928
  else
907
929
  result = _getFeatures(f, dk, fk);
908
930
  return result;
@@ -1062,7 +1084,7 @@ function invertPlan(plan, s, bLog = false) {
1062
1084
  return invertedPlan;
1063
1085
  }
1064
1086
  exports.invertPlan = invertPlan;
1065
- class Graph {
1087
+ class GraphClass {
1066
1088
  constructor(s, graph) {
1067
1089
  this._session = s;
1068
1090
  this._graph = graph;
@@ -1083,7 +1105,7 @@ class Graph {
1083
1105
  // return U.getObjectKeys(this._graph[node]);
1084
1106
  }
1085
1107
  }
1086
- exports.Graph = Graph;
1108
+ exports.GraphClass = GraphClass;
1087
1109
 
1088
1110
 
1089
1111
  /***/ }),
@@ -1114,17 +1136,17 @@ exports.doAnalyzeDistricts = doAnalyzeDistricts;
1114
1136
  // NOTE - I could make this table-driven, but I'm thinking that the explicit
1115
1137
  // calls might make chunking for aync easier.
1116
1138
  function doAnalyzePlan(s, bLog = false) {
1117
- s.tests[0 /* Complete */] = valid_1.doIsComplete(s, bLog);
1118
- s.tests[1 /* Contiguous */] = valid_1.doIsContiguous(s, bLog);
1119
- s.tests[2 /* FreeOfHoles */] = valid_1.doIsFreeOfHoles(s, bLog);
1139
+ s.tests[0 /* Complete */] = (0, valid_1.doIsComplete)(s, bLog);
1140
+ s.tests[1 /* Contiguous */] = (0, valid_1.doIsContiguous)(s, bLog);
1141
+ s.tests[2 /* FreeOfHoles */] = (0, valid_1.doIsFreeOfHoles)(s, bLog);
1120
1142
  // NOTE - I can't check whether a population deviation is legal or not, until
1121
1143
  // the raw % is normalized. A zero (0) would mean "too much" / "not legal," for
1122
1144
  // the given type of district (CD vs. LD). The EqualPopulation test is derived
1123
1145
  // from PopulationDeviation, as part of scorecard or test log preparation.
1124
1146
  // Create an empty test entry here though ...
1125
1147
  s.tests[3 /* EqualPopulation */] = s.getTest(3 /* EqualPopulation */);
1126
- s.tests[5 /* UnexpectedCountySplits */] = cohesive_1.doFindCountiesSplitUnexpectedly(s, bLog);
1127
- s.tests[6 /* VTDSplits */] = cohesive_1.doFindSplitVTDs(s, bLog);
1148
+ s.tests[5 /* UnexpectedCountySplits */] = (0, cohesive_1.doFindCountiesSplitUnexpectedly)(s, bLog);
1149
+ s.tests[6 /* VTDSplits */] = (0, cohesive_1.doFindSplitVTDs)(s, bLog);
1128
1150
  // Enable a Test Log and Scorecard to be generated
1129
1151
  s.bPlanAnalyzed = true;
1130
1152
  s.bPostProcessingDone = false;
@@ -1136,7 +1158,7 @@ exports.doAnalyzePlan = doAnalyzePlan;
1136
1158
  // Equal Population to be secondary pass/fail validation.
1137
1159
  //
1138
1160
  function doDeriveSecondaryTests(s, bLog = false) {
1139
- s.tests[3 /* EqualPopulation */] = equal_1.doHasEqualPopulations(s, bLog);
1161
+ s.tests[3 /* EqualPopulation */] = (0, equal_1.doHasEqualPopulations)(s, bLog);
1140
1162
  }
1141
1163
  exports.doDeriveSecondaryTests = doDeriveSecondaryTests;
1142
1164
 
@@ -1390,7 +1412,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
1390
1412
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1391
1413
  exports.scoreKIWYSICompactness = exports.extractDistrictProperties = void 0;
1392
1414
  const baseclient_1 = __webpack_require__(/*! @dra2020/baseclient */ "@dra2020/baseclient");
1393
- const Compactness = __importStar(__webpack_require__(/*! @dra2020/compactness */ "@dra2020/compactness"));
1415
+ const dra_analytics_1 = __webpack_require__(/*! @dra2020/dra-analytics */ "@dra2020/dra-analytics");
1394
1416
  const U = __importStar(__webpack_require__(/*! ./utils */ "./src/utils.ts"));
1395
1417
  // HELPER TO EXTRACT PROPERTIES OF DISTRICT SHAPES
1396
1418
  function extractDistrictProperties(s, bLog = false) {
@@ -1441,7 +1463,7 @@ function scoreKIWYSICompactness(s, bLog = false) {
1441
1463
  goodShapes.features.push(f);
1442
1464
  }
1443
1465
  }
1444
- const scores = Compactness.scoreShapes(goodShapes, 0 /* Revised */);
1466
+ const scores = dra_analytics_1.Compactness.scoreShapes(goodShapes, 0 /* Revised */);
1445
1467
  // Round & invert the scores here at the source vs. later on, higher up.
1446
1468
  // Raw KIWYSI scores will be 1–100 with smaller better, so map to 1–100 bigger better.
1447
1469
  return scores.map(n => 100 - Math.round(n) + 1);
@@ -1544,7 +1566,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
1544
1566
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
1545
1567
  };
1546
1568
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1547
- exports.inferSelectedMinority = exports.fieldForFeature = exports.geoIDForFeature = void 0;
1569
+ exports.uncertaintyOfMembership = exports.effectiveSplits = exports.inferSelectedMinority = exports.fieldForFeature = exports.geoIDForFeature = void 0;
1548
1570
  __exportStar(__webpack_require__(/*! ./_api */ "./src/_api.ts"), exports);
1549
1571
  var _data_1 = __webpack_require__(/*! ./_data */ "./src/_data.ts");
1550
1572
  Object.defineProperty(exports, "geoIDForFeature", ({ enumerable: true, get: function () { return _data_1.geoIDForFeature; } }));
@@ -1553,6 +1575,10 @@ Object.defineProperty(exports, "inferSelectedMinority", ({ enumerable: true, get
1553
1575
  __exportStar(__webpack_require__(/*! ./results */ "./src/results.ts"), exports);
1554
1576
  __exportStar(__webpack_require__(/*! ./types */ "./src/types.ts"), exports);
1555
1577
  __exportStar(__webpack_require__(/*! ./utils */ "./src/utils.ts"), exports);
1578
+ // Re-export RPV types and COI splitting functions
1579
+ const dra_analytics_1 = __webpack_require__(/*! @dra2020/dra-analytics */ "@dra2020/dra-analytics");
1580
+ exports.effectiveSplits = dra_analytics_1.Splitting.effectiveSplits;
1581
+ exports.uncertaintyOfMembership = dra_analytics_1.Splitting.uncertaintyOfMembership;
1556
1582
 
1557
1583
 
1558
1584
  /***/ }),
@@ -1567,31 +1593,12 @@ __exportStar(__webpack_require__(/*! ./utils */ "./src/utils.ts"), exports);
1567
1593
  //
1568
1594
  // PROTECTS MINORITIES
1569
1595
  //
1570
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
1571
- if (k2 === undefined) k2 = k;
1572
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
1573
- }) : (function(o, m, k, k2) {
1574
- if (k2 === undefined) k2 = k;
1575
- o[k2] = m[k];
1576
- }));
1577
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
1578
- Object.defineProperty(o, "default", { enumerable: true, value: v });
1579
- }) : function(o, v) {
1580
- o["default"] = v;
1581
- });
1582
- var __importStar = (this && this.__importStar) || function (mod) {
1583
- if (mod && mod.__esModule) return mod;
1584
- var result = {};
1585
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
1586
- __setModuleDefault(result, mod);
1587
- return result;
1588
- };
1589
1596
  var __importDefault = (this && this.__importDefault) || function (mod) {
1590
1597
  return (mod && mod.__esModule) ? mod : { "default": mod };
1591
1598
  };
1592
1599
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1593
1600
  exports.doAnalyzeRacialPolarization = exports.getVRASection5 = exports.getMajorityMinority = void 0;
1594
- const RPV = __importStar(__webpack_require__(/*! @dra2020/racial-voting */ "@dra2020/racial-voting"));
1601
+ const dra_analytics_1 = __webpack_require__(/*! @dra2020/dra-analytics */ "@dra2020/dra-analytics");
1595
1602
  const majority_minority_json_1 = __importDefault(__webpack_require__(/*! ../static/majority-minority.json */ "./static/majority-minority.json"));
1596
1603
  const vra5_preclearance_json_1 = __importDefault(__webpack_require__(/*! ../static/vra5-preclearance.json */ "./static/vra5-preclearance.json"));
1597
1604
  // TODO - Update/revise this, when the update comes out in September:
@@ -1626,7 +1633,7 @@ function doAnalyzeRacialPolarization(s, districtID, groups, bLog = false) {
1626
1633
  return undefined;
1627
1634
  if (points.comparison.length <= 10)
1628
1635
  return undefined;
1629
- return RPV.analyzeRacialVoting(points, districtID, groups);
1636
+ return dra_analytics_1.Minority.analyzeRacialVoting(points, districtID, groups);
1630
1637
  }
1631
1638
  exports.doAnalyzeRacialPolarization = doAnalyzeRacialPolarization;
1632
1639
  // 11-18-2020 - Moved RPV to racial-voting package.
@@ -2029,9 +2036,11 @@ function doAnalyzePostProcessing(s, bLog = false) {
2029
2036
  scorecard.splitting.details['nCountiesSplit'] = simpleSplits['details']['nCountiesSplit'];
2030
2037
  scorecard.splitting.details['nSingleCountyDistricts'] = simpleSplits['details']['nSingleCountyDistricts'];
2031
2038
  scorecard.splitting.details['singleCountyDistrictMax'] = simpleSplits['details']['singleCountyDistrictMax'];
2039
+ // 07-17-21 - Enumerate # of times each split county is split
2040
+ scorecard.splitting.details['countiesWithSplits'] = simpleSplits['details']['countiesWithSplits'];
2032
2041
  // NOTE - Add split precincts in dra-client directly
2033
2042
  // Derive secondary tests
2034
- analyze_1.doDeriveSecondaryTests(s, bLog);
2043
+ (0, analyze_1.doDeriveSecondaryTests)(s, bLog);
2035
2044
  // Toggle the semaphore, so postprocessing isn't for both the testlog & scorecard
2036
2045
  s.bPostProcessingDone = true;
2037
2046
  }
@@ -2387,7 +2396,7 @@ function isUninhabited(geoID, s) {
2387
2396
  const f = s.features.featureByIndex(featureID);
2388
2397
  // 03-27-21
2389
2398
  const dk = s.features._keys["CENSUS" /* CENSUS */];
2390
- const totalPop = _data_1.fieldForFeature(f, dk, "Tot" /* TotalPop */);
2399
+ const totalPop = (0, _data_1.fieldForFeature)(f, dk, "Tot" /* TotalPop */);
2391
2400
  // const totalPop = s.features.fieldForFeature(f, T.Dataset.CENSUS, T.FeatureField.TotalPop);
2392
2401
  let bUninhabited = (totalPop > 0) ? false : true;
2393
2402
  // HACK for Kentucky's atypical data, so the official map shows as complete
@@ -2761,26 +2770,6 @@ function doIsFreeOfHoles(s, bLog = false) {
2761
2770
  exports.doIsFreeOfHoles = doIsFreeOfHoles;
2762
2771
 
2763
2772
 
2764
- /***/ }),
2765
-
2766
- /***/ "./static/majority-minority.json":
2767
- /*!***************************************!*\
2768
- !*** ./static/majority-minority.json ***!
2769
- \***************************************/
2770
- /***/ ((module) => {
2771
-
2772
- module.exports = JSON.parse("{\"AL\":{\"Black\":[7],\"Hispanic\":[],\"Pacific\":[]},\"AK\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"AZ\":{\"Black\":[],\"Hispanic\":[2,4,7],\"Pacific\":[]},\"AR\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"CA\":{\"Black\":[13,37,43],\"Hispanic\":[17,18,20,21,28,31,32,34,35,38,39,43,45,47,51],\"Pacific\":[12,13,14,15,17,18,19,27,34,39,45,47,52]},\"CO\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"CT\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"DC\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"DE\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"FL\":{\"Black\":[5,20,24],\"Hispanic\":[18,21,25],\"Pacific\":[]},\"GA\":{\"Black\":[2,4,5,13],\"Hispanic\":[],\"Pacific\":[]},\"HI\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[2]},\"ID\":{\"Black\":[],\"Hispanic\":[1],\"Pacific\":[]},\"IL\":{\"Black\":[1,2,7],\"Hispanic\":[4],\"Pacific\":[]},\"IN\":{\"Black\":[7],\"Hispanic\":[],\"Pacific\":[]},\"IA\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"KS\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"KY\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"LA\":{\"Black\":[2],\"Hispanic\":[],\"Pacific\":[]},\"ME\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"MD\":{\"Black\":[4,7],\"Hispanic\":[],\"Pacific\":[]},\"MA\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"MI\":{\"Black\":[13,14],\"Hispanic\":[],\"Pacific\":[]},\"MN\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"MS\":{\"Black\":[2],\"Hispanic\":[],\"Pacific\":[]},\"MO\":{\"Black\":[1,5],\"Hispanic\":[],\"Pacific\":[]},\"MT\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"NE\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"NV\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"NH\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"NJ\":{\"Black\":[10,12],\"Hispanic\":[13],\"Pacific\":[6]},\"NM\":{\"Black\":[],\"Hispanic\":[2,13],\"Pacific\":[]},\"NY\":{\"Black\":[5,8,9,13],\"Hispanic\":[12,16],\"Pacific\":[6,7,10]},\"NC\":{\"Black\":[1,12],\"Hispanic\":[],\"Pacific\":[]},\"ND\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"OH\":{\"Black\":[3,11],\"Hispanic\":[],\"Pacific\":[]},\"OK\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"OR\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"PA\":{\"Black\":[2],\"Hispanic\":[],\"Pacific\":[]},\"PR\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"RI\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"SC\":{\"Black\":[6],\"Hispanic\":[],\"Pacific\":[]},\"SD\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"TN\":{\"Black\":[9],\"Hispanic\":[],\"Pacific\":[]},\"TX\":{\"Black\":[9,18,33],\"Hispanic\":[15,16,19,20,23,27,28,29,32],\"Pacific\":[]},\"UT\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"VT\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"VA\":{\"Black\":[3],\"Hispanic\":[],\"Pacific\":[]},\"WA\":{\"Black\":[],\"Hispanic\":[3],\"Pacific\":[9]},\"WV\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]},\"WI\":{\"Black\":[4],\"Hispanic\":[],\"Pacific\":[]},\"WY\":{\"Black\":[],\"Hispanic\":[],\"Pacific\":[]}}");
2773
-
2774
- /***/ }),
2775
-
2776
- /***/ "./static/vra5-preclearance.json":
2777
- /*!***************************************!*\
2778
- !*** ./static/vra5-preclearance.json ***!
2779
- \***************************************/
2780
- /***/ ((module) => {
2781
-
2782
- module.exports = JSON.parse("{\"AL\":\"all\",\"AK\":\"all\",\"AZ\":\"all\",\"CA\":\"parts\",\"FL\":\"parts\",\"GA\":\"all\",\"LA\":\"all\",\"MI\":\"parts\",\"MS\":\"all\",\"NY\":\"parts\",\"NC\":\"parts\",\"SC\":\"all\",\"SD\":\"parts\",\"TX\":\"all\",\"VA\":\"all\"}");
2783
-
2784
2773
  /***/ }),
2785
2774
 
2786
2775
  /***/ "@dra2020/baseclient":
@@ -2789,57 +2778,57 @@ module.exports = JSON.parse("{\"AL\":\"all\",\"AK\":\"all\",\"AZ\":\"all\",\"CA\
2789
2778
  \**************************************/
2790
2779
  /***/ ((module) => {
2791
2780
 
2792
- module.exports = require("@dra2020/baseclient");;
2781
+ module.exports = require("@dra2020/baseclient");
2793
2782
 
2794
2783
  /***/ }),
2795
2784
 
2796
- /***/ "@dra2020/compactness":
2797
- /*!***************************************!*\
2798
- !*** external "@dra2020/compactness" ***!
2799
- \***************************************/
2785
+ /***/ "@dra2020/dra-analytics":
2786
+ /*!*****************************************!*\
2787
+ !*** external "@dra2020/dra-analytics" ***!
2788
+ \*****************************************/
2800
2789
  /***/ ((module) => {
2801
2790
 
2802
- module.exports = require("@dra2020/compactness");;
2791
+ module.exports = require("@dra2020/dra-analytics");
2803
2792
 
2804
2793
  /***/ }),
2805
2794
 
2806
- /***/ "@dra2020/dra-graph":
2795
+ /***/ "@dra2020/dra-score":
2807
2796
  /*!*************************************!*\
2808
- !*** external "@dra2020/dra-graph" ***!
2797
+ !*** external "@dra2020/dra-score" ***!
2809
2798
  \*************************************/
2810
2799
  /***/ ((module) => {
2811
2800
 
2812
- module.exports = require("@dra2020/dra-graph");;
2801
+ module.exports = require("@dra2020/dra-score");
2813
2802
 
2814
2803
  /***/ }),
2815
2804
 
2816
- /***/ "@dra2020/dra-score":
2805
+ /***/ "@dra2020/dra-types":
2817
2806
  /*!*************************************!*\
2818
- !*** external "@dra2020/dra-score" ***!
2807
+ !*** external "@dra2020/dra-types" ***!
2819
2808
  \*************************************/
2820
2809
  /***/ ((module) => {
2821
2810
 
2822
- module.exports = require("@dra2020/dra-score");;
2811
+ module.exports = require("@dra2020/dra-types");
2823
2812
 
2824
2813
  /***/ }),
2825
2814
 
2826
- /***/ "@dra2020/dra-types":
2827
- /*!*************************************!*\
2828
- !*** external "@dra2020/dra-types" ***!
2829
- \*************************************/
2815
+ /***/ "./static/majority-minority.json":
2816
+ /*!***************************************!*\
2817
+ !*** ./static/majority-minority.json ***!
2818
+ \***************************************/
2830
2819
  /***/ ((module) => {
2831
2820
 
2832
- module.exports = require("@dra2020/dra-types");;
2821
+ module.exports = JSON.parse('{"AL":{"Black":[7],"Hispanic":[],"Pacific":[]},"AK":{"Black":[],"Hispanic":[],"Pacific":[]},"AZ":{"Black":[],"Hispanic":[2,4,7],"Pacific":[]},"AR":{"Black":[],"Hispanic":[],"Pacific":[]},"CA":{"Black":[13,37,43],"Hispanic":[17,18,20,21,28,31,32,34,35,38,39,43,45,47,51],"Pacific":[12,13,14,15,17,18,19,27,34,39,45,47,52]},"CO":{"Black":[],"Hispanic":[],"Pacific":[]},"CT":{"Black":[],"Hispanic":[],"Pacific":[]},"DC":{"Black":[],"Hispanic":[],"Pacific":[]},"DE":{"Black":[],"Hispanic":[],"Pacific":[]},"FL":{"Black":[5,20,24],"Hispanic":[18,21,25],"Pacific":[]},"GA":{"Black":[2,4,5,13],"Hispanic":[],"Pacific":[]},"HI":{"Black":[],"Hispanic":[],"Pacific":[2]},"ID":{"Black":[],"Hispanic":[1],"Pacific":[]},"IL":{"Black":[1,2,7],"Hispanic":[4],"Pacific":[]},"IN":{"Black":[7],"Hispanic":[],"Pacific":[]},"IA":{"Black":[],"Hispanic":[],"Pacific":[]},"KS":{"Black":[],"Hispanic":[],"Pacific":[]},"KY":{"Black":[],"Hispanic":[],"Pacific":[]},"LA":{"Black":[2],"Hispanic":[],"Pacific":[]},"ME":{"Black":[],"Hispanic":[],"Pacific":[]},"MD":{"Black":[4,7],"Hispanic":[],"Pacific":[]},"MA":{"Black":[],"Hispanic":[],"Pacific":[]},"MI":{"Black":[13,14],"Hispanic":[],"Pacific":[]},"MN":{"Black":[],"Hispanic":[],"Pacific":[]},"MS":{"Black":[2],"Hispanic":[],"Pacific":[]},"MO":{"Black":[1,5],"Hispanic":[],"Pacific":[]},"MT":{"Black":[],"Hispanic":[],"Pacific":[]},"NE":{"Black":[],"Hispanic":[],"Pacific":[]},"NV":{"Black":[],"Hispanic":[],"Pacific":[]},"NH":{"Black":[],"Hispanic":[],"Pacific":[]},"NJ":{"Black":[10,12],"Hispanic":[13],"Pacific":[6]},"NM":{"Black":[],"Hispanic":[2,13],"Pacific":[]},"NY":{"Black":[5,8,9,13],"Hispanic":[12,16],"Pacific":[6,7,10]},"NC":{"Black":[1,12],"Hispanic":[],"Pacific":[]},"ND":{"Black":[],"Hispanic":[],"Pacific":[]},"OH":{"Black":[3,11],"Hispanic":[],"Pacific":[]},"OK":{"Black":[],"Hispanic":[],"Pacific":[]},"OR":{"Black":[],"Hispanic":[],"Pacific":[]},"PA":{"Black":[2],"Hispanic":[],"Pacific":[]},"PR":{"Black":[],"Hispanic":[],"Pacific":[]},"RI":{"Black":[],"Hispanic":[],"Pacific":[]},"SC":{"Black":[6],"Hispanic":[],"Pacific":[]},"SD":{"Black":[],"Hispanic":[],"Pacific":[]},"TN":{"Black":[9],"Hispanic":[],"Pacific":[]},"TX":{"Black":[9,18,33],"Hispanic":[15,16,19,20,23,27,28,29,32],"Pacific":[]},"UT":{"Black":[],"Hispanic":[],"Pacific":[]},"VT":{"Black":[],"Hispanic":[],"Pacific":[]},"VA":{"Black":[3],"Hispanic":[],"Pacific":[]},"WA":{"Black":[],"Hispanic":[3],"Pacific":[9]},"WV":{"Black":[],"Hispanic":[],"Pacific":[]},"WI":{"Black":[4],"Hispanic":[],"Pacific":[]},"WY":{"Black":[],"Hispanic":[],"Pacific":[]}}');
2833
2822
 
2834
2823
  /***/ }),
2835
2824
 
2836
- /***/ "@dra2020/racial-voting":
2837
- /*!*****************************************!*\
2838
- !*** external "@dra2020/racial-voting" ***!
2839
- \*****************************************/
2825
+ /***/ "./static/vra5-preclearance.json":
2826
+ /*!***************************************!*\
2827
+ !*** ./static/vra5-preclearance.json ***!
2828
+ \***************************************/
2840
2829
  /***/ ((module) => {
2841
2830
 
2842
- module.exports = require("@dra2020/racial-voting");;
2831
+ module.exports = JSON.parse('{"AL":"all","AK":"all","AZ":"all","CA":"parts","FL":"parts","GA":"all","LA":"all","MI":"parts","MS":"all","NY":"parts","NC":"parts","SC":"all","SD":"parts","TX":"all","VA":"all"}');
2843
2832
 
2844
2833
  /***/ })
2845
2834
 
@@ -2851,8 +2840,9 @@ module.exports = require("@dra2020/racial-voting");;
2851
2840
  /******/ // The require function
2852
2841
  /******/ function __webpack_require__(moduleId) {
2853
2842
  /******/ // Check if module is in cache
2854
- /******/ if(__webpack_module_cache__[moduleId]) {
2855
- /******/ return __webpack_module_cache__[moduleId].exports;
2843
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
2844
+ /******/ if (cachedModule !== undefined) {
2845
+ /******/ return cachedModule.exports;
2856
2846
  /******/ }
2857
2847
  /******/ // Create a new module (and put it into the cache)
2858
2848
  /******/ var module = __webpack_module_cache__[moduleId] = {
@@ -2869,10 +2859,13 @@ module.exports = require("@dra2020/racial-voting");;
2869
2859
  /******/ }
2870
2860
  /******/
2871
2861
  /************************************************************************/
2872
- /******/ // module exports must be returned from runtime so entry inlining is disabled
2862
+ /******/
2873
2863
  /******/ // startup
2874
2864
  /******/ // Load entry module and return exports
2875
- /******/ return __webpack_require__("./src/index.ts");
2865
+ /******/ // This entry module is referenced by other modules so it can't be inlined
2866
+ /******/ var __webpack_exports__ = __webpack_require__("./src/index.ts");
2867
+ /******/
2868
+ /******/ return __webpack_exports__;
2876
2869
  /******/ })()
2877
2870
  ;
2878
2871
  });