epstein-files 1.1.0__py3-none-any.whl → 1.1.2__py3-none-any.whl

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.
@@ -1,4 +1,6 @@
1
+ import json
1
2
  import re
3
+ from abc import ABC
2
4
  from dataclasses import dataclass, field
3
5
 
4
6
  from rich.highlighter import RegexHighlighter
@@ -7,10 +9,11 @@ from rich.text import Text
7
9
  from epstein_files.util.constant.names import *
8
10
  from epstein_files.util.constant.strings import *
9
11
  from epstein_files.util.constant.urls import ARCHIVE_LINK_COLOR
10
- from epstein_files.util.constants import (EMAILER_ID_REGEXES, EPSTEIN_V_ROTHSTEIN_EDWARDS, HEADER_ABBREVIATIONS,
12
+ from epstein_files.util.constants import (EMAILER_ID_REGEXES, EPSTEIN_V_ROTHSTEIN_EDWARDS,
11
13
  OSBORNE_LLP, REPLY_REGEX, SENT_FROM_REGEX, VIRGIN_ISLANDS)
12
14
  from epstein_files.util.doc_cfg import *
13
- from epstein_files.util.data import extract_last_name, listify, without_falsey
15
+ from epstein_files.util.data import extract_last_name, without_falsey
16
+ from epstein_files.util.logging import logger
14
17
 
15
18
  CIVIL_ATTORNEY = 'civil attorney'
16
19
  CRIMINAL_DEFENSE_ATTORNEY = 'criminal defense attorney'
@@ -19,6 +22,7 @@ EPSTEIN_LAWYER = 'Epstein lawyer'
19
22
  EPSTEIN_V_ROTHSTEIN_EDWARDS_ATTORNEY = f"{CIVIL_ATTORNEY} working on {EPSTEIN_V_ROTHSTEIN_EDWARDS}"
20
23
  ESTATE_EXECUTOR = 'estate executor'
21
24
  EPSTEIN_ESTATE_EXECUTOR = f"Epstein {ESTATE_EXECUTOR}"
25
+ QUESTION_MARKS_TXT = Text(QUESTION_MARKS, style='dim')
22
26
  REGEX_STYLE_PREFIX = 'regex'
23
27
  SIMPLE_NAME_REGEX = re.compile(r"^[-\w ]+$", re.IGNORECASE)
24
28
 
@@ -40,9 +44,9 @@ CATEGORY_STYLES = {
40
44
 
41
45
 
42
46
  @dataclass(kw_only=True)
43
- class HighlightedText:
47
+ class BaseHighlight:
44
48
  """
45
- Color highlighting for things other than people's names (e.g. phone numbers, email headers).
49
+ Regex and style information.
46
50
 
47
51
  Attributes:
48
52
  label (str): RegexHighlighter match group name, defaults to 1st 'emailers' key if only 1 emailer provided
@@ -52,24 +56,47 @@ class HighlightedText:
52
56
  theme_style_name (str): The style name that must be a part of the rich.Console's theme
53
57
  """
54
58
  label: str = ''
55
- pattern: str = ''
56
- style: str
57
59
  regex: re.Pattern = field(init=False)
60
+ style: str
58
61
  theme_style_name: str = field(init=False)
59
62
  _capture_group_label: str = field(init=False)
60
63
  _match_group_var: str = field(init=False)
61
64
 
62
65
  def __post_init__(self):
63
66
  if not self.label:
64
- raise ValueError(f"No label provided for {repr(self)}")
67
+ raise ValueError(f'Missing label for {self}')
65
68
 
66
69
  self._capture_group_label = self.label.lower().replace(' ', '_').replace('-', '_')
67
70
  self._match_group_var = fr"?P<{self._capture_group_label}>"
68
71
  self.theme_style_name = f"{REGEX_STYLE_PREFIX}.{self._capture_group_label}"
69
- self.regex = re.compile(fr"({self._match_group_var}{self.pattern})", re.IGNORECASE | re.MULTILINE)
70
72
 
71
- def __str__(self) -> str:
72
- return f"{type(self).__name__}(label='{self.label}')"
73
+
74
+ @dataclass(kw_only=True)
75
+ class HighlightedText(BaseHighlight):
76
+ """
77
+ Color highlighting for things other than people's names (e.g. phone numbers, email headers).
78
+
79
+ Attributes:
80
+ label (str): RegexHighlighter match group name, defaults to 1st 'emailers' key if only 1 emailer provided
81
+ patterns (list[str]): regex patterns identifying strings matching this group
82
+ regex (re.Pattern): matches self.pattern
83
+ style (str): Rich style to apply to text matching this group
84
+ theme_style_name (str): The style name that must be a part of the rich.Console's theme
85
+ """
86
+ patterns: list[str] = field(default_factory=list)
87
+ _pattern: str = field(init=False)
88
+
89
+ def __post_init__(self):
90
+ super().__post_init__()
91
+
92
+ if not self.label:
93
+ raise ValueError(f"No label provided for {repr(self)}")
94
+
95
+ self._pattern = '|'.join(self.patterns)
96
+ self.regex = re.compile(fr"({self._match_group_var}{self._pattern})", re.IGNORECASE | re.MULTILINE)
97
+
98
+ def __repr__(self) -> str:
99
+ return f"{type(self).__name__}(label='{self.label}', pattern='{self._pattern}', style='{self.style}')"
73
100
 
74
101
 
75
102
  @dataclass(kw_only=True)
@@ -85,10 +112,9 @@ class HighlightedNames(HighlightedText):
85
112
  """
86
113
  category: str = ''
87
114
  emailers: dict[str, str | None] = field(default_factory=dict)
88
- _pattern: str = field(init=False)
89
115
 
90
116
  def __post_init__(self):
91
- if not (self.emailers or self.pattern):
117
+ if not (self.emailers or self.patterns):
92
118
  raise ValueError(f"Must provide either 'emailers' or 'pattern' arg.")
93
119
  elif not self.label:
94
120
  if len(self.emailers) == 1:
@@ -97,13 +123,13 @@ class HighlightedNames(HighlightedText):
97
123
  raise ValueError(f"No label provided for {repr(self)}")
98
124
 
99
125
  super().__post_init__()
100
- self._pattern = '|'.join([self._emailer_pattern(e) for e in self.emailers] + listify(self.pattern))
126
+ self._pattern = '|'.join([self._emailer_pattern(e) for e in self.emailers] + self.patterns)
101
127
  self.regex = re.compile(fr"\b({self._match_group_var}({self._pattern})s?)\b", re.IGNORECASE)
102
128
 
103
129
  def get_info(self, name: str) -> str | None:
104
130
  """Label and additional info for 'name' if 'name' is in self.emailers."""
105
131
  info_pieces = [
106
- None if len(self.emailers) == 1 else (self.category or self.label.replace('_', ' ')),
132
+ self.category or ('' if len(self.emailers) == 1 else self.label.replace('_', ' ')),
107
133
  self.emailers.get(name),
108
134
  ]
109
135
 
@@ -136,89 +162,284 @@ class HighlightedNames(HighlightedText):
136
162
  return '|'.join(name_patterns)
137
163
 
138
164
  def __str__(self) -> str:
139
- return f"{type(self).__name__}(label='{self.label}')"
165
+ return super().__str__()
166
+
167
+ def __repr__(self) -> str:
168
+ s = f"{type(self).__name__}("
169
+
170
+ for property in ['label', 'style', 'category', 'patterns', 'emailers']:
171
+ value = getattr(self, property)
172
+
173
+ if not value or (property == 'label' and len(self.emailers) == 1 and not self.patterns):
174
+ continue
175
+
176
+ s += f"\n {property}="
177
+
178
+ if isinstance(value, dict):
179
+ s += '{'
180
+
181
+ for k, v in value.items():
182
+ s += f"\n {constantize_name(k)}: {json.dumps(v).replace('null', 'None')},"
183
+
184
+ s += '\n },'
185
+ elif property == 'patterns':
186
+ s += '[\n '
187
+ s += repr(value).removeprefix('[').removesuffix(']').replace(', ', ',\n ')
188
+ s += ',\n ],'
189
+ else:
190
+ s += f"{json.dumps(value)},"
191
+
192
+ return s + '\n)'
193
+
194
+
195
+ @dataclass(kw_only=True)
196
+ class ManualHighlight(BaseHighlight):
197
+ """For when you can't construct the regex."""
198
+ pattern: str
199
+
200
+ def __post_init__(self):
201
+ super().__post_init__()
202
+
203
+ if self._match_group_var not in self.pattern:
204
+ raise ValueError(f"Label '{self.label}' must appear in regex pattern '{self.pattern}'")
205
+
206
+ self.regex = re.compile(self.pattern, re.MULTILINE)
140
207
 
141
208
 
142
209
  HIGHLIGHTED_NAMES = [
210
+ # This has to come first to get both stylings applied to the email subjects
211
+ ManualHighlight(
212
+ label='email_subject',
213
+ style='light_yellow3',
214
+ pattern=r"^(> )?Subject: (?P<email_subject>.*)",
215
+ ),
216
+ HighlightedNames(
217
+ label=ACADEMIA,
218
+ style='light_goldenrod2',
219
+ emailers={
220
+ DAVID_HAIG: 'evolutionary geneticist?',
221
+ JOSCHA_BACH: 'cognitive science / AI research',
222
+ 'Daniel Kahneman': 'Nobel economic sciences laureate and cognitivie psychologist (?)',
223
+ 'Ed Boyden': f'Associate Professor, {MIT_MEDIA_LAB} neurobiology',
224
+ LAWRENCE_KRAUSS: 'theoretical physicist',
225
+ LINDA_STONE: f'ex-Microsoft, {MIT_MEDIA_LAB}',
226
+ MARK_TRAMO: 'professor of neurology at UCLA',
227
+ 'Nancy Dahl': 'wife of Lawrence Krauss',
228
+ NEAL_KASSELL: 'professor of neurosurgery at University of Virginia',
229
+ PETER_ATTIA: 'longevity medicine',
230
+ ROBERT_TRIVERS: 'evolutionary biology',
231
+ ROGER_SCHANK: 'Teachers College, Columbia University',
232
+ },
233
+ patterns=[
234
+ r"Alain Forget",
235
+ r"Brotherton",
236
+ r"Carl\s*Sagan",
237
+ r"Columbia",
238
+ r"David Grosof",
239
+ r"J(ames|im)\s*Watson",
240
+ r"(Lord\s*)?Martin\s*Rees",
241
+ r"Massachusetts\s*Institute\s*of\s*Technology",
242
+ r"Media\s*Lab",
243
+ r"Minsky",
244
+ r"MIT(\s*Media\s*Lab)?",
245
+ r"((Noam|Valeria)\s*)?Chomsky",
246
+ r"Norman\s*Finkelstein",
247
+ r"Praluent",
248
+ r"Regeneron",
249
+ r"(Richard\s*)?Dawkins",
250
+ r"Sanofi",
251
+ r"Stanford",
252
+ r"(Stephen\s*)?Hawking",
253
+ r"(Steven?\s*)?Pinker",
254
+ r"UCLA",
255
+ ],
256
+ ),
143
257
  HighlightedNames(
144
258
  label='Africa',
145
259
  style='light_pink4',
146
- pattern=r'Buhari|Econet(\s*Wireless)|Ghana(ian)?|Glencore|Goodluck Jonathan|Johannesburg|Kenya|Nigerian?|Okey Enelamah|Senegal(ese)?|Serengeti|(South\s*)?African?|(Strive\s*)?Masiyiwa|Tanzania|Ugandan?|Zimbabwe(an)?',
147
260
  emailers={
148
- 'Abdoulaye Wade': 'former president of Senegal, father of Karim Wade',
261
+ 'Abdoulaye Wade': "former president of Senegal, father of Karim Wade",
149
262
  'Ivan Glasenberg': "South African former CEO of Glencore, one of the world's largest commodity trading and mining companies",
150
263
  'Karim Wade': 'son of the president of Senegal, facing arrest for corruption, email handle is "Afri zp"',
151
- 'Miles Alexander': 'Operations Manager Michaelhouse Balgowan KwaZulu-Natal South Africa', # TODO: what's up with this person?
264
+ 'Miles Alexander': 'Operations Manager Michaelhouse Balgowan KwaZulu-Natal South Africa',
152
265
  'Macky Sall': 'prime minister of Senegal, defeated Abdoulaye Wade',
153
266
  },
267
+ patterns=[
268
+ r"Buhari",
269
+ r"Econet(\s*Wireless)",
270
+ r"Ghana(ian)?",
271
+ r"Glencore",
272
+ r"Goodluck Jonathan",
273
+ r"Johannesburg",
274
+ r"Kenya",
275
+ r"Nigerian?",
276
+ r"Okey Enelamah",
277
+ r"Senegal(ese)?",
278
+ r"Serengeti",
279
+ r"(South\s*)?African?",
280
+ r"(Strive\s*)?Masiyiwa",
281
+ r"Tanzania",
282
+ r"Ugandan?",
283
+ r"Zimbabwe(an)?",
284
+ ],
154
285
  ),
155
286
  HighlightedNames(
156
287
  label='bitcoin',
157
288
  style='orange1 bold',
158
- pattern=r'Balaji|bitcoin|block ?chain(\s*capital)?|Brock(\s*Pierce)?|coins?|cr[iy]?pto(currenc(y|ies))?|e-currency|(Gavin )?Andressen|(Howard\s+)?Lutnic?k|Libra|Madars|(Patrick\s*)?Murck|(Ross\s*)?Ulbricht|Silk\s*Road|SpanCash|Tether|virtual\s*currenc(ies|y)|(zero\s+knowledge\s+|zk)pro(of|tocols?)',
159
- emailers = {
289
+ emailers={
160
290
  'Jeffrey Wernick': 'former COO of Parler, involved in numerous crypto companies like Bitforex',
161
291
  JEREMY_RUBIN: 'developer/researcher',
292
+ JOI_ITO: f"former head of {MIT_MEDIA_LAB} and MIT Digital Currency Initiative",
162
293
  ANTHONY_SCARAMUCCI: 'Skybridge Capital, FTX investor',
163
294
  },
295
+ patterns=[
296
+ r"Balaji",
297
+ r"bitcoin",
298
+ r"block ?chain(\s*capital)?",
299
+ r"Brock(\s*Pierce)?",
300
+ r"coins?",
301
+ r"cr[iy]?pto(currenc(y|ies))?",
302
+ r"e-currency",
303
+ r"(Gavin )?Andressen",
304
+ r"(Howard\s+)?Lutnic?k",
305
+ r"Libra",
306
+ r"Madars",
307
+ r"(Patrick\s*)?Murck",
308
+ r"(Ross\s*)?Ulbricht",
309
+ r"Silk\s*Road",
310
+ r"SpanCash",
311
+ r"Tether",
312
+ r"virtual\s*currenc(ies|y)",
313
+ r"(zero\s+knowledge\s+|zk)pro(of|tocols?)",
314
+ ],
164
315
  ),
165
316
  HighlightedNames(
166
317
  label=BUSINESS,
167
318
  style='spring_green4',
168
- pattern=r'Gruterite|(John\s*)?Kluge|Marc Rich|(Mi(chael|ke)\s*)?Ovitz|(Steve\s+)?Wynn|(Les(lie)?\s+)?Wexner|New Leaf Ventures|Park Partners|SALSS|Swedish[-\s]*American\s*Life\s*Science\s*Summit|Valhi|(Yves\s*)?Bouvier',
169
- emailers = {
319
+ emailers={
170
320
  ALIREZA_ITTIHADIEH: 'CEO Freestream Aircraft Limited',
171
321
  BARBRO_C_EHNBOM: 'Swedish pharmaceuticals, SALSS',
322
+ 'David Mitchell': 'president of New York real estate development firm Mitchell Holdings',
172
323
  FRED_HADDAD: "co-founder of Heck's in West Virginia",
173
- GERALD_BARTON: "Maryland property developer Landmark Land Company, fan of Trump's Irish golf course",
324
+ GERALD_BARTON: "Maryland property developer Landmark Land Company",
174
325
  GORDON_GETTY: 'heir of oil tycoon J. Paul Getty',
175
326
  NICHOLAS_RIBIS: 'Hilton CEO, former president of Trump Organization',
176
327
  'Philip Kafka': 'president of Prince Concepts (and son of Terry Kafka?)',
177
- ROBERT_LAWRENCE_KUHN: "investment banker, China expert",
328
+ ROBERT_LAWRENCE_KUHN: 'investment banker, China expert',
178
329
  TERRY_KAFKA: 'CEO of Impact Outdoor (highway billboards)',
179
330
  TOM_PRITZKER: 'brother of J.B. Pritzker',
180
- }
331
+ },
332
+ patterns=[
333
+ r"((Bill|David)\s*)?Koch(\s*(Bro(s|thers)|Industries))?",
334
+ r"Gruterite",
335
+ r"(John\s*)?Kluge",
336
+ r"Marc Rich",
337
+ r"(Mi(chael|ke)\s*)?Ovitz",
338
+ r"(Steve\s+)?Wynn",
339
+ r"(Les(lie)?\s+)?Wexner",
340
+ r"New Leaf Ventures",
341
+ r"Park Partners",
342
+ r"SALSS",
343
+ r"Swedish[-\s]*American\s*Life\s*Science\s*Summit",
344
+ r"Valhi",
345
+ r"(Yves\s*)?Bouvier",
346
+ ],
181
347
  ),
182
348
  HighlightedNames(
183
349
  label='cannabis',
184
350
  style='chartreuse2',
185
- pattern=r"CBD|cannabis|marijuana|THC|WEED(guide|maps)?[^s]?",
351
+ patterns=[
352
+ r"CBD",
353
+ r"cannabis",
354
+ r"marijuana",
355
+ r"THC",
356
+ r"WEED(guide|maps)?[^s]?",
357
+ ],
186
358
  ),
187
359
  HighlightedNames(
188
360
  label='China',
189
361
  style='bright_red',
190
- pattern=r"Ali.?baba|Beijing|CCP|Chin(a|e?se)(?! Daily)|DPRK|Global Times|Guo|Hong|Huaw[ae]i|Kim\s*Jong\s*Un|Kong|Jack\s+Ma|Kwok|Ministry\sof\sState\sSecurity|Mongolian?|MSS|North\s*Korea|Peking|PRC|SCMP|Tai(pei|wan)|Xi(aomi)?|Jinping",
191
362
  emailers={
192
363
  'Gino Yu': 'professor / game designer in Hong Kong',
193
- }
364
+ },
365
+ patterns=[
366
+ r"Ali.?baba",
367
+ r"Beijing",
368
+ r"CCP",
369
+ r"Chin(a|e?se)(?! Daily)",
370
+ r"DPRK",
371
+ r"Global Times",
372
+ r"Guo",
373
+ r"Hong",
374
+ r"Huaw[ae]i",
375
+ r"Kim\s*Jong\s*Un",
376
+ r"Kong",
377
+ r"Jack\s+Ma",
378
+ r"Kwok",
379
+ r"Ministry\sof\sState\sSecurity",
380
+ r"Mongolian?",
381
+ r"MSS",
382
+ r"North\s*Korea",
383
+ r"Peking",
384
+ r"PRC",
385
+ r"Pyongyang",
386
+ r"SCMP",
387
+ r"Tai(pei|wan)",
388
+ r"Xi(aomi)?",
389
+ r"Jinping",
390
+ ],
194
391
  ),
195
392
  HighlightedNames(
196
- label='Deepak Chopra',
393
+ label=DEEPAK_CHOPRA,
197
394
  style='dark_sea_green4',
198
- emailers = {
199
- 'Carolyn Rangel': 'assistant',
395
+ emailers={
396
+ CAROLYN_RANGEL: 'assistant',
200
397
  DEEPAK_CHOPRA: 'woo woo',
201
- }
398
+ },
202
399
  ),
203
400
  HighlightedNames(
204
- label='Democrats',
401
+ label='Democrat',
205
402
  style='sky_blue1',
206
- pattern=r'(Al\s*)?Franken|((Bill|Hillart?y)\s*)?Clinton|((Chuck|Charles)\s*)?S(ch|hc)umer|(Diana\s*)?DeGette|DNC|Elena\s*Kagan|(Eliott?\s*)?Spitzer(, Eliot)?|George\s*Mitchell|(George\s*)?Soros|Hill?ary|Dem(ocrat(ic)?)?|(Jo(e|seph)\s*)?Biden|(John\s*)?Kerry|Lisa Monaco|(Matteo\s*)?Salvini|Maxine\s*Waters|(Barac?k )?Obama|(Nancy )?Pelosi|Ron\s*Dellums|Schumer|(Tim\s*)?Geithner|Vernon\s*Jordan',
403
+ patterns=[
404
+ r"(Al\s*)?Franken",
405
+ r"(Barac?k )?Obama",
406
+ r"((Bill|Hillart?y)\s*)?Clinton",
407
+ r"((Chuck|Charles)\s*)?S(ch|hc)umer",
408
+ r"Dem(ocrat(ic)?)?",
409
+ r"(Diana\s*)?DeGette",
410
+ r"DNC",
411
+ r"Elena\s*Kagan",
412
+ r"(Eliott?\s*)?Spitzer(, Eliot)?",
413
+ r"Eric Holder",
414
+ r"George\s*Mitchell",
415
+ r"(George\s*)?Soros",
416
+ r"Hill?ary",
417
+ r"HRC",
418
+ r"(Jo(e|seph)\s*)?Biden",
419
+ r"(John\s*)?Kerry",
420
+ r"Lisa Monaco",
421
+ r"(Matteo\s*)?Salvini",
422
+ r"Maxine\s*Waters",
423
+ r"(Nancy )?Pelosi",
424
+ r"Ron\s*Dellums",
425
+ r"Schumer",
426
+ r"(Tim\s*)?Geithner",
427
+ r"Vernon\s*Jordan",
428
+ ],
207
429
  ),
208
430
  HighlightedNames(
209
431
  label='Dubin family',
210
432
  style='medium_orchid1',
211
- pattern=r'((Celina|Eva( Anderss?on)?|Glenn) )?Dubin',
212
- emailers = {
433
+ emailers={
213
434
  GLENN_DUBIN: "Highbridge Capital Management, married to Epstein's ex-gf Eva",
214
435
  EVA: "possibly Epstein's ex-girlfriend (?)",
215
436
  },
437
+ patterns=[r"((Celina|Eva( Anderss?on)?|Glenn) )?Dubin"],
216
438
  ),
217
439
  HighlightedNames(
218
440
  label='employee',
219
441
  style='deep_sky_blue4',
220
- pattern=r'Merwin',
221
- emailers = {
442
+ emailers={
222
443
  'Alfredo Rodriguez': "Epstein's butler, stole the journal",
223
444
  ERIC_ROTH: 'jet decorator',
224
445
  GWENDOLYN_BECK: 'Epstein fund manager in the 90s',
@@ -229,28 +450,51 @@ HIGHLIGHTED_NAMES = [
229
450
  MERWIN_DELA_CRUZ: None, # HOUSE_OVERSIGHT_032652 Groff says "Jojo and Merwin both requested off Nov. 25 and 26"
230
451
  NADIA_MARCINKO: 'pilot',
231
452
  'Sean J. Lancaster': 'airplane reseller',
232
- }
453
+ },
454
+ patterns=[r"Merwin"],
233
455
  ),
234
456
  HighlightedNames(
235
457
  label=ENTERTAINER,
236
458
  style='light_steel_blue3',
237
- pattern=r'(Art )?Spiegelman|Bobby slayton|bono\s*mick|Errol(\s*Morris)?|Etienne Binant|(Frank\s)?Gehry|Jagger|(Jeffrey\s*)?Katzenberg|(Johnny\s*)?Depp|Kid Rock|Lena\s*Dunham|Madonna|Mark\s*Burnett|Ramsey Elkholy|shirley maclaine|Steven Gaydos?|Woody( Allen)?|Zach Braff',
238
459
  emailers={
239
460
  ANDRES_SERRANO: "'Piss Christ' artist",
240
- 'Barry Josephson': 'American film producer and former music manager, editor FamilySecurityMatters.org',
461
+ 'Barry Josephson': 'American film producer, editor FamilySecurityMatters.org',
241
462
  BILL_SIEGEL: 'documentary film producer and director',
242
463
  DAVID_BLAINE: 'famous magician',
243
464
  HENRY_HOLT: f"{MICHAEL_WOLFF}'s book publisher",
244
465
  'Richard Merkin': 'painter, illustrator and arts educator',
245
466
  STEVEN_PFEIFFER: 'Associate Director at Independent Filmmaker Project (IFP)',
246
467
  },
468
+ patterns=[
469
+ r"(Art )?Spiegelman",
470
+ r"Artspace",
471
+ r"Bobby slayton",
472
+ r"bono\s*mick",
473
+ r"Errol(\s*Morris)?",
474
+ r"Etienne Binant",
475
+ r"(Frank\s)?Gehry",
476
+ r"Jagger",
477
+ r"(Jeffrey\s*)?Katzenberg",
478
+ r"(Johnny\s*)?Depp",
479
+ r"Kid Rock",
480
+ r"(Larry\s*)?Gagosian",
481
+ r"Lena\s*Dunham",
482
+ r"Madonna",
483
+ r"Mark\s*Burnett",
484
+ r"Phaidon",
485
+ r"Ramsey Elkholy",
486
+ r"Regan arts",
487
+ r"shirley maclaine",
488
+ r"Steven Gaydos?",
489
+ r"Woody( Allen)?",
490
+ r"Zach Braff",
491
+ ],
247
492
  ),
248
493
  HighlightedNames(
249
494
  label=EPSTEIN_LAWYER,
250
495
  style='purple',
251
- pattern=r'(Barry (E. )?)?Krischer|Kate Kelly|Kirkland\s*&\s*Ellis|(Leon\s*)?Jaworski|Michael J. Pike|Paul,?\s*Weiss|Steptoe|Wein(berg|garten)',
252
- emailers = {
253
- 'Alan S Halperin': 'parnter at Paul, Weiss',
496
+ emailers={
497
+ 'Alan S Halperin': 'partner at Paul, Weiss',
254
498
  ARDA_BESKARDES: 'NYC immigration attorney allegedly involved in sex-trafficking operations',
255
499
  BENNET_MOSKOWITZ: f'represented the {EPSTEIN_ESTATE_EXECUTOR}s',
256
500
  BRAD_KARP: 'head of the law firm Paul Weiss',
@@ -261,52 +505,119 @@ HIGHLIGHTED_NAMES = [
261
505
  JACK_GOLDBERGER: CRIMINAL_DEFENSE_2008,
262
506
  JACKIE_PERCZEK: CRIMINAL_DEFENSE_2008,
263
507
  JAY_LEFKOWITZ: f"Kirkland & Ellis partner, {CRIMINAL_DEFENSE_2008}",
264
- JESSICA_CADWELL: 'paralegal', # paralegal, see https://x.com/ImDrinknWyn/status/1993765348898927022
508
+ JESSICA_CADWELL: f'paralegal to {ROBERT_D_CRITTON_JR}', # house_oversight_030464
265
509
  LILLY_SANCHEZ: CRIMINAL_DEFENSE_ATTORNEY,
266
510
  MARTIN_WEINBERG: CRIMINAL_DEFENSE_ATTORNEY,
267
511
  MICHAEL_MILLER: 'Steptoe LLP partner',
268
512
  REID_WEINGARTEN: 'Steptoe LLP partner',
269
- ROBERT_D_CRITTON_JR: 'criminal defense attorney',
270
- 'Robert Gold': None,
513
+ ROBERT_D_CRITTON_JR: CRIMINAL_DEFENSE_ATTORNEY,
514
+ 'Robert Gold': 'helped Epstein track down millions belonging to wealthy Spanish families',
271
515
  'Roy Black': CRIMINAL_DEFENSE_2008,
272
- SCOTT_J_LINK: None,
516
+ SCOTT_J_LINK: CRIMINAL_DEFENSE_ATTORNEY,
273
517
  TONJA_HADDAD_COLEMAN: f'{EPSTEIN_V_ROTHSTEIN_EDWARDS_ATTORNEY}, maybe daughter of Fred Haddad?',
274
- }
518
+ },
519
+ patterns=[
520
+ r"(Barry (E. )?)?Krischer",
521
+ r"Kate Kelly",
522
+ r"Kirkland\s*&\s*Ellis",
523
+ r"(Leon\s*)?Jaworski",
524
+ r"Michael J. Pike",
525
+ r"Paul,?\s*Weiss",
526
+ r"Steptoe(\s*LLP)?",
527
+ r"Wein(berg|garten)",
528
+ ],
275
529
  ),
276
530
  HighlightedNames(
277
531
  label=ESTATE_EXECUTOR,
278
532
  style='purple3 bold',
279
- category='Epstein lawyer',
280
- emailers = {
533
+ category=EPSTEIN_LAWYER,
534
+ emailers={
281
535
  DARREN_INDYKE: EPSTEIN_ESTATE_EXECUTOR,
282
536
  RICHARD_KAHN: EPSTEIN_ESTATE_EXECUTOR,
283
- }
537
+ },
284
538
  ),
285
539
  HighlightedNames(
286
- label='europe',
540
+ label='Europe',
287
541
  style='light_sky_blue3',
288
- pattern=r'(Angela )?Merk(el|le)|Austria|(Benjamin\s*)?Harnwell|Berlin|Borge|Boris\s*Johnson|Brexit(eers?)?|Brit(ain|ish)|Brussels|Cannes|(Caroline|Jack)?\s*Lang(, Caroline)?|Cypr(iot|us)|Davos|ECB|England|EU|Europe(an)?(\s*Union)?|Fr(ance|ench)|Geneva|Germany?|Gillard|Gree(ce|k)|Ital(ian|y)|Jacques|(Kevin\s*)?Rudd|Le\s*Pen|London|Macron|Melusine|Munich|(Natalia\s*)?Veselnitskaya|(Nicholas\s*)?Sarkozy|Nigel(\s*Farage)?|Norw(ay|egian)|Oslo|Paris|Polish|pope|(Sebastian )?Kurz|(Vi(c|k)tor\s+)?Orbah?n|Edward Rod Larsen|Strasbourg|Strauss[- ]?Kahn|Swed(en|ish)(?![-\s]+America)|Switzerland|(Tony\s)?Blair|U\.?K\.?|Ukrain(e|ian)|Vienna|(Vitaly\s*)?Churkin|Zug',
289
- emailers = {
542
+ emailers={
290
543
  ANDRZEJ_DUDA: 'former president of Poland',
291
544
  MIROSLAV_LAJCAK: 'Russia-friendly Slovakian politician, friend of Steve Bannon',
292
545
  PETER_MANDELSON: 'UK politics',
293
546
  TERJE_ROD_LARSEN: 'Norwegian diplomat',
294
547
  THORBJORN_JAGLAND: 'former prime minister of Norway and head of the Nobel Peace Prize Committee',
295
- }
548
+ },
549
+ patterns=[
550
+ r"(Angela )?Merk(el|le)",
551
+ r"Austria",
552
+ r"(Benjamin\s*)?Harnwell",
553
+ r"Berlin",
554
+ r"Borge",
555
+ r"Boris\s*Johnson",
556
+ r"Brexit(eers?)?",
557
+ r"Brit(ain|ish)",
558
+ r"Brussels",
559
+ r"Cannes",
560
+ r"(Caroline|Jack)?\s*Lang(, Caroline)?",
561
+ r"Cypr(iot|us)",
562
+ r"Davos",
563
+ r"ECB",
564
+ r"England",
565
+ r"EU",
566
+ r"Europe(an)?(\s*Union)?",
567
+ r"Fr(ance|ench)",
568
+ r"Geneva",
569
+ r"Germany?",
570
+ r"Gillard",
571
+ r"Gree(ce|k)",
572
+ r"Ital(ian|y)",
573
+ r"Jacques",
574
+ r"Kiev",
575
+ r"Le\s*Pen",
576
+ r"London",
577
+ r"Macron",
578
+ r"Melusine",
579
+ r"MI\s*5",
580
+ r"Munich",
581
+ r"NATO",
582
+ r"(Nicholas\s*)?Sarkozy",
583
+ r"Nigel(\s*Farage)?",
584
+ r"Norw(ay|egian)",
585
+ r"Oslo",
586
+ r"Paris",
587
+ r"Polish",
588
+ r"pope",
589
+ r"(Sebastian )?Kurz",
590
+ r"(Vi(c|k)tor\s+)?Orbah?n",
591
+ r"Edward Rod Larsen",
592
+ r"Strasbourg",
593
+ r"Strauss[- ]?Kahn",
594
+ r"Swed(en|ish)(?![-\s]+American Life Scienc)",
595
+ r"Switzerland",
596
+ r"(Tony\s)?Blair",
597
+ r"U\.K\.",
598
+ r"Ukrain(e|ian)",
599
+ r"Vienna",
600
+ r"Zug",
601
+ ],
296
602
  ),
297
603
  HighlightedNames(
298
604
  label='famous lawyer',
299
605
  style='medium_purple3',
300
- pattern=r'(David\s*)?Bo[il]es|dersh|(Gloria\s*)?Allred|(Mi(chael|ke)\s*)?Avenatti',
301
- emailers = {
606
+ emailers={
302
607
  ALAN_DERSHOWITZ: 'Harvard Law School professor and all around (in)famous American lawyer',
608
+ 'Fabrice Aidan': f'diplomat who worked with {TERJE_ROD_LARSEN}',
303
609
  KEN_STARR: 'head of the Monica Lewinsky investigation against Bill Clinton',
304
- }
610
+ },
611
+ patterns=[
612
+ r"(David\s*)?Bo[il]es",
613
+ r"dersh",
614
+ r"(Gloria\s*)?Allred",
615
+ r"(Mi(chael|ke)\s*)?Avenatti",
616
+ ],
305
617
  ),
306
618
  HighlightedNames(
307
619
  label=FINANCE,
308
620
  style='green',
309
- pattern=r'Apollo|Ari\s*Glass|Bank|(Bernie\s*)?Madoff|Black(rock|stone)|B\s*of\s*A|Boothbay(\sFund\sManagement)?|Chase\s*Bank|Credit\s*Suisse|DB|Deutsche?\s*(Asset|Bank)|Electron\s*Capital\s*(Partners)?|Fenner|FRBNY|Goldman(\s*Sachs)|HSBC|Invesco|(Janet\s*)?Yellen|(Jerome\s*)?Powell(?!M\. Cabot)|(Jimmy\s*)?Cayne|JPMC?|j\.?p\.?\s*morgan(\.?com|\s*Chase)?|Madoff|Merrill(\s*Lynch)?|(Michael\s*)?(Cembalest|Milken)|Mizrahi\s*Bank|MLPF&S|((anti.?)?money\s+)?launder(s?|ers?|ing)?(\s+money)?|Morgan Stanley|(Peter L. )?Scher|(Ray\s*)?Dalio|(Richard\s*)?LeFrak|Schwartz?man|Serageldin|UBS|us.gio@jpmorgan.com',
310
621
  emailers={
311
622
  AMANDA_ENS: 'Citigroup',
312
623
  BRAD_WECHSLER: f"head of {LEON_BLACK}'s personal investment vehicle according to FT",
@@ -317,101 +628,322 @@ HIGHLIGHTED_NAMES = [
317
628
  'Laurie Cameron': 'currency trading',
318
629
  LEON_BLACK: 'Apollo CEO',
319
630
  MARC_LEON: 'Luxury Properties Sari Morrocco',
320
- MELANIE_SPINELLA: f'representative of {LEON_BLACK}',
321
- MORTIMER_ZUCKERMAN: 'business partner of Epstein',
631
+ MELANIE_SPINELLA: 'representative of Leon Black',
632
+ MORTIMER_ZUCKERMAN: 'business partner of Epstein, newspaper publisher',
322
633
  PAUL_BARRETT: None,
323
634
  PAUL_MORRIS: DEUTSCHE_BANK,
635
+ 'Skip Rimer': 'Milken Institute (Michael Milken)',
324
636
  'Steven Elkman': DEUTSCHE_BANK,
325
- }
637
+ },
638
+ patterns=[
639
+ r"((anti.?)?money\s+)?launder(s?|ers?|ing)?(\s+money)?",
640
+ r"Apollo",
641
+ r"Ari\s*Glass",
642
+ r"Bank(\s*of\s*Scotland)",
643
+ r"(Bernie\s*)?Madoff",
644
+ r"Black(rock|stone)",
645
+ r"B\s*of\s*A",
646
+ r"Boothbay(\sFund\sManagement)?",
647
+ r"Chase\s*Bank",
648
+ r"Credit\s*Suisse",
649
+ r"DB",
650
+ r"Deutsche?\s*(Asset|Bank)",
651
+ r"Electron\s*Capital\s*(Partners)?",
652
+ r"Fenner",
653
+ r"FRBNY",
654
+ r"Goldman(\s*Sachs)",
655
+ r"GRAT",
656
+ r"HSBC",
657
+ r"Invesco",
658
+ r"(Janet\s*)?Yellen",
659
+ r"(Jerome\s*)?Powell(?!M\. Cabot)",
660
+ r"(Jimmy\s*)?Cayne",
661
+ r"JPMC?",
662
+ r"j\.?p\.?\s*morgan(\.?com|\s*Chase)?",
663
+ r"Madoff",
664
+ r"Merrill(\s*Lynch)?",
665
+ r"(Michael\s*)?(Cembalest|Milken)",
666
+ r"Mizrahi\s*Bank",
667
+ r"MLPF&S",
668
+ r"Morgan Stanley",
669
+ r"(Peter L. )?Scher",
670
+ r"(Ray\s*)?Dalio",
671
+ r"(Richard\s*)?LeFrak",
672
+ r"Schwartz?man",
673
+ r"Serageldin",
674
+ r"UBS",
675
+ r"us.gio@jpmorgan.com",
676
+ ],
326
677
  ),
327
678
  HighlightedNames(
328
679
  label='friend',
329
680
  style='tan',
330
- pattern=r"Andrew Farkas|Thomas\s*(J\.?\s*)?Barrack(\s*Jr)?",
331
- emailers = {
681
+ emailers={
332
682
  DANGENE_AND_JENNIE_ENTERPRISE: 'founders of the members-only CORE club',
333
683
  DAVID_STERN: f'emailed Epstein from Moscow, appears to know chairman of {DEUTSCHE_BANK}',
334
684
  JONATHAN_FARKAS: "heir to the Alexander's department store fortune",
335
- 'linkspirit': "Skype username of someone Epstein communicated with",
685
+ 'linkspirit': 'Skype username of someone Epstein communicated with',
336
686
  'Peter Thomas Roth': 'student of Epstein at Dalton, skincare company founder',
337
687
  STEPHEN_HANSON: None,
338
688
  TOM_BARRACK: 'long time friend of Trump',
339
689
  },
690
+ patterns=[
691
+ r"Andrew Farkas",
692
+ r"Thomas\s*(J\.?\s*)?Barrack(\s*Jr)?",
693
+ ],
340
694
  ),
341
695
  HighlightedNames(
342
696
  label=HARVARD,
343
697
  style='light_goldenrod3',
344
- pattern=r'Cambridge|(Derek\s*)?Bok|Elisa(\s*New)?|Harvard(\s*(Business|Law|University)(\s*School)?)?|(Jonathan\s*)?Zittrain|(Stephen\s*)?Kosslyn',
345
- emailers = {
346
- "Donald Rubin": f"Professor of Statistics",
347
- "Kelly Friendly": f"longtime aide and spokesperson of {LARRY_SUMMERS}",
348
- LARRY_SUMMERS: 'board of Digital Currency Group (DCG), Harvard president, Obama economic advisor',
349
- 'Leah Reis-Dennis': 'producer for Lisa New\'s Poetry in America',
698
+ emailers={
699
+ 'Donald Rubin': 'Professor of Statistics',
700
+ 'Kelly Friendly': 'longtime aide and spokesperson of Larry Summers',
701
+ LARRY_SUMMERS: 'board of Digital Currency Group (DCG), Obama economic advisor',
702
+ 'Leah Reis-Dennis': "producer for Lisa New's Poetry in America",
350
703
  LISA_NEW: f'professor of poetry, wife of {LARRY_SUMMERS}, AKA "Elisa New"',
351
704
  'Lisa Randall': 'theoretical physicist',
352
705
  MARTIN_NOWAK: 'professor of mathematics and biology',
353
706
  MOSHE_HOFFMAN: 'lecturer and research scholar in behavioral and evolutionary economics',
354
- }
707
+ },
708
+ patterns=[
709
+ r"Cambridge",
710
+ r"(Derek\s*)?Bok",
711
+ r"Elisa(\s*New)?",
712
+ r"Harvard(\s*(Business|Law|University)(\s*School)?)?",
713
+ r"(Jonathan\s*)?Zittrain",
714
+ r"Poetry\s*in\s*America",
715
+ r"(Stephen\s*)?Kosslyn",
716
+ ],
355
717
  ),
356
718
  HighlightedNames(
357
719
  label='India',
358
720
  style='bright_green',
359
- pattern=r'Abraaj|Anna\s*Hazare|(Arif\s*)?Naqvi|(Arvind\s*)?Kejriwal|Bangalore|Hardeep( Pur[ei]e)?|Indian?|InsightsPod|Modi|Mumbai|(New\s*)?Delhi|Tranchulas',
360
- emailers = {
721
+ emailers={
361
722
  ANIL_AMBANI: 'chairman of Reliance Group',
362
723
  VINIT_SAHNI: None,
363
- ZUBAIR_KHAN: 'cybersecurity firm Tranchulas CEO, InsightsPod founder, based in Islamabad and Dubai',
364
- }
724
+ ZUBAIR_KHAN: 'cybersecurity firm Tranchulas CEO, InsightsPod founder, Islamabad/Dubai',
725
+ },
726
+ patterns=[
727
+ r"Abraaj",
728
+ r"Anna\s*Hazare",
729
+ r"(Arif\s*)?Naqvi",
730
+ r"(Arvind\s*)?Kejriwal",
731
+ r"Bangalore",
732
+ r"Hardeep( Pur[ei]e)?",
733
+ r"Indian?",
734
+ r"InsightsPod",
735
+ r"Modi",
736
+ r"Mumbai",
737
+ r"(New\s*)?Delhi",
738
+ r"Tranchulas",
739
+ ],
365
740
  ),
366
741
  HighlightedNames(
367
742
  label='Israel',
368
743
  style='dodger_blue2',
369
- pattern=r"AIPAC|Bibi|(eh|(Ehud|Nili Priell) )?barak|Ehud\s*Barack|Israeli?|Jerusalem|J\s*Street|Mossad|Netanyahu|(Sheldon\s*)?Adelson|Tel\s*Aviv|(The\s*)?Shimon\s*Post|Yitzhak|Rabin|YIVO|zionist",
370
744
  emailers={
371
745
  EHUD_BARAK: 'former primer minister',
372
746
  'Mitchell Bard': 'director of the American-Israeli Cooperative Enterprise (AICE)',
373
- 'Nili Priell Barak': f'wife of {EHUD_BARAK}',
374
- }
747
+ 'Nili Priell Barak': 'wife of Ehud Barak',
748
+ },
749
+ patterns=[
750
+ r"AIPAC",
751
+ r"Bibi",
752
+ r"(eh|(Ehud|Nili Priell)\s*)?barak",
753
+ r"Ehud\s*Barack",
754
+ r"Israeli?",
755
+ r"Jerusalem",
756
+ r"J\s*Street",
757
+ r"Mossad",
758
+ r"Netanyahu",
759
+ r"(Sheldon\s*)?Adelson",
760
+ r"Tel\s*Aviv",
761
+ r"(The\s*)?Shimon\s*Post",
762
+ r"Yitzhak", r"Rabin",
763
+ r"YIVO",
764
+ r"zionist",
765
+ ],
375
766
  ),
376
767
  HighlightedNames(
377
768
  label='Japan',
378
769
  style='color(168)',
379
- pattern=r'BOJ|(Bank\s+of\s+)?Japan(ese)?|jpy?(?! Morgan)|SG|Singapore|Toky[op]',
770
+ patterns=[
771
+ r"BOJ",
772
+ r"(Bank\s+of\s+)?Japan(ese)?",
773
+ r"jpy?(?! Morgan)",
774
+ r"SG",
775
+ r"Singapore",
776
+ r"Toky[op]",
777
+ ],
380
778
  ),
381
779
  HighlightedNames(
382
780
  label=JOURNALIST,
383
781
  style='bright_yellow',
384
- pattern=r'Palm\s*Beach\s*(Daily\s*News|Post)|ABC(\s*News)?|Alex\s*Yablon|(Andrew\s*)?Marra|Arianna(\s*Huffington)?|(Arthur\s*)?Kretchmer|BBC|Bloomberg|Breitbart|Charlie\s*Rose|China\s*Daily|CNBC|CNN(politics?)?|Con[cs]hita|Sarnoff|(?<!Virgin[-\s]Islands[-\s])Daily\s*(Beast|Mail|News|Telegraph)|(David\s*)?Pecker|David\s*Brooks|Ed\s*Krassenstein|(Emily\s*)?Michot|Ezra\s*Klein|(George\s*)?Stephanopoulus|Globe\s*and\s*Mail|Good\s*Morning\s*America|Graydon(\s*Carter)?|Huffington(\s*Post)?|Ingram, David|(James\s*)?(Hill|Patterson)|Jonathan\s*Karl|Julie\s*(K.?\s*)?Brown|(Katie\s*)?Couric|Keith\s*Larsen|L\.?A\.?\s*Times|Miami\s*Herald|(Michele\s*)?Dargan|(National\s*)?Enquirer|(The\s*)?N(ew\s*)?Y(ork\s*)?(P(ost)?|T(imes)?)|(The\s*)?New\s*Yorker|NYer|PERVERSION\s*OF\s*JUSTICE|Politico|Pro\s*Publica|(Sean\s*)?Hannity|Sulzberger|SunSentinel|Susan Edelman|(Uma\s*)?Sanghvi|(The\s*)?Wa(shington\s*)?Po(st)?|Viceland|Vick[iy]\s*Ward|Vox|WGBH|(The\s*)?Wall\s*Street\s*Journal|WSJ|[-\w.]+@(bbc|independent|mailonline|mirror|thetimes)\.co\.uk',
385
- emailers = {
386
- EDWARD_JAY_EPSTEIN: 'reporter who wrote about the kinds of crimes Epstein was involved in, no relation to Jeffrey',
387
- 'James Hill': 'ABC News',
782
+ emailers={
783
+ EDWARD_JAY_EPSTEIN: 'no relation, wrote about the kinds of crimes Epstein was involved in',
784
+ JAMES_HILL: 'ABC News',
388
785
  JENNIFER_JACQUET: 'Future Science',
389
786
  JOHN_BROCKMAN: 'literary agent and author specializing in scientific literature',
390
787
  LANDON_THOMAS: 'New York Times',
391
788
  MICHAEL_WOLFF: 'Author of "Fire and Fury: Inside the Trump White House"',
392
789
  PAUL_KRASSNER: '60s counterculture guy',
393
790
  'Tim Zagat': 'Zagat restaurant guide CEO',
394
- }
791
+ },
792
+ patterns=[
793
+ r"ABC(\s*News)?",
794
+ r"Alex\s*Yablon",
795
+ r"Arianna(\s*Huffington)?",
796
+ r"(Arthur\s*)?Kretchmer",
797
+ r'Associated\s*Press',
798
+ r"BBC",
799
+ r"Bloomberg",
800
+ r"Breitbart",
801
+ r"Charlie\s*Rose",
802
+ r"China\s*Daily",
803
+ r"CNBC",
804
+ r"CNN(politics?)?",
805
+ r"Con[cs]hita",
806
+ r"Sarnoff",
807
+ r"(?<!Virgin[-\s]Islands[-\s])Daily\s*(Beast|Mail|News|Telegraph)",
808
+ r"(David\s*)?(Pecker|Pegg)",
809
+ r"David\s*Brooks",
810
+ r"Ed\s*Krassenstein",
811
+ r"(Emily\s*)?Michot",
812
+ r"Ezra\s*Klein",
813
+ r"FT",
814
+ r"(George\s*)?Stephanopoulus",
815
+ r"Globe\s*and\s*Mail",
816
+ r"Good\s*Morning\s*America",
817
+ r"Graydon(\s*Carter)?",
818
+ r"Huff(ington)?(\s*Po(st)?)?",
819
+ r"Ingram, David",
820
+ r"(James\s*)?(Hill|Patterson)",
821
+ r"Jonathan\s*Karl",
822
+ r"Julie\s*(K.?\s*)?Brown", r'jbrown@miamiherald.com',
823
+ r"(Katie\s*)?Couric",
824
+ r"Keith\s*Larsen",
825
+ r"L\.?A\.?\s*Times",
826
+ r"Miami\s*Herald",
827
+ r"(Michele\s*)?Dargan",
828
+ r"(National\s*)?Enquirer",
829
+ r"NYer",
830
+ r"Palm\s*Beach\s*(Daily\s*News|Post)",
831
+ r"PERVERSION\s*OF\s*JUSTICE",
832
+ r"Politico",
833
+ r"Pro\s*Publica",
834
+ r"(Sean\s*)?Hannity",
835
+ r"Sulzberger",
836
+ r"SunSentinel",
837
+ r"Susan Edelman",
838
+ r"(The\s*)?Financial\s*Times",
839
+ r"The\s*Guardian",
840
+ r"(The\s*)?N(ew\s*)?Y(ork\s*)?(P(ost)?|T(imes)?)",
841
+ r"(The\s*)?New\s*Yorker",
842
+ r"(The\s*)?Wall\s*Street\s*Journal",
843
+ r"(The\s*)?Wa(shington\s*)?Po(st)?",
844
+ r"(Uma\s*)?Sanghvi",
845
+ r"Vanity\s*Fair",
846
+ r"Viceland",
847
+ r"Vick[iy]\s*Ward",
848
+ r"Vox",
849
+ r"WGBH",
850
+ r"WSJ",
851
+ r"[-\w.]+@(bbc|independent|mailonline|mirror|thetimes)\.co\.uk",
852
+ ],
395
853
  ),
396
854
  HighlightedNames(
397
855
  label='Latin America',
398
856
  style='yellow',
399
- pattern=r'Argentin(a|ian)|Bolsonar[aio]|Bra[sz]il(ian)?|Bukele|Caracas|Castro|Colombian?|Cuban?|El\s*Salvador|((Enrique )?Pena )?Nieto|LatAm|Lula|Mexic(an|o)|(Nicolas\s+)?Maduro|Panama( Papers)?|Peru|Venezuelan?|Zambrano',
857
+ patterns=[
858
+ r"Argentin(a|ian)",
859
+ r"Bolsonar[aio]",
860
+ r"Bra[sz]il(ian)?",
861
+ r"Caracas",
862
+ r"Castro",
863
+ r"Colombian?",
864
+ r"Cuban?",
865
+ r"El\s*Salvador",
866
+ r"((Enrique )?Pena )?Nieto",
867
+ r"Lat(in)?\s*Am(erica)?",
868
+ r"Lula",
869
+ r"Mexic(an|o)",
870
+ r"(Nicolas\s+)?Maduro",
871
+ r"Panama( Papers)?",
872
+ r"Peru(vian)?",
873
+ r"Venezuelan?",
874
+ r"Zambrano",
875
+ ],
400
876
  ),
401
877
  HighlightedNames(
402
878
  label='law enforcement',
403
879
  style='color(24) bold',
404
- pattern=r'ag|(Alicia\s*)?Valle|AML|(Andrew\s*)?McCabe|((Bob|Robert)\s*)?Mueller|(Byung\s)?Pak|CFTC?|CIA|CIS|CVRA|Dep(artmen)?t\.?\s*of\s*(the\s*)?(Justice|Treasury)|DHS|DOJ|FBI|FCPA|FDIC|Federal\s*Bureau\s*of\s*Investigation|FinCEN|FINRA|FOIA|FTC|IRS|(James\s*)?Comey|(Jennifer\s*Shasky\s*)?Calvery|((Judge|Mark)\s*)?(Carney|Filip)|(Kirk )?Blouin|KYC|NIH|NS(A|C)|OCC|OFAC|(Lann?a\s*)?Belohlavek|(Michael\s*)?Reiter|OGE|Office\s*of\s*Government\s*Ethics|Police Code Enforcement|(Preet\s*)?Bharara|SCOTUS|SD(FL|NY)|SEC|Secret\s*Service|Securities\s*and\s*Exchange\s*Commission|Southern\s*District\s*of\s*(Florida|New\s*York)|State\s*Dep(artmen)?t|Strzok|Supreme\s*Court|Treasury\s*(Dep(artmen)?t|Secretary)|TSA|USAID|(William\s*J\.?\s*)?Zloch',
405
- emailers = {
406
- ANN_MARIE_VILLAFANA: 'southern district of Florida U.S. Attorney',
407
- DANNY_FROST: 'Director of Communications at Manhattan DA',
408
- }
880
+ emailers={
881
+ ANN_MARIE_VILLAFANA: 'Southern District of Florida (SDFL) U.S. Attorney',
882
+ DANNY_FROST: 'Director of Communications at Manhattan D.A.',
883
+ },
884
+ patterns=[
885
+ r"AG",
886
+ r"(Alicia\s*)?Valle",
887
+ r"AML",
888
+ r"(Andrew\s*)?McCabe",
889
+ r"Attorney General",
890
+ r"((Bob|Robert)\s*)?Mueller",
891
+ r"(Byung\s)?Pak",
892
+ r"Case 1:19-cv-03377(-LAP)?",
893
+ r"CFTC?",
894
+ r"CIA",
895
+ r"CIS",
896
+ r"CVRA",
897
+ r"Dep(artmen)?t\.?\s*of\s*(the\s*)?(Justice|Treasury)",
898
+ r"DHS",
899
+ r"DOJ",
900
+ r"FBI",
901
+ r"FCPA",
902
+ r"FDIC",
903
+ r"Federal\s*Bureau\s*of\s*Investigation",
904
+ r"FinCEN",
905
+ r"FINRA",
906
+ r"FOIA",
907
+ r"FTC",
908
+ r"IRS",
909
+ r"(James\s*)?Comey",
910
+ r"Jeff(rey)?\s*Sessions",
911
+ r"(Jennifer\s*Shasky\s*)?Calvery",
912
+ r"((Judge|Mark)\s*)?(Carney|Filip)",
913
+ r"(Judge\s*)?(Kenneth\s*)?(A\.?\s*)?Marra",
914
+ r"(Justice|Treasury)\s*Dep(t|artment)",
915
+ r"(Kirk )?Blouin",
916
+ r"KYC",
917
+ r"(Lann?a\s*)?Belohlavek",
918
+ r"NIH",
919
+ r"NS(A|C)",
920
+ r"OCC",
921
+ r"OFAC",
922
+ r"(Michael\s*)?Reiter",
923
+ r"OGE",
924
+ r"Office\s*of\s*Government\s*Ethics",
925
+ r"Police Code Enforcement",
926
+ r"(Preet\s*)?Bharara",
927
+ r"SCOTUS",
928
+ r"SD(FL|NY)",
929
+ r"SEC",
930
+ r"Secret\s*Service",
931
+ r"Securities\s*and\s*Exchange\s*Commission",
932
+ r"Southern\s*District\s*of\s*(Florida|New\s*York)",
933
+ r"State\s*Dep(artmen)?t",
934
+ r"Strzok",
935
+ r"Supreme\s*Court",
936
+ r"Treasury\s*(Dep(artmen)?t|Secretary)",
937
+ r"TSA",
938
+ r"U\.?S\.? attorney",
939
+ r"USAID",
940
+ r"(William\s*J\.?\s*)?Zloch",
941
+ ],
409
942
  ),
410
943
  HighlightedNames(
411
944
  label=LOBBYIST,
412
945
  style='light_coral',
413
- pattern=r'[BR]ob Crowe|CSIS|Stanley Rosenberg',
414
- emailers = {
946
+ emailers={
415
947
  'Joshua Cooper Ramo': 'co-CEO of Henry Kissinger Associates',
416
948
  KATHERINE_KEATING: 'Daughter of former Australian PM',
417
949
  MOHAMED_WAHEED_HASSAN: 'former president of the Maldives',
@@ -419,25 +951,112 @@ HIGHLIGHTED_NAMES = [
419
951
  'Paul Keating': 'former PM of Australia',
420
952
  PUREVSUREN_LUNDEG: 'Mongolian ambassador to the UN',
421
953
  'Stanley Rosenberg': 'former President of the Massachusetts Senate',
422
- }
954
+ },
955
+ patterns=[
956
+ r"[BR]ob Crowe",
957
+ r"CSIS",
958
+ r"(Kevin\s*)?Rudd",
959
+ r"Stanley Rosenberg",
960
+ ],
423
961
  ),
424
962
  HighlightedNames(
425
963
  label='mideast',
426
964
  style='dark_sea_green4',
427
- # something like this won't match ever because of word boundary: [-\s]9/11[\s.]
428
- pattern=r"Abdulmalik Al-Makhlafi|Abdullah|Abu\s+Dhabi|Afghanistan|Al[-\s]?Qa[ei]da|Ahmadinejad|Arab|Aramco|Assad|Bahrain|Basiji?|Benghazi|Cairo|Chagoury|Dj[iu]bo?uti|Doha|[DB]ubai|Egypt(ian)?|Emir(at(es?|i))?|Erdogan|Fashi|Gaddafi|(Hamid\s*)?Karzai|Hamad\s*bin\s*Jassim|HBJ|Houthi|Imran\s+Khan|Iran(ian)?|Isi[ls]|Islam(abad|ic|ist)?|Istanbul|Kh?ashoggi|(Kairat\s*)?Kelimbetov|kasshohgi|Kaz(akh|ich)stan|Kazakh?|Kh[ao]menei|Khalid\s*Sheikh\s*Mohammed|KSA|Leban(ese|on)|Libyan?|Mahmoud|Marra[hk]e[cs]h|MB(N|S|Z)|Mid(dle)?\s*East|Mohammed\s+bin\s+Salman|Morocco|Mubarak|Muslim|Nayaf|Pakistani?|Omar|(Osama\s*)?Bin\s*Laden|Osama(?! al)|Palestin(e|ian)|Persian?|Riya(dh|nd)|Saddam|Salman|Saudi(\s+Arabian?)?|Shariah?|SHC|sheikh|shia|(Sultan\s*)?Yacoub|Syrian?|(Tarek\s*)?El\s*Sayed|Tehran|Tunisian?|Turk(ey|ish)|UAE|((Iraq|Iran|Kuwait|Qatar|Yemen)i?)",
429
- emailers = {
430
- ANAS_ALRASHEED: f'former information minister of Kuwait {QUESTION_MARKS}',
965
+ emailers={
966
+ ANAS_ALRASHEED: 'former information minister of Kuwait (???)',
431
967
  AZIZA_ALAHMADI: 'Abu Dhabi Department of Culture & Tourism',
432
968
  RAAFAT_ALSABBAGH: 'Saudi royal advisor',
433
969
  SHAHER_ABDULHAK_BESHER: 'Yemeni billionaire',
434
- }
970
+ },
971
+ patterns=[
972
+ r"Abdulmalik Al-Makhlafi",
973
+ r"Abdullah",
974
+ r"Abu\s+Dhabi",
975
+ r"Afghanistan",
976
+ r"Al[-\s]?Qa[ei]da",
977
+ r"Ahmadinejad",
978
+ r"Arab",
979
+ r"Aramco",
980
+ r"Armenia",
981
+ r"Assad",
982
+ r"Ayatollah",
983
+ r"Bahrain",
984
+ r"Basiji?",
985
+ r"Beirut",
986
+ r"Benghazi",
987
+ r"Cairo",
988
+ r"Chagoury",
989
+ r"Damascus",
990
+ r"Dj[iu]bo?uti",
991
+ r"Doha",
992
+ r"[DB]ubai",
993
+ r"Egypt(ian)?",
994
+ r"Emir(at(es?|i))?",
995
+ r"Erdogan",
996
+ r"Fashi",
997
+ r"Gaddafi",
998
+ r"Gulf\s*Cooperation\s*Council",
999
+ r"GCC",
1000
+ r"(Hamid\s*)?Karzai",
1001
+ r"Hamad\s*bin\s*Jassim",
1002
+ r"Hamas",
1003
+ r"Hezbollah",
1004
+ r"HBJ",
1005
+ r"Houthi",
1006
+ r"Imran\s+Khan",
1007
+ r"Iran(ian)?",
1008
+ r"Isi[ls]",
1009
+ r"Islam(abad|ic|ist)?",
1010
+ r"Istanbul",
1011
+ r"Kabul",
1012
+ r"(Kairat\s*)?Kelimbetov",
1013
+ r"kasshohgi",
1014
+ r"Kaz(akh|ich)stan",
1015
+ r"Kazakh?",
1016
+ r"Kh[ao]menei",
1017
+ r"Khalid\s*Sheikh\s*Mohammed",
1018
+ r"Kh?ashoggi",
1019
+ r"KSA",
1020
+ r"Leban(ese|on)",
1021
+ r"Libyan?",
1022
+ r"Mahmoud",
1023
+ r"Marra[hk]e[cs]h",
1024
+ r"MB(N|S|Z)",
1025
+ r"Mid(dle)?\s*East(ern)?",
1026
+ r"Mohammed\s+bin\s+Salman",
1027
+ r"Morocco",
1028
+ r"Mubarak",
1029
+ r"Muslim",
1030
+ r"Nayaf",
1031
+ r"Pakistani?",
1032
+ r"Omar",
1033
+ r"(Osama\s*)?Bin\s*Laden",
1034
+ r"Osama(?! al)",
1035
+ r"Palestin(e|ian)",
1036
+ r"Persian?(\s*Gulf)?",
1037
+ r"Riya(dh|nd)",
1038
+ r"Saddam",
1039
+ r"Salman",
1040
+ r"Saudi(\s+Arabian?)?",
1041
+ r"Shariah?",
1042
+ r"SHC",
1043
+ r"sheikh",
1044
+ r"shia",
1045
+ r"(Sultan\s*)?Yacoub",
1046
+ r"Sultan",
1047
+ r"Syrian?",
1048
+ r"(Tarek\s*)?El\s*Sayed",
1049
+ r"Tehran",
1050
+ r"Tunisian?",
1051
+ r"Turk(ey|ish)",
1052
+ r"UAE",
1053
+ r"((Iraq|Iran|Kuwait|Qatar|Yemen)i?)",
1054
+ ],
435
1055
  ),
436
1056
  HighlightedNames(
437
1057
  label='modeling',
438
1058
  style='pale_violet_red1',
439
- pattern=r'\w+@mc2mm.com|model(ed|ing)|(Nicole\s*)?Junkerman',
440
- emailers = {
1059
+ emailers={
441
1060
  'Abi Schwinck': 'MC2 Model Management (?)',
442
1061
  DANIEL_SIAD: None,
443
1062
  FAITH_KATES: 'Next Models co-founder',
@@ -448,166 +1067,328 @@ HIGHLIGHTED_NAMES = [
448
1067
  MANUELA_MARTINEZ: 'Mega Partners (Brazilian agency)',
449
1068
  MARIANA_IDZKOWSKA: None,
450
1069
  'Michael Sanka': 'MC2 Model Management (?)',
451
- }
1070
+ 'Vladimir Yudashkin': 'director of the 1 Mother Agency',
1071
+ },
1072
+ patterns=[
1073
+ r"\w+@mc2mm.com",
1074
+ r"model(ed|ing)",
1075
+ r"(Nicole\s*)?Junkerman", # Also a venture fund manager now
1076
+ ],
452
1077
  ),
453
1078
  HighlightedNames(
454
1079
  label=PUBLICIST,
455
1080
  style='orange_red1',
456
- pattern=fr"(Matt(hew)? )?Hiltzi[gk]|{REPUTATION_MGMT}",
457
- emailers = {
1081
+ emailers={
458
1082
  AL_SECKEL: 'husband of Isabel Maxwell, Mindshift conference organizer who fell off a cliff',
459
1083
  'Barnaby Marsh': 'co-founder of Saint Partners, a philanthropy services company',
460
- CHRISTINA_GALBRAITH: f"{REPUTATION_MGMT}, worked on Epstein's Google search results with {TYLER_SHEARS}",
461
- IAN_OSBORNE: f"{OSBORNE_LLP} reputation repairer possibly hired by Epstein ca. 2011-06",
1084
+ CHRISTINA_GALBRAITH: f"{REPUTATION_MGMT}, worked with Tyler Shears",
1085
+ IAN_OSBORNE: f'{OSBORNE_LLP} reputation repairer hired by Epstein in 2011',
462
1086
  MICHAEL_SITRICK: 'crisis PR',
463
1087
  'Owen Blicksilver': 'OBPR, Inc.',
464
1088
  PEGGY_SIEGAL: 'socialite',
465
1089
  'R. Couri Hay': None,
466
1090
  ROSS_GOW: 'Acuity Reputation Management',
467
- TYLER_SHEARS: f"{REPUTATION_MGMT}, worked on Epstein's Google search results with {CHRISTINA_GALBRAITH}",
468
- }
1091
+ TYLER_SHEARS: f"{REPUTATION_MGMT}, worked on with {CHRISTINA_GALBRAITH}",
1092
+ },
1093
+ patterns=[
1094
+ r"(Matt(hew)? )?Hiltzi[gk]",
1095
+ REPUTATION_MGMT,
1096
+ ],
469
1097
  ),
470
1098
  HighlightedNames(
471
- label='Republicans',
472
- style='bold dark_red',
473
- pattern=r'Alberto\sGonzale[sz]|(Alex\s*)?Acosta|(Bill\s*)?Barr|Bill\s*Shine|(Bob\s*)?Corker|(John\s*(R.?\s*)?)Bolton|Broidy|(Chris\s)?Christie|Devin\s*Nunes|(Don\s*)?McGa[hn]n|McMaster|(George\s*)?Nader|GOP|(Brett\s*)?Kavanaugh|Kissinger|Kobach|Koch\s*Brothers|Kolfage|Kudlow|Lewandowski|(Marco\s)?Rubio|(Mark\s*)Meadows|Mattis|McCain|(?<!Merwin Dela )Cruz|(Michael\s)?Hayden|((General|Mike)\s*)?(Flynn|Pence)|(Mitt\s*)?Romney|Mnuchin|Nikki|Haley|(Paul\s+)?(Manafort|Volcker)|(Peter\s)?Navarro|Pompeo|Reagan|Reince|Priebus|Republican|(Rex\s*)?Tillerson|(?<!Cynthia )(Richard\s*)?Nixon|Sasse|Tea\s*Party',
474
- # There's no emails from these people, they're just here to automate the regex creation for both first + last names
475
- emailers = {
1099
+ label='Republican',
1100
+ style='dark_red bold',
1101
+ emailers={
1102
+ "Juleanna Glover": 'CEO of D.C. public affairs advisory firm Ridgely|Walsh',
476
1103
  RUDY_GIULIANI: None,
477
1104
  TULSI_GABBARD: None,
478
1105
  },
1106
+ patterns=[
1107
+ r"Alberto\sGonzale[sz]",
1108
+ r"(Alex\s*)?Acosta",
1109
+ r"(Ben\s*)?Sasse",
1110
+ r"((Bill|William)\s*)?Barr",
1111
+ r"Bill\s*Shine",
1112
+ r"(Bob\s*)?Corker",
1113
+ r"(Brett\s*)?Kavanaugh",
1114
+ r"Broidy",
1115
+ r"(Chris\s)?Christie",
1116
+ r"(?<!Merwin Dela )Cruz",
1117
+ r"Devin\s*Nunes",
1118
+ r"(Don\s*)?McGa[hn]n",
1119
+ r"Fox\s*News",
1120
+ r"George\s*(H\.?\s*)?(W\.?\s*)?Bush",
1121
+ r"(George\s*)?Nader",
1122
+ r"GOP",
1123
+ r"(John\s*(R.?\s*)?)Bolton",
1124
+ r"Kissinger",
1125
+ r"Kobach",
1126
+ r"Kolfage",
1127
+ r"Kudlow",
1128
+ r"Lewandowski",
1129
+ r"(Marco\s)?Rubio",
1130
+ r"(Mark\s*)Meadows",
1131
+ r"Mattis",
1132
+ r"McCain",
1133
+ r"McMaster",
1134
+ r"(Michael\s)?Hayden",
1135
+ r"((General|Mike)\s*)?(Flynn|Pence)",
1136
+ r"(Mitt\s*)?Romney",
1137
+ r"Mnuchin",
1138
+ r"Nikki",
1139
+ r"Haley",
1140
+ r"(Paul\s*)?(Manafort|Volcker)",
1141
+ r"(Peter\s*)?Navarro",
1142
+ r"Pompeo",
1143
+ r"Reagan",
1144
+ r"Reince", r"Priebus",
1145
+ r"Republican",
1146
+ r"(Rex\s*)?Tillerson",
1147
+ r"(?<!Cynthia )(Richard\s*)?Nixon",
1148
+ r"Tea\s*Party",
1149
+ ],
479
1150
  ),
480
1151
  HighlightedNames(
481
- label='Rothschild family',
1152
+ label='Rothschild',
482
1153
  style='indian_red',
483
1154
  emailers={
484
1155
  ARIANE_DE_ROTHSCHILD: 'heiress',
485
- JOHNNY_EL_HACHEM: f'Works with {ARIANE_DE_ROTHSCHILD}',
1156
+ JOHNNY_EL_HACHEM: f'works with {ARIANE_DE_ROTHSCHILD}',
486
1157
  },
1158
+ patterns=['AdR'],
487
1159
  ),
488
1160
  HighlightedNames(
489
1161
  label='Russia',
490
1162
  style='red bold',
491
- pattern=r'Alfa\s*Bank|Anya\s*Rasulova|Chernobyl|Day\s+One\s+Ventures|(Dmitry\s)?(Kiselyov|(Lana\s*)?Pozhidaeva|Medvedev|Rybolo(o?l?ev|vlev))|Dmitry|FSB|GRU|KGB|Kislyak|Kremlin|Kuznetsova|Lavrov|Lukoil|Moscow|(Oleg\s*)?Deripaska|Oleksandr Vilkul|Rosneft|RT|St.?\s*?Petersburg|Russian?|Sberbank|Soviet(\s*Union)?|USSR|Vladimir|(Vladimir\s*)?(Putin|Yudashkin)|Women\s*Empowerment|Xitrans',
492
- emailers = {
1163
+ emailers={
493
1164
  'Dasha Zhukova': 'art collector, daughter of Alexander Zhukov',
494
1165
  MASHA_DROKOVA: 'silicon valley VC, former Putin Youth',
495
1166
  RENATA_BOLOTOVA: 'former aspiring model, now fund manager at New York State Insurance Fund',
496
- SVETLANA_POZHIDAEVA: f'Epstein\'s Russian assistant who was recommended for a visa by Sergei Belyakov (FSB) and {DAVID_BLAINE}',
497
- }
498
- ),
499
- HighlightedNames(
500
- label=ACADEMIA,
501
- style='light_goldenrod2',
502
- pattern=r'Alain Forget|Brotherton|Carl\s*Sagan|Columbia|David Grosof|J(ames|im)\s*Watson|(Lord\s*)?Martin\s*Rees|Massachusetts\s*Institute\s*of\s*Technology|MIT(\s*Media\s*Lab)?|Media\s*Lab|Minsky|((Noam|Valeria)\s*)?Chomsky|Norman\s*Finkelstein|Praluent|Regeneron|(Richard\s*)?Dawkins|Sanofi|Stanford|(Stephen\s*)?Hawking|(Steven?\s*)?Pinker|UCLA',
503
- emailers = {
504
- DAVID_HAIG: 'evolutionary geneticist?',
505
- JOSCHA_BACH: 'cognitive science / AI research',
506
- 'Daniel Kahneman': 'Nobel economic sciences laureate and cognitivie psychologist (?)',
507
- 'Ed Boyden': 'Associate Professor, MIT Media Lab neurobiology',
508
- LAWRENCE_KRAUSS: 'theoretical physicist',
509
- LINDA_STONE: 'ex-Microsoft, MIT Media Lab',
510
- MARK_TRAMO: 'professor of neurology at UCLA',
511
- 'Nancy Dahl': f'wife of {LAWRENCE_KRAUSS}',
512
- NEAL_KASSELL: 'professor of neurosurgery at University of Virginia',
513
- PETER_ATTIA: 'longevity medicine',
514
- ROBERT_TRIVERS: 'evolutionary biology',
515
- ROGER_SCHANK: 'Teachers College, Columbia University',
1167
+ SVETLANA_POZHIDAEVA: "Epstein's Russian assistant who was recommended for a visa by Sergei Belyakov (FSB) and David Blaine",
516
1168
  },
1169
+ patterns=[
1170
+ r"Alfa\s*Bank",
1171
+ r"Anya\s*Rasulova",
1172
+ r"Chernobyl",
1173
+ r"Crimea",
1174
+ r"Day\s+One\s+Ventures",
1175
+ r"(Dmitry\s)?(Kiselyov|(Lana\s*)?Pozhidaeva|Medvedev|Rybolo(o?l?ev|vlev))",
1176
+ r"Dmitry",
1177
+ r"FSB",
1178
+ r"GRU",
1179
+ r"KGB",
1180
+ r"Kislyak",
1181
+ r"Kremlin",
1182
+ r"Kuznetsova",
1183
+ r"Lavrov",
1184
+ r"Lukoil",
1185
+ r"Moscow",
1186
+ r"(Natalia\s*)?Veselnitskaya",
1187
+ r"(Oleg\s*)?Deripaska",
1188
+ r"Oleksandr Vilkul",
1189
+ r"Rosneft",
1190
+ r"RT",
1191
+ r"St.?\s*?Petersburg",
1192
+ r'Svet',
1193
+ r"Russian?",
1194
+ r"Sberbank",
1195
+ r"Soviet(\s*Union)?",
1196
+ r"USSR",
1197
+ r"Vladimir",
1198
+ r"(Vladimir\s*)?Putin",
1199
+ r"Women\s*Empowerment",
1200
+ r"Xitrans",
1201
+ r"(Vitaly\s*)?Churkin",
1202
+ ],
517
1203
  ),
1204
+
518
1205
  HighlightedNames(
519
1206
  label='southeast Asia',
520
1207
  style='light_salmon3 bold',
521
- pattern=r'Bangkok|Burm(a|ese)|Cambodian?|Laos|Malaysian?|Myan?mar|Thai(land)?|Vietnam(ese)?',
1208
+ patterns=[
1209
+ r"Bangkok",
1210
+ r"Burm(a|ese)",
1211
+ r"Cambodian?",
1212
+ r"Laos",
1213
+ r"Malaysian?",
1214
+ r"Myan?mar",
1215
+ r"Thai(land)?",
1216
+ r"Vietnam(ese)?",
1217
+ ],
522
1218
  ),
523
1219
  HighlightedNames(
524
1220
  label='tech bro',
525
1221
  style='bright_cyan',
526
- pattern=r"AG?I|Chamath|Palihapitiya|Danny\s*Hillis|Drew\s*Houston|Eric\s*Schmidt|Greylock(\s*Partners)?|(?<!(ustin|Moshe)\s)Hoffmand?|LinkedIn|(Mark\s*)?Zuckerberg|Masa(yoshi)?(\sSon)?|Najeev|Nathan\s*Myhrvold|Palantir|(Peter\s)?Th(ie|ei)l|Pierre\s*Omidyar|Sergey\s*Brin|Silicon\s*Valley|Softbank|SpaceX|Tim\s*Ferriss?|WikiLeak(ed|s)",
527
- emailers = {
1222
+ emailers={
528
1223
  'Auren Hoffman': 'CEO of SafeGraph (firm that gathers location data from mobile devices) and LiveRamp',
529
1224
  ELON_MUSK: 'father of Mecha-Hitler',
530
- PETER_THIEL: 'Paypal mafia member, founder of Palantir, early Facebook investor, reactionary',
1225
+ PETER_THIEL: 'Paypal mafia member, founder of Palantir, Facebook investor',
531
1226
  REID_HOFFMAN: 'PayPal mafia member, founder of LinkedIn',
532
1227
  STEVEN_SINOFSKY: 'ex-Microsoft, loves bitcoin',
1228
+ VINCENZO_IOZZO: 'CEO of the identity-security company SlashID',
533
1229
  },
1230
+ patterns=[
1231
+ r"AG?I",
1232
+ r"Chamath", r"Palihapitiya",
1233
+ r"Danny\s*Hillis",
1234
+ r"Drew\s*Houston",
1235
+ r"Eric\s*Schmidt",
1236
+ r"Greylock(\s*Partners)?",
1237
+ r"(?<!(ustin|Moshe)\s)Hoffmand?",
1238
+ r"LinkedIn",
1239
+ r"(Mark\s*)?Zuckerberg",
1240
+ r"Masa(yoshi)?(\sSon)?",
1241
+ r"Najeev",
1242
+ r"Nathan\s*Myhrvold",
1243
+ r"Palantir",
1244
+ r"(Peter\s)?Th(ie|ei)l",
1245
+ r"Pierre\s*Omidyar",
1246
+ r"Sergey\s*Brin",
1247
+ r"Silicon\s*Valley",
1248
+ r"Softbank",
1249
+ r"SpaceX",
1250
+ r"Tim\s*Ferriss?",
1251
+ r"WikiLeak(ed|s)",
1252
+ ],
534
1253
  ),
535
1254
  HighlightedNames(
536
1255
  label='trump',
537
1256
  style='red3 bold',
538
- pattern=r"@?realDonaldTrump|(Alan\s*)?Weiss?elberg|\bDJ?T\b|Donald J. Tramp|(Donald\s+(J\.\s+)?)?Trump(ism|\s*Properties)?|Don(ald| *Jr)(?! Rubin)|Ivank?a|Jared|Kushner|(Madeleine\s*)?Westerhout|Mar[-\s]*a[-\s]*Lago|(Marla\s*)?Maples|(Matt(hew)? )?Calamari|\bMatt C\b|Melania|(Michael (J.? )?)?Boccio|Rebekah\s*Mercer|Roger\s+Stone|rona|(The\s*)?Art\s*of\s*the\s*Deal",
539
- emailers = {
1257
+ emailers={
540
1258
  'Bruce Moskowitz': "'Trump's health guy' according to Epstein",
541
1259
  },
1260
+ patterns=[
1261
+ r"@?realDonaldTrump",
1262
+ r"(Alan\s*)?Weiss?elberg",
1263
+ r"\bDJ?T\b",
1264
+ r"Donald J. Tramp",
1265
+ r"(Donald\s+(J\.\s+)?)?Trump(ism|\s*Properties)?",
1266
+ r"Don(ald| *Jr)(?! Rubin)",
1267
+ r"Ivank?a",
1268
+ r"Jared",
1269
+ r"Kushner",
1270
+ r"(Madeleine\s*)?Westerhout",
1271
+ r"Mar[-\s]*a[-\s]*Lago",
1272
+ r"(Marla\s*)?Maples",
1273
+ r"(Matt(hew)? )?Calamari",
1274
+ r"\bMatt C\b",
1275
+ r"Melania",
1276
+ r"(Michael (J.? )?)?Boccio",
1277
+ r"Rebekah\s*Mercer",
1278
+ r"Roger\s+Stone",
1279
+ r"rona",
1280
+ r"(The\s*)?Art\s*of\s*the\s*Deal",
1281
+ ],
542
1282
  ),
543
1283
  HighlightedNames(
544
1284
  label='victim',
545
1285
  style='orchid1',
546
- pattern=r'BVI|(Jane|Tiffany)\s*Doe|Katie\s*Johnson|(Virginia\s+((L\.?|Roberts)\s+)?)?Giuffre|Virginia\s+Roberts',
1286
+ patterns=[
1287
+ r"(Jane|Tiffany)\s*Doe",
1288
+ r"Katie\s*Johnson",
1289
+ r"(Virginia\s+((L\.?|Roberts)\s+)?)?Giuffre",
1290
+ r"Virginia\s+Roberts",
1291
+ ],
547
1292
  ),
548
1293
  HighlightedNames(
549
1294
  label='victim lawyer',
550
- style='dark_magenta bold',
551
- pattern=r'(Alan(\s*P.)?|MINTZ)\s*FRAADE|Paul\s*(G.\s*)?Cassell|Rothstein\s*Rosenfeldt\s*Adler|(Scott\s*)?Rothstein|(J\.?\s*)?(Stan(ley)?\s*)?Pottinger',
552
- emailers = {
553
- BRAD_EDWARDS: 'Rothstein Rosenfeldt Adler (Rothstein was a crook & partner of Roger Stone)',
1295
+ style='medium_orchid1',
1296
+ emailers={
1297
+ BRAD_EDWARDS: ROTHSTEIN_ROSENFELDT_ADLER,
1298
+ 'Grant J. Smith': ROTHSTEIN_ROSENFELDT_ADLER,
554
1299
  JACK_SCAROLA: 'Searcy Denney Scarola Barnhart & Shipley',
555
- }
1300
+ KEN_JENNE: ROTHSTEIN_ROSENFELDT_ADLER,
1301
+ },
1302
+ patterns=[
1303
+ r"(Alan(\s*P.)?|MINTZ)\s*FRAADE",
1304
+ r"(J\.?\s*)?(Stan(ley)?\s*)?Pottinger",
1305
+ r"Paul\s*(G.\s*)?Cassell",
1306
+ r"Rothstein\s*Rosenfeldt\s*Adler",
1307
+ r"(Scott\s*)?Rothstein",
1308
+ ],
556
1309
  ),
557
1310
  HighlightedNames(
558
1311
  label=VIRGIN_ISLANDS,
559
1312
  style='sea_green1',
560
- pattern=r'Antigua|Bahamas|Caribb?ean|Dominican\s*Republic|(Great|Little)\s*St.?\s*James|Haiti(an)?|(John\s*)deJongh(\s*Jr\.?)|(Kenneth E\. )?Mapp|Palm\s*Beach(?!\s*Post)|PBI|S(ain)?t.?\s*Thomas|USVI|(?<!Epstein )VI|(The\s*)?Virgin\s*Islands(\s*Daily\s*News)?', # TODO: VI Daily News should be yellow but it's hard bc Daily News xists
561
- emailers = {
562
- CECILE_DE_JONGH: f'first lady 2007-2015',
563
- STACEY_PLASKETT: 'non-voting member of Congress',
1313
+ emailers={
1314
+ CECILE_DE_JONGH: 'first lady 2007-2015',
564
1315
  KENNETH_E_MAPP: 'Governor',
1316
+ STACEY_PLASKETT: 'non-voting member of Congress',
565
1317
  },
1318
+ patterns=[
1319
+ r"Antigua",
1320
+ r"Bahamas",
1321
+ r"BVI",
1322
+ r"Caribb?ean",
1323
+ r"Dominican\s*Republic",
1324
+ r"(Great|Little)\s*St.?\s*James",
1325
+ r"Haiti(an)?",
1326
+ r"(John\s*)deJongh(\s*Jr\.?)",
1327
+ r"(Kenneth E\. )?Mapp",
1328
+ r"PBI",
1329
+ r"S(ain)?t.?\s*Thomas",
1330
+ r"USVI",
1331
+ r"(?<!Epstein )VI",
1332
+ r"(The\s*)?Virgin\s*Islands(\s*Daily\s*News)?", # Hard to make this work right
1333
+ r"(West\s*)?Palm\s*Beach(?!\s*(Daily|Post))",
1334
+ ],
566
1335
  ),
567
-
568
- # Individuals
569
1336
  HighlightedNames(
570
1337
  label=BILL_GATES,
571
1338
  style='turquoise4',
572
- pattern=r'BG|b?g?C3|(Bill\s*((and|or)\s*Melinda\s*)?)?Gates|Melinda(\s*Gates)?|Microsoft|MSFT',
573
- emailers = {
1339
+ emailers={
574
1340
  BORIS_NIKOLIC: f'biotech VC partner of {BILL_GATES}, {EPSTEIN_ESTATE_EXECUTOR}',
575
1341
  },
1342
+ patterns=[
1343
+ r"BG",
1344
+ r"b?g?C3",
1345
+ r"(Bill\s*((and|or)\s*Melinda\s*)?)?Gates",
1346
+ r"Melinda(\s*Gates)?",
1347
+ r"Microsoft",
1348
+ r"MSFT",
1349
+ ],
576
1350
  ),
577
1351
  HighlightedNames(
578
1352
  label=STEVE_BANNON,
579
1353
  style='color(58)',
580
- pattern=r'((Steve|Sean)\s*)?Bannon?|(American\s*)?Dharma',
581
- emailers = {
582
- STEVE_BANNON: 'Trump campaign manager, memecoin grifter, convicted criminal',
583
- }
1354
+ category=POLITICS,
1355
+ emailers={
1356
+ STEVE_BANNON: "Trump campaign manager, memecoin grifter, convicted criminal",
1357
+ },
1358
+ patterns=[
1359
+ r"(American\s*)?Dharma",
1360
+ r"((Steve|Sean)\s*)?Bannon?",
1361
+ ],
584
1362
  ),
585
1363
  HighlightedNames(
586
- emailers={STEVEN_HOFFENBERG: HEADER_ABBREVIATIONS['Hoffenberg']},
587
- pattern=r'(steven?\s*)?hoffenberg?w?',
588
- style='gold3'
1364
+ style='dark_olive_green3',
1365
+ category=FINANCE,
1366
+ emailers={STEVEN_HOFFENBERG: "Epstein's ponzi scheme partner at Towers Financial, prison for 18 years"},
1367
+ patterns=[r"(steven?\s*)?hoffenberg?w?"],
589
1368
  ),
590
- HighlightedNames(emailers={GHISLAINE_MAXWELL: None}, pattern='gmax(1@ellmax.com)?|TerraMar', style='deep_pink3'),
591
- HighlightedNames(emailers={JABOR_Y: HEADER_ABBREVIATIONS['Jabor']}, style='spring_green1'),
592
- HighlightedNames(emailers={JEFFREY_EPSTEIN: None}, pattern='JEGE|LSJ|Mark (L. )?Epstein', style='blue1'),
593
- HighlightedNames(emailers={JOI_ITO: 'former head of MIT Media Lab'}, style='gold1'),
1369
+ HighlightedNames(emailers={GHISLAINE_MAXWELL: None}, patterns=[r"gmax(1@ellmax.com)?", r"TerraMar"], style='deep_pink3'),
1370
+ HighlightedNames(emailers={JABOR_Y: '"an influential man in Qatar"'}, category='mideast', style='spring_green1'),
1371
+ HighlightedNames(emailers={JEFFREY_EPSTEIN: None}, patterns=[r"JEGE", r"LSJ", r"Mark (L. )?Epstein"], style='blue1'),
594
1372
  HighlightedNames(emailers={KATHRYN_RUEMMLER: 'former Obama legal counsel'}, style='magenta2'),
595
1373
  HighlightedNames(emailers={MELANIE_WALKER: 'doctor'}, style='pale_violet_red1'),
596
- HighlightedNames(emailers={PAULA: "Epstein's ex-girlfriend who is now in the opera"}, label='paula_heil_fisher', style='pink1'),
1374
+ HighlightedNames(emailers={PAULA: "Epstein's ex-girlfriend who is now in the opera world"}, label='paula_heil_fisher', style='pink1'),
597
1375
  HighlightedNames(emailers={PRINCE_ANDREW: 'British royal family'}, style='dodger_blue1'),
598
- HighlightedNames(emailers={SOON_YI_PREVIN: "wife of Woody Allen"}, style='hot_pink'),
1376
+ HighlightedNames(emailers={SOON_YI_PREVIN: 'wife of Woody Allen'}, style='hot_pink'),
599
1377
  HighlightedNames(emailers={SULTAN_BIN_SULAYEM: 'CEO of DP World, chairman of ports in Dubai'}, style='green1'),
600
1378
 
601
1379
  # HighlightedText not HighlightedNames bc of word boundary issue
602
- HighlightedText(
603
- label='unknown',
604
- style='cyan',
605
- pattern=r'\(unknown\)'
606
- ),
607
1380
  HighlightedText(
608
1381
  label='phone_number',
609
1382
  style='bright_green',
610
- pattern=r"\+?(1?\(?\d{3}\)?[- ]\d{3}[- ]\d{4}|\d{2}[- ]\(?0?\)?\d{2}[- ]\d{4}[- ]\d{4})|(\b|\+)[\d+]{10,12}\b",
1383
+ patterns=[
1384
+ r"\+?(1?\(?\d{3}\)?[- ]\d{3}[- ]\d{4}|\d{2}[- ]\(?0?\)?\d{2}[- ]\d{4}[- ]\d{4})",
1385
+ r"(\b|\+)[\d+]{10,12}\b",
1386
+ ],
1387
+ ),
1388
+ HighlightedText(
1389
+ label='unknown',
1390
+ style='cyan',
1391
+ patterns=[r'\(unknown\)']
611
1392
  ),
612
1393
  ]
613
1394
 
@@ -616,37 +1397,49 @@ HIGHLIGHTED_TEXTS = [
616
1397
  HighlightedText(
617
1398
  label='header_field',
618
1399
  style='plum4',
619
- pattern=r'^(Date|From|Sent|To|C[cC]|Importance|Subject|Bee|B[cC]{2}|Attachments):',
1400
+ patterns=[r'^(> )?(Date|From|Sent|To|C[cC]|Importance|Subject|Bee|B[cC]{2}|Attachments):'],
620
1401
  ),
621
1402
  HighlightedText(
622
1403
  label='http_links',
623
1404
  style=f'{ARCHIVE_LINK_COLOR} underline',
624
- pattern=r"https?:[^\s]+",
1405
+ patterns=[r"https?:[^\s]+"],
625
1406
  ),
626
1407
  HighlightedText(
627
1408
  label='quoted_reply_line',
628
1409
  style='dim',
629
- pattern=REPLY_REGEX.pattern,
1410
+ patterns=[REPLY_REGEX.pattern],
630
1411
  ),
631
1412
  HighlightedText(
632
1413
  label='redacted',
633
1414
  style='grey58',
634
- pattern=fr"{REDACTED}|Privileged - Redacted",
1415
+ patterns=[fr"{REDACTED}|Privileged - Redacted"],
635
1416
  ),
636
1417
  HighlightedText(
637
1418
  label='sent_from',
638
1419
  style='gray42 italic',
639
- pattern=SENT_FROM_REGEX.pattern,
1420
+ patterns=[SENT_FROM_REGEX.pattern],
640
1421
  ),
641
1422
  HighlightedText(
642
1423
  label='snipped_signature',
643
1424
  style='gray19',
644
- pattern=r'<\.\.\.(snipped|trimmed).*\.\.\.>',
1425
+ patterns=[r'<\.\.\.(snipped|trimmed).*\.\.\.>'],
645
1426
  ),
646
1427
  HighlightedText(
647
1428
  label='timestamp_2',
648
1429
  style=TIMESTAMP_STYLE,
649
- pattern=r"\d{1,4}[-/]\d{1,2}[-/]\d{2,4} \d{1,2}:\d{2}:\d{2}( [AP]M)?",
1430
+ patterns=[r"\d{1,4}[-/]\d{1,2}[-/]\d{2,4} \d{1,2}:\d{2}:\d{2}( [AP]M)?"],
1431
+ ),
1432
+
1433
+ # Manual regexes
1434
+ ManualHighlight(
1435
+ label='email_attachments',
1436
+ style='gray30 italic',
1437
+ pattern=r"^(> )?Attachments: (?P<email_attachments>.*)",
1438
+ ),
1439
+ ManualHighlight(
1440
+ label='email_timestamp',
1441
+ style=TIMESTAMP_STYLE,
1442
+ pattern=r"^(> )?(Date|Sent): (?P<email_timestamp>.*)",
650
1443
  ),
651
1444
  ]
652
1445
 
@@ -659,10 +1452,20 @@ class EpsteinHighlighter(RegexHighlighter):
659
1452
  highlights = [highlight_group.regex for highlight_group in ALL_HIGHLIGHTS]
660
1453
 
661
1454
 
662
- def get_info_for_name(name: str) -> str | None:
1455
+ def get_category_for_name(name: str | None) -> Text | None:
663
1456
  highlight_group = _get_highlight_group_for_name(name)
664
1457
 
665
1458
  if highlight_group and isinstance(highlight_group, HighlightedNames):
1459
+ category = highlight_group.category or highlight_group.label
1460
+
1461
+ if category != name:
1462
+ return styled_category(category)
1463
+
1464
+
1465
+ def get_info_for_name(name: str | None) -> str | None:
1466
+ highlight_group = _get_highlight_group_for_name(name)
1467
+
1468
+ if highlight_group and isinstance(highlight_group, HighlightedNames) and name:
666
1469
  return highlight_group.get_info(name)
667
1470
 
668
1471
 
@@ -685,11 +1488,26 @@ def get_style_for_name(name: str | None, default_style: str = DEFAULT, allow_bol
685
1488
  return style if allow_bold else style.replace('bold', '').strip()
686
1489
 
687
1490
 
688
- def styled_category(category: str) -> Text:
1491
+ def styled_category(category: str | None) -> Text:
1492
+ if not category:
1493
+ return QUESTION_MARKS_TXT
1494
+
689
1495
  return Text(category, get_style_for_category(category) or 'wheat4')
690
1496
 
691
1497
 
692
- def _get_highlight_group_for_name(name: str) -> HighlightedNames | None:
1498
+ def _get_highlight_group_for_name(name: str | None) -> HighlightedNames | None:
1499
+ if name is None:
1500
+ return None
1501
+
693
1502
  for highlight_group in HIGHLIGHTED_NAMES:
694
1503
  if highlight_group.regex.search(name):
695
1504
  return highlight_group
1505
+
1506
+
1507
+ def _print_highlighted_names_repr() -> None:
1508
+ for hn in HIGHLIGHTED_NAMES:
1509
+ if isinstance(hn, HighlightedNames):
1510
+ print(indented(repr(hn)) + ',')
1511
+
1512
+ import sys
1513
+ sys.exit()