From 59e9ad04a36d73f3919dca0be494a1e0b329817a Mon Sep 17 00:00:00 2001 From: Avery Schoen <33437601+averyschoen@users.noreply.github.com> Date: Thu, 11 Jan 2024 08:24:23 -0600 Subject: [PATCH 001/214] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1340d12d..708b1e82 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 2023-fall-clinic-climate-cabinet +# 2024-winter-clinic-climate-cabinet ## Data Science Clinic Project Goals @@ -37,7 +37,7 @@ If you prefer to develop inside a container with VS Code then do the following s ### Project Pipeline 1. Collect the data through **one** of the steps below a. Collect state's finance campaign data either from web scraping (AZ, MI, PA) or direct download (MN) OR - b. Go to the [Project's Google Drive]('https://drive.google.com/drive/u/2/folders/1HUbOU0KRZy85mep2SHMU48qUQ1ZOSNce') to download each state's data to their local repo following this format: repo_root / "data" / "raw" / / "file" + b. Go to the [Project's Google Drive]('https://drive.google.com/drive/u/2/folders/1HUbOU0KRZy85mep2SHMU48qUQ1ZOSNce') to download each state's data to their local repo following this format: repo_root / "data" / "raw" / state acronym / "file" 2. Open in development container which installs all necessary packages. 3. Run the project by running ```python utils/pipeline.py``` or ```python3 utils/pipeline.py``` run the processing pipeline that cleans, standardizes, and creates the individuals, organizations, and transactions concatenated into one comprehensive database. 5. running ```pipeline.py``` returns the tables to the output folder as csv files containing the complete individuals, organizations, and transactions DataFrames combining the AZ, MI, MN, and PA datasets. From 82eaba790ab2e80d51c05b4dd2cebc3f3b606bfc Mon Sep 17 00:00:00 2001 From: alankagiri Date: Thu, 11 Jan 2024 09:24:18 -0600 Subject: [PATCH 002/214] changing all references from 2023 fall to 2024 winter --- .devcontainer/devcontainer.json | 2 +- Makefile | 4 ++-- README.md | 10 +--------- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f17fc8e3..ae86d984 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ { - "name": "2023-fall-clinic-climate-cabinet-devcontainer", + "name": "2024-winter-clinic-climate-cabinet-devcontainer", "build": { "dockerfile": "../Dockerfile", "context": "..", diff --git a/Makefile b/Makefile index eb3ba0c3..e210fb2c 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,8 @@ current_abs_path := $(subst Makefile,,$(mkfile_path)) # pipeline constants # PROJECT_NAME -project_image_name := "2023-fall-clinic-climate-cabinet" -project_container_name := "2023-fall-clinic-climate-cabinet-container" +project_image_name := "2024-winter-clinic-climate-cabinet" +project_container_name := "2024-winter-clinic-climate-cabinet-container" project_dir := "$(current_abs_path)" # environment variables diff --git a/README.md b/README.md index d4c582bf..6fd45479 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 2023-fall-clinic-climate-cabinet +# 2024-winter-clinic-climate-cabinet ## Project Background @@ -54,14 +54,6 @@ Should contain work product generated by the analysis. Keep in mind that results ## Team Member -Student Name: April Wang -Student Email: yuzhouw@uchicago.edu - -Student Name: Nicolas Posner -Student Email: nrposner@uchicago.edu - -Student Name: Aïcha Camara -Student Email: aichacamara@uchicago.edu Student Name: Alan Kagiri Student Email: alankagiri@uchicago.edu. From 893ebe6bf7c7c5397c8035ac349aa214fdd422ab Mon Sep 17 00:00:00 2001 From: npashilkar <102933200+npashilkar@users.noreply.github.com> Date: Thu, 11 Jan 2024 11:30:23 -0600 Subject: [PATCH 003/214] Update README.md added name and email to readme file --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 8a65c359..7dec9c8c 100644 --- a/README.md +++ b/README.md @@ -75,3 +75,6 @@ Student Email: alankagiri@uchicago.edu. Student Name: Adil Kassim Student Email: adilk@uchicago.edu + +Student Name: Nayna Pashilkar +Student Email: npashilkar@uchicago.edu From 026f83fce89831b2726ced83990fdbad3f1cdd3b Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 16 Jan 2024 09:56:37 -0600 Subject: [PATCH 004/214] using jaro-winkler, see if it passes pytest --- requirements.txt | 1 + utils/linkage.py | 82 ++---------------------------------------------- 2 files changed, 4 insertions(+), 79 deletions(-) diff --git a/requirements.txt b/requirements.txt index 6658f0ea..846beb4a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,3 +17,4 @@ beautifulsoup4==4.11.1 numpy==1.25.0 Requests==2.31.0 setuptools==68.0.0 +textdistance==4.6.1 \ No newline at end of file diff --git a/utils/linkage.py b/utils/linkage.py index aa56307e..bca99460 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,3 +1,5 @@ +import textdistance as td + """ Module for performing record linkage on state campaign finance dataset """ @@ -27,83 +29,5 @@ def calculate_string_similarity(string1: str, string2: str) -> float: >>> similar_socre > different_score True """ - pass - - -def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: - """Given name related columns, return a person's likely name - - Given different formatting used accross states, errors in data entry - and missing data, it can be difficult to determine someone's actual - name. For example, some states have a last name column with values like - "Doe, Jane", where the person's first name appears to have been erroneously - included. - - Args: - first_name: raw value of first name column - last_name: raw value last name column - full_name: raw value of name or full_name column - Returns: - The most likely full name of the person listed - - Sample Usage: - >>> get_likely_name("Jane", "Doe", "") - "Jane Doe" - >>> get_likely_name("", "", "Jane Doe") - "Jane Doe" - >>> get_likely_name("", "Doe, Jane", "") - "Jane Doe" - >>> get_likely_name("Jane Doe", "Doe", "Jane Doe") - "Jane Doe" - """ - pass - - -def get_address_line_1_from_full_address(address: str) -> str: - """Given a full address, return the first line of the formatted address - - Address line 1 usually includes street address or PO Box information. - Args: - address: raw string representing full address - Returns: - address_line_1 - - Sample Usage: - >>> get_address_line_1_from_full_address("6727 W. Corrine Dr. Peoria,AZ 85381") - "6727 W. Corrine Dr." - >>> get_address_line_1_from_full_address("P.O. Box 5456 Sun City West ,AZ 85375") - "P.O. Box 5456" - >>> get_address_line_1_from_full_address("119 S 5th St Niles,MI 49120") - "119 S 5th St" - >>> get_address_line_1_from_full_address( - ... "1415 PARKER STREET APT 251 DETROIT MI 48214-0000" - ... ) - "1415 PARKER STREET" - """ - pass - - -def get_street_from_address_line_1(address_line_1: str) -> str: - """Given an address line 1, return the street name - - Args: - address_line_1: either street information or PO box - Returns: - street name - Raises: - ValueError: if string is malformed and no street can be reasonably - found. - - >>> get_street_from_address_line_1("5645 N. UBER ST") - "UBER ST" - >>> get_street_from_address_line_1("") - Traceback (most recent call last): - ... - ValueError: address_line_1 must have whitespace - >>> get_street_from_address_line_1("PO Box 1111") - Traceback (most recent call last): - ... - ValueError: address_line_1 is PO Box - """ - pass + return td.jaro_winkler(string1, string2) From e2cd758e6ffb9b999a64a26ccbe4d9143e192292 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 16 Jan 2024 20:31:57 -0600 Subject: [PATCH 005/214] change data type for string similarity to float --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index bca99460..e3398c2c 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -30,4 +30,4 @@ def calculate_string_similarity(string1: str, string2: str) -> float: True """ - return td.jaro_winkler(string1, string2) + return float(td.jaro_winkler(string1, string2)) From b51b30bc1e4bef62d9f48db03373d15595d7a223 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 16 Jan 2024 20:55:32 -0600 Subject: [PATCH 006/214] fixed spelling error in test --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index e3398c2c..2edfdeac 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -26,7 +26,7 @@ def calculate_string_similarity(string1: str, string2: str) -> float: 0.0 >>> similar_score = calculate_string_similarity("very similar", "vary similar") >>> different_score = calculate_string_similarity("very similar", "very not close") - >>> similar_socre > different_score + >>> similar_score > different_score True """ From b9d4d6429152fb2bc00a9ba9b9e52b12fa893c9b Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 17 Jan 2024 03:58:22 +0000 Subject: [PATCH 007/214] get_street_from_address_line_1 initial function --- utils/linkage.py | 101 +++++++++-------------------------------------- 1 file changed, 19 insertions(+), 82 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index aa56307e..433656bb 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -3,87 +3,6 @@ """ -def calculate_string_similarity(string1: str, string2: str) -> float: - """Returns how similar two strings are on a scale of 0 to 1 - - The exact meaning of the metric is open, but the following must hold true: - 1. equivalent strings must return 1 - 2. strings with no similar characters must return 0 - 3. strings with higher intuitive similarity must return higher scores - - Args: - string1: any string - string2: any string - Returns: - similarity score - - Sample Usage: - >>> calculate_string_similarity("exact match", "exact match") - 1.0 - >>> calculate_string_similarity("aaaaaa", "bbbbbbbbbbb") - 0.0 - >>> similar_score = calculate_string_similarity("very similar", "vary similar") - >>> different_score = calculate_string_similarity("very similar", "very not close") - >>> similar_socre > different_score - True - """ - pass - - -def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: - """Given name related columns, return a person's likely name - - Given different formatting used accross states, errors in data entry - and missing data, it can be difficult to determine someone's actual - name. For example, some states have a last name column with values like - "Doe, Jane", where the person's first name appears to have been erroneously - included. - - Args: - first_name: raw value of first name column - last_name: raw value last name column - full_name: raw value of name or full_name column - Returns: - The most likely full name of the person listed - - Sample Usage: - >>> get_likely_name("Jane", "Doe", "") - "Jane Doe" - >>> get_likely_name("", "", "Jane Doe") - "Jane Doe" - >>> get_likely_name("", "Doe, Jane", "") - "Jane Doe" - >>> get_likely_name("Jane Doe", "Doe", "Jane Doe") - "Jane Doe" - """ - pass - - -def get_address_line_1_from_full_address(address: str) -> str: - """Given a full address, return the first line of the formatted address - - Address line 1 usually includes street address or PO Box information. - - Args: - address: raw string representing full address - Returns: - address_line_1 - - Sample Usage: - >>> get_address_line_1_from_full_address("6727 W. Corrine Dr. Peoria,AZ 85381") - "6727 W. Corrine Dr." - >>> get_address_line_1_from_full_address("P.O. Box 5456 Sun City West ,AZ 85375") - "P.O. Box 5456" - >>> get_address_line_1_from_full_address("119 S 5th St Niles,MI 49120") - "119 S 5th St" - >>> get_address_line_1_from_full_address( - ... "1415 PARKER STREET APT 251 DETROIT MI 48214-0000" - ... ) - "1415 PARKER STREET" - """ - pass - - def get_street_from_address_line_1(address_line_1: str) -> str: """Given an address line 1, return the street name @@ -106,4 +25,22 @@ def get_street_from_address_line_1(address_line_1: str) -> str: ... ValueError: address_line_1 is PO Box """ - pass + + if not address_line_1 or address_line_1.isspace(): + raise ValueError("address_line_1 must have whitespace") + + address_line_lower = address_line_1.lower() + + if "po box" in address_line_lower: + raise ValueError("address_line_1 is PO Box") + + parts = address_line_1.split() + + string = [] + for i, part in enumerate(parts): + part_lower = part.lower() + if part.isdigit() or "." in part_lower: + continue + else: + string += [part] + return " ".join(string) From 6e86bfead8157794fc13fa0e191451cbb164c205 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 17 Jan 2024 06:00:32 +0000 Subject: [PATCH 008/214] updated work --- utils/linkage.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 433656bb..e15421ca 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -43,4 +43,6 @@ def get_street_from_address_line_1(address_line_1: str) -> str: continue else: string += [part] - return " ".join(string) + + string = " ".join(string) + print('"{}"'.format(string)) From e2e898cf1a5e5c61f9880405505c0a137b9f3195 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 17 Jan 2024 15:47:15 +0000 Subject: [PATCH 009/214] slight edit in function --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index e15421ca..ccc5d32c 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -37,7 +37,7 @@ def get_street_from_address_line_1(address_line_1: str) -> str: parts = address_line_1.split() string = [] - for i, part in enumerate(parts): + for part in enumerate(parts): part_lower = part.lower() if part.isdigit() or "." in part_lower: continue From c41428098d387aa222a592d3e5422b918b7cf87c Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 17 Jan 2024 15:51:39 +0000 Subject: [PATCH 010/214] slight edit in function loop --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index ccc5d32c..10711fb9 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -37,7 +37,7 @@ def get_street_from_address_line_1(address_line_1: str) -> str: parts = address_line_1.split() string = [] - for part in enumerate(parts): + for _, part in enumerate(parts): part_lower = part.lower() if part.isdigit() or "." in part_lower: continue From 7f9fd677e132c1aa5526ed820ffa9fdda06d00a0 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 17 Jan 2024 09:59:37 -0600 Subject: [PATCH 011/214] made case insensitive --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 2edfdeac..c7504a82 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -30,4 +30,4 @@ def calculate_string_similarity(string1: str, string2: str) -> float: True """ - return float(td.jaro_winkler(string1, string2)) + return float(td.jaro_winkler(string1.lower(), string2.lower())) From d1b52b3616b8d100f57eaba920b9483d5dce817e Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 17 Jan 2024 16:05:28 +0000 Subject: [PATCH 012/214] edited test case and function --- utils/linkage.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 10711fb9..d7f69742 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -15,7 +15,7 @@ def get_street_from_address_line_1(address_line_1: str) -> str: found. >>> get_street_from_address_line_1("5645 N. UBER ST") - "UBER ST" + 'UBER ST' >>> get_street_from_address_line_1("") Traceback (most recent call last): ... @@ -37,12 +37,11 @@ def get_street_from_address_line_1(address_line_1: str) -> str: parts = address_line_1.split() string = [] - for _, part in enumerate(parts): + for part in parts: part_lower = part.lower() if part.isdigit() or "." in part_lower: continue else: string += [part] - string = " ".join(string) - print('"{}"'.format(string)) + return " ".join(string) From e16fd40c2e6edb0d4ed3e64b311196aec7e428bc Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 17 Jan 2024 16:18:25 +0000 Subject: [PATCH 013/214] slight changes in function --- utils/linkage.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index d7f69742..6a37c405 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -38,8 +38,7 @@ def get_street_from_address_line_1(address_line_1: str) -> str: string = [] for part in parts: - part_lower = part.lower() - if part.isdigit() or "." in part_lower: + if part.isdigit() or "." in part: continue else: string += [part] From f1d6e83e35ffde5005779049ff8887902f2573ca Mon Sep 17 00:00:00 2001 From: npashilkar <102933200+npashilkar@users.noreply.github.com> Date: Wed, 17 Jan 2024 19:08:21 -0600 Subject: [PATCH 014/214] finished line 1 from full address function --- utils/linkage.py | 145 ++++++++++++++--------------------------------- 1 file changed, 43 insertions(+), 102 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index aa56307e..3c98a90e 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -2,108 +2,49 @@ Module for performing record linkage on state campaign finance dataset """ - -def calculate_string_similarity(string1: str, string2: str) -> float: - """Returns how similar two strings are on a scale of 0 to 1 - - The exact meaning of the metric is open, but the following must hold true: - 1. equivalent strings must return 1 - 2. strings with no similar characters must return 0 - 3. strings with higher intuitive similarity must return higher scores - - Args: - string1: any string - string2: any string - Returns: - similarity score - - Sample Usage: - >>> calculate_string_similarity("exact match", "exact match") - 1.0 - >>> calculate_string_similarity("aaaaaa", "bbbbbbbbbbb") - 0.0 - >>> similar_score = calculate_string_similarity("very similar", "vary similar") - >>> different_score = calculate_string_similarity("very similar", "very not close") - >>> similar_socre > different_score - True - """ - pass - - -def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: - """Given name related columns, return a person's likely name - - Given different formatting used accross states, errors in data entry - and missing data, it can be difficult to determine someone's actual - name. For example, some states have a last name column with values like - "Doe, Jane", where the person's first name appears to have been erroneously - included. - - Args: - first_name: raw value of first name column - last_name: raw value last name column - full_name: raw value of name or full_name column - Returns: - The most likely full name of the person listed - - Sample Usage: - >>> get_likely_name("Jane", "Doe", "") - "Jane Doe" - >>> get_likely_name("", "", "Jane Doe") - "Jane Doe" - >>> get_likely_name("", "Doe, Jane", "") - "Jane Doe" - >>> get_likely_name("Jane Doe", "Doe", "Jane Doe") - "Jane Doe" - """ - pass +import usaddress + + +def address_components(address_tuples): + add = [] + for value in address_tuples: + if value[1] == "PlaceName": + break # Stop when reaching 'PlaceName' + elif value[1] in ( + "AddressNumber", + "StreetNamePreDirectional", + "StreetName", + "StreetNamePostType", + "USPSBoxType", + "USPSBoxID", + ): + add.append(value[0]) + return " ".join(add) def get_address_line_1_from_full_address(address: str) -> str: - """Given a full address, return the first line of the formatted address - - Address line 1 usually includes street address or PO Box information. - - Args: - address: raw string representing full address - Returns: - address_line_1 - - Sample Usage: - >>> get_address_line_1_from_full_address("6727 W. Corrine Dr. Peoria,AZ 85381") - "6727 W. Corrine Dr." - >>> get_address_line_1_from_full_address("P.O. Box 5456 Sun City West ,AZ 85375") - "P.O. Box 5456" - >>> get_address_line_1_from_full_address("119 S 5th St Niles,MI 49120") - "119 S 5th St" - >>> get_address_line_1_from_full_address( - ... "1415 PARKER STREET APT 251 DETROIT MI 48214-0000" - ... ) - "1415 PARKER STREET" - """ - pass - - -def get_street_from_address_line_1(address_line_1: str) -> str: - """Given an address line 1, return the street name - - Args: - address_line_1: either street information or PO box - Returns: - street name - Raises: - ValueError: if string is malformed and no street can be reasonably - found. - - >>> get_street_from_address_line_1("5645 N. UBER ST") - "UBER ST" - >>> get_street_from_address_line_1("") - Traceback (most recent call last): - ... - ValueError: address_line_1 must have whitespace - >>> get_street_from_address_line_1("PO Box 1111") - Traceback (most recent call last): - ... - ValueError: address_line_1 is PO Box - """ - pass + line1 = usaddress.parse(address) + return address_components(line1) + + # """Given a full address, return the first line of the formatted address + + # Address line 1 usually includes street address or PO Box information. + + # Args: + # address: raw string representing full address + # Returns: + # address_line_1 + + # Sample Usage: + # >>> get_address_line_1_from_full_address("6727 W. Corrine Dr. Peoria,AZ 85381") + # "6727 W. Corrine Dr." + # >>> get_address_line_1_from_full_address("P.O. Box 5456 Sun City West ,AZ 85375") + # "P.O. Box 5456" + # >>> get_address_line_1_from_full_address("119 S 5th St Niles,MI 49120") + # "119 S 5th St" + # >>> get_address_line_1_from_full_address( + # ... "1415 PARKER STREET APT 251 DETROIT MI 48214-0000" + # ... ) + # "1415 PARKER STREET" + # """ + # pass From de741914a00d0024b0567f990860d0a7828dc853 Mon Sep 17 00:00:00 2001 From: npashilkar <102933200+npashilkar@users.noreply.github.com> Date: Wed, 17 Jan 2024 19:08:58 -0600 Subject: [PATCH 015/214] added usaddress library to requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 6658f0ea..49c29ba0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,3 +17,4 @@ beautifulsoup4==4.11.1 numpy==1.25.0 Requests==2.31.0 setuptools==68.0.0 +usaddress==0.5.4 From 46a5c3b8d297598d561da2aaecc3d90493f8427e Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 18 Jan 2024 00:05:53 -0600 Subject: [PATCH 016/214] get_likely function done --- setup.py | 2 +- utils/linkage.py | 120 +++++++++++++++++------------------------------ 2 files changed, 44 insertions(+), 78 deletions(-) diff --git a/setup.py b/setup.py index 63ef672a..07404acd 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages, setup setup( - name="2023-fall-clinic-climate-cabinet", + name="2024-winter-clinic-climate-cabinet", version="0.1.0", packages=find_packages( include=[ diff --git a/utils/linkage.py b/utils/linkage.py index aa56307e..c3ddf1b7 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -3,33 +3,6 @@ """ -def calculate_string_similarity(string1: str, string2: str) -> float: - """Returns how similar two strings are on a scale of 0 to 1 - - The exact meaning of the metric is open, but the following must hold true: - 1. equivalent strings must return 1 - 2. strings with no similar characters must return 0 - 3. strings with higher intuitive similarity must return higher scores - - Args: - string1: any string - string2: any string - Returns: - similarity score - - Sample Usage: - >>> calculate_string_similarity("exact match", "exact match") - 1.0 - >>> calculate_string_similarity("aaaaaa", "bbbbbbbbbbb") - 0.0 - >>> similar_score = calculate_string_similarity("very similar", "vary similar") - >>> different_score = calculate_string_similarity("very similar", "very not close") - >>> similar_socre > different_score - True - """ - pass - - def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: """Given name related columns, return a person's likely name @@ -56,54 +29,47 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: >>> get_likely_name("Jane Doe", "Doe", "Jane Doe") "Jane Doe" """ - pass - - -def get_address_line_1_from_full_address(address: str) -> str: - """Given a full address, return the first line of the formatted address - - Address line 1 usually includes street address or PO Box information. - - Args: - address: raw string representing full address - Returns: - address_line_1 - - Sample Usage: - >>> get_address_line_1_from_full_address("6727 W. Corrine Dr. Peoria,AZ 85381") - "6727 W. Corrine Dr." - >>> get_address_line_1_from_full_address("P.O. Box 5456 Sun City West ,AZ 85375") - "P.O. Box 5456" - >>> get_address_line_1_from_full_address("119 S 5th St Niles,MI 49120") - "119 S 5th St" - >>> get_address_line_1_from_full_address( - ... "1415 PARKER STREET APT 251 DETROIT MI 48214-0000" - ... ) - "1415 PARKER STREET" - """ - pass - -def get_street_from_address_line_1(address_line_1: str) -> str: - """Given an address line 1, return the street name - - Args: - address_line_1: either street information or PO box - Returns: - street name - Raises: - ValueError: if string is malformed and no street can be reasonably - found. - - >>> get_street_from_address_line_1("5645 N. UBER ST") - "UBER ST" - >>> get_street_from_address_line_1("") - Traceback (most recent call last): - ... - ValueError: address_line_1 must have whitespace - >>> get_street_from_address_line_1("PO Box 1111") - Traceback (most recent call last): - ... - ValueError: address_line_1 is PO Box - """ - pass + # if data is clean: + if first_name + " " + last_name == full_name: + return full_name + + # some names have titles or professions associated with the name. We need to + # remove those from the name. + titles = [ + "mr", + "ms", + "mrs", + "miss", + "prof", + "dr", + "doctor", + "sir", + "madam", + "professor", + ] + names = [first_name, last_name, full_name] + + for i in range(len(names)): + # if there is a ',' switch around the names + if "," in names[i]: + index = names[i].find(",") + first_part = names[i][index + 1 :] + last_part = names[i][0:index] + names[i] = first_part + " " + last_part + + names[i] = names[i].lower().replace(".", "").split(" ") + names[i] = [ + name_part for name_part in names[i] if name_part not in titles + ] + names[i] = " ".join(names[i]) + + names = " ".join(names) + names = names.split(" ") + final_name = [] + [ + final_name.append(x) + for x in names + if ((x not in final_name) & (len(x) != 0)) + ] + return " ".join(final_name) From 073c935e3861ebc12a086ae5bc01fee4acadc373 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 18 Jan 2024 00:15:34 -0600 Subject: [PATCH 017/214] added .title() function to return proper name format --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index c3ddf1b7..7461049b 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -72,4 +72,4 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: for x in names if ((x not in final_name) & (len(x) != 0)) ] - return " ".join(final_name) + return " ".join(final_name).title() From 16a51dc7ba80ecd3ecdc4653f8623c1b5a8fb9a1 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 18 Jan 2024 00:55:07 -0600 Subject: [PATCH 018/214] struggling with converting single quotes into double quotes for function output --- utils/linkage.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 7461049b..f695a0a9 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -67,9 +67,5 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: names = " ".join(names) names = names.split(" ") final_name = [] - [ - final_name.append(x) - for x in names - if ((x not in final_name) & (len(x) != 0)) - ] - return " ".join(final_name).title() + [final_name.append(x) for x in names if x not in final_name] + return " ".join(final_name).title().strip() From c446aaf79b5843a416d6951cc19a7f1554347f1a Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Sat, 20 Jan 2024 03:03:36 -0600 Subject: [PATCH 019/214] updates to get_likely_name function after feedback to consider generational suffixes and handle more edge cases --- utils/linkage.py | 64 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 10 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index f695a0a9..f43e09fd 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,6 +1,47 @@ -""" -Module for performing record linkage on state campaign finance dataset -""" +def determine_comma_role(name: str) -> str: + """Given a string (someone's name), attempts to determine the role of the + comma in the name and where it ought to belong. + + Some assumptions are made: + * If a suffix is included in the name and the name is not just the last + name(i.e "Doe, Jr), the format is + (last_name suffix, first and middle name) i.e Doe iv, Jane Elisabeth + + * If a comma is used anywhere else, it is in the format of + (last_name, first and middle name) i.e Doe, Jane Elisabeth + + Args: + name: a string representing a name/names of individuals + Returns: + the name with or without a comma based on some conditions + """ + suffixes = [ + "sr", + "jr", + "i", + "ii", + "iii", + "iv", + "v", + "vi", + "vii", + "viii", + "ix", + "x", + ] + name_parts = name.split(",") + # if the comma is just in the end as a typo: + if len(name_parts[1]) == 0: + return name_parts[0] + # if just the suffix in the end, leave the name as it is + if name_parts[1].strip() in suffixes: + return name + # at this point either it's just poor name placement, or the suffix is + # in the beginning of the name. Either way, the first part of the list is the + # true last name. + last_part = name_parts.pop(0) + first_part = " ".join(name_parts) + return first_part + " " + last_part def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: @@ -29,6 +70,10 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: >>> get_likely_name("Jane Doe", "Doe", "Jane Doe") "Jane Doe" """ + # first ensure clean input by deleting spaces: + first_name, last_name, full_name = list( + map(lambda x: x.lower().strip(), [first_name, last_name, full_name]) + ) # if data is clean: if first_name + " " + last_name == full_name: @@ -51,20 +96,19 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: names = [first_name, last_name, full_name] for i in range(len(names)): - # if there is a ',' switch around the names + # if there is a ',' deal with it accordingly if "," in names[i]: - index = names[i].find(",") - first_part = names[i][index + 1 :] - last_part = names[i][0:index] - names[i] = first_part + " " + last_part - - names[i] = names[i].lower().replace(".", "").split(" ") + names[i] = determine_comma_role(names[i]) + print(names[i]) + names[i] = names[i].replace(".", "").split(" ") names[i] = [ name_part for name_part in names[i] if name_part not in titles ] names[i] = " ".join(names[i]) + print(names[i]) names = " ".join(names) + print("after comma: ", names) names = names.split(" ") final_name = [] [final_name.append(x) for x in names if x not in final_name] From efc02e22ebc298095c2abf7a4adcd13db02b2a2d Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Sat, 20 Jan 2024 03:11:05 -0600 Subject: [PATCH 020/214] adjusted the sample usage output to single quotes as per Avery's suggestion --- utils/linkage.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index f43e09fd..9b9ba220 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -62,13 +62,19 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: Sample Usage: >>> get_likely_name("Jane", "Doe", "") - "Jane Doe" + 'Jane Doe' >>> get_likely_name("", "", "Jane Doe") - "Jane Doe" + 'Jane Doe' >>> get_likely_name("", "Doe, Jane", "") - "Jane Doe" + 'Jane Doe' >>> get_likely_name("Jane Doe", "Doe", "Jane Doe") - "Jane Doe" + 'Jane Doe' + >>> get_likely_name("Jane","","Doe, Sr") + 'Jane Doe, Sr' + >>> get_likely_name("Jane Elisabeth Doe, IV","Elisabeth","Doe, IV) + 'Jane Elisabeth Doe, Iv' + >>> get_likely_name("","",Jane Elisabeth Doe, IV") + 'Jane Elisabeth Doe Iv' """ # first ensure clean input by deleting spaces: first_name, last_name, full_name = list( @@ -99,16 +105,14 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: # if there is a ',' deal with it accordingly if "," in names[i]: names[i] = determine_comma_role(names[i]) - print(names[i]) + names[i] = names[i].replace(".", "").split(" ") names[i] = [ name_part for name_part in names[i] if name_part not in titles ] names[i] = " ".join(names[i]) - print(names[i]) names = " ".join(names) - print("after comma: ", names) names = names.split(" ") final_name = [] [final_name.append(x) for x in names if x not in final_name] From 6c37c4576c39ec2d1ac6856c036ed6dceef6c628 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Sat, 20 Jan 2024 03:25:32 -0600 Subject: [PATCH 021/214] took care of empty strings that were adding extra whitespace to o output --- utils/linkage.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 9b9ba220..521c75c5 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -111,7 +111,9 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: name_part for name_part in names[i] if name_part not in titles ] names[i] = " ".join(names[i]) - + + #one last check to remove any pieces that might add extra whitespace + names = list(filter(lambda x: x != '', names)) names = " ".join(names) names = names.split(" ") final_name = [] From 81e52dbdb537e4ee6caae02462c49ba7a2ef1d1a Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Sat, 20 Jan 2024 03:27:12 -0600 Subject: [PATCH 022/214] took care of empty strings that were adding extra whitespace to output --- utils/linkage.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 521c75c5..4c1d24ff 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -111,9 +111,9 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: name_part for name_part in names[i] if name_part not in titles ] names[i] = " ".join(names[i]) - - #one last check to remove any pieces that might add extra whitespace - names = list(filter(lambda x: x != '', names)) + + # one last check to remove any pieces that might add extra whitespace + names = list(filter(lambda x: x != "", names)) names = " ".join(names) names = names.split(" ") final_name = [] From 2dcb7d9592be19be15e688101509a25581848dcc Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Sat, 20 Jan 2024 03:30:06 -0600 Subject: [PATCH 023/214] fixed error in sample usage output --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 4c1d24ff..df15117d 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -71,7 +71,7 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: 'Jane Doe' >>> get_likely_name("Jane","","Doe, Sr") 'Jane Doe, Sr' - >>> get_likely_name("Jane Elisabeth Doe, IV","Elisabeth","Doe, IV) + >>> get_likely_name("Jane Elisabeth Doe, IV","Elisabeth","Doe, IV") 'Jane Elisabeth Doe, Iv' >>> get_likely_name("","",Jane Elisabeth Doe, IV") 'Jane Elisabeth Doe Iv' From a51c33777d06cf5aca0097ed456ad5d908771b6d Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 23 Jan 2024 20:37:46 -0600 Subject: [PATCH 024/214] added explanation of jaro-winkler and reversed strings --- utils/linkage.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index c7504a82..b7b95ef5 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -8,6 +8,16 @@ def calculate_string_similarity(string1: str, string2: str) -> float: """Returns how similar two strings are on a scale of 0 to 1 + This version utilizes Jaro-Winkler distance, which is a metric of + edit distance. Jaro-Winkler specially prioritizes the early + characters in a string. + + Since the ends of strings are often more valuable in matching names + and addresses, we reverse the strings before matching them. + + https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance + https://github.com/Yomguithereal/talisman/blob/master/src/metrics/jaro-winkler.js + The exact meaning of the metric is open, but the following must hold true: 1. equivalent strings must return 1 2. strings with no similar characters must return 0 @@ -30,4 +40,4 @@ def calculate_string_similarity(string1: str, string2: str) -> float: True """ - return float(td.jaro_winkler(string1.lower(), string2.lower())) + return float(td.jaro_winkler(string1.lower()[::-1], string2.lower()[::-1])) From 98a10586a4cb66d8a239e12015f1c5636245696d Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 23 Jan 2024 20:50:24 -0600 Subject: [PATCH 025/214] fixing linter error --- utils/linkage.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index b7b95ef5..568125df 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -8,9 +8,9 @@ def calculate_string_similarity(string1: str, string2: str) -> float: """Returns how similar two strings are on a scale of 0 to 1 - This version utilizes Jaro-Winkler distance, which is a metric of - edit distance. Jaro-Winkler specially prioritizes the early - characters in a string. + This version utilizes Jaro-Winkler distance, which is a metric of + edit distance. Jaro-Winkler specially prioritizes the early + characters in a string. Since the ends of strings are often more valuable in matching names and addresses, we reverse the strings before matching them. From d711a26d05bb2793f74c7d356b96688a03911876 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 24 Jan 2024 03:49:30 +0000 Subject: [PATCH 026/214] adding usaddress to requirements.txt file --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 6658f0ea..49c29ba0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,3 +17,4 @@ beautifulsoup4==4.11.1 numpy==1.25.0 Requests==2.31.0 setuptools==68.0.0 +usaddress==0.5.4 From 0ddd8b0abe76f01f8ac7bff25c0dd9aa6fe2906c Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 24 Jan 2024 05:07:18 +0000 Subject: [PATCH 027/214] updated function with additional test cases --- utils/linkage.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 6a37c405..fe4dfd3c 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,6 +1,7 @@ """ Module for performing record linkage on state campaign finance dataset """ +import usaddress def get_street_from_address_line_1(address_line_1: str) -> str: @@ -24,8 +25,13 @@ def get_street_from_address_line_1(address_line_1: str) -> str: Traceback (most recent call last): ... ValueError: address_line_1 is PO Box + >>> get_street_from_address_line_1("300 59 St.") + '59 St.' + >>> get_street_from_address_line_1("Uber St.") + 'Uber St.' + >>> get_street_from_address_line_1("3NW 59th St") + '59th St' """ - if not address_line_1 or address_line_1.isspace(): raise ValueError("address_line_1 must have whitespace") @@ -34,13 +40,10 @@ def get_street_from_address_line_1(address_line_1: str) -> str: if "po box" in address_line_lower: raise ValueError("address_line_1 is PO Box") - parts = address_line_1.split() - string = [] - for part in parts: - if part.isdigit() or "." in part: - continue - else: - string += [part] + address = usaddress.parse(address_line_1) + for key, val in address: + if val in ["StreetName", "StreetNamePostType"]: + string.append(key) return " ".join(string) From 6f882ddf9735c86a379348d760ba026ef98aee73 Mon Sep 17 00:00:00 2001 From: Avery Date: Wed, 24 Jan 2024 09:54:40 -0600 Subject: [PATCH 028/214] fix for linter --- utils/linkage.py | 2 +- utils/pipeline.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index b738998d..44f24e59 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -5,6 +5,7 @@ Module for performing record linkage on state campaign finance dataset """ + def calculate_string_similarity(string1: str, string2: str) -> float: """Returns how similar two strings are on a scale of 0 to 1 @@ -86,4 +87,3 @@ def get_street_from_address_line_1(address_line_1: str) -> str: string.append(key) return " ".join(string) - diff --git a/utils/pipeline.py b/utils/pipeline.py index 7a288fd4..e6b7a120 100644 --- a/utils/pipeline.py +++ b/utils/pipeline.py @@ -18,6 +18,7 @@ single_state_organizations_tables = [] single_state_transactions_tables = [] for state_cleaner in state_cleaners: + print("Cleaning...") ( individuals_table, organizations_table, From c8cdcaf10a9121fee065e67b138cf6c923ebb664 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 24 Jan 2024 18:20:31 -0600 Subject: [PATCH 029/214] added row similarity and row match functions. these do not yet have tests --- utils/linkage.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/utils/linkage.py b/utils/linkage.py index aa56307e..ed6a8264 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,6 +1,8 @@ """ Module for performing record linkage on state campaign finance dataset """ +import numpy as np +import pandas as pd def calculate_string_similarity(string1: str, string2: str) -> float: @@ -107,3 +109,68 @@ def get_street_from_address_line_1(address_line_1: str) -> str: ValueError: address_line_1 is PO Box """ pass + + +def calculate_row_similarity( + row1: pd.DataFrame, row2: pd.DataFrame, weights: np.array, comparison_func +) -> float: + """Find weighted similarity of two rows in a dataframe + + The length of the weights vector must be the same as + the number of selected columns. + + This version is slow and not optimized, and will be + revised in order to make it more efficient. It + exists as to provide basic functionality. Once we have + the comparison function locked in, using .apply will + likely be easier and more efficient. + """ + + row_length = len(weights) + if not (row1.shape[1] == row2.shape[1] == row_length): + raise ValueError("Number of columns and weights must be the same") + + similarity = np.zeros(row_length) + + for i in range(row_length): + similarity[i] = comparison_func(row1.iloc[:, i], row2.iloc[:, i]) + + return sum(similarity * weights) + + +def row_matches(df: pd.DataFrame, weights: np.array, threshold: float, comparison_func) -> dict: + """Get weighted similarity score of two rows + + Run through the rows using indices: if two rows have a comparison score + greater than a threshold, we assign the later row to the former. Any + row which is matched to any other row is not examined again. Matches are + stored in a dictionary object, with each index appearing no more than once. + + This is not optimized + """ + + all_indices = np.array(list(df.index)) + + index_dict = {} + [index_dict.setdefault(x, []) for x in all_indices] + + discard_indices = [] + + end = max(all_indices) + for i in all_indices: + # Skip indices that have been stored in the discard_indices list + if i in discard_indices: + continue + + # Iterate through the remaining numbers + for j in range(i + 1, end): + if j in discard_indices: + continue + + # Our conditional + if calculate_row_similarity(df.iloc[[i]], df.iloc[[j]], weights, comparison_func) > threshold: + # Store the other index and mark it for skipping in future iterations + discard_indices.append(j) + index_dict[i].append[j] + + return index_dict From edfda3e48ae6a5d147b232e50aba883acc23a25b Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 24 Jan 2024 19:38:01 -0600 Subject: [PATCH 030/214] fixing linter error --- utils/linkage.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index ed6a8264..ee856a84 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -138,7 +138,9 @@ def calculate_row_similarity( return sum(similarity * weights) -def row_matches(df: pd.DataFrame, weights: np.array, threshold: float, comparison_func) -> dict: +def row_matches( + df: pd.DataFrame, weights: np.array, threshold: float, comparison_func +) -> dict: """Get weighted similarity score of two rows Run through the rows using indices: if two rows have a comparison score @@ -168,7 +170,12 @@ def row_matches(df: pd.DataFrame, weights: np.array, threshold: float, compariso continue # Our conditional - if calculate_row_similarity(df.iloc[[i]], df.iloc[[j]], weights, comparison_func) > threshold: + if ( + calculate_row_similarity( + df.iloc[[i]], df.iloc[[j]], weights, comparison_func + ) + > threshold + ): # Store the other index and mark it for skipping in future iterations discard_indices.append(j) index_dict[i].append[j] From fa78221415d1031c19b3bade004f1fb1952ad753 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 24 Jan 2024 19:53:07 -0600 Subject: [PATCH 031/214] fixing linter errors --- utils/linkage.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 90feb034..a7bce17a 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,5 +1,6 @@ import textdistance as td -import usaddress + +# import usaddress """ Module for performing record linkage on state campaign finance dataset From 427d5b6da5d18d54fc802372aed43bf6114abee6 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 24 Jan 2024 19:57:15 -0600 Subject: [PATCH 032/214] fixing pytest errors --- utils/linkage.py | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index a7bce17a..a56cea60 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -47,31 +47,6 @@ def calculate_string_similarity(string1: str, string2: str) -> float: return float(td.jaro_winkler(string1.lower()[::-1], string2.lower()[::-1])) -def get_street_from_address_line_1(address_line_1: str) -> str: - """Given an address line 1, return the street name - - Args: - address_line_1: either street information or PO box - Returns: - street name - Raises: - ValueError: if string is malformed and no street can be reasonably - found. - - >>> get_street_from_address_line_1("5645 N. UBER ST") - 'UBER ST' - >>> get_street_from_address_line_1("") - Traceback (most recent call last): - ... - ValueError: address_line_1 must have whitespace - >>> get_street_from_address_line_1("PO Box 1111") - Traceback (most recent call last): - ... - ValueError: address_line_1 is PO Box - """ - pass - - def calculate_row_similarity( row1: pd.DataFrame, row2: pd.DataFrame, weights: np.array, comparison_func ) -> float: From 236bfc75d7b18723a054800e7414b3e8af06dd91 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 24 Jan 2024 20:31:25 -0600 Subject: [PATCH 033/214] revised and added test case for calculate_row_similarity --- utils/linkage.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index a56cea60..66e99138 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -60,6 +60,23 @@ def calculate_row_similarity( exists as to provide basic functionality. Once we have the comparison function locked in, using .apply will likely be easier and more efficient. + + >>> d = {'name': ["bob von rosevich", "anantarya smith", "bob j + vonrosevich"],'address': ["3 Circle Drive, Chicago, Illinois", + "4 Circle Drive, Chicago, Illinois", "8 Fancy Way, Chicago, Illinois"]} + >>> df = pd.DataFrame(data = d) + >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], + np.array([.8, .2]), calculate_string_similarity) + >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], + np.array([.8, .2]), calculate_string_similarity) + >>> right > wrong + True + >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], + np.array([.2, .8]), calculate_string_similarity) + >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], + np.array([.2, .8]), calculate_string_similarity) + >>> right > wrong + False """ row_length = len(weights) @@ -69,7 +86,10 @@ def calculate_row_similarity( similarity = np.zeros(row_length) for i in range(row_length): - similarity[i] = comparison_func(row1.iloc[:, i], row2.iloc[:, i]) + similarity[i] = comparison_func( + row1.reset_index().drop(columns="index").iloc[:, i][0], + row2.reset_index().drop(columns="index").iloc[:, i][0], + ) return sum(similarity * weights) @@ -84,7 +104,8 @@ def row_matches( row which is matched to any other row is not examined again. Matches are stored in a dictionary object, with each index appearing no more than once. - This is not optimized + This is not optimized. Not presently sure how to make a good test case + for this, will submit and ask in mentor session. """ all_indices = np.array(list(df.index)) From f3e3b228c9cfaba62ced82a48230edb15ea2a13e Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 24 Jan 2024 20:35:04 -0600 Subject: [PATCH 034/214] fixing pytest string error --- utils/linkage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 66e99138..1fb6df78 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -61,8 +61,8 @@ def calculate_row_similarity( the comparison function locked in, using .apply will likely be easier and more efficient. - >>> d = {'name': ["bob von rosevich", "anantarya smith", "bob j - vonrosevich"],'address': ["3 Circle Drive, Chicago, Illinois", + >>> d = {'name': ["bob von rosevich", "anantarya smith", + "bob j vonrosevich"],'address': ["3 Circle Drive, Chicago, Illinois", "4 Circle Drive, Chicago, Illinois", "8 Fancy Way, Chicago, Illinois"]} >>> df = pd.DataFrame(data = d) >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], From 26b9095677b3dedab6f8ddad9d1e6aa5c2ea2514 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 24 Jan 2024 20:39:10 -0600 Subject: [PATCH 035/214] fixed some more pytest errors --- utils/linkage.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 1fb6df78..a15eaacb 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -61,9 +61,10 @@ def calculate_row_similarity( the comparison function locked in, using .apply will likely be easier and more efficient. - >>> d = {'name': ["bob von rosevich", "anantarya smith", - "bob j vonrosevich"],'address': ["3 Circle Drive, Chicago, Illinois", - "4 Circle Drive, Chicago, Illinois", "8 Fancy Way, Chicago, Illinois"]} + >>> d = {'name': + ["bob von rosevich", "anantarya smith","bob j vonrosevich"], + 'address': + ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago", "8 Fancy Way, Chicago"]} >>> df = pd.DataFrame(data = d) >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], np.array([.8, .2]), calculate_string_similarity) From 20f4e938e09fa98d1f5acddf7e6eee5c8c2684b5 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Thu, 25 Jan 2024 05:16:07 +0000 Subject: [PATCH 036/214] adding cleaning_company_column function --- utils/linkage.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/utils/linkage.py b/utils/linkage.py index fe4dfd3c..86485d3b 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,6 +1,7 @@ """ Module for performing record linkage on state campaign finance dataset """ +import pandas as pd import usaddress @@ -47,3 +48,54 @@ def get_street_from_address_line_1(address_line_1: str) -> str: string.append(key) return " ".join(string) + + +""" +Module for standardizing the 'company' columnn of the state campaign finance dataset +""" + + +def cleaning_company_column(company: str) -> str: + """ + Given a string, check if it contains a variation of self employed, unemployed, + or retired and return the standardized version. + + Args: + company: string of inputted company names + Returns: + standardized for retired, self employed, and unemployed, + or original string if no match or empty string + + >>> cleaning_company_column("Retireed") + 'Retired' + >>> cleaning_company_column("self") + 'Self Employed' + >>> cleaning_company_column("None") + 'Unemployed' + """ + if pd.isnull(company): + return company + + company_edited = company.lower() + company_edited = company_edited.strip() + company_edited = company_edited.replace(".", " ") + company_edited = company_edited.replace(",", " ") + company_edited = company_edited.replace("-", " ") + + if "retire" in company_edited: + return "Retired" + elif "self employe" in company_edited or company_edited == "self": + return "Self Employed" + elif ( + "unemploye" in company_edited + or company_edited == "none" + or company_edited == "not employed" + ): + return "Unemployed" + + else: + return company + + +# Example implementation of the function standardize_company_column for a dataframe +# df['standardized_company'] = df['company'].apply(standardize_company_column) From 7e7fba38657e8521956b88d8fbb60f3415a29f38 Mon Sep 17 00:00:00 2001 From: npashilkar <102933200+npashilkar@users.noreply.github.com> Date: Thu, 25 Jan 2024 18:53:39 -0600 Subject: [PATCH 037/214] Updated linkage.py updated variable names + additional description --- utils/linkage.py | 72 +++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 38 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 3c98a90e..89a3cf1e 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,16 +1,39 @@ """ Module for performing record linkage on state campaign finance dataset """ - import usaddress - -def address_components(address_tuples): - add = [] - for value in address_tuples: - if value[1] == "PlaceName": - break # Stop when reaching 'PlaceName' - elif value[1] in ( +def get_address_line_1_from_full_address(address: str) -> str: + + """Given a full address, return the first line of the formatted address + + Address line 1 usually includes street address or PO Box information. + + Args: + address: raw string representing full address + Returns: + address_line_1 + + Sample Usage: + >>> get_address_line_1_from_full_address("6727 W. Corrine Dr. Peoria,AZ 85381") + "6727 W. Corrine Dr." + >>> get_address_line_1_from_full_address("P.O. Box 5456 Sun City West ,AZ 85375") + "P.O. Box 5456" + >>> get_address_line_1_from_full_address("119 S 5th St Niles,MI 49120") + "119 S 5th St" + >>> get_address_line_1_from_full_address( + ... "1415 PARKER STREET APT 251 DETROIT MI 48214-0000" + ... ) + "1415 PARKER STREET" + """ + pass + + address_tuples = usaddress.parse(address) #takes a string address and put them into value,key pairs as tuples + line1_components = [] + for value,key in address_tuples: + if key == "PlaceName": + break + elif key in ( "AddressNumber", "StreetNamePreDirectional", "StreetName", @@ -18,33 +41,6 @@ def address_components(address_tuples): "USPSBoxType", "USPSBoxID", ): - add.append(value[0]) - return " ".join(add) - - -def get_address_line_1_from_full_address(address: str) -> str: - line1 = usaddress.parse(address) - return address_components(line1) - - # """Given a full address, return the first line of the formatted address - - # Address line 1 usually includes street address or PO Box information. - - # Args: - # address: raw string representing full address - # Returns: - # address_line_1 - - # Sample Usage: - # >>> get_address_line_1_from_full_address("6727 W. Corrine Dr. Peoria,AZ 85381") - # "6727 W. Corrine Dr." - # >>> get_address_line_1_from_full_address("P.O. Box 5456 Sun City West ,AZ 85375") - # "P.O. Box 5456" - # >>> get_address_line_1_from_full_address("119 S 5th St Niles,MI 49120") - # "119 S 5th St" - # >>> get_address_line_1_from_full_address( - # ... "1415 PARKER STREET APT 251 DETROIT MI 48214-0000" - # ... ) - # "1415 PARKER STREET" - # """ - # pass + line1_components.append(value) + line1 = " ".join(line1_components) + return line1 From 87be7e2a711687ee9b000cc9a71cc58e1c3e5880 Mon Sep 17 00:00:00 2001 From: Avery Date: Fri, 26 Jan 2024 14:41:58 -0600 Subject: [PATCH 038/214] run precommit --- utils/linkage.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 8b619d21..2bd15653 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -5,8 +5,8 @@ Module for performing record linkage on state campaign finance dataset """ + def get_address_line_1_from_full_address(address: str) -> str: - """Given a full address, return the first line of the formatted address Address line 1 usually includes street address or PO Box information. @@ -30,11 +30,13 @@ def get_address_line_1_from_full_address(address: str) -> str: """ pass - address_tuples = usaddress.parse(address) #takes a string address and put them into value,key pairs as tuples + address_tuples = usaddress.parse( + address + ) # takes a string address and put them into value,key pairs as tuples line1_components = [] - for value,key in address_tuples: + for value, key in address_tuples: if key == "PlaceName": - break + break elif key in ( "AddressNumber", "StreetNamePreDirectional", @@ -48,7 +50,6 @@ def get_address_line_1_from_full_address(address: str) -> str: return line1 - def calculate_string_similarity(string1: str, string2: str) -> float: """Returns how similar two strings are on a scale of 0 to 1 @@ -129,4 +130,4 @@ def get_street_from_address_line_1(address_line_1: str) -> str: if val in ["StreetName", "StreetNamePostType"]: string.append(key) - return " ".join(string) \ No newline at end of file + return " ".join(string) From baf56f5707c31b222f97322c2b244892982873a5 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 29 Jan 2024 10:26:49 -0600 Subject: [PATCH 039/214] testing if merge was done correctly after git pull --- requirements.txt | 2 ++ utils/linkage.py | 86 +++++++++++++++++++++++++++++++++++++++++++++-- utils/pipeline.py | 1 + 3 files changed, 87 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 6658f0ea..944e1c53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,3 +17,5 @@ beautifulsoup4==4.11.1 numpy==1.25.0 Requests==2.31.0 setuptools==68.0.0 +textdistance==4.6.1 +usaddress==0.5.4 \ No newline at end of file diff --git a/utils/linkage.py b/utils/linkage.py index df15117d..e88a4a37 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,3 +1,41 @@ +""" +Module for performing record linkage on state campaign finance dataset +""" +import textdistance as td +import usaddress + +def calculate_string_similarity(string1: str, string2: str) -> float: + """Returns how similar two strings are on a scale of 0 to 1 + + This version utilizes Jaro-Winkler distance, which is a metric of + edit distance. Jaro-Winkler specially prioritizes the early + characters in a string. + + Since the ends of strings are often more valuable in matching names + and addresses, we reverse the strings before matching them. + + https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance + https://github.com/Yomguithereal/talisman/blob/master/src/metrics/jaro-winkler.js + + The exact meaning of the metric is open, but the following must hold true: + 1. equivalent strings must return 1 + 2. strings with no similar characters must return 0 + 3. strings with higher intuitive similarity must return higher scores + similarity score + + Sample Usage: + >>> calculate_string_similarity("exact match", "exact match") + 1.0 + >>> calculate_string_similarity("aaaaaa", "bbbbbbbbbbb") + 0.0 + >>> similar_score = calculate_string_similarity("very similar", "vary similar") + >>> different_score = calculate_string_similarity("very similar", "very not close") + >>> similar_score > different_score + True + """ + + return float(td.jaro_winkler(string1.lower()[::-1], string2.lower()[::-1])) + def determine_comma_role(name: str) -> str: """Given a string (someone's name), attempts to determine the role of the comma in the name and where it ought to belong. @@ -9,7 +47,6 @@ def determine_comma_role(name: str) -> str: * If a comma is used anywhere else, it is in the format of (last_name, first and middle name) i.e Doe, Jane Elisabeth - Args: name: a string representing a name/names of individuals Returns: @@ -73,7 +110,7 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: 'Jane Doe, Sr' >>> get_likely_name("Jane Elisabeth Doe, IV","Elisabeth","Doe, IV") 'Jane Elisabeth Doe, Iv' - >>> get_likely_name("","",Jane Elisabeth Doe, IV") + >>> get_likely_name("","","Jane Elisabeth Doe, IV") 'Jane Elisabeth Doe Iv' """ # first ensure clean input by deleting spaces: @@ -119,3 +156,48 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: final_name = [] [final_name.append(x) for x in names if x not in final_name] return " ".join(final_name).title().strip() + + +def get_street_from_address_line_1(address_line_1: str) -> str: + """Given an address line 1, return the street name + + Args: + address_line_1: either street information or PO box + Returns: + street name + Raises: + ValueError: if string is malformed and no street can be reasonably + found. + + >>> get_street_from_address_line_1("5645 N. UBER ST") + 'UBER ST' + >>> get_street_from_address_line_1("") + Traceback (most recent call last): + ... + ValueError: address_line_1 must have whitespace + >>> get_street_from_address_line_1("PO Box 1111") + Traceback (most recent call last): + ... + ValueError: address_line_1 is PO Box + >>> get_street_from_address_line_1("300 59 St.") + '59 St.' + >>> get_street_from_address_line_1("Uber St.") + 'Uber St.' + >>> get_street_from_address_line_1("3NW 59th St") + '59th St' + """ + if not address_line_1 or address_line_1.isspace(): + raise ValueError("address_line_1 must have whitespace") + + address_line_lower = address_line_1.lower() + + if "po box" in address_line_lower: + raise ValueError("address_line_1 is PO Box") + + string = [] + address = usaddress.parse(address_line_1) + for key, val in address: + if val in ["StreetName", "StreetNamePostType"]: + string.append(key) + + return " ".join(string) diff --git a/utils/pipeline.py b/utils/pipeline.py index 7a288fd4..e6b7a120 100644 --- a/utils/pipeline.py +++ b/utils/pipeline.py @@ -18,6 +18,7 @@ single_state_organizations_tables = [] single_state_transactions_tables = [] for state_cleaner in state_cleaners: + print("Cleaning...") ( individuals_table, organizations_table, From 6e5f656c802eb33675bfd2bc8cd323a46326af7e Mon Sep 17 00:00:00 2001 From: npashilkar Date: Mon, 29 Jan 2024 11:01:55 -0600 Subject: [PATCH 040/214] updated sample usage --- utils/linkage.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 2bd15653..d013bfd7 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -17,16 +17,16 @@ def get_address_line_1_from_full_address(address: str) -> str: address_line_1 Sample Usage: - >>> get_address_line_1_from_full_address("6727 W. Corrine Dr. Peoria,AZ 85381") - "6727 W. Corrine Dr." - >>> get_address_line_1_from_full_address("P.O. Box 5456 Sun City West ,AZ 85375") - "P.O. Box 5456" - >>> get_address_line_1_from_full_address("119 S 5th St Niles,MI 49120") - "119 S 5th St" + >>> get_address_line_1_from_full_address('6727 W. Corrine Dr. Peoria,AZ 85381') + '6727 W. Corrine Dr.' + >>> get_address_line_1_from_full_address('P.O. Box 5456 Sun City West ,AZ 85375') + 'P.O. Box 5456' + >>> get_address_line_1_from_full_address('119 S 5th St Niles,MI 49120') + '119 S 5th St' >>> get_address_line_1_from_full_address( - ... "1415 PARKER STREET APT 251 DETROIT MI 48214-0000" + ... '1415 PARKER STREET APT 251 DETROIT MI 48214-0000' ... ) - "1415 PARKER STREET" + '1415 PARKER STREET' """ pass From 3d6500cfb5ef60aa3a745c593802cb605f840800 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 29 Jan 2024 11:17:58 -0600 Subject: [PATCH 041/214] undoing the mistake of previous commit where I committed files from the data and output directories --- utils/linkage.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 1500dc08..e419c6f5 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -4,6 +4,7 @@ import textdistance as td import usaddress + def calculate_string_similarity(string1: str, string2: str) -> float: """Returns how similar two strings are on a scale of 0 to 1 @@ -75,8 +76,8 @@ def determine_comma_role(name: str) -> str: if name_parts[1].strip() in suffixes: return name # at this point either it's just poor name placement, or the suffix is - # in the beginning of the name. Either way, the first part of the list is the - # true last name. + # in the beginning of the name. Either way, the first part of the list is + # the true last name. last_part = name_parts.pop(0) first_part = " ".join(name_parts) return first_part + " " + last_part @@ -157,7 +158,7 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: final_name = [] [final_name.append(x) for x in names if x not in final_name] return " ".join(final_name).title().strip() - + def get_street_from_address_line_1(address_line_1: str) -> str: """Given an address line 1, return the street name From 90872c091017a5d60704966cab579f08ef351673 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 29 Jan 2024 11:30:24 -0600 Subject: [PATCH 042/214] fixing last linter error for function sample output --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index e419c6f5..2ec26e04 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -113,7 +113,7 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: >>> get_likely_name("Jane Elisabeth Doe, IV","Elisabeth","Doe, IV") 'Jane Elisabeth Doe, Iv' >>> get_likely_name("","","Jane Elisabeth Doe, IV") - 'Jane Elisabeth Doe Iv' + 'Jane Elisabeth Doe, Iv' """ # first ensure clean input by deleting spaces: first_name, last_name, full_name = list( From ca8b3f7aa83262e8c8de1064d962a2f19f16da86 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Mon, 29 Jan 2024 23:21:27 -0600 Subject: [PATCH 043/214] standardizing corporate names function --- utils/linkage.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/utils/linkage.py b/utils/linkage.py index 44f24e59..f99ab5a0 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -87,3 +87,69 @@ def get_street_from_address_line_1(address_line_1: str) -> str: string.append(key) return " ".join(string) + + +def standardize_corp_names(company_name: str) -> str: + """Given an employer name, return the standardized version + + Args: + company_name: corporate name + Returns: + standardized company name + + >>>standardize_corp_names('MI BEER WINE WHOLESALERS ASSOC') + 'MI BEER WINE WHOLESALERS ASSOCIATION' + + >>>standardize_corp_names('MI COMMUNITY COLLEGE ASSOCIATION') + 'MI COMMUNITY COLLEGE ASSOCIATION' + + >>>standardize_corp_names('STEPHANIES CHANGEMAKER FUND') + 'STEPHANIES CHANGEMAKER FUND' + + """ + + + company_name_split = company_name.upper().split(' ') + + company_types = { + 'CORP': 'CORPORATION', + 'CO': 'CORPORATION', + 'LLC': 'LIMITED LIABILITY COMPANY', + 'PTNR': 'PARTNERSHIP', + 'LP': 'LIMITED PARTNERSHIP', + 'LLP': 'LIMITED LIABILITY PARTNERSHIP', + 'SOLE PROP': 'SOLE PROPRIETORSHIP', + 'SP': 'SOLE PROPRIETORSHIP', + 'NPO': 'NONPROFIT ORGANIZATION', + 'PC': 'PROFESSIONAL CORPORATION', + 'CO-OP': 'COOPERATIVE', + 'LTD': 'LIMITED COMPANY', + 'JSC': 'JOINT STOCK COMPANY', + 'HOLDCO': 'HOLDING COMPANY', + 'PLC': 'PUBLIC LIMITED COMPANY', + 'PVT LTD': 'PRIVATE LIMITED COMPANY', + 'INC': 'INCORPORATED', + 'ASSOC': 'ASSOCIATION', + 'FDN': 'FOUNDATION', + 'TR': 'TRUST', + 'SOC': 'SOCIETY', + 'CONSORT': 'CONSORTIUM', + 'SYND': 'SYNDICATE', + 'GRP': 'GROUP', + 'CORP SOLE': 'CORPORATION SOLE', + 'JV': 'JOINT VENTURE', + 'SUB': 'SUBSIDIARY', + 'FRANCHISE': 'FRANCHISE', + 'PA': 'PROFESSIONAL ASSOCIATION', + 'CIC': 'COMMUNITY INTEREST COMPANY', + + 'PAC': 'POLITICAL ACTION COMMITTEE' +} + + for i in range(len(company_name_split)): + if company_name_split[i] in list(company_types.keys()): + hold = company_name_split[i] + company_name_split[i] = company_types[hold] + + new_company_name = ' '.join(company_name_split) + return new_company_name \ No newline at end of file From d3d3ebf8ebad7ac6c0979da3c54d8bd48181024d Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 30 Jan 2024 11:20:37 -0600 Subject: [PATCH 044/214] fixing row similarity test syntax --- utils/linkage.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index a15eaacb..d9a131b9 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -61,21 +61,21 @@ def calculate_row_similarity( the comparison function locked in, using .apply will likely be easier and more efficient. - >>> d = {'name': - ["bob von rosevich", "anantarya smith","bob j vonrosevich"], - 'address': - ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago", "8 Fancy Way, Chicago"]} + >>> d = { + ... 'name':["bob von rosevich", "anantarya smith","bob j vonrosevich"], + ... 'address': ["3 Blue Drive, Chicago", "4 Blue Drive, + ... Chicago", "8 Fancy Way, Chicago"]} >>> df = pd.DataFrame(data = d) >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], - np.array([.8, .2]), calculate_string_similarity) + ... np.array([.8, .2]), calculate_string_similarity) >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], - np.array([.8, .2]), calculate_string_similarity) + ... np.array([.8, .2]), calculate_string_similarity) >>> right > wrong True >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], - np.array([.2, .8]), calculate_string_similarity) + ... np.array([.2, .8]), calculate_string_similarity) >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], - np.array([.2, .8]), calculate_string_similarity) + ... np.array([.2, .8]), calculate_string_similarity) >>> right > wrong False """ From 85021df354bcb29ae2d4343a02fa4532a3f2d80c Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 30 Jan 2024 11:25:11 -0600 Subject: [PATCH 045/214] adding backspaces to fix string literals --- utils/linkage.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index d9a131b9..1880affe 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -61,21 +61,21 @@ def calculate_row_similarity( the comparison function locked in, using .apply will likely be easier and more efficient. - >>> d = { - ... 'name':["bob von rosevich", "anantarya smith","bob j vonrosevich"], - ... 'address': ["3 Blue Drive, Chicago", "4 Blue Drive, + >>> d = {\ + ... 'name':["bob von rosevich", "anantarya smith","bob j vonrosevich"],\ + ... 'address': ["3 Blue Drive, Chicago", "4 Blue Drive,\ ... Chicago", "8 Fancy Way, Chicago"]} >>> df = pd.DataFrame(data = d) - >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], + >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]],\ ... np.array([.8, .2]), calculate_string_similarity) - >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], + >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]],\ ... np.array([.8, .2]), calculate_string_similarity) >>> right > wrong True - >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], + >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]],\ ... np.array([.2, .8]), calculate_string_similarity) >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], - ... np.array([.2, .8]), calculate_string_similarity) + ... np.array([.2, .8]), calculate_string_similarity)\ >>> right > wrong False """ From 44b89b3c27da1d67bd5d684f69b8c3924ef62b7b Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 30 Jan 2024 11:34:10 -0600 Subject: [PATCH 046/214] fixing typos --- utils/linkage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 1880affe..16aeb27e 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -63,8 +63,8 @@ def calculate_row_similarity( >>> d = {\ ... 'name':["bob von rosevich", "anantarya smith","bob j vonrosevich"],\ - ... 'address': ["3 Blue Drive, Chicago", "4 Blue Drive,\ - ... Chicago", "8 Fancy Way, Chicago"]} + ... 'address': ["3 Blue Drive, Chicago", "4 Blue Drive,Chicago",\ + ... "8 Fancy Way, Chicago"]} >>> df = pd.DataFrame(data = d) >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]],\ ... np.array([.8, .2]), calculate_string_similarity) From 1a39b72885c80115d8d5d2edf7331bf21e220a10 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 30 Jan 2024 15:50:37 -0600 Subject: [PATCH 047/214] trying out chatpgts recommendation to fix the pytest error --- utils/linkage.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 16aeb27e..80ef39c1 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -61,21 +61,22 @@ def calculate_row_similarity( the comparison function locked in, using .apply will likely be easier and more efficient. - >>> d = {\ - ... 'name':["bob von rosevich", "anantarya smith","bob j vonrosevich"],\ - ... 'address': ["3 Blue Drive, Chicago", "4 Blue Drive,Chicago",\ - ... "8 Fancy Way, Chicago"]} - >>> df = pd.DataFrame(data = d) - >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]],\ - ... np.array([.8, .2]), calculate_string_similarity) - >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]],\ - ... np.array([.8, .2]), calculate_string_similarity) + >>> d = { + ... 'name': ["bob von rosevich", "anantarya smith", "bob j vonrosevich"], + ... 'address': ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago", + ... "8 Fancy Way, Chicago"] + ... } + >>> df = pd.DataFrame(data=d) + >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], + ... np.array([.8, .2]), calculate_string_similarity) + >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], + ... np.array([.8, .2]), calculate_string_similarity) >>> right > wrong True - >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]],\ - ... np.array([.2, .8]), calculate_string_similarity) + >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], + ... np.array([.2, .8]), calculate_string_similarity) >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], - ... np.array([.2, .8]), calculate_string_similarity)\ + ... np.array([.2, .8]), calculate_string_similarity) >>> right > wrong False """ From 498009fadedc76a05ec4df587e5b57c8aaf41865 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 30 Jan 2024 15:53:04 -0600 Subject: [PATCH 048/214] resolving linter error --- utils/linkage.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 80ef39c1..c6cc5292 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -62,21 +62,25 @@ def calculate_row_similarity( likely be easier and more efficient. >>> d = { - ... 'name': ["bob von rosevich", "anantarya smith", "bob j vonrosevich"], + ... 'name': ["bob von rosevich", "anantarya smith","bob j vonrosevich"], ... 'address': ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago", ... "8 Fancy Way, Chicago"] ... } >>> df = pd.DataFrame(data=d) >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], - ... np.array([.8, .2]), calculate_string_similarity) + ... np.array([.8, .2]), + ... calculate_string_similarity) >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], - ... np.array([.8, .2]), calculate_string_similarity) + ... np.array([.8, .2]), + ... calculate_string_similarity) >>> right > wrong True >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], - ... np.array([.2, .8]), calculate_string_similarity) + ... np.array([.2, .8]), + ... calculate_string_similarity) >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], - ... np.array([.2, .8]), calculate_string_similarity) + ... np.array([.2, .8]), + ... calculate_string_similarity) >>> right > wrong False """ From 663f08daf061f79cfba23a97cbaadfd9ff67d6a6 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Tue, 30 Jan 2024 20:02:15 -0600 Subject: [PATCH 049/214] corp names function update --- utils/linkage.py | 82 +++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index f99ab5a0..65f4cb48 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -96,60 +96,58 @@ def standardize_corp_names(company_name: str) -> str: company_name: corporate name Returns: standardized company name - + >>>standardize_corp_names('MI BEER WINE WHOLESALERS ASSOC') 'MI BEER WINE WHOLESALERS ASSOCIATION' - + >>>standardize_corp_names('MI COMMUNITY COLLEGE ASSOCIATION') 'MI COMMUNITY COLLEGE ASSOCIATION' - + >>>standardize_corp_names('STEPHANIES CHANGEMAKER FUND') - 'STEPHANIES CHANGEMAKER FUND' - - """ + 'STEPHANIES CHANGEMAKER FUND' + """ - company_name_split = company_name.upper().split(' ') + company_name_split = company_name.upper().split(" ") company_types = { - 'CORP': 'CORPORATION', - 'CO': 'CORPORATION', - 'LLC': 'LIMITED LIABILITY COMPANY', - 'PTNR': 'PARTNERSHIP', - 'LP': 'LIMITED PARTNERSHIP', - 'LLP': 'LIMITED LIABILITY PARTNERSHIP', - 'SOLE PROP': 'SOLE PROPRIETORSHIP', - 'SP': 'SOLE PROPRIETORSHIP', - 'NPO': 'NONPROFIT ORGANIZATION', - 'PC': 'PROFESSIONAL CORPORATION', - 'CO-OP': 'COOPERATIVE', - 'LTD': 'LIMITED COMPANY', - 'JSC': 'JOINT STOCK COMPANY', - 'HOLDCO': 'HOLDING COMPANY', - 'PLC': 'PUBLIC LIMITED COMPANY', - 'PVT LTD': 'PRIVATE LIMITED COMPANY', - 'INC': 'INCORPORATED', - 'ASSOC': 'ASSOCIATION', - 'FDN': 'FOUNDATION', - 'TR': 'TRUST', - 'SOC': 'SOCIETY', - 'CONSORT': 'CONSORTIUM', - 'SYND': 'SYNDICATE', - 'GRP': 'GROUP', - 'CORP SOLE': 'CORPORATION SOLE', - 'JV': 'JOINT VENTURE', - 'SUB': 'SUBSIDIARY', - 'FRANCHISE': 'FRANCHISE', - 'PA': 'PROFESSIONAL ASSOCIATION', - 'CIC': 'COMMUNITY INTEREST COMPANY', - - 'PAC': 'POLITICAL ACTION COMMITTEE' -} + "CORP": "CORPORATION", + "CO": "CORPORATION", + "LLC": "LIMITED LIABILITY COMPANY", + "PTNR": "PARTNERSHIP", + "LP": "LIMITED PARTNERSHIP", + "LLP": "LIMITED LIABILITY PARTNERSHIP", + "SOLE PROP": "SOLE PROPRIETORSHIP", + "SP": "SOLE PROPRIETORSHIP", + "NPO": "NONPROFIT ORGANIZATION", + "PC": "PROFESSIONAL CORPORATION", + "CO-OP": "COOPERATIVE", + "LTD": "LIMITED COMPANY", + "JSC": "JOINT STOCK COMPANY", + "HOLDCO": "HOLDING COMPANY", + "PLC": "PUBLIC LIMITED COMPANY", + "PVT LTD": "PRIVATE LIMITED COMPANY", + "INC": "INCORPORATED", + "ASSOC": "ASSOCIATION", + "FDN": "FOUNDATION", + "TR": "TRUST", + "SOC": "SOCIETY", + "CONSORT": "CONSORTIUM", + "SYND": "SYNDICATE", + "GRP": "GROUP", + "CORP SOLE": "CORPORATION SOLE", + "JV": "JOINT VENTURE", + "SUB": "SUBSIDIARY", + "FRANCHISE": "FRANCHISE", + "PA": "PROFESSIONAL ASSOCIATION", + "CIC": "COMMUNITY INTEREST COMPANY", + "PAC": "POLITICAL ACTION COMMITTEE", + } for i in range(len(company_name_split)): if company_name_split[i] in list(company_types.keys()): hold = company_name_split[i] company_name_split[i] = company_types[hold] - new_company_name = ' '.join(company_name_split) - return new_company_name \ No newline at end of file + new_company_name = " ".join(company_name_split) + return new_company_name From 1ab1d4277f03f68a0fdf9b887af729f24f4e1d2c Mon Sep 17 00:00:00 2001 From: npashilkar Date: Tue, 30 Jan 2024 20:07:25 -0600 Subject: [PATCH 050/214] updated corp names --- utils/linkage.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 65f4cb48..49d120b3 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -97,13 +97,13 @@ def standardize_corp_names(company_name: str) -> str: Returns: standardized company name - >>>standardize_corp_names('MI BEER WINE WHOLESALERS ASSOC') + >>> standardize_corp_names('MI BEER WINE WHOLESALERS ASSOC') 'MI BEER WINE WHOLESALERS ASSOCIATION' - >>>standardize_corp_names('MI COMMUNITY COLLEGE ASSOCIATION') + >>> standardize_corp_names('MI COMMUNITY COLLEGE ASSOCIATION') 'MI COMMUNITY COLLEGE ASSOCIATION' - >>>standardize_corp_names('STEPHANIES CHANGEMAKER FUND') + >>> standardize_corp_names('STEPHANIES CHANGEMAKER FUND') 'STEPHANIES CHANGEMAKER FUND' """ From b5f764a955030fac17adb73bdac9394c2968ed74 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 30 Jan 2024 20:40:12 -0600 Subject: [PATCH 051/214] addressed comments, but address function back in --- utils/linkage.py | 52 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index c6cc5292..35c69429 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,12 +1,11 @@ import textdistance as td - -# import usaddress +import numpy as np +import pandas as pd +import usaddress """ Module for performing record linkage on state campaign finance dataset """ -import numpy as np -import pandas as pd def calculate_string_similarity(string1: str, string2: str) -> float: @@ -144,3 +143,48 @@ def row_matches( index_dict[i].append[j] return index_dict + + +def get_street_from_address_line_1(address_line_1: str) -> str: + """Given an address line 1, return the street name + + Args: + address_line_1: either street information or PO box + Returns: + street name + Raises: + ValueError: if string is malformed and no street can be reasonably + found. + + >>> get_street_from_address_line_1("5645 N. UBER ST") + 'UBER ST' + >>> get_street_from_address_line_1("") + Traceback (most recent call last): + ... + ValueError: address_line_1 must have whitespace + >>> get_street_from_address_line_1("PO Box 1111") + Traceback (most recent call last): + ... + ValueError: address_line_1 is PO Box + >>> get_street_from_address_line_1("300 59 St.") + '59 St.' + >>> get_street_from_address_line_1("Uber St.") + 'Uber St.' + >>> get_street_from_address_line_1("3NW 59th St") + '59th St' + """ + if not address_line_1 or address_line_1.isspace(): + raise ValueError("address_line_1 must have whitespace") + + address_line_lower = address_line_1.lower() + + if "po box" in address_line_lower: + raise ValueError("address_line_1 is PO Box") + + string = [] + address = usaddress.parse(address_line_1) + for key, val in address: + if val in ["StreetName", "StreetNamePostType"]: + string.append(key) + + return " ".join(string) From df1dbd1912a4a5bb0a52a02527bde31fbf99292b Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 30 Jan 2024 20:41:33 -0600 Subject: [PATCH 052/214] fixing linter error --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 35c69429..c0b5028c 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,6 +1,6 @@ -import textdistance as td import numpy as np import pandas as pd +import textdistance as td import usaddress """ From 6aad87ef2d9598a5745abf64d5eaf3326122041c Mon Sep 17 00:00:00 2001 From: npashilkar Date: Tue, 30 Jan 2024 21:29:16 -0600 Subject: [PATCH 053/214] moved dict to constants file --- utils/constants.py | 36 ++++++++++++++++++++++++++++++++++++ utils/linkage.py | 42 ++++++------------------------------------ 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/utils/constants.py b/utils/constants.py index b87d39d3..f259db36 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -605,3 +605,39 @@ " WV ", " WY ", ] + +# utils/linkage.py constants + +COMPANY_TYPES = { + "CORP": "CORPORATION", + "CO": "CORPORATION", + "LLC": "LIMITED LIABILITY COMPANY", + "PTNR": "PARTNERSHIP", + "LP": "LIMITED PARTNERSHIP", + "LLP": "LIMITED LIABILITY PARTNERSHIP", + "SOLE PROP": "SOLE PROPRIETORSHIP", + "SP": "SOLE PROPRIETORSHIP", + "NPO": "NONPROFIT ORGANIZATION", + "PC": "PROFESSIONAL CORPORATION", + "CO-OP": "COOPERATIVE", + "LTD": "LIMITED COMPANY", + "JSC": "JOINT STOCK COMPANY", + "HOLDCO": "HOLDING COMPANY", + "PLC": "PUBLIC LIMITED COMPANY", + "PVT LTD": "PRIVATE LIMITED COMPANY", + "INC": "INCORPORATED", + "ASSOC": "ASSOCIATION", + "FDN": "FOUNDATION", + "TR": "TRUST", + "SOC": "SOCIETY", + "CONSORT": "CONSORTIUM", + "SYND": "SYNDICATE", + "GRP": "GROUP", + "CORP SOLE": "CORPORATION SOLE", + "JV": "JOINT VENTURE", + "SUB": "SUBSIDIARY", + "FRANCHISE": "FRANCHISE", + "PA": "PROFESSIONAL ASSOCIATION", + "CIC": "COMMUNITY INTEREST COMPANY", + "PAC": "POLITICAL ACTION COMMITTEE", +} diff --git a/utils/linkage.py b/utils/linkage.py index 49d120b3..34b25791 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,3 +1,4 @@ +import constants import textdistance as td import usaddress @@ -110,44 +111,13 @@ def standardize_corp_names(company_name: str) -> str: company_name_split = company_name.upper().split(" ") - company_types = { - "CORP": "CORPORATION", - "CO": "CORPORATION", - "LLC": "LIMITED LIABILITY COMPANY", - "PTNR": "PARTNERSHIP", - "LP": "LIMITED PARTNERSHIP", - "LLP": "LIMITED LIABILITY PARTNERSHIP", - "SOLE PROP": "SOLE PROPRIETORSHIP", - "SP": "SOLE PROPRIETORSHIP", - "NPO": "NONPROFIT ORGANIZATION", - "PC": "PROFESSIONAL CORPORATION", - "CO-OP": "COOPERATIVE", - "LTD": "LIMITED COMPANY", - "JSC": "JOINT STOCK COMPANY", - "HOLDCO": "HOLDING COMPANY", - "PLC": "PUBLIC LIMITED COMPANY", - "PVT LTD": "PRIVATE LIMITED COMPANY", - "INC": "INCORPORATED", - "ASSOC": "ASSOCIATION", - "FDN": "FOUNDATION", - "TR": "TRUST", - "SOC": "SOCIETY", - "CONSORT": "CONSORTIUM", - "SYND": "SYNDICATE", - "GRP": "GROUP", - "CORP SOLE": "CORPORATION SOLE", - "JV": "JOINT VENTURE", - "SUB": "SUBSIDIARY", - "FRANCHISE": "FRANCHISE", - "PA": "PROFESSIONAL ASSOCIATION", - "CIC": "COMMUNITY INTEREST COMPANY", - "PAC": "POLITICAL ACTION COMMITTEE", - } - for i in range(len(company_name_split)): - if company_name_split[i] in list(company_types.keys()): + if company_name_split[i] in list(constants.COMPANY_TYPES.keys()): hold = company_name_split[i] - company_name_split[i] = company_types[hold] + company_name_split[i] = constants.COMPANY_TYPES[hold] new_company_name = " ".join(company_name_split) return new_company_name + + +print(standardize_corp_names("MI BEER WINE WHOLESALERS ASSOCIATION")) From 5b4de8c3c2c27164cf47df72d3eaa6101335cac1 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Tue, 30 Jan 2024 21:47:56 -0600 Subject: [PATCH 054/214] updated constants file --- utils/linkage.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 34b25791..a26a9fe3 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -118,6 +118,3 @@ def standardize_corp_names(company_name: str) -> str: new_company_name = " ".join(company_name_split) return new_company_name - - -print(standardize_corp_names("MI BEER WINE WHOLESALERS ASSOCIATION")) From e4fe9fc354e4429d17b754c32b083b0eaae6a4c6 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Tue, 30 Jan 2024 21:53:36 -0600 Subject: [PATCH 055/214] updated constants file --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index a26a9fe3..faa8860c 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,4 +1,4 @@ -import constants +import utils.constants import textdistance as td import usaddress From 844d20e5ddccd35514da4ef52fb321677c15e919 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Tue, 30 Jan 2024 22:17:08 -0600 Subject: [PATCH 056/214] updated constants file --- utils/linkage.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index faa8860c..9866a9b9 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,4 +1,6 @@ -import utils.constants +from utils.constants import ( + COMPANY_TYPES +) import textdistance as td import usaddress @@ -112,9 +114,11 @@ def standardize_corp_names(company_name: str) -> str: company_name_split = company_name.upper().split(" ") for i in range(len(company_name_split)): - if company_name_split[i] in list(constants.COMPANY_TYPES.keys()): + if company_name_split[i] in list(COMPANY_TYPES.keys()): hold = company_name_split[i] - company_name_split[i] = constants.COMPANY_TYPES[hold] + company_name_split[i] = COMPANY_TYPES[hold] new_company_name = " ".join(company_name_split) return new_company_name + +print(standardize_corp_names('MI BEER WINE WHOLESALERS ASSOC')) From 976fc3ff4608874a9259977b21397027073ecfd6 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 31 Jan 2024 14:15:18 +0000 Subject: [PATCH 057/214] updated function --- utils/linkage.py | 52 +++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 86485d3b..1dbf54b6 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,7 +1,8 @@ """ Module for performing record linkage on state campaign finance dataset """ -import pandas as pd +import re + import usaddress @@ -50,12 +51,7 @@ def get_street_from_address_line_1(address_line_1: str) -> str: return " ".join(string) -""" -Module for standardizing the 'company' columnn of the state campaign finance dataset -""" - - -def cleaning_company_column(company: str) -> str: +def cleaning_company_column(company_entry: str) -> str: """ Given a string, check if it contains a variation of self employed, unemployed, or retired and return the standardized version. @@ -72,30 +68,44 @@ def cleaning_company_column(company: str) -> str: 'Self Employed' >>> cleaning_company_column("None") 'Unemployed' + >>> cleaning_company_column("N/A") + 'Unemployed' + >>> cleaning_company_column("nan") + 'Unemployed' """ - if pd.isnull(company): - return company - company_edited = company.lower() - company_edited = company_edited.strip() - company_edited = company_edited.replace(".", " ") - company_edited = company_edited.replace(",", " ") - company_edited = company_edited.replace("-", " ") + if not company_entry: + return company_entry - if "retire" in company_edited: + company_edited = company_entry.lower() + + if company_edited == "n/a": + return "Unemployed" + + company_edited = re.sub(r"[^\w\s]", "", company_edited) + + if ( + company_edited == "retired" + or company_edited == "retiree" + or company_edited == "retire" + or "retiree" in company_edited + ): return "Retired" - elif "self employe" in company_edited or company_edited == "self": + + elif ( + "self employe" in company_edited + or "freelance" in company_edited + or company_edited == "self" + or company_edited == "independent contractor" + ): return "Self Employed" elif ( "unemploye" in company_edited or company_edited == "none" or company_edited == "not employed" + or company_edited == "nan" ): return "Unemployed" else: - return company - - -# Example implementation of the function standardize_company_column for a dataframe -# df['standardized_company'] = df['company'].apply(standardize_company_column) + return company_edited From 87ea3da197ea722b5c54f99b7f5cdd29b890060d Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Wed, 31 Jan 2024 09:02:44 -0600 Subject: [PATCH 058/214] Adding Avery's feedback --- utils/linkage.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index e419c6f5..2cdd11b6 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -53,6 +53,16 @@ def determine_comma_role(name: str) -> str: name: a string representing a name/names of individuals Returns: the name with or without a comma based on some conditions + + Sample Usage: + >>> determine_comma_role("Jane Doe, Jr") + 'Jane Doe, Jr' + >>> determine_comma_role("Doe, Jane Elisabeth") + ' Jane Elisabeth Doe' + >>> determine_comma_role("Jane Doe,") + 'Jane Doe' + >>> determine_comma_role("DOe, Jane") + ' Jane Doe' """ suffixes = [ "sr", @@ -68,19 +78,19 @@ def determine_comma_role(name: str) -> str: "ix", "x", ] - name_parts = name.split(",") + name_parts = name.lower().split(",") # if the comma is just in the end as a typo: if len(name_parts[1]) == 0: - return name_parts[0] + return name_parts[0].title() # if just the suffix in the end, leave the name as it is if name_parts[1].strip() in suffixes: - return name + return name.title() # at this point either it's just poor name placement, or the suffix is # in the beginning of the name. Either way, the first part of the list is # the true last name. last_part = name_parts.pop(0) first_part = " ".join(name_parts) - return first_part + " " + last_part + return first_part.title() + " " + last_part.title() def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: @@ -114,6 +124,8 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: 'Jane Elisabeth Doe, Iv' >>> get_likely_name("","","Jane Elisabeth Doe, IV") 'Jane Elisabeth Doe Iv' + >>> get_likely_name("Jane","","Doe, Jane, Elisabeth") + 'Jane Elisabeth Doe' """ # first ensure clean input by deleting spaces: first_name, last_name, full_name = list( @@ -154,10 +166,10 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: # one last check to remove any pieces that might add extra whitespace names = list(filter(lambda x: x != "", names)) names = " ".join(names) - names = names.split(" ") + names = names.title().replace(" ", " ").split(" ") final_name = [] [final_name.append(x) for x in names if x not in final_name] - return " ".join(final_name).title().strip() + return " ".join(final_name).strip() def get_street_from_address_line_1(address_line_1: str) -> str: From 23a8c1ffca9935aeef5b74341c7562eb1f020fe2 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Wed, 31 Jan 2024 09:07:26 -0600 Subject: [PATCH 059/214] Adding Avery's feedback --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 2cdd11b6..0450fca8 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -123,7 +123,7 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: >>> get_likely_name("Jane Elisabeth Doe, IV","Elisabeth","Doe, IV") 'Jane Elisabeth Doe, Iv' >>> get_likely_name("","","Jane Elisabeth Doe, IV") - 'Jane Elisabeth Doe Iv' + 'Jane Elisabeth Doe, Iv' >>> get_likely_name("Jane","","Doe, Jane, Elisabeth") 'Jane Elisabeth Doe' """ From 4081715a2d4b83875c3def1c086f3d9f1b579e78 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Wed, 31 Jan 2024 09:40:58 -0600 Subject: [PATCH 060/214] saving personal work before merging, no need to look or review @Avery @Trevor --- notebooks/Test.ipynb | 421 ++++++++++++++++++++++++++++++++++++++++++- utils/linkage.py | 13 ++ 2 files changed, 433 insertions(+), 1 deletion(-) diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb index 5df942e1..1176ab75 100644 --- a/notebooks/Test.ipynb +++ b/notebooks/Test.ipynb @@ -12,6 +12,425 @@ "\n", "save_random_dataframe(Path(\"../output\"), Path(\"test.csv\"))" ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def determine_comma_role(name: str) -> str:\n", + " \"\"\"Given a string (someone's name), attempts to determine the role of the\n", + " comma in the name and where it ought to belong.\n", + "\n", + " Some assumptions are made:\n", + " * If a suffix is included in the name and the name is not just the last\n", + " name(i.e \"Doe, Jr), the format is\n", + " (last_name suffix, first and middle name) i.e Doe iv, Jane Elisabeth\n", + "\n", + " * If a comma is used anywhere else, it is in the format of\n", + " (last_name, first and middle name) i.e Doe, Jane Elisabeth\n", + " Args:\n", + " name: a string representing a name/names of individuals\n", + " Returns:\n", + " the name with or without a comma based on some conditions\n", + " \"\"\"\n", + " suffixes = [\n", + " \"sr\",\n", + " \"jr\",\n", + " \"i\",\n", + " \"ii\",\n", + " \"iii\",\n", + " \"iv\",\n", + " \"v\",\n", + " \"vi\",\n", + " \"vii\",\n", + " \"viii\",\n", + " \"ix\",\n", + " \"x\",\n", + " ]\n", + " name_parts = name.lower().split(\",\")\n", + " # if the comma is just in the end as a typo:\n", + " if len(name_parts[1]) == 0:\n", + " return name_parts[0].title()\n", + " # if just the suffix in the end, leave the name as it is\n", + " if name_parts[1].strip() in suffixes:\n", + " return name.title()\n", + " # at this point either it's just poor name placement, or the suffix is\n", + " # in the beginning of the name. Either way, the first part of the list is\n", + " # the true last name.\n", + " last_part = name_parts.pop(0)\n", + " first_part = \" \".join(name_parts)\n", + " return first_part.title() + \" \" + last_part.title()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "' Jane Jr Doe'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "determine_comma_role(\"DOe, Jane, Jr\")" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "def get_likely_name(first_name: str, last_name: str, full_name: str) -> str:\n", + " \"\"\"Given name related columns, return a person's likely name\n", + "\n", + " Given different formatting used accross states, errors in data entry\n", + " and missing data, it can be difficult to determine someone's actual\n", + " name. For example, some states have a last name column with values like\n", + " \"Doe, Jane\", where the person's first name appears to have been erroneously\n", + " included.\n", + "\n", + " Args:\n", + " first_name: raw value of first name column\n", + " last_name: raw value last name column\n", + " full_name: raw value of name or full_name column\n", + " Returns:\n", + " The most likely full name of the person listed\n", + "\n", + " Sample Usage:\n", + " >>> get_likely_name(\"Jane\", \"Doe\", \"\")\n", + " 'Jane Doe'\n", + " >>> get_likely_name(\"\", \"\", \"Jane Doe\")\n", + " 'Jane Doe'\n", + " >>> get_likely_name(\"\", \"Doe, Jane\", \"\")\n", + " 'Jane Doe'\n", + " >>> get_likely_name(\"Jane Doe\", \"Doe\", \"Jane Doe\")\n", + " 'Jane Doe'\n", + " >>> get_likely_name(\"Jane\",\"\",\"Doe, Sr\")\n", + " 'Jane Doe, Sr'\n", + " >>> get_likely_name(\"Jane Elisabeth Doe, IV\",\"Elisabeth\",\"Doe, IV\")\n", + " 'Jane Elisabeth Doe, Iv'\n", + " >>> get_likely_name(\"\",\"\",\"Jane Elisabeth Doe, IV\")\n", + " 'Jane Elisabeth Doe Iv'\n", + " \"\"\"\n", + " # first ensure clean input by deleting spaces:\n", + " first_name, last_name, full_name = list(\n", + " map(lambda x: x.lower().strip(), [first_name, last_name, full_name])\n", + " )\n", + "\n", + " # if data is clean:\n", + " if first_name + \" \" + last_name == full_name:\n", + " return full_name\n", + "\n", + " # some names have titles or professions associated with the name. We need to\n", + " # remove those from the name.\n", + " titles = [\n", + " \"mr\",\n", + " \"ms\",\n", + " \"mrs\",\n", + " \"miss\",\n", + " \"prof\",\n", + " \"dr\",\n", + " \"doctor\",\n", + " \"sir\",\n", + " \"madam\",\n", + " \"professor\",\n", + " ]\n", + " names = [first_name, last_name, full_name]\n", + "\n", + " for i in range(len(names)):\n", + " # if there is a ',' deal with it accordingly\n", + " if \",\" in names[i]:\n", + " names[i] = determine_comma_role(names[i])\n", + "\n", + " names[i] = names[i].replace(\".\", \"\").split(\" \")\n", + " names[i] = [\n", + " name_part for name_part in names[i] if name_part not in titles\n", + " ]\n", + " names[i] = \" \".join(names[i])\n", + "\n", + " # one last check to remove any pieces that might add extra whitespace\n", + " names = list(filter(lambda x: x != \"\", names))\n", + " names = \" \".join(names)\n", + " names = names.title().replace(\" \",\" \").split(\" \")\n", + " final_name = []\n", + " [final_name.append(x) for x in names if x not in final_name]\n", + " return \" \".join(final_name).strip()" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_4143866/1500712151.py:2: DtypeWarning: Columns (7,8) have mixed types. Specify dtype option on import or set low_memory=False.\n", + " ind_df = pd.read_csv(\"../output/complete_individuals_table.csv\")\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0idfirst_namelast_namefull_nameentity_typestatepartycompany
001869727NaNNaNwilliam \bstonerindividualNaNNaNNaN
111779679NaNNaNrm coulonindividualNaNNaNarea agency on aging
222277221NaNNaNjames engelsonindividualNaNNaNretired
332277156NaNNaNmarivic franciaskinnerindividualNaNNaNfibre source international corp
442341373NaNNaNanthony grindleindividualNaNNaNzimmerbiomet
..............................
25053418612606acfa74b-d5e1-4afd-b020-dbe429eb1c3fNaNNaNMelissa HartCandidatePAREPNaN
2505342861271f111045d-bc3d-4050-9ad7-b3b1e6d72e56NaNNaNHeather MillerCandidatePADEMNaN
2505343861277d40859d7-b523-4ef5-895b-c3a947ab582fNaNNaNChristopher M. GebhardCandidatePAREPNaN
2505344861775f5d76d43-86f4-40f9-aeb9-3df97ca8cdf0NaNNaNApril WeaverCandidatePAREPNaN
25053458619201a0cf90d-3252-4c8d-b109-dea084a01f69NaNNaNKrista PaolucciCandidatePAREPNaN
\n", + "

2505346 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 id first_name \\\n", + "0 0 1869727 NaN \n", + "1 1 1779679 NaN \n", + "2 2 2277221 NaN \n", + "3 3 2277156 NaN \n", + "4 4 2341373 NaN \n", + "... ... ... ... \n", + "2505341 861260 6acfa74b-d5e1-4afd-b020-dbe429eb1c3f NaN \n", + "2505342 861271 f111045d-bc3d-4050-9ad7-b3b1e6d72e56 NaN \n", + "2505343 861277 d40859d7-b523-4ef5-895b-c3a947ab582f NaN \n", + "2505344 861775 f5d76d43-86f4-40f9-aeb9-3df97ca8cdf0 NaN \n", + "2505345 861920 1a0cf90d-3252-4c8d-b109-dea084a01f69 NaN \n", + "\n", + " last_name full_name entity_type state party \\\n", + "0 NaN william \bstoner individual NaN NaN \n", + "1 NaN rm coulon individual NaN NaN \n", + "2 NaN james engelson individual NaN NaN \n", + "3 NaN marivic franciaskinner individual NaN NaN \n", + "4 NaN anthony grindle individual NaN NaN \n", + "... ... ... ... ... ... \n", + "2505341 NaN Melissa Hart Candidate PA REP \n", + "2505342 NaN Heather Miller Candidate PA DEM \n", + "2505343 NaN Christopher M. Gebhard Candidate PA REP \n", + "2505344 NaN April Weaver Candidate PA REP \n", + "2505345 NaN Krista Paolucci Candidate PA REP \n", + "\n", + " company \n", + "0 NaN \n", + "1 area agency on aging \n", + "2 retired \n", + "3 fibre source international corp \n", + "4 zimmerbiomet \n", + "... ... \n", + "2505341 NaN \n", + "2505342 NaN \n", + "2505343 NaN \n", + "2505344 NaN \n", + "2505345 NaN \n", + "\n", + "[2505346 rows x 9 columns]" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "ind_df = pd.read_csv(\"../output/complete_individuals_table.csv\")\n", + "ind_df.sample(1000)\n", + "ind_df" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Doe, Jr, Jane'" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "determine_comma_role(\"Doe, Jr, Jane\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -30,7 +449,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.11.7" }, "orig_nbformat": 4 }, diff --git a/utils/linkage.py b/utils/linkage.py index 0450fca8..f5018979 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -3,6 +3,7 @@ """ import textdistance as td import usaddress +import pandas as pd def calculate_string_similarity(string1: str, string2: str) -> float: @@ -215,3 +216,15 @@ def get_street_from_address_line_1(address_line_1: str) -> str: string.append(key) return " ".join(string) + +def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: + '''Given a dataframe, remove rows that have identical entry data beyond + UUIDs, and output a file mapping an entry to other the UUIDs of the + deduplicated rows + + Args: + a pandas dataframe containing contribution data + Returns: + a deduplicated pandas dataframe containing contribution data + ''' + pass \ No newline at end of file From 50537f9e620400630d1a92f1b4f7962a48955fa8 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 31 Jan 2024 15:43:13 +0000 Subject: [PATCH 061/214] updating requirements.txt to include names-dataset package --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index db05b66f..fa82b105 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,3 +19,4 @@ Requests==2.31.0 setuptools==68.0.0 textdistance==4.6.1 usaddress==0.5.4 +names-dataset==3.1.0 From 3fcbc5b6539edc5fdf1102c9ec9d3727552c57ee Mon Sep 17 00:00:00 2001 From: npashilkar Date: Wed, 31 Jan 2024 09:51:34 -0600 Subject: [PATCH 062/214] precommit checks --- utils/linkage.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 9866a9b9..5788eb0b 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,9 +1,8 @@ -from utils.constants import ( - COMPANY_TYPES -) import textdistance as td import usaddress +from utils.constants import COMPANY_TYPES + """ Module for performing record linkage on state campaign finance dataset """ @@ -121,4 +120,5 @@ def standardize_corp_names(company_name: str) -> str: new_company_name = " ".join(company_name_split) return new_company_name -print(standardize_corp_names('MI BEER WINE WHOLESALERS ASSOC')) + +print(standardize_corp_names("MI BEER WINE WHOLESALERS ASSOC")) From f07dae2a96ebc9ed00d7056721361d3684165b5c Mon Sep 17 00:00:00 2001 From: npashilkar Date: Wed, 31 Jan 2024 10:23:53 -0600 Subject: [PATCH 063/214] get address number from line 1 function --- utils/linkage.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index a96b8167..1333024f 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -165,4 +165,32 @@ def standardize_corp_names(company_name: str) -> str: return new_company_name -print(standardize_corp_names("MI BEER WINE WHOLESALERS ASSOC")) +def get_address_number_from_address_line_1(address_line_1: str) -> str: + """Given an address line 1, return the building number or po box + + Args: + address_line_1: either street information or PO box + Returns: + address or po box number + + Sample Usage: + >>> get_building_from_address_line_1('6727 W. Corrine Dr. Peoria,AZ 85381') + '6727' + >>> get_building_from_address_line_1('P.O. Box 5456 Sun City West ,AZ 85375') + 'P.O. Box 5456' + >>> get_building_from_address_line_1('119 S 5th St Niles,MI 49120') + '119' + >>> get_building_from_address_line_1( + ... '1415 PARKER STREET APT 251 DETROIT MI 48214-0000' + ... ) + '1415' + """ + + address_line_1_components = usaddress.parse(address_line_1) + + for i in range(len(address_line_1_components)): + if address_line_1_components[i][1] == "AddressNumber": + return address_line_1_components[i][0] + elif address_line_1_components[i][1] == "USPSBoxID": + return address_line_1_components[i][0] + raise ValueError("Can not find Address Number") From b21fd5299d3351f28a8f3896c11729fc14390629 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 31 Jan 2024 16:24:03 +0000 Subject: [PATCH 064/214] initial name_rank function --- utils/linkage.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/utils/linkage.py b/utils/linkage.py index d013bfd7..d910587c 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,5 +1,9 @@ import textdistance as td import usaddress +from names_dataset import NameDataset + +nd = NameDataset() +# 'The library takes time to initialize because the database is massive.' """ Module for performing record linkage on state campaign finance dataset @@ -131,3 +135,36 @@ def get_street_from_address_line_1(address_line_1: str) -> str: string.append(key) return " ".join(string) + + +def name_rank(first_name: str, last_name: str) -> list: + """Returns a score for the rank of a first name and last name in the US + https://github.com/philipperemy/name-dataset + + Args: + first_name: any string + last_name: any string + Returns: + name rank for first name and last names + 1 is the most common name, only for names in the 'United States' + first element is the element corresponds to the rank of the first name + second element is the element corresponds to the rank of the last name + """ + + first_name_result = nd.search(first_name) + last_name_result = nd.search(last_name) + first_name_rank = 0 + last_name_rank = 0 + try: + first_name_rank = first_name_result["first_name"]["rank"][ + "United States" + ] + except KeyError: + pass + + try: + last_name_rank = last_name_result["last_name"]["rank"]["United States"] + except KeyError: + pass + + return [first_name_rank, last_name_rank] From 8849f462925bbc3064f5f5539513cb16cf7c20b7 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Wed, 31 Jan 2024 10:29:06 -0600 Subject: [PATCH 065/214] get address number from line 1 function --- utils/linkage.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 1333024f..379e6d4c 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -174,13 +174,13 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: address or po box number Sample Usage: - >>> get_building_from_address_line_1('6727 W. Corrine Dr. Peoria,AZ 85381') + >>> get_address_number_from_address_line_1('6727 W. Corrine Dr. Peoria,AZ 85381') '6727' - >>> get_building_from_address_line_1('P.O. Box 5456 Sun City West ,AZ 85375') + >>> get_address_number_from_address_line_1('P.O. Box 5456 Sun City West ,AZ 85375') 'P.O. Box 5456' - >>> get_building_from_address_line_1('119 S 5th St Niles,MI 49120') + >>> get_address_number_from_address_line_1('119 S 5th St Niles,MI 49120') '119' - >>> get_building_from_address_line_1( + >>> get_address_number_from_address_line_1( ... '1415 PARKER STREET APT 251 DETROIT MI 48214-0000' ... ) '1415' From d0086ef22db122a6e8bd6add3f7e2fdfcc9fb221 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Wed, 31 Jan 2024 11:07:37 -0600 Subject: [PATCH 066/214] get address number from line 1 function --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 379e6d4c..ac11a5ac 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -177,7 +177,7 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: >>> get_address_number_from_address_line_1('6727 W. Corrine Dr. Peoria,AZ 85381') '6727' >>> get_address_number_from_address_line_1('P.O. Box 5456 Sun City West ,AZ 85375') - 'P.O. Box 5456' + '5456' >>> get_address_number_from_address_line_1('119 S 5th St Niles,MI 49120') '119' >>> get_address_number_from_address_line_1( From 5f65159fbe7d8752755e814878486d8f50697b48 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Wed, 31 Jan 2024 23:48:08 -0600 Subject: [PATCH 067/214] attempt so far at dedup --- utils/linkage.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 6e8e6a5b..f8ea7bb0 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -271,4 +271,13 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: Returns: a deduplicated pandas dataframe containing contribution data ''' - pass \ No newline at end of file + #first remove all duplicate entries: + new_df = df.drop_duplicates() + + # now find the duplicates along all columns but the ID + cols = new_df.columns[1:] + duplicates = new_df[new_df.duplicated(cols)] + new_df = new_df.drop(index=duplicates.index.tolist()) + #for index in duplicates.index: + + return new_df \ No newline at end of file From 28c003433545676a9f09827e29814d40543ff4c4 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Thu, 1 Feb 2024 06:02:46 +0000 Subject: [PATCH 068/214] edited function --- utils/linkage.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index d910587c..5370b306 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -151,20 +151,25 @@ def name_rank(first_name: str, last_name: str) -> list: second element is the element corresponds to the rank of the last name """ + if first_name is None or last_name is None: + return [None, None] + + if not isinstance(first_name, str) or not isinstance(last_name, str): + return [None, None] + first_name_result = nd.search(first_name) last_name_result = nd.search(last_name) - first_name_rank = 0 - last_name_rank = 0 - try: - first_name_rank = first_name_result["first_name"]["rank"][ - "United States" - ] - except KeyError: - pass - - try: - last_name_rank = last_name_result["last_name"]["rank"]["United States"] - except KeyError: - pass + first_name_rank = None + last_name_rank = None + + if first_name_result and isinstance(first_name_result, dict): + first_name_data = first_name_result.get("first_name") + if first_name_data and "rank" in first_name_data: + first_name_rank = first_name_data["rank"].get("United States", None) + + if last_name_result and isinstance(last_name_result, dict): + last_name_data = last_name_result.get("last_name") + if last_name_data and "rank" in last_name_data: + last_name_rank = last_name_data["rank"].get("United States", None) return [first_name_rank, last_name_rank] From 71a3174aabda2137f4980cb8df7952374f3ca7a5 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 1 Feb 2024 00:12:47 -0600 Subject: [PATCH 069/214] attempt so far at dedup --- utils/linkage.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index f8ea7bb0..bc2f062b 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,9 +1,9 @@ """ Module for performing record linkage on state campaign finance dataset """ +import pandas as pd import textdistance as td import usaddress -import pandas as pd def get_address_line_1_from_full_address(address: str) -> str: @@ -261,23 +261,24 @@ def get_street_from_address_line_1(address_line_1: str) -> str: return " ".join(string) + def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: - '''Given a dataframe, remove rows that have identical entry data beyond + """Given a dataframe, remove rows that have identical entry data beyond UUIDs, and output a file mapping an entry to other the UUIDs of the deduplicated rows - + Args: a pandas dataframe containing contribution data Returns: a deduplicated pandas dataframe containing contribution data - ''' - #first remove all duplicate entries: + """ + # first remove all duplicate entries: new_df = df.drop_duplicates() # now find the duplicates along all columns but the ID cols = new_df.columns[1:] - duplicates = new_df[new_df.duplicated(cols)] + duplicates = new_df[new_df.duplicated(cols)] new_df = new_df.drop(index=duplicates.index.tolist()) - #for index in duplicates.index: + # for index in duplicates.index: - return new_df \ No newline at end of file + return new_df From 56cde5f003a2e3a49817e3c04e2305252110ef96 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 1 Feb 2024 00:13:15 -0600 Subject: [PATCH 070/214] attempt so far at dedup --- utils/linkage.py | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index bc2f062b..25e110da 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -279,6 +279,5 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: cols = new_df.columns[1:] duplicates = new_df[new_df.duplicated(cols)] new_df = new_df.drop(index=duplicates.index.tolist()) - # for index in duplicates.index: return new_df From 161a175c8f31bf79fea702d7b7497cb33218bd0b Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 1 Feb 2024 01:54:17 -0600 Subject: [PATCH 071/214] updates on linkage doc, ignore notebooks/Test.ipynb --- notebooks/Test.ipynb | 287 +++++++++++++++++++++++++++++++++++++------ utils/linkage.py | 27 +++- 2 files changed, 276 insertions(+), 38 deletions(-) diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb index cf4679fb..e4cac62f 100644 --- a/notebooks/Test.ipynb +++ b/notebooks/Test.ipynb @@ -191,7 +191,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -403,7 +403,7 @@ "18 Paa Pac PA Organization " ] }, - "execution_count": 5, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -433,10 +433,29 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 46, "metadata": {}, "outputs": [], "source": [ + "from utils.constants import repo_root\n", + "def convert_duplicates_to_dict(df: pd.DataFrame)->pd.DataFrame:\n", + " '''Takes a dataframe whose indexes are UUIDs, and a column that is a list of\n", + " all other UUIDs that have duplicate values. The function then outputs a\n", + " dictionary file where the deduped UUIDs map to the dataframe main UUID\n", + " \n", + " Args:\n", + " A pandas dataframe with UUIDs as indexes and deduplicated UUIDs\n", + " matching up to the index in the same row\n", + " \n", + " Returns\n", + " None. However it outputs a dictionary\n", + " '''\n", + " #for index in df.index:\n", + " \n", + " #entities.to_csv(repo_root / \"output\" / \"deduplicated_UUIDs.csv\", index=False)\n", + " pass\n", + "\n", + "\n", "def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame:\n", " '''Given a dataframe, remove rows that have identical entry data beyond\n", " UUIDs, and output a file mapping an entry to other the UUIDs of the\n", @@ -451,17 +470,20 @@ " new_df = df.drop_duplicates()\n", "\n", " # now find the duplicates along all columns but the ID\n", - " cols = new_df.columns[1:]\n", - " duplicates = new_df[new_df.duplicated(cols)] \n", - " new_df = new_df.drop(index=duplicates.index.tolist())\n", - " #for index in duplicates.index:\n", + " new_df=new_df.groupby(df.columns[1:].tolist())[\"id\"].agg(list).reset_index().rename(columns={\"id\": \"duplicated\"})\n", + " new_df.index=new_df[\"duplicated\"].str[0].tolist()\n", + " new_df[\"duplicated\"]=new_df[\"duplicated\"].str[1:]\n", "\n", + " # now convert the duplicated column into a dictionary that can will be\n", + " # an output\n", + " convert_duplicates_to_dict(new_df[['duplicated']])\n", + " #new_df = new_df.drop(['duplicated'], axis=1)\n", " return new_df" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -485,63 +507,151 @@ " \n", " \n", " \n", - " id\n", " name\n", " state\n", " entity_type\n", + " duplicated\n", " \n", " \n", " \n", " \n", - " 16\n", - " 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe\n", - " MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC\n", + " d31df1ca-714e-4a82-9e88-1892c0451a71\n", + " COMMITTEE TO ELECT DR PATRICIA BERNARD\n", " MI\n", " committee\n", + " []\n", " \n", " \n", - " 17\n", - " 1d2b5bc0-9385-4cd7-ac48-df43b3eca6ff\n", + " 910c4d36-b036-469e-aa2a-ea4ff8855a6c\n", + " Citizens For Kail\n", + " PA\n", + " Organization\n", + " []\n", + " \n", + " \n", + " 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd\n", " MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC\n", " MI\n", " committee\n", + " [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe, 1d2b5bc...\n", " \n", " \n", - " 18\n", - " 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd\n", + " c875d7de-94be-42f1-b994-dd89b114d51e\n", + " Pa Fraternal Order Of Police Pac\n", + " PA\n", + " Organization\n", + " []\n", + " \n", + " \n", + " 60d454d1-3773-4d88-80e9-132c161da0f0\n", " Paa Pac\n", " PA\n", " Organization\n", + " [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd]\n", + " \n", + " \n", + " f71341d7-d27e-47eb-9b66-903af39d6cb5\n", + " Pabar Pac (Pa Bar Assn)\n", + " PA\n", + " Organization\n", + " []\n", + " \n", + " \n", + " 50c7d9a1-b448-46a5-8e2d-cd15b3097360\n", + " REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...\n", + " MI\n", + " committee\n", + " []\n", + " \n", + " \n", + " 62ea1e9c-ac12-400c-b3dc-519389c0f7d3\n", + " UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...\n", + " MI\n", + " committee\n", + " []\n", + " \n", + " \n", + " 4db76e6e-f0d5-40eb-82de-6dbcdb562dd7\n", + " Ugi Utilities Inc/Ugi Energy Services Llc Pac\n", + " PA\n", + " Organization\n", + " []\n", " \n", " \n", "\n", "" ], "text/plain": [ - " id \\\n", - "16 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe \n", - "17 1d2b5bc0-9385-4cd7-ac48-df43b3eca6ff \n", - "18 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd \n", + " name \\\n", + "d31df1ca-714e-4a82-9e88-1892c0451a71 COMMITTEE TO ELECT DR PATRICIA BERNARD \n", + "910c4d36-b036-469e-aa2a-ea4ff8855a6c Citizens For Kail \n", + "1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", + "c875d7de-94be-42f1-b994-dd89b114d51e Pa Fraternal Order Of Police Pac \n", + "60d454d1-3773-4d88-80e9-132c161da0f0 Paa Pac \n", + "f71341d7-d27e-47eb-9b66-903af39d6cb5 Pabar Pac (Pa Bar Assn) \n", + "50c7d9a1-b448-46a5-8e2d-cd15b3097360 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... \n", + "62ea1e9c-ac12-400c-b3dc-519389c0f7d3 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... \n", + "4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 Ugi Utilities Inc/Ugi Energy Services Llc Pac \n", + "\n", + " state entity_type \\\n", + "d31df1ca-714e-4a82-9e88-1892c0451a71 MI committee \n", + "910c4d36-b036-469e-aa2a-ea4ff8855a6c PA Organization \n", + "1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd MI committee \n", + "c875d7de-94be-42f1-b994-dd89b114d51e PA Organization \n", + "60d454d1-3773-4d88-80e9-132c161da0f0 PA Organization \n", + "f71341d7-d27e-47eb-9b66-903af39d6cb5 PA Organization \n", + "50c7d9a1-b448-46a5-8e2d-cd15b3097360 MI committee \n", + "62ea1e9c-ac12-400c-b3dc-519389c0f7d3 MI committee \n", + "4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 PA Organization \n", "\n", - " name state entity_type \n", - "16 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC MI committee \n", - "17 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC MI committee \n", - "18 Paa Pac PA Organization " + " duplicated \n", + "d31df1ca-714e-4a82-9e88-1892c0451a71 [] \n", + "910c4d36-b036-469e-aa2a-ea4ff8855a6c [] \n", + "1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe, 1d2b5bc... \n", + "c875d7de-94be-42f1-b994-dd89b114d51e [] \n", + "60d454d1-3773-4d88-80e9-132c161da0f0 [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd] \n", + "f71341d7-d27e-47eb-9b66-903af39d6cb5 [] \n", + "50c7d9a1-b448-46a5-8e2d-cd15b3097360 [] \n", + "62ea1e9c-ac12-400c-b3dc-519389c0f7d3 [] \n", + "4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 [] " ] }, - "execution_count": 7, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = deduplicate_perfect_matches(sample_df)\n", - "for i in range(len(x)):\n", - " curr_row = x.loc[i]\n", - " sample_df.loc[(sample_df.name == 'MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC') &\n", - "# (sample_df.state == 'MI') &\n", - "# (sample_df.entity_type == 'committee')]\n", - "x\n" + "x#[['duplicated']]" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n", + "[]\n", + "['1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe', '1d2b5bc0-9385-4cd7-ac48-df43b3eca6ff']\n", + "[]\n", + "['1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd']\n", + "[]\n", + "[]\n", + "[]\n", + "[]\n" + ] + } + ], + "source": [ + "y = x[['duplicated']]\n", + "for i in range(len(y)):\n", + " #print(y.iloc[i]['duplicated'])\n", + " print(y.iloc[i]['duplicated'])" ] }, { @@ -637,21 +747,128 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 41, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namestateentity_type
d31df1ca-714e-4a82-9e88-1892c0451a71COMMITTEE TO ELECT DR PATRICIA BERNARDMIcommittee
910c4d36-b036-469e-aa2a-ea4ff8855a6cCitizens For KailPAOrganization
1d2b5bc0-9385-4cd7-ac48-df43b3eca6fdMICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PACMIcommittee
c875d7de-94be-42f1-b994-dd89b114d51ePa Fraternal Order Of Police PacPAOrganization
60d454d1-3773-4d88-80e9-132c161da0f0Paa PacPAOrganization
f71341d7-d27e-47eb-9b66-903af39d6cb5Pabar Pac (Pa Bar Assn)PAOrganization
50c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee
62ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee
4db76e6e-f0d5-40eb-82de-6dbcdb562dd7Ugi Utilities Inc/Ugi Energy Services Llc PacPAOrganization
\n", + "
" + ], "text/plain": [ - "['name', 'state', 'entity_type']" + " name \\\n", + "d31df1ca-714e-4a82-9e88-1892c0451a71 COMMITTEE TO ELECT DR PATRICIA BERNARD \n", + "910c4d36-b036-469e-aa2a-ea4ff8855a6c Citizens For Kail \n", + "1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", + "c875d7de-94be-42f1-b994-dd89b114d51e Pa Fraternal Order Of Police Pac \n", + "60d454d1-3773-4d88-80e9-132c161da0f0 Paa Pac \n", + "f71341d7-d27e-47eb-9b66-903af39d6cb5 Pabar Pac (Pa Bar Assn) \n", + "50c7d9a1-b448-46a5-8e2d-cd15b3097360 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... \n", + "62ea1e9c-ac12-400c-b3dc-519389c0f7d3 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... \n", + "4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 Ugi Utilities Inc/Ugi Energy Services Llc Pac \n", + "\n", + " state entity_type \n", + "d31df1ca-714e-4a82-9e88-1892c0451a71 MI committee \n", + "910c4d36-b036-469e-aa2a-ea4ff8855a6c PA Organization \n", + "1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd MI committee \n", + "c875d7de-94be-42f1-b994-dd89b114d51e PA Organization \n", + "60d454d1-3773-4d88-80e9-132c161da0f0 PA Organization \n", + "f71341d7-d27e-47eb-9b66-903af39d6cb5 PA Organization \n", + "50c7d9a1-b448-46a5-8e2d-cd15b3097360 MI committee \n", + "62ea1e9c-ac12-400c-b3dc-519389c0f7d3 MI committee \n", + "4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 PA Organization " ] }, - "execution_count": 19, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], - "source": [] + "source": [ + "#for index in x.index:\n", + "# print(index)\n", + "x" + ] }, { "cell_type": "code", diff --git a/utils/linkage.py b/utils/linkage.py index 6ee0de05..01d05dea 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -270,6 +270,22 @@ def get_street_from_address_line_1(address_line_1: str) -> str: return " ".join(string) +def convert_duplicates_to_dict(df: pd.DataFrame) -> pd.DataFrame: + """Takes a dataframe whose indexes are UUIDs, and a column that is a list of + all other UUIDs that have duplicate values. The function then outputs a + dictionary file where the deduped UUIDs map to the dataframe main UUID + + Args: + A pandas dataframe with UUIDs as indexes and deduplicated UUIDs + matching up to the index in the same row + + Returns + None. However it outputs a dictionary + """ + # df.to_csv(repo_root / "output" / "deduplicated_UUIDs.csv", index=False) + pass + + def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: """Given a dataframe, remove rows that have identical entry data beyond UUIDs, and output a file mapping an entry to other the UUIDs of the @@ -284,9 +300,14 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: new_df = df.drop_duplicates() # now find the duplicates along all columns but the ID - cols = new_df.columns[1:] - duplicates = new_df[new_df.duplicated(cols)] - new_df = new_df.drop(index=duplicates.index.tolist()) + new_df = ( + new_df.groupby(df.columns[1:].tolist())["id"] + .agg(list) + .reset_index() + .rename(columns={"id": "duplicated"}) + ) + new_df.index = new_df["duplicated"].str[0].tolist() + new_df["duplicated"] = new_df["duplicated"].str[1:] return new_df From b519fa164babf8498930abcddfcc0aa4abd8f135 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 1 Feb 2024 09:22:40 -0600 Subject: [PATCH 072/214] modifications to dedup function, not yet done, no need to review yet --- notebooks/Test.ipynb | 195 +++++++++++++++++++++++++------------------ utils/linkage.py | 9 ++ 2 files changed, 124 insertions(+), 80 deletions(-) diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb index e4cac62f..bc731855 100644 --- a/notebooks/Test.ipynb +++ b/notebooks/Test.ipynb @@ -191,7 +191,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -403,7 +403,7 @@ "18 Paa Pac PA Organization " ] }, - "execution_count": 45, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -433,7 +433,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -475,15 +475,16 @@ " new_df[\"duplicated\"]=new_df[\"duplicated\"].str[1:]\n", "\n", " # now convert the duplicated column into a dictionary that can will be\n", - " # an output\n", - " convert_duplicates_to_dict(new_df[['duplicated']])\n", - " #new_df = new_df.drop(['duplicated'], axis=1)\n", + " # an output by only feeding the entries with duplicates\n", + " new_df = new_df.reset_index().rename(columns = {'index':'id'})\n", + " convert_duplicates_to_dict(new_df[new_df['duplicated'].apply(lambda x: len(x))>0][['id','duplicated']])\n", + " new_df = new_df.drop(['duplicated'], axis=1)\n", " return new_df" ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -507,74 +508,120 @@ " \n", " \n", " \n", - " name\n", - " state\n", - " entity_type\n", + " id\n", " duplicated\n", " \n", " \n", " \n", " \n", - " d31df1ca-714e-4a82-9e88-1892c0451a71\n", - " COMMITTEE TO ELECT DR PATRICIA BERNARD\n", - " MI\n", - " committee\n", + " 2\n", + " 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd\n", + " [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe, 1d2b5bc...\n", + " \n", + " \n", + " 4\n", + " 60d454d1-3773-4d88-80e9-132c161da0f0\n", + " [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd]\n", + " \n", + " \n", + "\n", + "" + ], + "text/plain": [ + " id \\\n", + "2 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd \n", + "4 60d454d1-3773-4d88-80e9-132c161da0f0 \n", + "\n", + " duplicated \n", + "2 [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe, 1d2b5bc... \n", + "4 [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd] " + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = deduplicate_perfect_matches(sample_df)\n", + "#len(x.iloc[2]['duplicated'])\n", + "x[x['duplicated'].apply(lambda x: len(x)) > 0][['id','duplicated']]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -582,48 +629,36 @@ "" ], "text/plain": [ - " name \\\n", - "d31df1ca-714e-4a82-9e88-1892c0451a71 COMMITTEE TO ELECT DR PATRICIA BERNARD \n", - "910c4d36-b036-469e-aa2a-ea4ff8855a6c Citizens For Kail \n", - "1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", - "c875d7de-94be-42f1-b994-dd89b114d51e Pa Fraternal Order Of Police Pac \n", - "60d454d1-3773-4d88-80e9-132c161da0f0 Paa Pac \n", - "f71341d7-d27e-47eb-9b66-903af39d6cb5 Pabar Pac (Pa Bar Assn) \n", - "50c7d9a1-b448-46a5-8e2d-cd15b3097360 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... \n", - "62ea1e9c-ac12-400c-b3dc-519389c0f7d3 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... \n", - "4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 Ugi Utilities Inc/Ugi Energy Services Llc Pac \n", - "\n", - " state entity_type \\\n", - "d31df1ca-714e-4a82-9e88-1892c0451a71 MI committee \n", - "910c4d36-b036-469e-aa2a-ea4ff8855a6c PA Organization \n", - "1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd MI committee \n", - "c875d7de-94be-42f1-b994-dd89b114d51e PA Organization \n", - "60d454d1-3773-4d88-80e9-132c161da0f0 PA Organization \n", - "f71341d7-d27e-47eb-9b66-903af39d6cb5 PA Organization \n", - "50c7d9a1-b448-46a5-8e2d-cd15b3097360 MI committee \n", - "62ea1e9c-ac12-400c-b3dc-519389c0f7d3 MI committee \n", - "4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 PA Organization \n", + " id \\\n", + "0 d31df1ca-714e-4a82-9e88-1892c0451a71 \n", + "1 910c4d36-b036-469e-aa2a-ea4ff8855a6c \n", + "2 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd \n", + "3 c875d7de-94be-42f1-b994-dd89b114d51e \n", + "4 60d454d1-3773-4d88-80e9-132c161da0f0 \n", + "5 f71341d7-d27e-47eb-9b66-903af39d6cb5 \n", + "6 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", + "7 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", + "8 4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 \n", "\n", - " duplicated \n", - "d31df1ca-714e-4a82-9e88-1892c0451a71 [] \n", - "910c4d36-b036-469e-aa2a-ea4ff8855a6c [] \n", - "1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe, 1d2b5bc... \n", - "c875d7de-94be-42f1-b994-dd89b114d51e [] \n", - "60d454d1-3773-4d88-80e9-132c161da0f0 [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd] \n", - "f71341d7-d27e-47eb-9b66-903af39d6cb5 [] \n", - "50c7d9a1-b448-46a5-8e2d-cd15b3097360 [] \n", - "62ea1e9c-ac12-400c-b3dc-519389c0f7d3 [] \n", - "4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 [] " + " duplicated \n", + "0 [] \n", + "1 [] \n", + "2 [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe, 1d2b5bc... \n", + "3 [] \n", + "4 [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd] \n", + "5 [] \n", + "6 [] \n", + "7 [] \n", + "8 [] " ] }, - "execution_count": 47, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "x = deduplicate_perfect_matches(sample_df)\n", - "x#[['duplicated']]" + "x[['id','duplicated']]" ] }, { diff --git a/utils/linkage.py b/utils/linkage.py index 01d05dea..0d2ebf79 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -309,6 +309,15 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: new_df.index = new_df["duplicated"].str[0].tolist() new_df["duplicated"] = new_df["duplicated"].str[1:] + # now convert the duplicated column into a dictionary that can will be + # an output by only feeding the entries with duplicates + new_df = new_df.reset_index().rename(columns={"index": "id"}) + convert_duplicates_to_dict( + new_df[new_df["duplicated"].apply(lambda x: len(x)) > 0][ + ["id", "duplicated"] + ] + ) + new_df = new_df.drop(["duplicated"], axis=1) return new_df From 4ac551fa498be733717a7f50af2084cb28e6c321 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Fri, 2 Feb 2024 02:34:42 +0000 Subject: [PATCH 073/214] passing pre-commits and doctests --- utils/linkage.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 1dbf54b6..d2236171 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -70,8 +70,6 @@ def cleaning_company_column(company_entry: str) -> str: 'Unemployed' >>> cleaning_company_column("N/A") 'Unemployed' - >>> cleaning_company_column("nan") - 'Unemployed' """ if not company_entry: From 37dcbf76a638c0007ff0de1620b93f6ec2f24ec3 Mon Sep 17 00:00:00 2001 From: Avery Schoen <33437601+averyschoen@users.noreply.github.com> Date: Fri, 2 Feb 2024 14:02:34 -0600 Subject: [PATCH 074/214] Update linkage.py --- utils/linkage.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index c8842380..74cbc93c 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -252,4 +252,5 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: return address_line_1_components[i][0] elif address_line_1_components[i][1] == "USPSBoxID": return address_line_1_components[i][0] - raise ValueError("Can not find Address Number") \ No newline at end of file + raise ValueError("Can not find Address Number") + From 7f9135f7acc77ee429557bc48d19d3d9a5f69cf6 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Sun, 4 Feb 2024 14:31:07 -0600 Subject: [PATCH 075/214] finished dedup function with helper function to output to a csv_file in the output directory --- utils/linkage.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index ad5589ac..f2242da0 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -5,7 +5,7 @@ import textdistance as td import usaddress -from utils.constants import COMPANY_TYPES +from utils.constants import COMPANY_TYPES, repo_root def get_address_line_1_from_full_address(address: str) -> str: @@ -280,10 +280,25 @@ def convert_duplicates_to_dict(df: pd.DataFrame) -> pd.DataFrame: matching up to the index in the same row Returns - None. However it outputs a dictionary + None. However it outputs a dictionary to the output directory, with 2 + columns. The first, which indicates the deduplicated UUIDs, is labeled + 'duplicated_uuids', and the 2nd, which shows the uuids to which the + deduplicated entries match two, is labeled 'mapped_uuids'. """ - # df.to_csv(repo_root / "output" / "deduplicated_UUIDs.csv", index=False) - pass + deduped_dict = {} + for i in range(len(df)): + deduped_uudis = df.iloc[i]["duplicated"] + for j in range(len(deduped_uudis)): + deduped_dict.update({deduped_uudis[j]: df.iloc[i]["id"]}) + + # now convert dictionary into a csv file + deduped_df = pd.DataFrame.from_dict(deduped_dict, "index") + deduped_df = deduped_df.reset_index().rename( + columns={"index": "duplicated_uuids", 0: "mapped_uuids"} + ) + deduped_df.to_csv( + repo_root / "output" / "deduplicated_UUIDs.csv", index=False + ) def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: From fb106545507614b4306c7652589eb3dbf93a7059 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 5 Feb 2024 01:13:27 +0000 Subject: [PATCH 076/214] updated function --- utils/linkage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 74cbc93c..26fbd5b5 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,6 +1,7 @@ +import re + import textdistance as td import usaddress -import re from utils.constants import COMPANY_TYPES @@ -253,4 +254,3 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: elif address_line_1_components[i][1] == "USPSBoxID": return address_line_1_components[i][0] raise ValueError("Can not find Address Number") - From 29ee6bb63e198256d83a22019f98561f303a764b Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Tue, 6 Feb 2024 09:57:53 -0600 Subject: [PATCH 077/214] made modifications to the deduplication function --- utils/linkage.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index f2242da0..5db87454 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -271,19 +271,21 @@ def get_street_from_address_line_1(address_line_1: str) -> str: def convert_duplicates_to_dict(df: pd.DataFrame) -> pd.DataFrame: - """Takes a dataframe whose indexes are UUIDs, and a column that is a list of - all other UUIDs that have duplicate values. The function then outputs a - dictionary file where the deduped UUIDs map to the dataframe main UUID + """Saves to the "output" directory a file mapping multiple strings to one + string + + Given a dataframe where each row contains one string in a column and a list + of strings in another column, the function maps each string in the list to + the single string. Args: - A pandas dataframe with UUIDs as indexes and deduplicated UUIDs - matching up to the index in the same row + A pandas dataframe Returns - None. However it outputs a dictionary to the output directory, with 2 - columns. The first, which indicates the deduplicated UUIDs, is labeled + None. However it outputs a file to the output directory, with 2 + columns. The first, which indicates the duplicated UUIDs, is labeled 'duplicated_uuids', and the 2nd, which shows the uuids to which the - deduplicated entries match two, is labeled 'mapped_uuids'. + deduplicated entries match to, is labeled 'mapped_uuids'. """ deduped_dict = {} for i in range(len(df)): @@ -297,14 +299,17 @@ def convert_duplicates_to_dict(df: pd.DataFrame) -> pd.DataFrame: columns={"index": "duplicated_uuids", 0: "mapped_uuids"} ) deduped_df.to_csv( - repo_root / "output" / "deduplicated_UUIDs.csv", index=False + repo_root / "output" / "deduplicated_UUIDs.csv", index=False, mode="a" ) def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: - """Given a dataframe, remove rows that have identical entry data beyond - UUIDs, and output a file mapping an entry to other the UUIDs of the - deduplicated rows + """Return a dataframe with duplicated entries removed. + + Given a dataframe, combines rows that have identical data beyond their + UUIDs, keeps the first UUID amond the similarly grouped UUIDs, and saves the + rest of the UUIDS to a file in the "output" directory linking them to the + first selected UUID. Args: a pandas dataframe containing contribution data @@ -316,7 +321,7 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: # now find the duplicates along all columns but the ID new_df = ( - new_df.groupby(df.columns[1:].tolist())["id"] + new_df.groupby(df.columns[1:].tolist(), dropna=False)["id"] .agg(list) .reset_index() .rename(columns={"id": "duplicated"}) From cfa15d079459a30032a61325fa2f1dcf8a74e3f8 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Tue, 6 Feb 2024 10:07:25 -0600 Subject: [PATCH 078/214] received a git push error stating that the tip of my branch is behind its remote counterpart...commiting my changes before rebasing --- notebooks/Test.ipynb | 667 ++++++++++++++++++++++++++++--------------- 1 file changed, 431 insertions(+), 236 deletions(-) diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb index bc731855..188591d1 100644 --- a/notebooks/Test.ipynb +++ b/notebooks/Test.ipynb @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -66,27 +66,7 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "' Jane Jr Doe'" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "determine_comma_role(\"DOe, Jane, Jr\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -169,29 +149,18 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "str" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import pandas as pd\n", - "orgs = pd.read_csv(\"../output/complete_organizations_table.csv\")\n", - "type(orgs.id.tolist()[1000])" + "orgs_sample = pd.read_csv(\"../output/complete_organizations_table.csv\",index_col=0).sample(10000)\n", + "inds_sample = pd.read_csv(\"../output/complete_individuals_table.csv\",index_col=0, low_memory=False).sample(10000)\n" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -403,7 +372,7 @@ "18 Paa Pac PA Organization " ] }, - "execution_count": 28, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -433,7 +402,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -448,12 +417,21 @@ " matching up to the index in the same row\n", " \n", " Returns\n", - " None. However it outputs a dictionary\n", + " None. However it outputs a dictionary to the output directory, with 2\n", + " columns. The first, which indicates the deduplicated UUIDs, is labeled\n", + " 'duplicated_uuids', and the 2nd, which shows the uuids to which the\n", + " deduplicated entries match two, is labeled 'mapped_uuids'.\n", " '''\n", - " #for index in df.index:\n", - " \n", - " #entities.to_csv(repo_root / \"output\" / \"deduplicated_UUIDs.csv\", index=False)\n", - " pass\n", + " deduped_dict = {}\n", + " for i in range(len(df)):\n", + " deduped_uudis = df.iloc[i]['duplicated']\n", + " for j in range(len(deduped_uudis)):\n", + " deduped_dict.update({deduped_uudis[j]:df.iloc[i]['id']})\n", + " \n", + " # now convert dictionary into a csv file\n", + " deduped_df = pd.DataFrame.from_dict(deduped_dict,'index') \n", + " deduped_df = deduped_df.reset_index().rename(columns={\"index\":\"duplicated_uuids\", 0:\"mapped_uuids\"})\n", + " deduped_df.to_csv(repo_root / \"output\" / \"deduplicated_UUIDs.csv\", index=False)\n", "\n", "\n", "def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame:\n", @@ -470,7 +448,7 @@ " new_df = df.drop_duplicates()\n", "\n", " # now find the duplicates along all columns but the ID\n", - " new_df=new_df.groupby(df.columns[1:].tolist())[\"id\"].agg(list).reset_index().rename(columns={\"id\": \"duplicated\"})\n", + " new_df=new_df.groupby(df.columns[1:].tolist(),dropna=False)[\"id\"].agg(list).reset_index().rename(columns={\"id\": \"duplicated\"})\n", " new_df.index=new_df[\"duplicated\"].str[0].tolist()\n", " new_df[\"duplicated\"]=new_df[\"duplicated\"].str[1:]\n", "\n", @@ -484,7 +462,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -509,48 +487,138 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
idduplicated
0d31df1ca-714e-4a82-9e88-1892c0451a71[]
910c4d36-b036-469e-aa2a-ea4ff8855a6cCitizens For KailPAOrganization1910c4d36-b036-469e-aa2a-ea4ff8855a6c[]
1d2b5bc0-9385-4cd7-ac48-df43b3eca6fdMICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PACMIcommittee21d2b5bc0-9385-4cd7-ac48-df43b3eca6fd[1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe, 1d2b5bc...
c875d7de-94be-42f1-b994-dd89b114d51ePa Fraternal Order Of Police PacPAOrganization3c875d7de-94be-42f1-b994-dd89b114d51e[]
60d454d1-3773-4d88-80e9-132c161da0f0Paa PacPAOrganization460d454d1-3773-4d88-80e9-132c161da0f0[1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd]
f71341d7-d27e-47eb-9b66-903af39d6cb5Pabar Pac (Pa Bar Assn)PAOrganization5f71341d7-d27e-47eb-9b66-903af39d6cb5[]
50c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee650c7d9a1-b448-46a5-8e2d-cd15b3097360[]
62ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee762ea1e9c-ac12-400c-b3dc-519389c0f7d3[]
4db76e6e-f0d5-40eb-82de-6dbcdb562dd7Ugi Utilities Inc/Ugi Energy Services Llc PacPAOrganization84db76e6e-f0d5-40eb-82de-6dbcdb562dd7[]
idduplicatednamestateentity_type
043a79b93-fed7-4f3c-a279-0441cdc7e72214TH DISTRICT DEMOCRATIC PARTYMIcorporation
1215f3104-2df0-4799-9a13-d0c5ec27d6f214TH DISTRICT DEMOCRATSMIcorporation
21d2b5bc0-9385-4cd7-ac48-df43b3eca6fd[1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe, 1d2b5bc...022d2951-8fe9-42d6-a6ac-01e82d90fa6521ST CENTURY MEDIA - MICHIGANMIcorporation
3e1150dce-219c-4eef-995d-ee2759a92923360 TOUCHMIcorporation
460d454d1-3773-4d88-80e9-132c161da0f0[1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd]88c3b805-e0f1-42d5-8b77-536734731c4a50+1 STRATEGIES LLCMIcorporation
...............
2135f5fbf8f5-bd03-43f6-bfdd-42113bdd02a8ZoomPAOrganization
2136616c47f1-39cc-4b12-a93d-f7d3bdc88047Zoom Video CommunicationsPAOrganization
2137df101e29-4adf-4496-8d96-9732d9f7dbc8Zoom.UsPAOrganization
2138d02d1f6d-4a13-428e-a040-d35bd5cfcf9fZupancich, Andrea Senate CommitteeGACommittee
2139df42f2ec-9ee0-49d0-9020-d1a441ef8b42womenwinning State PACMNCommittee
\n", + "

2140 rows × 4 columns

\n", "
" ], "text/plain": [ - " id \\\n", - "2 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd \n", - "4 60d454d1-3773-4d88-80e9-132c161da0f0 \n", + " id \\\n", + "0 43a79b93-fed7-4f3c-a279-0441cdc7e722 \n", + "1 215f3104-2df0-4799-9a13-d0c5ec27d6f2 \n", + "2 022d2951-8fe9-42d6-a6ac-01e82d90fa65 \n", + "3 e1150dce-219c-4eef-995d-ee2759a92923 \n", + "4 88c3b805-e0f1-42d5-8b77-536734731c4a \n", + "... ... \n", + "2135 f5fbf8f5-bd03-43f6-bfdd-42113bdd02a8 \n", + "2136 616c47f1-39cc-4b12-a93d-f7d3bdc88047 \n", + "2137 df101e29-4adf-4496-8d96-9732d9f7dbc8 \n", + "2138 d02d1f6d-4a13-428e-a040-d35bd5cfcf9f \n", + "2139 df42f2ec-9ee0-49d0-9020-d1a441ef8b42 \n", "\n", - " duplicated \n", - "2 [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe, 1d2b5bc... \n", - "4 [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd] " + " name state entity_type \n", + "0 14TH DISTRICT DEMOCRATIC PARTY MI corporation \n", + "1 14TH DISTRICT DEMOCRATS MI corporation \n", + "2 21ST CENTURY MEDIA - MICHIGAN MI corporation \n", + "3 360 TOUCH MI corporation \n", + "4 50+1 STRATEGIES LLC MI corporation \n", + "... ... ... ... \n", + "2135 Zoom PA Organization \n", + "2136 Zoom Video Communications PA Organization \n", + "2137 Zoom.Us PA Organization \n", + "2138 Zupancich, Andrea Senate Committee GA Committee \n", + "2139 womenwinning State PAC MN Committee \n", + "\n", + "[2140 rows x 4 columns]" ] }, - "execution_count": 32, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "x = deduplicate_perfect_matches(sample_df)\n", + "x = deduplicate_perfect_matches(orgs_sample)\n", "#len(x.iloc[2]['duplicated'])\n", - "x[x['duplicated'].apply(lambda x: len(x)) > 0][['id','duplicated']]" + "x" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -575,123 +643,257 @@ " \n", " \n", " id\n", + " first_name\n", + " last_name\n", + " full_name\n", + " entity_type\n", + " state\n", + " party\n", + " company\n", " duplicated\n", " \n", " \n", " \n", " \n", " 0\n", - " d31df1ca-714e-4a82-9e88-1892c0451a71\n", + " 6c833843-2f4f-416c-9092-f1d95d9b27dc\n", + " 'JESSE' PHILIP\n", + " SHERMAN\n", + " 'JESSE' PHILIP SHERMAN ...\n", + " Individual\n", + " CA\n", + " NaN\n", + " NaN\n", " []\n", " \n", " \n", " 1\n", - " 910c4d36-b036-469e-aa2a-ea4ff8855a6c\n", + " cdbe7cd4-f57b-4b89-b85d-d0b812e76aa4\n", + " AARON\n", + " AEBIG\n", + " AARON AEBIG ...\n", + " Individual\n", + " MI\n", + " NaN\n", + " NaN\n", " []\n", " \n", " \n", " 2\n", - " 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd\n", - " [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe, 1d2b5bc...\n", + " a7304cd4-76ae-4223-86c3-f50da82a62aa\n", + " AARON\n", + " BATES\n", + " AARON BATES ...\n", + " Individual\n", + " MI\n", + " NaN\n", + " NaN\n", + " []\n", " \n", " \n", " 3\n", - " c875d7de-94be-42f1-b994-dd89b114d51e\n", + " cce5ccc0-cd28-4a6a-afdf-8a08ce31b94d\n", + " AARON\n", + " BIRD\n", + " AARON BIRD ...\n", + " Individual\n", + " WA\n", + " NaN\n", + " L0021\n", " []\n", " \n", " \n", " 4\n", - " 60d454d1-3773-4d88-80e9-132c161da0f0\n", - " [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd]\n", + " 1302bf1f-393b-43ed-a15d-8cf6e121223c\n", + " AARON\n", + " COHEN\n", + " AARON COHEN ...\n", + " Individual\n", + " IL\n", + " NaN\n", + " NaN\n", + " []\n", " \n", " \n", - " 5\n", - " f71341d7-d27e-47eb-9b66-903af39d6cb5\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + " 7182\n", + " 160a5c9e-d04a-40c9-a0fd-c28e21dd70dc\n", + " NaN\n", + " NaN\n", + " Wilkinson, James\n", + " Individual\n", + " MN\n", + " NaN\n", + " NaN\n", " []\n", " \n", " \n", - " 6\n", - " 50c7d9a1-b448-46a5-8e2d-cd15b3097360\n", + " 7183\n", + " 7a19cbb7-d681-46a5-8f9f-1e7be7071f06\n", + " NaN\n", + " NaN\n", + " Wolf, Linda\n", + " Individual\n", + " MN\n", + " NaN\n", + " NaN\n", " []\n", " \n", " \n", - " 7\n", - " 62ea1e9c-ac12-400c-b3dc-519389c0f7d3\n", + " 7184\n", + " ce5156f8-23d4-40e0-8711-f19bff942543\n", + " NaN\n", + " NaN\n", + " Wollenburg, George\n", + " Individual\n", + " MN\n", + " NaN\n", + " NaN\n", " []\n", " \n", " \n", - " 8\n", - " 4db76e6e-f0d5-40eb-82de-6dbcdb562dd7\n", + " 7185\n", + " 1948661\n", + " NaN\n", + " NaN\n", + " richard 3033 shoreham\n", + " individual\n", + " NaN\n", + " NaN\n", + " NaN\n", + " []\n", + " \n", + " \n", + " 7186\n", + " 69744565-e7e4-47e1-8555-ede565fca705\n", + " NaN\n", + " NaN\n", + " wark, david\n", + " Individual\n", + " MN\n", + " NaN\n", + " NaN\n", " []\n", " \n", " \n", "\n", + "

7187 rows × 9 columns

\n", "" ], "text/plain": [ - " id \\\n", - "0 d31df1ca-714e-4a82-9e88-1892c0451a71 \n", - "1 910c4d36-b036-469e-aa2a-ea4ff8855a6c \n", - "2 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd \n", - "3 c875d7de-94be-42f1-b994-dd89b114d51e \n", - "4 60d454d1-3773-4d88-80e9-132c161da0f0 \n", - "5 f71341d7-d27e-47eb-9b66-903af39d6cb5 \n", - "6 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", - "7 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", - "8 4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 \n", + " id first_name \\\n", + "0 6c833843-2f4f-416c-9092-f1d95d9b27dc 'JESSE' PHILIP \n", + "1 cdbe7cd4-f57b-4b89-b85d-d0b812e76aa4 AARON \n", + "2 a7304cd4-76ae-4223-86c3-f50da82a62aa AARON \n", + "3 cce5ccc0-cd28-4a6a-afdf-8a08ce31b94d AARON \n", + "4 1302bf1f-393b-43ed-a15d-8cf6e121223c AARON \n", + "... ... ... \n", + "7182 160a5c9e-d04a-40c9-a0fd-c28e21dd70dc NaN \n", + "7183 7a19cbb7-d681-46a5-8f9f-1e7be7071f06 NaN \n", + "7184 ce5156f8-23d4-40e0-8711-f19bff942543 NaN \n", + "7185 1948661 NaN \n", + "7186 69744565-e7e4-47e1-8555-ede565fca705 NaN \n", + "\n", + " last_name \\\n", + "0 SHERMAN \n", + "1 AEBIG \n", + "2 BATES \n", + "3 BIRD \n", + "4 COHEN \n", + "... ... \n", + "7182 NaN \n", + "7183 NaN \n", + "7184 NaN \n", + "7185 NaN \n", + "7186 NaN \n", "\n", - " duplicated \n", - "0 [] \n", - "1 [] \n", - "2 [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe, 1d2b5bc... \n", - "3 [] \n", - "4 [1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd] \n", - "5 [] \n", - "6 [] \n", - "7 [] \n", - "8 [] " + " full_name entity_type state \\\n", + "0 'JESSE' PHILIP SHERMAN ... Individual CA \n", + "1 AARON AEBIG ... Individual MI \n", + "2 AARON BATES ... Individual MI \n", + "3 AARON BIRD ... Individual WA \n", + "4 AARON COHEN ... Individual IL \n", + "... ... ... ... \n", + "7182 Wilkinson, James Individual MN \n", + "7183 Wolf, Linda Individual MN \n", + "7184 Wollenburg, George Individual MN \n", + "7185 richard 3033 shoreham individual NaN \n", + "7186 wark, david Individual MN \n", + "\n", + " party company duplicated \n", + "0 NaN NaN [] \n", + "1 NaN NaN [] \n", + "2 NaN NaN [] \n", + "3 NaN L0021 [] \n", + "4 NaN NaN [] \n", + "... ... ... ... \n", + "7182 NaN NaN [] \n", + "7183 NaN NaN [] \n", + "7184 NaN NaN [] \n", + "7185 NaN NaN [] \n", + "7186 NaN NaN [] \n", + "\n", + "[7187 rows x 9 columns]" ] }, - "execution_count": 20, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "x[['id','duplicated']]" + "y = inds_sample.drop_duplicates()\n", + "\n", + "# now find the duplicates along all columns but the ID\n", + "y=y.groupby(inds_sample.columns[1:].tolist(),dropna=False)[\"id\"].agg(list).reset_index().rename(columns={\"id\": \"duplicated\"})\n", + "y.index=y[\"duplicated\"].str[0].tolist()\n", + "y[\"duplicated\"]=y[\"duplicated\"].str[1:]\n", + "\n", + "# now convert the duplicated column into a dictionary that can will be\n", + "# an output by only feeding the entries with duplicates\n", + "y = y.reset_index().rename(columns = {'index':'id'})\n", + "convert_duplicates_to_dict(y[y['duplicated'].apply(lambda x: len(x))>0][['id','duplicated']])\n", + "new_df = y.drop(['duplicated'], axis=1)\n", + "#return new_df\n", + "y" ] }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 9, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n", - "[]\n", - "['1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe', '1d2b5bc0-9385-4cd7-ac48-df43b3eca6ff']\n", - "[]\n", - "['1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd']\n", - "[]\n", - "[]\n", - "[]\n", - "[]\n" - ] + "data": { + "text/plain": [ + "Index(['first_name', 'last_name', 'full_name', 'entity_type', 'state', 'party',\n", + " 'company'],\n", + " dtype='object')" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "y = x[['duplicated']]\n", - "for i in range(len(y)):\n", - " #print(y.iloc[i]['duplicated'])\n", - " print(y.iloc[i]['duplicated'])" + "inds_sample.columns[1:]" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -715,74 +917,92 @@ " \n", " \n", " \n", - " name\n", - " state\n", - " entity_type\n", - " id\n", + " Max Speed\n", + " Animal\n", + " Color\n", + " Age\n", " \n", " \n", " \n", " \n", " 0\n", - " COMMITTEE TO ELECT DR PATRICIA BERNARD\n", - " MI\n", - " committee\n", - " 2\n", + " 380.0\n", + " None\n", + " green\n", + " 2.0\n", " \n", " \n", - " 2\n", - " MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC\n", - " MI\n", - " committee\n", - " 4\n", - " \n", - " \n", - " 4\n", - " Paa Pac\n", - " PA\n", - " Organization\n", - " 2\n", + " 1\n", + " 370.0\n", + " Falcon\n", + " None\n", + " NaN\n", " \n", " \n", - " 6\n", - " REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...\n", - " MI\n", - " committee\n", - " 3\n", + " 2\n", + " NaN\n", + " None\n", + " yellow\n", + " 5.0\n", " \n", " \n", - " 7\n", - " UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...\n", - " MI\n", - " committee\n", - " 4\n", + " 3\n", + " NaN\n", + " Parrot\n", + " blue\n", + " 6.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " name state entity_type id\n", - "0 COMMITTEE TO ELECT DR PATRICIA BERNARD MI committee 2\n", - "2 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC MI committee 4\n", - "4 Paa Pac PA Organization 2\n", - "6 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee 3\n", - "7 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee 4" + " Max Speed Animal Color Age\n", + "0 380.0 None green 2.0\n", + "1 370.0 Falcon None NaN\n", + "2 NaN None yellow 5.0\n", + "3 NaN Parrot blue 6.0" ] }, - "execution_count": 13, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "x = sample_df.groupby(sample_df.columns[1:].tolist()).count().reset_index()\n", - "x.loc[x.id >1]" + "import numpy as np\n", + "import pandas as pd\n", + "df = pd.DataFrame({'Max Speed': [380., 370., np.nan, np.nan],\n", + " 'Animal': ['None', 'Falcon', 'None', 'Parrot'],\n", + " 'Color':['green',None,'yellow','blue'],\n", + " 'Age':[2,np.nan,5,6]})\n", + "df" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df= df.groupby(df.columns[1:].tolist(), dropna=False)[\"Max Speed\"]#.agg(list)#.reset_index()\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -806,114 +1026,89 @@ " \n", " \n", " \n", - " name\n", - " state\n", - " entity_type\n", + " Age\n", + " Animal\n", + " Color\n", + " Max Speed\n", " \n", " \n", " \n", " \n", - " d31df1ca-714e-4a82-9e88-1892c0451a71\n", - " COMMITTEE TO ELECT DR PATRICIA BERNARD\n", - " MI\n", - " committee\n", - " \n", - " \n", - " 910c4d36-b036-469e-aa2a-ea4ff8855a6c\n", - " Citizens For Kail\n", - " PA\n", - " Organization\n", - " \n", - " \n", - " 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd\n", - " MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC\n", - " MI\n", - " committee\n", - " \n", - " \n", - " c875d7de-94be-42f1-b994-dd89b114d51e\n", - " Pa Fraternal Order Of Police Pac\n", - " PA\n", - " Organization\n", - " \n", - " \n", - " 60d454d1-3773-4d88-80e9-132c161da0f0\n", - " Paa Pac\n", - " PA\n", - " Organization\n", - " \n", - " \n", - " f71341d7-d27e-47eb-9b66-903af39d6cb5\n", - " Pabar Pac (Pa Bar Assn)\n", - " PA\n", - " Organization\n", + " 0\n", + " 2.0\n", + " None\n", + " green\n", + " [380.0]\n", " \n", " \n", - " 50c7d9a1-b448-46a5-8e2d-cd15b3097360\n", - " REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...\n", - " MI\n", - " committee\n", + " 1\n", + " 5.0\n", + " None\n", + " yellow\n", + " [nan]\n", " \n", " \n", - " 62ea1e9c-ac12-400c-b3dc-519389c0f7d3\n", - " UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...\n", - " MI\n", - " committee\n", + " 2\n", + " 6.0\n", + " Parrot\n", + " blue\n", + " [nan]\n", " \n", " \n", - " 4db76e6e-f0d5-40eb-82de-6dbcdb562dd7\n", - " Ugi Utilities Inc/Ugi Energy Services Llc Pac\n", - " PA\n", - " Organization\n", + " 3\n", + " NaN\n", + " Falcon\n", + " NaN\n", + " [370.0]\n", " \n", " \n", "\n", "" ], "text/plain": [ - " name \\\n", - "d31df1ca-714e-4a82-9e88-1892c0451a71 COMMITTEE TO ELECT DR PATRICIA BERNARD \n", - "910c4d36-b036-469e-aa2a-ea4ff8855a6c Citizens For Kail \n", - "1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", - "c875d7de-94be-42f1-b994-dd89b114d51e Pa Fraternal Order Of Police Pac \n", - "60d454d1-3773-4d88-80e9-132c161da0f0 Paa Pac \n", - "f71341d7-d27e-47eb-9b66-903af39d6cb5 Pabar Pac (Pa Bar Assn) \n", - "50c7d9a1-b448-46a5-8e2d-cd15b3097360 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... \n", - "62ea1e9c-ac12-400c-b3dc-519389c0f7d3 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... \n", - "4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 Ugi Utilities Inc/Ugi Energy Services Llc Pac \n", - "\n", - " state entity_type \n", - "d31df1ca-714e-4a82-9e88-1892c0451a71 MI committee \n", - "910c4d36-b036-469e-aa2a-ea4ff8855a6c PA Organization \n", - "1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd MI committee \n", - "c875d7de-94be-42f1-b994-dd89b114d51e PA Organization \n", - "60d454d1-3773-4d88-80e9-132c161da0f0 PA Organization \n", - "f71341d7-d27e-47eb-9b66-903af39d6cb5 PA Organization \n", - "50c7d9a1-b448-46a5-8e2d-cd15b3097360 MI committee \n", - "62ea1e9c-ac12-400c-b3dc-519389c0f7d3 MI committee \n", - "4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 PA Organization " + " Age Animal Color Max Speed\n", + "0 2.0 None green [380.0]\n", + "1 5.0 None yellow [nan]\n", + "2 6.0 Parrot blue [nan]\n", + "3 NaN Falcon NaN [370.0]" ] }, - "execution_count": 41, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "#for index in x.index:\n", - "# print(index)\n", - "x" + "df = df.groupby((df.columns.difference(['Max Speed'])).tolist(),dropna=False)['Max Speed'].agg(list).reset_index()\n", + "df" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "from utils.constants import repo_root\n", - "entities.to_csv(repo_root / \"output\" / \"deduplicated_UUIDs.csv\", index=False)\n" + "df" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 3d26fdef9d0d56459c36f61cb7b4d9fa309f7925 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Wed, 7 Feb 2024 09:47:25 -0600 Subject: [PATCH 079/214] trying to see what the git branch issues are...no need to review this commit --- notebooks/Test.ipynb | 333 ++++++++++++++++++++----------------------- 1 file changed, 154 insertions(+), 179 deletions(-) diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb index 188591d1..26d98b5f 100644 --- a/notebooks/Test.ipynb +++ b/notebooks/Test.ipynb @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -149,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -160,7 +160,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -372,7 +372,7 @@ "18 Paa Pac PA Organization " ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -402,7 +402,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -431,7 +431,7 @@ " # now convert dictionary into a csv file\n", " deduped_df = pd.DataFrame.from_dict(deduped_dict,'index') \n", " deduped_df = deduped_df.reset_index().rename(columns={\"index\":\"duplicated_uuids\", 0:\"mapped_uuids\"})\n", - " deduped_df.to_csv(repo_root / \"output\" / \"deduplicated_UUIDs.csv\", index=False)\n", + " deduped_df.to_csv(repo_root / \"output\" / \"deduplicated_UUIDs.csv\", index=False, mode='a')\n", "\n", "\n", "def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame:\n", @@ -462,7 +462,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -495,36 +495,36 @@ " \n", " \n", " 0\n", - " 43a79b93-fed7-4f3c-a279-0441cdc7e722\n", - " 14TH DISTRICT DEMOCRATIC PARTY\n", + " 3246120d-45fc-4d19-adee-d2aa2c5be6db\n", + " 1 BOLD STEP\n", " MI\n", " corporation\n", " \n", " \n", " 1\n", - " 215f3104-2df0-4799-9a13-d0c5ec27d6f2\n", - " 14TH DISTRICT DEMOCRATS\n", + " 8fc7e5d5-558d-42ea-bd9a-8e48a4a9a4bd\n", + " 12CDRC\n", " MI\n", " corporation\n", " \n", " \n", " 2\n", - " 022d2951-8fe9-42d6-a6ac-01e82d90fa65\n", - " 21ST CENTURY MEDIA - MICHIGAN\n", + " a5379930-7324-4f1d-b216-84d9e9ddea40\n", + " 303 MANAGEMENT INC.\n", " MI\n", " corporation\n", " \n", " \n", " 3\n", - " e1150dce-219c-4eef-995d-ee2759a92923\n", - " 360 TOUCH\n", + " 9064112f-ef40-4690-9d0a-782a2375feb0\n", + " 314 ACTION FUND\n", " MI\n", " corporation\n", " \n", " \n", " 4\n", - " 88c3b805-e0f1-42d5-8b77-536734731c4a\n", - " 50+1 STRATEGIES LLC\n", + " 9e11e7ae-ee29-4a50-9720-41c6ac556a1f\n", + " A T AND T MICHIGAN PAC\n", " MI\n", " corporation\n", " \n", @@ -536,76 +536,76 @@ " ...\n", " \n", " \n", - " 2135\n", - " f5fbf8f5-bd03-43f6-bfdd-42113bdd02a8\n", - " Zoom\n", + " 2149\n", + " d79f9729-c9af-4347-868a-ae6e6814a295\n", + " Zach Kirk\n", " PA\n", " Organization\n", " \n", " \n", - " 2136\n", - " 616c47f1-39cc-4b12-a93d-f7d3bdc88047\n", - " Zoom Video Communications\n", + " 2150\n", + " fbfea472-e183-4479-b869-90eddfa5198c\n", + " Zest Kitchen\n", " PA\n", " Organization\n", " \n", " \n", - " 2137\n", - " df101e29-4adf-4496-8d96-9732d9f7dbc8\n", - " Zoom.Us\n", + " 2151\n", + " c105a4af-9fd4-4a5b-a7b8-1e8738ff39c6\n", + " Zoom Us\n", " PA\n", " Organization\n", " \n", " \n", - " 2138\n", - " d02d1f6d-4a13-428e-a040-d35bd5cfcf9f\n", - " Zupancich, Andrea Senate Committee\n", - " GA\n", - " Committee\n", + " 2152\n", + " 59cc8db9-607e-4e1b-ba41-0850b6019360\n", + " Zoom Video Communications Inc.\n", + " PA\n", + " Organization\n", " \n", " \n", - " 2139\n", - " df42f2ec-9ee0-49d0-9020-d1a441ef8b42\n", - " womenwinning State PAC\n", - " MN\n", - " Committee\n", + " 2153\n", + " NaN\n", + " NaN\n", + " MI\n", + " corporation\n", " \n", " \n", "\n", - "

2140 rows × 4 columns

\n", + "

2154 rows × 4 columns

\n", "" ], "text/plain": [ " id \\\n", - "0 43a79b93-fed7-4f3c-a279-0441cdc7e722 \n", - "1 215f3104-2df0-4799-9a13-d0c5ec27d6f2 \n", - "2 022d2951-8fe9-42d6-a6ac-01e82d90fa65 \n", - "3 e1150dce-219c-4eef-995d-ee2759a92923 \n", - "4 88c3b805-e0f1-42d5-8b77-536734731c4a \n", + "0 3246120d-45fc-4d19-adee-d2aa2c5be6db \n", + "1 8fc7e5d5-558d-42ea-bd9a-8e48a4a9a4bd \n", + "2 a5379930-7324-4f1d-b216-84d9e9ddea40 \n", + "3 9064112f-ef40-4690-9d0a-782a2375feb0 \n", + "4 9e11e7ae-ee29-4a50-9720-41c6ac556a1f \n", "... ... \n", - "2135 f5fbf8f5-bd03-43f6-bfdd-42113bdd02a8 \n", - "2136 616c47f1-39cc-4b12-a93d-f7d3bdc88047 \n", - "2137 df101e29-4adf-4496-8d96-9732d9f7dbc8 \n", - "2138 d02d1f6d-4a13-428e-a040-d35bd5cfcf9f \n", - "2139 df42f2ec-9ee0-49d0-9020-d1a441ef8b42 \n", + "2149 d79f9729-c9af-4347-868a-ae6e6814a295 \n", + "2150 fbfea472-e183-4479-b869-90eddfa5198c \n", + "2151 c105a4af-9fd4-4a5b-a7b8-1e8738ff39c6 \n", + "2152 59cc8db9-607e-4e1b-ba41-0850b6019360 \n", + "2153 NaN \n", "\n", " name state entity_type \n", - "0 14TH DISTRICT DEMOCRATIC PARTY MI corporation \n", - "1 14TH DISTRICT DEMOCRATS MI corporation \n", - "2 21ST CENTURY MEDIA - MICHIGAN MI corporation \n", - "3 360 TOUCH MI corporation \n", - "4 50+1 STRATEGIES LLC MI corporation \n", + "0 1 BOLD STEP MI corporation \n", + "1 12CDRC MI corporation \n", + "2 303 MANAGEMENT INC. MI corporation \n", + "3 314 ACTION FUND MI corporation \n", + "4 A T AND T MICHIGAN PAC MI corporation \n", "... ... ... ... \n", - "2135 Zoom PA Organization \n", - "2136 Zoom Video Communications PA Organization \n", - "2137 Zoom.Us PA Organization \n", - "2138 Zupancich, Andrea Senate Committee GA Committee \n", - "2139 womenwinning State PAC MN Committee \n", + "2149 Zach Kirk PA Organization \n", + "2150 Zest Kitchen PA Organization \n", + "2151 Zoom Us PA Organization \n", + "2152 Zoom Video Communications Inc. PA Organization \n", + "2153 NaN MI corporation \n", "\n", - "[2140 rows x 4 columns]" + "[2154 rows x 4 columns]" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -618,7 +618,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -650,69 +650,63 @@ " state\n", " party\n", " company\n", - " duplicated\n", " \n", " \n", " \n", " \n", " 0\n", - " 6c833843-2f4f-416c-9092-f1d95d9b27dc\n", - " 'JESSE' PHILIP\n", - " SHERMAN\n", - " 'JESSE' PHILIP SHERMAN ...\n", + " f6df631a-e626-4861-b62b-e09512887bd3\n", + " A SCOTT\n", + " PARIS\n", + " A SCOTT PARIS ...\n", " Individual\n", - " CA\n", - " NaN\n", + " MI\n", " NaN\n", - " []\n", + " NOT EMPLOYED\n", " \n", " \n", " 1\n", - " cdbe7cd4-f57b-4b89-b85d-d0b812e76aa4\n", - " AARON\n", - " AEBIG\n", - " AARON AEBIG ...\n", + " 075fb1c6-6c70-4ec6-a439-fcebb76c4e0a\n", + " A. MARK\n", + " GLICKSTEIN\n", + " A. MARK GLICKSTEIN ...\n", " Individual\n", - " MI\n", - " NaN\n", + " CA\n", " NaN\n", - " []\n", + " PARTNERSHIP HEALTH PLAN OF CA\n", " \n", " \n", " 2\n", - " a7304cd4-76ae-4223-86c3-f50da82a62aa\n", - " AARON\n", - " BATES\n", - " AARON BATES ...\n", + " 4a3968f5-7f5e-4ed1-8f39-bfc70bc67af8\n", + " A. MICHAEL\n", + " PALIZZI\n", + " A. MICHAEL PALIZZI ...\n", " Individual\n", " MI\n", " NaN\n", - " NaN\n", - " []\n", + " MILLER CANFIELD\n", " \n", " \n", " 3\n", - " cce5ccc0-cd28-4a6a-afdf-8a08ce31b94d\n", + " bb952efc-3dba-4449-9405-ea65202fbbea\n", " AARON\n", - " BIRD\n", - " AARON BIRD ...\n", + " ALDRICH\n", + " AARON ALDRICH ...\n", " Individual\n", - " WA\n", + " MI\n", " NaN\n", - " L0021\n", - " []\n", + " MILLER PIPELINE CORP.\n", " \n", " \n", " 4\n", - " 1302bf1f-393b-43ed-a15d-8cf6e121223c\n", + " 79ec4a73-f688-479a-a4e3-0b0a3813188a\n", " AARON\n", - " COHEN\n", - " AARON COHEN ...\n", + " BLAND\n", + " AARON BLAND ...\n", " Individual\n", - " IL\n", + " MI\n", " NaN\n", " NaN\n", - " []\n", " \n", " \n", " ...\n", @@ -724,59 +718,54 @@ " ...\n", " ...\n", " ...\n", - " ...\n", " \n", " \n", - " 7182\n", - " 160a5c9e-d04a-40c9-a0fd-c28e21dd70dc\n", + " 7122\n", + " a1a6ff3b-cfa4-4b84-bf8c-20984f9871f0\n", " NaN\n", " NaN\n", - " Wilkinson, James\n", + " Trone, Robert\n", " Individual\n", " MN\n", " NaN\n", " NaN\n", - " []\n", " \n", " \n", - " 7183\n", - " 7a19cbb7-d681-46a5-8f9f-1e7be7071f06\n", + " 7123\n", + " 37ab55f5-3613-469c-8b66-ac8888f5bcae\n", " NaN\n", " NaN\n", - " Wolf, Linda\n", + " Wark, Mary Ann\n", " Individual\n", " MN\n", " NaN\n", " NaN\n", - " []\n", " \n", " \n", - " 7184\n", - " ce5156f8-23d4-40e0-8711-f19bff942543\n", + " 7124\n", + " 92d5ac7c-4702-420c-97a7-656111677f5a\n", " NaN\n", " NaN\n", - " Wollenburg, George\n", + " Wenstrom, Gene\n", " Individual\n", " MN\n", " NaN\n", " NaN\n", - " []\n", " \n", " \n", - " 7185\n", - " 1948661\n", + " 7125\n", + " fa934bf1-f611-4cd3-9bff-451bdf2e5bd2\n", " NaN\n", " NaN\n", - " richard 3033 shoreham\n", - " individual\n", - " NaN\n", + " Wika, Kevin\n", + " Individual\n", + " MN\n", " NaN\n", " NaN\n", - " []\n", " \n", " \n", - " 7186\n", - " 69744565-e7e4-47e1-8555-ede565fca705\n", + " 7126\n", + " fb8bb833-7010-418a-9f24-1a29771e0b67\n", " NaN\n", " NaN\n", " wark, david\n", @@ -784,111 +773,97 @@ " MN\n", " NaN\n", " NaN\n", - " []\n", " \n", " \n", "\n", - "

7187 rows × 9 columns

\n", + "

7127 rows × 8 columns

\n", "" ], "text/plain": [ " id first_name \\\n", - "0 6c833843-2f4f-416c-9092-f1d95d9b27dc 'JESSE' PHILIP \n", - "1 cdbe7cd4-f57b-4b89-b85d-d0b812e76aa4 AARON \n", - "2 a7304cd4-76ae-4223-86c3-f50da82a62aa AARON \n", - "3 cce5ccc0-cd28-4a6a-afdf-8a08ce31b94d AARON \n", - "4 1302bf1f-393b-43ed-a15d-8cf6e121223c AARON \n", + "0 f6df631a-e626-4861-b62b-e09512887bd3 A SCOTT \n", + "1 075fb1c6-6c70-4ec6-a439-fcebb76c4e0a A. MARK \n", + "2 4a3968f5-7f5e-4ed1-8f39-bfc70bc67af8 A. MICHAEL \n", + "3 bb952efc-3dba-4449-9405-ea65202fbbea AARON \n", + "4 79ec4a73-f688-479a-a4e3-0b0a3813188a AARON \n", "... ... ... \n", - "7182 160a5c9e-d04a-40c9-a0fd-c28e21dd70dc NaN \n", - "7183 7a19cbb7-d681-46a5-8f9f-1e7be7071f06 NaN \n", - "7184 ce5156f8-23d4-40e0-8711-f19bff942543 NaN \n", - "7185 1948661 NaN \n", - "7186 69744565-e7e4-47e1-8555-ede565fca705 NaN \n", + "7122 a1a6ff3b-cfa4-4b84-bf8c-20984f9871f0 NaN \n", + "7123 37ab55f5-3613-469c-8b66-ac8888f5bcae NaN \n", + "7124 92d5ac7c-4702-420c-97a7-656111677f5a NaN \n", + "7125 fa934bf1-f611-4cd3-9bff-451bdf2e5bd2 NaN \n", + "7126 fb8bb833-7010-418a-9f24-1a29771e0b67 NaN \n", "\n", " last_name \\\n", - "0 SHERMAN \n", - "1 AEBIG \n", - "2 BATES \n", - "3 BIRD \n", - "4 COHEN \n", + "0 PARIS \n", + "1 GLICKSTEIN \n", + "2 PALIZZI \n", + "3 ALDRICH \n", + "4 BLAND \n", "... ... \n", - "7182 NaN \n", - "7183 NaN \n", - "7184 NaN \n", - "7185 NaN \n", - "7186 NaN \n", + "7122 NaN \n", + "7123 NaN \n", + "7124 NaN \n", + "7125 NaN \n", + "7126 NaN \n", "\n", " full_name entity_type state \\\n", - "0 'JESSE' PHILIP SHERMAN ... Individual CA \n", - "1 AARON AEBIG ... Individual MI \n", - "2 AARON BATES ... Individual MI \n", - "3 AARON BIRD ... Individual WA \n", - "4 AARON COHEN ... Individual IL \n", + "0 A SCOTT PARIS ... Individual MI \n", + "1 A. MARK GLICKSTEIN ... Individual CA \n", + "2 A. MICHAEL PALIZZI ... Individual MI \n", + "3 AARON ALDRICH ... Individual MI \n", + "4 AARON BLAND ... Individual MI \n", "... ... ... ... \n", - "7182 Wilkinson, James Individual MN \n", - "7183 Wolf, Linda Individual MN \n", - "7184 Wollenburg, George Individual MN \n", - "7185 richard 3033 shoreham individual NaN \n", - "7186 wark, david Individual MN \n", + "7122 Trone, Robert Individual MN \n", + "7123 Wark, Mary Ann Individual MN \n", + "7124 Wenstrom, Gene Individual MN \n", + "7125 Wika, Kevin Individual MN \n", + "7126 wark, david Individual MN \n", "\n", - " party company duplicated \n", - "0 NaN NaN [] \n", - "1 NaN NaN [] \n", - "2 NaN NaN [] \n", - "3 NaN L0021 [] \n", - "4 NaN NaN [] \n", - "... ... ... ... \n", - "7182 NaN NaN [] \n", - "7183 NaN NaN [] \n", - "7184 NaN NaN [] \n", - "7185 NaN NaN [] \n", - "7186 NaN NaN [] \n", + " party company \n", + "0 NaN NOT EMPLOYED \n", + "1 NaN PARTNERSHIP HEALTH PLAN OF CA \n", + "2 NaN MILLER CANFIELD \n", + "3 NaN MILLER PIPELINE CORP. \n", + "4 NaN NaN \n", + "... ... ... \n", + "7122 NaN NaN \n", + "7123 NaN NaN \n", + "7124 NaN NaN \n", + "7125 NaN NaN \n", + "7126 NaN NaN \n", "\n", - "[7187 rows x 9 columns]" + "[7127 rows x 8 columns]" ] }, - "execution_count": 13, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "y = inds_sample.drop_duplicates()\n", - "\n", - "# now find the duplicates along all columns but the ID\n", - "y=y.groupby(inds_sample.columns[1:].tolist(),dropna=False)[\"id\"].agg(list).reset_index().rename(columns={\"id\": \"duplicated\"})\n", - "y.index=y[\"duplicated\"].str[0].tolist()\n", - "y[\"duplicated\"]=y[\"duplicated\"].str[1:]\n", - "\n", - "# now convert the duplicated column into a dictionary that can will be\n", - "# an output by only feeding the entries with duplicates\n", - "y = y.reset_index().rename(columns = {'index':'id'})\n", - "convert_duplicates_to_dict(y[y['duplicated'].apply(lambda x: len(x))>0][['id','duplicated']])\n", - "new_df = y.drop(['duplicated'], axis=1)\n", - "#return new_df\n", + "y=deduplicate_perfect_matches(inds_sample)\n", "y" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Index(['first_name', 'last_name', 'full_name', 'entity_type', 'state', 'party',\n", - " 'company'],\n", - " dtype='object')" + "7207" ] }, - "execution_count": 9, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "inds_sample.columns[1:]" + "a = inds_sample.drop_duplicates()\n", + "len(a)" ] }, { From 5843485fbeb48f4adb4a20a86a79cece154e10c0 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Wed, 7 Feb 2024 23:50:38 -0600 Subject: [PATCH 080/214] implementing PR feedback --- utils/linkage.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 5db87454..1b27a844 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -4,6 +4,7 @@ import pandas as pd import textdistance as td import usaddress +import os.path from utils.constants import COMPANY_TYPES, repo_root @@ -270,9 +271,9 @@ def get_street_from_address_line_1(address_line_1: str) -> str: return " ".join(string) -def convert_duplicates_to_dict(df: pd.DataFrame) -> pd.DataFrame: - """Saves to the "output" directory a file mapping multiple strings to one - string +def convert_duplicates_to_dict(df: pd.DataFrame) -> None: + """Saves to the "output" directory a file where each row represents a string + matching to another string Given a dataframe where each row contains one string in a column and a list of strings in another column, the function maps each string in the list to @@ -296,11 +297,9 @@ def convert_duplicates_to_dict(df: pd.DataFrame) -> pd.DataFrame: # now convert dictionary into a csv file deduped_df = pd.DataFrame.from_dict(deduped_dict, "index") deduped_df = deduped_df.reset_index().rename( - columns={"index": "duplicated_uuids", 0: "mapped_uuids"} - ) + columns={"index": "duplicated_uuids", 0: "mapped_uuids"}) deduped_df.to_csv( - repo_root / "output" / "deduplicated_UUIDs.csv", index=False, mode="a" - ) + repo_root / "output" / "deduplicated_UUIDs.csv", index=False, mode="a", header= not os.path.exists('../output/deduplicated_UUIDs.csv')) def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: From 97b89dd7dba65a71b0c3ba31225e559d16c21617 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Wed, 7 Feb 2024 23:51:44 -0600 Subject: [PATCH 081/214] addressing linter tests failure due to formatting --- utils/linkage.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 1b27a844..0b8459d9 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,10 +1,11 @@ """ Module for performing record linkage on state campaign finance dataset """ +import os.path + import pandas as pd import textdistance as td import usaddress -import os.path from utils.constants import COMPANY_TYPES, repo_root @@ -297,9 +298,14 @@ def convert_duplicates_to_dict(df: pd.DataFrame) -> None: # now convert dictionary into a csv file deduped_df = pd.DataFrame.from_dict(deduped_dict, "index") deduped_df = deduped_df.reset_index().rename( - columns={"index": "duplicated_uuids", 0: "mapped_uuids"}) + columns={"index": "duplicated_uuids", 0: "mapped_uuids"} + ) deduped_df.to_csv( - repo_root / "output" / "deduplicated_UUIDs.csv", index=False, mode="a", header= not os.path.exists('../output/deduplicated_UUIDs.csv')) + repo_root / "output" / "deduplicated_UUIDs.csv", + index=False, + mode="a", + header=not os.path.exists("../output/deduplicated_UUIDs.csv"), + ) def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: From 7dc5b7054cd6f525c6c542d12bb7bb4b68487d11 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Thu, 8 Feb 2024 07:40:57 +0000 Subject: [PATCH 082/214] updating requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index db05b66f..0b21babc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,3 +19,4 @@ Requests==2.31.0 setuptools==68.0.0 textdistance==4.6.1 usaddress==0.5.4 +nameparser==1.1.3 From a3310a1871b0415140a4dad8bd41ab46d47fa97b Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Thu, 8 Feb 2024 07:41:35 +0000 Subject: [PATCH 083/214] adding pre_process pipeline funcion --- utils/linkage.py | 144 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/utils/linkage.py b/utils/linkage.py index ac11a5ac..97b0ad6e 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,5 +1,10 @@ +import re +from typing import Tuple + +import pandas as pd import textdistance as td import usaddress +from nameparser import HumanName from utils.constants import COMPANY_TYPES @@ -194,3 +199,142 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: elif address_line_1_components[i][1] == "USPSBoxID": return address_line_1_components[i][0] raise ValueError("Can not find Address Number") + + +def cleaning_company_column(company_entry: str) -> str: + """ + Given a string, check if it contains a variation of self employed, unemployed, + or retired and return the standardized version. + + Args: + company: string of inputted company names + Returns: + standardized for retired, self employed, and unemployed, + or original string if no match or empty string + + >>> cleaning_company_column("Retireed") + 'Retired' + >>> cleaning_company_column("self") + 'Self Employed' + >>> cleaning_company_column("None") + 'Unemployed' + >>> cleaning_company_column("N/A") + 'Unemployed' + """ + + if not company_entry: + return company_entry + + company_edited = company_entry.lower() + + if company_edited == "n/a": + return "Unemployed" + + company_edited = re.sub(r"[^\w\s]", "", company_edited) + + if ( + company_edited == "retired" + or company_edited == "retiree" + or company_edited == "retire" + or "retiree" in company_edited + ): + return "Retired" + + elif ( + "self employe" in company_edited + or "freelance" in company_edited + or company_edited == "self" + or company_edited == "independent contractor" + ): + return "Self Employed" + elif ( + "unemploye" in company_edited + or company_edited == "none" + or company_edited == "not employed" + or company_edited == "nan" + ): + return "Unemployed" + + else: + return company_edited + + +def preprocess_pipeline( + individuals: pd.DataFrame, + Address: str, + organizations: pd.DataFrame, + transactions: pd.DataFrame, +) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: + """ + Preprocesses data for record linkage + + Args: + Individuals: dataframe of individual contributions + Address: column name of address + Organizations: dataframe of organization contributions + Transactions: dataframe of transactions + Returns: + preprocessed tuple of dataframes + first element is the individuals dataframe, + second element is the organizations dataframe, + third element is the transactions dataframe + """ + # Preprocess organizations dataframe + organizations["name"] = ( + organizations["name"].astype(str).apply(standardize_corp_names) + ) + + # Preprocess individuals dataframe + if "Unnamed: 0" in individuals.columns: + individuals.drop(columns="Unnamed: 0", inplace=True) + + individuals = individuals.astype( + {"first_name": str, "last_name": str, "full_name": str, "company": str} + ) + + # Standardize company names in individuals dataframe + individuals["company"] = individuals["company"].apply( + standardize_corp_names + ) + individuals["company"] = individuals["company"].apply( + cleaning_company_column + ) + + # Address functions, assuming address column is named 'address' + individuals["Address Line 1"] = individuals[Address].apply( + get_address_line_1_from_full_address + ) + individuals["Street Name"] = individuals["Address Line 1"].apply( + get_street_from_address_line_1 + ) + individuals["Address Number"] = individuals["Address Line 1"].apply( + get_address_number_from_address_line_1 + ) + + # Check if first name or last names are empty, if so, extract from full name column + individuals["full_name"] = individuals["full_name"].astype(str) + if individuals["first_name"].isnull().any(): + name = ( + individuals["full_name"] + .apply(HumanName) + .apply(lambda x: x.as_dict()) + ) + first_name = name.apply(lambda x: x["first"]) + individuals["first_name"] = first_name + + if individuals["last_name"].isnull().any(): + name = ( + individuals["full_name"] + .apply(HumanName) + .apply(lambda x: x.as_dict()) + ) + last_name = name.apply(lambda x: x["last"]) + individuals["last_name"] = last_name + + # Transactions + if "Unnamed: 0" in transactions.columns: + transactions.drop(columns="Unnamed: 0", inplace=True) + + transactions["purpose"] = transactions["purpose"].str.upper() + + return individuals, organizations, transactions From 270d532bbf7cde467172343e65d4a39ef6c196ed Mon Sep 17 00:00:00 2001 From: nrposner <100233813+nrposner@users.noreply.github.com> Date: Tue, 13 Feb 2024 10:40:53 -0600 Subject: [PATCH 084/214] fixed error in row_matches --- utils/linkage.py | 2 +- utils/tests/test_linkage.py | 220 ++++++++++++++++++++++++++++++++++++ 2 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 utils/tests/test_linkage.py diff --git a/utils/linkage.py b/utils/linkage.py index c0b5028c..255d7e2a 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -140,7 +140,7 @@ def row_matches( ): # Store the other index and mark it for skipping in future iterations discard_indices.append(j) - index_dict[i].append[j] + index_dict[i].append(j) return index_dict diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py new file mode 100644 index 00000000..76a37431 --- /dev/null +++ b/utils/tests/test_linkage.py @@ -0,0 +1,220 @@ +import json +import pytest +import numpy as np +import pandas as pd + + + +#creating a test for calculate_row_similarity and row_matches + + +from utils.linkage import( + calculate_string_similarity, calculate_row_similarity, row_matches, +) + + +#maybe this will just be a csv for us? +def open_test_data_json(filename: str) -> dict: + """Open json in tests/data dir into a python dict""" + with open(test_data_directory / filename, "r") as f: + return json.load(f) + + + + + + +#to put in data: +d = {'name': ["bob von rosevich", "anantarya smith","bob j vonrosevich"],'address': ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago","8 Fancy Way, Chicago"]} +test_df = pd.DataFrame(data=d) + + +@pytest.fixture +def row_similarity_scen_1(): + return open_test_data_json(data) + +@pytest.fixture +def row_similarity_scen_2(): + return open_test_data_json(data) + + +def test_row_similarity_scen_1( + row_similarity_scen_1 +): + result = calculate_row_similarity( + row_similarity_scen_1 + ) + wrong = calculate_row_similarity(row_similarity_scen_1.iloc[[0]], row_similarity_scen_1.iloc[[1]],np.array([.8, .2]),calculate_string_similarity) + right = calculate_row_similarity(row_similarity_scen_1.iloc[[0]], row_similarity_scen_1.iloc[[2]],np.array([.8, .2]),calculate_string_similarity) + + assert right > wrong + + + +def test_row_similarity_scen_2( + row_similarity_scen_2 +): + result = calculate_row_similarity( + row_similarity_scen_2 + ) + wrong = calculate_row_similarity(row_similarity_scen_2.iloc[[0]], row_similarity_scen_2.iloc[[1]],np.array([.2, .8]),calculate_string_similarity) + right = calculate_row_similarity(row_similarity_scen_2.iloc[[0]], row_similarity_scen_2.iloc[[2]],np.array([.2, .8]),calculate_string_similarity) + + assert right < wrong + + + +#how about for row matches? First pull into a notebook and see how a test should work + + + + + +def test_create_record_from_labelstudio_results( + labelstudio_simple_results_filtered, +): + result = create_record_from_labelstudio_results( + labelstudio_simple_results_filtered + ) + expected = { + "borrower": "Wisconsin Public Service Corporation", + "borrower_start_idx": 23, + "borrower_end_idx": 59, + "interest_rate": "5.35%", + "interest_rate_start_idx": 220, + "interest_rate_end_idx": 225, + "name": "Senior\\n\\nNotes", + "name_start_idx": 205, + "name_end_idx": 218, + "end_date": "November 10, 2025", + "end_date_start_idx": 237, + "end_date_end_idx": 254, + "type": "Bond", + "governed_by": "eVtWJ7O08t", + } + assert result == expected + + + + +#calculate + +def calculate_row_similarity( + row1: pd.DataFrame, row2: pd.DataFrame, weights: np.array, comparison_func +) -> float: + """Find weighted similarity of two rows in a dataframe + + The length of the weights vector must be the same as + the number of selected columns. + + This version is slow and not optimized, and will be + revised in order to make it more efficient. It + exists as to provide basic functionality. Once we have + the comparison function locked in, using .apply will + likely be easier and more efficient. + + >>> d = { + ... 'name': ["bob von rosevich", "anantarya smith","bob j vonrosevich"], + ... 'address': ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago", + ... "8 Fancy Way, Chicago"] + ... } + >>> df = pd.DataFrame(data=d) + >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], + ... np.array([.8, .2]), + ... calculate_string_similarity) + >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], + ... np.array([.8, .2]), + ... calculate_string_similarity) + >>> right > wrong + True + >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], + ... np.array([.2, .8]), + ... calculate_string_similarity) + >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], + ... np.array([.2, .8]), + ... calculate_string_similarity) + >>> right > wrong + False + """ + + row_length = len(weights) + if not (row1.shape[1] == row2.shape[1] == row_length): + raise ValueError("Number of columns and weights must be the same") + + similarity = np.zeros(row_length) + + for i in range(row_length): + similarity[i] = comparison_func( + row1.reset_index().drop(columns="index").iloc[:, i][0], + row2.reset_index().drop(columns="index").iloc[:, i][0], + ) + + return sum(similarity * weights) + + + + + + + + + + +# from banktrack.annotation.convert import ( +# create_record_from_labelstudio_results, +# get_unique_entity_ids_from_labelstudio_results, +# ) +# from banktrack.pipeline.constants import ROOT_DIR + +test_data_directory = ROOT_DIR / "tests" / "data" + + +def open_test_data_json(filename: str) -> dict: + """Open json in tests/data dir into a python dict""" + with open(test_data_directory / filename, "r") as f: + return json.load(f) + + +@pytest.fixture +def labelstudio_simple_results(): + return open_test_data_json("simple_labelstudio_results.json") + + +@pytest.fixture +def labelstudio_simple_results_filtered(): + return open_test_data_json("simple_labelstudio_results_filtered.json") + + +def test_create_record_from_labelstudio_results( + labelstudio_simple_results_filtered, +): + result = create_record_from_labelstudio_results( + labelstudio_simple_results_filtered + ) + expected = { + "borrower": "Wisconsin Public Service Corporation", + "borrower_start_idx": 23, + "borrower_end_idx": 59, + "interest_rate": "5.35%", + "interest_rate_start_idx": 220, + "interest_rate_end_idx": 225, + "name": "Senior\\n\\nNotes", + "name_start_idx": 205, + "name_end_idx": 218, + "end_date": "November 10, 2025", + "end_date_start_idx": 237, + "end_date_end_idx": 254, + "type": "Bond", + "governed_by": "eVtWJ7O08t", + } + assert result == expected + + +def test_get_unique_entity_ids_from_labelstudio_results( + labelstudio_simple_results, +): + result = get_unique_entity_ids_from_labelstudio_results( + labelstudio_simple_results + ) + expected = ["eVtWJ7O08t", "b9izoYopAS"] + assert result == expected \ No newline at end of file From 7b3e8f0dd434b92cfb42e772e8ccf00f4c2f1d1c Mon Sep 17 00:00:00 2001 From: nrposner <100233813+nrposner@users.noreply.github.com> Date: Tue, 13 Feb 2024 22:12:58 -0600 Subject: [PATCH 085/214] fixing linter errors --- utils/classify.py | 47 +++++++++ utils/tests/test_linkage.py | 185 ++---------------------------------- 2 files changed, 56 insertions(+), 176 deletions(-) create mode 100644 utils/classify.py diff --git a/utils/classify.py b/utils/classify.py new file mode 100644 index 00000000..c50741bf --- /dev/null +++ b/utils/classify.py @@ -0,0 +1,47 @@ +import pandas as pd + +from utils.linkage import calculate_string_similarity + +#we want to run down a list of people and, hopefully, their adresses, plus a list of +#corporations, groups, etc, and classify them, basically just looking for matches + +#do we want to just input all the names/people (there's not many, less than 200 for sure), +#give a string similarity match score, and extract the top ten for manual review? +#thsi should give us a feeling for how to set our threhsold +#we might also, once we have all the data, buckle down and just classify some of them manually + +inds_list = [] + +#a list of individual names + + +def similarity_calculator(df: pd.DataFrame, suspect): + """Run through a pandas dataframe column and compare elements to a constant + + """ + # this needs to output somehting useful + + similarities = df['column1'].apply(lambda x: calculate_string_similarity(x, suspect)) + return similarities + + +#crawl through list automatically once a threshold has been set +def + +for i in inds_list: + similarities = similarity_calculator(data, i) + + similarities + # + + + + + df.apply(calculate_string_similarity, inds_list) #very psuedocode + #get top n, maybe just ten, and output + + #we can use the indices and/or select manually, just add a new column to the subjects table + #that marks fossil fuels, green energy, or neither + + + diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py index 76a37431..bf9a558f 100644 --- a/utils/tests/test_linkage.py +++ b/utils/tests/test_linkage.py @@ -2,16 +2,12 @@ import pytest import numpy as np import pandas as pd - - - -#creating a test for calculate_row_similarity and row_matches - - from utils.linkage import( - calculate_string_similarity, calculate_row_similarity, row_matches, + calculate_string_similarity, calculate_row_similarity, ) +#creating a test for calculate_row_similarity and row_matches + #maybe this will just be a csv for us? def open_test_data_json(filename: str) -> dict: @@ -20,30 +16,23 @@ def open_test_data_json(filename: str) -> dict: return json.load(f) - - - - #to put in data: d = {'name': ["bob von rosevich", "anantarya smith","bob j vonrosevich"],'address': ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago","8 Fancy Way, Chicago"]} test_df = pd.DataFrame(data=d) -@pytest.fixture -def row_similarity_scen_1(): - return open_test_data_json(data) +# @pytest.fixture +# def row_similarity_scen_1(): +# return open_test_data_json(data) -@pytest.fixture -def row_similarity_scen_2(): - return open_test_data_json(data) +# @pytest.fixture +# def row_similarity_scen_2(): +# return open_test_data_json(data) def test_row_similarity_scen_1( row_similarity_scen_1 ): - result = calculate_row_similarity( - row_similarity_scen_1 - ) wrong = calculate_row_similarity(row_similarity_scen_1.iloc[[0]], row_similarity_scen_1.iloc[[1]],np.array([.8, .2]),calculate_string_similarity) right = calculate_row_similarity(row_similarity_scen_1.iloc[[0]], row_similarity_scen_1.iloc[[2]],np.array([.8, .2]),calculate_string_similarity) @@ -62,159 +51,3 @@ def test_row_similarity_scen_2( assert right < wrong - - -#how about for row matches? First pull into a notebook and see how a test should work - - - - - -def test_create_record_from_labelstudio_results( - labelstudio_simple_results_filtered, -): - result = create_record_from_labelstudio_results( - labelstudio_simple_results_filtered - ) - expected = { - "borrower": "Wisconsin Public Service Corporation", - "borrower_start_idx": 23, - "borrower_end_idx": 59, - "interest_rate": "5.35%", - "interest_rate_start_idx": 220, - "interest_rate_end_idx": 225, - "name": "Senior\\n\\nNotes", - "name_start_idx": 205, - "name_end_idx": 218, - "end_date": "November 10, 2025", - "end_date_start_idx": 237, - "end_date_end_idx": 254, - "type": "Bond", - "governed_by": "eVtWJ7O08t", - } - assert result == expected - - - - -#calculate - -def calculate_row_similarity( - row1: pd.DataFrame, row2: pd.DataFrame, weights: np.array, comparison_func -) -> float: - """Find weighted similarity of two rows in a dataframe - - The length of the weights vector must be the same as - the number of selected columns. - - This version is slow and not optimized, and will be - revised in order to make it more efficient. It - exists as to provide basic functionality. Once we have - the comparison function locked in, using .apply will - likely be easier and more efficient. - - >>> d = { - ... 'name': ["bob von rosevich", "anantarya smith","bob j vonrosevich"], - ... 'address': ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago", - ... "8 Fancy Way, Chicago"] - ... } - >>> df = pd.DataFrame(data=d) - >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], - ... np.array([.8, .2]), - ... calculate_string_similarity) - >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], - ... np.array([.8, .2]), - ... calculate_string_similarity) - >>> right > wrong - True - >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], - ... np.array([.2, .8]), - ... calculate_string_similarity) - >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], - ... np.array([.2, .8]), - ... calculate_string_similarity) - >>> right > wrong - False - """ - - row_length = len(weights) - if not (row1.shape[1] == row2.shape[1] == row_length): - raise ValueError("Number of columns and weights must be the same") - - similarity = np.zeros(row_length) - - for i in range(row_length): - similarity[i] = comparison_func( - row1.reset_index().drop(columns="index").iloc[:, i][0], - row2.reset_index().drop(columns="index").iloc[:, i][0], - ) - - return sum(similarity * weights) - - - - - - - - - - -# from banktrack.annotation.convert import ( -# create_record_from_labelstudio_results, -# get_unique_entity_ids_from_labelstudio_results, -# ) -# from banktrack.pipeline.constants import ROOT_DIR - -test_data_directory = ROOT_DIR / "tests" / "data" - - -def open_test_data_json(filename: str) -> dict: - """Open json in tests/data dir into a python dict""" - with open(test_data_directory / filename, "r") as f: - return json.load(f) - - -@pytest.fixture -def labelstudio_simple_results(): - return open_test_data_json("simple_labelstudio_results.json") - - -@pytest.fixture -def labelstudio_simple_results_filtered(): - return open_test_data_json("simple_labelstudio_results_filtered.json") - - -def test_create_record_from_labelstudio_results( - labelstudio_simple_results_filtered, -): - result = create_record_from_labelstudio_results( - labelstudio_simple_results_filtered - ) - expected = { - "borrower": "Wisconsin Public Service Corporation", - "borrower_start_idx": 23, - "borrower_end_idx": 59, - "interest_rate": "5.35%", - "interest_rate_start_idx": 220, - "interest_rate_end_idx": 225, - "name": "Senior\\n\\nNotes", - "name_start_idx": 205, - "name_end_idx": 218, - "end_date": "November 10, 2025", - "end_date_start_idx": 237, - "end_date_end_idx": 254, - "type": "Bond", - "governed_by": "eVtWJ7O08t", - } - assert result == expected - - -def test_get_unique_entity_ids_from_labelstudio_results( - labelstudio_simple_results, -): - result = get_unique_entity_ids_from_labelstudio_results( - labelstudio_simple_results - ) - expected = ["eVtWJ7O08t", "b9izoYopAS"] - assert result == expected \ No newline at end of file From 665519241ceaafdd5361d69bbfc6162226ea46e9 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Wed, 14 Feb 2024 02:27:03 -0600 Subject: [PATCH 086/214] updates to dedup file and beginning steps on netorkx --- requirements.txt | 1 + utils/linkage.py | 9 ++------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/requirements.txt b/requirements.txt index db05b66f..d28ae9f8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,3 +19,4 @@ Requests==2.31.0 setuptools==68.0.0 textdistance==4.6.1 usaddress==0.5.4 +networkx~=3.1 \ No newline at end of file diff --git a/utils/linkage.py b/utils/linkage.py index f3231886..ee8dcd60 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -190,7 +190,7 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: # if data is clean: if first_name + " " + last_name == full_name: - return full_name + return full_name.title() # some names have titles or professions associated with the name. We need to # remove those from the name. @@ -333,16 +333,11 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: .rename(columns={"id": "duplicated"}) ) new_df.index = new_df["duplicated"].str[0].tolist() - new_df["duplicated"] = new_df["duplicated"].str[1:] # now convert the duplicated column into a dictionary that can will be # an output by only feeding the entries with duplicates new_df = new_df.reset_index().rename(columns={"index": "id"}) - convert_duplicates_to_dict( - new_df[new_df["duplicated"].apply(lambda x: len(x)) > 0][ - ["id", "duplicated"] - ] - ) + convert_duplicates_to_dict(new_df[["id", "duplicated"]]) new_df = new_df.drop(["duplicated"], axis=1) return new_df From b24041d9b532a1c3e363e3ab8c70d8a7fd2d9d79 Mon Sep 17 00:00:00 2001 From: Avery Schoen <33437601+averyschoen@users.noreply.github.com> Date: Wed, 14 Feb 2024 10:01:12 -0600 Subject: [PATCH 087/214] Delete notebooks/Test.ipynb --- notebooks/Test.ipynb | 1111 ------------------------------------------ 1 file changed, 1111 deletions(-) delete mode 100644 notebooks/Test.ipynb diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb deleted file mode 100644 index 26d98b5f..00000000 --- a/notebooks/Test.ipynb +++ /dev/null @@ -1,1111 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Example Notebook file demonstrating how to use the file structure\n", - "from utils.preprocess_util_lib_example import save_random_dataframe\n", - "from pathlib import Path\n", - "\n", - "save_random_dataframe(Path(\"../output\"), Path(\"test.csv\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "def determine_comma_role(name: str) -> str:\n", - " \"\"\"Given a string (someone's name), attempts to determine the role of the\n", - " comma in the name and where it ought to belong.\n", - "\n", - " Some assumptions are made:\n", - " * If a suffix is included in the name and the name is not just the last\n", - " name(i.e \"Doe, Jr), the format is\n", - " (last_name suffix, first and middle name) i.e Doe iv, Jane Elisabeth\n", - "\n", - " * If a comma is used anywhere else, it is in the format of\n", - " (last_name, first and middle name) i.e Doe, Jane Elisabeth\n", - " Args:\n", - " name: a string representing a name/names of individuals\n", - " Returns:\n", - " the name with or without a comma based on some conditions\n", - " \"\"\"\n", - " suffixes = [\n", - " \"sr\",\n", - " \"jr\",\n", - " \"i\",\n", - " \"ii\",\n", - " \"iii\",\n", - " \"iv\",\n", - " \"v\",\n", - " \"vi\",\n", - " \"vii\",\n", - " \"viii\",\n", - " \"ix\",\n", - " \"x\",\n", - " ]\n", - " name_parts = name.lower().split(\",\")\n", - " # if the comma is just in the end as a typo:\n", - " if len(name_parts[1]) == 0:\n", - " return name_parts[0].title()\n", - " # if just the suffix in the end, leave the name as it is\n", - " if name_parts[1].strip() in suffixes:\n", - " return name.title()\n", - " # at this point either it's just poor name placement, or the suffix is\n", - " # in the beginning of the name. Either way, the first part of the list is\n", - " # the true last name.\n", - " last_part = name_parts.pop(0)\n", - " first_part = \" \".join(name_parts)\n", - " return first_part.title() + \" \" + last_part.title()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def get_likely_name(first_name: str, last_name: str, full_name: str) -> str:\n", - " \"\"\"Given name related columns, return a person's likely name\n", - "\n", - " Given different formatting used accross states, errors in data entry\n", - " and missing data, it can be difficult to determine someone's actual\n", - " name. For example, some states have a last name column with values like\n", - " \"Doe, Jane\", where the person's first name appears to have been erroneously\n", - " included.\n", - "\n", - " Args:\n", - " first_name: raw value of first name column\n", - " last_name: raw value last name column\n", - " full_name: raw value of name or full_name column\n", - " Returns:\n", - " The most likely full name of the person listed\n", - "\n", - " Sample Usage:\n", - " >>> get_likely_name(\"Jane\", \"Doe\", \"\")\n", - " 'Jane Doe'\n", - " >>> get_likely_name(\"\", \"\", \"Jane Doe\")\n", - " 'Jane Doe'\n", - " >>> get_likely_name(\"\", \"Doe, Jane\", \"\")\n", - " 'Jane Doe'\n", - " >>> get_likely_name(\"Jane Doe\", \"Doe\", \"Jane Doe\")\n", - " 'Jane Doe'\n", - " >>> get_likely_name(\"Jane\",\"\",\"Doe, Sr\")\n", - " 'Jane Doe, Sr'\n", - " >>> get_likely_name(\"Jane Elisabeth Doe, IV\",\"Elisabeth\",\"Doe, IV\")\n", - " 'Jane Elisabeth Doe, Iv'\n", - " >>> get_likely_name(\"\",\"\",\"Jane Elisabeth Doe, IV\")\n", - " 'Jane Elisabeth Doe Iv'\n", - " \"\"\"\n", - " # first ensure clean input by deleting spaces:\n", - " first_name, last_name, full_name = list(\n", - " map(lambda x: x.lower().strip(), [first_name, last_name, full_name])\n", - " )\n", - "\n", - " # if data is clean:\n", - " if first_name + \" \" + last_name == full_name:\n", - " return full_name\n", - "\n", - " # some names have titles or professions associated with the name. We need to\n", - " # remove those from the name.\n", - " titles = [\n", - " \"mr\",\n", - " \"ms\",\n", - " \"mrs\",\n", - " \"miss\",\n", - " \"prof\",\n", - " \"dr\",\n", - " \"doctor\",\n", - " \"sir\",\n", - " \"madam\",\n", - " \"professor\",\n", - " ]\n", - " names = [first_name, last_name, full_name]\n", - "\n", - " for i in range(len(names)):\n", - " # if there is a ',' deal with it accordingly\n", - " if \",\" in names[i]:\n", - " names[i] = determine_comma_role(names[i])\n", - "\n", - " names[i] = names[i].replace(\".\", \"\").split(\" \")\n", - " names[i] = [\n", - " name_part for name_part in names[i] if name_part not in titles\n", - " ]\n", - " names[i] = \" \".join(names[i])\n", - "\n", - " # one last check to remove any pieces that might add extra whitespace\n", - " names = list(filter(lambda x: x != \"\", names))\n", - " names = \" \".join(names)\n", - " names = names.title().replace(\" \",\" \").split(\" \")\n", - " final_name = []\n", - " [final_name.append(x) for x in names if x not in final_name]\n", - " return \" \".join(final_name).strip()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "orgs_sample = pd.read_csv(\"../output/complete_organizations_table.csv\",index_col=0).sample(10000)\n", - "inds_sample = pd.read_csv(\"../output/complete_individuals_table.csv\",index_col=0, low_memory=False).sample(10000)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idnamestateentity_type
050c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee
150c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee
250c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee
362ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee
462ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee
562ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee
6d31df1ca-714e-4a82-9e88-1892c0451a71COMMITTEE TO ELECT DR PATRICIA BERNARDMIcommittee
7d31df1ca-714e-4a82-9e88-1892c0451a71COMMITTEE TO ELECT DR PATRICIA BERNARDMIcommittee
862ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee
94db76e6e-f0d5-40eb-82de-6dbcdb562dd7Ugi Utilities Inc/Ugi Energy Services Llc PacPAOrganization
10f71341d7-d27e-47eb-9b66-903af39d6cb5Pabar Pac (Pa Bar Assn)PAOrganization
11c875d7de-94be-42f1-b994-dd89b114d51ePa Fraternal Order Of Police PacPAOrganization
12910c4d36-b036-469e-aa2a-ea4ff8855a6cCitizens For KailPAOrganization
1360d454d1-3773-4d88-80e9-132c161da0f0Paa PacPAOrganization
141d2b5bc0-9385-4cd7-ac48-df43b3eca6fdMICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PACMIcommittee
151d2b5bc0-9385-4cd7-ac48-df43b3eca6fdMICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PACMIcommittee
161d2b5bc0-9385-4cd7-ac48-df43b3eca6feMICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PACMIcommittee
171d2b5bc0-9385-4cd7-ac48-df43b3eca6ffMICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PACMIcommittee
181d2b5bc0-9385-4cd7-ac48-df43b3eca6fdPaa PacPAOrganization
\n", - "
" - ], - "text/plain": [ - " id \\\n", - "0 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", - "1 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", - "2 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", - "3 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", - "4 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", - "5 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", - "6 d31df1ca-714e-4a82-9e88-1892c0451a71 \n", - "7 d31df1ca-714e-4a82-9e88-1892c0451a71 \n", - "8 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", - "9 4db76e6e-f0d5-40eb-82de-6dbcdb562dd7 \n", - "10 f71341d7-d27e-47eb-9b66-903af39d6cb5 \n", - "11 c875d7de-94be-42f1-b994-dd89b114d51e \n", - "12 910c4d36-b036-469e-aa2a-ea4ff8855a6c \n", - "13 60d454d1-3773-4d88-80e9-132c161da0f0 \n", - "14 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd \n", - "15 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd \n", - "16 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe \n", - "17 1d2b5bc0-9385-4cd7-ac48-df43b3eca6ff \n", - "18 1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd \n", - "\n", - " name state entity_type \n", - "0 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", - "1 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", - "2 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", - "3 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee \n", - "4 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee \n", - "5 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee \n", - "6 COMMITTEE TO ELECT DR PATRICIA BERNARD MI committee \n", - "7 COMMITTEE TO ELECT DR PATRICIA BERNARD MI committee \n", - "8 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee \n", - "9 Ugi Utilities Inc/Ugi Energy Services Llc Pac PA Organization \n", - "10 Pabar Pac (Pa Bar Assn) PA Organization \n", - "11 Pa Fraternal Order Of Police Pac PA Organization \n", - "12 Citizens For Kail PA Organization \n", - "13 Paa Pac PA Organization \n", - "14 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC MI committee \n", - "15 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC MI committee \n", - "16 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC MI committee \n", - "17 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC MI committee \n", - "18 Paa Pac PA Organization " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data = {'id':['50c7d9a1-b448-46a5-8e2d-cd15b3097360','50c7d9a1-b448-46a5-8e2d-cd15b3097360','50c7d9a1-b448-46a5-8e2d-cd15b3097360',\n", - " '62ea1e9c-ac12-400c-b3dc-519389c0f7d3','62ea1e9c-ac12-400c-b3dc-519389c0f7d3','62ea1e9c-ac12-400c-b3dc-519389c0f7d3',\n", - " 'd31df1ca-714e-4a82-9e88-1892c0451a71','d31df1ca-714e-4a82-9e88-1892c0451a71','62ea1e9c-ac12-400c-b3dc-519389c0f7d3',\n", - " '4db76e6e-f0d5-40eb-82de-6dbcdb562dd7','f71341d7-d27e-47eb-9b66-903af39d6cb5','c875d7de-94be-42f1-b994-dd89b114d51e',\n", - " '910c4d36-b036-469e-aa2a-ea4ff8855a6c','60d454d1-3773-4d88-80e9-132c161da0f0','1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd',\n", - " '1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd','1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe','1d2b5bc0-9385-4cd7-ac48-df43b3eca6ff',\n", - " '1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd'],\n", - " 'name':['REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC','REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC',\n", - " 'REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC','UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB',\n", - " 'UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB','UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB',\n", - " 'COMMITTEE TO ELECT DR PATRICIA BERNARD','COMMITTEE TO ELECT DR PATRICIA BERNARD','UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB',\n", - " 'Ugi Utilities Inc/Ugi Energy Services Llc Pac','Pabar Pac (Pa Bar Assn)','Pa Fraternal Order Of Police Pac','Citizens For Kail',\n", - " 'Paa Pac','MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC','MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC',\n", - " 'MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC','MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC','Paa Pac'],\n", - " 'state':['MI','MI','MI','MI','MI','MI','MI','MI','MI','PA','PA','PA','PA','PA','MI','MI','MI','MI','PA'],\n", - " 'entity_type':['committee','committee','committee','committee','committee','committee','committee','committee','committee',\n", - " 'Organization','Organization','Organization','Organization','Organization','committee','committee','committee','committee','Organization']}\n", - "\n", - "sample_df = pd.DataFrame(data)\n", - "sample_df" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "from utils.constants import repo_root\n", - "def convert_duplicates_to_dict(df: pd.DataFrame)->pd.DataFrame:\n", - " '''Takes a dataframe whose indexes are UUIDs, and a column that is a list of\n", - " all other UUIDs that have duplicate values. The function then outputs a\n", - " dictionary file where the deduped UUIDs map to the dataframe main UUID\n", - " \n", - " Args:\n", - " A pandas dataframe with UUIDs as indexes and deduplicated UUIDs\n", - " matching up to the index in the same row\n", - " \n", - " Returns\n", - " None. However it outputs a dictionary to the output directory, with 2\n", - " columns. The first, which indicates the deduplicated UUIDs, is labeled\n", - " 'duplicated_uuids', and the 2nd, which shows the uuids to which the\n", - " deduplicated entries match two, is labeled 'mapped_uuids'.\n", - " '''\n", - " deduped_dict = {}\n", - " for i in range(len(df)):\n", - " deduped_uudis = df.iloc[i]['duplicated']\n", - " for j in range(len(deduped_uudis)):\n", - " deduped_dict.update({deduped_uudis[j]:df.iloc[i]['id']})\n", - " \n", - " # now convert dictionary into a csv file\n", - " deduped_df = pd.DataFrame.from_dict(deduped_dict,'index') \n", - " deduped_df = deduped_df.reset_index().rename(columns={\"index\":\"duplicated_uuids\", 0:\"mapped_uuids\"})\n", - " deduped_df.to_csv(repo_root / \"output\" / \"deduplicated_UUIDs.csv\", index=False, mode='a')\n", - "\n", - "\n", - "def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame:\n", - " '''Given a dataframe, remove rows that have identical entry data beyond\n", - " UUIDs, and output a file mapping an entry to other the UUIDs of the\n", - " deduplicated rows\n", - " \n", - " Args:\n", - " a pandas dataframe containing contribution data\n", - " Returns:\n", - " a deduplicated pandas dataframe containing contribution data\n", - " '''\n", - " #first remove all duplicate entries:\n", - " new_df = df.drop_duplicates()\n", - "\n", - " # now find the duplicates along all columns but the ID\n", - " new_df=new_df.groupby(df.columns[1:].tolist(),dropna=False)[\"id\"].agg(list).reset_index().rename(columns={\"id\": \"duplicated\"})\n", - " new_df.index=new_df[\"duplicated\"].str[0].tolist()\n", - " new_df[\"duplicated\"]=new_df[\"duplicated\"].str[1:]\n", - "\n", - " # now convert the duplicated column into a dictionary that can will be\n", - " # an output by only feeding the entries with duplicates\n", - " new_df = new_df.reset_index().rename(columns = {'index':'id'})\n", - " convert_duplicates_to_dict(new_df[new_df['duplicated'].apply(lambda x: len(x))>0][['id','duplicated']])\n", - " new_df = new_df.drop(['duplicated'], axis=1)\n", - " return new_df" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idnamestateentity_type
03246120d-45fc-4d19-adee-d2aa2c5be6db1 BOLD STEPMIcorporation
18fc7e5d5-558d-42ea-bd9a-8e48a4a9a4bd12CDRCMIcorporation
2a5379930-7324-4f1d-b216-84d9e9ddea40303 MANAGEMENT INC.MIcorporation
39064112f-ef40-4690-9d0a-782a2375feb0314 ACTION FUNDMIcorporation
49e11e7ae-ee29-4a50-9720-41c6ac556a1fA T AND T MICHIGAN PACMIcorporation
...............
2149d79f9729-c9af-4347-868a-ae6e6814a295Zach KirkPAOrganization
2150fbfea472-e183-4479-b869-90eddfa5198cZest KitchenPAOrganization
2151c105a4af-9fd4-4a5b-a7b8-1e8738ff39c6Zoom UsPAOrganization
215259cc8db9-607e-4e1b-ba41-0850b6019360Zoom Video Communications Inc.PAOrganization
2153NaNNaNMIcorporation
\n", - "

2154 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " id \\\n", - "0 3246120d-45fc-4d19-adee-d2aa2c5be6db \n", - "1 8fc7e5d5-558d-42ea-bd9a-8e48a4a9a4bd \n", - "2 a5379930-7324-4f1d-b216-84d9e9ddea40 \n", - "3 9064112f-ef40-4690-9d0a-782a2375feb0 \n", - "4 9e11e7ae-ee29-4a50-9720-41c6ac556a1f \n", - "... ... \n", - "2149 d79f9729-c9af-4347-868a-ae6e6814a295 \n", - "2150 fbfea472-e183-4479-b869-90eddfa5198c \n", - "2151 c105a4af-9fd4-4a5b-a7b8-1e8738ff39c6 \n", - "2152 59cc8db9-607e-4e1b-ba41-0850b6019360 \n", - "2153 NaN \n", - "\n", - " name state entity_type \n", - "0 1 BOLD STEP MI corporation \n", - "1 12CDRC MI corporation \n", - "2 303 MANAGEMENT INC. MI corporation \n", - "3 314 ACTION FUND MI corporation \n", - "4 A T AND T MICHIGAN PAC MI corporation \n", - "... ... ... ... \n", - "2149 Zach Kirk PA Organization \n", - "2150 Zest Kitchen PA Organization \n", - "2151 Zoom Us PA Organization \n", - "2152 Zoom Video Communications Inc. PA Organization \n", - "2153 NaN MI corporation \n", - "\n", - "[2154 rows x 4 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = deduplicate_perfect_matches(orgs_sample)\n", - "#len(x.iloc[2]['duplicated'])\n", - "x" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idfirst_namelast_namefull_nameentity_typestatepartycompany
0f6df631a-e626-4861-b62b-e09512887bd3A SCOTTPARISA SCOTT PARIS ...IndividualMINaNNOT EMPLOYED
1075fb1c6-6c70-4ec6-a439-fcebb76c4e0aA. MARKGLICKSTEINA. MARK GLICKSTEIN ...IndividualCANaNPARTNERSHIP HEALTH PLAN OF CA
24a3968f5-7f5e-4ed1-8f39-bfc70bc67af8A. MICHAELPALIZZIA. MICHAEL PALIZZI ...IndividualMINaNMILLER CANFIELD
3bb952efc-3dba-4449-9405-ea65202fbbeaAARONALDRICHAARON ALDRICH ...IndividualMINaNMILLER PIPELINE CORP.
479ec4a73-f688-479a-a4e3-0b0a3813188aAARONBLANDAARON BLAND ...IndividualMINaNNaN
...........................
7122a1a6ff3b-cfa4-4b84-bf8c-20984f9871f0NaNNaNTrone, RobertIndividualMNNaNNaN
712337ab55f5-3613-469c-8b66-ac8888f5bcaeNaNNaNWark, Mary AnnIndividualMNNaNNaN
712492d5ac7c-4702-420c-97a7-656111677f5aNaNNaNWenstrom, GeneIndividualMNNaNNaN
7125fa934bf1-f611-4cd3-9bff-451bdf2e5bd2NaNNaNWika, KevinIndividualMNNaNNaN
7126fb8bb833-7010-418a-9f24-1a29771e0b67NaNNaNwark, davidIndividualMNNaNNaN
\n", - "

7127 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " id first_name \\\n", - "0 f6df631a-e626-4861-b62b-e09512887bd3 A SCOTT \n", - "1 075fb1c6-6c70-4ec6-a439-fcebb76c4e0a A. MARK \n", - "2 4a3968f5-7f5e-4ed1-8f39-bfc70bc67af8 A. MICHAEL \n", - "3 bb952efc-3dba-4449-9405-ea65202fbbea AARON \n", - "4 79ec4a73-f688-479a-a4e3-0b0a3813188a AARON \n", - "... ... ... \n", - "7122 a1a6ff3b-cfa4-4b84-bf8c-20984f9871f0 NaN \n", - "7123 37ab55f5-3613-469c-8b66-ac8888f5bcae NaN \n", - "7124 92d5ac7c-4702-420c-97a7-656111677f5a NaN \n", - "7125 fa934bf1-f611-4cd3-9bff-451bdf2e5bd2 NaN \n", - "7126 fb8bb833-7010-418a-9f24-1a29771e0b67 NaN \n", - "\n", - " last_name \\\n", - "0 PARIS \n", - "1 GLICKSTEIN \n", - "2 PALIZZI \n", - "3 ALDRICH \n", - "4 BLAND \n", - "... ... \n", - "7122 NaN \n", - "7123 NaN \n", - "7124 NaN \n", - "7125 NaN \n", - "7126 NaN \n", - "\n", - " full_name entity_type state \\\n", - "0 A SCOTT PARIS ... Individual MI \n", - "1 A. MARK GLICKSTEIN ... Individual CA \n", - "2 A. MICHAEL PALIZZI ... Individual MI \n", - "3 AARON ALDRICH ... Individual MI \n", - "4 AARON BLAND ... Individual MI \n", - "... ... ... ... \n", - "7122 Trone, Robert Individual MN \n", - "7123 Wark, Mary Ann Individual MN \n", - "7124 Wenstrom, Gene Individual MN \n", - "7125 Wika, Kevin Individual MN \n", - "7126 wark, david Individual MN \n", - "\n", - " party company \n", - "0 NaN NOT EMPLOYED \n", - "1 NaN PARTNERSHIP HEALTH PLAN OF CA \n", - "2 NaN MILLER CANFIELD \n", - "3 NaN MILLER PIPELINE CORP. \n", - "4 NaN NaN \n", - "... ... ... \n", - "7122 NaN NaN \n", - "7123 NaN NaN \n", - "7124 NaN NaN \n", - "7125 NaN NaN \n", - "7126 NaN NaN \n", - "\n", - "[7127 rows x 8 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y=deduplicate_perfect_matches(inds_sample)\n", - "y" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "7207" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = inds_sample.drop_duplicates()\n", - "len(a)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Max SpeedAnimalColorAge
0380.0Nonegreen2.0
1370.0FalconNoneNaN
2NaNNoneyellow5.0
3NaNParrotblue6.0
\n", - "
" - ], - "text/plain": [ - " Max Speed Animal Color Age\n", - "0 380.0 None green 2.0\n", - "1 370.0 Falcon None NaN\n", - "2 NaN None yellow 5.0\n", - "3 NaN Parrot blue 6.0" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "df = pd.DataFrame({'Max Speed': [380., 370., np.nan, np.nan],\n", - " 'Animal': ['None', 'Falcon', 'None', 'Parrot'],\n", - " 'Color':['green',None,'yellow','blue'],\n", - " 'Age':[2,np.nan,5,6]})\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df= df.groupby(df.columns[1:].tolist(), dropna=False)[\"Max Speed\"]#.agg(list)#.reset_index()\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AgeAnimalColorMax Speed
02.0Nonegreen[380.0]
15.0Noneyellow[nan]
26.0Parrotblue[nan]
3NaNFalconNaN[370.0]
\n", - "
" - ], - "text/plain": [ - " Age Animal Color Max Speed\n", - "0 2.0 None green [380.0]\n", - "1 5.0 None yellow [nan]\n", - "2 6.0 Parrot blue [nan]\n", - "3 NaN Falcon NaN [370.0]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = df.groupby((df.columns.difference(['Max Speed'])).tolist(),dropna=False)['Max Speed'].agg(list).reset_index()\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.7" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 869a2ea0e4602cc51cfbf0ec54cf70bac0e4c15c Mon Sep 17 00:00:00 2001 From: npashilkar Date: Wed, 14 Feb 2024 10:03:11 -0600 Subject: [PATCH 088/214] (not complete) splink --- notebooks/splink.ipynb | 653 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 653 insertions(+) create mode 100644 notebooks/splink.ipynb diff --git a/notebooks/splink.ipynb b/notebooks/splink.ipynb new file mode 100644 index 00000000..e8e53110 --- /dev/null +++ b/notebooks/splink.ipynb @@ -0,0 +1,653 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "1a863d3e-59b4-46c3-ad0f-7d192a61ebe2", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/naynapashilkar/opt/anaconda3/lib/python3.9/site-packages/pandas/core/computation/expressions.py:21: UserWarning: Pandas requires version '2.8.4' or newer of 'numexpr' (version '2.7.3' currently installed).\n", + " from pandas.core.computation.check import NUMEXPR_INSTALLED\n", + "/Users/naynapashilkar/opt/anaconda3/lib/python3.9/site-packages/pandas/core/arrays/masked.py:60: UserWarning: Pandas requires version '1.3.6' or newer of 'bottleneck' (version '1.3.2' currently installed).\n", + " from pandas.core import (\n", + "/var/folders/nk/h__9839s2k1_48m_z2g76vn40000gn/T/ipykernel_14716/3040970222.py:1: DeprecationWarning: \n", + "Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0),\n", + "(to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries)\n", + "but was not found to be installed on your system.\n", + "If this would cause problems for you,\n", + "please provide us feedback at https://github.com/pandas-dev/pandas/issues/54466\n", + " \n", + " import pandas as pd\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "# Define sample data\n", + "data = {\n", + " 'unique_id': range(1, 13),\n", + " 'first_name': ['John', 'Jane', 'David', 'Emily', 'Michael', 'Sarah', 'John', 'Jane', 'David', 'Emily', 'John', 'John'],\n", + " 'last_name': ['Doe', 'Smith', 'Johnson', 'Brown', 'Davis', 'Miller', 'Doe', 'Smith', 'Johnson', 'Brown', 'Miller', 'Jones'],\n", + " 'full_name': ['John Doe', 'Jane Smith', 'David Johnson', 'Emily Brown', 'Michael Davis', 'Sarah Miller', 'John Doe', 'Jane Smith', 'David Johnson', 'Emily Brown', 'John Miller', 'John Jones'],\n", + " 'entity_type': ['Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person'],\n", + " 'state': ['CA', 'NY', 'TX', 'FL', 'CA', 'NY', 'CA', 'TX', 'FL', 'NY', 'CA', 'FL'],\n", + " 'party': ['Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent'],\n", + " 'company': ['Apple', 'Google', 'Microsoft', 'Amazon', 'Facebook', 'Apple', 'Google', 'Microsoft', 'Amazon', 'Facebook', 'Google', 'Microsoft']\n", + "}\n", + "\n", + "# Create DataFrame\n", + "df = pd.DataFrame(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "25334eac-e048-47e7-b911-571853e2a666", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RendererRegistry.enable('html')" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from splink.duckdb.linker import DuckDBLinker\n", + "import altair as alt\n", + "alt.renderers.enable('html')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f604d9d4-577a-4ed7-988d-71d5dcb21eae", + "metadata": {}, + "outputs": [], + "source": [ + "settings = {\n", + " \"link_type\": \"dedupe_only\",\n", + " \"blocking_rules_to_generate_predictions\": [\n", + " \"l.first_name = r.first_name and l.last_name = r.last_name\",\n", + " ],\n", + "}\n", + "linker = DuckDBLinker(df, settings)\n", + "\n", + "# linker.profile_columns(\n", + "# [\"first_name\", \"last_name\"], top_n=10, bottom_n=5\n", + "# )" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a5915f73-77a6-42c9-a7df-a8f0d396836c", + "metadata": {}, + "outputs": [], + "source": [ + "import splink.duckdb.comparison_template_library as ctl\n", + "import splink.duckdb.comparison_library as cl\n", + "\n", + "settings = {\n", + " \"link_type\": \"dedupe_only\",\n", + " \"blocking_rules_to_generate_predictions\": [\n", + " \"l.first_name = r.first_name and l.last_name = r.last_name\",\n", + " ],\n", + " \"comparisons\": [\n", + " ctl.name_comparison(\"first_name\", term_frequency_adjustments=True),\n", + " ctl.name_comparison(\"last_name\", term_frequency_adjustments=True),\n", + " cl.exact_match(\"entity_type\", term_frequency_adjustments=True),\n", + " cl.levenshtein_at_thresholds(\"state\", 2),\n", + " cl.levenshtein_at_thresholds(\"party\", 2),\n", + " cl.levenshtein_at_thresholds(\"company\", 2),\n", + " ctl.name_comparison(\"full_name\", term_frequency_adjustments=True),\n", + " # Add more comparisons as needed\n", + " ],\n", + " \"retain_matching_columns\": True,\n", + " \"retain_intermediate_calculation_columns\": True,\n", + " \"max_iterations\": 10,\n", + " \"em_convergence\": 0.01\n", + "}\n", + "\n", + "linker = DuckDBLinker(df, settings)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a1356e5a-d7e9-415d-8b7e-b5195b708755", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "217a07cf-eaa3-42a2-b43b-b2eecd740a7b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Probability two random records match is estimated to be 0.101.\n", + "This means that amongst all possible pairwise record comparisons, one in 9.90 are expected to match. With 66 total possible comparisons, we expect a total of around 6.67 matching pairs\n" + ] + } + ], + "source": [ + "linker.estimate_probability_two_random_records_match(\n", + " [\n", + " \"l.first_name = r.first_name and l.last_name = r.last_name\",\n", + " \"l.full_name = r.full_name and l.state = r.state\",\n", + " \"l.full_name = r.full_name and l.company = r.company\",\n", + " ],\n", + " recall=0.6,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "307ae7b8-b637-4451-aad3-9c848e8dff65", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "----- Estimating u probabilities using random sampling -----\n", + "u probability not trained for first_name - Damerau_levenshtein <= 1 (comparison vector value: 3). This usually means the comparison level was never observed in the training data.\n", + "u probability not trained for first_name - Jaro_winkler_similarity >= 0.9 (comparison vector value: 2). This usually means the comparison level was never observed in the training data.\n", + "u probability not trained for first_name - Jaro_winkler_similarity >= 0.8 (comparison vector value: 1). This usually means the comparison level was never observed in the training data.\n", + "u probability not trained for last_name - Damerau_levenshtein <= 1 (comparison vector value: 3). This usually means the comparison level was never observed in the training data.\n", + "u probability not trained for last_name - Jaro_winkler_similarity >= 0.9 (comparison vector value: 2). This usually means the comparison level was never observed in the training data.\n", + "u probability not trained for entity_type - All other comparisons (comparison vector value: 0). This usually means the comparison level was never observed in the training data.\n", + "u probability not trained for state - All other comparisons (comparison vector value: 0). This usually means the comparison level was never observed in the training data.\n", + "u probability not trained for party - Levenshtein <= 2 (comparison vector value: 1). This usually means the comparison level was never observed in the training data.\n", + "u probability not trained for company - Levenshtein <= 2 (comparison vector value: 1). This usually means the comparison level was never observed in the training data.\n", + "u probability not trained for full_name - Damerau_levenshtein <= 1 (comparison vector value: 3). This usually means the comparison level was never observed in the training data.\n", + "\n", + "Estimated u probabilities using random sampling\n", + "\n", + "Your model is not yet fully trained. Missing estimates for:\n", + " - first_name (some u values are not trained, no m values are trained).\n", + " - last_name (some u values are not trained, no m values are trained).\n", + " - entity_type (some u values are not trained, no m values are trained).\n", + " - state (some u values are not trained, no m values are trained).\n", + " - party (some u values are not trained, no m values are trained).\n", + " - company (some u values are not trained, no m values are trained).\n", + " - full_name (some u values are not trained, no m values are trained).\n" + ] + } + ], + "source": [ + "linker.estimate_u_using_random_sampling(max_pairs=5e6)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "813cbdfe-4b6c-4c20-8d0d-a5efee91bd8f", + "metadata": {}, + "outputs": [], + "source": [ + "# linker.match_weights_chart()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "a8730290-d9c1-4fff-a8d0-5964284ffef7", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + " -- WARNING --\n", + "You have called predict(), but there are some parameter estimates which have neither been estimated or specified in your settings dictionary. To produce predictions the following untrained trained parameters will use default values.\n", + "Comparison: 'first_name':\n", + " m values not fully trained\n", + "Comparison: 'first_name':\n", + " u values not fully trained\n", + "Comparison: 'last_name':\n", + " m values not fully trained\n", + "Comparison: 'last_name':\n", + " u values not fully trained\n", + "Comparison: 'entity_type':\n", + " m values not fully trained\n", + "Comparison: 'entity_type':\n", + " u values not fully trained\n", + "Comparison: 'state':\n", + " m values not fully trained\n", + "Comparison: 'state':\n", + " u values not fully trained\n", + "Comparison: 'party':\n", + " m values not fully trained\n", + "Comparison: 'party':\n", + " u values not fully trained\n", + "Comparison: 'company':\n", + " m values not fully trained\n", + "Comparison: 'company':\n", + " u values not fully trained\n", + "Comparison: 'full_name':\n", + " m values not fully trained\n", + "Comparison: 'full_name':\n", + " u values not fully trained\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
match_weightmatch_probabilityunique_id_lunique_id_rfirst_name_lfirst_name_rgamma_first_nametf_first_name_ltf_first_name_rbf_first_name...company_rgamma_companybf_companyfull_name_lfull_name_rgamma_full_nametf_full_name_ltf_full_name_rbf_full_namebf_tf_adj_full_name
0-4.0103300.05842828JaneJane40.1666670.1666676.966667...Microsoft00.028947Jane SmithJane Smith40.1666670.16666715.6750.363636
1-4.0103300.058428410EmilyEmily40.1666670.1666676.966667...Facebook00.028947Emily BrownEmily Brown40.1666670.16666715.6750.363636
2-4.0103300.05842839DavidDavid40.1666670.1666676.966667...Amazon00.028947David JohnsonDavid Johnson40.1666670.16666715.6750.363636
32.2650780.82778817JohnJohn40.3333330.3333336.966667...Google00.028947John DoeJohn Doe40.1666670.16666715.6750.363636
\n", + "

4 rows × 44 columns

\n", + "
" + ], + "text/plain": [ + " match_weight match_probability unique_id_l unique_id_r first_name_l \\\n", + "0 -4.010330 0.058428 2 8 Jane \n", + "1 -4.010330 0.058428 4 10 Emily \n", + "2 -4.010330 0.058428 3 9 David \n", + "3 2.265078 0.827788 1 7 John \n", + "\n", + " first_name_r gamma_first_name tf_first_name_l tf_first_name_r \\\n", + "0 Jane 4 0.166667 0.166667 \n", + "1 Emily 4 0.166667 0.166667 \n", + "2 David 4 0.166667 0.166667 \n", + "3 John 4 0.333333 0.333333 \n", + "\n", + " bf_first_name ... company_r gamma_company bf_company full_name_l \\\n", + "0 6.966667 ... Microsoft 0 0.028947 Jane Smith \n", + "1 6.966667 ... Facebook 0 0.028947 Emily Brown \n", + "2 6.966667 ... Amazon 0 0.028947 David Johnson \n", + "3 6.966667 ... Google 0 0.028947 John Doe \n", + "\n", + " full_name_r gamma_full_name tf_full_name_l tf_full_name_r \\\n", + "0 Jane Smith 4 0.166667 0.166667 \n", + "1 Emily Brown 4 0.166667 0.166667 \n", + "2 David Johnson 4 0.166667 0.166667 \n", + "3 John Doe 4 0.166667 0.166667 \n", + "\n", + " bf_full_name bf_tf_adj_full_name \n", + "0 15.675 0.363636 \n", + "1 15.675 0.363636 \n", + "2 15.675 0.363636 \n", + "3 15.675 0.363636 \n", + "\n", + "[4 rows x 44 columns]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_predict = linker.predict()\n", + "df_e = df_predict.as_pandas_dataframe(limit=5)\n", + "df_e" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "6ccb6eac-6985-4d8a-899d-d188ca980126", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Completed iteration 1, root rows count 0\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cluster_idunique_idfirst_namelast_namefull_nameentity_typestatepartycompany__splink_salttf_first_nametf_last_nametf_full_nametf_entity_type
011JohnDoeJohn DoePersonCADemocratApple0.8834140.3333330.1666670.1666671.0
122JaneSmithJane SmithPersonNYRepublicanGoogle0.1463000.1666670.1666670.1666671.0
233DavidJohnsonDavid JohnsonPersonTXIndependentMicrosoft0.3555670.1666670.1666670.1666671.0
344EmilyBrownEmily BrownPersonFLDemocratAmazon0.6713640.1666670.1666670.1666671.0
455MichaelDavisMichael DavisPersonCARepublicanFacebook0.5406800.0833330.0833330.0833331.0
\n", + "
" + ], + "text/plain": [ + " cluster_id unique_id first_name last_name full_name entity_type \\\n", + "0 1 1 John Doe John Doe Person \n", + "1 2 2 Jane Smith Jane Smith Person \n", + "2 3 3 David Johnson David Johnson Person \n", + "3 4 4 Emily Brown Emily Brown Person \n", + "4 5 5 Michael Davis Michael Davis Person \n", + "\n", + " state party company __splink_salt tf_first_name tf_last_name \\\n", + "0 CA Democrat Apple 0.883414 0.333333 0.166667 \n", + "1 NY Republican Google 0.146300 0.166667 0.166667 \n", + "2 TX Independent Microsoft 0.355567 0.166667 0.166667 \n", + "3 FL Democrat Amazon 0.671364 0.166667 0.166667 \n", + "4 CA Republican Facebook 0.540680 0.083333 0.083333 \n", + "\n", + " tf_full_name tf_entity_type \n", + "0 0.166667 1.0 \n", + "1 0.166667 1.0 \n", + "2 0.166667 1.0 \n", + "3 0.166667 1.0 \n", + "4 0.083333 1.0 " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clusters = linker.cluster_pairwise_predictions_at_threshold(df_predict, threshold_match_probability=0.7)\n", + "clusters.as_pandas_dataframe(limit=5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28948465-fea2-433d-bace-d0627dfe348d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef568813-181b-42a7-b3a2-786fe87addfb", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 21e85755d2d2886ffbad86114516277c1469d4c4 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 14 Feb 2024 10:13:48 -0600 Subject: [PATCH 089/214] trying to fix disconnect --- utils/classify.py | 9 ++---- utils/tests/test_linkage.py | 63 ++++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index c50741bf..f7763678 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -2,10 +2,10 @@ from utils.linkage import calculate_string_similarity -#we want to run down a list of people and, hopefully, their adresses, plus a list of +#we want to run down a list of people and, hopefully, their adresses, plus a list of #corporations, groups, etc, and classify them, basically just looking for matches -#do we want to just input all the names/people (there's not many, less than 200 for sure), +#do we want to just input all the names/people (there's not many, less than 200 for sure), #give a string similarity match score, and extract the top ten for manual review? #thsi should give us a feeling for how to set our threhsold #we might also, once we have all the data, buckle down and just classify some of them manually @@ -17,7 +17,7 @@ def similarity_calculator(df: pd.DataFrame, suspect): """Run through a pandas dataframe column and compare elements to a constant - + """ # this needs to output somehting useful @@ -42,6 +42,3 @@ def similarity_calculator(df: pd.DataFrame, suspect): #we can use the indices and/or select manually, just add a new column to the subjects table #that marks fossil fuels, green energy, or neither - - - diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py index bf9a558f..5899f36a 100644 --- a/utils/tests/test_linkage.py +++ b/utils/tests/test_linkage.py @@ -1,23 +1,30 @@ import json -import pytest + import numpy as np import pandas as pd -from utils.linkage import( - calculate_string_similarity, calculate_row_similarity, -) +import pytest -#creating a test for calculate_row_similarity and row_matches +from utils.linkage import calculate_row_similarity, calculate_string_similarity +# creating a test for calculate_row_similarity and row_matches -#maybe this will just be a csv for us? + +# maybe this will just be a csv for us? def open_test_data_json(filename: str) -> dict: """Open json in tests/data dir into a python dict""" with open(test_data_directory / filename, "r") as f: return json.load(f) -#to put in data: -d = {'name': ["bob von rosevich", "anantarya smith","bob j vonrosevich"],'address': ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago","8 Fancy Way, Chicago"]} +# to put in data: +d = { + "name": ["bob von rosevich", "anantarya smith", "bob j vonrosevich"], + "address": [ + "3 Blue Drive, Chicago", + "4 Blue Drive, Chicago", + "8 Fancy Way, Chicago", + ], +} test_df = pd.DataFrame(data=d) @@ -30,24 +37,36 @@ def open_test_data_json(filename: str) -> dict: # return open_test_data_json(data) -def test_row_similarity_scen_1( - row_similarity_scen_1 -): - wrong = calculate_row_similarity(row_similarity_scen_1.iloc[[0]], row_similarity_scen_1.iloc[[1]],np.array([.8, .2]),calculate_string_similarity) - right = calculate_row_similarity(row_similarity_scen_1.iloc[[0]], row_similarity_scen_1.iloc[[2]],np.array([.8, .2]),calculate_string_similarity) +def test_row_similarity_scen_1(row_similarity_scen_1): + wrong = calculate_row_similarity( + row_similarity_scen_1.iloc[[0]], + row_similarity_scen_1.iloc[[1]], + np.array([0.8, 0.2]), + calculate_string_similarity, + ) + right = calculate_row_similarity( + row_similarity_scen_1.iloc[[0]], + row_similarity_scen_1.iloc[[2]], + np.array([0.8, 0.2]), + calculate_string_similarity, + ) assert right > wrong - -def test_row_similarity_scen_2( - row_similarity_scen_2 -): - result = calculate_row_similarity( - row_similarity_scen_2 +def test_row_similarity_scen_2(row_similarity_scen_2): + result = calculate_row_similarity(row_similarity_scen_2) + wrong = calculate_row_similarity( + row_similarity_scen_2.iloc[[0]], + row_similarity_scen_2.iloc[[1]], + np.array([0.2, 0.8]), + calculate_string_similarity, + ) + right = calculate_row_similarity( + row_similarity_scen_2.iloc[[0]], + row_similarity_scen_2.iloc[[2]], + np.array([0.2, 0.8]), + calculate_string_similarity, ) - wrong = calculate_row_similarity(row_similarity_scen_2.iloc[[0]], row_similarity_scen_2.iloc[[1]],np.array([.2, .8]),calculate_string_similarity) - right = calculate_row_similarity(row_similarity_scen_2.iloc[[0]], row_similarity_scen_2.iloc[[2]],np.array([.2, .8]),calculate_string_similarity) assert right < wrong - From 495db8100b8bb945a201cd27b71d9123ab0b7a2a Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 14 Feb 2024 21:41:17 -0600 Subject: [PATCH 090/214] updated classify --- utils/classify.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index f7763678..fae19ff1 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -25,19 +25,9 @@ def similarity_calculator(df: pd.DataFrame, suspect): return similarities -#crawl through list automatically once a threshold has been set -def -for i in inds_list: - similarities = similarity_calculator(data, i) - similarities - # - - - - - df.apply(calculate_string_similarity, inds_list) #very psuedocode + #very psuedocode #get top n, maybe just ten, and output #we can use the indices and/or select manually, just add a new column to the subjects table From dbaad50d25540e680ffef004021f917fcf5b265d Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Thu, 15 Feb 2024 05:17:21 +0000 Subject: [PATCH 091/214] updated name_rank function --- utils/linkage.py | 62 ++++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 5370b306..9f146da2 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -2,8 +2,8 @@ import usaddress from names_dataset import NameDataset +# Initialize the NameDataset class, takes too long to initialize within the function nd = NameDataset() -# 'The library takes time to initialize because the database is massive.' """ Module for performing record linkage on state campaign finance dataset @@ -138,38 +138,44 @@ def get_street_from_address_line_1(address_line_1: str) -> str: def name_rank(first_name: str, last_name: str) -> list: - """Returns a score for the rank of a first name and last name in the US + """Returns a score for the rank of a given first name and last name https://github.com/philipperemy/name-dataset - Args: first_name: any string last_name: any string Returns: name rank for first name and last names - 1 is the most common name, only for names in the 'United States' - first element is the element corresponds to the rank of the first name - second element is the element corresponds to the rank of the last name + 1 is the most common name, only for names in the United States + First element in the list corresponds to the rank of the first name + Second element in the list corresponds to the rank of the last name + Empty or non string values will return None + Names that are not found in the dataset will return 0 + + >>> name_rank("John", "Smith") + [5, 7] + >>> name_rank("Adil", "Kassim") + [0, 7392] + >>> name_rank(None, 9) + [None, None """ - - if first_name is None or last_name is None: - return [None, None] - - if not isinstance(first_name, str) or not isinstance(last_name, str): - return [None, None] - - first_name_result = nd.search(first_name) - last_name_result = nd.search(last_name) - first_name_rank = None - last_name_rank = None - - if first_name_result and isinstance(first_name_result, dict): - first_name_data = first_name_result.get("first_name") - if first_name_data and "rank" in first_name_data: - first_name_rank = first_name_data["rank"].get("United States", None) - - if last_name_result and isinstance(last_name_result, dict): - last_name_data = last_name_result.get("last_name") - if last_name_data and "rank" in last_name_data: - last_name_rank = last_name_data["rank"].get("United States", None) - + first_name_rank = 0 + last_name_rank = 0 + if isinstance(first_name, str): + first_name_result = nd.search(first_name) + if first_name_result and isinstance(first_name_result, dict): + first_name_data = first_name_result.get("first_name") + if first_name_data and "rank" in first_name_data: + first_name_rank = first_name_data["rank"].get( + "United States", 0 + ) + else: + first_name_rank = None + if isinstance(last_name, str): + last_name_result = nd.search(last_name) + if last_name_result and isinstance(last_name_result, dict): + last_name_data = last_name_result.get("last_name") + if last_name_data and "rank" in last_name_data: + last_name_rank = last_name_data["rank"].get("United States", 0) + else: + last_name_rank = None return [first_name_rank, last_name_rank] From fb484508e1aae9054cdbbcb5cddab41128dadb64 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Thu, 15 Feb 2024 03:38:11 -0600 Subject: [PATCH 092/214] splink to .py --- notebooks/splink.ipynb | 653 ----------------------------------------- utils/constants.py | 52 ++++ utils/linkage.py | 27 ++ 3 files changed, 79 insertions(+), 653 deletions(-) delete mode 100644 notebooks/splink.ipynb diff --git a/notebooks/splink.ipynb b/notebooks/splink.ipynb deleted file mode 100644 index e8e53110..00000000 --- a/notebooks/splink.ipynb +++ /dev/null @@ -1,653 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "1a863d3e-59b4-46c3-ad0f-7d192a61ebe2", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/naynapashilkar/opt/anaconda3/lib/python3.9/site-packages/pandas/core/computation/expressions.py:21: UserWarning: Pandas requires version '2.8.4' or newer of 'numexpr' (version '2.7.3' currently installed).\n", - " from pandas.core.computation.check import NUMEXPR_INSTALLED\n", - "/Users/naynapashilkar/opt/anaconda3/lib/python3.9/site-packages/pandas/core/arrays/masked.py:60: UserWarning: Pandas requires version '1.3.6' or newer of 'bottleneck' (version '1.3.2' currently installed).\n", - " from pandas.core import (\n", - "/var/folders/nk/h__9839s2k1_48m_z2g76vn40000gn/T/ipykernel_14716/3040970222.py:1: DeprecationWarning: \n", - "Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0),\n", - "(to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries)\n", - "but was not found to be installed on your system.\n", - "If this would cause problems for you,\n", - "please provide us feedback at https://github.com/pandas-dev/pandas/issues/54466\n", - " \n", - " import pandas as pd\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "# Define sample data\n", - "data = {\n", - " 'unique_id': range(1, 13),\n", - " 'first_name': ['John', 'Jane', 'David', 'Emily', 'Michael', 'Sarah', 'John', 'Jane', 'David', 'Emily', 'John', 'John'],\n", - " 'last_name': ['Doe', 'Smith', 'Johnson', 'Brown', 'Davis', 'Miller', 'Doe', 'Smith', 'Johnson', 'Brown', 'Miller', 'Jones'],\n", - " 'full_name': ['John Doe', 'Jane Smith', 'David Johnson', 'Emily Brown', 'Michael Davis', 'Sarah Miller', 'John Doe', 'Jane Smith', 'David Johnson', 'Emily Brown', 'John Miller', 'John Jones'],\n", - " 'entity_type': ['Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person', 'Person'],\n", - " 'state': ['CA', 'NY', 'TX', 'FL', 'CA', 'NY', 'CA', 'TX', 'FL', 'NY', 'CA', 'FL'],\n", - " 'party': ['Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent'],\n", - " 'company': ['Apple', 'Google', 'Microsoft', 'Amazon', 'Facebook', 'Apple', 'Google', 'Microsoft', 'Amazon', 'Facebook', 'Google', 'Microsoft']\n", - "}\n", - "\n", - "# Create DataFrame\n", - "df = pd.DataFrame(data)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "25334eac-e048-47e7-b911-571853e2a666", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "RendererRegistry.enable('html')" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from splink.duckdb.linker import DuckDBLinker\n", - "import altair as alt\n", - "alt.renderers.enable('html')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "f604d9d4-577a-4ed7-988d-71d5dcb21eae", - "metadata": {}, - "outputs": [], - "source": [ - "settings = {\n", - " \"link_type\": \"dedupe_only\",\n", - " \"blocking_rules_to_generate_predictions\": [\n", - " \"l.first_name = r.first_name and l.last_name = r.last_name\",\n", - " ],\n", - "}\n", - "linker = DuckDBLinker(df, settings)\n", - "\n", - "# linker.profile_columns(\n", - "# [\"first_name\", \"last_name\"], top_n=10, bottom_n=5\n", - "# )" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "a5915f73-77a6-42c9-a7df-a8f0d396836c", - "metadata": {}, - "outputs": [], - "source": [ - "import splink.duckdb.comparison_template_library as ctl\n", - "import splink.duckdb.comparison_library as cl\n", - "\n", - "settings = {\n", - " \"link_type\": \"dedupe_only\",\n", - " \"blocking_rules_to_generate_predictions\": [\n", - " \"l.first_name = r.first_name and l.last_name = r.last_name\",\n", - " ],\n", - " \"comparisons\": [\n", - " ctl.name_comparison(\"first_name\", term_frequency_adjustments=True),\n", - " ctl.name_comparison(\"last_name\", term_frequency_adjustments=True),\n", - " cl.exact_match(\"entity_type\", term_frequency_adjustments=True),\n", - " cl.levenshtein_at_thresholds(\"state\", 2),\n", - " cl.levenshtein_at_thresholds(\"party\", 2),\n", - " cl.levenshtein_at_thresholds(\"company\", 2),\n", - " ctl.name_comparison(\"full_name\", term_frequency_adjustments=True),\n", - " # Add more comparisons as needed\n", - " ],\n", - " \"retain_matching_columns\": True,\n", - " \"retain_intermediate_calculation_columns\": True,\n", - " \"max_iterations\": 10,\n", - " \"em_convergence\": 0.01\n", - "}\n", - "\n", - "linker = DuckDBLinker(df, settings)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a1356e5a-d7e9-415d-8b7e-b5195b708755", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "217a07cf-eaa3-42a2-b43b-b2eecd740a7b", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Probability two random records match is estimated to be 0.101.\n", - "This means that amongst all possible pairwise record comparisons, one in 9.90 are expected to match. With 66 total possible comparisons, we expect a total of around 6.67 matching pairs\n" - ] - } - ], - "source": [ - "linker.estimate_probability_two_random_records_match(\n", - " [\n", - " \"l.first_name = r.first_name and l.last_name = r.last_name\",\n", - " \"l.full_name = r.full_name and l.state = r.state\",\n", - " \"l.full_name = r.full_name and l.company = r.company\",\n", - " ],\n", - " recall=0.6,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "307ae7b8-b637-4451-aad3-9c848e8dff65", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "----- Estimating u probabilities using random sampling -----\n", - "u probability not trained for first_name - Damerau_levenshtein <= 1 (comparison vector value: 3). This usually means the comparison level was never observed in the training data.\n", - "u probability not trained for first_name - Jaro_winkler_similarity >= 0.9 (comparison vector value: 2). This usually means the comparison level was never observed in the training data.\n", - "u probability not trained for first_name - Jaro_winkler_similarity >= 0.8 (comparison vector value: 1). This usually means the comparison level was never observed in the training data.\n", - "u probability not trained for last_name - Damerau_levenshtein <= 1 (comparison vector value: 3). This usually means the comparison level was never observed in the training data.\n", - "u probability not trained for last_name - Jaro_winkler_similarity >= 0.9 (comparison vector value: 2). This usually means the comparison level was never observed in the training data.\n", - "u probability not trained for entity_type - All other comparisons (comparison vector value: 0). This usually means the comparison level was never observed in the training data.\n", - "u probability not trained for state - All other comparisons (comparison vector value: 0). This usually means the comparison level was never observed in the training data.\n", - "u probability not trained for party - Levenshtein <= 2 (comparison vector value: 1). This usually means the comparison level was never observed in the training data.\n", - "u probability not trained for company - Levenshtein <= 2 (comparison vector value: 1). This usually means the comparison level was never observed in the training data.\n", - "u probability not trained for full_name - Damerau_levenshtein <= 1 (comparison vector value: 3). This usually means the comparison level was never observed in the training data.\n", - "\n", - "Estimated u probabilities using random sampling\n", - "\n", - "Your model is not yet fully trained. Missing estimates for:\n", - " - first_name (some u values are not trained, no m values are trained).\n", - " - last_name (some u values are not trained, no m values are trained).\n", - " - entity_type (some u values are not trained, no m values are trained).\n", - " - state (some u values are not trained, no m values are trained).\n", - " - party (some u values are not trained, no m values are trained).\n", - " - company (some u values are not trained, no m values are trained).\n", - " - full_name (some u values are not trained, no m values are trained).\n" - ] - } - ], - "source": [ - "linker.estimate_u_using_random_sampling(max_pairs=5e6)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "813cbdfe-4b6c-4c20-8d0d-a5efee91bd8f", - "metadata": {}, - "outputs": [], - "source": [ - "# linker.match_weights_chart()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "a8730290-d9c1-4fff-a8d0-5964284ffef7", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - " -- WARNING --\n", - "You have called predict(), but there are some parameter estimates which have neither been estimated or specified in your settings dictionary. To produce predictions the following untrained trained parameters will use default values.\n", - "Comparison: 'first_name':\n", - " m values not fully trained\n", - "Comparison: 'first_name':\n", - " u values not fully trained\n", - "Comparison: 'last_name':\n", - " m values not fully trained\n", - "Comparison: 'last_name':\n", - " u values not fully trained\n", - "Comparison: 'entity_type':\n", - " m values not fully trained\n", - "Comparison: 'entity_type':\n", - " u values not fully trained\n", - "Comparison: 'state':\n", - " m values not fully trained\n", - "Comparison: 'state':\n", - " u values not fully trained\n", - "Comparison: 'party':\n", - " m values not fully trained\n", - "Comparison: 'party':\n", - " u values not fully trained\n", - "Comparison: 'company':\n", - " m values not fully trained\n", - "Comparison: 'company':\n", - " u values not fully trained\n", - "Comparison: 'full_name':\n", - " m values not fully trained\n", - "Comparison: 'full_name':\n", - " u values not fully trained\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
match_weightmatch_probabilityunique_id_lunique_id_rfirst_name_lfirst_name_rgamma_first_nametf_first_name_ltf_first_name_rbf_first_name...company_rgamma_companybf_companyfull_name_lfull_name_rgamma_full_nametf_full_name_ltf_full_name_rbf_full_namebf_tf_adj_full_name
0-4.0103300.05842828JaneJane40.1666670.1666676.966667...Microsoft00.028947Jane SmithJane Smith40.1666670.16666715.6750.363636
1-4.0103300.058428410EmilyEmily40.1666670.1666676.966667...Facebook00.028947Emily BrownEmily Brown40.1666670.16666715.6750.363636
2-4.0103300.05842839DavidDavid40.1666670.1666676.966667...Amazon00.028947David JohnsonDavid Johnson40.1666670.16666715.6750.363636
32.2650780.82778817JohnJohn40.3333330.3333336.966667...Google00.028947John DoeJohn Doe40.1666670.16666715.6750.363636
\n", - "

4 rows × 44 columns

\n", - "
" - ], - "text/plain": [ - " match_weight match_probability unique_id_l unique_id_r first_name_l \\\n", - "0 -4.010330 0.058428 2 8 Jane \n", - "1 -4.010330 0.058428 4 10 Emily \n", - "2 -4.010330 0.058428 3 9 David \n", - "3 2.265078 0.827788 1 7 John \n", - "\n", - " first_name_r gamma_first_name tf_first_name_l tf_first_name_r \\\n", - "0 Jane 4 0.166667 0.166667 \n", - "1 Emily 4 0.166667 0.166667 \n", - "2 David 4 0.166667 0.166667 \n", - "3 John 4 0.333333 0.333333 \n", - "\n", - " bf_first_name ... company_r gamma_company bf_company full_name_l \\\n", - "0 6.966667 ... Microsoft 0 0.028947 Jane Smith \n", - "1 6.966667 ... Facebook 0 0.028947 Emily Brown \n", - "2 6.966667 ... Amazon 0 0.028947 David Johnson \n", - "3 6.966667 ... Google 0 0.028947 John Doe \n", - "\n", - " full_name_r gamma_full_name tf_full_name_l tf_full_name_r \\\n", - "0 Jane Smith 4 0.166667 0.166667 \n", - "1 Emily Brown 4 0.166667 0.166667 \n", - "2 David Johnson 4 0.166667 0.166667 \n", - "3 John Doe 4 0.166667 0.166667 \n", - "\n", - " bf_full_name bf_tf_adj_full_name \n", - "0 15.675 0.363636 \n", - "1 15.675 0.363636 \n", - "2 15.675 0.363636 \n", - "3 15.675 0.363636 \n", - "\n", - "[4 rows x 44 columns]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_predict = linker.predict()\n", - "df_e = df_predict.as_pandas_dataframe(limit=5)\n", - "df_e" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "6ccb6eac-6985-4d8a-899d-d188ca980126", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Completed iteration 1, root rows count 0\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cluster_idunique_idfirst_namelast_namefull_nameentity_typestatepartycompany__splink_salttf_first_nametf_last_nametf_full_nametf_entity_type
011JohnDoeJohn DoePersonCADemocratApple0.8834140.3333330.1666670.1666671.0
122JaneSmithJane SmithPersonNYRepublicanGoogle0.1463000.1666670.1666670.1666671.0
233DavidJohnsonDavid JohnsonPersonTXIndependentMicrosoft0.3555670.1666670.1666670.1666671.0
344EmilyBrownEmily BrownPersonFLDemocratAmazon0.6713640.1666670.1666670.1666671.0
455MichaelDavisMichael DavisPersonCARepublicanFacebook0.5406800.0833330.0833330.0833331.0
\n", - "
" - ], - "text/plain": [ - " cluster_id unique_id first_name last_name full_name entity_type \\\n", - "0 1 1 John Doe John Doe Person \n", - "1 2 2 Jane Smith Jane Smith Person \n", - "2 3 3 David Johnson David Johnson Person \n", - "3 4 4 Emily Brown Emily Brown Person \n", - "4 5 5 Michael Davis Michael Davis Person \n", - "\n", - " state party company __splink_salt tf_first_name tf_last_name \\\n", - "0 CA Democrat Apple 0.883414 0.333333 0.166667 \n", - "1 NY Republican Google 0.146300 0.166667 0.166667 \n", - "2 TX Independent Microsoft 0.355567 0.166667 0.166667 \n", - "3 FL Democrat Amazon 0.671364 0.166667 0.166667 \n", - "4 CA Republican Facebook 0.540680 0.083333 0.083333 \n", - "\n", - " tf_full_name tf_entity_type \n", - "0 0.166667 1.0 \n", - "1 0.166667 1.0 \n", - "2 0.166667 1.0 \n", - "3 0.166667 1.0 \n", - "4 0.083333 1.0 " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "clusters = linker.cluster_pairwise_predictions_at_threshold(df_predict, threshold_match_probability=0.7)\n", - "clusters.as_pandas_dataframe(limit=5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "28948465-fea2-433d-bace-d0627dfe348d", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ef568813-181b-42a7-b3a2-786fe87addfb", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/utils/constants.py b/utils/constants.py index f259db36..c7c040ac 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -641,3 +641,55 @@ "CIC": "COMMUNITY INTEREST COMPANY", "PAC": "POLITICAL ACTION COMMITTEE", } + +individual_settings = { + "link_type": "dedupe_only", + "blocking_rules_to_generate_predictions": [ + "l.first_name = r.first_name and l.last_name = r.last_name", + "l.full_name - r.full_name" + ], + "comparisons": [ + ctl.name_comparison("first_name"), #built in comparison function + ctl.name_comparison("last_name"), + ctl.name_comparison("full_name"), + ctl.forename_surname_comparison("first_name", "last_name"), #built in comparison function + cl.exact_match("entity_type", term_frequency_adjustments=True), + cl.jaro_winkler_at_thresholds("state", [0.9, 0.8]), #threshold will catch typos and shortenings + cl.jaro_winkler_at_thresholds("party", [0.9, 0.8]), + cl.jaro_winkler_at_thresholds("company", [0.9, 0.8]), + ], + + #DEFAULT + "retain_matching_columns": True, + "retain_intermediate_calculation_columns": True, + "max_iterations": 10, + "em_convergence": 0.01 +} + +i_blocking = [ + "l.first_name = r.first_name and l.last_name = r.last_name", + "l.full_name = r.full_name and l.state = r.state", + "l.full_name = r.full_name and l.company = r.company", + ] + +organizations_settings = { + "link_type": "dedupe_only", + "blocking_rules_to_generate_predictions": [ + "l.name = r.name", + ], + "comparisons": [ + ctl.name_comparison("name", term_frequency_adjustments=True), + cl.exact_match("entity_type", term_frequency_adjustments=True), + cl.jaro_winkler_at_thresholds("state", [0.9, 0.8]), #threshold will catch typos and shortenings + # Add more comparisons as needed + ], + "retain_matching_columns": True, + "retain_intermediate_calculation_columns": True, + "max_iterations": 10, + "em_convergence": 0.01 +} + +o_blocking = [ + "l.name = r.name", + "l.name = r.name and l.state = r.state", + ] \ No newline at end of file diff --git a/utils/linkage.py b/utils/linkage.py index 26fbd5b5..b24c53a3 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -5,6 +5,10 @@ from utils.constants import COMPANY_TYPES +from splink.duckdb.linker import DuckDBLinker +import splink.duckdb.comparison_template_library as ctl +import splink.duckdb.comparison_library as cl + """ Module for performing record linkage on state campaign finance dataset """ @@ -254,3 +258,26 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: elif address_line_1_components[i][1] == "USPSBoxID": return address_line_1_components[i][0] raise ValueError("Can not find Address Number") + + +def splink_dedupe(df, settings, blocking): + + """Given a dataframe, configuration settings, and blocking rules return a deduplicated dataframe + Args: + df: dataframe with potential duplicates + settings: model settings based on splink documentation + blocking: list of columns to block on + Returns: + dataframe with matched ids of matching rows""" + + linker = DuckDBLinker(df, settings) + linker.estimate_probability_two_random_records_match(blocking, recall=0.6) #default + linker.estimate_u_using_random_sampling(max_pairs=5e6) + + for i in blocking: + training_session_names = linker.estimate_parameters_using_expectation_maximisation(i) + + df_predict = linker.predict() + df_e = df_predict.as_pandas_dataframe() + clusters = linker.cluster_pairwise_predictions_at_threshold(df_predict, threshold_match_probability=0.7) #default + return clusters.as_pandas_dataframe() \ No newline at end of file From fbc579c0dfbd6a8e6b6d4a6a7a5ac418ff31d380 Mon Sep 17 00:00:00 2001 From: Avery Schoen <33437601+averyschoen@users.noreply.github.com> Date: Thu, 15 Feb 2024 08:37:58 -0600 Subject: [PATCH 093/214] Update linkage.py --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 9f146da2..403ff165 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -156,7 +156,7 @@ def name_rank(first_name: str, last_name: str) -> list: >>> name_rank("Adil", "Kassim") [0, 7392] >>> name_rank(None, 9) - [None, None + [None, None] """ first_name_rank = 0 last_name_rank = 0 From 6a41aa0778912a24ffd89c720e2f72fa6f8451d6 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 15 Feb 2024 10:25:55 -0600 Subject: [PATCH 094/214] discovered logic error in dedup function...no need to review yet --- tests/test_dedup.py | 78 ++++++++++++ tests/tester.ipynb | 294 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 372 insertions(+) create mode 100644 tests/test_dedup.py create mode 100644 tests/tester.ipynb diff --git a/tests/test_dedup.py b/tests/test_dedup.py new file mode 100644 index 00000000..25ba0c5d --- /dev/null +++ b/tests/test_dedup.py @@ -0,0 +1,78 @@ +# import json +# import pytest +import pandas as pd + +from utils.constants import BASE_FILEPATH +from utils.linkage import deduplicate_perfect_matches + +inds_sample = pd.read_csv( + BASE_FILEPATH / "output" / "complete_individuals_table.csv" +) +orgs_sample = pd.read_csv( + BASE_FILEPATH / "output" / "complete_organizations_table.csv" +) + +deduplicated_inds = deduplicate_perfect_matches(inds_sample) +deduplicated_orgs = deduplicate_perfect_matches(orgs_sample) + +output_dedup_ids = pd.read_csv( + BASE_FILEPATH / "output" / "deduplicated_UUIDs.csv" +) +# outpud_ids should have all the ids that deduplicated_inds and deduplicated_orgs +# has + +dedup_inds_id = deduplicated_inds.id.tolist() +dedup_orgs_id = deduplicated_orgs.id.tolist() +unique_ids = output_dedup_ids.duplicated_uuids.tolist() + +assert all(x in unique_ids for x in dedup_inds_id) +assert all(x in unique_ids for x in dedup_orgs_id) + +''' +from banktrack.annotation.convert import ( + create_record_from_labelstudio_results, + get_unique_entity_ids_from_labelstudio_results, +) +from banktrack.pipeline.constants import ROOT_DIR + +test_data_directory = ROOT_DIR / "tests" / "data" + + +def open_test_data_json(filename: str) -> dict: + """Open json in tests/data dir into a python dict""" + with open(test_data_directory / filename, "r") as f: + return json.load(f) + + +@pytest.fixture +def labelstudio_simple_results(): + return open_test_data_json("simple_labelstudio_results.json") + + +@pytest.fixture +def labelstudio_simple_results_filtered(): + return open_test_data_json("simple_labelstudio_results_filtered.json") + + +def test_create_record_from_labelstudio_results( + labelstudio_simple_results_filtered, +): + result = create_record_from_labelstudio_results( + labelstudio_simple_results_filtered + ) + expected = { + "borrower": "Wisconsin Public Service Corporation", + } + assert result == expected + + +def test_get_unique_entity_ids_from_labelstudio_results( + labelstudio_simple_results, +): + result = get_unique_entity_ids_from_labelstudio_results( + labelstudio_simple_results + ) + expected = ["eVtWJ7O08t", "b9izoYopAS"] + assert result == expected + +''' diff --git a/tests/tester.ipynb b/tests/tester.ipynb new file mode 100644 index 00000000..7bbdc9dd --- /dev/null +++ b/tests/tester.ipynb @@ -0,0 +1,294 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from utils.linkage import deduplicate_perfect_matches, convert_duplicates_to_dict\n", + "from utils.constants import BASE_FILEPATH\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idfirst_namelast_namefull_nameentity_typestatepartycompany
724734c87d5ea3-0000-4cae-ab4c-febce5b17fc2KIRSTINBRODERICKKIRSTIN BRODERICK ...IndividualNYNaNNaN
11872379af092ab-9e88-456f-9a27-5fa561d615ebSARAHLEVINESARAH LEVINE ...IndividualNYNaNNaN
32044889078c2f-964a-4044-a760-c0ea28e71c6eDUSTINDEMLOWDUSTIN DEMLOW ...IndividualMINaNNaN
238953e9b9112d-7927-4cc1-b316-0beb55e9c47aBRIANBARBASBRIAN BARBAS ...IndividualILNaNNaN
38632a22c70ab-464c-4d89-a473-7c97931e0155SUSAN MASSAROMCFARLANDSUSAN MASSARO MCFARLAND ...IndividualMINaNNaN
\n", + "
" + ], + "text/plain": [ + " id first_name \\\n", + "724734 c87d5ea3-0000-4cae-ab4c-febce5b17fc2 KIRSTIN \n", + "1187237 9af092ab-9e88-456f-9a27-5fa561d615eb SARAH \n", + "320448 89078c2f-964a-4044-a760-c0ea28e71c6e DUSTIN \n", + "238953 e9b9112d-7927-4cc1-b316-0beb55e9c47a BRIAN \n", + "38632 a22c70ab-464c-4d89-a473-7c97931e0155 SUSAN MASSARO \n", + "\n", + " last_name \\\n", + "724734 BRODERICK \n", + "1187237 LEVINE \n", + "320448 DEMLOW \n", + "238953 BARBAS \n", + "38632 MCFARLAND \n", + "\n", + " full_name entity_type state \\\n", + "724734 KIRSTIN BRODERICK ... Individual NY \n", + "1187237 SARAH LEVINE ... Individual NY \n", + "320448 DUSTIN DEMLOW ... Individual MI \n", + "238953 BRIAN BARBAS ... Individual IL \n", + "38632 SUSAN MASSARO MCFARLAND ... Individual MI \n", + "\n", + " party company \n", + "724734 NaN NaN \n", + "1187237 NaN NaN \n", + "320448 NaN NaN \n", + "238953 NaN NaN \n", + "38632 NaN NaN " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inds_sample = pd.read_csv(BASE_FILEPATH / \"output\" / \"complete_individuals_table.csv\", index_col=0, low_memory=False).sample(10000)\n", + "orgs_sample = pd.read_csv(BASE_FILEPATH / \"output\" / \"complete_organizations_table.csv\", index_col=0).sample(10000)\n", + "inds_sample.head(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "deduplicated_inds = deduplicate_perfect_matches(inds_sample)\n", + "deduplicated_orgs = deduplicate_perfect_matches(orgs_sample)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
duplicated_uuidsmapped_uuids
028557e06-b13b-46e1-ab44-768bd8b4ff1628557e06-b13b-46e1-ab44-768bd8b4ff16
166978565-4c37-432e-9c61-bb0ca125485066978565-4c37-432e-9c61-bb0ca1254850
251ca5ecb-6c20-4380-8562-36048ca72f4651ca5ecb-6c20-4380-8562-36048ca72f46
3735f45fd-4859-4285-a63c-29399250d20e735f45fd-4859-4285-a63c-29399250d20e
45130157e-1c68-4529-9638-d5727e8feb075130157e-1c68-4529-9638-d5727e8feb07
\n", + "
" + ], + "text/plain": [ + " duplicated_uuids mapped_uuids\n", + "0 28557e06-b13b-46e1-ab44-768bd8b4ff16 28557e06-b13b-46e1-ab44-768bd8b4ff16\n", + "1 66978565-4c37-432e-9c61-bb0ca1254850 66978565-4c37-432e-9c61-bb0ca1254850\n", + "2 51ca5ecb-6c20-4380-8562-36048ca72f46 51ca5ecb-6c20-4380-8562-36048ca72f46\n", + "3 735f45fd-4859-4285-a63c-29399250d20e 735f45fd-4859-4285-a63c-29399250d20e\n", + "4 5130157e-1c68-4529-9638-d5727e8feb07 5130157e-1c68-4529-9638-d5727e8feb07" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test = pd.read_csv(BASE_FILEPATH / \"output\" / \"deduplicated_UUIDs.csv\")\n", + "test.head(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Yes\n", + "Yes\n" + ] + } + ], + "source": [ + "dedup_inds_id = deduplicated_inds.id.tolist()\n", + "dedup_orgs_id = deduplicated_orgs.id.tolist()\n", + "test_ids = test.duplicated_uuids.tolist()\n", + "\n", + "if all(x in test_ids for x in dedup_inds_id):\n", + " print(\"Yes\")\n", + "if all(x in test_ids for x in dedup_orgs_id):\n", + " print(\"Yes\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "climate_cabinet", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 2e28eecb84601d4542f1af9d4c6f7689fa4150c5 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 15 Feb 2024 12:25:18 -0600 Subject: [PATCH 095/214] file that tests my deduplicate function --- tests/test_dedup.py | 63 +++++---------------------------------------- 1 file changed, 6 insertions(+), 57 deletions(-) diff --git a/tests/test_dedup.py b/tests/test_dedup.py index 25ba0c5d..327f2840 100644 --- a/tests/test_dedup.py +++ b/tests/test_dedup.py @@ -1,12 +1,10 @@ -# import json -# import pytest import pandas as pd from utils.constants import BASE_FILEPATH from utils.linkage import deduplicate_perfect_matches inds_sample = pd.read_csv( - BASE_FILEPATH / "output" / "complete_individuals_table.csv" + BASE_FILEPATH / "output" / "complete_individuals_table.csv", low_memory=False ) orgs_sample = pd.read_csv( BASE_FILEPATH / "output" / "complete_organizations_table.csv" @@ -21,58 +19,9 @@ # outpud_ids should have all the ids that deduplicated_inds and deduplicated_orgs # has -dedup_inds_id = deduplicated_inds.id.tolist() -dedup_orgs_id = deduplicated_orgs.id.tolist() -unique_ids = output_dedup_ids.duplicated_uuids.tolist() +dedup_inds_id = set(deduplicated_inds.id.tolist()) +dedup_orgs_id = set(deduplicated_orgs.id.tolist()) +unique_ids = set(output_dedup_ids.duplicated_uuids.tolist()) -assert all(x in unique_ids for x in dedup_inds_id) -assert all(x in unique_ids for x in dedup_orgs_id) - -''' -from banktrack.annotation.convert import ( - create_record_from_labelstudio_results, - get_unique_entity_ids_from_labelstudio_results, -) -from banktrack.pipeline.constants import ROOT_DIR - -test_data_directory = ROOT_DIR / "tests" / "data" - - -def open_test_data_json(filename: str) -> dict: - """Open json in tests/data dir into a python dict""" - with open(test_data_directory / filename, "r") as f: - return json.load(f) - - -@pytest.fixture -def labelstudio_simple_results(): - return open_test_data_json("simple_labelstudio_results.json") - - -@pytest.fixture -def labelstudio_simple_results_filtered(): - return open_test_data_json("simple_labelstudio_results_filtered.json") - - -def test_create_record_from_labelstudio_results( - labelstudio_simple_results_filtered, -): - result = create_record_from_labelstudio_results( - labelstudio_simple_results_filtered - ) - expected = { - "borrower": "Wisconsin Public Service Corporation", - } - assert result == expected - - -def test_get_unique_entity_ids_from_labelstudio_results( - labelstudio_simple_results, -): - result = get_unique_entity_ids_from_labelstudio_results( - labelstudio_simple_results - ) - expected = ["eVtWJ7O08t", "b9izoYopAS"] - assert result == expected - -''' +assert dedup_inds_id.issubset(unique_ids) +assert dedup_orgs_id.issubset(unique_ids) \ No newline at end of file From 5621652b143b03e8f514227b686c0be56ce954d4 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 15 Feb 2024 12:25:54 -0600 Subject: [PATCH 096/214] file that tests my deduplicate function --- tests/test_dedup.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_dedup.py b/tests/test_dedup.py index 327f2840..fc1710e5 100644 --- a/tests/test_dedup.py +++ b/tests/test_dedup.py @@ -4,7 +4,8 @@ from utils.linkage import deduplicate_perfect_matches inds_sample = pd.read_csv( - BASE_FILEPATH / "output" / "complete_individuals_table.csv", low_memory=False + BASE_FILEPATH / "output" / "complete_individuals_table.csv", + low_memory=False, ) orgs_sample = pd.read_csv( BASE_FILEPATH / "output" / "complete_organizations_table.csv" @@ -24,4 +25,4 @@ unique_ids = set(output_dedup_ids.duplicated_uuids.tolist()) assert dedup_inds_id.issubset(unique_ids) -assert dedup_orgs_id.issubset(unique_ids) \ No newline at end of file +assert dedup_orgs_id.issubset(unique_ids) From cfb6d261f6a2867b6c9521c96d0e7ca8ee4a0693 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Sun, 18 Feb 2024 11:27:54 -0600 Subject: [PATCH 097/214] testing if path to complete_orgs_table.csv is working --- tests/test_dedup.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test_dedup.py b/tests/test_dedup.py index fc1710e5..86533450 100644 --- a/tests/test_dedup.py +++ b/tests/test_dedup.py @@ -3,15 +3,15 @@ from utils.constants import BASE_FILEPATH from utils.linkage import deduplicate_perfect_matches -inds_sample = pd.read_csv( - BASE_FILEPATH / "output" / "complete_individuals_table.csv", - low_memory=False, -) +# inds_sample = pd.read_csv( +# BASE_FILEPATH / "output" / "complete_individuals_table.csv", +# low_memory=False, +# ) orgs_sample = pd.read_csv( BASE_FILEPATH / "output" / "complete_organizations_table.csv" ) -deduplicated_inds = deduplicate_perfect_matches(inds_sample) +# deduplicated_inds = deduplicate_perfect_matches(inds_sample) deduplicated_orgs = deduplicate_perfect_matches(orgs_sample) output_dedup_ids = pd.read_csv( @@ -20,9 +20,9 @@ # outpud_ids should have all the ids that deduplicated_inds and deduplicated_orgs # has -dedup_inds_id = set(deduplicated_inds.id.tolist()) +# dedup_inds_id = set(deduplicated_inds.id.tolist()) dedup_orgs_id = set(deduplicated_orgs.id.tolist()) unique_ids = set(output_dedup_ids.duplicated_uuids.tolist()) -assert dedup_inds_id.issubset(unique_ids) +# assert dedup_inds_id.issubset(unique_ids) assert dedup_orgs_id.issubset(unique_ids) From d9356a2a93f8cf0cf70a094801a5dba9546822f8 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 19:04:16 -0600 Subject: [PATCH 098/214] added test for row_matches --- utils/tests/test_linkage.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py index 5899f36a..401e70b6 100644 --- a/utils/tests/test_linkage.py +++ b/utils/tests/test_linkage.py @@ -1,20 +1,12 @@ -import json - import numpy as np import pandas as pd -import pytest - -from utils.linkage import calculate_row_similarity, calculate_string_similarity -# creating a test for calculate_row_similarity and row_matches +from utils.linkage import calculate_row_similarity, calculate_string_similarity, row_matches +# import pytest -# maybe this will just be a csv for us? -def open_test_data_json(filename: str) -> dict: - """Open json in tests/data dir into a python dict""" - with open(test_data_directory / filename, "r") as f: - return json.load(f) +# creating a test for calculate_row_similarity and row_matches # to put in data: d = { @@ -55,7 +47,6 @@ def test_row_similarity_scen_1(row_similarity_scen_1): def test_row_similarity_scen_2(row_similarity_scen_2): - result = calculate_row_similarity(row_similarity_scen_2) wrong = calculate_row_similarity( row_similarity_scen_2.iloc[[0]], row_similarity_scen_2.iloc[[1]], @@ -70,3 +61,16 @@ def test_row_similarity_scen_2(row_similarity_scen_2): ) assert right < wrong + + +d2 = {'name': ["bob von rosevich", "anantarya smith","bob j vonrosevich", "missy elliot", "mr johnson", "quarantin directino", "missy eliot", "joseph johnson"],'address': ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago","8 Fancy Way, Chicago", "8 Fancy Way, Evanston", "17 Regular Road, Chicago", "42 Hollywood Boulevard, Chicago", "8 Fancy Way, Evanston", "17 Regular Road, Chicago"]} +test_df2 = pd.DataFrame(data=d2) + + +def test_row_matches(row_match_scen1): + res = row_matches(test_df, np.array([.8, .2]), .9, calculate_string_similarity) + + assert res == {0: [2], 1: [], 2: [], 3: [6], 4: [], 5: [], 6: [], 7: []} + + + From 256caf756a258742012a4609f7e5d654632bb36c Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 19:08:34 -0600 Subject: [PATCH 099/214] changes to linkage --- utils/linkage.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index c4fac807..9a94ed36 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,6 +1,7 @@ +import re + import numpy as np import pandas as pd -import re import textdistance as td import usaddress From 1d11b5233168261cd3ccc7f5a8b4ede568543bcc Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 19:14:37 -0600 Subject: [PATCH 100/214] fixing linter issues --- utils/classify.py | 35 +++++++++++++++++----------------- utils/linkage.py | 4 ++-- utils/tests/test_linkage.py | 38 ++++++++++++++++++++++++++++++------- 3 files changed, 50 insertions(+), 27 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index fae19ff1..cfd629c0 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -2,33 +2,32 @@ from utils.linkage import calculate_string_similarity -#we want to run down a list of people and, hopefully, their adresses, plus a list of -#corporations, groups, etc, and classify them, basically just looking for matches +# we want to run down a list of people and, hopefully, their adresses, plus a list of +# corporations, groups, etc, and classify them, basically just looking for matches -#do we want to just input all the names/people (there's not many, less than 200 for sure), -#give a string similarity match score, and extract the top ten for manual review? -#thsi should give us a feeling for how to set our threhsold -#we might also, once we have all the data, buckle down and just classify some of them manually +# do we want to just input all the names/people (there's not many, less than 200 +# for sure),give a string similarity match score, and extract the top ten for +# manual review? this should give us a feeling for how to set our threshold +# we might also, once we have all the data, buckle down and just classify +# some of them manually inds_list = [] -#a list of individual names +# a list of individual names def similarity_calculator(df: pd.DataFrame, suspect): - """Run through a pandas dataframe column and compare elements to a constant - - """ + """Run through a pandas dataframe column and compare elements to a constant""" # this needs to output somehting useful - similarities = df['column1'].apply(lambda x: calculate_string_similarity(x, suspect)) + similarities = df["column1"].apply( + lambda x: calculate_string_similarity(x, suspect) + ) return similarities + # very psuedocode + # get top n, maybe just ten, and output - - - #very psuedocode - #get top n, maybe just ten, and output - - #we can use the indices and/or select manually, just add a new column to the subjects table - #that marks fossil fuels, green energy, or neither + # we can use the indices and/or select manually, just add a new + # column to the subjects table + # that marks fossil fuels, green energy, or neither diff --git a/utils/linkage.py b/utils/linkage.py index bd2ad238..dd045753 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -2,8 +2,8 @@ Module for performing record linkage on state campaign finance dataset """ import os.path -import pandas as pd import re + import numpy as np import pandas as pd import textdistance as td @@ -193,7 +193,7 @@ def row_matches( return index_dict - + def determine_comma_role(name: str) -> str: """Given a string (someone's name), attempts to determine the role of the comma in the name and where it ought to belong. diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py index 401e70b6..a7bd0514 100644 --- a/utils/tests/test_linkage.py +++ b/utils/tests/test_linkage.py @@ -1,7 +1,11 @@ import numpy as np import pandas as pd -from utils.linkage import calculate_row_similarity, calculate_string_similarity, row_matches +from utils.linkage import ( + calculate_row_similarity, + calculate_string_similarity, + row_matches, +) # import pytest @@ -63,14 +67,34 @@ def test_row_similarity_scen_2(row_similarity_scen_2): assert right < wrong -d2 = {'name': ["bob von rosevich", "anantarya smith","bob j vonrosevich", "missy elliot", "mr johnson", "quarantin directino", "missy eliot", "joseph johnson"],'address': ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago","8 Fancy Way, Chicago", "8 Fancy Way, Evanston", "17 Regular Road, Chicago", "42 Hollywood Boulevard, Chicago", "8 Fancy Way, Evanston", "17 Regular Road, Chicago"]} +d2 = { + "name": [ + "bob von rosevich", + "anantarya smith", + "bob j vonrosevich", + "missy elliot", + "mr johnson", + "quarantin directino", + "missy eliot", + "joseph johnson", + ], + "address": [ + "3 Blue Drive, Chicago", + "4 Blue Drive, Chicago", + "8 Fancy Way, Chicago", + "8 Fancy Way, Evanston", + "17 Regular Road, Chicago", + "42 Hollywood Boulevard, Chicago", + "8 Fancy Way, Evanston", + "17 Regular Road, Chicago", + ], +} test_df2 = pd.DataFrame(data=d2) def test_row_matches(row_match_scen1): - res = row_matches(test_df, np.array([.8, .2]), .9, calculate_string_similarity) - - assert res == {0: [2], 1: [], 2: [], 3: [6], 4: [], 5: [], 6: [], 7: []} - - + res = row_matches( + test_df, np.array([0.8, 0.2]), 0.9, calculate_string_similarity + ) + assert res == {0: [2], 1: [], 2: [], 3: [6], 4: [], 5: [], 6: [], 7: []} From 2c035484e4f37ed1ff669b5959fee65e6454d008 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 19:20:54 -0600 Subject: [PATCH 101/214] fixing test --- utils/tests/test_linkage.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py index a7bd0514..d495e10c 100644 --- a/utils/tests/test_linkage.py +++ b/utils/tests/test_linkage.py @@ -1,5 +1,6 @@ import numpy as np import pandas as pd +import pytest from utils.linkage import ( calculate_row_similarity, @@ -24,13 +25,13 @@ test_df = pd.DataFrame(data=d) -# @pytest.fixture -# def row_similarity_scen_1(): -# return open_test_data_json(data) +@pytest.fixture +def row_similarity_scen_1(): + return test_df -# @pytest.fixture -# def row_similarity_scen_2(): -# return open_test_data_json(data) +@pytest.fixture +def row_similarity_scen_2(): + return test_df def test_row_similarity_scen_1(row_similarity_scen_1): @@ -91,6 +92,10 @@ def test_row_similarity_scen_2(row_similarity_scen_2): } test_df2 = pd.DataFrame(data=d2) +@pytest.fixture +def row_match_scen1(): + return test_df2 + def test_row_matches(row_match_scen1): res = row_matches( From 1b90fc4775dbc7461a3ffb1048aeb2188abeb982 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 19:23:15 -0600 Subject: [PATCH 102/214] fixing linter errors --- utils/tests/test_linkage.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py index d495e10c..60511727 100644 --- a/utils/tests/test_linkage.py +++ b/utils/tests/test_linkage.py @@ -29,6 +29,7 @@ def row_similarity_scen_1(): return test_df + @pytest.fixture def row_similarity_scen_2(): return test_df @@ -92,6 +93,7 @@ def test_row_similarity_scen_2(row_similarity_scen_2): } test_df2 = pd.DataFrame(data=d2) + @pytest.fixture def row_match_scen1(): return test_df2 From 3dd4b4df78ddcc56ab1157d92b6f88b1ab90c46a Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 19:26:32 -0600 Subject: [PATCH 103/214] fixing typo --- utils/tests/test_linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py index 60511727..e964dade 100644 --- a/utils/tests/test_linkage.py +++ b/utils/tests/test_linkage.py @@ -101,7 +101,7 @@ def row_match_scen1(): def test_row_matches(row_match_scen1): res = row_matches( - test_df, np.array([0.8, 0.2]), 0.9, calculate_string_similarity + test_df2, np.array([0.8, 0.2]), 0.9, calculate_string_similarity ) assert res == {0: [2], 1: [], 2: [], 3: [6], 4: [], 5: [], 6: [], 7: []} From 4df82365b8c06c99ef4d709005a0f78d6c9d7a56 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 19:27:44 -0600 Subject: [PATCH 104/214] fixing typo again --- utils/tests/test_linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py index e964dade..3695a399 100644 --- a/utils/tests/test_linkage.py +++ b/utils/tests/test_linkage.py @@ -101,7 +101,7 @@ def row_match_scen1(): def test_row_matches(row_match_scen1): res = row_matches( - test_df2, np.array([0.8, 0.2]), 0.9, calculate_string_similarity + row_match_scen1, np.array([0.8, 0.2]), 0.9, calculate_string_similarity ) assert res == {0: [2], 1: [], 2: [], 3: [6], 4: [], 5: [], 6: [], 7: []} From 7aab13e0245dd1cbaaf162a93d09b6863813f10e Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 19:39:47 -0600 Subject: [PATCH 105/214] added match_confidence function --- utils/linkage.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/utils/linkage.py b/utils/linkage.py index dd045753..d259c989 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -8,6 +8,7 @@ import pandas as pd import textdistance as td import usaddress +import math from utils.constants import COMPANY_TYPES, repo_root @@ -194,6 +195,52 @@ def row_matches( return index_dict +def match_confidence( + confidences: np.array(float), weights: np.array(float), weights_toggle: bool +) -> float: + """Combine confidences for row matches into a final confidence + + This is a weighted log-odds based combination of row match confidences + originating from various record linkage methods. Weights will be applied + to the linkage methods in order and must be of the same length. + + weights_toggle allows one to turn weights on and off when calling the + function. False cancels the use of weights. + + Since log-odds have undesirable behaviors at 0 and 1, we truncate at + +-5, which corresponds to around half a percent probability or + 1 - the same. + >>> match_confidence(np.array([.6, .9, .0001]), np.array([2,5.7,8]), True) + 2.627759082143462e-12 + >>> match_confidence(np.array([.6, .9, .0001]), np.array([2,5.7,8]), False) + 0.08337802853594725 + """ + + if (min(confidences) < 0) or (max(confidences) > 1): + raise ValueError("Probabilities must be bounded on [0, 1]") + + log_odds = [] + + for c in confidences: + l_o = np.log(c / (1 - c)) + + if l_o > 5: + l_o = 5 + + elif l_o < -5: + l_o = -5 + + log_odds.append(l_o) + + if weights_toggle: + log_odds = log_odds * weights + + l_o_sum = np.sum(log_odds) + + conf_sum = math.e ** (l_o_sum) / (1 + math.e ** (l_o_sum)) + return conf_sum + + def determine_comma_role(name: str) -> str: """Given a string (someone's name), attempts to determine the role of the comma in the name and where it ought to belong. From 8796fa65416d2fdd5075f27373c54147389d7f9c Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 19:41:52 -0600 Subject: [PATCH 106/214] fixing linter --- utils/linkage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index d259c989..e4b0387d 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,6 +1,7 @@ """ Module for performing record linkage on state campaign finance dataset """ +import math import os.path import re @@ -8,7 +9,6 @@ import pandas as pd import textdistance as td import usaddress -import math from utils.constants import COMPANY_TYPES, repo_root @@ -199,7 +199,7 @@ def match_confidence( confidences: np.array(float), weights: np.array(float), weights_toggle: bool ) -> float: """Combine confidences for row matches into a final confidence - + This is a weighted log-odds based combination of row match confidences originating from various record linkage methods. Weights will be applied to the linkage methods in order and must be of the same length. From f932563205e4428e1b005a8f4aa90ffebec00dad Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 19:53:26 -0600 Subject: [PATCH 107/214] removed duplicate test --- utils/linkage.py | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index e4b0387d..98844822 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -109,29 +109,6 @@ def calculate_row_similarity( exists as to provide basic functionality. Once we have the comparison function locked in, using .apply will likely be easier and more efficient. - - >>> d = { - ... 'name': ["bob von rosevich", "anantarya smith","bob j vonrosevich"], - ... 'address': ["3 Blue Drive, Chicago", "4 Blue Drive, Chicago", - ... "8 Fancy Way, Chicago"] - ... } - >>> df = pd.DataFrame(data=d) - >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], - ... np.array([.8, .2]), - ... calculate_string_similarity) - >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], - ... np.array([.8, .2]), - ... calculate_string_similarity) - >>> right > wrong - True - >>> wrong = calculate_row_similarity(df.iloc[[0]], df.iloc[[1]], - ... np.array([.2, .8]), - ... calculate_string_similarity) - >>> right = calculate_row_similarity(df.iloc[[0]], df.iloc[[2]], - ... np.array([.2, .8]), - ... calculate_string_similarity) - >>> right > wrong - False """ row_length = len(weights) From ce540957f2083ac4c3db5afd458f4ad8f3391d25 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 20:29:34 -0600 Subject: [PATCH 108/214] updating classifier --- utils/classify.py | 63 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index cfd629c0..86e671ca 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -1,7 +1,5 @@ import pandas as pd -from utils.linkage import calculate_string_similarity - # we want to run down a list of people and, hopefully, their adresses, plus a list of # corporations, groups, etc, and classify them, basically just looking for matches @@ -16,17 +14,62 @@ # a list of individual names -def similarity_calculator(df: pd.DataFrame, suspect): - """Run through a pandas dataframe column and compare elements to a constant""" - # this needs to output somehting useful +def similarity_calculator( + df: pd.DataFrame, subject: str, n: int, comparison_func +) -> pd.DataFrame: + """Find best matches to a subject name in a pandas dataframe + + For a given individual or organization, the subject, we search through the + 'name'column of a dataframe, select the n highest matches according to a + selected comparison function, and return those as a dataframe. This is meant + to be used manually to search for matches. For quick automated processing, see + automated_classifier(). + + Note that the comparison function must take in two inputs, both strings, and + output a percentage match + """ + + similarities_df = df.copy() - similarities = df["column1"].apply( - lambda x: calculate_string_similarity(x, suspect) + similarities = similarities_df["name"].apply( + lambda x: comparison_func(x, subject) ) - return similarities - # very psuedocode - # get top n, maybe just ten, and output + similarities_df["similarities"] = similarities + + top_n_matches = similarities_df.sort_values( + by=["similarities"], ascending=False + )[0:n] + + return top_n_matches + + +def automated_classifier( + df: pd.DataFrame, subjects_dict: dict, threshold: float, comparison_func +): + """Using similarity_calculator, classify entities automatically + + Feeding a dictionary of names and the associated statuses, we compare + the string matches and, if they exceed a certain threshold, classify + them as belonging to some group specified in the subjects dictionary. + """ + + similarities_df = df.copy() + + for subject in subjects_dict: + similarities = similarities_df["name"].apply( + lambda x, sub=subject: comparison_func(x, sub) + + ) + matches = similarities >= threshold + + status = subjects_dict[subject] + + similarities_df["classification"] = pd.Series(matches).apply( + lambda x, stat=status: stat if x else "neutral" + ) + + return similarities_df # we can use the indices and/or select manually, just add a new # column to the subjects table From ff02e3deb0875ea1e517792dad7c63d7a8fdb2d1 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Sun, 18 Feb 2024 20:31:12 -0600 Subject: [PATCH 109/214] fixing linter --- utils/classify.py | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/classify.py b/utils/classify.py index 86e671ca..db574ace 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -59,7 +59,6 @@ def automated_classifier( for subject in subjects_dict: similarities = similarities_df["name"].apply( lambda x, sub=subject: comparison_func(x, sub) - ) matches = similarities >= threshold From 4e353273bd7535d96dec2d932d3b769baff8cc52 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 19 Feb 2024 15:46:27 +0000 Subject: [PATCH 110/214] slight formatting changes --- utils/linkage.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 2e1f9c97..88108775 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -2,7 +2,6 @@ import usaddress from names_dataset import NameDataset - """ Module for performing record linkage on state campaign finance dataset """ @@ -10,8 +9,6 @@ import re import pandas as pd -import textdistance as td -import usaddress from utils.constants import COMPANY_TYPES, repo_root @@ -278,7 +275,6 @@ def get_street_from_address_line_1(address_line_1: str) -> str: return " ".join(string) - def name_rank(first_name: str, last_name: str) -> list: """Returns a score for the rank of a given first name and last name https://github.com/philipperemy/name-dataset @@ -300,10 +296,10 @@ def name_rank(first_name: str, last_name: str) -> list: >>> name_rank(None, 9) [None, None] """ - + # Initialize the NameDataset class nd = NameDataset() - + first_name_rank = 0 last_name_rank = 0 if isinstance(first_name, str): @@ -325,7 +321,8 @@ def name_rank(first_name: str, last_name: str) -> list: else: last_name_rank = None return [first_name_rank, last_name_rank] -======= + + def convert_duplicates_to_dict(df: pd.DataFrame) -> None: """Saves to the "output" directory a file where each row represents a string matching to another string From c3c8defec982adfea07ebba96b735f6cfd5ec29e Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 19 Feb 2024 16:09:46 +0000 Subject: [PATCH 111/214] preprocess file and function initial commit --- utils/preprocess.py | 81 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 utils/preprocess.py diff --git a/utils/preprocess.py b/utils/preprocess.py new file mode 100644 index 00000000..2831996a --- /dev/null +++ b/utils/preprocess.py @@ -0,0 +1,81 @@ +from typing import Tuple + +import pandas as pd +from nameparser import HumanName + +from utils.linkage import ( + cleaning_company_column, + get_address_line_1_from_full_address, + get_address_number_from_address_line_1, + get_street_from_address_line_1, + standardize_corp_names, +) + + +def preprocess_pipeline( + individuals: pd.DataFrame, + organizations: pd.DataFrame, + transactions: pd.DataFrame, +) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: + """ + Preprocesses data for record linkage + + Args: + Individuals: dataframe of individual contributions + Organizations: dataframe of organization contributions + Transactions: dataframe of transactions + Returns: + preprocessed tuple of dataframes + first element is the individuals dataframe, + second element is the organizations dataframe, + third element is the transactions dataframe + """ + # Preprocess organizations dataframe + organizations["name"] = ( + organizations["name"].astype(str, skipna=True).apply(standardize_corp_names) + ) + + # Preprocess individuals dataframe + if "Unnamed: 0" in individuals.columns: + individuals.drop(columns="Unnamed: 0", inplace=True) + + individuals = individuals.astype( + {"first_name": str, "last_name": str, "full_name": str, "company": str} + ) + + # Standardize company names in individuals dataframe + individuals["company"] = individuals["company"].apply(standardize_corp_names) + individuals["company"] = individuals["company"].apply(cleaning_company_column) + + # Address functions, assuming address column is named 'address' + individuals["Address Line 1"] = individuals["Address"].apply( + get_address_line_1_from_full_address + ) + individuals["Street Name"] = individuals["Address Line 1"].apply( + get_street_from_address_line_1 + ) + individuals["Address Number"] = individuals["Address Line 1"].apply( + get_address_number_from_address_line_1 + ) + + # Check if first name or last names are empty, if so, extract from full name column + individuals["full_name"] = individuals["full_name"].astype(str)[ + individuals["full_name"].notnull() + ] + if individuals["first_name"].isnull().any(): + name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) + first_name = name.apply(lambda x: x["first"]) + individuals["first_name"] = first_name + + if individuals["last_name"].isnull().any(): + name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) + last_name = name.apply(lambda x: x["last"]) + individuals["last_name"] = last_name + + # Transactions + if "Unnamed: 0" in transactions.columns: + transactions.drop(columns="Unnamed: 0", inplace=True) + + transactions["purpose"] = transactions["purpose"].str.upper() + + return individuals, organizations, transactions From 97e78ae3a7de8ba91cf70f5b9f8a5325f49b86af Mon Sep 17 00:00:00 2001 From: Avery Date: Mon, 19 Feb 2024 10:16:52 -0600 Subject: [PATCH 112/214] update readme --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index c50d0115..498c0999 100644 --- a/README.md +++ b/README.md @@ -43,8 +43,6 @@ If you prefer to develop inside a container with VS Code then do the following s 5. running ```pipeline.py``` returns the tables to the output folder as csv files containing the complete individuals, organizations, and transactions DataFrames combining the AZ, MI, MN, and PA datasets. 6. For future reference, the above pipeline also stores the information mapping given id to our database id (generated via uuid) in a csv file in the format of (state)IDMap.csv (example: ArizonaIDMap.csv) in the output folder -## Team Members - ## Repository Structure ### utils From 71cbb37694c7f972a50c8ac96a80562237b08103 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 19 Feb 2024 10:17:44 -0600 Subject: [PATCH 113/214] adding tests to appropriate winter repo --- tests/test_dedup.py | 57 +++++++++++++++++++++++++++------------------ utils/linkage.py | 4 +++- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/tests/test_dedup.py b/tests/test_dedup.py index 86533450..04e21bce 100644 --- a/tests/test_dedup.py +++ b/tests/test_dedup.py @@ -1,28 +1,39 @@ import pandas as pd +import pytest from utils.constants import BASE_FILEPATH from utils.linkage import deduplicate_perfect_matches -# inds_sample = pd.read_csv( -# BASE_FILEPATH / "output" / "complete_individuals_table.csv", -# low_memory=False, -# ) -orgs_sample = pd.read_csv( - BASE_FILEPATH / "output" / "complete_organizations_table.csv" -) - -# deduplicated_inds = deduplicate_perfect_matches(inds_sample) -deduplicated_orgs = deduplicate_perfect_matches(orgs_sample) - -output_dedup_ids = pd.read_csv( - BASE_FILEPATH / "output" / "deduplicated_UUIDs.csv" -) -# outpud_ids should have all the ids that deduplicated_inds and deduplicated_orgs -# has - -# dedup_inds_id = set(deduplicated_inds.id.tolist()) -dedup_orgs_id = set(deduplicated_orgs.id.tolist()) -unique_ids = set(output_dedup_ids.duplicated_uuids.tolist()) - -# assert dedup_inds_id.issubset(unique_ids) -assert dedup_orgs_id.issubset(unique_ids) +@pytest.fixture +def return_data(filename): + path = BASE_FILEPATH / "output" / filename + df = pd.read_csv(path, low_memory=False ) + return df + +@pytest.fixture +def call_dedup_func(): + inds_sample = return_data("complete_individuals_table.csv") + orgs_sample = return_data("complete_organizations_table.csv") + + assert not orgs_sample.empty() + assert not inds_sample.empty() + + deduplicated_inds = deduplicate_perfect_matches(inds_sample) + deduplicated_orgs = deduplicate_perfect_matches(orgs_sample) + + output_dedup_ids = return_data("deduplicated_UUIDs.csv") + # outpud_ids should have all the ids that deduplicated_inds and deduplicated_orgs + # has + + return deduplicated_inds, deduplicated_orgs, output_dedup_ids + +@pytest.fixture +def confirm_dedup_uuids(): + inds, orgs, output = call_dedup_func() + + dedup_inds_id = set(inds.id.tolist()) + dedup_orgs_id = set(orgs.id.tolist()) + unique_ids = set(output.duplicated_uuids.tolist()) + + assert dedup_inds_id.issubset(unique_ids) + assert dedup_orgs_id.issubset(unique_ids) \ No newline at end of file diff --git a/utils/linkage.py b/utils/linkage.py index ee8dcd60..97ec7ab4 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -327,7 +327,9 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: # now find the duplicates along all columns but the ID new_df = ( - new_df.groupby(df.columns[1:].tolist(), dropna=False)["id"] + new_df.groupby(df.columns.difference(["id"]).tolist(), dropna=False)[ + "id" + ] .agg(list) .reset_index() .rename(columns={"id": "duplicated"}) From cccc7cc2665793e4777974b6464d29e9b594feb5 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 19 Feb 2024 16:21:54 +0000 Subject: [PATCH 114/214] slight edits --- utils/preprocess.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/utils/preprocess.py b/utils/preprocess.py index 2831996a..55a99810 100644 --- a/utils/preprocess.py +++ b/utils/preprocess.py @@ -32,7 +32,9 @@ def preprocess_pipeline( """ # Preprocess organizations dataframe organizations["name"] = ( - organizations["name"].astype(str, skipna=True).apply(standardize_corp_names) + organizations["name"] + .astype(str, skipna=True) + .apply(standardize_corp_names) ) # Preprocess individuals dataframe @@ -44,8 +46,12 @@ def preprocess_pipeline( ) # Standardize company names in individuals dataframe - individuals["company"] = individuals["company"].apply(standardize_corp_names) - individuals["company"] = individuals["company"].apply(cleaning_company_column) + individuals["company"] = individuals["company"].apply( + standardize_corp_names + ) + individuals["company"] = individuals["company"].apply( + cleaning_company_column + ) # Address functions, assuming address column is named 'address' individuals["Address Line 1"] = individuals["Address"].apply( @@ -63,12 +69,20 @@ def preprocess_pipeline( individuals["full_name"].notnull() ] if individuals["first_name"].isnull().any(): - name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) + name = ( + individuals["full_name"] + .apply(HumanName) + .apply(lambda x: x.as_dict()) + ) first_name = name.apply(lambda x: x["first"]) individuals["first_name"] = first_name if individuals["last_name"].isnull().any(): - name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) + name = ( + individuals["full_name"] + .apply(HumanName) + .apply(lambda x: x.as_dict()) + ) last_name = name.apply(lambda x: x["last"]) individuals["last_name"] = last_name From 25eaf606604b4499b8b1c18d07e2b79ad0ddfeb2 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 19 Feb 2024 10:22:23 -0600 Subject: [PATCH 115/214] fixing linter errors --- tests/test_dedup.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/test_dedup.py b/tests/test_dedup.py index 04e21bce..f1c01690 100644 --- a/tests/test_dedup.py +++ b/tests/test_dedup.py @@ -4,20 +4,22 @@ from utils.constants import BASE_FILEPATH from utils.linkage import deduplicate_perfect_matches + @pytest.fixture def return_data(filename): path = BASE_FILEPATH / "output" / filename - df = pd.read_csv(path, low_memory=False ) + df = pd.read_csv(path, low_memory=False) return df + @pytest.fixture def call_dedup_func(): inds_sample = return_data("complete_individuals_table.csv") orgs_sample = return_data("complete_organizations_table.csv") - + assert not orgs_sample.empty() assert not inds_sample.empty() - + deduplicated_inds = deduplicate_perfect_matches(inds_sample) deduplicated_orgs = deduplicate_perfect_matches(orgs_sample) @@ -27,6 +29,7 @@ def call_dedup_func(): return deduplicated_inds, deduplicated_orgs, output_dedup_ids + @pytest.fixture def confirm_dedup_uuids(): inds, orgs, output = call_dedup_func() @@ -36,4 +39,4 @@ def confirm_dedup_uuids(): unique_ids = set(output.duplicated_uuids.tolist()) assert dedup_inds_id.issubset(unique_ids) - assert dedup_orgs_id.issubset(unique_ids) \ No newline at end of file + assert dedup_orgs_id.issubset(unique_ids) From 57c6070bb8c85743a5ebb5b2584db5427b32a35a Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 19 Feb 2024 16:23:12 +0000 Subject: [PATCH 116/214] removing preprocess function from linkage.py --- utils/linkage.py | 84 ------------------------------------------------ 1 file changed, 84 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 97b0ad6e..2c80939a 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,10 +1,7 @@ import re -from typing import Tuple -import pandas as pd import textdistance as td import usaddress -from nameparser import HumanName from utils.constants import COMPANY_TYPES @@ -257,84 +254,3 @@ def cleaning_company_column(company_entry: str) -> str: else: return company_edited - - -def preprocess_pipeline( - individuals: pd.DataFrame, - Address: str, - organizations: pd.DataFrame, - transactions: pd.DataFrame, -) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: - """ - Preprocesses data for record linkage - - Args: - Individuals: dataframe of individual contributions - Address: column name of address - Organizations: dataframe of organization contributions - Transactions: dataframe of transactions - Returns: - preprocessed tuple of dataframes - first element is the individuals dataframe, - second element is the organizations dataframe, - third element is the transactions dataframe - """ - # Preprocess organizations dataframe - organizations["name"] = ( - organizations["name"].astype(str).apply(standardize_corp_names) - ) - - # Preprocess individuals dataframe - if "Unnamed: 0" in individuals.columns: - individuals.drop(columns="Unnamed: 0", inplace=True) - - individuals = individuals.astype( - {"first_name": str, "last_name": str, "full_name": str, "company": str} - ) - - # Standardize company names in individuals dataframe - individuals["company"] = individuals["company"].apply( - standardize_corp_names - ) - individuals["company"] = individuals["company"].apply( - cleaning_company_column - ) - - # Address functions, assuming address column is named 'address' - individuals["Address Line 1"] = individuals[Address].apply( - get_address_line_1_from_full_address - ) - individuals["Street Name"] = individuals["Address Line 1"].apply( - get_street_from_address_line_1 - ) - individuals["Address Number"] = individuals["Address Line 1"].apply( - get_address_number_from_address_line_1 - ) - - # Check if first name or last names are empty, if so, extract from full name column - individuals["full_name"] = individuals["full_name"].astype(str) - if individuals["first_name"].isnull().any(): - name = ( - individuals["full_name"] - .apply(HumanName) - .apply(lambda x: x.as_dict()) - ) - first_name = name.apply(lambda x: x["first"]) - individuals["first_name"] = first_name - - if individuals["last_name"].isnull().any(): - name = ( - individuals["full_name"] - .apply(HumanName) - .apply(lambda x: x.as_dict()) - ) - last_name = name.apply(lambda x: x["last"]) - individuals["last_name"] = last_name - - # Transactions - if "Unnamed: 0" in transactions.columns: - transactions.drop(columns="Unnamed: 0", inplace=True) - - transactions["purpose"] = transactions["purpose"].str.upper() - - return individuals, organizations, transactions From 277663672fcd1faf2cee83f51096d39e71dedbbe Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 19 Feb 2024 16:24:17 +0000 Subject: [PATCH 117/214] slight changes --- utils/preprocess.py | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/utils/preprocess.py b/utils/preprocess.py index 55a99810..f3755eec 100644 --- a/utils/preprocess.py +++ b/utils/preprocess.py @@ -32,9 +32,7 @@ def preprocess_pipeline( """ # Preprocess organizations dataframe organizations["name"] = ( - organizations["name"] - .astype(str, skipna=True) - .apply(standardize_corp_names) + organizations["name"].astype(str, skipna=True).apply(standardize_corp_names) ) # Preprocess individuals dataframe @@ -46,14 +44,10 @@ def preprocess_pipeline( ) # Standardize company names in individuals dataframe - individuals["company"] = individuals["company"].apply( - standardize_corp_names - ) - individuals["company"] = individuals["company"].apply( - cleaning_company_column - ) + individuals["company"] = individuals["company"].apply(standardize_corp_names) + individuals["company"] = individuals["company"].apply(cleaning_company_column) - # Address functions, assuming address column is named 'address' + # Address functions, assuming address column is named 'Address' individuals["Address Line 1"] = individuals["Address"].apply( get_address_line_1_from_full_address ) @@ -69,20 +63,12 @@ def preprocess_pipeline( individuals["full_name"].notnull() ] if individuals["first_name"].isnull().any(): - name = ( - individuals["full_name"] - .apply(HumanName) - .apply(lambda x: x.as_dict()) - ) + name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) first_name = name.apply(lambda x: x["first"]) individuals["first_name"] = first_name if individuals["last_name"].isnull().any(): - name = ( - individuals["full_name"] - .apply(HumanName) - .apply(lambda x: x.as_dict()) - ) + name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) last_name = name.apply(lambda x: x["last"]) individuals["last_name"] = last_name From d3df75b9141b0ae432ffe5713725f768b2924fc1 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 19 Feb 2024 10:32:31 -0600 Subject: [PATCH 118/214] changing branches, no need to review --- tests/test_dedup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_dedup.py b/tests/test_dedup.py index f1c01690..4660d775 100644 --- a/tests/test_dedup.py +++ b/tests/test_dedup.py @@ -3,7 +3,7 @@ from utils.constants import BASE_FILEPATH from utils.linkage import deduplicate_perfect_matches - +print(BASE_FILEPATH) @pytest.fixture def return_data(filename): From 531453c1c91074f9307ee8f5228570a8ecd1e82f Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 19 Feb 2024 10:32:51 -0600 Subject: [PATCH 119/214] changing branches, no need to review --- tests/tester.ipynb | 203 +++++++++++++++++++++++---------------------- 1 file changed, 104 insertions(+), 99 deletions(-) diff --git a/tests/tester.ipynb b/tests/tester.ipynb index 7bbdc9dd..ec7a5de6 100644 --- a/tests/tester.ipynb +++ b/tests/tester.ipynb @@ -2,18 +2,18 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "from utils.linkage import deduplicate_perfect_matches, convert_duplicates_to_dict\n", + "from utils.linkage import deduplicate_perfect_matches\n", "from utils.constants import BASE_FILEPATH\n", "import pandas as pd" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -49,108 +49,94 @@ " \n", " \n", " \n", - " 724734\n", - " c87d5ea3-0000-4cae-ab4c-febce5b17fc2\n", - " KIRSTIN\n", - " BRODERICK\n", - " KIRSTIN BRODERICK ...\n", - " Individual\n", - " NY\n", + " 0\n", + " 1869727\n", + " NaN\n", + " NaN\n", + " william \bstoner\n", + " individual\n", + " NaN\n", " NaN\n", " NaN\n", " \n", " \n", - " 1187237\n", - " 9af092ab-9e88-456f-9a27-5fa561d615eb\n", - " SARAH\n", - " LEVINE\n", - " SARAH LEVINE ...\n", - " Individual\n", - " NY\n", + " 1\n", + " 1779679\n", + " NaN\n", + " NaN\n", + " rm coulon\n", + " individual\n", " NaN\n", " NaN\n", + " area agency on aging\n", " \n", " \n", - " 320448\n", - " 89078c2f-964a-4044-a760-c0ea28e71c6e\n", - " DUSTIN\n", - " DEMLOW\n", - " DUSTIN DEMLOW ...\n", - " Individual\n", - " MI\n", + " 2\n", + " 2277221\n", + " NaN\n", " NaN\n", + " james engelson\n", + " individual\n", " NaN\n", + " NaN\n", + " retired\n", " \n", " \n", - " 238953\n", - " e9b9112d-7927-4cc1-b316-0beb55e9c47a\n", - " BRIAN\n", - " BARBAS\n", - " BRIAN BARBAS ...\n", - " Individual\n", - " IL\n", + " 3\n", + " 2277156\n", + " NaN\n", " NaN\n", + " marivic franciaskinner\n", + " individual\n", " NaN\n", + " NaN\n", + " fibre source international corp\n", " \n", " \n", - " 38632\n", - " a22c70ab-464c-4d89-a473-7c97931e0155\n", - " SUSAN MASSARO\n", - " MCFARLAND\n", - " SUSAN MASSARO MCFARLAND ...\n", - " Individual\n", - " MI\n", + " 4\n", + " 2341373\n", " NaN\n", " NaN\n", + " anthony grindle\n", + " individual\n", + " NaN\n", + " NaN\n", + " zimmerbiomet\n", " \n", " \n", "\n", "" ], "text/plain": [ - " id first_name \\\n", - "724734 c87d5ea3-0000-4cae-ab4c-febce5b17fc2 KIRSTIN \n", - "1187237 9af092ab-9e88-456f-9a27-5fa561d615eb SARAH \n", - "320448 89078c2f-964a-4044-a760-c0ea28e71c6e DUSTIN \n", - "238953 e9b9112d-7927-4cc1-b316-0beb55e9c47a BRIAN \n", - "38632 a22c70ab-464c-4d89-a473-7c97931e0155 SUSAN MASSARO \n", - "\n", - " last_name \\\n", - "724734 BRODERICK \n", - "1187237 LEVINE \n", - "320448 DEMLOW \n", - "238953 BARBAS \n", - "38632 MCFARLAND \n", + " id first_name last_name full_name entity_type state \\\n", + "0 1869727 NaN NaN william \bstoner individual NaN \n", + "1 1779679 NaN NaN rm coulon individual NaN \n", + "2 2277221 NaN NaN james engelson individual NaN \n", + "3 2277156 NaN NaN marivic franciaskinner individual NaN \n", + "4 2341373 NaN NaN anthony grindle individual NaN \n", "\n", - " full_name entity_type state \\\n", - "724734 KIRSTIN BRODERICK ... Individual NY \n", - "1187237 SARAH LEVINE ... Individual NY \n", - "320448 DUSTIN DEMLOW ... Individual MI \n", - "238953 BRIAN BARBAS ... Individual IL \n", - "38632 SUSAN MASSARO MCFARLAND ... Individual MI \n", - "\n", - " party company \n", - "724734 NaN NaN \n", - "1187237 NaN NaN \n", - "320448 NaN NaN \n", - "238953 NaN NaN \n", - "38632 NaN NaN " + " party company \n", + "0 NaN NaN \n", + "1 NaN area agency on aging \n", + "2 NaN retired \n", + "3 NaN fibre source international corp \n", + "4 NaN zimmerbiomet " ] }, - "execution_count": 6, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "inds_sample = pd.read_csv(BASE_FILEPATH / \"output\" / \"complete_individuals_table.csv\", index_col=0, low_memory=False).sample(10000)\n", - "orgs_sample = pd.read_csv(BASE_FILEPATH / \"output\" / \"complete_organizations_table.csv\", index_col=0).sample(10000)\n", + "inds_sample = pd.read_csv(BASE_FILEPATH / \"output\" / \"complete_individuals_table.csv\", index_col=0, low_memory=False)\n", + "orgs_sample = pd.read_csv(BASE_FILEPATH / \"output\" / \"complete_organizations_table.csv\", index_col=0)\n", "inds_sample.head(5)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -160,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -191,28 +177,28 @@ " \n", " \n", " 0\n", - " 28557e06-b13b-46e1-ab44-768bd8b4ff16\n", - " 28557e06-b13b-46e1-ab44-768bd8b4ff16\n", + " af6dd8b5-21d4-4ab3-b0e9-b6e617e4837b\n", + " af6dd8b5-21d4-4ab3-b0e9-b6e617e4837b\n", " \n", " \n", " 1\n", - " 66978565-4c37-432e-9c61-bb0ca1254850\n", - " 66978565-4c37-432e-9c61-bb0ca1254850\n", + " d2ed5639-be25-40aa-bfbc-7b8bb3bba62a\n", + " d2ed5639-be25-40aa-bfbc-7b8bb3bba62a\n", " \n", " \n", " 2\n", - " 51ca5ecb-6c20-4380-8562-36048ca72f46\n", - " 51ca5ecb-6c20-4380-8562-36048ca72f46\n", + " 054e4f1d-aec7-4188-968d-4429748f2fe6\n", + " 054e4f1d-aec7-4188-968d-4429748f2fe6\n", " \n", " \n", " 3\n", - " 735f45fd-4859-4285-a63c-29399250d20e\n", - " 735f45fd-4859-4285-a63c-29399250d20e\n", + " c0a31a0d-fc53-42e5-9dfc-23dfbf8c3b74\n", + " c0a31a0d-fc53-42e5-9dfc-23dfbf8c3b74\n", " \n", " \n", " 4\n", - " 5130157e-1c68-4529-9638-d5727e8feb07\n", - " 5130157e-1c68-4529-9638-d5727e8feb07\n", + " 81125483-336e-4d48-9f4b-5708e91c3835\n", + " 81125483-336e-4d48-9f4b-5708e91c3835\n", " \n", " \n", "\n", @@ -220,14 +206,14 @@ ], "text/plain": [ " duplicated_uuids mapped_uuids\n", - "0 28557e06-b13b-46e1-ab44-768bd8b4ff16 28557e06-b13b-46e1-ab44-768bd8b4ff16\n", - "1 66978565-4c37-432e-9c61-bb0ca1254850 66978565-4c37-432e-9c61-bb0ca1254850\n", - "2 51ca5ecb-6c20-4380-8562-36048ca72f46 51ca5ecb-6c20-4380-8562-36048ca72f46\n", - "3 735f45fd-4859-4285-a63c-29399250d20e 735f45fd-4859-4285-a63c-29399250d20e\n", - "4 5130157e-1c68-4529-9638-d5727e8feb07 5130157e-1c68-4529-9638-d5727e8feb07" + "0 af6dd8b5-21d4-4ab3-b0e9-b6e617e4837b af6dd8b5-21d4-4ab3-b0e9-b6e617e4837b\n", + "1 d2ed5639-be25-40aa-bfbc-7b8bb3bba62a d2ed5639-be25-40aa-bfbc-7b8bb3bba62a\n", + "2 054e4f1d-aec7-4188-968d-4429748f2fe6 054e4f1d-aec7-4188-968d-4429748f2fe6\n", + "3 c0a31a0d-fc53-42e5-9dfc-23dfbf8c3b74 c0a31a0d-fc53-42e5-9dfc-23dfbf8c3b74\n", + "4 81125483-336e-4d48-9f4b-5708e91c3835 81125483-336e-4d48-9f4b-5708e91c3835" ] }, - "execution_count": 9, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -239,27 +225,46 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 5, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Yes\n", - "Yes\n" - ] + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "dedup_inds_id = deduplicated_inds.id.tolist()\n", - "dedup_orgs_id = deduplicated_orgs.id.tolist()\n", - "test_ids = test.duplicated_uuids.tolist()\n", + "dedup_inds_id = set(deduplicated_inds.id.tolist())\n", + "dedup_orgs_id = set(deduplicated_orgs.id.tolist())\n", + "test_ids = set(test.duplicated_uuids.tolist())\n", "\n", - "if all(x in test_ids for x in dedup_inds_id):\n", - " print(\"Yes\")\n", - "if all(x in test_ids for x in dedup_orgs_id):\n", - " print(\"Yes\")" + "dedup_orgs_id.issubset(test_ids)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(612181, 526145)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(deduplicated_inds.id.tolist()), len(dedup_inds_id)" ] }, { From 75082e479222ef425f7550b8facf994af7dff3ce Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 19 Feb 2024 13:17:57 -0600 Subject: [PATCH 120/214] finishing up with dedup func --- tests/test_dedup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_dedup.py b/tests/test_dedup.py index 4660d775..f1c01690 100644 --- a/tests/test_dedup.py +++ b/tests/test_dedup.py @@ -3,7 +3,7 @@ from utils.constants import BASE_FILEPATH from utils.linkage import deduplicate_perfect_matches -print(BASE_FILEPATH) + @pytest.fixture def return_data(filename): From 1ea09b4034a687c458dad3d5cbe573c24b8bf59b Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 19 Feb 2024 13:50:39 -0600 Subject: [PATCH 121/214] Renaming File --- utils/{preprocess.py => linkage_pipeline.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename utils/{preprocess.py => linkage_pipeline.py} (100%) diff --git a/utils/preprocess.py b/utils/linkage_pipeline.py similarity index 100% rename from utils/preprocess.py rename to utils/linkage_pipeline.py From 6d5cee8de0c8b63e5937101f98efcfb2f5a4815a Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 19 Feb 2024 16:21:12 -0600 Subject: [PATCH 122/214] update on function to add nodes and their attributes to graph --- utils/linkage.py | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index cae5024d..9138c2a2 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,14 +1,15 @@ -import textdistance as td -import usaddress -from names_dataset import NameDataset - """ Module for performing record linkage on state campaign finance dataset + """ + +import textdistance as td +import usaddress +from names_dataset import NameDataset import math import os.path import re - +import networkx as nx import numpy as np import pandas as pd @@ -633,3 +634,27 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: elif address_line_1_components[i][1] == "USPSBoxID": return address_line_1_components[i][0] raise ValueError("Can not find Address Number") + +def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph : + ''' Takes in a dataframe and generates a MultiDiGraph where the nodes are + entity names, and the rest of the dataframe columns make the node attributes + + Args: + df: a pandas dataframe (complete_individuals_table / + complete_organizations_table) + + Returns: + A Networkx MultiDiGraph with nodes lacking any edges + ''' + G = nx.MultiDiGraph() + # first check if df is individuals or organizations dataset + if 'name' in df.columns: + node_name = 'name' + else: node_name = 'full_name' + + for _, row in df.iterrows(): + G.add_node(row[node_name]) + for column in df.columns: + nx.set_node_attributes(G, row[column], name=column) + + return G From e92192bfd75950307ef781c1e298b79a6d0ce8bb Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 19 Feb 2024 17:04:10 -0600 Subject: [PATCH 123/214] checking for issue with linter test --- utils/linkage.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 9138c2a2..14c57f6b 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -3,15 +3,16 @@ """ -import textdistance as td -import usaddress -from names_dataset import NameDataset import math import os.path import re + import networkx as nx import numpy as np import pandas as pd +import textdistance as td +import usaddress +from names_dataset import NameDataset from utils.constants import COMPANY_TYPES, repo_root @@ -635,8 +636,9 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: return address_line_1_components[i][0] raise ValueError("Can not find Address Number") -def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph : - ''' Takes in a dataframe and generates a MultiDiGraph where the nodes are + +def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: + """Takes in a dataframe and generates a MultiDiGraph where the nodes are entity names, and the rest of the dataframe columns make the node attributes Args: @@ -645,16 +647,17 @@ def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph : Returns: A Networkx MultiDiGraph with nodes lacking any edges - ''' + """ G = nx.MultiDiGraph() # first check if df is individuals or organizations dataset - if 'name' in df.columns: - node_name = 'name' - else: node_name = 'full_name' + if "name" in df.columns: + node_name = "name" + else: + node_name = "full_name" for _, row in df.iterrows(): G.add_node(row[node_name]) for column in df.columns: nx.set_node_attributes(G, row[column], name=column) - + return G From 6e043449b83e9fcd9520f08227f39c018d6f3c09 Mon Sep 17 00:00:00 2001 From: Avery Schoen <33437601+averyschoen@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:36:47 -0600 Subject: [PATCH 124/214] Delete tests/tester.ipynb --- tests/tester.ipynb | 299 --------------------------------------------- 1 file changed, 299 deletions(-) delete mode 100644 tests/tester.ipynb diff --git a/tests/tester.ipynb b/tests/tester.ipynb deleted file mode 100644 index ec7a5de6..00000000 --- a/tests/tester.ipynb +++ /dev/null @@ -1,299 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from utils.linkage import deduplicate_perfect_matches\n", - "from utils.constants import BASE_FILEPATH\n", - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idfirst_namelast_namefull_nameentity_typestatepartycompany
01869727NaNNaNwilliam \bstonerindividualNaNNaNNaN
11779679NaNNaNrm coulonindividualNaNNaNarea agency on aging
22277221NaNNaNjames engelsonindividualNaNNaNretired
32277156NaNNaNmarivic franciaskinnerindividualNaNNaNfibre source international corp
42341373NaNNaNanthony grindleindividualNaNNaNzimmerbiomet
\n", - "
" - ], - "text/plain": [ - " id first_name last_name full_name entity_type state \\\n", - "0 1869727 NaN NaN william \bstoner individual NaN \n", - "1 1779679 NaN NaN rm coulon individual NaN \n", - "2 2277221 NaN NaN james engelson individual NaN \n", - "3 2277156 NaN NaN marivic franciaskinner individual NaN \n", - "4 2341373 NaN NaN anthony grindle individual NaN \n", - "\n", - " party company \n", - "0 NaN NaN \n", - "1 NaN area agency on aging \n", - "2 NaN retired \n", - "3 NaN fibre source international corp \n", - "4 NaN zimmerbiomet " - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "inds_sample = pd.read_csv(BASE_FILEPATH / \"output\" / \"complete_individuals_table.csv\", index_col=0, low_memory=False)\n", - "orgs_sample = pd.read_csv(BASE_FILEPATH / \"output\" / \"complete_organizations_table.csv\", index_col=0)\n", - "inds_sample.head(5)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "deduplicated_inds = deduplicate_perfect_matches(inds_sample)\n", - "deduplicated_orgs = deduplicate_perfect_matches(orgs_sample)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
duplicated_uuidsmapped_uuids
0af6dd8b5-21d4-4ab3-b0e9-b6e617e4837baf6dd8b5-21d4-4ab3-b0e9-b6e617e4837b
1d2ed5639-be25-40aa-bfbc-7b8bb3bba62ad2ed5639-be25-40aa-bfbc-7b8bb3bba62a
2054e4f1d-aec7-4188-968d-4429748f2fe6054e4f1d-aec7-4188-968d-4429748f2fe6
3c0a31a0d-fc53-42e5-9dfc-23dfbf8c3b74c0a31a0d-fc53-42e5-9dfc-23dfbf8c3b74
481125483-336e-4d48-9f4b-5708e91c383581125483-336e-4d48-9f4b-5708e91c3835
\n", - "
" - ], - "text/plain": [ - " duplicated_uuids mapped_uuids\n", - "0 af6dd8b5-21d4-4ab3-b0e9-b6e617e4837b af6dd8b5-21d4-4ab3-b0e9-b6e617e4837b\n", - "1 d2ed5639-be25-40aa-bfbc-7b8bb3bba62a d2ed5639-be25-40aa-bfbc-7b8bb3bba62a\n", - "2 054e4f1d-aec7-4188-968d-4429748f2fe6 054e4f1d-aec7-4188-968d-4429748f2fe6\n", - "3 c0a31a0d-fc53-42e5-9dfc-23dfbf8c3b74 c0a31a0d-fc53-42e5-9dfc-23dfbf8c3b74\n", - "4 81125483-336e-4d48-9f4b-5708e91c3835 81125483-336e-4d48-9f4b-5708e91c3835" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test = pd.read_csv(BASE_FILEPATH / \"output\" / \"deduplicated_UUIDs.csv\")\n", - "test.head(5)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dedup_inds_id = set(deduplicated_inds.id.tolist())\n", - "dedup_orgs_id = set(deduplicated_orgs.id.tolist())\n", - "test_ids = set(test.duplicated_uuids.tolist())\n", - "\n", - "dedup_orgs_id.issubset(test_ids)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(612181, 526145)" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(deduplicated_inds.id.tolist()), len(dedup_inds_id)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "climate_cabinet", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 976d2af420317817143f45e6476ef41cbfaf0d43 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Wed, 21 Feb 2024 10:17:31 -0600 Subject: [PATCH 125/214] Saving notebook on networkx --- notebooks/Test.ipynb | 887 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 887 insertions(+) create mode 100644 notebooks/Test.ipynb diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb new file mode 100644 index 00000000..457fb6f0 --- /dev/null +++ b/notebooks/Test.ipynb @@ -0,0 +1,887 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import re\n", + "import networkx as nx\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "orgs_sample = pd.read_csv(\"../output/complete_organizations_table.csv\",index_col=0).sample(10)\n", + "inds_sample = pd.read_csv(\"../output/complete_individuals_table.csv\",index_col=0, low_memory=False).sample(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnamestateentity_typedonationsdonations_toreceiveddonations_from
050c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee503Pabar Pac (Pa Bar Assn)5210MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC
150c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee2969REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...5768MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC
250c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee4592COMMITTEE TO ELECT DR PATRICIA BERNARD4274UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...
362ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee2459REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...2602UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...
462ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee4748MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC4153REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...
\n", + "
" + ], + "text/plain": [ + " id \\\n", + "0 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", + "1 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", + "2 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", + "3 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", + "4 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", + "\n", + " name state entity_type \\\n", + "0 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", + "1 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", + "2 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", + "3 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee \n", + "4 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee \n", + "\n", + " donations donations_to received \\\n", + "0 503 Pabar Pac (Pa Bar Assn) 5210 \n", + "1 2969 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... 5768 \n", + "2 4592 COMMITTEE TO ELECT DR PATRICIA BERNARD 4274 \n", + "3 2459 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... 2602 \n", + "4 4748 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC 4153 \n", + "\n", + " donations_from \n", + "0 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", + "1 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", + "2 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... \n", + "3 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... \n", + "4 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = {'id':['50c7d9a1-b448-46a5-8e2d-cd15b3097360','50c7d9a1-b448-46a5-8e2d-cd15b3097360','50c7d9a1-b448-46a5-8e2d-cd15b3097360',\n", + " '62ea1e9c-ac12-400c-b3dc-519389c0f7d3','62ea1e9c-ac12-400c-b3dc-519389c0f7d3','62ea1e9c-ac12-400c-b3dc-519389c0f7d3',\n", + " 'd31df1ca-714e-4a82-9e88-1892c0451a71','d31df1ca-714e-4a82-9e88-1892c0451a71','62ea1e9c-ac12-400c-b3dc-519389c0f7d3',\n", + " '4db76e6e-f0d5-40eb-82de-6dbcdb562dd7','f71341d7-d27e-47eb-9b66-903af39d6cb5','c875d7de-94be-42f1-b994-dd89b114d51e',\n", + " '910c4d36-b036-469e-aa2a-ea4ff8855a6c','60d454d1-3773-4d88-80e9-132c161da0f0','1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd',\n", + " '1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd','1d2b5bc0-9385-4cd7-ac48-df43b3eca6fe','1d2b5bc0-9385-4cd7-ac48-df43b3eca6ff',\n", + " '1d2b5bc0-9385-4cd7-ac48-df43b3eca6fd'],\n", + " 'name':['REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC','REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC',\n", + " 'REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC','UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB',\n", + " 'UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB','UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB',\n", + " 'COMMITTEE TO ELECT DR PATRICIA BERNARD','COMMITTEE TO ELECT DR PATRICIA BERNARD','UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB',\n", + " 'Ugi Utilities Inc/Ugi Energy Services Llc Pac','Pabar Pac (Pa Bar Assn)','Pa Fraternal Order Of Police Pac','Citizens For Kail',\n", + " 'Paa Pac','MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC','MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC',\n", + " 'MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC','MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC','Paa Pac'],\n", + " 'state':['MI','MI','MI','MI','MI','MI','MI','MI','MI','PA','PA','PA','PA','PA','MI','MI','MI','MI','PA'],\n", + " 'entity_type':['committee','committee','committee','committee','committee','committee','committee','committee','committee',\n", + " 'Organization','Organization','Organization','Organization','Organization','committee','committee','committee','committee','Organization']}\n", + "\n", + "sample_df = pd.DataFrame(data)\n", + "sample_df['donations'] = np.random.randint(100, 6000, sample_df.shape[0])\n", + "sample_df['donations_to'] = np.random.choice(sample_df.name.tolist(), size=len(sample_df))\n", + "sample_df['received'] = np.random.randint(0, 6000, sample_df.shape[0])\n", + "sample_df['donations_from'] = np.random.choice(sample_df.name.tolist(), size=len(sample_df))\n", + "sample_df.head(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Some Considerations to Remember Moving Forward:\n", + "1. The 'get_likely_name' function takes in 3 string inputs. The data is not clean and when there are NaN entries, the function is somehow inputing null values as strings, so a column that has \"Tim\", \"Walz\" and Nan in the first, last, and full name columns, is being combined as \"Tim Walz Nan\". When calling this function account for this possibility" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Playing Around with Graphs\n", + "\n", + "**Some considerations**\n", + "1. What attributes do we want each Node to Have?\n", + "- UUID, Name, Entity Type, Address, {from transactions table: money_donated and money_given}, affilition?\n", + "- Should transaction info also be included? If so, how would we show transaction info to multiple recipients / from multiple donors?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Notes for Graphs\n", + "**Generating Graphs**\n", + "* nx.Graph() → the most simple undirected graph (edges going both ways)\n", + "* nx.DiGraph() → a graph with directed edges\n", + "* nx.MultiGraph() → multiple edges between nodes\n", + "* nx.MultiDiGraph() → the MultiGraph equivalent for directed graphs\n", + "\n", + "**Finding Centrality**\n", + "There are 4 main ways to find the centrality of a node (how important or frequent is a node / how influential are some donors potentially)\n", + "* nx.degree_centrality : based on the assumption that important nodes have many connections\n", + "* nx.closeness_centrality : based on the assumption that important nodes are close to other nodes. It is calculated as the sum of the path lengths from the given node to all other nodes. \n", + "* nx.eigenvector_centrality : assumes that important nodes connect other nodes. Considers the number of shortest paths between 2 nodes .For Graphs with a large number of nodes, the value of betweenness centrality is very high\n", + "* nx.betweeness_centrality : a measure of centrality in a graph based on shortest paths. For every pair of vertices in a connected graph, there exists at least one shortest path between the vertices such that either the number of edges that the path passes through (for unweighted graphs) or the sum of the weights of the edges (for weighted graphs) is minimized. The betweenness centrality for each vertex is the number of these shortest paths that pass through the vertex\n", + "* nx.pagerank : Page Rank Algorithm (developed by Google founders to measure the importance of webpages) assigns a score of importance to each node. Important nodes are those with many inlinks from important pages. It mainly works for Directed Networks\n", + "\n", + "**Finding Connections**\n", + "* nx.find_cliques (undirected graphs): finds the maximum subgraphs based on the number of interconnected nodes\n", + "* nx.k_core : A k-core is a maximal subgraph that contains nodes of degree k or more. Groups clusters meeting the threshold k (can be used as a toggle)\n", + "\n", + "**Sources**\n", + "* https://www.youtube.com/watch?v=VetBkjcm9Go\n", + "* https://www.activestate.com/blog/graph-theory-using-python-introduction-and-implementation/ \n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnamestateentity_type
13516581ec10e00-c7a7-4bcc-861f-cd1ff43bfc04Friends Of Freedom & ConveniencePACommittee
11589606359974e-9e78-409c-b9dd-fe7415304560GRETCHEN WHITMER FOR GOVERNORMIcommittee
4742209e43c101-03ef-4083-ab60-b7fd76dea7b5TUDOR DIXON FOR GOVERNOR INCMIcommittee
257895fb7cb16-912f-4fec-ba37-f201465a5725LNAACK BEVERLEYMIcorporation
4956426359974e-9e78-409c-b9dd-fe7415304560GRETCHEN WHITMER FOR GOVERNORMIcommittee
\n", + "
" + ], + "text/plain": [ + " id \\\n", + "1351658 1ec10e00-c7a7-4bcc-861f-cd1ff43bfc04 \n", + "1158960 6359974e-9e78-409c-b9dd-fe7415304560 \n", + "474220 9e43c101-03ef-4083-ab60-b7fd76dea7b5 \n", + "25789 5fb7cb16-912f-4fec-ba37-f201465a5725 \n", + "495642 6359974e-9e78-409c-b9dd-fe7415304560 \n", + "\n", + " name state entity_type \n", + "1351658 Friends Of Freedom & Convenience PA Committee \n", + "1158960 GRETCHEN WHITMER FOR GOVERNOR MI committee \n", + "474220 TUDOR DIXON FOR GOVERNOR INC MI committee \n", + "25789 LNAACK BEVERLEY MI corporation \n", + "495642 GRETCHEN WHITMER FOR GOVERNOR MI committee " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "orgs_sample.head(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id 1ec10e00-c7a7-4bcc-861f-cd1ff43bfc04\n", + "name Friends Of Freedom & Convenience\n", + "state PA\n", + "entity_type Committee\n", + "Name: 1351658, dtype: object\n", + "id 6359974e-9e78-409c-b9dd-fe7415304560\n", + "name GRETCHEN WHITMER FOR GOVERNOR\n", + "state MI\n", + "entity_type committee\n", + "Name: 1158960, dtype: object\n", + "id 9e43c101-03ef-4083-ab60-b7fd76dea7b5\n", + "name TUDOR DIXON FOR GOVERNOR INC\n", + "state MI\n", + "entity_type committee\n", + "Name: 474220, dtype: object\n", + "id 5fb7cb16-912f-4fec-ba37-f201465a5725\n", + "name LNAACK BEVERLEY \n", + "state MI\n", + "entity_type corporation\n", + "Name: 25789, dtype: object\n", + "id 6359974e-9e78-409c-b9dd-fe7415304560\n", + "name GRETCHEN WHITMER FOR GOVERNOR\n", + "state MI\n", + "entity_type committee\n", + "Name: 495642, dtype: object\n", + "id f1df070b-a91b-4aab-b943-4f80e5c41026\n", + "name MICHIGAN LABORERS POLITICAL LEAGUE\n", + "state MI\n", + "entity_type committee\n", + "Name: 1939825, dtype: object\n", + "id 57fbfb3e-835c-4096-9dc9-1555816aff0d\n", + "name PLUMBERS AND PIPEFITTERS LOCAL 333 PAC\n", + "state MI\n", + "entity_type committee\n", + "Name: 1643401, dtype: object\n", + "id 357e354f-d81b-4eb5-af6e-574afd175672\n", + "name MICHIGAN FARM BUREAU POLITICAL ACTION COMMITTEE\n", + "state MI\n", + "entity_type committee\n", + "Name: 2088505, dtype: object\n", + "id 1a5d85e2-0382-4064-9606-8ee0a2be5ea1\n", + "name ANEDOT INC \n", + "state MI\n", + "entity_type corporation\n", + "Name: 157224, dtype: object\n", + "id 6d8e2e79-72c1-487e-835f-ededfe0aafaa\n", + "name DEMOCRATIC LEGISLATIVE CAMPAIGN COMMITTEE\n", + "state MI\n", + "entity_type committee\n", + "Name: 854930, dtype: object\n" + ] + } + ], + "source": [ + "for index, row in orgs_sample.iterrows():\n", + " print(row)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'color': 'blue', 'size': 2}" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "G = nx.Graph()\n", + "G.add_node(0)\n", + "nx.set_node_attributes(G, \"red\", name=\"color\")\n", + "nx.set_node_attributes(G, 2, name=\"size\")\n", + "G.add_node(1)\n", + "nx.set_node_attributes(G, \"blue\", name='color')\n", + "G.nodes[0]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnamestateentity_type
297930e44b8553-0dff-4a6b-8335-d97849641ff8FRIENDS OF DANA NESSELMIcommittee
9455364f5b8fc4-c871-4774-a436-1622b8e26a44MALLORY MCMORROW FOR MICHIGANMIcommittee
\n", + "
" + ], + "text/plain": [ + " id name \\\n", + "297930 e44b8553-0dff-4a6b-8335-d97849641ff8 FRIENDS OF DANA NESSEL \n", + "945536 4f5b8fc4-c871-4774-a436-1622b8e26a44 MALLORY MCMORROW FOR MICHIGAN \n", + "\n", + " state entity_type \n", + "297930 MI committee \n", + "945536 MI committee " + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + ".head(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idfirst_namelast_namefull_nameentity_typestatepartycompany
891077c94a0491-7ea1-45ce-a155-6153ea74da08BELALAHNERBELA LAHNER ...IndividualMINaNNOT EMPLOYED
617571c38816dd-8a47-4102-97cd-59d0f6bc42dcJANICESHAPIROJANICE SHAPIRO ...IndividualTXNaNNaN
\n", + "
" + ], + "text/plain": [ + " id first_name \\\n", + "891077 c94a0491-7ea1-45ce-a155-6153ea74da08 BELA \n", + "617571 c38816dd-8a47-4102-97cd-59d0f6bc42dc JANICE \n", + "\n", + " last_name \\\n", + "891077 LAHNER \n", + "617571 SHAPIRO \n", + "\n", + " full_name entity_type state \\\n", + "891077 BELA LAHNER ... Individual MI \n", + "617571 JANICE SHAPIRO ... Individual TX \n", + "\n", + " party company \n", + "891077 NaN NOT EMPLOYED \n", + "617571 NaN NaN " + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inds_sample.head(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [], + "source": [ + "def add_notes_from_df(df):\n", + " G = nx.MultiDiGraph()\n", + " if 'name' in df.columns:\n", + " node_name = 'name'\n", + " else: node_name = 'full_name'\n", + " for index, row in df.iterrows():\n", + " # if nodes 1 and 2 don't exist, this both creates the nodes and adds the edges to them\n", + " # the weight can be added to show the magnitude of the edge\n", + " G.add_node(row[node_name])\n", + " for column in df.columns:\n", + " nx.set_node_attributes(G, row[column], name=column)\n", + " nx.draw_random(G, with_labels=True)\n", + " plt.show()\n", + " return G" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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JAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKLIGroDxpSUqZCRW4JylQaWMgk8nW1ha9Uou0pERET00Gs0Ke18VhEUhzORcjYbmXlKaG8rEwC4O9kg2NcVY7q7w9vNrqG6SURERER3ELRarbbmanfPpTwlZicfx/70HEglAtQa092pKg9s3wyLwv3RxsnmHvaUiIiIiIxp0EAZn5aJ6K0nodJoqw2Sd5JKBMgkAuaH+SEywP0u9pCIiIiIatJggXJlynks331OdDszB/hgerC3GXpERERERPXRILO849MyzRImAWD57nPYlJZplraIiIiIqO7qfYVyw4YNmDhxItLS0tC1a1eD8qCgIOTk5ODEiRO6bZ6enrh48SIcug6Fff8pevVLLx5DVtxsNBv2Nmwf6Q0AKD72E3J3fGKyD83HLYdVq0dgJZPg3PtP65XZ2dnhsccew5tvvokhQ4bU5xSJiIiIqBYaZJb3zb92wrZ7BGR2zrWqbx84BjL75gbbZY4tAACq/x9/GRISgueeew5arRYXL17E6tWrMXToUPzwww8YOHCg+U6AiIiIiHTuaaBUqbWwaOaOirwrKPx1C5xCptS8EwDrdl1h1cL0OMmqCT1ubTwxduxY3fYRI0agY8eOWLFiBQMlERER0V1yT8dQFperYOHgBttO/VB8dBdURblmbf/s9WK9nzt06IBmzZrh77//NutxiIiIiOhfogPlzZs3kZOTY/CqqKgwqFtaoYZWC9j3HAWtRo3CX7fU6hiashKolTf1X7cKDepdKVAa9C0/Px+Ojo71OzkiIiIiqlGtb3kfOXIEXbp0Mdjev39/k/v4+fnp/l1cpoJKrYUlAAuH5rD1C0bx0V1o+uSzkDVxqvbY2fFzDTdKLeAxK1lvU2HxLVy8ch02llJkZmZi7ty5UKvViIiIqLZ9IiIiIqq/WgdKhUJhNFCuWrUKPj4+Btvf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8ZY3EdF9KD4tE9FbT0Kl0dZpTKVUIkAmEbAgzI9hkojMhoGSiOg+dSlPWeclXwLbN+OSL0RkdgyURET3OS75QkQNjYGSiOgBwiVfiKghMFASERERkSic5U1EREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSiyhu4AERHRnUrKVMjILUG5SgNLmQSezrawteKfLKLGiv91EhFRo3A+qwiKw5lIOZuNzDwltLeVCQDcnWwQ7OuKMd3d4e1m11DdJCIjBK1Wq625GhER0d1xKU+J2cnHsT89B1KJALXG9J+lqvLA9s2wKNwfbZxs7mFPicgUBkoiImow8WmZiN56EiqNttogeSepRIBMImB+mB8iA9zvYg+JqDYYKImIqEGsTDmP5bvPiW5n5gAfTA/2NkOPiKi+OMubiIjuufi0TLOESQBYvvscNqVlmqUtIqofBkqi+9jx48cREREBDw8PyOVytGrVCiEhIfjf//5ncp+RI0dCEAS89dZbRsv37NkDQRB0L6lUCldXV0REROD06dMm292xYwcEQUDLli2h0WhEnxvVz4QJE9CkSZNa1y8oKIBcLocgCCZ/vxMmTND7TNz+2rlzp17d3NxczJo1C76+vpDL5XBycsLAgQPx/fff6+pcylNW3uYuyMLFxaG3vYbi0ieRyNocjbIrpj9r5dkXkLP9E1xe/QIuLgtH5ocRGD80GC+9OgP//PNPrfsul8tr/T5VvVedOnWCIAiYPn16nfYletBxljfRfSo1NRXBwcFwd3fHpEmT0Lx5c1y6dAm//vorVqxYgVdeecVgn8LCQmzbtg2enp6Ii4vD4sWLIQiC0fZfffVVBAQEoKKiAseOHcOaNWuwZ88enDhxAs2bNzeor1Ao4OnpiYyMDPzyyy/o37+/2c+ZzC8hIQGCIKB58+ZQKBR4//33jdazsrLCunXrDLY/+uijun+fPXsWTz31FG7cuIGJEyei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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'id': 'da441d41-1050-4505-a834-99d6023001e1',\n", + " 'first_name': 'AARON ',\n", + " 'last_name': 'KRAUSS ',\n", + " 'full_name': 'AARON KRAUSS ',\n", + " 'entity_type': 'Individual',\n", + " 'state': 'MI',\n", + " 'party': nan,\n", + " 'company': nan}" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = add_notes_from_df(inds_sample)\n", + "x.nodes['BELA LAHNER ']" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['BELA LAHNER ',\n", + " 'JANICE SHAPIRO ',\n", + " 'RAMON HAWKINS ',\n", + " 'LEAH CYGAN ',\n", + " 'ALLISON HATT ^ ',\n", + " 'ELLEN FEINGOLD ',\n", + " 'KEVIN HERTEL FOR SENATE',\n", + " 'SARA LAFORGE ^ ',\n", + " 'LOIS TACK ',\n", + " 'AARON KRAUSS ']" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inds_sample.full_name.tolist()" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'MALLORY MCMORROW FOR MICHIGAN'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[94], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mG\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnodes\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mMALLORY MCMORROW FOR MICHIGAN\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/networkx/classes/reportviews.py:194\u001b[0m, in \u001b[0;36mNodeView.__getitem__\u001b[0;34m(self, n)\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(n, \u001b[38;5;28mslice\u001b[39m):\n\u001b[1;32m 190\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m nx\u001b[38;5;241m.\u001b[39mNetworkXError(\n\u001b[1;32m 191\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m)\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m does not support slicing, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 192\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtry list(G.nodes)[\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mn\u001b[38;5;241m.\u001b[39mstart\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m:\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mn\u001b[38;5;241m.\u001b[39mstop\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m:\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mn\u001b[38;5;241m.\u001b[39mstep\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m]\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 193\u001b[0m )\n\u001b[0;32m--> 194\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_nodes\u001b[49m\u001b[43m[\u001b[49m\u001b[43mn\u001b[49m\u001b[43m]\u001b[49m\n", + "\u001b[0;31mKeyError\u001b[0m: 'MALLORY MCMORROW FOR MICHIGAN'" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G = nx.petersen_graph()\n", + "subax1 = plt.subplot(121)\n", + "nx.draw(G, with_labels=True, font_weight='bold')\n", + "subax2 = plt.subplot(122)\n", + "nx.draw_shell(G, nlist=[range(5, 10), range(5)], with_labels=True, font_weight='light')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC': Text(-0.071782758799796, -0.3387166453182715, 'REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC'),\n", + " 'Paa Pac': Text(0.06023249378587841, -0.07946204618171311, 'Paa Pac'),\n", + " 'UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB': Text(-0.12554712442237967, 0.08789304420689323, 'UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB'),\n", + " 'COMMITTEE TO ELECT DR PATRICIA BERNARD': Text(-0.40486733116122986, -0.04769565353200762, 'COMMITTEE TO ELECT DR PATRICIA BERNARD'),\n", + " 'Pabar Pac (Pa Bar Assn)': Text(-0.6714326170558735, 0.21693950702464565, 'Pabar Pac (Pa Bar Assn)'),\n", + " 'Ugi Utilities Inc/Ugi Energy Services Llc Pac': Text(1.0, -0.38838038123915186, 'Ugi Utilities Inc/Ugi Energy Services Llc Pac'),\n", + " 'Pa Fraternal Order Of Police Pac': Text(0.5897482153166077, -0.2569656851069028, 'Pa Fraternal Order Of Police Pac'),\n", + " 'MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC': Text(-0.27784326029554446, 0.2828712220763738, 'MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC'),\n", + " 'Citizens For Kail': Text(-0.09850761736766293, 0.5235166380701339, 'Citizens For Kail')}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G = nx.from_pandas_edgelist(sample_df,source='name',target='donations_to',edge_attr=['donations','received'])\n", + "G.nodes()\n", + "pos=nx.spring_layout(G)\n", + "weights = list(nx.get_edge_attributes(G,'donations').values())\n", + "weights = [i/5000 for i in weights]\n", + "node_color = [G.degree(v) for v in G] \n", + "#node_size = [0.0005 * nx.get_node_attributes(G, 'donations')[v] for v in G] \n", + "nx.draw_networkx_nodes(G, pos, node_color=node_color)#, node_size=node_size) \n", + "nx.draw_networkx_edges(G, pos, width=weights)\n", + "nx.draw_networkx_labels(G, pos)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "G.nodes['Citizens For Kail']" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[8], line 7\u001b[0m\n\u001b[1;32m 4\u001b[0m node_color \u001b[38;5;241m=\u001b[39m [G\u001b[38;5;241m.\u001b[39mdegree(v) \u001b[38;5;28;01mfor\u001b[39;00m v \u001b[38;5;129;01min\u001b[39;00m G] \n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# node colour is a list of degrees of nodes \u001b[39;00m\n\u001b[0;32m----> 7\u001b[0m node_size \u001b[38;5;241m=\u001b[39m \u001b[43m[\u001b[49m\u001b[38;5;241;43m0.0005\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mnx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_node_attributes\u001b[49m\u001b[43m(\u001b[49m\u001b[43mG\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mpopulation\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[43mv\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mv\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mG\u001b[49m\u001b[43m]\u001b[49m \n\u001b[1;32m 8\u001b[0m \u001b[38;5;66;03m# size of node is a list of population of cities \u001b[39;00m\n\u001b[1;32m 10\u001b[0m edge_width \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0.0015\u001b[39m \u001b[38;5;241m*\u001b[39m G[u][v][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweight\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;28;01mfor\u001b[39;00m u, v \u001b[38;5;129;01min\u001b[39;00m G\u001b[38;5;241m.\u001b[39medges()] \n", + "Cell \u001b[0;32mIn[8], line 7\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 4\u001b[0m node_color \u001b[38;5;241m=\u001b[39m [G\u001b[38;5;241m.\u001b[39mdegree(v) \u001b[38;5;28;01mfor\u001b[39;00m v \u001b[38;5;129;01min\u001b[39;00m G] \n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# node colour is a list of degrees of nodes \u001b[39;00m\n\u001b[0;32m----> 7\u001b[0m node_size \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0.0005\u001b[39m \u001b[38;5;241m*\u001b[39m \u001b[43mnx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_node_attributes\u001b[49m\u001b[43m(\u001b[49m\u001b[43mG\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mpopulation\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[43mv\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m v \u001b[38;5;129;01min\u001b[39;00m G] \n\u001b[1;32m 8\u001b[0m \u001b[38;5;66;03m# size of node is a list of population of cities \u001b[39;00m\n\u001b[1;32m 10\u001b[0m edge_width \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0.0015\u001b[39m \u001b[38;5;241m*\u001b[39m G[u][v][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweight\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;28;01mfor\u001b[39;00m u, v \u001b[38;5;129;01min\u001b[39;00m G\u001b[38;5;241m.\u001b[39medges()] \n", + "\u001b[0;31mKeyError\u001b[0m: 'REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC'" + ] + }, + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "# fixing the size of the figure \n", + "plt.figure(figsize =(10, 7)) \n", + "\n", + "node_color = [G.degree(v) for v in G] \n", + "# node colour is a list of degrees of nodes \n", + "\n", + "node_size = [0.0005 * nx.get_node_attributes(G, 'population')[v] for v in G] \n", + "# size of node is a list of population of cities \n", + "\n", + "edge_width = [0.0015 * G[u][v]['weight'] for u, v in G.edges()] \n", + "# width of edge is a list of weight of edges \n", + "\n", + "nx.draw_networkx(G, node_size = node_size, \n", + "\t\t\t\tnode_color = node_color, alpha = 0.7, \n", + "\t\t\t\twith_labels = True, width = edge_width, \n", + "\t\t\t\tedge_color ='.4', cmap = plt.cm.Blues) \n", + "\n", + "plt.axis('off') \n", + "plt.tight_layout(); " + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'color': 'white'}" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "G = nx.Graph()\n", + "G.add_node(0)\n", + "nx.set_node_attributes(G, \"red\", name=\"color\")\n", + "nx.set_node_attributes(G, 4, name = 'size')\n", + "G.add_node(2)\n", + "nx.set_node_attributes(G, \"white\", name='color')\n", + "G.nodes[2]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "climate_cabinet", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 9534af9550a6ffeaa16683cd375fb8696d057555 Mon Sep 17 00:00:00 2001 From: Avery Date: Wed, 21 Feb 2024 10:24:19 -0600 Subject: [PATCH 126/214] combine test files --- utils/linkage.py | 9 +++---- utils/tests/test_linkage.py | 49 +++++++++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 7efdf024..d1b85447 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,19 +1,16 @@ import textdistance as td import usaddress from names_dataset import NameDataset - -""" -Module for performing record linkage on state campaign finance dataset -""" import math import os.path import re - import numpy as np import pandas as pd - from utils.constants import COMPANY_TYPES, repo_root +""" +Module for performing record linkage on state campaign finance dataset +""" def get_address_line_1_from_full_address(address: str) -> str: """Given a full address, return the first line of the formatted address diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py index 3695a399..4e57f1b0 100644 --- a/utils/tests/test_linkage.py +++ b/utils/tests/test_linkage.py @@ -1,17 +1,18 @@ import numpy as np import pandas as pd import pytest - +from utils.constants import BASE_FILEPATH from utils.linkage import ( calculate_row_similarity, calculate_string_similarity, - row_matches, + row_matches, deduplicate_perfect_matches ) -# import pytest - +""" +Module for testing functions in linkage.py +""" -# creating a test for calculate_row_similarity and row_matches +# Creating a test for calculate_row_similarity and row_matches # to put in data: d = { @@ -22,6 +23,7 @@ "8 Fancy Way, Chicago", ], } + test_df = pd.DataFrame(data=d) @@ -105,3 +107,40 @@ def test_row_matches(row_match_scen1): ) assert res == {0: [2], 1: [], 2: [], 3: [6], 4: [], 5: [], 6: [], 7: []} + +# Test for dedupe function +@pytest.fixture +def return_data(filename): + path = BASE_FILEPATH / "output" / filename + df = pd.read_csv(path, low_memory=False) + return df + + +@pytest.fixture +def call_dedup_func(): + inds_sample = return_data("complete_individuals_table.csv") + orgs_sample = return_data("complete_organizations_table.csv") + + assert not orgs_sample.empty() + assert not inds_sample.empty() + + deduplicated_inds = deduplicate_perfect_matches(inds_sample) + deduplicated_orgs = deduplicate_perfect_matches(orgs_sample) + + output_dedup_ids = return_data("deduplicated_UUIDs.csv") + # outpud_ids should have all the ids that deduplicated_inds and deduplicated_orgs + # has + + return deduplicated_inds, deduplicated_orgs, output_dedup_ids + + +@pytest.fixture +def confirm_dedup_uuids(): + inds, orgs, output = call_dedup_func() + + dedup_inds_id = set(inds.id.tolist()) + dedup_orgs_id = set(orgs.id.tolist()) + unique_ids = set(output.duplicated_uuids.tolist()) + + assert dedup_inds_id.issubset(unique_ids) + assert dedup_orgs_id.issubset(unique_ids) \ No newline at end of file From f91ee0e69cd311e911a0f976309b9e523aca705a Mon Sep 17 00:00:00 2001 From: Avery Date: Wed, 21 Feb 2024 10:26:51 -0600 Subject: [PATCH 127/214] precommit --- utils/linkage.py | 9 ++++++--- utils/tests/test_linkage.py | 7 +++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index d1b85447..44d5e40c 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,17 +1,20 @@ -import textdistance as td -import usaddress -from names_dataset import NameDataset import math import os.path import re + import numpy as np import pandas as pd +import textdistance as td +import usaddress +from names_dataset import NameDataset + from utils.constants import COMPANY_TYPES, repo_root """ Module for performing record linkage on state campaign finance dataset """ + def get_address_line_1_from_full_address(address: str) -> str: """Given a full address, return the first line of the formatted address diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py index 4e57f1b0..4a5f73f2 100644 --- a/utils/tests/test_linkage.py +++ b/utils/tests/test_linkage.py @@ -1,11 +1,13 @@ import numpy as np import pandas as pd import pytest + from utils.constants import BASE_FILEPATH from utils.linkage import ( calculate_row_similarity, calculate_string_similarity, - row_matches, deduplicate_perfect_matches + deduplicate_perfect_matches, + row_matches, ) """ @@ -108,6 +110,7 @@ def test_row_matches(row_match_scen1): assert res == {0: [2], 1: [], 2: [], 3: [6], 4: [], 5: [], 6: [], 7: []} + # Test for dedupe function @pytest.fixture def return_data(filename): @@ -143,4 +146,4 @@ def confirm_dedup_uuids(): unique_ids = set(output.duplicated_uuids.tolist()) assert dedup_inds_id.issubset(unique_ids) - assert dedup_orgs_id.issubset(unique_ids) \ No newline at end of file + assert dedup_orgs_id.issubset(unique_ids) From 2a30961daeda9accb4db453018eff4430a40135a Mon Sep 17 00:00:00 2001 From: Avery Schoen <33437601+averyschoen@users.noreply.github.com> Date: Wed, 21 Feb 2024 10:33:23 -0600 Subject: [PATCH 128/214] Delete tests directory --- tests/test_dedup.py | 42 ------------------------------------------ 1 file changed, 42 deletions(-) delete mode 100644 tests/test_dedup.py diff --git a/tests/test_dedup.py b/tests/test_dedup.py deleted file mode 100644 index f1c01690..00000000 --- a/tests/test_dedup.py +++ /dev/null @@ -1,42 +0,0 @@ -import pandas as pd -import pytest - -from utils.constants import BASE_FILEPATH -from utils.linkage import deduplicate_perfect_matches - - -@pytest.fixture -def return_data(filename): - path = BASE_FILEPATH / "output" / filename - df = pd.read_csv(path, low_memory=False) - return df - - -@pytest.fixture -def call_dedup_func(): - inds_sample = return_data("complete_individuals_table.csv") - orgs_sample = return_data("complete_organizations_table.csv") - - assert not orgs_sample.empty() - assert not inds_sample.empty() - - deduplicated_inds = deduplicate_perfect_matches(inds_sample) - deduplicated_orgs = deduplicate_perfect_matches(orgs_sample) - - output_dedup_ids = return_data("deduplicated_UUIDs.csv") - # outpud_ids should have all the ids that deduplicated_inds and deduplicated_orgs - # has - - return deduplicated_inds, deduplicated_orgs, output_dedup_ids - - -@pytest.fixture -def confirm_dedup_uuids(): - inds, orgs, output = call_dedup_func() - - dedup_inds_id = set(inds.id.tolist()) - dedup_orgs_id = set(orgs.id.tolist()) - unique_ids = set(output.duplicated_uuids.tolist()) - - assert dedup_inds_id.issubset(unique_ids) - assert dedup_orgs_id.issubset(unique_ids) From e007f3cfacc324963d970966d5c3fa733c4a9aa7 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Wed, 21 Feb 2024 14:03:40 -0600 Subject: [PATCH 129/214] splink notebook --- notebooks/splink.ipynb | 659 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 659 insertions(+) create mode 100644 notebooks/splink.ipynb diff --git a/notebooks/splink.ipynb b/notebooks/splink.ipynb new file mode 100644 index 00000000..c37813d0 --- /dev/null +++ b/notebooks/splink.ipynb @@ -0,0 +1,659 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "1a863d3e-59b4-46c3-ad0f-7d192a61ebe2", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/naynapashilkar/opt/anaconda3/lib/python3.9/site-packages/pandas/core/computation/expressions.py:21: UserWarning: Pandas requires version '2.8.4' or newer of 'numexpr' (version '2.7.3' currently installed).\n", + " from pandas.core.computation.check import NUMEXPR_INSTALLED\n", + "/Users/naynapashilkar/opt/anaconda3/lib/python3.9/site-packages/pandas/core/arrays/masked.py:60: UserWarning: Pandas requires version '1.3.6' or newer of 'bottleneck' (version '1.3.2' currently installed).\n", + " from pandas.core import (\n", + "/var/folders/nk/h__9839s2k1_48m_z2g76vn40000gn/T/ipykernel_4396/3624639948.py:16: DtypeWarning: Columns (8,9,10,11,12) have mixed types. Specify dtype option on import or set low_memory=False.\n", + " df_i = pd.read_csv('complete_individuals_table.csv')\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# Define sample data\n", + "# i_data = {\n", + "# 'unique_id': range(1, 13),\n", + "# 'first_name': ['John', 'Jane', 'David', 'Emily', 'Michael', 'Sarah', 'John', 'Jane', 'David', 'Emily', 'John', 'John'],\n", + "# 'last_name': ['Doe', 'Smith', 'Johnson', 'Brown', 'Davis', 'Miller', 'Doe', 'Smith', 'Johnson', 'Brown', 'Miller', 'Jones'],\n", + "# 'full_name': ['John Doe', 'Jane Smith', 'David Johnson', 'Emily Brown', 'Michael Davis', 'Sarah Miller', 'John Doe', 'Jane Smith', 'David Johnson', 'Emily Brown', 'John Miller', 'John Jones'],\n", + "# 'entity_type': ['Person'] * 12,\n", + "# 'state': ['CA', 'NY', 'TX', 'FL', 'CA', 'NY', 'CA', 'TX', 'FL', 'NY', 'CA', 'FL'],\n", + "# 'party': ['Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent'],\n", + "# 'company': ['Apple', 'Google', 'Microsoft', 'Amazon', 'Facebook', 'Apple', 'Google', 'Microsoft', 'Amazon', 'Facebook', 'Google', 'Microsoft']\n", + "# }\n", + "\n", + "# Create DataFrame\n", + "df_i = pd.read_csv('complete_individuals_table.csv')\n", + "df_i.rename(columns={'id': 'unique_id'}, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "61447af5-7270-4438-baf7-29ba08203019", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0unique_idfirst_namelast_namefull_nameentity_typestatepartycompanyoccupationaddresszipcity
00efa41f9a-a31c-4154-acfa-3707d2c7cc47FREDERICKBERGFREDERICK BERG ...IndividualMINaNBUTZEL LONGATTORNEY1033 YORKSHIRE48230-0000GROSSE POINTE PARK
113e7661e4-1557-4fc8-9cd7-e4381eaed2d8JENNIFERCONSIGLIOJENNIFER CONSIGLIO ...IndividualMINaNBUTZEL LONGATTORNEY7520 SHUMAN DRIVE48438-0000GOODRICH
22a3bbe060-5da0-4b1d-a61c-0a32ec18c2edVANESSACROCETTOVANESSA CROCETTO ...IndividualMINaNBUTZEL LONGCHIEF MARKETING OFFICER4104 ARLINGTON DRIVE48073-0000ROYAL OAK
33667ae9be-5aff-4ce2-a032-5947032c1a9aCAREY A.DEWITTCAREY A. DEWITT ...IndividualMINaNBUTZEL LONGATTORNEY770 HUPP CROSS ROAD48301-0000BLOOMFIELD TWP
44f02b191a-235a-4d79-9e00-3fd63a249e66JENNIFERDUKARSKIJENNIFER DUKARSKI ...IndividualMINaNNaNNaN11855 BECK ROAD48170-0000PLYMOUTH
..........................................
2486933248693367a8b2e6-3ff2-4d9d-a049-545202df393eGRETCHENWHITMERGRETCHEN WHITMERCandidateMINaNNaNNaNNaNNaNNaN
2486934248693467a8b2e6-3ff2-4d9d-a049-545202df393eGRETCHENWHITMERGRETCHEN WHITMERCandidateMINaNNaNNaNNaNNaNNaN
2486935248693567a8b2e6-3ff2-4d9d-a049-545202df393eGRETCHENWHITMERGRETCHEN WHITMERCandidateMINaNNaNNaNNaNNaNNaN
2486936248693667a8b2e6-3ff2-4d9d-a049-545202df393eGRETCHENWHITMERGRETCHEN WHITMERCandidateMINaNNaNNaNNaNNaNNaN
2486937248693767a8b2e6-3ff2-4d9d-a049-545202df393eGRETCHENWHITMERGRETCHEN WHITMERCandidateMINaNNaNNaNNaNNaNNaN
\n", + "

2486938 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 unique_id \\\n", + "0 0 efa41f9a-a31c-4154-acfa-3707d2c7cc47 \n", + "1 1 3e7661e4-1557-4fc8-9cd7-e4381eaed2d8 \n", + "2 2 a3bbe060-5da0-4b1d-a61c-0a32ec18c2ed \n", + "3 3 667ae9be-5aff-4ce2-a032-5947032c1a9a \n", + "4 4 f02b191a-235a-4d79-9e00-3fd63a249e66 \n", + "... ... ... \n", + "2486933 2486933 67a8b2e6-3ff2-4d9d-a049-545202df393e \n", + "2486934 2486934 67a8b2e6-3ff2-4d9d-a049-545202df393e \n", + "2486935 2486935 67a8b2e6-3ff2-4d9d-a049-545202df393e \n", + "2486936 2486936 67a8b2e6-3ff2-4d9d-a049-545202df393e \n", + "2486937 2486937 67a8b2e6-3ff2-4d9d-a049-545202df393e \n", + "\n", + " first_name last_name \\\n", + "0 FREDERICK BERG \n", + "1 JENNIFER CONSIGLIO \n", + "2 VANESSA CROCETTO \n", + "3 CAREY A. DEWITT \n", + "4 JENNIFER DUKARSKI \n", + "... ... ... \n", + "2486933 GRETCHEN WHITMER \n", + "2486934 GRETCHEN WHITMER \n", + "2486935 GRETCHEN WHITMER \n", + "2486936 GRETCHEN WHITMER \n", + "2486937 GRETCHEN WHITMER \n", + "\n", + " full_name entity_type state \\\n", + "0 FREDERICK BERG ... Individual MI \n", + "1 JENNIFER CONSIGLIO ... Individual MI \n", + "2 VANESSA CROCETTO ... Individual MI \n", + "3 CAREY A. DEWITT ... Individual MI \n", + "4 JENNIFER DUKARSKI ... Individual MI \n", + "... ... ... ... \n", + "2486933 GRETCHEN WHITMER Candidate MI \n", + "2486934 GRETCHEN WHITMER Candidate MI \n", + "2486935 GRETCHEN WHITMER Candidate MI \n", + "2486936 GRETCHEN WHITMER Candidate MI \n", + "2486937 GRETCHEN WHITMER Candidate MI \n", + "\n", + " party company occupation address \\\n", + "0 NaN BUTZEL LONG ATTORNEY 1033 YORKSHIRE \n", + "1 NaN BUTZEL LONG ATTORNEY 7520 SHUMAN DRIVE \n", + "2 NaN BUTZEL LONG CHIEF MARKETING OFFICER 4104 ARLINGTON DRIVE \n", + "3 NaN BUTZEL LONG ATTORNEY 770 HUPP CROSS ROAD \n", + "4 NaN NaN NaN 11855 BECK ROAD \n", + "... ... ... ... ... \n", + "2486933 NaN NaN NaN NaN \n", + "2486934 NaN NaN NaN NaN \n", + "2486935 NaN NaN NaN NaN \n", + "2486936 NaN NaN NaN NaN \n", + "2486937 NaN NaN NaN NaN \n", + "\n", + " zip city \n", + "0 48230-0000 GROSSE POINTE PARK \n", + "1 48438-0000 GOODRICH \n", + "2 48073-0000 ROYAL OAK \n", + "3 48301-0000 BLOOMFIELD TWP \n", + "4 48170-0000 PLYMOUTH \n", + "... ... ... \n", + "2486933 NaN NaN \n", + "2486934 NaN NaN \n", + "2486935 NaN NaN \n", + "2486936 NaN NaN \n", + "2486937 NaN NaN \n", + "\n", + "[2486938 rows x 13 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_i" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "25334eac-e048-47e7-b911-571853e2a666", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RendererRegistry.enable('html')" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from splink.duckdb.linker import DuckDBLinker\n", + "import altair as alt\n", + "alt.renderers.enable('html')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a5915f73-77a6-42c9-a7df-a8f0d396836c", + "metadata": {}, + "outputs": [], + "source": [ + "import splink.duckdb.comparison_template_library as ctl\n", + "import splink.duckdb.comparison_library as cl\n", + "\n", + "individual_settings = {\n", + " \"link_type\": \"dedupe_only\",\n", + " \"blocking_rules_to_generate_predictions\": [\n", + " \"l.full_name - r.full_name\",\n", + " \"l.first_name = r.first_name and l.last_name = r.last_name\"\n", + " ],\n", + " # \"comparisons\": [\n", + " # ctl.name_comparison(\"first_name\"), #built in comparison function\n", + " # ctl.name_comparison(\"last_name\"),\n", + " # ctl.name_comparison(\"full_name\"),\n", + " # ctl.forename_surname_comparison(\"first_name\", \"last_name\"), #built in comparison function\n", + " # cl.exact_match(\"entity_type\", term_frequency_adjustments=True),\n", + " # cl.jaro_winkler_at_thresholds(\"state\", [0.9, 0.8]), #threshold will catch typos and shortenings\n", + " # cl.jaro_winkler_at_thresholds(\"party\", [0.9, 0.8]),\n", + " # cl.jaro_winkler_at_thresholds(\"company\", [0.9, 0.8]),\n", + " # ],\n", + " \n", + " #DEFAULT\n", + " \"retain_matching_columns\": True,\n", + " \"retain_intermediate_calculation_columns\": True,\n", + " # \"max_iterations\": 10,\n", + " # \"em_convergence\": 0.01\n", + "}\n", + "\n", + "i_blocking = [\n", + " \"l.first_name = r.first_name and l.last_name = r.last_name\",\n", + " ]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "42ce12f9-1160-4e1e-848a-deb7882566a6", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3e162fc03ab041429b0c2b4143081ee6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "linker = DuckDBLinker(df_i, individual_settings)\n", + "linker.count_num_comparisons_from_blocking_rule(\"l.first_name = r.first_name and l.last_name = r.last_name\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "217a07cf-eaa3-42a2-b43b-b2eecd740a7b", + "metadata": {}, + "outputs": [], + "source": [ + "def splink_dedupe(df, settings, blocking):\n", + " linker = DuckDBLinker(df, settings)\n", + " linker.estimate_probability_two_random_records_match(blocking, recall=0.6) #default\n", + " linker.estimate_u_using_random_sampling(max_pairs=5e6)\n", + " \n", + " for i in blocking:\n", + " training_session_names = linker.estimate_parameters_using_expectation_maximisation(i)\n", + " \n", + " df_predict = linker.predict()\n", + " df_e = df_predict.as_pandas_dataframe()\n", + " clusters = linker.cluster_pairwise_predictions_at_threshold(df_predict, threshold_match_probability=0.7) #default\n", + " return clusters.as_pandas_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "307ae7b8-b637-4451-aad3-9c848e8dff65", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b530b6b922494872b2721019d974f23e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: Deterministic matching rules led to no observed matches! This means that no possible record pairs are matches, and no records are linked to one another.\n", + "If this is truly the case then you do not need to run the linkage model.\n", + "However this is usually in error; expected rules to have recall of 60%. Consider revising rules as they may have an error.\n", + "Probability two random records match is estimated to be 0.\n", + "This means that amongst all possible pairwise record comparisons, one in Infinity are expected to match. With 3,092,429,064,453 total possible comparisons, we expect a total of around 0.00 matching pairs\n", + "----- Estimating u probabilities using random sampling -----\n", + "\n", + "Estimated u probabilities using random sampling\n", + "\n", + "Your model is fully trained. All comparisons have at least one estimate for their m and u values\n", + "\n", + "----- Starting EM training session -----\n", + "\n", + "Estimating the m probabilities of the model by blocking on:\n", + "l.first_name = r.first_name and l.last_name = r.last_name\n", + "\n", + "Parameter estimates will be made for the following comparison(s):\n", + "\n", + "Parameter estimates cannot be made for the following comparison(s) since they are used in the blocking rules: \n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "31a41cbc2cde42819b137edfbd189831", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "ename": "EMTrainingException", + "evalue": "Training rule `l.first_name = r.first_name and l.last_name = r.last_name` resulted in no record pairs. This means that in the supplied data set there were no pairs of records for which `l.first_name = r.first_name and l.last_name = r.last_name` was `true`.\nExpectation maximisation requires a substantial number of record comparisons to produce accurate parameter estimates - usually at least a few hundred, but preferably at least a few thousand.\nYou must revise your training blocking rule so that the set of generated comparisons is not empty. You can use `linker.count_num_comparisons_from_blocking_rule()` to compute the number of comparisons that will be generated by a blocking rule.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mEMTrainingException\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/nk/h__9839s2k1_48m_z2g76vn40000gn/T/ipykernel_4396/657554030.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msplink_dedupe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_i\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindividual_settings\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi_blocking\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/var/folders/nk/h__9839s2k1_48m_z2g76vn40000gn/T/ipykernel_4396/2410222890.py\u001b[0m in \u001b[0;36msplink_dedupe\u001b[0;34m(df, settings, blocking)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mblocking\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mtraining_session_names\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlinker\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mestimate_parameters_using_expectation_maximisation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mdf_predict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlinker\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/splink/linker.py\u001b[0m in \u001b[0;36mestimate_parameters_using_expectation_maximisation\u001b[0;34m(self, blocking_rule, comparisons_to_deactivate, comparison_levels_to_reverse_blocking_rule, estimate_without_term_frequencies, fix_probability_two_random_records_match, fix_m_probabilities, fix_u_probabilities, populate_probability_two_random_records_match_from_trained_values)\u001b[0m\n\u001b[1;32m 1704\u001b[0m )\n\u001b[1;32m 1705\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1706\u001b[0;31m \u001b[0mem_training_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_train\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1707\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1708\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_populate_m_u_from_trained_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/splink/em_training_session.py\u001b[0m in \u001b[0;36m_train\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mcvv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_record_dict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlimit\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0mbr_sql\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34mf\"`{self._blocking_rule_for_training.blocking_rule_sql}`\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 181\u001b[0;31m raise EMTrainingException(\n\u001b[0m\u001b[1;32m 182\u001b[0m \u001b[0;34mf\"Training rule {br_sql} resulted in no record pairs. \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 183\u001b[0m \u001b[0;34m\"This means that in the supplied data set \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mEMTrainingException\u001b[0m: Training rule `l.first_name = r.first_name and l.last_name = r.last_name` resulted in no record pairs. This means that in the supplied data set there were no pairs of records for which `l.first_name = r.first_name and l.last_name = r.last_name` was `true`.\nExpectation maximisation requires a substantial number of record comparisons to produce accurate parameter estimates - usually at least a few hundred, but preferably at least a few thousand.\nYou must revise your training blocking rule so that the set of generated comparisons is not empty. You can use `linker.count_num_comparisons_from_blocking_rule()` to compute the number of comparisons that will be generated by a blocking rule." + ] + } + ], + "source": [ + "splink_dedupe(df_i, individual_settings, i_blocking)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "890ba4ed-8e55-4128-bd36-cd8413cad00e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28948465-fea2-433d-bace-d0627dfe348d", + "metadata": {}, + "outputs": [], + "source": [ + "#--------------------------------------------" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef568813-181b-42a7-b3a2-786fe87addfb", + "metadata": {}, + "outputs": [], + "source": [ + "organizations_settings = {\n", + " \"link_type\": \"dedupe_only\",\n", + " \"blocking_rules_to_generate_predictions\": [\n", + " \"l.name = r.name\",\n", + " ],\n", + " \"comparisons\": [\n", + " ctl.name_comparison(\"name\", term_frequency_adjustments=True),\n", + " cl.exact_match(\"entity_type\", term_frequency_adjustments=True),\n", + " cl.jaro_winkler_at_thresholds(\"state\", [0.9, 0.8]), #threshold will catch typos and shortenings\n", + " # Add more comparisons as needed\n", + " ],\n", + " \"retain_matching_columns\": True,\n", + " \"retain_intermediate_calculation_columns\": True,\n", + " \"max_iterations\": 10,\n", + " \"em_convergence\": 0.01\n", + "}\n", + "\n", + "o_blocking = [\n", + " \"l.name = r.name\",\n", + " \"l.name = r.name and l.state = r.state\",\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9354ec53-0aa3-40b7-968a-d6b5263182c9", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Define sample data\n", + "o_data = {\n", + " 'unique_id': range(1, 13),\n", + " 'name': ['Apple Inc.', 'Google LLC', 'Microsoft Corporation', 'Amazon.com Inc.', 'Facebook Inc.', \n", + " 'Apple Inc.', 'Google LLC', 'Microsoft Corporation', 'Amazon.com Inc.', 'Facebook Inc.', \n", + " 'Google LLC', 'Microsoft Corporation'],\n", + " 'entity_type': ['Organization'] * 12,\n", + " 'state': ['CA', 'NY', 'WA', 'WA', 'CA', 'CA', 'NY', 'WA', 'WA', 'CA', 'NY', 'WA'],\n", + "}\n", + "\n", + "# Create DataFrame\n", + "df_o = pd.DataFrame(o_data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a1c1785-17b6-4aa2-9a10-b431c70e411d", + "metadata": {}, + "outputs": [], + "source": [ + "splink_dedupe(df_o, organizations_settings, o_blocking)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac3665d0-984c-4367-a7eb-62cd980dff16", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bffdeb09-0788-449d-9046-351d4a258537", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 89af1cbf5652b762b4e9cc0ef59a50551897d23f Mon Sep 17 00:00:00 2001 From: npashilkar Date: Wed, 21 Feb 2024 17:57:41 -0600 Subject: [PATCH 130/214] splink function clean-up --- requirements.txt | 3 ++- utils/constants.py | 45 +++++++++++++++++++++------------------------ utils/linkage.py | 44 ++++++++++++++++++++++++++------------------ 3 files changed, 49 insertions(+), 43 deletions(-) diff --git a/requirements.txt b/requirements.txt index d28ae9f8..6fa9433b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,4 +19,5 @@ Requests==2.31.0 setuptools==68.0.0 textdistance==4.6.1 usaddress==0.5.4 -networkx~=3.1 \ No newline at end of file +networkx~=3.1 +splink==3.9.12 \ No newline at end of file diff --git a/utils/constants.py b/utils/constants.py index c7c040ac..91e1d87f 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -3,6 +3,9 @@ """ from pathlib import Path +import splink.duckdb.comparison_library as cl +import splink.duckdb.comparison_template_library as ctl + BASE_FILEPATH = Path(__file__).resolve().parent.parent # returns the base_path to the directory @@ -642,35 +645,29 @@ "PAC": "POLITICAL ACTION COMMITTEE", } -individual_settings = { +individuals_settings = { "link_type": "dedupe_only", - "blocking_rules_to_generate_predictions": [ - "l.first_name = r.first_name and l.last_name = r.last_name", - "l.full_name - r.full_name" - ], + "blocking_rules_to_generate_predictions": ["l.full_name - r.full_name"], "comparisons": [ - ctl.name_comparison("first_name"), #built in comparison function + ctl.name_comparison("first_name"), # built in comparison function ctl.name_comparison("last_name"), ctl.name_comparison("full_name"), - ctl.forename_surname_comparison("first_name", "last_name"), #built in comparison function cl.exact_match("entity_type", term_frequency_adjustments=True), - cl.jaro_winkler_at_thresholds("state", [0.9, 0.8]), #threshold will catch typos and shortenings + cl.jaro_winkler_at_thresholds( + "state", [0.9, 0.8] + ), # threshold will catch typos and shortenings cl.jaro_winkler_at_thresholds("party", [0.9, 0.8]), cl.jaro_winkler_at_thresholds("company", [0.9, 0.8]), ], - - #DEFAULT + # DEFAULT "retain_matching_columns": True, "retain_intermediate_calculation_columns": True, - "max_iterations": 10, - "em_convergence": 0.01 } -i_blocking = [ - "l.first_name = r.first_name and l.last_name = r.last_name", - "l.full_name = r.full_name and l.state = r.state", - "l.full_name = r.full_name and l.company = r.company", - ] +individuals_blocking = [ + "l.first_name = r.first_name and l.last_name = r.last_name", + "l.full_name = r.full_name", +] organizations_settings = { "link_type": "dedupe_only", @@ -680,16 +677,16 @@ "comparisons": [ ctl.name_comparison("name", term_frequency_adjustments=True), cl.exact_match("entity_type", term_frequency_adjustments=True), - cl.jaro_winkler_at_thresholds("state", [0.9, 0.8]), #threshold will catch typos and shortenings + cl.jaro_winkler_at_thresholds( + "state", [0.9, 0.8] + ), # threshold will catch typos and shortenings # Add more comparisons as needed ], "retain_matching_columns": True, "retain_intermediate_calculation_columns": True, - "max_iterations": 10, - "em_convergence": 0.01 } -o_blocking = [ - "l.name = r.name", - "l.name = r.name and l.state = r.state", - ] \ No newline at end of file +organizations_blocking = [ + "l.name = r.name", + "l.name = r.name and l.state = r.state", +] diff --git a/utils/linkage.py b/utils/linkage.py index 730c92fe..cd76a77f 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -7,17 +7,14 @@ import pandas as pd import textdistance as td import usaddress - from splink.duckdb.linker import DuckDBLinker -import splink.duckdb.comparison_template_library as ctl -import splink.duckdb.comparison_library as cl + +from utils.constants import COMPANY_TYPES, repo_root """ Module for performing record linkage on state campaign finance dataset """ -from utils.constants import COMPANY_TYPES, repo_root - def get_address_line_1_from_full_address(address: str) -> str: """Given a full address, return the first line of the formatted address @@ -470,23 +467,34 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: def splink_dedupe(df, settings, blocking): + """Given the individuals or organizations dataframes, the corresponding + configuration settings, and corresponding blocking rules return a + deduplicated dataframe + + Configuration settings and blocking can be found in constants.py as + individuals_settings, indivduals_blocking, organizations_settings, + organizations_blocking - """Given a dataframe, configuration settings, and blocking rules return a deduplicated dataframe Args: - df: dataframe with potential duplicates - settings: model settings based on splink documentation - blocking: list of columns to block on + df: individuals or organizations table + settings: individuald or configuration settings + (based on splink documentation) + blocking: list of columns to block on for the table + (cuts dataframe into parts based on above blocks ) Returns: - dataframe with matched ids of matching rows""" - + dataframe with matched ids of matching rows + """ linker = DuckDBLinker(df, settings) - linker.estimate_probability_two_random_records_match(blocking, recall=0.6) #default + linker.estimate_probability_two_random_records_match( + blocking, recall=0.6 + ) # default linker.estimate_u_using_random_sampling(max_pairs=5e6) - + for i in blocking: - training_session_names = linker.estimate_parameters_using_expectation_maximisation(i) - + linker.estimate_parameters_using_expectation_maximisation(i) + df_predict = linker.predict() - df_e = df_predict.as_pandas_dataframe() - clusters = linker.cluster_pairwise_predictions_at_threshold(df_predict, threshold_match_probability=0.7) #default - return clusters.as_pandas_dataframe() \ No newline at end of file + clusters = linker.cluster_pairwise_predictions_at_threshold( + df_predict, threshold_match_probability=0.7 + ) # default + return clusters.as_pandas_dataframe() From a5eb7a1e4d4eb9bb814fb7b954f0a2d220b39586 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Wed, 21 Feb 2024 18:05:43 -0600 Subject: [PATCH 131/214] splink function clean-up --- utils/linkage.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index cd76a77f..90956b7a 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -466,7 +466,9 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: raise ValueError("Can not find Address Number") -def splink_dedupe(df, settings, blocking): +def splink_dedupe( + df: pd.DataFrame, settings: dict, blocking: list +) -> pd.DataFrame: """Given the individuals or organizations dataframes, the corresponding configuration settings, and corresponding blocking rules return a deduplicated dataframe From ae1db64ee715a58f34160672b1f90da27f69812e Mon Sep 17 00:00:00 2001 From: npashilkar Date: Wed, 21 Feb 2024 18:09:50 -0600 Subject: [PATCH 132/214] splink function clean-up2 --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 76fc565a..a8a40fd1 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -6,8 +6,8 @@ import pandas as pd import textdistance as td import usaddress -from splink.duckdb.linker import DuckDBLinker from names_dataset import NameDataset +from splink.duckdb.linker import DuckDBLinker from utils.constants import COMPANY_TYPES, repo_root From 21af2c951ae837a94a7603af71bdb267349b0f4d Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Thu, 22 Feb 2024 07:38:04 +0000 Subject: [PATCH 133/214] updates --- utils/linkage_pipeline.py | 87 ++++++++++++++++++++++++++++++++------- 1 file changed, 71 insertions(+), 16 deletions(-) diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index f3755eec..0f7be5e5 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -3,10 +3,13 @@ import pandas as pd from nameparser import HumanName +from utils.constants import BASE_FILEPATH from utils.linkage import ( cleaning_company_column, + deduplicate_perfect_matches, get_address_line_1_from_full_address, get_address_number_from_address_line_1, + get_likely_name, get_street_from_address_line_1, standardize_corp_names, ) @@ -32,50 +35,102 @@ def preprocess_pipeline( """ # Preprocess organizations dataframe organizations["name"] = ( - organizations["name"].astype(str, skipna=True).apply(standardize_corp_names) + organizations["name"].astype(str).apply(standardize_corp_names) ) + if "Unnamed: 0" in organizations.columns: + organizations.drop(columns="Unnamed: 0", inplace=True) # Preprocess individuals dataframe if "Unnamed: 0" in individuals.columns: individuals.drop(columns="Unnamed: 0", inplace=True) individuals = individuals.astype( - {"first_name": str, "last_name": str, "full_name": str, "company": str} + { + "first_name": str, + "last_name": str, + "full_name": str, + "company": "string", + } ) # Standardize company names in individuals dataframe - individuals["company"] = individuals["company"].apply(standardize_corp_names) - individuals["company"] = individuals["company"].apply(cleaning_company_column) - - # Address functions, assuming address column is named 'Address' - individuals["Address Line 1"] = individuals["Address"].apply( - get_address_line_1_from_full_address - ) - individuals["Street Name"] = individuals["Address Line 1"].apply( - get_street_from_address_line_1 + individuals["company"] = ( + individuals["company"] + .loc[individuals["company"].notnull()] + .apply(standardize_corp_names) ) - individuals["Address Number"] = individuals["Address Line 1"].apply( - get_address_number_from_address_line_1 + individuals["company"] = ( + individuals["company"] + .loc[individuals["company"].notnull()] + .apply(cleaning_company_column) ) + # Address functions, assuming address column is named 'Address' + # If there is an "Address" column in the first place + if "Address" in individuals.columns: + individuals["Address"] = individuals["Address"].astype(str) + individuals["Address Line 1"] = individuals["Address"].apply( + get_address_line_1_from_full_address + ) + individuals["Street Name"] = individuals["Address Line 1"].apply( + get_street_from_address_line_1 + ) + individuals["Address Number"] = individuals["Address Line 1"].apply( + get_address_number_from_address_line_1 + ) + # Check if first name or last names are empty, if so, extract from full name column individuals["full_name"] = individuals["full_name"].astype(str)[ individuals["full_name"].notnull() ] if individuals["first_name"].isnull().any(): - name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) + name = ( + individuals["full_name"] + .apply(HumanName) + .apply(lambda x: x.as_dict()) + ) first_name = name.apply(lambda x: x["first"]) individuals["first_name"] = first_name if individuals["last_name"].isnull().any(): - name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) + name = ( + individuals["full_name"] + .apply(HumanName) + .apply(lambda x: x.as_dict()) + ) last_name = name.apply(lambda x: x["last"]) individuals["last_name"] = last_name - # Transactions + individuals["full_name"] = individuals.apply( + lambda row: get_likely_name( + row["first_name"], row["last_name"], row["full_name"] + ), + axis=1, + ) + if "Unnamed: 0" in transactions.columns: transactions.drop(columns="Unnamed: 0", inplace=True) transactions["purpose"] = transactions["purpose"].str.upper() return individuals, organizations, transactions + + +organizations = pd.read_csv( + BASE_FILEPATH / "output" / "complete_organizations_table.csv" +) + +individuals = pd.read_csv( + BASE_FILEPATH / "output" / "complete_individuals_table.csv" +) + +transactions = pd.read_csv( + BASE_FILEPATH / "output" / "complete_transactions_table.csv" +) + +individuals, organizations, transactions = preprocess_pipeline( + individuals, organizations, transactions +) + +individuals = deduplicate_perfect_matches(individuals) +organizations = deduplicate_perfect_matches(organizations) From 4d7bdfb9cfe95b7c0c8e98314b2ca2977fb8c266 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Thu, 22 Feb 2024 07:46:05 +0000 Subject: [PATCH 134/214] adding output csv --- utils/linkage_pipeline.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index 0f7be5e5..b5e4d451 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -134,3 +134,19 @@ def preprocess_pipeline( individuals = deduplicate_perfect_matches(individuals) organizations = deduplicate_perfect_matches(organizations) + +processed_individuals_output_path = ( + BASE_FILEPATH / "output" / "processed_individuals_table.csv" +) + +processed_organizations_output_path = ( + BASE_FILEPATH / "output" / "processed_organizations_table.csv" +) + +processed_transactions_output_path = ( + BASE_FILEPATH / "output" / "processed_transactions_table.csv" +) + +individuals.to_csv(processed_individuals_output_path) +organizations.to_csv(processed_organizations_output_path) +transactions.to_csv(processed_transactions_output_path) From fa8c0da373b88cdde630347ff630d80654da1c68 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 22 Feb 2024 13:16:09 -0600 Subject: [PATCH 135/214] Saving work on networkx branch --- Makefile | 5 + notebooks/Test.ipynb | 1469 ++++++++++++++++++++++++++++++++++-------- utils/linkage.py | 22 +- 3 files changed, 1214 insertions(+), 282 deletions(-) diff --git a/Makefile b/Makefile index e210fb2c..f0d93dd0 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,11 @@ project_dir := "$(current_abs_path)" build-only: docker build -t $(project_image_name) -f Dockerfile $(current_abs_path) + # these are called directives + # run-pipeline: + # docker build -t $(project_image_name) -f Dockerfile $(current_abs_path) + # docker run -e python pipeline.py + run-interactive: docker build -t $(project_image_name) -f Dockerfile $(current_abs_path) docker run -it -v $(current_abs_path):/project -t $(project_image_name) /bin/bash diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb index 457fb6f0..b17aeb76 100644 --- a/notebooks/Test.ipynb +++ b/notebooks/Test.ipynb @@ -10,7 +10,9 @@ "import numpy as np\n", "import re\n", "import networkx as nx\n", - "import matplotlib.pyplot as plt" + "import matplotlib.pyplot as plt\n", + "\n", + "from utils.linkage import deduplicate_perfect_matches" ] }, { @@ -19,8 +21,365 @@ "metadata": {}, "outputs": [], "source": [ - "orgs_sample = pd.read_csv(\"../output/complete_organizations_table.csv\",index_col=0).sample(10)\n", - "inds_sample = pd.read_csv(\"../output/complete_individuals_table.csv\",index_col=0, low_memory=False).sample(10)" + "orgs_sample = pd.read_csv(\"../output/complete_organizations_table.csv\",index_col=0)#,nrows=10000).sample(10)\n", + "inds_sample = pd.read_csv(\"../output/complete_individuals_table.csv\",index_col=0, low_memory=False)#, nrows=10000).sample(10)\n", + "transactions = pd.read_csv(\"../output/complete_transactions_table.csv\",index_col=0, low_memory=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnamestateentity_type
01022#1022 arizona committee of automotive retailersAZpac
4100112314 action victory fund (fec id c00689828)DCpac
\n", + "
" + ], + "text/plain": [ + " id name state entity_type\n", + "0 1022 #1022 arizona committee of automotive retailers AZ pac\n", + "4 100112 314 action victory fund (fec id c00689828) DC pac" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "orgs_sample.head(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
transaction_iddonor_idyearamountrecipient_idoffice_soughtpurposetransaction_typedonor_typerecipient_typedonor_office
046406501005922021.025.01869727nonewr 9.13contribution from individualsNaNNaNNaN
181852572018003012020.0100.01779679noneabcontribution from individualsNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " transaction_id donor_id year amount recipient_id office_sought \\\n", + "0 4640650 100592 2021.0 25.0 1869727 none \n", + "1 8185257 201800301 2020.0 100.0 1779679 none \n", + "\n", + " purpose transaction_type donor_type recipient_type \\\n", + "0 wr 9.13 contribution from individuals NaN NaN \n", + "1 ab contribution from individuals NaN NaN \n", + "\n", + " donor_office \n", + "0 NaN \n", + "1 NaN " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "transactions.head(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnamestateentity_type
\n", + "
" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [id, name, state, entity_type]\n", + "Index: []" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "orgs_sample.loc[orgs_sample['id']=='201800301']" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idfirst_namelast_namefull_nameentity_typestatepartycompany
01869727NaNNaNwilliam \bstonerindividualNaNNaNNaN
11779679NaNNaNrm coulonindividualNaNNaNarea agency on aging
\n", + "
" + ], + "text/plain": [ + " id first_name last_name full_name entity_type state party \\\n", + "0 1869727 NaN NaN william \bstoner individual NaN NaN \n", + "1 1779679 NaN NaN rm coulon individual NaN NaN \n", + "\n", + " company \n", + "0 NaN \n", + "1 area agency on aging " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inds_sample.head(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(542368, 102, 248318, 3)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inds_ids = set(inds_sample.id.tolist())\n", + "orgs_ids = set(orgs_sample.id.tolist())\n", + "trans_donorids = set(transactions.donor_id.tolist())\n", + "trans_recepids = set(transactions.recipient_id.tolist())\n", + "ind_id_there, org_id_there = [], []\n", + "for ind_id in inds_ids:\n", + " if ind_id in trans_donorids:\n", + " ind_id_there.append(ind_id)\n", + " elif ind_id in trans_recepids:\n", + " ind_id_there.append(ind_id)\n", + "\n", + "for org_id in orgs_ids:\n", + " if org_id in trans_donorids:\n", + " org_id_there.append(org_id)\n", + " elif org_id in trans_recepids:\n", + " org_id_there.append(org_id)\n", + "\n", + "len(inds_ids), len(ind_id_there), len(orgs_ids), len(org_id_there)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['100894', '100883']" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = []\n", + "for ind_id in inds_ids:\n", + " if ((ind_id in trans_donorids) and (ind_id in trans_recepids)):\n", + " a.append(ind_id)\n", + "a" ] }, { @@ -66,10 +425,10 @@ " REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...\n", " MI\n", " committee\n", - " 503\n", - " Pabar Pac (Pa Bar Assn)\n", - " 5210\n", - " MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC\n", + " 4249\n", + " REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...\n", + " 730\n", + " COMMITTEE TO ELECT DR PATRICIA BERNARD\n", " \n", " \n", " 1\n", @@ -77,10 +436,10 @@ " REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...\n", " MI\n", " committee\n", - " 2969\n", - " REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...\n", - " 5768\n", + " 426\n", " MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC\n", + " 853\n", + " Pabar Pac (Pa Bar Assn)\n", " \n", " \n", " 2\n", @@ -88,10 +447,10 @@ " REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...\n", " MI\n", " committee\n", - " 4592\n", - " COMMITTEE TO ELECT DR PATRICIA BERNARD\n", - " 4274\n", - " UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...\n", + " 382\n", + " REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...\n", + " 620\n", + " MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC\n", " \n", " \n", " 3\n", @@ -99,10 +458,10 @@ " UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...\n", " MI\n", " committee\n", - " 2459\n", - " REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...\n", - " 2602\n", - " UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...\n", + " 2328\n", + " MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC\n", + " 4505\n", + " Paa Pac\n", " \n", " \n", " 4\n", @@ -110,10 +469,10 @@ " UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...\n", " MI\n", " committee\n", - " 4748\n", - " MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC\n", - " 4153\n", - " REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...\n", + " 3421\n", + " Paa Pac\n", + " 672\n", + " Paa Pac\n", " \n", " \n", "\n", @@ -135,18 +494,18 @@ "4 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee \n", "\n", " donations donations_to received \\\n", - "0 503 Pabar Pac (Pa Bar Assn) 5210 \n", - "1 2969 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... 5768 \n", - "2 4592 COMMITTEE TO ELECT DR PATRICIA BERNARD 4274 \n", - "3 2459 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... 2602 \n", - "4 4748 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC 4153 \n", - "\n", - " donations_from \n", - "0 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", - "1 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", - "2 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... \n", - "3 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... \n", - "4 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... " + "0 4249 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... 730 \n", + "1 426 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC 853 \n", + "2 382 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... 620 \n", + "3 2328 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC 4505 \n", + "4 3421 Paa Pac 672 \n", + "\n", + " donations_from \n", + "0 COMMITTEE TO ELECT DR PATRICIA BERNARD \n", + "1 Pabar Pac (Pa Bar Assn) \n", + "2 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", + "3 Paa Pac \n", + "4 Paa Pac " ] }, "execution_count": 3, @@ -229,9 +588,19 @@ "* https://www.activestate.com/blog/graph-theory-using-python-introduction-and-implementation/ \n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Things to think about\n", + "* Apply the deduplicated_uuids.csv info to the transactions table\n", + "* After doing a left join on the inds/orgs dataset with the transactions data, the recipient_id column needs to have a recipient_name column so that a new node can be created\n", + "* for ppl who have multiple donations {and so have various attributes like office_sought, purpose, transaction_type}, should this information be saved?" + ] + }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 97, "metadata": {}, "outputs": [ { @@ -256,172 +625,336 @@ " \n", " \n", " id\n", - " name\n", - " state\n", + " first_name\n", + " last_name\n", + " full_name\n", " entity_type\n", + " state\n", + " party\n", + " company\n", " \n", " \n", " \n", " \n", - " 1351658\n", - " 1ec10e00-c7a7-4bcc-861f-cd1ff43bfc04\n", - " Friends Of Freedom & Convenience\n", + " 0\n", + " 1869727\n", + " NaN\n", + " NaN\n", + " william \bstoner\n", + " individual\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 1\n", + " 1779679\n", + " NaN\n", + " NaN\n", + " rm coulon\n", + " individual\n", + " NaN\n", + " NaN\n", + " area agency on aging\n", + " \n", + " \n", + " 2\n", + " 2277221\n", + " NaN\n", + " NaN\n", + " james engelson\n", + " individual\n", + " NaN\n", + " NaN\n", + " retired\n", + " \n", + " \n", + " 3\n", + " 2277156\n", + " NaN\n", + " NaN\n", + " marivic franciaskinner\n", + " individual\n", + " NaN\n", + " NaN\n", + " fibre source international corp\n", + " \n", + " \n", + " 4\n", + " 2341373\n", + " NaN\n", + " NaN\n", + " anthony grindle\n", + " individual\n", + " NaN\n", + " NaN\n", + " zimmerbiomet\n", + " \n", + " \n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + " 861260\n", + " 6acfa74b-d5e1-4afd-b020-dbe429eb1c3f\n", + " NaN\n", + " NaN\n", + " Melissa Hart\n", + " Candidate\n", " PA\n", - " Committee\n", + " REP\n", + " NaN\n", " \n", " \n", - " 1158960\n", - " 6359974e-9e78-409c-b9dd-fe7415304560\n", - " GRETCHEN WHITMER FOR GOVERNOR\n", - " MI\n", - " committee\n", + " 861271\n", + " f111045d-bc3d-4050-9ad7-b3b1e6d72e56\n", + " NaN\n", + " NaN\n", + " Heather Miller\n", + " Candidate\n", + " PA\n", + " DEM\n", + " NaN\n", " \n", " \n", - " 474220\n", - " 9e43c101-03ef-4083-ab60-b7fd76dea7b5\n", - " TUDOR DIXON FOR GOVERNOR INC\n", - " MI\n", - " committee\n", + " 861277\n", + " d40859d7-b523-4ef5-895b-c3a947ab582f\n", + " NaN\n", + " NaN\n", + " Christopher M. Gebhard\n", + " Candidate\n", + " PA\n", + " REP\n", + " NaN\n", " \n", " \n", - " 25789\n", - " 5fb7cb16-912f-4fec-ba37-f201465a5725\n", - " LNAACK BEVERLEY\n", - " MI\n", - " corporation\n", + " 861775\n", + " f5d76d43-86f4-40f9-aeb9-3df97ca8cdf0\n", + " NaN\n", + " NaN\n", + " April Weaver\n", + " Candidate\n", + " PA\n", + " REP\n", + " NaN\n", " \n", " \n", - " 495642\n", - " 6359974e-9e78-409c-b9dd-fe7415304560\n", - " GRETCHEN WHITMER FOR GOVERNOR\n", - " MI\n", - " committee\n", + " 861920\n", + " 1a0cf90d-3252-4c8d-b109-dea084a01f69\n", + " NaN\n", + " NaN\n", + " Krista Paolucci\n", + " Candidate\n", + " PA\n", + " REP\n", + " NaN\n", " \n", " \n", "\n", + "

2505346 rows × 8 columns

\n", "" ], "text/plain": [ - " id \\\n", - "1351658 1ec10e00-c7a7-4bcc-861f-cd1ff43bfc04 \n", - "1158960 6359974e-9e78-409c-b9dd-fe7415304560 \n", - "474220 9e43c101-03ef-4083-ab60-b7fd76dea7b5 \n", - "25789 5fb7cb16-912f-4fec-ba37-f201465a5725 \n", - "495642 6359974e-9e78-409c-b9dd-fe7415304560 \n", - "\n", - " name state entity_type \n", - "1351658 Friends Of Freedom & Convenience PA Committee \n", - "1158960 GRETCHEN WHITMER FOR GOVERNOR MI committee \n", - "474220 TUDOR DIXON FOR GOVERNOR INC MI committee \n", - "25789 LNAACK BEVERLEY MI corporation \n", - "495642 GRETCHEN WHITMER FOR GOVERNOR MI committee " + " id first_name last_name \\\n", + "0 1869727 NaN NaN \n", + "1 1779679 NaN NaN \n", + "2 2277221 NaN NaN \n", + "3 2277156 NaN NaN \n", + "4 2341373 NaN NaN \n", + "... ... ... ... \n", + "861260 6acfa74b-d5e1-4afd-b020-dbe429eb1c3f NaN NaN \n", + "861271 f111045d-bc3d-4050-9ad7-b3b1e6d72e56 NaN NaN \n", + "861277 d40859d7-b523-4ef5-895b-c3a947ab582f NaN NaN \n", + "861775 f5d76d43-86f4-40f9-aeb9-3df97ca8cdf0 NaN NaN \n", + "861920 1a0cf90d-3252-4c8d-b109-dea084a01f69 NaN NaN \n", + "\n", + " full_name entity_type state party \\\n", + "0 william \bstoner individual NaN NaN \n", + "1 rm coulon individual NaN NaN \n", + "2 james engelson individual NaN NaN \n", + "3 marivic franciaskinner individual NaN NaN \n", + "4 anthony grindle individual NaN NaN \n", + "... ... ... ... ... \n", + "861260 Melissa Hart Candidate PA REP \n", + "861271 Heather Miller Candidate PA DEM \n", + "861277 Christopher M. Gebhard Candidate PA REP \n", + "861775 April Weaver Candidate PA REP \n", + "861920 Krista Paolucci Candidate PA REP \n", + "\n", + " company \n", + "0 NaN \n", + "1 area agency on aging \n", + "2 retired \n", + "3 fibre source international corp \n", + "4 zimmerbiomet \n", + "... ... \n", + "861260 NaN \n", + "861271 NaN \n", + "861277 NaN \n", + "861775 NaN \n", + "861920 NaN \n", + "\n", + "[2505346 rows x 8 columns]" ] }, - "execution_count": 5, + "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "orgs_sample.head(5)" + "sample_inds" ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id 1ec10e00-c7a7-4bcc-861f-cd1ff43bfc04\n", - "name Friends Of Freedom & Convenience\n", - "state PA\n", - "entity_type Committee\n", - "Name: 1351658, dtype: object\n", - "id 6359974e-9e78-409c-b9dd-fe7415304560\n", - "name GRETCHEN WHITMER FOR GOVERNOR\n", - "state MI\n", - "entity_type committee\n", - "Name: 1158960, dtype: object\n", - "id 9e43c101-03ef-4083-ab60-b7fd76dea7b5\n", - "name TUDOR DIXON FOR GOVERNOR INC\n", - "state MI\n", - "entity_type committee\n", - "Name: 474220, dtype: object\n", - "id 5fb7cb16-912f-4fec-ba37-f201465a5725\n", - "name LNAACK BEVERLEY \n", - "state MI\n", - "entity_type corporation\n", - "Name: 25789, dtype: object\n", - "id 6359974e-9e78-409c-b9dd-fe7415304560\n", - "name GRETCHEN WHITMER FOR GOVERNOR\n", - "state MI\n", - "entity_type committee\n", - "Name: 495642, dtype: object\n", - "id f1df070b-a91b-4aab-b943-4f80e5c41026\n", - "name MICHIGAN LABORERS POLITICAL LEAGUE\n", - "state MI\n", - "entity_type committee\n", - "Name: 1939825, dtype: object\n", - "id 57fbfb3e-835c-4096-9dc9-1555816aff0d\n", - "name PLUMBERS AND PIPEFITTERS LOCAL 333 PAC\n", - "state MI\n", - "entity_type committee\n", - "Name: 1643401, dtype: object\n", - "id 357e354f-d81b-4eb5-af6e-574afd175672\n", - "name MICHIGAN FARM BUREAU POLITICAL ACTION COMMITTEE\n", - "state MI\n", - "entity_type committee\n", - "Name: 2088505, dtype: object\n", - "id 1a5d85e2-0382-4064-9606-8ee0a2be5ea1\n", - "name ANEDOT INC \n", - "state MI\n", - "entity_type corporation\n", - "Name: 157224, dtype: object\n", - "id 6d8e2e79-72c1-487e-835f-ededfe0aafaa\n", - "name DEMOCRATIC LEGISLATIVE CAMPAIGN COMMITTEE\n", - "state MI\n", - "entity_type committee\n", - "Name: 854930, dtype: object\n" - ] - } - ], - "source": [ - "for index, row in orgs_sample.iterrows():\n", - " print(row)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, + "execution_count": 63, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idcompanyentity_typefirst_namefull_namelast_namepartystatetransaction_iddonor_idyearamountrecipient_idoffice_soughtpurposetransaction_typedonor_typerecipient_typedonor_office
025625730individualNaNvarious 0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
11617483aggregate cashindividualNaNcash _small donationsNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], "text/plain": [ - "{'color': 'blue', 'size': 2}" + " id company entity_type first_name full_name \\\n", + "0 2562573 0 individual NaN various 0 \n", + "1 1617483 aggregate cash individual NaN cash _small donations \n", + "\n", + " last_name party state transaction_id donor_id year amount recipient_id \\\n", + "0 NaN NaN NaN NaN NaN NaN NaN NaN \n", + "1 NaN NaN NaN NaN NaN NaN NaN NaN \n", + "\n", + " office_sought purpose transaction_type donor_type recipient_type \\\n", + "0 NaN NaN NaN NaN NaN \n", + "1 NaN NaN NaN NaN NaN \n", + "\n", + " donor_office \n", + "0 NaN \n", + "1 NaN " ] }, - "execution_count": 38, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "G = nx.Graph()\n", - "G.add_node(0)\n", - "nx.set_node_attributes(G, \"red\", name=\"color\")\n", - "nx.set_node_attributes(G, 2, name=\"size\")\n", - "G.add_node(1)\n", - "nx.set_node_attributes(G, \"blue\", name='color')\n", - "G.nodes[0]\n" + "sample_inds = inds_sample.loc[inds_sample['id'].isin(ind_id_there)]\n", + "# apply dedup\n", + "sample_inds = deduplicate_perfect_matches(sample_inds)\n", + "\n", + "# map the uuids in transaction donor and recipient columns to the deduplicated uuids\n", + "deduped = pd.read_csv(\"../output/deduplicated_UUIDs.csv\")\n", + "transactions[['donor_id','recipient_id']] = transactions[['donor_id','recipient_id']].replace(deduped)\n", + "\n", + "# add recipient name to transactions df: \n", + "# this step took more than 16 minutes to run...think of alternative way\n", + "# id_to_name = {id: name for id, name in zip(inds_sample.id.tolist(), inds_sample.full_name.tolist())} #the same would be applied to orgs\n", + "transactions['recipient_name'] = transactions['recipient_id'].apply(lambda x: sample_inds.loc[sample_inds.id == x] )\n", + "\n", + "# left merge according to ind_id and transaction donor_id. This was entities that only received money will still be there, no info from ind_dataset\n", + "# is lost\n", + "merged_inds_sample = pd.merge(sample_inds,transactions,how='left',left_on='id',right_on='donor_id')\n", + "merged_inds_sample.head(2)" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 93, "metadata": {}, "outputs": [ { @@ -446,52 +979,76 @@ " \n", " \n", " id\n", - " name\n", - " state\n", + " company\n", " entity_type\n", + " first_name\n", + " full_name\n", + " last_name\n", + " party\n", + " state\n", " \n", " \n", " \n", " \n", - " 297930\n", - " e44b8553-0dff-4a6b-8335-d97849641ff8\n", - " FRIENDS OF DANA NESSEL\n", - " MI\n", - " committee\n", - " \n", - " \n", - " 945536\n", - " 4f5b8fc4-c871-4774-a436-1622b8e26a44\n", - " MALLORY MCMORROW FOR MICHIGAN\n", - " MI\n", - " committee\n", + " 27\n", + " 100894\n", + " none (is a candidate)\n", + " candidate\n", + " NaN\n", + " abdussamad, shams\n", + " NaN\n", + " democratic\n", + " AZ\n", " \n", " \n", "\n", "" ], "text/plain": [ - " id name \\\n", - "297930 e44b8553-0dff-4a6b-8335-d97849641ff8 FRIENDS OF DANA NESSEL \n", - "945536 4f5b8fc4-c871-4774-a436-1622b8e26a44 MALLORY MCMORROW FOR MICHIGAN \n", + " id company entity_type first_name full_name \\\n", + "27 100894 none (is a candidate) candidate NaN abdussamad, shams \n", "\n", - " state entity_type \n", - "297930 MI committee \n", - "945536 MI committee " + " last_name party state \n", + "27 NaN democratic AZ " ] }, - "execution_count": 42, + "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ - ".head(2)" + "sample_inds.loc[sample_inds.full_name == 'abdussamad, shams']" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "def add_notes_from_df(df):\n", + " G = nx.MultiDiGraph()\n", + " #inds or org...\n", + " if 'name' in df.columns:\n", + " node_name = 'name'\n", + " else: node_name = 'full_name'\n", + "\n", + " for _, row in df.iterrows():\n", + " G.add_node(row[node_name])\n", + " for column in df.columns:\n", + " # only add info that's present\n", + " if (row[column] != 'nan'):\n", + " nx.set_node_attributes(G, row[column], name=column)\n", + " #nx.set\n", + " nx.draw_random(G, with_labels=True)\n", + " plt.show()\n", + " return G" + ] + }, + { + "cell_type": "code", + "execution_count": 77, "metadata": {}, "outputs": [ { @@ -516,99 +1073,360 @@ " \n", " \n", " id\n", + " company\n", + " entity_type\n", " first_name\n", - " last_name\n", " full_name\n", - " entity_type\n", - " state\n", + " last_name\n", " party\n", - " company\n", + " state\n", + " transaction_id\n", + " donor_id\n", + " year\n", + " amount\n", + " recipient_id\n", + " office_sought\n", + " purpose\n", + " transaction_type\n", + " donor_type\n", + " recipient_type\n", + " donor_office\n", " \n", " \n", " \n", " \n", - " 891077\n", - " c94a0491-7ea1-45ce-a155-6153ea74da08\n", - " BELA\n", - " LAHNER\n", - " BELA LAHNER ...\n", - " Individual\n", - " MI\n", + " 27\n", + " 100894\n", + " none (is a candidate)\n", + " candidate\n", + " NaN\n", + " abdussamad, shams\n", + " NaN\n", + " democratic\n", + " AZ\n", + " 5088079\n", + " 100894\n", + " 2022.0\n", + " 5.00\n", + " 750413\n", + " state representative - district 11\n", + " e-qual online qc\n", + " ccec $5 qualifying contribution\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 28\n", + " 100894\n", + " none (is a candidate)\n", + " candidate\n", + " NaN\n", + " abdussamad, shams\n", + " NaN\n", + " democratic\n", + " AZ\n", + " 5088080\n", + " 100894\n", + " 2022.0\n", + " 5.00\n", + " 2002235\n", + " state representative - district 11\n", + " NaN\n", + " ccec $5 qualifying contribution\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 29\n", + " 100894\n", + " none (is a candidate)\n", + " candidate\n", + " NaN\n", + " abdussamad, shams\n", + " NaN\n", + " democratic\n", + " AZ\n", + " 5088081\n", + " 100894\n", + " 2022.0\n", + " 100.00\n", + " 1942680\n", + " state representative - district 11\n", + " NaN\n", + " receive loan from candidate or family member\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 30\n", + " 100894\n", + " none (is a candidate)\n", + " candidate\n", + " NaN\n", + " abdussamad, shams\n", + " NaN\n", + " democratic\n", + " AZ\n", + " 5088083\n", + " 100894\n", + " 2022.0\n", + " 5.00\n", + " -1\n", + " state representative - district 11\n", + " NaN\n", + " in-state contributions $100 or less\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 31\n", + " 100894\n", + " none (is a candidate)\n", + " candidate\n", + " NaN\n", + " abdussamad, shams\n", + " NaN\n", + " democratic\n", + " AZ\n", + " 5088084\n", + " 100894\n", + " 2022.0\n", + " 20.00\n", + " -1\n", + " state representative - district 11\n", + " NaN\n", + " in-state contributions $100 or less\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + " 597\n", + " 100883\n", + " none (is a candidate)\n", + " candidate\n", + " NaN\n", + " abeytia, anna lynn\n", + " NaN\n", + " democratic\n", + " AZ\n", + " 5084100\n", + " 100883\n", + " 2022.0\n", + " 10.00\n", + " 2017053\n", + " state representative - district 11\n", + " NaN\n", + " contribution from individuals\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 598\n", + " 100883\n", + " none (is a candidate)\n", + " candidate\n", + " NaN\n", + " abeytia, anna lynn\n", + " NaN\n", + " democratic\n", + " AZ\n", + " 5084102\n", + " 100883\n", + " 2022.0\n", + " 180.00\n", + " 2017970\n", + " state representative - district 11\n", + " video production\n", + " in-kind cont. from individual\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 599\n", + " 100883\n", + " none (is a candidate)\n", + " candidate\n", + " NaN\n", + " abeytia, anna lynn\n", + " NaN\n", + " democratic\n", + " AZ\n", + " 5084103\n", + " 100883\n", + " 2022.0\n", + " 51.99\n", + " 2008747\n", + " state representative - district 11\n", + " NaN\n", + " contribution from individuals\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 600\n", + " 100883\n", + " none (is a candidate)\n", + " candidate\n", + " NaN\n", + " abeytia, anna lynn\n", + " NaN\n", + " democratic\n", + " AZ\n", + " 5084105\n", + " 100883\n", + " 2022.0\n", + " 10.80\n", + " 1193076\n", + " state representative - district 11\n", + " NaN\n", + " contribution from individuals\n", + " NaN\n", + " NaN\n", " NaN\n", - " NOT EMPLOYED\n", " \n", " \n", - " 617571\n", - " c38816dd-8a47-4102-97cd-59d0f6bc42dc\n", - " JANICE\n", - " SHAPIRO\n", - " JANICE SHAPIRO ...\n", - " Individual\n", - " TX\n", + " 601\n", + " 100883\n", + " none (is a candidate)\n", + " candidate\n", + " NaN\n", + " abeytia, anna lynn\n", + " NaN\n", + " democratic\n", + " AZ\n", + " 5084107\n", + " 100883\n", + " 2022.0\n", + " 51.99\n", + " 1691025\n", + " state representative - district 11\n", + " NaN\n", + " contribution from individuals\n", + " NaN\n", " NaN\n", " NaN\n", " \n", " \n", "\n", + "

575 rows × 19 columns

\n", "" ], "text/plain": [ - " id first_name \\\n", - "891077 c94a0491-7ea1-45ce-a155-6153ea74da08 BELA \n", - "617571 c38816dd-8a47-4102-97cd-59d0f6bc42dc JANICE \n", + " id company entity_type first_name \\\n", + "27 100894 none (is a candidate) candidate NaN \n", + "28 100894 none (is a candidate) candidate NaN \n", + "29 100894 none (is a candidate) candidate NaN \n", + "30 100894 none (is a candidate) candidate NaN \n", + "31 100894 none (is a candidate) candidate NaN \n", + ".. ... ... ... ... \n", + "597 100883 none (is a candidate) candidate NaN \n", + "598 100883 none (is a candidate) candidate NaN \n", + "599 100883 none (is a candidate) candidate NaN \n", + "600 100883 none (is a candidate) candidate NaN \n", + "601 100883 none (is a candidate) candidate NaN \n", + "\n", + " full_name last_name party state transaction_id donor_id \\\n", + "27 abdussamad, shams NaN democratic AZ 5088079 100894 \n", + "28 abdussamad, shams NaN democratic AZ 5088080 100894 \n", + "29 abdussamad, shams NaN democratic AZ 5088081 100894 \n", + "30 abdussamad, shams NaN democratic AZ 5088083 100894 \n", + "31 abdussamad, shams NaN democratic AZ 5088084 100894 \n", + ".. ... ... ... ... ... ... \n", + "597 abeytia, anna lynn NaN democratic AZ 5084100 100883 \n", + "598 abeytia, anna lynn NaN democratic AZ 5084102 100883 \n", + "599 abeytia, anna lynn NaN democratic AZ 5084103 100883 \n", + "600 abeytia, anna lynn NaN democratic AZ 5084105 100883 \n", + "601 abeytia, anna lynn NaN democratic AZ 5084107 100883 \n", "\n", - " last_name \\\n", - "891077 LAHNER \n", - "617571 SHAPIRO \n", + " year amount recipient_id office_sought \\\n", + "27 2022.0 5.00 750413 state representative - district 11 \n", + "28 2022.0 5.00 2002235 state representative - district 11 \n", + "29 2022.0 100.00 1942680 state representative - district 11 \n", + "30 2022.0 5.00 -1 state representative - district 11 \n", + "31 2022.0 20.00 -1 state representative - district 11 \n", + ".. ... ... ... ... \n", + "597 2022.0 10.00 2017053 state representative - district 11 \n", + "598 2022.0 180.00 2017970 state representative - district 11 \n", + "599 2022.0 51.99 2008747 state representative - district 11 \n", + "600 2022.0 10.80 1193076 state representative - district 11 \n", + "601 2022.0 51.99 1691025 state representative - district 11 \n", "\n", - " full_name entity_type state \\\n", - "891077 BELA LAHNER ... Individual MI \n", - "617571 JANICE SHAPIRO ... Individual TX \n", + " purpose transaction_type \\\n", + "27 e-qual online qc ccec $5 qualifying contribution \n", + "28 NaN ccec $5 qualifying contribution \n", + "29 NaN receive loan from candidate or family member \n", + "30 NaN in-state contributions $100 or less \n", + "31 NaN in-state contributions $100 or less \n", + ".. ... ... \n", + "597 NaN contribution from individuals \n", + "598 video production in-kind cont. from individual \n", + "599 NaN contribution from individuals \n", + "600 NaN contribution from individuals \n", + "601 NaN contribution from individuals \n", "\n", - " party company \n", - "891077 NaN NOT EMPLOYED \n", - "617571 NaN NaN " + " donor_type recipient_type donor_office \n", + "27 NaN NaN NaN \n", + "28 NaN NaN NaN \n", + "29 NaN NaN NaN \n", + "30 NaN NaN NaN \n", + "31 NaN NaN NaN \n", + ".. ... ... ... \n", + "597 NaN NaN NaN \n", + "598 NaN NaN NaN \n", + "599 NaN NaN NaN \n", + "600 NaN NaN NaN \n", + "601 NaN NaN NaN \n", + "\n", + "[575 rows x 19 columns]" ] }, - "execution_count": 43, + "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "inds_sample.head(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [], - "source": [ - "def add_notes_from_df(df):\n", - " G = nx.MultiDiGraph()\n", - " if 'name' in df.columns:\n", - " node_name = 'name'\n", - " else: node_name = 'full_name'\n", - " for index, row in df.iterrows():\n", - " # if nodes 1 and 2 don't exist, this both creates the nodes and adds the edges to them\n", - " # the weight can be added to show the magnitude of the edge\n", - " G.add_node(row[node_name])\n", - " for column in df.columns:\n", - " nx.set_node_attributes(G, row[column], name=column)\n", - " nx.draw_random(G, with_labels=True)\n", - " plt.show()\n", - " return G" + "merged_inds_sample.loc[merged_inds_sample.donor_id.notnull()]" ] }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 91, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAHzCAYAAACe1o1DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABtw0lEQVR4nO3deVxUVeMG8OfODDCAyCbgCigCKWJWoqaiYOKSSKKk4JJaqWm2+KbVqxZqaW4t9mpamlkygCJQmqa24IoZLe4rJeIKsskysszy+4Mfk+PMsN1RUJ/v5zOfV+4599xzh+nlmXvPOVfQarVaEBERERHVk6ShO0BERERE9zcGSiIiIiIShYGSiIiIiERhoCQiIiIiURgoiYiIiEgUBkoiIiIiEoWBkoiIiIhEYaAkIiIiIlEYKImIiIhIFAZKIiIiIhKFgZKIiIiIRGGgJCIiIiJRGCiJiIiISBQGSiIiIiIShYGSiIiIiERhoCQiIiIiURgoiYiIiEgUWUN3gIiIiIhMKylTISO3BOUqDSxlEng628LWqnFFuMbVGyIiIiLC+awiKA5nIuVsNjLzlNDeViYAcHeyQbCvK8Z0d4e3m11DdfPfPmm1Wm3N1YiIiIjobruUp8Ts5OPYn54DqUSAWmM6plWVB7ZvhkXh/mjjZHMPe6qPgZKIiIioEYhPy0T01pNQabTVBsk7SSUCZBIB88P8EBngfhd7aBoDJREREVEDW5lyHst3nxPdzswBPpge7G2GHtUNZ3kTERERNaD4tEyzhEkAWL77HDalZZqlrbpgoCQiIrrNhg0bIAgCfv/992rrabVabNy4EX369IGDgwNsbGzg7++PBQsWoKSkxKB+UFAQOnXqpLetvLwcK1aswGOPPYamTZvCwcEBfn5+mDx5Ms6cOWPW8yLTgoKCIAhCja958+bp9jl9+jQEQYBcLkdBQYHJtktLS/Hxxx+je/fusLe3h1wuh4+PD6ZPn45z587hUp4S0VtPomC/AhcXh0KtvKm3v6rwBq6seRGXPolE2fX0Wp3Pu1tP4lKesj5vRb1xljcREVEdqdVqjB49Gps3b0ZgYCDmzZsHGxsb7N+/H/Pnz0dCQgJ++uknuLm5VdvOiBEj8MMPPyAqKgqTJk1CRUUFzpw5g++//x49e/bEI488co/O6OE2Z84cvPjii7qf09LS8Omnn2L27Nno0KGDbnvnzp11/46JiUHz5s2Rn5+PLVu26O1fJScnB4MGDcIff/yB0NBQjB49Gk2aNMHZs2cRHx+PL774AqNW74fKxHhJVVEOsmJnQ3OrCK5RC2HVvH2tzkel0WJ28nFsfKF7bd8C0RgoiYiI6mjp0qXYvHkzZs6ciWXLlum2T548GSNHjsSwYcMwYcIE/PDDDybbSEtLw/fff4+FCxdi9uzZemUrV66s9qoXmVdISIjez3K5HJ9++ilCQkIQFBRkUF+r1SI2NhajR4/GhQsXoFAojAbKCRMm4K+//sKWLVswYsQIvbL33nsP016fhZ/Tc4z2SVWU+/9hshCuke/XOkwCgFqjxf70HKRnF6G9671ZUoi3vImIiOrg1q1bWLZsGXx8fPDBBx8YlA8dOhTjx4/Hzp078euvv5ps5++//wYA9OrVy6BMKpXC2dnZfJ0mszp48CAyMjIQGRmJyMhI7Nu3D5cvX9arc/jwYWzfvh0vvPCCQZgEACsrK7QZPAVSiWBQpirOQ1bcbKiVN+Ea+R6sWtR9ko1UIiDm13s3lpKBkoiIqA4OHDiA/Px8jB49GjKZ8Rt9zz33HADg+++/N9mOh4cHAEChUEClUpm/o3TXKBQKeHl5ISAgAEOHDoWNjQ3i4uL06mzduhUAMG7cOJPtpJzNNlgeSF1SUBkmS/LhNmoBrFr41KuPao0WKeey67VvfTBQEhER1cGpU6cAAI8++qjJOlVlp0+fNlmnR48e6Nu3L9auXYvWrVtj9OjR+Oyzz5CZee9n6FLtVVRUICEhAZGRkQAAa2trhIWFQaFQ6NWr+t37+/sbbae4TIVMIxNnshPmQ12cB7eRC2DV0ldUXzNzlSgpuzdfVhgoiYiI6qCoqAgAYGdnemxaVVlhYaHJOoIgYNeuXXj//ffh6OiIuLg4vPzyy/Dw8MCoUaM4hrKR+uGHH5Cbm4uoqCjdtqioKBw9ehQnT57Ubav63Zv6nFzMLYGxqTgaZQEkFnJImziJ7qsWQEau4YoDdwMDJRERUR1UBYSqYGlMbUInUDmObs6cOTh9+jSuXr2KuLg49OjRA5s3b8b06dPN12kym5iYGLRt2xZWVlZIT09Heno6vLy8YGNjo3eVsmnTpgBMf07KVRqj251D34CmtBhZ8XOhLikQ3V9TxzE3BkoiIqI6qFpG5tixYybrVJV17Nix1u22aNFCN8HD29sbmzdv5tjKRqawsBDbtm3DhQsX4O3trXt17NgRSqUSsbGxqHoAYdWST8ePHzfalqXMeASTu3dCs2fegupmFrI2vQtNqbgrjKaOY24MlERERHXQu3dvODg4IDY2Fmq12midb775BgAQGhpa5/YtLCzQuXNnVFRUICfH+JIy1DCSkpJQWlqK1atXIyEhQe/1/vvv4+LFizh48CCAytn+QOUVTWM8nW1hOL+7ko13dzg//Roqsi8ge8t8aCrK6tVf4f+Pcy8wUBIREdWBjY0NZs6cibNnz2LOnDkG5du3b8eGDRswcOBA9OjRw2Q758+fNzoBp6CgAIcOHYKjoyNcXFzM2ncSJyYmBu3atcNLL72EiIgIvdfMmTPRpEkT3W3vJ598EoMGDcK6devw7bffGrRlIWigSv3a5LGadOoHx/6TUHb5FG4kL4JWXfer1e7ONrC1ujdLjnNhcyIiIiPWr1+PnTt3Gmx/7bXX8Pbbb+Ovv/7CkiVLcOjQIYwYMQLW1tY4cOAAYmJi0KFDB3z9temwAABHjx7F6NGjMXjwYAQGBsLJyQlXrlzB119/jatXr+KTTz6BVCq9W6dHdXT16lWkpKTg1VdfNVpuZWWFgQMHIiEhAZ9++iksLCzwzTffYMCAARg+fDiGDh2Kp556Cra2tjh//jzi4+Nx7cpVePSeYLB0UJWmXcOguVWEmwfjkPP9R2gWNhOCULtrgVKJgGAf13qfb10xUBIRERmxevVqo9snTJgAOzs7bN68Gd988w3WrVuHd955B+Xl5fDy8kJ0dDTeeOMN2NpWf6uxT58+eO+99/DDDz/go48+wo0bN2BnZ4fHHnsMS5YsMboYNjWc+Ph4aDQa3a1sY4YOHYrExET88MMPCAsLg4uLC1JTU/HZZ59h06ZNmDNnDsrLy+Hh4YGwsDA8M+YFvPDtZZPtAYBD4BhoSotR9Mc25Mlt4Tzw5Vr1V63RYmwP9zqdoxiCtmr0KBERERHdU+O+PIzUf3JNXqWsD6lEQM92zvf0Wd4cQ0lERETUQBaF+0Nm5PGLYsgkAhaFG19Q/W5hoCQiIiJqIG2cbDA/zM+sbS4I80MbJxuztlkTBkoiIiKiBhQZ4I6ZA+r3zO47zRrgi1EB927sZBWOoSQiIiJqBOLTMhG99SRUGm2dxlRKJQJkEgELwvwaJEwCDJREREREjcalPCVmJx/H/vQcSCVCtcGyqjywfTMsCve/57e5b8dASURERNTInM8qguJwJlLOZSMzV4nbw5qAykXLg31cMbaHO9q7Vv/M+HuBgZKIiIioESspUyEjtwTlKg0sZRJ4Otvesyfg1BYDJRERERGJwlneRERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkSuOac05mcT8sL0BEREQPDqaMB4RuAdSz2cjMM7IAqpMNgn1dMaa7O7zdGn4BVCIiInpwcB3K+9z9+ogmIiIienAwUN7HxD5Efn6YHyIb6CHyRERE9OBgoLxPrUw5j+W7z4luZ+YAH0wP9jZDj4iIiOhhxVne96H4tEyzhEkAWL77HDalZZqlLSIiIno41StQ3rx5E926dYNcLsfOnTsBAPPmzYMgCCZf169fx0cffQRBEPDTTz+ZbHvt2rUQBAFbt24FAAQFBaFTp056dTw9PSEIAl555RWD/ffs2QNBELBly5ZqzyEjIwOCIGD58uVGy6vOJycnR7dtwoQJJs9PLpcb9KHqJZVK4erqioiICJw+fbpW71fVKygoyODYUd08cHFx6L+vZeG6Y5dePIaLi0NRcuZAted/u3e3nsSlPCWCgoJM9uPMmTN6+2RmZuKll16Cp6cnrKys4OrqimHDhuHgwYMG7dfm/aiN48ePIyIiAh4eHpDL5WjVqhVCQkLwv//9T69e1efD2GvQoEG6elW/Azc3NyiVSoPjeXp6IjQ01GhfCgoKIJfLIQiC3jmI+b1W95kiIiJqzOo8y7uwsBADBgzAsWPHkJycrPcHGgBWr16NJk2aGOzn4OCAyMhIzJo1C7Gxsejfv7/R9mNjY+Hs7IzBgwfX2Je1a9fiv//9L1q2bFnX06g3KysrrFu3zmC7VCo12Pbqq68iICAAFRUVOHbsGNasWYM9e/bgxIkTGD58ONq3b6+rW1xcjKlTpyI8PBzDhw/XbXdzc9M79hNj38b5G8XQaP49jiARd6FZpdFidvJxAEDr1q3xwQcfGNS5/T0+ePAgnn76aQDAiy++iI4dO+L69evYsGEDAgMDsWLFCqNhv7r3o3nz5tX2MTU1FcHBwXB3d8ekSZPQvHlzXLp0Cb/++qvR43Xp0gVvvPFGtedRJTs7G6tXrzZa35SEhAQIgoDmzZtDoVDg/fffB4B6/15r+5kiIiJqjOoUKIuKijBw4EAcOXIESUlJRkNfREQEmjVrZnT/li1bIjg4GElJSVi9ejWsrKz0yq9cuYJ9+/Zh8uTJsLCwqLYvfn5+OHv2LBYvXoxPP/20Lqchikwmw9ixY2tVNzAwEBEREbqffX19MXXqVHzzzTd488030blzZ11ZTk4Opk6dis6dO5tsXyqV4YpLAGxcxJ3DndQaLfan58CtQg17e/tqzy8/Px8RERGwtrbGwYMH4eXlpSv7z3/+g4EDB+L111/HE088gZ49e+rtW9P7UZ2FCxfC3t4eaWlpcHBw0CvLzs42qN+qVata/566dOmCZcuWYdq0abC2tq7VPjExMXj66afh4eGB2NhYXaDs3LlznX+vdflMERERNUa1vrRVXFyMQYMG4c8//0RiYiKGDBlSrwOOHTsWN2/exPbt2w3K4uPjodFoMGbMmBrb8fT0xHPPPYe1a9fi6tWr9erLvRYYGAgA+Pvvv+u1f4VGA6lEMGeXdKQSAVmFpTXW+/zzz3H9+nUsW7ZML0wCgLW1Nb7++msIgoAFCxbU2FZd3o+///4bfn5+BmESAFxdXWvcvzrvvvsusrKysHr16lrVz8zMxP79+xEZGYnIyEhcuHABqampovpARER0P6t1oBw8eDDS0tKQkJBgclwZAOTl5SEnJ0fvVVBQoCsfPnw45HI5YmNjDfaNjY2Fh4cHevXqVas+zZkzByqVCosXL67taRhQKpUG/c3JyTE6pq6KsfqFhYU1HisjIwMA4OjoWK++qjValBcXQK28qffSlJnua13aLlBWQK1WG5xbcXGxrt62bdsgl8sxcuRIo+20bdsWvXv3xi+//IJbt25Ve8y6vB8eHh74448/cOLEiVqdT0VFhdHfk7E+BQYGol+/fli6dGmNfQaAuLg42NraIjQ0FN26dYOXlxcUCkWt+mVKfT9TREREjUGtA+Xhw4eRkJCAsLCwauv5+vrCxcVF79WjRw9dedOmTTF06FBs375d7w/m2bNn8eeff2L06NEQhNpdhWvXrh3GjRuHtWvX4tq1a7U9FT3R0dEG/XVxccGyZcuM1i8pKTFa31jAKioqQk5ODq5du4Zdu3bh9ddfhyAIGDFiRJ37WaHWQFNeisufjjF43fi2/oH6dqUVapw5c8bg3KZPn66rc+rUKfj6+hoMV7jdo48+ioqKCqSnp+ttF/N+zJw5E0qlEl26dEHPnj3x1ltvYffu3aioqDBaf/fu3UZ/TytWrDBaPzo6GllZWVizZk2NfVEoFHjmmWd0t8dHjRqFzZs3Q6VS1bivMXX5TBERETVGtR5DKZfL0aZNmxrrJSYmomnTpnrbbG1t9X4eO3YsEhISkJSUhAkTJgCA7oplbW53327u3LnYuHEjFi9ebDIsVGfy5Ml49tlnDbZ/88032Lhxo8F2uVyObdu2GWw3Nm70+eef1/vZxcUFGzduREBAQJ37WVKmgiCzhEvEuwZlUuumRvaon1Zt3LFh/Zd6226fyFJUVAQ7u+of3VhVfucVNjHvR0hICA4dOoQPPvgAu3btwqFDh7B06VK4uLhg3bp1Bl90unfvrhvXeDtvb+Nrbvbp0wfBwcFYunQpXnrpJZNjKY8dO4bjx4/rTVyKiorCokWLsGvXrnoNBanLZ4qIiKgxqnWgtLS0xKBBg7B//374+vqarNenT58a/xAOHjwYTk5OiI2N1QXKuLg4PProo/Dz86ttlwD8e5Xyiy++wNtvv12nfYHKgGFsxvmBA8aX3ZFKpSZnqN/p3XffRWBgIIqLi5GcnIz4+HhI6jkjW6MFIEhg7dmlXvvXltzaptrzs7OzQ1FRUbVtVJXfGTzFvh8BAQFISkpCeXk5jh49iuTkZHz88ceIiIjAkSNH0LFjR13dZs2a1fr3VGXevHno27cv1qxZgxkzZhitExMTA1tbW7Rr1053BVYul8PT0xMKhaJegbIunykiIqLGqNZ/zXfs2IFbt24hJCQEly5dEnVQCwsLjBw5Er/88guysrKQlpaG8+fP1/nqZJWqsZRLliwR1S9z8/f3R//+/TFs2DB8/fXXCAsLw6RJk+r1/t2luTgGahpu0KFDB5w9exZlZWUm6xw7dgwWFhYGVwPN9X5YWloiICAAixYtwurVq1FRUYGEhIQ6tWFMnz59EBQUZHIspVarRVxcHEpKStCxY0d4e3vrXhkZGfjuu+/0xpsSERE9LGodKLt164Zvv/0W2dnZCAkJwY0bN0QdeMyYMVCr1di0aRNiY2MrF+yOiqpXW15eXhg7diw+//zzeo+lvBcWL16M0tJSLFy4sM77NrGq85Kh9WIhrf4jERoaitLSUpMBLiMjA/v370e/fv1qXIJHzPtRpWvXrgBgtt/7vHnzcP36dXz++ecGZXv37sXly5exYMECJCQk6L2++OILKJVKfPvtt2bpBxER0f2kTvdfn3rqKcTFxSE9PR2DBg0SNQu1V69e8PT0RExMDDZt2oS+ffuidevW9W5v7ty5qKiowNKlS+vdxt3m5eWFESNGYMOGDbh+/Xqd9pVJJajlXKV6k1tIa7wSOmXKFLi6umLWrFn4559/9MpKS0sxceJEaLVavPuu4VjPO9Xl/UhJSYGxx87v2LEDAKodhlEXffv2RVBQEJYsWYLSUv1llKpud8+aNQsRERF6r0mTJsHb21v0bG8iIqL7UZ0ve4WHh2Pt2rV4/vnnERYWhp07d+o9Im7Lli1Gn5QTEhKi93QQQRAwevRoLFq0CABqtW5hdaquUn799dei2qmJSqVCTEyM0bLw8HCDCUh3mjVrFjZv3oxPPvmkzssdCVoNlKdS9J6SU8XG50lILP/9PSjPpqIi97JBvSb+T0HW1HBldKlEgIONBaCtfqays7MztmzZgiFDhuDxxx83eFJOeno6VqxYYbCouSm1fT9eeeUVKJVKhIeH45FHHkF5eTlSU1OxadMmeHp6YuLEiXr1r1y5YvT31KRJEwwbNqzaPkVHRyM4OFhvW1lZGRITExESEmLykYhhYWFYsWIFsrOz67Q2ptjPFBERUUOr133UiRMnIi8vDzNnzsSzzz6L5ORkXdnUqVON7pOSkqIXKIHK296LFi2ClZWV3hNU6mvu3LmIiYmBWq0W3ZYpZWVlGDdunNGyCxcu1PjHv2vXrggKCsLq1avx3//+F/b29rU+trqiHDe2fmi0TP7Sl/qB8vQ+4/Xc/Y0GSrVGC7emcpTcrHkdxsDAQBw7dgyLFi1CQkICrl27Bnt7e/Ts2RPr169H7969a3lGtX8/li9fjoSEBOzYsQNffPEFysvL4e7ujmnTpmHu3LkGC54fOXLE6O/Jw8OjxkAZFBSEvn37Yu/evbpt27dvR0FBAYYOHWpyv6FDh+LDDz9EfHw8Xn311WqPcTuxnykiIqKGJmiN3UekRmvcl4eR+k8u1Brz/dqkEgE92zlj4wvdzdYmERERPTzqt4YNNZhF4f6QmXnKt0wiYFG4v1nbJCIioocHA+V9po2TDeaH1W2tzposCPNDGycbs7ZJREREDw8GyvtQZIA7Zg7wMUtbswb4YlSAu1naIiIioocTx1Dex+LTMhG99SRUGm2dxlRKJQJkEgELwvwYJomIiEg0Bsr73KU8JWYnH8f+9BxIJUK1wbKqPLB9MywK9+dtbiIiIjILBsoHxPmsIigOZyLlXDYyc5W4/ZcqAHB3tkGwjyvG9nBHe1c7U80QERER1RkD5QOopEyFjNwSlKs0sJRJ4OlsC9t79OhGIiIievgwUBIRERGRKJzlTURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREonAtGao3Lk9EREREAAMl1ZFuAfWz2cjMM7KAupMNgn1dMaa7O7zduIA6ERHRw4DrUFKt8BGPREREZAoDJdUoPi0T0VtPQqXRVhsk7ySVCJBJBMwP80NkgPtd7CERERE1JAZKqtbKlPNYvvuc6HZmDvDB9GBvM/SIiIiIGhvO8iaT4tMyzRImAWD57nPYlJZplraIiIiocal1oJw3bx4EQTD5un79+t3s50Pj+PHjiIiIgIeHB+RyOVq1aoWQkBD873//06vn6emJ0NBQo23s2bMHgiBgy5YtRss/++wzCIKA7t27m+yHIAiI6uaBi4tDcXHxUFxe+Ryy4t9B6cVjevUuf/Y8shPm622r3OffV+ZHz+K64m3858OvcClPafR4J0+exNixY9GqVStYWVmhZcuWGDNmDE6ePGmyj0RERNQ41HmW9+rVq9GkSROD7Q4ODuboz0MtNTUVwcHBcHd3x6RJk9C8eXNcunQJv/76K1asWIFXXnnFLMdRKBTw9PTEb7/9hvT0dLRv395oPeu2j8HGrx8ALVQFWSj6azuy4ubA9dloWHt1rfYYcs/HYNvp//e9mY3iv3bg6qb5mNDCAT9//Jpe3aSkJERFRcHJyQkvvPAC2rZti4yMDHz55ZfYsmUL4uPjER4ebpZzJyIiIvOrc6CMiIhAs2bN7kZfHnoLFy6Evb090tLSDAJ6dna2WY5x4cIFpKamIikpCVOmTIFCoUB0dLRenfNZRQAAmWNLNOkUrNtu4/Mkrq2fjsLfv6sxUFo46e9r69sLV9dNRerWjUj/7/No71q5pNDff/+NcePGoV27dti3bx9cXFx0+7z22msIDAzEuHHjcOzYMbRr1070+RMREZH5cQxlI/L333/Dz8/P6NVeV1dXsxxDoVDA0dERQ4YMQUREBBQKhWGdw8bHOlq6ekJi3RSqgqw6H9eiWRtIrJtCXXAdMb/+2/6yZcugVCrxxRdf6IVJAGjWrBk+//xzlJSUYOnSpXU+JhEREd0bdQ6UeXl5yMnJ0XsVFBTcha49fDw8PPDHH3/gxIkTtapfUVFh8LvIycnBzZs3Te6jUCgwfPhwWFpaIioqCufPn0daWppenZSzxq+GqkuLoSkthsS67guWa0pLoCkthiBvgpRz/7a/bds2eHp6IjAw0Oh+ffr0gaenJ7Zv317nYxIREdG9Uedb3r6+vka3nTlzxiwdepjNnDkTgwcPRpcuXdCtWzcEBgbiqaeeQnBwMCwsLAzq79692+CqXnX++OMPnDlzRjfBp3fv3mjdujUUCgUCAgIAAMVlKmT+/8QZraoCamVlOFUVXEfB3m8ArQa2j/Su8Vh6+xbeQMG+jYBWAxvfXsjMVaKkTAVVaQmuXr2KZ555ptq2OnfujK1bt6KoqAh2dnz6DhERUWNT50CZmJiIpk2b6m2ztbU1W4ceZiEhITh06BA++OAD7Nq1C4cOHcLSpUvh4uKCdevWISwsTK9+9+7d8f777xu0c/ToUcycOdNgu0KhgJubG4KDK8c2CoKAUaNGISYmBh9++CGkUiku5pboHqdYfGw3io/t1u0vyCxhFzAMdgHVB0Bj+0IiQ9PuI9C02zBoAWTklsBeUzlWs6aQWFVeWFjIQElERNQI1TlQ9unTh5Ny7qKAgAAkJSWhvLwcR48eRXJyMj7++GNERETgyJEj6Nixo65us2bN0L9/f4M2ZDLDX6tarUZ8fDyCg4Nx4cIF3fbu3bvjww8/xM8//4wBAwagXKXRlVl794DdE5VLE0ksrWHRzAMSS3mtzkO3r7oCZdfO4+ahzdBWlEEQKkdZlKs0sLOvDIdFRUXVtlVVzjBJRETUONU5UNK9YWlpiYCAAAQEBMDHxwcTJ05EQkKCwYzs2vrll19w7do1xMfHIz4+3qBcoVBgwIABsJT9O6xWZucMa88u9Tre7ftaewVAat0UeT+ugdyjM2x8e8JSJoG9vT1atGiBY8eOVdvWsWPH0KpVK4Mr40RERNQ4MFDeB7p2rVyi59q1a/VuQ6FQwNXVFatWrTIoS0pKQnJyMtasWQNPZ1sI9T6KaU0eG4zCtO9QsG8jbHyehKdz5TCJ0NBQrF27FgcOHEDv3oZjM/fv34+MjAxMmTLlLvSKiIiIzIHLBjUiKSkpMPZo9R07dgAwPiGqNm7duoWkpCSEhoYiIiLC4DV9+nQUFRVh69atsLWSwd3JRtR5GCNIpGjaLRwVuZdge/0v2FpVfpeZNWsWrK2tMWXKFOTm5urtk5eXh5deegk2NjaYNWuW2ftERERE5lHnK5Rbtmwx+qSckJAQuLm5maVTD6tXXnkFSqUS4eHheOSRR1BeXo7U1FRs2rQJnp6emDhxYr3arZohfeeknio9evSAi4sLFAoFRo0ahWBfV+wTcyIm2Po/hYL9MSj8NRHAOwAAb29vfP311xgzZgz8/f0NnpSTk5ODuLg4eHl53YUeERERkTnUOVBOnTrV6PaUlBQGSpGWL1+OhIQE7NixA1988QXKy8vh7u6OadOmYe7cufV+vKVCoYBcLkdISIjRcolEgiFDhkChUCA3NxdjurtjvtGa4kgsrGD3RCguH4jFnj17EBQUBAB49tln8cgjj+CDDz7QhUhnZ2cEBwdj9uzZ6NSp013oDREREZmLoDV2j5UeeuO+PIzUf3Kh1pjv4yGVCOjZzhkbX+hutjaJiIio4XEMJRm1KNwfMol5p+fIJAIWhfubtU0iIiJqeAyUZFQbJxvMD/Mza5sLwvzQ5i5M+CEiIqKGxUBJJkUGuGPmAB+ztDVrgC9GBbibpS0iIiJqXDiGkmoUn5aJ6K0nodJo6zSmUioRIJMIWBDmxzBJRET0AGOgvI+VlKmQkVuCcpUGljIJPJ1tdes7mtulPCVmJx/H/vQcSCVCtcGyqjywfTMsCvfnbW4iIqIHHAPlfeZ8VhEUhzORcjYbmXlK3P7LEwC4O9kg2NcVY7q7w9vN/M++1h3/XDYyc40c39kGwT6uGNvDHe1d+extIiKihwED5X2iMV4hvJdXSImIiKjxYqC8D4gdwzg/zA+RHMNIREREdwkDZSO3MuU8lu8+J7qdmQN8MD3Y2ww9IiIiItLHZYMasfi0TLOESQBYvvscNqVlmqUtIiIiotvxCmU9ZGRkoG3btli2bBlmzpxpUD5v3jzMnz8fN27cQLNmzQzKR44ciYSEBLz55ptYsmSJXpvm1OqlLyFz+Pf56lYyCX6a0ddgTGVBQQF69+6NkydP4uWXX8bKlSvN2g8iIiJ6sHEGxT1WWFiIbdu2wdPTE3FxcVi8eDEEQYCLiws2btyoq7d6Tzp+/34jVIU5cHxq0r8NaDWV/yv8e3G58LdkqIvuqAdAYmOv97NKo8Xs5ON6z9IuLy9HeHg4zp07h4EDB2LVqlVwd3fHm2++acazJiIiogcZA+U9lpiYCLVajfXr16Nfv37Yt28f+vbtC1tbW4wdOxZA5dI8c0/ug7TJDqhvFaNJp+Bq21Se3gdNac311Bot9qfnID27CO1d7aDVajFhwgSkpqYiISEBYWFhmDJlCt5++224u7sjMjLSbOdNREREDy6OobzHFAoFQkJCEBwcjA4dOkChUBjWOZwJqUS4K8eXSgTE/Fo5lvKtt95CYmIitmzZgmeeeQaCIODzzz/HpEmTMH78eOzdu/eu9IGIiIgeLLxCKYJSqUROTo7R7cZcvXoVKSkp+PrrrwEAUVFR+Pjjj7Fy5UpYWlrq6qWcza7T8kB1odZokXIuGy6r9mDFihVITExEaGiorlwQBKxZswYSiQTDhg3DgQMH4Ofnd1f6QkRERA8GXqEUITo6Gi4uLgavZcuWGa0fFxcHKysrPPPMMwCAyMhI5OfnY8eOHbo6xWUqZOYZD6TmkpmrxIQXp6CsrEwvTFYRBAGrV69Gfn4+wyQRERHViFcoRZg8eTKeffZZg+3ffPON3gSbKgqFAkOGDIGdXeUjCb29vfHEE09AoVBg2LBhAICLuSW429PutQAyckvg19K+xrpERERENWGgFMHb2xv9+/c32H7gwAGDbadPn8Zff/2F5557Dunp6brtQUFBWLVqFQoLC9G0aVOUqzR3tc9V7tVxiIiI6MHHQHmPxMTEAABmzJiBGTNmGJQnJiZi4sSJsJTdm1EI9+o4RERE9OBjoLwHtFotYmNjERwcjGnTphmUv/fee1AoFJg4cSI8nW0hAHf1trcAwNPZ9i4egYiIiB4mDJT3wMGDB5GRkYEFCxYgIiLCoPzcuXN45513cPXqVbRs2RLuTja4eBcn5rg728DWir96IiIiMg/e97wHFAoFpFIphgwZYrQ8LCwMGo0G8fHxAIBgX9e7ug5lsI/rXWmbiIiIHk4MlHdZRUUFEhIS0LNnTzg5ORmt06lTJ7Rt21Y3znJMd/e7ug7l2B7ud6VtIiIiejgJWq32bq9SQ/Uw7svDSP0n16zBUioR0LOds96zvImIiIjE4hXKRmpRuD9kZr7tLZMIWBTub9Y2iYiIiBgoG6k2TjaYH2bep9QsCPNDGycbs7ZJRERExEDZiEUGuGPmAB+ztDVrgC9GBXDsJBEREZkfx1DeB+LTMhG99SRUGm2dxlRKJQJkEgELwvwYJomIiOiuYaC8T1zKU2J28nHsT8+BVCJUGyyrygPbN8OicH/e5iYiIqK7ioHyPnM+qwiKw5lIOZeNzFyl3hN1BFQuWh7s44qxPdzR3tWuobpJdM+UlKmQkVuCcpUGljIJPJ1tuXA/EdE9xkB5H+MfUnpY6b5Ync1GZp6RL1ZONgj2dcWY7u7wduMXKyKiu42BkojuGxz6QUTUODFQEtF9QezktPlhfojk5DQioruCgZKIGr2VKeexfPc50e3MHOCD6cHeZugRERHdjutQElGjFp+WaZYwCQDLd5/DprRMs7RFRET/YqB8SH322WcQBAHdu9fuud5vvvkmBEHAqFGjjJZnZGRAEATdSyKRwMnJCYMHD8ahQ4dMtnvw4EGEh4fDzc0NVlZW8PT0xJQpU5CZafhHf968eRAEAW5ublAqlQblnp6eCA0NrdX5UP0IgoDp06cbbF+0aBEEQcDzzz8PjUZT78/D6dOnIQgC5HI5CgoKcClPieitJ/XqXP7seWQnzDe6f9m187i4OBTFx37S21566SSyNkfj8srnEPVke7Rq3QZDhw5FbGysXr3i4mJER0ejU6dOsLW1hbOzM7p06YLXXnsNV69ere3bRET00OGU4IeUQqGAp6cnfvvtN6Snp6N9+/Ym62q1WsTFxcHT0xPbtm1DUVER7OyMz5yNiorC008/DbVajXPnzuGzzz5DcHAw0tLS4O+v/xzx//3vf3jttdfQrl07vPLKK2jRogVOnz6NdevWYdOmTdixYwd69uxpcIzs7GysXr0ab7zxhrg3gcxi8eLFmDNnDsaPH49169ZBIvn3e2pdPg8AEBMTg+bNmyM/Px9btmzBXsEfqjqMlzSm5MwB5Hy7BJZu7WDXNQwyazs4CoXIz0/H2rVrMXr0aABARUUF+vTpgzNnzmD8+PF45ZVXUFxcjJMnTyI2Nhbh4eFo2bKlqL4QET2oGCgfQhcuXEBqaiqSkpIwZcoUKBQKREdHm6y/Z88eXL58Gb/88gsGDhyIpKQkjB8/3mjdxx9/HGPHjtX9HBgYiMGDB2P16tX47LPPdNsPHjyI119/Hb1798bOnTthY/PvDNypU6eiV69eiIiIwMmTJ+Ho6Kh3jC5dumDZsmWYNm0arK2t6/s2kBksW7YM//3vf/Hcc89h/fr1emESqP3nAaj84hIbG4vRo0fjwoULWPfVN7je5y3Rfbx5IBYWzdqg+XPLIUgtAADFAL6d0QdNcUtX79tvv8Vff/0FhUKhC5lVSktLUV5eLrovREQPKt7yfggpFAo4OjpiyJAhiIiIgEKhqLF+x44dERwcjP79+9dY/3aBgYEAgL///ltv+3vvvQdBEPD111/rhUkA8PLywtKlS3Ht2jV8/vnnBm2+++67yMrKwurVq2vdDzK/jz76CG+++SbGjh2Lr776yiBMGmPq8wBUfsnIyMhAZGQkIiMj8duvB6EtzhXdz4r8a7Bs4aMLk0DlzO+YXzPh6uqq21bVp169ehm0IZfL0bRpU9F9ISJ6UDFQPoQUCgWGDx8OS0tLREVF4fz580hLSzNat6ysDImJiYiKigJQeQvzl19+wfXr12t1rIyMDADQu8qoVCrx888/IzAwEG3btjW636hRo2BlZYXvv//eoCwwMBD9+vXD0qVLcevWLSN70922YsUKvPHGGxg9ejQ2bNhQqzAJGP88VFEoFPDy8kJAQACGDh0KicwKhSf3iO6rzN4VpRePQlWYo9um1miRci5br56HhwcA4JtvvgEXvyAiqhsGyofMH3/8gTNnziAyMhIA0Lt3b7Ru3drkVcfvv/8eBQUFuvrDhg2DhYUF4uPjjdZXKpXIyclBVlYWDhw4gIkTJwIAIiIidHXOnz8PlUqFRx991GQ/rays4Ovri9OnTxstj46ORlZWFtasWVPzSZNZff/993j99dcRFRWFb775BlKp1GTd2nwegMrxiwkJCbrPmVpiAXn7bigxQ6C07z4C6sIbuPL5i7geOxsF+2JQeukkLuYUo6RMpas3bNgw+Pr64t1330Xbtm0xceJErF+/HtnZ2dW0TkREAAPlQ0ehUMDNzQ3BwcEAoJu5HR8fD7VabbR+165ddZN27OzsMGTIEJMBNDo6Gi4uLmjevDkCAwNx+vRpfPjhh3oBoqioSNdWdezs7FBYWGi0rE+fPggODuZVygaQlZUFAGjbtm21YRKo3ecBAH744Qfk5ubqroRfzC2BTce+qMi+gPIbF0X1t8mjA+A6cj7k7v4ou3wKN1PjkaV4C1c+n4zknb/o6llbW+Pw4cOYNWsWAGDDhg144YUX0KJFC7zyyisoKysT1Q8iogcZA+VDRK1WIz4+HsHBwbhw4QLS09ORnp6O7t27IysrCz///LNe/YKCAuzYsQN9+/bV1U1PT0evXr3w+++/49w5w7UBJ0+ejB9//BHbtm3DjBkzcOvWLYOgWhUkq4KlKdXNJgcqlxG6fv06r1LeY+PHj8fQoUOxaNEifPzxx9XWrc3nAaic3d22bVtYWVnpPmcWDi0gWFih5NSeundSEPR+tG73BNxGvYc2M+LhNmYx7B4fAtXNbLw8fpTeFUh7e3ssXboUGRkZyMjIwJdffglfX1+sXLkS7733Xt37QUT0kOAs74fIL7/8gmvXriE+Pt7oLWuFQoEBAwbofk5ISEBZWRk+/PBDfPjhh0brz5+vvx6gt7c3+vfvDwAIDQ2FVCrF22+/jeDgYHTt2hUA0L59e8hkMhw7dsxkX8vKynD27FndPsb06dMHQUFBWLp0KV566aXqT57MRiaTYfPmzRg0aBDeeOMNODg46G5l36k2n4fCwkJs27YNpaWl8PY2fIpNycm9cOjzHIT/D4mCzBJalfGrhdqKsv+vY2G0XGIhh7xNJ8jbdILEuiluHozDDz/8YHTVAg8PDzz//PMIDw9Hu3btoFAo8P7779fw7hARPZwYKB8iCoUCrq6uWLVqlUFZUlISkpOTsWbNGt1SPAqFAp06dTK6pNDnn3+O2NhYg0B5pzlz5mDt2rWYO3cudu7cCQCwtbVFcHAwfvnlF1y8eFE3GeJ2mzdvRllZWY0Llc+bNw9BQUFGZ4PT3SOXy7F161YEBwdj0qRJcHBwQHh4eI37Gfs8JCUlobS0FKtXr0azZs0AAKUVavxn8xFU5F1Bwb6NKLt8CvI2fgAAmb0LKnIuGW2/Iu9yZZ2mrkbLb2fVojK8Xrt2rdp6jo6O8PLywokTJ2psk4joYcVA+ZC4desWkpKS8OyzzxqMXwOAli1bIi4uDlu3bsWoUaNw6dIl7Nu3D/Pnzzdav7y8HGPGjMHhw4erfdqOg4MDpkyZgqVLl+LIkSPo0qULAGDu3Ln4+eefMWHCBOzYsUNvPckLFy7gzTffRIsWLTBlypRqz6tv374ICgrCkiVLODP3HmvatCl27tyJwMBAREVFYfv27Xjqqaeq3cfY5yEmJgbt2rUzuMq89rIrMrJv4uavW1Byao8uUFq364rSC39Bee4QbHye1NXXqipQfHQ3JDYOsGzupdt+K+MIrD27GPRFeuUIAMDX1xcAcPToUbRq1UoXaqtcvHgRp06d0tUjIiJDHEP5kNi6dSuKiooQFhZmtLxHjx5wcXHRTbaJjY2FVqs1Wf/pp5+GTCar1ZqUr732GiwtLbF48WLdtj59+mD58uXYs2cPOnfujIULF2L9+vV488038fjjj0OpVCIhIcHo8jJ3io6OxvXr13WTRejecXFxwY8//ghXV1cMGzYMv/32W4373P55uHr1KlJSUox+zoJ9XSGztIR128egPHMQWnXljOwmXQbBwsUTN75djNydK1H01w7cTN2Ea1/PQPm183Ds94LempM3Et/H1S9fRv7er1F0dDcKf9+KG4kLcO3QVt0SRQDw448/wsPDA1FRUVixYgW+/PJLzJkzBz169EBZWRnmzZtnnjeNiOgBxED5kFAoFJDL5QgJCTFaLpFIMGTIEOzcuRO5ublQKBRwd3c3ubSPg4MDevfujU2bNkGlUhmtU6Vly5YYPXo0tmzZoreg9YwZM7Bv3z74+fnhk08+wUsvvYRNmzbh2WefxbFjx4wuMG1MUFAQ+vbtW6u6ZH5t2rTB7t27IZfLMXjwYJw8ebLa+rd/HuLi4qDRaHSh7nZjurtDrdHCun13aG4V4tY/fwAAJBZWaD5mMeyeCEXphb+Q9+MXuHk4ERLrpnAdOQ9NOgXrteM8+BVYNPOA8vQB5P/4OQr2bEBF/nVMfX0mfv75Z8hklTdqRowYgZkzZyIjIwOLFi3CSy+9hLVr1+KJJ57ATz/9VKtb+kREDytBy/uERNRIjfvyMFL/yYVa5PO8byeVCOjZzhkbXzA9VIOIiOqGVyiJqNFaFO4PmUSouWIdyCQCFoX7m7VNIqKHHQMlETVabZxsMD/Mz6xtLgjzQxsnm5orEhFRrTFQElGjFhngjpkDfMzS1qwBvhgV4G6WtoiI6F8cQ0lE94X4tExEbz0JlUZbpzGVUokAmUTAgjA/hkkioruEgZKI7huX8pSYnXwc+9NzIJUI1QbLqvLA9s2wKNyft7mJiO4iBkoiuu+czyqC4nAmUs5lIzNXidv/T0wA4O5sg2AfV4zt4Y72rqafB09ERObBQElE97WSMhUycktQrtLAUiaBp7MtbK34EDAionuJgZKIiIiIROEsbyIiIiIShYGSiIiIiERhoCQiIiIiURgoiYiIiEgUBkoiIiIiEoWBkoiIiIhEYaAkIiIiIlEYKImIiIhIFAZKIiIiIhKFgZKIiIiIRGGgJCIiIiJRGCiJiIiISBQGSiIiIiIShYGSiIiIiERhoCQiIiIiURgoiYiIiEgUBkoiIiIiEoWBkoiIiIhEkTV0B4jItJIyFTJyS1Cu0sBSJoGnsy1srfifLRERNS78y0TUyJzPKoLicCZSzmYjM08J7W1lAgB3JxsE+7piTHd3eLvZNVQ3iYiIdAStVqutuRoR3W2X8pSYnXwc+9NzIJUIUGtM/6dZVR7YvhkWhfujjZPNPewpERGRPgZKokYgPi0T0VtPQqXRVhsk7ySVCJBJBMwP80NkgPtd7CEREZFpDJREDWxlynks331OdDszB/hgerC3GXpERERUN5zlTdSA4tMyzRImAWD57nPYlJZplraIiIjq4qEJlBs2bIAgCPj9999N1snIyIAgCCZfixcvNrpft27dIAgCVq9eXa9jBwUFoVOnTnU/KTKLPXv2YPjw4WjevDksLS3h6uqKoUOHIikpCQAwePBgODo6Iisry2DfmzdvokWLFujevTs0Go1ue3Z2Nt5++234+/ujSZMmkMvlaN++PSZOnIgDBw4AqBwzGb31pF57RX9ux8XFobj29X9M9vfi4lBcXByKwsNJBmWvvfdJjZ9zIiIic+MsbyOioqLw9NNPG2x/7LHHDLadP38eaWlp8PT0hEKhwNSpU+9FF8lMoqOjsWDBAnh7e2PKlCnw8PBAbm4uduzYgREjRkChUOCzzz5Dp06dMGPGDMTGxurtP3v2bOTk5GDnzp2QSCq/n/32228YMmQIioqKEBkZiZdeeglWVla4cOECvv32W2zYsAF79+7F2vNWUN0xXrLk5B5I7d1Qfu0cKvKvwsKxpcm+3/wtCU0efxoSC7lum4YjWIiIqAEwUBrx+OOPY+zYsbWqGxMTA1dXV3z44YeIiIhARkYGPD09724HySy2bNmCBQsWICIiArGxsbCwsNCVzZo1C7t27UJFRQXatm2L6OhovPXWW5gwYQIGDBgAAEhLS8OaNWswc+ZMPProowCA/Px8DBs2DDKZDEeOHMEjjzyid8z3338f8fHxuKHUYH96jl5ZRcF1lF05DZfw2cjdtQolJ/fAofdoo323cG2Hiux/UPzXD2jaLVy3veoi6aW8EnQV/Q4RERHVzkNzy/tuiY2NRUREBEJDQ2Fvb29wBYsar3feeQdOTk5Yv369XpisMnDgQISGhgIA/vOf/6Bz586YNm0aSktLoVar8dJLL8HDwwPR0dG6fdasWYNr167hk08+MQiTACAIAqKionC83AVSiaBXVnJyDyTyJrBuHwAb314oObnHZN/lrTtA7tEZNw8nQlNRZlD+w/HrtX0biIiIRGOgNEKpVCInJ8fgpVKp9OodPnwY6enpiIqKgqWlJYYPHw6FQmGy3Zs3bxptt6Ki4m6fEt3h/PnzOHPmDIYNGwY7u5oXB5fJZPjiiy9w4cIFvPfee1i5ciX+/PNPrF69GjY2/64BuW3bNlhbW2P48OHVtpdyNttgeaCSU3tg49MTgtQCth37QJV/FWXXTE/Yse89GpqSAhT/tcOg7PfM/BrPiYiIyFwYKI2Ijo6Gi4uLwevOiQ4xMTFo06YNevXqBQCIjIzEqVOncOTIEaPt9u/f32i7qampd/uU6A6nT58GAPj7+9d6n+7du2PatGlYtmwZ5s6di6ioKAwcOFCvzpkzZ+Dr62twxbOoqEj3BSLjynVkXM/TKy+7ng5V7mXYdOwDALBq7QepXbPqr1K26QQr984oPJxkcJXy+s1SlJSpTOxJRERkXhxDacTkyZPx7LPPGmzv2LGj7t8qlQqbNm3C+PHjIQiVty779esHV1dXKBQKdOnSxWD/VatWwcfHx2D7G2+8AbVabb4ToBoVFhYCQK2uTt5u4cKF2LJlC5RKJT7++GOj7TZp0sRg+7hx4/Ddd9/pfrZ7fAicBvw7gavkZAoktg6Qu1cGXEEQYNshEMUnU+DY7wUIEqnR/jj0Ho2s2Lf/fyzlMN12LYCM3BL4tbSv0/kRERHVBwOlEd7e3ujfv3+1dXbv3o0bN26gW7duSE9P120PDg5GXFwclixZopv1W6Vbt27o2tVwqoSjoyNycnIMttPd07RpUwCVVw7rup+vry9ycnLg5uZmUG5nZ4fi4mKD7QsWLMD06dMBACEhIXplWo0aytP7IXfvDNXNf5cmsmzpC81vySi9eBTWbR832h+5e9VVykQ0eWywXlm5SmN0HyIiInNjoKynqrGSI0eONFq+d+9eBAcH38suUR1UTZg5fvy42ds9evQoKioq9G57d+7c2eQ+pRePQV2cB+XpfVCe3mdQXnJyj8lACQAOvaOQFftfFB/ZCYmVrW67pYwjWoiI6N5goKyHkpISfPfddxg1ahQiIiIMyl999VUoFAoGykbMx8cHvr6++O6777BixQqjt6nrIzQ0FL/++iuSk5NNftm4U8nJPZDYOMBpwEsGZcpzh6A8dwiaijJILKyM7i9394eVuz8Kf90C+15RAAABgKezrdH6RERE5sZLGPWQnJyMkpISvPzyy4iIiDB4hYaGIjExEWVlhsu5UOMxf/585Obm4sUXXzSYwQ9UDmv4/vvv69Tm1KlT4ebmhhkzZuDcOcMZ2tr/X3jcTl75XU5TUQbluVRYtw+A7SO9DV52j4dCW34Lt9IPV3tch96joS7JR9GRnQCA5vZy2Frx+yIREd0bD91fnPXr12Pnzp0G21977TXdv//880/ExMQY1PHy8sKTTz4JhUIBZ2dn9OzZ0+gxwsLCsHbtWmzfvr3G5WOo4YwaNQrHjx/HwoUL8ddffyEqKkr3pJydO3fi559/rvO6ok5OTkhOTsbQoUPx6KOPIjIyEgEBAbCwsMClS5eQkJAAAOjo7YV/JAJK0g9DW34LNu27G23PqpUvJDb2KDm5B7Yd+pg8rtzdH1ZtOqHs0gkAQFd3xzr1m4iISIyHLlCaet72hAkTdP+Oi4tDXFycQZ3x48fDy8sLP/30E6KioiCVGp95+9RTT8HGxgYxMTEMlI3c+++/j379+uHTTz/F6tWrkZeXB0dHR/To0QPfffcdwsLC6tzmk08+iRMnTuCjjz7C9u3bsWnTJmg0GrRq1Qq9e/fGF198geY+XRDyyT6UnNwDQWYJedsuRtsSBAmsvQJQcnIP1LcKIbVuavK4Dr1HIytuNgBgsH/zOvebiIiovgStlg//JWoI4748jNR/cg0WOBdDKhHQs50zNr5g/IonERHR3cAxlEQNZFG4P2R3PH5RLJlEwKLw2i/WTkREZA4MlEQNpI2TDeaH+Zm1zQVhfmjjZFNzRSIiIjNioCRqQJEB7pg5wPDpSfUxa4AvRgW4m6UtIiKiuuAYSqJGID4tE9FbT0Kl0dZpTKVUIkAmEbAgzI9hkoiIGgwDJVEjcSlPidnJx7E/PQdSiVBtsKwqD2zfDIvC/Xmbm4iIGhQDJVEjcz6rCIrDmUg5l43MXCVu/w9UAODubINgH1eM7eGO9q52DdVNIiIiHQZKokaspEyFjNwSlKs0sJRJ4OlsyyfgEBFRo8NASURERESicJY3EREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKLIGroDxpSUqZCRW4JylQaWMgk8nW1ha9Uou0pERET00Gs0Ke18VhEUhzORcjYbmXlKaG8rEwC4O9kg2NcVY7q7w9vNrqG6SURERER3ELRarbbmanfPpTwlZicfx/70HEglAtQa092pKg9s3wyLwv3RxsnmHvaUiIiIiIxp0EAZn5aJ6K0nodJoqw2Sd5JKBMgkAuaH+SEywP0u9pCIiIiIatJggXJlynks331OdDszB/hgerC3GXpERERERPXRILO849MyzRImAWD57nPYlJZplraIiIiIqO7qfYVyw4YNmDhxItLS0tC1a1eD8qCgIOTk5ODEiRO6bZ6enrh48SIcug6Fff8pevVLLx5DVtxsNBv2Nmwf6Q0AKD72E3J3fGKyD83HLYdVq0dgJZPg3PtP65XZ2dnhsccew5tvvokhQ4bU5xSJiIiIqBYaZJb3zb92wrZ7BGR2zrWqbx84BjL75gbbZY4tAACq/x9/GRISgueeew5arRYXL17E6tWrMXToUPzwww8YOHCg+U6AiIiIiHTuaaBUqbWwaOaOirwrKPx1C5xCptS8EwDrdl1h1cL0OMmqCT1ubTwxduxY3fYRI0agY8eOWLFiBQMlERER0V1yT8dQFperYOHgBttO/VB8dBdURblmbf/s9WK9nzt06IBmzZrh77//NutxiIiIiOhfogPlzZs3kZOTY/CqqKgwqFtaoYZWC9j3HAWtRo3CX7fU6hiashKolTf1X7cKDepdKVAa9C0/Px+Ojo71OzkiIiIiqlGtb3kfOXIEXbp0Mdjev39/k/v4+fnp/l1cpoJKrYUlAAuH5rD1C0bx0V1o+uSzkDVxqvbY2fFzDTdKLeAxK1lvU2HxLVy8ch02llJkZmZi7ty5UKvViIiIqLZ9IiIiIqq/WgdKhUJhNFCuWrUKPj4+Btvf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8ZY3EdF9KD4tE9FbT0Kl0dZpTKVUIkAmEbAgzI9hkojMhoGSiOg+dSlPWeclXwLbN+OSL0RkdgyURET3OS75QkQNjYGSiOgBwiVfiKghMFASERERkSic5U1EREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSiyhu4AERHRnUrKVMjILUG5SgNLmQSezrawteKfLKLGiv91EhFRo3A+qwiKw5lIOZuNzDwltLeVCQDcnWwQ7OuKMd3d4e1m11DdJCIjBK1Wq625GhER0d1xKU+J2cnHsT89B1KJALXG9J+lqvLA9s2wKNwfbZxs7mFPicgUBkoiImow8WmZiN56EiqNttogeSepRIBMImB+mB8iA9zvYg+JqDYYKImIqEGsTDmP5bvPiW5n5gAfTA/2NkOPiKi+OMubiIjuufi0TLOESQBYvvscNqVlmqUtIqofBkqi+9jx48cREREBDw8PyOVytGrVCiEhIfjf//5ncp+RI0dCEAS89dZbRsv37NkDQRB0L6lUCldXV0REROD06dMm292xYwcEQUDLli2h0WhEnxvVz4QJE9CkSZNa1y8oKIBcLocgCCZ/vxMmTND7TNz+2rlzp17d3NxczJo1C76+vpDL5XBycsLAgQPx/fff6+pcylNW3uYuyMLFxaG3vYbi0ieRyNocjbIrpj9r5dkXkLP9E1xe/QIuLgtH5ocRGD80GC+9OgP//PNPrfsul8tr/T5VvVedOnWCIAiYPn16nfYletBxljfRfSo1NRXBwcFwd3fHpEmT0Lx5c1y6dAm//vorVqxYgVdeecVgn8LCQmzbtg2enp6Ii4vD4sWLIQiC0fZfffVVBAQEoKKiAseOHcOaNWuwZ88enDhxAs2bNzeor1Ao4OnpiYyMDPzyyy/o37+/2c+ZzC8hIQGCIKB58+ZQKBR4//33jdazsrLCunXrDLY/+uijun+fPXsWTz31FG7cuIGJEyeia9euKCgogEKhwNChQzFz5kwsW7YMs5OPQ3XbeEmbjn1h3a4roNWgIu8Kiv/cjuuxs9Fi/MewdPXUO17RkZ3I2/UZJDZNYdsxCBbOrQGNBqqci/j662+wfs0q3Lp1C1KptMa+316nJuXl5QgPD8e5c+cwcOBArFq1Cu7u7njzzTdr3QbRg4yBkug+tXDhQtjb2yMtLQ0ODg56ZdnZ2Ub3SUxMhFqtxvr169GvXz/s27cPffv2NVo3MDAQERERup99fX0xdepUfPPNNwZ/REtKSvDdd9/hgw8+wFdffQWFQsFAeZ+IiYnB008/DQ8PD8TGxpoMlDKZDGPHjjXZTkVFBSIiIpCfn499+/ahe/fuurIZM2ZgzJgxWL58OVq198P+DBe9fS3dvNCkU7DuZ3kbP2RvjkbRXzvgPHCabnvp5dPI2/UZrFp3hGvEu5BY6c/w1vZ7AaHqQ3Xue020Wi0mTJiA1NRUJCQkICwsDFOmTMHbb78Nd3d3REZG1rttogcFb3kT3af+/vtv+Pn5GYRJAHB1dTW6j0KhQEhICIKDg9GhQwcoFIpaHy8wMFB33DslJyfj1q1bePbZZxEZGYmkpCSUlpbWum1qGJmZmdi/fz8iIyMRGRmJCxcuIDU1tV5tJSYm4sSJE3j77bf1wiRQeSXw888/h4ODAxa+vwBSifGr4lWsWvsBAFQF1/S23zwYCwgCmg2daRAmAUBmaQWXoPF1uvJYG2+99RYSExOxZcsWPPPMMxAEAZ9//jkmTZqE8ePHY+/evWY9HtH9iIGS6D7l4eGBP/74AydOnKhV/atXryIlJQVRUVEAgKioKGzZsgXl5eW12j8jIwMA4OjoaFCmUCgQHByM5s2bIzIyEkVFRdi2bVvtToQaTFxcHGxtbREaGopu3brBy8ur2i8ZOTk5eq+bN2/qyqp+388995zRfe3t7fHMM88g5/IFlOZeqbZfqptZAACJ/N+xoJqKUpRePAa5uz9kTZsZ3U+t0SLlnPGr83f2PScnB4WFhdX2AwBWrVqFFStWIDExEUOHDtVtFwQBa9aswfPPP49hw4bh5MmTNbZF9CBjoCS6T82cORNKpRJdunRBz5498dZbb2H37t2oqKgwWj8uLg5WVlZ45plnAACRkZHIz8/Hjh07jNYvKipCTk4Orl27hl27duH111+HIAgYMWKEXr3s7Gz89NNPutt+7u7uePLJJ+t09ZMahkKhwDPPPANra2sAwKhRo7B582aoVCqDuiUlJXBxcdF7VX2WAODUqVOwt7eHh4eHyeM94tcJAFCRc0lvu7aiDGrlTahL8lF66SRyd3wCALDx7aWro8q/BmjUsGhm2L76VlHl/sqbuHDpGvKLlDX23cXFBSNHjqzhHQJefvlllJWVITQ01KBMEASsXr0a+fn58PPzq7EtogcZx1AS3adCQkJw6NAhfPDBB9i1axcOHTqEpUuXwsXFBevWrUNYWJhefYVCgSFDhsDOrvKRdd7e3njiiSegUCgwbNgwg/aff/55vZ9dXFywceNGBAQE6G2Pj4+HRCLRC5pRUVF44403kJ+fb/SKJjW8Y8eO4fjx4/jggw9026KiorBo0SLs2rULQ4YM0asvl8sNrjrf/rstKirSfbZMKROsAACacv3Ad/OAAjcP/PsFRLC0hmO/F2D7SG/dNk1Z5T4SS8OZ2VfWvAhtWYnu5w1+X2PG5H+vlBrrOwA0a2b8SicR1R0DJdF9LCAgAElJSSgvL8fRo0eRnJyMjz/+GBEREThy5Ag6duwIADh9+jT++usvPPfcc0hPT9ftHxQUhFWrVqGwsBBNmzbVa/vdd99FYGAgiouLkZycrAuOd4qJiUG3bt2Qm5uL3NxcAMBjjz2G8vJyJCQkYPLkyXfxHaD6iomJga2tLdq1a6f7TMjlcnh6euq+fNxOKpVWO9HKzs4OOTk51R6z6hazxFJ//GOTLoNg80hvaFXlKL14FEW/b4NWq7/0lMSy8iqqptxwbK7riLnQatSoyPoH+SnroVLr71tT34lIPAZKogeApaUlAgICEBAQAB8fH0ycOBEJCQmIjo4GUBkegMrZtjNmzDDYPzExERMnTtTb5u/vr/sjPGzYMCiVSkyaNAm9e/dGmzZtAADnz59HWloagMornndSKBQMlI2QVqtFXFwcSkpKdF86bpednY3i4uI6rWfZoUMHHDlyBJmZmXB3N/4oxH/OngIAWDRro7dd5tgS1p5dAAA27btBEKQo2PM15O6dYdXCW1cHEikqci4atCt39wcACELlFx6ZlKO5iO41BkqiB0zXrl0BANeuVc6Q1Wq1iI2NRXBwMKZNm2ZQ/7333oNCoTAIlHdavHgxkpOTsXDhQqxZswZAZWC0sLDAxo0bDWbWHjhwAJ9++mm1AYMaxt69e3H58mUsWLAAHTp00CvLz8/H5MmT8e2339ZpqZ3Q0FDExcXhm2++wdy5cw3KCwsLsffHH2Dh3BoWji2rbcu+50gUHd2Fgn0b4TZqAYDKW91yd3+UZp6AqigHMjvTt6td7Kxq3W8iMg8GSqL7VEpKCoKCggwWJq+aZOPr6wsAOHjwIDIyMrBgwQK9dSWrnDt3Du+88w6uXr2Kli1N/6H38vLCiBEjsGHDBsybN0+3EHZgYCBGjRplUP/JJ5/Ep59+iri4OJNP5aGGUXW7e9asWUafFrNs2TIoFIo6BcqIiAgsXLgQixcvxqBBg3RfbABAo9Fg6tSpyM/PxyOjX8atGtqSyJvArssgFB5ORHnWP7B0awcAsO8VidKLs5Gz7cPKdSj//zb4neQW5l02iIhqxkBJdJ965ZVXoFQqER4ejkceeQTl5eVITU3Fpk2b4OnpqbviqFAoIJVKDcbEVQkLC8OcOXMQHx+P//znP9Uec9asWdi8eTM++eQThIeHIz093eQj6Fq1aoXHH38cCoWCgfIeq6ioMLpAuZOTE1544QUkJiYiJCTE5KMHw8LCsGLFCmRnZ5tc0/ROlpaW2LJlC5566in07t1b70k5sbGx+PPPP/HGG2+gSZ9IbDx8EerbnpRjjF3XMBT+/h1u/poAl2cqPz/yNp3gFPIS8n5cg6ufT4atXxBkzq0BtQoVeVdQcnIPpDILgyc5qVQq3bCPO4WHh8PW1rZW50hEpjFQEt2nli9fjoSEBOzYsQNffPEFysvL4e7ujmnTpmHu3LlwcHBARUUFEhIS0LNnTzg5ORltp1OnTmjbti1iYmJqDJRdu3ZFUFAQVq9ejaysyrUCb1+b705Dhw7FvHnzcOzYMXTu3Ln+J0t1Ul5ejnfeecdgu5eXF5o3b46CgoIaf28ffvgh4uPj8eqrr9b6uB06dMDRo0exePFibN26FV999RWsra3RtWtXbN26FUOHDsX5rCJsOJRRY1syO2fYdgxCyYlfUNHnGiwcWwAA7B5/GlatHkFh2rcoOXMA6pJ8CBIZZA7N0cT/KST9Lxq9uz2q11ZZWRnGjRtn9DgXLlxgoCQyA0Gr1Vb/NZGIiMiMxn15GKn/5NZ4lbIupBIBPds5Y+ML3WuuTERmx6lwRER0Ty0K94eshscv1pVMImBRuL9Z2ySi2mOgJCKie6qNkw3mh5n3yTILwvzQxsnw+d5EdG8wUBIR0T0XGeCOmQN8zNLWrAG+GBXApamIGhLHUBIRUYOJT8tE9NaTUGm0dRpTKZUIkEkELAjzY5gkagQYKImIqEFdylNidvJx7E/PgVQiVBssq8oD2zfDonB/3uYmaiQYKImIqFE4n1UExeFMpJzLRmauErf/cRIAuDvbINjHFWN7uKO9q11DdZOIjGCgJCKiRqekTIWM3BKUqzSwlEng6WwLWysunUzUWDFQEhEREZEonOVNRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESiMFASERERkSgMlEREREQkCgMlEREREYnCQElEREREojBQEhEREZEoDJREREREJAoDJRERERGJwkBJRERERKIwUBIRERGRKAyURERERCQKAyURERERicJASURERESi/B96H8OjIWHzLAAAAABJRU5ErkJggg==", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAHzCAYAAACe1o1DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydZXgUVxuG792NuwdCAqEBggR3CRAKBE2BUqxIoGjQ0kCBQkgKxYsX10Jwd7fg7i5J8Ahxz+5+P/bbIZvdGFab+7pyQWbOnJHszrxzzvs+j0SpVCoRERERERERERER+UCkf/UBiIiIiIiIiIiI/LMRA0oREREREREREZGPQgwoRUREREREREREPgoxoBQREREREREREfkoxIBSRERERERERETkoxADShERERERERERkY9CDChFREREREREREQ+CjGgFBERERERERER+SjEgFJEREREREREROSjEANKERERERERERGRj0IMKEVERERERERERD4KMaAUERERERERERH5KMSAUkRERERERERE5KMQA0oREREREREREZGPQgwoRUREREREREREPgoxoBQREREREREREfkoxIBSRERERERERETko9D7qw9A5N9HUlomodFJpGcqMNCT4mpriqmh+FETERERERH5tyI+5UU+CY/eJhB8IZzjDyIIf5eMMss6CVDUxgQvdwe+r1mUko7mf9VhioiIiIiIiHwGJEqlUpl3MxER3Tx/l8yY7bcIeRyFTCpBrsj546Re71nCjklty+NiY/IFj1RERERERETkcyEGlCIfzIZL4YzfdYdMhTLXQDI7MqkEPamEIJ9ydKpe9DMeoYiIiIiIiMiXQAwoRT6I+ccfMePQw4/ux79pKQZ5lfwERyQiIiIiIiLyV/GPrPIODAxEIpEQFRX1Vx9KrjRs2JCGDRt+sv58fX1xdXX9ZP19KBsuhX+SYBJgxqGHbLwU/kn6EhEREREREflr+EcGlCJ/Hc/fJTN+150CbZMeFU5sSDCZsW91rg/YdYfn75I/xeF9UY4cOYKXlxd2dnZYWVlRo0YN1qxZo9VOIpHo/JkyZYpGu+3bt+Pt7Y2TkxOGhoY4OzvTvn17bt++rdHuxIkTOfYpkUj47bffhLarVq3Ksd2bN28+z4UREREREfnPIVZ5f0YOHTr0Vx/CJ2fM9ltkFiBfEiAjKpy4M+sx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", "text/plain": [ "
" ] @@ -619,74 +1437,159 @@ { "data": { "text/plain": [ - "{'id': 'da441d41-1050-4505-a834-99d6023001e1',\n", - " 'first_name': 'AARON ',\n", - " 'last_name': 'KRAUSS ',\n", - " 'full_name': 'AARON KRAUSS ',\n", - " 'entity_type': 'Individual',\n", - " 'state': 'MI',\n", + "{'id': '1869727',\n", + " 'company': nan,\n", + " 'entity_type': 'individual',\n", + " 'first_name': nan,\n", + " 'full_name': 'william \\x08stoner',\n", + " 'last_name': nan,\n", " 'party': nan,\n", - " 'company': nan}" + " 'state': nan,\n", + " 'transaction_id': nan,\n", + " 'donor_id': nan,\n", + " 'year': nan,\n", + " 'amount': nan,\n", + " 'recipient_id': nan,\n", + " 'office_sought': nan,\n", + " 'purpose': nan,\n", + " 'transaction_type': nan,\n", + " 'donor_type': nan,\n", + " 'recipient_type': nan,\n", + " 'donor_office': nan}" ] }, - "execution_count": 105, + "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "x = add_notes_from_df(inds_sample)\n", - "x.nodes['BELA LAHNER ']" + "x = add_notes_from_df(merged_inds_sample)\n", + "x.nodes['abdussamad, shams']" ] }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 79, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idcompanyentity_typefirst_namefull_namelast_namepartystatetransaction_iddonor_idyearamountrecipient_idoffice_soughtpurposetransaction_typedonor_typerecipient_typedonor_office
6631869727NaNindividualNaNwilliam \bstonerNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], "text/plain": [ - "['BELA LAHNER ',\n", - " 'JANICE SHAPIRO ',\n", - " 'RAMON HAWKINS ',\n", - " 'LEAH CYGAN ',\n", - " 'ALLISON HATT ^ ',\n", - " 'ELLEN FEINGOLD ',\n", - " 'KEVIN HERTEL FOR SENATE',\n", - " 'SARA LAFORGE ^ ',\n", - " 'LOIS TACK ',\n", - " 'AARON KRAUSS ']" + " id company entity_type first_name full_name last_name \\\n", + "663 1869727 NaN individual NaN william \bstoner NaN \n", + "\n", + " party state transaction_id donor_id year amount recipient_id \\\n", + "663 NaN NaN NaN NaN NaN NaN NaN \n", + "\n", + " office_sought purpose transaction_type donor_type recipient_type \\\n", + "663 NaN NaN NaN NaN NaN \n", + "\n", + " donor_office \n", + "663 NaN " ] }, - "execution_count": 104, + "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "inds_sample.full_name.tolist()" + "merged_inds_sample.loc[merged_inds_sample.full_name == 'william \\x08stoner']" ] }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 65, "metadata": {}, "outputs": [ { - "ename": "KeyError", - "evalue": "'MALLORY MCMORROW FOR MICHIGAN'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[94], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mG\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnodes\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mMALLORY MCMORROW FOR MICHIGAN\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/networkx/classes/reportviews.py:194\u001b[0m, in \u001b[0;36mNodeView.__getitem__\u001b[0;34m(self, n)\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(n, \u001b[38;5;28mslice\u001b[39m):\n\u001b[1;32m 190\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m nx\u001b[38;5;241m.\u001b[39mNetworkXError(\n\u001b[1;32m 191\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m)\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m does not support slicing, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 192\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtry list(G.nodes)[\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mn\u001b[38;5;241m.\u001b[39mstart\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m:\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mn\u001b[38;5;241m.\u001b[39mstop\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m:\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mn\u001b[38;5;241m.\u001b[39mstep\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m]\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 193\u001b[0m )\n\u001b[0;32m--> 194\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_nodes\u001b[49m\u001b[43m[\u001b[49m\u001b[43mn\u001b[49m\u001b[43m]\u001b[49m\n", - "\u001b[0;31mKeyError\u001b[0m: 'MALLORY MCMORROW FOR MICHIGAN'" - ] + "data": { + "text/plain": [ + "{'color': nan, 'size': 2}" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" } ], - "source": [] + "source": [ + "G = nx.Graph()\n", + "G.add_node(0)\n", + "nx.set_node_attributes(G, \"red\", name=\"color\")\n", + "nx.set_node_attributes(G, 2, name=\"size\")\n", + "G.add_node(1)\n", + "nx.set_node_attributes(G, np.nan, name='color')\n", + "G.nodes[0]" + ] }, { "cell_type": "code", @@ -831,7 +1734,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -840,13 +1743,13 @@ "{'color': 'white'}" ] }, - "execution_count": 89, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "G = nx.Graph()\n", + "G = nx.MultiDiGraph()\n", "G.add_node(0)\n", "nx.set_node_attributes(G, \"red\", name=\"color\")\n", "nx.set_node_attributes(G, 4, name = 'size')\n", @@ -855,6 +1758,28 @@ "G.nodes[2]" ] }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'color': 'white', 'age': 4}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "G.add_node(2)\n", + "nx.set_node_attributes(G, 4, name='age')\n", + "G.nodes[2]" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/utils/linkage.py b/utils/linkage.py index e955f94e..93467519 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -449,21 +449,23 @@ def name_rank(first_name: str, last_name: str) -> list: def convert_duplicates_to_dict(df: pd.DataFrame) -> None: - """Saves to the "output" directory a file where each row represents a string - matching to another string + """For each uuid, maps it to all other uuids for which it has been deemed a + match. - Given a dataframe where each row contains one string in a column and a list - of strings in another column, the function maps each string in the list to - the single string. + Given a dataframe where the uuids of all rows deemed similar are stored in a + list and all but the first row of each paired uuid is dropped, this function + maps the matched uuids to a single uuid. Args: - A pandas dataframe + A pandas df containing a column called 'duplicated', where each row is a + list of all uuids deemed a match. In each list, all uuids but the first + have their rows already dropped. Returns None. However it outputs a file to the output directory, with 2 - columns. The first, which indicates the duplicated UUIDs, is labeled - 'duplicated_uuids', and the 2nd, which shows the uuids to which the - deduplicated entries match to, is labeled 'mapped_uuids'. + columns. The first lists all the uuids in df, and is labeled 'all_uuids' + The 2nd shows the uuids to which each entry is mapped to, and is labeled + 'mapped_uuids'. """ deduped_dict = {} for i in range(len(df)): @@ -474,7 +476,7 @@ def convert_duplicates_to_dict(df: pd.DataFrame) -> None: # now convert dictionary into a csv file deduped_df = pd.DataFrame.from_dict(deduped_dict, "index") deduped_df = deduped_df.reset_index().rename( - columns={"index": "duplicated_uuids", 0: "mapped_uuids"} + columns={"index": "all_uuids", 0: "mapped_uuids"} ) deduped_df.to_csv( repo_root / "output" / "deduplicated_UUIDs.csv", From 1e4a550703613ff389835021faa18b83015a9d91 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 22 Feb 2024 13:16:28 -0600 Subject: [PATCH 136/214] Saving work on networkx branch --- utils/linkage.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 93467519..49f10bf7 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -459,13 +459,13 @@ def convert_duplicates_to_dict(df: pd.DataFrame) -> None: Args: A pandas df containing a column called 'duplicated', where each row is a list of all uuids deemed a match. In each list, all uuids but the first - have their rows already dropped. + have their rows already dropped. Returns None. However it outputs a file to the output directory, with 2 - columns. The first lists all the uuids in df, and is labeled 'all_uuids' + columns. The first lists all the uuids in df, and is labeled 'all_uuids' The 2nd shows the uuids to which each entry is mapped to, and is labeled - 'mapped_uuids'. + 'mapped_uuids'. """ deduped_dict = {} for i in range(len(df)): From 0a043a9f999630445dfdac08f69c09048fd1fbe8 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Thu, 22 Feb 2024 13:18:15 -0600 Subject: [PATCH 137/214] updating docstring of dedup func based on feedback --- utils/linkage.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 44d5e40c..f71a2b5f 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -448,21 +448,23 @@ def name_rank(first_name: str, last_name: str) -> list: def convert_duplicates_to_dict(df: pd.DataFrame) -> None: - """Saves to the "output" directory a file where each row represents a string - matching to another string + """For each uuid, maps it to all other uuids for which it has been deemed a + match. - Given a dataframe where each row contains one string in a column and a list - of strings in another column, the function maps each string in the list to - the single string. + Given a dataframe where the uuids of all rows deemed similar are stored in a + list and all but the first row of each paired uuid is dropped, this function + maps the matched uuids to a single uuid. Args: - A pandas dataframe + A pandas df containing a column called 'duplicated', where each row is a + list of all uuids deemed a match. In each list, all uuids but the first + have their rows already dropped. Returns None. However it outputs a file to the output directory, with 2 - columns. The first, which indicates the duplicated UUIDs, is labeled - 'duplicated_uuids', and the 2nd, which shows the uuids to which the - deduplicated entries match to, is labeled 'mapped_uuids'. + columns. The first lists all the uuids in df, and is labeled 'all_uuids' + The 2nd shows the uuids to which each entry is mapped to, and is labeled + 'mapped_uuids'. """ deduped_dict = {} for i in range(len(df)): @@ -473,7 +475,7 @@ def convert_duplicates_to_dict(df: pd.DataFrame) -> None: # now convert dictionary into a csv file deduped_df = pd.DataFrame.from_dict(deduped_dict, "index") deduped_df = deduped_df.reset_index().rename( - columns={"index": "duplicated_uuids", 0: "mapped_uuids"} + columns={"index": "all_uuids", 0: "mapped_uuids"} ) deduped_df.to_csv( repo_root / "output" / "deduplicated_UUIDs.csv", From cd94c0863510d5e4eb4f87a73e8397fadc537590 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Sat, 24 Feb 2024 14:47:36 -0600 Subject: [PATCH 138/214] pipeline progress so far on network linkage --- utils/linkage.py | 27 ------------ utils/network.py | 104 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 27 deletions(-) create mode 100644 utils/network.py diff --git a/utils/linkage.py b/utils/linkage.py index 49f10bf7..f71a2b5f 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -2,7 +2,6 @@ import os.path import re -import networkx as nx import numpy as np import pandas as pd import textdistance as td @@ -638,29 +637,3 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: elif address_line_1_components[i][1] == "USPSBoxID": return address_line_1_components[i][0] raise ValueError("Can not find Address Number") - - -def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: - """Takes in a dataframe and generates a MultiDiGraph where the nodes are - entity names, and the rest of the dataframe columns make the node attributes - - Args: - df: a pandas dataframe (complete_individuals_table / - complete_organizations_table) - - Returns: - A Networkx MultiDiGraph with nodes lacking any edges - """ - G = nx.MultiDiGraph() - # first check if df is individuals or organizations dataset - if "name" in df.columns: - node_name = "name" - else: - node_name = "full_name" - - for _, row in df.iterrows(): - G.add_node(row[node_name]) - for column in df.columns: - nx.set_node_attributes(G, row[column], name=column) - - return G diff --git a/utils/network.py b/utils/network.py new file mode 100644 index 00000000..b0d1e905 --- /dev/null +++ b/utils/network.py @@ -0,0 +1,104 @@ +import networkx as nx +import pandas as pd + +from utils.linkage import deduplicate_perfect_matches + + +def deduplicate_datasets( + ind_df: pd.DataFrame, org_df: pd.DataFrame, transactions_df: pd.DataFrame +) -> tuple: + """Deduplicates the uuids in the inds and orgs dfs and updates the uuids in + transactions dataset to match those in the new inds and orgs dfs + + Args: + ind_df: A pandas df with individual information + org_df: A pandas df with organization information + transactions df: A pandas df with info on transactions between entities + + Returns: + A tuple of the ind_df, org_df, and transactions_df + """ + # apply dedup to both inds and orgs + inds_df = deduplicate_perfect_matches(ind_df) + orgs_df = deduplicate_perfect_matches(org_df) + + # update the deduplicated uuids in transaction donor and recipient columns + # to the uuids they are mapped to + deduped = pd.read_csv("../output/deduplicated_UUIDs.csv") + transactions_df[["donor_id", "recipient_id"]] = transactions_df[ + ["donor_id", "recipient_id"] + ].replace(deduped) + + return inds_df, orgs_df, transactions_df + +def name_identifier(uuid:str, orgs_df, inds_df) -> str: + '''Returns the name of the entity given the entity's uuid + + Args: + uuid: the uuid of the entity + orgs_df and inds_df: the dataframes from which the entities uuid + is queried + + Return: + The entity's name + ''' + # first, check orgs df: + name_in_org = orgs_df.loc[orgs_df['id']==uuid] + if len(name_in_org)> 0: + return name_in_org.iloc[0]['name'] + # theoretically it must be in inds if not in orgs, but for the sample data + # this might not be the case + name_in_ind = inds_df.loc[inds_df['id']==uuid] + if len(name_in_ind)> 0: + return name_in_ind.iloc[0]['full_name'] + else: return None + + +def network_prep_pipeline( + ind_df: pd.DataFrame, org_df: pd.DataFrame, transactions_df: pd.DataFrame +) -> tuple: + '''Pipeline for preparing the orgs, inds, and transactions dataframes for + network linkage + + Args: + ind_df, org_df, transactions_df: pandas dataframes with information + regarding campaign contributions between donors and recipients + + Returns: + a tuple containing the 3 dataframes ready for network building + ''' + + ind_df, org_df, transactions_df = deduplicate_datasets( + ind_df, org_df, transactions_df + ) + + # add recipient_name to the transactions dataset + transactions_df['recipient_name'] = transactions_df['recipient_id'].apply(name_identifier, args=(org_df, ind_df)) + return ind_df, org_df, transactions_df + + + +def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: + """Takes in a dataframe and generates a MultiDiGraph where the nodes are + entity names, and the rest of the dataframe columns make the node attributes + + Args: + df: a pandas dataframe (complete_individuals_table / + complete_organizations_table) + + Returns: + A Networkx MultiDiGraph with nodes lacking any edges + """ + G = nx.MultiDiGraph() + # first check if df is individuals or organizations dataset + if "name" in df.columns: + node_name = "name" + else: + node_name = "full_name" + + for _, row in df.iterrows(): + G.add_node(row[node_name]) + for column in df.columns: + nx.set_node_attributes(G, row[column], name=column) + + return G From 22607e7420cfd5ed80752110ea024a629945c76d Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Sat, 24 Feb 2024 15:01:27 -0600 Subject: [PATCH 139/214] saving changes in networkx, no need for review --- notebooks/Test.ipynb | 1052 ++++++++++++++++++++++++++++++++++-------- utils/network.py | 39 +- 2 files changed, 887 insertions(+), 204 deletions(-) diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb index b17aeb76..d188b444 100644 --- a/notebooks/Test.ipynb +++ b/notebooks/Test.ipynb @@ -8,7 +8,6 @@ "source": [ "import pandas as pd\n", "import numpy as np\n", - "import re\n", "import networkx as nx\n", "import matplotlib.pyplot as plt\n", "\n", @@ -21,8 +20,8 @@ "metadata": {}, "outputs": [], "source": [ - "orgs_sample = pd.read_csv(\"../output/complete_organizations_table.csv\",index_col=0)#,nrows=10000).sample(10)\n", - "inds_sample = pd.read_csv(\"../output/complete_individuals_table.csv\",index_col=0, low_memory=False)#, nrows=10000).sample(10)\n", + "orgs_df = pd.read_csv(\"../output/complete_organizations_table.csv\",index_col=0)#,nrows=10000).sample(10)\n", + "inds_df = pd.read_csv(\"../output/complete_individuals_table.csv\",index_col=0, low_memory=False)#, nrows=10000).sample(10)\n", "transactions = pd.read_csv(\"../output/complete_transactions_table.csv\",index_col=0, low_memory=False)" ] }, @@ -89,7 +88,7 @@ } ], "source": [ - "orgs_sample.head(2)" + "orgs_df.head(2)" ] }, { @@ -136,7 +135,7 @@ " 0\n", " 4640650\n", " 100592\n", - " 2021.0\n", + " 2021\n", " 25.0\n", " 1869727\n", " none\n", @@ -150,7 +149,7 @@ " 1\n", " 8185257\n", " 201800301\n", - " 2020.0\n", + " 2020\n", " 100.0\n", " 1779679\n", " none\n", @@ -165,17 +164,13 @@ "" ], "text/plain": [ - " transaction_id donor_id year amount recipient_id office_sought \\\n", - "0 4640650 100592 2021.0 25.0 1869727 none \n", - "1 8185257 201800301 2020.0 100.0 1779679 none \n", + " transaction_id donor_id year amount recipient_id office_sought purpose \\\n", + "0 4640650 100592 2021 25.0 1869727 none wr 9.13 \n", + "1 8185257 201800301 2020 100.0 1779679 none ab \n", "\n", - " purpose transaction_type donor_type recipient_type \\\n", - "0 wr 9.13 contribution from individuals NaN NaN \n", - "1 ab contribution from individuals NaN NaN \n", - "\n", - " donor_office \n", - "0 NaN \n", - "1 NaN " + " transaction_type donor_type recipient_type donor_office \n", + "0 contribution from individuals NaN NaN NaN \n", + "1 contribution from individuals NaN NaN NaN " ] }, "execution_count": 4, @@ -187,58 +182,6 @@ "transactions.head(2)" ] }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idnamestateentity_type
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [id, name, state, entity_type]\n", - "Index: []" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "orgs_sample.loc[orgs_sample['id']=='201800301']" - ] - }, { "cell_type": "code", "execution_count": 5, @@ -273,6 +216,10 @@ " state\n", " party\n", " company\n", + " occupation\n", + " address\n", + " zip\n", + " city\n", " \n", " \n", " \n", @@ -286,6 +233,10 @@ " NaN\n", " NaN\n", " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", " \n", " \n", " 1\n", @@ -297,6 +248,10 @@ " NaN\n", " NaN\n", " area agency on aging\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", " \n", " \n", "\n", @@ -307,9 +262,9 @@ "0 1869727 NaN NaN william \bstoner individual NaN NaN \n", "1 1779679 NaN NaN rm coulon individual NaN NaN \n", "\n", - " company \n", - "0 NaN \n", - "1 area agency on aging " + " company occupation address zip city \n", + "0 NaN NaN NaN NaN NaN \n", + "1 area agency on aging NaN NaN NaN NaN " ] }, "execution_count": 5, @@ -318,28 +273,28 @@ } ], "source": [ - "inds_sample.head(2)" + "inds_df.head(2)" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(542368, 102, 248318, 3)" + "(541803, 541150, 77611, 77611)" ] }, - "execution_count": 22, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "inds_ids = set(inds_sample.id.tolist())\n", - "orgs_ids = set(orgs_sample.id.tolist())\n", + "inds_ids = set(inds_df.id.tolist())\n", + "orgs_ids = set(orgs_df.id.tolist())\n", "trans_donorids = set(transactions.donor_id.tolist())\n", "trans_recepids = set(transactions.recipient_id.tolist())\n", "ind_id_there, org_id_there = [], []\n", @@ -360,16 +315,16 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['100894', '100883']" + "['100883', '100894']" ] }, - "execution_count": 99, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -600,7 +555,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -632,63 +587,87 @@ " state\n", " party\n", " company\n", + " occupation\n", + " address\n", + " zip\n", + " city\n", " \n", " \n", " \n", " \n", - " 0\n", - " 1869727\n", + " 102\n", + " 100894\n", " NaN\n", " NaN\n", - " william \bstoner\n", - " individual\n", + " abdussamad, shams\n", + " candidate\n", + " AZ\n", + " democratic\n", + " none (is a candidate)\n", + " NaN\n", " NaN\n", " NaN\n", " NaN\n", " \n", " \n", - " 1\n", - " 1779679\n", + " 103\n", + " 100894\n", + " NaN\n", + " NaN\n", + " abdussamad, shams\n", + " candidate\n", + " AZ\n", + " democratic\n", + " none (is a candidate)\n", " NaN\n", " NaN\n", - " rm coulon\n", - " individual\n", " NaN\n", " NaN\n", - " area agency on aging\n", " \n", " \n", - " 2\n", - " 2277221\n", + " 104\n", + " 100883\n", + " NaN\n", + " NaN\n", + " abeytia, anna lynn\n", + " candidate\n", + " AZ\n", + " democratic\n", + " none (is a candidate)\n", " NaN\n", " NaN\n", - " james engelson\n", - " individual\n", " NaN\n", " NaN\n", - " retired\n", " \n", " \n", - " 3\n", - " 2277156\n", - " NaN\n", + " 105\n", + " 100883\n", " NaN\n", - " marivic franciaskinner\n", - " individual\n", " NaN\n", + " abeytia, anna lynn\n", + " candidate\n", + " AZ\n", + " democratic\n", + " none (is a candidate)\n", " NaN\n", - " fibre source international corp\n", - " \n", - " \n", - " 4\n", - " 2341373\n", " NaN\n", " NaN\n", - " anthony grindle\n", - " individual\n", " NaN\n", + " \n", + " \n", + " 0\n", + " b8fbed14-0766-49ab-8516-97952c654a12\n", + " FREDERICK\n", + " BERG\n", + " FREDERICK BERG ...\n", + " Individual\n", + " MI\n", " NaN\n", - " zimmerbiomet\n", + " BUTZEL LONG\n", + " ATTORNEY\n", + " 1033 YORKSHIRE\n", + " 48230-0000\n", + " GROSSE POINTE PARK\n", " \n", " \n", " ...\n", @@ -700,117 +679,826 @@ " ...\n", " ...\n", " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + " 17734\n", + " 75b99f42-e0d4-4c3c-89a6-16e11f6dd810\n", + " NaN\n", + " NaN\n", + " Rodriguez, Adrian\n", + " Individual\n", + " MN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 17735\n", + " 8b634b74-a6be-4280-a2c4-63e46a8f9bc9\n", + " NaN\n", + " NaN\n", + " O'Connor, Timothy J\n", + " Individual\n", + " MN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 17736\n", + " d7d5b121-015f-474f-8b76-7c6c865da557\n", + " NaN\n", + " NaN\n", + " Frenzel, Robert C\n", + " Individual\n", + " MN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 17737\n", + " b2eaaec4-30d5-46f4-9922-efc8d79c16d2\n", + " NaN\n", + " NaN\n", + " Enzminger, Peter\n", + " Individual\n", + " MN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " 17738\n", + " de34f2c7-fa2f-4fa5-abea-b67f6c8fe35f\n", + " NaN\n", + " NaN\n", + " Bowler, Erin\n", + " Individual\n", + " MN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + "\n", + "

1760156 rows × 12 columns

\n", + "" + ], + "text/plain": [ + " id first_name \\\n", + "102 100894 NaN \n", + "103 100894 NaN \n", + "104 100883 NaN \n", + "105 100883 NaN \n", + "0 b8fbed14-0766-49ab-8516-97952c654a12 FREDERICK \n", + "... ... ... \n", + "17734 75b99f42-e0d4-4c3c-89a6-16e11f6dd810 NaN \n", + "17735 8b634b74-a6be-4280-a2c4-63e46a8f9bc9 NaN \n", + "17736 d7d5b121-015f-474f-8b76-7c6c865da557 NaN \n", + "17737 b2eaaec4-30d5-46f4-9922-efc8d79c16d2 NaN \n", + "17738 de34f2c7-fa2f-4fa5-abea-b67f6c8fe35f NaN \n", + "\n", + " last_name \\\n", + "102 NaN \n", + "103 NaN \n", + "104 NaN \n", + "105 NaN \n", + "0 BERG \n", + "... ... \n", + "17734 NaN \n", + "17735 NaN \n", + "17736 NaN \n", + "17737 NaN \n", + "17738 NaN \n", + "\n", + " full_name entity_type state \\\n", + "102 abdussamad, shams candidate AZ \n", + "103 abdussamad, shams candidate AZ \n", + "104 abeytia, anna lynn candidate AZ \n", + "105 abeytia, anna lynn candidate AZ \n", + "0 FREDERICK BERG ... Individual MI \n", + "... ... ... ... \n", + "17734 Rodriguez, Adrian Individual MN \n", + "17735 O'Connor, Timothy J Individual MN \n", + "17736 Frenzel, Robert C Individual MN \n", + "17737 Enzminger, Peter Individual MN \n", + "17738 Bowler, Erin Individual MN \n", + "\n", + " party company occupation address \\\n", + "102 democratic none (is a candidate) NaN NaN \n", + "103 democratic none (is a candidate) NaN NaN \n", + "104 democratic none (is a candidate) NaN NaN \n", + "105 democratic none (is a candidate) NaN NaN \n", + "0 NaN BUTZEL LONG ATTORNEY 1033 YORKSHIRE \n", + "... ... ... ... ... \n", + "17734 NaN NaN NaN NaN \n", + "17735 NaN NaN NaN NaN \n", + "17736 NaN NaN NaN NaN \n", + "17737 NaN NaN NaN NaN \n", + "17738 NaN NaN NaN NaN \n", + "\n", + " zip city \n", + "102 NaN NaN \n", + "103 NaN NaN \n", + "104 NaN NaN \n", + "105 NaN NaN \n", + "0 48230-0000 GROSSE POINTE PARK \n", + "... ... ... \n", + "17734 NaN NaN \n", + "17735 NaN NaN \n", + "17736 NaN NaN \n", + "17737 NaN NaN \n", + "17738 NaN NaN \n", + "\n", + "[1760156 rows x 12 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# for now only work with datasets \n", + "sample_inds = inds_df.loc[(inds_df['id'].isin(transactions.donor_id.tolist()))]\n", + "sample_inds\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", "
transaction_iddonor_idyearamountrecipient_idoffice_soughtpurposetransaction_typedonor_typerecipient_typedonor_office
212637NaNb8fbed14-0766-49ab-8516-97952c654a122022100.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNNaN
212667NaNb8fbed14-0766-49ab-8516-97952c654a12202250.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNNaN
440542NaNb8fbed14-0766-49ab-8516-97952c654a12202250.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNNaN
440573NaNb8fbed14-0766-49ab-8516-97952c654a12202250.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNNaN
440607NaNb8fbed14-0766-49ab-8516-97952c654a12202250.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNNaN
440642NaNb8fbed14-0766-49ab-8516-97952c654a12202250.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNNaN
636312NaNb8fbed14-0766-49ab-8516-97952c654a12202250.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNNaN
636346NaNb8fbed14-0766-49ab-8516-97952c654a12202250.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNNaN
636382NaNb8fbed14-0766-49ab-8516-97952c654a12202250.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNNaN
839846NaNb8fbed14-0766-49ab-8516-97952c654a12202283.33f9fa8506-bfbb-4ef0-9e08-5c9c3e948121NaNNaNDIRECT/FUND RAISERNaNNaNNaN
840051NaNb8fbed14-0766-49ab-8516-97952c654a12202283.34389fe2ba-828a-41d4-815c-8efb2499ea11NaNNaNDIRECT/FUND RAISERNaNNaNNaN
8612606acfa74b-d5e1-4afd-b020-dbe429eb1c3f968402NaNb8fbed14-0766-49ab-8516-97952c654a12202283.33043a03b7-af31-4830-b12e-446b93fca9a0NaNNaNDIRECT/FUND RAISERNaNNaNMelissa HartCandidatePAREPNaN
861271f111045d-bc3d-4050-9ad7-b3b1e6d72e561414338NaNb8fbed14-0766-49ab-8516-97952c654a122022250.00ba06baf6-eae6-459f-b3a9-7261e4baa33eNaNNaNDIRECT/FUND RAISERNaNNaNHeather MillerCandidatePADEMNaN
861277d40859d7-b523-4ef5-895b-c3a947ab582f1502742NaNb8fbed14-0766-49ab-8516-97952c654a12202250.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNChristopher M. GebhardCandidatePAREPNaN
861775f5d76d43-86f4-40f9-aeb9-3df97ca8cdf01502777NaNb8fbed14-0766-49ab-8516-97952c654a12202250.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNApril WeaverCandidatePAREPNaN
8619201a0cf90d-3252-4c8d-b109-dea084a01f691502812NaNb8fbed14-0766-49ab-8516-97952c654a12202250.001d4ae24b-2814-4d0d-995e-28fd4c26785dNaNNaNDIRECTNaNNaNKrista PaolucciCandidatePAREPNaN
\n", - "

2505346 rows × 8 columns

\n", "
" ], "text/plain": [ - " id first_name last_name \\\n", - "0 1869727 NaN NaN \n", - "1 1779679 NaN NaN \n", - "2 2277221 NaN NaN \n", - "3 2277156 NaN NaN \n", - "4 2341373 NaN NaN \n", - "... ... ... ... \n", - "861260 6acfa74b-d5e1-4afd-b020-dbe429eb1c3f NaN NaN \n", - "861271 f111045d-bc3d-4050-9ad7-b3b1e6d72e56 NaN NaN \n", - "861277 d40859d7-b523-4ef5-895b-c3a947ab582f NaN NaN \n", - "861775 f5d76d43-86f4-40f9-aeb9-3df97ca8cdf0 NaN NaN \n", - "861920 1a0cf90d-3252-4c8d-b109-dea084a01f69 NaN NaN \n", + " transaction_id donor_id year amount \\\n", + "212637 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 100.00 \n", + "212667 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", + "440542 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", + "440573 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", + "440607 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", + "440642 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", + "636312 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", + "636346 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", + "636382 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", + "839846 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 83.33 \n", + "840051 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 83.34 \n", + "968402 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 83.33 \n", + "1414338 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 250.00 \n", + "1502742 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", + "1502777 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", + "1502812 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", "\n", - " full_name entity_type state party \\\n", - "0 william \bstoner individual NaN NaN \n", - "1 rm coulon individual NaN NaN \n", - "2 james engelson individual NaN NaN \n", - "3 marivic franciaskinner individual NaN NaN \n", - "4 anthony grindle individual NaN NaN \n", - "... ... ... ... ... \n", - "861260 Melissa Hart Candidate PA REP \n", - "861271 Heather Miller Candidate PA DEM \n", - "861277 Christopher M. Gebhard Candidate PA REP \n", - "861775 April Weaver Candidate PA REP \n", - "861920 Krista Paolucci Candidate PA REP \n", + " recipient_id office_sought purpose \\\n", + "212637 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + "212667 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + "440542 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + "440573 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + "440607 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + "440642 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + "636312 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + "636346 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + "636382 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + "839846 f9fa8506-bfbb-4ef0-9e08-5c9c3e948121 NaN NaN \n", + "840051 389fe2ba-828a-41d4-815c-8efb2499ea11 NaN NaN \n", + "968402 043a03b7-af31-4830-b12e-446b93fca9a0 NaN NaN \n", + "1414338 ba06baf6-eae6-459f-b3a9-7261e4baa33e NaN NaN \n", + "1502742 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + "1502777 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + "1502812 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", "\n", - " company \n", - "0 NaN \n", - "1 area agency on aging \n", - "2 retired \n", - "3 fibre source international corp \n", - "4 zimmerbiomet \n", - "... ... \n", - "861260 NaN \n", - "861271 NaN \n", - "861277 NaN \n", - "861775 NaN \n", - "861920 NaN \n", + " transaction_type donor_type recipient_type donor_office \n", + "212637 DIRECT NaN NaN NaN \n", + "212667 DIRECT NaN NaN NaN \n", + "440542 DIRECT NaN NaN NaN \n", + "440573 DIRECT NaN NaN NaN \n", + "440607 DIRECT NaN NaN NaN \n", + "440642 DIRECT NaN NaN NaN \n", + "636312 DIRECT NaN NaN NaN \n", + "636346 DIRECT NaN NaN NaN \n", + "636382 DIRECT NaN NaN NaN \n", + "839846 DIRECT/FUND RAISER NaN NaN NaN \n", + "840051 DIRECT/FUND RAISER NaN NaN NaN \n", + "968402 DIRECT/FUND RAISER NaN NaN NaN \n", + "1414338 DIRECT/FUND RAISER NaN NaN NaN \n", + "1502742 DIRECT NaN NaN NaN \n", + "1502777 DIRECT NaN NaN NaN \n", + "1502812 DIRECT NaN NaN NaN " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "transactions.loc[transactions['donor_id'] == 'b8fbed14-0766-49ab-8516-97952c654a12']" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'BUTZEL LONG POLITICAL ACTION COMMITTEE'" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = orgs_df.loc[orgs_df['id']=='1d4ae24b-2814-4d0d-995e-28fd4c26785d']\n", + "x.iloc[0]['name']" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# apply dedup to both inds and orgs\n", + "inds_df = deduplicate_perfect_matches(inds_df)\n", + "orgs_df = deduplicate_perfect_matches(orgs_df)\n", + "\n", + "# map the uuids in transaction donor and recipient columns to the deduplicated uuids\n", + "deduped = pd.read_csv(\"../output/deduplicated_UUIDs.csv\")\n", + "transactions[['donor_id','recipient_id']] = transactions[['donor_id','recipient_id']].replace(deduped)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# add recipient name to transactions df: \n", + "def name_identifier(uuid:str, orgs_df, inds_df) -> str:\n", + " # 1st check orgs df:\n", + " name_in_org = orgs_df.loc[orgs_df['id']==uuid] \n", + " if len(name_in_org)> 0:\n", + " return name_in_org.iloc[0]['name']\n", + " # theoretically it must be in inds if not in orgs, but for the sample data\n", + " # this might not be the case\n", + " name_in_ind = inds_df.loc[inds_df['id']==uuid]\n", + " if len(name_in_ind)> 0:\n", + " return name_in_ind.iloc[0]['full_name']\n", + " else: return None" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
transaction_iddonor_idyearamountrecipient_idoffice_soughtpurposetransaction_typedonor_typerecipient_typedonor_officerecipient_name
884875NaN6c2b94a2-4247-4bc4-b784-6b5a9a2ae9f220225.00533f6de5-5140-4799-be24-1d5f4e228d1bNaNNaNDIRECTNaNNaNNaNFRIENDS OF DANA NESSEL
122735NaNb906d3eb-3874-4789-b523-e2eaab41532820229.16f2fad7aa-a782-4d56-8343-049d2150c16fNaNMERCHANT SVCS FEESNaNNaNNaNNaNTHE JULIE BRIXIE BLUE WAVE FUND 2
458788NaN88740001-952f-477e-b2da-9b24f747f6ce20221.00a0619eff-155f-442f-ab71-b5c0ee942223NaNNaNDIRECTNaNNaNNaNCOMERICA INC POLITICAL ACTION COMMITTEE
1522918NaNda538e73-c823-48f8-b4ec-920aa1da458f202220.0081169dce-331e-44ad-b870-1b376d49cf2fNaNNaNDIRECTNaNNaNNaNWASTE MANAGEMENT EMPLOYEES BETTER GOVERNMENT F...
1933218NaN33814139-8442-4050-b15a-40aed1aa9db7202235.00abdf0530-e2fb-40b6-9a52-dea386cd60f4NaNNaNDIRECTNaNNaNNaNGRETCHEN WHITMER FOR GOVERNOR
465682NaN133431dd-41ef-4161-97ef-02d23fc05b4220227.50d582fba6-2a0c-4864-9fb2-5a4f898f26c2NaNNaNDIRECTNaNNaNNaNMI ASSOC OF COMMUNITY BANKERS OF MICHIGAN POLI...
761674NaN668d8471-ade6-469b-9e6b-71ddbfd1d8ba202225.001d05ca29-e97f-43cd-bd9e-f313573b324bNaNNaNDIRECTNaNNaNNaNEND CITIZENS UNITED NON-FEDERAL MI
993543NaNb9b66f08-4e99-43e7-9161-c75db92b0bb4202210.00ecebf482-f298-4777-bea6-e3451c75e3fcNaNNaNDIRECTNaNNaNNaNRESCARE INC DBA BRIGHTSPRING HEALTH SERVICES L...
1196687NaNf4942707-0d7f-4617-b478-56af7504123e202212.00a24e305e-a49b-4cb3-a857-d629f1162ce8NaNNaNDIRECTNaNNaNNaNMARATHON PETROLEUM CORPORATION EMPLOYEES PAC
334698NaN96be56db-56b6-48d0-9cf7-9d47da307388202211.809fc94e93-b6aa-400d-9a4a-d6501afb84dcNaNNaNDIRECTNaNNaNNaNMICHIGAN REGIONAL COUNCIL OF CARPENTERS POLITI...
\n", + "
" + ], + "text/plain": [ + " transaction_id donor_id year amount \\\n", + "884875 NaN 6c2b94a2-4247-4bc4-b784-6b5a9a2ae9f2 2022 5.00 \n", + "122735 NaN b906d3eb-3874-4789-b523-e2eaab415328 2022 9.16 \n", + "458788 NaN 88740001-952f-477e-b2da-9b24f747f6ce 2022 1.00 \n", + "1522918 NaN da538e73-c823-48f8-b4ec-920aa1da458f 2022 20.00 \n", + "1933218 NaN 33814139-8442-4050-b15a-40aed1aa9db7 2022 35.00 \n", + "465682 NaN 133431dd-41ef-4161-97ef-02d23fc05b42 2022 7.50 \n", + "761674 NaN 668d8471-ade6-469b-9e6b-71ddbfd1d8ba 2022 25.00 \n", + "993543 NaN b9b66f08-4e99-43e7-9161-c75db92b0bb4 2022 10.00 \n", + "1196687 NaN f4942707-0d7f-4617-b478-56af7504123e 2022 12.00 \n", + "334698 NaN 96be56db-56b6-48d0-9cf7-9d47da307388 2022 11.80 \n", + "\n", + " recipient_id office_sought \\\n", + "884875 533f6de5-5140-4799-be24-1d5f4e228d1b NaN \n", + "122735 f2fad7aa-a782-4d56-8343-049d2150c16f NaN \n", + "458788 a0619eff-155f-442f-ab71-b5c0ee942223 NaN \n", + "1522918 81169dce-331e-44ad-b870-1b376d49cf2f NaN \n", + "1933218 abdf0530-e2fb-40b6-9a52-dea386cd60f4 NaN \n", + "465682 d582fba6-2a0c-4864-9fb2-5a4f898f26c2 NaN \n", + "761674 1d05ca29-e97f-43cd-bd9e-f313573b324b NaN \n", + "993543 ecebf482-f298-4777-bea6-e3451c75e3fc NaN \n", + "1196687 a24e305e-a49b-4cb3-a857-d629f1162ce8 NaN \n", + "334698 9fc94e93-b6aa-400d-9a4a-d6501afb84dc NaN \n", + "\n", + " purpose transaction_type donor_type \\\n", + "884875 NaN DIRECT NaN \n", + "122735 MERCHANT SVCS FEES NaN NaN \n", + "458788 NaN DIRECT NaN \n", + "1522918 NaN DIRECT NaN \n", + "1933218 NaN DIRECT NaN \n", + "465682 NaN DIRECT NaN \n", + "761674 NaN DIRECT NaN \n", + "993543 NaN DIRECT NaN \n", + "1196687 NaN DIRECT NaN \n", + "334698 NaN DIRECT NaN \n", + "\n", + " recipient_type donor_office \\\n", + "884875 NaN NaN \n", + "122735 NaN NaN \n", + "458788 NaN NaN \n", + "1522918 NaN NaN \n", + "1933218 NaN NaN \n", + "465682 NaN NaN \n", + "761674 NaN NaN \n", + "993543 NaN NaN \n", + "1196687 NaN NaN \n", + "334698 NaN NaN \n", + "\n", + " recipient_name \n", + "884875 FRIENDS OF DANA NESSEL \n", + "122735 THE JULIE BRIXIE BLUE WAVE FUND 2 \n", + "458788 COMERICA INC POLITICAL ACTION COMMITTEE \n", + "1522918 WASTE MANAGEMENT EMPLOYEES BETTER GOVERNMENT F... \n", + "1933218 GRETCHEN WHITMER FOR GOVERNOR \n", + "465682 MI ASSOC OF COMMUNITY BANKERS OF MICHIGAN POLI... \n", + "761674 END CITIZENS UNITED NON-FEDERAL MI \n", + "993543 RESCARE INC DBA BRIGHTSPRING HEALTH SERVICES L... \n", + "1196687 MARATHON PETROLEUM CORPORATION EMPLOYEES PAC \n", + "334698 MICHIGAN REGIONAL COUNCIL OF CARPENTERS POLITI... " ] }, - "execution_count": 97, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "sample_inds" + "ex = transactions.sample(10)\n", + "ex['recipient_name'] = ex['recipient_id'].apply(name_identifier, args=(orgs_df, inds_df))\n", + "ex" ] }, { @@ -933,15 +1621,7 @@ } ], "source": [ - "sample_inds = inds_sample.loc[inds_sample['id'].isin(ind_id_there)]\n", - "# apply dedup\n", - "sample_inds = deduplicate_perfect_matches(sample_inds)\n", "\n", - "# map the uuids in transaction donor and recipient columns to the deduplicated uuids\n", - "deduped = pd.read_csv(\"../output/deduplicated_UUIDs.csv\")\n", - "transactions[['donor_id','recipient_id']] = transactions[['donor_id','recipient_id']].replace(deduped)\n", - "\n", - "# add recipient name to transactions df: \n", "# this step took more than 16 minutes to run...think of alternative way\n", "# id_to_name = {id: name for id, name in zip(inds_sample.id.tolist(), inds_sample.full_name.tolist())} #the same would be applied to orgs\n", "transactions['recipient_name'] = transactions['recipient_id'].apply(lambda x: sample_inds.loc[sample_inds.id == x] )\n", diff --git a/utils/network.py b/utils/network.py index b0d1e905..443f240d 100644 --- a/utils/network.py +++ b/utils/network.py @@ -22,7 +22,7 @@ def deduplicate_datasets( inds_df = deduplicate_perfect_matches(ind_df) orgs_df = deduplicate_perfect_matches(org_df) - # update the deduplicated uuids in transaction donor and recipient columns + # update the deduplicated uuids in transaction donor and recipient columns # to the uuids they are mapped to deduped = pd.read_csv("../output/deduplicated_UUIDs.csv") transactions_df[["donor_id", "recipient_id"]] = transactions_df[ @@ -31,9 +31,10 @@ def deduplicate_datasets( return inds_df, orgs_df, transactions_df -def name_identifier(uuid:str, orgs_df, inds_df) -> str: - '''Returns the name of the entity given the entity's uuid - + +def name_identifier(uuid: str, orgs_df, inds_df) -> str: + """Returns the name of the entity given the entity's uuid + Args: uuid: the uuid of the entity orgs_df and inds_df: the dataframes from which the entities uuid @@ -41,23 +42,24 @@ def name_identifier(uuid:str, orgs_df, inds_df) -> str: Return: The entity's name - ''' + """ # first, check orgs df: - name_in_org = orgs_df.loc[orgs_df['id']==uuid] - if len(name_in_org)> 0: - return name_in_org.iloc[0]['name'] + name_in_org = orgs_df.loc[orgs_df["id"] == uuid] + if len(name_in_org) > 0: + return name_in_org.iloc[0]["name"] # theoretically it must be in inds if not in orgs, but for the sample data # this might not be the case - name_in_ind = inds_df.loc[inds_df['id']==uuid] - if len(name_in_ind)> 0: - return name_in_ind.iloc[0]['full_name'] - else: return None + name_in_ind = inds_df.loc[inds_df["id"] == uuid] + if len(name_in_ind) > 0: + return name_in_ind.iloc[0]["full_name"] + else: + return None def network_prep_pipeline( ind_df: pd.DataFrame, org_df: pd.DataFrame, transactions_df: pd.DataFrame ) -> tuple: - '''Pipeline for preparing the orgs, inds, and transactions dataframes for + """Pipeline for preparing the orgs, inds, and transactions dataframes for network linkage Args: @@ -65,19 +67,20 @@ def network_prep_pipeline( regarding campaign contributions between donors and recipients Returns: - a tuple containing the 3 dataframes ready for network building - ''' - + a tuple containing the 3 dataframes ready for network building + """ + ind_df, org_df, transactions_df = deduplicate_datasets( ind_df, org_df, transactions_df ) # add recipient_name to the transactions dataset - transactions_df['recipient_name'] = transactions_df['recipient_id'].apply(name_identifier, args=(org_df, ind_df)) + transactions_df["recipient_name"] = transactions_df["recipient_id"].apply( + name_identifier, args=(org_df, ind_df) + ) return ind_df, org_df, transactions_df - def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: """Takes in a dataframe and generates a MultiDiGraph where the nodes are entity names, and the rest of the dataframe columns make the node attributes From 661feff7135078a6281495395efd0d436a04b391 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Sat, 24 Feb 2024 15:02:45 -0600 Subject: [PATCH 140/214] updated column names and docstring of dedup func based on Avery's feedback --- utils/linkage.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index f71a2b5f..c2df5515 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -462,9 +462,9 @@ def convert_duplicates_to_dict(df: pd.DataFrame) -> None: Returns None. However it outputs a file to the output directory, with 2 - columns. The first lists all the uuids in df, and is labeled 'all_uuids' - The 2nd shows the uuids to which each entry is mapped to, and is labeled - 'mapped_uuids'. + columns. The first lists all the uuids in df, and is labeled + 'original_uuids.' The 2nd shows the uuids to which each entry is mapped + to, and is labeled 'mapped_uuids'. """ deduped_dict = {} for i in range(len(df)): @@ -475,7 +475,7 @@ def convert_duplicates_to_dict(df: pd.DataFrame) -> None: # now convert dictionary into a csv file deduped_df = pd.DataFrame.from_dict(deduped_dict, "index") deduped_df = deduped_df.reset_index().rename( - columns={"index": "all_uuids", 0: "mapped_uuids"} + columns={"index": "original_uuids", 0: "mapped_uuid"} ) deduped_df.to_csv( repo_root / "output" / "deduplicated_UUIDs.csv", From d58795b76ed228ecc4eda3b4888ce44b3bf4e85a Mon Sep 17 00:00:00 2001 From: npashilkar Date: Mon, 26 Feb 2024 00:28:34 -0600 Subject: [PATCH 141/214] splink output edit --- utils/linkage.py | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index a8a40fd1..10afff7f 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -641,7 +641,7 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: def splink_dedupe( df: pd.DataFrame, settings: dict, blocking: list ) -> pd.DataFrame: - """Given the individuals or organizations dataframes, the corresponding + """Given a dataframes, the corresponding configuration settings, and corresponding blocking rules return a deduplicated dataframe @@ -650,13 +650,15 @@ def splink_dedupe( organizations_blocking Args: - df: individuals or organizations table - settings: individuald or configuration settings - (based on splink documentation) + df: dataframe + settings: configuration settings + (based on splink documentation and dataframe columns) blocking: list of columns to block on for the table - (cuts dataframe into parts based on above blocks ) + (cuts dataframe into parts based on columns labeled blocks) Returns: - dataframe with matched ids of matching rows + deduplicated version of initial dataframe with column 'matching_id' + that holds list of matching unique_ids + """ linker = DuckDBLinker(df, settings) linker.estimate_probability_two_random_records_match( @@ -671,4 +673,24 @@ def splink_dedupe( clusters = linker.cluster_pairwise_predictions_at_threshold( df_predict, threshold_match_probability=0.7 ) # default - return clusters.as_pandas_dataframe() + clusters_df = ( + clusters.as_pandas_dataframe() + ) # dataframe where cluster_id maps unique_id to initial instance of row + + match_list_df = ( + clusters_df.groupby("cluster_id")["unique_id"].agg(list).reset_index() + ) + match_list_df.rename( + columns={"unique_id": "matching_list"}, inplace=True + ) # dataframe which matches cluster_id to a list of unique_ids + + first_instance_df = clusters_df.drop_duplicates(subset="cluster_id") + col_names = np.append("cluster_id", df.columns) + first_instance_df = first_instance_df[col_names] + + return pd.merge( + first_instance_df, + match_list_df[["cluster_id", "matching_list"]], + on="cluster_id", + how="left", + ) From d0f36b6c8c13708109f4be8ee8c7791dd30fea4c Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 26 Feb 2024 09:47:58 -0600 Subject: [PATCH 142/214] saving Networkx work before merge...no need to review --- utils/network.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/utils/network.py b/utils/network.py index 443f240d..8b4d4610 100644 --- a/utils/network.py +++ b/utils/network.py @@ -99,9 +99,31 @@ def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: else: node_name = "full_name" + transact_info = [ + "office_sought", + "purpose", + "transaction_type", + "recipient_id", + "transaction_id", + "recipient_type", + "donor_office", + "recipient_name", + "amount", + ] + for _, row in df.iterrows(): + # add node attributes based on the columns relevant to the entity G.add_node(row[node_name]) - for column in df.columns: - nx.set_node_attributes(G, row[column], name=column) + for column in df.columns.difference(transact_info): + if not pd.isnull(row[column]): + G.nodes[row[node_name]][column] = row[column] + + # link the donor node to the recipient node. add the attributes of the + # edge based on relevant nodes + for column in transact_info: + if not pd.isnull(row[column]): + G.add_edge( + row[node_name], row["recipient_name"], column=row[column] + ) return G From f8df69fcd07046f05899375f5705d66973bd3b62 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 26 Feb 2024 11:35:32 -0600 Subject: [PATCH 143/214] saving work for merge, no need to review --- utils/network.py | 87 ++++++++++-------------------------------------- 1 file changed, 17 insertions(+), 70 deletions(-) diff --git a/utils/network.py b/utils/network.py index 8b4d4610..6e9dcd90 100644 --- a/utils/network.py +++ b/utils/network.py @@ -1,84 +1,31 @@ import networkx as nx import pandas as pd -from utils.linkage import deduplicate_perfect_matches - -def deduplicate_datasets( - ind_df: pd.DataFrame, org_df: pd.DataFrame, transactions_df: pd.DataFrame -) -> tuple: - """Deduplicates the uuids in the inds and orgs dfs and updates the uuids in - transactions dataset to match those in the new inds and orgs dfs - - Args: - ind_df: A pandas df with individual information - org_df: A pandas df with organization information - transactions df: A pandas df with info on transactions between entities - - Returns: - A tuple of the ind_df, org_df, and transactions_df - """ - # apply dedup to both inds and orgs - inds_df = deduplicate_perfect_matches(ind_df) - orgs_df = deduplicate_perfect_matches(org_df) - - # update the deduplicated uuids in transaction donor and recipient columns - # to the uuids they are mapped to - deduped = pd.read_csv("../output/deduplicated_UUIDs.csv") - transactions_df[["donor_id", "recipient_id"]] = transactions_df[ - ["donor_id", "recipient_id"] - ].replace(deduped) - - return inds_df, orgs_df, transactions_df - - -def name_identifier(uuid: str, orgs_df, inds_df) -> str: +def name_identifier(uuid: str, dfs: list[pd.DataFrame]) -> str: """Returns the name of the entity given the entity's uuid Args: uuid: the uuid of the entity - orgs_df and inds_df: the dataframes from which the entities uuid - is queried - + List of dfs: dataframes that have a uuid column, and an 'name' or + 'full_name' column Return: The entity's name """ - # first, check orgs df: - name_in_org = orgs_df.loc[orgs_df["id"] == uuid] - if len(name_in_org) > 0: - return name_in_org.iloc[0]["name"] - # theoretically it must be in inds if not in orgs, but for the sample data - # this might not be the case - name_in_ind = inds_df.loc[inds_df["id"] == uuid] - if len(name_in_ind) > 0: - return name_in_ind.iloc[0]["full_name"] - else: - return None - - -def network_prep_pipeline( - ind_df: pd.DataFrame, org_df: pd.DataFrame, transactions_df: pd.DataFrame -) -> tuple: - """Pipeline for preparing the orgs, inds, and transactions dataframes for - network linkage - - Args: - ind_df, org_df, transactions_df: pandas dataframes with information - regarding campaign contributions between donors and recipients - - Returns: - a tuple containing the 3 dataframes ready for network building - """ - - ind_df, org_df, transactions_df = deduplicate_datasets( - ind_df, org_df, transactions_df - ) - - # add recipient_name to the transactions dataset - transactions_df["recipient_name"] = transactions_df["recipient_id"].apply( - name_identifier, args=(org_df, ind_df) - ) - return ind_df, org_df, transactions_df + for df in dfs: + # first, check orgs df: + if "name" in df.columns: + name_in_org = df.loc[df["id"] == uuid] + if len(name_in_org) > 0: + return name_in_org.iloc[0]["name"] + # theoretically it must be in inds if not in orgs, but for the sample + # data this might not be the case + + if "full_name" in df.columns: + name_in_ind = df.loc[df["id"] == uuid] + if len(name_in_ind) > 0: + return name_in_ind.iloc[0]["full_name"] + return None def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: From 7b2ca080234a64f7a274f30a19949f52ea8db857 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Tue, 27 Feb 2024 01:47:26 -0600 Subject: [PATCH 144/214] splink output edits --- utils/constants.py | 21 +++++++++++---------- utils/linkage.py | 17 +++++++++++++++-- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/utils/constants.py b/utils/constants.py index 91e1d87f..23ea161b 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -647,10 +647,11 @@ individuals_settings = { "link_type": "dedupe_only", - "blocking_rules_to_generate_predictions": ["l.full_name - r.full_name"], + "blocking_rules_to_generate_predictions": [ + "l.first_name = r.first_name", + "l.last_name = r.last_name", + ], "comparisons": [ - ctl.name_comparison("first_name"), # built in comparison function - ctl.name_comparison("last_name"), ctl.name_comparison("full_name"), cl.exact_match("entity_type", term_frequency_adjustments=True), cl.jaro_winkler_at_thresholds( @@ -662,11 +663,13 @@ # DEFAULT "retain_matching_columns": True, "retain_intermediate_calculation_columns": True, + "max_iterations": 10, + "em_convergence": 0.01, } individuals_blocking = [ - "l.first_name = r.first_name and l.last_name = r.last_name", - "l.full_name = r.full_name", + "l.first_name = r.first_name", + "l.last_name = r.last_name", ] organizations_settings = { @@ -675,7 +678,6 @@ "l.name = r.name", ], "comparisons": [ - ctl.name_comparison("name", term_frequency_adjustments=True), cl.exact_match("entity_type", term_frequency_adjustments=True), cl.jaro_winkler_at_thresholds( "state", [0.9, 0.8] @@ -684,9 +686,8 @@ ], "retain_matching_columns": True, "retain_intermediate_calculation_columns": True, + "max_iterations": 10, + "em_convergence": 0.01, } -organizations_blocking = [ - "l.name = r.name", - "l.name = r.name and l.state = r.state", -] +organizations_blocking = ["l.name = r.name"] diff --git a/utils/linkage.py b/utils/linkage.py index 10afff7f..0a575a1d 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -688,9 +688,22 @@ def splink_dedupe( col_names = np.append("cluster_id", df.columns) first_instance_df = first_instance_df[col_names] - return pd.merge( + deduped_df = pd.merge( first_instance_df, - match_list_df[["cluster_id", "matching_list"]], + match_list_df[["cluster_id"]], on="cluster_id", how="left", ) + + match_list_df.rename( + columns={"unique_id": "mapped_uuids", "cluster_id": "original_ids"}, + inplace=True, + ) + deduped_df.to_csv( + repo_root / "output" / "splink_deduplicated_UUIDs.csv", + index=False, + mode="a", + header=not os.path.exists("../output/splink_deduplicated_UUIDs.csv"), + ) + + return deduped_df From 42ca58e75333f4d91836b7dc64134adc0247810b Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 28 Feb 2024 04:13:59 +0000 Subject: [PATCH 145/214] pipeline changes --- utils/linkage_pipeline.py | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index b5e4d451..613d3244 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -133,7 +133,6 @@ def preprocess_pipeline( ) individuals = deduplicate_perfect_matches(individuals) -organizations = deduplicate_perfect_matches(organizations) processed_individuals_output_path = ( BASE_FILEPATH / "output" / "processed_individuals_table.csv" From 77bc2b3e4ac276b2d290a092d8f1ae51dd6a41a4 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 28 Feb 2024 04:19:36 +0000 Subject: [PATCH 146/214] adding removed files --- utils/classify.py | 75 +++++++++++++++++++++++++ utils/tests/test_linkage.py | 107 ++++++++++++++++++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 utils/classify.py create mode 100644 utils/tests/test_linkage.py diff --git a/utils/classify.py b/utils/classify.py new file mode 100644 index 00000000..db574ace --- /dev/null +++ b/utils/classify.py @@ -0,0 +1,75 @@ +import pandas as pd + +# we want to run down a list of people and, hopefully, their adresses, plus a list of +# corporations, groups, etc, and classify them, basically just looking for matches + +# do we want to just input all the names/people (there's not many, less than 200 +# for sure),give a string similarity match score, and extract the top ten for +# manual review? this should give us a feeling for how to set our threshold +# we might also, once we have all the data, buckle down and just classify +# some of them manually + +inds_list = [] + +# a list of individual names + + +def similarity_calculator( + df: pd.DataFrame, subject: str, n: int, comparison_func +) -> pd.DataFrame: + """Find best matches to a subject name in a pandas dataframe + + For a given individual or organization, the subject, we search through the + 'name'column of a dataframe, select the n highest matches according to a + selected comparison function, and return those as a dataframe. This is meant + to be used manually to search for matches. For quick automated processing, see + automated_classifier(). + + Note that the comparison function must take in two inputs, both strings, and + output a percentage match + """ + + similarities_df = df.copy() + + similarities = similarities_df["name"].apply( + lambda x: comparison_func(x, subject) + ) + + similarities_df["similarities"] = similarities + + top_n_matches = similarities_df.sort_values( + by=["similarities"], ascending=False + )[0:n] + + return top_n_matches + + +def automated_classifier( + df: pd.DataFrame, subjects_dict: dict, threshold: float, comparison_func +): + """Using similarity_calculator, classify entities automatically + + Feeding a dictionary of names and the associated statuses, we compare + the string matches and, if they exceed a certain threshold, classify + them as belonging to some group specified in the subjects dictionary. + """ + + similarities_df = df.copy() + + for subject in subjects_dict: + similarities = similarities_df["name"].apply( + lambda x, sub=subject: comparison_func(x, sub) + ) + matches = similarities >= threshold + + status = subjects_dict[subject] + + similarities_df["classification"] = pd.Series(matches).apply( + lambda x, stat=status: stat if x else "neutral" + ) + + return similarities_df + + # we can use the indices and/or select manually, just add a new + # column to the subjects table + # that marks fossil fuels, green energy, or neither diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py new file mode 100644 index 00000000..3695a399 --- /dev/null +++ b/utils/tests/test_linkage.py @@ -0,0 +1,107 @@ +import numpy as np +import pandas as pd +import pytest + +from utils.linkage import ( + calculate_row_similarity, + calculate_string_similarity, + row_matches, +) + +# import pytest + + +# creating a test for calculate_row_similarity and row_matches + +# to put in data: +d = { + "name": ["bob von rosevich", "anantarya smith", "bob j vonrosevich"], + "address": [ + "3 Blue Drive, Chicago", + "4 Blue Drive, Chicago", + "8 Fancy Way, Chicago", + ], +} +test_df = pd.DataFrame(data=d) + + +@pytest.fixture +def row_similarity_scen_1(): + return test_df + + +@pytest.fixture +def row_similarity_scen_2(): + return test_df + + +def test_row_similarity_scen_1(row_similarity_scen_1): + wrong = calculate_row_similarity( + row_similarity_scen_1.iloc[[0]], + row_similarity_scen_1.iloc[[1]], + np.array([0.8, 0.2]), + calculate_string_similarity, + ) + right = calculate_row_similarity( + row_similarity_scen_1.iloc[[0]], + row_similarity_scen_1.iloc[[2]], + np.array([0.8, 0.2]), + calculate_string_similarity, + ) + + assert right > wrong + + +def test_row_similarity_scen_2(row_similarity_scen_2): + wrong = calculate_row_similarity( + row_similarity_scen_2.iloc[[0]], + row_similarity_scen_2.iloc[[1]], + np.array([0.2, 0.8]), + calculate_string_similarity, + ) + right = calculate_row_similarity( + row_similarity_scen_2.iloc[[0]], + row_similarity_scen_2.iloc[[2]], + np.array([0.2, 0.8]), + calculate_string_similarity, + ) + + assert right < wrong + + +d2 = { + "name": [ + "bob von rosevich", + "anantarya smith", + "bob j vonrosevich", + "missy elliot", + "mr johnson", + "quarantin directino", + "missy eliot", + "joseph johnson", + ], + "address": [ + "3 Blue Drive, Chicago", + "4 Blue Drive, Chicago", + "8 Fancy Way, Chicago", + "8 Fancy Way, Evanston", + "17 Regular Road, Chicago", + "42 Hollywood Boulevard, Chicago", + "8 Fancy Way, Evanston", + "17 Regular Road, Chicago", + ], +} +test_df2 = pd.DataFrame(data=d2) + + +@pytest.fixture +def row_match_scen1(): + return test_df2 + + +def test_row_matches(row_match_scen1): + res = row_matches( + row_match_scen1, np.array([0.8, 0.2]), 0.9, calculate_string_similarity + ) + + assert res == {0: [2], 1: [], 2: [], 3: [6], 4: [], 5: [], 6: [], 7: []} From 485fe43aabee2a29ce9048a89760c1c7c4424bde Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 27 Feb 2024 22:28:15 -0600 Subject: [PATCH 147/214] basics of makefile and added classify fns --- utils/Makefile | 0 utils/classify.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 utils/Makefile diff --git a/utils/Makefile b/utils/Makefile new file mode 100644 index 00000000..e69de29b diff --git a/utils/classify.py b/utils/classify.py index db574ace..465351ea 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -9,6 +9,63 @@ # we might also, once we have all the data, buckle down and just classify # some of them manually + + + +#several kinds of lists, applied differently, actually they should be dictionaries + +#corp name lists +#employer name lists +#etc + + +#individuals compnay f names +f_companies = ["exxon", "chevron", "southwest gas", "petroleum", "koch industries", "koch companies", "oil & gas", "marathon oil", "shell oil", ] + +#organizations f names +f_org_names = ["koch industries", "koch pac", "kochpac", "southwest gas az", "pinnacle west", "americans for prosperity", "energy transfer"] + +#organizations c names +c_org_names = ["clean energy", "vote solar action", "renewable", "pattern energy", "beyond carbon", "lcv victory", "league of conservation"] + + + +def matcher(df, substring, column, category): + """ + """ + + bool_series = df[column].str.contains(substring, na=False) + + df.loc[bool_series, 'classification'] = category + + return df + + +def classification_pipeline(individuals_df, organizations_df): + """ + + """ + + individuals_df["classification"] = "neutral" + + organizations_df["classification"] = "neutral" + + for i in f_companies: + individuals_df = matcher(individuals_df, i, "company", "f") + + for i in f_org_names: + organizations_df = matcher(organizations_df, i, "name", "f") + + for i in c_org_names: + organizations_df = matcher(organizations_df, i, "name", "c") + + + return individuals_df, organizations_df + + + + + inds_list = [] # a list of individual names From e4b3a0afcef481f995e98dfcf7da7a11ca7b28b8 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 27 Feb 2024 22:37:39 -0600 Subject: [PATCH 148/214] linter fixes --- utils/Makefile | 18 +++++++++++ utils/classify.py | 78 ++++++++++++++++++++++++++++------------------- 2 files changed, 65 insertions(+), 31 deletions(-) diff --git a/utils/Makefile b/utils/Makefile index e69de29b..4723bef1 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -0,0 +1,18 @@ +all: all_individuals.csv, all_organizations.csv, all_transactions.csv + +#set this up as a pipeline, check how far along Adil is on this +output deduplicated_individuals: all_individuals.csv + python deduplication_pipeline + +#likewise here +output deduplicated_organizations: all_organizations.csv + python deduplication_pipeline + +output classified_individuals: all_individuals.csv + python classifier_pipeline + +output classified_organizations: all_organizations.csv + python classifier_pipeline + +output network_graph: all_individuals.csv all_organizations.csv all_transactions.csv + python network_graph_pipeline \ No newline at end of file diff --git a/utils/classify.py b/utils/classify.py index 465351ea..493773ec 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -10,41 +10,61 @@ # some of them manually +# several kinds of lists, applied differently, actually they should be dictionaries + +# corp name lists +# employer name lists +# etc + + +# individuals compnay f names +f_companies = [ + "exxon", + "chevron", + "southwest gas", + "petroleum", + "koch industries", + "koch companies", + "oil & gas", + "marathon oil", + "shell oil", +] + +# organizations f names +f_org_names = [ + "koch industries", + "koch pac", + "kochpac", + "southwest gas az", + "pinnacle west", + "americans for prosperity", + "energy transfer", +] + +# organizations c names +c_org_names = [ + "clean energy", + "vote solar action", + "renewable", + "pattern energy", + "beyond carbon", + "lcv victory", + "league of conservation", +] -#several kinds of lists, applied differently, actually they should be dictionaries - -#corp name lists -#employer name lists -#etc - - -#individuals compnay f names -f_companies = ["exxon", "chevron", "southwest gas", "petroleum", "koch industries", "koch companies", "oil & gas", "marathon oil", "shell oil", ] - -#organizations f names -f_org_names = ["koch industries", "koch pac", "kochpac", "southwest gas az", "pinnacle west", "americans for prosperity", "energy transfer"] - -#organizations c names -c_org_names = ["clean energy", "vote solar action", "renewable", "pattern energy", "beyond carbon", "lcv victory", "league of conservation"] +def matcher(df, substring, column, category): + """ """ + bool_series = df[column].str.contains(substring, na=False) + df.loc[bool_series, "classification"] = category -def matcher(df, substring, column, category): - """ - """ - - bool_series = df[column].str.contains(substring, na=False) - - df.loc[bool_series, 'classification'] = category - return df def classification_pipeline(individuals_df, organizations_df): - """ - - """ + """ """ individuals_df["classification"] = "neutral" @@ -55,17 +75,13 @@ def classification_pipeline(individuals_df, organizations_df): for i in f_org_names: organizations_df = matcher(organizations_df, i, "name", "f") - + for i in c_org_names: organizations_df = matcher(organizations_df, i, "name", "c") - return individuals_df, organizations_df - - - inds_list = [] # a list of individual names From 3ce0c50a52789547072d728397fded967496d27c Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 27 Feb 2024 23:15:54 -0600 Subject: [PATCH 149/214] modifying classify to fit makefile --- utils/classify.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index 493773ec..a0437e8d 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -63,23 +63,32 @@ def matcher(df, substring, column, category): return df -def classification_pipeline(individuals_df, organizations_df): - """ """ +def classify_individuals(individuals_df): + """ + + """ individuals_df["classification"] = "neutral" - organizations_df["classification"] = "neutral" - for i in f_companies: individuals_df = matcher(individuals_df, i, "company", "f") + return individuals_df + + + +def classify_orgs(organizations_df): + """ """ + + organizations_df["classification"] = "neutral" + for i in f_org_names: organizations_df = matcher(organizations_df, i, "name", "f") for i in c_org_names: organizations_df = matcher(organizations_df, i, "name", "c") - return individuals_df, organizations_df + return organizations_df inds_list = [] From 517f909e62c8e76fc206b392c152784273772e68 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 27 Feb 2024 23:16:28 -0600 Subject: [PATCH 150/214] linter fixes --- utils/classify.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index a0437e8d..fe26acf0 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -64,9 +64,7 @@ def matcher(df, substring, column, category): def classify_individuals(individuals_df): - """ - - """ + """ """ individuals_df["classification"] = "neutral" @@ -76,7 +74,6 @@ def classify_individuals(individuals_df): return individuals_df - def classify_orgs(organizations_df): """ """ From 244fe9414727613a3e8e25a90322824455308a06 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Tue, 27 Feb 2024 23:22:26 -0600 Subject: [PATCH 151/214] make should run classification properly --- utils/Makefile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/utils/Makefile b/utils/Makefile index 4723bef1..f0cda2ea 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -8,11 +8,13 @@ output deduplicated_individuals: all_individuals.csv output deduplicated_organizations: all_organizations.csv python deduplication_pipeline + output classified_individuals: all_individuals.csv - python classifier_pipeline + python classify.py classify_individuals output classified_organizations: all_organizations.csv - python classifier_pipeline + python classify.py classify_orgs +#just sketched out output network_graph: all_individuals.csv all_organizations.csv all_transactions.csv python network_graph_pipeline \ No newline at end of file From c273a178f6d67aec7766dc2d0c76f67181667e22 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 28 Feb 2024 09:15:15 -0600 Subject: [PATCH 152/214] moved names to constants --- utils/classify.py | 46 ++-------------------------------------------- utils/constants.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index fe26acf0..2002472d 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -1,5 +1,7 @@ import pandas as pd +from utils.constants import f_companies, f_org_names, c_org_names + # we want to run down a list of people and, hopefully, their adresses, plus a list of # corporations, groups, etc, and classify them, basically just looking for matches @@ -9,50 +11,6 @@ # we might also, once we have all the data, buckle down and just classify # some of them manually - -# several kinds of lists, applied differently, actually they should be dictionaries - -# corp name lists -# employer name lists -# etc - - -# individuals compnay f names -f_companies = [ - "exxon", - "chevron", - "southwest gas", - "petroleum", - "koch industries", - "koch companies", - "oil & gas", - "marathon oil", - "shell oil", -] - -# organizations f names -f_org_names = [ - "koch industries", - "koch pac", - "kochpac", - "southwest gas az", - "pinnacle west", - "americans for prosperity", - "energy transfer", -] - -# organizations c names -c_org_names = [ - "clean energy", - "vote solar action", - "renewable", - "pattern energy", - "beyond carbon", - "lcv victory", - "league of conservation", -] - - def matcher(df, substring, column, category): """ """ diff --git a/utils/constants.py b/utils/constants.py index f259db36..0384cba4 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -641,3 +641,38 @@ "CIC": "COMMUNITY INTEREST COMPANY", "PAC": "POLITICAL ACTION COMMITTEE", } + +# individuals compnay f names +f_companies = [ + "exxon", + "chevron", + "southwest gas", + "petroleum", + "koch industries", + "koch companies", + "oil & gas", + "marathon oil", + "shell oil", +] + +# organizations f names +f_org_names = [ + "koch industries", + "koch pac", + "kochpac", + "southwest gas az", + "pinnacle west", + "americans for prosperity", + "energy transfer", +] + +# organizations c names +c_org_names = [ + "clean energy", + "vote solar action", + "renewable", + "pattern energy", + "beyond carbon", + "lcv victory", + "league of conservation", +] \ No newline at end of file From 9519d67e03fab79999ac4313f2263af95de8a009 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 28 Feb 2024 09:15:44 -0600 Subject: [PATCH 153/214] linter fixes --- utils/classify.py | 3 ++- utils/constants.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index 2002472d..5a729695 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -1,6 +1,6 @@ import pandas as pd -from utils.constants import f_companies, f_org_names, c_org_names +from utils.constants import c_org_names, f_companies, f_org_names # we want to run down a list of people and, hopefully, their adresses, plus a list of # corporations, groups, etc, and classify them, basically just looking for matches @@ -11,6 +11,7 @@ # we might also, once we have all the data, buckle down and just classify # some of them manually + def matcher(df, substring, column, category): """ """ diff --git a/utils/constants.py b/utils/constants.py index 0384cba4..c3bbcbc1 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -675,4 +675,4 @@ "beyond carbon", "lcv victory", "league of conservation", -] \ No newline at end of file +] From 0611585333a2eed4c7b8ed6e2431e6bec44752b8 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 28 Feb 2024 09:52:27 -0600 Subject: [PATCH 154/214] added classification wrapper --- utils/classify.py | 50 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index 5a729695..33c0c1bb 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -2,18 +2,38 @@ from utils.constants import c_org_names, f_companies, f_org_names -# we want to run down a list of people and, hopefully, their adresses, plus a list of -# corporations, groups, etc, and classify them, basically just looking for matches -# do we want to just input all the names/people (there's not many, less than 200 -# for sure),give a string similarity match score, and extract the top ten for -# manual review? this should give us a feeling for how to set our threshold -# we might also, once we have all the data, buckle down and just classify -# some of them manually +def classify_wrapper(individuals_df, organizations_df): + """Wrapper for classificaiton in linkage pipeline + + Initialize the classify column in both dataframes and + call sub-functions classifying individuals and organizations + + Args: individuals_df: cleaned and deduplicated dataframe of individuals + organizations_df: cleaned and deduplicated dataframe of organizations + + Returns: individuals and organizations datfarames with a new + 'classification' column containing 'neutral', 'f', or 'c' + """ + + individuals_df["classification"] = "neutral" + organizations_df["classification"] = "neutral" + + classified_individuals = classify_individuals(individuals_df) + classified_orgs = classify_orgs(organizations_df) + + return classified_individuals, classified_orgs def matcher(df, substring, column, category): - """ """ + """ Applies a label to the classification column based on substrings + + We run through a given column containing strings in the dataframe. We + seek out rows containing substrings, and apply a certain label to + the classification column. We initialize using the 'neutral' label and + use the 'f' and 'c' labels to denote fossil fuel and clean energy + entities respectively. + """ bool_series = df[column].str.contains(substring, na=False) @@ -23,9 +43,12 @@ def matcher(df, substring, column, category): def classify_individuals(individuals_df): - """ """ + """ Part of the classification pipeline - individuals_df["classification"] = "neutral" + We apply the matcher function to the individuals dataframe + repeatedly, using a variety of substrings to identify the + employees of fossil fuel companies. + """ for i in f_companies: individuals_df = matcher(individuals_df, i, "company", "f") @@ -34,9 +57,12 @@ def classify_individuals(individuals_df): def classify_orgs(organizations_df): - """ """ + """ Part of the classification pipeline - organizations_df["classification"] = "neutral" + We apply the matcher function to the organizations dataframe + repeatedly, using a variety of substrings to identify fossil + fuel and clean energy companies. + """ for i in f_org_names: organizations_df = matcher(organizations_df, i, "name", "f") From f8c4dc1590efe975e7311983dca8e7cb2b8ee713 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 28 Feb 2024 09:52:58 -0600 Subject: [PATCH 155/214] linter fix --- utils/classify.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index 33c0c1bb..3c24f941 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -6,14 +6,14 @@ def classify_wrapper(individuals_df, organizations_df): """Wrapper for classificaiton in linkage pipeline - Initialize the classify column in both dataframes and + Initialize the classify column in both dataframes and call sub-functions classifying individuals and organizations Args: individuals_df: cleaned and deduplicated dataframe of individuals organizations_df: cleaned and deduplicated dataframe of organizations - Returns: individuals and organizations datfarames with a new - 'classification' column containing 'neutral', 'f', or 'c' + Returns: individuals and organizations datfarames with a new + 'classification' column containing 'neutral', 'f', or 'c' """ individuals_df["classification"] = "neutral" @@ -26,13 +26,13 @@ def classify_wrapper(individuals_df, organizations_df): def matcher(df, substring, column, category): - """ Applies a label to the classification column based on substrings + """Applies a label to the classification column based on substrings We run through a given column containing strings in the dataframe. We seek out rows containing substrings, and apply a certain label to - the classification column. We initialize using the 'neutral' label and - use the 'f' and 'c' labels to denote fossil fuel and clean energy - entities respectively. + the classification column. We initialize using the 'neutral' label and + use the 'f' and 'c' labels to denote fossil fuel and clean energy + entities respectively. """ bool_series = df[column].str.contains(substring, na=False) @@ -43,11 +43,11 @@ def matcher(df, substring, column, category): def classify_individuals(individuals_df): - """ Part of the classification pipeline + """Part of the classification pipeline We apply the matcher function to the individuals dataframe - repeatedly, using a variety of substrings to identify the - employees of fossil fuel companies. + repeatedly, using a variety of substrings to identify the + employees of fossil fuel companies. """ for i in f_companies: @@ -57,11 +57,11 @@ def classify_individuals(individuals_df): def classify_orgs(organizations_df): - """ Part of the classification pipeline + """Part of the classification pipeline We apply the matcher function to the organizations dataframe - repeatedly, using a variety of substrings to identify fossil - fuel and clean energy companies. + repeatedly, using a variety of substrings to identify fossil + fuel and clean energy companies. """ for i in f_org_names: From 3c619375b2a8a7a68a72fea4a97a2fee30360043 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 28 Feb 2024 15:54:25 +0000 Subject: [PATCH 156/214] proper updates --- utils/linkage_pipeline.py | 146 +++++++++++++++++++++----------------- 1 file changed, 82 insertions(+), 64 deletions(-) diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index 613d3244..1f565446 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -1,5 +1,3 @@ -from typing import Tuple - import pandas as pd from nameparser import HumanName @@ -15,45 +13,29 @@ ) -def preprocess_pipeline( - individuals: pd.DataFrame, - organizations: pd.DataFrame, - transactions: pd.DataFrame, -) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: +def preprocess_individuals(individuals: pd.DataFrame) -> pd.DataFrame: """ - Preprocesses data for record linkage + Given a dataframe of individual donors, preprocesses the data, + and return a cleaned dataframe. Args: - Individuals: dataframe of individual contributions - Organizations: dataframe of organization contributions - Transactions: dataframe of transactions + individuals: dataframe of individual contributions + Returns: - preprocessed tuple of dataframes - first element is the individuals dataframe, - second element is the organizations dataframe, - third element is the transactions dataframe + cleaned dataframe of individuals """ - # Preprocess organizations dataframe - organizations["name"] = ( - organizations["name"].astype(str).apply(standardize_corp_names) - ) - if "Unnamed: 0" in organizations.columns: - organizations.drop(columns="Unnamed: 0", inplace=True) - - # Preprocess individuals dataframe if "Unnamed: 0" in individuals.columns: individuals.drop(columns="Unnamed: 0", inplace=True) individuals = individuals.astype( { - "first_name": str, - "last_name": str, - "full_name": str, + "first_name": "string", + "last_name": "string", + "full_name": "string", "company": "string", } ) - # Standardize company names in individuals dataframe individuals["company"] = ( individuals["company"] .loc[individuals["company"].notnull()] @@ -66,7 +48,6 @@ def preprocess_pipeline( ) # Address functions, assuming address column is named 'Address' - # If there is an "Address" column in the first place if "Address" in individuals.columns: individuals["Address"] = individuals["Address"].astype(str) individuals["Address Line 1"] = individuals["Address"].apply( @@ -84,20 +65,12 @@ def preprocess_pipeline( individuals["full_name"].notnull() ] if individuals["first_name"].isnull().any(): - name = ( - individuals["full_name"] - .apply(HumanName) - .apply(lambda x: x.as_dict()) - ) + name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) first_name = name.apply(lambda x: x["first"]) individuals["first_name"] = first_name if individuals["last_name"].isnull().any(): - name = ( - individuals["full_name"] - .apply(HumanName) - .apply(lambda x: x.as_dict()) - ) + name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) last_name = name.apply(lambda x: x["last"]) individuals["last_name"] = last_name @@ -108,44 +81,89 @@ def preprocess_pipeline( axis=1, ) + return individuals + + +def preprocess_organizations(organizations: pd.DataFrame) -> pd.DataFrame: + """ + Given a dataframe of organization donors, preprocesses the data, + and return a cleaned dataframe. + """ + if "Unnamed: 0" in organizations.columns: + organizations.drop(columns="Unnamed: 0", inplace=True) + + organizations["name"] = ( + organizations["name"] + .loc[organizations["name"].notnull()] + .apply(standardize_corp_names) + ) + + return organizations + + +def preprocess_transactions(transactions: pd.DataFrame) -> pd.DataFrame: + """ + Given a dataframe of transactions, preprocesses the data, + and return a cleaned dataframe. + + Args: + transactions: dataframe of transactions + + Returns: + cleaned dataframe of transactions + """ if "Unnamed: 0" in transactions.columns: transactions.drop(columns="Unnamed: 0", inplace=True) transactions["purpose"] = transactions["purpose"].str.upper() - return individuals, organizations, transactions + return transactions -organizations = pd.read_csv( - BASE_FILEPATH / "output" / "complete_organizations_table.csv" -) +def main(): + organizations = pd.read_csv( + BASE_FILEPATH / "output" / "complete_organizations_table.csv" + ) -individuals = pd.read_csv( - BASE_FILEPATH / "output" / "complete_individuals_table.csv" -) + individuals = pd.read_csv( + BASE_FILEPATH / "output" / "complete_individuals_table.csv" + ) -transactions = pd.read_csv( - BASE_FILEPATH / "output" / "complete_transactions_table.csv" -) + transactions = pd.read_csv( + BASE_FILEPATH / "output" / "complete_transactions_table.csv" + ) -individuals, organizations, transactions = preprocess_pipeline( - individuals, organizations, transactions -) + individuals = preprocess_individuals(individuals) + organizations = preprocess_organizations(organizations) + transactions = preprocess_transactions(transactions) -individuals = deduplicate_perfect_matches(individuals) + # Deduplicates perfect matches and creates a new csv file + # in output titled "deduplicated_UUIDs.csv" + individuals = deduplicate_perfect_matches(individuals) + organizations = deduplicate_perfect_matches(organizations) -processed_individuals_output_path = ( - BASE_FILEPATH / "output" / "processed_individuals_table.csv" -) + cleaned_individuals_output_path = ( + BASE_FILEPATH / "output" / "cleaned_individuals_table.csv" + ) -processed_organizations_output_path = ( - BASE_FILEPATH / "output" / "processed_organizations_table.csv" -) + cleaned_organizations_output_path = ( + BASE_FILEPATH / "output" / "cleaned_organizations_table.csv" + ) + + cleaned_transactions_output_path = ( + BASE_FILEPATH / "output" / "cleaned_transactions_table.csv" + ) + + deduped = pd.read_csv(BASE_FILEPATH / "output" / "deduplicated_UUIDs.csv") + + transactions[["donor_id", "recipient_id"]] = transactions[ + ["donor_id", "recipient_id"] + ].replace(deduped) + + individuals.to_csv(cleaned_individuals_output_path) + organizations.to_csv(cleaned_organizations_output_path) + transactions.to_csv(cleaned_transactions_output_path) -processed_transactions_output_path = ( - BASE_FILEPATH / "output" / "processed_transactions_table.csv" -) -individuals.to_csv(processed_individuals_output_path) -organizations.to_csv(processed_organizations_output_path) -transactions.to_csv(processed_transactions_output_path) +if __name__ == "__main__": + main() From 4e32543c82bec739f90cbf55a5749464d2a5851f Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 28 Feb 2024 16:03:19 +0000 Subject: [PATCH 157/214] removing duplicated function --- utils/linkage.py | 60 ------------------------------------------------ 1 file changed, 60 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 29319907..cae5024d 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,5 +1,3 @@ -import re - import textdistance as td import usaddress from names_dataset import NameDataset @@ -635,61 +633,3 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: elif address_line_1_components[i][1] == "USPSBoxID": return address_line_1_components[i][0] raise ValueError("Can not find Address Number") - - -def cleaning_company_column(company_entry: str) -> str: - """ - Given a string, check if it contains a variation of self employed, unemployed, - or retired and return the standardized version. - - Args: - company: string of inputted company names - Returns: - standardized for retired, self employed, and unemployed, - or original string if no match or empty string - - >>> cleaning_company_column("Retireed") - 'Retired' - >>> cleaning_company_column("self") - 'Self Employed' - >>> cleaning_company_column("None") - 'Unemployed' - >>> cleaning_company_column("N/A") - 'Unemployed' - """ - - if not company_entry: - return company_entry - - company_edited = company_entry.lower() - - if company_edited == "n/a": - return "Unemployed" - - company_edited = re.sub(r"[^\w\s]", "", company_edited) - - if ( - company_edited == "retired" - or company_edited == "retiree" - or company_edited == "retire" - or "retiree" in company_edited - ): - return "Retired" - - elif ( - "self employe" in company_edited - or "freelance" in company_edited - or company_edited == "self" - or company_edited == "independent contractor" - ): - return "Self Employed" - elif ( - "unemploye" in company_edited - or company_edited == "none" - or company_edited == "not employed" - or company_edited == "nan" - ): - return "Unemployed" - - else: - return company_edited From d94243af71ebbcf97ef7ba50d1cc06f5e15a5ce4 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 28 Feb 2024 16:14:33 +0000 Subject: [PATCH 158/214] attempting to pass dev checks --- utils/linkage.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index cae5024d..a6fcbdab 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -340,9 +340,7 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: names[i] = determine_comma_role(names[i]) names[i] = names[i].replace(".", "").split(" ") - names[i] = [ - name_part for name_part in names[i] if name_part not in titles - ] + names[i] = [name_part for name_part in names[i] if name_part not in titles] names[i] = " ".join(names[i]) # one last check to remove any pieces that might add extra whitespace @@ -431,9 +429,7 @@ def name_rank(first_name: str, last_name: str) -> list: if first_name_result and isinstance(first_name_result, dict): first_name_data = first_name_result.get("first_name") if first_name_data and "rank" in first_name_data: - first_name_rank = first_name_data["rank"].get( - "United States", 0 - ) + first_name_rank = first_name_data["rank"].get("United States", 0) else: first_name_rank = None if isinstance(last_name, str): From 4336d3b752e7e558cafc87ef2af273f5cb014997 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 28 Feb 2024 10:16:27 -0600 Subject: [PATCH 159/214] modified readme --- utils/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/utils/README.md b/utils/README.md index 3b9172ad..ee0cd84d 100644 --- a/utils/README.md +++ b/utils/README.md @@ -70,4 +70,12 @@ Util functions for MN EDA classify the donor entities in the expenditures. 3. The Contributors datasets have 4 kinds of recipient entities: lobbyists, candidates, committees, and nan. In order to fit the entries within the - schema, I code nan entries as 'Organization' \ No newline at end of file + schema, I code nan entries as 'Organization' + +#### classify.py +1. These functions take in the deduplicated and cleaned individuals and organizations +dataframes from the deduplication and linkage pipeline. +2. We classify based on substrings known to indicate clean energy or fossil fuels groups. +In particular, individuals are classified based on their employment by fossil fuels companies, +and organizations are classified by their names, prioritizing high profile corporations/PACs +and those which were found by a manual search of the largest donors/recipients in the dataset \ No newline at end of file From df41e42d4134a50305f139ca0e7b53d181f31810 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 28 Feb 2024 16:21:24 +0000 Subject: [PATCH 160/214] reformatting files --- utils/linkage.py | 8 ++++++-- utils/linkage_pipeline.py | 12 ++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index a6fcbdab..cae5024d 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -340,7 +340,9 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: names[i] = determine_comma_role(names[i]) names[i] = names[i].replace(".", "").split(" ") - names[i] = [name_part for name_part in names[i] if name_part not in titles] + names[i] = [ + name_part for name_part in names[i] if name_part not in titles + ] names[i] = " ".join(names[i]) # one last check to remove any pieces that might add extra whitespace @@ -429,7 +431,9 @@ def name_rank(first_name: str, last_name: str) -> list: if first_name_result and isinstance(first_name_result, dict): first_name_data = first_name_result.get("first_name") if first_name_data and "rank" in first_name_data: - first_name_rank = first_name_data["rank"].get("United States", 0) + first_name_rank = first_name_data["rank"].get( + "United States", 0 + ) else: first_name_rank = None if isinstance(last_name, str): diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index 1f565446..779469b5 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -65,12 +65,20 @@ def preprocess_individuals(individuals: pd.DataFrame) -> pd.DataFrame: individuals["full_name"].notnull() ] if individuals["first_name"].isnull().any(): - name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) + name = ( + individuals["full_name"] + .apply(HumanName) + .apply(lambda x: x.as_dict()) + ) first_name = name.apply(lambda x: x["first"]) individuals["first_name"] = first_name if individuals["last_name"].isnull().any(): - name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) + name = ( + individuals["full_name"] + .apply(HumanName) + .apply(lambda x: x.as_dict()) + ) last_name = name.apply(lambda x: x["last"]) individuals["last_name"] = last_name From c687295eee978d6488157235590dc0ea116542ad Mon Sep 17 00:00:00 2001 From: Avery Date: Wed, 28 Feb 2024 10:26:47 -0600 Subject: [PATCH 161/214] add usage instructions --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 498c0999..879a41e0 100644 --- a/README.md +++ b/README.md @@ -34,15 +34,20 @@ If you prefer to develop inside a container with VS Code then do the following s 3. Click the blue or green rectangle in the bottom left of VS code (should say something like `><` or `>< WSL`). Options should appear in the top center of your screen. Select `Reopen in Container`. -### Project Pipeline +### Data Collection and Standardization Pipeline 1. Collect the data through **one** of the steps below a. Collect state's finance campaign data either from web scraping (AZ, MI, PA) or direct download (MN) OR b. Go to the [Project's Google Drive]('https://drive.google.com/drive/u/2/folders/1HUbOU0KRZy85mep2SHMU48qUQ1ZOSNce') to download each state's data to their local repo following this format: repo_root / "data" / "raw" / state acronym / "file" 2. Open in development container which installs all necessary packages. 3. Run the project by running ```python utils/pipeline.py``` or ```python3 utils/pipeline.py``` run the processing pipeline that cleans, standardizes, and creates the individuals, organizations, and transactions concatenated into one comprehensive database. -5. running ```pipeline.py``` returns the tables to the output folder as csv files containing the complete individuals, organizations, and transactions DataFrames combining the AZ, MI, MN, and PA datasets. +5. Running ```pipeline.py``` returns the tables to the output folder as csv files containing the complete individuals, organizations, and transactions DataFrames combining the AZ, MI, MN, and PA datasets. 6. For future reference, the above pipeline also stores the information mapping given id to our database id (generated via uuid) in a csv file in the format of (state)IDMap.csv (example: ArizonaIDMap.csv) in the output folder +### Record Linkage and Network Pipeline +1. Save the standardized tables "complete_individuals_table.csv", "complete_organizations_table.csv", and "complete_transactions_table.csv" (collected from the above pipeline or data from the project's Google Drive) in the following format: repo_root / "output" / "file" +2. **UPDATE:** Run the pipeline by calling ```make run-linkage-pipeline```. This pipeline will perform conservative record linkage, attempt to classify entities as neutral, fossil fuels, or clean energy, and an interactive network visual +3. The pipeline will output the deduplicated tables saved as "cleaned_individuals_table.csv", "cleaned_organizations_table.csv", and "cleaned_transactions_table.csv". A mapping file, "deduplicated_UUIDs" tracks the UUIDs designated as duplicates. + ## Repository Structure ### utils From f363bbebdfa2a4948d6a273ceda0fef017fedb99 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Wed, 28 Feb 2024 13:25:52 -0600 Subject: [PATCH 162/214] splink changes + deleted notebook --- notebooks/splink.ipynb | 659 ----------------------------------------- utils/linkage.py | 24 +- 2 files changed, 7 insertions(+), 676 deletions(-) delete mode 100644 notebooks/splink.ipynb diff --git a/notebooks/splink.ipynb b/notebooks/splink.ipynb deleted file mode 100644 index c37813d0..00000000 --- a/notebooks/splink.ipynb +++ /dev/null @@ -1,659 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "1a863d3e-59b4-46c3-ad0f-7d192a61ebe2", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/naynapashilkar/opt/anaconda3/lib/python3.9/site-packages/pandas/core/computation/expressions.py:21: UserWarning: Pandas requires version '2.8.4' or newer of 'numexpr' (version '2.7.3' currently installed).\n", - " from pandas.core.computation.check import NUMEXPR_INSTALLED\n", - "/Users/naynapashilkar/opt/anaconda3/lib/python3.9/site-packages/pandas/core/arrays/masked.py:60: UserWarning: Pandas requires version '1.3.6' or newer of 'bottleneck' (version '1.3.2' currently installed).\n", - " from pandas.core import (\n", - "/var/folders/nk/h__9839s2k1_48m_z2g76vn40000gn/T/ipykernel_4396/3624639948.py:16: DtypeWarning: Columns (8,9,10,11,12) have mixed types. Specify dtype option on import or set low_memory=False.\n", - " df_i = pd.read_csv('complete_individuals_table.csv')\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "\n", - "# Define sample data\n", - "# i_data = {\n", - "# 'unique_id': range(1, 13),\n", - "# 'first_name': ['John', 'Jane', 'David', 'Emily', 'Michael', 'Sarah', 'John', 'Jane', 'David', 'Emily', 'John', 'John'],\n", - "# 'last_name': ['Doe', 'Smith', 'Johnson', 'Brown', 'Davis', 'Miller', 'Doe', 'Smith', 'Johnson', 'Brown', 'Miller', 'Jones'],\n", - "# 'full_name': ['John Doe', 'Jane Smith', 'David Johnson', 'Emily Brown', 'Michael Davis', 'Sarah Miller', 'John Doe', 'Jane Smith', 'David Johnson', 'Emily Brown', 'John Miller', 'John Jones'],\n", - "# 'entity_type': ['Person'] * 12,\n", - "# 'state': ['CA', 'NY', 'TX', 'FL', 'CA', 'NY', 'CA', 'TX', 'FL', 'NY', 'CA', 'FL'],\n", - "# 'party': ['Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent', 'Democrat', 'Republican', 'Independent'],\n", - "# 'company': ['Apple', 'Google', 'Microsoft', 'Amazon', 'Facebook', 'Apple', 'Google', 'Microsoft', 'Amazon', 'Facebook', 'Google', 'Microsoft']\n", - "# }\n", - "\n", - "# Create DataFrame\n", - "df_i = pd.read_csv('complete_individuals_table.csv')\n", - "df_i.rename(columns={'id': 'unique_id'}, inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "61447af5-7270-4438-baf7-29ba08203019", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Unnamed: 0unique_idfirst_namelast_namefull_nameentity_typestatepartycompanyoccupationaddresszipcity
00efa41f9a-a31c-4154-acfa-3707d2c7cc47FREDERICKBERGFREDERICK BERG ...IndividualMINaNBUTZEL LONGATTORNEY1033 YORKSHIRE48230-0000GROSSE POINTE PARK
113e7661e4-1557-4fc8-9cd7-e4381eaed2d8JENNIFERCONSIGLIOJENNIFER CONSIGLIO ...IndividualMINaNBUTZEL LONGATTORNEY7520 SHUMAN DRIVE48438-0000GOODRICH
22a3bbe060-5da0-4b1d-a61c-0a32ec18c2edVANESSACROCETTOVANESSA CROCETTO ...IndividualMINaNBUTZEL LONGCHIEF MARKETING OFFICER4104 ARLINGTON DRIVE48073-0000ROYAL OAK
33667ae9be-5aff-4ce2-a032-5947032c1a9aCAREY A.DEWITTCAREY A. DEWITT ...IndividualMINaNBUTZEL LONGATTORNEY770 HUPP CROSS ROAD48301-0000BLOOMFIELD TWP
44f02b191a-235a-4d79-9e00-3fd63a249e66JENNIFERDUKARSKIJENNIFER DUKARSKI ...IndividualMINaNNaNNaN11855 BECK ROAD48170-0000PLYMOUTH
..........................................
2486933248693367a8b2e6-3ff2-4d9d-a049-545202df393eGRETCHENWHITMERGRETCHEN WHITMERCandidateMINaNNaNNaNNaNNaNNaN
2486934248693467a8b2e6-3ff2-4d9d-a049-545202df393eGRETCHENWHITMERGRETCHEN WHITMERCandidateMINaNNaNNaNNaNNaNNaN
2486935248693567a8b2e6-3ff2-4d9d-a049-545202df393eGRETCHENWHITMERGRETCHEN WHITMERCandidateMINaNNaNNaNNaNNaNNaN
2486936248693667a8b2e6-3ff2-4d9d-a049-545202df393eGRETCHENWHITMERGRETCHEN WHITMERCandidateMINaNNaNNaNNaNNaNNaN
2486937248693767a8b2e6-3ff2-4d9d-a049-545202df393eGRETCHENWHITMERGRETCHEN WHITMERCandidateMINaNNaNNaNNaNNaNNaN
\n", - "

2486938 rows × 13 columns

\n", - "
" - ], - "text/plain": [ - " Unnamed: 0 unique_id \\\n", - "0 0 efa41f9a-a31c-4154-acfa-3707d2c7cc47 \n", - "1 1 3e7661e4-1557-4fc8-9cd7-e4381eaed2d8 \n", - "2 2 a3bbe060-5da0-4b1d-a61c-0a32ec18c2ed \n", - "3 3 667ae9be-5aff-4ce2-a032-5947032c1a9a \n", - "4 4 f02b191a-235a-4d79-9e00-3fd63a249e66 \n", - "... ... ... \n", - "2486933 2486933 67a8b2e6-3ff2-4d9d-a049-545202df393e \n", - "2486934 2486934 67a8b2e6-3ff2-4d9d-a049-545202df393e \n", - "2486935 2486935 67a8b2e6-3ff2-4d9d-a049-545202df393e \n", - "2486936 2486936 67a8b2e6-3ff2-4d9d-a049-545202df393e \n", - "2486937 2486937 67a8b2e6-3ff2-4d9d-a049-545202df393e \n", - "\n", - " first_name last_name \\\n", - "0 FREDERICK BERG \n", - "1 JENNIFER CONSIGLIO \n", - "2 VANESSA CROCETTO \n", - "3 CAREY A. DEWITT \n", - "4 JENNIFER DUKARSKI \n", - "... ... ... \n", - "2486933 GRETCHEN WHITMER \n", - "2486934 GRETCHEN WHITMER \n", - "2486935 GRETCHEN WHITMER \n", - "2486936 GRETCHEN WHITMER \n", - "2486937 GRETCHEN WHITMER \n", - "\n", - " full_name entity_type state \\\n", - "0 FREDERICK BERG ... Individual MI \n", - "1 JENNIFER CONSIGLIO ... Individual MI \n", - "2 VANESSA CROCETTO ... Individual MI \n", - "3 CAREY A. DEWITT ... Individual MI \n", - "4 JENNIFER DUKARSKI ... Individual MI \n", - "... ... ... ... \n", - "2486933 GRETCHEN WHITMER Candidate MI \n", - "2486934 GRETCHEN WHITMER Candidate MI \n", - "2486935 GRETCHEN WHITMER Candidate MI \n", - "2486936 GRETCHEN WHITMER Candidate MI \n", - "2486937 GRETCHEN WHITMER Candidate MI \n", - "\n", - " party company occupation address \\\n", - "0 NaN BUTZEL LONG ATTORNEY 1033 YORKSHIRE \n", - "1 NaN BUTZEL LONG ATTORNEY 7520 SHUMAN DRIVE \n", - "2 NaN BUTZEL LONG CHIEF MARKETING OFFICER 4104 ARLINGTON DRIVE \n", - "3 NaN BUTZEL LONG ATTORNEY 770 HUPP CROSS ROAD \n", - "4 NaN NaN NaN 11855 BECK ROAD \n", - "... ... ... ... ... \n", - "2486933 NaN NaN NaN NaN \n", - "2486934 NaN NaN NaN NaN \n", - "2486935 NaN NaN NaN NaN \n", - "2486936 NaN NaN NaN NaN \n", - "2486937 NaN NaN NaN NaN \n", - "\n", - " zip city \n", - "0 48230-0000 GROSSE POINTE PARK \n", - "1 48438-0000 GOODRICH \n", - "2 48073-0000 ROYAL OAK \n", - "3 48301-0000 BLOOMFIELD TWP \n", - "4 48170-0000 PLYMOUTH \n", - "... ... ... \n", - "2486933 NaN NaN \n", - "2486934 NaN NaN \n", - "2486935 NaN NaN \n", - "2486936 NaN NaN \n", - "2486937 NaN NaN \n", - "\n", - "[2486938 rows x 13 columns]" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_i" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "25334eac-e048-47e7-b911-571853e2a666", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "RendererRegistry.enable('html')" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from splink.duckdb.linker import DuckDBLinker\n", - "import altair as alt\n", - "alt.renderers.enable('html')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "a5915f73-77a6-42c9-a7df-a8f0d396836c", - "metadata": {}, - "outputs": [], - "source": [ - "import splink.duckdb.comparison_template_library as ctl\n", - "import splink.duckdb.comparison_library as cl\n", - "\n", - "individual_settings = {\n", - " \"link_type\": \"dedupe_only\",\n", - " \"blocking_rules_to_generate_predictions\": [\n", - " \"l.full_name - r.full_name\",\n", - " \"l.first_name = r.first_name and l.last_name = r.last_name\"\n", - " ],\n", - " # \"comparisons\": [\n", - " # ctl.name_comparison(\"first_name\"), #built in comparison function\n", - " # ctl.name_comparison(\"last_name\"),\n", - " # ctl.name_comparison(\"full_name\"),\n", - " # ctl.forename_surname_comparison(\"first_name\", \"last_name\"), #built in comparison function\n", - " # cl.exact_match(\"entity_type\", term_frequency_adjustments=True),\n", - " # cl.jaro_winkler_at_thresholds(\"state\", [0.9, 0.8]), #threshold will catch typos and shortenings\n", - " # cl.jaro_winkler_at_thresholds(\"party\", [0.9, 0.8]),\n", - " # cl.jaro_winkler_at_thresholds(\"company\", [0.9, 0.8]),\n", - " # ],\n", - " \n", - " #DEFAULT\n", - " \"retain_matching_columns\": True,\n", - " \"retain_intermediate_calculation_columns\": True,\n", - " # \"max_iterations\": 10,\n", - " # \"em_convergence\": 0.01\n", - "}\n", - "\n", - "i_blocking = [\n", - " \"l.first_name = r.first_name and l.last_name = r.last_name\",\n", - " ]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "42ce12f9-1160-4e1e-848a-deb7882566a6", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "3e162fc03ab041429b0c2b4143081ee6", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "linker = DuckDBLinker(df_i, individual_settings)\n", - "linker.count_num_comparisons_from_blocking_rule(\"l.first_name = r.first_name and l.last_name = r.last_name\")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "217a07cf-eaa3-42a2-b43b-b2eecd740a7b", - "metadata": {}, - "outputs": [], - "source": [ - "def splink_dedupe(df, settings, blocking):\n", - " linker = DuckDBLinker(df, settings)\n", - " linker.estimate_probability_two_random_records_match(blocking, recall=0.6) #default\n", - " linker.estimate_u_using_random_sampling(max_pairs=5e6)\n", - " \n", - " for i in blocking:\n", - " training_session_names = linker.estimate_parameters_using_expectation_maximisation(i)\n", - " \n", - " df_predict = linker.predict()\n", - " df_e = df_predict.as_pandas_dataframe()\n", - " clusters = linker.cluster_pairwise_predictions_at_threshold(df_predict, threshold_match_probability=0.7) #default\n", - " return clusters.as_pandas_dataframe()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "307ae7b8-b637-4451-aad3-9c848e8dff65", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b530b6b922494872b2721019d974f23e", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: Deterministic matching rules led to no observed matches! This means that no possible record pairs are matches, and no records are linked to one another.\n", - "If this is truly the case then you do not need to run the linkage model.\n", - "However this is usually in error; expected rules to have recall of 60%. Consider revising rules as they may have an error.\n", - "Probability two random records match is estimated to be 0.\n", - "This means that amongst all possible pairwise record comparisons, one in Infinity are expected to match. With 3,092,429,064,453 total possible comparisons, we expect a total of around 0.00 matching pairs\n", - "----- Estimating u probabilities using random sampling -----\n", - "\n", - "Estimated u probabilities using random sampling\n", - "\n", - "Your model is fully trained. All comparisons have at least one estimate for their m and u values\n", - "\n", - "----- Starting EM training session -----\n", - "\n", - "Estimating the m probabilities of the model by blocking on:\n", - "l.first_name = r.first_name and l.last_name = r.last_name\n", - "\n", - "Parameter estimates will be made for the following comparison(s):\n", - "\n", - "Parameter estimates cannot be made for the following comparison(s) since they are used in the blocking rules: \n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "31a41cbc2cde42819b137edfbd189831", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "ename": "EMTrainingException", - "evalue": "Training rule `l.first_name = r.first_name and l.last_name = r.last_name` resulted in no record pairs. This means that in the supplied data set there were no pairs of records for which `l.first_name = r.first_name and l.last_name = r.last_name` was `true`.\nExpectation maximisation requires a substantial number of record comparisons to produce accurate parameter estimates - usually at least a few hundred, but preferably at least a few thousand.\nYou must revise your training blocking rule so that the set of generated comparisons is not empty. You can use `linker.count_num_comparisons_from_blocking_rule()` to compute the number of comparisons that will be generated by a blocking rule.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mEMTrainingException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/var/folders/nk/h__9839s2k1_48m_z2g76vn40000gn/T/ipykernel_4396/657554030.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msplink_dedupe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_i\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindividual_settings\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi_blocking\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m/var/folders/nk/h__9839s2k1_48m_z2g76vn40000gn/T/ipykernel_4396/2410222890.py\u001b[0m in \u001b[0;36msplink_dedupe\u001b[0;34m(df, settings, blocking)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mblocking\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mtraining_session_names\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlinker\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mestimate_parameters_using_expectation_maximisation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mdf_predict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlinker\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/splink/linker.py\u001b[0m in \u001b[0;36mestimate_parameters_using_expectation_maximisation\u001b[0;34m(self, blocking_rule, comparisons_to_deactivate, comparison_levels_to_reverse_blocking_rule, estimate_without_term_frequencies, fix_probability_two_random_records_match, fix_m_probabilities, fix_u_probabilities, populate_probability_two_random_records_match_from_trained_values)\u001b[0m\n\u001b[1;32m 1704\u001b[0m )\n\u001b[1;32m 1705\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1706\u001b[0;31m \u001b[0mem_training_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_train\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1707\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1708\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_populate_m_u_from_trained_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/splink/em_training_session.py\u001b[0m in \u001b[0;36m_train\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mcvv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_record_dict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlimit\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0mbr_sql\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34mf\"`{self._blocking_rule_for_training.blocking_rule_sql}`\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 181\u001b[0;31m raise EMTrainingException(\n\u001b[0m\u001b[1;32m 182\u001b[0m \u001b[0;34mf\"Training rule {br_sql} resulted in no record pairs. \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 183\u001b[0m \u001b[0;34m\"This means that in the supplied data set \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mEMTrainingException\u001b[0m: Training rule `l.first_name = r.first_name and l.last_name = r.last_name` resulted in no record pairs. This means that in the supplied data set there were no pairs of records for which `l.first_name = r.first_name and l.last_name = r.last_name` was `true`.\nExpectation maximisation requires a substantial number of record comparisons to produce accurate parameter estimates - usually at least a few hundred, but preferably at least a few thousand.\nYou must revise your training blocking rule so that the set of generated comparisons is not empty. You can use `linker.count_num_comparisons_from_blocking_rule()` to compute the number of comparisons that will be generated by a blocking rule." - ] - } - ], - "source": [ - "splink_dedupe(df_i, individual_settings, i_blocking)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "890ba4ed-8e55-4128-bd36-cd8413cad00e", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "28948465-fea2-433d-bace-d0627dfe348d", - "metadata": {}, - "outputs": [], - "source": [ - "#--------------------------------------------" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ef568813-181b-42a7-b3a2-786fe87addfb", - "metadata": {}, - "outputs": [], - "source": [ - "organizations_settings = {\n", - " \"link_type\": \"dedupe_only\",\n", - " \"blocking_rules_to_generate_predictions\": [\n", - " \"l.name = r.name\",\n", - " ],\n", - " \"comparisons\": [\n", - " ctl.name_comparison(\"name\", term_frequency_adjustments=True),\n", - " cl.exact_match(\"entity_type\", term_frequency_adjustments=True),\n", - " cl.jaro_winkler_at_thresholds(\"state\", [0.9, 0.8]), #threshold will catch typos and shortenings\n", - " # Add more comparisons as needed\n", - " ],\n", - " \"retain_matching_columns\": True,\n", - " \"retain_intermediate_calculation_columns\": True,\n", - " \"max_iterations\": 10,\n", - " \"em_convergence\": 0.01\n", - "}\n", - "\n", - "o_blocking = [\n", - " \"l.name = r.name\",\n", - " \"l.name = r.name and l.state = r.state\",\n", - " ]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9354ec53-0aa3-40b7-968a-d6b5263182c9", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# Define sample data\n", - "o_data = {\n", - " 'unique_id': range(1, 13),\n", - " 'name': ['Apple Inc.', 'Google LLC', 'Microsoft Corporation', 'Amazon.com Inc.', 'Facebook Inc.', \n", - " 'Apple Inc.', 'Google LLC', 'Microsoft Corporation', 'Amazon.com Inc.', 'Facebook Inc.', \n", - " 'Google LLC', 'Microsoft Corporation'],\n", - " 'entity_type': ['Organization'] * 12,\n", - " 'state': ['CA', 'NY', 'WA', 'WA', 'CA', 'CA', 'NY', 'WA', 'WA', 'CA', 'NY', 'WA'],\n", - "}\n", - "\n", - "# Create DataFrame\n", - "df_o = pd.DataFrame(o_data)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6a1c1785-17b6-4aa2-9a10-b431c70e411d", - "metadata": {}, - "outputs": [], - "source": [ - "splink_dedupe(df_o, organizations_settings, o_blocking)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ac3665d0-984c-4367-a7eb-62cd980dff16", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bffdeb09-0788-449d-9046-351d4a258537", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.7" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/utils/linkage.py b/utils/linkage.py index 0a575a1d..ca0c8b23 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -673,16 +673,12 @@ def splink_dedupe( clusters = linker.cluster_pairwise_predictions_at_threshold( df_predict, threshold_match_probability=0.7 ) # default - clusters_df = ( - clusters.as_pandas_dataframe() - ) # dataframe where cluster_id maps unique_id to initial instance of row + clusters_df = clusters.as_pandas_dataframe() match_list_df = ( clusters_df.groupby("cluster_id")["unique_id"].agg(list).reset_index() - ) - match_list_df.rename( - columns={"unique_id": "matching_list"}, inplace=True - ) # dataframe which matches cluster_id to a list of unique_ids + ) # dataframe where cluster_id maps unique_id to initial instance of row + match_list_df.rename(columns={"unique_id": "duplicated"}, inplace=True) first_instance_df = clusters_df.drop_duplicates(subset="cluster_id") col_names = np.append("cluster_id", df.columns) @@ -694,16 +690,10 @@ def splink_dedupe( on="cluster_id", how="left", ) + deduped_df.rename(columns={"cluster_id": "unique_id"}, inplace=True) - match_list_df.rename( - columns={"unique_id": "mapped_uuids", "cluster_id": "original_ids"}, - inplace=True, - ) - deduped_df.to_csv( - repo_root / "output" / "splink_deduplicated_UUIDs.csv", - index=False, - mode="a", - header=not os.path.exists("../output/splink_deduplicated_UUIDs.csv"), - ) + convert_duplicates_to_dict(deduped_df) + + deduped_df.drop(columns=["duplicated"]) return deduped_df From 19013415c1eb16c42ba3f355343a6eb6df72f7ea Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Wed, 28 Feb 2024 20:15:29 -0600 Subject: [PATCH 163/214] moved to original makefile --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index e210fb2c..36577581 100644 --- a/Makefile +++ b/Makefile @@ -29,3 +29,9 @@ run-notebooks: jupyter lab --port=8888 --ip='*' --NotebookApp.token='' --NotebookApp.password='' \ --no-browser --allow-root + +#running the linkage pipeline and creating the network graph +#still waiting on linkage_pipeline completion to get this into final shape + +output network_graph: all_individuals.csv all_organizations.csv all_transactions.csv + python linkage_pipeline.py \ No newline at end of file From a7db7d81f6eb8c0d68cc13c7c2f2aae32b1cba03 Mon Sep 17 00:00:00 2001 From: Avery Schoen <33437601+averyschoen@users.noreply.github.com> Date: Thu, 29 Feb 2024 08:11:52 -0600 Subject: [PATCH 164/214] Delete utils/Makefile --- utils/Makefile | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 utils/Makefile diff --git a/utils/Makefile b/utils/Makefile deleted file mode 100644 index f0cda2ea..00000000 --- a/utils/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -all: all_individuals.csv, all_organizations.csv, all_transactions.csv - -#set this up as a pipeline, check how far along Adil is on this -output deduplicated_individuals: all_individuals.csv - python deduplication_pipeline - -#likewise here -output deduplicated_organizations: all_organizations.csv - python deduplication_pipeline - - -output classified_individuals: all_individuals.csv - python classify.py classify_individuals - -output classified_organizations: all_organizations.csv - python classify.py classify_orgs - -#just sketched out -output network_graph: all_individuals.csv all_organizations.csv all_transactions.csv - python network_graph_pipeline \ No newline at end of file From b626fc818e018a7d03031ac652389282bf561c9d Mon Sep 17 00:00:00 2001 From: Avery Schoen <33437601+averyschoen@users.noreply.github.com> Date: Thu, 29 Feb 2024 08:17:02 -0600 Subject: [PATCH 165/214] Update linkage.py --- utils/linkage.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index ca0c8b23..48e24b2d 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -641,8 +641,7 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: def splink_dedupe( df: pd.DataFrame, settings: dict, blocking: list ) -> pd.DataFrame: - """Given a dataframes, the corresponding - configuration settings, and corresponding blocking rules return a + """Given a dataframe and config settings, return a deduplicated dataframe Configuration settings and blocking can be found in constants.py as From 1fc2a2a8379a45f598ed422bebeca0b01393318f Mon Sep 17 00:00:00 2001 From: npashilkar Date: Thu, 29 Feb 2024 08:32:18 -0600 Subject: [PATCH 166/214] splink output edits --- utils/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/constants.py b/utils/constants.py index a67450b3..b4be2565 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -726,4 +726,4 @@ "beyond carbon", "lcv victory", "league of conservation", -] \ No newline at end of file +] From 26d47736e65212150aff8e619d73f3723b859bdc Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Thu, 29 Feb 2024 15:01:36 +0000 Subject: [PATCH 167/214] classify function --- utils/linkage_pipeline.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index f13b4235..e9fcf06c 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -1,6 +1,5 @@ import pandas as pd - -# from classify import classify_wrapper +from classify import classify_wrapper from nameparser import HumanName from utils.constants import BASE_FILEPATH @@ -172,6 +171,8 @@ def main(): ["donor_id", "recipient_id"] ].replace(deduped) + individuals, organizations = classify_wrapper(individuals, organizations) + individuals.to_csv(cleaned_individuals_output_path, index=False) organizations.to_csv(cleaned_organizations_output_path, index=False) transactions.to_csv(cleaned_transactions_output_path, index=False) From 609220d143cc710ad9404ee6e54fda16464e72eb Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Sun, 3 Mar 2024 16:26:17 -0600 Subject: [PATCH 168/214] saving work for graph work. No need to review yet --- utils/network.py | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/utils/network.py b/utils/network.py index 6e9dcd90..8a076efa 100644 --- a/utils/network.py +++ b/utils/network.py @@ -50,14 +50,11 @@ def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: "office_sought", "purpose", "transaction_type", - "recipient_id", + "year", "transaction_id", - "recipient_type", "donor_office", - "recipient_name", "amount", ] - for _, row in df.iterrows(): # add node attributes based on the columns relevant to the entity G.add_node(row[node_name]) @@ -67,10 +64,28 @@ def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: # link the donor node to the recipient node. add the attributes of the # edge based on relevant nodes + edge_dictionary = {} for column in transact_info: if not pd.isnull(row[column]): - G.add_edge( - row[node_name], row["recipient_name"], column=row[column] - ) + edge_dictionary[column] = row[column] + G.add_edge(row[node_name], row["recipient_name"], **edge_dictionary) + + # the added 'recipient_name' node has no attributes at this moment + # for the final code this line won't be necessary, as each recipient + # should ideally be referenced later on. For now, all added nodes for + # the recipient will only have one default attribute: classification + G.nodes[row["recipient_name"]]["classification"] = "neutral" + + edge_labels = {(u, v): d["amount"] for u, v, d in G.edges(data=True)} + entity_colors = {"neutral": "green", "c": "blue", "f": "red"} + node_colors = [ + entity_colors[G.nodes[node]["classification"]] for node in G.nodes() + ] + + nx.draw_planar(G, with_labels=False, node_color=node_colors) + nx.draw_networkx_edge_labels( + G, pos=nx.spring_layout(G), edge_labels=edge_labels, label_pos=0.5 + ) + # nx.draw_planar(G, with_labels=False) return G From 3266ce7e965a09e816c875e2e79be1d4f062f2df Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 4 Mar 2024 02:04:09 +0000 Subject: [PATCH 169/214] slight changes --- utils/linkage_pipeline.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index e9fcf06c..5f251f3b 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -68,20 +68,12 @@ def preprocess_individuals(individuals: pd.DataFrame) -> pd.DataFrame: individuals["full_name"].notnull() ] if individuals["first_name"].isnull().any(): - name = ( - individuals["full_name"] - .apply(HumanName) - .apply(lambda x: x.as_dict()) - ) + name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) first_name = name.apply(lambda x: x["first"]) individuals["first_name"] = first_name if individuals["last_name"].isnull().any(): - name = ( - individuals["full_name"] - .apply(HumanName) - .apply(lambda x: x.as_dict()) - ) + name = individuals["full_name"].apply(HumanName).apply(lambda x: x.as_dict()) last_name = name.apply(lambda x: x["last"]) individuals["last_name"] = last_name @@ -167,12 +159,15 @@ def main(): deduped = pd.read_csv(BASE_FILEPATH / "output" / "deduplicated_UUIDs.csv") + # Classifies individuals and organizations with a new 'classification' + # column containing 'neutral', 'f', or 'c' + individuals, organizations = classify_wrapper(individuals, organizations) + + # Update the transactions table with the deduplicated UUIDs transactions[["donor_id", "recipient_id"]] = transactions[ ["donor_id", "recipient_id"] ].replace(deduped) - individuals, organizations = classify_wrapper(individuals, organizations) - individuals.to_csv(cleaned_individuals_output_path, index=False) organizations.to_csv(cleaned_organizations_output_path, index=False) transactions.to_csv(cleaned_transactions_output_path, index=False) From d262deeccc886c0103cc2c12866d83bb8b843370 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 4 Mar 2024 04:00:12 +0000 Subject: [PATCH 170/214] possible splink implementation fix --- utils/linkage_pipeline.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index 1b4db66e..9baa5204 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -171,9 +171,10 @@ def main(): deduped = pd.read_csv(BASE_FILEPATH / "output" / "deduplicated_UUIDs.csv") # Splink deduplication - individuals = splink_dedupe( - individuals, individuals_settings, individuals_blocking - ) + individuals["unique_id"] = individuals["id"] + organizations["unique_id"] = organizations["id"] + + individuals = splink_dedupe(individuals, individuals_settings, individuals_blocking) organizations = splink_dedupe( organizations, organizations_settings, organizations_blocking From 5a81b23c3e928b8d9b3aaf30a233e77af473d64f Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 4 Mar 2024 02:39:54 -0600 Subject: [PATCH 171/214] graph work so far with plotly --- utils/network.py | 92 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 30 deletions(-) diff --git a/utils/network.py b/utils/network.py index 8a076efa..88572aff 100644 --- a/utils/network.py +++ b/utils/network.py @@ -1,5 +1,6 @@ import networkx as nx import pandas as pd +import plotly.graph_objects as go def name_identifier(uuid: str, dfs: list[pd.DataFrame]) -> str: @@ -28,7 +29,7 @@ def name_identifier(uuid: str, dfs: list[pd.DataFrame]) -> str: return None -def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: +def create_network_graph(df: pd.DataFrame) -> nx.MultiDiGraph: """Takes in a dataframe and generates a MultiDiGraph where the nodes are entity names, and the rest of the dataframe columns make the node attributes @@ -37,7 +38,7 @@ def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: complete_organizations_table) Returns: - A Networkx MultiDiGraph with nodes lacking any edges + A Networkx MultiDiGraph with nodes and edges """ G = nx.MultiDiGraph() # first check if df is individuals or organizations dataset @@ -46,7 +47,7 @@ def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: else: node_name = "full_name" - transact_info = [ + edge_columns = [ "office_sought", "purpose", "transaction_type", @@ -55,37 +56,68 @@ def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph: "donor_office", "amount", ] + for _, row in df.iterrows(): # add node attributes based on the columns relevant to the entity - G.add_node(row[node_name]) - for column in df.columns.difference(transact_info): - if not pd.isnull(row[column]): - G.nodes[row[node_name]][column] = row[column] - - # link the donor node to the recipient node. add the attributes of the - # edge based on relevant nodes - edge_dictionary = {} - for column in transact_info: - if not pd.isnull(row[column]): - edge_dictionary[column] = row[column] - G.add_edge(row[node_name], row["recipient_name"], **edge_dictionary) - - # the added 'recipient_name' node has no attributes at this moment - # for the final code this line won't be necessary, as each recipient - # should ideally be referenced later on. For now, all added nodes for - # the recipient will only have one default attribute: classification + G.add_node( + row[node_name], + **row[df.columns.difference(edge_columns)].dropna().to_dict(), + ) + # add the recipient as a node G.nodes[row["recipient_name"]]["classification"] = "neutral" - edge_labels = {(u, v): d["amount"] for u, v, d in G.edges(data=True)} - entity_colors = {"neutral": "green", "c": "blue", "f": "red"} - node_colors = [ - entity_colors[G.nodes[node]["classification"]] for node in G.nodes() - ] + # add the edge attributes between two nodes + edge_attributes = row[edge_columns].dropna().to_dict() + G.add_edge(row[node_name], row["recipient_name"], **edge_attributes) + + return G + - nx.draw_planar(G, with_labels=False, node_color=node_colors) - nx.draw_networkx_edge_labels( - G, pos=nx.spring_layout(G), edge_labels=edge_labels, label_pos=0.5 +def plot_network_graph(G: nx.MultiDiGraph): + """Given a networkX Graph, creates a plotly visualization of the nodes and + edges + + Args: + A networkX MultiDiGraph with edges including the attribute 'amount' + + Returns: None. Creates a plotly graph + """ + edge_trace = go.Scatter( + x=[], y=[], line=dict(color="#888"), hoverinfo="text", mode="lines" ) + hovertext = [] - # nx.draw_planar(G, with_labels=False) - return G + for edge in G.edges(data=True): + # donor = edge[0], recipient = edge[1] + hovertext.append(f"Amount: {edge[2]['amount']:.2f}") + + edge_trace["hovertext"] = hovertext + + node_trace = go.Scatter( + x=[], + y=[], + text=[], + mode="markers", + hoverinfo="text", + marker=dict(showscale=True, colorscale="YlGnBu", size=10), + ) + + for node in G.nodes(): + node_info = f"Name: {node}
" + for key, value in G.nodes[node].items(): + node_info += f"{key}: {value}
" + node_trace["text"] += tuple([node_info]) + + # Define layout settings + layout = go.Layout( + title="Network Graph Indicating Campaign Contributions from 2018-2022", + titlefont=dict(size=16), + showlegend=False, + hovermode="closest", + margin=dict(b=20, l=5, r=5, t=40), + xaxis=dict(showgrid=False, zeroline=False, showticklabels=False), + yaxis=dict(showgrid=False, zeroline=False, showticklabels=False), + ) + + fig = go.Figure(data=[edge_trace, node_trace], layout=layout) + fig.show() From b377acdceb702ca0bd252699e3febd14f3bbb163 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 4 Mar 2024 10:50:25 -0600 Subject: [PATCH 172/214] Test notebook with functions for merging datasets, no need to review, will delete later --- notebooks/Test.ipynb | 12403 +++++++++++++++++++++++++++++++++++------ 1 file changed, 10703 insertions(+), 1700 deletions(-) diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb index d188b444..b9ac1762 100644 --- a/notebooks/Test.ipynb +++ b/notebooks/Test.ipynb @@ -10,8 +10,8 @@ "import numpy as np\n", "import networkx as nx\n", "import matplotlib.pyplot as plt\n", - "\n", - "from utils.linkage import deduplicate_perfect_matches" + "import plotly.express as px\n", + "import plotly.graph_objects as go\n" ] }, { @@ -20,9 +20,9 @@ "metadata": {}, "outputs": [], "source": [ - "orgs_df = pd.read_csv(\"../output/complete_organizations_table.csv\",index_col=0)#,nrows=10000).sample(10)\n", - "inds_df = pd.read_csv(\"../output/complete_individuals_table.csv\",index_col=0, low_memory=False)#, nrows=10000).sample(10)\n", - "transactions = pd.read_csv(\"../output/complete_transactions_table.csv\",index_col=0, low_memory=False)" + "orgs_df = pd.read_csv(\"../data/classified_data/classified_organizations_v1\").sample(10000)\n", + "inds_df = pd.read_csv(\"../data/classified_data/classified_individuals_v1\", low_memory=False).sample(10000)\n", + "transactions = pd.read_csv(\"../data/classified_data/transactions_v1\", low_memory=False)" ] }, { @@ -55,31 +55,53 @@ " name\n", " state\n", " entity_type\n", + " classification\n", " \n", " \n", " \n", " \n", - " 0\n", - " 1022\n", - " #1022 arizona committee of automotive retailers\n", - " AZ\n", - " pac\n", + " 63128\n", + " 422065cd-0262-4ac9-a2a4-74136ddb99e2\n", + " floyd workman\n", + " MI\n", + " corporation\n", + " neutral\n", " \n", " \n", - " 4\n", - " 100112\n", - " 314 action victory fund (fec id c00689828)\n", - " DC\n", - " pac\n", + " 98258\n", + " dfd160b5-9389-44ef-a632-c08dc1a1d201\n", + " front 43\n", + " MI\n", + " corporation\n", + " neutral\n", + " \n", + " \n", + " 1712\n", + " 858415ce-d53f-4843-aee0-85560117bdc6\n", + " arizona federation of democratic women\n", + " NaN\n", + " vendor\n", + " neutral\n", " \n", " \n", "\n", "" ], "text/plain": [ - " id name state entity_type\n", - "0 1022 #1022 arizona committee of automotive retailers AZ pac\n", - "4 100112 314 action victory fund (fec id c00689828) DC pac" + " id \\\n", + "63128 422065cd-0262-4ac9-a2a4-74136ddb99e2 \n", + "98258 dfd160b5-9389-44ef-a632-c08dc1a1d201 \n", + "1712 858415ce-d53f-4843-aee0-85560117bdc6 \n", + "\n", + " name state entity_type \\\n", + "63128 floyd workman MI corporation \n", + "98258 front 43 MI corporation \n", + "1712 arizona federation of democratic women NaN vendor \n", + "\n", + " classification \n", + "63128 neutral \n", + "98258 neutral \n", + "1712 neutral " ] }, "execution_count": 3, @@ -88,13 +110,33 @@ } ], "source": [ - "orgs_df.head(2)" + "orgs_df.head(3)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['neutral'], dtype=object)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "orgs_df.classification.unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, "outputs": [ { "data": { @@ -117,74 +159,36 @@ " \n", " \n", " \n", - " transaction_id\n", - " donor_id\n", - " year\n", - " amount\n", - " recipient_id\n", - " office_sought\n", - " purpose\n", - " transaction_type\n", - " donor_type\n", - " recipient_type\n", - " donor_office\n", + " id\n", + " name\n", + " state\n", + " entity_type\n", + " classification\n", " \n", " \n", " \n", - " \n", - " 0\n", - " 4640650\n", - " 100592\n", - " 2021\n", - " 25.0\n", - " 1869727\n", - " none\n", - " wr 9.13\n", - " contribution from individuals\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " 1\n", - " 8185257\n", - " 201800301\n", - " 2020\n", - " 100.0\n", - " 1779679\n", - " none\n", - " ab\n", - " contribution from individuals\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", " \n", "\n", "" ], "text/plain": [ - " transaction_id donor_id year amount recipient_id office_sought purpose \\\n", - "0 4640650 100592 2021 25.0 1869727 none wr 9.13 \n", - "1 8185257 201800301 2020 100.0 1779679 none ab \n", - "\n", - " transaction_type donor_type recipient_type donor_office \n", - "0 contribution from individuals NaN NaN NaN \n", - "1 contribution from individuals NaN NaN NaN " + "Empty DataFrame\n", + "Columns: [id, name, state, entity_type, classification]\n", + "Index: []" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "transactions.head(2)" + "orgs_df.loc[orgs_df.classification == 'f']" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -208,47 +212,44 @@ " \n", " \n", " \n", - " id\n", - " first_name\n", - " last_name\n", - " full_name\n", - " entity_type\n", - " state\n", - " party\n", - " company\n", - " occupation\n", - " address\n", - " zip\n", - " city\n", + " transaction_id\n", + " donor_id\n", + " year\n", + " amount\n", + " recipient_id\n", + " office_sought\n", + " purpose\n", + " transaction_type\n", + " donor_type\n", + " recipient_type\n", + " donor_office\n", " \n", " \n", " \n", " \n", " 0\n", - " 1869727\n", - " NaN\n", - " NaN\n", - " william \bstoner\n", - " individual\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", + " 7773a71e-9f67-438e-8313-80b1b75deeb4\n", + " 4544b60d-da6b-4dd5-9efe-334152ccf1f1\n", + " 2018\n", + " 1000.0\n", + " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " none\n", + " bob worsley for state senate\n", + " contribute to a candidate committee\n", " NaN\n", " NaN\n", " NaN\n", " \n", " \n", " 1\n", - " 1779679\n", - " NaN\n", - " NaN\n", - " rm coulon\n", - " individual\n", - " NaN\n", - " NaN\n", - " area agency on aging\n", - " NaN\n", + " 95f74915-a945-491f-8751-8c970a76fc24\n", + " 946d7561-42a3-4a4b-b410-3a10271c9f18\n", + " 2018\n", + " 1000.0\n", + " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " none\n", + " drew john for state house\n", + " contribute to a candidate committee\n", " NaN\n", " NaN\n", " NaN\n", @@ -258,36 +259,64 @@ "" ], "text/plain": [ - " id first_name last_name full_name entity_type state party \\\n", - "0 1869727 NaN NaN william \bstoner individual NaN NaN \n", - "1 1779679 NaN NaN rm coulon individual NaN NaN \n", + " transaction_id donor_id \\\n", + "0 7773a71e-9f67-438e-8313-80b1b75deeb4 4544b60d-da6b-4dd5-9efe-334152ccf1f1 \n", + "1 95f74915-a945-491f-8751-8c970a76fc24 946d7561-42a3-4a4b-b410-3a10271c9f18 \n", "\n", - " company occupation address zip city \n", - "0 NaN NaN NaN NaN NaN \n", - "1 area agency on aging NaN NaN NaN NaN " + " year amount recipient_id office_sought \\\n", + "0 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", + "1 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", + "\n", + " purpose transaction_type \\\n", + "0 bob worsley for state senate contribute to a candidate committee \n", + "1 drew john for state house contribute to a candidate committee \n", + "\n", + " donor_type recipient_type donor_office \n", + "0 NaN NaN NaN \n", + "1 NaN NaN NaN " ] }, - "execution_count": 5, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "inds_df.head(2)" + "transactions.head(2)" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(541803, 541150, 77611, 77611)" + "array(['neutral', 'f'], dtype=object)" ] }, - "execution_count": 6, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inds_df.classification.unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(9926, 9919, 10000, 10000)" + ] + }, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -315,16 +344,40 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['100883', '100894']" + "['242d019c-e0ab-405e-8e77-abae7418b87f',\n", + " '8b2ad550-64a1-4975-8b77-5eb1f24a8871',\n", + " 'aee69307-194f-4c40-af3d-a55a34e1068e',\n", + " '55e5e946-6261-4f19-9752-fb58219b2e99',\n", + " '4faf251a-73d9-46ef-9e17-d3cf0a3052ae',\n", + " '3b5c0a9e-c6f2-44e9-ad05-fde071447564',\n", + " '3936bdf5-9a7a-462c-9e8c-9124f2bd7f57',\n", + " '13882059-3c74-4d9e-825d-a03a72b43b08',\n", + " '50c78f1a-3e9b-4996-a319-eef4fe01ccfb',\n", + " 'ae96f38f-68c8-47e3-95b3-c6f096d3c22e',\n", + " '74ba8a8a-7256-4eb3-b0f8-995f7a6319fb',\n", + " '12823a76-78e2-4b09-b606-859efaa5c8ef',\n", + " '9de9bf03-8c4a-4d2f-9a95-283b230ddfad',\n", + " '588593b9-9bba-4597-94d9-1b3a7fd5b402',\n", + " '5277b642-6bf0-4423-9350-3602ae51c6ac',\n", + " 'd98985b4-f55d-4ada-b279-0497e3176512',\n", + " 'c8586d36-f188-4684-aa99-193407d4d068',\n", + " '3798fda1-83cd-4e48-974a-e1a390060198',\n", + " 'a536b509-f052-4984-a35d-10397308daec',\n", + " '80996477-ce99-4f34-b5fc-bab4d676fc77',\n", + " 'cd1a740c-b1d7-4334-b335-925bd5708753',\n", + " '46af8908-f4e4-4041-9d1e-5b442d051921',\n", + " '2969075a-86d2-4b04-a991-a81832e096a0',\n", + " 'd0337f72-b701-4524-891b-c48ef6f771ec',\n", + " '591aa72b-511b-4dbb-a161-80458f257471']" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -339,135 +392,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idnamestateentity_typedonationsdonations_toreceiveddonations_from
050c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee4249REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...730COMMITTEE TO ELECT DR PATRICIA BERNARD
150c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee426MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC853Pabar Pac (Pa Bar Assn)
250c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee382REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...620MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC
362ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee2328MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC4505Paa Pac
462ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee3421Paa Pac672Paa Pac
\n", - "
" - ], - "text/plain": [ - " id \\\n", - "0 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", - "1 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", - "2 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", - "3 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", - "4 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", - "\n", - " name state entity_type \\\n", - "0 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", - "1 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", - "2 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", - "3 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee \n", - "4 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee \n", - "\n", - " donations donations_to received \\\n", - "0 4249 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... 730 \n", - "1 426 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC 853 \n", - "2 382 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... 620 \n", - "3 2328 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC 4505 \n", - "4 3421 Paa Pac 672 \n", - "\n", - " donations_from \n", - "0 COMMITTEE TO ELECT DR PATRICIA BERNARD \n", - "1 Pabar Pac (Pa Bar Assn) \n", - "2 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", - "3 Paa Pac \n", - "4 Paa Pac " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "data = {'id':['50c7d9a1-b448-46a5-8e2d-cd15b3097360','50c7d9a1-b448-46a5-8e2d-cd15b3097360','50c7d9a1-b448-46a5-8e2d-cd15b3097360',\n", " '62ea1e9c-ac12-400c-b3dc-519389c0f7d3','62ea1e9c-ac12-400c-b3dc-519389c0f7d3','62ea1e9c-ac12-400c-b3dc-519389c0f7d3',\n", @@ -555,7 +482,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -579,274 +506,180 @@ " \n", " \n", " \n", - " id\n", - " first_name\n", - " last_name\n", - " full_name\n", - " entity_type\n", - " state\n", - " party\n", - " company\n", - " occupation\n", - " address\n", - " zip\n", - " city\n", + " transaction_id\n", + " donor_id\n", + " year\n", + " amount\n", + " recipient_id\n", + " office_sought\n", + " purpose\n", + " transaction_type\n", + " donor_type\n", + " recipient_type\n", + " donor_office\n", + " recipient_name\n", " \n", " \n", " \n", " \n", - " 102\n", - " 100894\n", - " NaN\n", - " NaN\n", - " abdussamad, shams\n", - " candidate\n", - " AZ\n", - " democratic\n", - " none (is a candidate)\n", - " NaN\n", + " 0\n", + " 7773a71e-9f67-438e-8313-80b1b75deeb4\n", + " 4544b60d-da6b-4dd5-9efe-334152ccf1f1\n", + " 2018\n", + " 1000.0\n", + " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " none\n", + " bob worsley for state senate\n", + " contribute to a candidate committee\n", " NaN\n", " NaN\n", " NaN\n", + " #1022 arizona committee of automotive retailers\n", " \n", " \n", - " 103\n", - " 100894\n", - " NaN\n", - " NaN\n", - " abdussamad, shams\n", - " candidate\n", - " AZ\n", - " democratic\n", - " none (is a candidate)\n", - " NaN\n", + " 1\n", + " 95f74915-a945-491f-8751-8c970a76fc24\n", + " 946d7561-42a3-4a4b-b410-3a10271c9f18\n", + " 2018\n", + " 1000.0\n", + " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " none\n", + " drew john for state house\n", + " contribute to a candidate committee\n", " NaN\n", " NaN\n", " NaN\n", + " #1022 arizona committee of automotive retailers\n", " \n", " \n", - " 104\n", - " 100883\n", - " NaN\n", - " NaN\n", - " abeytia, anna lynn\n", - " candidate\n", - " AZ\n", - " democratic\n", - " none (is a candidate)\n", - " NaN\n", + " 2\n", + " d05f1763-132d-4717-addc-8ff6239ad4d9\n", + " c8f98436-9562-48ed-b51f-45b2b217aad1\n", + " 2018\n", + " 1000.0\n", + " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " none\n", + " elect karen fann ld1\n", + " contribute to a candidate committee\n", " NaN\n", " NaN\n", " NaN\n", + " #1022 arizona committee of automotive retailers\n", " \n", " \n", - " 105\n", - " 100883\n", - " NaN\n", - " NaN\n", - " abeytia, anna lynn\n", - " candidate\n", - " AZ\n", - " democratic\n", - " none (is a candidate)\n", - " NaN\n", + " 3\n", + " 3dc3da30-6562-4755-bfad-6a26f1baec15\n", + " b9965bc2-c94d-4f69-98d1-bc4f5ad701c5\n", + " 2018\n", + " 1000.0\n", + " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " none\n", + " elect noel campbell for house\n", + " contribute to a candidate committee\n", " NaN\n", " NaN\n", " NaN\n", + " #1022 arizona committee of automotive retailers\n", " \n", " \n", - " 0\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " FREDERICK\n", - " BERG\n", - " FREDERICK BERG ...\n", - " Individual\n", - " MI\n", - " NaN\n", - " BUTZEL LONG\n", - " ATTORNEY\n", - " 1033 YORKSHIRE\n", - " 48230-0000\n", - " GROSSE POINTE PARK\n", - " \n", - " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " \n", - " \n", - " 17734\n", - " 75b99f42-e0d4-4c3c-89a6-16e11f6dd810\n", - " NaN\n", - " NaN\n", - " Rodriguez, Adrian\n", - " Individual\n", - " MN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " 17735\n", - " 8b634b74-a6be-4280-a2c4-63e46a8f9bc9\n", - " NaN\n", - " NaN\n", - " O'Connor, Timothy J\n", - " Individual\n", - " MN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " 17736\n", - " d7d5b121-015f-474f-8b76-7c6c865da557\n", - " NaN\n", - " NaN\n", - " Frenzel, Robert C\n", - " Individual\n", - " MN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " 17737\n", - " b2eaaec4-30d5-46f4-9922-efc8d79c16d2\n", - " NaN\n", - " NaN\n", - " Enzminger, Peter\n", - " Individual\n", - " MN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " 17738\n", - " de34f2c7-fa2f-4fa5-abea-b67f6c8fe35f\n", - " NaN\n", - " NaN\n", - " Bowler, Erin\n", - " Individual\n", - " MN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", + " 4\n", + " a4340a2c-7b8a-4eeb-8290-746f0f436c83\n", + " 946d7561-42a3-4a4b-b410-3a10271c9f18\n", + " 2018\n", + " 1000.0\n", + " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " none\n", + " closed to new donations\n", + " refund from contrib to a cand committee\n", " NaN\n", + " NaN\n", + " NaN\n", + " #1022 arizona committee of automotive retailers\n", " \n", " \n", "\n", - "

1760156 rows × 12 columns

\n", "" ], "text/plain": [ - " id first_name \\\n", - "102 100894 NaN \n", - "103 100894 NaN \n", - "104 100883 NaN \n", - "105 100883 NaN \n", - "0 b8fbed14-0766-49ab-8516-97952c654a12 FREDERICK \n", - "... ... ... \n", - "17734 75b99f42-e0d4-4c3c-89a6-16e11f6dd810 NaN \n", - "17735 8b634b74-a6be-4280-a2c4-63e46a8f9bc9 NaN \n", - "17736 d7d5b121-015f-474f-8b76-7c6c865da557 NaN \n", - "17737 b2eaaec4-30d5-46f4-9922-efc8d79c16d2 NaN \n", - "17738 de34f2c7-fa2f-4fa5-abea-b67f6c8fe35f NaN \n", - "\n", - " last_name \\\n", - "102 NaN \n", - "103 NaN \n", - "104 NaN \n", - "105 NaN \n", - "0 BERG \n", - "... ... \n", - "17734 NaN \n", - "17735 NaN \n", - "17736 NaN \n", - "17737 NaN \n", - "17738 NaN \n", + " transaction_id donor_id \\\n", + "0 7773a71e-9f67-438e-8313-80b1b75deeb4 4544b60d-da6b-4dd5-9efe-334152ccf1f1 \n", + "1 95f74915-a945-491f-8751-8c970a76fc24 946d7561-42a3-4a4b-b410-3a10271c9f18 \n", + "2 d05f1763-132d-4717-addc-8ff6239ad4d9 c8f98436-9562-48ed-b51f-45b2b217aad1 \n", + "3 3dc3da30-6562-4755-bfad-6a26f1baec15 b9965bc2-c94d-4f69-98d1-bc4f5ad701c5 \n", + "4 a4340a2c-7b8a-4eeb-8290-746f0f436c83 946d7561-42a3-4a4b-b410-3a10271c9f18 \n", "\n", - " full_name entity_type state \\\n", - "102 abdussamad, shams candidate AZ \n", - "103 abdussamad, shams candidate AZ \n", - "104 abeytia, anna lynn candidate AZ \n", - "105 abeytia, anna lynn candidate AZ \n", - "0 FREDERICK BERG ... Individual MI \n", - "... ... ... ... \n", - "17734 Rodriguez, Adrian Individual MN \n", - "17735 O'Connor, Timothy J Individual MN \n", - "17736 Frenzel, Robert C Individual MN \n", - "17737 Enzminger, Peter Individual MN \n", - "17738 Bowler, Erin Individual MN \n", + " year amount recipient_id office_sought \\\n", + "0 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", + "1 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", + "2 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", + "3 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", + "4 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", "\n", - " party company occupation address \\\n", - "102 democratic none (is a candidate) NaN NaN \n", - "103 democratic none (is a candidate) NaN NaN \n", - "104 democratic none (is a candidate) NaN NaN \n", - "105 democratic none (is a candidate) NaN NaN \n", - "0 NaN BUTZEL LONG ATTORNEY 1033 YORKSHIRE \n", - "... ... ... ... ... \n", - "17734 NaN NaN NaN NaN \n", - "17735 NaN NaN NaN NaN \n", - "17736 NaN NaN NaN NaN \n", - "17737 NaN NaN NaN NaN \n", - "17738 NaN NaN NaN NaN \n", + " purpose transaction_type \\\n", + "0 bob worsley for state senate contribute to a candidate committee \n", + "1 drew john for state house contribute to a candidate committee \n", + "2 elect karen fann ld1 contribute to a candidate committee \n", + "3 elect noel campbell for house contribute to a candidate committee \n", + "4 closed to new donations refund from contrib to a cand committee \n", "\n", - " zip city \n", - "102 NaN NaN \n", - "103 NaN NaN \n", - "104 NaN NaN \n", - "105 NaN NaN \n", - "0 48230-0000 GROSSE POINTE PARK \n", - "... ... ... \n", - "17734 NaN NaN \n", - "17735 NaN NaN \n", - "17736 NaN NaN \n", - "17737 NaN NaN \n", - "17738 NaN NaN \n", + " donor_type recipient_type donor_office \\\n", + "0 NaN NaN NaN \n", + "1 NaN NaN NaN \n", + "2 NaN NaN NaN \n", + "3 NaN NaN NaN \n", + "4 NaN NaN NaN \n", "\n", - "[1760156 rows x 12 columns]" + " recipient_name \n", + "0 #1022 arizona committee of automotive retailers \n", + "1 #1022 arizona committee of automotive retailers \n", + "2 #1022 arizona committee of automotive retailers \n", + "3 #1022 arizona committee of automotive retailers \n", + "4 #1022 arizona committee of automotive retailers " ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# for now only work with datasets \n", - "sample_inds = inds_df.loc[(inds_df['id'].isin(transactions.donor_id.tolist()))]\n", - "sample_inds\n" + "from utils.network import name_identifier\n", + "from utils.linkage import deduplicate_perfect_matches\n", + "transactions = transactions.loc[(transactions.recipient_id.isin(inds_df.id)) | \n", + " (transactions.recipient_id.isin(orgs_df.id)) |\n", + " (transactions.donor_id.isin(inds_df.id)) |\n", + " (transactions.donor_id.isin(inds_df.id))]\n", + "inds = deduplicate_perfect_matches(inds_df) \n", + "orgs = deduplicate_perfect_matches(orgs_df)\n", + "transactions[\"recipient_name\"] = transactions[\"recipient_id\"].apply(name_identifier, args=([orgs, inds],))\n", + "\n", + "transactions.head(5)" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "87" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = transactions.loc[transactions.donor_id.isin(inds_df.id)]\n", + "len(x.recipient_name.unique())" + ] + }, + { + "cell_type": "code", + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -870,8 +703,17 @@ " \n", " \n", " \n", - " transaction_id\n", - " donor_id\n", + " id\n", + " first_name\n", + " last_name\n", + " full_name\n", + " entity_type\n", + " state\n", + " party\n", + " company\n", + " occupation\n", + " address\n", + " ...\n", " year\n", " amount\n", " recipient_id\n", @@ -881,361 +723,229 @@ " donor_type\n", " recipient_type\n", " donor_office\n", + " recipient_name\n", " \n", " \n", " \n", " \n", - " 212637\n", - " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 100.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " 212667\n", - " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 50.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " 440542\n", - " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 50.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " 440573\n", - " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 50.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " 440607\n", - " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 50.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " 440642\n", - " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 50.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " 636312\n", - " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 50.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", + " 55243\n", + " 0e24b503-b209-48b5-8edb-cca0cdaca78c\n", + " M.\n", + " TANG\n", + " m. tang ...\n", + " Individual\n", + " MD\n", " NaN\n", " NaN\n", - " \n", - " \n", - " 636346\n", " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 50.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", + " 6614 23RD PLACE\n", + " ...\n", + " 2022.0\n", + " 2.0\n", + " 49a2d46f-5e75-433c-94fa-f910e66d1a1e\n", " NaN\n", " NaN\n", - " DIRECT\n", + " direct\n", " NaN\n", " NaN\n", " NaN\n", + " None\n", " \n", " \n", - " 636382\n", - " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 50.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", + " 55244\n", + " 0e24b503-b209-48b5-8edb-cca0cdaca78c\n", + " M.\n", + " TANG\n", + " m. tang ...\n", + " Individual\n", + " MD\n", " NaN\n", " NaN\n", - " \n", - " \n", - " 839846\n", " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 83.33\n", - " f9fa8506-bfbb-4ef0-9e08-5c9c3e948121\n", + " 6614 23RD PLACE\n", + " ...\n", + " 2022.0\n", + " 95.0\n", + " 49a2d46f-5e75-433c-94fa-f910e66d1a1e\n", " NaN\n", " NaN\n", - " DIRECT/FUND RAISER\n", + " direct\n", " NaN\n", " NaN\n", " NaN\n", + " None\n", " \n", " \n", - " 840051\n", - " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 83.34\n", - " 389fe2ba-828a-41d4-815c-8efb2499ea11\n", - " NaN\n", - " NaN\n", - " DIRECT/FUND RAISER\n", - " NaN\n", + " 55245\n", + " 0e24b503-b209-48b5-8edb-cca0cdaca78c\n", + " M.\n", + " TANG\n", + " m. tang ...\n", + " Individual\n", + " MD\n", " NaN\n", " NaN\n", - " \n", - " \n", - " 968402\n", " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 83.33\n", - " 043a03b7-af31-4830-b12e-446b93fca9a0\n", + " 6614 23RD PLACE\n", + " ...\n", + " 2022.0\n", + " 10.0\n", + " 49a2d46f-5e75-433c-94fa-f910e66d1a1e\n", " NaN\n", " NaN\n", - " DIRECT/FUND RAISER\n", + " direct\n", " NaN\n", " NaN\n", " NaN\n", + " None\n", " \n", " \n", - " 1414338\n", - " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 250.00\n", - " ba06baf6-eae6-459f-b3a9-7261e4baa33e\n", - " NaN\n", - " NaN\n", - " DIRECT/FUND RAISER\n", - " NaN\n", + " 55246\n", + " a23037f6-741c-43a5-8a6d-0f1db4371e1d\n", + " OLIVIA N\n", + " DALMASSO\n", + " olivia n dalmasso ...\n", + " Individual\n", + " IL\n", " NaN\n", " NaN\n", - " \n", - " \n", - " 1502742\n", " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 50.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", + " PO BOX 574\n", + " ...\n", + " 2022.0\n", + " 12.6\n", + " 6b33721f-3f6a-47c0-bce2-284fc58e0d2a\n", " NaN\n", " NaN\n", - " DIRECT\n", + " direct\n", " NaN\n", " NaN\n", " NaN\n", + " None\n", " \n", " \n", - " 1502777\n", - " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 50.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", + " 55247\n", + " a23037f6-741c-43a5-8a6d-0f1db4371e1d\n", + " OLIVIA N\n", + " DALMASSO\n", + " olivia n dalmasso ...\n", + " Individual\n", + " IL\n", " NaN\n", " NaN\n", - " \n", - " \n", - " 1502812\n", " NaN\n", - " b8fbed14-0766-49ab-8516-97952c654a12\n", - " 2022\n", - " 50.00\n", - " 1d4ae24b-2814-4d0d-995e-28fd4c26785d\n", + " PO BOX 574\n", + " ...\n", + " 2022.0\n", + " 4.2\n", + " 6b33721f-3f6a-47c0-bce2-284fc58e0d2a\n", " NaN\n", " NaN\n", - " DIRECT\n", + " direct\n", " NaN\n", " NaN\n", " NaN\n", + " None\n", " \n", " \n", "\n", + "

5 rows × 25 columns

\n", "" ], "text/plain": [ - " transaction_id donor_id year amount \\\n", - "212637 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 100.00 \n", - "212667 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", - "440542 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", - "440573 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", - "440607 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", - "440642 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", - "636312 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", - "636346 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", - "636382 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", - "839846 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 83.33 \n", - "840051 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 83.34 \n", - "968402 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 83.33 \n", - "1414338 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 250.00 \n", - "1502742 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", - "1502777 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", - "1502812 NaN b8fbed14-0766-49ab-8516-97952c654a12 2022 50.00 \n", + " id first_name \\\n", + "55243 0e24b503-b209-48b5-8edb-cca0cdaca78c M. \n", + "55244 0e24b503-b209-48b5-8edb-cca0cdaca78c M. \n", + "55245 0e24b503-b209-48b5-8edb-cca0cdaca78c M. \n", + "55246 a23037f6-741c-43a5-8a6d-0f1db4371e1d OLIVIA N \n", + "55247 a23037f6-741c-43a5-8a6d-0f1db4371e1d OLIVIA N \n", + "\n", + " last_name \\\n", + "55243 TANG \n", + "55244 TANG \n", + "55245 TANG \n", + "55246 DALMASSO \n", + "55247 DALMASSO \n", + "\n", + " full_name entity_type state \\\n", + "55243 m. tang ... Individual MD \n", + "55244 m. tang ... Individual MD \n", + "55245 m. tang ... Individual MD \n", + "55246 olivia n dalmasso ... Individual IL \n", + "55247 olivia n dalmasso ... Individual IL \n", + "\n", + " party company occupation address ... year amount \\\n", + "55243 NaN NaN NaN 6614 23RD PLACE ... 2022.0 2.0 \n", + "55244 NaN NaN NaN 6614 23RD PLACE ... 2022.0 95.0 \n", + "55245 NaN NaN NaN 6614 23RD PLACE ... 2022.0 10.0 \n", + "55246 NaN NaN NaN PO BOX 574 ... 2022.0 12.6 \n", + "55247 NaN NaN NaN PO BOX 574 ... 2022.0 4.2 \n", "\n", - " recipient_id office_sought purpose \\\n", - "212637 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", - "212667 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", - "440542 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", - "440573 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", - "440607 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", - "440642 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", - "636312 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", - "636346 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", - "636382 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", - "839846 f9fa8506-bfbb-4ef0-9e08-5c9c3e948121 NaN NaN \n", - "840051 389fe2ba-828a-41d4-815c-8efb2499ea11 NaN NaN \n", - "968402 043a03b7-af31-4830-b12e-446b93fca9a0 NaN NaN \n", - "1414338 ba06baf6-eae6-459f-b3a9-7261e4baa33e NaN NaN \n", - "1502742 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", - "1502777 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", - "1502812 1d4ae24b-2814-4d0d-995e-28fd4c26785d NaN NaN \n", + " recipient_id office_sought purpose \\\n", + "55243 49a2d46f-5e75-433c-94fa-f910e66d1a1e NaN NaN \n", + "55244 49a2d46f-5e75-433c-94fa-f910e66d1a1e NaN NaN \n", + "55245 49a2d46f-5e75-433c-94fa-f910e66d1a1e NaN NaN \n", + "55246 6b33721f-3f6a-47c0-bce2-284fc58e0d2a NaN NaN \n", + "55247 6b33721f-3f6a-47c0-bce2-284fc58e0d2a NaN NaN \n", "\n", - " transaction_type donor_type recipient_type donor_office \n", - "212637 DIRECT NaN NaN NaN \n", - "212667 DIRECT NaN NaN NaN \n", - "440542 DIRECT NaN NaN NaN \n", - "440573 DIRECT NaN NaN NaN \n", - "440607 DIRECT NaN NaN NaN \n", - "440642 DIRECT NaN NaN NaN \n", - "636312 DIRECT NaN NaN NaN \n", - "636346 DIRECT NaN NaN NaN \n", - "636382 DIRECT NaN NaN NaN \n", - "839846 DIRECT/FUND RAISER NaN NaN NaN \n", - "840051 DIRECT/FUND RAISER NaN NaN NaN \n", - "968402 DIRECT/FUND RAISER NaN NaN NaN \n", - "1414338 DIRECT/FUND RAISER NaN NaN NaN \n", - "1502742 DIRECT NaN NaN NaN \n", - "1502777 DIRECT NaN NaN NaN \n", - "1502812 DIRECT NaN NaN NaN " + " transaction_type donor_type recipient_type donor_office \\\n", + "55243 direct NaN NaN NaN \n", + "55244 direct NaN NaN NaN \n", + "55245 direct NaN NaN NaN \n", + "55246 direct NaN NaN NaN \n", + "55247 direct NaN NaN NaN \n", + "\n", + " recipient_name \n", + "55243 None \n", + "55244 None \n", + "55245 None \n", + "55246 None \n", + "55247 None \n", + "\n", + "[5 rows x 25 columns]" ] }, - "execution_count": 14, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "transactions.loc[transactions['donor_id'] == 'b8fbed14-0766-49ab-8516-97952c654a12']" + "# left merge according to ind_id and transaction donor_id. This was entities that only received money will still be there, no info from ind_dataset\n", + "# is lost\n", + "merged_inds_sample = pd.merge(inds_df,transactions,how='left',left_on='id',right_on='donor_id')\n", + "merged_inds_sample.dropna(subset = ['amount'], inplace=True)\n", + "merged_inds_sample.tail(5)" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'BUTZEL LONG POLITICAL ACTION COMMITTEE'" + "Index(['id', 'first_name', 'last_name', 'full_name', 'entity_type', 'state',\n", + " 'party', 'company', 'occupation', 'address', 'zip', 'city',\n", + " 'classification', 'transaction_id', 'donor_id', 'year', 'amount',\n", + " 'recipient_id', 'office_sought', 'purpose', 'transaction_type',\n", + " 'donor_type', 'recipient_type', 'donor_office', 'recipient_name'],\n", + " dtype='object')" ] }, - "execution_count": 28, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "x = orgs_df.loc[orgs_df['id']=='1d4ae24b-2814-4d0d-995e-28fd4c26785d']\n", - "x.iloc[0]['name']" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# apply dedup to both inds and orgs\n", - "inds_df = deduplicate_perfect_matches(inds_df)\n", - "orgs_df = deduplicate_perfect_matches(orgs_df)\n", - "\n", - "# map the uuids in transaction donor and recipient columns to the deduplicated uuids\n", - "deduped = pd.read_csv(\"../output/deduplicated_UUIDs.csv\")\n", - "transactions[['donor_id','recipient_id']] = transactions[['donor_id','recipient_id']].replace(deduped)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# add recipient name to transactions df: \n", - "def name_identifier(uuid:str, orgs_df, inds_df) -> str:\n", - " # 1st check orgs df:\n", - " name_in_org = orgs_df.loc[orgs_df['id']==uuid] \n", - " if len(name_in_org)> 0:\n", - " return name_in_org.iloc[0]['name']\n", - " # theoretically it must be in inds if not in orgs, but for the sample data\n", - " # this might not be the case\n", - " name_in_ind = inds_df.loc[inds_df['id']==uuid]\n", - " if len(name_in_ind)> 0:\n", - " return name_in_ind.iloc[0]['full_name']\n", - " else: return None" + "merged_inds_sample.columns" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -1259,630 +969,149 @@ " \n", " \n", " \n", - " transaction_id\n", " donor_id\n", - " year\n", - " amount\n", " recipient_id\n", + " full_name\n", + " recipient_name\n", + " address\n", + " amount\n", + " city\n", + " classification\n", + " company\n", + " donor_office\n", + " ...\n", + " occupation\n", " office_sought\n", + " party\n", " purpose\n", - " transaction_type\n", - " donor_type\n", " recipient_type\n", - " donor_office\n", - " recipient_name\n", - " \n", - " \n", - " \n", - " \n", - " 884875\n", - " NaN\n", - " 6c2b94a2-4247-4bc4-b784-6b5a9a2ae9f2\n", - " 2022\n", - " 5.00\n", - " 533f6de5-5140-4799-be24-1d5f4e228d1b\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " FRIENDS OF DANA NESSEL\n", - " \n", - " \n", - " 122735\n", - " NaN\n", - " b906d3eb-3874-4789-b523-e2eaab415328\n", - " 2022\n", - " 9.16\n", - " f2fad7aa-a782-4d56-8343-049d2150c16f\n", - " NaN\n", - " MERCHANT SVCS FEES\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " THE JULIE BRIXIE BLUE WAVE FUND 2\n", - " \n", - " \n", - " 458788\n", - " NaN\n", - " 88740001-952f-477e-b2da-9b24f747f6ce\n", - " 2022\n", - " 1.00\n", - " a0619eff-155f-442f-ab71-b5c0ee942223\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " COMERICA INC POLITICAL ACTION COMMITTEE\n", - " \n", - " \n", - " 1522918\n", - " NaN\n", - " da538e73-c823-48f8-b4ec-920aa1da458f\n", - " 2022\n", - " 20.00\n", - " 81169dce-331e-44ad-b870-1b376d49cf2f\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " WASTE MANAGEMENT EMPLOYEES BETTER GOVERNMENT F...\n", - " \n", - " \n", - " 1933218\n", - " NaN\n", - " 33814139-8442-4050-b15a-40aed1aa9db7\n", - " 2022\n", - " 35.00\n", - " abdf0530-e2fb-40b6-9a52-dea386cd60f4\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " GRETCHEN WHITMER FOR GOVERNOR\n", - " \n", - " \n", - " 465682\n", - " NaN\n", - " 133431dd-41ef-4161-97ef-02d23fc05b42\n", - " 2022\n", - " 7.50\n", - " d582fba6-2a0c-4864-9fb2-5a4f898f26c2\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " MI ASSOC OF COMMUNITY BANKERS OF MICHIGAN POLI...\n", - " \n", - " \n", - " 761674\n", - " NaN\n", - " 668d8471-ade6-469b-9e6b-71ddbfd1d8ba\n", - " 2022\n", - " 25.00\n", - " 1d05ca29-e97f-43cd-bd9e-f313573b324b\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " END CITIZENS UNITED NON-FEDERAL MI\n", - " \n", - " \n", - " 993543\n", - " NaN\n", - " b9b66f08-4e99-43e7-9161-c75db92b0bb4\n", - " 2022\n", - " 10.00\n", - " ecebf482-f298-4777-bea6-e3451c75e3fc\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " RESCARE INC DBA BRIGHTSPRING HEALTH SERVICES L...\n", - " \n", - " \n", - " 1196687\n", - " NaN\n", - " f4942707-0d7f-4617-b478-56af7504123e\n", - " 2022\n", - " 12.00\n", - " a24e305e-a49b-4cb3-a857-d629f1162ce8\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " MARATHON PETROLEUM CORPORATION EMPLOYEES PAC\n", - " \n", - " \n", - " 334698\n", - " NaN\n", - " 96be56db-56b6-48d0-9cf7-9d47da307388\n", - " 2022\n", - " 11.80\n", - " 9fc94e93-b6aa-400d-9a4a-d6501afb84dc\n", - " NaN\n", - " NaN\n", - " DIRECT\n", - " NaN\n", - " NaN\n", - " NaN\n", - " MICHIGAN REGIONAL COUNCIL OF CARPENTERS POLITI...\n", - " \n", - " \n", - "\n", - "" - ], - "text/plain": [ - " transaction_id donor_id year amount \\\n", - "884875 NaN 6c2b94a2-4247-4bc4-b784-6b5a9a2ae9f2 2022 5.00 \n", - "122735 NaN b906d3eb-3874-4789-b523-e2eaab415328 2022 9.16 \n", - "458788 NaN 88740001-952f-477e-b2da-9b24f747f6ce 2022 1.00 \n", - "1522918 NaN da538e73-c823-48f8-b4ec-920aa1da458f 2022 20.00 \n", - "1933218 NaN 33814139-8442-4050-b15a-40aed1aa9db7 2022 35.00 \n", - "465682 NaN 133431dd-41ef-4161-97ef-02d23fc05b42 2022 7.50 \n", - "761674 NaN 668d8471-ade6-469b-9e6b-71ddbfd1d8ba 2022 25.00 \n", - "993543 NaN b9b66f08-4e99-43e7-9161-c75db92b0bb4 2022 10.00 \n", - "1196687 NaN f4942707-0d7f-4617-b478-56af7504123e 2022 12.00 \n", - "334698 NaN 96be56db-56b6-48d0-9cf7-9d47da307388 2022 11.80 \n", - "\n", - " recipient_id office_sought \\\n", - "884875 533f6de5-5140-4799-be24-1d5f4e228d1b NaN \n", - "122735 f2fad7aa-a782-4d56-8343-049d2150c16f NaN \n", - "458788 a0619eff-155f-442f-ab71-b5c0ee942223 NaN \n", - "1522918 81169dce-331e-44ad-b870-1b376d49cf2f NaN \n", - "1933218 abdf0530-e2fb-40b6-9a52-dea386cd60f4 NaN \n", - "465682 d582fba6-2a0c-4864-9fb2-5a4f898f26c2 NaN \n", - "761674 1d05ca29-e97f-43cd-bd9e-f313573b324b NaN \n", - "993543 ecebf482-f298-4777-bea6-e3451c75e3fc NaN \n", - "1196687 a24e305e-a49b-4cb3-a857-d629f1162ce8 NaN \n", - "334698 9fc94e93-b6aa-400d-9a4a-d6501afb84dc NaN \n", - "\n", - " purpose transaction_type donor_type \\\n", - "884875 NaN DIRECT NaN \n", - "122735 MERCHANT SVCS FEES NaN NaN \n", - "458788 NaN DIRECT NaN \n", - "1522918 NaN DIRECT NaN \n", - "1933218 NaN DIRECT NaN \n", - "465682 NaN DIRECT NaN \n", - "761674 NaN DIRECT NaN \n", - "993543 NaN DIRECT NaN \n", - "1196687 NaN DIRECT NaN \n", - "334698 NaN DIRECT NaN \n", - "\n", - " recipient_type donor_office \\\n", - "884875 NaN NaN \n", - "122735 NaN NaN \n", - "458788 NaN NaN \n", - "1522918 NaN NaN \n", - "1933218 NaN NaN \n", - "465682 NaN NaN \n", - "761674 NaN NaN \n", - "993543 NaN NaN \n", - "1196687 NaN NaN \n", - "334698 NaN NaN \n", - "\n", - " recipient_name \n", - "884875 FRIENDS OF DANA NESSEL \n", - "122735 THE JULIE BRIXIE BLUE WAVE FUND 2 \n", - "458788 COMERICA INC POLITICAL ACTION COMMITTEE \n", - "1522918 WASTE MANAGEMENT EMPLOYEES BETTER GOVERNMENT F... \n", - "1933218 GRETCHEN WHITMER FOR GOVERNOR \n", - "465682 MI ASSOC OF COMMUNITY BANKERS OF MICHIGAN POLI... \n", - "761674 END CITIZENS UNITED NON-FEDERAL MI \n", - "993543 RESCARE INC DBA BRIGHTSPRING HEALTH SERVICES L... \n", - "1196687 MARATHON PETROLEUM CORPORATION EMPLOYEES PAC \n", - "334698 MICHIGAN REGIONAL COUNCIL OF CARPENTERS POLITI... " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ex = transactions.sample(10)\n", - "ex['recipient_name'] = ex['recipient_id'].apply(name_identifier, args=(orgs_df, inds_df))\n", - "ex" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idcompanyentity_typefirst_namefull_namelast_namepartystatetransaction_iddonor_idyearamountrecipient_idoffice_soughtpurposetransaction_typedonor_typerecipient_typedonor_office
025625730individualNaNvarious 0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
11617483aggregate cashindividualNaNcash _small donationsNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", - "
" - ], - "text/plain": [ - " id company entity_type first_name full_name \\\n", - "0 2562573 0 individual NaN various 0 \n", - "1 1617483 aggregate cash individual NaN cash _small donations \n", - "\n", - " last_name party state transaction_id donor_id year amount recipient_id \\\n", - "0 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "1 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "\n", - " office_sought purpose transaction_type donor_type recipient_type \\\n", - "0 NaN NaN NaN NaN NaN \n", - "1 NaN NaN NaN NaN NaN \n", - "\n", - " donor_office \n", - "0 NaN \n", - "1 NaN " - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "# this step took more than 16 minutes to run...think of alternative way\n", - "# id_to_name = {id: name for id, name in zip(inds_sample.id.tolist(), inds_sample.full_name.tolist())} #the same would be applied to orgs\n", - "transactions['recipient_name'] = transactions['recipient_id'].apply(lambda x: sample_inds.loc[sample_inds.id == x] )\n", - "\n", - "# left merge according to ind_id and transaction donor_id. This was entities that only received money will still be there, no info from ind_dataset\n", - "# is lost\n", - "merged_inds_sample = pd.merge(sample_inds,transactions,how='left',left_on='id',right_on='donor_id')\n", - "merged_inds_sample.head(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idcompanyentity_typefirst_namefull_namelast_namepartystate
27100894none (is a candidate)candidateNaNabdussamad, shamsNaNdemocraticAZ
\n", - "
" - ], - "text/plain": [ - " id company entity_type first_name full_name \\\n", - "27 100894 none (is a candidate) candidate NaN abdussamad, shams \n", - "\n", - " last_name party state \n", - "27 NaN democratic AZ " - ] - }, - "execution_count": 93, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sample_inds.loc[sample_inds.full_name == 'abdussamad, shams']" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": {}, - "outputs": [], - "source": [ - "def add_notes_from_df(df):\n", - " G = nx.MultiDiGraph()\n", - " #inds or org...\n", - " if 'name' in df.columns:\n", - " node_name = 'name'\n", - " else: node_name = 'full_name'\n", - "\n", - " for _, row in df.iterrows():\n", - " G.add_node(row[node_name])\n", - " for column in df.columns:\n", - " # only add info that's present\n", - " if (row[column] != 'nan'):\n", - " nx.set_node_attributes(G, row[column], name=column)\n", - " #nx.set\n", - " nx.draw_random(G, with_labels=True)\n", - " plt.show()\n", - " return G" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1905,208 +1134,341 @@ " \n", " \n", " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", "
idcompanyentity_typefirst_namefull_namelast_namepartystatetransaction_iddonor_idyearamountrecipient_idoffice_soughtpurposetransaction_typedonor_typerecipient_typedonor_officezip
27100894none (is a candidate)candidateNaNabdussamad, shamsNaNdemocraticAZ508807910089400007b184-4e1d-401a-ba51-99733d2e13e7d461f2bd-9074-44b3-8948-e659bead3e58graham filler ...saginaw county republican committee12705 WARM CREEK500.00DEWITTneutralNoneNone...NoneNoneNoneNoneNoneMINonedirect2022.05.00750413state representative - district 11e-qual online qcccec $5 qualifying contributionNaNNaNNaN48820-0000
28100894none (is a candidate)candidateNaNabdussamad, shamsNaNdemocraticAZ5088080100894100523627-46c7-4f76-ab42-fb2c1fbac1b16126e78b-4e80-4361-a019-9d99aa1623eddaniel millstone ...rooted in community leadership pac10518 ROUNTREE RD0.77LOS ANGELESneutralNoneNone...NoneNoneNoneNoneNoneCANonedirect2022.05.002002235state representative - district 11NaNccec $5 qualifying contributionNaNNaNNaN90064-0000
29100894none (is a candidate)candidateNaNabdussamad, shamsNaNdemocraticAZ5088081100894200934782-86e5-4941-94cf-0a700100a2c02d1a0919-218e-4692-98ec-c4a73a126482josie petersheim ...mi greenstone pac7196 W. BRIGGS RD.25.00STANTONneutralNoneNone...NoneNoneNoneNoneNoneMINonedirect2022.0100.001942680state representative - district 11NaNreceive loan from candidate or family memberNaNNaNNaN48888-0000
30100894none (is a candidate)candidateNaNabdussamad, shamsNaNdemocraticAZ5088083100894300f22bdd-96bf-4074-9620-4737e8444958af8417ee-5bca-49f5-91e9-d2de65d73631robert doerfler ...michigan senate democratic fund1534 NE 5TH AVE50.00FORT LAUDERDALEneutralNoneNone...NoneNoneNoneNoneNoneFLNonedirect2022.05.00-1state representative - district 11NaNin-state contributions $100 or lessNaNNaNNaN33304-1006
31100894none (is a candidate)candidateNaNabdussamad, shamsNaNdemocraticAZ508808410089440138403b-b5b9-453a-a1d2-b6ed9fa5fe586126e78b-4e80-4361-a019-9d99aa1623edjoseph martinez ...rooted in community leadership pac139 HURON AVE1.65MOUNT CLEMENSneutralNoneNone...NoneNoneNoneNoneNoneMINonedirect2022.020.00-1state representative - district 11NaNin-state contributions $100 or lessNaNNaNNaN48043-0000
..................
597100883none (is a candidate)candidateNaNabeytia, anna lynnNaNdemocraticAZ50841001008831120fdccce6b-e55f-4f1d-bd95-1714f2a667eda3fe20e2-8019-448e-9b54-bfdce4d87f2fmichael olthoff ...bumstead leadership fund1499 MIDDLEBROOK DR1000.00NORTON SHORESneutralnicholsNone...ceoNoneNoneNoneNoneMINonedirect2022.010.002017053state representative - district 11NaNcontribution from individualsNaNNaNNaN49441-0000
598100883none (is a candidate)candidateNaNabeytia, anna lynnNaNdemocraticAZ50841021008831121fe969829-b8a4-4d38-88e2-8314b340d5676126e78b-4e80-4361-a019-9d99aa1623edjoanna simon ...rooted in community leadership pac1546 POPLAR GROVE DR3.82RESTONneutralNoneNone...NoneNoneNoneNoneNoneVANonedirect2022.0180.002017970state representative - district 11video productionin-kind cont. from individualNaNNaNNaN20194-1731
599100883none (is a candidate)candidateNaNabeytia, anna lynnNaNdemocraticAZ50841031008831122ff1423ba-ff5e-4bc1-b864-303a9dcc9b326126e78b-4e80-4361-a019-9d99aa1623edadriana p{on ce ...rooted in community leadership pac9 BIRCH CT3.82NORMALneutralNoneNone...NoneNoneNoneNoneNoneILNonedirect2022.051.992008747state representative - district 11NaNcontribution from individualsNaNNaNNaN61761-3900
600100883none (is a candidate)candidateNaNabeytia, anna lynnNaNdemocraticAZ50841051008831123ff24644e-d64a-4a8a-a87f-cdb53b86dd636126e78b-4e80-4361-a019-9d99aa1623eddavid friedman ...rooted in community leadership pac8823 MOUNTAIN PATH CIR0.15AUSTINneutralNoneNone...NoneNoneNoneNoneNoneTXNonedirect2022.010.801193076state representative - district 11NaNcontribution from individualsNaNNaNNaN78759-0000
601100883none (is a candidate)candidateNaNabeytia, anna lynnNaNdemocraticAZ50841071008831124ffb25947-c03f-43b2-abb4-23531cdb73247f272fe4-d592-453c-9ca1-315ea3fdcff1dennis starner ...bill g schuette for state representative4612 CONGRESS DRIVE525.00MIDLANDneutralretiredNone...retiredNoneNoneNoneNoneMINonedirect/fund raiser2022.051.991691025state representative - district 11NaNcontribution from individualsNaNNaNNaN48642-0000
\n", - "

575 rows × 19 columns

\n", + "

1125 rows × 25 columns

\n", "
" ], "text/plain": [ - " id company entity_type first_name \\\n", - "27 100894 none (is a candidate) candidate NaN \n", - "28 100894 none (is a candidate) candidate NaN \n", - "29 100894 none (is a candidate) candidate NaN \n", - "30 100894 none (is a candidate) candidate NaN \n", - "31 100894 none (is a candidate) candidate NaN \n", - ".. ... ... ... ... \n", - "597 100883 none (is a candidate) candidate NaN \n", - "598 100883 none (is a candidate) candidate NaN \n", - "599 100883 none (is a candidate) candidate NaN \n", - "600 100883 none (is a candidate) candidate NaN \n", - "601 100883 none (is a candidate) candidate NaN \n", - "\n", - " full_name last_name party state transaction_id donor_id \\\n", - "27 abdussamad, shams NaN democratic AZ 5088079 100894 \n", - "28 abdussamad, shams NaN democratic AZ 5088080 100894 \n", - "29 abdussamad, shams NaN democratic AZ 5088081 100894 \n", - "30 abdussamad, shams NaN democratic AZ 5088083 100894 \n", - "31 abdussamad, shams NaN democratic AZ 5088084 100894 \n", - ".. ... ... ... ... ... ... \n", - "597 abeytia, anna lynn NaN democratic AZ 5084100 100883 \n", - "598 abeytia, anna lynn NaN democratic AZ 5084102 100883 \n", - "599 abeytia, anna lynn NaN democratic AZ 5084103 100883 \n", - "600 abeytia, anna lynn NaN democratic AZ 5084105 100883 \n", - "601 abeytia, anna lynn NaN democratic AZ 5084107 100883 \n", - "\n", - " year amount recipient_id office_sought \\\n", - "27 2022.0 5.00 750413 state representative - district 11 \n", - "28 2022.0 5.00 2002235 state representative - district 11 \n", - "29 2022.0 100.00 1942680 state representative - district 11 \n", - "30 2022.0 5.00 -1 state representative - district 11 \n", - "31 2022.0 20.00 -1 state representative - district 11 \n", - ".. ... ... ... ... \n", - "597 2022.0 10.00 2017053 state representative - district 11 \n", - "598 2022.0 180.00 2017970 state representative - district 11 \n", - "599 2022.0 51.99 2008747 state representative - district 11 \n", - "600 2022.0 10.80 1193076 state representative - district 11 \n", - "601 2022.0 51.99 1691025 state representative - district 11 \n", - "\n", - " purpose transaction_type \\\n", - "27 e-qual online qc ccec $5 qualifying contribution \n", - "28 NaN ccec $5 qualifying contribution \n", - "29 NaN receive loan from candidate or family member \n", - "30 NaN in-state contributions $100 or less \n", - "31 NaN in-state contributions $100 or less \n", - ".. ... ... \n", - "597 NaN contribution from individuals \n", - "598 video production in-kind cont. from individual \n", - "599 NaN contribution from individuals \n", - "600 NaN contribution from individuals \n", - "601 NaN contribution from individuals \n", - "\n", - " donor_type recipient_type donor_office \n", - "27 NaN NaN NaN \n", - "28 NaN NaN NaN \n", - "29 NaN NaN NaN \n", - "30 NaN NaN NaN \n", - "31 NaN NaN NaN \n", - ".. ... ... ... \n", - "597 NaN NaN NaN \n", - "598 NaN NaN NaN \n", - "599 NaN NaN NaN \n", - "600 NaN NaN NaN \n", - "601 NaN NaN NaN \n", - "\n", - "[575 rows x 19 columns]" + " donor_id \\\n", + "0 0007b184-4e1d-401a-ba51-99733d2e13e7 \n", + "1 00523627-46c7-4f76-ab42-fb2c1fbac1b1 \n", + "2 00934782-86e5-4941-94cf-0a700100a2c0 \n", + "3 00f22bdd-96bf-4074-9620-4737e8444958 \n", + "4 0138403b-b5b9-453a-a1d2-b6ed9fa5fe58 \n", + "... ... \n", + "1120 fdccce6b-e55f-4f1d-bd95-1714f2a667ed \n", + "1121 fe969829-b8a4-4d38-88e2-8314b340d567 \n", + "1122 ff1423ba-ff5e-4bc1-b864-303a9dcc9b32 \n", + "1123 ff24644e-d64a-4a8a-a87f-cdb53b86dd63 \n", + "1124 ffb25947-c03f-43b2-abb4-23531cdb7324 \n", + "\n", + " recipient_id \\\n", + "0 d461f2bd-9074-44b3-8948-e659bead3e58 \n", + "1 6126e78b-4e80-4361-a019-9d99aa1623ed \n", + "2 2d1a0919-218e-4692-98ec-c4a73a126482 \n", + "3 af8417ee-5bca-49f5-91e9-d2de65d73631 \n", + "4 6126e78b-4e80-4361-a019-9d99aa1623ed \n", + "... ... \n", + "1120 a3fe20e2-8019-448e-9b54-bfdce4d87f2f \n", + "1121 6126e78b-4e80-4361-a019-9d99aa1623ed \n", + "1122 6126e78b-4e80-4361-a019-9d99aa1623ed \n", + "1123 6126e78b-4e80-4361-a019-9d99aa1623ed \n", + "1124 7f272fe4-d592-453c-9ca1-315ea3fdcff1 \n", + "\n", + " full_name \\\n", + "0 graham filler ... \n", + "1 daniel millstone ... \n", + "2 josie petersheim ... \n", + "3 robert doerfler ... \n", + "4 joseph martinez ... \n", + "... ... \n", + "1120 michael olthoff ... \n", + "1121 joanna simon ... \n", + "1122 adriana p{on ce ... \n", + "1123 david friedman ... \n", + "1124 dennis starner ... \n", + "\n", + " recipient_name address \\\n", + "0 saginaw county republican committee 12705 WARM CREEK \n", + "1 rooted in community leadership pac 10518 ROUNTREE RD \n", + "2 mi greenstone pac 7196 W. BRIGGS RD. \n", + "3 michigan senate democratic fund 1534 NE 5TH AVE \n", + "4 rooted in community leadership pac 139 HURON AVE \n", + "... ... ... \n", + "1120 bumstead leadership fund 1499 MIDDLEBROOK DR \n", + "1121 rooted in community leadership pac 1546 POPLAR GROVE DR \n", + "1122 rooted in community leadership pac 9 BIRCH CT \n", + "1123 rooted in community leadership pac 8823 MOUNTAIN PATH CIR \n", + "1124 bill g schuette for state representative 4612 CONGRESS DRIVE \n", + "\n", + " amount city classification company donor_office ... \\\n", + "0 500.00 DEWITT neutral None None ... \n", + "1 0.77 LOS ANGELES neutral None None ... \n", + "2 25.00 STANTON neutral None None ... \n", + "3 50.00 FORT LAUDERDALE neutral None None ... \n", + "4 1.65 MOUNT CLEMENS neutral None None ... \n", + "... ... ... ... ... ... ... \n", + "1120 1000.00 NORTON SHORES neutral nichols None ... \n", + "1121 3.82 RESTON neutral None None ... \n", + "1122 3.82 NORMAL neutral None None ... \n", + "1123 0.15 AUSTIN neutral None None ... \n", + "1124 525.00 MIDLAND neutral retired None ... \n", + "\n", + " occupation office_sought party purpose recipient_type state \\\n", + "0 None None None None None MI \n", + "1 None None None None None CA \n", + "2 None None None None None MI \n", + "3 None None None None None FL \n", + "4 None None None None None MI \n", + "... ... ... ... ... ... ... \n", + "1120 ceo None None None None MI \n", + "1121 None None None None None VA \n", + "1122 None None None None None IL \n", + "1123 None None None None None TX \n", + "1124 retired None None None None MI \n", + "\n", + " transaction_id transaction_type year zip \n", + "0 None direct 2022.0 48820-0000 \n", + "1 None direct 2022.0 90064-0000 \n", + "2 None direct 2022.0 48888-0000 \n", + "3 None direct 2022.0 33304-1006 \n", + "4 None direct 2022.0 48043-0000 \n", + "... ... ... ... ... \n", + "1120 None direct 2022.0 49441-0000 \n", + "1121 None direct 2022.0 20194-1731 \n", + "1122 None direct 2022.0 61761-3900 \n", + "1123 None direct 2022.0 78759-0000 \n", + "1124 None direct/fund raiser 2022.0 48642-0000 \n", + "\n", + "[1125 rows x 25 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "attribute_cols = merged_inds_sample.columns.difference(['donor_id','recipient_id','full_name','recipient_name'])\n", + "agg_functions = {col: 'sum' if col == 'amount' else 'first' for col in attribute_cols}\n", + "grouped_sample = merged_inds_sample.groupby(['donor_id','recipient_id','full_name','recipient_name']).agg(agg_functions).reset_index()\n", + "grouped_sample" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph:\n", + " G = nx.MultiDiGraph()\n", + " # first check if df is individuals or organizations dataset\n", + " if \"name\" in df.columns:\n", + " node_name = \"name\"\n", + " else:\n", + " node_name = \"full_name\"\n", + " \n", + " transact_info = ['office_sought', 'purpose', 'transaction_type', 'year','transaction_id','donor_office','amount']\n", + " for _, row in df.iterrows(): \n", + " # add node attributes based on the columns relevant to the entity\n", + " G.add_node(row[node_name])\n", + " for column in df.columns.difference(transact_info):\n", + " if not pd.isnull(row[column]):\n", + " G.nodes[row[node_name]][column] = row[column]\n", + " \n", + " # link the donor node to the recipient node. add the attributes of the\n", + " # edge based on relevant nodes \n", + " edge_dictionary = {}\n", + " for column in transact_info:\n", + " if not pd.isnull(row[column]):\n", + " edge_dictionary[column] = row[column]\n", + " G.add_edge(row[node_name], row['recipient_name'], **edge_dictionary)\n", + "\n", + " # the added 'recipient_name' node has no attributes at this moment\n", + " # for the final code this line won't be necessary, as each recipient\n", + " # should ideally be referenced later on. For now, all added nodes for\n", + " # the recipient will only have one default attribute: classification\n", + " G.nodes[row['recipient_name']]['classification'] = 'neutral' \n", + " \n", + " edge_labels = {(u,v):d['amount'] for u,v,d in G.edges(data=True)}\n", + " entity_colors = {'neutral': 'green', 'c':'blue', 'f':'red'}\n", + " node_colors = [entity_colors[G.nodes[node]['classification']] for node in G.nodes()]\n", + "\n", + " nx.draw_planar(G, with_labels=False,node_color=node_colors)\n", + " plt.figure(3,figsize=(12,12)) \n", + " nx.draw_networkx_edge_labels(G, pos=nx.planar_layout(G),edge_labels=edge_labels, label_pos=0.5)\n", + "\n", + " #nx.draw_planar(G, with_labels=False)\n", + " plt.show()\n", + " return G" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 122, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#for u,v in G.nodes(data=True):\n", + " #print(u)#['classification'])\n", + " \n", + "G.nodes['michigan association of health plans political action committee']#['classification'])#['nancy davis ']['classification']" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['neutral', 'f'], dtype=object)" ] }, - "execution_count": 77, + "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "merged_inds_sample.loc[merged_inds_sample.donor_id.notnull()]" + "grouped_sample.classification.unique()" ] }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAHzCAYAAACe1o1DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydZXgUVxuG792NuwdCAqEBggR3CRAKBE2BUqxIoGjQ0kCBQkgKxYsX10Jwd7fg7i5J8Ahxz+5+P/bbIZvdGFab+7pyQWbOnJHszrxzzvs+j0SpVCoRERERERERERER+UCkf/UBiIiIiIiIiIiI/LMRA0oREREREREREZGPQgwoRUREREREREREPgoxoBQREREREREREfkoxIBSRERERERERETkoxADShERERERERERkY9CDChFREREREREREQ+CjGgFBERERERERER+SjEgFJEREREREREROSjEANKERERERERERGRj0IMKEVERERERERERD4KMaAUERERERERERH5KMSAUkRERERERERE5KMQA0oREREREREREZGPQgwoRUREREREREREPgoxoBQREREREREREfkoxIBSRERERERERETko9D7qw9A5N9HUlomodFJpGcqMNCT4mpriqmh+FETERERERH5tyI+5UU+CY/eJhB8IZzjDyIIf5eMMss6CVDUxgQvdwe+r1mUko7mf9VhioiIiIiIiHwGJEqlUpl3MxER3Tx/l8yY7bcIeRyFTCpBrsj546Re71nCjklty+NiY/IFj1RERERERETkcyEGlCIfzIZL4YzfdYdMhTLXQDI7MqkEPamEIJ9ydKpe9DMeoYiIiIiIiMiXQAwoRT6I+ccfMePQw4/ux79pKQZ5lfwERyQiIiIiIiLyV/GPrPIODAxEIpEQFRX1Vx9KrjRs2JCGDRt+sv58fX1xdXX9ZP19KBsuhX+SYBJgxqGHbLwU/kn6EhEREREREflr+EcGlCJ/Hc/fJTN+150CbZMeFU5sSDCZsW91rg/YdYfn75I/xeF9UY4cOYKXlxd2dnZYWVlRo0YN1qxZo9VOIpHo/JkyZYpGu+3bt+Pt7Y2TkxOGhoY4OzvTvn17bt++rdHuxIkTOfYpkUj47bffhLarVq3Ksd2bN28+z4UREREREfnPIVZ5f0YOHTr0Vx/CJ2fM9ltkFiBfEiAjKpy4M+sxKloePStHrfWZCiVjtt9izQ81P9VhfnZ27dpFmzZtqF27tjBivmnTJrp3705UVBQ//vijRvsmTZrQvXt3jWWVK1fW+P3WrVtYW1szdOhQ7OzsePPmDStWrKBGjRqcO3eOihUrAlCmTBmdgeuaNWs4dOgQTZs21Vr366+/Urx4cY1lVlZWH3LqIiIiIiIiWogB5WfEwMDgrz6ET8qjtwmEPP70aQZyhZKQx1E8jkjAzd6M1NRUjI2NP/l+PiXz58+ncOHCHDt2DENDQwD69etH6dKlWbVqlVZAWapUKbp27ZprnwEBAVrLevfujbOzMwsXLmTRokUAODo66uwrKCiIkiVLUr16da11zZs3p1q1avk+PxERERERkYLwj57yjoqKokOHDlhYWGBra8vQoUNJTU3VaJOZmcmECRNwc3PD0NAQV1dXxowZQ1pamkY7V1dXWrVqxenTp6lRowZGRkZ89dVX/Pnnnxrt1FOIZ86cYfjw4djb22Nqakrbtm2JjIzUaKsrhzItLY3x48dTokQJDA0NcXFxYeTIkVrH8znYvHkzZcuWxcjICA8PD7Zv364zL1OhUDB79mzKlSuHkZERjo6O9OvXj2VHbyGTSoR2Lxb0ImJzEKnP7/B69Y+ETW/Ly4U/kHjrqNAm8eYRonaopnbfrh9D2JRWhE1pRWrYTY0+0kKvUr9OLYyNjVm8eDENGjQQRuSy4+7ujre3d67nunPnTlq2bClMH7u5uTFhwgTkcrnQJrfp4LxyX+Pj47G2thaCSQA9PT3s7OxyDIZTUlK0Pp954eDggImJCbGxsbm2u3jxIo8fP+b777/PsU1CQoLG+YuIiPz1JKVlcudVHNfCY7jzKo6ktMy/+pBERD6If/QIZYcOHXB1dWXy5MmcP3+euXPnEhMToxEE9u7dm9WrV9O+fXt++uknLly4wOTJk7l37x7bt2/X6O/x48e0b9+eH374gR49erBixQp8fX2pWrUq5cqV02g7ePBgrK2tGT9+PKGhocyePZtBgwaxcePGHI9XoVDg4+PD6dOn6du3L2XKlOHWrVvMmjWLhw8fsmPHjk96fbKyd+9eOnbsSPny5Zk8eTIxMTH88MMPFClSRKttv379WLVqFT179mTIkCE8e/aM+fPnI91/EutOU5HI3n9sMmJeE7ljMmYVmmLm8TWJNw8TvXc2BoVKYGBfDMOiHphXbU3Cld1Y1O6Avq0LAPp2Lu/7ePeCiB3TKFK7NXNGDMHd3R0zMzP69OnD7du38fDwENpeunSJhw8fMnbs2FzPd9WqVZiZmTF8+HDMzMw4duwYAQEBxMfHM336dADq16+vNXUcFhbG2LFjcXBwyLX/hg0bMnXqVMaNG0ePHj2QSCSsW7eOy5cvs2nTJp3Hs2DBApRKJWXKlGHs2LF06dJFZ9+xsbFkZGTw5s0bZs+eTXx8PF9//XWuxxMcHAyQY0Dp5eVFYmIiBgYGeHt78/vvv1OypFhdLyLyVyAaQYj8K1H+Axk/frwSUPr4+Ggs9/PzUwLKGzduKJVKpfL69etKQNm7d2+Ndv7+/kpAeezYMWFZsWLFlIDy1KlTwrKIiAiloaGh8qeffhKWrVy5UgkoGzdurFQoFMLyH3/8USmTyZSxsbHCsgYNGigbNGgg/L5mzRqlVCpVhoSEaBzPokWLlIDyzJkzuZ53jx49lMWKFcu1TU6UL19e6ezsrExISBCWnThxQglo9BkSEqIElMHBwRrbb9+9Vwko7Vr7K4uN2qMsNmqPUmbhoASUjt9PEZY5DwlWItNXWtRoKyyzazNK1a7zJGFZ9j4cOgQpXUftUSamZiiVSqUyNjZWaWRkpPz55581jmPIkCFKU1NTZWJiYq7nm5ycrLWsX79+ShMTE2VqaqrObVJSUpRVq1ZVOjk5KV+/fp1r/4mJicoOHTooJRKJElACShMTE+WOHTu02tapU0c5e/Zs5c6dO5ULFy5Uenh4KAHlggULdPbt7u4u9GlmZqYcO3asUi6X53gsmZmZSkdHR2WNGjW01m3cuFHp6+urXL16tXL79u3KsWPHKk1MTJR2dnbK8PDwXM9RRETk0xIenaTsuuy8stioPcqvxuzVuh9m/VGv77rsvDI8OumvPnQRkTz5R095Dxw4UOP3wYMHA7Bv3z6Nf4cPH67R7qeffgJUo3ZZKVu2LJ6ensLv9vb2uLu78/TpU6199+3bF4nk/fSvp6cncrmcsLCwHI938+bNlClThtKlSxMVFSX8NGrUCIDjx4/nfsIfyKtXr7h16xbdu3fHzMxMWN6gQQPKly+vdYyWlpY0adJE4xjtXEsjMTAmNfymRnt9u6IYubwfQZSZWKJvU4SM2PxXEOtZOmL8VVWUQGh0EgCWlpZ88803rF+/HuX/pVLlcjkbN26kTZs2mJqa5tpn1mnnhIQEoqKi8PT0JDk5mfv37+vcxs/Pj1u3brF161YKFSqUa/+GhoaUKlWK9u3bs379etauXUu1atXo2rUr58+f12h75swZhg4dio+PD/379+fKlSt4eHgwZswYUlJStPpeuXIlBw4cYMGCBZQpU4aUlJRcp6qPHj3K27dvdY5OdujQgZUrV9K9e3fatGnDhAkTOHjwINHR0RrV4P9lxClHkS/BhkvhNJ51krNPowHyNINQrz/7NJrGs06yQZRXE/mb84+e8s4+Zefm5oZUKiU0NBRQTV9KpVJKlCih0a5QoUJYWVlpBX9Fi2q7tlhbWxMTE6O1PHtba2trAJ1t1Tx69Ih79+5hb2+vc31ERESO234M6vPMfh3Uy65evapxjHFxcTlO+cqT4jR+l1lon4vUyAxFamK+jy9r5Xd6pkL4f/fu3dm4cSMhISHUr1+fI0eO8PbtW7p165Znn3fu3GHs2LEcO3aM+Ph4jXVxcXFa7RcvXszKlStZvHgxtWrVyrP/QYMGcf78ea5evYpUqnov69ChA+XKlWPo0KFcuHAhx20NDAwYNGiQEFzWq1dPY33t2rWF/3fq1IkyZcoAMGPGDJ39BQcHI5PJ6NixY57HDVCvXj1q1qzJkSNH8tX+34g45SjyJfkYIwj5/53IRm27RVRimmgEIfK35R8dUGYn64hhfpZnRyaT6Vyu1GEmVJC2ahQKBeXLl2fmzJk617u4uOhc/iVRKBQ4ODgIOXlqQqOS+GXnbWTGFhrLJZIcBrkLYMAk0Xtf2GKg974/b29vHB0dWbt2LfXr12ft2rUUKlSIxo0b59pfbGwsDRo0wMLCgl9//RU3NzeMjIy4evUqP//8MwqFQqP9xYsXGTp0KL1796Zv3755Hm96ejrLly9n5MiRQjAJoK+vT/PmzZk/fz7p6em5Vvmr/9bv3r3LdV/W1tY0atSI4OBgnQFlSkoK27dvp3Hjxjg6aksy5bb/Bw8e5Lv9v4X8eM8rgbB3yay5EMaqc6Gi9/xnIjAwkKCgoFzvmX83QkNDKV68OCtXrsTX1zfP9r6+vuw9dBTTHos+yf5nHHqIvZkhHf/GlrX/xL+ryKfhHx1QPnr0SENb7/HjxygUCqFquVixYigUCh49eiSM8gC8ffuW2NhYihUr9kWP183NjRs3bvD111/nO8j9FKjP8/Hjx1rrsi9zc3PjyJEj1K1bV2PaOCktk99u6PFht4j8nasEcLV9P5Utk8no0qULq1atYurUqezYsYM+ffrkGMyrOXHiBNHR0Wzbto369esLy589e6bVNjIykvbt21OpUiX++OOPfB1ndHQ0mZmZOqehMzIyUCgUeVZTq9MochqtzkpKSorOUVVQ6WEmJCTkWt2d0/7zs+9/E1m956HgU46i9/zfB3XRoFKp5MSJE3h5efHs2bO/hZNYVpLSMolNTif3BJ2CEbDrDnXc7MQXnBw4e/Yshw4dYtiwYR+stevr60toaCgnTpwgMDCQVatWCTOfIjnzj86hzB4AzJs3D1Bp7gG0aNECgNmzZ2u0U48QtmzZ8jMfoSYdOnTg5cuXLF26VGtdSkoKSUlJBe7zyZMnPHnyJNc2Tk5OeHh48Oeff5KY+H4q+uTJk9y6dUvrGOVyORMmTNBYbmqoh4ulYYGmstVIDYwAUKTlfn5FbU0wNdR8x+nWrRsxMTH069ePxMTEPLUc4f3ocdY35PT0dBYsWKDRTi6X06lTJ9LT09m6dWu+dUMdHBywsrJi+/btpKenC8sTExPZvXs3pUuXFoLx7FJSoMrpnD17NnZ2dlStWlVYrivlITQ0lKNHj+aoIblu3TpMTExo27atzvW69r9v3z6uXLlCs2bNcj/RfxHzjz9i1LZbpGUq8gwksyNXKEnLVDBq2y3mH3/0mY5Q5N+IQcMBuPRb8kn7VBtBiOjm7NmzBAUF5Sm1JvLp+UePUD579gwfHx+aNWvGuXPnWLt2LV26dBH0CytWrEiPHj1YsmSJMA168eJFVq9eTZs2bfDy8vqix9utWzc2bdpE//79OX78OHXr1kUul3P//n02bdrEwYMHCyw+rZaTyevtadKkSXzzzTfUrVuXnj17EhMTw/z58/Hw8NAIMhs0aEC/fv2YPHky169fp2nTpujr6/Po0SOur1mPcYMfMHavW6BjNHD4CiRS4s5vQZGWjESmh1GxishMrYQ2MqkEr1LaeZuVK1fGw8NDKGiqUqVKnvurU6cO1tbW9OjRgyFDhiCRSFizZo3WFMyiRYs4duyY8PfIiqOjI02aNNHZv0wmw9/fn7Fjx1KrVi26d++OXC5n+fLlvHjxgrVr1wpt//jjD3bs2EHr1q0pWrQor1+/ZsWKFYSHh7NmzRqNILZ8+fJ8/fXXVKpUCWtrax49esTy5cvJyMjQsmkE1XT5/v37+fbbbzWKrbJfi8qVK1OtWjUsLS25evUqK1aswMXFhTFjxuR5LdV6nCdOnAB0T/npmuJydXWlYcOGrFq1Ks99fG4+tfe8espRIpEwfvx4AgMDP0nfX4Lsf89PSWpqKgYGBhppIH8nkpOTMTH5MqN6SUlJvEpUcCY0FqSf9jGb1QiihIOY36smKSkpz2JNkc/L3/Obn082btyIoaEho0aNYu/evQwaNIjly5drtFm2bBlBQUFcunSJYcOGcezYMUaPHs2GDRu++PFKpVJ27NjBlClTuHXrFv7+/sKxDR06lFKlSn22fbdu3Zr169eTnp7OqFGj2LZtG6tWrcLd3R0jIyONtosWLWLJkiVEREQwZswYRo8ezbFjx+jUuQv6RcrksIeckZlZY9NsIIrkOKL3zSFq13QyojQrFuUKJV1r6Z5OVFsW5qcYB8DW1pY9e/ZQuHBhxo4dy4wZM2jSpAnTpk3TaKcevVu0aBHdunXT+MmrAvqXX34hODgYfX19goKCGDduHBYWFmzZskVj+rlu3bo4ODiwbNkyBg4cyKxZs3B3d+fIkSNa09QDBgzg0aNHTJkyBT8/P4KDg2natCkXL16kTp06WsewefNmMjIyctSzBOjYsSOPHj1i0qRJDB48mAMHDtCnTx8uXbpUoJzLfyof4j2fF/9U73lQGSs8ePBAEPx3cXGhWrVqXLp0CVC9pPj7+1O+fHnMzMywsLCgefPm3LhxQ6MftZ/8hg0bGDt2LEWKFMHExEQogNu8eTNVq1bF2NgYOzs7unbtysuXL7/YeTZs2BAPDw+uXLlC/fr1MTExEV6gIiIi+OGHH3B0dMTIyIiKFSuyevVqrT5iY2Px9fXF0tISKysrevTooXPUy9fXFzMzM548eUKLFi0wNzfn+++/J/hCONF7Z/FiQS+N9vKUeKJ2/074zO8In9WRqD0zSX/7lLAprUi8+b5Q7k3wKN4Ej9LaX9SeWbxc2Iu159/fQ3Myo8haJKq2iNX1k598UF2cPn2a6tWrY2RkhJubG4sXL9ZqExoaikQi0flyKZFINF7IwsLC8PPzw93dHWNjY2xtbfnuu++0BkzUphQnT57Ez88PBwcHnJ2dCQwMZMSIEQAUL15cOL+s269du1b4bNrY2NCpUyeeP3/+Qecvosk/coQyMDBQ+BBu3rw517Z6enoEBATotLXLSk4jfNnf5H19fXV++Ro2bKg1AqZrFEBfX5+RI0cycuTIXI9HF7q+kAXJ6+jYsaNWJfC4ceNwdnbWatunTx/69Omjtbzb8gucfRqNXKHE2W+Fzv0U+l57NM28ojfmFbXdbZz9ViCTSqjzlW2Ob9sGBgZIJJIC5QnWqVOHc+fOaS3P+jfK+jn6ELp06ZJrMAcqD++cRjqzU9Dj6devH/369cu1zcSJE5k4cWK++8zOh/rRP3jw4G8xUvUh3vN5oZ5yTElJQU/vn3MLffXqFWFhYcTFxQk2oZcuXWL58uVcunSJ6tWr8/TpU3bs2MF3331H8eLFefv2reBcdffuXZycnDT6nDBhAgYGBvj7+5OWloaBgYGQ31i9enUmT57M27dvmTNnDmfOnOHatWtfzEM+Ojqa5s2b06lTJ7p27YqjoyMpKSk0bNiQx48fM2jQIIoXL87mzZvx9fUlNjaWoUOHAqr7xDfffMPp06fp378/ZcqUYfv27fTo0UPnvjIzM/H29qZevXrMmDEDExMTlj2I0KpNVCoVRG75lbRXDzGv3AJ9W2eSH10gau+sAp2bUgnHH0YQiMpwIyczimvXrnHmzBn09fVp166dltLHlStXmD17dp5GDrq4desWTZs2xd7ensDAQDIzMxk/fvxHvaheunSJs2fP0qlTJ5ydnQkNDWXhwoU0bNiQu3fvao0w+/n5YW9vT0BAAElJSTRv3pyHDx+yfv16Zs2ahZ2dHfA+V/23335j3LhxdOjQgd69exMZGcm8efOoX7/+F/1s/lv559wNRT6KjIwMJBIJaXKV1mN6poLrF89w48aNAgUck9qWp/GskwXOQ8sNPamESW3L61ynVCpZvnw5DRo00CnrJPJ5+VA/+qyWlH8Vn9t7/kV8BiUcjPLe4G/C6NGjefv2LRcuXBBSa6pWrcry5cuFnN/y5cvz8OFDjZeBbt26Ubp0aZYvX864ceM0+kxNTeXy5cvC9hkZGfz88894eHhw6tQpYfajXr16tGrVilmzZhEUFPTR55L1xV7XyzzAmzdvWLRokcZL15w5c7h37x5r164VXlD79+9PgwYNGDt2LL169cLc3Jxdu3Zx6tQppk2bJox4DRgwIMc0qbS0NL777jsmT54MQGJaJgGBB7XapTw8T9rL+1h/3QeL6t8AYFalBREbxpJRwGsQHp1MUlom1y6dZ9myZQQHB2u84Hp5edGsWTM2b95Mly5dqFChAhUqVBDWR0VF8csvv1C+fHnGjx9fwL1DQEAASqWSkJAQ4d787bffamkbF4SWLVvSvn17jWWtW7emdu3abN26VWuWysbGhqNHj2oUalapUoX169fTpk0bjSKtsLAwxo8fz8SJEzXSfdq1a0flypVZsGCBsDzr4M3HDjz8l/jrhxBEPjuP3iYwYtVxzAsVo8jX3an/w1gatO/JD53bIzO1Zm9GOQJ33eHR24Q8+3KxMSHIp1ye7QrCrz7ltCoWk5KSWL9+Pf369ePWrVv8+OOPn3Sf/yVu3ryJRCJh165dwrIrV64gkUi0clKbN29OzZo1hd91+dHnB1dXV42R/IJOpW7atImgoCCKFCmCubk57du3Jy4ujrS0NIYNG4aDgwNmZmb07NmTtLQ0nccQfCFcw3s+O5lxEUQfXMDLJf0In9GO57M7E7l9Mpmxb/M8P5lUQklHi4+arjtz5gzDhw/H3t4eU1NT2rZtq7OIasGCBZQrVw5DQ0OcnJwYOHCgxtTroEGDMDMzIzn5/TS8Wqy92TffYufgSGxiCjt27MDa2hp/f3/hWlevXh2AXr16IZFIMDIy4s8//9TwuS9evDhpaWkEBARo+dz36NFDQw3i8uXLRERE4Ofnp5FK07JlS0qXLq1lJvE5MTQ0pGfPnhrL9u3bR6FChejcubOwTF9fnyFDhpCYmMjJkyeFdnp6egwYMEBoJ5PJBPMMXWRtGxadpFMRI+XpFZDqYVbp/WyNRCLFvEqrgp6eYASRkxlF1apVMTMz02mYIZfL6dy5MwkJCWzfvr3AuYdyuZyDBw/Spk0bjRf9MmXK4O2tPROVX7J+ljIyMoiOjqZEiRJYWVlp6CWryY/qh5pt27ahUCjo0KGDxnUqVKgQJUuW/GzGIv8lxBHKfzFZNfck6clI7d1IvHkIeXIcUn0jjN2qYdXQl1dp+gXS3OtUvShRiWmfpNBhRFN3nZpqkZGRdOnSBSsrK8aMGYOPj89H7+u/ioeHB1ZWVpw6dUq4jiEhIUilUm7cuEF8fDwWFhYoFArOnj2bLy3OglLQqdTJkydjbGzMqFGjePz4MfPmzUNfXx+pVEpMTAyBgYGcP3+eVatWUbx4cZ0pLccfROQ6kp72+iFpL+9hWqY+MnNbMuMiSLy2jzfrRuPUZwFS/ZxHH3X1W9DpusGDB2Ntbc348eMJDQ1l9uzZDBo0iI0bNwpt1AVPjRs3ZsCAATx48ICFCxdy6dIlYSqzY8eO/PHHHywL3sI7x6qCWLs8I5UX+/dhVv5rKozZSnx8PJb2hUlJV0lalSlThl9//ZWAgAD69u2Lp6cnCoWChw8fsnbtWiQSicbIX/HixXn27JnG9GhW2TZ4b6Lg7u6udX1Kly7N6dOnc7ymn5oiRYpojbCHhYVRsmRJrXQMtayc+vjDwsIoXLiwVrGbrvMCVWpV1tShrAYNWcmMj0BmZq312dKzLpyPM9ImPVORpxmFLvUItenD3r17cXNzK/B+IyMjSUlJ0TIXAdU1UrvUFZSUlBQmT57MypUrefnypcbnT5d0WvbPX248evQIpVKp85hB9WIh8nGIAeW/lOyae0oDE+zb/Jxj+4Jq7g3yKomdmaGwj4JMgcukEvSkEn71KZejQK+rq6sojPuJkEql1K1bl5CQEGFZSEgIbdq0YefOnZw9e5ZmzZoJwWVW+9FPRUGnUjMzMzl58qRwk4+MjGTDhg00a9ZMeFj5+fnx+PFjVqxYoRVQJqZlEp5H4YyxW3VMS2u6FJmUqMGbNf4kPziLmUejPM8ra+BQ0Ok6W1tbDh06JGjSKhQK5s6dS1xcHJaWlkRGRjJ58mSaNm3K/v37hWtXunRpBg0axNq1a+nZsyfFylbBxNqe0b8vptC3vwjfxZQnl1FmpGJSxlMYLUtMy+TGi1i6Lb/ApLblad68OQEBAdSuXZuuXbsyceJEfvvtN3r16kWTJk2wsbFBKpUyZMgQnj9/jpOTE3PnzhXsS7OOKP3d+JLHZmhoqPHZzmrQ8MFIJLoNIpTvP3MGetIczSjUZNeb3bFjB1OnTmXChAlfRDosJ81lXVq9gwcPZuXKlQwbNozatWtjaWmJRCKhU6dOWoYUULC/sUKhQCKRsH//fp2jmjkpZYjkHzGg/BfypWy+OlUvSl03uzydR9So19f5ylZ0HvnCeHp6MnbsWEFa4/Tp00yaNImwsDBCQkJo1qwZISEhSCQSLSvIT0HWnEq5XE5sbCxmZma4u7vrnMrq3r27xohBzZo1Wb9+Pb16aVbM1qxZk7lz55KZmalRIJPTlGNWpPrvj0kpz0SRnoyedWGkhqakv3kC+QgoY1Pe65Bmn66Lj4/XmK7LHlD27dtX42Hr6enJrFmzCAsLo0KFChw5coT09HSGDRumEaz06dOHMWPGsHfvXow9vmb8rjvolahDwrUDZKQmIzVQHUfyvVPIzG0xdC4HKJEYmqDMSAXevzh2L6H5UN+yZQteXl5aahlhYWGkpKRw+PBhChUqJASU2VGbKDx48IBGjTSv34MHD764mUR2ihUrxs2bN1EoFBrXVH0+6uMrVqwYR48eJTExUSPQyK+7lKutqU47Bz0LB1LDbqHISNUYpcyMea3VVmpkRmbsG63lmXGqEUe1EUROZhS6ePjwIT169KBNmzb5kg3LCXt7e4yNjXn0SFuXNfs1UtsSZ6+Qz259DKrPX48ePfj999+FZampqQXSlMwpgHVzc0OpVFK8ePHPqqjyX0bModSBOn8oa+7Th+aS5cbn6PNTa+5tvBSeaxt5fARre9eik8F1utUsRjFbE60bqQQoZmuCy9M9hE1pxZofagrBZPZcO5HPg6enJ5mZmZw7d44HDx4QERGBp6cn9evXF0YuQ0JCKFu2LDY2Np98/wqFglmzZlGyZEkMDQ2xs7PD3t6emzdv6pzKyl6AZWlpCWjbk1paWqJQKLT6yGnKUeOYMtKIPbWWF3/4Ej69LS/mdOHF3O9RpCXlKcKvJusLVEpKCgEBAbi4uGicY2xsbL7OUf3gVUu95DR9bGBgwFdffcWl2w8EsXaT0p4oM9NIeaTykFekp5Dy5Aom7vX+nwspxaRkLRQpCSjSUwSx9vnHVU5Z6tkAmUymNTPQt29fkpOTKVGiRJ4+99WqVcPBwYFFixZp5Lbu37+fe/fufXEziey0aNGCN2/eaKQVZGZmMm/ePMzMzGjQoIHQLjMzk4ULFwrt5HK5YJ6RF6aGehTV8cJsVLwKKDJJvP6+YEepVJBwdY9WW32rwmREv0Ce/P6zk/72KWkv7wHvjSByMqNQn5s6GEtMTKRt27YUKVKE1atXf5Rbm0wmw9vbmx07dhAe/v4Zce/ePQ4e1CxGsrCwwM7OjlOnTmksz240oe43++dv3rx5eTqPZUWdD5o9CG3Xrh0ymUynLaRSqSQ6Ojrf+xDRjThC+S/ic2nu6bL5SkrLJDQ6idCXqpudhbE+Y3zKEUg5YV16pgIDPSmutqaYGuoRGHiSk5/06ETyS7Vq1TAyMuLUqVMULVoUBwcHSpUqhaenJwsWLCAtLY2QkJAcHXc+lkmTJjFu3Dh69erFhAkThKnUYcOG6ZzKyinRPqfl2R8QS+dMJWzmVIqN0n5Qq4k5vJjEW0cwr+aDYZHSSA1NQSIhaue0fHvRZy36Keh0XX7PReexJ6fzJj4DdeadYZHSyCwdSbp/GtNyDUl5fBFlZhqmZd6nL1g16E7S3VNkRDzl3ZGl6Nu5kPZaNcIUcu8lPYFWrVrx66+/0rNnT+rUqcPhw4fZvHkzBgYGOkejsqOvr8/UqVPp2bMnDRo0oHPnzoJskKura47FdRKJhIEDBzJ//vxc+1dL43yozWLfvn1ZvHgxvr6+XLlyBVdXV7Zs2cKZM2eYPXs25uYq6bLWrVtTt25dRo0aRWhoKGXLlmXbtm05WqDqwsvdgavZYjaTUrUwKFyKmGPLyYx5rZINenwBecr/zSWyBHlmFZoQf2kHERsDMKvQBHlyHAnX9qNvVxRlerJgBJGbGcXmzZuZM2cO7du3JygoiLt37zJ27Fh27typcVxubm7Url0bUFXQr169Os9rHBQUxIEDB/D09MTPz08IzMuVK8fNmzc12vbu3ZspU6bQu3dvqlWrxqlTp3j4UHvgo1WrVqxZswZLS0vKli3LuXPnOHLkCLa2tvm97IL72C+//EKnTp3Q19endevWuLm5MXHiREaPHk1oaCht2rTB3NycZ8+esX37dvr27SsUrIl8GGJAmU8+VI/vS/I5NffW/FCTR28TCL4QLiT9K0GoiJ1x6AEHZcfxcnfg+5pFKedkqdXX2LFjGTVKW6hX5PNjYGBAjRo1BIkPdZ6kp6cnaWlpBAcH8/btWw3v809JTlOpsbGxglbcp8TKOG+5o6QHZzD1aITN172FZcrM9ALZi2bdz6eYrstK1unjr776Slj+5E0sz8PCMHKtqNHetHQ94i/vQpGWTNK9EGSWjhgWKS2s1zO3w6CQG5mxb0m6ewJFWjIyYwsA9t2NVBXxjRlDUlIS69atY8OGDSgUCsqVK0dCQoLGSFRu+Pr6YmJiwpQpU/j555+FCvapU6f+5Tp/xsbGnDhxglGjRrF69Wri4+Nxd3fXcH4CVd7xrl27GDZsmFCg5OPjw++//07lypXzta/vaxZlRrbbsUQqw+G78bw7soTE20dBIsWkVG0s63bh7doRSPTep3no27lg2+pH4kKCeXdsGfq2RbFrPZykOydJDb+lYQSxaNEiqlatyuLFixkzZgx6enq4urrStWtX6tZVOZupFQR0ycT16NFDCCgTExMxNjbO829VoUIFDh48yPDhwwkICMDZ2ZmgoCBev36tFVAGBAQQGRnJli1b2LRpE82bN2f//v1ahURz5sxBJpMRHBxMamoqdevW5ciRIwWqHK9evToTJkxg0aJFHDhwAIVCwbNnzzA1NWXUqFGUKlVKQ77KxcWFpk2bioWfnwAxoMwnH6rH96X43Jp73y48w5Xw2BzzJJVA2LvkXKvF9fT0/lFC0P82PD09mTlzJk+ePOGnn34CwM7OjjJlyjB16lShzedA11TW5s2befnypZbY8qcgP0UREol2m/gruzWKHgqyn08xXZeVxo0bY2BgwNy5c2nWrJkwRdnFfxKKtCSM3aprtDcp40n8ha0k3jpKytMrWFTTfkBKZPro2zoL5gMZ0c95tXQAmWkpwovjjBkzmDp1Kk2bNuXOnTscPHiQpUuXauhH5qT9qKZDhw506NAh1/P7nPp+uVlLOjg4sGKFblOGrNjY2PDnn39qLc9+3qtWrdJpOlHS0Zy2w34TjCDUyEwssfcZodE2+aHKhEFmrvlyZVbOC7NymtqXZm5VdRpB5GRGkddxZickJISBAwfmK/ivX78+ly9f1lqe/e9qbGzMsmXLWLZsmcby7NfSyspK598mu/RWTgYjasaOHcvYsWN1rmvXrh3t2rXLcVuRD0fMocwn2fMds+rl/fbbbzg7O2NkZMTXX3/N48ePtbZfsmQJbm5uGBsbCyNF2UlPTycgIICqVatiaWmJqakpnp6e+dLHyklzLz3i2f+tun4gbHpbns/rStTe2chT4vN13srMdGJDgtn1SwfCprclbE5XIrb9RoaOJPKE6wcIX/ADYdPbsHlcN+qNWMqGLDmYauuvvIiNjWXYsGFCLlqJEiWYOnWq1rThhg0bqFq1Kubm5lhYWFC+fHnmzJmTr/P6L+Lp6UlKSgrPnz/XCBzr16/Pw4cPcXV11ema9Clo1aoVJ06coGfPnixdupQhQ4bQv39/jZG3z0FuOpTGJaqTdPsY744sIeH6AaL2zibh8m6k/x+1U6NUKlFkaGpd6upXPV03bNgwlixZQs+ePZk7d26BpuuyYm9vz+jRozlw4ADNmjXjjz/+oHvv/lxc9zsGhUtimi3QMCxUAj3rwsSe+hPkGZiUyfvlQM9KVYQUd3U/+7auY/bilTx79kzwuW/bti3Hjx8XRpzWrl3L4cOHP+h8/o4kJeUvV/ZDmdS2PHrZPivZP0tKhZyEK7uRGJpg4Ji3hE9uRhAfy507d0hJSeHnn3NWBBERyQkxoPxIpkyZwvbt2/H392f06NGcP39eyyJw+fLl9OvXj0KFCjFt2jTq1q2Lj4+Pln9ofHw8y5Yto2HDhkydOpXAwEAiIyPx9vbm+vXruR5HTpp7qc+ukRn7BtMKjbFp0g/TMvVJvhdCxKbAPHO1lAo5EZuDiDuzHoNCJbBp9APm1XxQpiWREalZoZd89yTxF7ZiVqkZVvW7kRH7lpebJ/Lz5mvMP5537pXQT3IyDRo0YO3atXTv3p25c+dSt25dRo8ezfDhw4V2hw8fpnPnzlhbWzN16lSmTJlCw4YNOXPmTL739V+jTp06yGQyzM3NqVjx/XRp1unvz8WYMWP46aefOHjwIEOHDuXq1avs3btXq8jmQ2ncuLFOP+Gs3wmlQk7smfW8XNSbsOltSAm7ib5dUZLunCDm2HLkie9w7DQRRWoiqWHXSXl6hderhhE+ox2J1w8AoEhN5N2RJYTNU1nwzZ07V3jZmTNnDt27dyc4OJiffvqJ8+fPY2hoSHR0NBs3btTyVgZVUVqrVq0Eiz+Azp07CyNjgYGBzJ8/n/DwcH788Ue2bd2CReVmOHacgESmPdpvUqY+yvQUJPqGRG75lbDpbXi5qDexZ9ajVGiPlEpketi2Go5EKuXdwT/4sX8vli5dKnjZq33ut2/fDqDlc58fX+RHjx7x7bffUqhQIYyMjHB2dqZTp0468xF37NiBh4cHhoaGlCtXjgMHDuT0J9dg//79eHp6Ympqirm5OS1btuTOHc188pw8tz8nuowgYg4vJnLXdOKv7Cb+wjbeBo8iNewmlrXaaygP5IQuI4hPRbly5YiPj89XGopaPP9aeAx3XsWRlJb5WY5J5J+DRCmK/WmhK/FbPTqpnkpRJy6XKVOG69evC1Pic+fOZejQody6dQsPDw8yMjJwdnbGycmJCxcuCO2WLl1K3759adCggdCnXC5HLpcLbVxdXalTpw7Hjh2jZcuWWvlnahYtXc6Avr0p0n85elaaPqqKjDStm1TS3ZNE7ZqO4/dTMHLxyPE6JN48TPS+OVg36o1FjTYa65RKJRKJhMzYt7xc9ANSYwuc+i1BZqSS2Eh+dIHIrROwbx+ASYkaTG1Xnnt7V2hV2Lm6utKwYUNhKmbixIlMmTKFa9euaQjQjh49munTp/Ps2TNcXFwYNmwYK1eu5N27d/l2SigIJ06cwMvLi+PHj3/ySnyRT8etW7eoWbMm9vb2DBgwgMzMTObPn4+joyM3b96k67LzwpRj1J5ZJN0+iol7XYyKVSDt1QOSbh/DuGQtHL59Pz32YkEvJDIZipQEzCo1Q8/SEX2bIhg4leLNn/7IE99RpuE33Nm/hkqVKnHjxg2GDBnC7NmzhT769Okj3EeqVq0qeCuXLVtWECQH1effyMiI2NhYfvjhB5ycnFixYgXXrl3j1q1blCunGYw0mH6csDz0NSO2TkQi08egcEmkBkakht0k+f5pLGq0w7pRr1y3tUt/w92Fg3O8nlm/u1l9kRs0aCD4IpuZmQm+yOnp6ZQuXZq0tDT8/PwoVKgQL1++ZM+ePWzevFnIE5VIJFSsWFFw2TE3N2fu3Lm8efOG8PBwYZRX1715zZo19OjRA29vb1q2bElycjILFy4kNjaWa9euCe18fX3ZsGEDzs7O1KtXj9q1a2NiYqIl5/Q5yCrllnTnBPEXt5MR+xplZjr61k6YVW6ORdXWefYzoqk7A70+fYpIftGVR69GAhS1MRHy6Es6mufUjci/FDGh7SPp2bOnRn6lepTn6dOneHh4CFZkv/76q0Y7X19fwSNWjUwmE4IjhUIh/FSrVk2nVp+a6ETd1nOQTWsvMx1FegqGTqpE/fQ3T0Ch4O36MRTprwpWXy76AcfOkzAqVoHkB2eRGltgXk37Rpd96tqkjKcQTAIYuqgehGodtYBdd2iRnrdb7fLlyylUqBDW1tZERb3PCW3cuDFTpkzh1KlTfP/991hZWZGUlMThw4e/iDhvXjRs2BBXV1dWrVqFr68voaGhueZxiXwa8vITVnvPp7x+QtLto5hVbIpt8yEAmFdpiczEiviL20gNu4lRsfc+x5kxr3HoEITxV1WFZbFnNpAZ+4Zifeaxon8Dau5fQ79+/QgLC2P69On89NNPuLi4cPr06Xx5K6t58OABp06dEu4dHTp0wMXFhZUrVzJjxgyhXX7E2gHsfEZofO/NK7cg+sB8Eq7txap+N43Cj+zc270sX/7M+fVFvnv3Ls+ePWPz5s0aou+6nI3u3bvH3bt3BecWLy8vKlasyPr16xk0aJDO401MTGTIkCH07t2bJUuWCMt79OiBu7s7kyZN0lie3XP7S5HVCEJW3gvTcg3zvW1+jCA+N1ld1z4mj17k34045f2R5FdLLrvdk76+vs78sdWrV1OhQgWMjIx4/vw5GzduZO/evbnKVeRW2S1PSeDd4cU8n9uV8BnteDH3e14u+gEARVruD6eMWJWshUSa9wignoWmG4M6uFRXzGYqlBy9l7dH8vPnz3ny5An29vYaP40bNwbe24j5+flRqlQpmjdvjrOzM7169cr39Fh+qF+/PikpKZ+t6lnk48mPn7B6yjHlqapwwKK6piySRQ3V7ylPLmks17N01AgmAZLvn8bQpRzeNjEEjBiMRCKhUqVKNG7cGLlcLujsFdRbuWzZshrpBvb29ri7u/P06VONdvkRawfNl0hFWjLy5DgMXcqhzEgjI/p5jtspFXJSnl3Dy7tlnv7M+fVFVuuHHjx4UMNrXBeNGzfWsAGsUKECFhYWWtchK4cPHyY2NpbOnTtrHIdMJqNmzZo688+zem5/STpVL8qRHxtQ5yvVaGtu+b1Z19f5ypYjPzb4y4LJDZfCaTzrJGefqnQa83JFy+66tiEPLWORfw/iCOVH8jFactlZu3Ytvr6+tGnThhEjRuDg4IBMJmPy5Mk8efIkx+2yJ31nJWrHFNJe3seiZjsMHIojMTAGpYKITeMLVM2aJzoqZgFBz0+uUOZrdEV93XJK/Fc7HDg4OHD9+nUOHjzI/v372b9/PytXrqR79+6sXr1aq8/U1NQC2XRJpVKMjHL2claTnJys5dEs8mXIr59wp+pFmW+RzhmJVMszWWZmjdTQVHAfUZM9dQRUo5YZkaEsnnhFWKaWWoH3LzsF9VbO/lIKqhfT7PmW+RFrB0iPDCP21BpSw2+izPbSmNtLpCI5HmVmGs7FtP2Rs/sz59cXuXjx4gwfPpyZM2cSHByMp6cnPj4+dO3aVQg21eT3OmRFrY2Z3ZVHjYWFZoFVds/tL42LjYmmBNvDCMKjdUwd25rgVcqBrrWKalVzf0myTtUnXNuPRCrDrGLTfG1bENc1kX8HYkCZD06fPs3Vq1dJTEzEzc2NkSNH6my3cuVKli5dCqhyqKZNmyY4Qzx69IhGjRrRqlUr7t69y4MHD3j27JlGccSQIUMwMDBg27ZtSCQSIb8wNTVVaHPnzh0GDx7MuXPnsLW1pX///tjaaz/8AOSpiaSG3cCy3vdY1essLM949zJf561vVZi0Vw9Ijwgl7uwGUsNuosxIRWZhj4l7XawbdBfaJj84S+KNg8jjI5HoGWpMHwr8P1gsWbIkz58/x9TUlKSkJF69egWo0gDUldxNmjTJsplqO7XX8dKlS3ny5AmWlpa0adOGKVOmMH/+fPz8/Fi8eDFHjx6lUqVKDB48mF9++YXbt28zZcoUhg0blq/zBt05lA0bNiQqKorVq1fz448/cvnyZfr27auROyfy98TDyZKzEjDUlyEnd4tQAIne+1E+9ZSjnhQaNmmS4/df/bJTUG/l/L6U5kcKSZGayNt1o5EaGGNV73v0rAsj0TMg/c1jYk+sytdLZF4jZ1AwX+Tff/8dX19fdu7cyaFDhxgyZAiTJ0/m/PnzGsHdh7ycq+8Xa9asoVChQlrrs8uUZfXcDgwMJCgoiMjIyM+ihZqdrOLtJR3NCczDCOKvJrvrmr5NEd5uHIfM0gFj10oF6mvGoYfYmxn+ZaOsoaGhFC9enOnTp4vi5Z+Rv/5T+zfn1q1bNG3aFIVCgaurKz179mT8+PGCvVNWFi5cKCSZd+zYkcjISGbMmIGZmRmLFi2iZ8+edOzYke7duxMYGKgheBwWFkZMTAw2NjZCwQuoRmHOnTtH0aJFefPmDV5eXmRmZjJq1ChMTU1ZsmRJjiNv73X2NG/I8Zd35evcTdzrkPLkEq9X/4jUwBizSt7oWTqSGfOalMcXNQLKzPgIzCt6IzO3JTMugsRrqtEMpfx95V9quEp6xMvLixo1ahAfH8+4ceMEy6t+/foREhLC06dPGTFiBBUqaAalPXv2ZN26dfTs2ZNevXoRGRnJ/PnzuXbtGmfOnBHaK5VKHjx4QOfOnenXrx99+vTRsq/7UKKjo2nevDmdOnWia9euODrqDuZFPj8F8RMuVqwYSoWCRa2cWHk3Q8gFS094hyItCT1L7dHE7N7zzba5kZiYKKRf5ERBvJULgtofOrdQODX8FoqUeOzbjsGo6PuCO12e0NmRmlgg0TMk6qX2FGX261lQX+Ty5ctTvnx5xo4dy9mzZ6lbty6LFi3SKbJdENRT5A4ODnn+Xf6umBrq6TSC+CvR5bpmVKwClnU7827/PAr/8AdSg7xncLKSk+taQUlOTmbatGk6rYv37dvHxYsXP5u+qUjuiDmUeaBO+q9UqRJFixZl7NixHD9+XEtoFeDkyZNMnz4dUOUDHTx4EG9vb4yMjLh+/TqNGjXi9evXyGQyfv/9d40cyk2bNiGRSHj37h1t27ZlyZIlxMTEcPjwYcqWLQvA1KlTiYyM5MCBA4wfPx5/f3/OnDkj5GlKs40sSA1NMHTxIP7CVmJOrSHh6j4itk4k7cVdoY1RsQoUG7UHPStH9KwcKTZqjzC6aOrRCImhKcgzMChSGj1zOxRpSaRHPMWynqbchkX1Nlh5fo95pWZYN+iOw3eBABo5WxkxqpHIWfMW0Lt3b4YPH469vb2Q8F+7dm1hZHLWrFmcPHmSxMREfv/9d5o3b86ff/7J/PnzWbJkCadPn+bcuXO0bduWS5cu0aFDB3755RcqVaqEvr4+jx8/Zv369UyePJl+/fp9skrtN2/eMGHCBObOnUvfvn355ptvANWIprpSfdWqVWJBzhegIH7CLVq0AGDjqsWs+aEmh4fVp1vNYnBrL4CWSLixgYxuNYtx5Mf6gvd8hw4dOHfunFbfoNJOzcxUvTzl11u5oOTkD62BjpdIpTyDhKv7dLfX2FSGjXs19uzemef1zK8vcnx8vHBd1JQvXx6pVKrh9f2heHt7Y2FhwaRJk8jI0C76U7vDiBSMnFzXLOt0RM/WWaV1WkDUrmsfS3JyMkFBQTrvsfv27dMQ4Bf5sogjlLmQNen/9ev3Qt5lypShevXqXLhwQaN91tGI5ORkoqKiaNCgAQcPHuT3339n/vz5BAQEYG5ujoGBgcZ0z8aNG6lVqxatW7dm8eLFHDx4EKVSSf369XF2dubEiRPs27ePWrVqUaNGDWE7e3t7vv/+exYsWIBCodR6Q7Dz8efd4cUkXtmDEjAuXhmHDkG8nN+dvFCkJqJMS8KgcEkyI8N49/QqMmNzDJ3LYuConWcFqhFJRXqykKsmT3yf/ySRqarcT166SYt6VXRur56iGjFiBJs3b+bPP//EwsICfX19jIyMaN26NVFRUfj4+PDnn38KhTiHDx+ma9euBAYGUqtWLYoXL14gu678YmhoSM+ePT95vyIfRn79hCtWrEiPHj1YsmQJsbGxNGjQgNCLF3lxYgOtfL5hygw/YcqxxTpjyn9lS2A2/cARI0awa9cuWrVqha+vL1WrViUpKYlbt26xZcsWQkNDsbOzy7e38ofg5e7AmgthOU7ZGzqXQWpkRtSeWVhUaw1ISLpznNzHNVXIpBK+6zucVT9/n+f1zK8v8rFjxxg0aBDfffcdpUqVIjMzkzVr1iCTyfj2228/6BpkxcLCgoULF9KtWzeqVKlCp06dsLe3Jzw8nL1791K3bt08/cE/Jx+Sv/0xJCUl6Zw9Kwi5ua5JJBIcO3xYwKZ2XXsckfCX5oWKfD7EEUod+Pr6olQqMTU1FZL+T5w4ofFGVKdOHQCNB8OZM2fo3bs3JiYmDBw4EHt7e0FSo3379jx9+pTU1FQWLlxIREQEkydP5sSJEzx58oQrV67QsWNH4QadmppK4cKFcXZ2ZtWqVYSGhhIWFpZjAQJAdVdrrfwnPXM7HNr9gsuPGyn640bs24xCz8yGYqP2YOWZu6iveprMrFIzigxYTrGRO3AevAb7tqPRt1LlK+lZOeLy01aUacm8+MOX8OlteTGnCy/mqvrWt3svXG3XajhSQ1NaelalfPnywgNalx3YpEmTePToEWlpaURGRlKpUiVSU1MpUqQI9vb29OrVixMnTgjSQl9//TWLFi0S8qiKF9cd8H4sRYoU+dvbcP6XUPsJ29vbExAQwIoVKq3Ttm3barVdtmwZQUFBXLp0iWHDhnHs2DFGjx7Nlk0bKedkSeWi1pRzsiQnMycTExNOnjzJiBEjOHHiBEOHDmXKlCk8evSIoKAgjSKTRYsWsWTJEiIiIhgzZgyjR4/m2LFjGt7KH8L3NYvmmv8pM7bAvv14ZGbWxJ5aS/zFbRi5VsLaK++XILlCyU+dmuT7eo4aNYqtW7cilUoJCgrC39+fXbt2afgiV6xYEW9vb3bv3s3w4cMJDAzEzMyM/fv3U6tWrQ++Dlnp0qULR48epUiRIkyfPp2hQ4eyYcMGKlWqlK+Xv6ioKDp06ICFhQW2trYMHTpUI28dVPnxjRo1wsHBAUNDQ8qWLcvChQu1+lIL1R88eJBq1aphbGysIbQPEBwcjLu7O0ZGRlStWlVQB1ATFhaGn58f7u7uGBsbY2try3fffac1K7Zq1SokEgknT57Ez88PBwcHYZAiv33oIifXtbyIDQkmbEorMt69JGr3DMJndeD5nC7EnlqDUqkkMz6SyK0TKOdamEKFCml43kP+nOJCQ0OFHOSgoCAkEgkSiYTAwEB8fX35448/AITlupzZ1K51hoaGVK9enUuXLmm1uX//Pu3bt8fGxgYjIyOqVavGrl3vU8ViY2ORyWTMnTtXWBYVFYVUKsXW1lZj1H7AgAEa+b0FEfr/pyGOUH4injx5wtdff03p0qWZOXMmLi4uGBgYsG/fPmbNmqVhG9i6dWtMTEzYtGkTderUYdOmTUilUr777ruPOoYR3qXpuTU0z4KDT03M4cUk3jqCeTUfDIuURmpoChIJUTunCYU4AEZFPXDqv4x+xaK5c1Gl1Tdr1iwWLVpE7969c91HQQsdPteIwJcaaRDJP/n1E9bT0yMgIECnBmJWcnvompmZMWnSJCZNmpTnceXlrZzbvnJKmSjpaI5nCTstf+isGDmXoXD337WWFxu1J8fjkEklgj90CYf8XU/I2xe5ePHiORoyZCWnwpv8ejjryqfLTk5e1h06dMDV1VUoFJo7dy4xMTEaPt4LFy6kXLly+Pj4oKenx+7du/Hz80OhUDBw4ECN/nLL3z558iQbN25kyJAhGBoasmDBApo1a8bFixfx8FDlvF66dImzZ8/SqVMnnJ2dCQ0NZeHChTRs2JC7d+9qqUr4+fkJLwBqK8mC9pGVnFzX8kvkjqno27lg3cCXlCeXiDu7EamROQnXD2BUrAJFm/XGMeIy/v7+VK9eXZBmUzvFde7cmT59+pCQkMDy5cvx9vbm4sWLVKpUCXt7exYuXMiAAQNo27at8NmrUKGCUOB5+PBh1qxZo/PY1q1bR0JCAv369UMikTBt2jTatWvH06dPBWWCO3fuULduXYoUKSLUKmzatIk2bdqwdetW2rZti5WVFR4eHpw6dYohQ1S6tqdPnxbS1u7evSuYEoSEhAiyYOnp6Xh7e5OWlsbgwYM1hP5jY2O1lA/+aYgBZS4UJOl/9+7dpKWlsWvXLg35C106aKamprRq1YrNmzczc+ZMNm7ciKenJ05OTrkeT7FixXI9FicrY4J8yjFq28fnqQDo/X8UMrvNYnaSHpzB1KMRNl+/DwqVmemCBqVGn8bm/OjXHtMfB5KYmEj9+vUJDAwUAsqcvL4/V6GDiMg/DbVY+6d8cfyc/tB/d4oXL87OnTsBGDhwIBYWFixYsAB/f3+h0O/kyZMa951BgwbRrFkzZs6cqRVQPn78mAMHDuhMubl9+zaXL1+malWVxmmnTp1wd3cnICCAbdu2AdCyZUutlIjWrVtTu3Zttm7dquXsY2Njw9GjRzWq5Avah5r8iufnhqFTKWybqYTozSp583LhD8QcW45Vwx5Y1mpPJrBx4VhKFi/KihUrhIDS2tqa0NBQjRmgPn36ULp0aebNm8fy5csxNTWlffv2DBgwgAoVKtC1a1eNfZcqVUpIf9JFeHg4jx49EvSi3d3d+eabbzh48CCtWrUCYOjQoRQtWpRLly5haKhSe/Dz86NevXr8/PPPwmi9p6cnW7ZsEfoOCQmhXr163L9/n5CQEMqVKycEl3379gUokND/PxFxyjsXCpL0r/4yZ33TjouLY+XKlTr77tixI69evWLZsmXcuHGDjh075nk8LVq04Pz581y8eFFYFhkZqTFq16l6Ufyb5l11mR9kJpYYuniQePOwlk5f1vOU6NCgjL+yW0uiRJ4ST1FbE0ESw8zMjBIlSmgk56vzf7IXLnyuQgcRkX8auvyhP5bP6Q/9dyd7QDh48GAADd3NrMFkXFyckB//9OlTranK3PK3a9euLQSToNLeVAc0crlca18ZGRlER0dTokQJrKysdDqm9enTR0tyqaB9qMmveH5uZNWplEhlGBQqASgxq6AquFQCsXJ9LfF+mUwmBJMKhYJ3796RmZmZp1NcQejYsaMQTIKmsx3Au3fvOHbsGB06dCAhIUEQyo+Ojsbb25tHjx7x8uVLYdu3b98KAzohISHUr18fT09PQkJCANWopVKpFPZTEKH/fyJiQJkH6ooxT09Ppk6dym+//YaXl5eWx27Tpk0xMDCgdevW/PHHH0ydOpWqVavmKG7cokULzM3N8ff3z3eC+siRI7G1taVZs2YEBQUxY8YM6tatK0gVqRnkVZIp7cpjqCctcC5M9tY2jVVvVq9XDSPm5GoSrh8g5uSfvF45RGhjXKI6SbeP8e7IEhKuHyBq72wSLu9GaqwpKvx6qR/RO6Yybdo0li1bRv/+/dmyZQudO7/XyFTfbIcMGUJwcDAbNmwA0Ch0aNGiBbNnz+aPP/5g2LBhFCtWjCNHjuTr/AIDA5FIJGIVtsg/mk/54jiiqftfpg/4dyB7XrqbmxtSqVRjuv3MmTM0btwYU1NTrKysNPLjdQWU+d0XqEbVkpOThYr0lJQUAgICcHFxwdDQEDs7O+zt7YmNjdWZZ6drfwXtQ01+xfNzI7trmtTQFImeATKT99O56ZkKLC0ttUTrszrF2draYm9vn6dTXEHIy9nu8ePHKJVKxo0bp+XWNn78eOC9MYE6SAwJCSEpKYlr167h6elJ/fr1hYAyJCQECwsLQW9aLfS/bNky7Ozs8Pb25o8//vhX5E+COOWdJ+qk/+HDhxMQEICzszNBQUG8fv1ao+rR3d2dLVu2MHbsWPz9/SlUqBADBgwQCkiyY2RkhI+PD8HBwTRu3DjHwDMrhQsX5vjx4wwePJgpU6YIwuZOTk788MMPGm07VS9KXTe7PP1X1ajXVy5qxdXwWGG5geNXFOo2g9iQtSRe3YdSnoHMwgHT0vWENjaN+4JEStKdEyjlGRgWKYNjp4m83ag5jG9erTWyhLtMnjyZtLQ0ihUrxsSJEzU8zdu1a8fgwYPZsGEDa9euRalU0qlTJ0BV6FC1alUWL17MmDFj0NPTw9XVtUCFDomJiUgkEp0iyCIi/ySy+kNn/t+VJL/8Hfyh/65kT7spSH48fHye9eDBg1m5ciXDhg2jdu3aWFpaIpFI6NSpk9a+ctpfQftQkx/x/DzR5ZqWbZnfuqu8jk7CIEMuLPtQp7iCkJd4vvra+Pv75zjKXKJECQCcnJwoXrw4p06dwtXVFaVSSe3atbG3t2fo0KGEhYUREhJCnTp1BDF9yL/Q/z8RMaDMB/lN+m/dujWtW7fWapdTpeHatWtZu3ZtjvvVlbBfvnx5naNruoLWD7X56rb8gkbSv4F9MRza/ZLjcUqNzLBrOUxrubPfCuH/MqmEVt0HsuaHmjn2AwiVc1mr57LyMYUOAKdOneLbb7+ldOnSufahnn7K6rQhjmqK/N340BdHtVj7f3WaOyuPHj3SGOV7/PixYGQBBcuPz8++svPw4UNMTEyEwsItW7bQo0cPjSro1NTUAqX1fGgf+RHP/xS8jkvlbXwa8uQkui2/wKS25dmyZQtfffWV4BSnRj0yqCanPPu81uUHtTa0vr5+voTyPT09OXXqFMWLF6dSpUqYm5tTsWJFLC0tOXDgAFevXtWpi/m5hP7/asSA8j9AQW2+/q1J//Hx8dy4cUPL61sXat3RL2HJJiLyMfzT/KH/bvzxxx80bfo+72/evHkANG/eHCh4fnxunDt3jqtXr1KlikqH9/nz5+zcuZNmzZoJ+5HJZFpV7/PmzRNecvPDh/ahFs8P+8jCnPygPr6zT6NpPOskVvFpwnJ1YHjhwgXBKU6NukJdV3CcNQffysqqwMfk4OBAw4YNWbx4MYMHD6Zw4cIa6yMjIzUURTw9Pfnzzz/ZuHGj8HmRSqXUqVOHmTNnkpGRIUyNg+oZZGJiojFQ8SmF/v9qxIDyP0Z+bL7USf+fqloc/h5J/xYWFnl+aZOSkggODmbOnDk4Ozvny1ZOROTvwD/BH/rvyLNnz/Dx8aFZs2acO3eOtWvX0qVLFyHvLWt+fL9+/UhMTGTp0qU4ODhoGF7kBw8PD7y9vTVkgwCNUaxWrVqxZs0aLC0tKVu2LOfOnePIkSPY2trmez8f00de4vmfGvn/0zWeGLsT/fQAbdu2pWXLljx79oxFixZRtmxZEhPfK4YYGxtTtmxZNm7cSKlSpbCxscHDwwMPDw+NHHxvb29kMpmQMpVf/vjjD+rVq0f58uXp06cPX331FW/fvuXcuXO8ePGCGzduCG3VweKDBw80pMTq16/P/v37Ba1LNZ9b6P+vRrzDiOikU/WiRCWmMePQw4/u65+U9B8ZGcngwYMpX748K1eu1Mh9ERH5p/B39If+u7Jx40YCAgIYNWoUenp6DBo0SLDQhYLnx+dGgwYNqF27NkFBQYSHh1O2bFlWrVolyBMBzJkzB5lMRnBwMKmpqdStW5cjR44UyPnrY/r4vmZRVp0LLdB5fQpMyzdGnhTD2UvHOHjwIGXLlmXt2rVs3rxZK91o2bJlDB48mB9//JH09HTGjx+Ph4eHkIO/atUqQYuyoAHlxYsXiYmJoUWLFqxatYro6GgcHByoXLmylryPu7s7Dg4OREREUK/e+7oCdaBZo0YNQXoINIX+X758iYmJCRUrVvykQv9/JRJlToqyIiLAhkvhYtK/iIiIyH+I7Hn0XxJDPSlHfmzwUTNaq1atomfPnjx79kzIhS3otpcuXaJatWq5tl2wYAEmJiY6xfb/i4jDLyK50ql6UY782IA6X6mmSvKSIVKvr/OVLUd+bCAGkyIiIiL/MCa1LY/eB9gvfgoyFUrGbP+4dKtu3bqRkpKiJan3qVmwYIFO96X/KuKUt0ieiEn/IiIiIv8dPkcefX6RK5SEPI7icURCgZ8jSUlJmJqaIpPJcpQIEvl8iCOUIvlGnfR/0t+L24He7B1cj+0D6rB3cD1uB3pz0t+LQJ9yf8tgMiktkzuv4rgWHsOdV3EkpWX+1YckIiIiIpCQkMCwYcNwdXXF0NAQBwcHmjRpouES4+rqmm8v87S0NMaPH0+JEiUwNDTExcWFkSNH5ruaOLt4fmZcBNEHF/ByST/CZ7Tj+ezORG6fTGbs23z1p1QqiL+0k1fL/Aib3pbnc7sSfWA+8mwWvS8W9CJySxCTVuygRo0aGBkZ8dVXX2l4q4NqaloikXDy5En8/PxwcHAQdBzV67JKyCkUCgIDA3FycsLExAQvLy/u3r2b4zVNS0tj+PDh2NvbY2pqStu2bQXxeVD9Le7cucPJkyeRSCRIJJI8/eT/7fwtRyjFCsW/P/+EpH9hRPVBBOHvdIyo2pjg5e7A9zWLUtLx7xcEi4iI/HdQO4cNGjSIsmXLEh0dzenTp7l3754gM5RfFAoFPj4+nD59mr59+1KmTBlu3brFrFmzePjwITt27MhXP1nF81PePCLt5T1My9RHZm5LZlwEidf28WbdaJz6LECqb5RrX+8OzCfx1lHMyjfGvGprMuPeknBlD+lvn1Co63QksvfP+PR3r1n721BGDBlAjx49WLFiBb6+vlStWlXLpc7Pzw97e3sCAgJISkrKcf+jR49m2rRptG7dGm9vb27cuIG3tzepqak62w8ePBhra2vGjx9PaGgos2fPZtCgQWzcuBGA2bNnM3jwYMzMzPjlF5VOs6OjY76u67+Vv02UJj78RT4Vz98l5yn0rATC3iWz5kIYq86F4lnCThR6FhER+cvYu3cvffr00RAjHzly5Af1tW7dOo4cOcLJkyc1qo89PDzo378/Z8+epU6dOvnqSy2eP3KjCefc62rcU01K1ODNGn+SH5zFzKNRjn2kPr9D4o1D2LX2x7RcQ2G5UdHyRGwaT/L90xrLM9+9oND3UxgT8BOmhnp06NABFxcXVq5cyYwZMzT6trGx4ejRo7lOcb99+5aZM2fSpk0btm/fLiwPCgrSMihRY2try6FDhwRNTIVCwdy5c4mLi8PS0pI2bdowduxY7Ozs6Nq1a477/i/xl095P3+XTLflF2gy+xRrLoQRli2YBM2Hf5PZp+i2/ALPv4Dwqsg/jw2Xwmk86yRnn0YD5FmlqF6vFtfdcCn8sx+jiIiISHasrKy4cOECr169+ui+Nm/eTJkyZShdujRRUVHCT6NGqqCvoC4/LjYmrB/QgMPD6tOtZjEczfSQp8SjZ10YqaEp6W9yt0ZMvn8aiaEpRsUrI0+OE34MCpVAYmBMavhNjfb6dkUxdPEgNFo14mhvb4+7uztPnz7V6rtPnz555ksePXqUzMxM/Pz8NJYPHjw4x2369u2r4bzj6emJXC4nLCws1339l/lLRyizStJAwR/+QT7l6CRWEYv8n/nHH32wbqZaXHfUtltEJaYxyKvkJz46ERERkZyZNm0aPXr0wMXFhapVq9KiRQu6d+8u2AEWhEePHnHv3j0NV5esREREFLjPlJQU1vwxnZUrV/Ly5UsNJx5FWs5TzQAZMa9QpiXxYu73OtfLk+I0fpdZqI47PfO977i1tTUxMTFa22a1zcwJdRCo9uFWY2Njg7W1tc5tsrrzqPcP6DwGERV/WUApPvw/H6GhoRQvXpyVK1cWSB8rMDCQoKAgIiMjv7jloHrfHyqLuuFS+CcRYQeYcegh9maGHyR5pE7KLqjvt/pvNn36dPz9/Qu8XxERkX82HTp0wNPTk+3bt3Po0CGmT5/O1KlT2bZtm2Drl5NXtVwu1xilUygUlC9fnpkzZ+ps7+LiUuDjGzx4MCtXrmTYsGE4u1dkyrFwkEiI2jkN8rpvK5VITayw89F9b5MZW2j8LpGoJk8N9DQnUXU9H4yNjQtwFvknp1FPUbo7Z/6SgPJDH/6xIcHEnVmP85BgZCaqgpCPefh/LB8bBIl8Gp6/S2b8rjuftM+AXXeo42b3r82pzEmQ9+7du2zatAlfX98CCwKLiIh8HIULF8bPzw8/Pz8iIiKoUqUKv/32mxBQWltb6/SwDgsL0xjJdHNz48aNG3z99dc5BqEFZcuWLfTo0YPff/+dpLRM5j47iCIzHUW2Km1d6FkXJjX0OoZFyiDVN8yzvRpXW9OPOWQBtR7l48ePNUY0o6OjP2rEMa9r+18rMP7iOZSf6+Ev5lS+p1ixYqSkpNCtW7e/+lC+CGO23xLSJj4Vn0JcNy+yShk9fBv/WfeVnZwEee/evUtQUJCG3IaIiMjnRS6XExenOe3r4OCAk5OThsyPm5sb58+fJz09XVi2Z88enj9/rrFthw4dePnyJUuXLtXaV0pKSq7V0Dkhk8mEwRNTQz2K2pgQf2U3KBV5bAmmpeuBUkHc2Q1a65QKeY5Baf+1Vz7Js/3rr79GT0+PhQsXaiyfP3/+R/VramqqFeA/eptA4K47NJh+HI/Ag7Scd5q2C8/Sct5pPAIP0mD6cQJ33eHR24SP2vffkS8eKn/Oh/+aH2p+0n7zYuzYsYwaNeqL7jM/SCQSjIxyl3D4t/DobQIhj6M+eb8fI66bGzmpGai13BaceExiqTsFVjNQC/qKiIj880hISMDZ2Zn27dtTsWJFzMzMOHLkCJcuXdKo+u7duzdbtmyhWbNmdOjQgSdPnrB27Vrc3Nw0+uvWrRubNm2if//+HD9+nLp16yKXy7l//z6bNm3i4MGDedoKZqdVq1asWbMGS0tLypYtS/yB/SRcPo0023S1LoyKlsesUjPiz20m/e1TjItXQSKVkRHziuT7p7Fu3FcVdGYja73Ex+Do6MjQoUP5/fff8fHxoVmzZty4cYP9+/djZ2f3waO4VatWZeHChUycOBHrQi7suJ/II33X/6y6yBcdoVQ//D+1P2jWh/+XRE9P77MEboGBgUgkEh4+fEjXrl2xtLTE3t6ecePGoVQqef78Od988w0WFhYUKlRI44YDqnw8iUSiNQJ1//59OnTogL29PcbGxri7uwv6WVmJjY3F19cXKysrLC0t6dmzJ8nJmm+JK1eupFGjRjg4OGBoaEjZsmW13v7U7N+/H09PT0xNTTE3N6dly5bcufNpRqmDL4SjSIj8NIK7yweqBHfndOHtxgAy3z5m7fnwAp9vVtLT0wkICKB8pcoYmJjh7mLP1IEdeXDtvJaaAUBMcgbz5s2mTCk39AyMqFXXk9u3b2u08fX1xczMjCdPntCiRQvMzc35/ntVsrtCoWD27NmUK1cOIyMjHB0d6devn8a0Tk6CvKtWreK7774DwMvLS1inzgfduXMnLVu2xMnJCUNDQ9zc3JgwYQJyuTxf11lEREQ3JiYm+Pn5cf36dcaPH8+PP/7IgwcPWLBgAcOHDxfaeXt78/vvv/Pw4UOGDRvGuXPn2LNnjyDorUYqlbJjxw6mTJnCrVu38Pf3JygoiEuXLjF06FBKlSqV/RDyZM6cOXTv3p3g4GB++uknzJUJOHaaiCQP/Uk1ts0GYdNsEIrkOGJP/knMydWkht3EtJwXhs5ldW4jVyhJy1QwatstXsamFPiYszJ16lTGjRvHpUuX8Pf35/Hjxxw6dAilUvnBz/GAgABatGjBpClTGdTHl9ObFwvHnRv/VnURiTKfCYA2NjYkJyfj4eFBQEAAPj4+Bd5Z4K47LFqzgfhrB0h/+1QlO2Buh2n5r7Gs3QGJNPfSf105lJlxEbxd/wsSPQOG/L6aGd0bsHLlStasWcPt27eJi4vDzc2NwYMHM2DAAI3+XF1d8fDwwN/fH39/f+7cuUOJEiWYN28eDRs2ZNu2bYwfP55Hjx5Rrlw5li1bRuXKld+fj44cSolEwsCBA2ncuDFjx47l0aNHlChRgt9//51mzZoJ7RISEhg3bhw7duzg9evXWFpaUrFiRaZOncquXbsICgqiUqVKlClTBk9PT/bu3cvevXuZOXMmixcvplGjRpQvX57g4GDOnDnDyZMnqV+/PqC7KOfmzZt4enqir69P3759cXV15cmTJ+zfv5+bN29qnE/lypUpXrw4jRs35urVqyxbtoyRI0cydepU4fhr1KhBuXLlqFixInp6euzevZtDhw4xf/58Bg4cKLRbs2YNPXr0wNvbm5YtW5KcnMzChQuJjY3l2rVrQp7eh+ajNph+nLtnDxF3diMmJWtpCO5KDEzyJbgbtXc2SbeOYPRVVYyLVwGFnNQXdzFyrUj5ph056e+V7/PNXpQTFRVFyTLlkLjVRWbtRGZaMok3DpMZ+4bCPWZi4KjKe8qMfcvLRT+gb++KIj0F88rNkcgziLu8CzMjAx7euyOI5vr6+rJhwwacnZ2pV68etWvXxsTEhG7dutGnTx9WrVpFz549qVq1Ks+ePWP+/PmULVuWM2fOoK+vz44dO3QK8rq5uTFnzhzmzp3LmDFjKFOmDABNmjTB0dGRtm3bYmBgQMXKVUlFn/OnT3J4706G/jic2TM1X2pEREQ+L+rv+bNnz/6yfOduyy9w9mn0Jx8kyomp7cp/UL2Er68vW7ZsITFRc2o9NjYWa2trJk6cqHNwJTdcXV1p2LAh1Xr8woxDD0kNu8nb9WNw7DwJo2IVCnyM/k1L/eMLjPM95T1q1ChMTU3ZtGkTbdq0YevWrbRt27ZAOzv+IIL4G0eQ6BtjXr0NUgMjUsNuEhcSjDItBetGvQrUX0bMa96uH4PUyBzHThO4FKHK5Vi4cCHlypXDx8dHePj7+fmhUCg0Hv6gStLt0qUL/fr1o2vXrsyYMYPWrVuzaNEixowZI+hWTZ48mQ4dOvDgwQOk0twHdk+fPs22bdvw8/PD3NycuXPn8u233xIeHo6trS2QuyuCmho1arB4seqNRx0E/vTTT0yePJmff/4ZgM6dO+Pk5MSKFSuEgFIXgwcPRqlUcvXqVQ05hClTpmi1rVy5MsuXLxd+j46OZvny5RoB5cmTJzWq6wYNGkSzZs2YOXOmcI0TExMZMmQIvXv3ZsmSJULbHj164O7uzqRJkzSWF5TEtEzC3yVj7FZda7ok34K7YTdJunUE86qtsWnST1huUbMdSqWS8OhkktIy83W+ulh3PQqLnouRyPSFZeYVvXm5tD/xV3Zj12KoRvvMmNc49VuMnrmqyt6weBXe/PkTnQeN4tjmlUK7tLQ0vvvuOyZPniwsO336NMuWLSM4OJguXboIy728vGjWrBmbN2+mS5cuuQryenp6MnfuXJo0aaJhI/bobQJlu4zldGg8F9VT9eVLYfYyjbnz/+CKfVO+LucsGg+IiPyHmNS2PI1nncwxoEy8eYTofbMp0n85elYf7yLzMcWSugYrZs+eDfDBlonPopI48ZnURT5UMSQnPlT9pSDkO6BUK/b7+flRr149fv755wIFlOqHv53PCI0qL/PKLYg+MJ+Ea3uxqt8NiZ5+Lr28JyP6OW/X/4LM3BaHjhOQGZl90MP/wYMHnD17ltq1awNQtmxZvL296dOnD/fv3xeCL2tra/r168epU6fy/PDdu3ePu3fvCnktXl5eVKxYkfXr1zNo0CAgd1cEtXJ/7969hXUymYxq1arx4sULfvjhB2G5lZVVjoKvaiIjIzl16hRDhw7V0tbSlTvSv39/jd/VUhbx8fFYWKjyZbJe37i4ODIyMmjQoAEHDx4UnAQOHz5MbGwsnTt3JirqfZ6jTCajZs2aBRbXzU5YdBJK0Pg8KeWZKNKTNQR3ExUKovfNplCPWRgW1nwDTH5wBpBgWa8L2ZFIJCiB0OgkDZvJnM43OxsuhTPz6BMhmFQqFShSk0CpwLBQSZ1iwMalagnBJIChkzsGTu6EHDvCxkvhGm/n2UfcN2/ejKWlJU2aNNG43lWrVsXMzIzjx48LgWZMTAx37twhNDQ019GNnFyHFGnJKOUZGLqUI/H6AZ48esiDswcI+mY2baZsY24fb1xsTD75TVFERERFt27d6NSpE4aG+a+a/tS42JgQ5FOOUds+bwGjmo+pl8jMzKRhw4a0aNECMzMzTp8+zfr162natCl169YtcH9yhZLrz2OxLl/gTXPkn64uku+AMusDytvbm/Hjx/Py5UuKFCmSr+11PfyzP5Qyop8LU4C5kREZRuTOaehbF8ahQxBSQ9XF/5CHf9myZYVgEqBmTdUHtVGjRhrBl3r506dP8wwoGzdurJEkXaFCBSwsLDSCvqyuCE5OTjr7yR78WVpaYmRkpKURaWlpSXR0dI7Ho96vh4dHrsed036zCrqqA8ozZ84wfvx4zp07p5Vfqb7Gjx49AhDcGbKj7utDUYveKjLSiD+3mfgru1FmE9jNU3A39g0ycxtkxjmPqqVnKvJ1vlnJqmaQeOso8Re3kxH9AhSZQhs9S+03dn1r7c+CvrUTSfdPCzcbUOXvZs+bevToEXFxcTg4OOg8j4KKGWc3Hkh5G0rsqTWkht9EmaZ5DRRpySj+X+x5JTz2kyTSi4iI5IxMJsvTIeZL0Kl6UaIS0z6ZDnBufEyxpFQqRU9Pj2nTphEfHy8U6kycOPGDjiUmOR2J1b+jwPhTke+AUpfifkRERL4DSvXDPz0yLNeHUn6I2DoBmYkVDh1/RWqgKWpa0Ie/rqANtIVf1cvzo1mVvU/QVvnPjyuCrpvFlxBbzWsfT5484euvv6Z06dLMnDkTFxcXDAwM2LdvH7NmzULx/8hC/e+aNWsoVKiQVn96eh8nMqAWvY05vJjEW0eQGpkis3XBpnHf/Avu5oM3L8Jom4/zzYpazSDx9nGi987CuGQtLGq2U+X+SmXEn9tERsybAh2H+mYjAwwNDbVSLxQKBQ4ODgQHB+vcPut32MrKCjc3N0GfLTvbr71gZ8T7YFyRmsjbdaORGhhjVe979KwLI9EzIP3NY2JPrNKQDlFkSaTXj02hiNXnER4WEfkvkz2HcufOnSxZsoRr164RHR2Ns7Mzvr6+jBkzRuOe3rBhQ6Kioli3bh2DBw/m0qVLODk5MWXKFNq3b8/JkycZOXIkN2/epGjRovzxxx80btxYY98vX75k3Lhx7N27l9jYWEqUKIF3O19O4EHm/41HAFJCr6vaLx2AVE8fPevCWFRvo+HbnV8Sbx4m8fZxMqLCKD0jmVIlS+isjQBITU3FwMBA4x4pk8lYvXo1AwcO5MiRI6SmpqKnp6cljD5jxgy2bdvGgwcPSE5OpmzZsowePZr27dsLbR69TSA1Q4HRJ04d/asKjD8V+X6iHz58WGtZdhuj3DDQkxbooZQbJqXqkHT7KEl3TmBeubnGuoI+/HMKnj4mcMvPtrm5Inxq1EFq9mrhD2X37t2kpaWxa9cujeA5+xS2epTWwcFB64b0KXC1NUUCJD04g6lHI9JfP0RqbIFx8coo8ym4q29ViNSnV5GnJOgcpZQAt84ezdf5qklJlwtSRskPzqBnVQj7dr9opBfEhegO+jJitH18M2JeoWfpKNxsqqRm6NzWzc2NI0eOULdu3RzdI9TyQlKpFKlUqpXyoP59zZ6TxBxbhl2bUZiWrkdq+C0UKfHYtx2DUdH3I92ZsbkHxc/fJaMvy1tMQv1wvHTpUq5yJjkl138M6uR6Xbqcuo7xryyCEBHJiVWrVmFmZsbw4cMxMzPj2LFjBAQEEB8fz/Tp0zXaxsTE0KpVKzp16sR3333HwoUL6dSpE8HBwQwbNoz+/fvTpUsXpk+fTvv27Xn+/Dnm5qr749u3b6lVqxYSiYRBgwZhb2/P/v37WTJxJAG/TeWpYwNCHkeRcP0AyXdPAGBZtxNSAyMyIkJJvHuSpLsn8izMfbGgF0ZFy2PX6kcAEq7tQ9+uGPL4SPSMzXBxccHPz4/79+8zd+5c1q9fz+3bt1m5ciWvX7/m3bt3KBQKJk2axM6dO0lKSqJo0aIULlyYYcOGcf/+fX7//Xfc3Nw0gtI5c+bg4+PD999/T3p6Ohs2bOC7775jz549tGzZkpCQEPqPmog8IYqkO8dIDbuBiXtdVUFnPkiPeMa7w4v//7wyx6xSc/TMbYneN4ci/ZdjaFNIUBfR2C49nYkTJ7J3714eP35MZmYmVapU4ddff8XLy0ujbWxsLMOGDWP79u1IJBK++eYbfvzxR402u3bt4ptvvuHGjRtUqKAqItq6dSvt27enbdu2HxSL5Dug/NiAwNXW9IMfStmxbtQLiVTGu0MLkRoYC287H/Lw/yvJyRXhUwdf9vb21K9fnxUrVjB8+HCN66JUKguswaUOmLMGyHFxcaxcuVKjnbe3NxYWFkyaNAkvLy/09d/nx4aFhREYGMjZs2cJDw8XjiF7Tp/6IX769Gm2bt3KmjVrSE5OpmnTpixZsoSiNiaES6Qk3z+NMiNV1feUVjqPWynP4N3RpSTdPo4yMw0j18qYeTQi4epe4k6vE4pyEq7uJeHqXjJiXmFgasnuCmW0zrdevXpcuHABUBVG3bhxA2trawwNDVGY2iKTSshITSbl8cX/y2ooUX1CIe3VA9Jeqoqv4s5twrJ2B6HflIfnyUyIEvIo0149IP3VA8yrfaO69lIJTyISSU9Px8nJidjYWGrWrMkff/zB1q1bkcvlTJgwgUmTJgnX7sSJE6xfv56tW7eSmZlJTEwMycnJ3L59W+N6u7q6YmWr2m/8xe0AvDu0EGVGGlIjM/VVBFQzDe8OLyQt/P/T+rePYZSD9EdoVBLP3yULeUFpaWlMmjSJ4OBgnj9/joODA+XLf8JEJBGR/yDr1q3TeJHs378//fv3Z8GCBUycOFEj1/LVq1esW7eOzp07Ayolh9KlS9OlSxfOnj0rpHiVKVMGb29vtm7dKhRy/PLLL8jlcm7duqVRZNq5c2dmTZ1Ev8Wq4CblyWVkZjbIE99hVraBUJQTsXUiEpl+gQtzHbtMQapvyJvgUSiBbbv28u03rdi8eTMAEyZMwMDAAH9/f9LS0jAwMODu3bvs2LEDZ2dnYmNjadiwIQ8ePGD+/PncvXuXp0+fsnz5co2A8uHDh1o1GFWqVGHmzJm0bNmSzZs38+ZdHBIDY/RtXTCwK0rCld2kv9XOic9OZkIUb9eNAYkEi1rfIdU3JOHmIY2iTblCyfGHEWR/KsfHx7Ns2TI6d+5Mnz59SEhIYPny5Xh7e3Px4kUqVaoEqJ5T33zzDadPn6Z///6UKVOG7du306NHD43+6tWrh0Qi4dSpU0JAGRISglQq5fTp00K7yMjIHD3hs/PBc44F2QmolPUdLIyJBMiiwKeUZ5BwdV+B92/TfBCK9BSi9s5CYmCMScmaFLU1wdjQQNVvHsHOX4lcLicxMVFj6l2XK8KnZO7cudSrV48qVarQt29fihcvTmhoKHv37uX69esF6qtp06YYGBjQunVr+vXrR2JiIkuXLsXBwYHXr18L7SwsLFi4cCHdunWjSpUqdOrUCXt7e8LDwwkODiYhIYGBAwfi7OzMn3/+yenTp2nYsCF3797FxEQzKXnw4MFYW1szfvx4QkNDmT17NoMGDcLr+wCulqxB4q1jSPSNVF9yayfSo8Ig22h0zOHFSI1MsazXGXlcBPGXdiKR6WNazouEK7tVo4NKJanPriI1scSkZC3KuRXl3IGNSCQSWrVqRf/+/UlMTOTKlStCv2XKlKF79+5s2bKFY8eOYVII7BVKpAbGGBQuSfqrB0RsmYhJyRpkxr4h8dp+pCZWKJJjMS3bUOMY9awL82btz5hXbq76blzahdTYAota3wKqm83juzfJyMigWrVqeHt7c+PGDby9vZHL5ZQqVYrJkydz/fp1rKysAGjXrh2JiYl07dpV0J9zdXXl6dOnzJs3j+rVqwt5l0+eq7Q7FfL3ThzRe2fj2HUqUiMzovbMwqz818Rf3I4yMx2pqSWKpFhSQ6+R/uaxzs+LEoS8IIVCgY+PD6dPn6Zv376UKVOGW7du5UvTU0REJGeyBkEJCQmkpaXh6enJ4sWLuX//PhUrVhTWm5mZ0alTJ+F3d3d3rKysKFKkiBBMgmbtAKieq1u3bqVDhw4olUqhtuJlTDJhxiVIiI8jeN8JDIqURWpoilzHLNGHFuZqWDYqFFx7FC7URoBqmvvy5csa16F8+fI8fPiQXr16cfv2bTZs2EBSUhKlS5dm+fLleHp6smbNmhyvY0xMDHK5HE9PT9avXw/AuF9/Y7fpKeIW9ELfpgi2LYagZ12Y2JN/6jzurMSf34oiNZHCPecI9SKmFZrwanFfjXbh0ck4K5TIpO/DSmtra0JDQzEwMBCW9enTh9KlSzNv3jxBmWXXrl2cOnWKadOmMWLECEBVwJl9FNPGxoayZcsSEhIiFAuHhITw7bffsnnzZu7fv0/p0qU5ffp0vguw8x1Qjh49mq+++oq3b99y7tw5Xrx4wY0bN/K7OQAtvm7IvQ2qh5JFtdaAhKQ7x0GnxHPuSCRS7Fr/ROS2FCJ3TKFwxyC8avvQ1D1/wc5fSV6uCPHxn96Gr2LFipw/f55x48axcOFCUlNTKVasGB06dMh742y4u7uzZcsWxo4di7+/P4UKFWLAgAHY29vTq5fmG2aXLl2E/Jzp06eTlpZGkSJFqFevHsOGDaNq1aqAKifn9OnThIWFsXXrVi3bSFtbWw4dOiSMZCoUCubOncvFib+z4us+KJGQdPsYysx0JA7FKdxtBm83Bmj0ITU2x6HjBKEPpVJBwuXdOA9Zi75DcRKu70ce8xqkeug7umFRqz3rpvbi4OY6DBo0iNjYWOF8nZychJtsQEAArq6u/PDDD5iZmZMa975AyrJeFyI3jSf99QNSQ69hYFcU29b+RO/5HWT66FlqFtCYejRCIpEQf3kX8qRYDAuXwqZpf2SmVqpp/LQkkt+GIZPJ2LVrl7BdUFAQgYGBtGzZEn9/fxYvXsyRI0cA1Y12yJAhDB8+nMKFCwPg4+PDsWPHWLx4MTNnzqRBgwZkypUkRr7AvGY71SguoEiOA6keKQ/PYd9+PDHHlhF3dhMo5ZiW88LUw4uIjQHYNO5H1L45Oj8vSuX7vKDzh3Zy5MgRTp48Sb169YRcp/j4eP78809u3LhRYAePfyof4m70X/MGFsk/d+7cYezYsRw7dkzrGZLd1tHZ2VlrZsrS0jLP2oHIyEhiY2NZsmRJjpJvmYmxGACWtdqT/Pg8ysx03qwbhXGJGpiWbaAxk1GQwtzUF3eJCwkm7cUdUCrxLK/pDtSjRw+tVJ+so7LqvHMzMzPc3d25evUqFStW1KqL2LNnDxMnTuT69esaAzzq6xWRrBAiFqVCjjw5DsMiZchPHJPy9AqGRUprnKPM2BzTcg1JuLJbWKYEUjPlmBq8/25nLcJSKBTExsaiUCioVq0aV69eFdrt27cPPT09jVFXmUzG4MGDCQkJ0TgeT09Pdu7cCajikhs3bjB16lSOHz9OSEgIpUuXJiQkJN8BZb6dclatWsXAgQNZtGgRUqmUgICAvDfKRp8mFbBvPx6ZmTWxp9YSf3EbRq6VsPbqWeC+ACQyPezajMbQyZ03Wybgof9WCHYkEgn+/v4sWrSIvn37MnTo0Lw7/ELk5YoQGBiIUqnUquZetWqVztyxEydOaORHurq6olQqtbSmypUrx7Zt24iJiSElJYX79+/z66+/Cutz2q+vry9KpVJjKrp169bcuHGDlJQUnj17xsiRI+nZs6dWO1AlgR84cIDY2FhSUlJ4/Pgxa9asEYLJjIwMBg8eTGRkJFZWVhpfDjV9+/bVuAF6enoil8vRS3lHAw9XHFv/iL6tM4bOZXHs+Cv6ts44+60Q8m8AzCo10+jDyLkcKBUkPzhH8r1TyGMjhHbGRUrzZtUwSjiY06dPHywsLATJpokTJ/LmjSpNY9u2bbi6uvLy5UuV3JIEFCnxvFrmR+KNQxgXr4zMzAbj4lUoNmI7hbrNIOXxRVV+p0LOiz98iTm+ApmZDcVG7cGyZjssarRFHh+JecWmmFVuRtSu6YRPb0vK0yukht4AlCxcu0Xj+gwePFj4f58+fbh8+TLjxo0DVJ+3efPmUblyZXr16kV0dLTwoLh9+zZKpZITJ06QmJ6Jvl1RbLx6Ye+jerO1+2YkUiNT4q/sIWLjWGQmluhZ2mPg5I5d658wLl4FmYUDyY8uaCXavwkeRXqEKuiWSSVMXLqFbt264eTkxLZt2yhUqBDGxsY8e/ZMEFHPOvIbExNDjRo1cHZ25sGDBxp9v3z5kjZt2mBmZoa9vT3+/v5ajj1JSUn89NNPuLi4YGhoiLu7OzNmzMhXHvSdO3do1KgRxsbGODs7M3HiRJ3FV5A/J6jc3I3y4r/sDSySP2JjY2nQoAE3btzg119/Zffu3Rw+fFjQDv5UtQPqfrp27crhw4cZOH0lDp0mavyoXW/07VywbuALgEHhUiQ/OMPbtSOJPriAiK0TCZ/VgeezOvBi7vdE71bJ5+VUmKvSnP5FlXNpVRh9+2IsXb9DIy+wePHiWtspFApmzZrFtm3bSEtLw87ODnt7e27evKkVZINqhM7HxwcjIyMWLFjAvn37OHz4MF26dBGuQVhYOFF7ZiGPjyT57glezP2et+vyZ8GcGR+BnnVhreW6lum6Ta1evZoKFSpgZGSEra0t9vb27N27V+NcwsLCKFy4MGZmZhrburu7a/Xn6enJ69evefz4MWfPnkUikVC7dm08PT2F4DN7EJob+X61/RSjeyUdzWnS0JOzRctqCaEWG7Unz+2tPL/HylPzJizVN6RIt6nU+cqW9s1Vw/OtW7emdevWWtv37KkZuIaGhurcj64HjjpIy0pgYKCgGZnbttn3ZWBgwLRp05g2bZrOtv8FUlJSmDx5MitXruTly5daKQrZyU3KaFLb6jSedTLPfepZaKZoqPMC3x1agMzcDiPXiqQ+u0ry/RD0zW2FdgYGBnz11Vdcv36dY8eOsWnTJhwcHEhJSaF48eIaSepflXDn0bNQ9KwKE71/Lor0FNXb57X9yNNTiNo+idSwmyCRYtXoB+Qxr4m/tJOMd69w+HasxvGlht0k6f5pzKu0QmZigZ6lIylPLwNQ2NlVo62NjY1wTdSogxofHx9q1arFnTt3WLJkCXfu3NHSGgVIzZAjy3Zjizu7CWVGKnrmdpiUrkvC5V0oM9MxcdK+Oenb5Kz4IFcoufYiFoAXL14wa9YsYV3W4r53794BKpmyJk2a8O7dO06ePKkhwyWXy/H29qZmzZrMmDGDI0eOaCXXK5VKfHx8OH78OD/88AOVKlXi4MGDjBgxgpcvX2rsPztv3rzBy8uLzMxMwdBhyZIlOgudsjpBTZ06VXCCqlevnoYTFKh08KpXr05MTAwzZszIUd5JTU4aoFn5t3sD/5v4HAVlak6cOEF0dDTbtm3TMLh49uzZR/Wb/flmb2+PRCLhzJkztBzyG3ui0zB2zTn1TZ0baOPVC5m5DRGbfyXx2j5klo55F+ZmeflPeXwR5BmYlvMi9vgK9B3d6Ny2JZNuXRTa6Pp+Tpo0iXHjxlGiRAnS09PZtWsXUqmUYcOG6XxB3Lp1K0ZGRhw8eFBjdFOdMieXyxnYtR0pryOQGJpg4OiGZZ0OyBOiid6b8z0lN94Ej0Ke8H5WS+2aJnErgZnz+3vq2rVr8fX1pU2bNowYMQIHBwdkMhmTJ0/myZO88zd1Ua+eyhDk1KlTPH36lCpVqjBw4ED27t2Lk5MTiYmJXLt2Ld/9fVEvb1Ap6+tJJXk3LAB6UgmT2opJ/f8kBg8ezG+//UaHDh3YtGkThw4d4vDhw9ja2ur8ouf25qwW180TSQ4fd4mUQl2nYVRU9Rmy+2YkmVG6vVUfPHjAiRMnKFasGHZ2dlSqVElIUr927Rqly3kg0TfGof04TMrUJ/b0OoxLe6JMTyH2+EpSn11HamSOSanaWFb/Bpum/bFp0p+UR+dJfXFPY18Z717i2GUyVvU6Y16lpcY0ib5e3t8htf7ngAED6NOnD7Nnz2bFihVcvHhR0AhVk5iWSaZciSTbNVKkJmDg6IbM3Bbrhr7YtlL5Cme+065Gz4u3caqiKQMDA/bs2cPhw4eFH39/fwDat2/PmzdvaNiwIfHx8Zw6dUojmATVFH7Hjh1Zvny54DiV3d1p165dHDt2jAkTJrB06VIGDhzIrl27aN++PXPmzMn1Bjx16lQiIyM5cOAA48ePx9/fnzNnzhAWFqZ5zbI4Qe3fv59BgwYxcuRIzp8/j1KpZNKkSRrt09LSKFtWNXrTo0cPrbSOrGy4FE7jWSc5+1T1oPmS3sAKhYJVq1bh4+ODi4sLpqameHh4MHHiRFJTU3Vus3z5csqUKYORkRElS5Zk3rx5Wm22bdtGx44d+eqrrzAxMcHd3Z2ffvqJ2NhYrbaJiYkMGzYMZ2dnDA0NKVOmzF+aZ9uwYUPB2z77T9Ziw+TkZAIDA7+4kL/6/rhixQph3+np6SxYsOCT78fExISwsDBGLdurtV6e/H4wQJ6iOe0ukekj+X8epE3TAVhU/waTEjUwdq2Upegvy76MzN7rCGe7LxnoSclMTcqzNmLLli14eXlRt25d9PT0aNq0KY0bN9b5mVOfn0Qi0ZjtCA0NZceOHQDcunWL0KePsWn0A1JDU/Qs7DF2rYTMzEZoHxsSzNtN43X2r2fhQGaM9uCcMjNda1l2dYwtW7bw1VdfsW3bNrp164a3tzeNGzfW+k4WK1aM169fa724ZJ/lAdVATdGiRQkJCSEkJARPT0/hOoSGhrJ582atmZ/c+OIBZb4f/gXgV59y4hv5P4wtW7bQo0cPfv/9d9q3b0+TJk2oV69ejl/0vOhUvSh25rl7dmdH+f+3YUPnsuiZ2wr5jN9WcKRFi/dyVOnp6cKbfoMGDYSgQNWHKkm9devWKJVK9JCDUoE8OQ7j4lVUQuvyDAwc3Uh+cBaZpT2K5FiMS9ZEnhyHPDlO8H1NC7+pcXyGLh4Y2GmOzOpZqI4xPVrzphQdHa2VC5Q1eTs1NZWoqChq1aoFaI/Oh0XrFoA39WikcTM3ca8LEqlueaN3L3X2kR0jIyNatGhB48aNhZ9y5VT3BD09PRo0aEBGRganTp3KUSdTl5tTVuOAffv2IZPJGDJkiEa7n376CaVSyf79+3M8vn379lGrVi1q1KghLLO3t9eaos7uBKX+yc0Jqnr16jnuV838448Yte0WaZmKAnsky7NogM4//ijvDXSQnJxMz549iYyMpH///syePZsaNWowfvx4mjdvrjULs3jxYnr37k25cuWYN28etWvXZsiQIRpWraBKW7l37x5du3Zl7ty5NGvWjPnz51O7dm1SUlLen8P/R6AXLlxIhw4dmD17Nu7u7vj5+WkF6V+KX375hTVr1mj8LFq0CFAVKapJTk4mKCjoiweUderUwdLSktWrVzN58mRmzZpFrVq1PlqfeOzYsVrLrK2tkeobEL7yR94dWULC9QPEndtM5I4pvFry3r42YsM44i/tACDxXggxx5aT8uQSkN3dTHdhrp5VIdJe3Ucpz8C4eGWQ6RF3TlXRLUmJo2rVqnmO8stkMq1rsHnzZl6+1H2vatmyJcnJyTRr1oxFixbx66+/UrNmTWEWRR2425i+v7cqlUoSLr/PZ09/8xgTN93fc+PiVUh7eZ/0t+/vVXbf/IwiQ7sYV5otx1WXusqFCxc4d+6cRrsWLVqQmZmp8QIml8t1vuSB6t557NgxLl68KASUUqkUc3NzpkyZkqMEnS7+kmzuT6msP6Kp+weZxYv8tej6os+bN69Ab0PZKepgjcG7BAz1pBriujmhSFUFUXrmKpkfC7cqxOob8OzkFkqXLi20W758uTANnz1PJ6ck9Rdz3wcfiqRYTMt5EXNsmbAses9MreORJ8Vq/K7L+9bItSISqYyVy5fQumUzYfn8+fO12qrfUJs2baoVbGZ9gMN744Hs6Fs7kZZl5FQikSAztUKe+I60Vw8w/P/UtzIzneRH53X2kZ34+HiWLl1K3759tdZ17doVfX197t27p1MMH1QBaXaFiezGAWFhYTg5OQnaeWrUuZrZRxuzEhYWplHpqiZ7DtKHOEEdO3ZM+P+JEyfw8vLi+PHjgvvWhkvhn8xxJLs3cH4xMDDgzJkz1KlTR1jWp08fXF1dGT9+PEePHhWkzVJSUvjll19o2bIlW7ZsEdoqFAomTJhA3759hVSMLVu2aLmMVa1alR49ehAcHCxYzW7bto2zZ8+yfPlyochvwIABtG/fngkTJtC7d+88A4lPTZMmTbSWrV27FiDfubCfE1tbW9atW0fLli05duwYt2/fpmvXrnz99dd4e3t/cL+6zCeUSDEoXh2ZiQXJD88hv7oPmbE5+nZFsWroK7Qzq9xckB+LC1mLnoU9ZpWakXznRL4Kc80qNlXlXW4cj0mpWhgVr0bqE5VUW2pCDH1//klnIWhWWrVqxa+//oqbmxsZGRkMGTKE4OBgDQORrDRq1Ijly5czadIkhg0bRvHixZk6dSqhoaHcvHmT0qVL4+bmxosDS1Cmpf/fAnqMhuaxMjMN4xwCSota35J05zhvN4zFvGprQTZIz9KBjIhEkEjIaQK3VatWbNu2jbZt29KyZUuePXvGokWLKFu2rMZoZOvWralbty6jRo0iNDSUsmXLsm3bNp2pZKAKKNVmGPXq1WP7dtXfrE6dOhw8eLBAPudffIRSzSCvkkxpVx5DPalGaXx+kEklGOpJmdquPAO98i+uLvL3oVWrVqxZs4Zhw4axZMkSevbsydy5cwVdsw+hatWqhD++h4/8PE5RV0kJvZHvz1adr2w5MdaHX8aM5sCBA8KXasiQIQwePFgYWcr+tpY9Sb1JkyaYWtlSqLNmkrppuQbCNsYlamglsjt0moh5lZYafUv1DMiOgbkNtXy6sn37dnx8fFiwYAH9+vVj+fLl2NnZaRQdqae7vv32W7Zt28ahQ4c4cOAAoJ3rq3Ydyg8yczuQSInYNJ7Y0+tQpCeT8vSyVo5qTkYFlStXFnTr5s+fz5w5c/jzT5XkRoMGDYiNjWXOHN0V45Bz+sOXJqsTVNbpe/WPunpSjXqKFFRFFFOmTAFU34WePXvy8EWUYNdZEDLjIog+uICXS/oRPqMdz2d3JnL7ZDJj3xKw6w7P3+XPgUyNgYGBRjCpRl3pee/e+xeM48ePEx0djZ+fn0bbgQMHkpSUxN6976dFdT2YdPWpLgLIKmuj/j01NVXruupCLeysLsgqUaIEU6dOzbGw6kNYt24dpqamfPONSiM2NDRUeNEJCgoS/t7Z8xDzU1Cmi8uXL+Pt7Y2dnR3GxsaCJIyenh6hoaG0bKm6f2RmZvLq1SumTZvG2bNnUSqVGtdeXcSZkZFBUFAQJUuWxMjIiISEBGJjYzVMTNTHnvWFNTE9E6m+ATZNB2DfdgwoMrFq6Itj598wr/T+JVfPwp7M/89aFOm7mCL9l2JZ+zsMnMsiT4wm5thyYk6sRGpipVGYmxp2k7AprVCkJmJUrCJpz28Rc2QJiuQYrOqqPhPlypblyZMn+Pv7CxJz2ad41VPXP/30E8nJychkMq5evYqBgQFJSUnC+a1cuRKJRMLJkyfx8/Nj1KhRREdHk5qayr1790hKSuLPP//EyMiIunXrMn78ePQkShTpKWTGvkHf2gm7/6cCGRWvgr5dUWEwQJ4YQ9Te2bz4owdh09vwZvVw9B2Ko2fpSNy5TcRf3oUyMwNluuoFX6KnjyLbQMiMGTOQSCR4eXkxadIkbty4wZAhQzh48CCNGzfm3r17Gp+fS5cuYWhoiEwmY8GCBQwdOhR9fX1Wr16t8XeVSCTcvXtXUAsxNDTUeP6qZ43OnDlDfvlL9SY6VS9KXTe7PBPP1ajX1/nKVkw8/4czZ84cZDIZwcHBpKamUrduXY4cOfJRb9MBAQGEhYWxeP4sEhISqFG7Hs07f8P6xwZkdzqXAIUdbIkCKljLBe/UwMBA7O3tGTVKVbW3adMm+vbty6RJk7SKXkA1FWpubo5cLqdx48asXbsWK7MH6BWrpNVWamKJIjkOi1rfYeRc5oPOUa5QsnLBbILLF2Xp0qUcOXKE2rVrc+jQIerVq4eRkWraPyYmRnhI9+vXT5DiyZ47qcbVVrd8TfapbaVSiTwhCgMndyRSGfHnt6BUyFWWatV8iN4/V2ibGR+ps8+RI0cSHh7On3/+yfbt2zExMRGqzkeMGEGtWrUICAjA0tJS+DsUlGLFinHkyBESEhI0Rinv378vrM9tW13XKXsOUkGdoExMTAR1hA4dOghVmGqXnotvMsms0jnvk8tG2uuHpL28h2mZ+sjMbcmMiyDx2j7erBuNS7+Fn8wbWK1skFUFQp2wn13qqWrVqkilUq5du0bXrl0L1GdaWhoymUwjZQMQAocrV67Qp0+fHPtMTk6mQYMGvHz5kn79+lG0aFHOnj3L6NGjef36NbNnz87H2eZOZGQkhw8fpmPHjoL0k729PQsXLmTAgAG0bduWdu3aAQii0ZC/gjJdRERE0LRpU+HeZGVlxdq1azl58iQ2NjYolco8952dwMBAJk+eTO/evalRowbx8fFcvnyZq1ev6hyRVZOaIUfv/49pw8Il0bMqRPL9EMzKf63RLuleCFIjM5wHr0Ui00OeFMObP/1BIsGybidkJpakPLlCyuMLGH9VRSjMTQ1Tpf7End0IUj2svX5AKc/AvFpr0h+qghuFQsG9e/cIDAzkwYMHLFy4kJUrV9KjRw+Nl2o9PT1mzJjBjBkzhGU5OWP5+flhb29PQECAEHAuXLiQQYMG4enpyY8//khoaCjDhg3D3s4WI8fimLWfKMQsxUbt4eXS/pi4vU+Vidw+ifSocCyqtkJm6YgiOZaUZ9exbvSDYO7yJngUmTGvkegZoG9qSUWrTF4Co0aNwtfXl/DwcEaOHMnmzZsZPXo0o0ePFvp3c3OjefPm7NmjunbHjh2jefPmVK1alSlTpiCVSlm5ciXHjx8nPT1dGEhQvyh89913lCxZkgULFmgMMsjlcnbv3k23bt10ztbkxF8uYOZiY8KaH2ry6G0CwRfCOf4wgvDoZI0BcAlQ1NYEr1IOdK1VtMCm8CJ/P6ysrFixYoXW8uy5fb6+vlryR6B6CGcfZXN0dBS+WFkJ9JlK0p+/6dDva0nrVyc4duwYr169wsnJCVA5/AwbNgx4/8DLTtYcqW+//ZZ169Zx+/Zt4SbVbfkFzj6NJj0xVuXfjWpkT5EcR0ZUmFZAqchIA6USqUHOeaAyqYQ6X9niXtiKX3/9VUPyKTY2VvDvhfejeIGBgRoPe/XDtFKlSkKiOaiMB+qO3UBYttGspNvHcOq9EKmh6mGe/OAM8sR3WNT8FovqqpGZyO2TSX1xB1MPL8wqqvLJkh9fRB4fiaGLB4W+V43EOVoa8RbVTX7kyJGMHDlS2I/a1cfMzIxx48YRHx/P6NGjsbS0zPVBmxMtWrRgyZIlzJ8/X+MGPGvWLCQSCc2bN89129mzZ3Px4kUhjzIyMlLLIz03Jyj1Ntmn5tV/l8qVK9OtWze8vLzw9/cnXSnl6PFduFTSHJXLD8Zu1TEtXU9jmUmJGrxZ40/CvTOEyBrxOCLho++b06ZNw8LCQuPavX79GplMpjUFbWBggK2tLa9e5V68NXXqVGQymYZPsru7O3K5nPPnzwtVqPB+5DKn/Dc1M2fO5MmTJ1y7do2SJUsCqpcqJycnpk+fLkhJfQwbN24kMzNTY7rb1NSU9u3bM2DAACpUqKAzkFYXlKklvfr370+VKlW03Fqyc/bsWWJiYjh06BAuLi5s2bKFx48fU6dOHSHQzmvf2dm7d6/wPckv6uK9rIGDSRlP4i9sR56aiOz/xTVKeQYpD89h7F4HiUzVOvbkGlAqKNxrPjJjVTqIeeUWRO6cRuzpdZhVaqaZW5mZTuEfZmksa1u5CIt2qz5fR48eFb5zxYoVY+TIkezevRsfH598n09WbGxsOHr0qPAdTU9PZ9y4cVSvXp1jx44J0/8VKlTA19eXWnU9eZdlECwj9g2Z0S8wbqoarVekJpL28h5WXr2wrNlO2I95tW80z1MhR54Ui1Gx8ujr6THCuwQ7srxHFy1alFq1arFx40ZhVBpUI5FPnz4VgkOlUkn//v3x8vJi//79QmDdr18/ypUrx9ixYzl06JDGOVesWJF169ZpXYvU1FSaNWvG3Llztdblxl825Z2dko7mBPqU46S/F7cDvdk7uB7bB9Rh7+B63A705qS/F4E+5cRgUuSDMDXUo5yTJZWLWlPOyVIQgw4MDCQzM5O6desybdo0Jk+eTIMGDfDw8Mijx/dMmTKFwoULU7NmTWEKv0jYQSK2TxaS1DMT35ERGYaetRPvDvxB5M5pxF/ZTfylnUQf/IOXf/iSEf081/2o1Qyy5z/C+0BRPbVlYWFB/fr1mTZtGmPHjmXhwoW0bds21+kLL3cHrRQBqZE5b9aOJP7STmJOrCJ6z0z0rAtjVun9SLJZxaYokmJ5u3E8Cdf2EXNsBe/2z0PP6r0EkUwqobKzVa7nl5Xp06fTp08fBg4cKOSqFYTWrVvj5eXFL7/8Qr9+/ViwYAFt2rRh48aNDB06VEuG6MyZMzg6OmJoaMjevXsxMzOjWbNmBAUFMWPGDKpUqSLkIM2ePZsiRYpQpEgR3N3dCQkJoXLlytSpUwdzc3MhmMqu1ZucnCwE8dmLiiSFyqBIiSdsqo9Gpaya6P3zCJ/VUWc1qGaBQ6ZKq8+6MFJDU9LfPEER94a5209rbXf//n3at2+PjY0NRkZGVKtWTUMs//Lly0gkElavXs2kSZM4cuQIU6ZMwcrKioMHDyKRSHj48CEGBgb4+vpq6c8aGRlx7dq1HK1d161bx/Lly/npp5+EwA9UZgiWlpb06tWLw4cPExoaypIlS4QUDl2f/6xs3rwZT09PrK2tNYqlGjdujFwu59SpU7lunx/WrVuHvb19riN5OZFXQZku1K5Xe/bs4datW4wYMYISJUrk6T+fV5937tzJcdZCF7qK90xLe4Iik+QHZ4VlKc+uoUhLwrSMqshDqVSS/OAMxiVqgFIpFCRmLV7Mbl1o6vG1xmd7RFN3ahZXTcn27dtX4wVuwIAB6OnpsW9fwV331PTp00cjneby5ctER0fTp08fjVzS77//XmWzqyfVKDBOeXIJiaEphi6qZRI9Q5DpkRZ+S8Mx6M0af1Ux07X9xJ5er3IYU8qxrNOJX33K4WSlXQTTsWNHrly5oqFOsXHjRgwNDYWUi+vXr/Po0SO6dOlCdHS08LlPSkri66+/5tSpU1opH7rk49So3XMKwl8+QqkL9cNfRORzU7VqVfbv34+/vz/jxo3DxcWFX3/9lXv37gnTo3nh6OjIxYsX+fXXX9m2bRsLFizA9n/snXVYFIn/x1+7dDeoGCg2doCFKAbY2K3YreedfWeehd3tid1xdhe2nt0YgKKS0rnx+2NvB4ZdBDzvfn7veD2Pzx2zszM7GzOf+cT7bWODUxFn3rm2I+HxBRIenEKio4NDl1kkPrtE4uPzJL28jlTPAF3LApjVaP1FHUfIUDPw9/fH39+f5s2bY2pqypUrV9i5cydNmzalbt26wvo7duxgxIgRrFy5EqVSSdOmTTlx4oSQic1Kd7ei+F8PEi2zqN2RtIggYq/vRZmWjGGxylg3HYJULyOTalSiOlae/Yi7fYjos+sxKFgKu45T+XwuYwhJrlDSpLwDm8k9a9asISEhgT59+mBmZiacOHODVCrl8OHDTJkyhd27d7Np0yacnJyEDJWasLAwPn78iIGBARMmTMDOzo4TJ04QGBiIs7Mzc+fOxcbGBi8vLyGjfvnyZSZMmMCrV69Yvnw5DRo04Pnz57x48QKJRIKhoSHR0dFfnLAtWrSoqG8wSH29USpIfHYZ8+oZOrpKeTpJL65iXKYOEi19tYr0VOKu7yXh0dk/9ewy9qtITeTD9kms2yVh2aCMbPuTJ0+oW7cujo6Ogtbmnj178PHxYf/+/bRt25YaNWpQokQJlixZwoMHD+jXr5+QRdu9ezdWVlaULFlSNGiUmZSUFJG9bGYCAgLo168fXl5ezJo1S/RYgQIFOHz4MD179hQmqM3NzVm+fDm9e/fWEGzOSmBgIA8fPszWGjg8PPyLz8+JN2/ecP36dYYPH651aOVL5GagTBseHh60b9+e6dOnY25uTpMmTfDx8dHQ580LM2bMoE2bNpQuXZqSZcpRr2FjBvfzxa1GtWyfo214T9+hBLo2hUl6FoCZukLxLACpkTmGxVR2j4qkWBSpiSTcP0nC/ZNat63QMpSoI5WgK5Uwo7ULnWsWxd9fdWOU+QYEVFaSBQsWzFZbOjdkHbhUD+5l1skFVYVFffOUecA4+fUdjIpXRSJVBaUSXT2sGvTh8/mNvF/WA4NCZTAqWRODIhVIfn2HhPunQKKSU9K1dmRy//Z0rllU6zF07NiRH3/8kd27dzNp0iSUSiV79+6lWbNmwvCf+sYgq2d3ZmJjY0WtW9rE4EF1/sxucOlLfJcB5d9JvnVZPlnx9PTUcOfx8fERysdqvhQg2Nvbs2LFCo1p6x7j/dg+bwI65nbYtBiNroUdFrU6YFGrQzZbUpFV6D+zmkGlSpXQ1dVl3rx5xMXF4eDgwKhRo5g5c6boOY6Ojhw4cEBj29kdRykHM9xL2nLtTRSGxSoJr8EED6w8sj9JAZi7tsXcVWzPpS51q0v13du60T2bfWtrbZBKpezYsUNUklEH01nRZjJgamrKokWLWLRIc6Jezc8//4y9vT2PHj0SGtLVA0MnTpwgOjoaIyMjLl68yG+//UaFChW4efOmkB2JiIhg165deHt7i7IjderUEQag1K87c5tE5kxIcpqcqARV5lHfoQSJTy6KAsrkV7dRpCRg6iL24lXz+cxaEh6dxaxGawwcyyI1MAGJhMjf5wl2GzK5ksRUmXCuGzVqFEWLFhUa+EHVQ1avXj3Gjx8vDMu4urqya9cuvLy8BJmctLQ0Dh48SLt27XB0dEQul2uqBqSlERUVpaEhCvDgwQNat25NhQoV2Ldvn9agrH79+rx584ZHjx6RmJhI5cqVhfK52o8+OxQKBU2aNBG1VGQmp+fnhPr7+DXT3V87UCaRSNi3bx83btzgyJEjnDp1ir59+7Jw4UJu3LiRY5CdGaG97IUcs96r0Qm8wYe399iy6Tf8166kVLvRdOvVh+5umsFqdsN7JmXdib2+B3lSLFJ9Y5Je3cSkXH0huFJ/D01cGmKSpddS2Ladk/iYdfX/lnmJ7Aag8iKPk5nhDUthpqugz4JH2HqLh9PMa7bBqKQryS+vk/z2HjEB25DqGuDQdTb6BZzRkUr4uG0CTrYmXxwwLlSoEO7u7uzZs4dJkyZx48YNQkJCRNJc6uzj/PnzqVKlitbtZP2efO0xZ8d/IpLK+AGFExKtpT/T2piGZezp7laUUg75JfX/GsnJyaIfVmBgIMePH//inV5u2eY3npYdujL18JNcSRllJuvduZpq1aoJPt3fmtltK9J48aU86x9+ie/VeECtIdqpUyeUSiWRkZHCY15eXuzatYu7d++Ksr69evUSldrc3NzYuXOnhnSJm5sby5YtQyaT5ZjF+hSXEYwZlalD7OVtpH/+iN6frkWJTy+iY26HQVHt72Hii6uYVPDEulH/jGOTpQlSJoWHqjKrQVGJuBSyIDo6mvPnzzNjxgzi4+OJj8+wbPTy8mLq1KmEhoby/v17YaK6TZs2wnGcPn2amJgYOnfuTHp6OqDSQc3MnTt3UCgUGtJPr1+/xtvbG3t7e44fP/7FQEhHR0d0YVR/53MagHJ2diYhISFXg1Jfw44dO3B2dhY0XTOTXXn/W1GrVi1q1arFrFmz2LFjB927d2fXrl30798/x31rc16SGplhWqkJppWaoEhLJmz7BN6c9mdrGU/8rwdh/uS9aBvZDe+ZlKtP7NWdKq1dE0uUqUmYlMtw7JEamyPRN0KpVGDkVCVXxzqlZXlGZDNMFhgYSMOGGTdYCQkJfPz4kebNmwvLrKysNHSN09LScu36px7ce/XqlWhfMpmMoKAg0cCTTWwgyNOp37AJdyKUogFjPauC6Lm1w9ytHenRoXzcNJL42wexaTWGOiVseFXEEoNcqGx07tyZoUOH8uLFC3bv3i0M+alR37yZm5v/5e++QqHgzZs3eb75+m56KP8O3kUn0XPjTZosuczWm8EEZwkmQWxd1mTJZXpuvJlnmY18/rcpUaIEEydOZP369fzyyy/UqlULfX39bDMceaVLzaKcHe1BnRKqDFhOUkbqx+uUsOHsaI9/VGf1/9t4IDFVxpMPsdwL+cyTD7Ekpsq+6WvJTGYNUTs7O9E/tU1r1vJo1hKjuqSbdcjDwsIChUKRrfZbZmTyjLOSkbMr6OiR+OQisthwUj+8JOnVbUzKe2QbMGR1NwKI++OIhmxTYnIqz58/F5x8Jk+erHHcU6eqHD5u3LhBixYtKFGiBKVKlRJktEBV7ra1tcXT0xNPT0+sra01JuBXr16NsbGx6IL06dMnmjZtilQq5dSpU9mWpLURERGBn58flSpVyvFi2alTJ65fv86pU6c0HouJiUEmy/hOvX79Ok+2dffu3ePZs2d069ZN6+PqAZmvNWjIjs+fP2tUFtTBdmpqao77/u3CY+r/vI0rT1UOSnKFUsPJRqpvhK5VQZSydCEYevdZdbOjdl4yMdBFV0fze6hnWwQ9OycSnwWQ+CwAHVNrDIpm9KFLpDoYl6lL0ourpEUEaTw/c9+wg4WqnaagRfbZs3Xr1gk3M6D6vslkMtHAmLOzs0a/7Lp163KtdVyjRg1sbGxYv3696Duzfft2jRaF48ePU6NGDfb92JwzP9Snp1sxCptJNXqe9awKomtgTFELfc6Ors/Wfm65CiZBNfypo6PDzp072bt3Ly1bthQUBkDVvuXs7MyCBQu02ntGRGhX3cgObdrGOfGvzVDuuh0iZIUg79Zl01u70CVfMP0/gbe3Nzt37uTTp08YGBhQu3ZtZs+erdGn81f4X1Iz+KeNB/6/KgiZNUSzy0ZnlV3JrmT5JWvQnMh8gdYxMMG4ZE0Sn14kJfgBqe8eA6pSYXYYlaxJ4uPzSA2M0bMtSmroc1KC7iM1Egurx0R+wq1WZSGLM2bMGK0yXUlJSQwbNozPnz8zduxYbt68ye+//87q1asxNDQUrN90dXXR1dXl119/ZdiwYRgbG7NhwwYCAgLYtm0bs2bNEpXCvb29efPmDePGjePKlStcuZIxKOTg4CAacPHw8KB27dqULFmST58+sW7dOhISEjh69ChS6ZcvwGPHjuXw4cO0bNkSX19fqlevTmJiIo8ePWLfvn0EBQUJMkWNGqnKr7ntvVNP+mdX7jYyMqJ8+fLs3r2b0qVLY21tTYUKFfI05KeNzZs3s2rVKtq2bYuzszPx8fGsX78ec3Nz4fPMbt8XIwyYtmAjUceXYNP8B0wrqQLyD+uHYli0IvoFnJEamZH2MZCk51cxq95S2K/6+zvhwCMiE1IZ3rAUhno6yLXc25iUcycmYDsSXT1MKzXVuNGxatCblOCHfNryE6aVvdCzLYoiOZ60sNekBN2nyA+7hOG9h5qbF5GWlkajRo3o1KkTL168YNWqVdSrV0804d2/f38GDx5M+/btadKkCQ8ePODUqVMiiaovoa+vz7Rp0xgxYgSenp506tSJoKAg/P39cXZ2Ft3gHT9+XLgJVQ8Y+xRNp1GjRjRu4YOTc2n09fW4du4EwQmfmfHjwDyf3+3t7WnYsCGLFi0iPj6ezp07ix6XSqVs2LCBZs2a4eLiQp8+fXB0dCQ0NJQLFy5gbm7OkSNHcrUvQ0NDTp48Se/evXFzc9PQmc2Of2VAueJC4FdfDOV/liUz/4Dy+XeTkx/st0R9spmGy3fdzzu8YSlsTQ2+aak+K9pKcFnJXEHwvx6Ee0nbb9ZTlVVD9P+LAubiTIxJhUYk7f8VyZ+DT/oOzujbZa+bad14IEikJD65iFKejoFjORy6zCRsd8aUuQQobKl6z9S6nHp6elqPOygoiPfvVaXOzDqgmS8qmUXHhw4dysGDBzl//jzDhg2jSJEiLF68mFGjRokC9QcPHgAq+aGseHh4iALK6tWrCxZ56iGUX3/9NVeDAsbGxly6dInZs2ezd+9etmzZgrm5OaVLl2b69OnZDgrlhEKhYNeuXVSrVk3DNSkzGzZsYMSIEYwePZq0tDSmTp36lwNKDw8Pbt26xa5duwgLC8PCwgJXV1e2b98uGqzIuu/2/X/gjq3277Z5jVYkBd4k5e1dlHIZOhZ2WNbviXkmiZvMqJ2XTPV1idFyOjAu507M5a0o01Mx/nO6OzM6JlYU7L2IqJMrVFaFEik6xhYih53cDu+tWLGC7du3M2XKFNLT0+natSvLli0TBXkDBgzg7du3bNy4kZMnT+Lu7s6ZM2eEm4jcMHz4cJRKJQsXLmTMmDFUrlyZw4cPM3LkSEHz98mTJwQHB4vK7aCqWnTt2pVz585x7MBudHV1KVu2LHv27KF9+/a5fg2Z6dy5M2fPnsXMzExjf6BS+bh+/Tq//vorK1asICEhgQIFCuDm5sagQYO0bFE7Ojo6nDx5kiFDhjB27NhcB5QS5V81+/ybUevTvX37VkOWQhu7bocw4cCjXG///aq+GBatiG3L0YBKVDVs5yQcus7GsFgl/NpVZPXYXkRGRvL48eOvPQwNshNX/StIJBKmTp2qMZyQTz5fS26CPjXqx3MT9GWuIHxNsPqtKgh9+vRhx44d/PHHHxoX/cw6kmqbxL1794o0E9Xnp9u3b4v0PqdNm8b06dOJiIgQMiJZf/OZrRen3lYKGqBKuYz3K3phWLQCSS9vYNWwj8bAU15I//wREwMdjk3qIGR4GzZsyMOHD3n8+DEFCxYUra9NP7NSpUrY2tri4ODApUuXeP/+vShTuHLlSoYPH86DBw+ErO7Hjx8pXbo0CQkJf9lTOp+88y46icaLL5Gaja3q12CgK+XsaA8mHXzEtTdRGr/d4LktMavWAuum2Wtqqq+xtj4TRPqp6uG9byHC/3eiUCiws7OjXbt2rF+/nnnz5rFo0SI+fvz4t/fQfu/8q3oo30UnfZV12ZeYcvjJN/1B/hdISUlhzpw5lC9fHmNjYxwdHenYsSNPnog/G39/f8GeLOs/bYLihw8fplq1ahgaGlK0aFGmTp0q6m3RxoABA5BIJLRs2VK0PCoqivnz51O/fn3s7OywtLQUxGPzyUBdqlf3BRWzMSbrKVMCFLMxpqdbMaEv6EvB5IoLgUw48IhUmSLPwz9yhZJUmYIJBx6x4kLu9fOyQ5uG6Ny5c+nUqdMXs1DfmswaoBIdXUzK1Rd0/YzLe3zpqTkStvNn3vhPEPWIq6WkKlasKPQPz5w5kxYtWmjNWnbu3JlLly5x+PBhOnTooFF27tKlCyYmJrRt25alS5cyZ84c3Nzc/vJE9dfwT/bhfs9MOvhIaPn6VsgUSiYdfMTsthXRzaNlck58j8N7KSkpGjdDW7ZsITo6WtD8dXJyEgwT/ut8H/W1b8TX/IAcB66FL3wRZAolbyISsNPLdpXvhuTk5Dzrov0ddO/encOHDzNgwACqVavGhw8fWLlyJbVr1+bRo0catnczZszQ0MNSC/mqOXHiBD4+PjRo0IDly5fz6NEjZs6cSXh4OKtXr9b6Ou7cuYO/v79QmsjM9evX+fnnn2nevDm//PILurq67N+/ny5duvD06VOmT5/+196Eb4y2jNc/ybcq1e+6HfJNejMhowT3V4aWxo8fj1wup0+fPiINURcXF5Ekx99NVg1Qk4qexN89iqFTZXRNrb/ZfjL3iN+5c4fp06fj7+9PVFQU9vb2VK1aVUOQHVQB5S+//EJSUpJG7xaAjY0NBw8e5Mcff2TcuHEUL16cOXPmEBgYqCHJ9XeQr+QhJjAsnoBXkTmvmEfkCiUBryJJlcmZ3tolT9XAnMjL8N4/xY0bNxg9ejQdO3bExsaGu3fvsnHjRipUqEDHjh0B1RBYPir+36MPhUJBWlqa1ot+XvjaH5BE98uRolyhJDY5HQvJ95+l/Kvv4bcgNDSUAwcOMGbMGObPny8sd3d3x9PTkwMHDjB69GjRc5o1a6bhBZyVMWPGUKlSJU6fPi0EzWrbu1GjRlG2bFnR+kqlkpEjR9KrVy/OnTunsT0XFxcCAwNFwe3QoUNp3Lgxfn5+jBs3TjRB91/lypUruLur+qHUwWxm44HQ0FD69BzA6dOnUSgUNGzYkMWLF2vtdfu7Kgh1nG3/0oVIR0dHq4ZoZrRZfUL21qDadDHVgx+rVq3C2NgYX19f0TbVGqByhRKJVPUd/9IwTm5RywaBuEd8TNPSbN6cO6n5kiVL5li2btKkCY8eaQYYf2cLzj/RhxsfH8/kyZM5dOgQHz9+xMLCgsqVK+Pn50e1aioR8OxamNRZrMwapMuXL2fNmjW8ffsWAwMDnJ2d+fHHH4XJ8eDgYPz8/Dh37hwhISEYGxvj6enJ/PnzRW1f6naLK1eusH//frZu3UpSUhJNmzalZLsfc2xR0YY8OZ6463tIfnsXWUwYSCQYFC6PlUdv9B1Uv2kdqYRtN0KY1tolV8N7MVd3ERuwHavGAzGvkSFzg1JJ7LXdxN87jiQlnnW36lF97VqRkHhAQADLli3j5s2bhIWFYW9vT4cOHZg9e7ZI6s3X15d9+/bx4sULhg0bxtmzZzEyMqJ3796CvefX4OTkRJEiRVi2bBnR0dFYW1vTq1cv5s6dq+E1n08eSt4//vij8P9yuRwzMzPGjx8vLFuwYAF16tTBxsYGIyMjqlevzr59+zS2I5FIGD58ONu3b8fFxQUDAwNBAPjJkyd4enpiZGRE4cKFmTlzpoZVkDYOHz5M6QLmyCKDhGWJz68SPLcl4QfELgyh6wcTcSgj8/B+VV8ijy7+4vYlEgkxyek8ffqUhg0bCmVcbc3lqampTJ06lZIlS2JgYECRIkUYN26cIO2QHery75UrVxg5cqRQhh00aBBpaWnExMTQq1cvrKyssLKyYty4cRoneIlEkuPJOy0tjSlTplC9enUsLCwwMTHB3d2dCxcuiNZr0KBBtuXoL/V9qjXtHBwcRMvVfVrZCanGx8dnK+fw9OlTnj59ysCBA0UZ2KFDh6JUKrV+z7Zu3crjx481XDjUFC9eXCNTKpFI8PHxITU1NUcrtP8CCoWCESNGZBtYJyQk0LBhQy5dusSkSZOYPn069+7dw8PDQ0OXEP7eEpw21L+pL03wrl+/XkPy5u9m1apVWn9DmcuICQ9OIdE3wrh0nb/tdfzgUw+Plh1zXC837+PfwcWLF5FIJKJgLDO7bofQePElrr1RfdfyquShlsLJicGDB7N69Wrat2/PqlWrGDNmDEZGRiKno9yyfv16Ro4cSfny5VmyZAnTp0+nSpUq3Lx5U1jn9u3bXLt2jS5durBs2TIGDx7MuXPnaNCgAUlJmpJ2I0aM4MGDB0ydOpUhQ4Zw5MgRNi+Y8lVasrKYTyS9vIGRc02sGvVXaSdGBPFpx0Rk8Rnv84WXKjmt4Q1LMbddRQx0pVrl0D5f3kpswHasvYeJg0kg7sY+kgOv073/MH75WSXWnXV6fu/evSQlJTFkyBCWL1+Ol5cXy5cvp1evXhr7ksvleHl5YWNjw4IFC/Dw8GDhwoV58irPipOTE4cPH+bTp0+kpaXx6dMnfvvtNw3v+nxU5DpDGRAQIPz/vXv3SEhIoH79DOHSpUuX0rp1a7p3705aWhq7du2iY8eOHD16lBYtWoi2df78efbs2cPw4cOxtbXFycmJT58+0bBhQ2QymWAFtm7dulwpuderVw8kEpKCH2Fu6wRA6vsnIJGS+v6psJ48KRZZ1HvMq7XMZkvaUSqVxMZ+xtvbm3bt2tGpUyf27dvH+PHjqVixoqB9pVAoaN26NVeuXGHgwIGUK1eOR48esXjxYl6+fCn4+H6JESNGUKBAAaZPn86NGzdYt24dlpaWXLt2jaJFizJ79myOHz/O/PnzqVChgtYf1peIi4tjw4YNdO3alQEDBhAfH8/GjRvx8vLi1q1bgrbZzz//TP/+/UXP3bZtG6dOnfrij8nZ2ZnChQuzcOFCypQpQ9WqVfnw4YNQBss8HaqmYcOGJCQkoK+vj5eXFwsXLhRJ9ty7dw9AI4tZqFAhChcuLDyuJj4+nvHjxzNp0iQNYeWcUPdu/n+Ulb831q1bx7t37+jfvz9Lly7VeHzVqlUEBgZy69YtatasCaiyzRUqVGDhwoXMnj1bWPfvLsG9Co/PkwxHYmIiJiYmIpHy/2+KWBvT2uojG44EEH//FGbVWyDV/3urDvffxfAuOumblxqTkpKYN28eDRo0ELJ035J/Usnj2LFjDBgwgIULFwrLvlaj9tixY7i4uLB3795s12nRooVo8AtU3vS1a9dm//799OzZU/SYjY0Np0+fFnr4UtJlrFy+nCKeQ5Aa5q3Kom/nRKFBa0WSP6YunoSuH0zCw9NY1u0KQEhUkuC81KVmUeo62zLp4CPekCHu/vn8RuJu/45Nix8wzeSOI/0z8DSSyvnj7j2cC1gCKiHyUaNG8fjxY2FAzs/PTxQDDBw4kJIlSzJp0iRCQkJEurApKSl07tyZyZMnA6obgWrVqrFx40bBMjSfv5dcZyjVQSSogkupVCpykHj58iUrV65k2LBhjB49mitXrlChQgWttmcvXrzg4sWLTJkyhaFDh1KlShX8/PyIiIjg5MmTTJ06lTFjxnD16lXBT/NL6JuYo2dThNR3GcFj6rsnGJepgyIplvSod8IyQDBvzwtpcVFMmTaDJUuWMGTIEE6cOEGBAgXYuHGjsM6OHTs4e/Ysp06dYvHixQwcOJDly5ezYsUKfv/9d65du5bjfhwcHDh+/DhDhw5ly5Yt1K5dWwget2/fzpAhQzh06BCFCxcWvIXzgpWVFUFBQSxcuJDBgwczduxYbty4gbW1NcuXLxfWa9KkCT169BD+lShRgvPnz9O3b1+tcgVq9PT02L9/PyYmJrRu3ZoiRYrg5uZGQkIC165dE/VGqst+K1eu5ODBg4wbN45z585Rp04d3r17J6yndjbIOo2qXqa2ZFMzY8YMjIyMNErrOREdHc2GDRtwd3fXuq/vgZiYGHx9fbG0tMTCwoI+ffpozVr8VaKjo/nll1+YMWOGRj+rmn379lGzZk0hmAQoW7YsjRo1Ys+ePaJ1t98M0chgBM9tSfTp1SQ+v8KH9UMIWdCOj1t+Ii08CID4eycIXTOA4Plt+bR9gqoEl4mUd4+JODiH96v6UNbRhiJFijB69GgNG8AxY8ZgamrK69evad68OWZmZkImxNfXF1tbW1EGTqFQsGTJElxcXDA0NMTBwYFBgwbl6LcMqhuSPn36ULhwYQwMDChYsCBt2rQRtu3k5MSTJ0+4dOmSkPHPHHDtXTaDxGs7MXKugWW9vFv75QmFnLiHZ/EZPCHndfNIUlIS06dPzza7mBvq16+Pu7u7ILau5lv34e7OIVNpaWkpnIv/KpaWlrx//57bt29nu07mACo9PZ0iRYqwZMkSLC0ttfajDhw4UDQQUqpSDVAqkMXl3bNcoqsnBJNKhRx5chwSfUP0rB1J+5QhAK9E5bykRj28B1Da3pT0y+uJu3MY21Y/CcGkenivaTlV9ern0UOFYBIQWmsyV4cyvxeJiYlERkZSp04dlEqlRiIBVEFkZtzd3fOrTf8guQ4olUol169fB1QBZYUKFUQXmswf/OfPn4mNjcXd3V3rD8DDw4Py5cuLlh0/fpxatWrh6uoqLLOzs8uVX2pwVCIGRVxUWUlAkZpEWvhbTKt4IzUyJ+XPQDLl/ROkBibofUHTLTsk+kbU8vIR/tbX18fV1VX0Zd27dy/lypWjbNmyREZGCv88PT0BNMrK2ujXr5/o5ODm5oZSqaRfv37CMh0dHWrUqPFVPxQdHR2h90OhUBAdHY1MJqNGjRrZNs9/+vSJDh06UKVKFVatWpXjPqysrKhSpQoTJkzg0KFDLFiwgKCgIDp27EhKSoqwXqdOndi0aRO9evXCx8eHX3/9lVOnThEVFSUqVasDBLXncGYMDQ1FAcTLly9ZunQp8+fP17p+digUCrp3705MTIwosP7e6NSpE/Hx8cyZM4dOnTrh7+//twwQTZ48mQIFCmSrXaZQKHj48KHW3ldXV1dev34tsvS78CJcawku5d0TPp/fiEnFRljU60Z61HvC900n/o+jxP9xBLNqzbFwa0fqh+dEHhdnSZOeX0UpS8WsajNKtBnxxXKYTCbDy8sLe3t7FixY8EUduEGDBjF27Fjq1q3L0qVL6dOnD9u3b8fLy0vkzqGN9u3bc/DgQfr06cOqVasYOXIk8fHxhISogpYlS5ZQuHBhypYty9atW9m6dSs///yz8PygoCDSUlP4bftujExMc3RV+ha8iUzkVXh8ziv+w0ilUqRSqeh8+Hf14X7JHW3evHkkJiZy48YNXF1dmTZt2lcHKePHj8fU1BRXV1dKlSrFsGHDuHr1qmid5ORkpkyZQpEiRTAwMOD9+/fs3r2bmJgYrc5LWd2bjE1V/c1q6828oFQqiLt1iNC1AwiZ35b3S7vxfll30iOCkMdHETy3JelRKo3S39as0Crl9zzgKB+u/c6SpUu5uPpnDg6pQ/O0AILmtuTyWE82/6KyKR03bpxwU3X16lWsrKwA1futrdXK1NQUOzs7PDxUqgdZ3wtDQ0MNuSsrK6tc3Qjm823IdUBZuXJloeyduVFfzdGjR6lVqxaGhoZYW1tjZ2fH6tWrtf4Ask70gqoRWZszSW6kO9JkCgwLuyBPiCb98wdSQ5+pmokLlVUFmn8GlKnvnmJQuLxWq7Kc0DGzIV0uviBm/bIGBgby5MkTDTsztXRGVhs3beTF2u1rfyibN2+mUqVKGBoaYmNjg52dHceOHdP6WclkMjp16oRcLufAgQM5BmnqG4natWszZ84c2rRpw08//cT+/fu5cuVKjiLi9erVw83NTeRVrb5Z0daHmpKSIrqZGTVqFHXq1MmzcOyIESM4efIkGzZsoHLlynl67j9J1apV2b9/P0OGDGH9+vW0bdtWlCX/Fjx8+JC1a9eyaNGibJvZo6OjSU1NzTZrDAiZ44RUGSHZXLDTo0Mp0G0uFrU6YFGrA1YN+yCPiyD22m4K9FyAuWtbldiya1tSQx6KspSWDXyx7zgNi9qdSC/lydKVa5g5cyb79+8XAjg1qampdOzYEX9/f4oWLcq6deswMTFh+/btJCYm8scff1CsWDGuXLnChg0b+PXXX0lLS8PPz48lS5agr6/P7du3v1gViImJ4dq1a/zyyy/8+uuv9OvXj4kTJ3L+/Hnq16/Ppk2bWLZsGR8/fuTFixfMnj2b+Ph4kaC3mqx2nRIQMrnB89vyYcNQkl5cI/LoYt6vEvuIK9JSiD63gfcrfQme70PoukHE3jyQ7VCNVALbbqjer9z2sd+5cwcvLy9sbW0xMjKiePHigp95UFCQcGGfPn26EBBk7u9+/vw5HTp0wNraGkNDQ2rUqMHhw4dF+7h48SKXLl0SWQnWqF2Pt2uGkBYZwqcdEwlZ0J73K3oRe0Ozjzq3fKkPF1Q3ca6urpQsWZJChQoxf/58XFxcOHHihLBOdpIxWfvCy5Urx4sXL9i1axf16tVj//791KtXT5SFHTFiBLNmzaJTp07s2bOHo0ePcuLECWxsbLR+Fll/o4Lz0ldof8Ze28Pn8xswKFIB21Y/Yd95BvZdZqpcbVITkRqaoWvtCMCTe3e0+pnXrVsXBwcH1q9ZTUFDOVWLWjG4dzfhBmrSpEnCcRYpUgQrKytRlQNUyYPNmzdToEABzMzM6Ny5M5MmTeLMmTNC/3HW9+JrB2/y+XbkuofS3d2dgIAAnj9/TkREhCigDAgIoHXr1tSvX59Vq1ZRsGBB9PT02LRpEzt27NDYVm76IvOCvq4Ug8KqjGdqyGPSY8PQd3BGqm+IYWEX4v44giItmbSw11h65K3nUI1EIkVfi+dm5pO0QqGgYsWKWsv8oBkUaiMv1m5fIxa8bds2fH198fHxYezYsdjb26Ojo8OcOXO0etqOHTuW69evc/bsWQoXLpzj9vfv309YWJjIAgtUWWlzc3OuXr2aYz9LkSJFRIMS6gDl48ePGu/hx48fhaz2+fPnOXnyJAcOHBANEMhkMpKTkwkKCsLa2hpzc7El3fTp01m1ahVz587V6E/63tBW0jl48CBxcXEax/W1jBw5kmbNmtG0adNs18kpa5x5neCoRLL7pho5VUbXMmOAy6Cg6ubLuEwdpAbGmZarbizTYz4J60v1MvYtT0vhXmDIF8thQ4YMYevWrfTu3RsvLy/8/Pzw9/fn/v37NGrUiHv37rF3714sLCxITU3lxYsXdO7cGXt7e54/f866deuYPHmyRolROBYjI/T19bl48SL9+vUTMi5qVq9ejYuLC3Z2dpiamlKkSBGGDh2KQqFg2LBhGtvLbNfZZPRiIg/5oWdXDCuP3ihSEog6sQwdMxvRc5RKJRH7Z5AS/AjTyk3Qty9B8tu7xFz4DXl8FNaNB6BUKkCeoc2oUMKFl+EM/mSTqz728PBwmjZtip2dHRMmTMDS0pKgoCAOHDgAICQThgwZQuvWrQV5FbXg+ZMnT6hbty6Ojo7Cfvbs2YOPjw/79++nbVvtIu6BYfHEJqejSIknfM9UjEvXxqSsO0kvrhBz0R99OyeMnL+sFqGN3PThGhgY4OjoyKFDhwgPD6datWrMmjVL6J+3srLS6qEdHBysoXhgYmJC586d6dy5M2lpabRr145Zs2YxceJEDA0N2bdvH7179xb1bKakpOTaHzyr81JeSHpxFYOilbBtPkq0PCo1EaVCgX6h0qobBODxvTv89NOPGtsoWbKk0D/r7e3NuXPnqFSpkvD5X7x4kdmzZ1O+fHlWrFhB//79NSamdXV1qVSpEp8+fWLz5s2iqsOZM2e++vjy+XvJdUBZv3591q9fL0iwZB7I2b9/P4aGhpw6dUp0gcmLpV2xYsUIDNQUKs7NBKaTjQl6FvbomNuR8v4psphPGP7ZJ2lQtALy8xtIen4FlAph+dfgZPPlBmdnZ2cePHhAo0aNvluR03379lGiRAkOHDggeo1Z+5QAdu3axZIlS1iyZIlQZsiJsDBVBinrnblSqUQul+coRA6qHprMpQv1oNCdO3dELREfPnzg/fv3DBw4EEDISrVrp2kdFhoaSvHixVm8eDE//PCDsHzlypVMmzaNH374QaRa8L2SNYOtDlo+f/78TQLK3bt3c+3atRxdoXLKGmdeJ+0LxgA65uISldTAJJvlquAycxlPFhtOTMB2kl/dRJGSgHum+7is2XZdXV0sLS0ZOXIk/fv3FyY/79y5w5s3b/j8+TMTJ04kNjaW2NhYIZt248YN0XYiIiLYs2cP+/bt49y5c6SkpFCpUiUmT55MixYt8PPz46effsLOzg65XE63bt0oUqQI27ZtIyIiAjMzM0xNTXF0dOTUqVOUK1eO4cOH0717d6GFSG3zNnr0aBYtWkRBSyM+nFVlRg2LVcbc1QcAfcdyROydChIpwfN90LVwwKBQWVKCH2JZvycWdVR6kdFn1qBrWYD4O7+T/PoWsthw7HzEfZMhUUnMnD2HiIgI2rRpw6xZs9i1axdXr14VKkctW7bk9evX6OjokJiYyJYtW0SGAeq++c2bNwtyRGFhYfTo0YM7d+4wduxY/vjjDz5//iy07aiHW4YOHUq9evUYP358tgHl9pshSCQS5AnR6BdxIfHpZRSpiehaFUJiYEzCw9OigFKpVBB/5wgJD0+THv0Bqb4R+gVKYlm/JwYFVceU8PAMCY8vkB4ZTNkFSZQuVZIRI0YIN71yuVyYHVBjb29PoUKFRN99Z2dnYSp906ZN+Pr6cvToUd69e0eJEiUEF7MRI0ZgY2Mj6MoGBgYSFBSEXC7H3t6e9u3bo6OjI0oWODk5YWtrKzqnvnnzhpUrVwKqqk6VKlWE76CRvir5kBb2RuVI02Y8ss8fiL93HHlSHIaFy2HtPRw9q0Ia77Gqepexb3lKAkkvriGPj0KiZ4C+bTHkSbE46KXwR+h7SpUqRWRkJIaGhpiamgrPq1SpEsePH6dJkya0atWKEydOaNyYXLlyBaVSmWNbW+b3QqlUah0QzOf7INe1X3d3d5KTk1m2bBnOzs6iUpeOjo7qh57pCx8UFJSrqWY1zZs358aNG9y6dUtYFhERwfbt23N8romBLkWtjTEs4kJK8APSPr7EoLAqcNS3L45E34jYG/uQ6BqgX6BkDlvTjp6ONEfx5k6dOhEaGsr69es1HktOTiYxMVHLs/5Z1JnOzD/SmzdvCv2xah4/fkz//v3p0aMHo0aJ71a/hLq8v2vXLtHyw4cPk5iYSNWqVYVlERERGs8/fvw4f/zxB97e3sIyFxcXypYty7p160TfsdWrVyORSISJSE9PTw4ePKjxz87Ojho1anDw4EFatcqQrti9ezcjR46ke/fu2WaVvzeyy2B/K2u7sWPH0rFjR/T19QkKCiIoKEjIjLx8/ZYLd59zL+QzH1N0MDAwEAamMqNeVqiQ6oKlLbOvJtv2k2zbUlTHqVTICds9meTXtzGv1QG7dr+wfuehbMthBgYGnDt3jpiYGLp27Sr0N2fu6b1x4wYKhQJ7e3scHBwoVKgQZmZmdOzYkYEDBwqlugEDBnDq1CmGDh3KrFmzSElJoXXr1hw8eJAffviBly9fMmDAAAB27tzJggUL6NKlC5MmqaRRQkNDkclkREZGCq40p06dEl6HeuhR3WJ0+8kr0iOCASWGTlVUx69UEn9rv+qt0tXH2rM/etaOJD4+B0gwqy6WaFH++X7oWjli3XgguhZiWS8lcPTYMWxtbTl58iQHDx6kXbt22NnZCRqvxYsXZ9GiRULGsUePHhq/4aioKGHSH1TBkDqjGRQUxMiRI1EqldSpU4fr168Ln0NUVBReXl4EBgYSGhqq9ZO/8CL8z+OQkPb+OSYuHlg17IuOoSnK1CRSP4iTD1HHl/H53Hp0zGyxauCLRa0OSHT1Sf3wXFgn/t5xdC3ssajdCaeWg4WssTpYi4+Px9HRkefPn/P+/XvWr19P586duX37Nl27dhW2079/fyIjVSoGFy5cYOzYsQwYMABnZ2fRa2ratCktWrQQPtu6devy7NkzKlasSOfOnfH396dgwYJs3bpVcG6KjIzk2bNn2NiostFhYWHUqVNHuOkbOnSo6DuoRvJn/23cjX0kvbyOuWs7LGp3JPXDCyIPL9D6HhuVdCU15BGRx5YQf/8koav6EH1imeo7kp5K3K0DvF/WnT8Wqnr6W7VqhZ2dHcOHD9fYVq1atfj999+5ceMGHTp00Og/DggIoEiRIqLklJqkpCTq1FFJZvXp04datWqxcOFCPD09BZ/5fL4/cp2htLe3p0yZMrx48UJDyLdFixYsWrQIb29vunXrRnh4OCtXrqRkyZI8fPgwV9sfN24cW7duxdvbm1GjRgnllmLFiuVqGw3L2PO0SAUSn1wEJBgUUZXAJVIdDBzLkfL2LgZFKyLRybtMiEQiyZUTSM+ePdmzZw+DBw/mwoUL1K1bF7lczvPnz9mzZw+nTp3KUcD776Zly5YcOHCAtm3b0qJFC96+fcuaNWsoX7686E68T58+gCoTvW3bNtE26tSpo1W4GlQnGBcXF2bMmEFwcDC1atXi1atXrFixgoIFC4qGi+rUqUPVqlWpUaMGFhYW3L17l99++40iRYoIF2818+fPp3Xr1jRt2pQuXbrw+PFjoVxSrlw5QJW9y5rBA/jhhx9wcHDAx8dHWHbr1i169eqFjY0NjRo10rhx+dIx/pt59+4dO3bs0NqqUreWK3r2xSnUVzW0pLQqyraj57H3fiJyILl58yYlSpTAzEz1t5ONCRLItuz9NaRHBCOLDsWmxWhMKzZCAnRt68W1y9kPvqkrIOohuaxERUXh7OzM2bNnKVCgAKGhoVhaWmpIvMTHxxMQEKCSK0MVYFaqVIkff/yRNm3a4OzsTOfOnVmzZg0lSpTgw4cPfPr0ibZt27Jjxw5evnzJ1atXRVn4ixcv0rlzZ5RKJVeuXKF9+/YcOHCAhISETEoXEgwLq77ryYE3SQl+iJ5NERTpqZhVb4lZ9Za8W9YDRVIM8qRYUcuAPE4V+OnbFsWsmljGDVQB+vugt0gkEo4fPy60OwQHBws3+cuXL8fJyYnBgwcTGhrKmTNnKFKkCF5eXvj4+KBQKPj06RNr1qyhffv2bNiwgbJly3Lt2jU+f/4siN9PnTqVS5cuAWgMUYCqpO7o6Chapu7DlSdEA0psWv6A6Z+i72ZVm/F+ZS/k8dEoUpOQGhiTEvyQxEdnMaveCusmGYNl5m7tRDdfDt3mCq0TcuDAtEW0b9OSRYsWMWzYMIyNjRk6dCirVq0iMjKS0aNHU7JkSVatWiVq3fHy8uLnn39m1qxZ7NixAzc3N44ePcpPP/0kOo5Bgwaxfft2Yco7OTmZn376iV9++QVzc3OioqK4ePEivXr1Yvv27aSkpCCXy/H29hbaOObOnUtYWBgTJ05kzpw5dOvWjRkzZgjfQXVPtfLPITilLI2CfZcJ1z6poSmfz64jLSIIfTsn0euzqN0JZXoKiU8vkfQsAF2rgphW9iLu1gHkcRHYd5oOUh3KRVwiMfYzc+bMATJuHrPi6enJnj17aN++PT179hSdV0JCQoTBHNFrsLBg3LhxVKtWjXfv3rFw4UJu3rzJH3/8Qe/evRk5cuR33ef+XyZPTjnu7u68ePFCYyDH09OTjRs3MnfuXH744QeKFy+On58fQUFBuQ4oCxYsyIULFxgxYgRz587FxsaGwYMHU6hQIVEQkh3d3Yqy7ogqiNSzKYyOUUb5z7CICylv72JY+OvK3UqlEkvjnANRqVTKoUOHWLx4MVu2bOHgwYMYGxtTokQJRo0a9f/ia5sVX19fPn36xNq1azl16hTly5dn27Zt7N27VyTxERERQWJiolBOzsymTZuyDbb09fUJCAjg119/5dixY+zcuRMzMzN8fHyYPXu2SN+xc+fOHDt2jNOnT5OUlETBggUZMGAAU6dO1RBGVwfC06dPZ8SIEdjZ2TFp0iStNnG54enTp6SlpRERESEME+T2GL93QkJCSEpK0nAPyg3qDEdkfCrbbgbz9GMcSc8CSHx2GZuWP6JrlvH5GZetS8xFfzYcOov/9ZK4l7SlXwUDzp8/z5gxY4T11BWE4C9M0uaZLBnMojbGGOvrfLEcps5abt26VdAnnTdvHjdu3CA+Pp5169ZRsGBBVq1axadPn5BIJIwcOZIqVapgampKeno6LVq0oFChQkIwCWBqasrAgQOZOHEi9+7do3r16sJjAwcOZNGiRURFRdGoUSNBTN/e3p7t27dz/PhxFi9eLJTWnz17RlRUFBMmTGD//v1cv34dPR3VseqYWSM1VJUVk9/cAYkUXauCgswSgK6lA2lJMSS/uYNepiylfuHypL3PZjpaLiPi4BwUCgVNmjQR9c4eOJAxzBMdHS2UNXfs2CEMUoSGhtK3b1+MjY3R19enT58+xMXFCdtQl/KPHj0qZGTHjBmDl5eX1peT2SlFjboPV54SDxIpJpn8zSU6uirZuKQnpLx7jHFJV5JeXAUkWNTrprGtzAGMqA83JZF7gSF4eHhw6tQpYmNjsbCwYN68eUJQ/SUZpP79+zNr1izWr18vJF3U66v3OXDgQAYOHCiUvM+dOycaSFH3RC9ZskQYAHNycsLCwkLoCy9Tpgyurq7Mnj1bpPWq/g7a29ujVCppMnYVZ8+DSaXGokSK+jooiwnTCCglunpYefbDylN8zZXFfiLtwwtMS9agTgkb7i3eSceOHTV837VVSlq3bi3KTjZo0EAIhjOXu52cnLQ+/6effmL27Nn8/PPPNG7cmEqVKmms5+/vr9UsQJtjVT5/H3kKKNevX6+1nAvQt29frRfmrB/ml0pzFStW1PqD1bbdrJRyMKNRrWpcsz+mIU9iUaez0E+Ulcy2ZACGxSpRbMJR4W8dqYSOUzcIGluZ0fYF1tPTY9y4cTkK32Z1nciLhZt631n3n5uyp0QiYeLEiUycOFG0PKv4/F9xxbCysmLRokU5lpFnzpzJzJkzc71dHx8fUZYxt2g7luze738DvXr14tKlS19VBvfx8WHX7RDmH36CzKICxmZK0sJUEilGJaqjY2whrGtWtTkJ90/xcfc0zN3acuKOLrtuHcLc2lYjM9OwjD1bbwZ/lXuHNvRsCqNrWZDP5zeiSIjCpExhPD1nfFH5QF1+tLe3Fy6E27ZtEwYCatWqhZOTE76+vvj7+2NkZISVlRUfPnwgMDCQnTt3AtpF79VZ8gYNGtCjRw9BMH3btm2EhYVRoEABUlNT+e2336hXrx7h4eHcuHGDt2/fAqoWk+TkZAICAihYsCDVqlUTlDV69VEZDOgYWwr7k8WGo2NmgyxWrByhZ12YtA8vkEWLtVnVAtc6FpoZwdgbe1GmJVPI0VEk9QSI+tozB8pqKlWqxJ07d9ixYwfdu3fH1tYWfX19UdDm4eFB+/btmT59ujBo8uzZM2bOnJlraS91H65SloZER0+jVULdeyv/8/1Ij/mEjpk1OkZfFrtPef+U2IDtpH54jjI9FfclGY+pA8q/k6/piQ4ODsbNTfN6pP4OBgcHU6FCBQa4l+DsAtDN2o/8501JTrJCipRElApVz3tK0AMMi1VGkhJH/4qONHjyhJkzZxIZGYmenl6e3ielUsmOHTuoUKGCMKiTE6NHj2by5MmcPXtWqzlGPt8HedfP+Y7JbF32rdCVSpjdtuI33WY++XyvrLgQyIQDj0iVKXIM/qQGxjh0m4NhERdir+0m+vI29OycMGr3K7sfx4jW7e5W9JsFk6DKStl3mIK+Qwliru/lxv61lCpVii1btmT7HC8vL8H/XZuepNouUp3lVCgUTJo0SZD+yVqG1YaHhwcXL14UbryTk5PZs2eP4PmsDvIrVaqEn5+f0Gcuk8m4fv06AQEBQgVIrawhS1VldmWx4SjSMjRXlbI00iOCRPs3Kq7qUVbfBKiRRb0DJBiV0Gy5MSpeFam+IVKJRKOPPXPf99atWzlz5gwHDhzg9OnTnDlzhrVr1wIZg3Nqa1RjY1W5PSYmBolEwr59+7h+/TojR47E1NSUY8eOUalSJY2BF2191fDlPtyvJf3zR8J2/ow8OQ4rz/7Yd5zK+p2HBEOE3Nj+Zia30kGZ+Tt7ou3N/3RZyq4fOYd9hO//lffLugs6lPF3fuf1oq40cKsCQNu2bbGzs6NNmzZ5el1qw5LcaEyrMTIywsbGhujo6DztK59/ljxlKL93ilgbM721CxMOZK8plldmtHb55rZk+eSjxtfXl4sXL+aYEc4uU60t0/q17iTZOZBYunfH0l37yV/X3Ba7thM1li84/ZLQR9c58dsinj9/TmpqKp2WneHOpzQhsMxcCRC2Z+mgdXnWygGAnm0RCnWbRZ0SNqIKgvpiPGGCapLZ09NT8HtfvXo1PXv2pFq1anTp0oU6depw//59oqKimD17Nvv378fc3ByJREJqaio///wzjo6OnD59WsgmqocvMvP8uWrQY+7cuVSoUIGLFy/SsGFD5syZQ4cOHXjx4gX6+vqCnWnp0qVJTEwUlCH09PQICAggICCAsWPHAprKGoqUBD5tHYtppSbIk2JRJMWqeihlacLr0PlTUin1/ROiTq5A316l+Sv7/BGzGm3Qs9LUDTV0LEv7bn3YPWsYenp6oj7248ePC+vVq1cPJycnlixZwqpVq2jbti3Ozs5cvXqV9evXo6OjI/TNGhkZUb58eXbv3k3p0qWxtramQoUKzJo1i+7du+Pq6srLly/p1KkTbdu2JSwsjOvXr/P+/XsePHig8RrVfbgSXX2UqUkolQpRllLxZ9CtY6GyhdWzLEDKm7vIk+OzzVImv7oF8nTs209G18Je6MOd/eiW1vVzQp1dzCrvkxu3t7xQrFgxreon6u+guq1CTevKhTinKcaQI1aN+qNISSA19BmxV3YydM562lYvyvLlywkNDWXu3Lmq9bLIY+XE9u3bkUgkdOum2Y6QHfHx8URGRmrtuc3n++FflaEElSDwmKbfpldxbNMydK6pOeSRTz5/F0lJSUybNu0vWdZ9Dd/agUSeHMe8sYPR0TNg5cqVbN26lTmdav6/VxC6devGuXPncHR0ZP78+YwaNUpwPclsKaqnp4eenh4rV65k4sSJ6OnpCULWHz58EKkiJCYmsm7dOpycnDQcwNSUKVOGffv2CVmsixcvMnDgQEFBoVKlSuzcuZOQkBBRhlKtrFHUqTi2bcaiVMj4fNEfRfKfPYoSCRLdjP64+DsqcXCTio1JfnWL6LOqTKmBY1msGvXX+toUSpgyuDO7d+9GoVCgq6vL3LlzWbJkCT179hReszpQ9/DwoEaNGuzatYuRI0cyb948SpUqReXKlUV6ghs2bMDR0ZHRo0fTtWtXIagvX748+/erJtSvXr3KsGHDWLNmDVKpNNueaHUfro6hGSgVJD0LEB5TKuR/2utKMCyimi43LlMXUBJ7RXO4TMj+aenDlaUk5knuLjPm5ubY2tpy+fJl0fLcuIvlhebNm3Pr1q1cfwebVSjI3HYVMdCV5sl5yaBASUxLVEUHJcVKlmXl+L40btyYsLAwGjduLPzT1gqRHenp6ezdu5d69eppHaBMSUnRaLsA+PXXX1EqlSL1j3y+P/5VGUo1wxuWwtbUgKmHnyBTKPNUatORStCVSpjR2iU/mMznH0ftgQyIPJ7/biYdfITsG5ak0z4GokhLxqp+D9FQ3T9ZQfD29sbPzw97e3vR8gYNGoje2/79+7Nx40aRK1eBAgVwcXERZehAZUNauXJlmjVrxsiRI7G2tmbz5s28ffuW/fv3I5Vmf4/eqlUrKlasSPHixZk/f76QWe7Tpw8TJ05k7ty5WFhYULGiKkDOqqwhq9eOay4eyBVKlEoFYTt/ITXkITqmNsTfPUby23skB97ArEYbrBsPEPYbPLcl+g7OGiXZAj3mEbqmHyVsTShpb0ZJHx/8/f3p1asXAwYMEMrZ9vb2TJw4kR49euDj44OZmZlgCzhz5kxhAKtBgwYibcbatWtz584dIaOZnJzMunXriI+PZ/369Zibm3P//n2tzmnq7WXWv21Yxp6QASsJ/W0UkccWk/bpFToW9iQ9v4oiKRarRgOEyXbDYpUwcWlI/B9HSP/8AaMS1UGpJPXdEwyKVcS8eiuMilfls44u4ftmYF61GXoFDKlefQD29vZa5bByQ//+/Zk7dy79+/enRo0aXL58mZcvv43vuJoJEyawc+fOPH0Hu9QsSl1nWyYdfMSF6E857kNHKkGuUFKnhA1vr3ygUmPV55CSksK9e/c0VDhyi9paN7ty96dPn6hatSpdu3YVhgpPnTrF8ePH8fb2znN5PZ9/ln9lQAniH1DAq0jhB5IdmX9As9tWzC9z5/OvIjExERMT7cL8gWHxBLzSLOP+FeSJMQA8iZKLHEi61CxKZEKqqLSuSE9BqmeY5338nRUEiUSi9cLs4ODAtWvXGD9+PMuXLxeEzY8cOaIx2JYX3N3dmTt3LnXq1BHtV62sUbt2bZq0Kof38qvIFUokEinmbu2ICHmIIi2J6LPr0bWwx7JhX8xdtQuDZ0ezCgWE/+/Rowfx8fEMHToUc3Nz5s+fz4QJEyhdujSLFy8WbnaKFClC06ZNNRyxtOHh4cGtW7fYtWsXYWFhWFhY4Orqyvbt27MNJrXR3a0o/teDcOg2h88X/Ul4dA5FWhJ61oWxaf4DppXEE8c2LX5Az744CQ9P8/nCb0gNTNAvUBIDR9Xwip5NYex8JhJzeSvR5zfyomBBRgwfip2dXa4GQbUxZcoUIiIi2LdvH3v27KFZs2acOHFC46bmr/C130G189KFSiZ4rgEbU33SEMt5SVBlahuWtqdHraIUtzHG8oc7DB6guin8448/SEtLo3bt2l/12rdv346enp6gZZoVS0tLWrZsyZkzZ9i8eTNyuZySJUsye/ZsxowZ88Ubtnz+/5Eov5Ui8ndMYFg822+GcOFlOCFRSV/8AWVnvZXPf4+HDx9SuXJlfv/9d+HC+ccff1CjRg2qVq3K3bt3hXWbNWtGdHQ0N2/eBOD3339n3bp13Lt3j6ioKAoXLoyvry+TJk0SNeJn7qEMCgrSeoGdOnWq0D/5/PlzfvnlF86fP09SUhIVKlRgypQpogu7v78/ffr04eLFi+zevZt9+/aRnp6e7QT0tMNPtE5gZ3YRUaQmomdZELPqrTCr1lzrdtR82j6B1Hdip53evXvj7+9PgwYNiIyMpNs4P2b+Mp6Uj68wreKFdeOBJL28QcKDk6SFvUGeHIeumS0mFRthUbsTEqnqPdORSvi4bQI2uqmcOnKQYcOGcfPmTaysrBg1apRIXUHdx7h3715B/D41NZX27dsTEBDAiRMnqFOnjvB+vX37FicnJyAjO6xuPVBva/fu3QQGBrJ69WoiIyOpW7cua9eu1Sp18y0JCgqicePGVGnYigvvZaRHvSPh3kmkBsYU7L9SJJOWF/zaVfyfqsT03HiTa2+ivumAl45UotGH+18hMVVGUFQiaTIF+rpSnGxMcqW5nE8+2vhPfHNKOZgxrbUL03DJ/wHlk2sqVKiApaUlly9fFgI2tYvJgwcPBP9shULBtWvXRJqd/v7+mJqa8uOPP2Jqasr58+eZMmUKcXFxzJ8/X+v+Mnsgt23bVrCQ/FoP5KFDVdmWKVOmfNGl6cKLcK0X6Ph7x9GzLYZxKTeQSlU9eadXgVKBWfWWWrakwqJOZ5JeFCbh/kks3LtTwLEogwZlaCJGRUWxZEwfOvt04FlKK94k6qIjlZDw6CwSPSPMavog1TckJfghsQHbUaYmY9OoLwolVChkjpmDKeGhUXh7e9OuXTs6derEvn37GD9+PBUrVhT8lbOSnJxMmzZtuHPnDmfPnhXp/+WWuXPnIpVKGTNmDLGxscybN4/u3bsLNxJ/F1ZWVlSvXp2rJ/YSFx6OQscAI+caWDbw/epg8n+xR3x224o0XnzpmwaU/2UlDxMDXVwK/b3SSPn8d/jXR1LaAsj8H1A+uUEqlVK3bl3BJg1UAaWPjw+///47165dw9vbWwguMwv+79ixQ+RdO3jwYAYPHsyqVauy1d8zMTGhQ4cODBkyhEqVKtGjRw/R46NGjaJo0aLcvn1beP6XPJCtra05d+5cttIkkOFAoo3MLiIA5tVbEbZ7CnG3D30xoDQqXhV5fBQJ909iVKIGqQVLUalaRvCmdlMZNEjlYKKuIJw1nUponFyoIJhVbU7UyRXE3zuGZf2eSHT1ePA+lk+f4kn98IEynSdg6dmDxm5F6devH8WKFWPjxo1aA8qEhARatmzJkydPOH/+vCBzk1dSUlK4f/++MHyizow+fvxYsBv8O7CwsGD37t3C37tuh/wne8TzlTzyyef75V8ZUAol7hfhhERrKXFbG9OwjL3ILi6ffLTh7u7OL7/8IvQgXrlyhdmzZxMcHExAQADe3t4EBAQgkUhE7imZg8n4+HhSU1Nxd3dn7dq1PH/+PM/WYdHR0Zw/f54ZM2YQHx8vmoT08vJi6tSphIaGirQSBwwY8MVgEjIcSLSROZhUixwbFq1AzNu7KFISBbHsnFACQVGJwo2cgYGBYO0JmSoIrVUVhBtvolh0/AEPQyIxKlKBhPsnSY96h75DhnORRN+IZKe6bL0ZjP/1INxL2lKxSnVhYjszsbGxNG3alDdv3nDx4kVcXL7OMQtUAzSZJ5nVNxFv3rz5WwPKrPyXe8S19eF+Lf+LWdp8tJNfffz/51/1br+LTsrxBKsEgqOTRBei//UTbD5/H+7u7oLodJEiRQgPD8fd3Z0nT54ImcuAgADKly+PtbW18LwnT54IvY6ZbehAFeDklVevXqFUKpk8eTKTJ0/Wuk5WD+TcDDyoHUi0kdVFJDOK1NwHlFn34+joKArK1Dx58gTfYT9x90aAoCuYsT/x3zpmNkgkGb/xa2+iiPyQioEWYewffvhBmE79K8EkfNnZ5J9GPWTxX+wRz1fyyAe+v+TRfz2o/dccaeYSEJDjCSbzhajx4ktMb+1Cl/yTSz5ZqFGjBoaGhly+fJmiRYtib29P6dKlcXd3Z9WqVaSmphIQECAqN8fExODh4YG5uTkzZszA2dkZQ0ND7t69y/jx4/PswAEZrh158UDOnCXNjuwcSNQuIno2hbHy7I+uuS3o6JH8+jbxt3/P0WXjS/vR9rpiYmJwq1OPVIkBFvW6o2tVEImuPmmfXhFz0R+U4vcsq/We/M+gIjoxjRUXAhnesJTwWJs2bdi1axdz585ly5Ytf2lS9O90Nvla/qs94v/lLO1/ne8pefS9BbX/n/wrzjQrLgR+dflDfSGacOARkQmpogtRPvno6+vj6upKQEAA1tbWhIeH4+/vT8uWLUlNTWX79u2EhYVRv3594TkXL14kKiqKAwcOiJarnVa+RHb2bSVKqMq9enp6gg/1t0DtQJL5JPhp+wTk8VGCiwhKJaFr+mHT/AckurnzXs6M5M/9fIlf1+8lMS4Gh25zMSyaUTqWxeSsmZeVBadfYmdqgMOff/v4+NC0aVN8fX0xMzNj9erVed7mtya3Dkl55b82ZPFfztL+V/lekkffU1D7vfBVt+pBQUFIJBIWLFjwrV+PVpycnGjZUvsQQHZ2cV/DgtMv2X075KufP23atGwDgv8Psgo45/N1uLu7c/PmTZEzha2tLeXKlcPPz09YR406i5U5a5WWlqbhmPHhwwfu379PWlqGdV5mD+TM2Nvb06BBA9auXatVdDk7D+ScUDuQ5AZleiqJj87meR9FbYxFWbL09HSmT5+Oq6srVlZWWNvYsmL+LPVeMvYnTyf2hspRJeJ3P4Lnt+Xd8h6kRQShyFKCl8WEkfj4HPK4cILntqSLazEaNmwIQMeOHQkICGDZsmWsWbOG8ePHk5qayvjx4ylUqJAwnZ95+Cqf3PHx40cGDhxI8eLFMTIywtnZmR9//FHwRc/MihUrKFeuHAYGBjg6OvLjjz9+UX0gL6iztJfGNOTxNC+OjajHwSF1ODaiHo+neXFpTEOmtXbJDyb/x1lxIZAJBx6RKlPkedJfrlCSKlMw4cAjVlwI/EuvY9ftEBovvsS1N1HCtnPaN2QEtbv+QpzxPfPdqIQ+ffqUadOm5emO/VvbxQFMOfyEd9lMvebz30Rtgffx40euXbtGz549AZXX8suXL3FycqJw4cLC+nXq1MHKyorevXuzaNEiFi9eTK1atTTKoh8+fODBgweigDKzB/KqVavYtWsXjx+rNB1XrlyJUqmkYsWKTJw4kfXr1zNz5kxatGjxl7KWDcvYa1iySY1M4U8XkYTHKi/pmCs7kBrnLfulI5XQsLRY1DkuLg4/Pz9KlizJzJkzcW7aS7DBCz8wm7hbB4m7dYhPW8aAPB0Ao5KuWDcdgrlrO5DLkMeGkfzmj4zXa2yBQeHySAzNsWn5E3atf8KleW/h8aZNmzJ8+HBmzZrFvHnzcHV1ZdGiRXTv3l3wFO7bty9XrlzJ0/F9LevXr9fqx/y/REJCArVr1+bgwYP06tWL5cuX07x5c1asWEHjxo1FrR3jx49nxIgRVKhQgaVLl9K+fXuWL18uSGN9S9RZ2qpFrXApZPGvLfnnFXXCQ5sX/bfE398fiUTCnTt3vul2vzZ5lBL8kOC5LUl8nvHb/ivJo28d1Pr6+mJqavpVr+V747sKKKdPn56ngPJb28UByBRKJh38dpIU+fzv4+rqilQqxczMDFdXVyEDmdlzOTM2NjYcPXqUggUL8ssvv7BgwQKaNGnCvHnzcrW/L3kg37lzhxYtWuDv758rD+Tc0N2tqMaJUaJrgJ3PRABir+8FwKBoBcxr5OyMkhm5QkmPWuLykomJCSEhIezYsYOmHXoR4dSIAr0WoWNujzItmZjL24i7dQBDpyrYNB8JgKlLQ8wqN8XCrR169iVAIiXu9u/CNqX6huhaFkSqb4hphYYYl29IpIXKStHIyIhWrVQ6mJMmTaJnz548fPiQli1bMn/+fCGL7+joKBJG/ztQZ+T09PS0Skf9L3H48GGCg4Px9/dn+vTp9O/fn+XLlzNx4kTu37/PgwcPAFUWc9GiRfTs2ZO9e/cyePBgli1bxuLFizl9+jRHjhz5fz6SfL6GVatW4e/v/4/s659IHvn6+grGBtnx/1kRTUpKwsnJKU/uUv80301AmVfUdnHfUuAWVBfAgFeRvArXNKjP5/8P9d31y5cv6dGjBxYWFtjZ2TF58mSUSiXv3r2jTZs2mJubU6BAARYuXCh6flpaGlOmTKF69epYWFhgYmKCu7s7Fy5cEK2XuZ1jyZIlODs7Y2tryx9//MHDhw/R1dUVTqLdu3fnwYMHSKVSSpQogaGhIQUKFKBv376UKVOG69evk5SURGhoKH5+fjRt2hSlUkmDBg24ePGiIKwdFRWFRCJBIpHg7+8veCBv27aNatWq4efnh62tLT169MDAwIDNmzfz8eNH0tLSaNy4MRcuXKBWrVr4+PhgamrK2LFj+emnn6hataro2BQKBUuWLMHFxQVDQ0McHBwYNGgQtvoy3EvaamQpjUu5UajfChwHrFH97VwT00pNKDbhKLqWDiQHPeDTtnGELGxPyOLOhO/7lfTIdwCYVmpMiUnHaOxeW1RmvHjxIq9evcLW1haA7TdD0JFKkOjqYVymDihkFB6xlcLDt2DVsA9GxatRbMJRDItVErZRsOc89GyLoEgVl0ttW46m8NDfhL8N7IogkUrp3LkzhoYZ1o4FChRAR0eHzZs3A6oLiVKpZNCgQVy/fp13795x8eJFwSUHVO0jSqWSDh06EBAQQMeOHSlatChlypShcOHCPHjwgOTkZNHrUWceXr9+TfPmzTEzMxM8jLNevBo0aCB8B7L+y3zRfvPmDR07dsTa2hpjY2Nq1arFsWPHRPu9ePEiEomEPXv2MGvWLAoXLoyhoSGNGjXi1atXonUzH4uBgQFFihRh9OjRGseiDbV6gYODg2h5wYIFgYzhq+vXryOTyejSpYtoPfXfu3btEpZFR0czZswYKlasiKmpKebm5jRr1kwITvP5fvgnA8pvlTySxUcRE7CdtLA3eU4e/V1BbWKqLFfrJiUlERwc/M3aRP4O/nJAuXjxYooVK4aRkREeHh5CeS4zz58/p0OHDlhbW2NoaEiNGjU4fPiw8Li/v7/g7dmwYUPhRJr5hA5w5coVXF1dMTQ0xLVyeZKenP/q15308gbhe6fxfkUvguf7ELqmPzFXd6JUyNGRSth248t3DleuXKFmzZoYGhri7OzM2rVrta4nk8n49ddfcXZ2xsDAACcnJyZNmkRqqrgHTCKRCPZ6mXFycsLX11e07OHDh3h4eGBkZEThwoWZOXMmmzZtQiKRfDHDm9ugClQn+erVq2NmZoa5uTkVK1Zk6dKlX3xP/gk6d+6MQqFg7ty5uLm5MXPmTJYsWUKTJk1wdHQUSqljxozh8uXLwvPi4uLYsGEDDRo0wM/Pj2nTphEREYGXlxf379/X2M+mTZtYvnw5AwcOZOHChSJJoMycOXOGN2/e0KdPH5YvX06XLl3YtWsXzZs3/+Lkb7ly5ZgxYwYAAwcOZOvWrWzdulUY4vH396dTp07o6OgwZ84cBgwYwIEDB6hXr55Gf6VcLsfLywsbGxsWLFiAh4cHCxcuZN26daL1Bg0axNixY6lbty5Lly6lT58+bN++HS8vL6a3LIuuNPf9v8lB9wnfMwV5UiwW9bphXtOH1NBnfNo2FllMGJA7B5LMLj3yxM9I9AyQ6Glm7hSpSciTYkmPesfnS5tJjwjGsNiXtTzjH19CqVAIQZyae/fuUbp0aczNxQ4zrq6uAFq/D5nZu3cvSUlJDBkyhOXLl+Pl5cXy5cvp1auXxroymQwvLy/s7e1ZsGAB7du317rNn3/+WfgOqP+pp/nVPtBhYWHUqVOHU6dOMXToUGbNmkVKSgqtW7fm4MGDGtucO3cuBw8eZMyYMUycOJEbN25ovBd5OZas1K9fH6lUyqhRo7hx4wbv37/n+PHjzJo1Cx8fH8qWLQsgnOuyTver+4X/+COjdeHNmzccOnSIli1bsmjRIsaOHcujR4/w8PDgw4cPOb6mfP59fMvkkTwhmtirO1X2rlmSRzm1ofxdFdG7If+85NjfRa6bS+7fv6/hLrFlyxbi4+MZNmwYKSkpLF26FE9PTx49eiTctebGLq5+/fqMHDmSZcuWMWnSJMqVKwcg/BdUOnwdOnSgX79+9O7dmwlzlhJzZDEF7Z3RtyuW5wP/ks2blWdfLrwMZxraNesePXpE06ZNsbOzY9q0achkMqZOnapxpw7Qv39/Nm/eTIcOHfjpp5+4efMmc+bM4dmzZ1ovAjkRGhoqBN0TJ07ExMSEDRs25Kp8pg6qunbtyoABA4iPj2fjxo14eXlx69Yt4fM9c+YMXbt2pVGjRsLQybNnz7h69SqjRo3K82v+lri6ugrB+8CBA3FycuKnn35izpw5jB8/HoCuXbtSqFAhfvvtNyFAs7KyIigoSKR/OGDAAMqWLcvy5cvZuHGjaD/v37/n1atX2NnZCcu0BetDhw7lp59+Ei2rVasWXbt25cqVKxrlcDUODg40a9aMKVOmULt2bZErTnp6OuPHj6dChQpcvnxZyK7Vq1ePli1bsnjxYqZPny6sn5KSQufOnQV9ysGDB1OtWjU2btzIkCFDANUN0IYNG9i+fbvQMwiqGzhvb29unDvG9Nb1cu1A8vn8b0gNzSjQcwE6RqoMpHHpWnzcNIqYK9uxbfljjg4kmV160j9/IPnldYzL1BV8uzMTcWguKW//9E7X0cW0ijeWdbtorJeZxKcX0TG1xq1ufdHyjx8/Clm0zKiX5RS4+Pn5iYKjgQMHUrJkSSZNmkRISIhIqzI1NZWOHTsyZ86cL26zSZMmor+vXbvG+fPn6du3L82bq7zT586dS1hYGAEBAYKI/oABA6hUqRI//vgjbdq0EUki5cbVJy/HkpXy5cuzbt06xowZQ+3atYXlvXv3ZsOGDcLfZcqoWg+uXr0qDEpBxhBUaGiosKxixYq8fPlSdBw9e/akbNmybNy4MVsN1ny+juDgYBo1aoShoSHnzp3DwcGBTZs24b95C48fPyY+Po4ixYozYsRwfhgxXHiek5MTwcHBQIYyhYeHhygJlJqayo8//sjWrVtJSkqiadOmrFu3Tjin9u7dm2PHjvHx40f09PREr6tp06YEBwfz4sULoYrxlwNKhVz4X6VcRvje6aS8f8Icy7VsHN+DWbNmMX36dAIDA5k5cyaHDh1CqVTSrl07Rk+ZS8Arce9pwuMLxN8+RHrUOyS6+hgWr4pVw77omtuJ1kv98IKYKztIC32OUiFD17IgppWaYF6zDXKFksi4VJRK1e9g2LBhnD17FiMjI3r37o2fnx86OjoEBQUJpe6IiAjhPZ86darWRNT/F7kOKLVddF+9ekVgYKAgpuzt7Y2bmxt+fn4sWrQIyJ1dXIkSJXB3d2fZsmU0adJE62TyixcvuHz5Mu7u7iSkyvB7aUXCSl8SH51F37Nfng/ctvVYkRNIVpu3kKgkElNlWhu6p0yZglKpJCAgQDjhtm/fnooVxdmYBw8esHnzZvr378/69euFY1dnKy5cuCA6weYGPz8/Pn/+zN27d4UAsE+fPpQqlbPcUW6DqmPHjmFubs6pU6dydFr5p+nfv7/w/zo6OtSoUYP379/Tr1/Gd8DS0pIyZcqIXFN0dHSEY1EoFMTExKBQKKhRowZ3797V2E/79u1FwWR2ZL4Yp6SkkJCQQK1atQC4e/dutgHll7hz5w7h4eFMmzZNVKpt0aIFZcuW5dixY6KAElRBZGbc3d3ZunWr8PfevXuxsLCgSZMmoqb86tWrY2pqyoULF1jfrRuRCamM2f7l1ydLiCY9/A3mbu2FYBJA3744hk5VSH59J1cOJGqXHkV6ChEH5yLR1ceyga/Wda0a+CJ3bYs8LoKEx+dRymUoFXKyy6mmR4eS9ukVZjXbEPI5GRejjO98cnKy1hsw9XudU7k382eemJhIcnIyderUQalUcu/ePY0gTB3U55ZPnz7RoUMHqlSpIlIGOH78OK6uriJHJlNTUwYOHMjEiRN5+vSpyK0nN64+eT2WrDg6OuLq6krz5s0pVqyYME1va2srqIBUq1ZNuC44OjrSsGFDnj17xpAhQ9DT0xO935k/F7lcTkxMDKamppQpU0br7zSfr+f169d4enpibW3NmTNn+Cw3YPXhJyya6ofSsgh6VdpiKpXy4dUtRo8cwcrzgXTvM5DubkVZsmQJI0aMwNTUlJ9//hnQbH0YMWIEVlZWTJ06laCgIBYtWsShQ4d48eIFM2bM4ODBgyQlJdGzZ0927tzJ+/fvGT58OOfOnSMxMVHI0KurGEp5OrFXd5P8+jbpMR9BIUffwRlL9x6ilhhZTBiha/ph2bAvEqkOsTdUPejJb+6S+Hg+ANGnVgjrX7mruok+dOgQAJ06daJ48eKMGTOGyZMn4+/vT8CDl4S+fYMsPhJ9u+LoFyxJwr2TGJerh2llL+RJscT/cYRP2ydQqM9SpIaqIZvkt/cI3zcdHRNrzGq0RsfUioQnF4m5sp3Yq7tQylJVUmyyVLy8vHBzc2PBggWcPXuWhQsX4uzszJAhQ7Czs2P16tUMGTIEMzMz4bxQqVIlTp8+jY+PD23atGHr1q3o6uoikUgYNmwYjRs35pdffiEwMJCSJUuycOFCvL29RZ/TvXv3mDRpElevXkWhUODm5sasWbOE69j58+fx9PTM1Xcq1yVvbT9mHx8fkTOHq6srbm5uHD9+HMiwi+vUqRPx8fFERkYSGRlJVFQUXl5eBAYGiu5Ov0T58uWFE2JwVCJSYwv0rB1J/wqdOshiK/dnOc2giAvK9FTSo94JdnFZkcvlnDp1Ch8fH9HJtly5chqC0+r34ccffxQtV2e0svY+5YaTJ09Su3ZtUbbY2tpao5SlDR0dHeECo1AoiI6ORiaTaQRVlpaWJCYmcubMmTy/vr+brBc4CwsLDA0NhZ68zMuzupds3ryZSpUqYWhoiI2NDXZ2dhw7dkyrc01uG5+jo6MZNWoUDg4OGBkZYWdnJzz3axxxAOHOX53ZyUzZsmWFx9UYGhpqBL9WVlai4w8MDCQ2NhZ7e3vs7OxE/xISEggPDwdUDiQl7EyRSiQaPZVq5LGqdfWsHUXLdaQSDO2KokiOw9dVMwOYlTSZAqVCTuTv80iPCsHWZyK6ZjZa19V3KIFR8aqYVm6KQ5dfSfv4kqhji7PdduKTiwCYuDTUcAMyMjLSaDkB1Q2B+vEvERISgq+vL9bW1piammJnZ4eHhweg+Znr6uqKFAByQiaT0alTJ+RyOQcOHBAFWMHBwVq/E+pKTtbvRW5cffJyLFm5evUqLVu2ZNasWYwaNQofHx8WLlzIL7/8wqJFi3j69Kmw7v79+6lcuTJ9+/alePHitGrVik6dOlG1alXRhKtCoWDx4sWUKlUKAwMDbG1tsbOz4+HDh1/9e8pHk+fPn1O/fn0cHBzYsv8oo39/TZMll9l6MxjLTrOxafED5jXbYF69FQ6df8WweDWCLu5h681gmiy5zP6oghibmuHg4ECPHj3o0aOHRpbdxsaGs2fPMnz4cBYsWICbmxsAHTp0QKFQMG/ePAwNDdm9e7eobUkd8Jw6dYqTZy8IVQxFahIJD09jULQiVg18sajXDXlSHGG7p5AWpmm5mvjoLPF/HMGopKqVxaBQGczrdFI9qKOHhXtPbFr+RKJ1aVEfY9WqVdm/f79QNbKwsOD1/Ruqqkj9nqR//kjCvRNYuHfDrs14zKo1x7JeVxy6zUYeH0n8XdV1X6mQE31yBTom1hTquwxL9+6YVW2OPDYc4/INsHTvjmX9XiCRoJDJqFKlChs3bmTw4MHs27ePqlWrCkkeExMTOnToAKjO9+r3PCQkhNatW9OxY0e2bduGrm5GAuzKlSsMHTqULl26MG/ePFJSUmjfvr1I0uvJkye4u7vz4MEDxo0bx+TJk3n79i0NGjTg5s2bALkOJiEPGUptP2ZtWbHSpUuzZ88e4Ovs4rIj88lRfYGQGpqiSEnI1evPSlpEMDGXt5IS8hBlNjZv2mzpIiIiSE5O1nrsZcqUEYJIUJ3gpVKphoNJgQIFsLS01LgA5Ibg4GBReUlN1n1kx+bNm1m4cCHPnz8nPT1dWJ45gBo6dCh79uyhWbNmODo60rRpUzp16qRxZ/P/gbaMaW7cS7Zt24avry8+Pj6MHTsWe3t7oT/x9evXGs/NjcsMqO5mr127xtixY6lSpQqmpqYoFAq8vb2/yhHna8hNFlmhUGBvb8/27drTj5kDUnszAyyM9ChZwoaAV5FIc+itzOxAYlDNkY23cve69XWlRJ1YTvKr29i2HoORU+78zSU6ehiVciPu+j4U6amim0M1iU8vomtdGIMCJTXcgAoWLKj1Rlat71moUKFs9y2Xy2nSpAnR0dGMHz+esmXLYmJiQmhoKL6+vhqfuYGBQZ6cecaOHcv169c5e/ZsngJRbeT0u8jrsWRl7dq1ODg4UKNGDdHy1q1bM23aNK5du0b58uUBVSbzypUrBAYG8unTJ0qVKkWBAgUoVKgQpUuXFp47e/ZsJk+eTN++ffn111+xtrZGKpXyww8//GO/p387jx8/pnPnzpQsWZJ+M9fRYdNDkUi4KNmSkohSIcOwaAVi3t4lPSkBqaEJ195E8T4qCR1jzRszNQMHDhTpMhctWpQbN25QunRpduzYAaiuZwsWLODHH39k7ty5jB8/nho1auDm5sbDhw9Zs249SmdVskRqaIrjkI1IdDLK42aVvQhdP5i4P45g21zcjiWLj8Rx0HrSI4JJfHAKdHRJDlSdnCzqdMGybmdh3czJo6zVnvT0dFAqMKvaHKmBMelR70l8eAYdEyvkSRlxkY6JFXpWhUgJeYhFnU6qwZ/YMKwaDRAylgCFBq4VvcdpYa9JfHKBN2+DRPvNWmXKyoEDB+jSpQu+vr6C2kdmnj17xtOnT3F2dgZU7U2VK1dm586dDB+ual/45ZdfSE9P58qVK4J5Rq9evShTpgzjxo3j0qVL2e5fG7kOKP8pu7jsyHxyFF0gvsLyTJGSQNiOiUj1jbD8gs1bdrZ0eeWviJ3L5fKcV8oluQ2q7O3tuX//PqdOneLEiROcOHGCTZs20atXL2Ey9n+Nffv2UaJECQ4cOCD6PKZOnfrV2/z8+TPnzp1j+vTpItmewMDcieZm970oVkzVE/zixQuNu8MXL14Ij+cFZ2dnzp49S926dXMVLBvoSgUHkpWHr5N5HEvHQjUkkh4dSrEsDiTN9k3D1tYWE5Ocfb7XL5hB4qOzWDUagEl5jzwdjzI9DVCiTEuGLAFl6ocXyD5/xMK9u1aXnipVqnDhwgXi4uJEgznqO/KsveKZefToES9fvmTz5s2iwZVvkc3ftWsXS5YsYcmSJUKWMDPFihXTOjTw/Plz4fG88FePJSwsTOv5SX2jKpNpTq+WKlVKuBl/+vQpHz9+FA0d7tu3j4YNG2q0V8XExGhUIfL5Olq1aoWDgwPtfl7JjNNBGo+nvH9KbMB2Uj88R5nFQECRmojU0ERVglYqeRORoGF1qiZrhlx93smcyfT19WX+fFUZul+/frx48YI//viDNWvWsGbNGkKCg0AVD/3ZW602jVCgSEkEpQKDAqVI+6SZFDAuXQcdYwvUaZPP59YLx5O1EpI5eZT1dVeoWoNbVy+jSElAapDREx59cgXRJ1egwZ894LIY1Q2qXpYZj8zBpDwlAaVCBhIpT56IB5qzVpkys3PnTnr16iVIcGm7ljRu3FgIJkFVHjc3NxdaweRyuVAuVweToLrh7tatG+vXr9c4R+bEX1J81XbhVAs9Q97s4vISdKnt4r6WlJBHKJLjsGs7KVubt+zs4uzs7DAyMtJ67FlP9sWKFUOhUBAYGCgaMAoLCyMmJkZ0AbCystKY3k1LS9NwRSlWrJiG9AegdVlW8hJU6evr06pVK1q1aoVCoWDo0KGsXbuWyZMn5/om4Hsis3uN+tjV7jc59YnlZpuZWbJkSa6erw66sn7uNWrUwN7enjVr1tC3b1+h7HnixAmePXv2VZqTnTp1YtWqVfz666/Mnj1b9JhMJiMhIQFLS0uN55VyMOOHJqVZCszyqUC9FvVIkynodqEi0UFX+L3/BuF5jx8/5vTp06IBo+yYP38+Sxcvoohnd6Q122S7njwxBh0T8etSpCSQ9PIaOuZ2Go9BpnJ3+QYaLj2gKrktWLBAGCgB1QDBpk2bcHNzo0iRItm+Hm2fuVKp/MsKCI8fP6Z///706NEj28G35s2bs2TJEq5fvy5UKRITE1m3bh1OTk5CNjC3/NVjKV26NKdPn+bE6XMUrVBD8A/fsk2VBc8qW5UZhULBuHHjMDY2FmWEdHR0NH5Pe/fuJTQ09H/yvJMbLl68SMOGDblw4cI/4mzWvn17Nm/ezOxlGzCr2kz0WPrnj4Tt/Bk9m8JYefZH19wWdPRIuHeCpBdXSX3/DF0LsVGB2uo0a890dhnyzNWQ8uXLY2Njw+fPn7G1tWXp0qXo6+vTqVMndu7cyYewCFKCHxK2cxIOXWcji4sg7tZB0qPegyLjhkXXQnMgVtdSvMy4lBuJT1XKH1m/Y5mTR1lft7mFqlVEnbxSDw0auzTAtKJmXCPVM9RYlpmkV7eIvbZbVaaXZ1QJ4/+U4cqJz58/06NHDzp27Mjy5cuzXU/bdS1zkBoREUFSUlK2bTQKhYJ3797h4qJ9OFkbfymgPHToEKGhoULJ+tatW9y8eZMffvgBENvFjRgxQmOyMiIiQvhyZXdx1YbaLk7TgC6XSNRfHrHNm7r3ATTt4tTo6Ojg5eXFoUOHRFOQz54949SpU6J1mzdvzqRJk1iyZIlIVkg9sNSiRQthmbOzs0jmBmDdunUaGQAvLy9WrlwpmrqPjo7OtpSZ9bVDzkFVVFQUNjYZd3BSqZRKlVRNz9p6z/4XaNmyJQcOHKBt27a0aNGCt2/fsmbNGsqXL09Cwte1TZibm1O/fn3mzZtHeno6jo6OnD59Olee3aD6zC0tLVmzZg1mZmaYmJjg5uZG8eLF8fPzo0+fPnh4eNC1a1fCwsJYunQpTk5OjB49Os+v1cPDg0GDBjFnzhzu379P06ZN0dPTIzAwkL1797J06VKhRyc7DPR0BJ/o5UsW0axZM2rXrk2/fv1ITk5m+fLlWFhY5Dh1ePDgQcaNG0epUqWoULkCV55eIHMBxKh4FXRMVCfx8D1T0TGzxaBQGaQmFshjI0h4dBZ5QjS2bTRFyJUKOYnPA9AvVAZDm0IaLj0Abm5udOzYkYkTJxIeHk7JkiXZvHkzQUFBGpmxrJQtWxZnZ2fGjBlDaGgo5ubm7N+/P9tMQm7p06cPoJLi2bZtm+ixOnXqUKJECSZMmMDOnTtp1qwZI0eOxNrams2bN/P27Vv279+fp9L6Xz2WwLB4lOW8kOpvoEWrVphVb4muuT0p7x6T9PQSlqWqcyLMFOuweEo5mDFq1ChSUlKoUqUK6enp7Nixg1u3brF582bRuadly5bMmDGDPn36UKdOHR49esT27dtFGZR8/ho/TJrOwQcfiT69Gqm+ESYuDYTHkl/dAnk69u0niwLHxIdaLFczJSWmHH5CHWfbXHlUZw3YnJ2duXXrFh8/fmTHjh20aNFC6PfNLGWW/PYecTf2YlSqFuZu7dAxtgCpDnHX95D+WXOWQqIrrlwYlaqFrlUhYq/sIPHJecwqqzKl2SWPhNebpVKpa6WKY6QGJhg5Vcn2ebqWqvXSI4KF9VLePSZi368YFHHBpukQdEytibv9OynBD1Aqv1wFVl+zzczMcHFx4fjx49y5c0ej5UR43bloBfvW/KWAsmTJktSrV48hQ4aQmprKkiVLsLGxEblNrFy5knr16lGxYkUGDBhAiRIlCAsL4/r167x//14QrK1SpQo6Ojr4+fkRGxuLgYEBnp6eggZbVhqWseeWRPJVb45B4XJIDU2JPLoY8xqtAAmJTy6gDjClWuziMjN9+nROnjyJu7s7Q4cORSaTsXz5clxcXHj48KGwXuXKlenduzfr1q0jJiYGDw8P4STq4+MjmvDu378/gwcPpn379jRp0oQHDx5w6tQpjTLPuHHj2LZtG02aNGHEiBGCbFDRokWJjo7+YqY3t0FV//79iY6OxtPTk8KFCxMcHMzy5cupUqWKKNP6v4Svry+fPn1i7dq1nDp1ivLly7Nt2zb27t2roXeaF3bs2MGIESMEW8SmTZty4sSJL/bhqdHT02Pz5s1MnDiRwYMHI5PJ2LRpE8WLF8fX1xdjY2Ohr8jExIS2bdvi5+enNZOYG9asWUP16tVZu3YtkyZNQldXFycnJ3r06EHdunXztK3GjRtz8uRJpk6dypQpU9DT08PDwwM/P78cB5rUv/nAwEACF0/UeNyh62whoDSt1ITEZ5eJu33oz3Kbqaq5vvUYDItU0HhuStB9FIkxmNTurNWlR82WLVuYPHkyW7du5fPnz1SqVImjR48KMlPZoaenx5EjRxg5ciRz5szB0NCQtm3bMnz4cCpXzl0PqDYiIiJITEwUfMUzs2nTJkqUKIGDgwPXrl1j/PjxLF++nJSUFCpVqsSRI0dEN6e55WuO5V10EpMOPiLgVSQ6UikFei8h5vJWEp9cRJ7wGR1Ta8xd22Hm3o2tN4Pxvx6Ee0lbqpYqz5YNq9m+fTtSqRRXV1fOnTunoXIxadIkEhMT2bFjB7t376ZatWocO3aMCRMm5Pn4/leoX78+ycnJoon8v5NZx59j02wEspRkIo8tRqJvhHEp1cBMRrIlA0VKIikhquuavmNGv6tEz1AwF1CLhG/t55bn11O8eHFu3brFqFGjePPmjVACB5BKoHRlVwwcDxDxux+6lgWwa/ez6DoXG5BzMkWNUUlXYq/sIDXkEZ8vbMKqYZ9sk0dqTPXFjxmXrkPMhU2khjwWJWdAFawpUuLRMTJHv4AzuhYOxN3+HdOKjZAampL04hoSXX3sO81Aqqf6vBOfBeTqtat1WyUSCUePHsXT0xNvb28uXbqUpyyiGjs7O4yNjbNto5FKpV+s1mhDosxlRObk5CTo8Kk1kebPn49UKmXJkiWEh4fj6urKihUrhGyWmjdv3jB9+nROnz5NVFQU9vb2VK1aFV9fX5HQ74YNG5gzZw7BwcHI5XKhBODk5ESFChU4evSosG5gWDwVa9YBoED3uXk6aICU98/4fH4D6eFBSA1NMHFpiKFTZcJ3T8Gh62yuLBkucvjIyuXLl/nxxx959OgRhQsXZty4cXz8+JHp06eLglyZTMbs2bPx9/fn/fv3FChQgB49ejB16lTRBKdCoWDSpEls3LiRpKQk3N3dWblyJY0aNaJBgwYiR4L79+8zcuRIbt26hZ2dHcOGDcPExISRI0fy6dMnQb5BXT5RB0xKpZK5c+eydu1aPn36RPny5fn111+FoEr9+e7fv59169Zx//59YmJiKFCgAM2aNWPatGkUKFAgz+91Pvl8iZ4bb3LtTdQ3db3SkUpwc7Lm5xblhFKsk41Jvq/zX2DX7RCmHn6CTKHM02elI5WgK5UwvbULXXKQkvo3kJiYmKse4n+aadOmMX36dAqP3I6OsQVKuYyIAzNJDnqAfcdpGDlVJj3qPR9+G46edWHMqnijSE8h4f4pJPqGpIe/xXHwRqGUHHV6NQl3j2Ph3h09q4JIjS25unQEV47vp0+fPty+fVuUPfP19WXz5s0cOnSINm3aiJZv27YNuVyOpaUlnz59wsDAgAYNGhAZGUmH2bvZejOYT/tmkRb+hkKD1iH5M/BN/fCCT1vGoGNuJ7hkZZYNsnBrJ5TMbX0moG9XjA/rh2DoXIOU13ew8ujFyB/HMa21C1WqVOHBgwdERERga2srxDmdOnViz549omMPntsSAAPHchiVroVU3whZTBhJL69jWsUbCzeVR33ymz8I3/crOqbWmFZqTMq7p6S+e4RhkQo4dJ0FQMSB2SS9vAaIs4fqzyvzMhMTE9LS0li6dCl6enrMmTOHlJQUAgICRP2SatmgFSvEPZ5OTk6ieKJt27acOHGC58+fC62KYWFhlC5dmipVquR5KCfXAeX3yN91IapTwuar7rT+P/nhhx9Yu3YtCQkJ3512ZD75fIl30Uk0XnyJVC2qCn8FCZmbWlR/F7U2pmEZe7q7FaWUQ/Y3jPmIWXEh8Jt4GI9pWlrrAMf3SmhoKFOmTOHEiRNERUVRqFAhvL29hV4/f39/+vTpw8WLF9m9ezf79u0jPT2dz58/ExwcjJ+fH+fOnSMkJARjY2M8PT2ZP3++yHYzux7KlStXsnDhQj5+/EjFihVZuHChoJbyNVWVPn364O/vj9TUBkVyLDrGlhiVqkV6+FvSwt/g0GUmBoXKkBR4k5jLW5F9/oDUxAqzqs1QJMcTd3M/tq3GYuKiGhhLfHmd6FOrUCTGAErQ0cWteVf6tqzHoEGDhIDS19eXffv24e3tzf79+zEwMMDGxoZJkyYxbNgw2rRpw9GjR1EoFJiamrJ27Vq6desmBJQTZsyjZ/sWmLu1J+7mfoxKuqFfsCSJjy8i+/xBtW+JFOOydbHxGo4iJUEVUDbwFVrZFImfkRqZY1KpCQn3T6JjYoWuhQMpb//AzNyC+u71eP78Oa9fv0ZfXx9HR0eGDRvGmDFjhICyyNDfkJqrKpfBc1tiXLYe8oRoQbJIx9wWo2KVMavRWiSplvL+KbFXdpL64Tko5ChlaehaFsDcrR3yxFjiru8BhQylUpljQFm1alWeP3+OQqEgLS2N0aNHCwYpV65cEdoPcxtQPnnyBDc3NywtLRk6dCi6urqsXbuW0NBQLl26hJubGykpKSI95C/xP327PrttRRovvvRNA8rc2MX9f5OcnCya1I2KimLr1q3Uq1cvP5jM53+OItbGTG/tkmuXntyS9aygBIKjk0Sl2NltK+aq7+vvRlsVJq+og5u3b9+KApbcoO3ipWbX7ZBvEkyC5gBH5mqXekDqe2Hfvn107NgRAwMDhgwZQtmyZQkNDWXfvn0kJSWJStRDhw7Fzs6OKVOmCF7Lt2/f5tq1a3Tp0oXChQsTFBTE6tWradCgAU+fPhVKmNpYvXo1w4cPx93dndGjRxMUFISPjw9WVlZfLSdlWXzF8QABAABJREFUZmaGdVk3FA5lkBqZk/bhJQn3jmNcujZFf9wrrGdcyi2jBP4nKcEPibu5Hx1TK2FZavBDDAo4Y1C4vLC9m8e2U8QgWeN7JJfLhWzXjBkz+P333xk+fDgmJiacOXNGKBvb2trSq1cvkTRe4T9/n8bO1ZEamhB/7wTJr26CVAcTlwakx3wiPTIEWcwnoQQPkPT8CmmfXmFcpi6GxSqR+uEF8Tf3o1+wNMr0FFKC7wOgr6fLq1evCA0NxcLCglmzZvHbb78J38eaNWsyc9kGmiwRzzjo2RTBzifnVgzDwuUx7PKr8HfCg9PE3thH9Nn16Fo6YO01jG7lDVm+QFxpnTZtmkY/uoWFBc7OziKL62HDhuHu7k6TJk24fPlyntQQXFxcCAgIYOLEicyZM0cQNt+2bZugGzpp0iRh7iMn/qcDyr/jQpSTXdz3QO3atWnQoAHlypUjLCyMjRs3EhcXl29Lls//LF1qFiUyIfWbBS5fQn0Deu1NFI0XX/rPlGK/hnfRSUw9/OSbbjMvAxz/n6jdzaZPny7YuoIqIMoaMFlbW3Pu3DnRDX2LFi00Bt1atWpF7dq12b9/Pz179tS637S0NCZPnkzNmjU5f/68IFZdqVIlfH19vzqgnDxjFkdMLmfcaFXxRteqIDGXtiCLDdeY3s4Jywa+Yg3YP7e3f/8WDdvOlJQUpkyZwsSJqp7pgQMHUqhQIfr27cvOnTvZunUrz54949ixY5QrV47NmzcLWVj1f3WlUixqd8KoRA0+bhqJbeuxmJTNcI3KTME+y/i4aSSmlZti02wkAGbVWqBjbEncrQM4dJ2NhXMVzo72wL1aeZETH6hUMYoUKcLw4cOFwNK9pK1QES024etv/EwrN8W0clMgoyK6rJ8by+Z/2Z4183uRGWdnZw272OwKz9rsg6tWrcrJkyez3Wdug0nIg1PO90qXmkUZ07R0zivmgtzYxX0PNG/enOPHjzN69Gj8/PwoWrQoJ06cyHGgIJ98vmeGNyzF3HYVMdCVZuvS8y2RK5SkyhRMOPCIFRdypx36PdOzZ0+Sk5O/Sqc0OyYdfCSIXn8r1AMc3zMKhYKrV68CiHrT1GQdfhwwYIBGdShzFSk9PZ2oqChKliyJpaXlF20k79y5Q1RUFAMGDBA5n3Tv3l2Yfv4awpMUQjCpSEtRucM5lgOUWp1mckIkgJ5pe2rbzqxkts1V2+Pq6+tz//59jh07xqhRoyhbtiyWlpYi21w1feo6ASD5Uwsy5e1dFOkpWl9b8ps7AJjXbCtabu6q+jv59W1R8iizEx+oBlay2vfObltRNHX+LfhfqIjmhf/pDKWa4Q1LYWtq8Jcaxme0dvmfCCZB5SaRVUswn3z+DXSpWZS6zraZJokl37SlJTuy09L7X0A9BJLZr/5bEBgWT8CryJxXzCNyhZKAV5G8Co//bi9A6qn73KJN2SA5OZk5c+awadMmQkNDRVmjL9lIqh3UsupuqlUZvpbg4BAijy4m+dVNDYe5zKXi3CKLDScmYLvW7WU9Pm32sBYWFqSmprJixQr69evH0KFDheXapKs8yzpgX8aRBafBrKYP8bcPkfjkEgZFymNc0g0Tl4ZIDU2E14ZEKkj8qNExtUJqYIKzYbLot56TZiP8dyuieeF/PkOppkvNopwd7UGdEir9xJwyHOrH65Sw4exoj//JC0k++ajx9/dHIpFoLWlkxcnJSeRO8r1RxNqYrf3cOPNDfXq6FaOYjbFWI4NvncOccvgJ76KTcl4RVempRo0aGBoa4uzszNq1a5k2bZpG5mrTpk2C/JmBgQHly5dn9erV2W739OnTVKlSBUNDQ8qXL0+vXr0oUaIEOjo6VKlSRficu3btiqmpKRKJRJCRkkgkWr8DJ06cwN3dHRMTE8zMzGjRogVPnuRcxt5+MyRXmWJZbDhRp1YRum4QIQva8W5JVyIOzkEWE5btc3SkErbdCBEtW7x4McWKFcPIyAgPDw9RnxioVCu0CX/7+vpqBFoKhYKlS5dSsWJFIZjx9vbmzp07wjpnzpyhXr16WFpaYmpqSpkyZZg0adIXjzU1NZWWLVtiYWHBtWvXhOVr1qyhSJEiGBgYUKZMGRYsWMDw4cOZNWuWMNRx+vRpzpw5g42NzT9uIymXyxnWox3Jr29jXqsDdu1+wb7LTGxa/Klpm8fZXKVCTtjuydluL+vxZXej4+LiQnx8PBs2bBBlY7Mr2aqrGAW9BlK4/0rMa3dEmZ5G9Nl1fNg4FFlclhugTL9HHakEA10pRvo6ONubilbLrWbjf7Eimhe+1xvEr0J9IQoMi2f7zRAuvAwnJCpJc9Izi11cPvn815k1axY3b97k5s2bhIeHM3Xq1GwFys+ePcusWbN49OgRMpmM0qVLM2LEiGx7wnJCPRCSFQMDA1JSUpiGC4mpMoKiEkmTKTiydxsLFywkPuIDOua2mFVv/aeerCZp4UF8/G04BXotxKBQGd6v6os8LlxjPdMq3tg3HyHS0ouJiWHcuHEcPHiQpKQkXF1dWbhwIRKJBG9vbwoWLMj06dORy+XMmDFDIwMDquEKFxcXWrduja6uLkeOHGHo0KEoFAqGDRsmWjcwMJDOnTszePBgevfuzbJly9i6dSuNGjVi2jSVpWV4uOq179q1C0dHR9q1a/dFK82tW7fSu3dvvLy88PPzIykpidWrV1OvXj3u3bv3xYzXhRfhucoOp358SWroM0zK1UfHzAZZbDgJ947zacdECg1YpdU5RK5QcuFlOL6VVJm9LVu2EB8fz7Bhw0hJSWHp0qV4enry6NEjQQYtL/Tr1w9/f3+aNWtG//79kclkBAQEcOPGDWrUqMGTJ09o2bIllSpVYsaMGRgYGPDq1SuhzG1nZ4eJiYkoS5mcnEybNm24c+cOZ8+epWbNmoKG344dO+jfvz9VqlTh1KlTjB07Fn19fXr37s3ChQuFbaSkpORo3qFuWXj16pVIp1MmkxEUFKQhy5cbHj16RNCbV9i2GI1JxUYZx/RWszSdG9IjgpFFh2LTYjSmmbaX8pXbywsZVQxrAmyLoePelcSQp4RtG0v8/RNY1e+p6gdVKpBFf8DQvihyhZI6JWwYXdee6jPj/lJbyH+tIpoX/lUBpZpSDmZMa+2icSHK16LLJx/t/PLLLxQoUICqVatqOD5l5vDhw/j4+FC7dm0hI7dnzx569epFZGTkV7n4qFm9ejWmphmZg8xZAxMDXVwKWbB27VqmjhmJcZk6WFVpReq7J3w+uxalLBWLWppOP8mvbyM1tkS/YEZWQc++hNBLJSyzLiQqxZawNaFFixY8ePCAsWPHYmtry6pVq2jQoAE1atRAR0eHq1evCgL2nTp10ir6f+nSJVHAN3z4cLy9vVm0aJFGQPny5Uv2799Pu3YqDbuQkBCWLFlCZGSk4LWtlvvQ19cnODj4iyXuhIQERo4cSf/+/Vm3bp2wvHfv3pQpU4bZs2eLlouemyojJJfZWiPnmhrDEcYlXfm0dQxJL65hWsFT6/NCopJISlXZ57169YrAwEBB9sTb2xs3Nzf8/PzyNBQAcOHCBfz9/Rk5cqTIRvKnn34SMk5nzpwhLS2NEydOaJ2KlUql1K1bl9OnT/P69WsSEhJo2bIlT5484fz584Lwu7pXcMiQIaxatQpQTd127NiRffv2EZfFTm/58uVa/c8zU6NGDWxsbFi/fj19+vQRMnfbt2//akcm9ffE2kQftdeZUqkk/s7hr9qeNgF0pVJJ+sNjX7e9PBAXF0dBc3Hy6IyRkjCJFGQqK0OjEjWIubQFxaNj9Jw0V0geqYervsYIIDN5bc1RP16nhM13oyzxd/Cvj6zUF6J88skne9RSM5GRkVozbWpWrFhBwYIFOX/+vCDMP2jQIMqWLYu/v/9fCig7dOjwRcmL5ORkfv75Z0rVqI+86XjkCiVmVbwBJbFXd2FaxRsdQ3EpK/n1HYxKVBeVonXNbDCt0BBtqEux5VOecO3aNfbu3StM6nbq1InSpUtz+fJlOnfuLHJDKlmyJM2aNePIkSOi7amDSaVSSVhYGLq6unh4eHDq1CliY2OxsMg4NxUqVIi2bTMC3djYWPT09Hjw4AGfPn0SmQrY2dnl2C955swZYmJi6Nq1K5GRGaVAHR0d3NzcuHDhQrbPDY5K1JBdyo7MwxlKuQxFWhK6VgWRGpiQ9uk1ZBNQKoH3Maqg1cfHRwgmAVxdXXFzc+P48eN5Dij379+PRCJh6tSpGo+pvwfqNoHff/+dPn36aLWt7N+/P6dPn2bKlCksXbqUhIQEevbsSY8ePbhy5QqWlpaCM1rnzp1Fz/3pp5/Yt28fBw8e5IcffqB8+fJcv36ds2fPimxttaGvr8+0adMYMWIEnp6edOrUiaCgIPz9/XF2dv6iG1p2qG02359ch0HVj6BvRNKLaxq9j7lFz6YwupYF+Xx+I/L4KCQGRiS/uIaFTtpXbS8vnD9/nuHDh9OxY0dKly6NjUxG+uGt6OnqsPqXIZSrXB193XrMSb/N9m1bebbdmNPvPZiZjUvd15JfEdXkXx9Q5pPPfxWlUsmsWbNYs2YN0dHRuLm5aQjdqslts39cXBxWVlYilyddXd08aZ996fXGxcVhZmam9aJ54cIFoqKiKNjam/hM2QCzai1IfHKR5Fe3RYGiIiWB1NBnmGkphyvl6SjlcqT64nKsuhT79NY+HBwchGwhqIK4li1bsm3bNq3vV+YhCrWupKenJ9OmTSM+Pl5jfWdnZ+Lj44X/VqhQQTjurMdfsGBBNm3aJHh+h4aGCutkFcRWExiomlz39NQe0Jmbm2tdDpCWB5F5RXoqcdf3qjzW46PIrACa07BHuky1bqlSmmLnpUuXZs+ePbl+HWpev35NoUKFsLa2znadzp07s2HDBvr378+ECRNo1KgR7dq1o0OHDkJwqb6xUigUfPz4EX19fU6ePEmzZs0EDcmoqCgADWccdba6fPnybN++nZSUFOrWrcvZs2fx8vLK8RiGDx+OUqlk4cKFjBkzhsqVK3P48GFGjhyZa5HpzKhtNvsPHsb163uR6OhhXLo2ZtVb8vG3EXnenkRHF/sOU4g+u5bYGxnb27B4Kq086+R5e3mhcuXKeHl5ceTIEUJDQzE2NqZy5cqcOHGCRo0yyu/+m36jdKmS+Pv7c/DgQQoUKMDEiRO13mj8FfIrohn8d440n3z+Y0yZMoWZM2fSvHlzmjdvzt27d2natClpaV+fRWjQoAF+fn5MnjyZ3r17I5FI2LFjB3fu3Pmqi39mSpQoQUJCAiYmJvj4+LBw4UJR/5y6vBhrWlQ0TahfoCRIpKSFvYZMAWXy27sgkWDkVFW0n5Tgh4QsaA9KBTrm9pjXbIN5zQwruJCoJELv3qNatWoamasqVaqwbds2IZD4Eo8fP+bYsWPY29vTqlUrKlasSI0aNejRowdhYWEMHToUe3t7jhw5wrNnz0Raclu3bmXdunVcv34dmUzG1KlTqVmzJgMGDGD9+vXY29sLvXnaSu2QMWlrY2MjDJLcvn2b69evM2TIEDp16pTta9fXzf285ucza0l4dBazGq0xcCyL1MAEJBIif5+X47CHnm7us20SiUTrsEZOJWRtGBkZcfnyZS5cuMCxY8c4efIku3fvxtPTk9OnT4uyv507d2bXrl107NiRLVu2iL4Tjo6OxMbGiiwGM+Pt7S3ypgZNLcAGDRpoPa4RI0YwYkRGsKdQKHj79i1Vq1bVWDc3lCtXjquXzms4zOVGU1Gp/PMGQ5rxvujZFsGhy0wgQ0+xZUM3jWPx9/cXWQeryc7tJ6f3p3jx4mzcuDHH16yrq8uUKVOYMmXKF9fLbpDxa9yI/usV0fyAMp98/oVEREQwb948WrRowZEjR4Rs1s8///yXJKcmT57M27dvmTVrFjNnqi4mxsbG7N+/X+TPmxesrKwYPnw4tWvXxsDAgICAAFauXMmtW7e4c+eOkEn7+PEjOjo6SE0sRc+X6OghNTJDnhAtWp786jYGjuUEKREAfXsnDAqXR8+6MIrkOBIenePzufXIE6KxaqjK/imBDx8/4uGhqetaurSqF1M9jJGZV69eif5Wy7/cvn1bJEvSq1cv5s+fT9++fXFycmL48OEYGRnx9u1blEolEomEHj16cPbsWW7cuAHA4MGDKVCgAHXq1GH9+vWYmprSo0ePL76v6ueuWbNGJLDdtWtXduzYIRoWyYqTjYmGdWV2JL64ikkFT6wbZegMKmVpOZZTJUBhS1WmT51NzczLly9FmWArKyut+oTq91mNs7Mzp06dIjo6+otZSqlUSqNGjWjUqBGLFi1i9uzZ/Pzzz1y4cIHGjRsL6/n4+NC0aVN8fX0xMzMTTekXK1aMs2fPEh8fj5lZRjnz+fPnwuNfQ0pKCgYGBqJM9ZYtW4iOjtaajc4LX+MwJ09Q9W7qGGvPav/b9BTz+Tr+NbJB+eSTTwZnz54lLS2NESNGiC5KP/zww1/aroGBAaVLl6ZDhw7s3LmTbdu2CVk3dQCTV0aNGsXy5cvp1q0b7du3Z8mSJWzevJnAwEBh0AFUPZR6evpatyHR1Ucpy8i8KpUKkt/exahkTdF69h2mYFGrA8ala2FauSkO3ediWLwacbcPiSRHUlOSRWV9NerS5rVr10QZxVevXnHixAnRuupeuaz6g9u2bRP9HRkZiaGhIXK5XPRYeno6MpmMKlWqiPonc4NSqeSPP/5AT0+PxYsX8/HjRyIjI4mMjMTLy4vY2FjOnTuX7fNNDHQpmsvBAYmWAY24P46A8stl86I2xhj/WQ48dOgQoaGhwmO3bt3i5s2bNGvWTFjm7OzM8+fPiYiIEJY9ePBAmMxW0759e5RKpVblAPVnER0drfFYlSpVAJU0UFZ69erFsmXLWLNmjcg1p3nz5sjlco1WksWLFyORSESvPy/cuHGDatWqMXv2bNauXcugQYPo378/FSpUoGPHjl+1TTVqPcXcoEhLIf7+SeJu7EXHzBbdTB7Vmfm36Snm83XkZyjzyedfiDprk7U3zc7O7i+5bQwfPpwbN25w9+5dofTXqVMnXFxcGDVqFDdv3vz6F52Jbt268dNPP3H27FkmTFD55RoZGZGerr1cr5SlIdHNCDbTPgaiSIrFyLmm1vXVSCQSzGu2IeXtXVJCHgk9mAaGRloDi5QUlTOHQqGgbt26DBkyRAgoKlSowP3794V1S5UqRXx8PK1atWLQoEEkJCSwfv16ISgtX748ycnJou0PHz6cp0+f4uDgwPHjx1EqlcydK/b4zQ0RERFCyfvatWuiASI1q1atomXLltluo2EZe7beDM4xk2VUsiaJj88jNTBGz7YoqaHPSQm6j9Qo+x5NHamEhqUzrP5KlixJvXr1GDJkCKmpqSxZsgQbGxvGjRsnrNO3b18WLVqEl5cX/fr1Izw8nDVr1uDi4iKapm7YsCE9e/Zk2bJlBAYG4u39f+yddXRU19rGf+MzcU+AhAS34BSH4FCsuFtokeJatHiR4i0EKQ7B7eJWHFqkuHuCEyGuM7O/P4Y5ZDIJVnrb2y/PWlkwR/bZcs7e737tqYfRaOTEiRNUr16dPn36MGHCBI4fP06DBg3w9fXl1atXBAUF4e3tTeXKGdP59enTh5iYGEaNGoWjoyMjR46kUaNGVK9enVGjRvHo0SOKFy/OgQMH+M9//sOAAQMyZNn5EPj5+eHj48NPP/0kaVo7derE1KlTLTjEPxUfSnVqTIgm8uBC1O5+uNfvn+Hm4d+YTzELn4YsgTILWcjCByElJYWlS5fy3XffWfiRqVQqvvzyS+bNm0dKSspnWfAAfHx8LDRJ2bJlw2AwYIyPsjB7C0MqxsRYFHZvzZuJ98+jcPRE7fb+hU7h8Cb4IskUOCMDsmfLxvPnz62uNR9bsGABQUFBfP/99/j4+DBhwgRu3rwpmTrBpKHcvHkzo0ePZsiQIXh5edGqVSspann06NGUKFECtVpNs2bNiI2N5eeff2bmzJncvn0bjUaDRqP5oCCO9DAnlu7QoQMlSpRg/fr13Lx5k5SUFNzc3ChatOh7I/Lbl8vJit8evfdZLrW6g0xO/PWjCEMqmhyF8GwziZcbMvddMxgFHcrnhASTL2qnTp2Qy+XMmTOHV69eUbZsWSmjgBmFChVi1apVjBkzhkGDBlG4cGFWr17N2rVrrfzdli9fTrFixVi6dClDhw7F0dGRMmXKULGiKWCkcePGPHr0iGXLlhEeHo6bmxsBAQGMHz/eIvI+PUaOHEl0dLQkVPbu3ZsdO3YwZswYNmzYwPLly/Hz82P69OkMHjz4vX2XGfz8/Nix4xNT+nwgPiSfotLJE9+h262O/9vzKWbh05AlUGYhC/9CmH237t69S+7cuaXjYWFhn5zLLiIiAr1en2EQRGpqKkaj8ZMCJDKCEIJHjx5ZBCCYTZKOcaHEphEok5/fA2FE7fm2nYn3z6HLk3GgRHroo14AoLAxCRI5XW3wKFmCEydOYDQaLYTnM2fOYGNjQ8eOHS24icHka+ft7W1xrFGjRjRq9DbKfM6cOej1ekJCQiz8Kvv27cvkyZOpWrWqlHOyS5cubN682aK8Ll26sGLFCos0QGkxduxY/Pz8MBgM2NvbYzAYGDx48HuFm3Hjxlklss/naU+VvG4WARwZQa61w63BAKvj3r2WZXi9OYDDlELF3sIlYNCgQe+sZ/v27Wnfvr3FsTp16lg/Q6FgyJAhDBkyJMNyatSokWn0uxmZBctMmzaNadOmSb/t7OyYNWvWR6c3+icgK59iFj4nsnwos5CFfyFq1aqFSqXi559/tlgU58yZ88llenh44OTkxLZt2ywixePi4ti5cycFCxZ8J2tLZkjrE2fGggULCAsLo169etKxGjVq4OLiQsq1/RaUgHEX9yBTaSTztiH+NSkv7mOTTqA0JMYijJYCrzDoifl9MyiUaHMWk0yxLVq04OXLl2zdulW6Njw8nE2bNtGoUSMrarm7d++yZ8+e9wZMmKOH0/tVLl++/J33fSwUCgXNmzdny5YtVhSGkHGfZ4TJTYui/AD6xY9BVgDHPwsfQnUqA3xdbehYzpdDA6uy+utyWcJkFqyQpaHMQhb+hXB3d2fIkCFMmTKFhg0bUr9+fS5evJgpM8jq1asJCQkhIcGUaPr48eNSFHfHjh3x9fWVtD6jR4+mfPnydOrUCYPBwNKlS3ny5IlFQMnHwNfXl9atW0u8yydPnmT9+vWUKFGCHj16SNfpdDomTpxI7969sYnRo81diuTH14m/fgSnqp1Q6ExRton3zyNTqtHktKSoS7x7hujTG7ApWAmloyfGpFjibxwjNSwEp4BOKOycJVNsLteClC9fnsDAQG7cuCEx5RgMBsaPH0/u3Lnp0qULuXPnJiQkhAULFqBWqy18/jJCnTp1UKvVVn6VHh4eGZrYzUib3y4+Rc+HBOhOnTqVI0eOUK5cObp160bhwoWJjIzkwoULHDp0KMPAlPQwB3AM33r1/Q/8QPx/COD4X8xHmJVPMQt/FllvSBb+NmRNWn8tJk2ahFarZeHChZJgceDAgQxpx5YuXcqxY8ek30eOHJGYVCpXriyZ0EeNGkWuXLmYO3cu48ePJzk5mWLFirF582aaN2/+SfVs3749p0+fZsuWLSQlJeHr68t3333HqFGjpATSZvTq1QuVSsWQMT8QeeAMSnt3nGt2w75MY+maxPvn0foWtWBwAVB5+KFy8yH++hEMCdHIFCrUHrlwazIc24KV05liYc+ePQwdOpSffvqJxMREvvjiC1asWEGBAgWoV68e69at48WLF2g0GipUqMDkyZMzTNCdFgUKFLDyq/z2229xd3ena9euFtfGJKaSYjASMP0IoZFvGThePInGmBhLwPQjVC/gQftyOcnnac3A4enpydmzZ5kwYQJbt24lKCgIV1dXihQpYmGyfR8+NIDjQ/BvDuCQGFNuv7IYL3jDmOJi887x+ifh/3s+xSx8GmQiIyeRLGThL8K/adLNwt+Hx5EJ1Jp9jOR0jC7CaODx3LY4B3TGvtTH8fVqlHIODQz427VnjyMTPtqnrUpet7/cp239udB3BnC8q47/5gCOf+p4ZSEL/21kCZRZ+K8ga9LNwufG+nOhVqZYQ3wUsRd2Y1fyS5R2mSe1zgjTmhX92wWePyu0jW9chDZ/YRuyvmNL/NPHKwtZ+G8iS6DMwl+OrEn3n4N/m5vBvCN3P5sptnf1vO+/8C/E52rLkDr56VP93ab3PwvJ0nDnFaERGVgaXG2ont+DDuVzSi4E/zb8L41XFrLw30CWQJmFvxRZk+7fj/+Wm8FfLaxWq1aN8PBwq6jlv8oUK5PJGDt2rFU6nb8CGWlb/wz+m9rWDx33R48ekStXLpYvX06XLl0+6hldunTh6NGjFrzL48aNY/z48Rmm9vkUnDt3jv79+3P58mUSEhK4ePGilKoqPf7O8fLz86NatWoZ8mP/WZj7NCwsLMPgPTMyGo8sZOF/VzXxL8CKFSsIDAzk4cOHFpy1/xasPxf6WYRJgBkH7uBup/nLF8l/05h8iHlSACGRCaw+E8KK3x59tHnycwurz549Y/HixTRp0iTTxTw9/tdz6T2OTGDsjuuftcwxO65TMY/bf6VtmQVwJCQk8OOPP1KtWrU/zT/9VyM1NZWWLVui1WqZPXs2NjY2mfJw/6+PVxay8FchS6DMwl+CrEn370VarR3wXs2d+fzpBxHUmn3svW4Gf5Ww+uzZM8aPH4+fn997Bcr0mrGFHUrzLCrxs5liExMTUSr/+ily5Lar0jh9LuiNgpHbrrL663KftdyPQUJCgsSnXa1aNXx9fd/wsas+uqxffvnFKvfn6NGjJVrOP4v79+8TEhLCL7/8YpWwPj3+7vG6ffu2RbL9vwMZjUcWspAlUP6N6NixI23atEGj0bz/4v8hxCfr6bf+IqmGzzvh/BMWyf8F/Bk3A8Mbs/HwrVcJj0vO0M3grxZW34UUvZFxO66/VyO6pGMZsjvpPtoEbzQaSUlJQavVotVqP6mOH4O7L2M5cS9j1ps/A4NRcOJeOPdexf7tPozmPlWr1Z/cp2mF0Pj4eGxtbVEqlZ9N4H/16hUATk5O77zu7stYjt14glz9ed+Njxmvf8J68Smbgv8mhBAkJSV9EtFCFj4dWUw5fyMUCgVarRaZ7PMyUfwduPsylnE7rhMw/QhFxu3n4uOoD0q+/DFIO+l+DLp06fLB5uvt27d/fMXeYMWKFchksr/Vr+hzuxlsOBdqcWzekbsM33qVZL3RQpDUx4YTvmcuT+Z1ImR6E54s+JqI/fMRhlTAxFITfmgJDxd9S7tKBdDZ2vHll19y+fJlqYyjR4/yxRcmtpvAwEBkMhkymYxvvvmGx5EJ3Hwew71HoUxoXpoz8/oTMqM5T+Z1Ivp3Ez1hWo1orRm/UqFlTxpULkX5fF7UK+fP+O9HkpycbNEemUxGnz59CA4OpkiRImg0Gvbt2yedS+s/OW7cOGQyGffu3aNLly44OTnh6OhIYGCglBA+LdasWUPp0qXR6XS4uLjQpk0bHj9+bHFN8JlQC9afzCAMqUQdX8Pz5f0Jnd2K0JnNebHmO5JCrmR6j0IuY83voRZ1L1u2LCqVCplMhkqlomnTpgghePz4MV999RU6nQ6VSoVKpcLNzY0OHTrw9OlTUlJSGDNmDKVLl0atVktlVa5cGTs7OymR/v3795HJZIwcORJ3dxNH+sSJE9FoNNJ4rlixgitXrlCmTBlkMhkajQYvLy+6du1KRISJ23vEiBGo1WqGDRuGTCajSZMm2Nra4uzsTOXKlQETzaRMJpMS4ru7uyOTyWjVqhXbt2/H398fjUZDkSJFpDFNi4sXL/Lll1+iVqsJCAgAoGXLlshkMslE36VLF+zs7Lh//z7169fH38+LiF0zAEh6fI2wbVN4EhRoeufndyHy0C8YUy3fsfBdswmd2QJ9bDivtkwidGYLHs9tx+vDSy2YmxRyGatPP2Lu3LkWbapXrx7nz5+XrvPz87PwQY2MjGTIkCEULVoUOzs7HBwcrL4tM37++WeKFCmCjY0Nzs7OlClThrVr12b6DgGEhISQN29e/P39efnypdQvaefUR48eIZPJmDFjBosXLyZPnjxoNBq++OILzp07Z1GeuU+fPn1KkyZNLN6f9NStRqOROXPmUKRIEbRaLZ6envTo0cOKPtbPz4+GDRuyf/9+ypQpg06nY9GiRe9sVxY+P7IEyr8R6QWQ//znPzRo0IDs2bOj0WjIkycPEydOtPrIqlWrhr+/P1euXCEgIAAbGxvy5s0r8f4eO3aMcuXKodPpKFCgAIcOHbJ69tOnT+natSuenp7SpLtsmTX37vsmoMeRCXRceobac46z+kwIIZHWC2taxF07YloUZzTj8Zw2hP1nGvoYSxq4F8HDebakFynhobxYO4LQNIJD2kUSTJNd48aNsbW1xcPDg4EDB7J//35kMhlHjx61KPfMmTPUq1cPBwcHVCoVxYsX59SpU++sL8D58+epW7cubm5u6HQ6cuXKZZWEOj4+nvXr1wOQP39+ChQowIwZMxBCSIt5eHi4JMB8yIKXGfz8/KTFOe1fh8Bv/hI3g8dvxjQzYVUfG8GLlYNIuHkcm4JVcKnVA7si1UkOvYZ4s7jGXztM7OWD6PJ8gXPNb9CUbsLZC5cICAjg2bNnrFixgurVq0vMON27d5e4kRNsPKg1+xgxSXowpCL0yag9cuFc42tUrt5EHV1B4v23C67eYODVlglc27eGaPdidBo8niZNmjB79mxat25tVf/58+fTvXt3Wrduzdy5c9+7+WjVqhWxsbFMmTKFVq1asWLFCsm0a8YPP/xAp06dyJcvH7NmzWLAgAH8+uuvVK1alaioKOm6I7dffVAgkTE5gbgrB9DkLIpztS44Vm6HISGGlxvGkPLyQYb3GIyCI3dMmrdLly4BcPXqVQoXLkzr1q3Jli0b27dvZ86cOdSuXZvY2FiSkpLQarXo9Xrq1avH1q1bqVy5Mo8fP2bJkiVUq1aN0qVLo1QquXz5MqdPn6Z///4EBAQwc+ZM1q1bB8C2bdukoI6iRYsye/ZsC67rgwcPSjSUjRo1ok2bNqxfv5769esjhGDjxo3UqVNH0jAdPXoUIQSTJ0+mW7dugGm+BPDx8WHatGmS+fv06dP06tWLNm3a8OOPP5KUlETz5s0lYRXg+vXrVKlShcuXL9OlSxeqV68OmDb5Y8eOZdSoUdK1er2eunXr4uHhQc76PdDlrwhAwq1TCH0y9iW/xKV2T3S5ShH7x04idmXA6S2MvNowBrnOHucaXdHm9Cfm7DbiLu23GK9FPwxlwIABFm3SarX8/vvvmb4bDx48YPv27TRs2JBZs2YxdOhQrl69Kn1bZvzyyy/069ePwoULM2fOHMaPH0+JEiU4c+ZMpmXfv3+fqlWrYm9vz9GjR/H09Mz0WoC1a9cyffp0evTowaRJk3j06BHNmjUjNTXV4jqDwUDdunVxdXVlxowZ0vuzePFii+t69OjB0KFDqVSpEnPnziUwMJDg4GDq1q1rVebt27dp27YttWvXZu7cuR/sg/1PR3yynuvPorkY+prrz6KJT9b/3VXKFFkm738QVqxYgZ2dHYMGDcLOzo7Dhw8zZswYYmJimD59usW1r1+/pmHDhrRp04aWLVuyYMEC2rRpQ3BwMAMGDKBnz560a9eO6dOn06JFCx4/foy9vcmU8vLlS8qXLy8JN+7u7uzdu5evv/6amJgYBgwYALydgFq0aEH//v1JSkriypUrnDlzhnbt2n206TP69Aaijq/BplBl7IrXxZAQTewfO3kRPJzsgXORa+2ka41JcbzaOBab/BWwLViFhNsniTq6ArW7H0ecdSZ6sPh4atSowfPnz+nfvz9eXl6sXbtWYnhJi6SkJKpWrUrp0qUZMmQIY8eO5cWLF9SoUYOVW/dSoGhJ1Eo5derVlxYqMJnC6tSpg7u7O8OHD8fJyYlHjx5ZcDwLIWjcuDGHDx8GTL5d58+fZ+jQoTx9+hRHR8uAhZMnT7J161Z69eqFvb09P/30E82bNyc0NBRXV9f3vSYAlChRgsGDB1scC76Z8pf5dk1uWjRTYTXq2EoM8VF4dZqJJttbE7lT1Q5SBG5qxBNEchzO1bpI5+XFa/Hsl54sXboUHx8fACpWrMiiRYuoUKECnTt3hsK1mXP4ATK9ESEEQp8CChUutboDYFe8Nk+DuhJ35QC6N9zd8dePkfToMp7tpqD1KcJBAUOaNWeevz89e/bk9OnTVKxY0aINCQkJjBkzBoDJkye/U8tcsmRJli5dKv2OiIhg6dKlEvtMSEgIY8eOZdKkSYwcOVK6rlmzZpQsWZKgoCBGjhxJXLKe0PdswKS+0tqR49ulyBRvTY32xevy9JeexPyxE7f6/TO8LzQigWevIti7dy8A7dq1k+puMBjw9fVl8ODBTJo0iblz5+Lv78/BgwfJnTs3SqWSTZs20bBhQ1asWMGjR49Qq9V06dKF33//nZEjR7J06VJevHjB5s2bKVWqFBs3bgRMvrBnzpyhUKFCNGvWjAEDBvDo0SMGDRoEmBiPBg8eTMWKFXn06BGbN2+mfPnytG3bll9++YUHDx4wbtw47t+/D4CLiwtGo5Fvv/0WMDE5mTVwe/bskdo7ZMgQwsLCuHHjBnny5AGgevXqFC9enHXr1tGnTx/A9I2mpqZy8uRJcufOzdGjRzly5AhqtZojR45YaKaTk5Np2bIlo8ZNpOi4/ZhnKadqXSzZmErUQ+mcjahjq9BHv0Lp6CGdEvoUbApVwalSW9PYlazP8+X9ibtyAPtS9QFICrnCy/P7+bZ3H4Lm/SzdO3jw4HdGshctWpQ7d+5Y+FV27NiRggULsnTpUr7//nsAdu/eTZEiRdi0aVOmZaXFrVu3qFmzJjly5GD//v04Ozu/957Q0FDu3r0rXVugQAG++uor9u/fT8OGDaXrkpKSaN26tVS3nj17UqpUKZYuXSqN8cmTJ1myZAnBwcG0a9dOurd69erUq1ePTZs2WRy/d+8e+/bto27dusBbQex/MUXa/yoByD+6d/9tOfPeh7Vr11r4fPTs2ZOePXsSFBTEpEmTLHxnnj17xtq1a2nb1jRB1a5dm4IFC9KuXTtOnz5NuXImP8NChQpRt25dtmzZIplJRo0ahcFg4OrVq5IA07NnT9q2bcu4cePo0aMHOp3unRPQx/rp6aNfEXUiGKeqHXGs2Eo6blOgAs+X9yf2wh6L44a4SFwbDsLOvwZgKTiE5ilDfLKeRYsWSbvzr776CjDtaEuWLGn1/IiICGrWrMnevXs5e9O04Gv8a2P84xCBfYbg2WYiAHFXbgIw5+Adejd25fpvp3n9+jUHDhygTJkyUnlmnmuAHTt2cPjwYZo1a8bWrVvp1KkTY8aMoWXLlsydO1daxMy4efPmexe89yFHjhx06NBB+n33ZSyjrx8HPkygfBFs0uZ4tZ8KgD7qJU8Xfo1r/QHYFasFQNSJYKJPrcMwfBcDNlxEbxQ8CeqKNmdR3BoOBEAIIwl3f0eXt6yFMGmG2Z1DlmaxE0YDxuR4UGrQuftw4cIFSaA0Q6/Xs+H8Y+YeDUEmV7w9IVdY/JYpVKiz5Ucf9VI6lnDrJCpXb1Su3hgSogGYtv0cg6sWBEzCSFqBMnv27BaanMmTJ9OiRYtM+65nz54Wv6tUqcK2bduIiYnBwcGBrVu3YjAY+OqrrwgPf+sf6eXlRb58+Thy5AgjR44kJCL+A0eLN202tVsII8akeBBGNF75SHlxP9P7BLBh+25SUlKs6q5QKPjiiy/Yvn07JUuW5NWrV4wbNw4vLy8KFCjAgwcPaNCgAQULFmTv3r1MnDjxzfNNte7YsSOXL1/mwoULUj+sXLkSgObNm78z7Yx5nmvdujUDBgzg3LlzlC9fHoD169ej0Wj46quvJK1m/vz5uXXrlnT/li1bMi27Vq1a0rcFUKxYMRwcHHjwwKTJNRgMHDhwgCZNmpA7d26LeytXrsyvv/4qjaUZ3377rdV4pRUmjSlJCH0ymhyFAEHKywcWAiWYhMi00HgXJv76281vwu1TgIwO31puFOHtd5QR0q4LBoOBqKgo7OzsKFCggDQ2YPIPffLkCefOnZNcSzLDtWvXaN26NXnz5mXv3r0WffEutG7d2kLwrFKlCoDU92mR0Xe0evVq6femTZtwdHSkdu3aFt9R6dKlsbOz48iRIxYCZa5cuchdomKmPtYAXg4avvBzoVvl3BTzcfqgNv038d/IzPFX4h8nnf2vSuYfA3NqmrRaR7PPjtlMGxsbS3JyMlWqVGHRokXcunWL4sWLS9fb2dnRpk0b6XeBAgVwcnIiR44ckjBZrVo19HqTetz8QQsh2LJlC61atUIIYfGh1q1bl/Xr13PhwgUqVaqU6QSU1vQZvms2CbdPkXPw5ne2OeH2aRBG9PGRGBKiif59C7FnTVo+mUpL1Ik1xJzbjkylwZAUByoNCbdOEXlgATKVBseyzSTBQQBzghYzevBgPD09adzYxONs9rVKu/CAycdIr9dTt3FzGoxdxd6JXQB4fDgYAH30S16fWINzlQ4k3PkNgK2XnrL9wXHy6U2CRq9evejduzeTJ08mJCSEIkWKMHv2bKpWrcqePXtQKBTUrl3bQnM5ePBgNm/ezG+/mco0pyFxdHQkKSlJui79gpcWaYNE0iMlJYXU1FRsbW0lX7wPMp8mxaF//RxDYgwh05ugsHFE7WUpDBrio0i4azKFhU5vyjOXHDiUbWpxjVkIBRAGPU8XfoM+Nhy1ey5c6n6LJlt+wPSOxF/7FYCQqQ1Jj+1P7qFWqwGThgng5r1HbLt8mJB5gRZCrkylAaOR1KgXRO6fT/KTGyAEKFQIIZDJZOhfPyM14jFPfmpv8ZyBP5n+HT16NDly5JA2WGZhMqNF++LFi1SvXp179+7x/PlzAHbt2iX5/wHSAtq3b1/q1KkjCV7+/v4Z9v/Dhw+ZO3cuVZt2yvB8Zoi7+isxZ7eRGvEEjG/NXkrHd5shHz18+17lzGkZDOXo6IhWqyU62iR4FyhQQDpuNhEXLFiQkydPsnLlSmbOnCnlAS1UqBBgWsjB1A/mcszHMkNkZCTjx4+X3GfKli0rnbtw4QJffvmlhRBjtq6Ycf/+fezt7YmNtfanTt9Gc93MfndhYWEkJCRIbU2LHDlyYDQaefz4MUWKFAFAqVTi7e3N5SfRFteaN8mJ985gTIqzOGdMjrf4LVOqUdhYWirkWjuL+1KjXqCwd0Fn/3Ec2kajkblz5xIUFMTDhw8tXKTSWjyGDRvGoUOHKFu2LHnz5qVOnTq0a9eOSpUqWZXZqFEjPD092b9/P3Z2dlbnM0P6vjd/G+l9Hs3+oemvTXvd3bt3iY6OxsPDUjA3wxxIBSbrWLLOldpzjr9zHnwRk8zOK8/ZeeU5WqWcBsWy0bNqnn+ELPF3Bjt+LvxjBMr/dcn8cyA+Pp6mTZty+PBhYmJiLM6ZJ2ozvL29rRZAR0dHK02POQoy7WQaFRXF4sWLrfxVzDB/qBlNQDUbNmPs6ZSPblvqa9OiHffHLuL+2GVxTqQmIbdzQeOZh8T750ChAiFQ2LviXC2Q+BtHeX1kGdpcpUzCJkgfna+v73uDmsx9Oah390yv0fpZajWNRoEcuK8yCYHnzp0jMDCQ/Pnz07hxY8kf8+zZs4SEhJA9e3Yroc+84Jod6gcNGsSkSZMICwujaNGidO7cmQULFqDVaqXJVCaT0bt3bypUqMDkyZO5c+cOmzZtwsnJierVq0vm/MOHD2NjYyMtHu4lamBTb9Db/o54TNSJYJJCriBSk1A4uGNToBKOFVryIngYhrhIdIUqY4gOIzXsEYl3TT5aSY+vYVOoCi/XjjAJLoBT9a4k3DpJxO7ZOFXvikOZxlb9l/LsFjYFq5D89AYpL+/xYuUg5Hau2BasjG3RmiQ/uYE+6jkaH39UbjmRq3Voc5Ukcv8C9K+fcvLkScCkrd24cSNHH8SQYm8SFiIP/4Imh0m7iDCZD58t6g4I5LbOCH0KIimO6BPB2BSqQmpEmsAXmRyEOduAyddUiIyzD6xevZqOHTsCSJq2HTt2ACbNy4YNGwCYMGECEyZMsLr/9OnT7N27lzx58nD+/Hnmz59PbGwsw4cPp2TJklIwyfPnzzl16hS1WnbJsB4ZIe7aESJ2z0aXrzwO5ZqZhBO5gpjfNpL6+sU7700b9GP2W7Q4n8ExwMLMmpycTJcuXWjSpAmOjo6cP3+enTt3MmXKFMksnRbvi65t1aoVp0+fZujQoWzZsoXExESCgoKoV68e0dHRVr6umdUxI3xIez4GGo0GuVyOWmmpZX+54XuMibE4lG+BysUbmVqLITaCiN2zTZuctJB9eLhC2ud8CCZPnsz3339P165dmThxIi4uLsjlcgYMGGCR2qdQoULcvn2bXbt2sW/fPrZs2UJQUBBjxoyx8gFu3rw5K1euJDg4WPJr/hB8aN9/yHgajUY8PDwIDg7O8LxZIF1/LpQXMUmoNTLceb8gZkaS3siWC0/ZcuHp3y5L/NWZOf5b+EcIlP8GyfzPYuPGjRQqVIiIiAgmTJhAnjx50Gq1XLhwgWHDhlnl/Mrsg3zfB20up0OHDiYftQxQrFgxIPMJyKlyWxwrt8/w3kzxZhF3bzEGmVJN3NVfSXhj7nFtOBiVczbU2fIROrM5GFKR2zjhWrcXALaFq/JkXmf0r59LE7XyAyJjzXjy2uSn5lS9K2rP3BiT4wnfNgWbItWxK1oTAG12a20FYBGpXq5uM1LDHrFp0yby5cuHEELyu8sIcXEm4dfDw4NXr15Jvpnly5fnjz/+YMWKFRgMBlatWmXqojdtO3z4MBs3bqRPnz64ubnh5+dnEchRrFgxKleuTIECBbh9+zbDhg0j7NJhHDTOOFcPJOXVQ14ED0MmV2JXoi5KR0/0r5+TeO8sMrmC1LAQXOv3J+pEMMhkOJRvDjIZ0cfXEH/1EMakeFIjHqPLX4HEO7/hUKYR9iW/5OXa4USfWod9iXrIFJZThzp7QWQKJUoHd9QeuYm/fgS1W05i/9iJITYcY7KpL8wmdql/U0yaHPOGp2HDhmzcuJGHr1OIPWzS4DuWb4nK1RthNCJSE0EIVB65sCtWh4RbJ0l+ch3kCqLPbEabqwQyjQ0i2TTmchtHHL74CqFPJfb8DivNUVqYXQi++eYbypYty4kTJwCTNWDp0qWkpKSwbds2SpYsyaVLl5gyZQpTpkzBaDQSGxvLgwcPuHr1Krt37+b8+fPUqlWLoKAgHBwcOHfunNW3GZ+sR8aHOSkk3D6F0skL92ajLDZQ0SeC3/RjUoapbGRAKf+C7y3frD2/ffs2NWrUsDhnznuYO3dutm7dSmBgIBcvXqRWrVqMHTs20zIz2+jFx8fz66+/Mn78eMaMGYOXlxe9evWSziuVSho1avTO+ubJk+ejAtnSwt3dHRsbG27fvm117unTp8jlcquNOYCfq600XqlhIegjn+LaYKA0hwAkPrz4SXUCUDl5kfTgAg6y5PdfnAabN2+mevXqFn69AFFRUVZuB7a2trRu3ZrWrVuTkpJCs2bN+OGHHxgxYoTFhnj69OkolUrJzzutafm/hTx58nDgwAFq167NuXPnLFyOzDALYkJYy/Afg5P3wz9YlvgzjE8Z4X+RACQz/O1R3pmlIfkQGIyCZL2R4VuvMu/I3b+ohv8dnD59msjISFasWEH//v1p2LAhtWrV+iBHaDCZ0UNCQkhMTHznde7u7tjb22MwGKhVq1aGf2lNDOYJaPny5fx67jq6PF8QdWqDKTjiI6B0zgaAyiUHOr8SqJy8pHNa78JochREJlcgV5s0G3KtLWByVH88pw0KOxeMKaa2he+azaxJJkEuJCTknZqH9edCefpGhpBrbND5lUDrYzJFqpy80PmVQOdXwkpASg9NjoI8LxHI0AVbCQ4O5u7duxQtWpT9+/fj4+PDs2fPLMzYYEobA0hRw9mzZwegcOHCVK9eHUdHR1avXs2VK5apX27fvs3Ro0cZM2YMvXr1sopW3LFjB9999x25cuVi2LBhpra4+RJzbjsJ987zfFlfREoi2brMwTmgM/Yl6pES9giZUk3C7VOoPHLx+tgqDPFRZAuci1OlttgVNkW5qrPlJ/HeWQAMCW+15DKFEvvSjRApibza+oNV/yQ9OE/c5f0kPb6OPi4SAF3eL3Cs2oGE26cRelNEZvzNE0SdXMuTeZ0IndEMY3wUAMWLm9po9iGNOroc4xuhUGHjZKpPfKS0arg3GY5DmUZ4tv0Buc4RjAYw6El+essiuMuldnccy7fAqXJbPFqNS6OtxMpc6uHhwcqVK5HJZBa+dXFxcdjZ2bFt2zbApBESQkh+k2YtsVar5dy5czRr1gyFQiHRAsbExNCjRw+rdCo3rlwkZzqNSGrEY8K2TebxnDaETG/K8xUDSLh7Bpmk4RLEXTlEyNSGxF7YQ/LTmxhiw3g6P+PNYU5XGxo3+FJyKUj/jpq/nTJlyuDh4cHChQstUivt3buXmzdvki1bNovrwZQ1wezOkRFsbExtS7sZAqTgEXNZzZs3R6FQMHr0aMDkL2lra5tpueZ7MsP7NJEKhYI6derwn//8xyr46uTJk1SuXDlDn0FbjfLteGWgcRRCEHt+xzuf/S7YFKgECGZMtf6+3tUmhUJhdX7Tpk08ffrU4ljaKHcAtVpN4cKFEUJYRUzLZDIWL15MixYt6Ny5s6Sp/2/C7JaVEfR6PUsPX/1sgpgQWMkSa9euZc6cOYDJFU0mk0mZVN6Fj0lT91cRgDz+wGC/z42/VUP5b5LM/yzM0W7mD+jo0aNUr15d0hy0bNmS2NhYKlWqlKHQaPa9PHr0KGXLlmXmzJlW16SkpDBp0iTUajXr1q1j+/btlC5dmgkTJkhpM8LCwiRTQkREhIUPzqaLL1C75yTxwR8Igx6ZUi2d08eGE3lgIUmPLiFTqrErWhOnal2kAAqb/BWJOrKcV1snk/3reRb1EggMiTEodA4gM11vEYgBGFMSMSZGgxAk3j6F4c3ply9fsmPHDikoJ63/UJ06dZC7+iJ7U27Mma3YFg6QzsddP0rMue2m4IbsBXCqau3Tlvom2CPl5UNCpjeh4yJ3OrcxLWaurq4kJCRQqVIllixZYpWeyewfdvasSUDbv9+UIsScnsnsm5Q2ShUgICCAwoULW9UlPfz9/XFwcCAmJgZtrpKkhocQd/WA6aQQkmAlhJHkpzexL16P2Au70OWvSGpYCHIbRxACQ0I0hiSTcKVy9yXluembTK9hUrmatDYixfr9k6m0CKMetVtu6f7Xh966VMjUNojUJCL3z0eutUPpnJ3kZ281ROY+atWqFUuWLEHoU1A5eZESFyEF1kj+ZjI5yjcbEplCicrVm+Q3/m2GuEgUOgcM0Sa3jdgLezHER5n8LiOfWNQ5fVDAkCFDOHnypMUiJpfLcXFxYfbs2WzdupVt27aRP7/JN/TMmTMoFAoqV67MgQMHsLGxoUuXLsyZM4dJkyYxYsQIihYtCsDSpUtZtmwZarWa4sWL8/DhQ5o1a0aXuTtZG5WIwShICQvh+bK+yBQqHCu3Ra7SEn/rJGFbJmFXqj76Oy8I2/KDNK6RBxcgU2pAqcKhvHUQkUIuo3p+DxwcHKhbty47d+6kTp06dOzYEWdnZy5fviylzVKpVEybNo3AwEACAgIIDw8nOjqaFi1a4OfnR58+fejTpw9NmzYlLCyMlJQU6tWrR+HChSVNfHrodDoKFy7Mhg0byJ8/Pzt37pSOV61alR9//JHU1FRy5MiBi4uLFECSke9pejeg6tWrU6xYMa5cuUL9+vWpV6+eZH25evX9HNuTJk3i4MGDVK5cmV69ehESEgKYBJUff/wx0/uqF/Bg9ZkQVK7eKJ2y8frwUgyxEcg0OhJun7bypfwY2OYqTrFqjfjpp5+4e/eu1KYTJ05QvXr1TAP2GjZsyIQJEwgMDKRixYpcvXqV4OBgq4CjOnXq4OXlRaVKlfD09OTmzZvMmzePBg0aWPmogundX7NmDU2aNKFVq1bs2bPHSnv9VyIgIIBq1apx9OhR+vfvT8uWLVGpVNy9e5f1GzYirxSIOl/F9xf0kTDLEmvXruXatWsMGDDAIl7hzzA+pcfHsC6F75pNUuhVvHtZp/dLiz9LACKTyRg7dqxFpoMPxd+moXyfZP4ieDjhu2YDpo40R6W+C3+VZJ6QkMC4ceOs8hp+Tjg4OKBUKuncuTOzZs2SIqvN/oytW7dmxIgR/P7779y8edPi3qVLl7Jy5UrUajW5c+fm3LlzfPnllzx+/Jhjx45J18XExLBkyRJatGiBi4sLer2e69evU7t2bfr160erVq0sHNXr1KlDgwYNmDx5MkuXLmXpzPFEn9uBLk8Z5Jo0mpUPyLGmeqOh1IeH8HLNdyQ9fduGl2tHEnfFOlcmIPm7GROiQa5ArrOnVK2vpKjVHDly0LZtW0aMGAG8FdoA/Co0wJAYQ9KjS8i1Nhhiw3m2pBevjywHwBAThlxrj8LeHX3US16sHSH5aAIYU5N4uWYoYAoGsSlQGZnGliUL5qFWq8mXL5/UT9WrV5ciT1evXk2TJk0kzWPTpqZgFrNpu3Hjxhw8eJBt27Yhl8uttCTvC2gwQy6XS2Yguda0IKS+emg6KZOR/KaPU18+RCQnoPExBRlgSAFhxBj/mic/tefJT+15sWIAAPFXDn7Qs9Mj+zdB6PKUJeXl/QwFToWtE2DaGOhjI0EY8Wo3Raq32fC7fv16ZCotKNWkPDHND5IgqE/JUDMk02SuzdJHveD14WVEn1pHyvO7oDBtgpJTDezevdvi2u+++44dO3ZYsK/I5XJsbW3p0KGD5Apy/frbeWvlypVSpoW6detSoUIFRo8eTe/evdmyZYtFBK69vT1qtZpz585RtGhRnjx5gk/8Hcky8/rQYmRKFSqvPDiWb4F96YZ4tpuCJkdBkh5exCmgEymvHhJ//SgAShcfdAUqIVfb4JiBQGkwCjqUN22wS5UqBZg2MRMnTmTYsGFcuHCBHDlySNd36dKFDRs2kJKSwoMHD3j9+jVNmzbl5MmT9OrVi8mTJ3P58mXOnDmDwWBgzZo1GZoh02LJkiXkyJGDgQMHWpio165dS926dZk/fz4jRowgZ86ckkBo/q7eB/Mm8uHDhwwdOpTJkycDSNrUd6FIkSKcOHECf39/pkyZIn2bY8eOlYIaM0L7cjkxGAUyhRKPFmNQe+Ym+vdNRJ9ch8o5O24NB2V67/tgMAo2rl3F9OnTLdqUmJholeYqLUaOHMngwYPZv38//fv358KFC+zevdvKbN+jRw/i4uKYNWsWvXv3Zvv27fTr10+ypGQElUolpXT66quv2LFjB+PHj2fXrl08fvwYNzc3qlWrJvlAp4dZOz19+nRsbW2pXr26labUDLMLglarJWfOnIwdO1ZyQ4mMjGTkyJGMGDGC3bt3E2+Q83LvfEJntuDZ0j4YkxM+2Uc2I4zZcZ3EVEOG52QyGVqtNlP3sl9++SVDd4r0MLNkfaxl9n34VAKQz4G/TUP5d/OhfgzSc9L+FVCpVBQtWhSNRsPo0aMlc5G7uzuhoaG0aNGCatWq4ezsLOWEBEhNTWXkyJGUKFGCyMhIfHx8uHfvHj179rTSUjo7O0u55MyBBdu3b+f169csWbKEihUrSrn0wDQBBQcHM2vWLOLi4jDoXHAo0wjHim0syv2QHGtm2BSsjCEukuTQt1oErU8RbPJlPGZJj0y55pROXhgSY5CpdKxb8QuzxrmwYMEC+vfvz7Fjx5g7dy6AJGgCxPpVwbNIY54u/AaRmoJXxxlEn1pP/LU3qToUKjTZC2BXoh4qNx+eLe5BavjbpOkxZ7dLGgdjSgIJt08h19iidPJCHxPGo0ePsLGxwdPTkx07dtC8eXMOHDjAhAkTyJUrFx06dGDNmjWS+c4clOHj40OtWrWkCPz0yCigISN/tPj4eEqXLs3hw4cxxJomaUOcyRdRYe9O0uPr6HKXJunJdUCGxrswSicvKdhGbuOEW+Mh0n0Ru2ZiX7YZyaFXSHlxz2qCNgt2MrV1/RT2rpJZ3cyOo7B3w6lqR1OQwpv6OwV0wrHcW3OlfakGRJ9ej3+J0ly5cI4a9RqyY/N61F55SXl5H4RA620ShBUOHhiT4jAmRKGPeoHKxSQMOVftwPP7Jg2nws7Fol4utbphk7+C9Dt0ViuEIYXwuGScnJyQyWRWJlkzunfvzuLFi6V+GDduHP3795c0aPb29rRt2xa5XE5gYCBOTk7069ePtm3bcuzYMZo1a0apUqXIlSsXvXr1Yv78+RiNRnr16iWxeCS9fkGVvOU4cf0RSSFXcKzcVsrRaoY2VymiTwZj618DxwqtiLtyiIg9c3As39zCf89iPOQyKuZ2lWj8xo0b90Eah1atWtGqVasMz40YMULauJnRoEED6f8ZPaNChQpSUNq4ceMYP3685HeWNiNCZjCXmfa7NiOz4KiMkFFe0ZIlS77XD3PFihWsWLFC+p3P054qed04/SAC3HzwbDPJ6h7f4ZZBh24NB8KbNFtp4VSlPU5VTL7o5vEqkM2JAkOGSNkOPqQtGo2GGTNmMGPGDIvj6RUg3bt3p3v3zAMTIeMx1Ol0Ulnz5s1j2rRpNGnShEqVKqHX61m1ahUdO3Zk2bJlBAYGSvcZjUYaNGiAra0tQ4cOxc3NjaCgIP744w927dpFr169+PXXXwkNDUWpVBIXF0eFChUIDAzk6tWrTJo0SWIwWrRoEcHBwaxfv5579+4h09iagtN0DiQ++IPUsEeonLOReP880b9tNM0dMjlanyI4VQtE7W6y9MVdOUjEnrlk6zIXtVcei3ZGn95I1Ik15Oi1jJc7Z3LnzRqVfu7NyIfyypUrzJo1i+PHj/Ps2TOcnJyoX78+06dPzzS38PsycyTc+Z24y/tIefnAtPbJlSBXIIwGCwvei+DhGBNjcGsynMgDC0h5dge51o5vn3fm4Iq3MoDZ6rlhwwbu3r3LggULCA8Pp1KlSixatIi8efNK14aEhNCyZUvOnDnDy5cvrRjGMsPfoqH8N0rmnwKzedasEXFwcOC3334jISFB8tXo06cPQghJkDXn9TLnZzt//jyvXr3C39+f0NBQaYK1t7eXylUoFOzdu5fJkydLuyo3NzcmTJjApUuXqFSpEkqlkj/++IMBAwZQrFgx5s6dS/fu3Tl27Bjh4eH8GLQUmVJFzPmdvFg9hITbp6WUQWASIpNCrhAytSFJIVfQeBdGH2WKPtVHvZTSxahcffDq8COOFd4uWgl3z/BsaR+erxhgEkZkcrJ/EwRA8mNTihKZUoXSzpmm41cxul83C1agefPmSW4AaTVCkfvmYUiIQuHghtAno3L3xa3JMDDnRDTqSbj7O1FHl5Py/C62hQMQb0y/SidPEm6dRJOz6JvB0uPRcizZv5mP+5d9MRoN7Nu3jzp16rBr1y5at24tMU5ky5aNjh078tNPP+Hg4CAFd9y9exchBPPmmUz+Z8+exWg0cunSJTQajRRFvG/fPqtF4/jx4wAcOHCAnj174uHhgbe3t6SFiLuyD2QKRKppo2GIiyD+xrE3fXgdlZsPCp092lylJaHZmBDF61+XYIiNQOttMrGr3XJiW6T6m/NvhRphNBB92pS0OjnkCk8XfkPcjaPS+acLvsHw+hkibdCLXP5WwHszASq0b01rxpQkSTh1cTQdb9W5G45V2pPy4p6Vl73S0R2RYrJAxKbJFJBijuqWyd9Gg79B0pv3R2rHm/7RGwU//vijhRl1+PDhPHjwQFpA6tc3bYbM1xiNRtq3by+l2ipYsKBFMml4G9lvNqGag43M6VTkcrmk6TSfn9y0KIbwEEAQfXItT+d3ljTHT35qT/TJN4E38ZaZHpROmacLUsplTG5aNNPz/2tQq9WSH2hmSEpKsgpe/CswuWnRjwoK/BD808YrNjaWAQMG4Ofnh0ajwcPDg9q1a+Pp6UloaKjEiHPx4kVOnz5NwYIFpQDFatWqUa1aNTZv3szp06dZsWIFLi4uBAUF8eDBA+Li4mjYsCG7d++mTZs2/PTTTxId6NmzZ+nbty/BwcHkz59fEmT79OnDzZs3Jf9+kRxP3MU9vD62iqRHF5Hr7Im9vJ9Xm8YjU+twqtYFx4qtSQl/zMs130l5am0KVEKm1BCfZu4CkztNzNltIFfwdOE3pIQ9Qq61w8nZhdWrV0vkFEajUZq/u3XrRs2aNbl37x4HDx7kwYMHBAYGUqpUKRISEiTmp4cPH2ZISzmzd3MSnr7VZAp9CmE7Z0k0nRH755P44ALGpHi0Pv7IdQ6I5Hiijq60Gi8zEchbBrEcHFo5SyI0SIupU6eybds2hgwZIlk927e3DLK9ceMGCQkJfPvtt/z8889WZWQK8YGoVq2a0Ol0Inv27GLatGnS8djYWGFjYyP69etndc/jx4+FXC4XkydPtjg+9j/XRO6Ru4Xv8F2Z/ml8/IWtf03hO3yXsPWvKTQ+/hbncw7bIZxrdhMqd1+BQiXkOgehzVVK5AicI8b+55oQQojU1FQxYcIEkTt3bqFWq4Wvr68YMWKESEpKsqjPuXPnRJ06dYSrq6vQarXCz89PBAYGCiGEePjwocBkj7P4Gzt2rBBCiMuXL4vOnTuLXLlyCY1GIzw9PUVgYKAIDw/PtC+XL18uADFo0CAhk8lEfHy8CAgIEAEBAVJ9ypQpIwChUqkyrc/06dNFx44dBSBkMpkAxIkTJwQgKlWqJJycnAQgOnXqJFq2bCkAUa9ePVG0aFGhUqks2qNUKsXYsWPFggULRL9+/UStWrWk+u7fv1/I5XKhcvcVzjW+EQ4VWwuZxlao3HIKmUorZEq18B2+S3i2nSwA4dl2snCs1FYAwnf4LpGj51LpOY6V2grf4buEXcn60jH7cs2FS+2eQuPj/+aYTBpnhYN7hv2ftt79+/eXfsvlctO/Glsh1zkIhb2bULn7CUB491ktPN7UEZlcyNQ6YVOwslC6egtA2BatJZXjO3yXkCk173325cuXRZMmTUSrVq1Eq1atBCDq1ze1bciQISI4OFgam4IFC4pFixaJUaNGiRIlSgh/f1N78+fPL8aMGSMWL14sAKHRaISvr6+Ij4+XxmD+/PmmOtraCq1WK2rVqiWaNm0qChUq9LZOSrWQKdVC6ZxdgOmZ7s1GC7mtk7Ar+aXwHrRZKF1yWLRBbu9m+tfOVQDCtf4AkaPXcotrnGv3EGqvvNLYqDzzCMcqHYRMZy9do8tXIcM+kmvtLZ6j9spnGg+FSujylRdO1QKlNgNi/Z4jwnf4LqHOXvBtOTKFkNs4CXWON8fkSqF0zi5s/WsImcZOIFeYnmHrJJArBQqlNMbIFcL+iybCpc63QuWRSyrTwcFJTJw4UdSpU0c6plAohEqlEhqNRri7uwsXFxfpXP78+cWXX375tk+cnUWVKlWk8TGPe+XKlaWycufOLfLkySMAUbt2bbFkyRLx/fffC6VSKbRarQBEzpw5hU6nE+VrNTTd9+Z99WgzSXi0mSTkNk6Zvn8udXpJ30m2LnOFNndpIVPrhEylFUXKVBS//fZbhvPOyZMnxcCBA4Wbm5uwsbERTZo0Ea9evbK4dvv27aJ+/foiW7ZsQq1Wi9y5c4sJEyYIvV6f6byWFidOnBBlypQRGo1G5M6dWyxcuFCMHTtWpF9yli1bJqpXry7c3d2FWq0WhQoVEkFBQVblpZ0fhRDiyJEjAhDr1q0To0aNEtmzZxcymUz88ccfAhCzZs2yKuPUqVMCEGvXrhVCCKk+t2/fFu3btxcODg7Czc1NjB49WhiNRhEaGioaN24s7O3thaenp5gxY4ZU1rqzIaZ1aMg24ViprVA6ZRMolEJh7yYcyjUTOYdss1ivAGFfqoFwbzZKqNxyChRKoXLLKTxajRe+w3eJ9WdDMu1Lc1vXr18vRowYITw9PYWNjY1o1KiRCA0Ntbj2+PHjokWLFsLHx0eo1Wrh7e0tBgwYIBISEqzKvXnzpmjZsqVwc3MTWq1W5M+fX4wcOVIIIUS7du2EWq0WgwYNEkuWLBHTpk0TjRo1EmvWrJHu9/X1FZ07dxZCCDFo0CABiJiYGGmsWrZsKTw9PcXChQsFIFq0aCEWLVokKlasKJRKpejVq5cQQojr16+b5ip301wfGBgoRo4cKRwdHaV3vXTp0iIlJUWULVv2zbfubJoPi9cVDmWbStfZFa9r0e/efVcLmcZWOu7Vefabe2VCplQLhaOnsC1S3TR+IDQ+/sKlbi/hWKWDkGtshZ2zuxBCCE9PTwGIfPnyCZ1OJwBhY2Mj1Gq1KFu2rNS/ERERonDhwtI8AogSJUoIQJQsWVLkzZtXTJs2TXT9pptp3dbaC4fyLYXCzkWATNgUqmqql72bkGlsBXKFkKlNz1NnL2Bab1Ua4TN4q1A4eAhd3nLSuunacNCbd3KrkKlthEypFl81bWb1HhUqVEgkJyeLpKQkMWDAAGFraysAUa1aNfH48WMBSO+B+Tv5UHywybt48eK0atWKzZs3M2zYMIoWLcqXX36JnZ0dTZs2ZcOGDcyaNcvCr2DdunUIIayk3w/lr30XIvb8RPzVQ2hzl8auWB0wGkh6coOEJzc5cqcY4yjCN998w8qVK2nRogWDBw/mzJkzTJkyhZs3b0oRm++j1nN3d2fBggV8++23NG3alGbNmgFvU+uk3Zl4eXlx/fp1Fi9ezPXr1/n9998zNFWac0oGBwdToUIFybydtj7mgI2vv/4aV1fXDM1Dy5cvl7Ql1apVs6Ac/P777xkxYoSUmLlLly7UqFGDffv20bhxY4YOHYqrqytff/01UVFRuLu7W5g6RBrt0LBhw3B190Db9kcp+lrr48+rDd+b/N0+IseaGYkP/pD+71CyPkonT+xKNSB0ehNTxO7bigCgcPLCRadk7arl/Pjjj1y+fJkZM2bQr18/ix2UVqslISEBu1IN0GQvQNiWiW81kkD0CZO/kE3haugjQkm4+zsY9Cjs3aTo5rePNqL1K0nSo4vo8pVD5epD/PUjGOKjUTq6s/SnGRQrVkxiOFqxYgUbN25k/vz5TJ06laCgICIjIzlw4AArV67kzp07fPvtt7i4uEiJzFu3bi1xgIPJLNWwYUO2bNnCli1b6NixI/HJel6/sTjEx8fjlysX58+fJzo62uL90njlRWHrhGPFNjxfPRT0yUTsn4cxPgpD3GueL+6OIS4S57q9iD65DmP8a4yx4SCTYYwzmcxjL+zm9eElgMkkbkyI4vXhpcgUapArUNg6oXb3w6lSGzTZC/Jqgyky173JMJ4u/BpjYhxC/6aycgVyrS3GpFhJE5ny4h688Ze0KVARkRBl0efZHbXIiEcY3po41TkKoPUuTMz5naZ3zahH6+NP0tMbiDfpiJArsS1aG5lMRuy5/yDQo3BwxxAfZdJmymRgeBvJWrtObVatWiV9i507d2bXrl2Sf1d4eDgNGjTg0qVLvHz5kvv373Pnzh10Oh1fffUV165d48qVK6xatUrSUt68eVPiOu7RowdhYWGSL/Rvv/3GsWPH8PLywt3dHb1eT1JSEl5eXowaNQqNRsPvh0xaV7nWDp1fCQBc6/XGmGIZmR11fBWGmDBkb77FlLAQXgQPQ66xwaFcc6oV9OLKoS1Uq1aNY8eOWfkE9u3bF2dnZ8aOHcujR4+YM2cOffr0kTTk8HE0sOlx9epVaU4dN24cer2esWPHZsgDvWDBAooUKULjxo1RKpXs3LmTXr16YTQa6d279zufAzBx4kTUajVDhgwhOTmZggULUqlSJYKDgxk40NLMHBwcjL29veR7aUbr1q0pVKgQU6dOZffu3UyaNAkXFxcWLVpEjRo1mDZtGsHBwQwZMoQvvviCqlWr0uaLnLyKSWRYt7YkP7mBXXGT20zqq0fEnPsPqZHP8Gg+2uI5SU9ukHDnN+xK1keu1hH7x07Ctk1mysYTHxRM+sMPPyCTyRg2bBivXr1izpw51KpVi0uXLkluMps2bZI0S66urpw9e5aff/6ZJ0+eWDCeXblyhSpVqqBSqejevTt+fn7cv3+fnTt38sMPP7B79266detm4Tb13XffZVq3Fy9eYGNjY7GWXbx4kVKlSrF3714LxjWFQsHp06eloLhz584BpqwYrVu3xtHRkR9++IFGjRpRoYLJXaV79+6oVCry5MsvBfAhkyNSk1B65YE3CZ10ectauIsgk6PJnp+k0CsY4qPerFkaQGBXsj4ylYa4i3sxJsbAG79Yc3xAyrPbpEa+dYECE0FIt27dWLhwoeSOdvbsWe7fv4+/vz8PHjwgNDQUrVbL8OHDGTVqlJSn9dGjR9y/fx9nZ2eWb97FsiW/IJJiSbh1AoeyzRCGVFLCQhD6FAyxEajcc2JXtDaGpFhifttEyssHyNU6jIkx6COfYOtfnZjft6D2yotMrZMsSwn3ziJSElDnKMSdu/esxiowMBC1Wk3Hjh1Zs2YNX375JXv37iU5OVlyYUkbcJSRu0mm+GDR8w2Sk5OFl5eXaN68uXRs//79AhB79+61uLZYsWIWu0ohhIhNShV+79BMfsifWRNmX7qR1bmcw3YKv+G7xG9nzwtAfPPNNxbPHzJkiADE4cOHhRBCbNu2TQDi3LlzmbY5LCxMABlK6hnt/NatWycAcfz48QzLGzZsmABEuXLlxJ07d4QQb3fg5vqYd3WbNm2yuDethtLBwUHs3r1bgEkLCYiHDx8KIYRISUkRTk5OIiAgQMTExIiwsDBRunRpAYiLFy8KIUyaUED4+fkJX1/fDOv67NkzAYjBQ76zGjdJQ6nSfpSG0rv/OgEyoctv0mp5dZkjvPsFC+9+wULh4CEAkaP3ijeaqgICEH1nrpbq1LlzZ6m+s2fPFvnz55fKt7W1FdODlpl2pwPWC0CoPHMLmUojcvQNfqPhUghdvnLSM737BQvHyu3faLVkwmfgRql9mjdaMftSDazetWtPo6z6y9zXa9asEYC4dOmSpAm5ceOGaNGihbC3txfOzs6iT58+IjExUbo3JSVFAKJr167CwdFJlGvUUVT98bDwG75LuNYf8EbDl1fIVBqh1NmL0nVbit1Hz0htt3HxFK61ups0Vl/PN2nozNo3Jy/Tn62zyDlsh9D4+At1joLCvlQDIU+jaVS6+giXen2k3Togmsw7JmRKjbApVFUoHDwky4Hv8F1CpraRxjn7NwuE2jOvVJbc1llk6/qzqVy3nG80meUt+tDcLrM24ty5c6L4t3Pfaj7zVxTIFcK92Wjh0Wq8VC+5zsGkiXyjnfRsP/VNu+dJmkiNj79wrvG1Scv9pi+UTtnEF8NWC71eL+7duydpEczfTd68eSVtglkToVarpd19Zn/msa9UqZKws7MTMTExQgiTpgcQU6ZMkcY5ICBAui/tnFKtWjWhUCiFNkdBKwuOd79g4Tt8l3BrMly616vzbOE7fJfQ5SsvUCiFX++lkqbr2bNnwt7eXlStWlUq36yhrFWrljAajdLxgQMHCoVCIaKi3r7PGc1rPXr0EDY2NlYWnvRo0qSJ0Gq1IiTkrdbtxo0bQqFQWGkoM3pO3bp1Re7cuS2OZaahzJ07t1UZixYtEoC4efOmdCwlJUW4ublJGjUh3moou3fvLh3T6/XC29tbyGQyMXXqVOn469evhU6ns7h/9erVQiaXC59O0y3Gy6Vub9M72WG6hYYShVJk7/GL8B2+y3R9N5PV4eeff35nf5rbmiNHDum9EkKIjRs3CkDMnTv3nf05ZcoUIZPJLMajatWqwt7e3uKYEEJ6L3x9fUWZMmXE06dPM62XWUN59+5dodVqRceOHYUQb8fK1tZWdO3aVXTu3Fk4OjqKs2fPCiGEtGa1a9dOeHt7W31LnTt3FuHh4SIsLEyy7pjX6wkzfn4zT7+d25DJhTpb/nd+nzKNjXBvNso0Lh1nCIWdi7AtWkv4Dt8llK4+ArlC2BSqavHN6fJ8IRQOHiIuKVXSUH777bfSGjx37lyhVqsFINasWSP69esnaVnT/nXt2lUAomzZslLfLV6/QzrvVL2r9Exb/5pv5k4n4dlxhtDlKy9kGhurMj3bTRXZu5vec6VzdqF09X5b77zlhMLRU9gUqSGye+e0eo/Wr18vLl26JADRq1cvqT0rVqyQ5qsBAwaIzp07C2dnZ6tv9l34aNWSWq2mbNmyFjRxtWrVInv27BYZ7c07+LR8w8BH8ddmBjPnqWNl62SrMpkMAazfasqbNWiQZdTd4MEmnlRzhKeTkxNgolNLn4vrQ5A2gCIpKYnw8HCJkzYtj2paFCxo8vNav369VUSjuT7vyu9mRvPmzalduzbu7u5WDtiTJ08mKiqKkydP4uDggLu7O3/8YdIKmoMQzDsns79XRjCfK1yogFXOPKVLjoxueS/0r58BgsQ3NIcvVgyQ/MUMMaaodmN8NAq5DFtfkyZY9fSiVTmJiYl069bNIrI7Pj6e7DlNUdKKN+lVUsNC0PqVxBD9hlHEaCDx7pkM/dTUHrmlHapNwcokP7WkcTTDmBRHQpJp53b9+nWaNm2Ko6Oj1Nfm9z46Oppx48YhhKBQoUJs2rSJmJgYIiMj+fnnn6Xk6D4+PpL/57Jly4iJjuJ6yAtC0tGPOtf8hpyDt5Cj/zpel+5Cr31hOOYwOZcnRL7E1tcUMKJ290XpZIp2VTh64t1zCTK5EqVzdimnoUyuxKXOt3i2eZv3zrFcc+xL1LNo6+ga3gh9MmqX7Fb9oHIz+XCG755D0pPrKBxNKafkNk6oXHKg9siF7/BdKO1MCZZ1uUpJ9yrkMvJ7msZIp9MhhKBMmTJoHp81sSVhCuLx7rMKjXchaSeucsmOT/+1+A7djsLOFZVbTim3qKldJiuJITEWh7JN8e61HKVzNtTZC6CwcaB8LldiY2MpXry4lC9u3bp1tG7dmnv3TDv6xo0bEx0dzY8//khKSgo7duxg7dq17NixAyEECQkJFCpUCLVazeDBg5k3bx6NGjXi1KlTEs97eHi4RFmaliYOLH19zZg/fz4yGehf3kN3cQOxl/YRc3oDrzaN4+W6UaSEhxKxZy4qz7fpYOQYSXp0Ed+SARyf0EbSdGXLlo127dpx8uRJK9at7t27W2i2q1SpgsFgsJgH0s5rsbGxhIeHU6VKFRISEqyoTdPCYDCwf/9+mjRpYkHDV6hQIerWrWt1fdrnREdHEx4eTkBAAA8ePLBiB8sInTt3tgpia9WqFVqt1mI92r9/P+Hh4VbrEZgS2ZuhUCgoU6YMQgi+/vpr6biTk5PEb27Gpk2bKFyoEDtHt6KUu8KkGUuKQftmzkoOtcwvq/MrgdbV9A1VzO3KialdMqVczQidOnWySO/TokULsmXLZpF2LG1fxMfHEx4eTsWKFRFCcPGiaQ4NCwvj+PHjdO3a1Yoq0fxe/Pjjj1y7dg0fHx/Kli3LuHHjMqynXq+nZcuW6HQ6pk61JC1ITExEo9EwbNgw7OzsKFu2LPny5ZMC0tatW0erVq0kVqTmzZsjl8tZuXIlbm5uuLu7WwUGGjHVT5OjIDKtPSr3XOjyljVlcAAcKrTCo80k679mo5G/yQaR9OAPbApWIeHOaYQ+xUSYYTRIGr70eBTx1i/cHCQEppgHc2qmyZMn88svv/Dtt99SrVo1PDw8JBnDHMuQNr2WUvH2+zP7dQMYU03WHdtCAYRtnkDqq4c4VW6PTaGqpvExZ7QQRtP8mr0AhvgoaU43JMaS+OAPbItUezOW1tKWQqGQ3pl+/fq9rYcQDBgwADBlJNm9ezfDhg2zYq16Fz4pKCc956ZcLqd9+/Zs376dhAST03xwcDBarZaWLVta3Jui//NO02bOU4Uuc/7NJ49DkcvlFpFLAF5eXjg5OUmTZ0BAAM2bN2f8+PG4ubnx1VdfsXz58g+OaoqMjKR///54enqi0+lwd3eX0r58yISYHub6mKnfpk2blml9cuXKhUqlYtKkSYSGmlTzK1asoHfv3owfPx6lUomfnx87d+7k4MGDtGhhSi0yatQoFi9ezLp164C3LBnvQ/UCHhY0blbIhBnDiuruzSShzVUaMDHlmD98lbsfKg8/lM7ZqJjblaDvugAwe/Zs2rZty7x587hx4wYRERF4e3tbpVDy9/enT6cWRJ1aR/Tvb5PQOlVpLz3X1r8WMqUauc4B26K1sC1eF7mtM8iVOFXvKt3jUK4Zak+TsJYUcoXYi3uIObOV8F2zeTK/C8kJsURFRREQEMDly5eZMGGC1NfmaPn3BQn07duXH374gVatWtF/8nxytJuEV9tJJgfsDO6VKd8KIma3kSSZ6ZjO1o4p37zlyjan6jEH3HwqcjibBGx5BuOrzmbaECU9vMDrQ7+gjzRRbMoz+TbTHlfKZbQo5W11jTbhlWSefv5LTwvBX6QkYkgXnKJwcLcqA3hresfEu6xyzo4AviqRDRsbG3r16iVN8pMmTeL27dvMnz/fYj44evQo5cuXZ/ny5bRr146+ffsCbyNf27dvz8qVKxk8eDDPnj2jZMmSjBkzRtpYmM2u6ROKp03XY0bhwoUpVaoUrq6uRFw8QOyvi9BfP4BOrcSxXDPCtk5GYeeKfXGTwJ/NUUuzgg6I1GQ6fVnRijauUKFCEi91WnwI3/L7NkmZISwsjMTExAxT/2TEnX3q1Clq1aqFra0tTk5OuLu7M3LkyPc+x4yMUmw5OTnRqFEjKQ8smNajHDlyZJhHMTN+8/QsM46OjlZc09evX6dEfl82D6zHk5/aEzKnHc8Wm6gKDW+S9kv1cs9Gx3K+HBpYldVfl8PHxcZqLX0X0vepTCYjb968FgF8oaGhdOnSBRcXF+zs7HB3d5eEIHN/mgXDzLjmwSSUP3jwgJ9//pns2bMzffp0ihQpYhXkcezYMW7cuMHmzZsl4gZzsKlOpyM5OVliXFu/fj2VK1eWAgxz5crFzJkzpdRTW7ZsQQhBQEAABw4c4ODBg5I7yd27d3kcmcCiNaY53b5Ca0RKApocBfBoPlqaA2QqnURWkfZP61sMTc6i2BSoSPSpdcRd3o9ITiDy1yUmFyuFCl3uUmSEtDJL+lRB5mCdGzduMHz4cMaOHUtcXByRkZE0bmyiqDVTHKddw70c0myC0gjNZuFSGPUYE2NwbTAQhy++kjJayNK5l9n510CkJCAMpowhCbdOglGP3RvhWCnPWMQLCQlBLpeTJ49lpLv5G42MjGTmzJkMGzZMUoB9CD45bVD6nUOnTp2YPn0627dvp23btqxdu5aGDRtKHW7Gx/KUfirMi9/7eJ7N2e9///13du7cyf79++natSszZ87k999/l3wZM0NaTtoSJUpgZ2eH0Wi0SLT7MTDXJygoiN69exMZGWlRn7Qw70a7d+/OyZMnWb16NVOmTCFnzpwIIfD398fR0ZGGDU1CxoMHD9i8eTP379+nX79+knbG3d3dSoNihlnYvHv3Ll0btGTFb4+kc/pISyYGc8Ll9PR2+mjLss1Jqc2+jVrvwlLEarK9I042Kg4Nr0deD3tJ89qtWzdOnTrFtm3bpHdv6NCh5M+fn8jISKnsgIAASpUpS49BI9DHhAFgWzgAtUcuaYJX2Dvj1WE6r4+tNGm7hRF1tgI4B3REk6PQ2/aotHi2n8rjWS3Rx0UQeWgxcrUNKpccOFVuh79fNo4e2k9ERARbt26latWq0r0PHz7MsD/TY/PmzXTu3JlcDXsy48AdlDlzotCnfFyCZJkclVtOPL4JIjJRz5A6+U1lvUlv5NbIpJVXOrqT+uoRQhgtKBDN6YDcW4zBJm9Z6XiN6tXZs/IqBoMBnU5HAZt4nqVLqmt4E8nv3ceUxy8p5Aov143EqUp7bAtWlq5T2DkjU2mxLVRFOjahcRFaf/ElV87/ZqFh16nkaO2dcWo4mIxcrRU6SxaT9JOshHT3ymQyHLRKfF3tUKvV/Pjjj3h7e9O/f3+uX78ufQ+9evWymA/++OMPihQpwuPHjy3mAw8PDylJfVRUFHnz5kWv12dInZo+FY9ZI5seOp2OggULWlkcGjdpyuGUaFb95yAFChbEz3UutholL168wJrC4N14Hz2reZPk4ODwQTSwn4r79+9Ts2ZNChYsyKxZs/Dx8UGtVrNnzx5mz579Qc/JjDO8U6dObNq0idOnT1O0aFF27NhBr169rKLy4dP5zY1GI0WLFpUybqRFUooB7FzJ4ZcHtVKO/1RoVjon4xoXeWeZfwYGg4HatWsTGRkpCQK2trY8ffqULl26fPS4ZcuWjV69etGrVy9evXpFqVKl+OGHH/jyyy8Bk+Y6MjKStWvXWgjqISEh5M6dm2zZsvH8+XPAkvKxfPny9OzZkwcPHpCUlCTlDS1YsCC3bt3Cz8+P2rVrW0TtT509jxmPsvHylsnKlvzgPBgN6HKbhFGtXwnirxwg/tqvOJZrasV8ZkiIRmHjiHvTkSQ/vUXCvbPEnttO3EWTpk6m0lqRacjUWkRy/AfLLEIIJk+ezPnz57G1taVixYocPHiQpk2bWqxbADr1e7jM0zBjpYUxXY5fm0JViTywUFpz468fQe2VD5WrN3YaZWY6ng9uz8fis+Wh9Pf3p2TJkgQHB+Pt7U1oaGiG4eZp+VA/FWbOU0NibIZaShlQJH8eNhmN3L17V0rlASZmlaioKCutXPny5Slfvjw//PADa9eupX379qxfv55vvvkmU6H09evXFpy0Zty9+24ayC5dulhxgKZfQMwfMmBVn4cPH1rtzGvUqMHq1au5ffs2V69epXHjxsyZM0fanaakpLBgwQLAZGqvVq0aRqORvHnz8urVKy5dumRRnhACmUxGtmzZKFGiBCtXrmT48OFSDra4+xdIDQ81MaC8SeWidPAAmZykx9dwqdlNyrEWd9Gk+netPwC7YrVMD1CoSHp4gRx9VqG2d6G4txNrvi6H7ZQGb9h6LMe1bdu2kqmkS5cuEjUhIAmU06dPl/K3rQzzISQygZCpDVE6moRVha0TmpxFibu4D/vSjVDYOiPX2kvMAxbO3G8gV+us8soB+Lra4GSnkxaetB9fSkoKQUFBVvdkBIVCwYOwOA6nYYyK+WMnpNfqfiBmHLjDtGZFmdqsKD32yCwmFF3uMiQ9vEjCzRMSY5AwGoj9YxcytQ6tjz8KuUxKibJ31c9sblSVFi1aULduXfbt28eIwEEsu2wSdlPDH5P4IGO3jvdhaJ0CmQYi5MmTh0OHDmGXswipMks2iidBXVG7++LRcuxHPU/p6IH+9TN8vCzfq8wSEL9rPsgIR48e/VMbi3dh6tSp7NrxH7Zu3UqTGpYBNu/ipb5161amvNTvwp9pi7u7OzqdLsM5MH0dd+7cSXJyMjt27LDQEqYNLvxU1KtXD3d3d4KDgylXrhwJCQl07NjxT5ebFnny5OHy5cvUrFnzvYqLz4H0fSqE4N69e1KA6NWrV7lz5w4rV66kU6e3rF8HD1qSFZjNtNeuWabUMsNgMBAXF2ehDPLw8CB79uySlm3o0KFERkZib29vQYNpTnieO3duSpQowYkTJyzY1wD++OMPk2uaEAwaNEhKBXT//n2LnI1m1xGAJxGxyFePwPgmCC/2wi403oXRvclfbN5U6iOf8HxFf2wLVUVu44g+JozEe+fQehfCpc63gMlcrslREIXWjtdHTHO/SIol4fZpbAq8TSCv9spLws0TLJw21srCkB4FChTgxx9/xM7ODgcHB1JTUyUlTUZuBcWLF8+wHJlKK10j19oRvms2DmUaZep6pdDZI9fZY0xOQB/9iuQnN3Gu1Q2FXIaXo5ao8Izr6+vri9Fo5P79+xbuN+Zv1NnZmSFDhvD06dO3QVAfgM+qLuzYsSMHDhxgzpw5uLq6SjuZtLDgQ/1EmDlPo0+utTonhCCnqw1NGpu0cmYuTjPMu0lzNNPr16+tJHEzd7L548mMkzYjYSKjZ34MPqQ+70PFihVxdnaWWHdmz55N+fLlrcqVy+UsWLCAZ8+eUaJECcaPH8/ixYsZNGgQ9eq99aObMmUKL1++pHLlyuR+cZSo46sJ2z4VlZvlhyLX2mJTsDKxf+wi8tclxF7YzcuNY600lIC0EXi+tA9Rx1ZSPuUSs6dPpUGDBtSqVeuD2vkuZGaeN00qgudL+5iSd6ckEnVqveSn9iFQyGXkTg2lcePGUqRijRo1KFiwIP369cuwr0+fPk3lypWxsbHBy8uLfv36ERcXR/Xa9Ti2ewuRhxbz+kQwT4K6SnnG4m8e58WaYSTcPWNVh9hL+3gRPJzHP3Ug+fF1UiOfEr57Dvqol4zZcZ1KedyoU9gTzZvdtUIuMyVwd/UhfPdsXh9eSswfO3m5bhTJT27gUrUjco0NFXO7cmhggNXzzIn9lw7rRMXYk8T9vpGX60ZYvQPvg0YpZ1qzovSunjfTa1q1aoXBYKDIy0zYk4wZJ4Q3I+XlA5DJMcS8InR2a0Jnt0Yf/ZKkp7e4cumtABwWFmbhZwef/v392Y1FZjh06BCjR49m1KhRNGnSJMPnZsRL/fLlS9auXZspL/W78GfaolAoqFu3Ltu3b5fccMAUAZ/W1zmz50RHR7N8+fKPqm9GUCqVtG3blo0bN7JixQqKFi1qkf/zc6BVq1Y8ffqUX375xepcYmIi8fHxGdz16Vi1apUF//zmzZt5/vy5tM5m1J9CCIn0wQx3d3eqVq3KsmXLLMbIfH1sbCzu7u7IZDImTpzIL7/8QuvWrTl37hxt27Zl+vTpzJgxgzZt2hAbG0u9evVYuHAhQ4cOpVu3bpIZtUWLFrx8+ZJy5cpJjGtz5sxh1apVyGQyfHx82LRpEzNnzkSpVJKamkpycjJ37twhMDCQn376SaqXS+2eJn/tN03T5CyGe/PvTYKp0UDSY1MScqdqXVHYuRJ9ZiuvDy0m4cZx1J65sS1WG0NSnEXfmHwmTWuE3NaZsO1Tidj7M5G/LiFkakNiL+7FuWBZ1qxa+V73ix49elC3bl0iIiKIjY1FJpNJ7gFpNwJmFxsXF5cMy5GrNICMhFsncW38HQo7Z6KOr3lDTvHWCmhxj40TGFJNwrFcjm2hqhiMgtzumTOImd+ZtH0Mb2WXtm3bUqJECaZMmfJRDIGflSmnXbt2fPfdd2zbto1vv/02U65LMx/qp6YO0voWw7ZIdWL/2Enq62focpcGIUh+fB2dXzGq9+5D8eJF6Ny5M4sXL5ZMOGfPnmXlypU0adJE4q5euXIlQUFBNG3alDx58hAbG8svv/yCg4ODlNg4PSeti4sL/v7++Pv7W3HSHjhwINOdvEwmIyAg4J0D9CH1eR9cXV3ZtWsXgwcPZvTo0Tg7O9OhQwdq1qxp5Rhft25djhw5wvjx45k5cyZGo5E8efLQrVs36Zp69eqxadMmRo8ezbSJY3HLnhNF/f4k3D2DITkRn35vqbtcavcAo564S3uRKVTYFKyMffWuPF+aLgWIXInGuwhKBzfE7aN8/912PDw8JB+0P4v25XJamOfNULvlxKvLHKJPriXh1kmEPoW4S3tRe+TG8Q3Tz/tgMAryaWJ5LZdLfnhr167lzp073L59mxYtWtCtWzepry9dukTNmjUpVKgQs2bN4smTJ8yYMYO7d+/iUH8wdjfDiL9+FGNqEnKVFvuS9Ym7cQzVG9eAsC0TsfW3ZERJefkApaMnNnnLEntpP8akWBIfnCfx3lm8v5nHyG1XsdUocbPTcHBAVYLPhHLkzitoN4XIoyuIu/orxpQEVC7e5G/1HW3bd6JD+ZwSs0p6FCtWjP379zNo0CC2/DILr+w5yNOsB7cfhBIdZt3PaWEW7BVyGYcGBlj5+qVHQEAAPXr0YNGi+RQue5Xn9gWQyRWkvn6GITY8U/9MALW7H77DdkhUrWbTfvfSzszq2Rij0UhwcDC2trYsXrwYX19fiSITPv37S7uJ69evHzKZjNWrV/9pc2bbtm1xd3cnX758VhR55kTT6XmplUolixYtIjk5+Z281H9VW8aPH8++ffuoUqUKvXr1Qq/X8/PPP1OkSBGLvq5Tpw5qtZpGjRpJtIC//PILHh4ekqn0z6BTp0789NNPHDlyxIIB7HOhY8eObNy4kZ49e3LkyBEqVaqEwWDg1q1bbNy4kf3797+XmvJj4OLiQuXKlQkMDOTly5fMmTOHvHnzSnN1wYIFyZMnj6RZcnBwYMuWLRn6aP70009UrlyZUqVK0b17d3LlysWjR4/YvXs3Z8+e5YsvvuD06dNSv+XNm5egoCC8vLxo1qwZ+fLlo0GDBsjlcvbu3cuJEyfIlSsXK1eulCgwW7RoQfny5bl48SJGo5Fjx45JMRZdu3Zl1qxZ0mZn/fr1tG3bluTkZC5cuMDTp0+Jj49HptJiU6AS2pz+aHP6g4C4y/vQRz4l7vJ+ZEoNCTePSe5Xmmx5cSzfLMP+izn3H2Iv7MYmfwWUztkwxEUCAhQqPFqOI/7KQRLu/oYh3tRfKgc3vhk1ix87VMLLy4uXL03J0f38/KRvYeHChYBJo7d161bGjh3LhAkTkMlk7Nq1i759+7J69WqpDsePH0cmk9GhQwdJE2+l3VYoMcRHEXVkKXZFa2P0K0H0GVPaQJlSbWUxy951Lk/mdSbh1km0uUuj1Oqwv76NfoO6UW392w1ztWrVLL7htm3bEhQURHR0NPPnz2fnzp1SUKK7uzvz588H+ChO788qUHp6elKnTh327NnzTvNCZov9x8C1wQBUHrmIu3KA10eWIdfYovbKiyp7QYm/dsmSJeTOnZsVK1awbds2vLy8GDFiBGPHvjWXmQXN9evX8/LlSxwdHSlbtizBwcEWZuUlS5bQt29fBg4cSEpKCmPHjsXf35+1a9fSt29f5s+fjxCCOnXqsHfvXslB2QzzzuR9PLMfWp/0SM+6U7FixQwjxTNaFCpVqsSBAwfeWa9mzZpJOTgBZu65zNhhZ5DJZMiUbxkszH4q6ZGR2Viu0jDtp0Xv1Fal/wgACyo0sPzAzcjnaU9FX3vkI3ZiFJYfrMrJC7eGgwhHRlLoVcnk/SEwU6SN/LoBDOojHZ8yZQoJCQnkzp2b2NhY6tSpI9Wpfv36ODs7c/ToUWkC9fPzo1u3bng4VsS1fn/Sk3O51DFpPoXRwPMVA0h+dtuiD13r9pL+71DONC7JL+7xYsUAYq78yglbFw79+DMrzNR7jYswjiLEJ+t5FNGQFL0RtVKOn6stthrraeDIkSPSpsuMqlWrSjR6Ztx9GUvwmVEcufOK0IgEi3MyIKerDdXze3DlvicHHsqthMnMtDgLFy6kdOnSLFq0iPiTq9ELGUpHT2QqbYa79Iwgk8nQKOVvfDVz0qjAEfr27cvUqVNxdXWlZ8+eZM+e3SKa91O/v4/ZxH0MzHlmO3fubHXuyJEjeHp6SrzUI0aMYMqUKRiNRsqVK8eaNWveyUv9V7Ul7eZjzJgxeHt7M378eJ4/f24hUBYoUIDNmzczevRohgwZgpeXF99++y3u7u507dr1HU/4MJQuXZoiRYpw8+ZNq1zInwNyuZzt27cze/ZsVq1axbZt27CxsSF37tz079+f/Pnzf9bnjRw5kitXrjBlyhRiY2OpWbMmQUFBkgVNpVKxc+dO+vXrx5QpU9BqtTRt2pQ+ffpYmViLFy/O77//zvfff8+CBQtISkrC19eXVq1aoVarqV27NqdPn+bRo0cWwUlm4eLu3btWa/zdu3dRq9UWCpM9e/YwdOhQtm/fjhCCqlWrMmPGDCtBu02bNmi1WsaPH8/NmzcxGo0Urt+Z+CJNMMre+hu6ftkHmwIViP5tEzFntkqbYpe6vbEvaW0RTQutjz/Jz+8Qf/O4KTL6jc+ke5PhaLzyoPHKg0udnpIfuF2phnSvY9Jqa7VaGjRoIAW2SmVqtQQEBEgubCNHjiQ+Pp61a9fSv39/KQ/n8OGmDe6RI0do06aN5HawYPkaZt93IflN4I9bw4G4NRxIwu3TRB1fzetjK1E5Z8O98VAS7p4hKQ1lsRkyhQqbQlWIu7AbO/8aKAwpXN25lKOlvN9JFb1s2TLJLWT79u3UqFEjQw74j4FMfC6P4Ddo2rQpV69elSTdzNBx6RlOP4j4rPSL5sX+c3N5fw7s2bOHhg0bcvnyZYoW/fwUW5MmTWLMmDHExcVZJJf9HDBz8F6/fp1Jkyaxd+9e/Pz8cMiRlxOH9iCSE6wExrhrR4j9YwepYaHIFEpU7n44VmqNLlcpFHIZofMDKervz09TxzNo0CCuXLlC9uzZGTdunIX/T2RkJJMnT2b//v08fPgQuVxOpUqVmDp1qsUkaeYpXbduHdeuXWP58uU8f/6c3IM3oFfakHDnN6KOryb19XNUztlwqtJB+kA/RqDUKOXv1LIVLVoUW1tbKYAqJiYGV1dXBg4caKEtSklJwd7RGU2Byrh82S/Dssx4tWk8yS/u4tN3zTuvMyTG8GRuOxzKt8CtRiAdy/lmGAQAJr+q8ePHc+3aNfR6PTly5KB58+aSduFjeF/BlEJl8hvSAJ3OhkrVazF7+o/ky/3WV7lLly5s3ryZy5cv07dvX06cOEHNmjXZvn07RqORn376iV9++YX79+/j6OhIkyZNmDp1Ks7OzjyOTGDktqusG9QYjYcv9uVa8PrwElJePUJp54Jj5XYSr7VCLiMlPgb7mzsxPr7Ek9CQ9743GzZs4ObNmyxevJiYmBjq1q3L0qVL0Wq1DBs2jLVr15KQkEDLli1ZuHBhhml/svDPQ8mSJXFxceHXX3/9u6vyyTC/o5s2bbISaP4qmOf8sLAwq2j3zwUhBElJSRkGVt19GUvtOcf/kucmPrpMakQo0cfXoPEthkczS1cns0BZpedkji8YkUkpnw/rz4UyfKu1oPgxiDz0C7GX9+PdaxljGhSie52SjB079qO0i58Dn9WH8vnz5+zevfuDnJ//P/ChpoV5Z/K5hcmXL18yf/58Fi5caMW687nRsmVLEhISmDx5Mt26dSOXmy12abRbZtNm1Mm1ROyaiUyuxLFKexyrtEfh4CblZauY2xUvBy0J4U9p0aIFtWvXZubMmTg7O9OlSxeuX78ulfngwQO2b99Ow4YNmTVrFkOHDuXq1asEBATw7NkzqzpOnDiR3bt3M2TIECZPnsz3jYuR+PACYdumgEyGc0BndPkrEL5nLikv3h08lREmNC5iIUzGxMQQHh7OrVu3GDlyJNeuXaNmzbfm6atXr6LX66125Gq1Gq1XHpJf3Ld6hjElCUNCNKmvnxNzdjuJD/5A65uxE7chMQZDfBTJz+8SsXsOAFrf4hiMwmTizgDXr1+nYcOGJCcnM2HCBGbOnEnjxo05deqU1bUfwvu6YsUKWrVqhUqpZOqUKfTs0Z3De3dSp2Y1K79jvV5P3bp18fDwYMaMGZJDf48ePRg6dCiVKlVi7ty5BAYGEhwcTN26dUlNTcXHxYbVX5fDy0GLLjGcyP9MRedXEpcaXyPX2hGxew6pYSH4utrQsZwvP9XPRsr9MzT9qvEHvTdTpkxh//79DB8+nK5du7J161Z69uxJ165duXPnDuPGjaNZs2asWLHiLzGfZuHz4/z581y6dMlig/q/iBcvTJkUWrZsabIIpfsz48SJE7Rs2ZKcOXOi0Wjw8fFh4MCBJCYmWpV569YtWrVqJQVRFShQgFGjrH3Io6Ki6NKlC05OTjg6OhIYGCiZrc1Yvnw5NWrUwMPDA41GQ+HChaUA0LTw8/OjYcOGkiuATqdj0aJFBAQEWGlQg8+EopDLeLq4By83fP/RfZby6iHhu2bzdMHXhExvyuOfOxC+ew6GxBiiT63j9a9LUXnmNrloZYLWZXIwcuRIvLy8sLW1pXHjxlYpuMC0mS5dujQ6nQ43Nzc6dOjA06dPM7yucOHCaLVa/P392bZtG126dGF4y6oMqfNWmx19ZisvVg/h8Zy2hM5oxvPl/Ym/ddKqvJCpDYk8sIC4KweJ/WMnpCZTLvUa3euUBEyuJ+Z35L8lWH4Wk/fDhw85deoUS5YsQaVS0aNH5oNkho+LDeMbF/nTknlapF/s/0l4H13Zp+LmzZsMHTqUsmXLZugc/jlRvHhxi9xuZ8+eldIzmf309py+SMip9ejyV8C96QhkMrlk+qyWz52OFXzJ62GP30QZt2/f5vjx41SpYkol06pVK3x8fFi+fDkzZswATBq/O3fuWKT76NixIwULFmTp0qV8/73lZJOUlMT58+ctdr2ju65DYeuEV3tr6kiFg8cHtz+jyORWrVpJwQZqtZoePXpY1MnsC5be1SEuWY9e64gh7InVc14fXkLcpX2mHzI5NvkrSBGK6fFkXmcpZ6Nc54BzrR7ocpkmlNCIBOKT9VYm7YMHD5KSksLevXvfq31ISkri0qVLqNUmtwZnZ2f69+/PtWvX8Pf3JzU1lWHDhuHv78/x48fRak1RipUrV6Zhw4bMnj1bCugBU2BLy5YtmTJlinTs5MmTLFmyhODgYNq1e0tWUL16dcl/13xcqZAREfKQ48ePU6psBR5FxPPy5SC+rFCUFvb3mDukl/Scrz7ivdHr9Rw7dkzy+w4LC2P9+vXUq1dPSgLcq1cv7t27x7Jlyz6Ln28W/hpcu3aNP/74g5kzZ5ItW7aPSsz8T4Q52rpv376ULWtK65WamsrAgQOl7xI+H+1iWrRq1YpcuXIxZcoULly4wJIlS/Dw8LDYVH0Mfebt27dp27YtPXr0oFu3bhQoUAA7Ozu6desmzSlgomdOeHobfeRTHCt+/PglPbyIPuoFtsVqobB1JjU8lLhL+0kND8Wr08wPispfNHfGe6kuV6xYQWBgIF988YUUvDp37lxOnTrFxYsXJaKS3bt307p1a4oWLcqUKVN4/fo1X3/9tZSPtk/1fLjZaRi74zqx53egy1cO28LVEAY98TePE759KrIWY7HJ+4VFHRPu/Ebs5f0gjHzVuRcD29WnVlGfTKmi/2p8FoHy2LFjBAYGkjNnTlauXImXl9cH3dfmi5yExyUzI03KlE/Fu9KQ/JtRrVo1qx3jXwVzRLMZK1askEwj+TztGde4CHZ39nJOGFn98zRyF/R/p59e4cKFJWESTI7AZjYKk69fvIWvn1YpIyoqCjs7OwoUKJAhE1F65oznz5/z5N5NGnfuxS07e/RGgcEo0OUqicotpxVPcnqY0+iY/fDSY+rUqQwePJjHjx+zcuVKUlJS0OvfRiGbtQPpTaQhEfHIFCqMemueVIcvvsKmYGUMsRGmwCFhtOChTgvPVuMR+hRSIx4Tf/2oBeuCwMTyUCS7ZS5Y8yT3n//8h8DAwAxz85lh5n01wzxeDx48wN/fn/Pnz/Pq1SvGjRsnCZNgyqJQsGBBdu/ebSFQAnz7raVwvGnTJhwdHaldu7bkMwgmHzg7OzuOHDliIWimfW+KZHekSHZHChYowOOQR9I1afvbYDC8973p1KmTRRBhuXLlWLdunZUvX7ly5fjpp5/Q6/WSv3IW/lnYvHkzEyZMoECBAqxbt87ivfxfhHk+q1q1qmTy7t27N3FxcRYpgaZNm2Yx93Xv3p28efMycuRIQkNDpfQ1ffv2RQjBhQsXLFLapGe6AZPLwNKlS6XfERERLF261EKgPHbsmMVz+/TpQ7169Zg1a5aVQHnv3j327dtn4YtbsmRJ+vbty5o1a5g6dSpxyXpCIxOIv3bEFJSTvyIfC7tSDSTfcjM02QsQvmM6yU+uWzBrpUfrL3Ly0zqTu9XNmzcldqJSpUrRqlUrfvnlF/r16/dRm+kRI0aQI0cOTp06JeWyrVmzJtWqVZNSGLb5IieV8rjxXfbN/BYah0Iuw2AU2JduyPMV/Yk9t81KoDTERaK2cWD0mLF8P8zECligQAG+/fZbihUrliEz1F+Jz2Ly7tKlC0IIQkJCPtrHo0/1fExtVhSNUv5uFpYMoJDLPigNSRY+D94VlGDG/fv3kcvlNKpWjpI5nSmS3TFDYRKs83PdfRlLtFHN4csP8R+3nwY/n6RJ0EmqdByCU7acKNVqiZLrypUrGaZySF9HMyPSV1VLc2hgABVzm8JfFHLZO6kjze+iOY1OZpuVEiVKULt2bbp27crBgwc5e/asRY5R80SbPuVMit6IMKQiTxPQZIbK1QedXwnsitbEo+VYREoSrzZPyDCgSutbDF2eMjiUbYpbk+FEn1pnymOZ5jnp0bp1aypVqsQ333yDp6cnbdq0YePGjRkmPn4fq4q5fzNiQSlYsKAVradSqcTb25Id5+7du0RHR+Ph4YG7u7vFX1xcnFXS/fR1MtcrbTSr0Whk9uzZ5MuXD41G8973JiO2FMDKQd3R0RGj0fhJLFhZ+O9g3LhxGI1Gbt68aUGV978Kc2CieW1dtWoVQUFB/PjjjxaBc5+LdjEt0isRqlSpQkREhAWd58fQZ+bKlcsqsMvR0ZGvvvqKdevWmeSIiHiMRgPxt05gk788cvXHbwhM6XdMEPoUDAnRaLKbGF9SMnAzSitLNC1pWhfeR3Vp3kz36tUr0800wLNnz7h69SqdOnWyIEYICAiwcoHzcbFh3bcBHBxQlY7lfMmuMyCS49F4F5HqLcOUBxmgfKWqJMdHS8Lk341/xBbbLJmP3HaVE/fCJck8M5jPV8ztyuSmRf+xZu5/GzJjpfhUmPOmmQMuTtwL52VMMkIIKfF99OmNRJ9Yg22x2jhV6YDSxgEjMpKPLyMxxTof4bvqaPbDM0UmhzJvh4L0+sG0kcnvSqOTEdRqNY0bN2bq1KkkJiai0+kkU3f6NChqpRxDXCQKu4zzkaWFTcFKRO6bhz7yKSpXa6pCM1TO2VB75ib++lEcSjeSnpMeOp2O48ePc+TIEXbv3s2+ffvYsGEDNWrU4MCBAxYsIR/CGPIx0Gg0VhpRo9GIh4eHVU5IM9ImRf7QOk2ePJnvv/+erl27MnHiRFxcXJDL5QwYMCBDwTmzMj93+7OQhT+DS5cu0bNnT9q2bcugQZZCRGhoKGPGjGHHjh1WqYI+hnYxLd61oTRnrDh16hRjx47lt99+s7KWRUdHWyRIz0wp0alTJzZs2MCJEyew9ytK0qNLGOOjMuXXfh8MibFEn1xL/M0TGBOiLM4Zk9/WMSNZ4uhRUx+9j+ryfZvpkydPWlyXPpDRfCy9xWTXrl1MmjSJS5cuWSgiZDIZu/tWlix+sqFQuMA/S5H2jxAowXqxN6chSTtt/5nFPgv/HeTJkwej0ciNGzekhNDvwvpzoYzdcR39mw1E+oU64fYpNDmL4Va/v8XxiN3RXH5sy/pzobR5h6tDWupIM8zm+U0jIrF10rG7b+X3ptH5UCQmJkrJgXU6Hf7+/iiVSs6fP29Bv5fdXkXKq4fYpKEnzAwi1TSppKe0zAjG1BTJPC7DxEyVEeRyOTVr1qRmzZrMmjWLyZMnM2rUKI4cOfJRieXN/Xv79m0rnuTbt29/EE+8mRmnUqVKn23TsnnzZqpXr25hrgNTkMFfFbWahSz8lXj9+jXNmzcnf/78LFmyxOLc56ZdNON9G6qPpc/M7PuuW7cunp6erFmzhv7jphN//SgKW2e0fiU+qd7h26eS/PQWDuWaofbIhUytA2Hk1caxEgtZNkctdQt7/aNkiRMnTtC4cWOqVq1KUFAQ2bJlQ6VSsXz5ctauXWvlvvS5lTx/Fv8YgdIM82L/Nmde/Gdb7LPw16NJkyYMGzaMCRMmsHnzZgttlJnO0YxHEfHvDcoyUWpZCpnxt05iiI3A6JSN4VuvEh6XjH8m3hLpqSPNu+WDBw9y48YNfH19rT7SD8GrV68kyjAzoqKi2LJlCz4+PtI5R0dHatWqxZo1a/j+++8lE8rWjesQKYkWfNeG+CgUtk4WZQqDnvhrh5EpNRIrjTAaMKYkokiXjzH52W1Swx5JtIo5XW0y/F4iIyOtmBo+lo3JjDJlyuDh4cHChQvp2rWr5Lu4d+9ebt68+UHBK61atSIoKIiJEydKaYvM0Ov1xMXFSX6fHwqFQmG1Odm0aRNPnz7NUFOQhSz8k2E0Gmnfvj1RUVEcOnTIKpvH56Jd/Fh8LvpMhUJBu3btWLFiBWMm/EDC3d+xK17Hil/7Q2BIiiMp5DKOldvjVPktWUVq5NvIaxlwaGDAO+WJ91Fdfuhm2vxvRqkU0x/bsmULWq2W/fv3W/iBfwx71H+DBjQz/KOlM1uN8pMW+yz8fcibNy+jRo1i4sSJVKlShWbNmqHRaDh37hzZs2eXonvjUwy8CovnfTHWurxliT61jvDdc9DkKEhqWAjx14+idHob+DXjwB06+cZlWsaUKVNo0KABlStXpmvXrkRGRkrMHeaE8x+LL7/8Em9vb8qVK4eHhwehoaEsX76cZ8+esWHDBotrf/jhBypWrEhAQADdu3fnyZMnzJw5kzwlKiLylpHcOyL2zUOkJKDx8Udh74oh7jXxN46ij3iCc42vkatNu1GRksjT+V2wKVQFtVtOZCotqWGPiLt6CLnGFsdKbVDIZVTPn3HvTpgwgePHj9OgQQN8fX159eoVQUFBeHt7U7ny+zWmaaFSqZg2bRqBgYEEBATQtm1bKdLRz8+PgQMHvrcMMzPOlClTuHTpEnXq1EGlUnH37l02bdrE3LlzP9o3u2HDhkyYMIHAwEAqVqzI1atXCQ4OlhbULGThfwnjx49n//797N27N0Oz8afQLg4aNMhCCEy/4f8QfE76zI4dOzJ79mwG9ett2mx/ornbzOudXhERc36H9P/MNttpsWrVKkaMGCEpAcxUl8OGDQM+fDOdPXt2/P39pfLMfpTHjh3j6tWrFlYchUKBTCaTiEoAHj16xPbt2z+4/ZlRRf838I8WKLPw8TAnwc0Iv/32G+XLl7c4dvr0ab777jsuXLiAg4MDrVq1YvLkyRbOw2YYjUbc3d0ZOnQo3333HV26dGHlShPvdNqJqECBAixbtoyff/6ZUaNGYWNjQ7FixVCr1eTKlYvnz5+TnKpH5W4dkJIejhVaIVKTiL9xjISbJ1B75cGj5VgiD/1C8uNrhEw1cbZPfHN9y5YtWbduHW3atJHKqFevHrNnz2bkyJEMGjQIuVxO5cqVyZYtm5SAPD1Kly5NuXLlCAoKkiLZ0+PixYucPn2aqKgonJ2dKV++vETBWKhQIR4+fIiPjw/9+vXj0KFDDBs2jIEDB2Jvb8/XX3/N1wNH0nTJRak820JVTDnFLu7BmBiLXK1D7ZUX52qB2OR7m6xfptJgV7wOSSFXSLh9CpGagsLOBdtCAThWbI3SyRODUUiMUenRuHFjHj16xLJlywgPD8fNzY2AgADGjx9v4e/0oejSpQs2NjZMnTqVYcOGYWtrS9OmTZk2bdoHaxbTMuOMHDkSpVKJn58fHTp0oFKlSh9dp7SMFRs2bKBUqVLs3r1bYqzIQhb+V3D16lUmTpxI1apVefXqlRUFZ4cOHT4b7eKlS5c+qm6fkz6zZMmS+Pv7s2nTJty8c2OTPd8nEZ/INTZofPyJObMFYTSgtHMl8eEF9NEm6kSZLPPNdlq8j+ryYzbTkydP5quvvqJSpUoEBgby+vVr5s2bh7+/v4VSo0GDBsyaNYt69erRrl07Xr16xfz588mbN68Fy9S78C6q6L8an50pJwt/L8wCZb9+/fjiC8sUA/Xq1bPwH7t06RIVKlSgUKFCkuZsxowZVK9eXSK2T4vff/+dChUqcO3aNYoUKUKXLl1Yv369lT+Po6MjjRo1sjg2YsQIpk6dSrdu3biS7MrV07+ScO8cbo2HSibaj4E+6iVPF36NTeEAdLnLIJdDPnc7vq2WlypVqljs+p48eULJkiVxdHSkX79+xMXFMWPGDHLmzMnZs2ct0uKAKYAmR44c7Ny5kwYNGkgC5YIFCywEbYVCQdu2lvzfixYtomfPnjRv3py6dety4sQJVq9eLQlb6fH/jTEqC1nIwsfhXUoCeKsdvHnzJv369eP333+3ol1cvny5RfaJ69ev8/3333PkyBEL2sUJEyYAmTPlmPMuPnz4ED8/P8Bk9h49ejR37tyxos9Me52fnx/+/v7s2mVNw2vG9OnT+e677xg0cixbjF9ket37oI8NJ/LgIpJDriAAXa6SONfqztN5nXCs1JbzWxdl6jeZlnXtypUrLF26lNjYWGrUqEFQUJBVoNLGjRuZOnUqN27cwNbWli+//JJp06ZJOSbN2LBhA+PGjePhw4fky5ePyZMns3LlSq5fv87Nmzel65YtW8bUqVMJDQ0lV65cDBs2jEePHjF+/HgLTbBMJqN3797MmzfPqg2//fYbffv25erVqxJV9H8juXmWQPkvw8fQdNWvX59Lly5x69YtKWJvyZIldOvWjf3791OnTh2L68eMGcOqVaukKDczld77zMZPnz4lV65cdO/enf7fT6H2nOMIIXgZPBx99EtyfLv0o31lzAKlU/WuOKbJN3ZoYFWriaJXr16sWLGCW7duSZPBoUOHqF27NosWLaJ79+4W1y9btow+ffoQERGBTqf7YBqyxMREfHx8KF++vMWk2aFDB7Zv387jx4+lKEkzHkcmUGv2MYnL9XPgffSQWchCFrLwT8TcuXMZOHAgjx49YtTB5//6zXaJEiVwd3e38nX9X8VnpV7Mwj8LsbGxFkm20yImJoaDBw/SoUMHSZgEpFxZGzdutLpn9+7dNGjQwOq4wWCwyEuWHv/5z39ITU2lV69eEqWWTCbDvlR9DLHhJD+99QmtewtjShLCkIpCLmPN76FW57ds2ULDhg0tdpa1atUif/78mbazevXqVhF0QghiYmIyTRlz5MgRIiIi6NWrl8Xx3r17Ex8fL+UlSwszY9TnxD+ZMSoLWchCFjKCEIKlS5cSEBBAzpw5/1X0zKmpqVZr8dGjR7l8+TLVqlX7r9fnr0KWQPkvRWBgIA4ODmi1WqpXr8758+ctzr+LY7pEiRJSIlwzXrx4wcWLF6lfv77F8YSEBBwcHHB0dMTFxUVicEiLixcvYmtrS6FChThy+5W041RnM/GXprx88MntjD61jsezWhA6vRlPlg1gy05Loe3p06e8evXKqp0AZcuWtWpnamoqhw4dsmonmCIkHR0dsbe3p0OHDrx8+dKqnYDVs0qXLo1cLrd6lhltvshpweX6Z/D/lTEqC1nIwv8m4uPjWbduHT169ODq1auS7+G/abP99OlTChYsyLhx41i8eDGDBg2ifv36eHl5WSWP/19GVlDOvwxqtZrmzZtTv3593NzcuHHjBjNmzKBKlSqcPn2akiVNPM+ZcUybj504ccLi2J49e9BqtRbpEbJly8Z3331HqVKlMBqN7Nu3j6CgIC5fvszRo0clarrnz5/j6elJfIqB0Mg0SWXtTOZfQ1zExzdUJkObqyQ2+SugsHNFH/WCmHPbubZ0BFsaFKR5k8Yf1M7IyEiSk5OlCL0TJ04QExNjoYl1dnamT58+VKhQAY1Gw4kTJ5g/fz5nz57l/Pnzkob3+fPnKBQKq3RCarUaV1dXnj17lmlz0nK5mukhPxTvo4fMQhaykIV/KsLCwmjXrh1OTk6MHDmSxo0bS+f+LfTMzs7OlC5dmiVLlhAWFoatrS0NGjRg6tSpuLq6/i11+iuQJVD+y1CxYkUqVnzLfdq4cWNatGhBsWLFGDFiBPv27QMy55gG0Gq10nkz9uzZY2UGNqcAMqNNmzbkz5+fUaNGsXnzZinSOjExEY1GQ0hEvGWi+je0gyIDPuv3QenogWfriRbHbP1r8GzJtwwdMkQSKN/XzrT1M7ezcOHCkiM5QP/+lknVmzdvTtmyZWnfvj1BQUFS5HBiYqJVgE/aZ6Xv0/TIYozKQkbIysebhX8z/Pz83sk89W/YbDs6Olqlk/s3ImtW+n+AvHnz8tVXX7F161YMBgMKhSJTjmmApKQkC8ExNTWVgwcPWgmQGWHgwIF8//33HDp0SBIodTodycnJVrzSZkFSlgGf9adAobPHrmgtHv6+mSdPnuDt7f3edprrZ8bu3butItQzQrt27Rg8eDCHDh2SBEqdTkdKSsbCcfo+zQxZjFFZAN6O/+1XhEZmMP4uNlQv4EH7cjnJ55k1/ln4dyNrs/2/gSyB8v8JfHx8SElJIT4+HgcHh0w5ps3HsmfPLv0+efIkMTExGfoVpodOp8PV1ZXIyEjpWLZs2Thy5AgqhaWDtSHOlCNNYff5VP5KBxPvc2RkJN7e3u9tp4uLi6SdfPjwIbdu3WLBggUf9CwfHx+rdhoMBisWnZSUFCIiIiz69H3IYoz6/4m0vPaZLZoCCIlMYPWZEFb89ogqed2yFs0s/OuRtdn+5yNrVfp/ggcPHqDVaqU8iplxTKekpHDp0iWLY7t377YyA2eG2NhYwsPDcXd3l46VKFGCJUuWkBQWioy3/AUpz24DoPa0Zn74VOijXgBIz8+RIwfu7u5WQUkAZ8+eteAb3717N46Ojh/EFiOE4NGjR5JPKrylLzx//ryF8H3+/HmMRuMHcZtnhCzGqP8fSM9r/z7Tnvn86QcR1Jp9jPGNi7yT1z4LWfg3IGuz/c9FVpT3vwxhYWFWxy5fvsyOHTuoU6eOxK2dlmM6NjZWunb16tXExcXRsmVL6diePXus0gUlJSVZ3GfGxIkTEUJQr1496dhXX32FSqVixZLF5HyjRRFCEHtxLwp7VzQ5Cn10Ow0J0VbH9LHhJFw9RLFixSyCcJo3b86uXbt4/PixdOzXX3/lzp07Vu2sU6eOFExkRkZ9umDBAsLCwizaWaNGDVxcXKw0nAsWLMDGxibDlEtZyALAvCN3Gb71Ksl640fn3TMYBcl6I8O3XmXekbvvvyELWfiXwLzZLpnTmSLZHbOEyb8ZWYnN/2WoUaMGOp2OihUr4uHhwY0bN1i8eDEqlYrffvuNQoXeCm8XLlygYsWKFC5c2IJjumrVquzfvx8wmYFz587N0aNHCQh4y2hj1s61bduWggULArB//3727NlDvXr12L17tyS8Anz33XdMnz6dUnVbEqrIRvzt30i8fw63RkOwLVLto9sZvnsO+tfP0foVR2Hngj76FXGX9iFLTeTQwQMWub0eP35MyZIlcXJyon///sTFxTF9+nS8vb05d+4cGo2GxMREXFxcWLhwIZ07d7Z4lo2NDa1bt6Zo0aJotVpOnjzJ+vXrKV68OKdOnZK4UwGCgoLo3bs3LVq0kJhyVq1axQ8//MDIkSM/up1ZyJid49+E9edCGb716mcrr222CPYum8WtW7dITk7m9evXH0yBaU7i/99YFswkDEeOHPlX5eLLQhb+vyJLnP+XoUmTJgQHBzNr1ixiYmJwd3enWbNmjB07lrx581pcW6pUqQw5ptMG3+zZswdHR0crPmUnJycaNmzIwYMHWblyJQaDgbx58zJ58mSGDBliIUwCTJ06FWdnZ+YHLST8+TNUztlxbTT4k4RJMFFpxUa9IPbCboxJccg1tmh8irBu/jSqVatica2Pjw/Hjh1j0KBBDB8+HLVaTYMGDZg5c6bkP3n48GGSk5P58ssvrZ7Vvn17Tp8+zZYtWySasu+++07iKU+LXr16oVKpmDlzJjt27MDHx4fZs2dbRYpnIQtg8pkcu+P6ZyvPkBjDj0N7UqJYUebPn49Go8HW1vazlZ+FLGQhC5khS0OZhXeifv36mTLnfCr+ifzVvXr14vz585w9e/az1SkLnwcGg4HU1FQ0Gg0y2edlzvi78bm/hcQHf/Bq41hqDvqJQzP7fvT9er0evV4vpdT6K5GlocxCFv5dyNJQZuGdqFatGlWqVHn/hR+ByU2LUmv2sc8qUP5ZSq0SJUp8ULqgLHx+vM+xXqFQoFB8HNf7/wLuvozlxL3wz1qmIT4KgOsRBu69iv3oKFelUmnlQ/ypEEJ8cLqsLGQhC//7yArKycI78d1331GhQoXPWuY/kVKre/fuGZq7s/DX4O7LWMbtuE7A9CP4j9tPg59P0nTBaRr8fBL/cfsJmH6EcTuuc/dlLCtWrEAmk/Ho0SPAxA3foEEDsmfPjkajIU+ePEycOBGDwWDxjGrVquHv78+VK1cICAjAxsaGvHnzsnnzZgCOHTtGuXLl0Ol0FChQgEOHDlnV8+nTp3Tt2hVPT080Gg1FihRh2bJlVtf9/PPPFClSBBsbG5ydnSlTpgxr1659Zx+Yee3T4//YO+uwqBK3Dd8TMEOXtApioIKKi13Y3YHdnWuuudbauna3a3d3d3esLaAg3Q0z8/0xzoFhUMH19627O/d1ealnTk+988bzxD86TfC2cbxf3BH/uc0JWtOfuHvHvnpPg7eOIeLoAvW/Nw2jsL053bp1A9QOUG3atCF//vzIZDLy5cvHsGHDdMT2J0+erJMF3rBhAzVr1sTOzg6ZTEbx4sWzldZydXWlcePGnDx5kjJlymBkZMSqVasA+PDhA82bN8fExAQ7OzuGDRuWrTYswO7du/H29sbIyIg8efLQqVMnAgMDv3r9evTo+XvRZyj1/C38Wyy19OSOb9FZdAp5o/X4xo0bMTU1Zfjw4ZiamnLu3DkmTpxIbGwsc+fO1Vo3KiqKxo0b065dO9q0acOKFSto164dW7duZejQofTr148OHTowd+5cWrduzfv37zEzU2f1QkJCqFChAiKRiEGDBmFra8vx48fp2bMnsbGxDB06FIA1a9YwZMgQWrduzc8//0xycjKPHj3i5s2bdOjQ4bP3IrOvfWbi7h/DII8LxoXLg1hM0utbRJ5aDiolZt6NP7s/i0ptSXyRl/gHJ7Co2hEH5/z07avOuu/evZvExET69++PjY0Nt27dYsmSJXz48IHdu3d/dp+gVinw8PCgadOmSKVSDh8+zIABA1AqlQwcOFBr3RcvXtC+fXv69u1L7969cXd3JykpiVq1ahEQEMCQIUNwcnJi8+bNnDt3TudYmgGssmXLMnPmTEJCQli0aBFXr17l/v37OR4u0qNHz/8/+h5KPX8rmbX3/omWWnpyzrc+14lPzhB2ZCGLD1xhcLPKJCUl6ZRR+/Xrx+bNm4mMjBQGrapXr87FixfZtm0b7du3B9QBT9GiRRGLxVy7do3y5dU9t6dOnaJevXps2LBByOr16tWLY8eO8fjxYy2/3fbt23P8+HE+fvyIkZERzZs35/Xr1zx58iTH1xSfkk6JySfJ7i4o01IQG2hbhYbsnEh6VBDO/dZ+eb+PzhBxbCEOXRcgdyzMk8n1MJFJs71ns2bNYty4cfj5+ZE/v/o9lN2Ud3bb1q9fn1evXvHmTUaw7+rqir+/PydOnKBevXrC8kWLFjF06FB27dolyHQlJiZSqlQpXr9+LfRQpqWlkTdvXuzs7Lh9+7bQx3n06FEaN27MxIkTmTJlyhevX48ePX8f+pK3nr+VdmXzc2aYD5Xc1F/Y2ZUAM6N5vJKbDWeG+eiDyX8If0VnUfnJsXP2iRcsPf9KK7jRCOlXrVqVxMREnj9/rrWtqampYAEK4O7ujqWlJcWKFROCSUD499u3bwF1/9/evXtp0qQJKpWK8PBw4U+9evWIiYnh3r17gFrx4MOHD9y+fTvH15TV1z4zmYNJZXICisQY5Pk9SY8ORpmckONjqAC/CPX6me9ZQkIC4eHhVKpUCZVKxf3797+4n8zbxsTEEB4ejo+PD2/fviUmRlsPtkCBAlrBJKiVIhwdHWndurWwzNjYmD59+mitd+fOHUJDQxkwYIDWUFCjRo0oWrQoR48ezdmF69Gj529BX/LW87ejt9TKnn+L/uKO2wHfpbUhcGVPpsXMIDmkLFd3LuPcuXPExsZqrZM1wMmbN69OT6CFhQX58uXTWQbqEjmoxeyjo6NZvXo1q1evzvZ8QkNDARg9ejRnzpyhXLlyFCpUiLp169KhQwcdqa3MZPW1z0zyh2fEXN5KStBzVGnafYbKlATE8pzLAGmOExAQwMSJEzl06JBwjRqy3rOsXL16lUmTJnH9+nUSExN1ttXcO1AHlFnx9/enUKFCOs+Du7u7znrZLQcoWrQoV65c+eJ56tGj5+9FH1Dq+WHQW2r9+/jeOovK1CRG92iFs501U6dOpWDBgsjlcu7du8fo0aNRKrUDtc9Nh39uuabUq9lPp06ddITuNZQsWRKAYsWK8eLFC44cOcKJEyfYu3cvy5cv/2KJ1lCaURxKDQ8g8c/LmJaojUqlJGT7eAxs8mJVsxdS8zwgMSDpzW3ibh+EXHYoGUrFKBQK6tSpQ2RkJKNHj6Zo0aKYmJgQGBhIt27ddO5ZZt68eUOtWrUoWrQo8+fPJ1++fBgaGnLs2DEWLFigs61+oluPnv8u+m9oPT8kev9q6Ny5M+3atRN6Av+JjNv/WPCm/h6khr5DmRRL0baz+fnnfsLyd+/efbdjgNoL3szMDIVCQe3atb+6vomJCW3btqVt27akpqbSsmVLpk+fztixY7PVdHS1MRF87dPCA4i5uh15/hKkhr4DRRp2rX5FamEnrJ/s/yjX1yD6dJzHjx/z8uVLNm3aRJcuXYTHT58+/dV9HD58mJSUFA4dOiT0WQKcP38+x+fh4uLCkydPUKlUWlnKFy9e6KynWV6zZk2tx168eCE8rkePnh8TfQ+lHj0/GAkJ6r43iUSCXC7/x4p5a3QWv6feqOZePPoQzetQtZd8amoqy5cv/27HAPW9b9WqFXv37s122Cazv3tERITWY4aGhhQvXhyVSkVaWlq2+zeRSQVfey1Euh/JyuQEEh7rShp9jfw2xpjIpEI2NvOgjUqlYtGiRV/dR3bbxsTEsGHDhhyfR8OGDQkKChLkmkA9lJO1laBMmTLY2dmxcuVKLUmh48eP8+eff9KoUaMcH1OPHj3//+gDSj16/gf4+/szYMAA3N3dMTIywsbGhjZt2ghaiho0GosXL15kwIAB2NnZkTdvXq3HMm+TWw3GZ8+eUaNGDYyNjXF2dmbOnDla66WmpjJx4kS8vb2xsLDAxMSEqlWr5ioDlZVHjx7RrVs3ypUqTsDcFrxf0onwowtRJMV+fWMgPTac0L3TCPi9Fe8XdyTh2UXhMYM8LojlpkQcXUCH7n0pVaoUpqamPHz4EIClS5fqaCsGBwfTuUtXHBydMZTJeP/+Pbdv39a6r5rS7YYNGzA2NqZGjRp0794dhUJB6dKlGTp0KKtXr6Z27dqIRCKtPr+6detSqlQpRCIRs2fPZuTIkSxevBiZTEb79u05deoUXl5eyOVyihcvzr59+wCo4W5H4pMzhB+YBUDI9nFEnVHrNoZsG0fc3SOEH57Ph6VdUCSq+xyDt44m+up2VErt5zsrErGIGkXUGc6iRYtSsGBBRo4cyYwZM1i6dCk1a9bkw4cPX30u6tati6GhIU2aNGHZsmXMnj0bb29v7Ozsvrqtht69e1OoUCG6dOnCmDFjWLRoEdWqVdOxLTUwMGD27NmCbuiiRYsYN24crVu3xtXVlWHDhuX4mP9VElLSeRoUw/2AKJ4GxZCQkv53n5Ke/xD6krcePf8Dbt++zbVr12jXrh158+bFz8+PFStWUL16dZ49e5atB7itrS0TJ04UMpTZkVsNxvr169OyZUt8fX3Zs2cPo0ePpkSJEoKIe2xsLGvXrqV9+/b07t2buLg41q1bR7169bh16xZeXl65vvbTp0/z9u1bLErVQSw2IS08gPgHJ0kLD8Chy+9fzLgq01II2TEeRWwYZt5NkJhaE3v7oPC4WGaMbetJRJ1by50TuzA0kFKxYkVKly7NokWL2L9/P126dGH37t0kpSoIjUvBvUJt4oL9MPdujFlpe6LOrSM8Nolmsw/QokEdOpbPz9r50wCws7Nj5MiRPHz4kI4dO2JhYYGtrS379u1j+fLlQvvB7NmzhXPq27cv8+fPB2DixInky5ePIUOGsGPHDl69ekXbtm3p168fXbt2ZcOGDbRp04YTJ07QsXwF1hz3xMy7CXF3D2Ne0RcDm3ykhrwh+e1dos6vB0RIrRyR2uQl6fkVDGxdibm8FVVKElY1e3z2PiqUKjpVUJeoDQwMOHz4MEOGDGHmzJnI5XJatGjBoEGDKFWq1BefS3d3d/bs2cOECRMYOXIkDg4O9O/fH1tbW3r0+PzxM2NsbMzZs2cZPHgwS5YswdjYmI4dO9KgQQPq16+vtW63bt0wNjZm1qxZjB49GhMTE1q0aMHs2bP1GpSfQRhmfBFKQGQ2w4zWxtRwt6Nj+fwUtv/3DzPq+fvQ61Dq0fM/IDvtvhs3blCxYkX++OMPOnfuDGRMclepUoULFy5oDYtkN+WdWw3GzMdKTU3FxcWFypUrC+VHhUKBQqHA0NBQ2F90dDRFixalUaNGrFu37puuXSE20NJZTHh2kfBDc7HvOAt5Ps/Pbht7+yBRZ9eQp/kYTIpWUS+7d5SoU2pnFvv2M5C7qIdhVGkpPJveVGtYS6Ot2HzWfu5FSSE1Af/5bbGs0QOL8i11jicRi0iNiyRweTfq1mvIiaOHhMemTJnC5MmT6dq1Kxs3bgSy12mE7J8rjS7j3r17adlSfezY2FiKFi2Kg4MD9+7do/O6m5w6epDQ/TO1rk1DdpqUESeWkvD0PPl+3oFIapDtNX2rr/2vv/7KzJkzSU/XZ7Z+dHJiEqBB83jVQnmY0aLEX3IV06Pnc+hL3nr0/A/IHPSlpaURERFBoUKFsLS0FPQLM9O7d+8c+VXnVoOxU6dOwv8NDQ0pV66coLUI6h45TTCpVCqJjIwkPT2dMmXKZHueOcHIyEjQWVSlp6JIjEHmVBSA1OA3X9w26e0dJKbWGLtnSO4ok+KyXVdkIBN0FjXaiklWBVGpVFy7fQcAldgQJFJSAh6jSI7X2YdCqSLZ7yEqhYInluXZcTtAeGzw4MG5uu7scHJyokWLFsL/zc3N6dKlC/fv3yc4OJgZLUp8UXtVS5MyJVF9L/N5oEpLIS3ifbbb/BVf+48fP5InT55v2lZPzvgeZekdtwOoveAi196q+3e/1qesefza2whqL7io9TrXo+d7oS9569HzPyApKYmZM2eyYcMGAgMDdYYaspKdfl92PH36lAkTJnyzBqOVlRWPHmlPDG/atInff/+d58+faw2R5PScMvMqJI61Zx6zadlcwh5eQJkYrfW4MiUx+w0/kR4ThtTSEZFIhCIhisTnV4l/cBypTV7SIz5kWTeUsT/358rZEzraiulJ6kBTJDXAqnp3os6t48PiTsic3DEqVBZTz1pITK3U68aq9SRV5g6M2feY8PgUBtUojLW1NVZWVrm+B5nJTn+xSJEiAPj5+VGhQgXalsnLwr3Zb58a5k/0pc0kBzxCleXefe5efouv/du3b9m/fz+7d++mcePP2zvq+Ta+Z1l66flX36zrqvjkUpX5da5Hz/dCn6HUo+d/wODBg5k+fTq+vr7s2rWLU6dOcfr0aWxsbLLV/cuJfl90dDQ+Pj48fPiQqVOncvjwYU6fPi308+VUgzFzcLtlyxa6detGwYIFWbduHSdOnOD06dPUrFnzi/qEWXkfmUjndTeps/ASSyYMIPT2ccxKN8C2xTjs2v6Gne8nPUZVzveZFv6eqPMbkFo6YubdVPsalApCdv7KlXOnGD16NCPmrsGu3TRsGg3TXKSwrnnZZjj1WYWVTxdEUkOiL28haE2/z2ZL5516yc7PZHCyBocXLlxAJBLx9Om3a21WLmSb7XJlcjwh28aSFvoOyyodsW09Ebt207Cs3k29Qjb38lt97S9dusSUKVPw8fER+kH/TWQ34Pb/Qeb3xeab/vhHJhJ1eSv+szKCdhXgFx7HwpmTKFbYDZFYTL2GTbLd3/cyCYAvv86/F35+fohEIqFlJLfEx8fTq1cvHBwcEIlEDB06FICQkBBat26NjY0NIpGIhQsXfrdz1vPt6DOU/zH0guH/P+zZs4euXbvy+++/C8uSk5OJjo7+5n1euHCBiIgI9u3bR7Vq1YTlf0WDcc+ePbi5ubFv3z6tYGnSpEk53oeWR3dyPEl+D7Go0hHLKu2FddIiA3O0L6mFLWlh/qhUKuQuJck/Up26i7mpncJLC/MnPTKQ2WvXU79FW2ovuIiRqyNJ77K3ETSwcsSgfEvMy7ckLTKQjxuGEHt7P3majERqrp5YTo/6iIGlAwATDz2lmJVIJ/OpyVhGR0drDYmEhIRke9zXr1/r6C++fKkOCDS9lprH+lRzY2egWPA6Tw54jDIpFtsW45Dnz+g7TY8O1jrG9/C179atm+Bhruf7kPl9AV8uS8c/Ok3Mjb2YlWmG3LEQzyzt2HE7gHaZns/vbRIA6td5pYJ5ftieyhkzZrBx40Z+/fVXChYsSLFixQAYNmwYJ0+eZNKkSTg4OFCmTJm/+Uz1gD6g/E+gnwL8/0cikegMbixZskRH3ie3+wTtDONf1WDMvE9NYHPz5k2uX7+uJWT9ObKW30SCjqL2tcfeOUROMHIrQ/K7+yS+uCoM5SjTkol/cEJ7xU/HMZSKBfF0lUpFXJbjKNOSEYnEiKQZQ0dSK0dEhkao0tXlfblrKRBLiLt/DKMCpQFIV6roPGKqzvkVLFgQUGf0mjbNyJqeOnUq2+sJCgpi//79WkM5f/zxB15eXjg4qINXExO1leJPDjJ6+/oIgxZiIcOcST9SkUbcvWMAiDP52usHLb7M/7dJwJfK0haV22FRsY3WsmT/h0jMbLCu3VtYlrUs/b1NAkD9Oh+3//E3DXD9f3Du3DkqVKig8wP33LlzNGvWjJEjR/5NZ6YnO/QB5b+YnEwBqgD/yEQ23/Rn43W//+QUoGZyNyws7LsNJDRu3JjNmzdjYWFB8eLFuX79OgcPquVvwsPDv2mflSpVwsrKiq5duzJkyBBEIhGbN2/WCVw1vHv3jurVq3PhwoUvnue+ffto0aIFjRo14t27d6xcuZLixYsTH687xJKZ7MpvYpkxsnyexN7Yi0qpQGpqQ9K7e6THZJ/By4qpVz3i7h0h4sh8UoNfIzGxIuHpeRSJ2v2ictt8WDnkY9jwEag8GyGSGZH44hrKLIM36ZFBhGwfj3GxKhjY5EcklpD48jrKhGiMi6mzvBITK8zLNCX21n5C90zFyM2b1NB3+L+9i9WnkpqGunXrkj9/fnr27MmoUaNYv349oPYCzy5LWaRIEXr27Mnt27ext7dn/fr1hISEaAmDe3l5IZFImD17Nv1iYmhkImNgx3Lse2DJgiMLCD+yAPMyTQARCU/Powkw6xazZ0Lvav8JX/uc4OrqiqenJ0eOHNF5TCKR5Gjo7XvwtbK0SCwBsfa5KBJiEMt0PdrnnXqJramMn/Jbcfl1zj83VCoVqvRUHYWArCiUKi6/Dud1aNwP+ToKDQ2lePHi2S7Xy0j9eOh7KP+l6KcA/z6WL19O+fLl6dKlC1u3bmXEiBF8/PiRUaNG/aX92tjYcOTIERwdHZkwYQLz5s2jTp06OmLluaFbt27MmDGDhw8fMmTIEE6ePMmWLVu+WkLKXH6L/tQTlhoeQNihuaSGvAGJhPi7R4g8tYLUoBdYVGoLQMy1nQStGyhYCSa+uEbQuoH4z23Bxw0/kx4RiH276chdSxN39zAx13Yiy1scmaP28IBSJGHb7n1Y5StMzI3dxFzZjtTKEbmrOsMYcXwJ7xd1IPLsWuQupUgOeEz0xU1EXdxEWkQAYmNLwg/P5cPyHkRd3IRFlY5YVGpH6sdXRJ1bT/yDExgXKkdyqkLLOrFw4cKULFmSggUL8uuvv+Lv7w+gNckNsHv3bj5+/Mjr169RKBSsXLmSMWPGkJaWxs6dO6lXrx7dunXD1NQUhUJBiRIluHnzJt26daN9+/YkhLxjTqfKXDxzAu9iBUi6tg3p06N0atWYPeuWqZ+7ygV+yCDgRyS7Hsrjx49TtWpVTExMMDMzo1GjRjq9sJrnKDAwkObNm2NqaoqtrS39+vVj4sSJPHjwAMjoFZwwdQY/T55H4Mpe+M9tzseNw0j5qB1cRmfqoUyPDsF/VmNSAh6RFh6A/6zG+M9qLLw/VColg8dPp2IZL7VJwOJORJxYqqNY8GF5D0J3TyHp7V0+bhxKwLyWuln9zyARi9hyI4B9+/ZRtmxZChUq9EUzhs8RHR1Nt27dsLCwwNLSkq5du2bb4lO9enWqV6+us7xbt25CG4imN/ndu3ccPXoUkUgk9GKKRCJUKhXLli0Tluv5MdBnKP+F6KcA/16WL19Onjx5dDKDmbUMNXypdy27xypVqsT169d11s2apbxw4QKpqak662VtjheJRIwdO5axY8dqLf+azV125bfwA7OQWjlhVb07oMLsp0Z8WN4DkdSQqDOrsajSAbHMhNhb+wjd+xvW9QYQffEPzH5SHyvm+m7CDs7Cqc8q7Fr/qr3vIwsQGciRu5QUdBbrVylD3o4zUESqp53Djy4k7tY+5G7eGBX4CZQKkj88Q5bfA9sWY4T9JDw5i7F7ZeQuJUkJekHs9d2khb/HrtUELKupZZb8ZzVGZCAnKS5acC7SYGNjw+HDhwE4c+YMderUoX79+syaNUu4x927d8fQ0JCiRYvStGlTFi1ahKOjI9evX9fKrCgUCurVq0f58uXp27cvZ86cYe/evbx8+ZJatWpRqVIlbt64oXP/9fLBf43NmzfTtWtX6tWrx+zZs0lMTGTFihVUqVKF+/fvC4ENaD9H8+bN48yZM6xapXY0cnNz0xL/X75uE3Fx8Zh61QeRiNgbewnbNwPnfmsRSXS/bsXGFtg0HkHM9Z2oUpOx9OkKgEGefABEnlhK/OOzWJSqg5VHA9JjQoi7e4TUkDc4dJqrtc+0yA+EH5qLqVd9TEvVw8DaOUf3QqFUcf5lKG8fHeDOnTsMGTIET0/Pr5oxZEalUtGsWTOuXLlCv379KFasGPv376dr1645OoesFCtWjM2bNzNs2DDy5s3LiBEjAChdujSbN2+mc+fO1KlTR8ubXs/fjz6g/M5ovkxu3779lxqFXV1dqV69eq6n4773FKCtqeybG/31/D0kJiZibGysJVb+PdF4dGfFwK4Atk11s7DpkR9w6DwXmbO6od4gTz5Cd04k8vhSnHqvQGqhHooRy02JPLGUlIAnOgLfmdHoLManpBPwKZhM9n9EwuMzmHk3wbpOX2Fd8/ItheArNeQtCU/OYlqqLjYNhgBg9lMjJMaWxN7aR7L/I63jpgS9AKB8pSo655CQkICJiQlSqfZHaFpaGqNHj8bT05PY2FgKFCjAzJkzqVKlCo0bN2bBggVMmTJFWD85OZm2bdvy66/qALpfv3789NNPrFu3jv79+3/2HvwX0Nzj7018fDxDhgyhV69eWn7iXbt2xd3dnRkzZmgtz/wcpaen06NHD0qWLMmLFy909h0TFoxT39VI5KYAGFjnJWzvbyS9u4dxoXI664sN5Zh61iD+4UmUolhMPWtkHPf9U+IfniJPk5GYeFQXlsvzlyB01yQSn1/RWp4e9RE73ykYuXnn+p4ERCRSs7DaTnTYsGFCQN2kSRMqVqzI3r17BYOE7Dh06BCXLl1izpw5QiWmf//+1KhR47PbfAl7e3s6derEhAkTcHZ21tLT9fDwoHPnzhQpUkRruZ6/H33J+19EbqYAlalJRJ5ZzYdlXfGf25zANf2EZv/MTDz0lCfvgujTpw+2traYmJhQo0aNz4peHzp0iJ9++gm5XE7+/PmZNGmSjuvG2bNn6dGjB0WKFMHY2Bg3Nzd69erFx48fdc9TqWTlypV4eXlhamqKvb09DRo04Nq1azm6zm/F39+fQoUK4enpKfTGbdiwgZo1a2JnZ4dMJqN48eKsWLFCaztXV1eePn3KxYsXhXJM1vJOSkoKw4cPF+5nixYtCAsL01ont57dd+/eFfyRx40bJzyW+diaMtKuXbuYPn06efPmRS6XU6tWLV6/fq1zD27evEn9+vWxsLDA2NgYHx8frl69ytabAdmKcZt5Ncj2XhrkyY/MuRjxj04TvG0c4YfmqR8QiUh6c0dYT+ao1mfMOsWcmfS4cMwvLaRYfjvyOzkQeW4dKqWCxBdXAREWVTqgUimJvX2QoLUD8J/bgg9LOqvdZV5cBcC8bEZ5OunNHZLfPwEgZPt4Alf3I+rSZgBS3j9BXqA0S1eswtTUlDdv3hASEsLWrVvp2LEjgJCV1HD48GFCQ0MpXLgw8fHxnD9/HplMxuTJk3FxceHo0aM617Rlyxbkcjmenp7s37+f5ORk7t/XnlafN28elSpVwsbGBiMjI7y9vQW3o38DkydPRiQS8ezZMzp06ICVlRVVqqgD+fT0dH777TcKFiyITCbD1dWVcePGkZKSku2+PuedruH06dNER0cTERGBs7MzMpmMAgUKsGzZMsqVKyf42Pv5+bFp0yZAncnXHH/58uVCMNm9e3dEIpGg2WparKoQTALI8nmoryGb17RKkUb0pS183PAzKR+ekRb+nuAtv2S0gzy/gkhmgrxAaRSJMcIfQ4dCiAyNSA54RNKbOwRv+QVFbCggIu7uYVLD/LWOkxr6jvAjCwhc0RP/uS14v6QT4UcXokjK6EuOuryVyRMnAGr9Wc1nl6GhIZaWlty5c+eLz8GxY8eQSqUsXbqUxo0bc+XKFSpWrMiNT9n1q1evfvH51/PvQJ+h/EF58eIFYnHu4v2cTgGqlApCd04kJfgVZj81wsDKmaR394g8tRxlcjwWlXyFddMUCmrWqU9i8FtGjRpFnjx5WL58OdWrV+fu3bsULpxREj9+/DjNmzenevXqLFmyhMePHzNt2jRCQ0O1Aq/Ro0cTGRlJmzZtKFy4MG/fvmXp0qUcOXKEBw8eCNOvAKNGjWL+/Pl06tSJAQMGEB0dzapVq4Tgplw53V/9f5U3b95Qs2ZNrK2tOX36tDCos2LFCjw8PGjatClSqZTDhw8zYMAAlEolAwcOBGDhwoUMHjwYU1NTxo8fD6h/bWdm8ODBWFlZMWnSJPz8/Fi4cCGDBg1i586dwjq58eyOiIigQYMGtGvXjk6dOukcLyuzZs1CLBYzcuRIYmJimDNnDh07duTmzZvCOufOnaNBgwZ4e3szadIkxGKxEFAX77MAhamLzn6lltkfV2Ku1lmMu38MgzwuGBcuT9TZNeqM5KnloFJi5t1YGErIOlgjoFKiPDqdkjWr0rP9PPYcOsbZ4/uRWjqSFh2MxMwaiZEZEccXE//4LKYlamPm3UQoE4oMZGi8sQHin5wj4sgC5G4/gViKSCIlPSqQ2Gvq58HQsQi2LcahDNhHeno69erVQyKR4OXlRatWrbI9xcBAtTzS48ePiY2NpVChQvTo0YM5c+aQkJCgNej04YNaqF0ulzNz5kyioqLo2bMnBgYGOhqgixYtomnTpnTs2JHU1FR27NhBmzZtOHLkyFfbE/5JaD4TZsyYIWSWe/XqxaZNm2jdujUjRozg5s2bzJw5kz///JP9+/drbf857/Thw4cL62j6JDMHmn5+fvz222+A2s0oMyKRiA0bNtCnTx9kMhktWrTg4MGDXLhwgT59+lC1alXCwsIYPnw4YnNtTVFNcJnda1qZkkj8o1MYF6uGMjXpkxNSLCE7J+LYdT5pUUGoUhL4sLhjtvcq5eNr4h+eRu72EyK5KRK5Kanh7wnZ8guO3RcL78fkd/dJjw7GpGRtJCZWpIUHEP/gJGnhATh0+R2RSISxeyXKWSVx+sgBLCwsBJMEb291tvPYsWO8fv36s8+Bv78/jo5qQwLNej179qR27drMnDmTdevWMXToUDw8PL709Ov5h6MPKH8gVCoVycnJGBkZ5Vre4nNlyOxIfHmdlMA/sWkwBNNSdQEw+6khYftnEHNtB6al6iIxsQQg7tkVwt88ZvHaPxjcU13y8PX1pUiRIkyaNIlt27YJ+x05ciQlS5bk1KlTQinQ3NycGTNm8PPPP1O0qNp+b/78+VSpUkUrYK5fvz4+Pj4sXbqUadOmAerMxIoVK2jdujWbN28W1m3Tpg1ubm5s3br1uweUz58/p1atWjg7O3Py5Ektp5SLFy9qCZAPGjSI+vXrM3/+fCGgbN68ORMmTCBPnjyfLcfY2Nhw6tQpoZlcqVSyePFiYmJisLCwAGDbtm1ax+rXrx/9+vVj+fLlTJs2Tev1ERwczMqVK+nbty85ITk5mQcPHgglcSsrK37++WeePHmCp6cnKpWKfv36UaNGDY4fPy6cZ9++fSle3IPnR9Zi3+43nf1mlubRWv5J4se+wyxh6jTq7BqMC5cnLeojsbcPYOatLfScGYlYhEQsQpWeSv8enYXycNWm7fnpJ2/iH51CbKy+b18rE4IIRCKUqUlEnV71qfw9mPcL2iJ39cK6bj8CV/dDlZKAkZs3YkMjxCJ1VrlNmzZs2bIFd3f3L5b/QD2FGhoaKrx+3N3dadasGQYGGd7b9+7dQyQScfXqVUxN1YFHrVq1sh1YePnypc5r76effmL+/Pn/qoCyVKlSWp8pDx8+ZNOmTfTq1Ys1a9YAMGDAAOzs7Jg3bx7nz5/XKqu+fPlSyzu9Z8+eFC1alF27dgnrXLp0CYC5c+dq9T+uW7eOXbt2CcfRoFKpuHHjBra2GcFi4cKFuXDhAhUrVqRTp048ffEahg8X5Kx0yKbnVSw3xbn/OkQSA4KDXyOSSHHoNIfANf2IvXsYVCrExpbkaaorjaNMSyHi8Dzh9ftheQ8MbPJh03AIgav7EXN9FzYN1Nahpj81wjyLj73MyZ3wQ3NJ+fAUeT5PDO0K8PGeehCzdevWQmVCJBLRunVrXr9+/cXnIDMvXrzg0qVLVK1alUePHjFz5kwkEgkbNmxg3rx5wlBNVv6KpJqeHwN9yTuXBAYG0rNnT6EUWaBAAfr3768zAJGTsqarqyuNGzfm5MmTlClTBiMjI6HZ29XVVWsgIy0tjSlTplC4cGHkcjk2NjZUqVKF06dPA3y2DJkdKe/Vv9CNi1fTWm5crBqq9FQSX2UMASS+uIrExJJwGy9hma2tLb6+vhw8eFAoeTx79oxnz57Rp08frb6yAQMGoFKptMpz1apV08m+VqtWDWtra/7880+ta05KStLJuNnZ2SEWi3PkLpMbnjx5go+PD66urpw5c0bHdi/z8WJiYggPD8fHx4e3b99ma6f4Ofr06aM1mVi1alUUCoUwMZz1WF/z7JbJZHTv3j3Hx9cMjGQ+PiB4fD948IBXr17RoUMHIiIiCA8PJzw8nISEBLwrVSX5/RNUuXC80ZBVwkSZnoo8vyfp0cEokxN01pdk0lmsW1z9GujXr5/wuKuNCbK8xUmPDsbA0gFFXCQJT89/tkyIRAqoSI8MIvndfZQpCZgU9yE1PABlSoI6KBWJkTkVUQedKQmIANNPwv89e/bMti0jM87O6kEILy8vrdeP5h5rfjAEBQURFRWFVCoVgkkAHx8f7OzsdPab+fUQFRVFTEwMVatW/Wa/9R+VzM8vqDNjgFaGERCGNLK2EHzOOz0gIEO1QiMs7+LigpeXl/CnV69eKJVKLftRAKlUqhVMZkdg9JctRbNDJJYgkqh/YKhUKlRKBSqlAplDYVKD3yC1ckSZFIvMuRhGrl5af0RKBarUJEyK+6BIjEGlVKJSpAmv3+SADHvVzO87VXqq2g/eSf3jXuMWJQJeP38GwIQJE2jdujV16tShSpUqgsXrl54DFxcXPn78iEqlonjx4sLrXdMa4OjoKHy+WFlZZTv9nfnzT88/E32GMhcEBQVRrlw5oqOj6dOnD0WLFiUwMJA9e/aQmJio9SWdk7ImqN9w7du3p2/fvvTu3Rt3d/dsjz158mRmzpxJr169KFeuHLGxsdy5c4d79+5Rp04dzr8I/ao0kAbNB4/mw0yD5oMnNTijny415A0G9gW5kCX7Wa5cOVavXs3Lly8pUaKE0POVdRDJycmJvHnz6vSEZSU+Pp74+HgtHUgjIyPKly/Pxo0bqVixIlWrViU6OprffvsNKysr+vTpk6PrzSlNmjTB3t6ekydPan3Ja7h69SqTJk3i+vXrJCZqf4Fkzi5+jayC4ZrAI7MrS248u52dnXM1gPO147969QrgixOaypRErV6xnJD84Rkxl7eSEqQOiBMenc60P+2A0sFcRn0PRzpVyE8hOzO6XV6BXC7X+mI3kUmxsrIiLjkeY/fKxN07StLbe18sEwLE3jmI9JMjTsj2ccLy+PvHiL//qY9YJCbl/VPy2xgj/ShGKpVy7Nixr2ZRSpQoAaiDlpSUFCGTrOklc3NzAzK+PLOTPLG2tiY0NFRr2ZEjR5g2bRoPHjzQ6h38t0mmZPWP9/f3RywWU6hQIa3lDg4OWFpa6gQhX/JO16C5t76+vmSHJvDRkJN7nJb+bVP38Y/PEntrP2lh/oBKeN1KLewxKVqF+HtHibm2Aysf7feixnkq8+s3OT5c2F4ky5jIViTFEXNlGwl/XkaZGK21H40ffH4bY0Kyuc4lS5YIpgdfeg46derE6tWriYuLE3QjFQoFS5YsAcDY2Fj4fClYsCDHjh0jLCxMeD8/fPiQq1evki9fvpzfPD0/HPqAMheMHTuW4OBgbt68qRU4TZ06VSeFn5OyJqit2U6cOEG9evW+eOyjR4/SsGFDrelDDZmnXXOCgbUzqJSkBD5Hni+jpyX5U+ZSERchLFPERyHL50lARCIJKemCTaOjo7oPLSgoiBIlSgiZG83yzDg6OhIUFPTFc1q4cCGpqam0bdtWa/mWLVto27atVvnYzc2Nq1evCl/O34tWrVqxadMmtm7dqlM+fvPmDbVq1aJo0aLMnz+ffPnyYWhoyLFjx1iwYEGufK+/5rGt8ew2Nzdn6tSpFCxYELlczr179xg9erTOsXKbqf3a8TX7z1oSBPALT2D8wSeIDeRZN/8iaVEfCdk+HgObvFjV7EXkyWUYFSqP1MqBuNsHdUqC67qWxcNJO0DP7rwL5DEhAJC7lMTEo4Za+FsixbSkupUjLdQPA/sCGBepCEDs7UPEPziBga0rALK8xUn58AxD52JYVs0IQpPe3CHu9gHC9s0gVaXuf1u4cOFXhe81Je3g4GB8fHxo3749ISEhLFq0CIAKFSrk8I5lcPnyZZo2bUq1atVYvnw5jo6OGBgYsGHDBq3y8L+Bz72Wv2fgrFQq8fT05OnTp7i4uFC9enUsLS0JDQ3l5s2bOgNqOTm2gTT35xf/5DwRRxdgVLgCKkUaqvRUbBr+TOz1XaRFBSPPXwJTr/rEXt9NashbjAr8hEgsIS0qiPhPP8ZsGo9AYmpF+KF5SC3ssPTp8umcMypA4QdmkRL4HPPyLTG0K4DI0AhUSnULiEqJRCyiRhE7EooX5+7du0ydOpUKFSpw/fp1zpw5g0wmIzU19Yv3oUmTJlSuXJmrV6/y559/smzZMvbt26f141fz+dKjRw/mz59PvXr16NmzJ6GhoaxcuRIPDw+dH896/lnoA8ocolQqOXDgAE2aNMlWDijrmy27suaCBQvw9/enZMkMaZICBQp8NZgEsLS05OnTp7x69UprEAbAPyJBp+/sS5gUr0701R1EHFuEdd3+GFg5keR3n7hP2RlVekb5XpWeikhigArwi0gQvuQ1Ys9JSUlaf2fX+ymXy7/4QXHp0iWmTJmCr68vNWvW1HrMzMwMDw8PKlasSK1atQgODmbWrFk0b96cy5cvfzdnG1AHUFKplAEDBmBmZkaHDh2Exw4fPkxKSgqHDh3SyvBl7R+Cv/7l97/w7M4NGntBc3NzateurfVYQko60x9Kc/V6A0h6fQsUadi1+hWphR2RJ5chNc+DSKr7ehGhLmfnhBLOFlz89G+bRkNJi/5IauBz4h+eRCw3xdChEKYl6yBzUGdX5PlLEHNtF3H31G4qaZGBmFdsg2XlDoikGRl7uUtJRBIpwS/P8/JTee706dPUqlUrR+fVqVMnnj59yujRo4WWl61btwrvGxcX9VBTdr1kkZGRWv/fu3cvcrmckydPar2/Mrvt/FtxcXFBqVTy6tUrwccZ1N7p0dHRwn3U8CXvdA0FCxbEzMyMc+fOMWvWLPbv309KSgrOzs5UrVqVQYMG5fo881rm3lks8cVVpJYO2LYcT8i2sSiTYjFy9SLm8lZhHZv6gzB0KET8gxNEX/wDxGKkFvbI85ck6fVNJCYW6hK41BCJsfrfmVEkx5Ps/xCLKh2xrNJeWK7JcIJah7JThfxImzfn7t27HDhwgN27d1O5cmXOnDlDhQoVSElJ+eJzIBaLhc/GwMBAxo8fT9OmTfn9998pXbq01jkVK1aMP/74g4kTJzJ8+HCKFy/O5s2b2bZt2xddvfT8+OgDyhwSFhZGbGwsnp6eOVo/J2VN0C3xfI6pU6fSrFkzihQpgqenJ/Xr16dz586ULFmS1PTc9bNJTK2wa/Ur4Ud+J3SnesBBJDPGunZfIo4uUP+C/YRIaqgukYPWcZKTk4GMjILm7+ykPDSDRtnx/PlzWrRogaenJ2vXrtV6LD09ndq1awtT4xpq166Nh4cHc+fOZfbs2bm69i8hEomEsk3Xrl0xNTUV/Jqz89GOiYnJ9kvdxMQk2x6hnPK/8OzODd7e3hQsWJB58+bRoUMHrfK/iUyKg2EqH1MzSuyWVTtqZfcyk3eA2pow9s5hreUuY46gTE4gaG2G1qLU0h6XMUdwsTEWMuFfw8ZUHWBJxCIUSLDy6UrItrGYl2+pUyZUfeo7s6zSHvOyzfiwvBsGNvmwrNJRR3RalBxP014j2dxzN926dWPPnj0ULFhQxzXEwcFByHJlplSpUlqDZABbt2YECk5OTnh6ehIdHU18fLxwjy9evEhoaKhWoCSRSBCJRFrldj8/Pw4cOJCje/RPpmHDhowbN46FCxcK/eWgHuwDXQH+z3mn58uXj/fv3yOVSvH19WXy5MmkpKRw4oS2m0x0dLROu8v06dN1zmv48OGsWbNGeJ8Xdy9EtTnn8M+mUuQyRtsKUvN+Cds349MSFQ4d1fJTKUEvSAl8LigjAJh51cfMqz5yAzFpCrXxhDIlkQ/LuxFzbRfy/CWF95kGRWIMEmOLTJlK7R8usVk87+/6Rwk/zs+dO6dVmbhw4QJeXl5ffQ6sra3JkyePjv2lSqXSeX907NhRkN7SULduXbLyOZcevbD/j4k+oPwf8bWyooacliurVavGmzdvOHjwIKdOnWLt2rUsWLCAlStXUrFhm1yfnzy/J8791pIW5o8yLRlDuwIo4tWZEQNrp4zrMLUSlhtKM8oomhK3k5N6XU2p++PHjzp9MB8/fsx2Gvv9+/fUrVsXCwsLjh07hpmZto3cpUuXePLkifDBpaFw4cIUK1bsf6JtJhaL2bJlC82bN8fX15djx45Rs2ZN6tati6GhIU2aNKFv377Ex8ezZs0a7OzsdAY1vL29WbFiBdOmTaNQoULY2dnpZF6/RG49u783YrGYtWvX0qBBAzw8POjevTvOzs4EBgZy/vx5IpNESOr8kuOeXQCjAqWJkkgJ3TMVM6/6KNOSiX9wErGxhfD6AoTyW26RfvKq/1KZMPH5Faxq98GkaBXEMmNs6g4g/Mh8Pm78GZNi1RAbW5AeG0bS69sY5y/OjIk7v37gv8CMGTNo1qwZlStXpnv37kRFRbF06VI8PT215IUaNWrE/PnzqV+/Ph06dCA0NJRly5ZRqFAhHj169IUj/PMpVaoUXbt2ZfXq1UIryK1bt9i0aRPNmzfXEc7+nHd6p06d2Lx5M9bW1owaNYpDhw7RuHFjunXrhre3NwkJCTx+/Jg9e/bg5+f31cpHwYIFsbS0ZOXKlZiZmWFiYoKXpRUfokU5fl8YFSpL4strhO2djlGhsqRHBxN//zgGefKhTE3WWlciFtGohCNHHn1EoVR99fUrz1sM67r9EcuMkeXzJPbmXlRKBVJTG5Le3SM9Rq2tG/fwFLF3DtFhkZhihdQtROPHj6ddu3YYGBhQsmRJIbhcvXq1TstV5ufg1q1bREZGcvnyZQwMDEhPT//sZ1ZISAhjxozh6NGjxMXFUaxYMcaOHUubNl/+LqtTpw5nzpxh4MCBLF26NEf3Wc//H/op7xxia2uLubk5T548+dvOwdramu7du7N9+3bev39PyZIlmTx5Mq42JnxLkVUklmBo74Y8b3HEhkYk+z0AQJ6pbGJo56b2ZlYptcqQN2/exNjYWGh413zo3LmTIVQN6ozBhw8fdHrxIiIiqFu3LikpKZw8eTLb3kuNoHh2gxBpaWk6gunfCwMDA/bs2UOFChVo1qwZN2/exN3dnT179iASiRg5ciQrV66kT58+/PzzzzrbT5w4kYYNGzJnzhzat2/P1KlTc3X8/4Vnd26pXr06169fp0yZMixdupTBgwezceNGHBwcGD96ZK6CSQADm7zYNlfbO0adX0/c/eOYetXDvExTrfU05bfcMqVpRi+wTf1BWNcfhDIxhuiLfxB1cRPJ/o8w8aiBLG9xYT0Tj+rYt5uGxNSGmJv7iDqzmsRnlzC0d2P04H7kszYmISWd6MRUlCp4GhRDQsr3e801adKE7du3k5qaypgxY9i3bx8bN27E3d1dyz+8Zs2arFu3juDgYIYOHcr27duZPXu2jn/4v5W1a9cyZcoUbt++zdChQzl37hxjx45lx44dOusWLlyYnTt3cuzYMcaMGUNycjLdu3fn7NmzVKxYEWNjY4yNjbl48SKjRo3iwoUL/Pzzz8yaNYtXr14xZcqUHA3XGRgYsGnTJiQSCf369aN9+/Y4Jb7L1fvCpERtLH26kBr6jsjTq0h+dx+bJiMxdNC1u1UoVfT3Kaj1Ov/S69ekZB1hvTxNRyIv8BPxd48QdXETIokUY/fKgHoQ06p6V6wqtyPo06T6jRs3BE95TftF27ZtadmyJba2tkgkEmxsbBgwYIDWc3Ds2DHi4uIQiURf7G+PjY2lSpUq7N27l759+zJv3jzMzMzw9fX9Yk/wvn37srWd1fPjIFLpc8c5pmvXrmzZskVnKAcQ+nY+Z7144cIFatSowfnz54X0v6urq055QENW68WIiAhsbGy01vH19eX8+fOEhYXhM/d8tuWWnKJIjOHjxqGIZSY49lgslEoS/rxE+ME5FOs8iWd/TAYgPDycwoULU69ePa0PlGLFiiGTybh7966Qof3111+ZPn06T58+FfpvEhISqFmzJn/++Sfnz58XxHOzcvfuXcqUKUPXrl21LCjv3btH2bJl6dOnj45TjZ7/Hzqvu8m1txG5Diy/hMaje3PP8t+0/V/xsM9M90quqFRw/kUoAZGJWsVCEZDf2pga7nZ0LJ+fwvZmn9vNN+Pl5YWtra0gCabn27lw4QINGzakXLlyrFmzRqf//Hvzv35fvAqJo87CS395n4Gr+iCWm+DQZX7G4GhKIpGre1CrVk0OHjwIqEvOBQoUYO7cuYwcqauHmZmQkBDMzc0xMjJi0KBBLFu2LNsM5dy5c/nll184e/asULlRKpVUqFCB9+/f4+/vr6NakZycTLFixejRowcTJ07UZyh/UPQl71wwY8YMTp06hY+PD3369KFYsWJ8/PiR3bt3c+XKFSwtLf9nxy5evDjVq1fH29sba2tr7ty5w549e4QG8hrudmy+6Z/jD7LgrWOQORdFauWIIj6K+IcnUaUmkaf1JK0JQWP3ysici/Jm91ymFhILTjkKhULLkxjUHxRNmzalbt26tGvXjidPnrB06VJ69eql1czdsWNHbt26RY8ePfjzzz+1tCdNTU1p3rw5oC4d16lTh02bNhEbG0vdunX5+PEjS5YswcjIiKFDh37j3dTzV5nRogS1F1z8rl+cGo/ub2VQjcLkMZUx6dBT0pWqXJ2bRCxCIgIXGxM2XPNT92Rms70K8I9MZPNNfzZe96NqoTzMaFGCfNa5H8pIS0tDJBJp6bZeuHCBhw8fCuL+ev4a1atX15H4ysrkyZOZMmUKr169Ytq0aRw4cACVSkXLli1ZtmwZxsYZz+2GDRvYvHkzT548ISYmhoIFCzJ48GDBd13zvvBf2h1DWxfMK7Qm6txaUkP9kJpaY1GlA6YltAe7lMnxRF/ZTuLL6ygSIpEYWyDPXxKrWr0QSQ0JWNIJn+49oGd5QW9YoVSRHhtO4IoeWFbrhEXF7CWQPocyNREDa2et4SUDIxNEhvLPtmElJCRgYGDwWYmyrzl0abh8+TK2trZabUBisRhfX19GjRrFxYsXqVOnjtY2c+bMQalUMnLkSCZOnJij4+j5/0cfUOYCZ2dnbt68ya+//srWrVuJjY3F2dmZBg0aaH3o/C8YMmQIhw4d4tSpU6SkpODi4sK0adMYNWoUAB3L52fjdb8c78/QoSCJz6+QHheBWGaM3NULy2qdMbB00FpPJJZg22YyFUOPsXjxYpKSkihbtqxQmstM48aN2bdvH1OmTGHw4MHY2toybtw4nQ+ABw8eALB+/XrWr9duJndxcRECSlB7Ws+bN48dO3Zw4sQJDA0NqVq1Kr/99ttnNTv1/O/JZ23MlKYejNn3+Lvtc2pTj28KzDLTrmx+KhfMw7j9j7n8OvyzgaEGzeNuNib4RyXyNlyth/m1YFTz+LW3EdRecJEpTT1oVzZ3pfrAwEBq165Np06dcHJy4vnz56xcuRIHBwcdgW89/3t8fX0pUKAAM2fO5N69e6xduxY7Ozutwb+v2a9q3hedFqulssIOzMS0ZF1MPWsR/+g0EUcXYuhQCENb9dCVMjWJ4K2jSQt/j2nJOhg6FESRGEvS65so4iIwtHejcq0GHDu4D8XyJVp6wwl/XgSVCpPi1XN9rfL8JUh8fpXYO4cxLlQOlSKViLtHSIyPy7aNZ8qUKYwaNQqRSIS3tzfTp0/PdogmJ6SkpGQbtGq+Q+/evasVUAYEBDBr1izWr1//3c0s9Hxf9CXvfxE/YhlSz7+TVyFxbL0ZwP4HgcQkpX19g68wqq47A2sU+vqKuUBzjudfhhIQkU3p2saYGkXsEIlgwzW/v3y8kXWLMKhGzkuqMTEx9OnTh6tXrxIWFoaJiQm1atVi1qxZgnSTnv89mgxljx49WLdunbC8ZcuWXLp0ifDwDFOHpKQknaCmfv36vHr1ijdv3gjLbBzyEhkSiH3HWcjzqZVBFIkxfFjWDXPvxljV7AlA9OWtxFzdjm2LcRi7V9Lar0ql4pd6RSmc9pZ69eqx79ARhl/LmNcOWjcIsdxUmBDPDYqEaMIPzSXZ/6GwTGxkjl3rX3m9ZqigshAQEEDv3r1p0aIFzs7OvH37lvnz5/PhwwcOHTr0WdvPL5W8hwwZwrJly3j79q2WmkH79u3ZsWMHgwYN0lL1aNOmDUFBQcIQpkgk0pe8f1D0Gcp/ET9iGfLfTEJKOn4RCaSmKzGUinG1Mcmx3M3fgeaL81t+Q1avXp3w8HCOX7qV4+zf15CIRUjFIqY29aBtLrN78PX+rsL2Zkxu6sFkPLJ9rnZv30L3ZjVx6LoAmeNf762bd+oltqayHF+LhYWFjnPW/5Ksfdl6tMmaFa5atSr79+8nNjYWc3NzQNd+NS0tDR8fH06ePKllWmEml2JUoDAmBUoK7RcSYwsMrJ1Jiw4W9pH44ioGdgW0gsms7wul0g0nJyfWb/wDVRG1cHlqmB9pYX5Yf/Lrzi0iAxlSm7yYmOXBqFBZVKlJxN4+SNi+GVzqW4sGldXakfnz5+fkyZNa23bu3JnixYszYsSIb/KR79WrFytXrsTX15cFCxZgb2/Prl272L9/P5ChaQxqnd+9e/dy8+bNb7pOPf+//LjffnpyzY9ahvw3IWS9/qaBjb+TmKQ0ai+4SPqnIPJbg0lNIFrJzeab+w9zi4lMquO8Exmvq5n6V5l46CmVCub5T75nnj17xq5du+jWrRuurq5ajy1fvhxjY2O6dev2t5xbTviSdrAmoMyN/WoJ94KsHuaj9QNMLDdFmZwhCZUeHSwEk597X4jFYjp27Miy5SuwKeCL2EBOwtMLiKSGmLhX+aZrDTswC5FIjF2bScIyo8IVCFrVhwWzptLg8P7PbqtRG5k1axYfPnwgb968uTp2yZIl2bZtG/369aNyZfW0uYODAwsXLqR///6CDmh6ejpDhgyhc+fOlC1b9huuUs//N3rZoH8Z7crmZ2TdIl9fMQeMquv+TZmjfyPvIxPpvO4mdRZeYvNNf/yzBJOgPbBRZ+ElOq+7yfu/MHn/IxEYnURIbDIp6cq/lJW0NDKgc3kXzgyrxuae5f/WwGvPvQ/ffZ/pShXj9n+/H3T/JJ49e8aUKVOyFaNevnz5D58Z/Zp2sMZ+NTw8nPnz53P06FFOnz7NsGHDAHQsUSUSCfmsjdncszynh1ajc3kX5AYSHZtRABcb4y++L7p06UJiQjxJL2+gUqlIeHYRo4JlEctz5iiVmbToYJLf3sWosHYbk8TIDFne4jy6c+ur+9BoDWd1dcoprVu3JigoiFu3bnH9+nX8/f0FqSGNFN0ff/zBixcv6Nu3L35+fsIfgLi4OPz8/L46cKXn/xd9QPkvZFCNwsxqWQKZVIxEnDuFSolYhEwqZnbLEt+9p+2fyo7bAdRecJFrb9Ue57kd2NhxOyBXx5s8efJ39S7OjgsXLiASiXJkdbbjdoBWYBz/6Az+sxqTHh2S6+NGJ6VRzNGMQna62dv09HRSU1Oz2Up7nV9++YV8+fJpad2JRCImT56c4/N4FRLHy5D4r6+YSxRKFZdfh/M6NO6771vP30tm+9W+ffvSsGFDateunaNBEU37hVc+S8q6WnN0cBX2969EwYIFcZNEcnFkDSY39cj2fQHg6elJKS8vEp5dIOX9UxSxYZh45twsITPKhE9ubapsHNaU6ahUurq/WXn79i2g1mf+VgwNDSlbtiwVKlTA0NCQM2fOAAh2rwEBAaSlpVG5cmUKFCgg/AF1sFmgQAFOnTr1zcfX8/3RB5T/UtqVzc+ZYT5UclNrV34tsNQ8XsnNhjPDfPSZyU8sPf+KMfsef1NmTqFUkZKuZMy+xyw9/+p/dIbZc+XKFcqWLYtcLqdgwYJalmlZ2bJlC97e3hgZGWFtbU27du14//49oM7MTjr0VFg3Jfg1MdfU2qMft44W/N8zo0iIJvzYIt4v7oT/3BYErRtE/OOzwuMTDz3l2oM/EYlEzJs3j4ULF1KwYEFkMhnPnj0jNTWViRMn4u3tjYWFBSYmJlStWpXz58+zfv165s6dS+vWrZk3b57WcRctWoRMJqNs2bLcvn37i/dn680AxNl8+imS4/m4aRgflnUlLUKdwUx8eYPQ3ZP5sLQL/nObE7iyF9FXt6NSZnzxRl/eiv+cZmrLO7GILTcyfkT06dMHS0tLwa4U4Pjx41StWhUTExPMzMxo1KgRT59m3OfcolQqWbRoESVKlEAul2Nra0v9+vV1jAY0vH37FpFIxIIFC3Qeu3btGiKRiO3btwPg7+/PgAEDcHd3x8jICBsbG9q0aaOVidy4caPgclKjRg1EIpHwg8XV1ZWnT59y8eJFYXlWK75/ArmxX/3ifsQiPJwsKJ3fig5t2/D40SOhfzAzWXudu3bpQvK7+8TeOYjYyBwjt+z1e7+G1MoJRGIS/rysdYz02HBSA5/xUybv7bCwMJ3tAwMDWb9+PSVLlszWkOJbePXqFStXrqRx48ZChrJdu3bs379f5w+oLTn3799P+fL6YdEfCX0P5b8YTbklp9OunSrk/+wv5P8PNEMjYWFhX7U++15oBjs2bNig09+143bAdxHKhtwPbPwVHj9+TN26dbG1tWXy5Mmkp6czadIkQSeuevXqqFQqkpKSmDt3LpMmTcLX15devXoRFhbGkiVLqFatGldu3GbI3hekKdSZDGVyPKG7JmNo60J6dDBSE0siTy5HJJZiWkotIaJMSyFk21jSoj5i5t0IqYUDic+vEHF0AcrkeMzLNiNdqWLuyeeAWtcvOTmZPn36IJPJsLa2JjY2lrVr19K+fXt69+5NXFwc69ato169etSoUQNnZ2cWLFiAn58fI0aMYNu2bbi5udGrVy+kUilz5syhZcuWvH37FgMDg2zv0fkXoWSpUKJIjCFkx68ok+Ow7zALAyv1l2X84zOIDIwwK9scsaGcZP9HxFzeiiolCauaPQAw8axBzNXtJPx5CYl3E86/DGUyHqSmprJnzx5atWoluN9s3ryZrl27Uq9ePWbPnk1iYiIrVqygSpUq3L9/X+g/zM3QV8+ePdm4cSMNGjSgV69epKenc/nyZW7cuKFjwgDg5uZG5cqV2bp1q1Cy1bB161bMzMxo1qwZALdv3+batWu0a9eOvHnz4ufnx4oVK6hevTrPnj3D2NiYatWqMWTIEBYvXsy4ceME3dlixYqxcOFCBg8ejKmpKePHjwdyrln4I5Eb+9WcMmrUKPbs2UObNm3o0aMH3t7eREZGcujQIVauXEmpUqWEdTt06MDIUb+Q9PI6pqUb6vjP5xSJsQWmJWsT//AUIdvHY+xeEVVqEnH3jqFMS2Xs2LHCur/88otQ6ndycsLPz49Vq1aRkJDAokWLtPbr7+8v+Ndrfsho9FRdXFzo3LmzsG7x4sVp06YN+fPn5927d6xYsQJra2tWrlwprFO0aFGKFi2a7TUUKFBAS15Oz4+BPqD8D/C1adcfeTL57yJrZu6vkvzhT3p1ncXwWD9ioqMoWbIkM2fOxMfH57sdQ8PEiRNRqVRcvnxZGDRo1aoVJUpkTOuLRCJCQkKYMmUK06ZNY9y4cYC6FBxsVZKVQ1vj6TsCi0oZgsmK+EisavZELDcj2f8heZqOIuzAbKIu/oGJZ01EEinxD06QFvEemyYjMPVQe/yalW5AyLYxRF/egmnJOiAz5rafuuz24cMHXr9+rVU6UygU+Pn5aQko9+7dm6JFi/L48WOsra21rjcgIIBXr14JQxTu7u40a9aMkydP0rhxY537E5+STkCW3lZFfBQhO8ajSk/FoeNspBYZfuJ5mo5CbCAT/m9WuiERJ5YSd/8oltU6I5IaYGDlhMy5KAlPL2Du3YSAiEQSUtI5dewoUVFRwpdpfHw8Q4YMoVevXlq+yF27dsXd3Z3Rv06hWJuRuRr6On/+PBs3bmTIkCFaX/IjRoz44kR/ly5d6Nu3L8+fPxe+uNPS0ti1axctW7YUdAEbNWpE69attbZt0qQJFStWZO/evXTu3Bk3NzeqVq3K4sWLqVOnjlYGsnnz5kyYMIE8efLQqVOnz57Pj47GfnXChAmMHDkSBwcH+vfvj62tLT169PimfZqamnL58mUmTZrE/v372bRpE3Z2dtSqVUtn2MXe3p6q1Wty8ewpTD1rfGaPOcO63kAM7AoQ//A00Rf/AMDQoTBrN26kWrVqwnp169Zl5cqVLFu2jKioKCwtLalWrRoTJkzgp59+0trnu3fv+PXXX7WWaf7v4+OjFVCWKlWKDRs2EBISQp48efD19WXKlCnY2dmh55+LPpL4j5HdtOt/GRcXF5KSknQyWeP2Pxammb8H4YfnYWBpj1PVNvxSwYVly5ZRv3591q5dy8KFC3n8+DHOzs788ssv2W7/NYcODa6urrx//54aNWrQunVrHj16hJOTE5MnT6ZevXocO6YuUUdHRwuZMF9fXx6+CmDa0T+5eP0mcTf3olIpib68maR397D0UUuVIJZg6tWAxOdXABCJpZiVrk/kyeWkBr9G5lyUpLd3kJhYYVI8I1AWSaSYeTch/NBcEt/cJi34NUmv1Y3/SUlJdOnShVmzZgnZGIlEIpQXlUol0dHR+Pn5Cd7uHz9+1Ooxbdu2LdbW1kyaNInJkydTtWpVQB30ZOd+MnDCDK1ATREXTuieqcL07ccNQ5AXKI1VjR5IzW21gkllSiIqRRqyfB5C8Gxor+7lNPGsSeTJ5aRFfcTAyhG/iAS2bt1Kvnz5hB8Op0+fJjo6mvbt22vpGwbHpmCctyj7jp4kf/42uXLp2bt3LyKRiEmTJuls86VeXF9fX37++We2bt3Kb7/9BsDJkycJDw/XCvwy9wimpaURGxtLoUKFsLS05N69e1qBwj+RyZMnZ9t/261bN52qRZMmTWjSpInOut27d9f6f3aDSUC2PcvW1tYsWbJES3vxc1iZGWNqmxfjfMX/0nCcSCzB3LsJ5t7qa9HoDXdqqV1Cbt++Pe3bt8/RPjWVj5ygaaf4FvTS2T8u+oBSz38akUgklCI1vAqJ4/Lr8M9s8W3YNvsFmZM7YUCj9tVo0KAB7u7udO/eHUdHx2xL05n5mkOHBoVCgVKp5MaNG/z888907dqV9evX061bt89mhz7nbyw2sUKZHE/I9nEY2ORHYmqN2FD7XkmtnAFIjwlB5lyU9JgwpFZOWvadAAY26qnQtOA3JL68gbxAadIiA6latSqPHz/Gx8eHZ8+e4eTkBMCmTZv4/fffef78OWlpGcLpBgYG2NvbM3PmTMLCwhg+fPhn5V4ge/cTldwcLDNcPsIOzgZFOkaFy2NUwBtFYgxxdw8TvHUMTt0XkR4XQfSlzSQHPEKVop3ZVGb6v3GxakSeWUPC0wtYVmlPRGQ0R44cYdiwYUJg9+qVupc2s+1cZkQy41wPfRnde4KTk5NO5vZrWFpa0qRJE7Zt2yYElFu3bsXZ2Vnr/JKSkpg5cyYbNmwgMDBQp4dQz/8PHz9+5OjRowwa/gtH/6IGbFb0esN6vgf6oRw9PzT+/v4UKlQIT09PIUMVHR3N0KFDyZcvHzKZjEKFCjF79mxBtiMtLU3QSstKbGwscrlcEML28/NDJBJpSZq06dCZgN9bkx4XTujeaQT83pr3izoQdW6d1iBGbpA5qW0iNQMbmiBWU5oeM2YMEyZMYPTo0Tx69AhAKBEGBgZy8eJFNmzYgIWFBYMHD2bWrFnUq1eP+fPnC8eYMWMGHz6oB0lat27N9OnTMTAwICIiApVKxd69e7M9N7OyzQF1AGnoUBjbtr9h124adi3H49Dld6SmNqTH5H6iOzskZjY49V2FRflWANSqU48rV66QnJwsuJRUrVqVbt26UbBgQRo1aoSdnR2nT5+mZs2aiMViUlNTMTU1pUWLFup9fkbuBaB06dLs3buX/v37s2bNGlq0aMHBnVu0V1Kon1MDm3yY/dQQyyrtse8wA0VcOLG39qt7QkPfYVmlI7atJ2LXbhqW1bupt800KSuRm2JcqCwJzy4AcOjAPlJSUrQCec1rdPPmzZw+fZqBczeo77XmT8sJOb6XmqGvFyHxJKSk53i7zHTp0oW3b99y7do14uLiOHToEO3bt0ecaWJp8ODBTJ8+HV9fX3bt2sWpU6c4ffo0NjY2OlI5uWXjxo1CsK1RHvhcdu+/yrt379iyZQvt27fHwMCAX4YOYkpTj+96DL3esJ7vgT6g1PPD8ubNG6pVq4aZmRkXLlzA3t6exMREfHx82LJlC126dGHx4sVUrlyZsWPHMnz4cECdxWrRogUHDhzQkaE5cOAAKSkptGvX7rPHDY5JBpWS0J0TERuZYVWzB/L8nsTe2k/8g5Of3S4nKJQqzj0PFs61Xr165M+fH1dXV0qVKsXw4cMFceTevXuzb98+qlSpQkqKWoS7devWyOVy1qxZg4+PD2/fvhWyRFu3bkUulyMSiUhJSWHdunX07dsXZ2dnIfMHCBPcGiRG6uMpE6Iw826MzN4NQ7sCSK0cUaUlI3cthSolEUVcBMrUZK1t06MCAZBa2H/625b0qCBUWSRJ0iLVga7UylErezl+7GgiIyNxd3fn3r17gPpHhFwuZ9++fZQqVQojIyNq164tTEmHhYVx4MABnXv74MEDnYDkwYMHWv18VatWJToqUifTaFqmKbE39vB+UQf1pLaJFQZWTiS+voUyKRabRsMwL9sM40LlMHL1Qiw31Tk+gIlnLdIjA0n5+JLNW7ZSunRpPDwyvvw1lop2dnaEWxThSIQtRq5ewh+5S0lhXY08U8rHLysEGFg6EB0eyrozj764XnbUr18fW1tbtm7dSrly5UhMTNQpYe/Zs4euXbvy+++/07p1a+rUqUOVKlWIjo7WWk8TGGqehz179ug8lpW1a9fm+pz/a1y8eJHOnTvz7t07Nm3ahIODg15vWM8Pib7kreeH5Pnz59SqVQtnZ2dOnjwplDHnz5/PmzdvuH//vlCq7du3L05OTsydO5cRI0aQL18+2rZty/r16zl16pTWYMbOnTtxc3PLdvIV1AMb8SnpqNJTMS5WFcvK6v4hs9IN+bjhZ+IfncLsp4Z/6drub59H/IMTAEJju0ql4vnz53h6elKjRg2WLFnCzJkzqVKlCo0bN2bYsGG8f/+e69evk5yczIoVK4T9xcTE8PbtW549e4aNjQ3m5uYcOHCA06dP4+Xlxfnz56lSpQpBQUGAWjImj62m+V1E4usbwr4ijurKyAioVMQ/OI5Yrh4GUSTFEX15K4jEBG8bi8TEEompNYqEKBL/vCz0UUZd2kzsNbXFYNieqTq79fZWy5+YmpoyZcoUQkJCSE1NJU+ePJiZmZGcnMzNmze5fv26MKjz+vVrQZNu1KhRABw8eFB9jExSJzKZjNevX/PTTz/h5+dHXJxaHzLp3EpUDpoJUhXxdw4BoEyK5cPijsL2EmE4J6O8qFKkEXdPVy4JwMjNG7GRObE39pD48j49J0/TerxevXqYm5szaeo0IqqNIutvekViDBLj3PU4G7tXJu7eUUaO+5W6P23XyjSpVKov9lGmpKTQvn17tm3bRnp6OjKZjJIlS2qtI5FIdPrWlixZgkKhna03MVGLbMfH6+p7mpiY6ASgenJGdr2coNYbzmMqY9Khp4K9Y075q7aner7Of3EAVp+h1PPD8eTJE3x8fHB1deXMmTNaPXG7d++matWqWFlZER4eLvypXbs2CoWCS5cuAeoetTx58mh5JUdFRXH69Gnatm372WP7RyQI/zYrrR04yvIWJz2TD++3EPfwFPEPTjBgxBit5ampqaSmpjJgwACk0owPnUaNGuHm5samTZsEh44pU6YA6sltUE85d+/eHZFIREREBJGRkaSmphIRESF4XT948ED4wpdIJISHhQJgYO9GatAL4XhGRSpiXLQKYrkZYrM86uBRLAaxBAzkxNzYQ8LTCwAEb/0FZWIMIqkhFhXV0+CafYUf/p2oc+uIvXuYhCfnATAuWhkjd7XVmqGjOrvSvG0nTp06hYeHB6GhocyePVuwuXNyciIqKoqQkBBq1qxJ8eLFSUlJQaVScfXqVeGcNcNFmuB81qxZwmPh4eHI5XKqVq3KlClTqF+/PgBhD88RfWWb1nNgkCe/+joBk1L1MXAojCI+GsQSwo8sIOLUCoLWDSLg9zakhaqFnWPvHkWZlmHhmPLhGcqkWBJfXAOVkpmTxgnai66urpibm7NixQpuXLvC69/bEjC/Df6zmxKwoC3vl3RWB+hZiDq/gfdL1JqeH5Z1JezgbJTJGa9TuUtJTDxqEH37EBV8arN48WIWLlxIq1atWLZsmbBefHw8mzZt4uLFiwwYMAA7Ozvy5s1Lly5dCA8PJzo6GqVSqaON2bhxYzZv3kydOnUQiUQ0bdqUxYsXY2NjI+x7xowZNGzYEIlEwrZt6vu6Z88eatSogYWFBXfu3OHhw4f07t2bHTt2cO7cOYAf2orxn4Beb/jH4lVIHJMPPcVn7nk8J5+k0ZIrtFhxjUZLruA5+SQ+c88z+dBTXoX8O40P9AGlnh+OJk2aYGZmxsmTJ4XgQsOrV684ceIEtra2Wn807gqhoepASSqV0qpVKw4ePCiUi/ft20daWtoXA8rUdHWpViQ11MkUZfXh/RJZS8MaEp6cQ2rtTPeBIzAyMhKGNNLT1T1w7u7uvHjxQmsbY2NjVCqV4NAxfvx4HB0dhW0fPHjA06dPKV68ODY2Nri6ugqZvMOHD7N+/XpcXV2FwDxztkmREI3EPEOyJ+nNbVLD/BDJjDG0dcG8Yhus6/RDLDOBtGSMCvxEesynoDo9FbGROWKZMfGPTmFcpCImn6SCUCmJe3BS3Xearr7/1nUHkB4VhCx/SWybjQagrFcJ6tSpQ3R0NJaWlgQEBNCwYUMKFChAXFwcCQnqwMnIyIgyZcoglUoRiUSC+DEgZKA10kPXr18XHnNzc+PNmzcUKFCAwYMHa0mdKBOihX+blW2OWG6KyEAOIhEJD08gNjTCunZvzCu0QWJqRfz946RFBiJzdsesTFP1/Xp5jYgjGX2sBnnyYVFFneE0sHXBvd1YlixZgoGBgSCJUrZWEwydiiIykKt7ckUiUCpQJkShSk0S9qVxLEkL88PcuwnWdftjWqo+6dHBKFMyAkoAm0ZDsazRg9CP7xk5ahQzZswgKSmJSpUqkZUBAwbw7NkzJk6cyJgxYyhatCjOzurhKgMDA2bPns2vv/7Ks2fPqFKlCiNGjKBLly7cv38fUOucnjlzRvBcBnW7RY0aNVi5cqWQidy5cyehoaFMmjSJSZMmYWZmJuiLTp2qzlRn/vH0OXLioPRfJqu9o4uNMVnDShFft3fU8+381615Nfy78696/pG0atWKTZs2sXXrVvr27av1mFKppE6dOp+V18kcaLRr145Vq1Zx/Phxmjdvzq5duyhatKiWWHBWDKWffmOJcv5bK/ryVmKubsex13Jiru0k+c0dJBb2OPVYjEqpIOb6LhIenyU9LhxUKiSm1khQUq9ePQ4cOEBAQIarytGjRwVpn+LFizNt2jShZKkJBOPi4rCzs+Phw4cATJkyhfT0dGbOnMngwYNxd3enSZMmLFiwgKpVq9K0aVPGjh0r9CBmHqRQxkcI/5aY2yGSSHHsugBEYi25HGP3ykRf2kzC0/NY1epD5Am1xInY2IL0iPfYNB6OqWdNkt7eJeHpecRyU+QuJbFtMU64PxmokFraU8T3F8aPHY2FmQmBgYEEBgaydOlSNm3apHV/LSwsiIiIYMmSJfj5+XHp0iUh2yqTydi3bx8Af/75p3APDx48yJQpU4iLixME3osVKyYEMtqIUCREZTznKhUSc1tSg56TFvEe87LNcOzyO8q0FK17Yl27DzHXdxN98Q/SY0KRWtghMbHCuHB5Yq5sxbx8K6LFFkyfPp309HQePHhAvnz5cC5dA4c2ExHJtU0EIk4sJeHpeVTpQxBJDVDEqX2Szbwbkx4bRuKtA6iU6RgXroBIph0MiMQSDPPkR2pkgSI+gqSkJEQiETJZxvnOmzeP7t278/z5c/bv38/QoUO5fPkyly9fJjg4GENDQwoUKMCgQYMAtTamm5sbP/30E23atCE4OJguXbpw8uRJevbsSXR0NHv27OHChQv4+/szatQoYZiqZs2alCpVitatWzN//nzCw8OpWLEir1+/plixYoJl3oULF3BxcQHUsjPv3r0TsupSqVR4zu/evYuXlxfPnz9nwoQJnDt3jsTERDw9PZk4cSJNmzbN5nn9b6HXG/572HE7QGg7gNxb805p6kG7f0mmWP8K0/PDofkyGTBgAGZmZnTo0EF4rGDBgsTHxwsZyS9RrVo1HB0d2blzJ1WqVOHcuXOCU8fncLUx+ebzDj8wC6mVE5Y+XdH03EUcW0zCk7MYu1fGvFwL4h6cJC30LROH9mH6b1M5ceIEVatWFYK9+fPnY2trS1hYGFKplDZt2mBvb49IJKJJkyZ0796dOXPmCJlYQBCgPn36NKAun2v64G7duoW/vz+Ojo58+PABDw8PHj15hjJdnfExr+BLyscXpPg/xMqnKxHHFxG0dgCmJWojMbNBERdBst8DRAZyTErUJP7BCRTx6kAHqSHpMSGIpIbI8pcgOeAxUec3YOhYGImJlY7Xd+DKXkIGLnBlL9w9vQAYP348bm5ugj9wVhQKBRKJRLhOlUrFkydPhH9rekM1gblKpSIxUf3LXzPx/+LFC8LCwqhfvz4nTqj7VyUSCea1+5IeFUzcrX2IDI2FbKrY0BhVeipiAznRFzZiaOuKUcGMvltlajKq9BRkzsUAFakhbwUx9PiHJxEZGmFcpBIh28eTGhxMhw4d8PHx4datW6zbsAHjwm+xbaF2JPmctqVIqs4yx905hIFNPiyqdCA98gNx94+THhuGfYeZwo+N+CfniDiyALnbT+Rv0Is+FfNm676jue6GDRtSpUoV5s2bx/nz51EoFDg5OaFQKAR9zLNnz5KcnIyJiQlbtmxBIpHg4+PD9u3bCQsLY+rUqchkMtauXcv79++FFozXr18DCAFnv379iIuLY+nSpZiYmHDp0iWUSqXWJHlWsnNQevr0KZUrV8bZ2ZkxY8ZgYmLCrl27aN68OXv37hWm/vX8c/SG/+mB79Lzr77ZTU3xqe91zL7HhMenMKhG9vJt/yT+Oc+cnv8MIpGI1atXExcXR9euXTE1NRUyEL6+vkyePJmTJ09Sr149re2io6MxNTUVymhisZjWrVuzfv16ypUrR3p6+hfL3aD+IDaVSfmWQoSBXQFsm44S/p8a8paEJ2cxLVUXmwZDAJAX+AnlgwMcOXSQ4UN/5uTJkwwfPlwIhqytrenTpw/Tp0/nypUruLq68vHjR9q2bcuff/7JL7/8gkKhYOTIkWzfvp0PHz4QERGBo6OjIIzs7+8vBJcJCQlcunSJjh074ufnh4GhTAgmAYwKeCExtSTF/yEy56I4dJ5HzNUdxN45hCo18VNcrA6Ok/3UJU+hhF2nP5Enl6FSphO0vLtwfbYtxhJ5aiWpYf7q50FuitlPjZE5F0WFiNhb+0gLecPTK+rAbsOGDSxatCjbgPL169ckJCTg5uamJQ+UlpZGo0aN8PX1xdzcXCuY0Az5AFqe3lmnl7v0HcI581rq83YuSvjRhfBJFkqlVGBStAqmpRsSumMC8Y9OYZAnP9GXt5L0+qZO64MyJYHEVzdJi3hP3IOTmHk3IuXDU1I/vqT7wGGsX6oui3fo2oO9r9OJvvgHwTt+JfXji89qW2paLpTJ8aQEv0FkKMe4UHksKrcn5spWkl7fwrhweZSpSUSdXvXpdTYYBTDw53qC+86MGTO0XHnS0tJo06YNHTt25O7du1y8eBHImP7P7FqkQXPvNS0I3t7eDBkyBKVSydSpU/H19cXMTJ1x1UhX+fv74+/vL2TSASHQj4mJ0eqNzkp2Dkq1a9cmf/783L59W8i8DhgwgCpVqjB69Oj/dEC5ceNGunfvzrt377R+PPyICFbAuXCDygkXLlygRo0anD9//v/FK/7vtub9/77enKAPKPX8kIjFYrZs2ULz5s3x9fXl2LFj1KxZk1GjRnHo0CEaN25Mt27d8Pb2JiEhgcePH7Nnzx78/Py0fMDbtm3LkiVLmDRpEiVKlBA8hr+Eg4Wc0K+upYuZVwOt/ye9VfvZmpfN+KIL3TEeBwe1R/TRo0eZN28ed+7cwdXVlZiYGCIjIzlz5gwLFy5k1qxZwsTslClTcHd3p1SpUjg5OfHLL79gamrKpEmTSEhIEL6ohwwZQuPGjQkJCRECqLZt29K2bVuuXLnCg/v3kJjaoIiPwKbhUOQuJUkN8xPOz9DeDZuGQwhc1QeJuR1mZZqqpX6khqQGvyb6wi1AWRkAAQAASURBVEaMCvyEVfVupAS9UAudi6XY1B9EauhbYm/uJeLoQnUv4qcSvXnZZlr3xaJEdRzD7nB1jdrZpXTp0oIGYWYSExNp06YNYrFYCBIvXLiAWCwmT548HDlyRFj348ePODqq72uNGjUEK8kRI0YAMHXqVFJTUwkICBA0SMWijK8yY/dKGN45RErgnyCW4twnw1PY0LEIaVHBhOz8FWVSHOYVWmNgnReRoRxFXIR6Ml6lIvL0KpSJ0RgVLINJiTqEbhuLvEBpho1R288lJCTw4F0IBraugIq00LdYVumoc3/JIrlkUakdSKQkv7tP5JnViE0sQSwh6c1tjAuXJ/ndfZQpCZgU90GRqJaQuv8qgKIO5pQvX57z58+Tlf79+7N+/XqmTp0qvF+KFi1KcnIy7du3Z86cOTRu3JiBAwdquUhpxNP3799PYmIi169fJygoSEtrU9Oa0ahRI4YOHSosf/36Nf3792fKlCla/ZfZ0apVK61gMjIyknPnzjF16lTi4uKEaX1QT85PmjSJwMBAoRdUz4/H+8hExu1/zOXX4Ug+I8z+OTeoH63fM6s1b8LTCygSY3Q+63LDxENPqVQwzw93rblBH1Dq+WExMDBgz549NGjQgGbNmnHmzBnKly/PxYsXmTFjBrt37+aPP/7A3NycIkWKMGXKFEHDUUOlSpXIly8f79+//2p2UoNbHhNyr+gHUktth5v0mFAQiZFaOQrLVCpwsjEj3tISf39/rfVLlizJwIEDmTVrFqNHj8bExARvb29u3LhBVJTa+/rVq1c8evRIJ4uk+RJ3dXWlTp06wmBP3rx5CQoKYtSoUUilUpzzF+B9bBqKTL2TaZGBWvtKDniMMikW2xbjkOf3zLieTBPuadHBhGwfh8TcHpEIjItUwLhIBaQW9kQcXYDc5fN9qlKxiO2zRuK583diY2OzXUehUNCuXTuePXuGra2tUO7WXKsmG6bB1tYWmUxGSkoKb968EVoiNFmwZs3UH/R37twRtlm/fBGO3dww+GSdCCAykEEWsW6x3BRl8CsU8ZHYNBqGaYlawmNJ7+4L/847YD0AyrQUgjePQiw3wapGD2aP/ZljR48Iz6EG05J1tb6APqcgIHcpqdanrNyO5A9/ErJlFCJDY/XrC0iLUpf8Q7aPE7apujhj+6yDbRKJhLx58wqWg7t378bX1xdDQ0MCAgKYPXs2bdq0YceOHTrn0rZtWxYtWsSDBw9wcHAQpJ3q1KkjrKPRPHV0dNRqTSlUqBCgtjvNanWaFY0klIbXr1+jUqn49ddfdfyiNYSGhv5nA8rOnTvTrl07rZ7ZH4lv7TO8+iacWvMv0s/Hjb7VCn6xHF6tWjWSkpKEgcT/JVmteROeXSQ1zP8vBZTpShXj9j9mc8/yX1/5B0UfUOr5YcjOU9fIyEjH/9bU1JQZM2YwY8aMr+5TJBJpDb1kxdXVVUdjb9/OrXRed5NrbyO0Pvgsq3bEsmrHrLvIOJb0Mx9knzJvErGI9vMPsbln+c+W+3x9ffH19RX+v379em7cyNCJzDyUFBMTQ9u2bZFKpfj4+DBq1ChhKEnj/GNvby8EUcOGDWPhwoVYNxxK5LGFgFr3UCMDlHG+mt62z2svJjw6gyo9DYmRGcrkjGyRUeHywn4/h8aVw8bG5rMBZe/evTly5Ahbt27NdgAr69SvRCKhVKlS3Lp1i8jISJ31w8LCsi/l+l2HTAElOvOxn0elUhH3Sb8yM5Enl5EeFYh9xzlEH57FSVUyo0ePpmjRooQlwfDf13/a7svalqp03clmQ1uXT89Pptfsp9evTeMRSEzVr6vpzTxxzaPuB846SW1oaKjVv6jRxtT02jo6OnLs2DHu3LlDmTJltO6dkZERd+/epVChQiiVSvz9/VEqlTRo0IBTp04hkUiE1+CRI0eIj4/XyUZ+7jnPTGb/cMgYJBs5cqROq4sGTcD6XyIhIQETExMkEskXHaP+Tv5Kn6FSBakKJYvPvWbxude4fKEcLhaLdWx0/xf8VWteVXoqSKQ69rQKpYrLr8N5HRpHIbucl/p/JPSyQXr0ZMP38LWVWtiBSkl6pDqDpPHLDQkJITo6Wphu1aDJwmTm5Uv1B7GmLyrzUNK7d+9QKpU0atSIs2fPcuTIEU6cOEH37t11JqUBfvnlF6xtbIg6o+6nS3p7l+DNo5CaawdasrzFEMtNCT+ygNhb+4m9dYDgP0aSOYhRJEZ/CmSyZBoUnywAVdlnIDSuHCqVShj+0GBlZUV0dDSjRo1iw4YNLFiwgFatWvHx40et9UxMTAgKCmL+/Pns2LGDmzdvAuqpeFDrLQ4dOpTVq1cTEBDAs2fPcHdXW19mLqurVCrs5cqvavcBIJYgtXQk6tw6Yq7tIvbuYUK2j1NP7mci8fVtEp6cw8jNm5R3d0gK+0CrVq1wdnZGpVLRvkUj5HnVzjlxD05+9v4CpEWofwhFX9tJ3L1jxN45TMiO8YAIVVqKMASUGqweglHER2Lk6oWxqxftWzSidu3a1K5d+6v9VRptzJiYGD58+ED16tWxsrKiWrVqFC1aVNA9FW6FWMzAgQOFYLJ///6cO3dOKK1rgtWIiAg8PDyYPHkya9asYeHChQCCxWZucHNTB/0GBgbCdWX9kzVr/U/B39+fAQMG4O7ujpGRETY2NrRp00bL8UljESsSiXR0RCHDwlKzzeTJk4X1s/7JrP2ZkJAgmEHIZDLc3d2ZN2+ezueQSCRi0KBBHDhwAE9PT2QyGR4eHsKA2+euxczCitH9u+sM6OWGD8t7ELp7Cknv7nF9Xk+mtlS7T/kMmKUlu6Npm8mcgKhevTqenp7cvXuXSpUqYWRkRIECBVi5cqXOcVJSUpg0aRKFChVCJpORL18+fvnlF0F2TsPWmwFanxnBW8eQ9OY2ithQ/Gc1xn9WY94vUice4u4dUy+b2+LT8g4EzGtJwOymKJLiiDq3jqB1Awn4vTUB89sQumsS87af0r0HHz7QvHlzTExMsLOzY9iwYTrnpeHmzZvUr18fCwsLjI2N8fHx0dLtBbVSyNChQ3F1dUUmk2FnZ0edOnUEt7JvRZ+h1PO38a2N5NWrVyc8PFyY9P1fcPVNeK6cJ7LDyK0M0Rf/IPbOQWzqD2JqUw+q/lRcyCQ0atRIa/2goCD2799Py5YtAXUm548//sDLywsHBwcgYyhp4MCBbNu2jTp16gj2jFu2bCElJQV7e3udIAzUJcgL589TqWEb4j+8IOndPczLtUBqak3E8YwaqcTIHNvWk4g6t5boS1sQy00w8aiB3LUUoTsnAmBg5QSoUCTGIBJnZEYSnqkHPMRGZig1mopJscjMLLVcOVasWKHVBwfqYHn37t0EBQUxbtw4fv75Z5YuXarjyNK6dWs2bdrEuHHjSElJEeRtdu/eDah7Afft28fy5csBdQA6Z84c4d+ZaVmnGqtCc/I8i7BrPZHIM6uIubEbkcQA4yIVMfNuzMf1g4W1lJ8ys4kvrqnFzYFVq1axatUqXFxceNesGYrnnwIvucln7y+AxEwd6Kd8eEbKh2eIDeQY2BXApGRtEh6exMhNPXWuyUomvriCedlmuNiZa5UGP5edzUyHDh2YM2cOb968YcmSJSQnJ6NUKgkICNAqZ0dGRmJtbU3Hjh0ZPXo0BQsWpHHjxqxYsULnC2769OncuHGDpUuXEh8fL/Rq1q1bNwf3Wxs7OzuqV6/OqlWrGDx4sNAvm5tr/FG5ffs2165do127duTNmxc/Pz9WrFhB9erVefbsmVa7B6gHkWxtbZk4caIwJJWVli1b6mRs7969y8KFCwU9VJVKRdOmTTl//jw9e/bEy8uLkydPMmrUKAIDA1mwQNs168qVK1pC+c+ePaNBA3Xf+MyZMxkzZozWtaSJDPl96SpSX1wl8cU15AW9sa7TDwNLh2zPOWzfDJTpKdj7TiH+0RkiPlVRAJJiQ0l6ox6ws6jcgcSX17i0cjwVYxTMG9oZ448PhN7otm3b0q9fP6E1IioqioYNG+Lr60v79u3ZtWsX/fv3x9DQkB49egDqDHjTpk25cuUKffr0oVixYjx+/JgFCxbw8uVLLavX8y9Ctb4bLCq1JWzvK7W7mkcNxAYyDB0KoVKkE31VLfIvMTIDsQTTUvVJDnhEiv9D0qODSXx5A+OilZFaOqBIiCL+wQnWjunKxDYVhdaRpKQkatWqRUBAAEOGDMHJyYnNmzcL5gCZOXfuHA0aNMDb25tJkyYhFovZsGEDNWvW5PLly5QrVw6Afv36sWfPHgYNGkTx4sWJiIjgypUr/Pnnn1pavblFH1Dq0ZOFrA3X34qhvRsmnrWIf3ACVUoCr61bEh4eTkJCAs2bN6dGjRpa6xcpUoSePXty+/Zt7O3tWb9+PSEhIWzYsEFYZ9SoUcybN4/ly5fj6OiIl5cXp06dQqVSkZycjJ+fH0uXLhWySlk9y0uUKMHQRTuY0bEKYmMrJKbWiAxkOPVbq9UDKs9bDMcuv+tck8sY9SCMgZ0rsbf2kx4TgplXA+IenCA1+DXxD9XT0PbtfkNqYIhCqeLDiu60bNWGwMulWX5bzpUrV9ixY4fQ26rB29ubO3fuCBnIWrVq8fjxY8zMzHjz5g0hISHY29szc+ZMNm/ejFKppHbt2sTFxVG4cGHhy/WPP/6gbNmyAHh6evL69Wv+/PNPVqxYQVJSEgYGBqSlpeHi4kI+W3NKp6TyKE7deyY1s8Gp1/Jsn0+DPPmwbzdNZ7nmngCYlqyNacnaSMQiKuS34ObcrsTExDBs2DDMzc2pWbMmBinqXkrLSu0wLVn7s/vSTHkbWDsjlplgXKwK6RGBxN0/hixvcaG9ICXoBYaORUgNfs3HjT9TsG5TVq9+RUBAAEePHqVy5cosXbqUbt26ceHCBS2P7cxYWlri4uIi/FALDAykSpUqDB06lDJlyuDs7MzUqVO5dOkSNWrUQKVSkS9fPvr06UPevHmpUqWK1v4KFCgg2GKCOstWoEABIZOcW5YtW0aVKlUoUaIEvXv3xs3NjZCQEK5fv86HDx+0psn/STRq1IjWrVtrLWvSpAkVK1Zk7969dO7cGRcXF1avXk2fPn2wtrbm7NmzXyxxlyxZUstCMzw8nPHjx1OiRAkmTVIPwx06dIhz584xbdo0QU5t4MCBtGnThkWLFjFo0CDBex4ydF7r1KlDly5dCAgIYPz48XTp0oUmTZpoXUt8fDxOhYqjSIrD9KdGxN87SmrgC0K2jsGxx2IkRtp9vSpFOkl+97Hy6aq13KJqR2JvH0aVHIuZd1MMHQtjUrQy5uWaE7SmH2FnN/BzWjphe6bg5eUFQOXKlZk2bZogrRYUFMTvv//O8OHDAbVVb/ny5Rk7diydO3fGwMCAbdu2cebMGS5evKj1Ovb09KRfv35cu3aNSpUqEZ+STkAWMXJZ3uKo0lMQGRpj22S4sDwt4r1gniCSGuLYcxliAxnRynRS/B9iaOuKU99VWqVvU4+aBK7px4pVa/htivp5Wr16NS9fvmTXrl20adMGULcEZdVTVqlU9OvXjxo1anD8+HGhGtO3b188PDyYMGGCoP969OhRevfuze+/Z3zGf07bOTfoS956/jY6d+5MUlKSTun37yZrw/VfwabhECyqdCTl40smjh1FcnIyBQsWzHbgoXDhwuzcuZNjx44xZswY0tLS2Llzp1bPmLGxMR8/fmTs2LGYmJgIWYSQkJBsh5Kyo0vlgtg0Go5ILCby5DLCD80lJSB32V6JkTkO3RZg4lGDpNe3iDy9kqTXtzAtWQf7DjNxtbMQXDm6d+nM04f3mDx5MkOHDuX27dv88ssvwiS2Bnt7dUCbkJDAxo0bOXfuHGFhYcTFxQm/nkGdae3ZsyeGhoacOXNGEDbXlHYzZ6pMTEywtLTk4MGDjBgxgvHjx+Pg4ICtrS2BgYF07tyZqqahSHNS9s4FUrGIWW1Kc/jwYby8vJg5cyZTpkyhcOHCrFm34es7yIR1nX4Y5MlHzOWtxD85i0nxati2+hWRSIQyJZHU0HfkaTQM+3bTkJjacOfwH/z888/s2LEDLy8vunfv/k3X4OzszJkzZ0hJSaFOnTqEh4fTtGlT8ufPz9q1a1EqlTx58oRq1apx7ty5HL32/grFixfnzp07NGrUiI0bNzJw4EBWrlyJWCxm4sSJX9/BD0rmftG0tDQiIiIoVKgQlpaWQglSJBIJg0y9e/fOVb+kQqGgffv2xMXFsX//fiFLf+zYMSQSCUOGDNFaf8SIEahUKo4fP661XDNgVaRIETp16sS4ceMwNzfHxsYGDw8PrWuZOnsBcSHvsWkyAssqHRDLTJAXLIsiLoIPizqQleT3T1GlJmFUsKz2vXErg9hQjsTUGqvavTH1rIFIaohYZoyJZ01SQ94QeXYNUltXGvZUZyiHDBnC2LFjWbVqFYmJiUilUi2DDENDQ/r27UtoaCh3794F1Ja+xYoVo2jRovj7+wuWvjVr1gQQ2jn8IxJ0HHA0VYmsZhiKhIw+chPPWlqmCAAiqYEQTKqUChRJsYgM5RhYO3PtVobc2bFjx3B0dNT60WFsbEyfPn209vfgwQNevXpFhw4diIiIEK4hISGBWrVqCfqvoP7xePPmTUHD93uhz1Dq+dv4ERvJv6Xh+kvDOiKxBMsq7bGs0h6A9K0DKFq0qM40ZuZ+qa+VBDMPJWmyPuPHj9fxRc7aB6WhsL0Z9Ro04pp7hb9U1pea5SFPw5+F/4tFUCqvJVt6ltcqua5Zsybb7TW9dJqhkSlTpuj0632O1atXa2krfg5Nf+XXcLodwJj0Wdk+lqfxsBztIzOawSOsiwmaoJnptPaGztBXVjTZTgB5fk9s6g/SWUcsM8Zl1AH1Onb5qVOr5henRDdu3CgMbGUl6/AbqNsQsn7p1K5dm4sXL9KiRQshmM9M9erVs33tZTcAl/VcslsnMxpf+38akydPZsqUKbx48YKpU6dy+PBhDA0N6devH2PHjmXs2LGsXr1aMDjQEBOjDkr8/PyEHwaaCfjg4GDGjh3L6dOnCQlR9yj27t2bNWvWaLUQtW/fnjNnzmBkZETp0qVxd3dn2LBh+Pv74+TkpNN7qpFWy6pCkT9/hkaixonJyspKS70gKSmJmTNn8vvMmQCE7syYyBeJxUgt7bNVM0h6cxuDPPl1lDIAVColUktHHVkxddsNpEcGYl23P5tuZFQ7BgwYwPTp0wkLC8PJyUmn1UUzOLZp0yYqVqxI/vz5CQgI+GzbxMSJE5k0aRJKlQqRsSVmpephUbkdMVd3CC5gqpR4/Gc1RmJuhzx/CRKenBW2j7mylWT/hzh0zPiMUamUxN0+RNz9o+oe00xyYRdPf6Bdu3bMnTsXf39/ChUqpHP9mr5wDRor3q5dtbO8mdHov86ZM4euXbuSL18+vL29adiwIV26dBF6lb8VfYZSz99G1kZygOXLl+Ph4YFMJsPJyYmBAwcK3sBZefbsGTVq1MDY2BhnZ2ehT06Dpkl7165dTJ8+nbx58yKXy6lVq5bg5pGVrA3XWVEp0oi+tIWPG34mYIEvAb+3InjLLyT7f11oSCIWEZ+iHlq5cuUK5cqVQy6X4+bmxh9//KGz/tu3b2nTpg3W1tYYGxtToUIFjh49+tXjZMXHx0enPDKjRQmkYhGBq/sSsjN7GZbcYiARs7hd6Rw7XXz8+BGRSCRoG/6dtCubn5F1i3x9xRygGTz6Epr7/z3RDH39L5k6dSrDhw/Hy8tLENLXk3Patm2LUqlk1qxZlC9fnmnTplGzZk0WL16Mu7s7vXr1ErJ95ubmWjapGjRZwFatWrF//366d+8uaM4mJCRoqVoMGTKE3bt3Y29vz4QJE5g1axZeXl46wzQ5QfPjf+PGjZiYmGBkZERQUBBv3rwR1hk8eDDTpk1DqVQiL1Aau7a/YdduGmIjc1CpMC5WDcgQ79eQ9PaO0BOcmZDt41DGhZP64Rmhe6bqSJxpMHQohCLTDxEnJyfy5s0r6Ph+jeDgYExMTBg4cCA9e/bk9OnT/Prrr7i5uVGjRg2USiV58+ZFJpOjSk0i5uoOIk+vxNi9Ela1egMgksqwaTwC69q9MStdH/OKGWodpt6NsaikLVsXc20XUefWIsvnibF7JUCELH8JxCZW2Ds6cvbsWapVqyb0kCekpPM0KIb7AVE8DYohOU27t1zzWpk7dy6nT5/O9o9GccHX15e3b9+yZMkSnJycmDt3Lh4eHjpZ6dyiz1Dq+WHQ/IqvXbs2/fv358WLF6xYsYLbt29z9epVLe26qKgo6tevT8uWLfH19WXPnj2MHj2aEiVKCI3iGmbNmoVYLGbkyJHExMQwZ84cOnbsmG32KmvDdVaUKYnEPzqFcbFqmHrVQ5maRPzD04TsnIhj1/kY2n/+F55CqSI5TcHr169p3bo1PXv2pGvXrqxfv14Qadd8mYSEhFCpUiUSExMZMmQINjY2bNq0iaZNm7Jnz55cuYJ07tyZ3r178+TJEzw91bqS+ayN6VIonQmRgTofdN+KkJX7CiEhIezZs4eVK1dSsWJFnaGDv4tBNQqTx1Qm6OXlJnsrEYuQikVag0dfIp+1MVOaejBm3+O/cspa5PT+/xWyy2LqyTnlypVj1apVAPTp0wdXV1du3rwp9A+D2vHLyclJZ2gtM9HR0Vy7do25c+cycuRINm7cyIYNG9i2bZuQnbx79y5LlizBysqKd+/eaZXWNf12Z86cIS4uTitL+fz5c4BsW5EqVaqEr68vBQoUICgoiCFDhnD58mVWrFhB//792bNnD63a+LJn1051n2+B0qjSUwVnKamZDaBWJBB/8qNPiw4mPeIDRnUHCMcRGcgwKVEbef4SRJ1bjyo9hWT/hwRvHoVj90VIzW0F/VUAiak16VHqQcTAKHWw6ujoyPPnz4mOjhbklTRo1DM0g2KaAHnJkiVCJrBy5cpMnToVDw8PSpUqxZ07d7h87QY1faoiL1Se+PsnMC/TFOPCFYg6uwYkBph6ZvTFq9LTiL2+CwB5Pk+MCpTWupeJL64iy18Sy8rtCVzZC8tqnbGo5MuHZV1xK1CAFcuXUbp0acxtnQh4+AyPSScECTqA2JuHAdh49R3OxbyFfldzc/McWRM7OjoyYMAABgwYQGhoKD/99BPTp0/X+f7MDfoMpZ4fgrCwMGbOnEndunU5efIkgwYNYsmSJSxatIjbt2+zZcsWrfWDgoKYPn06CxcupH///hw/fhwHB4dsJUmSk5O5du0aQ4cOZdKkScycOZNbt27pTIln13CdFbHcFOf+67Cu1Quz0g2xKN8Kxy7zEBuZEnv38FevM12h4sWLF+zevZvp06czcOBATpw4gaGhodbwzaxZswgJCeHYsWNMmzaNYcOGceXKFVxcXBg+fHi2mYvP0aZNG+Ryuc49DL13BkO5McZFKuV4X58jJ1k5DX/++SejRo2iUKFCny2//l20K5ufM8N8qOSm/uL7mqSQ5vFKbjacGeaTK+u0/++sqJ6/n169egn/lkgklCmjzsoVLpzh42xpaYmVldUXS/9GRkYYGhpy4cIFHcF8UEtnNW/eHFAPM2XV9RSJRDRs2BCFQoG5ublgvwmwYMECRCIR0dHRiEQi4XMyPDycwoULs2jRIkFtwtDQEAsLC8aNG0dSUhISiYR7D9Ri/8rkBMIOzeX9grZCOTfprbpnMbPGatLrWyAxIPzYIvznNufD8h6khr7Fpt5ATEvUQmQgQ5WWjCotBWVSLDHXdqJMSSThyTnEJmqFg6hz64X9nXgcxJQpU3j8+DFxcXGkp6fj6ekptJ6kpqayatUqbG1theC7devWBAUFabXnGBkZ8ezZM549e0anTp2IiYmhRPGiSI1MkZhYACoSnmeS48lGN/ZLiD7pySa+uPYpe1uFuIenUMRFkJSSypQzgYgsHIlLUZAaG0HCi4xjKdOSiXugzjKf+jOEOgsvsehBOi4F3Jg3b162mdmwsDBA3VOraaXQYGdnh5OT02eliHKKPkOp54fgzJkzpKamMnToUC3R5d69ezNu3DiOHj2qNVxgamqqZfdmaGhIuXLlsvWD7t69u5Z7QtWqVQF1SVmTsYPsG66zopbIUZd+VColyuQEUCmRORQmNfjNlzf+RMEiRYVzAPUQibu7u9a5Hzt2jHLlymlNHJqamtKnTx/Gjh3Ls2fPtM79S1hYWNCsWTO2b9/OzJkzEYlEKBQKdu7cSZtWLWjcruz/S1ZOQ/Xq1QWryB+RfNbGbO5ZPsNz+GUoARHZeA7bGFOjiB2dKuT/ZiHi/8+sqJ6/n8x9iKB+b0okEqEsXbx4ca5fv054ePgX+8tlMhmzZ89mxIgR2NvbC32VYWFhuLq6MmXKFMFTPSgoSOvHZMGCBalYsSJNmjTBx8dH0LUcOHAgp06d4uDBgwwdOpRz587h4eEhfM68f/8eiURC9+7dcXBw4OnTpyxevBhjY2MSEhK4e/cujRs3Ftp34h+eRCwzVRs+fJIWU336IZzZBCL2xl5QpCFzKITcpSUpQS+Ivb6btPD32LWaAIDU2pn0yEBEBkYkvrhGSuBzFAnRmJaoTfyjU8J+AU4e2MnWB2eF7KOhoSEfP35k8uTJvHjxgp07d/LgwQNWr14t3OOOHTsSGBhIv379OH/+PJUrVyYpKUmQHvvll1+0FAvkKhUSszykhbwFD3VWUqVIJfLsGmSORRAZyBEbagfxWTEqVI6Yq9tRxEcBKoJWZQzZ3L11g7u36gNgYOuC1MqRiCPzSQ1+jcTEioSn5xFJ1X34yk+fGdf9olBU7oPf7kl4eHjQvXt3nJ2dCQwM5Pz585ibm3P48GHi4uLImzcvrVu3plSpUpiamnLmzBlu376tNfX9LegDSj0/BJoG8KyNxoaGhri5uek0iOfNm1enSdnKyopHj3R7GbN+iGtcarL+sk9Nz1nWL/7xWWJv7Sct4gMo04XlUgvdhvLssHfUtYfL2tzu7+9P+fK6wxWZG+ZzGlACdOnShZ07d3L58mWqVavGmTNnBL/vemXzU7lgnq/67GrQPF7JzeaH9Nn9XhS2N2NyUw8m40FCSjp+EQmkpisxlIpxtTHJca/o12inv///GbILEuVyOb6+vmzdupXk5GQqV65MqVKlePDgwRf3NXToUJo0acKBAweE6kbt2rW5cOGCkI0CBH1GDV27dqVixYqIxWKOHDlCmTJleP78uSB0PXfuXDp27CjYc2ooUaKEjiD41q1bBYOCyMhIFi1axM0793jx7Amq1GQMnIthXbsPIZ/0VVWftGklpuq+6ZTA5yjiI5Dl88C2xVgAzH5qhMTYkthb+4TedAMrJ9IjA1Ep01ElJSE2NidPs19QKdLUAWV6RmYt8t0T6tVvwJPHj9TmBfb2bNq0icGDBzNq1Cjs7e1ZunQpvXv3FiokJiYmHDhwgAULFvDHH3+wf/9+VCqV4Mj1+++/4+npiUgkok3btqQplUhMrUjPZGFrYOdGwqMzxN0+iMTcjjyNhn7x+bOo6IsqLVlwyDLIkx9Tr/rEP1RL+1jVUmezxQbqKffI06uIu3sYkVSGiUd1jNy8Cd01SdifQqlCkteTPB3mYvX6iKD/6uDgQPny5YVJd2NjYwYMGMCpU6fYt28fSqWSQoUKsXz5cvr37//Fc/4a+oBSzz+Sz/16z65MlNN1DaVf7wCJf3KeiKMLMCpcAfPyLdVagWIJsdd3kRaVvRdzVrJa4X3ufL4n9erVw97eni1btlCtWjW2bNmCg4OD0Gvz/5mV+ydiIpPi4fS/k8XR3///Bs+DYzFJlAg/SjSsX79ea73q1atTpEgRnZaQDRs2CGVyUGcbR4wYwYgRI3j16hVeXl78/vvvbNmyhcaNG9OmTRv2798vlL+zYmpqyuzZs2nevDmnTp2iVi21T/3SpUtRKpW0bavur8762ZScnEx8fDy3b98WsqO2trZYWlrSskULZj57gtTaGfu2U4EMn/v3nySDlElxiGXGxN1XB1OWVbto7d+8XAtib+0TxMw1SORmiGRGOPdWB7apYf7C/uQuJXEZc4TgrWN48PABwUFBQknb29uba9euZXsPNBgYGPDLL78IeoyWlpZ4eHhw//59OnbsiJ2dHcnJycTFxOBSVEZQjCGKTMNFJh7VsSjfMuMefQqG8zQfg0lRbY1WUMsGWdXsidjEkujzG7BrOR6ptTPmZZpme352rXWHJzPr1mowtHcj2n4Iy34vkW3lwtDQkDlz5ugMsX4P9AGlnh8CTQP4ixcvtKQLUlNTeffuXY6ajP8qrjYmiNAxE9Qi8cVVpJYO2LYcr5Uhjbm8NcfHMTb8ulSSi4sLL1680Fn+pYb5LyGRSOjQoQMbN25k9uzZHDhwIFs9u/+vrJye7NHf/38Xmh8IG66+A6D9mhuCYL0ISHoSTKpCyauQOB1v6i+RmJio411dsGBBzMzMhD64unXrYmZmxsyZM6lfv77WuiqVSvj80tj07dy5Uwgod+7ciZeXlyCvA+pBlmXLlrFjxw5BNFyDsbEx3t7eQMYP8/TID6R8fIXMUd0fmhbxAWWSto97yke11I3MWbsyhViMWGbC/7F3ltFRnV0bvmYiE3dBQhIIECC4BSdooFiw4K5FCgWKS5DiDoVCcQgUp1AsUIJ7cQ2WBALE3Ue+H9M5ZDITw0rfb661WG3OPMdH9tnP3vctjVffjyw5BvMybYS/De1dQKyHNDYMhVymlGmr35OYfcrMnap7+969e2pC7/khq6yd6pquWrUKmUxGVWdrwoKfq03dfywmpesQd3YrsRd3YtdmnIY9rDwtUUMIPj9MP/yQOm52X3UGQ/ftpOOboGnTphgaGrJy5UpatGghfKg2btxIfHy8hk3hl8BUoo+zjQkhuTTmfHA1UKD8SVA6laSHPUHPIm/rN309Ub68o7/77juWL1/OlStXqF27NqCUBFm/fj2urq4f5TbSq1cvli1bxpAhQ0hKSlKrQdXGl87K6cgd3fX/7/I6JkWthCE+NVNjjAJlI6BUpqDZ8vPUL2mX7xKGoKAgmjRpgq+vL+XKlUNfX5+DBw8SHh4uuGNZWFiwbNkyBg4cSI0aNejevTvW1tbcvXuXlJQUQc9TIpHg4+PDwYMHWbNmDeHh4Vy6dIm5c+eq7bNFixYEBwdTr149OnbsSHJyMidOnCAiIgJvb2+1OnVQlgBF7J2JhWd7RGJ9Em4cAj0DkH24FrKESECk1r0M8H77OOSZacogNCOVjMhgAESGJljW8VUbK5aYIk9NIGL3NEzKNiAzMgSpNJMGDRrw+PFjoqOjqVq1Kr/++qtaU1RetG7dWqg9XbNmDe/fv+f06dPY2tpiKtHHVJpImlXxfG8vJwysC2PVoBdx57YSHh+BcelaiA2NkcaFkxJ0BbPKLdQyn/lFKlcw+eD9XHVpPze6gFLHN4G9vT2TJk1i5syZtGjRgrZt2/L06VPWrFlDjRo18gx+PheN3B3Yfi0kxxo245I1SAm6TOT+nzEuWQNp3HuSbh/HwK4Y8ow0reuo0BOLMDLIn5D7xIkT2bVrFy1btuSHH37AxsaGrVu38urVK/bv36/WuJRfqlSpQvny5QVXiE/xbNWhQ4d2fr8RKjRZAflutLr8Mpqmy84xs61HnmOLFStGt27d+Ouvv9i+fTv6+vqUKVOGPXv20LFjR2HcgAEDcHBwYP78+cyePRsDAwPKlCnDjz+qi/V36dKFrVu38tdff/H48WMUCoUw3Q3KevNXr17h5ubGs2fPuHr1KqamppQvX56IiAit2T+7DlNIuLyb+Mu7QaHAqFh55FYZpIcqLTIzIkNQZCq/M6UxbzGwKyasa+xWg8Sbh5XSQLJM5NJ00NPHpGw99P7p7AalLrA8LQmJc0VkqUnEnFqHnokl48ZPZM4sP5o1a0ZERARGRkb4+fkxcOBApFIpcrlcIwDOzooVK0hISBBqK728vDh9+jTe3t6kpKQQE/GOVq18uZPn3coby9qdMbApSsKNQ8RfVAql61nYYVy8CialPi4glMkVXHgexfOIxK9WHqMLKHV8M/j5+WFvb8/q1av58ccfsbGxYfDgwcydO1dNg/JL0sPTmS1XgnN83bRCU2TJsSTePkHqq1sY2jlj22YcKU8ukhaau6agTK7ALJ9Tlo6Ojly+fJkJEyawatUq0tLSqFixIkeOHPmkbG3v3r0ZP368IISsQ4eOz8fqwGcsDgjSWJ6Tm5Zd6x/hHycm2T9d/hMP3GfcjN8Y0eiDlFB2ByFbW1tWr16dr2Nq06aN4LWdE02bNsXGxobdu3fz+PFjatasKdRGwoc69F69egle4KD0/r548aLWbdarWJpbhSerBdQR+2YL/5/64gZiY3PkqYmE75kO/9gP6pvbCU07jr4zMXKpSMLNw8SeXk/G2w/XNuHaAWIDlbWZ+hb22HWfi0Iu483yLiCXYmBgwJYtWyhevDgVK1YkLi4ONzc3goOD+fvvv6lcuTK1atWiY8eONG/enJSUFMqXL8/06dNp27YtVlZWHDx4kMKFC/P+/XsmT57MunXrSE5O5tChQwBMGtCZ14bFmGF3TFBpSH1xk/ir+8gIf4HI0PifLnYpph5egPK9YOxWnYg900kPe4JIIcPAsRSWDXtTqOfH1TUm3TtF0oNAMqNCkKcnY2BVGPNqbbCq3oodV0Pxy+Mh5cmTJ0yfPp3AwECSkpJwdnamU6dO/PzzzwU6Dl1AqeNfQ+UAkLVJZfjw4QwfPjzX9XISV85ewF4QCzgVpRzNqV/SLkdbPJFIhGVtXyxrq0+7mJSsoTE2K3piEXVK2LI9NETr69rOqUSJEuzduzfX7Wo7Fz8/P7XuzKwYGhoiEono0UO7VaQOHf81RCIRM2bMEN7zW7ZsoV+/frx69UrNgvBL8/uNUK3BpDberOmPob0LDp1naH19cUAQ9maSryYHZWBgQEZGBtu3b0cmk7F48WLOnj1Lo0aNCAwMxMvLiwYNGrBw4UIyMzMpWrQoAQEBvHr1KsdtTm1VFt9tD3PM0OpbOmLTbCixgVuQJURiYF8cSbHypIc9If3NI/StCmPkosx8GjkpA6LMyGAiD8zFqHhlEm7905CSxUNbFvkKeYZSd3jhwoWCXu+9e/ewsLBg8ODBSCQSbGxsePjwIXXr1qVo0aJMnDgRU1NT9uzZg4+PD/v37xfMI7p06cKKFSto1aoVTk5OeHh4cO7cOUQiEStXrmT37t2CSsPxA78TfWwFBvbOWNbqjNjIlIzwF6S+/FsIKDNC7/F+93TsXMsybuo0tl8NJez6ccJ3TaZQjwVIimSrJ80HibePYWDnosxmisWkPr9OTMAaUMgJtPbFj5wDynv37lG/fn0MDAwEsf0XL15w5MgRXUCp47/Dt2S9l5W57SvQdNm5T/K5zs7XsMXLC4VCwcaNG2nYsKGGlJIOHTo+ntcxKcw4/PCzbvNrN1WYmpqSlJSESCTC19dXw552586d+Pj4sGTJEiQSCc2bN+f48eMUKVJE6/aKWufuBmVaVqnFa+RWg8Qbf5B8/zQpTy+jZ2aNgWMJpNFhKKSZiPQNMHAsjsjQBANbJ9JePyDl5U2QyzAqUY20l3+jkCnl21JCHiASiUhJSWHevHmkpipliiQSCY8fP1Y71qZNm+Ls7MyNGzeQSJSajsOGDaNevXpMmDBBCCgrV64srPPy5UuSkpKYOnUqiYmJrF69mvj4eIrZWLK6UxmKjt5I0dIVKN53IW8SpEKDp0KhQAQUszHm4bZ11G/QkHN/nWLrlRAUyQ8pVKYp7zYMI+78Dhy7fsji5hfH7vMRG0iEvy2qtSF893QSbhwitFprktOlOTb0jRw5EoVCwa1bt9R+F+bPn691fG7oAkodX51v1XpPxX/VFi8nkpOTOXz4MIGBgdy/f58//vjjXzkOHTq+Br169aJr165CkPA1mHzwvlAz+bn42k0VISEhiMViobwoe0BZtGhRHB0diYyMJDg4WFie2wxJVzuISkoXMrcmpWuT+lzd8lZPYoJVvW5Y1euGPD0FhSyT1Fe3iD6yhMzo1xg6lkAkEiNxKos8LYlio3aSERXKuw3DsGrQi/evbmNWsSl6YhFmsc8oVqECf/+tdOQJDg6mePHidO/eXS2YjImJ4cyZM8yaNYvExEQ1m0tvb29mzJhBWFgYRYt+0AzetGkTnTt3Fv4+ePAgK1asICQkhIoVK3Lq1CmSkxLZsWAmPj7eWlUagh7dp+r4EAbOm8WCP67zS+AHMwwj10okPQhEoZBnaf7MH1mDSXlaMgq5FCPn8sS9uoUsLZng6GStDX6RkZGcP3+eUaNGaSQZVI2xWRUB8kIXUOr46qis92rWrKlmdfUt0bWGs9oX4afwb9viRUZG0r17d6ysrJg8eTJt22rXOdOh43+BrHIvefE5pJmehSdy4XnUxxxqrnztpoovFYBndYNK0RInZUSGEHd+u1JzUi5Te02eRefRyMmDuIs7kWemExuoFHKXFCqJoUNx0l8/xKpUNeJfP6RtlmYiFVnrQVUlEQDTpk1j2jRNfUeAiIgItYAyL4OMFy+UwaHKcEKbSsOzZ0qZpD59+mjdp+qc9YzMcnxdG2lvHhF/wZ/0t09QZKrbJ8rTk3M07VC5s+VmkhEZGYmDg0O+jkMXUOr46nzr1nufG0Weho5fltxqRnXo+BL4+fkxc+ZMnj59yqxZszhy5AiGhoYMHTqUWbNm8ebNG0aMGEFgYCAmJib89NNPjB07Vlg/IyODOXPmcPToUZ4/f45UKqVq1arMmjWLRo0a5bpvbTWUf/zxB+vXr+f27dtERUdjZuOARcVmUNlHsAWEf8TjbUxo5O5AD0/nHLUhsx7fwydBZGRmYujohlX9nkLdX35Ie/2Q2DMbyIgIRt/MBst63TGr0OTDgPQkeg8ZSeLzv3n16hVisZi6desyf/58KlWqJAxT1TuqmmrWr19PQkIC3t7ebNy4ESMjIyZMmMDOnTtJSUmhc+fO/Prrr2pBpKurK15eXhq16Cq8vLwEz29VxsrFxUXIVkZERDBp0iT+/PNP4uPjcXd3Z8yYMfTp00dwg2o35BiRKG0Z9SwdiL+yB1l8BOjpo29dBHlqAnZtfyLj/XPizm4h6V4AKOQYuVRE4lQO5FKlu07CB31KiVM50t48ZEhFCWOjotRsbVVk9zJXMW7cOLy9vbW+VrJkSbW/C2KmAfDjjz9y7tw5goODSUtLw8XFBQ8PZS2jXZMBiO21Sw6JDYy0Ls+JzNh3hO+agoGtE9aNB6JvYQd6BqS+uEHijT9AociXaQfA5cuXCQgIYPTo0VhZWQEIdaj5QRdQ6vgkRCIRw4cPz3fH4X+FghTY50VeBfaqH8AbN26ouWBow8vLC8i5MUmHjm+JLl26ULZsWebPn8/Ro0eZM2cONjY2rFu3jsaNG7NgwQL8/f0ZN24cNWrUoEGDBgAkJCSwYcMGunXrxqBBg0hMTGTjxo14e3tz/fp1tbq2/LBlyxbEhsYUrteJ9AQZ6SH3CAnYjEVcPNaN+wvjFEBITArbr4Ww5UpwjtqQWY8vwaUBUXHxJN09Rfju6RTusxRDxxLkRWbsOyIPzcOsYnPMyjch6d4poo8ux7BQSaVgN5Ae847bF04xelBvihcvTnh4OOvWraNhw4Y8evRIo35x3rx5GBsbM3HiRJ4/f86qVaswMDBALBYTGxuLn58fV69eFbqfp0+fnu9rOGXKFOLj43nz5g3Lli0DlE47AKmpqXh5efH8+XNGjBhB8eLF2bt3L3379iUuLo5Ro0ZRzMaE7p4u3N4Hhm9ukfgsFaNi5UmOP4NIX4IsPgKxiQXGrpWRxildx5IfnEHf0lEZUBYpDXr6pL95iCwtGavGAwCQFCtP2oNTSCIeAwjvofxgYGDw2Uwz3NzcAHjw4AElS5bkxo0b1K9fn379+mFkZMTt27fZuHEjAAoDI4xdK3+W/aY+vw6yTBw6TkPf8kMmUeXUA6i5MmVFZSLy4MEDQBlQzpw5k759+woBpb193vrKKnQBpY480fbU8r/M/0KBvQ4d3wI1a9Zk3bp1AEIH6dixY5k3bx4TJkwAoFu3bhQpUoRNmzYJwYC1tTXBwcFqWoGDBg2iTJkyrFq1Svhhzi/txyzg54AXSOUKzOUKzKt8h+jEahJvH8WqQS9E+uqyZKqGvKzakF2zPBCqji9DIeaA30ksAfNK3oT9NpSEv49g992oPI9JGvMGxx7zMSqmnG40KVufN7/0Jfn+aQz/CZYM7V1xHPgrU/1aClPxvXr1okyZMmzcuFFjulYqlXLu3DmhDjIyMpLff/+dFi1acOyY0uZw2LBhPH/+nE2bNhUooGzWrBlFixYlNjZWQxd4/fr1PH78mB07dggKEkOHDqVhw4ZMnTqV/v37Y27+IdsrTYrm7YsXnA48h2/HM1jX6kjMuW0opBkoZJmCv3VWRPqGSAqXJvnReeSJUZgWr4xEX8zkoZ0YcmgeK1euxM3NjcKFC+frfDw9PVm3bh0jR47UWCcyMrJAgRRoOhNdvHhRKKlIz5RRp5UvRjaFWfbzdOIu7caknBdiQ/XMqSwlXnBSyjda6i3lackk3z8NQFFr4xzLOOzt7WnQoAGbNm1izJgxaq+paifzWz4CUHB1ZB3/71A9tcTFxf3bh/JV+JIF9p9KQEAAAQEBn+GIdOj48mR1JtHT06N69eooFAoGDBggLLeyssLd3V2o51KNVQWTcrmcmJgYpFIp1atX59atWwU6htWBz5h+7BnpUjkyuQJ5egqylHgkxTxQZKaTGf06x3VlcgXpUjkTD9xndeAzjeMLiU5GrpAjS01EIZchKVSKjPcvctxeVgzsnIVgEkDPxBIDm6Jk/pOdA6XfMyIxwdHJyGQyoqOjMTMzw93dXet16N27t5pmr6enJwqFgv79+6uN8/T05PXr10il0jyPs1GjRgQFBdGzZ09OnjzJ69evmTZtGgqFgtevX9OuXTvGjh2LWCzm3bt3H87PwIBKlSqRlJTEnj171LZZrVo1bGxsMNQTYW1tjdHzMwAoMlJ5v20cClmGMDb+0i5C5rcmZH5rFAoF0pg3oGdA2MaRnP6xIYO9q+Lu7k5QUBAGBgb4+/vj7u6OkZFRrvqbs2fPRqFQUKFCBSZNmsQPP/yAq6sr+vr6FCpUiFatWvHwYf4TCypnouvXr+NSpiLFWw7Cud0oarXuRoPWnWm16iLbHyq7zmXJcbzdMIy4C/4k3jlB3AV/3vtPJProcmF7CmkGcRf8CVs3mJBF7XmzqhcRB34mM/bDNZZnpJERrny/ha3tz+uVPQjf48fbzaMQ/xOY1i5ui0gkYsSIERw6dIjy5csjkUjw8PDgxIkTrFy5EoVCQZkyZfjpp58AZc2pWCxGJBKpNWDlhS6g1KEjC6oC+88pGQTqBfafgqGhYZ4ODzp0fG68vLxyLdzPieyNDJaWlhgZGWFnZ4erqyt9+/YVlr958waRSCSUc2zdupWKFStiZGSEra0t9vb2HD16lPj4+HzvX1W6khEZQsT+OYQu8+X1Ml/erOxB9JElgHrjR24sDghi941Q4e+tW7fi06QOoYs68GZFN96s7EHqixso0pN57z+RtxuG5bo9bVatYiMz5GlJwt8KhZyE64do5lkBfX197OzssLe35969e1qvg7brDUpnnezL5XJ5vq9lly5dkMvllClTBolEwpw5c1i+fLmQtbS1tcXMzIyffvqJ8+fPC+upMn9hYWFq21Nl/ywtLfnzzz9xLuakfEGWSfW6DSndeogw1rh0bWxbj8Wu9Vicayinp12cleejmvFR1U0mJiYyevRoevbsyaxZs4SGmffvPwTpKkqVKsXNmzdp1aoVa9euZdWqVbx//54yZcrQvXt3Hj16RL169YiKyl/D1euYFM5SHvuO04iX6RNyejsxgZtJfxuEYRF3Ul/dIu7CdkSGxjh2nY2kUCkSbx0l5tQ6ku7/hZ6pNeY1fABQyGVE7J1J/KVdGBYqiU3jAZhXb4siPZnMSKWWsUKhIHL/LJLv/4WRaxXEZjbIUxNIe3kTfXMbLKormy99qijLIi5evMiwYcPo2rUrCxcuJC0tjY4dO+Lk5MTVq1epXbu28DBib29Pu3bt2L59e4EytbqAUkeu+Pn5qT21iEQirU8t2p58snP79m1atmyJhYUFZmZmNGnShKtXr6qN2bJlCyKRiIsXL/LDDz9gb2+PlZUVQ4YMISMjg7i4OHr37o21tTXW1taMHz9eoyh68eLF1KlTB1tbW4yNjalWrRr79u3TOJ5Tp05Rr149rKyshKf+/iPG5MtrOztprx8QeXAeb9b0I2SRD29+6UvM6d+QZ+m40xOL2HE1NMdtpKSkMGTIEGxtbbGwsKB3797CF6IKLy8voY4SlM0B06dPp1q1alhaWmJqakr9+vUJDAxUWy84OBiRSMTixYtZv349bm5uSCQSatSowY0bNzSO5cmTJ/j6+mJvb4+xsTHu7u5MmTJFbUx+7qeO/99omy7LT3PDjh076Nu3L25ubmzcuJETJ05w6tQpGjdunO8mgbdxqcw4/BB5WhLhOyeRGfEKq3o9sO80HYeuc7Dy6vvPjvPfdDD98ENex6QIx+fsWhzb737AwXcmDl3nYORSMd8NcDlKw2RZP/7yHmLPbKBilWqAMuN76tQpPDw8tF6HnK5tQRtKslOzZk127tyJi4sL9vb2ODk5MXbsWPr168eaNWuwtrbGw8MDY2NjNm3alON2OnXqBHwIdAHq1KnDlStXAGWW79L+jTzcMpXgN8pMXK/v6nNu3TSC983n2UFlNq1vb3WnL5VaSFhYGCdOnGDatGmMHz+ey5cvY2RkpJb9zkqJEiX45ZdfEIlEDBo0iLS0NB48eMD27du5evUqCoWCoKAgFAqFRn27yjjDy8uL32+E0nTZOS6/jMaklCeFei7Cedx+CnWZTWb4C2ID1hKxezoowKHjNIycK2DfYTLFRu3E5aeDOA3bhL3PBIxdlY1WyQ/OkBZyF+vGA7FvNx7zaq2xrN0Zx25zMf7HijH12TXSQu5h1aAnjl1nU2zENlwmHMHEvS7pbx5j4lKBnhuu4lVd+SD4+PFjLly4wNSpUxk1ahQHDx4kJSWFXbt24eHhwV9//SX4t1+/fp1Dhw7Rs2dPTE21119qQ1dDqSNXOnToQFBQELt27WLZsmXY2dkB6oW6Fy9e5MCBAwwbNgxzc3NWrlxJx44dCQ0NxdbWFoCHDx9Sv359LCwsGD9+PAYGBqxbt07oHPT0VNdaGzlyJIUKFWLmzJlcvXqV9evXY2VlxeXLl3F2dmbu3LkcO3aMRYsWUb58eXr37i2su2LFCtq2bUuPHj3IyMjg999/p3Pnzvz555+CbeHDhw9p3bo1FStWZNasWUgkEp4/f85v+wOwKulT4OuU8uQSCmk65lVaIja2IONtEIl/H0GWGIV9+0mAMksZGBSRo2vBiBEjsLKyws/Pj6dPn7J27VpCQkI4e/ZsjjpgBW1e2LlzJ4mJiQwZMgSRSMTChQvp0KEDL1++FJ5O8+OcUND7qUNHQdi3bx8lSpTgwIEDau/9rLZ/ebHo5BOkcglpofeRpyZg334yRs4fsqzSOM2sVV6oSlcSjyiP74+DB6kwM0DQcYi/4F/gbeZGytNLGDlXZOmiRXgcOYS7uztNmzYlLi5O+C7+GqhKF1QJherVq/PmzRuhdMHFxYV79+5plC6opsCzyu/kF1XdX2FLY60aitqoXbs21apVE/52dnamXbt2HDlyBJlMpjWwPnXqFHFxcXTr1k0tG6mnp4enp6fGw3l2crLbBGVZg0PXOSgy0kgPe0xa8B3k//iX50bK08uIjS0wr645Za/6PKS+vAkiMebV1MdY1GxPytNLpL38m7lzugnLmzZtKjQOAVSsWBELC4scg+2PQRdQ6siVihUrUrVqVXbt2oWPj49WK7PHjx/z6NEj4c3aqFEjKlWqxK5duxgxYgQAU6dOJTMzk4sXLwqdZb1798bd3Z3x48cLchQqHB0dOXbsGCKRSCgiX7RoEUOGDGHt2rXAhyL/TZs2qQWUQUFBajIRI0aMoGrVqixdulQIKE+dOkVGRgbHjx8XvpiT0qXs0/f6KJEfK6++auKyVG6BvnVh4s5tQxofIXTfhUan5OhaYGhoyF9//SUEdi4uLowfP54jR47kqB1Z0OaF0NBQnj17Jmioubu7065dO06ePEnr1q2B/DknFPR+6tBREFQ//FlFla9du8aVK1fy7fJ0IzgWfSvHLE0LHz7ZOTV+5IWqdMVdqtyWiaEezjYmhMSkkP72KelhT7ROZX8sIpEYiYEYkyzfF3v37iUsLExD1uZTyS1bqbrmpqamxMfHq5UuAHz33XcEBARgbW0t1GVKpVJOn1Y2hhTkAVMlORUZGSksy0vSSEWpUqU0lpUuXZqUlBQiIyMpVKiQxusqbcjGjRtr3aaFhUWO+8tLDUQsMRG6uU1K1yL54Vki98+hcN/luSoBZMa9QyGT8m7TSIoMXKN1jDQ+Aj1zW8QS9UZPA1tlOYCnvUytCVTb58ba2lpjFuxT0E156/hk8nrykclkBAQE4OPjIwQfoKyv6d69OxcvXiQhIUFtmwMGDFDLTKiKy7MW86uK/LM/YWUNJmNjY4mPj6d+/fpqReyqbvU//vhDmDoKiU7+aMVINaeCjDRl0X/RsoCCjPAPx6cAgqOTtW5j8ODBagX133//Pfr6+kJ3pjYK2rzQpUsXIZiED7VHqmuock7o379/js4JH3M/dXy7qOrOXF1dkUgkODg40KxZM63vn0ePHtGoUSNMTEwoWrQoCxcu1BiTnp4uZHWKFClCsWLFGD9+POnp6Rpjc6J169a8fPmS9u3bM2nSJEqUKEGtWrUAZT3cpUuX1MbPnDmTgwcPqi0Ti0X//IDPRmRoTNSfy0i4fpCE64d4v20c5PFpj792gPfbx/F6eTdCF3fg3eZRJD+5iJ5YhFGJGsLxWQSfI/7cViJ2T8fATr1WMf39c95vH0fo4g68WTuAxNvqn2WFLJO48zt4t3kUoct8SX/zkIzwl4Lki0mpmsS/uCOUHR06dIihQ4cKn7vBgwdjaGioVre4Y8cOqlWrhrGxMcOHDxeuWVZUgdndu3dp0KABJiYmuQYWqgC/WrVqxMXFcePGDRQKBUeOHBGOo2zZsjx58oR3796xevVqmjZtKrjtqOSFVBRE2/BLozqW7du3c+rUKY1/OTmLfYwaiIl7HQCSH5/PY+SnU6aQeiD8qWUP+UEXUP7LJKdLefg2ntuhsTx8G09yet5dd98aeT35REZGkpKSgru7pul92bJlkcvlvH6t3mlZkOLy7F+Ef/75J7Vq1cLIyAgbGxvs7e1Zu3atWgF6ly5dqFu3LgMHDsTR0ZGuXbvy56H9KApQT5UVaXwEUX8u4/Xyrrxe2ok3K3sQvnMioHQqyEpOrgXZn67NzMwoXLhwnl12BWleyMvtIb/OCQW9nzq+XYYOHcratWvp2LEja9asYdy4cRgbG/P48WO1cbGxsbRo0YJKlSqxZMkSypQpw4QJEzh+/LgwRi6X07ZtWy5fvgwos9o+Pj4sW7aMLlocTHKib9++zJ07l2vXrjF//nwiIiIYMGAA1atXRy6X07hxY65fvy6Mt7CwwN9ffbpZLleQ/Ogs+laFcfCdhZ6ZNXHnd5Bw/QBGrpWxbtQv12NIvHkYA0c3rOr3wKpBbxDrEXVoPolB14ktVoe5c+dy9+5dAjbOJ+XlLWzbjMOw0IfPsDwtiYg9fhg6lsTKqx/65rbEnFxD0t0PKg3y9BSS7gUgca6AtVdf9CwdUcilhO+eTkb4Syxq+TLg+5FCwBgWFsbRo0dxcnLiyZMnbNu2jYMHDwpyS/v376d3796UKlWKpUuX0rx5c0AZ8GlT6ejSpQuVK1dm+fLlGBnlLag9bNgwunfvzrNnz0hPT2fkyJGA8iH+7NmzODo6EhcXx9ixY4mJieGHH34A0Nh3frJiWRMKT58+zZermirbmJWgoCBMTExybC5RJUMcHBxo2rSpxr+sNetZ+Rg1EIU0ExTyPBvBDKwKo5Cm5xrs6Vs6IEuM1thWP48PM1wFJb8Wizke0yetreOjeBaeiP+1UAKfRhAak6L2nJxfp4ZviS/x5FOQ4vKs+7lw4QJt27alQYMGrFmzhsKFC2NgYMDmzZvZuXOnMM7Y2Jjz588TGBjI0aNHOXHiBLt378bIpSIOXWYjEudfe0shlxG+exry1EQsanXCwMYJkaERssRooo8uUyuyB/LtWpAfVM0BPj4+/PTTTzg4OKCnp8e8efMEK7CsfI2nVB3/LY4ePcqgQYNYsmSJsGz8+PEa496+fcu2bdvo1UvZEDFgwABcXFzYuHEjLVu2BJQ1uqdPn+bcuXPUq1dPWLd8+fIMHTqUS5cuaZ22PHv2rOD2AsoftokTJ7J582YqV67M8ePHP9SOpabi4eHB1KlTCQgIQKFQMHnyZJYuXUp8fDyduvVk5lN7pCnxpL66jWVtX4ycylK49xKN/bpM/DPH61Jk8Dq1mQfzaq15t2UUiTcO8rpkDX7w+4lJk5T10b02XlM2ZJSsAcB7/4nIkmKwbjwAi5rtletXacG7rWOJPbcNp+FbEOnpo5DLKPr9RkR6Bv+M+Q55WhJhvw0l6dYR2o2czYYBKwkeP4bixYszfPhwqlevTuHChblx4waHDx8Wgsbg4GDc3NyYM2cOkydPBpSzHA8ePKBKlSqsWbNGWO7q6kpISAg///wzQ4YoO6oHDx6sdv5eXl7MmDGDmTNnCstMTU3x9/fHwMCAffv2qT3sOjg44O7ujq2trSCU/fDhQ1auXMn58+epXLkyrq6uSKVS6tatq3G9+/Tpo2bYYGKinK6Ni4vLty3klStXuHXrFlWrVgXg9evX/PHHH7Ro0SLH7z5vb28sLCyYO3cujRo1UpslAu2alHnZbcrTkhAZGCHSUw+xku6eBJSWkblh4l6H1Bc3kKdpqoKoykCMS1Qn6c4JEm/9iWVtXwCKWhnz9PR2RCKR8JksCKoGnI+VCNRlKL8ir2NS6LXxGs2Wn2f7tRBCsgWToO7U0Gz5eXptvMbrmH/XpvBTn1rs7e0xMTHh6dOnGq89efIEsViskXn8WPbv34+RkREnT56kf//+tGzZMkcnBLFYTJMmTVi6dCmPHj1ixszZpIXcIy20YHqRmZEhSGPCsG48AMtanTApXQtj18romdlojBWRs2tB9qfrpKQk3r17p7VuVUXW5oVevXrh7e1N06ZNSUvLu/BbG9mdE7TxNe+nji+PlZUV165d4+3bt7mOMzMzUxO0NjQ0pGbNmmolJ3v37qVs2bKUKVOGqKgo4Z+qPi2vBoes3Llzh2fPntG9e3eio6OFbSUnJ9OkSRPOnz8vTFf27t2b9PR09u3bJ5SuJD8+D3IZpuVzt2rMiazBpCwtCXl6MhInDzLev9AoXZnbvgL62dUhxHqYVf7woy7SM8C8SgvkKXFkvFdOBYvEekIwqdCiZzm3fQW1TWZkZAgNhseOHROCSYADBw4gl8vx9fVVu/aFChWiVKlSGtdeIpEIntZfCg8PD2rVqsWkSZPw8/Nj5cqV1K9fX6izvH//PjVq1MDIyIj9+/eTmPghgDI2NqZcuXLs3r0bW1tbGjZsKHwvpaYq9RwrVKiAmZmZUOdYsmRJvL29mT17NgsXLqRGjRqkpaVRp04dfv75Z5ycnBg0aBCAEAxbWFiwdu1aLly4gJ2dHVZWVujr62NhYYGDg4NWr2//a6G5qoGkhd4nbN0g3u+YQNjaAYQu7kjIgjbEBm5C36pQnu9J0/KNEUlMkSfHEb7HT6lFubAdIYt8lEkKwLhUTSTOFYk7t53oYyuJ2OvHjRmt2b17N6ampqxbt06jzCS7HmVISAiHDh0SVFlUDU2+vr6CKoivr2+ux5oVXUD5lcgqKwDkqXOY3anh9xs5y818aT71qUVPT4/mzZvzxx9/qD3RhoeHs3PnTurVq5dr4XNB9yUSiZDJZMKy4OBgDh06pDYuJiZGY92a1ZVPtQppZsF2qkX+Q6FQkHjzsMZyZ1uTHF0L1q9fT2bmh32vXbsWqVSa65Nm1uYFFarmhY8hq3NCaKj6e061j695P3V8eRYuXMiDBw8oVqwYNWvWxM/PT2vnp5OTk8bDZfai/mfPnvHw4UPs7e3V/pUuXRpQ+j3nF9UDVp8+fTS2t2HDBtLT04WyjjJlylCjRg38/f2FkpLkh2cxLOKOgXWRHPeRGynPr/Nu21ilqPTyrrxZ2YOk28eEKcaspSvFbEyY2VZdvUHPzAaxofo0sr61sttZGh8uLEu6/xdvN47Q0LO01MvUcNaaN28ehw4dYt++fRpTsc+ePUOhUFCqVCmN6/X48WONa1+0aNGvomnr7+9PnTp1mD9/vpAFVDX4jRs3joiICPz8/ChVqhRxcXFqtbAbNmygaNGixMTEcP78eUH+TfWea926NUuXLhVqTENDQ5kxYwbbt29n+vTpwvfQrl27OHjwIOPGjRMaM0ePHi3sp3v37rRr1w5DQ0PS09MRi5Xf6VFRUUIdaFYCn0bk+htuYO+KkXMF0sMeI02IRCGXIjaxQmxmgzTuPamv7uR6zURiPQzsXBAZGJH26hbSuHeI9CWIJaYkPzhD6oubiERiHDpNw7x6W5IeBpL64ibGRoZ07NiRPn365FhmklWP0traGplMRseOHYmOjqZGjRrMnj1bqLn96aefCvS7r5vy/grkJiuQFzK5AplcwcQD94lKSmdEI80uti+N6qllypQpdO3aFQMDA9q0aVMgfao5c+YIuo/Dhg1DX19feILSVtj/sbRq1YqlS5fSokULunfvTkREBL/88gslS5bk3r0P3qazZs3i/PnztGrVChcXFyIiIlizZg0Wto6YOnsUqDnHwNYJfavCxJ7ZiCwxGpHEmJSnl9UEikGpQ9motEMOW1FmH5o0aYKvry9Pnz5lzZo11KtXL8cOb1B+oR44cID27dvTqlUrXr16xa+//kq5cuVISkrKcb3cWLlyJfXq1aNq1aoMHjyY4sWLExwczNGjR7lz5w7w9e6nji+Pr68v9evX5+DBgwQEBLBo0SIWLFjAgQMH1B5m8lMuIZfLqVChAkuXLtU6tiCZa1X2cdGiRTl6d2dt9ujduzejRo0iJuIdmbHvyHj7FJtmQ/O9v6ykvX5A5L7ZSIp5YNv8e+Vsg54+SfdOkfJIqWCQvXSlaw1nopLSC/Rdn/QgkOijyzAuVQsLzw5K2z2xHlZPj5Ieo5kx9vb25sSJEyxcuBAvLy+1uke5XI5IJOL48eNa71X2xpiszYs54efnh5+fn8byLVu25Fi6kJ0SJUpw6tQpjeU+Pj6cOHGCCxcu4OzszMSJE3n8+DEVKnzIytauXZubN28KXd6qY1m1ahW//vqrEPgBTJ8+HalUSmxsLEFBQcLxNGrUiLS0NO7cuYOhoSGjR49m5cqVjBo1igcPHgj14v7+/hrXZP78+UyePJnQ0FCh/jwpXUpoHrOGBtaFsWs9Bhvv4WqZboVMKpRNqMojckIkFqPITMO29RjMyjf+Z/1Mwtb0J+leAMZu1REbGmNYqCTIZTSf8Csn538QhK9QoQJDhw7l8uXLwmf0l19+UVNlmTp1Kvfu3VNTZZk6dSpSqZSZM2fSrVs3tVKxvNAFlF+YvGQFCsLigCDszSR0qaHZBPMlUT21/Prrr5w4cQK5XM6rV68KFFB6eHhw4cIFJk2axLx585DL5Xh6erJjx47PqlnYuHFjNm7cyPz58xk9ejTFixdnwYIFBAcHqwWUbdu2JTg4mE2bNhEVFYWdnR0NGzak38ifGHQ496m/7Ij09HHoNJ2Y0+uIv7oXkZ4BJqVrK2uuNo0UxsnkCnrWyvnerV69Gn9/f6ZPn05mZibdunVj5cqVuZYc9O3bl/fv37Nu3TpOnjxJuXLl2LFjB3v37tX65Z4fKlWqxNWrV5k2bRpr164lLS0NFxcXtamPr3U/dXwdChcuzLBhwxg2bBgRERFUrVqVn3/+ucB1WG5ubty9e5cmTZp8cqmMqlnCwsIix7KVrHTt2pUxY8Zw9dQRUh7eB7E+JmXrf9S+U55eRqRviGOX2Wo+30n3lIFRTqUrIxqVws5MQv+dImRJMcgz0tSylNJYpWOMvqXjP/u5hL5VIew7TEFfT4y+WMSsth6sHH2MMI2tQ61atRg6dCitW7emc+fOHDx4EH195c+4m5sbCoWC4sWLCxnhb5HkdCkvIhI4ceIkjbxbYev4IYNctmxZvL29c1W2ANRqKmUymZBFs7a21qpO0K9fP7VsbFZ1C1VAmTWYTE5OJjU1lTp16qBQKLh9+7YQUBZEDSR72QRyGRInD+GhJC9EhsaYenyYHhfpGWBYuDTSuA8Z7pQnFzG0K8bCAS3VdDSzlpnUqVNHWF4QPcqhQwv2QPY/HVDu3LmTiIgItdT21+RjZAXyYvrhh9Rxs9OYCvnSTJ06lalTp2osz6mZQ1tncpUqVThx4gRv375l/fr1+Pj4aGQe+vbtK9ixZaUgT8r9+/fX8K5VbUNF48aNc9Qdq/8og8svowtkv2hgVwzHrnM0lquK/vXEIuqUsKWkg2aTVdZzbtCgAevWrctxP9mDRJFIxKRJk4TmABWqaR0Vrq6uOd4rbcs9PDw4cOBAjscBH+6njv8uMpmMpKQkNecSBwcHihQpUiCZHxW+vr4cO3aM3377TaPJIzU1Fblcnu8H0WrVquHm5sbixYvp3r27RoYte7OEnZ0dLVu2ZM/vO0l/G4NxiarKjN/HIBKDCBQKGSKUAaU0LpzUZ0onqNxKV7rWcGZFMSuuhspIunMc61odkMkVSu3L2ycQm1gqs0pkdctRUKeELXPbV+Dts/u56m02bdpUMGvo1asX/v7+iMViOnTowKRJk5g5cyY7duxQC+gVCgUxMTGC0cTXJnsjqjQplrS0VC5HGlDe76RaI6q7u3ueAaVcLmfFihWsWbOGV69eCSVO0dHRH6VuAcrp8unTp3P48GGNLvSs28xJpUMbKc+vE395t1I6Tpa1lCp/D1t65rYaD2ZiIzMyIoOFv6Wxb8mMfk3l0tq7urOXOhREj7J48eL5Ok4V//MB5YMHD/61gPJjZAXyQuXUsH3AfzcL9PbtW2bOnImrq2uOU1n/JnPbV6DpsnOf1c9bXyzSKLDXoePfJjExEScnJzp16kSlSpUwMzPj9OnT3LhxQ63rO7/06tWLPXv2MHToUAIDA6lbty4ymYwnT56wZ88eTp48qWFhlxNisZgNGzbQsmVLPDw86NevH0WLFiUsLIzAwEAsLCwEHUQVvXv3Fuz9HOr11LbZfGHsVoPEG4eI2D0DU4+GyJLjSbx1FH2rwmRGBudaugIg0Rcrg/J7h7EzTiXawJY3N/8iM+IlNi1GINLTRwQ4Va5L0J7LlLrzK/VLtGPNokP5Klnx8fFh8+bN9O7dGwsLC9atWyd0eE+aNIng4GB8fHwwNzfn1atXHDx4kMGDBzNu3DiNbSWnSwmOTiZDKsdQX4yrrWmOwXJBeR2TwuSD97nwPAo9sUjrd2rWRtQtV4IxfvAuz+3OnTuXadOm0b9/f2bPno2NjQ3e3t7Y2NgUyJJS9TAtk8lo1qwZMTExTJgwgTJlymBqakpYWBh9+/ZV22Z+VTryUzaRF/mx57QxMcChSP7LTAqi9JGfsois/E8HlF8CuVxORkZGnppdeckKfCwqp4bnEYlas106Ph1Vgf3EAwXr9s6NWW09vnpWWYeOvDAxMWHYsGEEBAQIXcIlS5ZkzZo1fP/99wXenlgs5tChQyxbtkzQSDQxMaFEiRKMGjWqwFOxXl5eXLlyhdmzZ7N69WqSkpIoVKgQnp6egtxNVtq0aaN0a5HJMSpZs8DHr8LYtRK2LX8g/uo+Yk7/hr6VI9ZefZHGhxMfGZxr6YoKa2trtm7dysiRIwm7fQBHB0d6/byIjj0HCIGbieF3zK9szbp16/jhh78KVLLSs2dPEhMTGTZsGBYWFixatIiJEydSunRpli1bJsj9FCtWjObNm6vVYqdmyIhITKfhosAvJl33+41QZhx+KCRVsgaTYhMLRPoSMmM/lBepXg95+VxYv2sO5V379u2jUaNGak5gCoUCJyenjzrW+/fvExQUxNatW9Vc17TVfrramiIiL1n8vMsmPgWRSPnQMqutB9vulflsZSafyjfT5e3n54dIJOLJkyf4+vpiYWGBra0to0aN0iqBktUNwMbGhq5du6qJKXt5eXH06FFCQkIE/9Gs8ivp6enMmDGDkiVLIpFIcnRzULXZ+/v74+HhgUQiydc0X1ZZgYyIV0T9uYywtQMIWdSe16t6EnV0ObLU/LmJKKSZxF3wJ+zXQYQs8uHNL33pM3RUjse6d+9eypUrh7GxMbVr1+b+fWVgtG7dOkqWLImRkRFeXl4a09JeXl6UL1+ee/fu0bBhQ0xMTChZsqTQWafyaDY2Nsbd3V2w1cpKWFgY/fv3x9HREYlEgoeHB5s2bRJeP3v2LDVqKIuR+/XrJ9ybvCy1vjZdazgzrvnnqUP6qbn7V6971aEjPxgaGrJw4ULu3LlDQkICSUlJ3LlzRyOYPHv2rFYpqS1btmh8jxgYGDB+/HgePHhAWloaMTEx3Lx5U63rFpRlMVk/915eXigUCo3u5cqVK7N//36ioqJIS0sjODiY3bt3ay1ZEYvF6Ovr07lTRxqUKZKrtEtemFVqTtEh63H56SBFB/2KWcWm2DbsSc8NV/N8mFddr2rVqnH58mVSU1MJCQlmzuRxVHG2xqOIJaYSfaFkJTg4mLS0NG7dukWrVq00rquqZCV7hvH7779HoVCwaNEiYVmHDh24cOECSUlJJCUl8fjxY1avXk3p0qUF6brwhhMx77nii0nXrQ58xsQD90mXyrVmJUViPYyKVyH12VWk8R+mZDOjXpP6UlkDOfHAfVYHagqVgzLLlj2jprKk/Bi0qWUoFApWrFihMdZUoo9zfpIDWcomVGQtm/io4/zn/SzRF3P6x4Z0qeGMr68vYWFhWoXfU1NTSU7W7sz2JfjmMpS+vr64uroyb948rl69ysqVK4mNjWXbtm3CmJ9//plp06bh6+vLwIEDiYyMZNWqVTRo0IDbt29jZWXFlClTiI+P582bNyxbptRtUtXgqNwcLl68KFhG3b9/n2XLlhEUFKQhMXPmzBn27NnDiBEjsLOzy1UXUEVWWYG0V7eRxr3HtGJT9EytyYwKJenOSTKjQinUe0muTxUKhZyI/bNIf/MIs0otMLArRmZEMFf+2EaXLjEax3rhwgUOHz4sWG7NmzeP1q1bM378eNasWcOwYcOIjY1l4cKF9O/fnzNnzqitHxsbS+vWrenatSudO3dm7dq1dO3aFX9/f0aPHs3QoUPp3r07ixYtolOnTrx+/Rpzc+WXa3h4OLVq1RICW3t7e44fP86AAQNISEhg9OjRlC1bllmzZjF9+nQGDx4sFEdnLRr+VlAV2KuesgsyBa4nFgkF9rpgUoeOr8OhQ4eIjIykd+/elKjw5UtXsvpOq3ytvwRbtmyhX79+3LhxI98lA9nJLWOojezSdTPbeuSYMcy+n/w0olrV78H7V7d47z8B86qtQC4j4e8jGNg5k/lPjaCqEfX9+/dqFoitW7dm1qxZ9OvXjzp16nD//n38/f3VrGDzw6ZNm5g4cSLh4eFYWloybtw4nj59yrFjx3j48KGgl5mdRu4ObL8Wkus1zKtsoiCIUNbtNirtwL0XjtxKfC7MeH3OMpNP5ZsLKIsXLy68cYYPH46FhYVgB1axYkVCQkKYMWOGmhsAKJ/KsroBNGvWjKJFixIbG6smxgt5uzlcvnxZLcB5+vQp9+/fp1y5cvk6h+yyAmZVW2Hh2UFtjKSIO1GHF5H+5iFGxXK2uUt+eI604Ls4dp+HUbEPOmeG9i788ccvWo/1yZMnQtBrbW3NkCFDmDNnDkFBQULwJ5PJmDdvHsHBwWoB8tu3b9m5cyfdunUDoFmzZpQpU4bu3btz+fJloYNX1Y23f/9+oaFkypQpyGQy7t+/LxR/Dx06lG7duuHn58eQIUNwdHSkZcuWTJ8+ndq1a2vcm2+NrjWcqetml2cdkArV66oCe900tw4dX55r165x7949Zs+eTZUqVWjYsCHAf650Zc2aNZiYmGhtTPwUvpZ0XUEaUQ0diuPgO4vYMxuIu7ADfXM7rOr1QJYUQ3yWgGv64YcaWdTJkyeTnJzMzp072b17N1WrVuXo0aNMnDixQOd28eJFZsyYgZubG0ZGRqxbt45FixYhlUrx9PSkbdu2TJkyRWO9Hp7ObLkSrLnBLORVNpEbR4bXpf85S2Kjpfwxsp5aXWvfA+pOPp+7zORT+OYCSlVmTcXIkSNZs2YNx44do2LFihpuACqyugFkDTS1kd3NQUVObfYNGzbMdzAJmrICajpU0gzkGalIipQBIOP9i1wDypQnFzGwdcLA1glZyodOM4lLRa3H2qRJE7UAURUAduzYUQgmsy5/+fKl2ngzMzO6du0q/O3u7o6VlRVFixZVk4PJuj4opwf279+Pr68vCoVC7bp6e3vz+++/c+vWLa2WW986xWxM2D7A80OnYlAEodFa6o7+eYLsWctZV9+qQ8dXZO3atezYsYPKlSurTaN/jDZkTuRWuhIaGoq9vT2bN28uUDCYPcO5Zs0a7OzsPmtAmVPGMO6CP/GXduVqP5mdvKTr8tOIKo0LJ+zXAVg16o+lZwcK912uMcaqfo8P4+UKrFzKYW+QISyTSCQsXryYxYsXq62Xve5UVUahImum19PTE319fWbMmCG83qlTJwoVKkTTpk3ZsWOH8py0xBOlHM2pX9IuTzUQs0rNMavUXGN51vPLikoNpIKTFTcuX9Q6Rlt5mKrMRJtlalbyq8qSk6pKXnxzAWWpUupPP25ubojFYuGEs7oBaCO7D6c2nj17xuPHj3M0i8/eZl/Q1vnssgKy1ETiL+4k+fEF5Clxaq/lZRKvkgR4s1L7GzAvSQCVHEj2Ti/V8uxSAdrcMCwtLfNcPzIykri4ONavX8/69evzdaz/NUo5muPX1gM/PL5oZ6QOHToKRk5C2/D/u3TldUwK0/94gDwzXS2x8SnkJF33JRtR41MzsRTlX64nP0RERGhNFEVERGBlZZXn+jo1EE2++V/A7MFNQd0AtFFQN4eCts5nlxWIOjSf9LAnWHh2wNChOCJDY1DIidgzAxS5f0gUCgUG9q5YNxmo8drP7cpTv0oZtWU5SQLkVyrgY9dXySr07NmTPn36aB1bsWJFrcv/i5hK9PEo8pEadzp06PiqfOnSlWLFipGamoqBgQEhISE0adIEIyMj/vrrLxwdHdm8eTPbt2/nwYMHxMfH4+bmxsiRI9W24erqSkhICPDhd69hw4ZqWbf09HTGjBnD9u3bSUlJoXnz5qxfv14tOeLq6kr58uUZOXIk3YeMJvbNC6y8+pISdAV5WhJFBqzWOP6w9UPQt3TAsctstQyiWGJCwtV9SBOjMLQvjo339+gVddcqXadqRM3pusZfO0Bq0GUyIpXNs4k3/kDf0gHTMvW0js+KSCQiLjWTR48eMXz4cK5du4a1tTWjRo3SyMpFREQwadIk/vzzT+Lj43F3d2fMmDFqv0uqxtBXr14J13rz5s2Ct/kvv/zCL7/8Aih/41SZzQsXLrBnzx527dpFZmYm1Ru34lnJzigy04k5tY7U59cBMKvsjZVXP7X4RXX+mdFhKKTpGNgWw6J2Z7Xzn9XWA2dbU4YPH07Tpk2ZOnUqz549o2TJkixZsoQWLVrkea3+Tb65gPLZs2dqGcHnz58jl8uFadmCuAHk1OzyOd0ctJFVVkCWlkRayF0s6/XAql43YUxmTP660QysC5ER8Qojl0pqxyoCurX3/mayYvb29pibmyOTyfJ0tfi3pQ106NDx/48vWboiEokwMjLixYsXNG7cGBsbG06dOiU06qxduxYPDw/atm2Lvr4+R44cYdiwYWpORMuXL2fkyJGYmZkJdXuOjo5q+xk5ciTW1tbMmDGD4OBgli9fzogRI9i9e7fauKdPn9Kla1cUZZpiXaYJBjZFERkaEXN8FRmRwRjauwpj098FIY0Jw7KOuu9zyqNzyDNSMKvcAkQiEq7uJ/LAXIoO3aBVui4vf+vEm4cxLuWJUfGqxF/cCSIRUYfmI+o0I08bQoVCQXx8LC1atKBDhw74+vqyb98+JkyYQIUKFYTrmJqaipeXF8+fP2fEiBEUL16cvXv30rdvX+Li4oSZtZkzZ7Jq1SqcnJwYO3YsoDRq2L59O7169aJZs2Zq8kFZr3+hQoWYOXMmV69eZfv27TTtasqFi5fQs7DHqmEfUl/cIOHaAQzsXDCr0ETj/E3LeaGQSUl+fF7t/FUlFV1R1nYeOHCAYcOGYW5uzsqVK+nYsSOhoaH/mjh9fvhmZINUqJ4KVKxatQpAeMN06NABPT09Zs6cqZFdUygUREdHC3+bmppqVc3/0m32WWUFsjohZCXh5uF8bcukTH1kidEk3T2pttzZ1gSxPPOrSgLkhp6eHh07dmT//v1a5UUiIyOF/1c5ZRTEdF6HDh06Pgeq0pVz4xrxwM+boyPr4Z12npD5rTnYozjF7mxkWa861PYowbRp01AoFLx+/Zp27dphYWFBoUKFNETfQ0NDEYlEVK9eHUdHR86cOYOdnZ0gg/fq1St+//131q5dy7t37zh58iTe3t5cuXIFUH4XHjp0iLdv3/Ls2TP++usvOnToQLNmzdT2ExwczP379xk7dizHjh2jYcOG7N+/X+N37vnz52RIrEj8+wixgZtIuH4AQzsXRPqGJD88qzY2+UEgIgMjTEqrK21IEyIp1GcZlrU6YenZEdvvRiFLjCL11S3kiZF06zsId3d3pXSfrS03N05TswTMTpHB67Bt/j1m5ZVBlnnV1ohNrYk8OJfQxR147z9RzQFGRWrwXTLCX5KREE1UVBSvXr3Cy8uL48ePU6hQIUGL8vbt21StWpXHjx8jFou5e/cuNWrU4K+//qJ27dpMnTpVkCD87rvvMDU1pWjRorRq1YqVK1fi7e0tZC5Lly5Nz549NZpGHR0dOXbsGMOGDWPbtm3Url2bv3ZvoH7Nqjh1mIBV9VbYd5yKnrmdht6k6vzNq7XGoqYPhXouxMDehaSbh1jQoQLDG5UUxj5+/JgLFy4wdepURo0axcGDB0lJSWHXrl05Xt9vgW8jvZWFV69e0bZtW1q0aMGVK1fYsWMH3bt3p1KlSgAFcgOoVq0au3fvZsyYMdSoUQMzMzPatGnzVdrsVbICSEyQFCtPwrX9KOQy9M1sSX11C2l8zh+8rJiWb0TKkwvEnPiFtJB7SJzKIlYoSNaPw2lep68qCZAX8+fPJzAwEE9PTwYNGkS5cuWIiYnh1q1bnD59mpiYGEB5D62srPj1118xNzfH1NQUT0/PAteq6tChQ8enoCpdKWypLGvq16sHZcuWZf78+Rw9epQ5c+ZgY2PDunXraNy4MQsWLMDf359x48YJwQdAUJCy6cXOzo7Tp09jYWHBvXv3qF+/PgYGBgwePBhXV1devHjBoUOH+PHHH2nYsCEnTyoTBb6+vhQvXhxHR0dhitXBwYEFCxaoHW+lSpVo166dkOUMCAgAICQkRCgpio5T6hsrTG2xquiNIjOdxNvHidgzA4lLJZIfncOq4Yfp3+QnFzApXUvNcxzApGx99Iw+lJBJ/lEZkca9J1WaweM7Nxk7qAdOTk7cuP+Ujb+t4/3OSRQZtAaxgabxR/YazuQHf6HITEMEWNTqTOLNw4TvmkKRAavRM1VaI6YG3yFizwxEYj3Q06ffsNHs2fobdevW5datW9SsWZOXL1/y8OFD6tevj1QqFTK869evx8vLi3PnzvHDDz/QrVs3njx5onYMGRkZNG7cmJiYGM6dO6fmca2NAQMGqM2weXp6cuXKFeZNGoVjiXJCSYWkcCnS3z/P+fzTk5DLZBT3qMb722c06nML4rf9LfHNBZS7d+9m+vTpTJw4EX19fUaMGKEm2grk2w1g2LBh3Llzh82bN7Ns2TJcXFxo06bNV2mzzyorYNd2HDGn1pH0958oAOPiVXDwnUnYas2UenZEIjH2HaaScOMQyQ/OkBJ0BbGBhMLupb66JEBeODo6cv36dWbNmsWBAwdYs2YNtra2eHh4qH0xGhgYsHXrViZNmsTQoUORSqVs3rxZF1Dq0KHjX6VmzZqsW7cOQAgCx44dy7x585gwYQIA3bp1o0iRImzatEkoxRowYAAAY8eOFcTbR44ciUKh4NatW7x+/ZoZM2Zw5coVUlJSNBpCq1SpwsaNGylfvjx2dnbUrl2bjRs3agSU8+fPFxQ2RowYQc2aNblx44bQHLnk2B2S4uPQM7PB0XemsJ5ZhSaErR8KchmyhEjSX3+Q9pEnx2Hq0UjjWuhbqB+jKriUpyVhVskbszL1GD9ZWXZVPTSWI3GFeb99HClPL2NWXlN0XvC1fv8CgMxolRGJCKt63TAuUZX328YSf3UfNk0GARB7ZhNiI3P0rQohT0/Cu+dwhvTuSpUqVZgxYwbW1tbcu3ePqVOnkpmZSdGiRXFycmLixIn06dMHd3d3xo8fz8qVKwHUZjBlMhlXrlzBwcGB8+fP4+Ki3Qs7K7k1vTpmKanofP03HoTcUXPUUZ1/ZsRLFNIPvt7aSsAK4rf9LfHNBZT29vbs3bs3z3EdOnSgQ4cOuY4xNTXF399f62uf2mafF1llBTC3w6GDppZVfuUaRHr6ymmHWp0EWQFtXt7ajlXlsJCd7HIKoCm5oCK7pEBu+3NwcGD16tWsXq1Z+J2Vtm3bqgX/OnTo+LyoJGk+9jssP7i6uuLl5ZWn05WqqeHVq1f5Mob4nIhEImbMmJEvGZSBAz80P27fvp03b94AHwJGACsrK9zd3dUk11q2bMn+/fu5cuUKQ4cOJTIykvPnzzNq1CgyMzNp0qQJZcqUYenSpRQrVgxDQ0OOHTsmmG4MHTpU7Tjq16/PwYMHSUhIUHMXUjVHxsfHk5mZSaVKlbhx4waJiYn8fiOUBRv2Agr0LOzVZOYQiZEUKY009h1iUyuSHwYqvaUBPVNrjFwra7lwOftIiw0kKIDg6GRK25uQkhCHvnVhxBJTZcCYLaDM6mttVb8ncee2IHGuiJ6ZteBrLSnijmERd1Jf/A1NBiFNiiEz4iUWnh1Jf/sUkUjMD7vvUL+kHfW9GnPs2DFatWqFXC4nICAAHx8f7t69K+yzcOHCdO/end9++03DF/3Nmze8f/8eiUTC+fPnKVq0qNZT7du3L2fPnhXeO/lpWi3laE7lYlY81xfzwM+b4Ohkrl6+xKAFs6lbrz79Zo+ncOHCGBgYsHnzZnbu3Jnr9tQv/Zf7LH8OvrmA8n8JnayADh06vlX+q9JXX0r8G7RnhgwNDTVccCwtLdWyXZMmTWL//v1s374db29vYbqyfPnyHDlyhPT0dA4fPqy2/cDAQI39qrJV1tbKKd9mzZoRHBwslAu1bNmSpKQkDTvi0PAYVlx7KHhjZ7x9ql1qzsAIA5siavV9Rm7VlVPK2cgIf0nUkcWkv32KNPYdkix6yfLMdBKu7KXJ1sFEvH+nFujI0zXr+rP6WsuSYog7twWjYh5qXt4ABtZFSH6i1F+U/WPJaGBTlPS3T4Uxl19GE5NkRlxUFJmZmcjlclJSUnB3dycuLo579+4hl8sRi8WULVsWuVwu1KqqGlp69eqFXC6nVq1aOQaTnwNVScVvFwMwMjLi9KkAJJIPU9+bN2/+Yvv+N/j2vz3+wxSzMfnPOTXo0KHjfxehw/lpBKExWjqcbUxo5O5AD09nSjnm3eH89OlTxOKv29tZUPHv1NRU9PXz91OnLTOU0/llDaJUgWD16tXp06cPc+fO1dhm1vHx8fFqwYRqjKmpqVqzYrFixfD19eXq1avs27eP2NhYjI2N2bZtG4ULF2bdunXs27ePnddCkNrbofhHvg2RCBQK7NpPQiwxFbaX9uo2CdcPgEIBegYgk2NcqpbW80t/+wR5SjyGhUohT01Uey321DqS7p/GZ9D3tG7mhaWlJWP33uXhjtnKbWdHi6+1PC3po3ytZVm0RJ+Gqx/Xd999R0BAALt37xbc3kDpjmdmZkaZMkqZvQ4dOrBt27YcZ99U/Pbbb8jl8k9uhtHT00MkEiGTfTj/4OBgDevk/zrfXJf3/xpdazgzrvnnqXPMzalBhw4dOnLidUwKvTZeo9ny82y/FkJItmASlLVeITEpbL8WQrPl5+m18RqvY3I3XpBIJPkyk/g3MTIyyndA+akMGTKE5s2bM3XqVAAePHhA8+bNMTQ0pE2bNvzyyy8sWLCAatWq4eDgoLZucHAw165d4+7duxw+rFQBUSgUjBs3TrjGixcvJikpibCwMJo2bSpku56+T0QmVwjNnmJjZW2fUbHyGLtWFv5Z1OpEsdG7MbB3AZmyji8jTL1RRYVp2QYU+3E3hbrPFabHVSQ/vYRZ+cb8snI5nTp1olmzZrRt3hh5WpLWbRm71UCRmU7YL31JeqTMzCbeOYG+VWG1cZmxb9G3VEol6Vkqr482ib3MmDeIjS14Ep5CqlSBiYkJT58+ZfDgwZQtW5a+ffsybtw49u3bByg7wOfMmYORkbJZaOTIkUgkEl68eMG0adO0HjMoS+OyZhQ/llatWpGSkkKLFi349ddfmTVrFp6enpQsWTLHdbZs2YJIJMoz6P2W+GYCSj8/PxQKhcbUwv8CIxqVYn6HCkj0xeiJC6bBqCcWIdEXa8gK6NChQ4eKixcvUqNGDYyMjHBzcxMaS0Bpvdd02Tkuv4wm6d4pwnZM4vXKHoQs8uHtb9+TeOuY2rbe7fYjbO0ALr+Mpumyc/x+I1R4rXbt2mqqEq6urhqZwocPH9K4cWOMjY1xcnJizpw5gvFBXrx//55+/frh5OSERCKhcOHCtGvXTvhRdXV15eHDh5w7dw6RSIRIJMLLyyvXbYpEIo36ydu3b9OyZUssLCwwMzNj27ZtuW5jzJgx2NvbY2pqSvv27cnIyFB7vXXr1gC8ePGC8PBwMjOVwdratWsxNjZm3759iEQixo0bx9q1axk8eDCjRo3Suq+KFSty/PhxQOlRDh+ypKpmnri4OOLj4zlx4oTyHMUiZKmJpD69DOTiwKaQI5aYYKqlaSY7YiOzLLJ36ohEYkwlemolEpn3joFCTkb4S6Rx4STcPMLbDcMIXdyRqINzQSRGnplG/MXf/zkWBUYulYT1098+JePtU4xcKxN3wZ9w/4mAiITrB8iIDEGhCoAjg0l7eQuA5MfniH4fhr6+AQcOHCA8PJyzZ8/So0cPNm/ezMWLF9HX12fYsGGsW7eOwYMHA0pZJVVwOWfOHAwMDPDy8tII3vr27atW8/v27VtEIhGLFy9m/fr1QrNPs2bNuHHjhsZ1OnPmDPXr16dNmzYYGxtz69YtfvjhB3bt2sWCBQto3759jtf/9OnTAJQpUwZra2vevXun0eUdFhZG//79cXR0RCKR4OHhwaZNmzS2lZaWhp+fH6VLl8bIyIjChQvToUMHXrx4IYxJTk5m7NixFCtWDIlEgru7O4sXLy5Q3aZuyvsr8aWdGr41/qv1WTp0/Ne4f/8+zZs3x97eHj8/P6RSKTNmzBBEsbOW3CTePoaBnQsmpTxBLCb1+XViAtaAQo55NWVQZFK2PtF/LiUl7CmSwqWZeOA+UUnptClhyNWrVzVUN7Ly/v17GjVqhFQqZeLEiZiamrJ+/fp8u4117NiRhw8fMnLkSFxdXYmIiODUqVOEhobi6uqaL/HvvFBJzFhYWDB+/HgMDAyYP38+AH///Tfe3t5q4zMyMrh7966amLiNjQ0ODg6C57GTkxOg1FEeMWIE/fr145dffuHx48dUrFiRYcOGMWLECIKDgzl69KjQDBoSEiIolaj48ccfAejXrx9nz57F2NiYkJAQdu/ezffffw9AVFQU1apVw8nJiejoaAwLuxN3YQd6ZtZYNx1E9J9KF7iEG4fQt3REmhBJ6vMbGDmVxab594jEOX8X61s55tgwqlouS4gg4tZpRo8eTbly5bhy5QqnT59G38iEzMhXJPx9hMQbhzBxr4t59bYopBnEnduG2MSCQt3mEfbrAAxsnUh5dhUrr77EXdpF4o3DiIzMyYx4SdKbR5iUbYBRiaok3ToK0gwkRcspx/2tPAajEtUwKuIOCinyx4FIE+KpXr06Y8aMoUyZMpw7d46YmBhcXV05cuQIw4cP5+bNm+zbt48ff/yROnXqcPz4capWrcqtW7e4dOkS/fv31xpA9e3bl759+woB586dO0lMTGTixImIRCIWLlxIhw4dePnyJQYGBmzZsoWePXvi7e1NiRIl8PPzIzU1lVWrVmFoaMjx48eFQDX7w45CoeC3335j8ODBtG/fHm9vb9LT07l3756g4QwQHh5OrVq1EIlEjBgxAnt7e44fP86AAQNISEhg9OjRynslk9G6dWv++usvunbtyqhRo0hMTOTUqVM8ePBAMItp27YtgYGBDBgwgMqVK3Py5El++uknwsLChOaxvND9wn9FvqRTw7fA567P0qHjc6Dqdo6MjPziMyD57Xr+nEyfPh2FQsGFCxeE5o6OHTtSvoJm855j9/lqengW1doQvns6CTcOfQgoS9UiWs+AlMcXkBRWlussDgjiavIlRCIRvr6+gHKKNiQkRM3IYMGCBURGRnLt2jVq1qwJQJ8+fShVqlSe5xEXF8fly5dZtGiRoCUMyoYXPz8/GjZsiEKhYOrUqdjZ2WmITucXlcTMxYsXKVGiBKC061u6dCkzZ87UCChBmS1S1UnK5XKWLVum1bFk+PDh/Pzzz4BSW9LJyQl7e3vWrl1LWloaLi4uwvXLD/r6+ri5uZGeng5ASkoK+vr6/PXXX3z//feYW9kwbMggMqNfk3T7OA6+fhgXr0pa8B2SH5wh4e+jiORS9MxskRTzwLRiMxQKhbIpx9AEMnIvacgJ6yaD8PYojL+/P2lpadStW5fTp09Tp249YtJSSH/7FAM7Z+zbTxLWSbh+CEO7D9I8puUbIxKJSLh5GFlyHJLCpTFyrUz8RX+sGw/EoqYPoHw/xl/cSfLjC4j09TEqVh6rej0wLPRBp1FRpTUWe8eQlBDHvHnzkMvleHp68vLlS16/fs2TJ09wdXVly5Yt7Nu3j/fv33P+/HkAjh8/zujRo/n9998JDAwkODg4TyWC0NBQnj17JjRPubu7065dO06ePClkq3/66SdsbGy4cuUKNjbKkgEfHx9B8mjr1q05bv/o0aN4eHhw4MCBHMdMmTIFmUzG/fv3hffi0KFD6datG35+fgwZMkSot/3rr79YunSp8LACSvlFVfB8+PBhzpw5w5w5c4QHteHDh9O5c2dWrFiR74Dym5ny/v+ENqeGg9/X4ejIejzw8+bcuEb4tfX4zwSTX6o+S4cOHbkjk8k4efIkPj4+ah3EZo4uGBevqjE+azApT0tGlhKPkXN5pHHvkacpu3PFEhOMS1Qj+clFtWzNvn17qVq9ptZOaBXHjh2jVq1aQjAJymnaHj20dBxnw9jYGENDQ86ePfvF9PZkMpkgMaMKJgGWLFnCkCFDuHbtGgkJCWrr/P7772pagfXr1wdQszvU19enXLlyas049vb2lClThgoVKvDgwQO6detGbGwsCxYsEKYmcyr16tu3ryBwnp6ezrFjx1iyZAmWlpZIpVKCg4OZMGECw4Yo9Roj9vqhb1UI4+JVUcgyBccaEQoQidAzs8bEvR7SmDBiTqwmMzIY4+JVhP0lXD/EmzX9cnWskWemE3lwLq+XdyVsdW+Cnz1m48aNJCYmcuLECa5cuUJMdBQAGWGPyYwKJWR+a9JC7qltR5oYhWHhUsSd307i339iVb8nLj8dpFDPBWS8C0JsbIF59TbCeGPXyhTquRCXnw7g/OMeHDpNF4LJlKCrhP8+jbA1fXkdEkxcXBzjx48nISGBM2fOANCkSRMhQOzbty937twBoFy5coCynGDnzp0cPHgQgLp161K+fHnCw5XXMDMzk86dO2NjY0PZsmUBpaC5KpjM+p5YvXo1JUuWRCKRcOfOHVxdXdWyihUrVkQul7Nnzx4OHTpE+fLlhalqVfkCKKWpXr58qVFDKZfL8fPzo0iRIoJD0JMnT3B2dqZr165ERUXh7e1NfHw8t24pywL279+PnZ2dhnc8fGgmO3bsGHp6evzwww9qr48dO7ZAU966gPJfRiUrUMXZGo8ilv+5aeGs9VlAnhJJqte11Wfp0KGjYERGRpKamqqRAZx88D76NppyKGlvHhG+awqhSzryenkX3qzsQdw5Zf1gVrkX07L1lQLY/zRsZMa+I/3dc0RudTS2mZWQkBCt2Uh3d/c8z0UikbBgwQKOHz+Oo6MjDRo0YOHChbx//z7PdfNLZGSkIDGTHZXEzOvXr9WWZw+gVYFE9qA3JzFq1dTk6dOnGTFiBCtWrKBkyZIMGDCA5cuX5+u4W7ZsyZgxY/j1118xMDCgd+/ebN++ndnLfkXipAyMTMs1BJT1kxnhylo7y7pdsazXHVlKApEHZhN1eBEpTy5iUdsXfesiAKQEXSHh7yOYV22FRa3OZEaGEL5rCrLkD+enkGaQGf6CzOg32NTpzMyf52NqaoqPj48QiDVo0EAISOq07oLoHyH0qGPLiQ5Yi0KWSWbsOyIPzcPItQo2jQcgNjIj+uhyMiJDAMiMe4eBrZNWGaOspDy/zrttY4k88DNpwbeRJcehUMiRy+WCMUpO90UlRp5V3xMQtCpVDzWOjo6kpqby/v17Tp48ybBhw4TM+fHjx4XzzrrNM2fO0KZNGyET+Pfff9Oli7pHOihrGr///nu6du3KwoULSUtLo2PHjoIU1YQJE4RmIC8vL4YPH86lS5eYNGkSM2fOpMI/sw/v3r2jXr16vH79mt27d2Nvb0+/fv0AZdYdlHW97u7uuTamhYSEUKRIEczN1ZNYqgA6v+gCSh0fzerAZ0w8cJ90qbzAWpsyuYJ0qZyJB+6zOvDZFzpCHTr+//EsPJELz6OQZ8ssZMa+UwYKqQlYNx6IQ+cZOHSdg3mNdsoBWcYbl/REZCAh5ckFAOV/RWLe2VbmeYS6VMvnZPTo0QQFBTFv3jyMjIyYNm0aZcuW5d27d19sn3mRX5HpnMa9fPkSmUzG7du3mTZtGkOHDuWPP/6ga9euQm1dfuncuTPVq1cnKCiInj17Uq1GTdLfPEZsao2pR2OkceHI01IwraD0yzZ2qYxpOS8K916M2Ngc04rNKPbjbqwbfnBpkyVEUKjnAixrdcKqXjccfP2Qp8QTf3XfhzHJsYj0DSjcdwWr5/sxdfyPnD17ltq1awsOQiVKlBAydT+PHcqmkzco3H4Cxi4VSXl6CXlyLNKYN9j7TMS6YW/Mq7XGocss0NMn+f7pfF8DlUi6SM8Am+bf49DZD4euc4SAesiQIaxZs0YoE8jpvmSVg3ry5IlQczhjxgwhY3z//n3kcjnHjh1jzpw5gsC9tbU1Y8aMEZrNVOLkPXv2ZNmyZfj4+ADQvXt3/vjjDy5fvqyx/4CAgBy9ulX2n6CUotq/fz/16tVj8eLF+Pj4CNPlPXv2pHdv5b1s1qwZp06dEv7VrVs339f0c6ELKP9FtHVI/lf4/UYoiwOCPsu2FgcEsfsbylSePXsWkUiUo3OQjv8mcXFx9O3bFysrKywtLenXrx8pKeplF1KplNmzZ+Pm5oZEIsHV1ZXJkycLP04qFAoFc+bMwcnJCRMTExo1asTDhw/JTmZmJjNnzqRUqVIYGRlha2tLvXr1OHXqlNo4VTeoqakpVlZWtGvXjsePH6uN8fPzQyQS8fz5c+E83N3d0dPTUxvrfy0UPbEIaTa5ldTn10GWiUPHaZhXaYmxWw0MrIuQFqqsgQz7bSivl3cj8uA85CnxGLvVJOXJRRQKOcmPLyBxKofE0o4dVzU/q+vXr8fNzY2MjAwOHDig0fH69KlSmLpz5865niMosy6///4758+fx9HRkeTkZEGYGj5M0506dYp69ephZWWFmZkZ7u7uTJ48WW1bqizN4sWLMTIywtvbG0NDQ+F4QFkLKhKJhKnt1q1bI5FINJplPgaFQkFUVBRt2rQR/l/1L/vUZH5JTU0lPj6e5ORkxg3pBSiQJ8fydv0gwn4dwNv1g0i6pWxcebdlFOG7p6GQy5AUKiXYHmbFyLUK+uYfptzVHGsAWWoiisx0xMaWDKtbhCbFTYiKiiI6Ohpvb2+ePXtGWJimtE/fBmW4tmE6Pj/MwWnYZkT6hsrtF/4go6dnYomBTVEy45RZaAOrwmRGv0Ehk+Z4/llF0s2rfoexW3WMXSsj/2ed+vXrk5KSouHbnRMPHjygYcOGQnOXmdkH//KwsDAMDQ2pV6+e2jqenp4EBwfz6NEjAMHdz87OjqioKGEbqixjVhF7UMoRVchS46zNq1u17uLFiwkNDaVy5crI5XIGDhyIvb095ubmyGQyob6xSJEiNG3aVPinkqVyc3Pj6dOngvKANlxcXHj79i2JieoPi/m9hip0AeX/MKovypz+DRo0SBj78OFDOnfuTIkSJTAxMcHOzo4GDRpw5MgRje2+jklhzPy1vNs2ltBlXXi9vBvv/SeS8lxTNiG/TD/88P91TeXly5fx8/NTEzXW8Xnx9fUlMTGRefPm4evry5YtWzSChoEDBzJ9+nSqVq3KsmXLaNiwIfPmzaNr165q46ZPn860adOoVKkSixYtokSJEjRv3pzkZHWXEFVDUKNGjVi9ejVTpkzB2dlZLYg4ffo03t7eRERE4Ofnx5gxY7h8+TJ169bVqkGX/TxkMhkHDx4kNFQZ6AU+jSAtIpTUl9kCFS0SMGmh98n8p17Oqm43zKq0JC3kLu93TsKkVC1kSTEk3Q0gM+IVpmUbIJMrCAyKUNvGq1evWLRoEUOGDKFu3bokJyfTunVr4QcsMjJSyKhER0fneI4pKSncvHmT5s2bC9di0KBByGQy4dxAKf79/v17WrduTXp6OrNmzWLJkiW0bduWS5cuCeNSU1MFSaEKFSqwaNEiLC0tycjIYP/+/RrX9vr160gkEr7//nvmzJlDVJSyHlAqzTm4yYvMzEykUinr16/H3t5e7V/2qcmsSKVSrXWk169f5/79+1SvXp1Bgwbx6uVLSrT+HvsOU9T+GaqCNpEYaVQob1b2IPXFDRRaXGz0LR00lhlYFxE0LaX/uNnIEiKY2N5T7RxmzJih9Rzi45W2j6pG1FXda8A/neXZg0WxkZmgX2niXgd5aoLQyZ0VISOcRSQ9IzKEiP1zCF3amdSnynuvatZSHUNetGnTBnNzc63qBUlJSVp1VlXBWkiIcqr+2TPlLNuiRYuwt7cXgsUNGzYAH66PqoGtePHiGtvM6tWd1YUJlNPwquloZ2dn9PT06NixI/v37+ft27dq9Zyg/Myp6NixI1FRUVrtkFXX9LvvvkMmk2mMWbZsmVav8Zz4bxXs6SgQ9vb2bN++XWP5iRMn8Pf3p3nz5sKykJAQEhMT6dOnD0WKFCElJYX9+/fTtm1bNf0ugA4jpvHuwFKM3Wpg5tUHhTSTpPunidw3E/v2kzFxz73OShtSuYLJB+9r9Sj//8Dly5eZOXOmkHnS8fmpUqWKUMgOyi/tjRs3smDBAgDu3r3L1q1bGThwIL/99hsAw4YNw8HBgcWLFxMYGEijRo2IjIxk4cKFtGrViiNHjghfuFOmTFFrygBlt+Z3333H+vXrczyugnaDZj+Ply9fChnOAYOHci/gMQl/H8HAzlkIFgGMi1chVk+fiH2zMK/cAnlmGom3TyjHRbzCtFxD9K0cMSlZk/fbx6GQpiMyNCb2zEYQiYXPdWh0CsnpH4KC5ORknj9/jrW1Nb169cLd3Z2IiAj69OlD1apVWb9+veAQcuDAASpXrqz1HIOCgqhTpw5yuZz+/ftjaWnJwYMHkcvlapmTatWqsWbNGgAGDRpEyZIladxYU1dx/fr1QgbU29ubkSNHMnToUGrUqMHdu3epU6cOI0aMEJpw5HI5hw8fplmzZoDS73nlypVcuXKFWrW0u8nkl549e9KnTx+tr1WsWFFjWVJSEsWKFRPqUdetW8f9+/fZvHkzlpaWODs78/PPP7Njxw6emVdm+7UQoewo6UEgGe+Us0fWTQdjYF0YxHokXNlDZsw74i4pdSDTw5TXJv3dM+Iu/Y7YyBSLah+aYVAoiLv0O5I0pe2jhYUFHTp0AJQBetbjzi7Q/dNPP7F+/Xrq1q2Lo6MjF27cQZGRgtjEErFEiwTeP4GNafnGJD04Q+yZDaS/C8KomAfyzDTSgu9gXqUVJqVrYexWg8QbhwjfNVX5/hbrgwL0LByQJUSwYMECJkyYkG/t044dO7J161aNWYOCoNpXr169hCnoW7duMWnSJIoWLYpEImH27NmsWrUKUGY4taEK8Jo3by48yOzevZvIyEhh2lyV/Zw/fz6BgYF4enoik8kICgpi/vz53Lp1i9OnTwt2nb1792bbtm2MGTOG69evU79+fZKTkzl9+jTDhg2jXbt2tGnThkaNGjFlyhSCg4OpVKkSAQEB/PHHH0IpQH7QBZT/w5iammqV1tiyZQsWFha0afPhy+O7777ju+++Uxs3YsQIqlWrxtKlS4WA8ll4IndO/I5h4VLYd5ou/JiaVWzGm1/6kHT/r48KKGVyBReeR/E8IvE/092u47/F0KFD1f6uX78+Bw8eJCEhAQsLC44dUwp8jxkzRm3c2LFjWbx4MUePHqVRo0acPn2ajIwMRo4cqfb0Pnr0aI2A0srKiocPH/Ls2TOtzSrv3r3jzp07jB8/XggmQRlkNGvWTDim3M6jdevWnDlzBhsbG+bM8kNhYoNVvR7IkmKIzxJQGtg6Ye8zibjz24kN3ITY1BrzKi3RM7Ek+tgKFDIpstQE9K0LI5aYkhEZgkkpT5IfnsXItTJ6plaAUrEhODoZVe+qq6urkCEpXLgwx48fp169euzdu5fz58/To0cPFi5cKFyPnM6xSJEiKBRK15NFixahr69PmTJl2LNnD1u2bBHGTZ8+nYsXL3Lv3j2GDBlCgwYNtAaUx44do1ChQmpNPQYGBkycOJFu3bpRqFAh5s2bJ/xwd+jQQQgmAUqXVmb5tE3n5hcDAwP09PSQyWQ0bdo03+uZmJgwcOBAoaZu5MiRFClShG7dutG8eXN69OjB6NGj6dGjB8/CE9lyJVhYN+XpJSHrZ1q2PnomyoaR+Av+oJATf2GH2r4y3j4h4+0T9CwchIAyM/YtYomx2tiEhARBDmvGjBlaz0f1eWjTpg03b95k6dKlJCUlUbSoEyJDEwwd3TTWUVtfrIdDZz/ir+wh5eFZUp5eRs/YHIlTOQwcXAEwdq2EbcsfiD2/HUVmGnoW9ljV64E0Ppz4S7s0snV5oXqvrVixQuM1MzMzDd90+JABdHFRyiCpppWLFy8uXJemTZtSrVo1ZsyYwerVqzEwMKBhw4YcOXJEoyEoO0OGDGHJkiWA8v1erFgxWrRowdGjR3n+/DnFixfH0dGR69evM3nyZDZu3MjVq1d59eoVHh4ewkMyKGtIjx07xs8//8zOnTvZv3+/UHqjyqSKxWIOHz7M9OnT2b17N5s3b8bV1ZVFixYxduzYfF9L3ZR3NkJCQhg2bBju7u4YGxtja2tL586dNaZHVLZIly5d0nBRyJpuhvzVW6kkArTpPV2+fBmRSPTJfqKg/AELDAykQ4cOglNATujp6VGsWDG1aVj/a6EoMlLQM7FS+zEVS0wQGxghMjDM8xgUCjkJN/7g7YZhhCxqz+uVPYk+sRrSk7TWZ+VGQa5bfu9tTly7do0WLVpgaWmJiYkJDRs2VJtiy41Vq1bh4eGBiYkJ1tbWVK9eXSjk9vPz46effgKUUyGqkoT/kuXWf4G8unVDQkIQi8Ua2ZZChQphZWUlTG+p/ps9QLS3t9f4MZs1axZxcXGULl2aChUq8NNPP3Hv3gcZFdW2cuo6joqK0phGz+k8Dh06xLVn7yk6dAPmVVpiVb+HhkC1SSlPigxYjfO4Azh9vxHzam2QxoWjZ27H29+G8mZFd96s7IE8PRl5ejJ2bcbhMvFPHLvOUdtOhvRD9kc1datC1QwwdepU3rx5I7iBbNy4UUPfL+s5yuVypFIpo0ePJikpibi4OK5evUrnzp3Vro+joyNXr14V9vPo0SO6du3Knj171LJSISEhwr3M2uGq6lwdMGAAiYmJQhYzq9QRKHX4AI3OVy8vLxQKhZpDT3BwMH/+qTlNe+7cOXr16sX+/fvV9DpVZP+tUGFoaMjy5csFIfOMjAyCg4OZPXs2o0aNol69esIUbSlHc+qXtBNc2EQiMWIjM5wnHBaCyfS3T5Ud+2I9XCb+icvEPyk6VJnlFulLKDp8C07DNgljM94+xax8Y3puuCqcq42NDW/fvkWhUKiJcWc9B5VETv369Tl37hxRUVGkpaXx4sVzDE3N8+zeBqW0lXWDXhT9fiMu4w/hNHI79u0nYWBVSBhjVqk5ti1GAGDXegxmFZtSyWcQ6enpQvYalL+92adxXV1dUSgU1KlT55/rJWL9+vV06tQJfX19DA0//Ib179+fjIwMoYbX1dWVpKQkQddSJT2k0hYtWlRdWaFJkyacOnWKyMhI4uPjBUvNvBg8eDCTJik1PJ8+fcrz58/ZuHEj+vr6rF27Vhjn4OBAsWLFAGUm8t27d5w+fVqtnA2Uklxz5szh5cuXZGRk8O7dO/bu3asmnWVmZsbSpUsJCwsjIyODoKAgxo0bp5vy/hRu3LjB5cuX6dq1K05OTgQHB7N27Vq8vLx49OgRJibq6fqRI0dibW2t5qIwYsQINY2y6dOnM2fOHCELeOvWLZo3b65m31WiRAnq1q2Lv7+/mvgogL+/P+bm5rRr1+6Tz+/3339HLpfnqAuXnJwsFH0fPnyY48ePq8keBD6NQOJcgZQnl0i4eQSTkjVRyDJI+PtP5OkpWFRvm+cxxJxYTdL9vzCr0FT5gxYfTuLff5IR/oK/HH/Br61Hvs+nINetoPc2K2fOnKFly5bCE6dYLGbz5s00btyYCxcuaPwYZeW3337jhx9+oFOnTowaNYq0tDTu3bvHtWvX6N69Ox06dCAoKIhdu3axbNkyocNQZbOm4/OQ327dgnyB5kWDBg148eIFf/zxBwEBAWzYsIFly5bx66+/MnDgwI/aZm7nYWhQsBxB7Kl1JN0/jXn1tkiKlkEsMQWRiKg/Fqp1fWfHUF8MGXkfz5fC2NiY8+fPExgYyNGjRzlx4gS7d++mcePGBAQECMek+o7Nj6D9lzqPrFOTgwYNoly5csTExGhMTeaHH374gcjISMaPH8/vv/8uLK+emc6FyHSwdcG4ZA1Sgi4Tuf9njEvWQBr3nqTbxzGwK4Y8QzPbpm9dmPc7JmBepSUKWSaJNw4jNrbArk5n5rZXZrB++eUXIaM1aNAgSpQoQXh4OFeuXOHNmzfcvXsXgMqVK6Onp8eCBQuIj49HIpHQuHFjHBwcMDLQI/PzfbSQOJVFbGRG1J/LsKzRFiMXG2rVKphuogqxWMyOHTvw8fHB19eXY8eO0bhxYyZOnMiuXbto2bIlP/zwAzY2NmzdupVXr16xf/9+oVO8V69e7Nmzh6FDhxIYGEjdunWRyWQ8efKEPXv2cPLkSTXL0o/B0dGRUaNGCfXCLVq04O7duxw/fhw7O7vP+r31segCymy0atWKTp06qS1r06YNtWvXZv/+/fTq1UvtNVtbWwICAtRcFFauXEl8fDyWlpYFqrfq3bs3Q4YM4cmTJ5QpUwZQFnXv2bOHDh065Brw5Bd/f38KFy6sdYoIlNN7Kh9gsVhMhw4dhCe8pHQpoTEp2DQdgjwlgdjT64g9/c9YYwscu81BUjR33aq01w9JuhuAXZtxmHp4CcuNnCsQsWcGTy4FkJzeqEB6nPm9bgW9tyoUCgVDhw6lUaNGHD9+XLiHQ4YMwcPDg6lTpxIQEJDj8alcD1SdgNmpWLEiVatWZdeuXfj4+OTp0qDjy+Di4oJcLufZs2dq+mvh4eHExcUJ01uq/z579kztCT8yMlJrI4WNjQ39+vWjX79+JCUl0aBBA/z8/Bg4cKCwraxdxyqePHmCnZ2dmjByXrjamiICDWOBnEh+egnT8o2xafIhuFVIM4QmCW2I/tlP5Lv8iY/n9xyNjIwwNjYWGhyyom1dsVhMkyZNaNKkCUuXLmXu3LlMmTKFwMBAmjZtipGRkRDoNGrUSG2fWY/rS6Oampw1axYHDhxgzZo12NraakxN5ofIyEhkMplGWQZAx4GjuYkLphWaIkuOJfH2CVJf3cLQzhnbNuNIeXKRtND7Gutpc6yxaT6UuT3qC5a/5cqV4+bNm8ycOZMtW7YQHR2Ng4MDVapUYfr06cK2ChUqxK+//sq8efMYMGAAMpmMwMBAHBwcMDPUJ+YzPmPoGVtg32kGsWc2EHtuO3ftbOjTuxdNmjTR6naUFwYGBuzbt4+WLVvSrl07Tp8+jaenJ5cvX2bChAmsWrWKtLQ0KlasyJEjR2jVqpWwrlgs5tChQyxbtoxt27Zx8OBBTExMKFGiBKNGjRLKJz6VBQsWYGJiwm+//cbp06epXbs2AQEB1KtXL88Zx6+BLqDMRlbP2czMTBISEihZsiRWVlbcunVLI+gYPHiwhovCsmXLCAkJoWLFigWqt/L19WXUqFH4+/sze/ZsAE6ePElUVNRH24xlJSgoiL///psff/xRTYMrK6NHj6ZTp068ffuWPXv2IJPJhKf8kOhkFIDIQIK+rROm5nYYl6yBIiOVhBt/EHlgLo49F2Dwj2CuNlKeXEQkMcWoeBVkKR+68AwLlURkaExa6D2Co5PxKGKZ7/PK73Ur6L1VcefOHZ49e8bUqVM1uu+aNGnC9u3bkcvlOV5TKysr3rx5w40bN6hRo0a+z0vH1+W7775j8uTJLF++XHioAli6VOmLrPoBadq0KQYGBqxatYrmzZsLn2ttItXR0dFqFn1mZmaULFlSEM8uXLgwlStXZuvWrUyaNEmoMXzw4AEBAQEF/tybSvRxtjEhJJ+KCSItnd8Jfx8BRc4NDc62JphK9NE+WatJfs9RT08Pb29vDh06RGhoqDC1//jxY06ePKm2zZiYGLWaU0Bo9lFJPL1+/Zr09HQGDx4sTJlLpVJWrVqFmZkZDRs2zOcZfDoODg6sXr1aa6etCtVUbFZUXuEq8pIyWx34jMUBQVjW9sWytrrFo0lJ9e+e7J7dFjXbC///U3N3utRQL60oUaJErnaBKgYOHKg1+/7mdQi9Nl7j8stoNd3iQj3m57nNnDByKotT36XUKWGr1tCZnyxl9msLyt+I7Ne4RIkSOSYDsmJgYMD48eMFn/acyOnYspc4qfzDs6Knp8esWbOYNWuWsCwuLo7o6GjBT/7fRBdQZiM1NZV58+axefNmwsLC1G6+NhmC/NRlQf7qraysrGjTpg07d+4UAiN/f3+KFi2aY0axIPj7+wPkaoNWpkwZIcvXu3dvmjdvTps2bbh27ZpQNxV5aD4ikRiHzjOE9YxL1eLtusHEnduOvc+EHLefGfsWRXoyb1ZqPwZZcrxafVZ+yO91K+i9VaHKmOTUpalaP6di8AkTJnD69Glq1qxJyZIlad68Od27d/9XhGd15EylSpXo06cP69evJy4ujoYNG3L9+nW2bt2Kj4+PkOWyt7dn3LhxzJs3j9atW/Pdd99x+/ZtYeopK+XKlcPLy4tq1aphY2PDzZs32bdvHyNGjBDGLFq0iJYtW1K7dm0GDBhAamoqq1atwtLSUuMHLz80cndQ6/rNDeOSNUh+cAaxxAQDO2fSw56QFnwHsbH2pgE9sYhGpTVlZvIiv+c4c+ZMTpw4Qf369Rk2bJgQAHp4eKjVns6aNYvz58/TqlUrXFxciIiIYM2aNTg5OQmagW/evKFatWps2bIFc3NzXF1d2bdvH5cuXWL58uUatZH/C4xoVAo7MwkzDj9EKlcUyHBCTyxCXyxiVlsPjWDyczG3fQWaLjtXYCOM3NAXi4Sp+f91UlNT1RIj8OFBNmtN77+FLqDMxsiRI9m8eTOjR4+mdu3aWFpaIhKJ6Nq1q1YZgs9dd9O7d2/27t3L5cuXqVChAocPH2bYsGE5Zr8Kws6dO3F3d6datWr5XqdTp04MGTKEoKAgDM0LkRn3nrSXf2PTYoTaOFUnXnrYo9w3qFAgNrHCru04rS/rGVso67MKSH6uW0HvrQrVa4sWLRKyINnJKoabnbJly/L06VP+/PNPTpw4wf79+1mzZg3Tp0//LOLJOZGcLiU4OpkMqRxDfTGutqb/OWvPr82GDRsoUaIEW7Zs4eDBgxQqVIhJkyYJensq5syZg5GREb/++qtQHxcQEKA2DQbKmrfDhw8TEBBAeno6Li4uzJkzR2jCAmXG88SJE8yYMYPp06cL3aALFizQqleXFz08ndW6fnPDpulgEIlJfngWhSwTSdGyOHadQ/ju6VrHy+QKetYqeLCR33OsWLEiJ0+eZMyYMUyfPh0nJydmzpzJu3fv1ALKtm3bEhwczKZNm4iKisLOzo6GDRsyc+ZMwQZPlW2aOHEiW7duJSEhAXd3dzZv3vyfNZTID11rOFPXzY7JB+9z4XkUemJRrgGc6vU6JWyZ276CMM39JShmY8LMth5MPKA59f6xzGrr8UWP+Vti9+7dbNmyhe+++w4zMzMuXrzIrl27aN68+TeRoBApvmTl9H8QKysrOnTowKZNm4RlaWlpmJmZ0bNnT0E2YcuWLfTr148bN26oFduePXuWRo0aERgYiJeXF7t27aJ79+6cOHFCra4jMjISBwcH+vTpI2wTlFMyRYoUoXPnznh6etKnTx/u3r2rVausIFy7do1atWoxa9Yspk2blu/1VqxYwejRo7l27RoelapSctBy3m//CRvvYZhXUZcZCt8zg4zwFxQbuSOHrUF0wFqSbh+n2Ji9iA0kGq+LgAd+3gUOfPJz3fJ7b7Pfwxs3blCzZk0NPc6PJSMjgw4dOnDixAmSkpIwMjJiyZIljBs3jlevXn1SDeWz8ET8r4US+DSC0JgUtVo6EeBsY0Ijdwd6eDpTyvF/L0OjQ4m2qcVPRU8s0pha1PFtI3wfBEUQGq3l+8DWhEalHehZy/mryrWppuY/lZ+auzO8Ucm8B/6PcOvWLcaPH8+dO3dISEjA0dGRjh07MmfOnFyTGl8LXboiG3p6ehrZxVWrVgnCvAWlIPVWoJS36NatGzt37uTx48caArIfi0qipnv37lpfj4iIENT/VWRmZrJt2zaMjY0pV64cphJ9XIu78V4kJvnxBcwqtxTOR5oQRfqbR0icyuV6HKZl6pF06yjxl3/HuqH6FLJCLqOomUgIJt+9e0d8fDxubm5a3Qqykp/r9rH3tlq1ari5ubF48WK6d++u8cGNjIzMtSM7ex2doaEh5cqV4/jx42RmZmJkZCQ0XmhzygkNDSUlJUUoRdDG65iUPDMSCiAkJoXt10LYciWY+iXtvnhGQse/g25qUQcoJYX82nrgh8c3NWPxrU/Nf6tUrVqV06fz73v+tdEFlNlo3bo127dvx9LSknLlynHlyhVOnz6tFhAUhILUW6no3bs3K1euJDAwsMBdgNqQyWTs3r2bWrVq4eamXVh2yJAhJCQk0KBBA4oWLcr79+/x9/fnyZMnLFmyRAiivKuV5mGlZiTeOUn4rimYuNdGkZFK4q1jKDLTsazVOddjMXKugFnlFiRc2UtG+EuMi1dFJNYjM/YtKU8u4TlsijB20qRJgkRDfrJ2eV23j723YrGYDRs20LJlSzw8POjXrx9FixYlLCyMwMBALCwstFpUqmjevDmFChUSXCMeP37M6tWradWqlVDHpSpDmDJlCl27dsXAwIA2bdpgampK7969OXfuXI5lFL/fCBW+mIE8v5xVr19+GU3TZeeY2daDrv/Pvpj/19FNLerIjqlEv0DNjl+ab3lqXsfHoQsos7FixQr09PTw9/cnLS2NunXrCl67H0t+661UVKtWDQ8PDx4/fpxrA01+OX36NOHh4UyZMiXHMV26dGHjxo2sXbuW6OhozM3NqVatGgsWLKBt2w/akj08ndncfBj69q4k3T1F3LltABgWKoVd6zEYOZfP83hsW4zAsFBJku6cUK4vFqNv6Yiphxeje7b+6PPM67p9yr318vLiypUrzJ49m9WrV5OUlEShQoXw9PRkyJAhua47ZMgQ/P39BdcIJycnfvjhB6ZOnSqMqVGjBrNnz+bXX3/lxIkTyOVyXr16ladkzKdMHcn+yQxMPHCfqKR0RjTSdHLR8d+law1nopLSP9vU4v+3bJCOL4/K6/tbnZrXUTB0NZTfKFWqVMHGxoa//vrr3z4UDb7l+qxv+bp9bn6/EfpZM1ALOlQoUNDg6uqKl5dXjrWn/wYikYgZM2Z8VHf0/ypZM9i6qUUd2viWpsO/pWPRUTB0d+kb5ObNm9y5c0etWedb4lutz/rWr9vH4OXlhaurK1u2bKFv374EBwdz9uxZXsekMOPww7w3UACmH35IHTe7/7dTSTld6/86uqlFHdr4Vhv4vrWpeR35RxdQfkM8ePCAv//+myVLllC4cGE1y8NviW+tPuu/ct0+J5MP3hdqJj8XUrmCyQfv5ztL/PTp088iZ/U5SU1NVfNt1qFEN7WoQ4WugU/Hl0L3zfsNsW/fPmbNmoW7uzu7du36JqyUcuJbqs/6ktdNKpUil8sxNDT8bNv8VJ6FJ3LhedRn365MruDC8yieRyTmK5iQSDRlnz4nycnJBbIdBPJ17z9mu/8rfKtdvzq+DroGPh1fkm8rvfD/HD8/P+RyOY8fP/6qtmAfy4hGpZjfoQISfTF64oIZ0+uJRUj0xSzoUCFPHTE/Pz9EIhFBQUH07NkTS0tL7O3tmTZtGgqFggEDBtCmTRvCwsLo0qULS5YsUVs/IyOD6dOnU61aNSwtLTE1NaV+/foEBgaqjQsODkYkErF48WKWL1+Om5sbEomER4+UYu1PnjzB19cXe3t7jI2NcXd312h0un37Ni1btsTCwgIzMzOaNGnC1atXC3Rt8sL/WqhwveOvHeD99nG8Xt6N0MUdeLd5FMlPLmqsI89MJ+bUOl6v6E7o0s5E7JuFNDGKkPmtibvgL4yLPrqM6hU05YlU9yArrq6ueQpEX7hwgc6dO+Ps7IxEIqFYsWL8+OOPpKamqo3r27cvZmZmvHjxgu+++w5zc/OPakgTiURq9ZOq43706BHdu3fH2tpacFL5/45qarGKszUeRSx1weT/OKsDnzHxwH3SpfIClyvJ5ArSpXImHrjP6kBNr3UdOkAXUOr4RLrWcOb0jw2pU0IpvZNXYKl6vU4JW07/2LBAmckuXbogl8uZP38+np6ezJkzh+XLl9OsWTOKFi3KggULKFmyJOPGjeP8+fPCegkJCWzYsAEvLy8WLFiAn58fkZGReHt7c+fOHY39bN68mVWrVjF48GCWLFmCjY0N9+7dw9PTkzNnzjBo0CBWrFiBj4+PmlzQw4cPqV+/Pnfv3mX8+PFMmzaNV69e4eXlxbVr1/J9nnkR+DRC+EFIvHkYA0c3rOr3wKpBbxDrEXVoPinPb6itE310OYl/H8G4RDWsvfoi0pcQsVfTpUehgLTMj9Nc1cbevXtJSUnh+++/Z9WqVXh7e7Nq1Sp69+6tMVYqleLt7Y2DgwOLFy+mY8eOn+04OnfuTEpKCnPnzmXQoEGfbbs6/vfJ+qD5X+X3G6GfZTYJYHFAEA1bd9aQcsv+MPets2XLFkQikYaHto6PR/dIquOT+Vr1WSq3GoDBgwfj6urK2LFjmTdvHhMmKP3Du3XrRpEiRdi0aRMNGjQAlP7qwcHBatPWgwYNokyZMqxatYqNGzeq7efNmzc8f/5cTay8V69eKBQKbt26pebfPn/+fOH/p06dSmZmJhcvXqREiRKAUhvT3d2d8ePHc+7cuQKfc9amkC1btpCULqWC30lhWZHB69Qch8yrtebdllEk3jiISckaAKS/f07KkwuYV2+HTVNlMGVetRVRR5eTGfFKY59SmYLkdOlnyVgtWLBAzXt28ODBlCxZksmTJxMaGqp2LdPT0+ncuTPz5s375P1mp1KlSoK4f05kv9Y6dPyXUKksvHql/EwXL16cwMBA3CrW/OwNfHdex2HxmWu4v3VUMzJ+fn5qDXw6PqALKHV8Nr50fdbAgQOF/9fT06N69eq8efOGAQMGCMutrKxwd3fn5cuXamNVnutyuZy4uDjkcjnVq1fn1q1bGvvp2LGjWjAZGRnJ+fPnGTVqlFoABAjTwDKZjICAAHx8fIRgEqBw4cJ0796d3377jYSEBCwsLD7pGoREJ6sF6lmDSVlaEshlSJw8SHn0IXhNe6k8R/Oq6laZ5tVak3xfu+tCcHTyZ+m0zBpMJicnk5qaSp06dVAoFNy+fVvjen7//fefvE9tDB069ItsV4eOb50v0cAnVyiITclQW/Zfa4jr1asXXbt2/eK14P+f+O/cfR3/Kb6E9EP24MPS0hIjIyMNxyFLS0uio6PVlm3dupUlS5bw5MkTMjMzheXFixfX2E/2ZargtHz5nEXbIyMjSUlJwd3dXeO1smXLIpfLef36NR4eHjluIz9kSOVqf6c8v0785d1khL8EWWaWVz6UHkgTIkAkRt+qkNq6BtZF8r2fjyU0NJTp06dz+PBhYmNj1V6Lj49X+1tfXx8nJ6fPst/saLvPOv5/8v+pKetNTAoXnid/9u0qS2Pkag1833ITqTayJhpyQqFQkJaWpvZgrCNndDWUOv4zaPvw5/SFkFWvf8eOHfTt2xc3Nzc2btzIiRMnOHXqFI0bN0Yu1wycvuUvD0P9Dx/ZtNcPiNw3G5GeAbbNv8ehsx8OXedgUq4h8JEZiX8yrln3A3yUl71MJqNZs2YcPXqUCRMmcOjQIU6dOiVME2W/9hKJ5IvJEH3L91THlyO3piwvLy+tAvx9+/bN0ep12bJluLi4YGxsTMOGDXnw4IHGmCdPntCpUydsbGwwMjKievXqHD58WG2Mqn7v0qVLjBkzBnt7e0xNTWnfvj2RkZGffN4qTj8OF+rWZUmxRB1dzptf+hCyyIc3q3oRsW820rhwYXxK0FUi9vrxZnVvQhb5EPbrQOIu7UIh1/z8i0Sw42polr+1N8Q9f/6cvn37YmVlhaWlJf369SMlJUVtW5s3b6Zx48Y4ODggkUgoV64ca9eu1djnzZs38fb2xs7ODmNjY4oXL07//v0/6tpoq6F0dXWldevWnDx5kurVq2NsbCyUWenIG12GUsf/PPv27aNEiRIcOHBArVN5xowZ+VpfNYWt7cdDhb29PSYmJjx9+lTjtSdPniAWiylWrFgBj1wTV1tTRCjDxZSnlxHpG+LYZTYifQNhTNK9U2rr6Fs4gEKONO49BjZFheWZsW81ti82MkWenoyrrXoGJyQkpMDHev/+fYKCgti6dataE86pU6dyWUuHjs9P586dKVWqFHPnzuVjzeG2bdtGYmIiw4cPJy0tjRUrVtC4cWPu37+Po6MjoGzMq1u3LkWLFmXixImYmpqyZ88efHx82L9/P+3bt1fb5siRI7G2tmbGjBkEBwezfPlyRowYwe7duz/5nAFuv45DZu0AQOTBuWREhWJRrTV6lo7IU+JIfXUHaUIk+lbK40+6fxqRgTHmNXwQGxqRFnKP+Av+KNJTsW6sHrgpFBAYFIEfuc+6+Pr6Urx4cebNm8etW7fYsGEDDg4OLFiwQBizdu1aPDw8aNu2Lfr6+hw5coRhw4Yhl8sZPnw4ABERETRv3hx7e3smTpyIlZUVwcHBHDhw4LNcKxVPnz6lW7duDBkyhEGDBmmdddKhHV1AqeN/HlUWU6FQCAHltWvXuHLlisY0ujbs7e1p0KABmzZtYsyYMWrrqLapp6dH8+bN+eOPPwgODhYyHOHh4ezcuZN69ep9cv0kKEsJnG1MCIlJAZEYRKBQyBChDCilceGkPlOXKTIqURXObyPx1jGhKQcg8e8/NbZvYFUYRXoyL54+omLFigC8e/eOgwcPFvhYs153FQqFghUrVhR4W5+bFy9eAODm5vYvH4mOr0F+mrLy4vnz5zx79oyiRZUPZS1atMDT05MFCxawdOlSAKHO+saNG0Jt3rBhw6hXrx4TJkzQCChtbW0JCAgQvpfkcjkrV64kPj4eS8uClQx5eXmpfdYS0zKFBj55WhLpYY+xatQfS88OwhjL2r5q27Br+5N6k1+V74g+sZrE20exatBL7cEVIDQ6Jc8GvipVqqg1PkZHR7Nx40a1gPLcuXNqswgjRoygRYsWLF26VAgoL1++TGxsLAEBAVSvXl0YO2fOnNwvTAF5/vw5J06cwNvbW2151kzm/4KD1pdAN+Wt43+e1q1b8/LlS9q3b8/69euZNGkSLVq0oFy5cvnexsqVK1EoFFStWpXJkyfz22+/MWXKFKpUqSKMmTNnDvr6+tSrV4+5c+eycOFC6tSpQ3p6OgsXLvxs59PI3QE9sQhjtxooMtOJ2D2DxNvHiLu4i3fbxqJvVVhtvKRQSUzc65B48w+ijiwh8dZRIg8tUNZdgjDNDWDu0RADI2Pat2/PihUrmDdvHp6enpQuXbrAx1mmTBnc3NwYN24cc+fOZfXq1TRu3Jg3b94UaDtnz5797JIkTZo0oUmTJp9te/8GyelSHr6N53ZoLA/fxpOcLv23D+mb5XM0Zfn4+AjBJChVJzw9PTl27BgAMTExnDlzBl9fXxITE4mKiiIqKoro6Gi8vb159uwZYWFhatscPHiw2qxJ/fr1kclkHzUjkJ2sDXwifQno6ZMeel/ZvJcDWYNJeXoKspR4JMU8UGSmkxn9WmO8AmUDX25kv/b169cnOjqahIQEYVnWYDI+Pp6oqCgaNmzIy5cvhVprKysrAP7880+1OvjPTfHixTWCSR35Q5eh1PE/T9++fXn//j3r1q3j5MmTlCtXjh07drB37958P2lWqlSJq1evMm3aNNauXUtaWhouLi74+n54wvfw8ODChQtMmjSJefPmIZfL8fT0ZMeOHXh65s/OMD/08HRmy5VgjF0rYdvyB+Kv7iPm9G/oWzli7dUXaXw48ZHBauvYth6Dnqk1yY/Ok/LsKkYulf6PvbOOjuJq4/CzG9m4EiFIgkOCFgnFkmDB3d2KuxXaAgmlaHFK0SIBCjS4SwkUlxbXYAmaEHfd+f7Y7pDNbgwCBb55zsk57OydmTtzl9137n3f3w+7Nt/yctUgZPoZXICMzFm18XfmT/+BiRMniktVgYGBOivis8PAwIB9+/YxcuRIZs2ahZGREW3btmX48OFUqlQp18eJi1P9ABYsWDCHll8+n6r/8qdOfhRllSpVSmtb6dKl2b59O6Ca2RIEgSlTpjBlyhSdxwgNDdUISjOvkFhbWwNoFbC9CxkL62T6Blh79iXyxFqeL+mBwqkMxiWrY1a+AXpm1m/3eRNE1F9+JAXfQEjWzHNUZnqt6zy6yO4a1as2Z8+eZdq0aZw/f14rv1I9W+vh4UH79u3x9fVl4cKFeHp60qZNG7p165avldpSAd+7IwWUEp88Pj4+Omen1q9fr1MHLHOQKJPJmDx5MpMnT9bY3rx5c43XLi4u2eZXubm55ZivU6VKFQ4fPpxtm/ellIM5dUsW4NzjcMwqNcasUmOtNlZ1NV1m5AZG2DQegk3jt7I86hlKPfO3ovS1itvSp6M7fTq21jpm5jHILAiceckNVBXuunImM7fLaiwB/vrrLwoXLpyjK4+6cCijdElWn53PTcxY8l9+P3QVZclkMp3/39+lAA3eFpmNHz8+yxmukiU1XcFyU1T4rmQurLOo3hrjkjVIfHCexCdXiTq9iZjzf+DQdSaGjiVQJsURsmUyckNjrOp0R9+6IDJ9Q1JePyTq5HoQdAeOmc+TmZyu8dGjRzRo0ICyZcuyYMECihQpgqGhIQcPHmThwoXifZXJZPj7+3PhwgX27dvHkSNH6NevH/Pnz+fChQuYmZnl8Q7pRirge3ekgFJC4jNkZtsKNFx4KtcWasrUZI3lLICYy3tAJseoiEoOSV8uY2bbCvne1/clICCAKVOm5DgL8erVKwAtGanPHcl/+cNgbW2toVerJqvl5sBAbcvBBw8eiPnS6uI9AwMDGjZsmH8dfUcyFvCpMbAuiIF7Oyzc25Ea8YJX60YSc3kXBVqOJyn4JsrEGOzafodR0bcSaWlRr7M8h+zf87wP+/btIzk5mb1792rMZma2xlVTs2ZNatasyU8//cSWLVvo3r07W7du1dAplvhvkHIoJSQ+Q4rYmODbKvealjEXdxDqP52YS7uJubKPkO3TiL/1J2aVGqNvoRJxn97K7ZOczbp8+TIDBw7Mto2/vz9Dhw5FJpPh5eX1kXr24ZH8lz8cJUqU4N69exoyPdevX+fs2bM62+/evVsjB/LSpUtcvHiRpk2bAmBvb4+npycrV64UH24ykp9yQLlBXcAHoExNQkjTFCLXty6IzNAYIe3ffESZOhzIUESXnkrsPwezPEdRW5P3NqzQVbwXHR3NunXrNNpFRkZqzdxWrlwZULlsSfz3SDOUEhKfKV2qFyUsLjlXHr2KQuVIenqN6HNbUaYkoW9hh2WdbljW6gzAhMZl8uSr/qkxceJEZDIZa9euzbPMR58+fTh58mSulsF9fHzw9fV9pyXJ9evX07dvX548eZKlzmFG8tt/2c5M8c5jnNe+fw7069ePBQsW4O3tTf/+/QkNDWXFihW4ublpFIyoKVmyJHXq1GHIkCEkJyezaNEibG1tmThxotjml19+oU6dOlSoUIFvvvmG4sWLExISwvnz53n+/DnXr1//mJeIVxl7/C4GkRLxkpDfv8ekXB0MbIsik+uR8OA8yvgoTMqpLGoVhcshNzIjbP9CLKq1BGTE3w4gK01bmQy8Stu/dx8bN26MoaEhLVu2ZNCgQcTFxbF69Wrs7e01AvMNGzawfPly2rZtS4kSJYiNjWX16tVYWFjQrNlbF7A+ffqwYcOGL+qz+rkgBZQSEp8xw71KUcBMIS6JZjWLZVysCsbFqmhs05PL0JfLmN7K7bMOJgGdS5fvSkJCAnPnzs1S+Ppj8Cwi4Z39l58v70d6TKjW9kFHm1LrmP8nOQv9X1CuXDk2btzI1KlTGTt2LK6urvj5+bFlyxadxXq9evVCLpezaNEiQkNDqVGjBsuWLdMoFnN1deXKlSv4+vqyfv16wsPDsbe3p0qVKkydOvUjXp0KdQGfnkUBTF3rkRh0nfhbASDXw8C2MAXaTMK0bG0A9IwtsOswjcgTa4j6axNyI1NM3bwwcqlE6DbtvgsC9Kj5/t8bZcqUwd/fnx9++IHx48fj6OjIkCFDsLOz0xAt9/Dw4NKlS2zdupWQkBAsLS2pUaMGmzdv1iikiYuLw9jYWKwKl/h4yIT8yP6VkJD4T8lN0YYa9ftS0YaKzDOUYWFh2NnZMW3aNK2CnrS0NNLS0t7JZi4vs3w9117k3OPwPC9zgyqglBuZYVFDU/NQUaAQ9evUwq9/3hUHvsQZyv8X3uezlBXqAr53+Sx9aBwcHOjVqxfz5s3Ltt3atWsZMGAAz549+2CWr/9vSDOUEhJfAEVsTPDr7/5WVuZBKMHhOmRlbE3wKm1Pj5pFRQ9eidyjr6+vUUX+IQgMieX0w7D3Ooa+uS1m5bVzSU8/DNPwX/5SSEtLQ6lUYmhomHPj/zPyWsCXGz7VAr7bt2+TmJjIt99+m2PbV69eIZPJsLGx+Qg9+/9AKsqRkPiCKOVgjk8rN06N9+KWjzcHRtRh15BaHBhRh1s+3pwa74VPK7dPPqBQ+wA/ePCAHj16YGlpiZ2dHVOmTEEQBJ49e0br1q2xsLDA0dGR+fPna+yvy6cX3oqkZ6U/+vTpU+zsVEVKvr6+yGQyDVF1db8yIpPJGD58OJs3b6ZMmTIYGRlRtWpV/vrrr1xd66FDh6hbty6mpqaYm5vTvHlz0sODc94xB4T0VJQpSRrb9OQyDf9lXdy+fZv69etjbGxM4cKFmTFjhk7Pe4Dly5fj5uaGQqHAycmJYcOGERUVpdHG09OT8uXLc+fOHby8vDAxMaFQoUI6xf5DQ0Pp378/Dg4OGBkZUalSJTZs2KDR5unTp8hkMn7++WcWLVpEiRIlUCgU3LlzB4ClS5fi5uaGiYkJ1tbWVKtW7b1dct6FT0V4Pq8FfLnhUy3gU+e/Zqf0EBISwi+//MKKFSv4+uuvMTH59K7jc0WaoZSQ+EIxVejj5pQ3+7ZPjc6dO1OuXDlmz57NgQMHmDFjBjY2NqxcuZL69eszZ84cNm/ezPjx46levTr16tV7r/PZ2dnx66+/MmTIENq2bUu7diqbOrUNZVacOnWKbdu2MXLkSBQKBcuXL6dJkyZcunSJ8uXLZ7mfn58fvXv3xtvbmzlz5pCQkMDU2QtJvTWBgn2XiB7LeSUp6AbBP7cHQYmehT0W1VtjUb016UohW//l169f4+XlRVpamuhFvWrVKp3afOoCpYYNGzJkyBDu37/Pr7/+yuXLlzl79iwGBm9t+iIjI2nSpAnt2rWjU6dO+Pv78+2331KhQgWxSjoxMRFPT08ePnzI8OHDKVasGH/88Qd9+vQhKiqKUaNGaZx/3bp1JCUlMXDgQBQKBTY2NqxevZqRI0fSoUMHRo0aRVJSEjdu3ODixYt069btne5lXvhUhefzUsCXE597Ad/du3eZMGECNWrUYPXq1f91d74opIBSQkLik6VGjRqsXLkSUNnUubi4MG7cOGbNmiUua3Xt2hUnJyd+++239w4oTU1N6dChA0OGDKFixYr06NEjV/vdunWLK1euULVqVQC6dOlCmTJlmDp1apZi+HFxcYwcOZIBAwawatUq1bbkNJY9d+L5qsFEn9+ObdMReb4GQ3sXFIVdMbApjDIxhribfxL552rS4yKw9uqbrf/ynDlzePPmDRcvXqRGjRoA9O7dW8sl5s2bN8yaNYvGjRtz6NAh5HLVYlfZsmUZPnw4mzZtom/fvmL7ly9fsnHjRnr27AlA//79cXZ2Zu3atWJAuWrVKu7evcumTZvo3l0lzD948GA8PDz44Ycf6NevH+bmb4Ow58+f8/DhQ3FGGeDAgQO4ubnxxx9/5Pm+vQ+fg/B8bgv4dPElFfB5enpqufFI5A/SkreEhMQnS0axYj09PapVq4YgCPTv31/cbmVlRZkyZfK10juvfP3112IwCSq7udatW3PkyJEsnVeOHTtGVFQUXbt2FX2frwUGI8jkKJxKkxR84536Yt9hKpY1O2BSuiZmlRrj0H02RsW+IubybtJiwrL1Xz548CA1a9YUg0lQzdqqAzw1x48fJyUlhdGjR4vBJMA333yDhYUFBw4c0GhvZmamEZwbGhpSo0YNjTE7ePAgjo6OdO3aVdxmYGDAyJEjiYuL49SpUxrHbN++vUYwCarPwvPnz7l8+XIOdyn/2Ho5mIYLT3HucTiQd+H5rZffP70ht3SpXpTjYzyoVfytO1Z2qN+vVdyW42M8PvtgUuLDIs1QSkhIfLJk9gG2tLTEyMhIK0fK0tKS8PDwj9k1DbLyeU5ISODNmzc4Ojpqva92Xqlfv77OY8oU+TNzJZPJsKjemqQn/5AUfBOz8l5Z+i8HBQXp9J3PrO2pdpPJvN3Q0JDixYtruc0ULlxYK/fU2tqaGzfeBs1BQUGUKlVKI0AFlbxPxnOq0eW5/O2333L8+HFq1KhByZIlady4Md26daN27do6r/d9WRYQ+M7LyOn/zhJO2nmTsLhkhntpf4Y+BFIBn8SHQgooJSQkPll0+QDnxv84c/Ci5l19mj8E6kIXPz8/MeB8GhbP93tuASCT5d8Ckt6/bkjKpFggZ//l/OZDeFbryussV64c9+/fZ//+/Rw+fJgdO3awfPlypk6diq+v7zufSxe6hOfTokJ4saI/ts1GY1Yx9/aL7ys8/y6oC/h8cCM+OY2n4fGkpCkx1JfjYmv63g44Ev9/SJ8YCQmJLw5ra2sArYrjrHyaM5JVMJodWfk8m5iYaC3LqilRogSgsuxTez/HJ6fx03X9LLxJ3h21H7OeiWW2/svOzs46r+X+/fta7dTb1R7WACkpKTx58oSGDRuyZcsWQkO1BdazwtnZmRs3bqBUKjVmKe/du6dxzpwwNTWlc+fOdO7cmZSUFNq1a8dPP/3E5MmT30k/VBfvIzyfFVP33qZWiQL/SfX0l1DAJ/HfI+VQSkhIfHGog7WM0j3p6eli8Ut2qGVEMgej2XH+/Hn++ecf8fWzZ8/Ys2cPjRs3znJ2ztvbGwsLC2bOnElqqspPOaP/cnpCdK7PryY9MRZBqTkLK6SnEXPBH/T0MSpaMVv/5WbNmnHhwgUuXbokbnvz5g2bN2/WaNewYUMMDQ1ZsmSJxizj2rVriY6Opnnz5mzZsoVFixbluu/NmjXj9evXbNu2TdyWlpbG0qVLMTMzw8PDI8djZE57MDQ0xNXVFUEQxHucH3y36yZpOnIl9SztKTp+J6Y6NEBzIk0p8N2um/nRPQmJ/wRphlJCQuKLw83NjZo1azJ58mQiIiKwsbFh69atpKXlrAVobGyMq6sr27Zto3Tp0tjY2FC+fPls5X/Kly+Pt7e3hmwQkO0yq4WFBb/++is9e/bkq6++okuXLtjZ2SFc/ptXfx1HUagcNo2H5Om6EwMvEn1uGyZla6Nv6YAyKZb4O6dIfROElUcvDC1ssvVfnjhxIn5+fjRp0oRRo0aJskHq2UM1dnZ2TJ48GV9fX5o0aUKrVq24f/8+y5cvp3r16vTo0YMdO3bkqe8DBw5k5cqV9OnTh7///hsXFxf8/f05e/YsixYt0qjwzorGjRvj6OhI7dq1cXBw4O7duyxbtozmzZvnav/ckJ3wvEwmA/13E1dPVwpawvPx8fGYmuqeTZaQ+NSQZiglJCS+SDZv3kytWrWYPXs2M2fOxMvLi9mzZ+dq3zVr1lCoUCHGjBlD165d8ff3z7a9h4cHixYtws/Pj6lTp2JjY8OhQ4dy1K/s1q0bf/75J4UKFWLevHmMGjWKoMvHMLAvjmnFRrm+VjUG9i4YFChC/O0AIo6vJPr8H8gVphRoMwnLrzuRrhSy9V8uWLAgAQEBVKxYkdmzZ7No0SJ69eqlpQEZGxtLVFQUNjY2HD16lOHDh7Ny5Uratm3L0aNHadSoEQcOHCAoKIhTp05x+/Zt0bIxJSWFqVOnsm/fPoKDgzE1NaVu3bpcuHCBkydP0r17dzZs2MC4ceOIiIiga9eurFmzBiMjI+zs7Ojdu7fGfa9UqZL4etCgQcTFxbFgwQK++eYbli9fzsiRI9m0aVOu7+GNGzfo06cPxYsXx8jICEdHR/r16yfOfm6+GJxldXRaVAhBs1sQd+O4xvbEp9d5vWkiwfPbE7ywM6H+P5Ia9kyjTdTpzQTNbsHC7QF069YNa2tr6tSpA6jybX18fHBycsLExAQvLy/u3LmDi4sLPXr20hBQfxESxujRoylSpAgKhYKSJUsyZ84cDXH6jOLwq1atEsXhq1evrlUh//r1a/r27UvhwoVRKBQULFiQ1q1ba5kG6BLov31bMy2gT58+mJmZ8eLFC9q0aYOZmRl2dnaMHz/+k8pvlng3JC9vCQkJifdAJpMxbNgwli1blm/H/NT9l7t3746/vz/Dhw/H1dWV8PBwzpw5Q+fOnenevTvHjh1j4sSJPH/+nIULFwIq6aA2bdoQFhZGxYoV6dq1K6VKlSI2Npa1a9fy+PFjLl26ROXKlcXz9O3bl/Xr19O0aVO8vb1JS0vj9OnTNGzYkOHDh7NmzRq++eYbbt68qTGDfPnyZWrUqKGhfZlb5s+fz549e2jUqBGOjo7cvn2bVatWUaFCBS5cuIDnzycJitCtY6irKCfx6TVCt09D38oRs0qNEVJTiP17HwhKCvZZLIrXR53eTPTZ3zFxcKZRzcp4e3sjCAJDhw7l22+/Ze7cubRs2RJvb2/+unCFw4cOkZiUhGGxahRoMQYAZWoSrzeOR4iPoGazzjSu4cbDW//g5+fHyJEjxRSEp0+fUqxYMapUqUJsbCzffPMNMpmMuXPnYmRkxOPHj0Vh+tq1a3P79m1GjBiBi4sLoaGhHDt2DB8fH1H3NaNAf/PmzUlISODXX38lKiqKq1evig8Tffr0Ydu2bZQoUQJ3d3eqV6/O8ePHxeKpIUPyNiMv8WkhBZQSEhIS78GHCCifRSTQcOEpkrOQ93kXFPpyjo/xyJeiDysrK3r06JHtNbdo0YJbt25pzWSlp6eTnp6u4bsdFRVF2bJlad68OWvXrgUgICCA+vXrM3LkSBYvXqxxDEEQkMlkREdH4+joyKhRozRmn0eNGsXatWsJCQnJ85JxYmKiVgX51q1b6dq1K4ePBzD4eHyWRVO6AsqXv40kPS4Cp29+Rc9YtZSdEvqEV+tGYermSYEWY1X34N+A0tTVg5B/jot5riEhIRQuXJgWLVqwZO1mUUA95uzvRJ7ejGn5BmJAGXV2KzEX/CnYdzFGBQqTrhSoW7IAFjf/YOWyRTx58oQiRYqIAaWtrS2BgYFiEdvevXtp3bo1+/bto0WLFkRFRWFtbc28efMYP368zmuOi4ujSJEidOzYUSNHOSQkhDJlytCpUydxe58+fdiwYQPTp09nypQpYtuvvvoKuVzOlStX8jJUEp8Y0pK3hISExCfGp+6/bGVlxcWLF3n58mWe99XT0xODSaVSSUREBGlpaVSrVk2jsGnHjh3IZDKmTZumdQx1Jb6lpSWtW7fm999/F4uD0tPT2bZtG23atHmn/MOMwWRSUhJhYWHUrFkTgICzF/JUgZ8WF0Fq6GPMKjQQg0kAQ/tiGLlUJvGRdgBlVrmphvD8n3/+SVpaGuUadNAQUDf9qoXWvgn3zqAo4obcyIyUuCjSE6I5fesxe8NsSU9P1/KX79y5sxhMAtStWxdAFJw3NjbG0NCQkydPEhkZqfMadQn0h4WFoaenh7u7OwEBAVr7DB48WON13bp1/1NjAon8QSrKkZCQkPgE+ZT9l+fOnUvv3r0pUqQIVatWpVmzZvTq1UtDQig7NmzYwPz587l3755G9XVGsfJHjx7h5OSEjY1Ntsfq1asX27Zt4/Tp09SrV4/jx48TEhKS56VuNREREfj6+rJ161Yt2aPo6GjIQ81NerRqfwObQlrvGdgWIenJPyhTkpAbvpUz0rdy0BCeV0tdbbidhIHV2+16xubIjcw0jpkW+YrUN095vkTT2UjNjrO3yWh6lNk4QB1cqoNHhULBnDlzGDduHA4ODtSsWZMWLVrQq1cvUTs1J4F+CwsLjdfqXNjM580qYJX4fJACSgkJCYn34ENmDX2q/sudOnWibt267Nq1i6NHjzJv3jzmzJnDzp07RW/urNi0aRN9+vShTZs2TJgwAXt7e/T09Jg1axaPHj3Kc1+8vb1xcHBg06ZN1KtXj02bNuHo6Chqe77LtZ07d44JEyZQuXJlzMzMOHz4MAsWLODq3UdQqc47HTe3yPQNGdilJaaG+pw8eZLrz6Nyva8gKDFyqYJFzfY637+EE9suB+P+bzyXG8H50aNH07JlS3bv3s2RI0eYMmUKs2bN4sSJE1SpUkWnQH9Gbt26hUwmE2cqszqnxOePFFBKSEhIfMJ0qV6U2iUKiLlzenJZtoGl+v1axW2Z2bbCBxPKLliwIEOHDmXo0KGEhoby1Vdf8dNPP4kBZVYC8f7+/hQvXpydO3dqtMm8tF2iRAmOHDkiyj5lhZ6eHt26dWP9+vXMmTOH3bt3880337xT4BIZGcmff/6Jr68vU6dOFbf//fffANx6GUOBSlntraNvliqJptSIF1rvpUY8R25soTE7CSrbQyN9Vd+fRSRw6qVqrNMiX2Fg9TZgS0+MQZkUp7GvgXVBhNREjF0qZ9mnqXtvs669S+4vAtVYjBs3jnHjxhEYGEjlypWZP38+mzZt0inQnxF9fSnM+H9ByqGUkJCQ+MRR+y8fG12Pnu7OONuakDlckwHOtib0dHfm+Jh6+PV3/yDBZHp6umrpNwP29vY4OTlx+fJlWrRQ5faZmppqtYO3M1QZZ8EuXrzI+fPnNdq1b98eQRB0anlmnhXu2bMnkZGRomxQjx493unadPUNYNOOfTrbP1/ej9A/stYa1TezwcC+OHG3/tQI/lLePCXpyVWMS1TT2qewjYkoS/TdrpsYFq0Ecj1irx7UaBf7936tfU3K1iH5xT1ebRir9Z4yKQ5BmU6aUmDekXtZ9jkjCQkJJCUlaWwrUaIE5ubmJCcnA7oF+jNSrlw5EhMTxYpwgPXr1yOTyaQinC8M6dFBQkJC4jPhU/Bfjo2NpXDhwnTo0IFKlSphZmbG8ePHuXz5skaBR9WqVdm2bRtjx46levXqmJmZ0bJlS1q0aMHOnTtp27YtzZs358mTJ6xYsQJXV1fi4t4GXV5eXvTs2ZMlS5YQGBhIkyZNUCqVnD59Gi8vL9q1a8eqVato06YNVapUoXz58vzxxx+UK1eOr7766p2uzcLCgnr16jF37lxSU1MpVKgQe/Yf4v4DbTvK3GJdvx+h26fxym88ZhUbI6QlE/v3fuQKEyzrdNNqX6dEAS4FQGJKOqcfhiEzscKiWitiLu0i1H86xsWrkhL6hMTHfyM3toAMs7wW7u2IPredlFeBhB9agqFjSYSUJFLeBJFw/yyFhqwl3cSSy09zl6/44MEDGjRoQKdOnXB1dUVfXx9/f39CQkLo0qWLeM90CfQHBwdz4MABateuna8KCBKfLlJAKSEhIfEZ8l/5L5uYmDB06FCOHj3Kzp07USqVlCxZkuXLlzNnzhyx3dChQ7l27Rrr1q1j4cKFODs707JlS/r06cPr169ZuXIlR44cwdXVlU2bNvHHH39w8uRJjXOtW7eOihUrsnbtWiZMmIClpSXVqlWjVq1avHz5El9fX1xcXKhcuTK9evVi4sSJ71SM8+LFC6ZOncqhQ4cICwvDwMCAefPmYWxsjGWpaljUaEPE8dWgTCfiz9XE3wpASEtGEASEdCet48Vc3k3UXxtJT4xB37wApq6epEW+JPr0ZtDTw6hIedLiInjjPx3bFmOJPL6a5BeqWcMOVQtzaQ2ExCaJ6QtWnn1Ark/s3/tIfHgJkCE3sURITUImf7u0LzcwQqYwRUhJIO7GMbh+FGRy9MyssarTDblCVfUuz0KYPTPDhg0D4PDhw6xatQqlUomjoyPbt2+nQ4cOTJs2DR8fH7p164aTkxOzZ89mypQpyOVyXFxcqFu3LhUqVNDIoQSVWDqoZjfj4+PFqv/o6GgsLSVP8c8VKaCUkJCQkNCJLus/Q0ND5s6dy9y5c7XaZwwoTU1NtTzAQZVbOXnyZCZPnqyxvXnz5lpt9fT0GD9+vIYGYlpaGkqlUsMKUt0vmUxG9+66K5yz4uXLl9SoUYOoqCgGDhxI2bJlefHiBf7+/vjtPkL7dTeQ/et8kxr6BLmRKZZ1upIeHUrMpV2kvgkSjyUIqgIVmb4C8+ptkBsakRR0g/hbf2JRox2OPeeJbV9vnkRabDih26dhWq4e5hW8cCtelBrlXACISkjFSp0rK5OREvIQEDCv1hqDAkVIeRlI3I0jJD2/Ix4z5U0QQmI0MoUJVnX7ItMzIC3yFcmvHmDh3k5sJ7ewp968E4wfr+05nnG538DAAENDQ+Lj4xk2bBjly5fHwcGB1q1ba+3n6emJp6cnLi4ueHp6sn79egCNh4T169ezatUqChcuDKhki6pWrcqLFy/Yv38/UVFRUkD5GSPlUEpISEhI4OPjg0wm486dO1rWf2lpafz444+iRZ+LiwvfffedmEeXmaNHj1K5cmWMjIxwdXVl586dWm2ioqLyZBG4aNEi8fxqz3BQuenIZDJGjx5NmTJltKRwsiMlJYWmTZvy8uVLZDIZq1atYtOmTaK14d670Ro2i3Jjc+y7/IRF1ZZY1++PzNCY9PhI4u+f4+VvI3i5WqWvaFysMpbu7TCv0gy7NpMwq9yE2H8OEH70V57/0oegeW1IfvmA9PhILOt2x6bRIGyqNmPmgBbIZDKCgp8RHxnKi1/7E/xze16uGUbS02vYdfJFbmxG9Nnfibt5TDU24c9Ien4XgKSn1wBQFCyNgW1hYq8eJObvfSgTokm4f07j2oPDE3Jl0/j69WvevHkj3texY8eiUCgA1cxuZlJTUzl58iQ2NjYYGRkxaNAgjffv3LnDmzdvAOjXrx/9+/dn6tSpHDlyhI4dO1K4cGHu37+f6zGU+HSQZiglJCQkJEQ6duxIqVKlmDlzpjhbNWDAADZs2ECHDh0YN24cFy9eZNasWdy9e5ddu3Zp7B8YGEjnzp0ZPHgwvXv3Zt26dXTs2JHDhw/TqJHKnzwhIQEPDw9evHjBoEGDKFq0KOfOnWPy5Mm8evVKtAhUs27dOpKSkhg4cCAKhYK2bdsSGxvL1KlTqV+/PkqlkpMnTzJmzJg8XWtUVBQ3b96kRIkSjB8/XrSB9Pb25tKlS5x8EKlRUW9WuYlGZbpMzxCBRML3L0RRxBVlcgLp0aFEn9uOokh5FE5lENJTMXQqTdy1w8TfPon5V83Rt7Aj6vRmlAkppL4JBlTC807/6kyGhISQnpKGVb2eKJNiiT63DZARdXIj6bFvkBuZkx4bLvYjOfgGRoXLiUvaKW+e8mbXbMy/aoZZ+QbE3TzOm92zse/ki3GxKgCkpyZR38uT8NDX2Y6BoaEhKSkpbNmyhdjYWAYNGoRMJmPixIls27aN5cuXizaNt2/f5tWrV1hYWPDdd99hamoquuScPn0aT09PjRlIdcFPWFgYjRo1IiIiglOnTomV4xKfGYKEhISExP8906ZNEwCha9euGtuvXbsmAMKAAQM0to8fP14AhBMnTojbnJ2dBUDYsWOHuC06OlooWLCgUKVKFXHbjz/+KJiamgoPHjzQOOakSZMEPT09ITg4WBAEQXjy5IkACBYWFkJoaKhG28uXLwuAAAhWVlbCd999l+drfvHihQAI33//vbgtMjJScHBwEHr27iO4TNovOE/aL9g2Gy0AgmOv+YLzv9ucJ+0X5CZWAiBY1u0uIJMLBrZFBOv6AwT0DARkcrF/6j/bluPEfRVFygsyhamATC78uPUvjevV19cXFIVcxbYyhYnWsTL+mX3VXHCetF8oMm6H6twgyAyNBZNydYUCrb8VCo/eKuiZ2QiGDiXEY1rW7SEYm2Q/Bh4eHkLRokVVfbe1FSIiIsR26nPv27dP3NagQQPBwMBA6NGjh7jtxIkTAiAUKlRI3Obt7S0AgkKhEDw8PARHR0fBxcVFePr0aZ7HUOLTQVrylpCQkJAQyWyLd/CgSq5m7FhNKZpx48YBcODAAY3tTk5OtG3bVnxtYWFBr169uHr1qliM8ccff1C3bl2sra017PoaNmyo0yKwffv2Wu4qatatW0dkZCQ//fRTnq81o1ZlZhvIy1f+1rZZlOn+yVQUdsP527049pxH9PntyPQNQVBi23ws9l1mIDdVVb/LDIxIT4gmPSEaQZmO3MgUBCXF0oI1jmdtWwDkb88lN1DZQZpW8sa+ywzxz6xKMwBMSn/9bzsFchMr5EbmmFVsTGroU8L2zCFs10xM3LxICXlEepyqwjvh3hmqun+d4xgYGal0MjPbNKpRWyZGRERw4sQJjI2NSU1NFY8XExMDqJbH1Uvk6grx9u3bc+nSJV6/fk1SUpIkev6ZIy15S0hISEiIZLQ/BJX1n1wup2TJkhrbHR0dsbKyEq0B1ZQsWVJL1Lx06dKAKifS0dGRwMBAbty4kWWQmNnyMHOf8gs7OzuMjY1ZunSpKBWkplAR51z/QKqvNin4JsrEGCzc2xNzcQcGNk4oCpVFmRgLQNhO3UFv5us1NTYmJv3taz2LAqTHhWPkXFFDtDw9Joy4qwc1LBhlMhn6ds7YNPwGgOhz24n6ayMG9ipbzLToEPTMrEmLfMWZgKe5HgNdNo2RkZGiZeLDhw8RBIGYmBi2bdvGtm3bdB6zUKG3NpR79+5FoVCwbds2WrVqxYoVK5gxY4bO/kh8+kgBpYREHvmv9P8kJD4GxsbGOrdn5XzzLiiVSho1asTEiRN1vq8OQHPq0/uyZcsWEhMTSUxMxMfHh5o1a4o2kPceBCIIQt6uWz2DmaFSWkhPBWUaAFZe/TB0UAV2kX+uQZmSwIoVq2hcq4rGYeRyGUYZ5ICMilQg5eV9koNvYubqoXVaZYoqFzH938A1I4YO/wbjyvRM7+Q8Bnv27BFfZ549LFGiBFeuXBHzbDMW8mQ87vXr1xk/fjw///wzJUuWJCYmhvR0VV/atWvHxo0bCQgIQC6XZ1nkJfF5IP0KSkjkgsCQWDZfDCbgfijBEQkaS2EyoKiNCV5l7OnuXpRSDub/VTclJPIdZ2dnlEolgYGBlCtXTtweEhJCVFQUzs7OGu3VM1UZA7EHDx4A4OLiAqiCkbi4uHf224b8CXD9/f0pWrQoKSkpzJ07l4EDB1KuXDkCAwN5E/Iax+R4ZBlm/7JC/X2gKFwOuZEZsdcOA5D45B8ijv4KegaQnorCsSRGzhUBiDYyA0FJ17bNdT6QWpkYiDqURsUqE3PRn7hrh1EmJ6AoXA6UShICLwCQHh0ClCf67O+kx0WgTIwh9tphlAkxxF49gJ55ATHY1bd0QE8uo0DBou81BgMGDODKlSts374dR0dHLlxQ9cXY2BgnJyfxuGrrxapVq2Jubs7u3buZMGECoLLvbNasGQsXLkRPT4/27XV7kEt8Hkg5lBIS2fAsIoGeay/SaNFf+F0MIihTMAmqH5OgiAT8LgbRaNFf9Fx7kWcRCf9FdyUk8p1mzVR5epkrrxcsWABo60e+fPlSo/I7JiaGjRs3UrlyZRwdVV7UnTp14vz58xw5ckTrfFFRUaSlpeXYL7U+ZlRUVK6vJTN6enro6+tz/vx5OnTowObNmxkxYgTPnj3DyMgIZ3vtnEFdJD+7rTqesQUFWn+LkJYMyIi7dhgjl8qYlFXJLyW/eqCxn4GenNTEOJ3X62BuJFaYy/4NBk3cPEl985TIE78RffZ30qJCVOe1UHmGG5d0B7kcITWJiKO/EvvPfhRFymPXfgoJ905jYF8cPTNr0pUCXbu83xh8841qST0oKIhx48bx+vVr3N3dSU5OJjExUecxASpVqkT58uUB1WfqwoULFClShPT0dK5evZrtOSU+baQZSgmJLNh6OZhpe2+T9u+Xekb5EF2o3z/3OJyGC0/h28qNLtVzr4knIfEpUqlSJXr37s2qVauIiorCw8ODS5cusWHDBtq0aYOXl6Y4dunSpenfvz+XL1/GwcGB3377jZCQENatWye2mTBhAnv37qVFixb06dOHqlWrEh8fz82bN/H39+fp06cUKFAg236VKFECKysrVqxYgbm5Oaampri7u+cp31JtAzlq1CiaN2+Ok5MTK1asoFSpUsTFxdHArRB+F4Mwq9gQs4raM3kyfUP0bQoRe3k3QloyeqbWKocaQcC+kw/GxasCoExNIi0smKi//EiLfImhY0lMS7tTRAijcOHCWtc7ZMgQxo8fT8+1Fzn3+K08kEmpmpi2fCvyHnfjOOEHFyE3VBXOGLtUQs/ECpm+Acr4KEzL10fP1JrwAwtJj4/Cttko9OQyahW3ZVbXHzjz55Fsx+DkyZM8ffpU5z2V/1s0NGHCBHx8fACVxmSdOnX4888/mTx5MsWLFyckJIRmzZoxbdo02rRpQ7FixejXrx+nT5/mzJkzVKum8jMfOHAgw4YNw9zc/J292CX+W6SAUkJCB8sCAvn56IOcG+ogXSmQrhSYtPMmYXHJDPcqlc+9k5D4uKxZs4bixYuzfv16du3ahaOjI5MnT2batGlabUuVKsXSpUuZMGEC9+/fp1ixYmzbtg1vb2+xjYmJCadOnWLmzJn88ccfbNy4EQsLC0qXLo2vr2+u3FIMDAzYsGEDkydPZvDgwaSlpbFu3bo8BZQ52UB2dy/K+vNPs++HtRPmjQYReeI3UiNeoG/lQIHWE8VgElSWiA7dZxN9fjsJ984Qd+sEckMTXMqXy/Z6Z7atQMOFp3J9Pbnpk75cxsy2FfJlDDLj6urKlStX8PX1Zf369YSHh2Nvb0+VKlWYOnVqtvuuWLGCuLg4+vbti7m5uU43HolPG5kgCNlPu3xm+Pj44Ovry5s3b3J8wn1fMltMfc6cPHkSLy8vAgIC8PT0zLLdx7y/78L69evp27cvT548EfO18srWy8FM2nkz3/oUNLuF6Hn7peDp6cmpU6ofuubNm7N//37xPZlMlu/Xm/mY7zPOuf1/mx+fpZxQz/6sW7eOPn36ADB69GgWL14MqJZ14+LiPsi5JXKHepYwpxWKvKCeJfTr755j2/z+PprTrgKdpZUTiQ+AlEP5kXj+/DldunTB3t4eCwsL3N3d8xyIzpw5k927d3+Q/kmoeBaRwLS9t/P9uNGJqTk3yob27duLuWyfCmXLlsXPz0/DZ1ni/enZsyd+fn7UrVv3v+6KBKpZQn15/lW4A+IsYW7oUr0o4xuXzrlhLpjQuIwUTEp8MKSA8iOgVCpp1aoV+/fvZ+DAgcyePZty5crp1OnKjg8ZUNarV4/ExETq1av3QY7/sejZsyeJiYlalae55btdN8Wcyfzkz7sh77xvamoqx44d0yp++K9xcHCgR48eWjPaiYmJ/PDDDx/03O8zzvfv32f16tUfoFf5Q9WqVenRowfFixf/r7siARSxMcG3lVu+HnN6KzeK2Jjkuv1wr1LMblcBhb5cw1s8N+jJZSj05cxpV4FhXiVz3kFC4h2RcijziCAIJCUl5UkX7f79+1y9epW5c+eKcglDhw79JDS3kpKSMDQ0RC6Xi44InzN6enrv7LYQGBLL6Ydh+dwjFcERCTwMjaWkfd4lhU6fPk1sbOwnF1Bmxcf4HL3POCsUijy1fxASQ6Q8UtIc/T+mS/WihMUlv3NedUbedZawS/Wi1C5RgO923eT0wzBRUigr1O/XKm7LzLYV8hTASki8C/8XM5RBQUGULFmS8uXLExKimilat24d9evXx97eHoVCgaurK7/++qvWvi4uLrRo0YIjR45QrVo1jI2NWblyZZ7Or66Gy5yumpcfNplMRnx8PBs2bEAmkyGTycScK1DZWvXr1w8HBwcUCgVubm789ttvGsc4efIkMpmMrVu38sMPP1CoUCFMTEyIiYkR3zt58mSerg1039/Hjx/TsWNHbGxsMDExoWbNmloWbQDJyclMmzaNkiVLolAoKFKkCBMnTtQKtmUyGcOHD2f37t2UL19evMbDhw9rtFu/fj0ymYynT5+K25RKJT4+Pjg5OWFiYoKXlxd37tzBxcVF4x5uvhis8+k/+uJOXvuN59mirgT/3I5X60YRf++MVjshLZWI46t5trgbwQs6Euo/nbSYMLH/my68tVfLzXipOXDgAK6urhp5fPfu3aNDhw7Y2NhgZGREtWrV2Lt3r8Z+qamp+Pr6UqpUKYyMjLC1taVOnTocO3ZMbPP69Wv69u1L4cKFUSgUFCxYkNatW2vcv7wik8k08id9fHyQyWQ8fPiQPn36YGVlhaWlJX379iUhQVNeKTk5mTFjxmBnZ4e5uTmtWrXi+fPnWufIPM4tWrTIckbv66+/FitJAa1xB7h9+zb169fH2NgYR6dC1O8xklkH7wDQb/0V2v56juZLz2BmZIBzo9747L1NYEhslseMiIhg/PjxVKhQATMzMywsLGjatCnXr1/PzS2U+AT5FGYJi9iY4NffnWOj69HT3RlnWxMy90QGONua0NPdmeNj6uHX310KJiU+Cl/8o/ajR4+oX78+NjY2HDt2TCwk+fXXX3Fzc6NVq1bo6+uzb98+hg4dilKpZNiwYRrHuH//Pl27dmXQoEF88803lClTJk99KFOmDLVq1WL+/Pl06dJFy8IqN/j5+TFgwABq1KjBwIEDAZVsBqgEhmvWrCkGXXZ2dhw6dIj+/fsTExPD6NGjNY71448/YmhoyPjx40lOTsbQ0DDP/VGj6/6GhIRQq1YtEhISGDlyJLa2tmzYsIFWrVrh7+8v+vyqUwHOnDkjCgrfvHmThQsX8uDBA63l/TNnzrBz506GDh2Kubk5S5YsoX379gQHB2Nra5tlHydPnszcuXNp2bIl3t7eXL9+HW9vb5KSkjTaBdwP1fnEH3tlL8al3DF19URITyP+7l+E7Z6NrMM0TEpWF9uFH1pC/O0ATFw9MCpUjqSgG4T+4QOoHiYCHoTig1uex+vgwYO0aNFCfH379m1q165NoUKFmDRpEqampmzfvp02bdqwY8cO8f76+Pgwa9Ys8XMTExPDlStX+Oeff2jUqBGgys28ffs2I0aMwMXFhdDQUI4dO0ZwcHC+F6J06tSJYsWKMWvWLP755x/WrFmDvb09c+bMEdsMGDCATZs20a1bN2rVqsWJEydyNTPbuXNnevXqxeXLl6le/e2YBAUFceHCBebNm5flvq9fv8bLy4uU1DRKN+5BcKySM4d2gJ7u/xfRian4XQxi/fmn1C1ZQGcu3OPHj9m9ezcdO3akWLFihISEsHLlSjw8PLhz5w5OTk45XpPEp8enMktYysEcn1Zu+OAmOXdJfDoIXxjTpk0TAOHNmzfC3bt3BScnJ6F69epCRESERruEhAStfb29vYXixYtrbHN2dhYA4fDhw1rtnZ2dhd69e+fYp9evXwuVKlUSDA0NhTJlygihoaF5u6h/MTU11Xm+/v37CwULFhTCwsI0tnfp0kWwtLQUrzUgIEAAhOLFi2tdv/q9gICAbPuQm/s7evRoARBOnz4tbouNjRWKFSsmuLi4COnp6YIgCIKfn58gl8s12gmCIKxYsUIAhLNnz4rbAMHQ0FB4+PChuO369esCICxdulTctm7dOgEQnjx5IgiC6t7r6+sLbdq00TiHj4+PAIj3MzYpVXCZtF9w1vFXZNwOjddFJ+wWDOycBSPniuK2gn2XCIBg9lVzjbYmrh4CIFjW7iq4TNovxCWl5nq8BEEQHj9+rDUuDRo0ECpUqCAkJSWJ25RKpVCrVi2hVKlS4rZKlSoJzZs31z2QgiBERkYKgDBv3rws22SFh4eH4OHhofM9QJg2bZr4Wv2Z6devn0a7tm3bCra2tuLra9euCYAwdOhQjXbdunXTOmbmcY6OjhYUCoUwbtw4jX3nzp0ryGQyISgoSNyW+f+t+vNapO9Cofh3BwTnSfuFwiM3CzKFqQAIhQavFcdTPZbq18W/OyCU/uGgUKBgYY1jJiUliZ9zNU+ePBEUCoUwffp0jW2AsG7dOq372Lt3b8HU1FRru8SnwYPXMcK0PbeEevNOaH13uEzaL9Sbd0KYtueWEBgS8193VULio/DFLnnfunULDw8PXFxcOH78ONbWmo4HGXMgo6OjCQsLw8PDg8ePHxMdHa3RtlixYhoaankhLS2NVq1aYWpqys2bN4mNjaVx48Ya7g6///47MpmMR48e5fn4giCwY8cOWrZsiSAIhIWFiX/e3t5ER0fzzz//aOzTu3fv9/bGze7+Hjx4kBo1alCnTh1xm5mZGQMHDuTp06fcuaNaSvzjjz8oV64cZcuW1eh3/fr1AQgICNA4Z8OGDcVZWYCKFStiYWHB48ePs+znn3/+SVpaGkOHDtXYPmLECI3XQeHxWg44auQGb1MT0pPiUCbHoyjsRsrrt+OV+PgKABZVW2rsa1H9rZaaADwJi8vTeB04cABLS0vxXkZERHDixAk6depEbGysuG94eDje3t4EBgby4sULAKysrLh9+zaBgYE6r8vY2BhDQ0NOnjxJZGRkFleffwwePFjjdd26dQkPDycmJgZQfW4ARo4cqdEu84ytLtRLytu3b9dILdm2bRs1a9bMdlVgi/8eDJ3KIHcoJc426ZlYYurmmeN505UCyWlKIuNTuPs6RtyuUCjEVJf09HTCw8MxMzOjTJkyWv8fc0t8chq3X0ZzNTiS2y+jiU/O2U1G4sOhniU8Nd6LWz7eHBhRh11DanFgRB1u+XhzarwXPq3c3ilvWkLic+SLnRdv2bIlDg4OHDlyBDMzbS/Ws2fPMm3aNM6fP6+VxxUdHa0h6poXodzM+Pv7c+nSJS5dukTp0qU5cuQIdevWpVmzZhw7dgxTU1Nu3bqFnZ3dO53nzZs3REVFsWrVKlatWqWzTWhoqMbr97keNdnd36CgINzdtfXV1D7AQUFBlC9fnsDAQO7evYudnV2u+q0rKLC2ts42GAoKCgKgZEnNvCUbGxuNIDglTZnlMRIeXiL63DZSQh5Dekb5n7fZS2nRoSCTo29dUGNfA5vCGq9DQkLzNF4HDhygcePGoh+u2id5ypQpTJkyJcv9CxUqxPTp02ndujWlS5emfPnyNGnShJ49e1KxospLWKFQMGfOHMaNG4eDgwM1a9akRYsW9OrVS7TIy08yj5/6/q9atYoJEybQrVs35HK5xkMDkOsUk86dO7N7927Onz9PrVq1ePToEX///Tddu3ZFJpPp1JPcejmY0FfPMS1bR+t4BjaF8nB1cPtFDNsuB9O5elGUSiWLFy9m+fLlPHr0SCPItbW1FXU1M+dyZkYQwGfvbQ0P+aDZLTD/qjm2jYdIHvKfCKYKfdyc8i4ELiHxJfHFBpTt27dnw4YNbN68mUGDBmm89+jRIxo0aEDZsmVZsGABRYoUwdDQkIMHD7Jw4UKUSs3g4n1m886dO4e+vr5YFFC+fHn27t1L48aNad26NTt37mTDhg107dpVnNHIC+q+9ujRg969e+tsow4g1Lzv7CRkf39zi1KppEKFCqIncGaKFCmi8Tqrql4hH7T5DfV13/ukZ7d44/8jiiJu2DYegp6ZDejpE3fjGAl38u5goT5NbsYrISGBkydPahSLqcd7/PjxWc6aq4PnevXq8ejRI/bs2cPRo0dZs2YNCxcuZMWKFQwYMABQzf61bNmS3bt3c+TIEaZMmcKsWbM4ceIEVapUyfP1Zce7VmXnlpYtW2JiYsL27dupVasW27dvRy6XU716dX7//Xet9vmqOSqoxmXq3tvUKlGADcsXMGXKFGrXrs3Dhw9p27YtpUqVYvv27VrfL7p4FpHA6cA3JKam43cxSGeeXkYP+Yz5nFIBhoSExH/BFxtQzps3D319fbGAo1u3buJ7+/btIzk5mb1792rMmmReYs0PZDIZaWlpvHr1SkzEr1u3Llu3bqV9+/ZUqlSJ6OhoUU4op2NlRl0Nm56eTsOG2l6zH4rs7q+zszP379/X2ufevXvi+6AqKrp+/ToNGjTQeW35gfpcDx8+1JiZDQ8P15jZdLE1RQZay94J988h0zfEofOPyPQNxO1xN45ptNO3tAdBSVrkKwxs385Kpka8rVCWAVVKO+d6vE6cOEFycjJNmzYVt6krmQ0MDHI13jY2NvTt25e+ffsSFxdHvXr18PHxEQNKUI3DuHHjGDduHIGBgVSuXJn58+ezadOmHI+fH7Rt25bhw4ezYMEClEoljx490piV1PVZ0oWpqSktWrTgjz/+YMGCBWzbto26detqpbuoUWuO6lvakxr5Uuv91IgXWtvkRmYok+M1tgnpqaTHRQCQphT4btdNbvr74+Xlhb29PYUKFWLnzp0AbN68GVBpderr6+usYFd7yIfGqpQOJA95CQmJz4EvNodSJpOxatUqOnToQO/evTUkVdQzJRlntqKjo1m3bl2+90P9o5/Zx7R169YMGDCAp0+fUr16dQoXLqxrdw1MTU01ci9BdS3t27dnx44d3Lp1S2ufN2/evHvnsyG7+9usWTMuXbrE+fPnxW3x8fGsWrUKFxcXXF1dAVXV74sXL3SKTCcmJhIfH6+1Pa80aNAAfX19LUmoZcuWabw2VehTVNfMjkwOMhCEdHFTWlQIiYEXNJoZF1fNQMf8vU9je8zlPeK/i9qaYGGiyPV4HTx4kGrVquHg4CBus7e3x9PTk5UrV/Lq1ats9w8PD9d4z8zMjJIlS4qSTAkJCVqV7iVKlMDc3PyjaqTq6elhZGQkOgEtWbJE4/1Fixbl+lidO3fm5cuXrFmzhuvXr9O5c2ed7WISUzn9MIx0pYBx8WqkvLxP8su3gWt6QjTxt09q7advVZDkZ5qzmrHXDoszlOlKgdMPw0gTZAiCQGhoKFZWVoAqZ1id32pkZCSmMWRkWUAgk3beJDlNSV4n3tX5nJN23mRZgO68WQkJCYkPxRc7Qwkq/cdNmzbRpk0bOnXqxMGDB6lfvz6NGzfG0NCQli1bMmjQIOLi4li9ejX29vY6f6TfhxYtWtC6dWvWrl3Lw4cPadOmDQqFgsOHD7Nv3z7q1atHQEAAU6dOZfr06Rr7ZpaDqFzlK44fP86CBQtwcnKiWLFiuLu7M3v2bAICAnB3d+ebb77B1dWViIgI/vnnH44fP05ERES+XpOarO7vpEmT+P3332natCkjR47ExsaGDRs28OTJE3bs2CEu7ffs2ZPt27czePBgAgICqF27Nunp6dy7d4/t27eL2p/vg4ODA6NGjWL+/Pm0atWKJk2acP36dQ4dOkSBAgU0Zka9ythrLS8al6hO7OXdhG6bhqmbB+nx0cT+cwB9q4KkvnkqtjN0KI6Jqwdx/xxASI5HUagcSU+vizNfMpkMr9L2ALker4MHD9K3b1+ta/rll1+oU6cOFSpU4JtvvqF48eKEhIRw/vx5nj9/Lmodurq64unpSdWqVbGxseHKlSv4+/szfPhwAB48eECDBg3o1KkTrq6u6Ovrs2vXLkJCQujSpct73fe84O/vz4QJE3jy5Aldu3Zl+fLlXL58mWfPnhESEiI+AGYOfgGuXr3K4MGDOX/+PKmpqVStWhUTExPGjx8vPmypi30y8jgsHr2SKkkXi5rtib8dQOj2aZhXa4XMwIi4a4fRt7Aj9U080ee3kfzyPmlRIQjKdEhPJeT37zEpW5uU0CckPf4HubGFeGw9uQzTom6c3L9Z3Kb+nKlXKTLnUO7evZu+ffviNGgV0We3kRB4ASFVdb3K1CTkBtmLxUed3Ur06c1YNxyIRbWW/Hz0AXZmio9msyeTyRg2bJjWg5qEhMT/D190QAmqpUF/f3+aNm1K69atOX78OO7u7vj7+/PDDz8wfvx4HB0dGTJkCHZ2dvTr1y9fzy+TydixYwcLFy5k/fr1fPvttxgbG1OzZk2OHDlCo0aN6N69Oz/++CMlS5bka++2bL4YrJGEryatSGv07V/w7eTvSUtJonfv3ri7u+Pg4MClS5eYPn06O3fuZPny5dja2uLm5qah8fchyOr+njt3jm+//ZalS5eSlJRExYoV2bdvn4amoFwuZ/fu3SxcuJCNGzeya9cuTExMKF68OKNGjaJ06fzxr50zZw4mJiasXr2a48eP8/XXX3P06FHq1Kmj4erS3b0o688/1djX2KUStk1HEn3Bn4jjq9G3csDasw9p0SFEv9FsW6DZKCKNLYi/c4qEBxcwcq6IfUcfXizvgyAI9Kip+nHPzXjdvn2boKAgnf7drq6uXLlyBV9fX9avX094eDj29vZUqVJFYyZ85MiR7N27l6NHj5KcnIyzszMzZswQ0yuKFClC165d+fPPP/Hz80NfX5+yZcuyfft22rdvnx+3Ps/89ttvPHr0iEuXLqGnp4ebmxvVqlVj/fr1+Pn58eOPP2Jg8Db1oHPnzlSrVo1p06Yhl8tZt24dSUlJKJVKGjZsiL29vc7zvI5OwujfBwd9Mxscus4k4tgKYi74Izc2x6xyU/TNbAg/tITEx1cxdfNA38qRtLgIYi/tJCnoOskv7qIoUh77LjMI+f178djpSgG96h1pmh7BsWPHSE9Pp1SpUnTt2pWjR4/q7E9CimoGPGz3HPQtHbD26E3M5d2kRb4k+szvWHtpP1ioifzLj5hz27FpMgzzyk3E7ep8TimnUkJC4mMgE/KjokHivXkWkZBnsVwpCf/diYqKwtramhkzZvD992+DgZ5rL3LucXiOeWt5QU8uo1ZxW/z6a1e+Z8XcuXNZsGABr169+mD5pe+Dp6cnqamp7NmzB0NDQywsLHLeKQvWr19P3759efLkCaamphQuXBhPT08OHTokzmb/8ssvDB8+nN9++42+ffsiCAJlypShePHiHDp0SLxHiYmJuLm5UbJkSTF4y3h8FxcX4pLTqOBzJEuZqIwIaamgp4dM9jY7KC0qhBerB2NZqxNWtbvq3E8G3PLxprl3Q8LCwrTSG9QzlGpHoYqtBnBz31pMKzbCpuEghLRkIo6tJOHeGeRGZhQZtUXcV13lbdN4CJEn1hJzeQ+2zUZhVqGBxjne5XP3rkgzlBISEl9sDuXnxNbLwTRceIpzj1U5b3lNwt96OTjb9v/vJCYmam1T5+V5enpqbJ/ZtgL6ebRVywl9uUynm0p2uLi4sHDhwk8ymFRz7tw57OzsNAqy3pfjx4+TkpLC6NGjNVQPvvnmGywsLET7zmvXrhEYGEi3bt0IDw8X9Tjj4+Np0KABf/31l85qaqVSyYMX4bkKJgFk+gZiMCko00lPjEFmaISBTSENHdLMCMDT8NzlAAeGxBL0RqVhaV6lKVF/beT5ku4k3P0L5HKUiTEokzWlzQQg4uivxFzZS4GW47SCSXibz/kwNFbrPQkJCYn8Rgoo/2MyJuHndVZMSsLPHdu2bcPT05O5c+eyfPlyunXrhq+vL40bN6Z27doabYvYmODbyi1fzz+9lVueZ5E7depE1666Z78+BebPn8+xY8c4duwYP/30U74dV60bmll70tDQkOLFi4vvq205e/fujZ2dncbfmjVrSE5OJjo6GplMhp+fHwCNGjVCoVBw8k9VhX5abBhhBxbxbEkPgua14eWaocRd11ySFgQlUX9tInh+e4Lntub54m48X9Kd1DdPSQy8QFLQDY328ffO8GrdKIJ/bked8sW5e/cuaWmaAuTqvMmIiAiaNWtGeRdHEh6cA+D1xvGYlKuHfZcZ2HeZgUU1lTB++OFlBC/sjJCWojrPrRPE/nMAm0aDMHX1yPJ+Jtw6TikHC86cOcPIkSOxs7PDysqKQYMGkZKSQlRUFL169cLa2hpra2smTpyoJcOl1tSsUKECRkZG2NnZ0aRJE65cuZLleQFmzJiBXC5n6dKlgGpshw4dSpkyZTA2NsbW1paOHTtq+MY/fvwYmUzGwoULtY537tw5ZDKZTgkoCQmJ/558CSjXr1+PTCbT+GLIL/r06aNTmPxdePr0KTKZjPXr1+fL8d6XrZeD+fnog3w51s9HH7DtcvAHHYt3wdPTk/Lly/+nfahYsSL6+vrMnTuX0aNHc/r0aUaNGsWOHTt0tu9SvSjjG+dP/uaExmU+WmHEx6Rq1ao0bNiQhg0bUqlSpY967qtXrzJz5kxApSjQt29fbG1tRUkldaCr/t64e/cuoCqQW7x4Mc7OzqTHR/J643iSgq5jXrU5Ng0Hom9VkPBDSzQq86NObyH63FaEtFSMS7qrcittCoGeAZmJu3GcsN2zQS7HyqM37bv3JiwsjMePH2upMwBs2rQJe3t7ijYbhIHtv5qrgpKU14EYu1TG2KWyuD3x0RVMytRCpq/yF1cUKofc1IrYv/eTnpj1DKR6knbEiBEEBgbi6+tLq1atWLVqFVOmTKFly5akp6czc+ZM6tSpw7x588QAXE3//v0ZPXo0RYoUYc6cOUyaNAkjIyMuXLig44wqfvjhB6ZOncrKlStFV6rLly9z7tw5unTpwpIlSxg8eDB//vknnp6eorlE8eLFqV27tiivlJHNmzdjbm5O69attd6TkJD47/nii3I+VfJVVPlfpu69zSCHjyf38qmRkJDA3Llz8fT01FjK/uorVXV8XhjuVYoCZgqm7b1NmlLI0+yxnlyGvlzG9FZuX2Qw+SFR64bev39fDBABUlJSePLkCQ0bNmTatGno6emRlpZG69atGThwIA8fPhSdmDLrc75+/RqAUaNG4eLiQnxyGlETZoCgpGC/Zej9W6FtXqUZb/bMJerMFswqN0FuoCD+hmrG0q7td5iUrgmAkJZC8IKOGucQ0tOIPLkeAztnHLvPQa5vyGIfby6ePMatW7dYuHAhvr6+Gvu4urqybOUaKvgcwTDkNYmBFzB0LEn87ZNaFp5CSgJmbl7iawPrglh79SVky2RCt0/FoctPyBVZz4IXsLPn4MGDyGQyhg4dysOHD5k3bx6DBg0SJbUGDhyIi4sLv/32G7169QJU2rzr169n5MiRLF68WDzeuHHjsjQUGD9+PAsXLmTdunUa4v3NmzenQ4cOGm1btmzJ119/zY4dO+jZsycAvXr1YtCgQdy7d4+yZcsCkJqayvbt22nXrh0mJlLOuMS7k1k9xcXWFFOFFArlB/kyQ9mzZ08SExPFHwOJnFGLKucnaUoB/3+0hZL/X0hISMDX15eTJ0/my/G6VC/K8TEe1CpuC6gCxexQv1+ruC3Hx3hIweQ70LBhQwwNDVmyZIlGwLJ27Vqio6Np2rQpx48fp127dpQoUYKff/6ZuLg4SpYsqSEAn1GPM/PyuYmhHkmB5zAuWQMEgfSEaPHPuNhXCMnxpISo8iOVKYmgp49xqbeFLQkPL4EyXeOYKa8DUSZEYV6lOTJ9Q4rammCq0MfW1hZDQ0Mx9zMj1atX1/KQNylXl5SX90mN1JQvk5vZoCiqmYdraF8M+44+pIY/J9R/OsrUrB8mm7bvppGP6+7ujiAI9O/fX9ymp6dHtWrVePz4sbhtx44dYgFRZjLn9wqCwPDhw1m8eDGbNm3ScoLK6NCVmppKeHg4JUuWxMrKSsPfvFOnThgZGWnMUh45coSwsDB69OiR5TVKSGRFYEgsPntv4zEvgPI+R2i+9Axtfz1H86VnKO9zBI95AfjsvU1giJRv/D7kS1iup6f3wW3VviQCQ2I5/TAs34+brhR4EBKX78f91FEqlaSkpHyQYxexMcGvvzuBIbEqOacHoQSHa8o5yVCJlnuVtqdHzaKUtJc8ld8VOzs7Jk+ejK+vL02aNKFVq1bcv3+f5cuXU716dRo1akRiYiKlSpVi4MCBNG3aFDc3N/r27SsWX3l4eGBhYcG+ffvEY6pdmkAVbKYlxhF37TBx1w7r7IcyPkr1D7k+pCQSfnAxikJlSX0TRPztk8hNrVHGv3VaSotW+a/r2xRCT/5WcxRUnunq3M+MWFhYaHnIG5f+mqi/NhF/+yRWdboi/BskmpR011mgpShUFrt2PxD6hw9hu2dh1+4HZHraX+sFHJ00XltaqnynM9ubWlpaajhIPXr0CCcnJ2xsbLSOmZmNGzcSFxfHr7/+qjP/NzExkVmzZrFu3TpevHihZSyhxsrKipYtW7JlyxZ+/PFHQLXcXahQIerXr59jPyQk1ORGPUWyMM0/PkgO5Z49e2jevDlOTk4oFApKlCjBjz/+SHp6uta+Fy9epFmzZlhbW2NqakrFihU1llZ0ce3aNezs7PD09CQuThVAvXjxgn79+uHg4IBCocDNzY3ffvst2+OsW7cOmUzG1atXtd6bOXMmenp6orOFOhfwzp07eHl5YWJiQqFChZg7d25ubpEGmy8GoyeXqXyid83i+fK+BM1rw/Nf+hBxfHW2Mw0ZSXkTxOst3xH8czue/9KbqLNbkcm0/8PkdjxcXFzEgoGMZF5CBlWCfatWrTA1NcXe3p4xY8Zw5MgRZDKZzhnC3Ny35ORkpk2bRsmSJVEoFBQpUoSJEydqubbIZDKGDx/O5s2bcXNzQ6FQsGLFCuzs7ADw9fVFJpMhk8nw8fHJ0zhnRSkHc3xauXFqvBe3fLw5MKIOu4bU4sCIOtzy8ebUeC98WrlJwWQ+4OPjw7JlywgODmbMmDFs376dgQMHcvToUQ0NSk9PT86fP0+1atVYtmyZaJ3q6OjImDFjxHYZ94G3fuimbl5i8UvmP0VhlZuT3NgcPXNbkp78Q+Tx1aSEPMK+4zRxmVwX6cq3mqPZIZPJtDzk9RSmmJSsTvydkwAkv1YV2xmX/jrL4xi7VMKuzSQSn1wlbP98BEG7ul1hqJ3zCbr91d9VSa527do4ODiwbNkynWYKI0aM4KeffqJTp05s376do0ePcuzYMWxtbbUq8nv16sXjx485d+4csbGx7N27l65du2pU/ktIZIeknvLx+SCJA+vXr8fMzIyxY8diZmbGiRMnmDp1KjExMcybN09sd+zYMVq0aEHBggUZNWoUjo6O3L17l/379zNq1Cidx758+TLe3t5Uq1aNPXv2YGxsTEhICDVr1hQDDTs7Ow4dOkT//v2JiYlh9OjROo/VoUMHhg0bxubNm6lSpYrGe5s3b8bT05NChQqJ2yIjI2nSpAnt2rWjU6dO+Pv78+2331KhQgWN5bacCLgfSrpSIOHeWYS0ZMyrNEVubEHKywfE/r2P9Ngw7NpOzvYY6XGRhPz+HSjTsajZQXT3UCftZyS345Fb4uPjqV+/Pq9evRLHbcuWLVl6oefmvimVSlq1asWZM2cYOHAg5cqV4+bNmyxcuJAHDx6IVb1qTpw4wfbt2xk+fDgFChSgUqVK/PrrrwwZMoS2bdvSrl07QFWQU6xYsTyNc06YKvRxc7LMwx2TyA71g01GK8Jhw4YxbNgwrbbm5uYYGRnx8OFDACpXriwWV7Vq1Yp9+/axbds2jX3KlSvHn3/+Kb62s7PD3NwcW1MD5MWrZPtDY2DpQGp4MIWGbdCYITSr2JDIE2vF1/qWqhlJZeQL6jZsID5YnDx5EldXV628P1NTU3x8fIhPTkMGWNXtjlXd7qr3yjcgYcePJL96QFp0KIYOJTAp/pW4r/Ok/Vr9NCnljvPEPVrb1ThZZu+0kxUlSpTgyJEjRERE5DhLWbJkSTGHuUmTJvz555+Ym799wPL396d3797Mnz9f3JaUlKSzYKlJkybY2dmxefNm3N3dSUhIEHMsJSRyYllA4DsXvKb/mzM/aedNwuKSGe5VKp979+XyQQLKLVu2aOTLDB48mMGDB7N8+XJmzJiBQqEgPT2dQYMGUbBgQa5duyb63ULWT8hnz56lWbNm1K1blx07dqBQKAD4/vvvSU9P5+bNm9ja2orn7Nq1Kz4+PgwaNEijP2rMzc1p06YNv//+O3PnzhWffq9evcqdO3dERxE1L1++ZOPGjeIXW//+/XF2dmbt2rW5DijjktMIjlBVNFp59kFuoHj7ZuUm6FsXJOrURtKiQ8UfKV1EX/BHmRCNY6/5KJxUOWJmFRrwYuVAABKS30qV5GY88sLKlSt5/Pgxu3fvFisuBw0apBVFdyRaAABJaUlEQVSsqcnNfduyZQvHjx/n1KlT1KlTR9y3fPnyDB48mHPnzlGrVi1x+/3797l586boCw6qXLkhQ4ZQsWJFrVyrvIyzxMdFLd6em2VVPT09GjZsyO7du3n58qVoZfjw4UMOHTqUq/OpLRm3bNlCwcptwEZzNjE9IRo9E9UDg3GxKiQ9vUpi4EWNopzY60c09jF0LIXcxIqYq4eYtm6GuP3QoUPcvXtXw8EoI2oP+aCItzqTxsWrIje2IOaCP8nPbmXrkpNbjA3f7au+ffv2/PLLL/j6+mqtHAmCoLUMX7FiRQ4ePEijRo1o2bIlhw4dEr979PT0tL7bly5dqnPlSl9fn65du7Jlyxbu3r1LhQoVqFix4jtdw5fAyZMn8fLyIiAgQFwt8vT01Cma//9ORvWUoNktsKzdVXxYi7txnPCDiyg0eC36Vg45HutjW5h+7nyQ9YOMwUtsbCxhYWHUrVuXhIQEMZfp6tWrPHnyhNGjR2sEk6Cd7A2qakNvb28aNGjAzp07xSBIEAR27NhBy5YtEQRBFDgOCwvD29ub6OhojYTvzPTq1YuXL19qzK5t3rwZY2NjLfs5MzMzjUDF0NCQGjVqaCSx50TGJPyMwaQyJYn0hGgUhcoBAikh2R8z8fEVDJ3KiMEkgJ6JJaZungA8j8rwA5WL8cgLhw8fplChQrRq1UrcZmRkxDfffKOzfW7u2x9//EG5cuUoW7asxhiqc6Yyz356eHhoBJM5kZdxlvg4hISE8Msvv7BixQq+/vrrXFfv+vj4kJaWRu3atZk7dy6zZs3Cw8MjT/JUs2fPpmDBgrzeOI6I46uIvXaY6PN/8Gb3bF6uGiS2M6vSFD1LB8L2ziPy5Hpiruzl9eZJyPT+XQn497tKpqePtWcfUkKf0KNtUxYvXsx3331Hhw4dcHFx0ViCz4xXGXuNgi+Znj6m5eqRcF+lTWmSjc5kTrzvCrGXlxc9e/ZkyZIlNGvWjCVLlrBo0SIx0NRFzZo12bNnDxcuXKBDhw6kpqYCKtkmPz8/Ro8ezapVq+jbty9LliwRJwEy06tXL8LCwggICJCKcf5jEhIS8PHxybeCx5xwcXERXaQ8PT11pmLp4kOppzyLSMi5ocSHCShv375N27ZtsbS0xMLCAjs7O/ELQZ18/eiRqooyNz8CSUlJNG/enCpVqrB9+3YMDd8u675584aoqChWrVqlJXDct6/qyT40NDTLYzdq1IiCBQuKFYVKpZLff/+d1q1bayzXABQuXFgr2LW2ttZIYs+JjEn4adGhhO1fyLNFXXi2oAPPl3QnZMskVT+Ss3fZSIsOxcDaSWu7gY1q6TY17e1MQG7GIy8EBQVRokQJrXtRsmRJne1zc98CAwO5ffu21hiq/bwzj2GxYsXy1Oe8jLPEx+Hu3btMmDCBkiVL5kkbtmrVqhw6dAhra2umTJnC2rVrmT59Og0aNNDwZs8OtZ/6gP790A++TMTRFcRe2YsyMRYrzz5iO7mhMQ5df8LIuSKxV/YRfW4bRkXcsKrdBUAjxcR3/DC2bdtGSkoK3377LStXrqRt27acOXNG66E5I93di2otu5tWUD1IGblUQt8s55nbrNBhFpRn1q1bx7x583jy5AkTJkxg5syZJCYmaqwYZKZ+/fpinmTPnj1FcfRevXqxefNmxo0bx6tXrzh+/HiWOsNVq1bFzc0NuVxO9+7d3/9CJN6Z/FbQ+FDkpJ5iWt6LouN3opfN6l9m0pQC3+26mR/d++LJ9yXvqKgoscpy+vTplChRAiMjI/755x++/fZbnXZoOaFQKGjcpCn79+3lFz9/Gno3FbWj1Mfr0aOHlkyFmuyWSvT09OjWrRurV69m+fLlnD17lpcvX+p8Is6qkj0vSezqJHxBmU7ItikoE2OxqNkBA5vCyAyNSI8NJ/zAQnhPi3UDfVUAl5fxyMrmLz09/b2q+HNz35RKJRUqVGDBggU622auRtWVwpBTH3I7zhIfh4yC1nmlfv36WisPbdq0oXDhwhrbsvu/aW9vz7Jly1i2bBlbLwdnqTlqYOWIfUdN2Ry1+LmhZQEU+vIMmqMl6dSpU7Z9X79+vUYAXcrBnLolC2h4yMvkqq9m0wzak3lFTy6jabsu+B3Qdp3x8fERZ4Cy6xuo/u+MHz+e8ePHZ3kuXfe5VatW4uwkqKq3dRVKZmfCYGBgkOccZ4n840MqaOQ3uVFPkcn1QJ6337KMFqZfatFlQkJCvui75vsM5cmTJwkPD2f9+vWMGjWKFi1a0LBhQ6ytrTXalShRAiDb/I/AkFiuPYsiKU3J1RI90C9SkTEDe9Ng/HJRO2r5+VBMzcxJT08XnTsy/9nbZ/800qtXL2JiYti3bx+bN2/Gzs4Ob2/v978ZOnCxNUUGpL4JIi3iBdb1+2NZswMmpWti7FIZvVzORuhb2pMa+VJre2qEqlq5sJXqw5Hb8QDVrKGuBPnMkifOzs48evRI60dEXSjxLpQoUYKIiAgaNGigcwwzawnqIiff6485zhIflsz+7IGBgRw8eFBLjSC3ZKc5mll1QUhLIe7aIfStnahXqUy+aI5m9pCPu34EmaExJqWzngXMiXfxkP+UuHLlCteuXRNF1r9EcmNHmRN///03tWrVwtjYmGLFirFixQqtNh9KQUPNiRMnqFu3LqamplhZWdG6dWvRoepDEBoaSv/+/XFwcMDIyIhKlSoxYdbSHLWC424cJ2h2C9KiQlTH+cOXF7/219n21cZxvFo/GlB9H4ybsZj69etjb2+PQqHA1dVVNAXIyJUrV/D29qZAgQLimPTr1++drtPHxweZTMa9e/fo1KkTFhYW2NraMmrUKJKSkrTab9q0iapVq2JsbIyNjQ1dunTh2bNnGm3UijV///039erVw8TEhO+++w7I+nOSW/I9oFTPRmUMNlJSUli+fLlGu6+++opixYqxaNEirSAmODyenmsv0mjRXzx6E6earNMzwK7tdxg6liJ0x48kvbxPUEQCm688h2LubPvDn+NnL2v1J6PAcVZUrFiRihUrsmbNGnbs2EGXLl00Kk7zE3USPjLtWy8IArFX9ubqOMbFq5Hy8j7JL++L29IToom/fRIAk3+V/3M7HqAK6i5cuKDxRLp//36tD6S3tzcvXrxg7963fU1KSmL16tW56rsuOnXqxIsXL3QeIzExkfj47FMAAPEJS1dQDB93nCU+LMWLF2fy5MmsXr2aH374gZo1a2JoaJinL7/MqDVHj42uR093Z5xtTZABb3bNJPzwMmL/OUj0+T8I8xtLavhz5vw0Hb/+7vmiV6f2kE8IvEj0BX9irx3BrFJj5IbvVp0N7+Yh/ylw69YtNmzYQL9+/ShYsCCdO3f+r7v0wciNHWV2REZG0qxZM6pWrcrcuXMpXLgwQ4YM0ZgJVito/Pzzz7Rs2ZKlS5fSpk0bFi5cqPPenjhxgjFjxtC5c2cWL15M9erVxcCpbdu2+Pn54efnJyppHD9+HG9vb0JDQ/Hx8WHs2LGcO3eO2rVrfxAL4MTERDw9PfHz86N79+7MmzcPS0tL9iz+nsiLu/N0LJNydUmLDiH5lWZFeFp0KCkv72NSrh6gmqUM2L0JZ2dnvvvuO+bPn0+RIkUYOnSoRi5xaGgojRs35unTp0yaNImlS5fSvXv3bG1Kc0OnTp1ISkpi1qxZYi7zwIEDNdr89NNP9OrVi1KlSrFgwQJGjx7Nn3/+Sb169bR+E8PDw2natCmVK1dm0aJFeHl5Zfs5yS35/mtaq1YtrK2t6d27NyNHjkQmk+Hn56c1myWXy/n1119p2bIllStXpm/fvhQsWJA9Jy9x8uJVHLuoBG0z7iY3UGDfcRohv39H6HYfHLrPwtDOBWvP3iQH36CxV12823enrZc7ERER/PPPPxw/flynJlpmevXqJS7pfOhlUK8y9jwLj0XfqiCRJ9aSHhuOTGFMwv1zKJNyJ0xuUbM98bcDCN0+DfNqrUTZIANLe1JCn4jtcjseAAMGDMDf358mTZrQqVMnHj16xKZNm8TZZDWDBg1i2bJldO3alVGjRom5ier8tZxmCnXRs2dPtm/fzuDBgwkICKB27dqkp6dz7949tm/fzpEjR6hWrVq2xzA2NsbV1ZVt27ZRunRpbGxsKF++vEae7sccZ4kPR5MmTfj99995/fo1CoWCr7/+mpkzZ1Kq1PtLfKg1R31wIz45jR+NbuC/ZSMvz5xGUKbj6urKxMWz8z3Q6VK9KMPO/EZ0+BuMS1TDqs675w1+zh7y/v7+TJ8+nTJlyvD777/nOi/2cyS3dpRZ8fLlS+bPn8/YsWMB1Xezu7s7kydPpmfPnhgYGHxwBY0JEyZgY2PD+fPnRaWGNm3aUKVKFaZNm8aGDRvyfF8yBqKZ8zZXrVrF3bt32bRpk5hb26PvAAqW/Yqo05swq9goWxvSjJiUqkm4ngEJd0+jKFha3B5/7zQgw7Ts2/tl3Wkmy35qJdo0Dh8+nCZNmrBgwQJR4uzcuXNERkZy9OhRjd+rGTPeKj+8C8WKFWPPHlWazbBhw7CwsGD58uWMHz+eihUrEhQUxLRp05gxY4Y42wjQrl07qlSpwvLlyzW2v379mhUrVjBo0NsCxE2bNmX5Ockt+T5DaWtry/79+ylYsCA//PADP//8M40aNdIpZO3t7U1AQAClS5dm/vz5jBg1hmPH/0RRonqW2nByhQn2naejZ2ZN6NYppEa+RM/UGsdeCzCr0JBjB/cxdJjK/isiIoI5c+bkqt/du3dHT0+P0qVLU6NGjfe6Bzmey70oSpke9h2mYuhQnOgLfxB95ncMrJ0o0GJsro6hb2aDQ9eZGNi5EHPBn9grezAtXx/zTB7AeR2P+fPn8+DBA0aPHs358+fZv3+/Vl6aWsuyfv36LF68mBkzZlC3bl2mTJkC8E4/AHK5nN27dzN79mxu3rzJ+PHj8fX15fLly4waNUoszsmJNWvWUKhQIcaMGUPXrl3x9/fXeP9jjrPEh2PdunU8ffqUpKQkoqOjOXz4MF999VXOO+YRU4U+s6dN5uH9uyTEx5GYmMjff//9wWbNwl8/Z8u5QIp0noqBsWme9tWTy1Doy5nTrgLDvHQXyH0O+Pj4oFQquXv3Lh4e717h/jmQWzvKrNDX19cICgwNDRk0aBChoaH8/fffwIdV0Hj16hXXrl2jT58+GrJfFStWpFGjRhw8eDBXx8kLBw8exNHRUcON6WVMCuZVWyKkJJL0LPcySnKFCcbFqxJ/74zGJEvC3dMoCpXRkO6TGSh4Gq5aKYuOjiYsLAwPDw8eP34sFreqi+/279+vkT/8vmTW5B0xYgSAeH937tyJUqmkU6dOGmPs6OhIqVKltMZYoVCIRctqcvqc5IZ8maHMLExcq1Ytzp8/r9VO16xY7dq1OXr0KFsvBzNpp3YlVYEWY6CFpuSGnrEFTgM0l2z1TK2waTwEm8ZDAJjTroLWE7qLi4vYBxcXFzw9PcUEdH19fWQyWZazVllVt2VVnSqTyRg2bBjLli3Tek9MwpfLcOii/eSiS7hYF4b2Ljh2ny2+1pPLqFXcFr+DmnpxeRmPsWPHik+7anRde7Fixdi/X7OfixYtAtAIQPNy3wwMDJg4cWKOy5bZFVp8/fXXXLlyJcv3cxpnCYn/mi7Vi1K7RIEcLePUqN+vVdxWsoz7zMitHWVWODk5YWqq+eChfvh++vQpNWvWJDAwkLt374p5kJl5HwUNdX69rhz3cuXKceTIEeLj47X6+D4EBQVRqlQpDdeklDQlBraqws306KxVXXRhWq4uiYEXSH5xD6PC5UiNfEXK64dYN9CUwUt6fod+neZx6+plrXSE6OhoLC0t8fDwoH379vj6+rJw4UI8PT1p06YN3bp1y7Pec0Yyr7yUKFECuVwuzuQGBgYiCEKWKzSZ3cIKFSqkoZajPkZWn5PcFh7nS0CZF2FiXXwo7ahaJQrk+st1/fr1pKenfzQ3hpltK9Bw4akc7aDywsdMwk9MTNR4uk5KSmLlypWUKlXqk67I/NjjLCHxLkge8v8fjBgxgnXr1jF69Gi+/vprLC0tkclkdOnS5Z0UUXTxoRU0PgUyW5jmBeOS7sgMFCTcO41R4XIk3DsNMjkmGZa7UyNfEfL791iVKcOCBQsoUqQIhoaGHDx4kIULF4pjJZPJ8Pf358KFC+zbt48jR47Qr18/5s+fz4ULF7KUyMormdPKlEolMpmMQ4cO6VRVyXxeXWOc0+ckN7xXQBkSEoK/v3+ehYkzk5N21Lug1o7y6++ebbsTJ05w584dfvrpJ9q0aYOLi0u+9iMr1En4umZl35WPmYTfrl07ihYtSuXKlYmOjmbTpk3cu3dP1Hn81PivxllC4n3InM/5NDyelDQlhvpyUTpN4vMlL3aUunj58qXWDOCDB6oCE/V3XIkSJbh+/ToNGjR4p/x2yDov3tnZGVDlXWbm3r17FChQIF9nJ9XnvHHjBkqlUpyldLE1JS3iOUCeNCYB5IZGGJeoQcK9M1g3GED83dMoCruib/5WcD/x4SVIT2X37j2ULVVc3J6V3XDNmjWpWbMmP/30E1u2bKF79+5s3bqVAQMG5PVyAdXsYcaZ44cPH6JUKjXGWBAEihUrluv0sMzkx+fkvXIo31WYOCNq7aj8nKkDTe2o7Jg+fTpjx46lcuXKLF26NF/7kBNdqhdlfON3G/zMfOwkfG9vb86ePcuECRPw9fVFoVCwdetWunXr9tH6kBf+y3GWkMgP1B7yVYpa4+ZkKQWTXwB5saPURVpaGitXrhRfp6SksHLlSuzs7KhatSrwYRU0ChYsSOXKldmwYYPGe7du3eLo0aM0a9YsV9eRF5o1a8br16/Ztm2buE2hB8nXDyIzNMaoSO6LSNSYlqtLelwEcdePkhr6BNN/q7tF/lVlMTZ8O/sXHR3NunXrNJpFRkZqjWflypUBtCSa8kJmVyr1b5jaurhdu3bo6enh6+urdX5BEAgPD8/xHNl9TnJLnr6Rtm7dyrx583jw4AEymQxnZ2dmzZrFqFGjAIiIiGDmzJkcOXKEJ0+eIJfLqV27NrNnz6ZSpUricdS+pNu2bWP57lM837cNZUoCxsWqYNt0FDJ9QyJPriP+zimE1GRMytbB1nsYMv23eQBxN44RdyuA1LAglMnxGFgVxLxqS8y/evsB1pPL8DsfhMHN3axYsYKIiAjc3d018hrfRfk/MDCQSZMmcfbsWaKioihQoAB16tRh5cqVWFpaarTdvXs3P/zwA4GBgZQsWZL58+fTpEkT8f2WxQ3ZE7iVUwEBpMW8QaavwMi5ItZe/TS8RtUepA7d55Bw7wzxd06BMh1z13r8smwJzV0L0KtXL/bt2wfAN998w5w5czSeNHSN34ABA8TxywujR49m9OjRed7vv+JTd3iQkJD4/0NtR2lpaYmrqyvnz5/n+PHjWdpRZsbJyYk5c+bw9OlTSpcuzbZt27h27RqrVq0S8+Y+tILGvHnzaNq0KV9//TX9+/cnMTGRpUuXYmlpqVM8/30ZOHAgK1eupE+fPvz999+4uLjg7+9PzNNb2DYcmOsKb43rK1ENmaExkSfWqpa7y2jqv5qW+IqYkwa0bNmSQYMGERcXx+rVq7G3t+fVq1diuw0bNrB8+XLatm1LiRIliI2NZfXq1VhYWGgE13369GHDhg08efIkV6tlT548oVWrVjRp0oTz58+zadMmunXrJsZVJUqUYMaMGUyePJmnT5/Spk0bzM3NefLkCbt27WLgwIHZGhNA9p8TXXqbush1QHns2DG6du1KgwYNxMrpu3fvcvbsWTEgefz4Mbt376Zjx44UK1aMkJAQVq5ciYeHB3fu3MHJSdMqcNasWTyOTMGiZgfSIl8S+/d+kOuDTIYyKQ6rOt1IfnGP+JvH0bd0wKrO26qu2KsHMSjgjEkpd5DLSXx4iYijy0FQYl61BaCapVy/dA7Bf26iWbNmNGvWjH/++YfGjRu/s/p/SkoK3t7eJCcnM2LECBwdHXnx4gX79+8nKipKI6A8c+YMO3fuZOjQoZibm7NkyRLat29PcHCw+IVx+fJl3jy8ydD+vbgQInA38DFxVw/yestknL5ZjtxAs2I64thK9M2ssarbHcvYpzw5f4gbe1az4ttzFC1alJkzZ3Lw4EHmzZtH+fLlRVHg3IyfhISEhMTHY/Hixejp6bF582aSkpKoXbu2qOuYG6ytrdmwYQMjRoxg9erVODg4sGzZMr755m1BiVwuZ/M2f36cPY89f/zOzl27MDUxoXjx4nlW0BgxYgRjxowhJSWFadOmUb58eRo2bMjhw4eZNm0aU6dOxcDAAA8PD+bMmZNni9zcYGxszMmTJ5k0aRIbNmwgJiaGMmXKMHvRr/z6ukjOB9CBTN8Qk1LuxN8+iZFLZfRMrTTe17MuxC+/bWL5zz8xfvx4HB0dGTJkCHZ2dhqi5R4eHly6dImtW7cSEhKCpaUlNWrUYPPmzRr3Ii4uDmNj42wtWTOybds2pk6dyqRJk9DX12f48OHMmzdPo82kSZMoXbo0CxcuxNfXF1DlxzZu3JhWrVrleA610srChQvZuHEju3btwuTfz0lukQm5LN8ZPXo069atIyIiIksrveTkZAwMDDSqr54+fUrZsmX5/vvvRVkZ9Qylq5sb8c1+Aj1VXPtm7zwS7vyFUfGvcOjkKx7jtd940mIjKDw0g1hrajJyA82qqZBtU0mLfEmhwWsAldD3819606RxYw4e2C/O1n3//ffMnDmT3r1753mp/tq1a1SpUoU//vhDSz8sIzKZDENDQ+7cuSPqON64cYNKlSqxdOlShg8fDmgXtwSGxDJn4z7WTuxOgRZjMS2vKtlXz1Bal67OiLm/0fNrZ0ram1OrVi0uXLjAoEGDxKeI9PR0XFxcKFGihDgzl5vxk5CQkJD4MhALuu6HEhyho6DLxgSvMvZ0dy9KKYcvo6Cr59qLGham+YGonpJDPUZecHBwoFevXlpBYWZ8fHzw9fXlzZs3FChQIN/O/6HIdQ6llZUV8fHxHDt2LMs2CoVCDCbT09MJDw/HzMyMMmXK6NTUatK2sxhMAv8KiwqYVWyk0c6wYBnSY8MQlG/zSjIGk8qkeNITojEqWp60qNcok1Q5IUlPr0F6Gm179NdY+n2fpVr1DOSRI0dydDJo2LChhih4xYoVsbCw4PHjx+K2zDpkNvopzO7bGCsrKzoXS+PAiDrsGlKLMQ1VcgArZ0zAt3V5saLT3d0dQRDo3/+tfZSenh7VqlXTOE9uxk9CQkJC4vPmWUSC6DTndzGIoEzBJIAABEUk4HcxiEaL/qLn2os8i8jZmedTJ7OFaX6Q3+opt2/fJjExkW+//TbfjvmpkOuAcujQoZQuXZqmTZtSuHBh+vXrx+HDhzXaKJVKFi5cSKlSpVAoFBQoUAA7Oztu3LihU1PLzlFzCVyuUFWD6VvYZdpuAoISZfLb5OGk53cI+f17gue359mizjxf0p2oUxtV/fi3Xdq/elQFi2pOu9vZ2en0ss4NxYoVY+zYsaxZs4YCBQrg7e3NL7/8ovP6ihbVLpKxtrYmMjJSfJ2YmMjUqVMpUqSIxj2LiooiIS5WTMIvZG2i85jqADez9IOlpaXGeXIzfhISEhISny9bLwfTcOEpzj1WFWHkNFOnfv/c43AaLjzF1svBH7yPHxK1ekp+kt/qKW5ubsTExHwWM455JdcBpb29PdeuXWPv3r20atWKgIAAmjZtSu/evcU2M2fOZOzYsdSrV49NmzZx5MgRjh07hpubm05NLUUmsU0RHT7XgOjDqNaESk+Mwbr+AOw7TsO+ywzMq7fWaKfGQC9/DYHmz5/PjRs3+O6770hMTGTkyJG4ubnx/PlzjXZZLS1nzDIYMWIEP/30E506dWL79u0cPXqUY8eOYWtrq/OeZXVMXdsznic34ychISEh8XmyLCCQSTtvkpymzPOSb7pSIDlNyaSdN1kWEPiBevhx+JzVUz538hRpGRoa0rJlS5YvX86jR48YNGgQGzdu5OHDh4BKU8vLy4u1a9fSpUsXGjduTMOGDbPU1LIzV/Auk9NqTSj79lMwr9IU4xLVMXapjExfM6dSbZuUHP5CY/ubN280Zu/ehQoVKvDDDz/w119/cfr0aV68eMGKFSvyfJyMOmQdOnSgUaNG1KlTJ9c6ZHkhp/GTkJCQ+FLx8fFBJpMRFhb2X3cl39l6OZifjz7Isd3z5f0I279QfJ0UdIOg2S1ICrohbvv56AO25XKmUn1PPzWGe5VidrsKKPTl6MllhO1fyPPl/XLekU/LwtTHxwdBED6b2cxcB5SZdYzkcjkVK1YE3uor6dLU+uOPP3jxQjOgU2NkoEfRd5lK1jGDqUyKJ/7mcc3ju1RGpqfP6hXLNfqltgh8F2JiYkhLS9PYVqFCBeRy+TvpTL2vDlluyc34fWzik9O4/TKaq8GR3H4ZTXxyWs47SUhISEiIfCinuc8tp/Lly5f4+Phw7do1QDVTeXyMB7WKqxRVcop79f7NvaxV3JbjYzykmcl3INeyQQMGDCAiIoL69etTuHBhgoKCWLp0KZUrV6ZcuXKASlNr+vTp9O3bl1q1anHz5k02b96cbdm5Vxl7/C4G5WmK3rhYFSL19An1n4555SYoU5OIu3YEuYkl6XERYjtDMytqt+3DAf81tGjRgmbNmnH16lUOHTqkM+JX60Gp/TF1ceLECYYPH07Hjh0pXbo0aWlp+Pn5oaenR/v27XN9DWreV4cst+Rm/D4G/4+VhxISEhIfiv/Sae5T4uXLl/j6+uLi4iKKiastTO94b2fLxSBOP4mSLEw/ILkOKHv06MGqVatYvnw5UVFRODo60rlzZ3x8fMTK7u+++474+Hi2bNnCtm3b+Oqrrzhw4ACTJk3K8rjd3Yuy/vzTPHXawLYwdm0mE/WXH5EBvyE3tca8SlP0TCwJP7hYbJeuFFi79Ge2VijCihUrCAgIwN3dnaNHj9K8eXOt48bHx1OyZPZT3JUqVcLb25t9+/bx4sULTExMqFSpEocOHaJmzZp5ug54fx2y3JKb8fuQPItI4LtdNzn9MAw9uUznA0TGysP1559St2QBZrat8NHsJCUkJCQ+J9ROc/lNRqe5LyHAci1sw4zCNgCShekHJNc6lB+ST0E76s6dO7i5ubF//36dwabEu7P1cjDT9t4mTSnkaYz15DL05TJ8W7nRRVp+kJD44njx4gVTp07l0KFDhIeH4+TkRJMmTVi8eDGGhoa5dl8DVarQihUrePLkCQqFghIlSjB27FjRDlat6RcYGMiMGTPYvXs3giDQrl07fvnlF9FeML/JyaFs/fr19O3bl9OnT7N9+3Z+//13UlNT6dy5M0uXLiUhIYGRI0fqdEHz2Xsbv4tBRJzfQeKDc6SGv0BIS8bAtggWX3fEtGwdjb48X94Po6IVKNBiDKDKoQz5/Tscus7EyLmiRls9uYye7s74/Fs1febMGcaMGcPNmzcpVKgQEydO5NWrV1p2f2lpacyaNYv169fz/PlzChYsSLdu3Zg2bRoKxds6BxcXF8qXL8+kSZMYO3YsN27cwMnJCR8fH9GQA3LnwKfWts7MunXr6NOnD3369OHkyZMaq4/x8fFMnTqV7du3ExoaiouLC9988w3jxo3TyAuVyWQMGzaMhg0bZut6Fxsby5QpU9i9ezevXr3C0tKSSpUqMWfOHL766qtcfFI+fz6JsHxm2wo0XHgqXwPKvGpHBQQE8PXXX0vBZD6zLCAwV8niukj/NwCdtPMmYXHJDPcqlc+9k5CQ+K94+fIlNWrUICoqioEDB1K2bFlevHiBv78/CQkJGBoa5tp9bfXq1YwcOZIOHTowatQokpKSuHHjBhcvXhQDSjWdOnWiWLFizJo1i3/++Yc1a9Zgb28vOojlJ3lxKFM7r/n6+nLhwgVWrVqFlZUV585l7YIWcD+UdKVA7JW9GJdyx9TVEyE9jfi7fxG2ezayDtMwKVn9nfqerhQIeBCKD27cvHmTxo0bY2dnh4+PD2lpaUybNg0HBwet/QYMGMCGDRvo0KED48aN4+LFi8yaNYu7d++ya9cujbYPHz6kQ4cO9O/fn969e/Pbb7/Rp08fqlatipubKpDNzWegXLlyTJ8+nalTpzJw4EDq1q0LQK1atbT6ByoFFLXaSf/+/alcuTJHjhxhwoQJvHjxgoULF2q0z43r3eDBg/H392f48OG4uroSHh7OmTNnuHv37v9NQPlJzFCCahZr0s6b+Xa8Oe0qfDZJteon1Nz6emZE/dT9XwxjTv3+kGOqfmrM6Mv+oenTpw/+/v7ExcVl287T0xOQ/MMlJLKjd+/ebNq0iYsXL2p5SQuCgEwmy7X7Wps2bXj48CG3bt3K8nzq78p+/fqxdu1acXu7du3466+/Pkj1d24cytTfo97e3hw6dEicHcvJBW3/keNU8DmCgLZznJCexqv1o9AzscSh60xxe15mKEGVX3jLx5seXTpy+PBh7t+/L2oh3717lwoVKpCeni7+/ly/fp3KlSszYMAAVq9eLR5nwoQJ/Pzzz5w4cUKcSXRxcSEoKIi//vpLDADfvHlDkSJFGD58OD///DOQewe+K1euUL16dXFWMiOZZyj37NlDmzZtmDFjBt9//73YrmPHjuzYsYPAwEDRlCS3rndWVlb06NHjo/4mfWp8+OS5XCJpR31ZSJWHEhISWaFUKtm9ezctW7bUCiYBMajKrfualZUVz58/5/Llyzmee/DgwRqv69atS3h4ODExMe9zSTrJi0NZ//6ajm45uaAFhceLxSUZg8n0pDiUyfEoCruR8vrRe/VfAB6FxnDkyBHatGmjYaxRrlw5rVz/gwcPAjB27FiN7ePGjQPgwIEDGttdXV3FYBJUpiNlypTRcHnLqwNfbjh48CB6enqMHDlSq5+CIHDo0CGN7blxvbOysuLixYu8fPnynfr0JfDJBJSgrR2VFz4l7SiJD1t5+Klz9OhRjh49+l93Q0Lik+XNmzfExMRQvnz5bNvl1n3t22+/xczMjBo1alCqVCmGDRvG2bNndR4zs9uY2jXtfbWJdZEXh7K8uqClpL01vkh4eIlXG8cRNK8tzxd14fmS7sRdPYgy+f0fwENCQklMTKRUKe2UozJlymi8DgoKQi6XaxW3Ojo6YmVlRVBQkMb23LjJ5dWBLzcEBQXh5OSEublmwZFa8eRd+jl37lxu3bpFkSJFqFGjBj4+PhoB5/8Dn1RACdraUTkFlpJ21KeHuvIwP3NiQbPy8FPG0NAQQ0PD/7obEhKfPbl1XytXrhz3799n69at1KlThx07dlCnTh2mTZumdczcOJjlF3lxKMurC5qhvurnO+nZLd74/4hMzwDbxkOw7+iDfZcZmLh6gJaLd95Rnycv5FbsPDdjkVcHvg9BbvrZqVMnHj9+zNKlS3FycmLevHm4ublpzXZ+yXxyASW81Y46NroePd2dcbY10XLUkQHOtib0dHfm+Jh6+PV3/+LkZQ4dOkTdunUxNTXF3Nyc5s2bc/t2zsvI69ato379+tjb26NQKHB1dRVzcDLi4uJCixYtOHPmDDVq1MDIyIjixYuzceNGrba3b9+mfv36GBsbU7hwYWbMmJHlf+bNF4NzfBBIT4wl8sRaXq4dRvD8DgQv6EjI9mmkhGT/RKcnl7HpwlsXh927d1O+fHkUCgVubm46n/6vXr1K06ZNsbCwwMzMjAYNGnDhwgWNNqmpqfj6+lKqVCmMjIywtbWlTp06OS5VXbt2DTs7Ozw9PcXcSk9PTzGPElS5lDKZjO3bt/PTTz9RuHBhjIyMaNCggeRSJPF/iZ2dHRYWFtnmPELe3NdMTU3p3Lkz69atIzg4mObNm/PTTz+RlJT0ga4id3wohzIXW1NkQML9c8j0DXHo/CNmlRpjXKIaxi6V86XvMqBKaWeMjY0JDNS2ZLx//77Ga2dnZ5RKpVbbkJAQoqKicHZ2znMfcvsZyItjj7OzMy9fviQ2VnNy4t69e+L770LBggUZOnQou3fv5smTJ9ja2vLTTz+907E+Rz7JgFJNKQdzfFq5cWq8F7d8vDkwog67htTiwIg63PLx5tR4L3xauX0ROlmZ8fPzo3nz5piZmTFnzhymTJnCnTt3qFOnTrbC6wC//vorzs7OfPfdd8yfP58iRYowdOhQfvnlF6226iq7Ro0aMX/+fKytrenTp49G4Pr69Wu8vLy4du0akyZNYvTo0WzcuJHFixdrHQ8QKw+zIy3qNQkPLmBcojrWDQZg4d6O1DdPeb1lMmmx4Vnup648BFXl3dChQ+nSpQtz584lKSmJ9u3ba7gC3b59m7p163L9+nUmTpzIlClTePLkCZ6enly8eFFsp07Y9/LyYtmyZXz//fcULVo02xydy5cvU79+fapUqcKhQ4cwMzPL9ppnz57Nrl27GD9+PJMnT+bChQt07949230kJL5E5HI5bdq0Yd++fVy5ckXrffXMT27d1zI7gRkaGuLq6oogCKSmpuZz73PPh3QoM1Xoq5zmZHKQgSC8dVdLiwohMfBCNnvnjqK2JliYKPD29mb37t0EB799mL979y5HjhzRaN+sWTNA241uwYIFAO+kopLbz4CpqSlArmyLmzVrRnp6ulYBzcKFC5HJZDRt2jRPfUxPT9dafre3t8fJyek/c6L7L/gkZINyg6lCHzcny/+6Gx+FuLg4Ro4cyYABA1i1apW4vXfv3pQpU4aZM2dqbM/MqVOnMDY2Fl8PHz6cJk2asGDBAoYNG6bR9v79+xpVdp06daJIkSKsW7dOrLKbM2cOb9684eLFi9SoUUPsi66cmrjkNIJzUThjaOeC06CVyDLYaJq51efF6sHE3TiKVe2uWe4bHK46/t27dzUq77y8vKhUqRK///67WHn3ww8/kJqaypkzZ0THpl69elGmTBkmTpzIqVOnAFWyeLNmzbK9rxk5e/YszZo1o27duuzYsUNDXy0rkpKSuHbtmrgcbm1tzahRo7h161aOuWQSEl8aM2fO5OjRo3h4eDBw4EDKlSvHq1ev+OOPPzhz5gxWVla5dl9r3Lgxjo6O1K5dGwcHB+7evcuyZcto3ry5Vp7cx+RDO5R5lbEnsFQNYi/vJnTbNEzdPEiPjyb2nwPoWxUk9c3Tdz62nlyGV2l7AHx9fTl8+DB169Zl6NChpKWlsXTpUtzc3Lhx460PeKVKlejduzerVq0iKioKDw8PLl26xIYNG2jTpo1OrcicyO1noESJElhZWbFixQrMzc0xNTXF3d2dYsWKaR2zZcuWeHl58f333/P06VMqVarE0aNH2bNnD6NHj9YowMkNsbGxFC5cmA4dOlCpUiXMzMw4fvw4ly9fZv78+Xm+5s+Vzyag/H/i2LFjREVF0bVrVw0pCz09Pdzd3QkICMh2/4zBZHR0NKmpqXh4eHDkyBGio6PFZG/IXZXdwYMHqVmzphhMqtt1796d5cuXa5w7Y+Vhdsj0DcR/C8p0lMnxyAyNMLAplGNlovr4OVXepaenc/ToUdq0aaPx5aMW2l29ejUxMTFYWFhgZWXF7du3CQwM1BkoZyQgIICWLVvSuHFjtm7dmut8yb59+2q0Vd/3x48fSwGlxP8dhQoV4uLFi0yZMoXNmzcTExNDoUKFaNq0qSgynlv3tUGDBrF582YWLFhAXFwchQsXZuTIkfzwww//xaWJfGiHMpXTXEVsm44k+oI/EcdXo2/lgLVnH9KiQ4h+j4AyXSnQo6aqJqFixYocOXKEsWPHMnXqVAoXLoyvry+vXr3SCCgB1qxZQ/HixVm/fj27du3C0dGRyZMn68xnzQ25/QwYGBiwYcMGJk+ezODBg0lLS2PdunU6A0q5XM7evXuZOnUq27ZtY926dbi4uDBv3jyxIj0vmJiYMHToUI4ePcrOnTtRKpWULFmS5cuXM2TIkHe67s+RT0aH8v+ZzHqOc+fO5dtvv82yvYWFhTi9rkuH8uzZs0ybNo3z58+TkKA5WxgUFCRWrLm4uFCuXDmtpGFPT09kMpkYuBoZGdGpUyet3MolS5YwatQoDR3Kq8GRtP31XI7XLAhKYi/vJfbqAdKiQkB4m4+pKFoRx24zs9kbgma3YPDgwVq5oS4uLnh5ebFu3Tpev35NwYIFmTJlCtOnT9dot3jxYkaPHs2tW7dwc3Pjr7/+onXr1kRFRVG+fHmaNGlCz549xeUpUGmZbdq0CUNDQ6pWrUpAQAD6+trPZJl1KNUuDlu3bqVz585iu6dPn1KsWDHWr1+vM0lfQkJCIic+Bac5CQmQZig/SdTFLn5+fjg6Omq9ryuIUfPo0SMaNGhA6TJlGD/1Jwo4OGFspOD6+QCWLVmsVUiT3xWPua0IjD63nejTmzCt2Airuj2QG5uDTE7k8VUawWV25Gff69Wrx6NHj9izZw9Hjx5lzZo1LFy4kBUrVjBgwACxnUKhoFmzZuzZs4fDhw/TokWLXJ/jY1aXSkhI/H/wKTjNSUiAFFB+kqiXce3t7WnYsGGu9wsMiWXErNUkJycTWXs0G6LsIUr1XtTlVwAsOvaAYa1sKeWQ+7wiZ2fnXFX4wdvKw5y+2hLun0VRtCIFmmnaj4UnxyM3tsh239zW8tnZ2WFiYqKzn/fu3UMul2tovNnY2NC3b1/69u1LXFwc9erVw8fHRyOglMlkbN68mdatW9OxY0cOHTqkUdEtISHx5ZOens6bN2+ybWNmZpZjoV5+UMTGBN9WbvnqSja9ldsXp5oi8eH5pKu8/1/x9vbGwsKCmTNn6qxQ1PVF1nPtRRot+osrwVGAZkCnTIon7uZxAHZee0GjRX/Rc+3FXD/RNmvWjAsXLnDp0iWNPmzevFmrrVh5mAOqYhzN88ffO0N6NhXeaora5u6LTk9Pj8aNG7Nnzx6NyviQkBC2bNlCnTp1sLBQBa+ZqzHNzMwoWbKkzgo9Q0NDdu7cSfXq1WnZsqXGfZGQkPjyefbsGQULFsz2T13U+DGQnOYkPgWkGcpPEAsLC3799Vd69uzJV199RZcuXbCzsyM4OJgDBw5Qu3ZtUe7g1gtVLuW5x6qASOFSBfT0CfWfjnnlJihTk4i7dgS5iSXpcREolQLyf9u/jknCLioxx/5MnDgRPz8/mjRpwqhRozA1NWXVqlU4OztrJWSDqvLQ72JQtgGrcckaRJ/9nbADi1AUKkvqmyDib59E30p7iT8j6srDv3LstYoZM2Zw7Ngx6tSpw9ChQ9HX12flypUkJyczd+5csZ2rqyuenp5UrVoVGxsbrly5gr+/v1gtrtV/Y2P2799P/fr1adq0KadOnZIKayQk/k9wdHTMUaM2cxXyh2a4VykKmCmYtvc2aUohT0vgenIZ+nIZ01u5ScGkxDsjBZSfKN26dcPJyYnZs2czb948kpOTKVSoEHXr1qVv374ALAsI5PjdEADxy8PAtjB2bSYT9ZcfkQG/ITe1xrxKU/RMLAk/+FY3Ml0pIAhw73UsywICGe6VdWVzwYIFCQgIYMSIEcyePRtbW1sGDx6Mk5OThs+sGlXl4dNsr8/y604IqUnE3zlFwt3TGDqWwL7jNCJPrs92P3XloW+2rd7i5ubG6dOnmTx5MrNmzUKpVOLu7s6mTZtwd3+bcD5y5Ej27t3L0aNHSU5OxtnZmRkzZjBhwoQsj21hYcGRI0eoV68ejRo14vTp01qWYxISEl8eRkZGeUpH+lh0qV6U2iUK8N2um5x+GIaeXJZtYKl+v1ZxW2a2rSAtc0u8F1KV92fK1svB+ZozM6ddhXx9MpUqDz8P4pPTeBoeT0qaEkN9OS62ppgqpOdMCYnPncCQWDZfDCbgQSjB4QkaCUYyVKlDXqXt6VGz6BdpDiLx8ZECys+QZxEJNFx4iuS0vPmYpifGEHfjGImBl0gNf4agTMfAtjAW1VtjU8GT42M8NJ5Qk5OTmTp1Kn5+fkRGRlKxYkVmzJhBo0aNNI47c+ZM9u7dy6NHj4iNjaVIkSLUa9CYkyZ1SVdoflEJgpKYizuJvXqI9LgIDGwKYfl1R0xdPXLsv0JfrtVHibwj/tDcDyU4QscPjY0JXmXs6e5eNE/FWxISEp8m0oOjxMdACig/Q9519i/h4SXe7JyJcYlqGBWtgEyuR/z9cyQH38CqTlda9BmlMfvXtWtX/P39GT16NKVKlWL9+vVcvnyZgIAA6tSpI7Zr3749dnZ2lC1bFnNzc+7evcvq1asxsbTBoOPPyA2NxLaRJ9cTc8Efs0reGBYsRWLgRRIfXaZAqwk5BpX5PYv6/8aziIQ8L4XVLVlAWgqTkJCQkMgRKaD8BImPjxd9STMTGBJLo0W5LUnRJDXqNTKZHH1Le3GbIAiEbv2epOd3KTLqd05825iS9uZcunQJd3d35s2bx/jx4wGVdWD58uWxt7fn3Lnsxct37NhBhw4d6PPDAgLSVNWHabFhvPh1AOaVvbFpPEQ8f8jmSaRFh1BoyFpkct1ajRMal2GYl5Sf+K5svRz8Xsn6vq3c6CIF8xISEhISWSDJBr0DsbGxjB49GhcXFxQKBfb29jRq1Ih//vlHbHP69Gk6duxI0aJFUSgUFClShDFjxpCYqFlV3adPH8zMzHj06BHNmjXD3Nyc7t27Z3mMnt8MQ5ae8k79NrBy1AgmQaWraFzqa0hPRYgJYdOFYAD8/f3R09Nj4MCBYlsjIyP69+/P+fPnefbsWbbnUjvnuBcyZna7Cij05SQ9vAjKNMy+aq5xfvOvmpEeG0byi3sax9CTy1Doy/lfe/ceFdV1L3D8OzyHN4IoIKgNKCKIpGJAjcUHSqJG6huMUQyJRmOpRo1iRdBlERjTay+5JHJjhaA2tg1SDMZXFWOj16up5kpiArmK2PhA8QnDG+4fc2d0HEBkSBrl91nLtZxz9tnnnDm6+LHP/v12yuQBEkwa4d3DxazMOUtNfeNjj2o3NDZRU9/IypyzvHvYsBapEEIIARJQtot2yb8pU6aQnp7OsmXLsLKy4ty5c7o2f/7zn1Gr1SxYsIC0tDTCw8NJS0tj9uzZBv3V19cTHh5Ot27d2LhxI1OmTGmxjxP52ynL69jF5hsqbwHQpLTjcFEZAKdPn6Zv3766Oo1a2vW8z5w5o7e9qamJGzducPXqVY4ePUpsbCympqaMGDGCyME9ObgklC7q71GYK1G66I90WbhpRjBrr2nW4DY10ZQuH/qMMweXhP7kXnNHR0frAuZHSUxMRKFoayl2fZmZmSgUCr0amo/ro5OlbNxf1O7jH7RxfxE7T5Z2SF8PGjFihBSHF0KIJ5zMym2H/Px8Xn/9dd55535g9/bbb+u1SUlJwcrKSvd53rx5eHt7s2rVKkpLS3XraYMm+WXatGls2LCh1T5mznmVj7+r5/aRD6m/U2Yw2tgeDVX3qPhyP5YefpjZOlFarqaypp4rV67g5uZm0F677fLly3rbr127ptfew8ODHTt20K9fP0CzmoOPfQM17q7MDumtl3loatsFgMaKcno9gZmHarWa1NTUn1xgdOmmmoS8rx7ZrvLcZ1R999/UXP6W+ltXsPT0x/XlZIN21Rf/h8jnJhDZTB/Hjx8nJCSkA65aCCHEk0gCynZwdHTkxIkTXL58GXd392bbPBgIVlZWUlVVxdChQ2lqauL06dN6ASXAggULHtnHmQvXsOzhCzRRe+280QFlU1MjN3ZvpLGmAqcx8zXbgJJyzfVaWloaHKNUahJsHn517+TkxIEDB6iurub06dPk5ORQUVGh16aqqgpbaysSJ/qRiJ8u87C6tp6gd+DlIDf+Y9lIo+7pX0GtVrN2raYy5sMB5erVq1m5cuW/4Kpg1a6z1LfhFfe9f+yh9tr/YuHah8aqe49s7zN6OqujX9LbJvU3hRCic5OAsh1SU1OZM2cOnp6eDBo0iHHjxjF79my9lRFKS0tZs2YNeXl53Lp1S+/4O3fu6H02MzPDw8PD4Dyt9dFYU2n0fdw8sJnq81/gPOEtLLrfv/ba+kasrKyaXXawuroa0A92QbMcobbQ74QJExg9ejTDhg2jW7duTJgwQXfMg33aWJrh5+6AWq0GwN62+USkJ5mZmRlmZj/+f7Pia/c4+t2NNrXt+tJSTO2cUShMuPzBwke2L7d7hpCxEU/MCLKxWkuSE0IIoSFzKNth+vTpnD9/nrS0NNzd3VGpVPj5+fHpp58C0NDQwJgxY8jPz2fFihXk5uZy4MABMjMzAWhs1K8faWlpiYmJ/qNoro///GMuzuOXaBoYmZx/++87qPhHPo4jorH1H6W3z8LMBDc3N65cuWJwnHZbSyOzWkOHDsXNzU1vvW83NzeuXr3Kw4UF2tpna7RzFYuKipg1axYODg64uLgQHx9PU1MTly5dIiIiAnt7e1xdXfWmK0DL8xULCgpQKBQUFBQ0e96SkhJcXFwAWLt2LQqFAoVCQWJiot51PUihULBo0SK2b9+Oj48PSqWSQYMG8dlnbcve//TTTxk+fDg2NjbY2dkxfvx4vvpK/9X29hOlurmoj2Jm7/L/a6u3jYlCwZZD56ivr2/zMVoZGRl4eXlhZWXFc889x9GjR5ttV1ZWRkxMDN27d0epVDJw4ECysrL02pSUlKBQKNi4caOuX0tLSwYPHszJkycN+jx06JDue3N0dCQiIkJv3jPcf15ff/01M2fOpEuXLroSWVevXmXu3Ll4eHhgaWmJm5sbERERRs1xFUKIp4UElO3k5ubGwoULyc3N5cKFCzg7O/Pb3/4WgLNnz1JUVMQ777zDihUriIiIICws7LECpub6iJo0HjNbJ6Ov/d4Xn3Dn7zuwC4rAIWSq3j4F0NvZhsDAQIqKirh7967e/hMnTgAQGBj4yPNUV1frjcYGBgaiVqsNfog/Tp+PMmPGDBobG0lOTiY4OJj169ezadMmxowZQ48ePUhJScHb25tly5a1OYBrjYuLC++99x4AkyZNIjs7m+zsbCZPntzqcUeOHGHx4sXMmjWLdevWUV5ezgsvvEBhYWGrx2VnZzN+/HhsbW1JSUkhPj6er7/+mueff14vsDn8bVmHrlL0oOv5m0iOCkapVDJy5EhOnTrVpuO2bNnC/PnzcXV1JTU1lWHDhjFx4kSDigFVVVWMGDGC7OxsXn75ZVQqFQ4ODkRHR/P73//eoN8dO3agUqmYP38+69evp6SkhMmTJ1NXV6drc/DgQcLDwykrKyMxMZG33nqLY8eOMWzYsGYDwmnTpqFWq0lKSuL1118HNPVWd+3axdy5c0lPTyc2NpZ79+5RWtrxiUpCCPGkkVfej6mhoYGKigocHBx027p164a7u7vuda6pqaaW4oMjcU1NTc3+MGxJc31YW5hS92W+Uddfee4zbh7MwMZvBF1Gv2awv6ezNTaWZkydOlU38qOtQ1lTU8PWrVsJDg7G09NT019lJQqFAmtr/cLXH3/8Mbdu3SIoKEi3LSIigiVLlpCens67776ru7/333+fHj16MHToUKPuDTRZ6Js3bwY0iVC9e/dm6dKlbNiwgRUrVgCagu3u7u784Q9/4Be/+IVR57OxsWHq1KksWLCAgIAAZs2a1abjCgsLOXXqFIMGDQIgMjISHx8f1qxZQ05OTrPHVFRUEBsby2uvvUZGRoZu+5w5c/Dx8SEpKYmMjAwqauopvak26r6aZWqOtc9QrJ4JwtTagTcDlfz7pt8xfPhwjh07xrPPPtvioXV1daxatYrAwEAOHz6MhYUFAP3792fevHm6f0+gGcU8d+4c27Zt05XQeuONNwgNDWX16tW8+uqr2Nndf91eWlpKcXExXbpokrt8fHyIiIhg3759uukWy5cvx8nJiePHj+PkpPml7Je//CXPPvssCQkJBqOfAwcOZMeOHbrPt2/f5tixY3p1WQHi4uLa9VUKIcTTRgLKx3Tv3j08PDyYOnUqAwcOxNbWloMHD3Ly5Enda9R+/frh5eXFsmXL+P7777G3t9cFWG3VUh/mNW3v42E1l7/lxie/w8TKDmWvgVR+VaC339rTl5FDNJm6wcHBTJs2jbi4OMrKyvD29iYrK4uSkhK2bNmiO6a4uJiwsDBmzJhBv379MDEx4dSpU2zbto3evXvz61//WtfWw8ODxYsXo1KpqKurY/DgweTm5nL06FG2b9+uC6KN8dpr94NkU1NTgoKC+Oc//0lMTIxuu6OjIz4+Ppw/f97o87XXkCFDdMEkQM+ePYmIiGD37t00NDQ0+10cOHCA27dvExUVxY0b9+dHmpqaEhwczOHDhwG4WF7JDzE2qfTwRenhq/s85dXnmRk5nYCAAOLi4ti7d2+Lx546dYqysjLWrVunCyZBU4Jp+fLlem337NmDq6srUVFRum3m5ubExsYSFRXFkSNHdIEiaEaltcEkwPDhwwF0z/fKlSucOXOGt99+WxdMAgQEBDBmzBj27NljcL1vvPGG3mcrKyssLCwoKCggJiZG73xCCCEkoHxs1tbWLFy4kP3795OTk0NjYyPe3t6kp6frMrXNzc3ZvXs3sbGxbNiwAaVSyaRJk1i0aBEDBw5s03la6uOtNUlMHNW+kby6G5egoZ5G9R3K9zQzWjpuMbNCpus+fvjhh8THx+ut5f3JJ5/ojep5eHgwZcoUDh06RFZWFnV1dfTq1YtFixbxm9/8BmdnZ71TJCcn06VLFzZv3kxmZiZ9+vRh27ZtzJw5s1339LCHs+cdHBxQKpV07drVYHt5eXmHnLM9+vTpY7Ctb9++qNVqrl+/jqurq8H+4mJNYfFRo0YZ7AN0NUNrH3ON9/aqrW/Ez9ubiIgIcnJyWgyEAS5evAgY3re5ubleMpu2bZ8+fQzmFfv6+ur1pfXwM9cGe9pf4LTtfXx8DK7L19eXffv2GSTe/OxnP9NrZ2lpSUpKCkuXLqV79+6EhIQwYcIEZs+e3eyzEkKIzkYCysdkYWFBamoqqamprbbz9fXlwIEDBtsfTkjJzMzUJeu0tY9ZH/xXu9bytg0IwzYgrNl9piYKhj7jrJe5q1QqUalUqFSqFvvs2rWr7hVzW5iYmBAXF/eDvSpsLqBpKch58Fm0VHy8oaGhYy6sA2iTubKzs5sNYrTZ5BZmP87UaO15PD09qa2tpbKy0qAQ/o+hLc/3cT1cxQBg8eLFvPTSS+Tm5rJv3z7i4+PZsGEDhw4davV1vxBCdAaSlPMESpo0ALM2ZvC2lZmJgqRJAzq0zyeJdlTr9u3betsfHg1rTntWwtGONj6oqKgIa2trXdb4w7y8vADNnN2wsDCDP9oamL2dbejYfx2GtMlboHm1rFQqsbW1bbF9r169AMP7rqur48KFCwZti4uLDaohfPPNN3p9tZW2/bfffmuw75tvvqFr165tLgvk5eXF0qVL2b9/P4WFhdTW1hpUDBBCiM5IAsonkKeTNWsn+nVon+sm+uHpZP3ohk8pbbD2YOZ3Q0ODXvJLS7QJSQ8Ho605fvy43trvly5d4q9//Stjx45tccQtPDwce3t7kpKS9DKYta5fvw5o6nv2/AGeZYP6fsa+Nnnryy+/JC8vj7Fjxxq8on5QUFAQLi4uvP/++9TW3l+LPjMz0+B7GzduHFevXmXnzp26bfX19aSlpWFra0toaOhjXbebmxuBgYFkZWXpnauwsJD9+/czbty4R/ahVqt1NVi1vLy8sLOza7ZeqxBCdDbyyvsJFTm4JzcqajpkneblY31+cutl/9j8/PwICQkhLi6Omzdv4uTkxEcffdSmWotWVlb079+fnTt30rdvX5ycnPD398ff37/FY/z9/QkPDyc2NhZLS0vS09MBdCvuNMfe3p733nuPV155hZ///OdERkbi4uJCaWkp+fn5DBs2TJc9P9KnG9knLrZpWkR1aSHVlzTlihrUd2msq+H25x8BoPT0R9lTcx/Xc1MwMbdA6eGLvb8XS5bkkZGRgbW1NcnJhks1Psjc3Jz169czf/58Ro0axYwZM7hw4QJbt241mEM5b948Nm/eTHR0NF988QW9e/fmL3/5C59//jmbNm3Sy/BuK5VKxYsvvsiQIUOIiYmhqqqKtLQ0HBwcdDVDW1NUVMTo0aOZPn06/fv3x8zMjF27dnHt2jUiI5tbjFIIIToXCSifYItG9qGrrSUJeV9R39j0WHMqTU0UmJkoWDfRr9MHk1rbt29n/vz5JCcn4+joSExMDCNHjmTMmDGPPPaDDz7gV7/6FUuWLKG2tpaEhIRWA8rQ0FCGDBnC2rVrKS0tpX///mRmZhIQENDqeWbOnIm7uzvJycmoVCpqamro0aMHw4cPZ+7cubp2Lwf3JPN4SZvuu/ril9z5/I962+4c3ab5y7AoXUBp3TeEyq8KuHMil72fV+Hi4sLkyZNJSEho09KL8+bNo6GhAZVKxfLlyxkwYAB5eXnEx8frtbOysqKgoICVK1eSlZXF3bt38fHxYevWrURHR7fpnh4WFhbG3r17SUhIYM2aNZibmxMaGkpKSopBAk5zPD09iYqK4m9/+xvZ2dmYmZnRr18//vSnPzFlypR2XZMQQjxNFE3GzFwXPwmXbqpZtessR7+7gamJotXAUrt/uHdXkiYN6NSvuf9VFAoFb775pm408YfyypYT7Ureao02eSs7JrjD+hRCCPHkkxHKp4CnkzXZMcEUX7vH9hOlHC4qo7RcrVeLUIFm3tvIvt2YFdKz06zD3JklTRpA2L8d6dCAsrMnbwkhhGieBJRPkT7d7Uic6EciflTW1FNSXkltfSMWZib0drbBxlIed2eiTd5amXO2w/rs7MlbQgghmicRxlPKxtIMP3eHRzcUTzVJ3hJCCPFjkDmUQnQCH50sleQtIYQQPxgJKIXoJCR5SwghxA9FAkohOhlJ3hJCCNHRJKAUohOT5C0hhBAdQQJKIYQQQghhFFnLWwghhBBCGEUCSiGEEEIIYRQJKIUQQgghhFEkoBRCCCGEEEaRgFIIIYQQQhhFAkohhBBCCGEUCSiFEEIIIYRRJKAUQgghhBBGkYBSCCGEEEIYRQJKIYQQQghhFAkohRBCCCGEUSSgFEIIIYQQRpGAUgghhBBCGEUCSiGEEEIIYRQJKIUQQgghhFEkoBRCCCGEEEaRgFIIIYQQQhjl/wANCa2AG97CjQAAAABJRU5ErkJggg==", + "image/png": "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", "text/plain": [ "
" ] @@ -2116,171 +1478,1250 @@ }, { "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAOwCAYAAAAKo+iFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKnElEQVR4nO3debTVdb3/8deZmA+HORUQTXFWBCk1KxWzLHCi1NSfWjmkZplD3fJmZlez69Rwy8xKUyu1LKXBMnM2tVJyJAQVNUANETggCIez9+8PF+deUoGDwOEDj8darjx7f/fe791a6nny+X4/35pqtVoNAAAAFKq2owcAAACAt0LYAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFq1+RgyqVSqZPn57GxsbU1NSs7pkAAABYz1Wr1cydOzcbbbRRamuXvSa7QmE7ffr0DB48eJUMBwAAACvqn//8ZwYNGrTMY1YobBsbG9vesGfPnm99MgAAAFiG5ubmDB48uK1Hl2WFwnbJ6cc9e/YUtgAAAKwxK3I5rM2jAAAAKFq7w7ZSqaS1tXV1zAIAAADt1u6wve6663LllVemWq2ujnkAAACgXdodtgsWLMh3v/vdPP/886tjHgAAAGiXdoVta2trBg4cmAkTJuQf//jH6poJAAAAVtgK7Yq8RJ8+fdK1a9fU1dWlpaVldc0EAAAAK6xdYXv99ddnyJAh6dKlSwYPHry6ZgIAAIAV1q6w3Xvvvd3HFgAAgLXKSt/HtlKprMo5AAAAYKW0K2ynTp2af/3rX5k7d25qa1e6iQEAAGCVaVedbrfddtlmm21y/PHH54knnlhdMwEAAMAKa1fY3nffffnhD3+Yf/zjHznuuOMyY8aM1TUXAAAArJB2he3WW2+dAw44IHfffXeee+65PPjgg6trLgAAAFghK3WhbGtra3r06JHp06ev6nkAAACgXdodtosWLcq5556bzp07Z+TIkatjJgAAAFhh7bqP7Sc+8Yk8/PDDmTFjRi644ILssMMOq2suAAAAWCHtCtvFixfnE5/4RA4++OBsttlmq2smAAAAWGHtCtsrr7wyTU1NbT9Xq9XU1NSs8qEAAABgRbUrbC+77LJ07tw5G264YYYOHZodd9xxNY0FAAAAK6ZdYfu9730vixYtyty5c9PY2Jhzzz03hx12WBoaGlbXfAAAALBM7doV+e67787UqVMzZ86cHHvssTn77LPdyxYAAIAO1a6wbWxsTLVaTZKcddZZGThwYO6///7VMhgAAACsiHaF7f/dLGrSpElZtGjRahkKAAAAVlS7wrampibVajUPPfRQTj311HTq1Cn777//6poNAAAAlqtdm0eNGDEis2bNyqxZszJy5Mh8/etfz6abbrq6ZgMAAIDlalfYHnTQQXn729+eESNGZKeddkriXrYAAAB0rJrqkt2glqG5uTlNTU2ZOXNm+vTp0/Z4pVJJbW27zmYGAACA5VrSoXPmzEnPnj2XeWy7qrS+fukFXlELAABAR2v3rsgAAACwNnlLS65CFwAAgI7W7tv9vNHPAhcAAICO0q5dkcePH5+XXnops2bNSkNDQ/r375/hw4dno402sjsyAAAAHaJdYfuBD3wgSdK1a9c0NDSktrY2O+64Y84777yMGDFitQwIAAAAy9KuU5H/+Mc/Zvbs2Zk9e3ZmzJiR3/72t+nUqVM++9nPrqbxAAAAYNnadR/bJfcPqlarqVQqqaurywsvvJAhQ4Zk/vz5qaurWxMzAwAAsI5bbfexbW1tbbuWdknE3nnnnXnb296WGTNmrPzEAAAAsJLadY1tXV1dampqsmjRorzwwgu5995788UvfjEf//jH07dv39U1IwAAALypdoXtu9/97jQ1NWXRokWZOXNm5s6dmzFjxuTEE09MQ0PD6poRAAAA3lS7wnbvvfdOa2trunfvniFDhuRd73pXtttuuyRxux8AAAA6RLs2j5o5c2Z69OiRTp06LfV8pVJJbW27LtcFAACAN7XaNo+qr69/XdQmEbUAAAB0GEUKAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtrAeWYHbVgMAQHGELaxHampq2v6+UqmkUqksFbuzZs3Kiy++2BGjAQDASqvv6AGANeNnP/tZXn311bznPe/J0KFDU1v7+j/X+ta3vpUuXbrkC1/4QgdMCAAAK0fYwnrixBNPTHNzc+rq6tK1a9dst9122W233bLHHntk5513Tr9+/XLdddflqKOO6uhRAQCgXYQtrAdeffXV9OvXL9/4xjey/fbb59FHH81f/vKX3H777fn+97+fefPmZaONNsr06dOz//77d/S4AADQLsIW1gP/+te/Mnz48NTV1WXkyJHZaaedctRRR+WVV17JzJkzM2XKlPz85z/PVVddla233rqjxwUAgHYRtrAe6NevX0444YQ0NTUleW0TqZqamjQ2NqaxsTGbbLJJ7rvvvvTr16+DJwUAgPYTtrAe6NatW0aNGrXMYxoaGnLcccetoYkAAGDVEbawHqhWq6lWq2+4E/ISRxxxRDp37rwGpwIAgFVD2MJ6YMmpx8uywQYbrKFpAABg1Xrz5RtgndDS0pLFixcv85gpU6bkD3/4wxqaCAAAVi0rtrCO++Y3v5k//vGPee9735t3vOMd2WabbTJgwIB06dKl7Zgf/ehHmThxYvbZZ58OnBQAAFaOsIV13I9//OO88sormT59es4555wkySabbJKddtopu+22W0aOHJmbbrope++9dwdPCgAAK0fYwjquR48e+exnP5tjjz02M2fOzKOPPpp7770399xzT84999zMnDkzLS0t+d73vtfRowIAwEoRtrAOa25uzgc+8IG2a2z79u2bPfbYI3vssUeSpFKp5A9/+EP222+/DB8+vAMnBQCAlSdsYR3W2NiYE044IYsWLXrD52trazN9+vR069YtnTp1WsPTAQDAqiFsYR1WU1OTDTfccJnHbL755vnWt761hiYCAIBVT9jCeu69731vdtttt44eAwAAVpqwhfVYtVpNbW1tamvd0hoAgHL5bRbWU6+++mouu+yy3HzzzR09CgAAvCXCFtYz1Wo1SfLUU0/lhBNOyH/913918EQAAPDWOBUZ1jM1NTVJkm233TaVSiUvv/xyB08EAABvjRVbWEedccYZS0Vra2trWlpaMnPmzLZV2yTp06dPR4wHAACrjLCFddDTTz+db3/72+nZs2eSZMKECfngBz+Yfv365R3veEc++clP5umnn+7gKQEAYNVwKjKsg2677bYMGjQo9fX1efjhh3PSSSeltbU1V155ZaZMmZJLL700EydOzF133dXRowIAwFsmbGEddMstt2SPPfZIkvzmN79J79698z//8z8ZMmRIkmSbbbbJZz/72fzmN7/Jvvvu24GTAgDAW+dUZFgHPfroo3nppZfy17/+Nb/61a/ynve8py1qk+T9739/Bg0alGnTpnXglAAAsGoIW1gHDRo0KE899VROOumkPPfcc+nbt2/bhlFL/vfxxx/Ptttu25FjAgDAKuFUZFgH/fGPf8yUKVPyyCOP5Iknnkjfvn1TU1OTarWaarWaG2+8MS0tLdl11107elQAAHjLhC2sY+bMmZOmpqZsuumm2XTTTZd6rqamJgsWLMhf//rXjB07NvX1/hUAAED5aqr/94aWb6K5uTlNTU2ZM2dO2+1DgLXTfvvtl3322ScnnnhikuSpp57KhAkT8uyzz2bgwIHZa6+90rlz5yxevDjdu3fv4GkBAOCNtadDLdfAOubuu+/Opz/96STJnXfemeOPPz7PPPNMNtlkkyxYsCAf+MAHcv7556epqamDJwUAgFXD5lGwDpk1a1bmzp2bkSNHpqWlJaeffnqGDx+eGTNm5M4778wFF1yQK6+8MjfffHNHjwoAAKuMsIV1yN13352+ffumd+/emTp1aubOnZuLLrooPXr0yIABA3LQQQflhBNOyE9/+tOOHhUAAFYZpyLDOmTSpEmZMWNGDj744Dz99NPZYIMN0qtXryRJpVJJbW1tNt9884wfP75jBwUAgFXIii2sQ/bee+987WtfS//+/dPY2JgRI0Zk3rx5SZLa2tf+cb/rrruyww47dOSYAACwSlmxhXXIsGHDMmzYsFQqlcybNy9z5sxpW7FNkl/+8pd56KGH8p3vfKfjhgQAgFVM2MI6qLa2Nj179nzdtugjR47M+eefn/e85z0dNBkAAKx6whbWI0OGDMmQIUM6egwAAFilXGMLAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7awDqpWqx09AgAArDH1HT0A8NbNnj07zz77bCqVSoYPH56ampqOHgkAANYYK7ZQuCeeeCInnHBChg8fnp122im77bZbHnvssaWOmTlzZmbMmNFBEwIAwOolbKFwX/nKV/Lyyy/nL3/5S55++un06NEjZ5xxRpqbm9uOOf/883PjjTd23JAAALAaCVso3B//+Mecc845ecc73pFNNtkk3/3udzN58uT86Ec/ajvmiiuuSM+ePTtwSgAAWH2ELRRs6tSp6dq1a/r379/22Oabb57zzjsvX/va1zJx4sTMnTs3s2fPzl577dWBkwIAwOojbKFgM2fOzJAhQ/LII48k+d/dkA844ICMHTs2xx57bB5++OF07tw5/fr168hRAQBgtRG2ULBNNtkkH/nIR9La2prktbCtVCpJkjPPPDNJ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3HHHZauttsrw4cOXOqZSqaS21tYdAHQM19gCAO22ePFipx0DsFq5xhYAWGVaWlry7W9/O4sXL85//Md/pLW1VdQCsFZxzhAAsEwNDQ357W9/m7vvvjvNzc2pq6vr6JEAYCn+uBUAWK4LL7wwPXr0SGNj4xs+v3Dhwrz88supqanJBhtssIanA2B9J2wBgGWqVqvZaaedXvf4woUL8/jjj+fxxx/PE088kQceeCAbbrhhrrjiig6YEoD1mVORAYBlqqmpySuvvJJLLrkkV199ddvjtbW1+fOf/5yPfexjufHGG1NTU5Mrr7yyAycFYH0lbAGA5erUqVN++MMfLnUqckNDQ3bfffcMGjQo9913X37/+9+nT58+eeCBBzpwUgDWR8IWAFiuhoaGzJ49OwsXLkzy2n1rK5VKhg4dmgEDBuSmm25Kkmy11Va59dZbO3JUANZDwhYAWCHveMc7cv/99yd57TTk2traPPPMM1m0aFFaW1uTJDvttFOuv/76jhwTgPWQsAUAVsjBBx+cW2+9Nd/61rfy4osv5tZbb82nPvWpLFy4MPvvv3+S5JRTTsk3v/nNjh0UgPWOXZEBgBUyevTovPTSSznhhBPy7W9/O3379k2PHj1y1VVXpXv37kmSTTbZJJtssknHDgrAeqemWq1Wl3dQc3NzmpqaMmfOnPTs2XNNzAUArKUmTpyYu+66K126dMk73vGObL311ks9X6lUUlvrpDAA3pr2dKgVWwCgXbbaaqtstdVWWbx4cebPn7/Uc62tramrq+ugyQBYX/njVABgpfzkJz/JiBEjctBBB+XOO+/MggUL2qJ2BU4IA4BVRtgCACultrY2Tz/9dA477LCcfPLJOeCAA3LJJZfk+eefT01NTUePB8B6xDW2AMBKeeihh7LLLrvk1VdfTUtLS26//fZcffXVqa+vz+DBg3Paaaelqampo8cEoFDt6VArtgBAu1QqlSTJjjvumMbGxjz66KNpaGjI8OHDc/zxx2fChAk555xz8pvf/KaDJwVgfWHzKABghVWr1dTW1qalpSWPPvpoevXqlcMOOyydO3fO888/n/r6+my33XY59NBD069fv44eF4D1hLAFAFZYTU1Nxo0bl0MOOSQDBw7M/PnzM2fOnJxyyinp169fNttss2y00Ubp169f+vTp09HjArCecI0tANAu06dPz5VXXplhw4Zl0qRJOeOMM1532x8AeKvcxxYAWG022mijfPGLX0ySjBo1KptssslSz1erVbsiA7BG2TwKAFhpXbp0yQEHHLDUY6IWgDVN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAO329NNPJ0kqlUoHTwIgbAEAaIc//elPGTRoUL74xS8mSWpr/ToJdDz/JgIAYLmam5uz7777ZvTo0fn4xz+e6667bqXe58UXX8y4ceNy7rnn5r777su0adNW8aTA+qi+owcAAGDtNnny5Bx44IGZOXNmZs+ena5du77umGq1mpqammW+z4IFC/Ke97wnXbt2zfz58/O1r30tY8aMydixY3PIIYesrvGB9YAVWwAAlql79+7ZZZddstlmm6Vr16656aab8qEPfShjx47N0UcfnRdeeGG5UZskxxxzTLbccsvcdtttmTx5cq6//vosWLAg3/rWt/KNb3wj1Wp1DXwbYF0kbAEAWKaNNtoohx12WBYvXpy+ffvms5/9bEaMGJGBAwfm5ptvzhFHHJF77733TV9frVazaNGivPDCC9lll13St2/fJMkHP/jBXHzxxdlmm21y/fXX55prrmk7fkW1trZm0aJFWbRoUVpaWtLa2vrWvixQJGELAMCbWhKZ7373u3PAAQfkgx/8YH7xi1/knHPOyf/8z//k1ltvzYsvvphf//rXWbRo0Ru+R01NTTp16pQNN9wwEyZMyOLFi1OpVFKtVrP55pvnvPPOS9++fXPRRRelUqms0Opvkjz++OP57Gc/m5133jmDBw/ORhttlO222y6HH3547r33XivAsB5xjS0AAEtdI1upVNp2O66pqUm1Wk2nTp3y0Y9+NK+88kq22WabttdsueWW2XnnnXPPPfekU6dOy/yMo48+Oh/60Iey3377tV1Tu3jx4vTv3z9XXnllBg4cmN/+9rfZb7/9ljvvXXfdlf322y+bbbZZDjzwwAwaNChJMnPmzNx+++1597vfncsvvzxHHXXUCocyUC5hCwCwHlu4cGHOOeeczJs3LxtssEFOOumkdO/efaljloThJptsstTjS+5hO2vWrPTq1SuLFy9Off2b/3q555575uSTT87hhx+e2bNn55Of/GTb8dVqNVtsscUK3z7oc5/7XI4++uhcdNFFb/jc9773vZx77rnZd9992059BtZdTkUGAFhPXXvttRk0aFD++te/5vnnn883v/nNjB07NsmKXedaV1eXP/zhD3niiSdyzDHHLDNqlzj77LNz1lln5cQTT8wxxxyTBx98MJMmTcoNN9yQKVOmZKuttlqh2Z988snsu+++b/r8QQcdlOnTp6elpWWF3g8omxVbAID10C233JILL7ww//Vf/5Xjjz8+ra2tmTx5crbZZpv8+c9/zm677dZ2evL/PTU5SSZMmJBf//rXGT9+fH73u9/lq1/9ag444IAV+tzOnTvnjDPOyIgRI3LSSSfljjvuSHNzc5qamvLDH/4wm2+++Qq9z7bbbpsbbrghO+20UxobG9seXzLzuHHjssEGG6Rz587t+v8FKJOwBQBYDzU1NWXw4ME56KCDkry2+tqnT59svfXWmTJlSnbbbbe2U5CXRO3cuXPT2NiYIUOG5MEHH0yPHj3y1FNPZYMNNmjXZ9fV1WX06NHZZ599ctddd6Vz587p06fPCq/WJsl5552XfffdNw8++GD22WefDBw4MHV1dZk1a1buueee/OpXv8r3v//99OrVq12zAWWqqa7AeSZL/hRtzpw56dmz55qYCwCAVejmm29O//79M2LEiLbHWltbU1dX1/bz/Pnzs+mmm+Y3v/lN3vnOdy71+osuuijPPfdcTj/99AwePDhz5sxJU1NTu+dY8pktLS1paGhY+S+UZNKkSfnmN7+Z2267LdOmTUtra2v69++fkSNH5tOf/nT22GOPt/T+QMdqT4e6xhYAYB32z3/+M/vuu28++MEP5hvf+EZmzZqV5LVTduvq6to2gEqSv/3tb2lqasqwYcNedz/YV155Jb/+9a8zZ86cJGl31C5ZS1kStb/+9a8zbdq0t/LVssUWW+SSSy7JxIkTM3fu3MyfPz/PPvtsfvnLX4paWM8IWwCAddQrr7ySSy+9NA0NDbnwwgtz3XXX5fbbb1/q1j61tbVtcXvPPfdko402SufOndtWcpubm5MkX/7yl/PAAw9ku+22W+HPf/7553PZZZdlwoQJS91y549//GMOOuigXH311avqqwLrOWELALCO6tatW975znfmuOOOy6mnnprRo0fnnHPOyXPPPbfUcUtWZ++5557ssssuSZL7778/W265ZX72s5+ltbU11Wp1hW+bs3Dhwnz605/Obrvtlv/+7//O9ttvn69+9attOxSPHj061113XT72sY+tui/7b7761a/m8MMPz6JFi1bbZwBrD2ELAFCQl156KWeffXZ++tOfZvz48cs8tqamJmPGjMk+++yTJLnsssvy2GOP5Sc/+UkWLlzYdlxDQ0MWLVqUGTNmZLfddsunPvWpvPe9783uu++e448/PnV1dUutuL6R1tbWtLS05KabbspWW22V/v3756abbsrkyZNzySWX5Ctf+UquvPLKtuMPOuigdm861R4vvPBCnnnmmdX2/sDaxeZRAABruSWnDl9xxRX51Kc+leHDh2f+/PmZMGFCrrjiihx44IHp2rXrUqcY/7slmzV9/etfz3//93/nD3/4Q3beeee25++4446MGjUqSTJy5Mhcc8012WyzzVZ4tkqlkq997Wu55JJLss8+++Q73/lOunXr1nbcRz/60cyYMSN/+tOfkmS5oQzQng51ux8AgLVcTU1NFixYkB/+8Ic599xzc8opp6RSqeTkk0/OhRdemFdffTWf+MQnlhmL9fWv/dr3hS98IT/60Y/yjW98I5deeml69eqVZ599Nptuumm23XbbnHPOOdl///3bNVvy2rW6X/rSlzJo0KD07t27LWqXhG/fvn3TpUuX1NTUZAXWVZZrwYIF6dq1a9vPc+bMyc9//vNMnjw5b3vb23L44Yev1hVhYO3iVGQAgAJMmjQpzz33XIYOHZrktZA899xzM3To0Fx33XWZPHlykrxpNNbU1GTx4sVJkh/84Af51a9+lauvvjpjx47N2LFjs3jx4jz66KPtitpqtZpKpZL777+/7dTmj33sYxk9evRSnzt37tw88MAD2WKLLdoee6u23nrrtl2Vp06dmmHDhuXzn/987r777px//vnZaqutMnHixLf8OUAZhC0AwFpm/Pjx+clPftK2I3GSdOnSJc3NzWlsbEySLF68OD179sxhhx2WOXPm5Je//GWSZUfjklXbPfbYIxtvvHFOPvnkTJs2Lddee+0Kn3b8fy35rB133DF333336z4nSf7+97/nyCOPTJKcccYZy/2MFTV16tS2Ta/+4z/+I4MHD85zzz2X++67L9OmTcu73/3unHnmmUvdzghYdwlbAIC1xLx583Lqqadm5MiROeaYYzJhwoS257bccstsueWW+dGPfpTkf6Ny3333zaBBg/Lwww8vdY/aNzNx4sRsvvnmmTVrVn75y1/mL3/5S9sq8PK80WnEtbW16dSpU3bZZZcsWLBgqZB84okncs4552Tq1Km54447Vugz2mNJQP/lL3/JmWee2Rb99fX1Ofvss3P//fevktOegbWfsAUAWEvcdttteeyxxzJu3LgMGTIk3/3udzNnzpy250855ZRcc801eeyxx1JXV5fW1tbU1tbmQx/6UO644462zVVqamraVjP/XV1dXY466qjMnDkzBx544HJnam1tzeLFi/PAAw+0vfe/q62tTZcuXdK5c+fU1v7vr5dbbLFFvvrVr+b3v//9UtfDrgqVSiXz589PS0tLFixYkP79+y/1/Nve9rbMmDHDJlWwnhC2AABriWHDhuUzn/lM9t1333zrW9/KNddck/vvv7/t+X322Se77bZbPvOZz2Tu3Lmpq6tL8tqOx926dcusWbPagnbJc/9u6NChOfPMM5c7y5KVzlmzZuUzn/lMvv71ry/1+L+rr69fKiL/9a9/Zd68edl2223Tr1+/Ffj27dO5c+eMGTMmI0aMyLx589quMV5iypQp6du371KhDay77IoMALCWGDJkSIYMGZLktYjdeeedc/HFF2f48OEZMGBAevfunUsuuSTvfOc7c/LJJ+cjH/lIhg4dmiuuuCJjx45dZQHZ2tqal156KY899lj22muv7L333jnxxBPz8ssvp3fv3m/6uiVhO3HixBx66KG56qqrsv3226+Smf7dRRddlEql0vbXv3/33/3ud9ljjz1Wy2cDax/3sQUAWMssuefsQw89lBEjRuSnP/1pDjnkkLbVx3HjxuV73/teJk+enNmzZ+e9731vfvSjH6VPnz5v6XOr1Wqq1WoeeuihdO3aNVtvvXWq1WouuOCC3HTTTSt8ney+++6bfv365YorrnhL8wDrt/Z0qLAFAFgLVSqV1NbW5qCDDsrTTz+dG2+8MYMHD84rr7yS7t27J0keeuihNDY2rtCOxsuy5F6zbzTDggULcsABB2TzzTfPd7/73RU6tffII4/MVVdd9ZZmAhC2AACFa21tTV1dXV588cUMHjw45513XqrVan7zm9/kK1/5Svbcc89V8jn/N2qX/H2lUsncuXNz33335YwzzkhdXV3uvffeNDQ0LPO9Wlpacs8996yy2YD1W3s61DW2AABrobq6ulSr1bztbW/LqFGj8rnPfS49evTIeeedt0rD8f+u1C65nU9tbW3q6+vz7LPPZo899sjFF1+83PepVCqZM2dORo4cucpmA1hRwhYAYC31z3/+MwcddFDGjx+fc889N1/84hdX+r3+/XTjNzv9eMlj3bt3z9FHH912r9jlWXLLnx49eqz0jAArS9gCAKylampq8v73vz833XRT+vbt+5bfK0mefPLJbLbZZit0f9cVjdolRC3QUVxjCwCwHnizFVqAtVV7OtQdqwEA1jGLFi3KvHnzlnpsyfWzAOsiYQsAsBaoVCqr5H2OPPLIfPjDH852222X//7v/87f/va3tudW5Yrtyy+/nMWLF6+y9wN4K4QtAEAHu+uuu3L11Ve/pbhtbW3NqFGjMnny5BxzzDH5xCc+keuuuy7/+Z//mYULF67CaZP7778/++67b04//fQ88sgjq/S9AVaGzaMAADpYly5d8s9//rPtdOGVWVkdN25c5s+fn5tvvjlNTU3Zf//9s8EGG2TYsGGpq6t709fNnDkzf/7zn/P4449njz32yMYbb5yBAwcu87N23nnn/OAHP8jJJ5+cz3/+8/nkJz+ZAw88sN0zA6wqNo8CAOhgra2tmTdvXpqamlb6Pb73ve/l0ksvze23357GxsY0NDRk1qxZaWpqSm3tG5+kt3jx4uywww6pr6/PggULMm3atIwZMyZjx47NRz/60eV+ZnNzc0488cRMnTo13/3ud7Ptttuu9PwA/87mUQAABamrq0tTU9NS16y2tLSkWq2u8IZPPXv2zNNPP50nn3yy7ZTm3r17v2nUJslxxx2XQYMG5dZbb83kyZNzww03ZOHChfn2t7+diy66aLmnRvfs2TOXX3555s6dm9NOO61d8wKsSsIWAGAtUV9f3xa37T0t+fDDD8/o0aOz99575+KLL17msdVqNYsWLcr06dPzrne9K/3790+SfOADH8jFF1+cbbfdNr/61a/ys5/9rO34N9OpU6dcffXVmT59el555RW3FAI6hLAFAFiL1NfXp1qtpr6+fpmrrW/k2muvzY9+9KN8/vOfX2aM1tTUpFOnTnnb296WiRMnpqWlJZVKJZVKJZtttlnOO++89O/fPxdddFFaW1uXG6ubbLJJ5syZk5kzZ7ZrXoBVRdgCAKxDPvKRj6Surm6FVk5HjRqVcePG5Re/+EVqa2tTW1ubxYsXp1+/frnqqqsyadKkjBs3brnv09ramr322itDhgxZFV8BoN3sigwAsJZ5syidNWtW7rjjjsydOzcHHnhgevTo8ZZO/T3qqKMyadKkHHnkkWlubs7xxx+f+vrXfj2sVCrZYostlrmjcvLaBlSTJ0/O5ZdfvtJzALxVwhYAoAATJ07MqFGjMmjQoDz22GP55je/mR/+8IcZPnz4SsXtkut3zzrrrHTt2jUnnXRS/va3v+Wkk05Kjx49ct999+XJJ5/MFltsscz3qa+vz3bbbbeyXwtglXC7HwCAtdy8efOy7777Zsstt8wFF1yQxYsX59JLL82vfvWrXH755dl+++3f0vu3trbmj3/8Y0488cTU1dW1/e735S9/OUccccRyX7+y994FWJb2dKgVWwCAtdy8efPy3HPP5dRTT01jY2OS5DOf+Uze/va359Zbb11u2E6YMCHbbLPNmz5fV1eXD37wg3nyySdzxx13pHPnzunVq9cyV2KXrI3U1NSIWqDDCVsAgLVcU1NTevXqlb///e/Zd999kyTdu3fPAQcckM6dOy/ztccee2wqlUouu+yyN7xetrW1NXV1dWlpaUlDQ0P22muv5c6zePHiPPnkkxk8eHC6d+++cl8KYBWyKzIAwFquoaEhO+64Y+6444488sgjbY937tx5mbf1+drXvparr746Z5xxxuuidsnr6urqsnjx4vzmN7/J1KlTV2ie2traPPPMM6IWWGsIWwCAtcz/jdUl97T90pe+lAkTJuTrX//6UgH6ZqcB33DDDTnzzDNz++23Z7PNNss//vGP3HTTTbn44ovz+OOPL/W6W265JR/5yEdy5ZVXrtB8tbW12WeffVby2wGsejaPAgBYyy05Xfiee+7JgQcemEceeSQbbLDBm0bt1KlTs/3222fPPffMr371qzz88MM55phj8vLLLydJpkyZkrPOOitf/OIX06lTpyTJz3/+8+y2224ZOHDgm85hkyhgTWpPh1qxBQBYS4waNSr/8z//87rH6+rqUqlU8u53vzsTJkzIgAEDlhmY3bp1y1577ZVZs2bl1FNPzYc+9KGMHj06v/3tbzN58uRceumlOfvss/PjH/+47TUHH3zwMqM2Se6+++6V/m4Aq5OwBQDoYIsWLcoOO+yQV155JR//+MeXem7JyXW1tbWpVqvp37//G24CtUSlUkmfPn1yzTXXZMSIEbn22mvz/ve/P5/73Oey9dZbp7a2Nscdd1w++tGP5pprrkm1Wl3mdbpLZvj1r3+dv//972/9ywKsBnZFBgDoQDNnzsyOO+6YkSNH5pe//GVqa2uzcOHCLF68ON27d29bmV1yOvLy1Na+tm7R0NCQiy66KMOGDUvPnj3bNnpacjpx3759U19fn5qamuWG7fTp03Psscdm8uTJb/HbAqweVmwBADrIokWL8qlPfSrPP/98rr/++tTW1uacc87J2LFjs/322+f4449vO/13eVH7s5/9LKeffnr22muv3HjjjXn11VeTJEceeWTGjBnTdlxNTU3mzZuXBx54IFtssUXbY2+kWq1m5syZ2WOPPXLxxRfbawVYawlbAIAO0qlTpxx11FHZbbfdcsQRR+SII47I9ddfnxEjRuS4447LHXfckXPPPTdTpkxZ5vt897vfzRe+8IVMnz493bt3z9ixY3PDDTe0PV9f/78n6T300EM56qij0tLSki996UvLfN9qtZrrrrsuhx9+eA4//PC39mUBViO7IgMAdLAbbrghZ5xxRjp16pRrrrkmW2+9dWpqavLYY4/lgAMOyI033pjtttvuDV973333ZcyYMbnqqqsyevToJMl//ud/5sYbb8xf//rXdO3ate305EmTJuWMM87IM888k7vuuivdunVbY98RoL3a06GusQUA6GAHHHBAFi9enE6dOmWLLbZITU1NKpVKtttuu+y5556ZOHFitt1229edMrx48eJcc801OfTQQ/P+978/lUoltbW1ed/73perrroqCxYsaLu2NkmGDh2as88+O/37919u1DY3N2fixIl5xzve4RY/wFrPqcgAAB2spqYmH/nIR7LPPvu0nTa8JG4XLFiQ55577g3jsr6+PmPGjEn//v3T0NDQtjK7zTbbpKGhoe062yR58cUXM2/evGy77bYZMGDAcmfafffdc/PNN4taoAjCFgBgLVBTU5POnTsv9fM111yTO+64o22Tpzfy/ve/P2edddZSjzU1NaWlpSUTJ05Mkjz22GPZZ5998swzzyxzhkqlkiT56le/mmnTpuXMM89cyW8DsGY5FRkAYC3zi1/8InfddVd+/OMf5/vf//5SuxovT2trazp16pSmpqYsXLgws2fPzpgxY7L77rtn++23f9PXVavV/P3vf8+rr76a//qv/8qf/vSnVfFVANYIK7YAAGuZ3XbbLc8991x+//vf57DDDmv362tra7PBBhtk1qxZ+chHPpKhQ4fmyiuvXOZrKpVKjj766LznPe/Jpz71qey+++4rOz7AGmfFFgBgLbPRRhvl+uuvT0NDwzKPq1arr7sGdsn9bnv16pUjjzwy22+/fR5++OEV+twBAwZk4403zje/+c2Vmhugo1ixBQBYCy0vahcvXpxl3bVx1KhRaWhoyF133bVCn1dXV5ebb74548ePb9ecAGsDYQsAUJhqtZrnnnsuf/3rX9/0mBNPPDEzZsxIU1PTCr9vTU1N+vTpsypGBFijhC0AQGGmTJmS4447LjvssMMyj+vZs+camgigY7nGFgCgENVqNY888kjGjh2bu+66K926devokQDWClZsAQAK8eKLL+bMM8/Mn/70pwwcOLCjxwFYa1ixBQAoxAYbbJDrr78+nTp16uhRANYqVmwBAAoiagFeT9gCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAADFWrx4cZKkUql08CRARxK2AAAUZ0nI1tXVJUlqa2uzYMGCLFiwoCPHAjpIfUcPAAAAK+qFF17I5Zdfnoceeii1tbVZuHBhnn/++Wy77bZ55JFH0tTUlBtuuCGNjY0dPSqwBglbAACKMX369HzpS1/Kpz71qeyzzz6pr69Pt27dUl9fn89+9rP529/+lh//+Mf59Kc/3dGjAmuQU5EBACjG8OHD87nPfS7jxo3L+973vnzgAx9IY2Njzj///HTr1i2f//znM3bs2I4eE1jDaqrVanV5BzU3N6epqSlz5sxJz54918RcAADwhubNm5cPf/jDaWlpyUknnZQLL7wwPXv2zOGHH55DDjkknTp1SrVaTU1NTUePCrwF7elQYQsAQDEqlUpqa2szadKkjBw5Mt27d8/YsWPz4Q9/OKNGjUoSUQvriPZ0qFORAQAoRm1tbSZOnJhzzjknAwcOzIsvvpihQ4eKWljP2TwKAIBiLFy4MKeeempmzpyZ0047LVOmTMlLL72U5H9Xc//d/Pnz061btzU9KrAGCVsAAIrRuXPnnHfeeXnqqadet0nUG0Xts88+m8svvzzDhg2zqRSsw4QtAABFGTZsWIYNG5Ykue222zJy5Mj07NlzqdOQW1tbM378+HznO9/JT37yk1Sr1dx///155zvf2ZGjA6uJa2wBACjSz3/+8xx66KG54oorkmSpqL3//vvzn//5n/nd736XJ598Ml//+tczZsyYtLS0dOTIwGoibAEAKNJ+++2Xj33sY9l1112Xeryuri69evXKgAEDMnDgwGy66ab5/Oc/nx133PF1xwLrBrf7AQCgWK2tramrq0tra2umTp2aIUOGtD03Z86cHH744RkwYEAuv/zyzJkzJx/84Afzi1/8IhtttJHdk2Et53Y/AACsF2pra/Pqq6/mrLPOyvXXX58lazbVajVNTU0ZPXp0nnrqqbz88stpamrKn//85wwcOFDUwjpG2AIAUKyampp06dIllUolN954YxYuXJhKpdIWrnPmzMnkyZPT0NDQdvwKnLAIFEbYAgBQvK997WuZNm1azjzzzMyaNStJctNNN+Xaa6/NoYcemsbGxrZjl0SvwIV1h9v9AACwTvj973+fAw44IPfdd1+am5tTqVSy8cYb56CDDlrquCW3BXI6Mqw7hC0AAOuELbfcMj//+c/zwAMP5M4778zIkSPzvve9L1tttVVmzJiRSZMmpWfPnpkxY0YWLVqU7t27Z8aMGdlkk00yYsSIjh4feAvsigwAwDrtBz/4QT7/+c9n1113zUsvvZS3ve1tmTVrVt7znvfkwgsvTF1dXaZMmZINN9ywo0cF/o/2dKgVWwAA1mnbbbddmpubc9xxx+WAAw5oe/ziiy/OFltskR133DEvvfSSsIWCCVsAANZpu+66a84///wcfvjheeGFF9LY2JgPf/jDeeCBB3Lsscfm4IMPzhZbbNHRYwJvgbAFAGCd1tramtNOOy1PPPFEdthhh/Tu3TudO3fO2Wefnf322y99+vRJ8r+bSgHlEbYAAKyzKpVK6urqkiRDhw7NlVdemWq1mnHjxmWbbbZpu79tElELBXMfWwAA1lm1tbWpVCo56KCDcumll+bQQw/N1KlTM3HixKWiFiibFVsAANZplUol8+fPz0knnZQjjzwyxx13XIYOHdrRYwGrkNv9AACwzps7d27q6+vTtWvXtscqlUpqa53ACGsrt/sBAID/o7GxMcnSG0SJWlh3+KcZAID1hg2iYN0kbAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAYB1QqVTS3NyclpaWjh4F1jhhCwAAa5H58+fnueeey4MPPpg//OEPueaaazJr1qw3Pf6JJ57I6NGj07179wwdOjRnnXVW/vWvf63BiaHj1Xf0AAAAwGv+/Oc/Z7/99susWbPSp0+fdOnSJQMGDMjw4cPTu3fv1x2/aNGifPzjH0/v3r0zfvz4TJ06NQcffHBaW1tzzjnnpKGhoQO+Bax5VmwBAGAt0b179wwcODA333xzXnrppUydOjXjx4/PVltttdRx1Wo1STJu3LjMnTs3p5xySrbeeuvsvffe+cpXvpJbbrkl999//1LHwrpM2AIAwFqiR48eqa2tzRNPPJFp06blwQcfTHNz8+uOq1QqSZJHH300vXv3ztvf/va25971rneltrY2jz322BqbGzqasAUAgLVE165d071793z5y1/Onnvumf/3//5fTjvttDzxxBNJXr/6Wq1WM3/+/HTr1q3tsQEDBqRz58559tln3/A1sC5yjS0AAKwlevbsmdNOOy1vf/vb8/a3vz133HFHTjvttLzwwgu58cYbU1dXt9Txffr0ed1OyA0NDenRo8cbrvTCukrYAgDAWqKxsTFjx45N8tpK63777ZckOfXUU3PnnXdm1KhRaWlpSU1NTZJk4403Tmtra6ZPn57BgwcnSVpaWlKpVNKjR4+O+RLQAZyKDAAAa6ElpxAPHDgwtbW1eemll5K8tiJbX//a+tSWW26Z3r17509/+lPb6/75z39m8uTJede73pUkbREM6zIrtgAAsBapVCqpra1Nbe1ra1B33313ZsyYkZ133jnz5s3Lddddl0033TSjRo3KlltumY9+9KM566yzsvXWW2fDDTfM17/+9QwcOLBttVfYsj4QtgAAsJZobW3NKaeckg996ENJkgcffDBXXXVVjjnmmAwZMiTTp0/Pl7/85ey3334ZNWpUGhoacsIJJyRJTj755MyePTujRo3Kz372s7YwhvVBTXUFtklrbm5OU1NT5syZk549e66JuQAAYL1TrVYzduzYPPzww1m0aFG23HLLHHLIITnuuOOSvHb97E033ZRNN900O+yww1KvszLLuqY9HSpsAQAAWOu0p0OdnwAAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARatfkYOq1WqSpLm5ebUOAwAAAMn/9ueSHl2WFQrbuXPnJkkGDx78FsYCAACA9pk7d26ampqWeUxNdQXyt1KpZPr06WlsbExNTc0qGxAAAADeSLVazdy5c7PRRhultnbZV9GuUNgCAADA2srmUQAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0f4/+Tz2ZgXKTbkAAAAASUVORK5CYII=", "text/plain": [ - "{'id': '1869727',\n", - " 'company': nan,\n", - " 'entity_type': 'individual',\n", - " 'first_name': nan,\n", - " 'full_name': 'william \\x08stoner',\n", - " 'last_name': nan,\n", - " 'party': nan,\n", - " 'state': nan,\n", - " 'transaction_id': nan,\n", - " 'donor_id': nan,\n", - " 'year': nan,\n", - " 'amount': nan,\n", - " 'recipient_id': nan,\n", - " 'office_sought': nan,\n", - " 'purpose': nan,\n", - " 'transaction_type': nan,\n", - " 'donor_type': nan,\n", - " 'recipient_type': nan,\n", - " 'donor_office': nan}" + "
" ] }, - "execution_count": 91, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'address': '3836 BRISTOL CT', 'city': 'CLARKSTON ', 'classification': 'neutral', 'donor_id': 'c7f7a9e5-2e9e-47d1-92f6-2238c7ce301a', 'entity_type': 'Individual', 'first_name': 'THERESA ', 'full_name': 'theresa fougnie ', 'id': 'c7f7a9e5-2e9e-47d1-92f6-2238c7ce301a', 'last_name': 'FOUGNIE ', 'recipient_id': '520c9ce3-c702-4926-8688-750984ee6c0d', 'recipient_name': 'friends of sarah may seward', 'state': 'MI', 'zip': '48348-3610'}\n", + "{'classification': 'neutral'}\n", + "{'address': '330 BROAD ST APT 1', 'city': 'SPRING CITY ', 'classification': 'neutral', 'donor_id': '318b9b37-369b-45ba-9802-27177198e694', 'entity_type': 'Individual', 'first_name': 'ERIC ', 'full_name': 'eric oconnor ', 'id': '318b9b37-369b-45ba-9802-27177198e694', 'last_name': 'OCONNOR ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'PA', 'zip': '19475-1763'}\n", + "{'classification': 'neutral'}\n", + "{'address': '15 W260 FILLMORE ST', 'city': 'ELMHURST ', 'classification': 'neutral', 'donor_id': '283c7a56-1298-4003-b4b3-e4519b6077b0', 'entity_type': 'Individual', 'first_name': 'EVELYN ', 'full_name': 'evelyn pape ', 'id': '283c7a56-1298-4003-b4b3-e4519b6077b0', 'last_name': 'PAPE ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'IL', 'zip': '60126-5349'}\n", + "{'classification': 'neutral'}\n", + "{'address': '16190 DOBBINS DR', 'city': 'ALBION ', 'classification': 'neutral', 'donor_id': '306d7309-ccc7-457e-a263-394b1143dacb', 'entity_type': 'Individual', 'first_name': 'STEPHANIE ', 'full_name': 'stephanie dobbins ', 'id': '306d7309-ccc7-457e-a263-394b1143dacb', 'last_name': 'DOBBINS ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'MI', 'zip': '49224-9689'}\n", + "{'address': '3685 CREEKSIDE DRIVE', 'city': 'DORR ', 'classification': 'neutral', 'donor_id': '57069727-fd76-4630-9d36-b786d0992b4a', 'entity_type': 'Individual', 'first_name': 'ANNETTE ', 'full_name': 'annette magyar ', 'id': '57069727-fd76-4630-9d36-b786d0992b4a', 'last_name': 'MAGYAR ', 'recipient_id': '097002ca-1bbd-417a-bad9-9fd54887ebab', 'recipient_name': 'movement voter pac mi', 'state': 'MI', 'zip': '49323-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '13330 CAMINITO MAR VILLA', 'city': 'DEL MAR ', 'classification': 'neutral', 'donor_id': 'a4a903b8-a178-4fcc-ae7b-cd6852b447a0', 'entity_type': 'Individual', 'first_name': 'MICHAEL ', 'full_name': 'michael finley ', 'id': 'a4a903b8-a178-4fcc-ae7b-cd6852b447a0', 'last_name': 'FINLEY ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'CA', 'zip': '92014-3614'}\n", + "{'address': '52 PINE HILL RD', 'city': 'ASHLAND ', 'classification': 'neutral', 'donor_id': 'fd303393-0697-48f6-b704-bce3a6b36e04', 'entity_type': 'Individual', 'first_name': 'JANE ', 'full_name': 'jane malick-nugent ', 'id': 'fd303393-0697-48f6-b704-bce3a6b36e04', 'last_name': 'MALICK-NUGENT ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'MA', 'zip': '01721-1169'}\n", + "{'address': '3708 OMAHA', 'city': 'GRANDVILLE ', 'classification': 'neutral', 'donor_id': '2ac954cd-d5a2-4d94-b087-adb400d05d25', 'entity_type': 'Individual', 'first_name': 'MARY ', 'full_name': 'mary bristol ', 'id': '2ac954cd-d5a2-4d94-b087-adb400d05d25', 'last_name': 'BRISTOL ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'MI', 'zip': '49418-0000'}\n", + "{'address': '817 VERDALE DR', 'city': 'SPEARFISH ', 'classification': 'neutral', 'donor_id': '243d42aa-2d89-4df0-81c8-30b0eb2bb514', 'entity_type': 'Individual', 'first_name': 'TIARA ', 'full_name': 'tiara heckenlaible ', 'id': '243d42aa-2d89-4df0-81c8-30b0eb2bb514', 'last_name': 'HECKENLAIBLE ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'SD', 'zip': '57783-1636'}\n", + "{'address': '2954 BAY VILLAGE CIR APT 1074', 'city': 'SANTA ROSA ', 'classification': 'neutral', 'donor_id': '5fce81ac-a80a-4153-9893-a4f117312808', 'entity_type': 'Individual', 'first_name': 'JENNIFER ', 'full_name': 'jennifer ellis ', 'id': '5fce81ac-a80a-4153-9893-a4f117312808', 'last_name': 'ELLIS ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'CA', 'zip': '95403-2288'}\n", + "{'address': '12606 CEDAR CROSSINGS DR', 'city': 'CHARLOTTE ', 'classification': 'neutral', 'donor_id': '0b7ab244-7d09-40f6-9da9-04492dca4c59', 'entity_type': 'Individual', 'first_name': 'MARGARET ', 'full_name': 'margaret johnson ', 'id': '0b7ab244-7d09-40f6-9da9-04492dca4c59', 'last_name': 'JOHNSON ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'NC', 'zip': '28273-8868'}\n", + "{'address': '7730 BOHM RD', 'city': 'IMLAY CITY ', 'classification': 'neutral', 'donor_id': '519dfef0-05c0-4759-851a-8caa7f56ff1d', 'entity_type': 'Individual', 'first_name': 'BETTY ', 'full_name': 'betty burton ', 'id': '519dfef0-05c0-4759-851a-8caa7f56ff1d', 'last_name': 'BURTON ', 'recipient_id': '7e56adfa-c5e4-459d-b280-92a2c67e8602', 'recipient_name': 'lapeer county democratic party', 'state': 'MI', 'zip': '48444-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '107 MEYERS AVE', 'city': 'JACKSON ', 'classification': 'neutral', 'donor_id': '67ef676e-27a0-40d5-8f5c-9bfae6f80a88', 'entity_type': 'Individual', 'first_name': 'TERRY ', 'full_name': 'terry applegate ', 'id': '67ef676e-27a0-40d5-8f5c-9bfae6f80a88', 'last_name': 'APPLEGATE ', 'recipient_id': 'a9c205c4-6e86-465d-b9f8-55400317be37', 'recipient_name': 'sheet metal workers local 7 pac', 'state': 'MI', 'zip': '49203-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '4890 GARDENER RD.', 'city': 'METAMORIA ', 'classification': 'neutral', 'company': 'retired', 'donor_id': '31c2546b-6967-4625-8266-2ca498d7b0e1', 'entity_type': 'Individual', 'first_name': 'DIANE ', 'full_name': 'diane scott ', 'id': '31c2546b-6967-4625-8266-2ca498d7b0e1', 'last_name': 'SCOTT ', 'occupation': 'homemaker', 'recipient_id': '4a4659c5-77ec-4e8e-a171-48d9266cd78f', 'recipient_name': 'teamsters 406 political action committee', 'state': 'MI', 'zip': '48455-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '1033 N. PAULINA ST UNIT 1R', 'city': 'CHICAGO ', 'classification': 'neutral', 'company': 'capital area housing pship', 'donor_id': 'f2afa0d1-b1f9-4278-9df4-c5bf2c01c65b', 'entity_type': 'Individual', 'first_name': 'CURTIS ', 'full_name': 'curtis audette ', 'id': 'f2afa0d1-b1f9-4278-9df4-c5bf2c01c65b', 'last_name': 'AUDETTE ', 'occupation': 'marketing director', 'recipient_id': '9187a1f9-7b89-47cc-b136-04b272161da1', 'recipient_name': 'will snyder majority fund', 'state': 'IL', 'zip': '60622-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '1490 7TH ST NW APT 210', 'city': 'WASHINGTON ', 'classification': 'neutral', 'donor_id': '7ca75427-170a-4b3b-8e26-1fdd95e7590f', 'entity_type': 'Individual', 'first_name': 'RITA ', 'full_name': 'rita collins ', 'id': '7ca75427-170a-4b3b-8e26-1fdd95e7590f', 'last_name': 'COLLINS ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'DC', 'zip': '20001-3389'}\n", + "{'address': '4358 FOXPOINTE DRIVE', 'city': 'WEST BLOOMFILED ', 'classification': 'neutral', 'donor_id': 'c2269438-d978-4732-a2c1-f2621514a1f1', 'entity_type': 'Individual', 'first_name': 'LAURA ', 'full_name': 'laura noveck ', 'id': 'c2269438-d978-4732-a2c1-f2621514a1f1', 'last_name': 'NOVECK ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'MI', 'zip': '48323-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '83 ANCHOR DR', 'city': 'INDIAN HARBOUR BEACH', 'classification': 'neutral', 'donor_id': '2800af86-a826-4ee1-a2b3-3b8d454b229d', 'entity_type': 'Individual', 'first_name': 'JAMES ', 'full_name': 'james bangerter ', 'id': '2800af86-a826-4ee1-a2b3-3b8d454b229d', 'last_name': 'BANGERTER ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'FL', 'zip': '32937-3563'}\n", + "{'address': '1978 EDGEWOOD BLVD', 'city': 'BERKLEY ', 'classification': 'neutral', 'donor_id': 'b61a2f45-5a13-401a-b0c2-470368e45a95', 'entity_type': 'Individual', 'first_name': 'LISA ', 'full_name': 'lisa turner ', 'id': 'b61a2f45-5a13-401a-b0c2-470368e45a95', 'last_name': 'TURNER ', 'recipient_id': '116b2364-8dc9-4ec5-83ad-0f43db55c764', 'recipient_name': 'committee to elect natalie price', 'state': 'MI', 'zip': '48072-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '1791 WALLACE ST', 'city': 'SIMI VALLEY ', 'classification': 'neutral', 'company': 'county of ventura', 'donor_id': '05fbf8f2-14e5-468f-ac3c-6d38cb79aea2', 'entity_type': 'Individual', 'first_name': 'REBECCA ', 'full_name': 'rebecca albarran ', 'id': '05fbf8f2-14e5-468f-ac3c-6d38cb79aea2', 'last_name': 'ALBARRAN ', 'occupation': 'hs client benefit spec iv', 'recipient_id': '0cf71bd1-086d-433d-bebc-02a1976da5fc', 'recipient_name': 'michigan corrections organization political action committee', 'state': 'CA', 'zip': '93065-0000'}\n", + "{'classification': 'neutral'}\n", + "{'classification': 'neutral'}\n", + "{'address': '4375 ELMWOOD DR', 'city': 'OKEMOS ', 'classification': 'neutral', 'donor_id': '2a66be20-50a9-4c95-a836-7dcdf6f85c53', 'entity_type': 'Individual', 'first_name': 'MARY ', 'full_name': 'mary hardy ', 'id': '2a66be20-50a9-4c95-a836-7dcdf6f85c53', 'last_name': 'HARDY ', 'recipient_id': '3933a18f-92b6-4fb9-8ed9-a289ae65c09d', 'recipient_name': 'emily busch for state representative', 'state': 'MI', 'zip': '48864-0000'}\n", + "{'address': '9732 NW HENRY CT', 'city': 'PORTLAND ', 'classification': 'neutral', 'donor_id': '135321c7-d5f3-4496-8593-e3d92dc01b4f', 'entity_type': 'Individual', 'first_name': 'DAVID ', 'full_name': 'david evans ', 'id': '135321c7-d5f3-4496-8593-e3d92dc01b4f', 'last_name': 'EVANS ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'OR', 'zip': '97229-8060'}\n", + "{'address': '6516 FOREST RIDGE DR', 'city': 'DURHAM ', 'classification': 'neutral', 'donor_id': '82f6e2a5-d1f6-40b1-ab48-b0ddd0d8b2ef', 'entity_type': 'Individual', 'first_name': 'VICTORIA ', 'full_name': 'victoria mathews ', 'id': '82f6e2a5-d1f6-40b1-ab48-b0ddd0d8b2ef', 'last_name': 'MATHEWS ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'NC', 'zip': '27713-6743'}\n", + "{'address': '434 FRANKLIN ST APT 2', 'city': 'CAMBRIDGE ', 'classification': 'neutral', 'donor_id': '983946cd-bd5f-49de-8d7d-5c7e5fc187df', 'entity_type': 'Individual', 'first_name': 'ALISON ', 'full_name': 'alison gassett ', 'id': '983946cd-bd5f-49de-8d7d-5c7e5fc187df', 'last_name': 'GASSETT ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'MA', 'zip': '02139-3261'}\n", + "{'address': '401 S LAKESHORE BLVD 314', 'city': 'MARQUETTE ', 'classification': 'neutral', 'donor_id': '59835b92-ae12-4c63-bcf5-bc4c15f49a1a', 'entity_type': 'Individual', 'first_name': 'LISA ', 'full_name': 'lisa stasiuk ', 'id': '59835b92-ae12-4c63-bcf5-bc4c15f49a1a', 'last_name': 'STASIUK ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'MI', 'zip': '49855-0000'}\n", + "{'address': '1398 PARKVIEW DR', 'city': 'NEW RICHMOND ', 'classification': 'neutral', 'donor_id': 'a20e56d4-b16a-48d9-a572-dd5c20afb4ed', 'entity_type': 'Individual', 'first_name': 'STEPHEN ', 'full_name': 'stephen tornio ', 'id': 'a20e56d4-b16a-48d9-a572-dd5c20afb4ed', 'last_name': 'TORNIO ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'WI', 'zip': '54017-2339'}\n", + "{'address': '17367 NORTHWOOD HWY', 'city': 'ARCADIA ', 'classification': 'neutral', 'donor_id': 'd228df64-4788-45fa-8fad-495f05058201', 'entity_type': 'Individual', 'first_name': 'MARY ', 'full_name': 'mary williams ', 'id': 'd228df64-4788-45fa-8fad-495f05058201', 'last_name': 'WILLIAMS ', 'recipient_id': '097002ca-1bbd-417a-bad9-9fd54887ebab', 'recipient_name': 'movement voter pac mi', 'state': 'MI', 'zip': '49613-0000'}\n", + "{'address': '2175 W 25TH ST', 'city': 'LOS ANGELES ', 'classification': 'neutral', 'donor_id': '16817b6c-6455-49e3-aec7-ae3a1100a96a', 'entity_type': 'Individual', 'first_name': 'JAMES ', 'full_name': 'james haley ', 'id': '16817b6c-6455-49e3-aec7-ae3a1100a96a', 'last_name': 'HALEY ', 'recipient_id': '0cf71bd1-086d-433d-bebc-02a1976da5fc', 'recipient_name': 'michigan corrections organization political action committee', 'state': 'CA', 'zip': '90018-0000'}\n", + "{'address': 'PO BOX 410', 'city': 'MENDOCINO ', 'classification': 'neutral', 'donor_id': 'f1e3260d-301f-4ea5-b503-e0455e3f0f10', 'entity_type': 'Individual', 'first_name': 'SUSAN ', 'full_name': 'susan keller ', 'id': 'f1e3260d-301f-4ea5-b503-e0455e3f0f10', 'last_name': 'KELLER ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'CA', 'zip': '95460-0410'}\n", + "{'address': '1460 E POND DR APT 14', 'city': 'OKEMOS ', 'classification': 'neutral', 'donor_id': 'a7d035e5-12cf-4e5a-8dc2-0d9552bc59d8', 'entity_type': 'Individual', 'first_name': 'RUSS ', 'full_name': 'russ kirkpatrick ', 'id': 'a7d035e5-12cf-4e5a-8dc2-0d9552bc59d8', 'last_name': 'KIRKPATRICK ', 'recipient_id': '520c9ce3-c702-4926-8688-750984ee6c0d', 'recipient_name': 'friends of sarah may seward', 'state': 'MI', 'zip': '48864-0000'}\n", + "{'address': '207 N. 5TH AVE. UNIT A', 'city': 'BARSTOW ', 'classification': 'neutral', 'donor_id': '7f16dd46-24ca-475c-9ee2-e5e49fe90048', 'entity_type': 'Individual', 'first_name': 'BRIDGET ', 'full_name': 'bridget breese ', 'id': '7f16dd46-24ca-475c-9ee2-e5e49fe90048', 'last_name': 'BREESE ', 'recipient_id': '0cf71bd1-086d-433d-bebc-02a1976da5fc', 'recipient_name': 'michigan corrections organization political action committee', 'state': 'CA', 'zip': '92311-0000'}\n", + "{'address': '1127 RANFIELD LANE', 'city': 'FLINT ', 'classification': 'neutral', 'donor_id': '4a2985a0-1033-49d7-bd6e-ff09983ed3b9', 'entity_type': 'Individual', 'first_name': 'DALE ', 'full_name': 'dale weighill ', 'id': '4a2985a0-1033-49d7-bd6e-ff09983ed3b9', 'last_name': 'WEIGHILL ', 'recipient_id': '7dbf96d7-7405-4f4e-8089-da6ecdf2197f', 'recipient_name': 'michigan community college association political action comm', 'state': 'MI', 'zip': '48532-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '2885 SLEEPING MEADOW LANE', 'city': 'MASON ', 'classification': 'neutral', 'company': 'consumers energy', 'donor_id': 'b8df5c77-6655-44d5-8efa-5a1cb02e0b7f', 'entity_type': 'Individual', 'first_name': 'BRIAN ', 'full_name': 'brian bushey ', 'id': 'b8df5c77-6655-44d5-8efa-5a1cb02e0b7f', 'last_name': 'BUSHEY ', 'occupation': 'dir egi analytics', 'recipient_id': '642c45b3-2610-4afe-a3b8-a611eaeb9e94', 'recipient_name': 'cms energy corp employees for better government', 'state': 'MI', 'zip': '48854-8709'}\n", + "{'classification': 'neutral'}\n", + "{'address': '1217 WHISPERING KNOLL LN', 'city': 'ROCHESTER HILLS ', 'classification': 'neutral', 'company': 'blue cross blue shield of mich', 'donor_id': 'c818757b-5305-45c8-b024-30244cc46d21', 'entity_type': 'Individual', 'first_name': 'KATHRYN ', 'full_name': 'kathryn antoski ^ ', 'id': 'c818757b-5305-45c8-b024-30244cc46d21', 'last_name': 'ANTOSKI ^ ', 'occupation': 'analyst - senior', 'recipient_id': '5a56136a-8ea1-4027-918f-be7d7a66c373', 'recipient_name': 'blue cross blue shield of michigan political action committee', 'state': 'MI', 'zip': '48306-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '4608 OAKRIDGE DR', 'city': 'MIDLAND ', 'classification': 'neutral', 'donor_id': '4c1803dc-2633-4432-9d19-005d82aedf68', 'entity_type': 'Individual', 'first_name': 'JAMES ', 'full_name': 'james allen ', 'id': '4c1803dc-2633-4432-9d19-005d82aedf68', 'last_name': 'ALLEN ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'MI', 'zip': '48640-1914'}\n", + "{'address': '1919 CURTIS ST', 'city': 'BERKELEY ', 'classification': 'neutral', 'donor_id': '514931c3-da83-44dd-bc30-4fece766d85e', 'entity_type': 'Individual', 'first_name': 'JOAQUIN ', 'full_name': 'joaquin carbonell ', 'id': '514931c3-da83-44dd-bc30-4fece766d85e', 'last_name': 'CARBONELL ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'CA', 'zip': '94702-1648'}\n", + "{'address': '39842 GOLFVIEW DR.', 'city': 'NORTHVILLE ', 'classification': 'neutral', 'donor_id': '739bc866-c9cc-4360-ae52-9b15c22ca6b6', 'entity_type': 'Individual', 'first_name': 'DONALD ', 'full_name': 'donald gates ', 'id': '739bc866-c9cc-4360-ae52-9b15c22ca6b6', 'last_name': 'GATES ', 'recipient_id': 'e9e8bf7f-2d34-42c9-b155-b95481ca238f', 'recipient_name': 'committee to elect dave staudt', 'state': 'MI', 'zip': '48167-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '7300 KRAENZLEIN ROAD', 'city': 'BAY CITY ', 'classification': 'neutral', 'donor_id': '4ae0900b-eac4-4e41-b4a2-6727561db273', 'entity_type': 'Individual', 'first_name': 'JOAN ', 'full_name': 'joan wilson ', 'id': '4ae0900b-eac4-4e41-b4a2-6727561db273', 'last_name': 'WILSON ', 'recipient_id': 'c5bc157e-1eff-4db0-b26a-eea376cc3fd0', 'recipient_name': 'tamara d carlone for state board of education', 'state': 'MI', 'zip': '48706-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '753 PATRICIA PLACE DR', 'city': 'WESTLAND ', 'classification': 'neutral', 'company': 'blue cross blue shield of mich', 'donor_id': '184e5f13-aba5-44da-be09-572ac083b3e9', 'entity_type': 'Individual', 'first_name': 'SHUNDA ', 'full_name': 'shunda jones ^ ', 'id': '184e5f13-aba5-44da-be09-572ac083b3e9', 'last_name': 'JONES ^ ', 'occupation': 'manager - administrative', 'recipient_id': '5a56136a-8ea1-4027-918f-be7d7a66c373', 'recipient_name': 'blue cross blue shield of michigan political action committee', 'state': 'MI', 'zip': '48185-0000'}\n", + "{'address': '3830 33RD AVE SW UNIT A', 'city': 'SEATTLE ', 'classification': 'neutral', 'donor_id': '9a5a86bb-a480-42ad-913a-17f80efbfb86', 'entity_type': 'Individual', 'first_name': 'JAMES ', 'full_name': 'james sims ', 'id': '9a5a86bb-a480-42ad-913a-17f80efbfb86', 'last_name': 'SIMS ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'WA', 'zip': '98126-2514'}\n", + "{'address': '204 HURON ST', 'city': 'BAY CITY ', 'classification': 'neutral', 'donor_id': '298c73fa-495f-4df0-a348-16a62d6464ee', 'entity_type': 'Individual', 'first_name': 'MATHEWS ', 'full_name': 'mathews gavin ', 'id': '298c73fa-495f-4df0-a348-16a62d6464ee', 'last_name': 'GAVIN ', 'recipient_id': 'a9c205c4-6e86-465d-b9f8-55400317be37', 'recipient_name': 'sheet metal workers local 7 pac', 'state': 'MI', 'zip': '48706-4931'}\n", + "{'address': '740 HEWITT LN', 'city': 'NEW WINDSOR ', 'classification': 'neutral', 'donor_id': 'a41724c3-f42d-42a0-bc7d-8973c2e3a0c8', 'entity_type': 'Individual', 'first_name': 'MARY ', 'full_name': 'mary washburn ', 'id': 'a41724c3-f42d-42a0-bc7d-8973c2e3a0c8', 'last_name': 'WASHBURN ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'NY', 'zip': '12553-5462'}\n", + "{'address': '100 ROCKVIEW ST', 'city': 'JAMAICA PLAIN ', 'classification': 'neutral', 'donor_id': '1755fe5d-6210-4ecd-8075-de785b4a8a73', 'entity_type': 'Individual', 'first_name': 'TIMOTHY ', 'full_name': 'timothy havel ', 'id': '1755fe5d-6210-4ecd-8075-de785b4a8a73', 'last_name': 'HAVEL ', 'recipient_id': '097002ca-1bbd-417a-bad9-9fd54887ebab', 'recipient_name': 'movement voter pac mi', 'state': 'MA', 'zip': '02130-4660'}\n", + "{'address': '2260 POLISH LINE RD.', 'city': 'CHEBOYGAN ', 'classification': 'neutral', 'donor_id': '46b3649a-e403-4bd0-8ee2-d65a34d191f9', 'entity_type': 'Individual', 'first_name': 'STEVE ', 'full_name': 'steve downing ', 'id': '46b3649a-e403-4bd0-8ee2-d65a34d191f9', 'last_name': 'DOWNING ', 'recipient_id': 'b92fe9af-a5f5-4f15-8f35-d5536eb946eb', 'recipient_name': 'friends of marie fielder', 'state': 'MI', 'zip': '49721-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '10698 BEAR LAKE TRL', 'city': 'PORTAGE ', 'classification': 'neutral', 'donor_id': 'b0dafcd3-4ba2-4aa1-ac43-2298edc705e4', 'entity_type': 'Individual', 'first_name': 'MICHAEL ', 'full_name': 'michael anderson ', 'id': 'b0dafcd3-4ba2-4aa1-ac43-2298edc705e4', 'last_name': 'ANDERSON ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'MI', 'zip': '49024-6206'}\n", + "{'address': '150 MARINE AVE', 'city': 'BROOKLYN ', 'classification': 'neutral', 'donor_id': '58988e4c-4376-4fd7-8c13-10bc9fc65335', 'entity_type': 'Individual', 'first_name': 'PAMELA L ', 'full_name': 'pamela l landberg ', 'id': '58988e4c-4376-4fd7-8c13-10bc9fc65335', 'last_name': 'LANDBERG ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'NY', 'zip': '11209-7744'}\n", + "{'address': '1701 PORTER SW SUITE 6', 'city': 'WYOMING ', 'classification': 'neutral', 'company': 'self emp;oyed', 'donor_id': '3dfd0b64-eb59-4475-9abc-8be958bd8182', 'entity_type': 'Individual', 'first_name': 'DANIEL ', 'full_name': 'daniel hibma ', 'id': '3dfd0b64-eb59-4475-9abc-8be958bd8182', 'last_name': 'HIBMA ', 'occupation': 'property management', 'recipient_id': 'b4b49f06-2c4d-42e4-83e8-fc63c95fad04', 'recipient_name': 'committee to protect voters rights', 'state': 'MI', 'zip': '49519-0000'}\n", + "{'classification': 'neutral'}\n", + "{'address': '1501 BRIDGEWATER DR', 'city': 'MELBOURNE ', 'classification': 'neutral', 'donor_id': 'd71d895c-b18c-45ed-9a13-ec025564fedb', 'entity_type': 'Individual', 'first_name': 'JUDITH ', 'full_name': 'judith behrendt ', 'id': 'd71d895c-b18c-45ed-9a13-ec025564fedb', 'last_name': 'BEHRENDT ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'FL', 'zip': '32934-3215'}\n" + ] } ], "source": [ - "x = add_notes_from_df(merged_inds_sample)\n", - "x.nodes['abdussamad, shams']" + "matplot_G = create_network_nodes(grouped_sample.sample(50))\n", + "for v,d in matplot_G.nodes(data=True):\n", + " #print(u)\n", + " #print(v)\n", + " print(d)" ] }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 118, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idcompanyentity_typefirst_namefull_namelast_namepartystatetransaction_iddonor_idyearamountrecipient_idoffice_soughtpurposetransaction_typedonor_typerecipient_typedonor_office
6631869727NaNindividualNaNwilliam \bstonerNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", - "
" - ], "text/plain": [ - " id company entity_type first_name full_name last_name \\\n", - "663 1869727 NaN individual NaN william \bstoner NaN \n", - "\n", - " party state transaction_id donor_id year amount recipient_id \\\n", - "663 NaN NaN NaN NaN NaN NaN NaN \n", - "\n", - " office_sought purpose transaction_type donor_type recipient_type \\\n", - "663 NaN NaN NaN NaN NaN \n", - "\n", - " donor_office \n", - "663 NaN " + "['green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'red',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green',\n", + " 'green']" ] }, - "execution_count": 79, + "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "merged_inds_sample.loc[merged_inds_sample.full_name == 'william \\x08stoner']" + "#for a,b in G.nodes(data=True):\n", + " #print(G[node])#['classification'])\n", + "# print(b)#['classification'])\n", + "entity_colors = {'neutral': 'green', 'c':'blue', 'f':'red'}\n", + "node_colors = [entity_colors.get(G.nodes[node].get('classification', 'neutral'), 'green') for node in G.nodes()]\n", + "node_colors" ] }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 36, "metadata": {}, "outputs": [ { "data": { + "image/png": "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JmHbgQMH7nu+28+bP39+fHx8UnzegwcPUqBAAUqUKJFov6ioKM6fP297Rdz2M/X09GTixIls3LiRxx57DB8fH4YPH57iOmNjY23nPXjwIK+++io7duygdevW5M2b11ZblSpVUnxOkZyobt26rF+/nsWLF3P69GkCAwPp3LkzR44csXdpIpKFpCpQ5suXD8D2F/uVK1dsbSk95m727NnDP//8Q+fOnW1tnTt35vz586xcufKux73wwguULVuWUaNGJVne7069gdXJvG5fXHEm8DngCywEhgAVgUeBsNv2cwCOrFzJhAkTeOihh+Lbbq06cfXq1SQrUDz55JOsXr06yev111+/a70//fRTkv1nzpxp216sWDF2797NK6+8wsWLF5k6dSrPP/88RYsWZfTo0ff8Pq5cuQJwz59fSn92d543tf9NREREJDtN0bvvvpsoTD///POJtj/zzDO0bt2a8PBwJk+ebPuHSEocPHjQdt6KFSsyadIk2rRpw9dff52otvt9FpHcwGKx0LZtW3bv3s306dPZsGEDFSpU4NVXX+XcuXP2Lk9EsoBULZh8ZwjJly+frS2lx9zNd999h7u7O35+frbeTFdXV8qUKcOcOXNo06ZNsscl9FJ269aNX375hfbt29/1GmWB5vesIj4o/ufW6wKwCZgKLAc6AX/ctm/R/PkZNGgQcXFxvP766wwYMIBVq1Yl6WkDKFmyJM2bJ736yZMn71pL48aNKVKkyD3rfeihh5gyZQpffPEFQUFBrFy5kvHjxzN8+HAeeughet5ldZ+En8e9fn4p/dnded7z58/fc5/k/ju6cOFCkv369evHE088AUCXLl2SPVetWrVYtmwZgYGBKa4RoEyZMnz11VdYLBZcXV0pW7YsRYsWtW339PRMVKuIxC+p2qNHDzp37sxnn33GuHHjmDlzJm+++Sb//e9/teCBSC6Wqh7KPXv2kCdPHsqWLQtAxYoVOXToEDdu3EjxMckxxvD9998TFRVFQEAAZcuWtb2OHj3KokWLiIyMvOvxL7zwAlarNUW9lKlRGGgHLAOaABuBY7fvcMet/tdee439+/fz4osvplsNKWWxWChXrhwDBgxgw4YNODg4MGfOnLvuX7FiRSD+53M3CdsCAgLuuk9y5718+TLHjx9P8XkrVKjApUuXCAsLS7RfuXLlaN68Oc2bN0/3pRzd3d1p3rw5jz76KA0aNEgUJhNqAvjnn3/S9boiOUHevHl5++23CQkJoUePHrz33ntYrVamT59+10eURCRnS3GgPHr0KH/88QfNmjWz3Vp84oknuH79OgsWLEjxMclZv349J0+eZNSoUSxYsCDR68svv+Tq1atJn5G8TUIv5a5du1i0aFFKP1KqJPR/nUposFjAas2Qa6WVn58fBQsWtD2/mZyGDRtSoEAB5s6dm2QVnQTffvstgK2XMCUS9k049k4REREsWrSIChUqYL31/SUcc68AnNnKlStH+fLl7/uPGZHcrEiRInzyySccPHiQpk2b0qtXL6pWrcrixYvT9R/3IpL1pThQvvTSSxhjEg186NOnD0WLFuX1119P8oD29evXkz0mOQm3u19//XU6dOiQ6NWrVy/Kli1737DRpUsXrFYr7733XnzDrVuWqXEa2J9MezTwO/Ffli1C+vuDnZcn3Lp1K1FRUUna//rrLy5cuED58uXvemzevHkZMmQIhw4d4t1k1idfunQps2bNomXLlokGAt1Phw4dCAgIYNy4cWzfvj3Rtri4OPr27cvFixcZMWKErf25554jICCA0aNHs2XLlmTPa4+/nN577z0uXLhAz549k+11WbVqFb/++mum1yWS1fj5+TFnzhz+/vtvihcvzpNPPknjxo3ZvHmzvUsTkUyS4mco169fz2effUb9+vVtbYULF+bHH3+kTZs21KhRg549exIQEMDp06eZNWsWwcHBSY65040bN/jpp59o0aLFXW9rtmvXjs8++4yzZ88muTWZwNHRkXfffZeXXnopvsHHBw4cgNuCwA7gu2SO9QfqASeB2kAz4gfheANnge+B3cBrQBEAJydo1equnym9/Pjjj8kOVmnRogXFihVj9uzZzJkzh/bt21OzZk2cnZ05cOAAX3/9Na6urrzzzjv3PP9bb73Fzp07GT9+PJs3b+aZZ57Bzc2NjRs38t1331GxYkW++eabJMedO3eOMWPGJGn39fXlhRde4Mcff+TRRx+lYcOGvPTSSwQGBnLp0iXmzp3Ljh07GDx4MJ06dbIdlydPHhYuXEjLli1p2LAhTz/9NI0aNcLd3Z2wsDAWL17M8ePH7/ocbUbp2LEj//zzD2PHjmXnzp107twZHx8fLly4wIoVK/j999+ZO3duptYkkpXVqFGD1atXs2rVKt58803q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GPLkyZOorXPnzsydO9dOFYmIiIjcm255ZzGHDh1K0vb999/TokULO1QjIiIicn8KlFnMnj17km3/7bffkg2bIiIiIvamQJnFHDhwIElbhQoV+PrrrylfvrwdKhIRERG5t3vPXyOZztHREYCCBQuSP39+jh49yq+//oq/v7+dKxMRERFJngblZEHh4eEUKlSIvXv3UqVKFZ599ll++OEHe5clIiIikiwFyizuoYceIiIigqioKHuXIiIiIpIsPUOZxb344otcvXqVhQsX2rsUERERkWSphzKLi4yMxNPTkxo1arB9+3Z7lyMiIiKShHooszgPDw+qVavGzp07uXr1qr3LEREREUlCgTIbeOutt4iLi2PcuHH2LkVEREQkCd3yzibc3NwoVKgQYWFh9i5FREREJBH1UGYTrVq14t9//9VqOSIiIpLlKFBmE2PHjgXg3XfftXMlIiIiIonplnc2Urx4cS5duqTBOSIiIpKlqIcyG+nevTvXrl3TqjkiIiKSpaiHMhu5evUqHh4ePPzww/z999/2LkdEREQEUA9ltpI3b14efvhhzUkpIiIiWYoCZTbz9ttvY4xhzJgx9i5FREREBNAt72wpb968FChQgH///dfepYiIiIiohzI7at26NadOneLAgQP2LkVEREREPZTZ0aFDh6hQoQJPPfUUCxcutHc5IiIiksspUGZTJUuW5MKFC1y7ds3epYiIiEgup1ve2dTLL7/M9evXmT9/vr1LERERkVxOPZTZ1NWrV8mXLx9VqlRh165d9i5HREREcjH1UGZTCXNS7tmzh8jISHuXIyIiIrmYAmU29u6772KMYfTo0fYuRURERHIx3fLO5tzd3cmXLx+nT5+2dykiIiKSS6mHMptr06YNZ86cYe/evfYuRURERHIp9VBmcyEhIVitVtq1a8eiRYvsXY6IiIjkQgqUOUCpUqU4d+4cV69excFBnc4iIiKSuZQ+coCePXty48YN5s6da+9SREREJBdSD2UOcP36ddzd3alUqRJ79uyxdzkiIiKSy6iHMgdwdXUlMDCQvXv3EhERYe9yREREJJdRoMwhEuakfO+99+xdioiIiOQyuuWdg3h4eODu7s6ZM2fsXYqIiIjkIuqhzEHatWvH2bNntba3iIiIZCr1UOYgoaGh+Pn50bp1a5YuXWrvckRERCSXUKDMYUqXLs3Zs2c1J6WIiIhkGiWOHKZPnz7cuHGD2bNn27sUERERySXUQ5nDREdH4+bmRsWKFbW+t4iIiGQK9VDmMM7OztSuXZv9+/dz6dIle5cjIiIiuYACZQ40fPhwzUkpIiIimUa3vHOofPny4ebmxtmzZ+1dioiIiORw6qHMoZ588knOnTvH9u3b7V2KiIiI5HDqocyhjh8/jo+PD48//jjLly+3dzkiIiKSgylQ5mBlypTh1KlTXLt2TXNSioiISIZRysjBXnnlFaKjo/n666/tXYqIiIjkYOqhzMGio6PJmzcv5cqVY//+/fYuR0RERHIo9VDmYM7OztStW5cDBw4QHh5u73JEREQkh1KgzOFGjBiR6FcRERGR9KZb3rmAp6cnzs7OnD9/3t6liIiISA6kHspcoH379ly4cIFt27bZuxQRERHJgdRDmQucPHmSUqVK8dhjj7Fy5Up7lyMiIiI5jAJlLuHn58fJkye5fv265qQUERGRdKVkkUv07duXmzdv8tVXX9m7FBEREclh1EOZS8TExODq6krZsmU5cOCAvcsRERGRHEQ9lLmEk5MT9evX5+DBgxrtLSIiIulKgTIXGTlyJADDhw+3byEiIiKSo+iWdy5ToEABHB0duXDhgr1LERERkRxCPZS5zNNPP014eDibN2+2dykiIiKSQ6iHMpf5999/KVGiBI8++ii//fabvcsRERGRHECBMheyWq0cO3aMGzduaE5KERERSTOliVyof//+xMTEMHXqVHuXIiIiIjmAeihzoZiYGNzc3PD19eXw4cP2LkdERESyOfVQ5kJOTk40bNiQoKAgzp49a+9yREREJJtToMyl3nvvPUBzUoqIiEja6ZZ3LlawYEEALl68aOdKREREJDtTD2Uu9uyzz3Lp0iU2btxo71JEREQkG1MPZS529uxZihUrRtOmTVmzZo29yxEREZFsSoEylytXrhyhoaFcu3YNJycne5cjIiIi2ZBueedyAwcOJCYmhsmTJ9u7FBEREcmm1EOZy8XFxeHi4kKZMmUICgqydzkiIiKSDamHMpdzcHCgcePGBAcHc/r0aXuXIyIiItmQAqUwZswYAIYOHWrnSkRERCQ70i1vAaBQoULExcVx6dIle5ciIiIi2Yx6KAWAjh07cvnyZdatW2fvUkRERCSbUQ+lAHD+/Hm8vLxo3Lgx69evt3c5IiIiko0oUIpNhQoVCA4O5vr165qTUkRERFJMt7zF5tVXXyU2NpaJEyfauxQRERHJRtRDKTZxcXG4urpSqlQpQkJC7F2OiIiIZBPqoRQbBwcHHnnkEY4cOcLJkyftXY6IiIhkEwqUksjo0aMBGDZsmJ0rERERkexCt7wlicKFCxMTE8Ply5ftXYqIiIhkA+qhlCSef/55IiIi+P333+1dioiIiGQD6qGUJMLDwylcuDANGzbkjz/+sHc5IiIiksUpUEqyKlasSFBQkOakFBERkfvSLW9J1uDBg4mNjeXjjz+2dykiIiKSxamHUpIVFxeHm5sbxYsXJzQ01N7liIiISBamHkpJloODA02bNuXo0aMcP37c3uWIiIhIFqZAKXc1ZswYAIYOHWrnSkRERCQr0y1vuScvLy9u3LhBRESEvUsRERGRLEo9lHJPzz//PFeuXGHlypX2LkVERESyKPVQyj1dunSJQoUKUa9ePTZt2mTvckRERCQLUqCU+6pcuTIHDhzg2rVrODs727scERERyWJ0y1vua/DgwcTFxTFhwgR7lyIiIiJZkHoo5b7i4uLImzcv3t7eHD161N7liIiISBajHkq5LwcHBx599FGOHTvGsWPH7F2OiIiIZDEKlJIiY8eOBeCdd96xcyUiIiKS1eiWt6RYsWLFuHr1KleuXLF3KSIiIpKFqIdSUqxLly5ERkby66+/2rsUERERyULUQykpFhERQYECBahduzZbtmyxdzkiIiKSRShQSqpUrVqVffv2aU5KERERsdEtb0mVN954g7i4OD788EN7lyIiIiJZhHooJVUS5qQsWrQox48ft3c5IiIikgWoh1JSxcHBgZYtW3LixAlCQ0PtXY6IiIhkAQqUkmqak1JERERup1ve8kC8vb2JjIwkMjLS3qWIiIiInamHUh5It27diIqKYtGiRfYuRUREROxMPZTyQCIjI/H09CQwMJC//voroRGCg+HGDXBxAasVPDzsW6iIiIhkOAVKeWDVq1cnZs8edvfti+PKlXDkCNz+n5PFAn5+0Lo1vPIKBATYr1gRERHJMAqU8mBCQwl/7jkKbd+OcXLCEhNz932dnCAmBlq0gGnTwNc38+oUERGRDKdnKCX1pk+HgAAK7doFcO8wCfFhEmDt2vheyunTM7Y+ERERyVQKlJI6Y8dCr15w/fr/B8WUiomJP65Xr/jziIiISI6g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", "text/plain": [ - "{'color': nan, 'size': 2}" + "
" ] }, - "execution_count": 65, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('William Stoner', 'KALAMAZOO ANESTHESIOLOGY PC', {'amount': 10.0, 'year': 2017})\n", + "('KALAMAZOO ANESTHESIOLOGY PC', 'Bob Kushman', {'amount': 1530})\n", + "('Bob Kushman', 'KALAMAZOO ANESTHESIOLOGY PC', {'amount': 530})\n", + "('James Engelson', 'Bob Kushman', {'amount': 90.0, 'year': 2019})\n", + "('Allen Wolf', 'William Stoner', {'amount': 111.5, 'year': 2018})\n", + "('Allen Wolf', 'William Stoner', {'amount': 11100.5, 'year': 2018})\n" + ] } ], "source": [ - "G = nx.Graph()\n", - "G.add_node(0)\n", - "nx.set_node_attributes(G, \"red\", name=\"color\")\n", - "nx.set_node_attributes(G, 2, name=\"size\")\n", - "G.add_node(1)\n", - "nx.set_node_attributes(G, np.nan, name='color')\n", - "G.nodes[0]" + "G = nx.MultiDiGraph()\n", + " \n", + "G.add_node(\"William Stoner\", Age=10, Weight=110)\n", + "G.add_edge(\"William Stoner\",\"KALAMAZOO ANESTHESIOLOGY PC\",amount=10.00, year=2017)\n", + "G.add_node(\"KALAMAZOO ANESTHESIOLOGY PC\", Age=50, Weight=180)\n", + "G.add_edge(\"KALAMAZOO ANESTHESIOLOGY PC\",\"Bob Kushman\",amount=1530)\n", + "G.add_node(\"Bob Kushman\", Age=90, Weight=111)\n", + "G.add_edge(\"Bob Kushman\",\"KALAMAZOO ANESTHESIOLOGY PC\",amount=530)\n", + "G.add_node(\"James Engelson\", Age=40, Weight=10)\n", + "G.add_edge(\"James Engelson\",\"Bob Kushman\",amount=90.00, year=2019,)\n", + "G.add_node(\"Allen Wolf\", Age=30, Weight=1710)\n", + "G.add_edge(\"Allen Wolf\",\"William Stoner\",amount=111.50,year=2018)\n", + "G.add_edge(\"Allen Wolf\",\"William Stoner\",amount=11100.50,year=2018)\n", + "\n", + "\n", + "\n", + "edge_labels = {(u,v):d['amount'] for u,v,d in G.edges(data=True)}\n", + "nx.draw(G, with_labels=True,node_color='red')\n", + "pos = nx.planar_layout(G)\n", + "for edge, label in edge_labels.items():\n", + " nx.draw_networkx_edge_labels(G, pos=pos, edge_labels={edge: label}, label_pos=0.5, verticalalignment='center', horizontalalignment='center')\n", + "plt.show()\n", + "for edge in G.edges(data=True):\n", + " print(edge)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 35, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", - "text/plain": [ - "
" + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hoverinfo": "text", + "hovertext": [ + "Amount: 10.00, Weight: 10.00", + "Amount: 1530.00, Weight: 1530.00", + "Amount: 530.00, Weight: 530.00", + "Amount: 90.00, Weight: 90.00", + "Amount: 111.50, Weight: 111.50" + ], + "line": { + "color": "#888" + }, + "mode": "lines", + "type": "scatter", + "x": [ + 10, + 50, + null, + 50, + 90, + null, + 90, + 50, + null, + 40, + 90, + null, + 30, + 10, + null + ], + "y": [ + 110, + 180, + null, + 180, + 111, + null, + 111, + 180, + null, + 10, + 111, + null, + 1710, + 110, + null + ] + }, + { + "hoverinfo": "text", + "marker": { + "colorscale": [ + [ + 0, + "rgb(255,255,217)" + ], + [ + 0.125, + "rgb(237,248,177)" + ], + [ + 0.25, + "rgb(199,233,180)" + ], + [ + 0.375, + "rgb(127,205,187)" + ], + [ + 0.5, + "rgb(65,182,196)" + ], + [ + 0.625, + "rgb(29,145,192)" + ], + [ + 0.75, + "rgb(34,94,168)" + ], + [ + 0.875, + "rgb(37,52,148)" + ], + [ + 1, + "rgb(8,29,88)" + ] + ], + "showscale": true, + "size": 10 + }, + "mode": "markers", + "text": [ + "William Stoner
Age: 10
Weight: 110", + "KALAMAZOO ANESTHESIOLOGY PC
Age: 50
Weight: 180", + "Bob Kushman
Age: 90
Weight: 111", + "James Engelson
Age: 40
Weight: 10", + "Allen Wolf
Age: 30
Weight: 1710" + ], + "type": "scatter", + "x": [ + 10, + 50, + 90, + 40, + 30 + ], + "y": [ + 110, + 180, + 111, + 10, + 1710 + ] + } + ], + "layout": { + "hovermode": "closest", + "margin": { + "b": 20, + "l": 5, + "r": 5, + "t": 40 + }, + "showlegend": false, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "font": { + "size": 16 + }, + "text": "
Network graph made with Plotly" + }, + "xaxis": { + "showgrid": false, + "showticklabels": false, + "zeroline": false + }, + "yaxis": { + "showgrid": false, + "showticklabels": false, + "zeroline": false + } + } + }, + "text/html": [ + "
" ] }, "metadata": {}, @@ -2288,41 +2729,1184 @@ } ], "source": [ - "G = nx.petersen_graph()\n", - "subax1 = plt.subplot(121)\n", - "nx.draw(G, with_labels=True, font_weight='bold')\n", - "subax2 = plt.subplot(122)\n", - "nx.draw_shell(G, nlist=[range(5, 10), range(5)], with_labels=True, font_weight='light')\n" + "G = nx.MultiDiGraph()\n", + "\n", + "G.add_node(\"William Stoner\", Age=10, Weight=110)\n", + "G.add_node(\"KALAMAZOO ANESTHESIOLOGY PC\", Age=50, Weight=180)\n", + "G.add_node(\"Bob Kushman\", Age=90, Weight=111)\n", + "G.add_node(\"James Engelson\", Age=40, Weight=10)\n", + "G.add_node(\"Allen Wolf\", Age=30, Weight=1710)\n", + "\n", + "G.add_edge(\"William Stoner\", \"KALAMAZOO ANESTHESIOLOGY PC\", weight=10.00, amount=10.00, year=2017)\n", + "G.add_edge(\"KALAMAZOO ANESTHESIOLOGY PC\", \"Bob Kushman\", weight=1530, amount=1530, year=2017)\n", + "G.add_edge(\"Bob Kushman\", \"KALAMAZOO ANESTHESIOLOGY PC\", weight=530, amount=530, year=2017)\n", + "G.add_edge(\"James Engelson\", \"Bob Kushman\", weight=90.00, amount=90.00, year=2017)\n", + "G.add_edge(\"Allen Wolf\", \"William Stoner\", weight=111.50, amount=111.50, year=2017)\n", + "\n", + "# Create Plotly graph\n", + "edge_trace = go.Scatter(x=[], y=[], line=dict(color='#888'), hoverinfo='text', mode='lines')\n", + "hovertext = []\n", + "\n", + "for edge in G.edges(data=True):\n", + " x0, y0 = G.nodes[edge[0]]['Age'], G.nodes[edge[0]]['Weight']\n", + " x1, y1 = G.nodes[edge[1]]['Age'], G.nodes[edge[1]]['Weight']\n", + " edge_trace['x'] += tuple([x0, x1, None])\n", + " edge_trace['y'] += tuple([y0, y1, None])\n", + " hovertext.append(f\"Amount: {edge[2]['amount']:.2f}, Weight: {edge[2]['weight']:.2f}\")\n", + "\n", + "edge_trace['hovertext'] = hovertext\n", + "\n", + "node_trace = go.Scatter(x=[], y=[], text=[], mode='markers', hoverinfo='text', marker=dict(showscale=True, colorscale='YlGnBu', size=10))\n", + "\n", + "for node in G.nodes():\n", + " x, y = G.nodes[node]['Age'], G.nodes[node]['Weight']\n", + " node_trace['x'] += tuple([x])\n", + " node_trace['y'] += tuple([y])\n", + " node_info = node + '
' + 'Age: ' + str(G.nodes[node]['Age']) + '
' + 'Weight: ' + str(G.nodes[node]['Weight'])\n", + " node_trace['text'] += tuple([node_info])\n", + "\n", + "fig = go.Figure(data=[edge_trace, node_trace],\n", + " layout=go.Layout(\n", + " title='
Network graph made with Plotly',\n", + " titlefont=dict(size=16),\n", + " showlegend=False,\n", + " hovermode='closest',\n", + " margin=dict(b=20,l=5,r=5,t=40),\n", + " xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),\n", + " yaxis=dict(showgrid=False, zeroline=False, showticklabels=False)))\n", + "\n", + "fig.show()\n" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 58, "metadata": {}, "outputs": [ { "data": { - "text/plain": [ - "{'REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC': Text(-0.071782758799796, -0.3387166453182715, 'REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC'),\n", - " 'Paa Pac': Text(0.06023249378587841, -0.07946204618171311, 'Paa Pac'),\n", - " 'UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB': Text(-0.12554712442237967, 0.08789304420689323, 'UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALLOT CLUB'),\n", - " 'COMMITTEE TO ELECT DR PATRICIA BERNARD': Text(-0.40486733116122986, -0.04769565353200762, 'COMMITTEE TO ELECT DR PATRICIA BERNARD'),\n", - " 'Pabar Pac (Pa Bar Assn)': Text(-0.6714326170558735, 0.21693950702464565, 'Pabar Pac (Pa Bar Assn)'),\n", - " 'Ugi Utilities Inc/Ugi Energy Services Llc Pac': Text(1.0, -0.38838038123915186, 'Ugi Utilities Inc/Ugi Energy Services Llc Pac'),\n", - " 'Pa Fraternal Order Of Police Pac': Text(0.5897482153166077, -0.2569656851069028, 'Pa Fraternal Order Of Police Pac'),\n", - " 'MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC': Text(-0.27784326029554446, 0.2828712220763738, 'MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC'),\n", - " 'Citizens For Kail': Text(-0.09850761736766293, 0.5235166380701339, 'Citizens For Kail')}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hoverinfo": "text", + "hovertext": [ + "Amount: 5.00", + "Amount: 100.00", + "Amount: 15.00", + "Amount: 151.76", + "Amount: 75.00", + "Amount: 11.12", + "Amount: 1.00", + "Amount: 1.00", + "Amount: 5.88", + "Amount: 250.00", + "Amount: 15.00", + "Amount: 273.00", + "Amount: 25.44", + "Amount: 100.00", + "Amount: 50.00", + "Amount: 400.00", + "Amount: 300.00", + "Amount: 1020.00", + "Amount: 100.00", + "Amount: 100.00", + "Amount: 5.00", + "Amount: 15.00", + "Amount: 100.00", + "Amount: 13.00", + "Amount: 750.00", + "Amount: 15.00", + "Amount: 500.00", + "Amount: 2.50", + "Amount: 1.00", + "Amount: 250.00", + "Amount: 35.00", + "Amount: 40.00", + "Amount: 9.29", + "Amount: 5.00", + "Amount: 19.00", + "Amount: 75.00", + "Amount: 25.15", + "Amount: 15.78", + "Amount: 1.00", + "Amount: 250.00", + "Amount: 1000.00", + "Amount: 2.87", + "Amount: 67.18", + "Amount: 150.00", + "Amount: 29.40", + "Amount: 1.00", + "Amount: 500.00", + "Amount: 60.00", + "Amount: 10.00", + "Amount: 76.32" + ], + "line": { + "color": "#888" + }, + "mode": "lines", + "type": "scatter", + "x": [], + "y": [] + }, + { + "hoverinfo": "text", + "marker": { + "color": [ + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green" + ], + "colorscale": [ + [ + 0, + "rgb(255,255,217)" + ], + [ + 0.125, + "rgb(237,248,177)" + ], + [ + 0.25, + "rgb(199,233,180)" + ], + [ + 0.375, + "rgb(127,205,187)" + ], + [ + 0.5, + "rgb(65,182,196)" + ], + [ + 0.625, + "rgb(29,145,192)" + ], + [ + 0.75, + "rgb(34,94,168)" + ], + [ + 0.875, + "rgb(37,52,148)" + ], + [ + 1, + "rgb(8,29,88)" + ] + ], + "showscale": true, + "size": 10 + }, + "mode": "markers", + "text": [ + "Name: rachel puthuff
donor_id: 639646bf-5176-474c-b800-1afb34c55b53
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: rachel puthuff
recipient_name: reproductive freedom for all
address: 3717 WHITAKER
city: SCHERTZ
classification: neutral
entity_type: Individual
first_name: RACHEL
id: 639646bf-5176-474c-b800-1afb34c55b53
last_name: PUTHUFF
state: TX
zip: 78154-0000
", + "Name: reproductive freedom for all
classification: neutral
", + "Name: james bennett
donor_id: 447b61fb-39cc-41a9-8dfc-2dbb4e2f3774
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: james bennett
recipient_name: reproductive freedom for all
address: 533 W OAK ST
city: MASON
classification: neutral
entity_type: Individual
first_name: JAMES
id: 447b61fb-39cc-41a9-8dfc-2dbb4e2f3774
last_name: BENNETT
state: MI
zip: 48854-0000
", + "Name: sonny mandouh mr.^
donor_id: 34d28c8d-c0fe-463d-9afe-73269a47389b
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: sonny mandouh mr.^
recipient_name: realtors political action committee of michigan
address: 23760 HOLLANDER ST
city: DEARBORN
classification: neutral
entity_type: Individual
first_name: SONNY
id: 34d28c8d-c0fe-463d-9afe-73269a47389b
last_name: MANDOUH MR.^
state: MI
zip: 48128-0000
", + "Name: realtors political action committee of michigan
classification: neutral
", + "Name: charles crider
donor_id: e765ba37-66d2-4b65-9f42-3902dca518b6
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: charles crider
recipient_name: reproductive freedom for all
address: 1403 WEST HIGHLAND BLVD.
city: BATTLE CREEK
classification: neutral
entity_type: Individual
first_name: CHARLES
id: e765ba37-66d2-4b65-9f42-3902dca518b6
last_name: CRIDER
state: MI
zip: 49015-0000
", + "Name: michelle zukowski-serlin
donor_id: 5c0fe744-23e3-4346-b112-0730c6d4b60c
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: michelle zukowski-serlin
recipient_name: reproductive freedom for all
address: 4853 LANDING WAY
city: KALAMAZOO
classification: neutral
company: choices for change counseling
entity_type: Individual
first_name: MICHELLE
id: 5c0fe744-23e3-4346-b112-0730c6d4b60c
last_name: ZUKOWSKI-SERLIN
occupation: business owners and clinical s
state: MI
zip: 49048-6153
", + "Name: diana gibson-lee
donor_id: df25775c-dad2-4f56-8fcd-b31171a7dcb0
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: diana gibson-lee
recipient_name: veronica klinefelt for state senate
address: 7450 W DYER RD
city: TWINING
classification: neutral
entity_type: Individual
first_name: DIANA
id: df25775c-dad2-4f56-8fcd-b31171a7dcb0
last_name: GIBSON-LEE
state: MI
zip: 48766-9773
", + "Name: veronica klinefelt for state senate
classification: neutral
", + "Name: edward kazala
donor_id: 74b522f4-6214-42cd-9d68-7abfe3e18a07
recipient_id: 707305ca-e572-4109-8429-00600edf3fb8
full_name: edward kazala
recipient_name: elect padma kuppa
address: 70 REVERE CT
city: LAFAYETTE
classification: neutral
entity_type: Individual
first_name: EDWARD
id: 74b522f4-6214-42cd-9d68-7abfe3e18a07
last_name: KAZALA
state: CA
zip: 94549-0000
", + "Name: andrea kovalsky
donor_id: 3dc1360d-e9e8-4e55-ac2e-f608f489ab94
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: andrea kovalsky
recipient_name: veronica klinefelt for state senate
address: 497 SAINT MARKS AVE APT 5P
city: BROOKLYN
classification: neutral
entity_type: Individual
first_name: ANDREA
id: 3dc1360d-e9e8-4e55-ac2e-f608f489ab94
last_name: KOVALSKY
state: NY
zip: 11238-5792
", + "Name: colin palmer
donor_id: ad440dcd-79ad-4323-8f19-c7a491f897f7
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: colin palmer
recipient_name: veronica klinefelt for state senate
address: 531 E 20TH ST APT 10D
city: NEW YORK
classification: neutral
company: not employed
entity_type: Individual
first_name: COLIN
id: ad440dcd-79ad-4323-8f19-c7a491f897f7
last_name: PALMER
occupation: not employed
state: NY
zip: 10010-7604
", + "Name: julie svinicki ms.^
donor_id: 4cb88517-6bc4-45a1-ae2f-be0b76688898
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: julie svinicki ms.^
recipient_name: realtors political action committee of michigan
address: 1608 KIRTLAND DRIVE
city: ANN ARBOR
classification: neutral
entity_type: Individual
first_name: JULIE
id: 4cb88517-6bc4-45a1-ae2f-be0b76688898
last_name: SVINICKI MS.^
state: MI
zip: 48103-0000
", + "Name: audrey lance
donor_id: e8ef0925-3f10-4ebf-b025-dea32e506a50
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: audrey lance
recipient_name: reproductive freedom for all
address: 3945 FORBES AVE APT 444
city: PITTSBURGH
classification: neutral
entity_type: Individual
first_name: AUDREY
id: e8ef0925-3f10-4ebf-b025-dea32e506a50
last_name: LANCE
occupation: physician
state: PA
zip: 15213-0000
", + "Name: walker c evans
donor_id: 9853cee2-ff37-41bd-a469-0e338a4fefc9
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: walker c evans
recipient_name: reproductive freedom for all
address: 2810 NORTHVILLE DR NE
city: GRAND RAPIDS
classification: neutral
entity_type: Individual
first_name: WALKER C
id: 9853cee2-ff37-41bd-a469-0e338a4fefc9
last_name: EVANS
state: MI
zip: 49525-0000
", + "Name: lori henderson
donor_id: 3042129c-b91e-4d6a-b723-74cd7ec55e75
recipient_id: 6b51e739-dd22-4556-8555-6e11264ef4ce
full_name: lori henderson
recipient_name: planned parenthood advocates of mi
address: 2401 HARDWOOD AVE
city: ROYAK OAK
classification: neutral
entity_type: Individual
first_name: LORI
id: 3042129c-b91e-4d6a-b723-74cd7ec55e75
last_name: HENDERSON
state: MI
zip: 48067-0000
", + "Name: planned parenthood advocates of mi
classification: neutral
", + "Name: brett lundie
donor_id: 932450e5-f8fc-4cb2-baac-acfad686561f
recipient_id: 2f221dfb-d552-4234-83f8-cd05d10f1266
full_name: brett lundie
recipient_name: citizens to support mi women and children
address: 7779 CIRCLE DR
city: LAINGSBURG
classification: neutral
entity_type: Individual
first_name: BRETT
id: 932450e5-f8fc-4cb2-baac-acfad686561f
last_name: LUNDIE
state: MI
zip: 48848-0000
", + "Name: citizens to support mi women and children
classification: neutral
", + "Name: ian robinson
donor_id: 757923ec-02e3-424e-81b9-4152f6dd165b
recipient_id: 06ebbb03-574c-445b-9416-7d2134a06d1f
full_name: ian robinson
recipient_name: committee to elect james e johnson jr
address: 3435 BRENTWOOD CT
city: ANN ARBOR
classification: neutral
company: university of michigan
entity_type: Individual
first_name: IAN
id: 757923ec-02e3-424e-81b9-4152f6dd165b
last_name: ROBINSON
occupation: faculty
state: MI
zip: 48108-1757
", + "Name: committee to elect james e johnson jr
classification: neutral
", + "Name: kelly bean
donor_id: 8521781f-6ca7-43dc-90a6-c1af13da9e2a
recipient_id: 00a76143-0f24-4683-9963-09f10803e957
full_name: kelly bean
recipient_name: friends of jerry neyer
address: 1405 E BATTLE RD
city: ROSEBUSH
classification: neutral
entity_type: Individual
first_name: KELLY
id: 8521781f-6ca7-43dc-90a6-c1af13da9e2a
last_name: BEAN
state: MI
zip: 48878-9732
", + "Name: friends of jerry neyer
classification: neutral
", + "Name: sandra johnson
donor_id: 49bcd93b-241b-4343-8bbf-bcf70d828c8e
recipient_id: 7ee2db24-b832-4f1b-af2e-e9c8eaf706bd
full_name: sandra johnson
recipient_name: committee to elect charise anderson
address: 424 N 21ST ST 0
city: MONTEBELLO
classification: neutral
entity_type: Individual
first_name: SANDRA
id: 49bcd93b-241b-4343-8bbf-bcf70d828c8e
last_name: JOHNSON
occupation: eligibility worker
state: CA
zip: 90640-0000
", + "Name: committee to elect charise anderson
classification: neutral
", + "Name: christopher mishler
donor_id: 7b8ee884-4471-493d-bf17-386d57bf3f6d
recipient_id: 2f221dfb-d552-4234-83f8-cd05d10f1266
full_name: christopher mishler
recipient_name: citizens to support mi women and children
address: 3690 VORHIES ROAD
city: ANN ARBOR
classification: neutral
entity_type: Individual
first_name: CHRISTOPHER
id: 7b8ee884-4471-493d-bf17-386d57bf3f6d
last_name: MISHLER
state: MI
zip: 48105-0000
", + "Name: stacy leroy daniels
donor_id: 5a40e7db-bb2a-47f4-ac92-5584988c8a5e
recipient_id: 7f272fe4-d592-453c-9ca1-315ea3fdcff1
full_name: stacy leroy daniels
recipient_name: bill g schuette for state representative
address: 3901 ORCHARD DRIVE
city: MIDLAND
classification: neutral
entity_type: Individual
first_name: STACY LEROY
id: 5a40e7db-bb2a-47f4-ac92-5584988c8a5e
last_name: DANIELS
state: MI
zip: 48640-0000
", + "Name: bill g schuette for state representative
classification: neutral
", + "Name: suzanne r weinheimer
donor_id: 029a23eb-d90f-405b-995c-c8dc266e255f
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: suzanne r weinheimer
recipient_name: reproductive freedom for all
address: 11045 8TH AVENUE NE APT 826
city: SEATTLE
classification: neutral
entity_type: Individual
first_name: SUZANNE R
id: 029a23eb-d90f-405b-995c-c8dc266e255f
last_name: WEINHEIMER
state: WA
zip: 98125-0000
", + "Name: dustin shaeffer mr.^
donor_id: fc041110-7c11-47af-b1bf-5daca974e4ee
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: dustin shaeffer mr.^
recipient_name: realtors political action committee of michigan
address: 60451 MOJAVE LANE
city: WASHINGTON
classification: neutral
entity_type: Individual
first_name: DUSTIN
id: fc041110-7c11-47af-b1bf-5daca974e4ee
last_name: SHAEFFER MR.^
state: MI
zip: 48094-0000
", + "Name: debra byl
donor_id: b8e9c951-5c8c-42d3-91e1-d6457b28f2ae
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: debra byl
recipient_name: reproductive freedom for all
address: 987 BRADFORD GREENS
city: GRAND RAPIDS
classification: neutral
entity_type: Individual
first_name: DEBRA
id: b8e9c951-5c8c-42d3-91e1-d6457b28f2ae
last_name: BYL
state: MI
zip: 49525-0000
", + "Name: pamela wimp
donor_id: 88ccb4d4-c756-4039-bac2-77a610d69bb0
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: pamela wimp
recipient_name: reproductive freedom for all
address: 8030 MERCER CT NE
city: LACEY
classification: neutral
entity_type: Individual
first_name: PAMELA
id: 88ccb4d4-c756-4039-bac2-77a610d69bb0
last_name: WIMP
state: WA
zip: 98516-6336
", + "Name: lori wortz
donor_id: 821a27dc-aa00-436e-80e2-655ce26bc830
recipient_id: 7f272fe4-d592-453c-9ca1-315ea3fdcff1
full_name: lori wortz
recipient_name: bill g schuette for state representative
address: 4144 MERIDIAN RD
city: OKEMOS
classification: neutral
company: braenaru consulting
entity_type: Individual
first_name: LORI
id: 821a27dc-aa00-436e-80e2-655ce26bc830
last_name: WORTZ
occupation: consultant
state: MI
zip: 48864-0000
", + "Name: janet reid
donor_id: 25f2cb86-6d01-4fc2-9aaf-d276ce634a47
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: janet reid
recipient_name: reproductive freedom for all
address: 2378 EATON GATE RD
city: LAKE ORION
classification: neutral
entity_type: Individual
first_name: JANET
id: 25f2cb86-6d01-4fc2-9aaf-d276ce634a47
last_name: REID
state: MI
zip: 48360-1869
", + "Name: gary henderson
donor_id: 05a6c5c3-4a3f-41e0-a9d5-e54f33703d2d
recipient_id: 7f272fe4-d592-453c-9ca1-315ea3fdcff1
full_name: gary henderson
recipient_name: bill g schuette for state representative
address: 1601 KINGSWOOD DRIVE
city: LANSING
classification: neutral
company: aircraft precision prod. inc.
entity_type: Individual
first_name: GARY
id: 05a6c5c3-4a3f-41e0-a9d5-e54f33703d2d
last_name: HENDERSON
occupation: sales purchasing manager
state: MI
zip: 48912-0000
", + "Name: claudette levesque
donor_id: 26d5e377-57c4-4f33-95ce-4209bff4242b
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: claudette levesque
recipient_name: reproductive freedom for all
address: 41 CATERPILLAR HILL RD
city: SARGENTVILLE
classification: neutral
entity_type: Individual
first_name: CLAUDETTE
id: 26d5e377-57c4-4f33-95ce-4209bff4242b
last_name: LEVESQUE
state: ME
zip: 04673-2464
", + "Name: graham chapman
donor_id: 8045638c-db65-4a13-9016-05e73766b5b1
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: graham chapman
recipient_name: reproductive freedom for all
address: 1914 CLINTON ST
city: LOS ANGELES
classification: neutral
entity_type: Individual
first_name: GRAHAM
id: 8045638c-db65-4a13-9016-05e73766b5b1
last_name: CHAPMAN
state: CA
zip: 90026-4137
", + "Name: john olson
donor_id: 1ff268c7-fbff-4f94-8810-48f31bb53681
recipient_id: 00a76143-0f24-4683-9963-09f10803e957
full_name: john olson
recipient_name: friends of jerry neyer
address: 6025 VERDE TRL S APT K217
city: BOCA RATON
classification: neutral
entity_type: Individual
first_name: JOHN
id: 1ff268c7-fbff-4f94-8810-48f31bb53681
last_name: OLSON
state: FL
zip: 33433-4442
", + "Name: christina ridalls ms.^
donor_id: 9bea8116-83a3-486a-a457-50c0f80af060
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: christina ridalls ms.^
recipient_name: realtors political action committee of michigan
address: 3083 BEATTIE RD
city: HOWELL
classification: neutral
entity_type: Individual
first_name: CHRISTINA
id: 9bea8116-83a3-486a-a457-50c0f80af060
last_name: RIDALLS MS.^
state: MI
zip: 48843-0000
", + "Name: dylynn mclean
donor_id: a1943974-4abe-4093-be0b-edcc56a97ffe
recipient_id: bbe89315-1939-46e3-a5c0-2d6e5b28bc95
full_name: dylynn mclean
recipient_name: 1st congressional dist rep comm
address: 1531 W 20 MILE RD
city: SAULT STE MARIE
classification: neutral
entity_type: Individual
first_name: DYLYNN
id: a1943974-4abe-4093-be0b-edcc56a97ffe
last_name: MCLEAN
state: MI
zip: 49783-0000
", + "Name: 1st congressional dist rep comm
classification: neutral
", + "Name: andrew morris
donor_id: 767c512a-9c5a-4230-90ab-3fd40d731f60
recipient_id: 707305ca-e572-4109-8429-00600edf3fb8
full_name: andrew morris
recipient_name: elect padma kuppa
address: 1118 MORNINGSIDE AVE
city: SCHENECTADY
classification: neutral
entity_type: Individual
first_name: ANDREW
id: 767c512a-9c5a-4230-90ab-3fd40d731f60
last_name: MORRIS
state: NY
zip: 12309-5630
", + "Name: elect padma kuppa
classification: neutral
", + "Name: martha scoppa
donor_id: 78fcc760-825f-404a-b058-a88a99992d98
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: martha scoppa
recipient_name: reproductive freedom for all
address: 32 COLD SPRING RD
city: LIBERTY
classification: neutral
entity_type: Individual
first_name: MARTHA
id: 78fcc760-825f-404a-b058-a88a99992d98
last_name: SCOPPA
state: NY
zip: 12754-0000
", + "Name: carol woodard
donor_id: d4ba0589-99d6-4455-a978-315395322208
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: carol woodard
recipient_name: reproductive freedom for all
address: 5143 SPRING MEADOWS
city: TROY
classification: neutral
entity_type: Individual
first_name: CAROL
id: d4ba0589-99d6-4455-a978-315395322208
last_name: WOODARD
state: MI
zip: 48098-0000
", + "Name: rochelle albright
donor_id: 87b3feed-01a5-4cc8-82cd-cf9c78977534
recipient_id: e3294ecb-f6df-48a0-b3b4-7048a9c650a7
full_name: rochelle albright
recipient_name: michael detmer for state senate
address: 1840 GRAY RD
city: HOWELL
classification: neutral
entity_type: Individual
first_name: ROCHELLE
id: 87b3feed-01a5-4cc8-82cd-cf9c78977534
last_name: ALBRIGHT
state: MI
zip: 48843-0000
", + "Name: michael detmer for state senate
classification: neutral
", + "Name: richard mayfield
donor_id: 80ec6920-a933-4c3e-9487-74cbfe6716f7
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: richard mayfield
recipient_name: veronica klinefelt for state senate
address: 3221 GRISCHY LN
city: CINCINNATI
classification: neutral
entity_type: Individual
first_name: RICHARD
id: 80ec6920-a933-4c3e-9487-74cbfe6716f7
last_name: MAYFIELD
state: OH
zip: 45208-3109
", + "Name: charles risch
donor_id: 6b4b51e8-f105-4cc1-96f7-cec2d931e58f
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: charles risch
recipient_name: reproductive freedom for all
address: 300 S WACKER DR
city: CHICAGO
classification: neutral
entity_type: Individual
first_name: CHARLES
id: 6b4b51e8-f105-4cc1-96f7-cec2d931e58f
last_name: RISCH
state: IL
zip: 60606-6680
", + "Name: barbara miller
donor_id: 47043446-3b77-4a34-9d0d-a21786400d9b
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: barbara miller
recipient_name: veronica klinefelt for state senate
address: 820 W END AVE APT 6A
city: NEW YORK
classification: neutral
entity_type: Individual
first_name: BARBARA
id: 47043446-3b77-4a34-9d0d-a21786400d9b
last_name: MILLER
state: NY
zip: 10025-5330
", + "Name: kevin korpi
donor_id: 10f51417-a0e9-4a2c-8bdb-e5d045fcab08
recipient_id: 5f7c53e3-d1be-47a9-acc4-70828a8c7a69
full_name: kevin korpi
recipient_name: committee to elect ed mcbroom
address: 220 MAC AVE APT 418
city: EAST LANSING
classification: neutral
company: acuitas
entity_type: Individual
first_name: KEVIN
id: 10f51417-a0e9-4a2c-8bdb-e5d045fcab08
last_name: KORPI
occupation: lobbyist
state: MI
zip: 48823-0000
", + "Name: committee to elect ed mcbroom
classification: neutral
", + "Name: wayne miller
donor_id: 14208b99-1ecb-4b33-becf-c30882e9b302
recipient_id: f88fdd05-e3e4-4d51-8511-1ffd35965c8e
full_name: wayne miller
recipient_name: committee to elect jack richert
address: 27301 SCENIC HWY
city: FRANKLIN
classification: neutral
company: miller & tischler pc
entity_type: Individual
first_name: WAYNE
id: 14208b99-1ecb-4b33-becf-c30882e9b302
last_name: MILLER
occupation: attorney
state: MI
zip: 48025-0000
", + "Name: committee to elect jack richert
classification: neutral
", + "Name: mary soens
donor_id: 664b4540-8b50-44d3-8570-cb797a4859fe
recipient_id: 707305ca-e572-4109-8429-00600edf3fb8
full_name: mary soens
recipient_name: elect padma kuppa
address: 55 N HANCOCK ST
city: LEXINGTON
classification: neutral
entity_type: Individual
first_name: MARY
id: 664b4540-8b50-44d3-8570-cb797a4859fe
last_name: SOENS
state: MA
zip: 02420-0000
", + "Name: rebecca baskin
donor_id: 9eb92629-9f8e-4bb5-8dc3-373b56a7db3a
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: rebecca baskin
recipient_name: reproductive freedom for all
address: 680 BERKSHIRE DR
city: SALINE
classification: neutral
entity_type: Individual
first_name: REBECCA
id: 9eb92629-9f8e-4bb5-8dc3-373b56a7db3a
last_name: BASKIN
state: MI
zip: 48176-1087
", + "Name: edward kaminski
donor_id: 5b4130f6-d8dd-4739-aa68-2fe81dd4532b
recipient_id: 76a600c1-7ead-437a-85ad-0cca7573393b
full_name: edward kaminski
recipient_name: friends of brian hosticka
address: 8765 LEHMAN RD
city: MONTAGUE
classification: neutral
entity_type: Individual
first_name: EDWARD
id: 5b4130f6-d8dd-4739-aa68-2fe81dd4532b
last_name: KAMINSKI
state: MI
zip: 49437-9326
", + "Name: friends of brian hosticka
classification: neutral
", + "Name: robert brown
donor_id: 766a34f7-1c8b-4635-a69c-0bff1bf155be
recipient_id: 2e8c9124-2258-45e3-a198-e8c1798c49f2
full_name: robert brown
recipient_name: monroe plumbers and pipe fitters local 671 pac fund
address: 1207 SANDHURST DR
city: TALLAHASSEE
classification: neutral
entity_type: Individual
first_name: ROBERT
id: 766a34f7-1c8b-4635-a69c-0bff1bf155be
last_name: BROWN
state: FL
zip: 32312-2527
", + "Name: monroe plumbers and pipe fitters local 671 pac fund
classification: neutral
", + "Name: sandra braddock
donor_id: e42e7230-02f0-4b28-ba39-7b68e796d510
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: sandra braddock
recipient_name: reproductive freedom for all
address: 20087 EDGEWATER DRIVE
city: CANYON COUNTRY
classification: neutral
entity_type: Individual
first_name: SANDRA
id: e42e7230-02f0-4b28-ba39-7b68e796d510
last_name: BRADDOCK
state: CA
zip: 91351-0000
", + "Name: dana fortier
donor_id: 74b93106-3c9f-4f36-b52e-36143e97e7ce
recipient_id: 159692de-135a-45bd-8889-1ab1882ed54c
full_name: dana fortier
recipient_name: committee to elect vicki barnett to state senate
address: 23861 W LEBOST
city: NOVI
classification: neutral
entity_type: Individual
first_name: DANA
id: 74b93106-3c9f-4f36-b52e-36143e97e7ce
last_name: FORTIER
state: MI
zip: 48375-0000
", + "Name: committee to elect vicki barnett to state senate
classification: neutral
", + "Name: rachel geiersbach
donor_id: 40d2d39f-f21b-4130-8d7b-47ca810c9aa9
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: rachel geiersbach
recipient_name: reproductive freedom for all
address: 3412 OLD KAWKAWLIN RD
city: BAY CITY
classification: neutral
entity_type: Individual
first_name: RACHEL
id: 40d2d39f-f21b-4130-8d7b-47ca810c9aa9
last_name: GEIERSBACH
state: MI
zip: 48706-0000
", + "Name: matthew burgess
donor_id: de98dec5-b8d3-4701-a9dd-a254aca2c4cf
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: matthew burgess
recipient_name: reproductive freedom for all
address: 8823 SPECTRUM CENTER BLVD 2313
city: SAN DIEGO
classification: neutral
entity_type: Individual
first_name: MATTHEW
id: de98dec5-b8d3-4701-a9dd-a254aca2c4cf
last_name: BURGESS
state: CA
zip: 92123-0000
", + "Name: teresa robertson
donor_id: dcf2b3a5-ddf4-4027-8a75-4477893854ff
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: teresa robertson
recipient_name: reproductive freedom for all
address: 7101 RIVER GLEN DR SE
city: CALEDONIA
classification: neutral
entity_type: Individual
first_name: TERESA
id: dcf2b3a5-ddf4-4027-8a75-4477893854ff
last_name: ROBERTSON
state: MI
zip: 49316-8136
" + ], + "type": "scatter", + "x": [], + "y": [] + } + ], + "layout": { + "hovermode": "closest", + "margin": { + "b": 20, + "l": 5, + "r": 5, + "t": 40 + }, + "showlegend": true, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "font": { + "size": 16 + }, + "text": "Network Graph Indicating Campaign Contributions from 2018-2022" + }, + "xaxis": { + "showgrid": true, + "showticklabels": false, + "zeroline": true + }, + "yaxis": { + "showgrid": true, + "showticklabels": false, + "zeroline": true + } + } + }, + "text/html": [ + "
" ] }, "metadata": {}, @@ -2330,65 +3914,7506 @@ } ], "source": [ - "G = nx.from_pandas_edgelist(sample_df,source='name',target='donations_to',edge_attr=['donations','received'])\n", - "G.nodes()\n", - "pos=nx.spring_layout(G)\n", - "weights = list(nx.get_edge_attributes(G,'donations').values())\n", - "weights = [i/5000 for i in weights]\n", - "node_color = [G.degree(v) for v in G] \n", - "#node_size = [0.0005 * nx.get_node_attributes(G, 'donations')[v] for v in G] \n", - "nx.draw_networkx_nodes(G, pos, node_color=node_color)#, node_size=node_size) \n", - "nx.draw_networkx_edges(G, pos, width=weights)\n", - "nx.draw_networkx_labels(G, pos)" + "def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph:\n", + " G = nx.MultiDiGraph()\n", + " \n", + " # Define columns for edge attributes\n", + " edge_columns = ['amount', 'donor_office', 'office_sought', 'party', 'purpose', 'transaction_id', 'transaction_type', 'year']\n", + " # Define columns for node attributes\n", + " node_columns = ['donor_id', 'recipient_id', 'full_name', 'recipient_name', 'address', 'city', 'classification', 'company', 'donor_type', 'entity_type', 'first_name', 'id', 'last_name', 'occupation', 'recipient_type', 'state', 'zip']\n", + " \n", + " for _, row in df.iterrows(): \n", + " # Add nodes\n", + " G.add_node(row['full_name'], **row[node_columns].dropna().to_dict())\n", + " G.add_node(row['recipient_name'], classification='neutral') # Adding recipient nodes with default classification\n", + "\n", + " # Add edges\n", + " edge_attributes = row[edge_columns].dropna().to_dict()\n", + " G.add_edge(row['full_name'], row['recipient_name'], **edge_attributes)\n", + " \n", + " return G\n", + "\n", + "def plot_network_graph(G: nx.MultiDiGraph):\n", + " edge_trace = go.Scatter(x=[], y=[], line=dict(color='#888'), hoverinfo='text', mode='lines')\n", + " hovertext = []\n", + "\n", + " for edge in G.edges(data=True):\n", + " source = edge[0]\n", + " target = edge[1]\n", + " hovertext.append(f\"Amount: {edge[2]['amount']:.2f}\")\n", + "\n", + " edge_trace['hovertext'] = hovertext\n", + "\n", + " node_trace = go.Scatter(x=[], y=[], text=[], mode='markers', hoverinfo='text', marker=dict(showscale=True, colorscale='YlGnBu', size=10))\n", + " node_trace['marker']['color'] = []\n", + "\n", + " for node in G.nodes():\n", + " node_info = f\"Name: {node}
\"\n", + " for key, value in G.nodes[node].items():\n", + " node_info += f\"{key}: {value}
\"\n", + " node_trace['text'] += tuple([node_info])\n", + " # Get the classification value for the node\n", + " classification = G.nodes[node].get('classification', 'neutral')\n", + " # Assign a color based on the classification value\n", + " if classification == 'c':\n", + " color = 'blue'\n", + " elif classification == 'f':\n", + " color = 'red'\n", + " else:\n", + " color = 'green' # Default color for unknown classification\n", + " node_trace['marker']['color'] += tuple([color])\n", + "\n", + " # Define layout settings\n", + " layout = go.Layout(\n", + " title='Network Graph Indicating Campaign Contributions from 2018-2022',\n", + " titlefont=dict(size=16),\n", + " showlegend=True,\n", + " hovermode='closest',\n", + " margin=dict(b=20, l=5, r=5, t=40),\n", + " xaxis=dict(showgrid=True, zeroline=True, showticklabels=False),\n", + " yaxis=dict(showgrid=True, zeroline=True, showticklabels=False)\n", + " )\n", + "\n", + " fig = go.Figure(data=[edge_trace, node_trace], layout=layout)\n", + "\n", + " # Log information about the figure\n", + "\n", + " fig.show()\n", + "\n", + "sample = grouped_sample.sample(50)\n", + "plot_network_graph(create_network_nodes(sample))\n" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 39, "metadata": {}, "outputs": [ { "data": { - "text/plain": [ - "{}" + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hoverinfo": "none", + "line": { + "color": "#888", + "width": 0.5 + }, + "mode": "lines", + "type": "scatter", + "x": [ + 0.4182243125490408, + 0.3740122792611037, + null, + 0.4182243125490408, + 0.37848025459696877, + null, + 0.4182243125490408, + 0.3821391536049519, + null, + 0.4182243125490408, + 0.31305791514229697, + null, + 0.4182243125490408, + 0.3246624829381992, + null, + 0.4182243125490408, + 0.33203393677870674, + null, + 0.4182243125490408, + 0.4404718698088387, + null, + 0.4182243125490408, + 0.3393815448042514, + null, + 0.4182243125490408, + 0.32444561774289593, + null, + 0.4182243125490408, + 0.33721825060791266, + null, + 0.4182243125490408, + 0.5201251204037126, + null, + 0.12286879065958844, + 0.23992481624351925, + null, + 0.12286879065958844, + 0.09276814106220677, + null, + 0.12286879065958844, + 0.07426685281627932, + null, + 0.12286879065958844, + 0.09471702229050472, + null, + 0.12286879065958844, + 0.06879886671193436, + null, + 0.12286879065958844, + 0.1823584228427031, + null, + 0.12286879065958844, + 0.19852054651169693, + null, + 0.12286879065958844, + 0.13747604708068628, + null, + 0.12286879065958844, + 0.22007362873840486, + null, + 0.12286879065958844, + 0.13940667248499528, + null, + 0.12286879065958844, + 0.0201693226965588, + null, + 0.12286879065958844, + 0.16862303760247477, + null, + 0.12286879065958844, + 0.12355952994556385, + null, + 0.12286879065958844, + 0.04781523934390508, + null, + 0.6730431696885844, + 0.6013564651959642, + null, + 0.6730431696885844, + 0.662108954544855, + null, + 0.6730431696885844, + 0.7007214129943925, + null, + 0.6730431696885844, + 0.7188906153197968, + null, + 0.6730431696885844, + 0.7255980413609877, + null, + 0.6730431696885844, + 0.6802728591951641, + null, + 0.6730431696885844, + 0.7518492361353024, + null, + 0.38165116541180344, + 0.32578353530864457, + null, + 0.38165116541180344, + 0.413948124857326, + null, + 0.38165116541180344, + 0.44119458804978295, + null, + 0.38165116541180344, + 0.3328704753356456, + null, + 0.38165116541180344, + 0.3499260998923053, + null, + 0.38165116541180344, + 0.37301066653863624, + null, + 0.38165116541180344, + 0.4277213938753692, + null, + 0.38165116541180344, + 0.3247821296168134, + null, + 0.38165116541180344, + 0.3187675293980876, + null, + 0.38165116541180344, + 0.34114125407236195, + null, + 0.6084965344664286, + 0.5531504465254558, + null, + 0.6084965344664286, + 0.587704695878027, + null, + 0.6084965344664286, + 0.5593951498649633, + null, + 0.6084965344664286, + 0.5845953849421676, + null, + 0.6084965344664286, + 0.6058132814274794, + null, + 0.6084965344664286, + 0.6322124026692795, + null, + 0.6084965344664286, + 0.5201251204037126, + null, + 0.18155558675901884, + 0.2742000416622462, + null, + 0.18155558675901884, + 0.15570283642495664, + null, + 0.18155558675901884, + 0.19921682827804632, + null, + 0.18155558675901884, + 0.2955343345493908, + null, + 0.18155558675901884, + 0.298647499376007, + null, + 0.18155558675901884, + 0.0914406510425998, + null, + 0.18155558675901884, + 0.0875467755337247, + null, + 0.18155558675901884, + 0.08997327822205015, + null, + 0.18155558675901884, + 0.25656414507004344, + null, + 0.18155558675901884, + 0.20133087739958255, + null, + 0.7722862313192606, + 0.7408684543182315, + null, + 0.7722862313192606, + 0.8385234321105272, + null, + 0.7722862313192606, + 0.7333209824474588, + null, + 0.5368181409256901, + 0.595945044435614, + null, + 0.5368181409256901, + 0.6327007577432437, + null, + 0.5368181409256901, + 0.526779936668903, + null, + 0.5368181409256901, + 0.5433115547736789, + null, + 0.5368181409256901, + 0.5274116361492907, + null, + 0.5368181409256901, + 0.555788147264811, + null, + 0.5368181409256901, + 0.5805679633404117, + null, + 0.5368181409256901, + 0.5989925957177575, + null, + 0.5368181409256901, + 0.48218022499136737, + null, + 0.5368181409256901, + 0.6058132814274794, + null, + 0.5368181409256901, + 0.47443124751760235, + null, + 0.5368181409256901, + 0.5291812256005789, + null, + 0.5368181409256901, + 0.5621062195646831, + null, + 0.5368181409256901, + 0.5465171974419871, + null, + 0.8304626469521129, + 0.8266354543284289, + null, + 0.8304626469521129, + 0.7247552078664479, + null, + 0.8304626469521129, + 0.7827775151390383, + null, + 0.8304626469521129, + 0.9082570345357789, + null, + 0.8304626469521129, + 0.916634041055854, + null, + 0.8304626469521129, + 0.8613129225222332, + null, + 0.8304626469521129, + 0.7703024251104211, + null, + 0.8304626469521129, + 0.9005048863870916, + null, + 0.8304626469521129, + 0.9240127894624793, + null, + 0.7924139234898422, + 0.800297854626628, + null, + 0.7924139234898422, + 0.7364515013041172, + null, + 0.7924139234898422, + 0.8589937476561325, + null, + 0.7924139234898422, + 0.8247840830312709, + null, + 0.7924139234898422, + 0.7948577020793985, + null, + 0.7924139234898422, + 0.7059759544943667, + null, + 0.7924139234898422, + 0.8846357375826375, + null, + 0.7924139234898422, + 0.8323549266756429, + null, + 0.8266354543284289, + 0.7247552078664479, + null, + 0.8266354543284289, + 0.7827775151390383, + null, + 0.8266354543284289, + 0.9082570345357789, + null, + 0.8266354543284289, + 0.7042334738295596, + null, + 0.8266354543284289, + 0.8613129225222332, + null, + 0.8266354543284289, + 0.7703024251104211, + null, + 0.8266354543284289, + 0.9240127894624793, + null, + 0.8266354543284289, + 0.8680862155815134, + null, + 0.4023039585223629, + 0.4611021425875542, + null, + 0.4023039585223629, + 0.44175944307536974, + null, + 0.4023039585223629, + 0.3318561006769827, + null, + 0.4023039585223629, + 0.4349682989231034, + null, + 0.4023039585223629, + 0.29978148854693865, + null, + 0.4023039585223629, + 0.4442228752887084, + null, + 0.5084198498293618, + 0.5436816885151938, + null, + 0.5084198498293618, + 0.5229468203255856, + null, + 0.5084198498293618, + 0.4611021425875542, + null, + 0.5084198498293618, + 0.44175944307536974, + null, + 0.5084198498293618, + 0.6234379896430121, + null, + 0.5084198498293618, + 0.4442228752887084, + null, + 0.23992481624351925, + 0.27440213390552737, + null, + 0.23992481624351925, + 0.2728250610713022, + null, + 0.23992481624351925, + 0.1823584228427031, + null, + 0.23992481624351925, + 0.19852054651169693, + null, + 0.23992481624351925, + 0.22007362873840486, + null, + 0.23992481624351925, + 0.13940667248499528, + null, + 0.23992481624351925, + 0.16862303760247477, + null, + 0.23992481624351925, + 0.12355952994556385, + null, + 0.2742000416622462, + 0.15570283642495664, + null, + 0.2742000416622462, + 0.32578353530864457, + null, + 0.2742000416622462, + 0.3740122792611037, + null, + 0.2742000416622462, + 0.2955343345493908, + null, + 0.2742000416622462, + 0.31305791514229697, + null, + 0.2742000416622462, + 0.298647499376007, + null, + 0.2742000416622462, + 0.3328704753356456, + null, + 0.2742000416622462, + 0.3499260998923053, + null, + 0.2742000416622462, + 0.3181124346701171, + null, + 0.2742000416622462, + 0.3247821296168134, + null, + 0.2742000416622462, + 0.25656414507004344, + null, + 0.2742000416622462, + 0.3187675293980876, + null, + 0.2742000416622462, + 0.20133087739958255, + null, + 0.2742000416622462, + 0.34114125407236195, + null, + 0.15570283642495664, + 0.07513674080757637, + null, + 0.15570283642495664, + 0.05512117222879742, + null, + 0.15570283642495664, + 0.05194805532761382, + null, + 0.15570283642495664, + 0.06202421257916635, + null, + 0.15570283642495664, + 0.09053866681881584, + null, + 0.15570283642495664, + 0.1573630170264504, + null, + 0.15570283642495664, + 0.0852382135963593, + null, + 0.15570283642495664, + 0.0875467755337247, + null, + 0.15570283642495664, + 0.08997327822205015, + null, + 0.15570283642495664, + 0.20133087739958255, + null, + 0.15570283642495664, + 0.038579501382332126, + null, + 0.07513674080757637, + 0.1130639188502468, + null, + 0.07513674080757637, + 0.05512117222879742, + null, + 0.07513674080757637, + 0.07163295816605642, + null, + 0.07513674080757637, + 0.06202421257916635, + null, + 0.07513674080757637, + 0.09053866681881584, + null, + 0.07513674080757637, + 0.1573630170264504, + null, + 0.07513674080757637, + 0.0023771443647881974, + null, + 0.07513674080757637, + 0.0852382135963593, + null, + 0.07513674080757637, + 0.17086936775877049, + null, + 0.07513674080757637, + 0.0875467755337247, + null, + 0.07513674080757637, + 0.08997327822205015, + null, + 0.07513674080757637, + 0.020212382594376965, + null, + 0.07513674080757637, + 0.0897773631019545, + null, + 0.07513674080757637, + 0.038579501382332126, + null, + 0.7247552078664479, + 0.6327007577432437, + null, + 0.7247552078664479, + 0.662108954544855, + null, + 0.7247552078664479, + 0.7827775151390383, + null, + 0.7247552078664479, + 0.7007214129943925, + null, + 0.7247552078664479, + 0.7188906153197968, + null, + 0.7247552078664479, + 0.7042334738295596, + null, + 0.7247552078664479, + 0.7255980413609877, + null, + 0.7247552078664479, + 0.7703024251104211, + null, + 0.2586357176925591, + 0.3019474379086241, + null, + 0.2586357176925591, + 0.2121217358781844, + null, + 0.595945044435614, + 0.6327007577432437, + null, + 0.595945044435614, + 0.526779936668903, + null, + 0.595945044435614, + 0.662108954544855, + null, + 0.595945044435614, + 0.5433115547736789, + null, + 0.595945044435614, + 0.5274116361492907, + null, + 0.595945044435614, + 0.7042334738295596, + null, + 0.595945044435614, + 0.555788147264811, + null, + 0.595945044435614, + 0.5805679633404117, + null, + 0.595945044435614, + 0.5989925957177575, + null, + 0.595945044435614, + 0.6058132814274794, + null, + 0.595945044435614, + 0.5291812256005789, + null, + 0.595945044435614, + 0.5621062195646831, + null, + 0.9428542201780316, + 0.8511753697833563, + null, + 0.9428542201780316, + 0.89080246263295, + null, + 0.9428542201780316, + 0.9521646983336837, + null, + 0.9428542201780316, + 0.9663892923019699, + null, + 0.9428542201780316, + 0.9425745666137786, + null, + 0.9428542201780316, + 0.9851894520572745, + null, + 0.9428542201780316, + 0.9573079778783831, + null, + 0.9428542201780316, + 0.9473667691929577, + null, + 0.9428542201780316, + 0.838803404513024, + null, + 0.03304679952258993, + 0.05596958524873419, + null, + 0.03304679952258993, + 0.014269300880037306, + null, + 0.6013564651959642, + 0.662108954544855, + null, + 0.6013564651959642, + 0.7007214129943925, + null, + 0.6013564651959642, + 0.7188906153197968, + null, + 0.6013564651959642, + 0.555788147264811, + null, + 0.6013564651959642, + 0.5293212253918783, + null, + 0.6013564651959642, + 0.5291812256005789, + null, + 0.6013564651959642, + 0.5191285820034173, + null, + 0.6013564651959642, + 0.5465171974419871, + null, + 0.1130639188502468, + 0.07163295816605642, + null, + 0.1130639188502468, + 0.09053866681881584, + null, + 0.1130639188502468, + 0.1573630170264504, + null, + 0.1130639188502468, + 0.13747604708068628, + null, + 0.1130639188502468, + 0.2275256207367028, + null, + 0.1130639188502468, + 0.18507593174525072, + null, + 0.1130639188502468, + 0.17086936775877049, + null, + 0.1130639188502468, + 0.0897773631019545, + null, + 0.5531504465254558, + 0.47055154706870017, + null, + 0.5531504465254558, + 0.5274116361492907, + null, + 0.5531504465254558, + 0.587704695878027, + null, + 0.5531504465254558, + 0.5989925957177575, + null, + 0.5531504465254558, + 0.5845953849421676, + null, + 0.5531504465254558, + 0.6058132814274794, + null, + 0.5531504465254558, + 0.4564806171162211, + null, + 0.5531504465254558, + 0.5201251204037126, + null, + 0.1635981270944994, + 0.19921682827804632, + null, + 0.1635981270944994, + 0.10310287300704979, + null, + 0.1635981270944994, + 0.05973078995013337, + null, + 0.1635981270944994, + 0.0914406510425998, + null, + 0.1635981270944994, + 0.14711158829428328, + null, + 0.1635981270944994, + 0.21535391032155426, + null, + 0.05512117222879742, + 0.07163295816605642, + null, + 0.05512117222879742, + 0.05194805532761382, + null, + 0.05512117222879742, + 0.06202421257916635, + null, + 0.05512117222879742, + 0.09053866681881584, + null, + 0.05512117222879742, + 0.0023771443647881974, + null, + 0.05512117222879742, + 0.0852382135963593, + null, + 0.05512117222879742, + 0.0875467755337247, + null, + 0.05512117222879742, + 0.08997327822205015, + null, + 0.05512117222879742, + 0.020212382594376965, + null, + 0.05512117222879742, + 0.02312833765025224, + null, + 0.05512117222879742, + 0.04237200971819888, + null, + 0.05512117222879742, + 0.038579501382332126, + null, + 0.05512117222879742, + 0.01777064460825195, + null, + 0.32578353530864457, + 0.413948124857326, + null, + 0.32578353530864457, + 0.3328704753356456, + null, + 0.32578353530864457, + 0.3499260998923053, + null, + 0.32578353530864457, + 0.37301066653863624, + null, + 0.32578353530864457, + 0.2619562675328274, + null, + 0.32578353530864457, + 0.4277213938753692, + null, + 0.32578353530864457, + 0.3247821296168134, + null, + 0.32578353530864457, + 0.3187675293980876, + null, + 0.32578353530864457, + 0.34114125407236195, + null, + 0.27440213390552737, + 0.2728250610713022, + null, + 0.27440213390552737, + 0.1823584228427031, + null, + 0.27440213390552737, + 0.19852054651169693, + null, + 0.27440213390552737, + 0.22007362873840486, + null, + 0.27440213390552737, + 0.37301066653863624, + null, + 0.27440213390552737, + 0.2275256207367028, + null, + 0.27440213390552737, + 0.2619562675328274, + null, + 0.27440213390552737, + 0.3414075728554137, + null, + 0.2728250610713022, + 0.1823584228427031, + null, + 0.2728250610713022, + 0.37549158943196925, + null, + 0.2728250610713022, + 0.22007362873840486, + null, + 0.2728250610713022, + 0.16862303760247477, + null, + 0.6346565064837861, + 0.7364515013041172, + null, + 0.6346565064837861, + 0.5436816885151938, + null, + 0.6346565064837861, + 0.5461279353327784, + null, + 0.6346565064837861, + 0.7059759544943667, + null, + 0.6346565064837861, + 0.6149491168624189, + null, + 0.6346565064837861, + 0.5593069337955722, + null, + 0.6327007577432437, + 0.662108954544855, + null, + 0.6327007577432437, + 0.5433115547736789, + null, + 0.6327007577432437, + 0.5274116361492907, + null, + 0.6327007577432437, + 0.7042334738295596, + null, + 0.6327007577432437, + 0.555788147264811, + null, + 0.6327007577432437, + 0.5805679633404117, + null, + 0.6327007577432437, + 0.5989925957177575, + null, + 0.6327007577432437, + 0.5845953849421676, + null, + 0.6327007577432437, + 0.6058132814274794, + null, + 0.6327007577432437, + 0.5621062195646831, + null, + 0.800297854626628, + 0.7364515013041172, + null, + 0.800297854626628, + 0.6953901849658966, + null, + 0.800297854626628, + 0.8589937476561325, + null, + 0.800297854626628, + 0.7204214783753378, + null, + 0.800297854626628, + 0.8247840830312709, + null, + 0.800297854626628, + 0.7948577020793985, + null, + 0.800297854626628, + 0.7059759544943667, + null, + 0.800297854626628, + 0.8846357375826375, + null, + 0.800297854626628, + 0.8323549266756429, + null, + 0.800297854626628, + 0.8505181106970376, + null, + 0.800297854626628, + 0.7607451357487841, + null, + 0.800297854626628, + 0.9110645875753355, + null, + 0.526779936668903, + 0.5433115547736789, + null, + 0.526779936668903, + 0.5274116361492907, + null, + 0.526779936668903, + 0.555788147264811, + null, + 0.526779936668903, + 0.5805679633404117, + null, + 0.526779936668903, + 0.48218022499136737, + null, + 0.526779936668903, + 0.5293212253918783, + null, + 0.526779936668903, + 0.47443124751760235, + null, + 0.526779936668903, + 0.5291812256005789, + null, + 0.526779936668903, + 0.5621062195646831, + null, + 0.526779936668903, + 0.5465171974419871, + null, + 0.413948124857326, + 0.44119458804978295, + null, + 0.413948124857326, + 0.3328704753356456, + null, + 0.413948124857326, + 0.3499260998923053, + null, + 0.413948124857326, + 0.47055154706870017, + null, + 0.413948124857326, + 0.5274116361492907, + null, + 0.413948124857326, + 0.4277213938753692, + null, + 0.413948124857326, + 0.3247821296168134, + null, + 0.413948124857326, + 0.4564806171162211, + null, + 0.413948124857326, + 0.3187675293980876, + null, + 0.413948124857326, + 0.34114125407236195, + null, + 0.09276814106220677, + 0.03187584930858911, + null, + 0.09276814106220677, + 0.07426685281627932, + null, + 0.09276814106220677, + 0.03446402354654854, + null, + 0.09276814106220677, + 0.06879886671193436, + null, + 0.09276814106220677, + 0.1823584228427031, + null, + 0.09276814106220677, + 0.13940667248499528, + null, + 0.09276814106220677, + 0.0201693226965588, + null, + 0.09276814106220677, + 0.16862303760247477, + null, + 0.09276814106220677, + 0.12355952994556385, + null, + 0.662108954544855, + 0.7827775151390383, + null, + 0.662108954544855, + 0.7007214129943925, + null, + 0.662108954544855, + 0.7188906153197968, + null, + 0.662108954544855, + 0.7042334738295596, + null, + 0.662108954544855, + 0.555788147264811, + null, + 0.662108954544855, + 0.5805679633404117, + null, + 0.662108954544855, + 0.7255980413609877, + null, + 0.662108954544855, + 0.7518492361353024, + null, + 0.07163295816605642, + 0.06202421257916635, + null, + 0.07163295816605642, + 0.09053866681881584, + null, + 0.07163295816605642, + 0.1573630170264504, + null, + 0.07163295816605642, + 0.0023771443647881974, + null, + 0.07163295816605642, + 0.0852382135963593, + null, + 0.07163295816605642, + 0.17086936775877049, + null, + 0.07163295816605642, + 0.0875467755337247, + null, + 0.07163295816605642, + 0.08997327822205015, + null, + 0.07163295816605642, + 0.020212382594376965, + null, + 0.07163295816605642, + 0.0897773631019545, + null, + 0.07163295816605642, + 0.038579501382332126, + null, + 0.44119458804978295, + 0.3740122792611037, + null, + 0.44119458804978295, + 0.3328704753356456, + null, + 0.44119458804978295, + 0.3499260998923053, + null, + 0.44119458804978295, + 0.47055154706870017, + null, + 0.44119458804978295, + 0.5274116361492907, + null, + 0.44119458804978295, + 0.4277213938753692, + null, + 0.44119458804978295, + 0.4564806171162211, + null, + 0.44119458804978295, + 0.34114125407236195, + null, + 0.7364515013041172, + 0.8247840830312709, + null, + 0.7364515013041172, + 0.7948577020793985, + null, + 0.7364515013041172, + 0.7059759544943667, + null, + 0.7364515013041172, + 0.8323549266756429, + null, + 0.7827775151390383, + 0.7007214129943925, + null, + 0.7827775151390383, + 0.7188906153197968, + null, + 0.7827775151390383, + 0.7042334738295596, + null, + 0.7827775151390383, + 0.8613129225222332, + null, + 0.7827775151390383, + 0.7255980413609877, + null, + 0.7827775151390383, + 0.7703024251104211, + null, + 0.7827775151390383, + 0.9005048863870916, + null, + 0.7827775151390383, + 0.7518492361353024, + null, + 0.9600359726880752, + 0.9998698320754983, + null, + 0.9600359726880752, + 0.9082570345357789, + null, + 0.9600359726880752, + 0.9503884723051484, + null, + 0.9600359726880752, + 0.916634041055854, + null, + 0.9600359726880752, + 0.8613129225222332, + null, + 0.9600359726880752, + 0.9005048863870916, + null, + 0.9600359726880752, + 0.9240127894624793, + null, + 0.9600359726880752, + 0.9636590456207981, + null, + 0.8511753697833563, + 0.89080246263295, + null, + 0.8511753697833563, + 0.9521646983336837, + null, + 0.8511753697833563, + 0.9663892923019699, + null, + 0.8511753697833563, + 0.9573079778783831, + null, + 0.8511753697833563, + 0.9473667691929577, + null, + 0.8511753697833563, + 0.838803404513024, + null, + 0.8511753697833563, + 0.7518492361353024, + null, + 0.05194805532761382, + 0.06202421257916635, + null, + 0.05194805532761382, + 0.0852382135963593, + null, + 0.05194805532761382, + 0.0914406510425998, + null, + 0.05194805532761382, + 0.0875467755337247, + null, + 0.05194805532761382, + 0.08997327822205015, + null, + 0.05194805532761382, + 0.020212382594376965, + null, + 0.05194805532761382, + 0.02312833765025224, + null, + 0.05194805532761382, + 0.04237200971819888, + null, + 0.05194805532761382, + 0.038579501382332126, + null, + 0.05194805532761382, + 0.01777064460825195, + null, + 0.03187584930858911, + 0.07426685281627932, + null, + 0.03187584930858911, + 0.03446402354654854, + null, + 0.03187584930858911, + 0.06879886671193436, + null, + 0.03187584930858911, + 0.13940667248499528, + null, + 0.03187584930858911, + 0.0201693226965588, + null, + 0.03187584930858911, + 0.12355952994556385, + null, + 0.07426685281627932, + 0.09471702229050472, + null, + 0.07426685281627932, + 0.06879886671193436, + null, + 0.07426685281627932, + 0.1823584228427031, + null, + 0.07426685281627932, + 0.13940667248499528, + null, + 0.07426685281627932, + 0.0201693226965588, + null, + 0.07426685281627932, + 0.16862303760247477, + null, + 0.07426685281627932, + 0.12355952994556385, + null, + 0.07426685281627932, + 0.04781523934390508, + null, + 0.5257999712304688, + 0.5593951498649633, + null, + 0.5257999712304688, + 0.4404718698088387, + null, + 0.5257999712304688, + 0.5201251204037126, + null, + 0.9998698320754983, + 0.9082570345357789, + null, + 0.9998698320754983, + 0.9636084967560627, + null, + 0.9998698320754983, + 0.9503884723051484, + null, + 0.9998698320754983, + 0.9240127894624793, + null, + 0.9998698320754983, + 0.9636590456207981, + null, + 0.09471702229050472, + 0.06879886671193436, + null, + 0.09471702229050472, + 0.1823584228427031, + null, + 0.09471702229050472, + 0.19852054651169693, + null, + 0.09471702229050472, + 0.13747604708068628, + null, + 0.09471702229050472, + 0.13940667248499528, + null, + 0.09471702229050472, + 0.0201693226965588, + null, + 0.09471702229050472, + 0.12355952994556385, + null, + 0.09471702229050472, + 0.0897773631019545, + null, + 0.09471702229050472, + 0.04781523934390508, + null, + 0.6953901849658966, + 0.7204214783753378, + null, + 0.6953901849658966, + 0.7181048560087516, + null, + 0.6953901849658966, + 0.7948577020793985, + null, + 0.6953901849658966, + 0.7059759544943667, + null, + 0.6953901849658966, + 0.6370268640561303, + null, + 0.6953901849658966, + 0.6149491168624189, + null, + 0.6953901849658966, + 0.7607451357487841, + null, + 0.6953901849658966, + 0.6234379896430121, + null, + 0.03446402354654854, + 0.05596958524873419, + null, + 0.03446402354654854, + 0.014269300880037306, + null, + 0.9082570345357789, + 0.9503884723051484, + null, + 0.9082570345357789, + 0.916634041055854, + null, + 0.9082570345357789, + 0.8613129225222332, + null, + 0.9082570345357789, + 0.9005048863870916, + null, + 0.9082570345357789, + 0.9240127894624793, + null, + 0.9082570345357789, + 0.9636590456207981, + null, + 0.3740122792611037, + 0.37848025459696877, + null, + 0.3740122792611037, + 0.3821391536049519, + null, + 0.3740122792611037, + 0.2955343345493908, + null, + 0.3740122792611037, + 0.31305791514229697, + null, + 0.3740122792611037, + 0.298647499376007, + null, + 0.3740122792611037, + 0.3246624829381992, + null, + 0.3740122792611037, + 0.3328704753356456, + null, + 0.3740122792611037, + 0.33203393677870674, + null, + 0.3740122792611037, + 0.3499260998923053, + null, + 0.3740122792611037, + 0.3181124346701171, + null, + 0.3740122792611037, + 0.47055154706870017, + null, + 0.3740122792611037, + 0.4277213938753692, + null, + 0.3740122792611037, + 0.25656414507004344, + null, + 0.3740122792611037, + 0.4564806171162211, + null, + 0.977854801698089, + 0.9162463356603696, + null, + 0.5436816885151938, + 0.5461279353327784, + null, + 0.5436816885151938, + 0.5229468203255856, + null, + 0.5436816885151938, + 0.4611021425875542, + null, + 0.5436816885151938, + 0.6149491168624189, + null, + 0.5436816885151938, + 0.4349682989231034, + null, + 0.5436816885151938, + 0.6234379896430121, + null, + 0.5436816885151938, + 0.4442228752887084, + null, + 0.5436816885151938, + 0.5593069337955722, + null, + 0.06202421257916635, + 0.09053866681881584, + null, + 0.06202421257916635, + 0.1573630170264504, + null, + 0.06202421257916635, + 0.0023771443647881974, + null, + 0.06202421257916635, + 0.0852382135963593, + null, + 0.06202421257916635, + 0.0875467755337247, + null, + 0.06202421257916635, + 0.08997327822205015, + null, + 0.06202421257916635, + 0.020212382594376965, + null, + 0.06202421257916635, + 0.02312833765025224, + null, + 0.06202421257916635, + 0.04237200971819888, + null, + 0.06202421257916635, + 0.038579501382332126, + null, + 0.06202421257916635, + 0.01777064460825195, + null, + 0.8589937476561325, + 0.8247840830312709, + null, + 0.8589937476561325, + 0.7948577020793985, + null, + 0.8589937476561325, + 0.9210876029743161, + null, + 0.8589937476561325, + 0.9694266665187994, + null, + 0.8589937476561325, + 0.8846357375826375, + null, + 0.8589937476561325, + 0.8323549266756429, + null, + 0.8589937476561325, + 0.8505181106970376, + null, + 0.8589937476561325, + 0.9110645875753355, + null, + 0.06879886671193436, + 0.1823584228427031, + null, + 0.06879886671193436, + 0.13940667248499528, + null, + 0.06879886671193436, + 0.0201693226965588, + null, + 0.06879886671193436, + 0.12355952994556385, + null, + 0.06879886671193436, + 0.04781523934390508, + null, + 0.19921682827804632, + 0.10310287300704979, + null, + 0.19921682827804632, + 0.0914406510425998, + null, + 0.19921682827804632, + 0.14711158829428328, + null, + 0.19921682827804632, + 0.21535391032155426, + null, + 0.19921682827804632, + 0.25656414507004344, + null, + 0.1823584228427031, + 0.19852054651169693, + null, + 0.1823584228427031, + 0.22007362873840486, + null, + 0.1823584228427031, + 0.13940667248499528, + null, + 0.1823584228427031, + 0.16862303760247477, + null, + 0.1823584228427031, + 0.12355952994556385, + null, + 0.37549158943196925, + 0.41808707877840445, + null, + 0.37549158943196925, + 0.42926818011737133, + null, + 0.37549158943196925, + 0.4363707938884992, + null, + 0.37549158943196925, + 0.42077304608666055, + null, + 0.5433115547736789, + 0.5274116361492907, + null, + 0.5433115547736789, + 0.555788147264811, + null, + 0.5433115547736789, + 0.5805679633404117, + null, + 0.5433115547736789, + 0.5989925957177575, + null, + 0.5433115547736789, + 0.48218022499136737, + null, + 0.5433115547736789, + 0.47443124751760235, + null, + 0.5433115547736789, + 0.5291812256005789, + null, + 0.5433115547736789, + 0.5621062195646831, + null, + 0.5433115547736789, + 0.5465171974419871, + null, + 0.37848025459696877, + 0.3821391536049519, + null, + 0.37848025459696877, + 0.31305791514229697, + null, + 0.37848025459696877, + 0.3246624829381992, + null, + 0.37848025459696877, + 0.33203393677870674, + null, + 0.37848025459696877, + 0.4404718698088387, + null, + 0.37848025459696877, + 0.3393815448042514, + null, + 0.37848025459696877, + 0.32444561774289593, + null, + 0.37848025459696877, + 0.33721825060791266, + null, + 0.3821391536049519, + 0.2955343345493908, + null, + 0.3821391536049519, + 0.31305791514229697, + null, + 0.3821391536049519, + 0.298647499376007, + null, + 0.3821391536049519, + 0.3246624829381992, + null, + 0.3821391536049519, + 0.33203393677870674, + null, + 0.3821391536049519, + 0.3499260998923053, + null, + 0.3821391536049519, + 0.3181124346701171, + null, + 0.3821391536049519, + 0.47055154706870017, + null, + 0.3821391536049519, + 0.4404718698088387, + null, + 0.3821391536049519, + 0.3393815448042514, + null, + 0.3821391536049519, + 0.32444561774289593, + null, + 0.3821391536049519, + 0.4564806171162211, + null, + 0.3821391536049519, + 0.33721825060791266, + null, + 0.7204214783753378, + 0.7181048560087516, + null, + 0.7204214783753378, + 0.7948577020793985, + null, + 0.7204214783753378, + 0.7059759544943667, + null, + 0.7204214783753378, + 0.6370268640561303, + null, + 0.7204214783753378, + 0.7607451357487841, + null, + 0.7204214783753378, + 0.6234379896430121, + null, + 0.2955343345493908, + 0.31305791514229697, + null, + 0.2955343345493908, + 0.298647499376007, + null, + 0.2955343345493908, + 0.3246624829381992, + null, + 0.2955343345493908, + 0.3328704753356456, + null, + 0.2955343345493908, + 0.33203393677870674, + null, + 0.2955343345493908, + 0.3499260998923053, + null, + 0.2955343345493908, + 0.3181124346701171, + null, + 0.2955343345493908, + 0.25656414507004344, + null, + 0.2955343345493908, + 0.32444561774289593, + null, + 0.09053866681881584, + 0.1573630170264504, + null, + 0.09053866681881584, + 0.0023771443647881974, + null, + 0.09053866681881584, + 0.0852382135963593, + null, + 0.09053866681881584, + 0.17086936775877049, + null, + 0.09053866681881584, + 0.0875467755337247, + null, + 0.09053866681881584, + 0.08997327822205015, + null, + 0.09053866681881584, + 0.020212382594376965, + null, + 0.09053866681881584, + 0.0897773631019545, + null, + 0.09053866681881584, + 0.02312833765025224, + null, + 0.09053866681881584, + 0.20133087739958255, + null, + 0.09053866681881584, + 0.038579501382332126, + null, + 0.09053866681881584, + 0.01777064460825195, + null, + 0.7181048560087516, + 0.6776948411821848, + null, + 0.7181048560087516, + 0.834199864808296, + null, + 0.7181048560087516, + 0.6370268640561303, + null, + 0.7181048560087516, + 0.6802728591951641, + null, + 0.7181048560087516, + 0.7607451357487841, + null, + 0.7181048560087516, + 0.6314926226168458, + null, + 0.10310287300704979, + 0.05973078995013337, + null, + 0.10310287300704979, + 0.0914406510425998, + null, + 0.10310287300704979, + 0.14711158829428328, + null, + 0.10310287300704979, + 0.21535391032155426, + null, + 0.10310287300704979, + 0.04237200971819888, + null, + 0.8247840830312709, + 0.7948577020793985, + null, + 0.8247840830312709, + 0.9210876029743161, + null, + 0.8247840830312709, + 0.7059759544943667, + null, + 0.8247840830312709, + 0.9186278106648778, + null, + 0.8247840830312709, + 0.8846357375826375, + null, + 0.8247840830312709, + 0.8323549266756429, + null, + 0.8247840830312709, + 0.8505181106970376, + null, + 0.8247840830312709, + 0.9110645875753355, + null, + 0.1573630170264504, + 0.2275256207367028, + null, + 0.1573630170264504, + 0.0852382135963593, + null, + 0.1573630170264504, + 0.18507593174525072, + null, + 0.1573630170264504, + 0.17086936775877049, + null, + 0.1573630170264504, + 0.0875467755337247, + null, + 0.1573630170264504, + 0.08997327822205015, + null, + 0.1573630170264504, + 0.0897773631019545, + null, + 0.1573630170264504, + 0.20133087739958255, + null, + 0.31305791514229697, + 0.298647499376007, + null, + 0.31305791514229697, + 0.3246624829381992, + null, + 0.31305791514229697, + 0.33203393677870674, + null, + 0.31305791514229697, + 0.3499260998923053, + null, + 0.31305791514229697, + 0.3181124346701171, + null, + 0.31305791514229697, + 0.3393815448042514, + null, + 0.31305791514229697, + 0.21535391032155426, + null, + 0.31305791514229697, + 0.25656414507004344, + null, + 0.31305791514229697, + 0.32444561774289593, + null, + 0.31305791514229697, + 0.33721825060791266, + null, + 0.298647499376007, + 0.3328704753356456, + null, + 0.298647499376007, + 0.33203393677870674, + null, + 0.298647499376007, + 0.3499260998923053, + null, + 0.298647499376007, + 0.3181124346701171, + null, + 0.298647499376007, + 0.3247821296168134, + null, + 0.298647499376007, + 0.25656414507004344, + null, + 0.298647499376007, + 0.3187675293980876, + null, + 0.298647499376007, + 0.20133087739958255, + null, + 0.298647499376007, + 0.34114125407236195, + null, + 0.3246624829381992, + 0.33203393677870674, + null, + 0.3246624829381992, + 0.4404718698088387, + null, + 0.3246624829381992, + 0.3393815448042514, + null, + 0.3246624829381992, + 0.21535391032155426, + null, + 0.3246624829381992, + 0.25656414507004344, + null, + 0.3246624829381992, + 0.32444561774289593, + null, + 0.3246624829381992, + 0.33721825060791266, + null, + 0.19852054651169693, + 0.13747604708068628, + null, + 0.19852054651169693, + 0.22007362873840486, + null, + 0.19852054651169693, + 0.2275256207367028, + null, + 0.19852054651169693, + 0.2619562675328274, + null, + 0.19852054651169693, + 0.18507593174525072, + null, + 0.3328704753356456, + 0.3499260998923053, + null, + 0.3328704753356456, + 0.3181124346701171, + null, + 0.3328704753356456, + 0.4277213938753692, + null, + 0.3328704753356456, + 0.3247821296168134, + null, + 0.3328704753356456, + 0.3187675293980876, + null, + 0.3328704753356456, + 0.34114125407236195, + null, + 0.33203393677870674, + 0.3181124346701171, + null, + 0.33203393677870674, + 0.4404718698088387, + null, + 0.33203393677870674, + 0.3393815448042514, + null, + 0.33203393677870674, + 0.21535391032155426, + null, + 0.33203393677870674, + 0.25656414507004344, + null, + 0.33203393677870674, + 0.32444561774289593, + null, + 0.33203393677870674, + 0.33721825060791266, + null, + 0.5461279353327784, + 0.5229468203255856, + null, + 0.5461279353327784, + 0.4611021425875542, + null, + 0.5461279353327784, + 0.6149491168624189, + null, + 0.5461279353327784, + 0.4349682989231034, + null, + 0.5461279353327784, + 0.5593069337955722, + null, + 0.9636084967560627, + 0.9503884723051484, + null, + 0.9636084967560627, + 0.9162463356603696, + null, + 0.9636084967560627, + 0.8541827253649632, + null, + 0.9636084967560627, + 0.9636590456207981, + null, + 0.9636084967560627, + 0.8680862155815134, + null, + 0.9636084967560627, + 0.8668565351624634, + null, + 0.9503884723051484, + 0.9240127894624793, + null, + 0.9503884723051484, + 0.9636590456207981, + null, + 0.9503884723051484, + 0.8680862155815134, + null, + 0.13747604708068628, + 0.22007362873840486, + null, + 0.13747604708068628, + 0.2275256207367028, + null, + 0.13747604708068628, + 0.18507593174525072, + null, + 0.13747604708068628, + 0.17086936775877049, + null, + 0.13747604708068628, + 0.0897773631019545, + null, + 0.13747604708068628, + 0.04781523934390508, + null, + 0.3499260998923053, + 0.3181124346701171, + null, + 0.3499260998923053, + 0.4277213938753692, + null, + 0.3499260998923053, + 0.3247821296168134, + null, + 0.3499260998923053, + 0.4564806171162211, + null, + 0.3499260998923053, + 0.3187675293980876, + null, + 0.3499260998923053, + 0.34114125407236195, + null, + 0.3181124346701171, + 0.3247821296168134, + null, + 0.3181124346701171, + 0.25656414507004344, + null, + 0.3181124346701171, + 0.3187675293980876, + null, + 0.89080246263295, + 0.9521646983336837, + null, + 0.89080246263295, + 0.834199864808296, + null, + 0.89080246263295, + 0.9663892923019699, + null, + 0.89080246263295, + 0.9425745666137786, + null, + 0.89080246263295, + 0.9851894520572745, + null, + 0.89080246263295, + 0.9573079778783831, + null, + 0.89080246263295, + 0.9473667691929577, + null, + 0.89080246263295, + 0.838803404513024, + null, + 0.9521646983336837, + 0.916634041055854, + null, + 0.9521646983336837, + 0.9663892923019699, + null, + 0.9521646983336837, + 0.9573079778783831, + null, + 0.9521646983336837, + 0.9473667691929577, + null, + 0.9521646983336837, + 0.9005048863870916, + null, + 0.6776948411821848, + 0.6802728591951641, + null, + 0.6776948411821848, + 0.6314926226168458, + null, + 0.0023771443647881974, + 0.0852382135963593, + null, + 0.0023771443647881974, + 0.0875467755337247, + null, + 0.0023771443647881974, + 0.020212382594376965, + null, + 0.0023771443647881974, + 0.0897773631019545, + null, + 0.0023771443647881974, + 0.038579501382332126, + null, + 0.7007214129943925, + 0.7188906153197968, + null, + 0.7007214129943925, + 0.7255980413609877, + null, + 0.7007214129943925, + 0.7518492361353024, + null, + 0.7188906153197968, + 0.7255980413609877, + null, + 0.7188906153197968, + 0.7518492361353024, + null, + 0.47055154706870017, + 0.5274116361492907, + null, + 0.47055154706870017, + 0.4277213938753692, + null, + 0.47055154706870017, + 0.5845953849421676, + null, + 0.47055154706870017, + 0.4564806171162211, + null, + 0.47055154706870017, + 0.5201251204037126, + null, + 0.19043749918150743, + 0.2121217358781844, + null, + 0.19043749918150743, + 0.29978148854693865, + null, + 0.5274116361492907, + 0.555788147264811, + null, + 0.5274116361492907, + 0.5805679633404117, + null, + 0.5274116361492907, + 0.5989925957177575, + null, + 0.5274116361492907, + 0.4277213938753692, + null, + 0.5274116361492907, + 0.5845953849421676, + null, + 0.5274116361492907, + 0.6058132814274794, + null, + 0.5274116361492907, + 0.5291812256005789, + null, + 0.5274116361492907, + 0.5621062195646831, + null, + 0.5274116361492907, + 0.4564806171162211, + null, + 0.9162463356603696, + 0.8385234321105272, + null, + 0.9162463356603696, + 0.8668565351624634, + null, + 0.7042334738295596, + 0.5989925957177575, + null, + 0.7042334738295596, + 0.7255980413609877, + null, + 0.7042334738295596, + 0.6058132814274794, + null, + 0.7042334738295596, + 0.7703024251104211, + null, + 0.555788147264811, + 0.5805679633404117, + null, + 0.555788147264811, + 0.5989925957177575, + null, + 0.555788147264811, + 0.48218022499136737, + null, + 0.555788147264811, + 0.5293212253918783, + null, + 0.555788147264811, + 0.47443124751760235, + null, + 0.555788147264811, + 0.5291812256005789, + null, + 0.555788147264811, + 0.5621062195646831, + null, + 0.555788147264811, + 0.5465171974419871, + null, + 0.5805679633404117, + 0.5989925957177575, + null, + 0.5805679633404117, + 0.5845953849421676, + null, + 0.5805679633404117, + 0.6058132814274794, + null, + 0.5805679633404117, + 0.5291812256005789, + null, + 0.5805679633404117, + 0.5621062195646831, + null, + 0.587704695878027, + 0.5593951498649633, + null, + 0.587704695878027, + 0.5845953849421676, + null, + 0.587704695878027, + 0.6058132814274794, + null, + 0.587704695878027, + 0.6322124026692795, + null, + 0.587704695878027, + 0.5201251204037126, + null, + 0.916634041055854, + 0.8613129225222332, + null, + 0.916634041055854, + 0.9005048863870916, + null, + 0.916634041055854, + 0.9240127894624793, + null, + 0.7948577020793985, + 0.7059759544943667, + null, + 0.7948577020793985, + 0.8846357375826375, + null, + 0.7948577020793985, + 0.8323549266756429, + null, + 0.7948577020793985, + 0.8505181106970376, + null, + 0.7948577020793985, + 0.7607451357487841, + null, + 0.7948577020793985, + 0.9110645875753355, + null, + 0.9210876029743161, + 0.9694266665187994, + null, + 0.9210876029743161, + 0.9186278106648778, + null, + 0.9210876029743161, + 0.8846357375826375, + null, + 0.9210876029743161, + 0.8323549266756429, + null, + 0.9210876029743161, + 0.9110645875753355, + null, + 0.9210876029743161, + 0.992283435751248, + null, + 0.834199864808296, + 0.9425745666137786, + null, + 0.834199864808296, + 0.8505181106970376, + null, + 0.834199864808296, + 0.7607451357487841, + null, + 0.5989925957177575, + 0.5845953849421676, + null, + 0.5989925957177575, + 0.6058132814274794, + null, + 0.5989925957177575, + 0.5621062195646831, + null, + 0.05973078995013337, + 0.0914406510425998, + null, + 0.05973078995013337, + 0.14711158829428328, + null, + 0.05973078995013337, + 0.04237200971819888, + null, + 0.5593951498649633, + 0.4404718698088387, + null, + 0.5593951498649633, + 0.6322124026692795, + null, + 0.5593951498649633, + 0.5201251204037126, + null, + 0.5229468203255856, + 0.4611021425875542, + null, + 0.5229468203255856, + 0.44175944307536974, + null, + 0.5229468203255856, + 0.6149491168624189, + null, + 0.5229468203255856, + 0.6234379896430121, + null, + 0.5229468203255856, + 0.4442228752887084, + null, + 0.5229468203255856, + 0.5593069337955722, + null, + 0.22007362873840486, + 0.2275256207367028, + null, + 0.22007362873840486, + 0.2619562675328274, + null, + 0.22007362873840486, + 0.18507593174525072, + null, + 0.22007362873840486, + 0.3414075728554137, + null, + 0.37301066653863624, + 0.2619562675328274, + null, + 0.37301066653863624, + 0.48218022499136737, + null, + 0.37301066653863624, + 0.47443124751760235, + null, + 0.37301066653863624, + 0.3414075728554137, + null, + 0.37301066653863624, + 0.42077304608666055, + null, + 0.37301066653863624, + 0.4039327719907384, + null, + 0.8613129225222332, + 0.7703024251104211, + null, + 0.8613129225222332, + 0.9005048863870916, + null, + 0.9663892923019699, + 0.9851894520572745, + null, + 0.9663892923019699, + 0.9573079778783831, + null, + 0.9663892923019699, + 0.9473667691929577, + null, + 0.2275256207367028, + 0.2619562675328274, + null, + 0.2275256207367028, + 0.18507593174525072, + null, + 0.2275256207367028, + 0.17086936775877049, + null, + 0.0852382135963593, + 0.0875467755337247, + null, + 0.0852382135963593, + 0.08997327822205015, + null, + 0.0852382135963593, + 0.020212382594376965, + null, + 0.0852382135963593, + 0.02312833765025224, + null, + 0.0852382135963593, + 0.20133087739958255, + null, + 0.0852382135963593, + 0.038579501382332126, + null, + 0.0852382135963593, + 0.01777064460825195, + null, + 0.0914406510425998, + 0.14711158829428328, + null, + 0.0914406510425998, + 0.02312833765025224, + null, + 0.0914406510425998, + 0.04237200971819888, + null, + 0.0914406510425998, + 0.01777064460825195, + null, + 0.9425745666137786, + 0.9851894520572745, + null, + 0.9425745666137786, + 0.9473667691929577, + null, + 0.3019474379086241, + 0.2121217358781844, + null, + 0.3019474379086241, + 0.3318561006769827, + null, + 0.3019474379086241, + 0.29978148854693865, + null, + 0.2619562675328274, + 0.3247821296168134, + null, + 0.2619562675328274, + 0.18507593174525072, + null, + 0.2619562675328274, + 0.17086936775877049, + null, + 0.2619562675328274, + 0.3414075728554137, + null, + 0.2619562675328274, + 0.3187675293980876, + null, + 0.2619562675328274, + 0.34114125407236195, + null, + 0.48218022499136737, + 0.5293212253918783, + null, + 0.48218022499136737, + 0.47443124751760235, + null, + 0.48218022499136737, + 0.5291812256005789, + null, + 0.48218022499136737, + 0.5465171974419871, + null, + 0.5293212253918783, + 0.47443124751760235, + null, + 0.5293212253918783, + 0.5291812256005789, + null, + 0.5293212253918783, + 0.5191285820034173, + null, + 0.5293212253918783, + 0.42077304608666055, + null, + 0.5293212253918783, + 0.5465171974419871, + null, + 0.41808707877840445, + 0.42926818011737133, + null, + 0.41808707877840445, + 0.44175944307536974, + null, + 0.41808707877840445, + 0.4363707938884992, + null, + 0.14711158829428328, + 0.21535391032155426, + null, + 0.42926818011737133, + 0.4363707938884992, + null, + 0.9694266665187994, + 0.9186278106648778, + null, + 0.9694266665187994, + 0.8846357375826375, + null, + 0.9694266665187994, + 0.9110645875753355, + null, + 0.9694266665187994, + 0.992283435751248, + null, + 0.4404718698088387, + 0.3393815448042514, + null, + 0.4404718698088387, + 0.32444561774289593, + null, + 0.4404718698088387, + 0.33721825060791266, + null, + 0.4404718698088387, + 0.5201251204037126, + null, + 0.4277213938753692, + 0.3247821296168134, + null, + 0.4277213938753692, + 0.4564806171162211, + null, + 0.4277213938753692, + 0.3187675293980876, + null, + 0.4277213938753692, + 0.34114125407236195, + null, + 0.7059759544943667, + 0.6149491168624189, + null, + 0.7059759544943667, + 0.6234379896430121, + null, + 0.4611021425875542, + 0.44175944307536974, + null, + 0.4611021425875542, + 0.4349682989231034, + null, + 0.4611021425875542, + 0.4442228752887084, + null, + 0.4611021425875542, + 0.5593069337955722, + null, + 0.13940667248499528, + 0.0201693226965588, + null, + 0.13940667248499528, + 0.16862303760247477, + null, + 0.13940667248499528, + 0.12355952994556385, + null, + 0.3393815448042514, + 0.21535391032155426, + null, + 0.3393815448042514, + 0.25656414507004344, + null, + 0.3393815448042514, + 0.32444561774289593, + null, + 0.3393815448042514, + 0.33721825060791266, + null, + 0.6370268640561303, + 0.7607451357487841, + null, + 0.6370268640561303, + 0.6234379896430121, + null, + 0.6370268640561303, + 0.6314926226168458, + null, + 0.9851894520572745, + 0.9573079778783831, + null, + 0.9851894520572745, + 0.9473667691929577, + null, + 0.3247821296168134, + 0.3187675293980876, + null, + 0.3247821296168134, + 0.34114125407236195, + null, + 0.9186278106648778, + 0.8846357375826375, + null, + 0.9186278106648778, + 0.8323549266756429, + null, + 0.9186278106648778, + 0.9110645875753355, + null, + 0.9186278106648778, + 0.992283435751248, + null, + 0.18507593174525072, + 0.17086936775877049, + null, + 0.18507593174525072, + 0.0897773631019545, + null, + 0.18507593174525072, + 0.20133087739958255, + null, + 0.5845953849421676, + 0.6058132814274794, + null, + 0.5845953849421676, + 0.5621062195646831, + null, + 0.44175944307536974, + 0.4442228752887084, + null, + 0.7255980413609877, + 0.7703024251104211, + null, + 0.7255980413609877, + 0.7518492361353024, + null, + 0.6058132814274794, + 0.5621062195646831, + null, + 0.47443124751760235, + 0.5291812256005789, + null, + 0.47443124751760235, + 0.5465171974419871, + null, + 0.9573079778783831, + 0.9473667691929577, + null, + 0.9573079778783831, + 0.838803404513024, + null, + 0.0201693226965588, + 0.12355952994556385, + null, + 0.0201693226965588, + 0.04781523934390508, + null, + 0.17086936775877049, + 0.0897773631019545, + null, + 0.17086936775877049, + 0.20133087739958255, + null, + 0.5291812256005789, + 0.5621062195646831, + null, + 0.5291812256005789, + 0.5465171974419871, + null, + 0.16862303760247477, + 0.12355952994556385, + null, + 0.8846357375826375, + 0.8323549266756429, + null, + 0.8846357375826375, + 0.8505181106970376, + null, + 0.8846357375826375, + 0.9110645875753355, + null, + 0.8846357375826375, + 0.992283435751248, + null, + 0.0875467755337247, + 0.08997327822205015, + null, + 0.0875467755337247, + 0.020212382594376965, + null, + 0.0875467755337247, + 0.02312833765025224, + null, + 0.0875467755337247, + 0.20133087739958255, + null, + 0.0875467755337247, + 0.038579501382332126, + null, + 0.0875467755337247, + 0.01777064460825195, + null, + 0.9473667691929577, + 0.838803404513024, + null, + 0.8541827253649632, + 0.8680862155815134, + null, + 0.8541827253649632, + 0.8668565351624634, + null, + 0.3414075728554137, + 0.42077304608666055, + null, + 0.3414075728554137, + 0.4039327719907384, + null, + 0.3318561006769827, + 0.4349682989231034, + null, + 0.3318561006769827, + 0.29978148854693865, + null, + 0.7408684543182315, + 0.8385234321105272, + null, + 0.7408684543182315, + 0.6322124026692795, + null, + 0.7408684543182315, + 0.7333209824474588, + null, + 0.6149491168624189, + 0.6234379896430121, + null, + 0.6149491168624189, + 0.5593069337955722, + null, + 0.12355952994556385, + 0.04781523934390508, + null, + 0.08997327822205015, + 0.020212382594376965, + null, + 0.08997327822205015, + 0.02312833765025224, + null, + 0.08997327822205015, + 0.20133087739958255, + null, + 0.08997327822205015, + 0.04237200971819888, + null, + 0.08997327822205015, + 0.038579501382332126, + null, + 0.08997327822205015, + 0.01777064460825195, + null, + 0.21535391032155426, + 0.25656414507004344, + null, + 0.21535391032155426, + 0.32444561774289593, + null, + 0.21535391032155426, + 0.33721825060791266, + null, + 0.8323549266756429, + 0.9110645875753355, + null, + 0.8385234321105272, + 0.8668565351624634, + null, + 0.8385234321105272, + 0.7333209824474588, + null, + 0.9240127894624793, + 0.9636590456207981, + null, + 0.9240127894624793, + 0.8680862155815134, + null, + 0.6802728591951641, + 0.6314926226168458, + null, + 0.25656414507004344, + 0.32444561774289593, + null, + 0.25656414507004344, + 0.33721825060791266, + null, + 0.020212382594376965, + 0.02312833765025224, + null, + 0.020212382594376965, + 0.038579501382332126, + null, + 0.020212382594376965, + 0.01777064460825195, + null, + 0.32444561774289593, + 0.33721825060791266, + null, + 0.838803404513024, + 0.7518492361353024, + null, + 0.6322124026692795, + 0.5201251204037126, + null, + 0.6322124026692795, + 0.7333209824474588, + null, + 0.8505181106970376, + 0.7607451357487841, + null, + 0.8505181106970376, + 0.9110645875753355, + null, + 0.0897773631019545, + 0.04781523934390508, + null, + 0.02312833765025224, + 0.04237200971819888, + null, + 0.02312833765025224, + 0.038579501382332126, + null, + 0.02312833765025224, + 0.01777064460825195, + null, + 0.05596958524873419, + 0.014269300880037306, + null, + 0.3187675293980876, + 0.20133087739958255, + null, + 0.3187675293980876, + 0.34114125407236195, + null, + 0.5191285820034173, + 0.42077304608666055, + null, + 0.5191285820034173, + 0.5465171974419871, + null, + 0.4349682989231034, + 0.4442228752887084, + null, + 0.9636590456207981, + 0.8680862155815134, + null, + 0.8680862155815134, + 0.8668565351624634, + null, + 0.6234379896430121, + 0.5593069337955722, + null, + 0.04237200971819888, + 0.038579501382332126, + null, + 0.04237200971819888, + 0.01777064460825195, + null, + 0.038579501382332126, + 0.01777064460825195, + null, + 0.9110645875753355, + 0.992283435751248, + null, + 0.42077304608666055, + 0.4039327719907384, + null + ], + "y": [ + 0.09053726824382247, + 0.17542400609184483, + null, + 0.09053726824382247, + 0.055894273053114896, + null, + 0.09053726824382247, + 0.14933184162295132, + null, + 0.09053726824382247, + 0.1278305132468397, + null, + 0.09053726824382247, + 0.0731473655342364, + null, + 0.09053726824382247, + 0.09533319097359638, + null, + 0.09053726824382247, + 0.055897802218322856, + null, + 0.09053726824382247, + 0.04153202488293273, + null, + 0.09053726824382247, + 0.06013197669987258, + null, + 0.09053726824382247, + 0.040563128366188694, + null, + 0.09053726824382247, + 0.09959517902538939, + null, + 0.571085214777101, + 0.5944498275635773, + null, + 0.571085214777101, + 0.6773365837969099, + null, + 0.571085214777101, + 0.6160873747407943, + null, + 0.571085214777101, + 0.5186581897030644, + null, + 0.571085214777101, + 0.5634679987017406, + null, + 0.571085214777101, + 0.6012106694454529, + null, + 0.571085214777101, + 0.4898861106787329, + null, + 0.571085214777101, + 0.45431497833000367, + null, + 0.571085214777101, + 0.5204579980957379, + null, + 0.571085214777101, + 0.6352288779182178, + null, + 0.571085214777101, + 0.5981086798045652, + null, + 0.571085214777101, + 0.6648266103848882, + null, + 0.571085214777101, + 0.6072525121642058, + null, + 0.571085214777101, + 0.5260776190209286, + null, + 0.5199666766946885, + 0.5219101415039136, + null, + 0.5199666766946885, + 0.4307004647175262, + null, + 0.5199666766946885, + 0.4834545718278357, + null, + 0.5199666766946885, + 0.4847615611240751, + null, + 0.5199666766946885, + 0.4318165589087314, + null, + 0.5199666766946885, + 0.6217058876501556, + null, + 0.5199666766946885, + 0.5097617399826666, + null, + 0.33766327379542094, + 0.33811323660241943, + null, + 0.33766327379542094, + 0.31304614249644347, + null, + 0.33766327379542094, + 0.2697998035002954, + null, + 0.33766327379542094, + 0.2695720924906413, + null, + 0.33766327379542094, + 0.24454670425362057, + null, + 0.33766327379542094, + 0.4500538798110242, + null, + 0.33766327379542094, + 0.2880647319459674, + null, + 0.33766327379542094, + 0.3202314429055858, + null, + 0.33766327379542094, + 0.3169605131706372, + null, + 0.33766327379542094, + 0.32345881810688737, + null, + 0.17196466768963936, + 0.2009582712064717, + null, + 0.17196466768963936, + 0.15069304516745607, + null, + 0.17196466768963936, + 0.06016942899581168, + null, + 0.17196466768963936, + 0.24013807075121119, + null, + 0.17196466768963936, + 0.2693681584998491, + null, + 0.17196466768963936, + 0.10059463740220753, + null, + 0.17196466768963936, + 0.09959517902538939, + null, + 0.17708608014427518, + 0.2373268562908326, + null, + 0.17708608014427518, + 0.23741932367240448, + null, + 0.17708608014427518, + 0.05938145280899054, + null, + 0.17708608014427518, + 0.17619771419691865, + null, + 0.17708608014427518, + 0.21532966919867302, + null, + 0.17708608014427518, + 0.10782775946098799, + null, + 0.17708608014427518, + 0.249116699886752, + null, + 0.17708608014427518, + 0.23700988477155205, + null, + 0.17708608014427518, + 0.1341994714416056, + null, + 0.17708608014427518, + 0.29050814087118004, + null, + 0.04649454781195783, + 0.07011604000159166, + null, + 0.04649454781195783, + 0.019989772968585173, + null, + 0.04649454781195783, + 0.038844634468288675, + null, + 0.37080565676900146, + 0.3648985367210805, + null, + 0.37080565676900146, + 0.3343459796676115, + null, + 0.37080565676900146, + 0.4208812619135248, + null, + 0.37080565676900146, + 0.3900960314334032, + null, + 0.37080565676900146, + 0.3098874271134545, + null, + 0.37080565676900146, + 0.4295667428124167, + null, + 0.37080565676900146, + 0.35350564895305514, + null, + 0.37080565676900146, + 0.31541428705224306, + null, + 0.37080565676900146, + 0.4467311570808764, + null, + 0.37080565676900146, + 0.2693681584998491, + null, + 0.37080565676900146, + 0.4421375373865315, + null, + 0.37080565676900146, + 0.42641694849778966, + null, + 0.37080565676900146, + 0.3333136626479075, + null, + 0.37080565676900146, + 0.4868902788925622, + null, + 0.3602866247185619, + 0.3061539627540061, + null, + 0.3602866247185619, + 0.3661437355856225, + null, + 0.3602866247185619, + 0.40557198035837094, + null, + 0.3602866247185619, + 0.3192831323823997, + null, + 0.3602866247185619, + 0.41535454584101794, + null, + 0.3602866247185619, + 0.40395348439090084, + null, + 0.3602866247185619, + 0.3340702546567942, + null, + 0.3602866247185619, + 0.4248880785102581, + null, + 0.3602866247185619, + 0.29119156039108685, + null, + 0.9483925173875926, + 0.8957623407464501, + null, + 0.9483925173875926, + 0.9727770125665405, + null, + 0.9483925173875926, + 0.8791466031622056, + null, + 0.9483925173875926, + 0.922341377568881, + null, + 0.9483925173875926, + 0.8821215709600496, + null, + 0.9483925173875926, + 0.9328536520894143, + null, + 0.9483925173875926, + 0.9344432405222354, + null, + 0.9483925173875926, + 0.9642772106357639, + null, + 0.3061539627540061, + 0.3661437355856225, + null, + 0.3061539627540061, + 0.40557198035837094, + null, + 0.3061539627540061, + 0.3192831323823997, + null, + 0.3061539627540061, + 0.32266487999330984, + null, + 0.3061539627540061, + 0.40395348439090084, + null, + 0.3061539627540061, + 0.3340702546567942, + null, + 0.3061539627540061, + 0.29119156039108685, + null, + 0.3061539627540061, + 0.19048093242734687, + null, + 0.9643804220706982, + 0.9298960866412943, + null, + 0.9643804220706982, + 0.8599268392047722, + null, + 0.9643804220706982, + 0.9435179236599912, + null, + 0.9643804220706982, + 0.9958360522915445, + null, + 0.9643804220706982, + 0.9756800437762957, + null, + 0.9643804220706982, + 0.8842114977564064, + null, + 0.8336885167043149, + 0.938767234846119, + null, + 0.8336885167043149, + 0.8867112408398291, + null, + 0.8336885167043149, + 0.9298960866412943, + null, + 0.8336885167043149, + 0.8599268392047722, + null, + 0.8336885167043149, + 0.8508124987550889, + null, + 0.8336885167043149, + 0.8842114977564064, + null, + 0.5944498275635773, + 0.5216765314868881, + null, + 0.5944498275635773, + 0.6001026871900049, + null, + 0.5944498275635773, + 0.6012106694454529, + null, + 0.5944498275635773, + 0.4898861106787329, + null, + 0.5944498275635773, + 0.5204579980957379, + null, + 0.5944498275635773, + 0.6352288779182178, + null, + 0.5944498275635773, + 0.6648266103848882, + null, + 0.5944498275635773, + 0.6072525121642058, + null, + 0.2373268562908326, + 0.23741932367240448, + null, + 0.2373268562908326, + 0.33811323660241943, + null, + 0.2373268562908326, + 0.17542400609184483, + null, + 0.2373268562908326, + 0.17619771419691865, + null, + 0.2373268562908326, + 0.1278305132468397, + null, + 0.2373268562908326, + 0.21532966919867302, + null, + 0.2373268562908326, + 0.2695720924906413, + null, + 0.2373268562908326, + 0.24454670425362057, + null, + 0.2373268562908326, + 0.20002447568886628, + null, + 0.2373268562908326, + 0.3202314429055858, + null, + 0.2373268562908326, + 0.1341994714416056, + null, + 0.2373268562908326, + 0.3169605131706372, + null, + 0.2373268562908326, + 0.29050814087118004, + null, + 0.2373268562908326, + 0.32345881810688737, + null, + 0.23741932367240448, + 0.32127102230894566, + null, + 0.23741932367240448, + 0.2381682330796122, + null, + 0.23741932367240448, + 0.17296378957033465, + null, + 0.23741932367240448, + 0.24033413659841596, + null, + 0.23741932367240448, + 0.2981410655965283, + null, + 0.23741932367240448, + 0.3199684158322815, + null, + 0.23741932367240448, + 0.2660491488293679, + null, + 0.23741932367240448, + 0.249116699886752, + null, + 0.23741932367240448, + 0.23700988477155205, + null, + 0.23741932367240448, + 0.29050814087118004, + null, + 0.23741932367240448, + 0.2318219208408404, + null, + 0.32127102230894566, + 0.39453602200590676, + null, + 0.32127102230894566, + 0.2381682330796122, + null, + 0.32127102230894566, + 0.3309683982450944, + null, + 0.32127102230894566, + 0.24033413659841596, + null, + 0.32127102230894566, + 0.2981410655965283, + null, + 0.32127102230894566, + 0.3199684158322815, + null, + 0.32127102230894566, + 0.3355480553373167, + null, + 0.32127102230894566, + 0.2660491488293679, + null, + 0.32127102230894566, + 0.3635517670405215, + null, + 0.32127102230894566, + 0.249116699886752, + null, + 0.32127102230894566, + 0.23700988477155205, + null, + 0.32127102230894566, + 0.28871122138225125, + null, + 0.32127102230894566, + 0.42203254876563234, + null, + 0.32127102230894566, + 0.2318219208408404, + null, + 0.3661437355856225, + 0.3343459796676115, + null, + 0.3661437355856225, + 0.4307004647175262, + null, + 0.3661437355856225, + 0.40557198035837094, + null, + 0.3661437355856225, + 0.4834545718278357, + null, + 0.3661437355856225, + 0.4847615611240751, + null, + 0.3661437355856225, + 0.32266487999330984, + null, + 0.3661437355856225, + 0.4318165589087314, + null, + 0.3661437355856225, + 0.3340702546567942, + null, + 0.7791505090281524, + 0.8520196094107113, + null, + 0.7791505090281524, + 0.8848427298858184, + null, + 0.3648985367210805, + 0.3343459796676115, + null, + 0.3648985367210805, + 0.4208812619135248, + null, + 0.3648985367210805, + 0.4307004647175262, + null, + 0.3648985367210805, + 0.3900960314334032, + null, + 0.3648985367210805, + 0.3098874271134545, + null, + 0.3648985367210805, + 0.32266487999330984, + null, + 0.3648985367210805, + 0.4295667428124167, + null, + 0.3648985367210805, + 0.35350564895305514, + null, + 0.3648985367210805, + 0.31541428705224306, + null, + 0.3648985367210805, + 0.2693681584998491, + null, + 0.3648985367210805, + 0.42641694849778966, + null, + 0.3648985367210805, + 0.3333136626479075, + null, + 0.6244837238804738, + 0.5850986908522726, + null, + 0.6244837238804738, + 0.6267294109959968, + null, + 0.6244837238804738, + 0.5221172076712435, + null, + 0.6244837238804738, + 0.5717872069066212, + null, + 0.6244837238804738, + 0.7302384542961842, + null, + 0.6244837238804738, + 0.6710484758334021, + null, + 0.6244837238804738, + 0.5492873750243871, + null, + 0.6244837238804738, + 0.6201266549140614, + null, + 0.6244837238804738, + 0.5752985482362863, + null, + 0.9012137046519791, + 0.8622415881936324, + null, + 0.9012137046519791, + 0.8350595230795331, + null, + 0.5219101415039136, + 0.4307004647175262, + null, + 0.5219101415039136, + 0.4834545718278357, + null, + 0.5219101415039136, + 0.4847615611240751, + null, + 0.5219101415039136, + 0.4295667428124167, + null, + 0.5219101415039136, + 0.5144551437666581, + null, + 0.5219101415039136, + 0.42641694849778966, + null, + 0.5219101415039136, + 0.6014235590484225, + null, + 0.5219101415039136, + 0.4868902788925622, + null, + 0.39453602200590676, + 0.3309683982450944, + null, + 0.39453602200590676, + 0.2981410655965283, + null, + 0.39453602200590676, + 0.3199684158322815, + null, + 0.39453602200590676, + 0.45431497833000367, + null, + 0.39453602200590676, + 0.42052616285893474, + null, + 0.39453602200590676, + 0.4107398412471005, + null, + 0.39453602200590676, + 0.3635517670405215, + null, + 0.39453602200590676, + 0.42203254876563234, + null, + 0.2009582712064717, + 0.20619722773579274, + null, + 0.2009582712064717, + 0.3098874271134545, + null, + 0.2009582712064717, + 0.15069304516745607, + null, + 0.2009582712064717, + 0.31541428705224306, + null, + 0.2009582712064717, + 0.24013807075121119, + null, + 0.2009582712064717, + 0.2693681584998491, + null, + 0.2009582712064717, + 0.22993075379681738, + null, + 0.2009582712064717, + 0.09959517902538939, + null, + 0.04224314617430658, + 0.05938145280899054, + null, + 0.04224314617430658, + 0.04283815208078323, + null, + 0.04224314617430658, + 0.010366221042083845, + null, + 0.04224314617430658, + 0.10782775946098799, + null, + 0.04224314617430658, + 0.03395115206665145, + null, + 0.04224314617430658, + 0.05477321631284726, + null, + 0.2381682330796122, + 0.3309683982450944, + null, + 0.2381682330796122, + 0.17296378957033465, + null, + 0.2381682330796122, + 0.24033413659841596, + null, + 0.2381682330796122, + 0.2981410655965283, + null, + 0.2381682330796122, + 0.3355480553373167, + null, + 0.2381682330796122, + 0.2660491488293679, + null, + 0.2381682330796122, + 0.249116699886752, + null, + 0.2381682330796122, + 0.23700988477155205, + null, + 0.2381682330796122, + 0.28871122138225125, + null, + 0.2381682330796122, + 0.2002886163837997, + null, + 0.2381682330796122, + 0.13201947050262697, + null, + 0.2381682330796122, + 0.2318219208408404, + null, + 0.2381682330796122, + 0.20307680326083377, + null, + 0.33811323660241943, + 0.31304614249644347, + null, + 0.33811323660241943, + 0.2695720924906413, + null, + 0.33811323660241943, + 0.24454670425362057, + null, + 0.33811323660241943, + 0.4500538798110242, + null, + 0.33811323660241943, + 0.4140065537970282, + null, + 0.33811323660241943, + 0.2880647319459674, + null, + 0.33811323660241943, + 0.3202314429055858, + null, + 0.33811323660241943, + 0.3169605131706372, + null, + 0.33811323660241943, + 0.32345881810688737, + null, + 0.5216765314868881, + 0.6001026871900049, + null, + 0.5216765314868881, + 0.6012106694454529, + null, + 0.5216765314868881, + 0.4898861106787329, + null, + 0.5216765314868881, + 0.5204579980957379, + null, + 0.5216765314868881, + 0.4500538798110242, + null, + 0.5216765314868881, + 0.42052616285893474, + null, + 0.5216765314868881, + 0.4140065537970282, + null, + 0.5216765314868881, + 0.4937592635708411, + null, + 0.6001026871900049, + 0.6012106694454529, + null, + 0.6001026871900049, + 0.6705222836834548, + null, + 0.6001026871900049, + 0.5204579980957379, + null, + 0.6001026871900049, + 0.6648266103848882, + null, + 0.991844460003468, + 0.9727770125665405, + null, + 0.991844460003468, + 0.938767234846119, + null, + 0.991844460003468, + 0.9874110419208606, + null, + 0.991844460003468, + 0.9328536520894143, + null, + 0.991844460003468, + 0.9078978130468089, + null, + 0.991844460003468, + 0.9513646744432486, + null, + 0.3343459796676115, + 0.4307004647175262, + null, + 0.3343459796676115, + 0.3900960314334032, + null, + 0.3343459796676115, + 0.3098874271134545, + null, + 0.3343459796676115, + 0.32266487999330984, + null, + 0.3343459796676115, + 0.4295667428124167, + null, + 0.3343459796676115, + 0.35350564895305514, + null, + 0.3343459796676115, + 0.31541428705224306, + null, + 0.3343459796676115, + 0.24013807075121119, + null, + 0.3343459796676115, + 0.2693681584998491, + null, + 0.3343459796676115, + 0.3333136626479075, + null, + 0.8957623407464501, + 0.9727770125665405, + null, + 0.8957623407464501, + 0.8423383207045981, + null, + 0.8957623407464501, + 0.8791466031622056, + null, + 0.8957623407464501, + 0.8151159149468827, + null, + 0.8957623407464501, + 0.922341377568881, + null, + 0.8957623407464501, + 0.8821215709600496, + null, + 0.8957623407464501, + 0.9328536520894143, + null, + 0.8957623407464501, + 0.9344432405222354, + null, + 0.8957623407464501, + 0.9642772106357639, + null, + 0.8957623407464501, + 0.8157570218353161, + null, + 0.8957623407464501, + 0.7925454632595156, + null, + 0.8957623407464501, + 0.888980486534156, + null, + 0.4208812619135248, + 0.3900960314334032, + null, + 0.4208812619135248, + 0.3098874271134545, + null, + 0.4208812619135248, + 0.4295667428124167, + null, + 0.4208812619135248, + 0.35350564895305514, + null, + 0.4208812619135248, + 0.4467311570808764, + null, + 0.4208812619135248, + 0.5144551437666581, + null, + 0.4208812619135248, + 0.4421375373865315, + null, + 0.4208812619135248, + 0.42641694849778966, + null, + 0.4208812619135248, + 0.3333136626479075, + null, + 0.4208812619135248, + 0.4868902788925622, + null, + 0.31304614249644347, + 0.2697998035002954, + null, + 0.31304614249644347, + 0.2695720924906413, + null, + 0.31304614249644347, + 0.24454670425362057, + null, + 0.31304614249644347, + 0.20619722773579274, + null, + 0.31304614249644347, + 0.3098874271134545, + null, + 0.31304614249644347, + 0.2880647319459674, + null, + 0.31304614249644347, + 0.3202314429055858, + null, + 0.31304614249644347, + 0.22993075379681738, + null, + 0.31304614249644347, + 0.3169605131706372, + null, + 0.31304614249644347, + 0.32345881810688737, + null, + 0.6773365837969099, + 0.6628083689885368, + null, + 0.6773365837969099, + 0.6160873747407943, + null, + 0.6773365837969099, + 0.7537809293531343, + null, + 0.6773365837969099, + 0.5634679987017406, + null, + 0.6773365837969099, + 0.6012106694454529, + null, + 0.6773365837969099, + 0.6352288779182178, + null, + 0.6773365837969099, + 0.5981086798045652, + null, + 0.6773365837969099, + 0.6648266103848882, + null, + 0.6773365837969099, + 0.6072525121642058, + null, + 0.4307004647175262, + 0.40557198035837094, + null, + 0.4307004647175262, + 0.4834545718278357, + null, + 0.4307004647175262, + 0.4847615611240751, + null, + 0.4307004647175262, + 0.32266487999330984, + null, + 0.4307004647175262, + 0.4295667428124167, + null, + 0.4307004647175262, + 0.35350564895305514, + null, + 0.4307004647175262, + 0.4318165589087314, + null, + 0.4307004647175262, + 0.5097617399826666, + null, + 0.3309683982450944, + 0.24033413659841596, + null, + 0.3309683982450944, + 0.2981410655965283, + null, + 0.3309683982450944, + 0.3199684158322815, + null, + 0.3309683982450944, + 0.3355480553373167, + null, + 0.3309683982450944, + 0.2660491488293679, + null, + 0.3309683982450944, + 0.3635517670405215, + null, + 0.3309683982450944, + 0.249116699886752, + null, + 0.3309683982450944, + 0.23700988477155205, + null, + 0.3309683982450944, + 0.28871122138225125, + null, + 0.3309683982450944, + 0.42203254876563234, + null, + 0.3309683982450944, + 0.2318219208408404, + null, + 0.2697998035002954, + 0.17542400609184483, + null, + 0.2697998035002954, + 0.2695720924906413, + null, + 0.2697998035002954, + 0.24454670425362057, + null, + 0.2697998035002954, + 0.20619722773579274, + null, + 0.2697998035002954, + 0.3098874271134545, + null, + 0.2697998035002954, + 0.2880647319459674, + null, + 0.2697998035002954, + 0.22993075379681738, + null, + 0.2697998035002954, + 0.32345881810688737, + null, + 0.9727770125665405, + 0.922341377568881, + null, + 0.9727770125665405, + 0.8821215709600496, + null, + 0.9727770125665405, + 0.9328536520894143, + null, + 0.9727770125665405, + 0.9642772106357639, + null, + 0.40557198035837094, + 0.4834545718278357, + null, + 0.40557198035837094, + 0.4847615611240751, + null, + 0.40557198035837094, + 0.32266487999330984, + null, + 0.40557198035837094, + 0.40395348439090084, + null, + 0.40557198035837094, + 0.4318165589087314, + null, + 0.40557198035837094, + 0.3340702546567942, + null, + 0.40557198035837094, + 0.4248880785102581, + null, + 0.40557198035837094, + 0.5097617399826666, + null, + 0.35532572275494023, + 0.24028581536328997, + null, + 0.35532572275494023, + 0.3192831323823997, + null, + 0.35532572275494023, + 0.2529891644068947, + null, + 0.35532572275494023, + 0.41535454584101794, + null, + 0.35532572275494023, + 0.40395348439090084, + null, + 0.35532572275494023, + 0.4248880785102581, + null, + 0.35532572275494023, + 0.29119156039108685, + null, + 0.35532572275494023, + 0.24102842320743, + null, + 0.5850986908522726, + 0.6267294109959968, + null, + 0.5850986908522726, + 0.5221172076712435, + null, + 0.5850986908522726, + 0.5717872069066212, + null, + 0.5850986908522726, + 0.5492873750243871, + null, + 0.5850986908522726, + 0.6201266549140614, + null, + 0.5850986908522726, + 0.5752985482362863, + null, + 0.5850986908522726, + 0.5097617399826666, + null, + 0.17296378957033465, + 0.24033413659841596, + null, + 0.17296378957033465, + 0.2660491488293679, + null, + 0.17296378957033465, + 0.10782775946098799, + null, + 0.17296378957033465, + 0.249116699886752, + null, + 0.17296378957033465, + 0.23700988477155205, + null, + 0.17296378957033465, + 0.28871122138225125, + null, + 0.17296378957033465, + 0.2002886163837997, + null, + 0.17296378957033465, + 0.13201947050262697, + null, + 0.17296378957033465, + 0.2318219208408404, + null, + 0.17296378957033465, + 0.20307680326083377, + null, + 0.6628083689885368, + 0.6160873747407943, + null, + 0.6628083689885368, + 0.7537809293531343, + null, + 0.6628083689885368, + 0.5634679987017406, + null, + 0.6628083689885368, + 0.6352288779182178, + null, + 0.6628083689885368, + 0.5981086798045652, + null, + 0.6628083689885368, + 0.6072525121642058, + null, + 0.6160873747407943, + 0.5186581897030644, + null, + 0.6160873747407943, + 0.5634679987017406, + null, + 0.6160873747407943, + 0.6012106694454529, + null, + 0.6160873747407943, + 0.6352288779182178, + null, + 0.6160873747407943, + 0.5981086798045652, + null, + 0.6160873747407943, + 0.6648266103848882, + null, + 0.6160873747407943, + 0.6072525121642058, + null, + 0.6160873747407943, + 0.5260776190209286, + null, + 0.025297953521542405, + 0.06016942899581168, + null, + 0.025297953521542405, + 0.055897802218322856, + null, + 0.025297953521542405, + 0.09959517902538939, + null, + 0.24028581536328997, + 0.3192831323823997, + null, + 0.24028581536328997, + 0.1333966979371528, + null, + 0.24028581536328997, + 0.2529891644068947, + null, + 0.24028581536328997, + 0.29119156039108685, + null, + 0.24028581536328997, + 0.24102842320743, + null, + 0.5186581897030644, + 0.5634679987017406, + null, + 0.5186581897030644, + 0.6012106694454529, + null, + 0.5186581897030644, + 0.4898861106787329, + null, + 0.5186581897030644, + 0.45431497833000367, + null, + 0.5186581897030644, + 0.6352288779182178, + null, + 0.5186581897030644, + 0.5981086798045652, + null, + 0.5186581897030644, + 0.6072525121642058, + null, + 0.5186581897030644, + 0.42203254876563234, + null, + 0.5186581897030644, + 0.5260776190209286, + null, + 0.8423383207045981, + 0.8151159149468827, + null, + 0.8423383207045981, + 0.7334929583472656, + null, + 0.8423383207045981, + 0.8821215709600496, + null, + 0.8423383207045981, + 0.9328536520894143, + null, + 0.8423383207045981, + 0.7834166246251234, + null, + 0.8423383207045981, + 0.9078978130468089, + null, + 0.8423383207045981, + 0.7925454632595156, + null, + 0.8423383207045981, + 0.8508124987550889, + null, + 0.7537809293531343, + 0.8622415881936324, + null, + 0.7537809293531343, + 0.8350595230795331, + null, + 0.3192831323823997, + 0.2529891644068947, + null, + 0.3192831323823997, + 0.41535454584101794, + null, + 0.3192831323823997, + 0.40395348439090084, + null, + 0.3192831323823997, + 0.4248880785102581, + null, + 0.3192831323823997, + 0.29119156039108685, + null, + 0.3192831323823997, + 0.24102842320743, + null, + 0.17542400609184483, + 0.055894273053114896, + null, + 0.17542400609184483, + 0.14933184162295132, + null, + 0.17542400609184483, + 0.17619771419691865, + null, + 0.17542400609184483, + 0.1278305132468397, + null, + 0.17542400609184483, + 0.21532966919867302, + null, + 0.17542400609184483, + 0.0731473655342364, + null, + 0.17542400609184483, + 0.2695720924906413, + null, + 0.17542400609184483, + 0.09533319097359638, + null, + 0.17542400609184483, + 0.24454670425362057, + null, + 0.17542400609184483, + 0.20002447568886628, + null, + 0.17542400609184483, + 0.20619722773579274, + null, + 0.17542400609184483, + 0.2880647319459674, + null, + 0.17542400609184483, + 0.1341994714416056, + null, + 0.17542400609184483, + 0.22993075379681738, + null, + 0.008409380348177398, + 0.04149975738749545, + null, + 0.938767234846119, + 0.9874110419208606, + null, + 0.938767234846119, + 0.8867112408398291, + null, + 0.938767234846119, + 0.9298960866412943, + null, + 0.938767234846119, + 0.9078978130468089, + null, + 0.938767234846119, + 0.9958360522915445, + null, + 0.938767234846119, + 0.8508124987550889, + null, + 0.938767234846119, + 0.8842114977564064, + null, + 0.938767234846119, + 0.9513646744432486, + null, + 0.24033413659841596, + 0.2981410655965283, + null, + 0.24033413659841596, + 0.3199684158322815, + null, + 0.24033413659841596, + 0.3355480553373167, + null, + 0.24033413659841596, + 0.2660491488293679, + null, + 0.24033413659841596, + 0.249116699886752, + null, + 0.24033413659841596, + 0.23700988477155205, + null, + 0.24033413659841596, + 0.28871122138225125, + null, + 0.24033413659841596, + 0.2002886163837997, + null, + 0.24033413659841596, + 0.13201947050262697, + null, + 0.24033413659841596, + 0.2318219208408404, + null, + 0.24033413659841596, + 0.20307680326083377, + null, + 0.8791466031622056, + 0.922341377568881, + null, + 0.8791466031622056, + 0.8821215709600496, + null, + 0.8791466031622056, + 0.9542382277667263, + null, + 0.8791466031622056, + 0.9024846524956353, + null, + 0.8791466031622056, + 0.9344432405222354, + null, + 0.8791466031622056, + 0.9642772106357639, + null, + 0.8791466031622056, + 0.8157570218353161, + null, + 0.8791466031622056, + 0.888980486534156, + null, + 0.5634679987017406, + 0.6012106694454529, + null, + 0.5634679987017406, + 0.6352288779182178, + null, + 0.5634679987017406, + 0.5981086798045652, + null, + 0.5634679987017406, + 0.6072525121642058, + null, + 0.5634679987017406, + 0.5260776190209286, + null, + 0.05938145280899054, + 0.04283815208078323, + null, + 0.05938145280899054, + 0.10782775946098799, + null, + 0.05938145280899054, + 0.03395115206665145, + null, + 0.05938145280899054, + 0.05477321631284726, + null, + 0.05938145280899054, + 0.1341994714416056, + null, + 0.6012106694454529, + 0.4898861106787329, + null, + 0.6012106694454529, + 0.5204579980957379, + null, + 0.6012106694454529, + 0.6352288779182178, + null, + 0.6012106694454529, + 0.6648266103848882, + null, + 0.6012106694454529, + 0.6072525121642058, + null, + 0.6705222836834548, + 0.7454337953380579, + null, + 0.6705222836834548, + 0.7077207700167599, + null, + 0.6705222836834548, + 0.7005910562446783, + null, + 0.6705222836834548, + 0.5603277981830703, + null, + 0.3900960314334032, + 0.3098874271134545, + null, + 0.3900960314334032, + 0.4295667428124167, + null, + 0.3900960314334032, + 0.35350564895305514, + null, + 0.3900960314334032, + 0.31541428705224306, + null, + 0.3900960314334032, + 0.4467311570808764, + null, + 0.3900960314334032, + 0.4421375373865315, + null, + 0.3900960314334032, + 0.42641694849778966, + null, + 0.3900960314334032, + 0.3333136626479075, + null, + 0.3900960314334032, + 0.4868902788925622, + null, + 0.055894273053114896, + 0.14933184162295132, + null, + 0.055894273053114896, + 0.1278305132468397, + null, + 0.055894273053114896, + 0.0731473655342364, + null, + 0.055894273053114896, + 0.09533319097359638, + null, + 0.055894273053114896, + 0.055897802218322856, + null, + 0.055894273053114896, + 0.04153202488293273, + null, + 0.055894273053114896, + 0.06013197669987258, + null, + 0.055894273053114896, + 0.040563128366188694, + null, + 0.14933184162295132, + 0.17619771419691865, + null, + 0.14933184162295132, + 0.1278305132468397, + null, + 0.14933184162295132, + 0.21532966919867302, + null, + 0.14933184162295132, + 0.0731473655342364, + null, + 0.14933184162295132, + 0.09533319097359638, + null, + 0.14933184162295132, + 0.24454670425362057, + null, + 0.14933184162295132, + 0.20002447568886628, + null, + 0.14933184162295132, + 0.20619722773579274, + null, + 0.14933184162295132, + 0.055897802218322856, + null, + 0.14933184162295132, + 0.04153202488293273, + null, + 0.14933184162295132, + 0.06013197669987258, + null, + 0.14933184162295132, + 0.22993075379681738, + null, + 0.14933184162295132, + 0.040563128366188694, + null, + 0.8151159149468827, + 0.7334929583472656, + null, + 0.8151159149468827, + 0.8821215709600496, + null, + 0.8151159149468827, + 0.9328536520894143, + null, + 0.8151159149468827, + 0.7834166246251234, + null, + 0.8151159149468827, + 0.7925454632595156, + null, + 0.8151159149468827, + 0.8508124987550889, + null, + 0.17619771419691865, + 0.1278305132468397, + null, + 0.17619771419691865, + 0.21532966919867302, + null, + 0.17619771419691865, + 0.0731473655342364, + null, + 0.17619771419691865, + 0.2695720924906413, + null, + 0.17619771419691865, + 0.09533319097359638, + null, + 0.17619771419691865, + 0.24454670425362057, + null, + 0.17619771419691865, + 0.20002447568886628, + null, + 0.17619771419691865, + 0.1341994714416056, + null, + 0.17619771419691865, + 0.06013197669987258, + null, + 0.2981410655965283, + 0.3199684158322815, + null, + 0.2981410655965283, + 0.3355480553373167, + null, + 0.2981410655965283, + 0.2660491488293679, + null, + 0.2981410655965283, + 0.3635517670405215, + null, + 0.2981410655965283, + 0.249116699886752, + null, + 0.2981410655965283, + 0.23700988477155205, + null, + 0.2981410655965283, + 0.28871122138225125, + null, + 0.2981410655965283, + 0.42203254876563234, + null, + 0.2981410655965283, + 0.2002886163837997, + null, + 0.2981410655965283, + 0.29050814087118004, + null, + 0.2981410655965283, + 0.2318219208408404, + null, + 0.2981410655965283, + 0.20307680326083377, + null, + 0.7334929583472656, + 0.6512622326935055, + null, + 0.7334929583472656, + 0.7205270186163313, + null, + 0.7334929583472656, + 0.7834166246251234, + null, + 0.7334929583472656, + 0.6217058876501556, + null, + 0.7334929583472656, + 0.7925454632595156, + null, + 0.7334929583472656, + 0.6714278208298593, + null, + 0.04283815208078323, + 0.010366221042083845, + null, + 0.04283815208078323, + 0.10782775946098799, + null, + 0.04283815208078323, + 0.03395115206665145, + null, + 0.04283815208078323, + 0.05477321631284726, + null, + 0.04283815208078323, + 0.13201947050262697, + null, + 0.922341377568881, + 0.8821215709600496, + null, + 0.922341377568881, + 0.9542382277667263, + null, + 0.922341377568881, + 0.9328536520894143, + null, + 0.922341377568881, + 0.9961038345306213, + null, + 0.922341377568881, + 0.9344432405222354, + null, + 0.922341377568881, + 0.9642772106357639, + null, + 0.922341377568881, + 0.8157570218353161, + null, + 0.922341377568881, + 0.888980486534156, + null, + 0.3199684158322815, + 0.42052616285893474, + null, + 0.3199684158322815, + 0.2660491488293679, + null, + 0.3199684158322815, + 0.4107398412471005, + null, + 0.3199684158322815, + 0.3635517670405215, + null, + 0.3199684158322815, + 0.249116699886752, + null, + 0.3199684158322815, + 0.23700988477155205, + null, + 0.3199684158322815, + 0.42203254876563234, + null, + 0.3199684158322815, + 0.29050814087118004, + null, + 0.1278305132468397, + 0.21532966919867302, + null, + 0.1278305132468397, + 0.0731473655342364, + null, + 0.1278305132468397, + 0.09533319097359638, + null, + 0.1278305132468397, + 0.24454670425362057, + null, + 0.1278305132468397, + 0.20002447568886628, + null, + 0.1278305132468397, + 0.04153202488293273, + null, + 0.1278305132468397, + 0.05477321631284726, + null, + 0.1278305132468397, + 0.1341994714416056, + null, + 0.1278305132468397, + 0.06013197669987258, + null, + 0.1278305132468397, + 0.040563128366188694, + null, + 0.21532966919867302, + 0.2695720924906413, + null, + 0.21532966919867302, + 0.09533319097359638, + null, + 0.21532966919867302, + 0.24454670425362057, + null, + 0.21532966919867302, + 0.20002447568886628, + null, + 0.21532966919867302, + 0.3202314429055858, + null, + 0.21532966919867302, + 0.1341994714416056, + null, + 0.21532966919867302, + 0.3169605131706372, + null, + 0.21532966919867302, + 0.29050814087118004, + null, + 0.21532966919867302, + 0.32345881810688737, + null, + 0.0731473655342364, + 0.09533319097359638, + null, + 0.0731473655342364, + 0.055897802218322856, + null, + 0.0731473655342364, + 0.04153202488293273, + null, + 0.0731473655342364, + 0.05477321631284726, + null, + 0.0731473655342364, + 0.1341994714416056, + null, + 0.0731473655342364, + 0.06013197669987258, + null, + 0.0731473655342364, + 0.040563128366188694, + null, + 0.4898861106787329, + 0.45431497833000367, + null, + 0.4898861106787329, + 0.5204579980957379, + null, + 0.4898861106787329, + 0.42052616285893474, + null, + 0.4898861106787329, + 0.4140065537970282, + null, + 0.4898861106787329, + 0.4107398412471005, + null, + 0.2695720924906413, + 0.24454670425362057, + null, + 0.2695720924906413, + 0.20002447568886628, + null, + 0.2695720924906413, + 0.2880647319459674, + null, + 0.2695720924906413, + 0.3202314429055858, + null, + 0.2695720924906413, + 0.3169605131706372, + null, + 0.2695720924906413, + 0.32345881810688737, + null, + 0.09533319097359638, + 0.20002447568886628, + null, + 0.09533319097359638, + 0.055897802218322856, + null, + 0.09533319097359638, + 0.04153202488293273, + null, + 0.09533319097359638, + 0.05477321631284726, + null, + 0.09533319097359638, + 0.1341994714416056, + null, + 0.09533319097359638, + 0.06013197669987258, + null, + 0.09533319097359638, + 0.040563128366188694, + null, + 0.9874110419208606, + 0.8867112408398291, + null, + 0.9874110419208606, + 0.9298960866412943, + null, + 0.9874110419208606, + 0.9078978130468089, + null, + 0.9874110419208606, + 0.9958360522915445, + null, + 0.9874110419208606, + 0.9513646744432486, + null, + 0.1333966979371528, + 0.2529891644068947, + null, + 0.1333966979371528, + 0.04149975738749545, + null, + 0.1333966979371528, + 0.16781555203357146, + null, + 0.1333966979371528, + 0.24102842320743, + null, + 0.1333966979371528, + 0.19048093242734687, + null, + 0.1333966979371528, + 0.1294716874165911, + null, + 0.2529891644068947, + 0.29119156039108685, + null, + 0.2529891644068947, + 0.24102842320743, + null, + 0.2529891644068947, + 0.19048093242734687, + null, + 0.45431497833000367, + 0.5204579980957379, + null, + 0.45431497833000367, + 0.42052616285893474, + null, + 0.45431497833000367, + 0.4107398412471005, + null, + 0.45431497833000367, + 0.3635517670405215, + null, + 0.45431497833000367, + 0.42203254876563234, + null, + 0.45431497833000367, + 0.5260776190209286, + null, + 0.24454670425362057, + 0.20002447568886628, + null, + 0.24454670425362057, + 0.2880647319459674, + null, + 0.24454670425362057, + 0.3202314429055858, + null, + 0.24454670425362057, + 0.22993075379681738, + null, + 0.24454670425362057, + 0.3169605131706372, + null, + 0.24454670425362057, + 0.32345881810688737, + null, + 0.20002447568886628, + 0.3202314429055858, + null, + 0.20002447568886628, + 0.1341994714416056, + null, + 0.20002447568886628, + 0.3169605131706372, + null, + 0.6267294109959968, + 0.5221172076712435, + null, + 0.6267294109959968, + 0.7205270186163313, + null, + 0.6267294109959968, + 0.5717872069066212, + null, + 0.6267294109959968, + 0.7302384542961842, + null, + 0.6267294109959968, + 0.6710484758334021, + null, + 0.6267294109959968, + 0.5492873750243871, + null, + 0.6267294109959968, + 0.6201266549140614, + null, + 0.6267294109959968, + 0.5752985482362863, + null, + 0.5221172076712435, + 0.41535454584101794, + null, + 0.5221172076712435, + 0.5717872069066212, + null, + 0.5221172076712435, + 0.5492873750243871, + null, + 0.5221172076712435, + 0.6201266549140614, + null, + 0.5221172076712435, + 0.4248880785102581, + null, + 0.6512622326935055, + 0.6217058876501556, + null, + 0.6512622326935055, + 0.6714278208298593, + null, + 0.3355480553373167, + 0.2660491488293679, + null, + 0.3355480553373167, + 0.249116699886752, + null, + 0.3355480553373167, + 0.28871122138225125, + null, + 0.3355480553373167, + 0.42203254876563234, + null, + 0.3355480553373167, + 0.2318219208408404, + null, + 0.4834545718278357, + 0.4847615611240751, + null, + 0.4834545718278357, + 0.4318165589087314, + null, + 0.4834545718278357, + 0.5097617399826666, + null, + 0.4847615611240751, + 0.4318165589087314, + null, + 0.4847615611240751, + 0.5097617399826666, + null, + 0.20619722773579274, + 0.3098874271134545, + null, + 0.20619722773579274, + 0.2880647319459674, + null, + 0.20619722773579274, + 0.24013807075121119, + null, + 0.20619722773579274, + 0.22993075379681738, + null, + 0.20619722773579274, + 0.09959517902538939, + null, + 0.9419075807648644, + 0.8848427298858184, + null, + 0.9419075807648644, + 0.9756800437762957, + null, + 0.3098874271134545, + 0.4295667428124167, + null, + 0.3098874271134545, + 0.35350564895305514, + null, + 0.3098874271134545, + 0.31541428705224306, + null, + 0.3098874271134545, + 0.2880647319459674, + null, + 0.3098874271134545, + 0.24013807075121119, + null, + 0.3098874271134545, + 0.2693681584998491, + null, + 0.3098874271134545, + 0.42641694849778966, + null, + 0.3098874271134545, + 0.3333136626479075, + null, + 0.3098874271134545, + 0.22993075379681738, + null, + 0.04149975738749545, + 0.019989772968585173, + null, + 0.04149975738749545, + 0.1294716874165911, + null, + 0.32266487999330984, + 0.31541428705224306, + null, + 0.32266487999330984, + 0.4318165589087314, + null, + 0.32266487999330984, + 0.2693681584998491, + null, + 0.32266487999330984, + 0.3340702546567942, + null, + 0.4295667428124167, + 0.35350564895305514, + null, + 0.4295667428124167, + 0.31541428705224306, + null, + 0.4295667428124167, + 0.4467311570808764, + null, + 0.4295667428124167, + 0.5144551437666581, + null, + 0.4295667428124167, + 0.4421375373865315, + null, + 0.4295667428124167, + 0.42641694849778966, + null, + 0.4295667428124167, + 0.3333136626479075, + null, + 0.4295667428124167, + 0.4868902788925622, + null, + 0.35350564895305514, + 0.31541428705224306, + null, + 0.35350564895305514, + 0.24013807075121119, + null, + 0.35350564895305514, + 0.2693681584998491, + null, + 0.35350564895305514, + 0.42641694849778966, + null, + 0.35350564895305514, + 0.3333136626479075, + null, + 0.15069304516745607, + 0.06016942899581168, + null, + 0.15069304516745607, + 0.24013807075121119, + null, + 0.15069304516745607, + 0.2693681584998491, + null, + 0.15069304516745607, + 0.10059463740220753, + null, + 0.15069304516745607, + 0.09959517902538939, + null, + 0.41535454584101794, + 0.40395348439090084, + null, + 0.41535454584101794, + 0.4248880785102581, + null, + 0.41535454584101794, + 0.29119156039108685, + null, + 0.8821215709600496, + 0.9328536520894143, + null, + 0.8821215709600496, + 0.9344432405222354, + null, + 0.8821215709600496, + 0.9642772106357639, + null, + 0.8821215709600496, + 0.8157570218353161, + null, + 0.8821215709600496, + 0.7925454632595156, + null, + 0.8821215709600496, + 0.888980486534156, + null, + 0.9542382277667263, + 0.9024846524956353, + null, + 0.9542382277667263, + 0.9961038345306213, + null, + 0.9542382277667263, + 0.9344432405222354, + null, + 0.9542382277667263, + 0.9642772106357639, + null, + 0.9542382277667263, + 0.888980486534156, + null, + 0.9542382277667263, + 0.9810704436128125, + null, + 0.7205270186163313, + 0.7302384542961842, + null, + 0.7205270186163313, + 0.8157570218353161, + null, + 0.7205270186163313, + 0.7925454632595156, + null, + 0.31541428705224306, + 0.24013807075121119, + null, + 0.31541428705224306, + 0.2693681584998491, + null, + 0.31541428705224306, + 0.3333136626479075, + null, + 0.010366221042083845, + 0.10782775946098799, + null, + 0.010366221042083845, + 0.03395115206665145, + null, + 0.010366221042083845, + 0.13201947050262697, + null, + 0.06016942899581168, + 0.055897802218322856, + null, + 0.06016942899581168, + 0.10059463740220753, + null, + 0.06016942899581168, + 0.09959517902538939, + null, + 0.8867112408398291, + 0.9298960866412943, + null, + 0.8867112408398291, + 0.8599268392047722, + null, + 0.8867112408398291, + 0.9078978130468089, + null, + 0.8867112408398291, + 0.8508124987550889, + null, + 0.8867112408398291, + 0.8842114977564064, + null, + 0.8867112408398291, + 0.9513646744432486, + null, + 0.5204579980957379, + 0.42052616285893474, + null, + 0.5204579980957379, + 0.4140065537970282, + null, + 0.5204579980957379, + 0.4107398412471005, + null, + 0.5204579980957379, + 0.4937592635708411, + null, + 0.4500538798110242, + 0.4140065537970282, + null, + 0.4500538798110242, + 0.4467311570808764, + null, + 0.4500538798110242, + 0.4421375373865315, + null, + 0.4500538798110242, + 0.4937592635708411, + null, + 0.4500538798110242, + 0.5603277981830703, + null, + 0.4500538798110242, + 0.547451424618544, + null, + 0.40395348439090084, + 0.3340702546567942, + null, + 0.40395348439090084, + 0.4248880785102581, + null, + 0.5717872069066212, + 0.6710484758334021, + null, + 0.5717872069066212, + 0.5492873750243871, + null, + 0.5717872069066212, + 0.6201266549140614, + null, + 0.42052616285893474, + 0.4140065537970282, + null, + 0.42052616285893474, + 0.4107398412471005, + null, + 0.42052616285893474, + 0.3635517670405215, + null, + 0.2660491488293679, + 0.249116699886752, + null, + 0.2660491488293679, + 0.23700988477155205, + null, + 0.2660491488293679, + 0.28871122138225125, + null, + 0.2660491488293679, + 0.2002886163837997, + null, + 0.2660491488293679, + 0.29050814087118004, + null, + 0.2660491488293679, + 0.2318219208408404, + null, + 0.2660491488293679, + 0.20307680326083377, + null, + 0.10782775946098799, + 0.03395115206665145, + null, + 0.10782775946098799, + 0.2002886163837997, + null, + 0.10782775946098799, + 0.13201947050262697, + null, + 0.10782775946098799, + 0.20307680326083377, + null, + 0.7302384542961842, + 0.6710484758334021, + null, + 0.7302384542961842, + 0.6201266549140614, + null, + 0.8520196094107113, + 0.8848427298858184, + null, + 0.8520196094107113, + 0.9435179236599912, + null, + 0.8520196094107113, + 0.9756800437762957, + null, + 0.4140065537970282, + 0.3202314429055858, + null, + 0.4140065537970282, + 0.4107398412471005, + null, + 0.4140065537970282, + 0.3635517670405215, + null, + 0.4140065537970282, + 0.4937592635708411, + null, + 0.4140065537970282, + 0.3169605131706372, + null, + 0.4140065537970282, + 0.32345881810688737, + null, + 0.4467311570808764, + 0.5144551437666581, + null, + 0.4467311570808764, + 0.4421375373865315, + null, + 0.4467311570808764, + 0.42641694849778966, + null, + 0.4467311570808764, + 0.4868902788925622, + null, + 0.5144551437666581, + 0.4421375373865315, + null, + 0.5144551437666581, + 0.42641694849778966, + null, + 0.5144551437666581, + 0.6014235590484225, + null, + 0.5144551437666581, + 0.5603277981830703, + null, + 0.5144551437666581, + 0.4868902788925622, + null, + 0.7454337953380579, + 0.7077207700167599, + null, + 0.7454337953380579, + 0.8599268392047722, + null, + 0.7454337953380579, + 0.7005910562446783, + null, + 0.03395115206665145, + 0.05477321631284726, + null, + 0.7077207700167599, + 0.7005910562446783, + null, + 0.9024846524956353, + 0.9961038345306213, + null, + 0.9024846524956353, + 0.9344432405222354, + null, + 0.9024846524956353, + 0.888980486534156, + null, + 0.9024846524956353, + 0.9810704436128125, + null, + 0.055897802218322856, + 0.04153202488293273, + null, + 0.055897802218322856, + 0.06013197669987258, + null, + 0.055897802218322856, + 0.040563128366188694, + null, + 0.055897802218322856, + 0.09959517902538939, + null, + 0.2880647319459674, + 0.3202314429055858, + null, + 0.2880647319459674, + 0.22993075379681738, + null, + 0.2880647319459674, + 0.3169605131706372, + null, + 0.2880647319459674, + 0.32345881810688737, + null, + 0.9328536520894143, + 0.9078978130468089, + null, + 0.9328536520894143, + 0.8508124987550889, + null, + 0.9298960866412943, + 0.8599268392047722, + null, + 0.9298960866412943, + 0.9958360522915445, + null, + 0.9298960866412943, + 0.8842114977564064, + null, + 0.9298960866412943, + 0.9513646744432486, + null, + 0.6352288779182178, + 0.5981086798045652, + null, + 0.6352288779182178, + 0.6648266103848882, + null, + 0.6352288779182178, + 0.6072525121642058, + null, + 0.04153202488293273, + 0.05477321631284726, + null, + 0.04153202488293273, + 0.1341994714416056, + null, + 0.04153202488293273, + 0.06013197669987258, + null, + 0.04153202488293273, + 0.040563128366188694, + null, + 0.7834166246251234, + 0.7925454632595156, + null, + 0.7834166246251234, + 0.8508124987550889, + null, + 0.7834166246251234, + 0.6714278208298593, + null, + 0.6710484758334021, + 0.5492873750243871, + null, + 0.6710484758334021, + 0.6201266549140614, + null, + 0.3202314429055858, + 0.3169605131706372, + null, + 0.3202314429055858, + 0.32345881810688737, + null, + 0.9961038345306213, + 0.9344432405222354, + null, + 0.9961038345306213, + 0.9642772106357639, + null, + 0.9961038345306213, + 0.888980486534156, + null, + 0.9961038345306213, + 0.9810704436128125, + null, + 0.4107398412471005, + 0.3635517670405215, + null, + 0.4107398412471005, + 0.42203254876563234, + null, + 0.4107398412471005, + 0.29050814087118004, + null, + 0.24013807075121119, + 0.2693681584998491, + null, + 0.24013807075121119, + 0.3333136626479075, + null, + 0.8599268392047722, + 0.8842114977564064, + null, + 0.4318165589087314, + 0.3340702546567942, + null, + 0.4318165589087314, + 0.5097617399826666, + null, + 0.2693681584998491, + 0.3333136626479075, + null, + 0.4421375373865315, + 0.42641694849778966, + null, + 0.4421375373865315, + 0.4868902788925622, + null, + 0.5492873750243871, + 0.6201266549140614, + null, + 0.5492873750243871, + 0.5752985482362863, + null, + 0.5981086798045652, + 0.6072525121642058, + null, + 0.5981086798045652, + 0.5260776190209286, + null, + 0.3635517670405215, + 0.42203254876563234, + null, + 0.3635517670405215, + 0.29050814087118004, + null, + 0.42641694849778966, + 0.3333136626479075, + null, + 0.42641694849778966, + 0.4868902788925622, + null, + 0.6648266103848882, + 0.6072525121642058, + null, + 0.9344432405222354, + 0.9642772106357639, + null, + 0.9344432405222354, + 0.8157570218353161, + null, + 0.9344432405222354, + 0.888980486534156, + null, + 0.9344432405222354, + 0.9810704436128125, + null, + 0.249116699886752, + 0.23700988477155205, + null, + 0.249116699886752, + 0.28871122138225125, + null, + 0.249116699886752, + 0.2002886163837997, + null, + 0.249116699886752, + 0.29050814087118004, + null, + 0.249116699886752, + 0.2318219208408404, + null, + 0.249116699886752, + 0.20307680326083377, + null, + 0.6201266549140614, + 0.5752985482362863, + null, + 0.16781555203357146, + 0.19048093242734687, + null, + 0.16781555203357146, + 0.1294716874165911, + null, + 0.4937592635708411, + 0.5603277981830703, + null, + 0.4937592635708411, + 0.547451424618544, + null, + 0.9435179236599912, + 0.9958360522915445, + null, + 0.9435179236599912, + 0.9756800437762957, + null, + 0.07011604000159166, + 0.019989772968585173, + null, + 0.07011604000159166, + 0.10059463740220753, + null, + 0.07011604000159166, + 0.038844634468288675, + null, + 0.9078978130468089, + 0.8508124987550889, + null, + 0.9078978130468089, + 0.9513646744432486, + null, + 0.6072525121642058, + 0.5260776190209286, + null, + 0.23700988477155205, + 0.28871122138225125, + null, + 0.23700988477155205, + 0.2002886163837997, + null, + 0.23700988477155205, + 0.29050814087118004, + null, + 0.23700988477155205, + 0.13201947050262697, + null, + 0.23700988477155205, + 0.2318219208408404, + null, + 0.23700988477155205, + 0.20307680326083377, + null, + 0.05477321631284726, + 0.1341994714416056, + null, + 0.05477321631284726, + 0.06013197669987258, + null, + 0.05477321631284726, + 0.040563128366188694, + null, + 0.9642772106357639, + 0.888980486534156, + null, + 0.019989772968585173, + 0.1294716874165911, + null, + 0.019989772968585173, + 0.038844634468288675, + null, + 0.29119156039108685, + 0.24102842320743, + null, + 0.29119156039108685, + 0.19048093242734687, + null, + 0.6217058876501556, + 0.6714278208298593, + null, + 0.1341994714416056, + 0.06013197669987258, + null, + 0.1341994714416056, + 0.040563128366188694, + null, + 0.28871122138225125, + 0.2002886163837997, + null, + 0.28871122138225125, + 0.2318219208408404, + null, + 0.28871122138225125, + 0.20307680326083377, + null, + 0.06013197669987258, + 0.040563128366188694, + null, + 0.5752985482362863, + 0.5097617399826666, + null, + 0.10059463740220753, + 0.09959517902538939, + null, + 0.10059463740220753, + 0.038844634468288675, + null, + 0.8157570218353161, + 0.7925454632595156, + null, + 0.8157570218353161, + 0.888980486534156, + null, + 0.42203254876563234, + 0.5260776190209286, + null, + 0.2002886163837997, + 0.13201947050262697, + null, + 0.2002886163837997, + 0.2318219208408404, + null, + 0.2002886163837997, + 0.20307680326083377, + null, + 0.8622415881936324, + 0.8350595230795331, + null, + 0.3169605131706372, + 0.29050814087118004, + null, + 0.3169605131706372, + 0.32345881810688737, + null, + 0.6014235590484225, + 0.5603277981830703, + null, + 0.6014235590484225, + 0.4868902788925622, + null, + 0.9958360522915445, + 0.8842114977564064, + null, + 0.24102842320743, + 0.19048093242734687, + null, + 0.19048093242734687, + 0.1294716874165911, + null, + 0.8508124987550889, + 0.9513646744432486, + null, + 0.13201947050262697, + 0.2318219208408404, + null, + 0.13201947050262697, + 0.20307680326083377, + null, + 0.2318219208408404, + 0.20307680326083377, + null, + 0.888980486534156, + 0.9810704436128125, + null, + 0.5603277981830703, + 0.547451424618544, + null + ] + }, + { + "hoverinfo": "text", + "marker": { + "color": [ + 11, + 14, + 7, + 10, + 7, + 10, + 3, + 14, + 9, + 8, + 9, + 6, + 6, + 9, + 15, + 13, + 15, + 10, + 2, + 13, + 9, + 2, + 9, + 9, + 9, + 6, + 15, + 11, + 9, + 6, + 6, + 13, + 13, + 12, + 12, + 10, + 13, + 14, + 10, + 7, + 12, + 8, + 8, + 12, + 7, + 11, + 3, + 6, + 11, + 9, + 4, + 10, + 17, + 1, + 10, + 16, + 10, + 10, + 7, + 13, + 5, + 13, + 10, + 16, + 8, + 13, + 18, + 8, + 7, + 12, + 14, + 16, + 15, + 13, + 10, + 14, + 15, + 7, + 7, + 7, + 10, + 17, + 12, + 10, + 8, + 3, + 10, + 8, + 8, + 10, + 2, + 18, + 4, + 10, + 16, + 13, + 7, + 7, + 13, + 8, + 5, + 12, + 5, + 6, + 9, + 11, + 9, + 8, + 7, + 9, + 16, + 10, + 5, + 4, + 12, + 9, + 9, + 4, + 6, + 3, + 6, + 11, + 13, + 10, + 9, + 11, + 11, + 6, + 6, + 12, + 7, + 10, + 10, + 6, + 9, + 12, + 7, + 9, + 8, + 9, + 11, + 13, + 12, + 3, + 8, + 12, + 17, + 9, + 3, + 6, + 7, + 4, + 4, + 8, + 12, + 17, + 11, + 10, + 5, + 9, + 4, + 14, + 13, + 12, + 9, + 6, + 6, + 8, + 11, + 8, + 12, + 3, + 13, + 4, + 6, + 8, + 3, + 7, + 7, + 3, + 12, + 9, + 4, + 4, + 11, + 8, + 7, + 10, + 9, + 15, + 11, + 7, + 5, + 6, + 10, + 4, + 3, + 12, + 12, + 5 + ], + "colorbar": { + "thickness": 15, + "title": { + "side": "right", + "text": "Node Connections" + }, + "xanchor": "left" + }, + "colorscale": [ + [ + 0, + "rgb(255,255,217)" + ], + [ + 0.125, + "rgb(237,248,177)" + ], + [ + 0.25, + "rgb(199,233,180)" + ], + [ + 0.375, + "rgb(127,205,187)" + ], + [ + 0.5, + "rgb(65,182,196)" + ], + [ + 0.625, + "rgb(29,145,192)" + ], + [ + 0.75, + "rgb(34,94,168)" + ], + [ + 0.875, + "rgb(37,52,148)" + ], + [ + 1, + "rgb(8,29,88)" + ] + ], + "line": { + "width": 2 + }, + "reversescale": true, + "showscale": true, + "size": 10 + }, + "mode": "markers", + "text": [ + "# of connections: 11", + "# of connections: 14", + "# of connections: 7", + "# of connections: 10", + "# of connections: 7", + "# of connections: 10", + "# of connections: 3", + "# of connections: 14", + "# of connections: 9", + "# of connections: 8", + "# of connections: 9", + "# of connections: 6", + "# of connections: 6", + "# of connections: 9", + "# of connections: 15", + "# of connections: 13", + "# of connections: 15", + "# of connections: 10", + "# of connections: 2", + "# of connections: 13", + "# of connections: 9", + "# of connections: 2", + "# of connections: 9", + "# of connections: 9", + "# of connections: 9", + "# of connections: 6", + "# of connections: 15", + "# of connections: 11", + "# of connections: 9", + "# of connections: 6", + "# of connections: 6", + "# of connections: 13", + "# of connections: 13", + "# of connections: 12", + "# of connections: 12", + "# of connections: 10", + "# of connections: 13", + "# of connections: 14", + "# of connections: 10", + "# of connections: 7", + "# of connections: 12", + "# of connections: 8", + "# of connections: 8", + "# of connections: 12", + "# of connections: 7", + "# of connections: 11", + "# of connections: 3", + "# of connections: 6", + "# of connections: 11", + "# of connections: 9", + "# of connections: 4", + "# of connections: 10", + "# of connections: 17", + "# of connections: 1", + "# of connections: 10", + "# of connections: 16", + "# of connections: 10", + "# of connections: 10", + "# of connections: 7", + "# of connections: 13", + "# of connections: 5", + "# of connections: 13", + "# of connections: 10", + "# of connections: 16", + "# of connections: 8", + "# of connections: 13", + "# of connections: 18", + "# of connections: 8", + "# of connections: 7", + "# of connections: 12", + "# of connections: 14", + "# of connections: 16", + "# of connections: 15", + "# of connections: 13", + "# of connections: 10", + "# of connections: 14", + "# of connections: 15", + "# of connections: 7", + "# of connections: 7", + "# of connections: 7", + "# of connections: 10", + "# of connections: 17", + "# of connections: 12", + "# of connections: 10", + "# of connections: 8", + "# of connections: 3", + "# of connections: 10", + "# of connections: 8", + "# of connections: 8", + "# of connections: 10", + "# of connections: 2", + "# of connections: 18", + "# of connections: 4", + "# of connections: 10", + "# of connections: 16", + "# of connections: 13", + "# of connections: 7", + "# of connections: 7", + "# of connections: 13", + "# of connections: 8", + "# of connections: 5", + "# of connections: 12", + "# of connections: 5", + "# of connections: 6", + "# of connections: 9", + "# of connections: 11", + "# of connections: 9", + "# of connections: 8", + "# of connections: 7", + "# of connections: 9", + "# of connections: 16", + "# of connections: 10", + "# of connections: 5", + "# of connections: 4", + "# of connections: 12", + "# of connections: 9", + "# of connections: 9", + "# of connections: 4", + "# of connections: 6", + "# of connections: 3", + "# of connections: 6", + "# of connections: 11", + "# of connections: 13", + "# of connections: 10", + "# of connections: 9", + "# of connections: 11", + "# of connections: 11", + "# of connections: 6", + "# of connections: 6", + "# of connections: 12", + "# of connections: 7", + "# of connections: 10", + "# of connections: 10", + "# of connections: 6", + "# of connections: 9", + "# of connections: 12", + "# of connections: 7", + "# of connections: 9", + "# of connections: 8", + "# of connections: 9", + "# of connections: 11", + "# of connections: 13", + "# of connections: 12", + "# of connections: 3", + "# of connections: 8", + "# of connections: 12", + "# of connections: 17", + "# of connections: 9", + "# of connections: 3", + "# of connections: 6", + "# of connections: 7", + "# of connections: 4", + "# of connections: 4", + "# of connections: 8", + "# of connections: 12", + "# of connections: 17", + "# of connections: 11", + "# of connections: 10", + "# of connections: 5", + "# of connections: 9", + "# of connections: 4", + "# of connections: 14", + "# of connections: 13", + "# of connections: 12", + "# of connections: 9", + "# of connections: 6", + "# of connections: 6", + "# of connections: 8", + "# of connections: 11", + "# of connections: 8", + "# of connections: 12", + "# of connections: 3", + "# of connections: 13", + "# of connections: 4", + "# of connections: 6", + "# of connections: 8", + "# of connections: 3", + "# of connections: 7", + "# of connections: 7", + "# of connections: 3", + "# of connections: 12", + "# of connections: 9", + "# of connections: 4", + "# of connections: 4", + "# of connections: 11", + "# of connections: 8", + "# of connections: 7", + "# of connections: 10", + "# of connections: 9", + "# of connections: 15", + "# of connections: 11", + "# of connections: 7", + "# of connections: 5", + "# of connections: 6", + "# of connections: 10", + "# of connections: 4", + "# of connections: 3", + "# of connections: 12", + "# of connections: 12", + "# of connections: 5" + ], + "type": "scatter", + "x": [ + 0.4182243125490408, + 0.12286879065958844, + 0.6730431696885844, + 0.38165116541180344, + 0.6084965344664286, + 0.18155558675901884, + 0.7722862313192606, + 0.5368181409256901, + 0.8304626469521129, + 0.7924139234898422, + 0.8266354543284289, + 0.4023039585223629, + 0.5084198498293618, + 0.23992481624351925, + 0.2742000416622462, + 0.15570283642495664, + 0.07513674080757637, + 0.7247552078664479, + 0.2586357176925591, + 0.595945044435614, + 0.9428542201780316, + 0.03304679952258993, + 0.6013564651959642, + 0.1130639188502468, + 0.5531504465254558, + 0.1635981270944994, + 0.05512117222879742, + 0.32578353530864457, + 0.27440213390552737, + 0.2728250610713022, + 0.6346565064837861, + 0.6327007577432437, + 0.800297854626628, + 0.526779936668903, + 0.413948124857326, + 0.09276814106220677, + 0.662108954544855, + 0.07163295816605642, + 0.44119458804978295, + 0.7364515013041172, + 0.7827775151390383, + 0.9600359726880752, + 0.8511753697833563, + 0.05194805532761382, + 0.03187584930858911, + 0.07426685281627932, + 0.5257999712304688, + 0.9998698320754983, + 0.09471702229050472, + 0.6953901849658966, + 0.03446402354654854, + 0.9082570345357789, + 0.3740122792611037, + 0.977854801698089, + 0.5436816885151938, + 0.06202421257916635, + 0.8589937476561325, + 0.06879886671193436, + 0.19921682827804632, + 0.1823584228427031, + 0.37549158943196925, + 0.5433115547736789, + 0.37848025459696877, + 0.3821391536049519, + 0.7204214783753378, + 0.2955343345493908, + 0.09053866681881584, + 0.7181048560087516, + 0.10310287300704979, + 0.8247840830312709, + 0.1573630170264504, + 0.31305791514229697, + 0.298647499376007, + 0.3246624829381992, + 0.19852054651169693, + 0.3328704753356456, + 0.33203393677870674, + 0.5461279353327784, + 0.9636084967560627, + 0.9503884723051484, + 0.13747604708068628, + 0.3499260998923053, + 0.3181124346701171, + 0.89080246263295, + 0.9521646983336837, + 0.6776948411821848, + 0.0023771443647881974, + 0.7007214129943925, + 0.7188906153197968, + 0.47055154706870017, + 0.19043749918150743, + 0.5274116361492907, + 0.9162463356603696, + 0.7042334738295596, + 0.555788147264811, + 0.5805679633404117, + 0.587704695878027, + 0.916634041055854, + 0.7948577020793985, + 0.9210876029743161, + 0.834199864808296, + 0.5989925957177575, + 0.05973078995013337, + 0.5593951498649633, + 0.5229468203255856, + 0.22007362873840486, + 0.37301066653863624, + 0.8613129225222332, + 0.9663892923019699, + 0.2275256207367028, + 0.0852382135963593, + 0.0914406510425998, + 0.9425745666137786, + 0.3019474379086241, + 0.2619562675328274, + 0.48218022499136737, + 0.5293212253918783, + 0.41808707877840445, + 0.14711158829428328, + 0.42926818011737133, + 0.9694266665187994, + 0.4404718698088387, + 0.4277213938753692, + 0.7059759544943667, + 0.4611021425875542, + 0.13940667248499528, + 0.3393815448042514, + 0.6370268640561303, + 0.9851894520572745, + 0.3247821296168134, + 0.9186278106648778, + 0.18507593174525072, + 0.5845953849421676, + 0.44175944307536974, + 0.7255980413609877, + 0.6058132814274794, + 0.7703024251104211, + 0.47443124751760235, + 0.9573079778783831, + 0.0201693226965588, + 0.17086936775877049, + 0.5291812256005789, + 0.5621062195646831, + 0.2121217358781844, + 0.16862303760247477, + 0.8846357375826375, + 0.0875467755337247, + 0.9473667691929577, + 0.8541827253649632, + 0.3414075728554137, + 0.9005048863870916, + 0.3318561006769827, + 0.7408684543182315, + 0.6149491168624189, + 0.12355952994556385, + 0.08997327822205015, + 0.21535391032155426, + 0.8323549266756429, + 0.8385234321105272, + 0.9240127894624793, + 0.6802728591951641, + 0.25656414507004344, + 0.020212382594376965, + 0.32444561774289593, + 0.4564806171162211, + 0.838803404513024, + 0.6322124026692795, + 0.8505181106970376, + 0.0897773631019545, + 0.7607451357487841, + 0.02312833765025224, + 0.05596958524873419, + 0.3187675293980876, + 0.5191285820034173, + 0.4349682989231034, + 0.04781523934390508, + 0.014269300880037306, + 0.9636590456207981, + 0.8680862155815134, + 0.4363707938884992, + 0.20133087739958255, + 0.6234379896430121, + 0.6314926226168458, + 0.29978148854693865, + 0.33721825060791266, + 0.7518492361353024, + 0.4442228752887084, + 0.04237200971819888, + 0.5201251204037126, + 0.038579501382332126, + 0.9110645875753355, + 0.5593069337955722, + 0.8668565351624634, + 0.42077304608666055, + 0.5465171974419871, + 0.7333209824474588, + 0.4039327719907384, + 0.34114125407236195, + 0.01777064460825195, + 0.992283435751248 + ], + "y": [ + 0.09053726824382247, + 0.571085214777101, + 0.5199666766946885, + 0.33766327379542094, + 0.17196466768963936, + 0.17708608014427518, + 0.04649454781195783, + 0.37080565676900146, + 0.3602866247185619, + 0.9483925173875926, + 0.3061539627540061, + 0.9643804220706982, + 0.8336885167043149, + 0.5944498275635773, + 0.2373268562908326, + 0.23741932367240448, + 0.32127102230894566, + 0.3661437355856225, + 0.7791505090281524, + 0.3648985367210805, + 0.6244837238804738, + 0.9012137046519791, + 0.5219101415039136, + 0.39453602200590676, + 0.2009582712064717, + 0.04224314617430658, + 0.2381682330796122, + 0.33811323660241943, + 0.5216765314868881, + 0.6001026871900049, + 0.991844460003468, + 0.3343459796676115, + 0.8957623407464501, + 0.4208812619135248, + 0.31304614249644347, + 0.6773365837969099, + 0.4307004647175262, + 0.3309683982450944, + 0.2697998035002954, + 0.9727770125665405, + 0.40557198035837094, + 0.35532572275494023, + 0.5850986908522726, + 0.17296378957033465, + 0.6628083689885368, + 0.6160873747407943, + 0.025297953521542405, + 0.24028581536328997, + 0.5186581897030644, + 0.8423383207045981, + 0.7537809293531343, + 0.3192831323823997, + 0.17542400609184483, + 0.008409380348177398, + 0.938767234846119, + 0.24033413659841596, + 0.8791466031622056, + 0.5634679987017406, + 0.05938145280899054, + 0.6012106694454529, + 0.6705222836834548, + 0.3900960314334032, + 0.055894273053114896, + 0.14933184162295132, + 0.8151159149468827, + 0.17619771419691865, + 0.2981410655965283, + 0.7334929583472656, + 0.04283815208078323, + 0.922341377568881, + 0.3199684158322815, + 0.1278305132468397, + 0.21532966919867302, + 0.0731473655342364, + 0.4898861106787329, + 0.2695720924906413, + 0.09533319097359638, + 0.9874110419208606, + 0.1333966979371528, + 0.2529891644068947, + 0.45431497833000367, + 0.24454670425362057, + 0.20002447568886628, + 0.6267294109959968, + 0.5221172076712435, + 0.6512622326935055, + 0.3355480553373167, + 0.4834545718278357, + 0.4847615611240751, + 0.20619722773579274, + 0.9419075807648644, + 0.3098874271134545, + 0.04149975738749545, + 0.32266487999330984, + 0.4295667428124167, + 0.35350564895305514, + 0.15069304516745607, + 0.41535454584101794, + 0.8821215709600496, + 0.9542382277667263, + 0.7205270186163313, + 0.31541428705224306, + 0.010366221042083845, + 0.06016942899581168, + 0.8867112408398291, + 0.5204579980957379, + 0.4500538798110242, + 0.40395348439090084, + 0.5717872069066212, + 0.42052616285893474, + 0.2660491488293679, + 0.10782775946098799, + 0.7302384542961842, + 0.8520196094107113, + 0.4140065537970282, + 0.4467311570808764, + 0.5144551437666581, + 0.7454337953380579, + 0.03395115206665145, + 0.7077207700167599, + 0.9024846524956353, + 0.055897802218322856, + 0.2880647319459674, + 0.9328536520894143, + 0.9298960866412943, + 0.6352288779182178, + 0.04153202488293273, + 0.7834166246251234, + 0.6710484758334021, + 0.3202314429055858, + 0.9961038345306213, + 0.4107398412471005, + 0.24013807075121119, + 0.8599268392047722, + 0.4318165589087314, + 0.2693681584998491, + 0.3340702546567942, + 0.4421375373865315, + 0.5492873750243871, + 0.5981086798045652, + 0.3635517670405215, + 0.42641694849778966, + 0.3333136626479075, + 0.8848427298858184, + 0.6648266103848882, + 0.9344432405222354, + 0.249116699886752, + 0.6201266549140614, + 0.16781555203357146, + 0.4937592635708411, + 0.4248880785102581, + 0.9435179236599912, + 0.07011604000159166, + 0.9078978130468089, + 0.6072525121642058, + 0.23700988477155205, + 0.05477321631284726, + 0.9642772106357639, + 0.019989772968585173, + 0.29119156039108685, + 0.6217058876501556, + 0.1341994714416056, + 0.28871122138225125, + 0.06013197669987258, + 0.22993075379681738, + 0.5752985482362863, + 0.10059463740220753, + 0.8157570218353161, + 0.42203254876563234, + 0.7925454632595156, + 0.2002886163837997, + 0.8622415881936324, + 0.3169605131706372, + 0.6014235590484225, + 0.9958360522915445, + 0.5260776190209286, + 0.8350595230795331, + 0.24102842320743, + 0.19048093242734687, + 0.7005910562446783, + 0.29050814087118004, + 0.8508124987550889, + 0.6714278208298593, + 0.9756800437762957, + 0.040563128366188694, + 0.5097617399826666, + 0.8842114977564064, + 0.13201947050262697, + 0.09959517902538939, + 0.2318219208408404, + 0.888980486534156, + 0.9513646744432486, + 0.1294716874165911, + 0.5603277981830703, + 0.4868902788925622, + 0.038844634468288675, + 0.547451424618544, + 0.32345881810688737, + 0.20307680326083377, + 0.9810704436128125 + ] + } + ], + "layout": { + "annotations": [ + { + "showarrow": true, + "text": "graphs", + "x": 0.005, + "xref": "paper", + "y": -0.002, + "yref": "paper" + } + ], + "hovermode": "closest", + "margin": { + "b": 20, + "l": 5, + "r": 5, + "t": 40 + }, + "showlegend": false, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "font": { + "size": 16 + }, + "text": "Network graph made with Python" + }, + "xaxis": { + "showgrid": false, + "showticklabels": false, + "zeroline": false + }, + "yaxis": { + "showgrid": false, + "showticklabels": false, + "zeroline": false + } + } + }, + "text/html": [ + "
" ] }, - "execution_count": 12, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "G.nodes['Citizens For Kail']" + "G = nx.random_geometric_graph(200, 0.125)\n", + "edge_x = []\n", + "edge_y = []\n", + "for edge in G.edges():\n", + " x0, y0 = G.nodes[edge[0]]['pos']\n", + " x1, y1 = G.nodes[edge[1]]['pos']\n", + " edge_x.append(x0)\n", + " edge_x.append(x1)\n", + " edge_x.append(None)\n", + " edge_y.append(y0)\n", + " edge_y.append(y1)\n", + " edge_y.append(None)\n", + "\n", + "edge_trace = go.Scatter(\n", + " x=edge_x, y=edge_y,\n", + " line=dict(width=0.5, color='#888'),\n", + " hoverinfo='none',\n", + " mode='lines')\n", + "\n", + "node_x = []\n", + "node_y = []\n", + "for node in G.nodes():\n", + " x, y = G.nodes[node]['pos']\n", + " node_x.append(x)\n", + " node_y.append(y)\n", + "\n", + "node_trace = go.Scatter(\n", + " x=node_x, y=node_y,\n", + " mode='markers',\n", + " hoverinfo='text',\n", + " marker=dict(\n", + " showscale=True,\n", + " # colorscale options\n", + " #'Greys' | 'YlGnBu' | 'Greens' | 'YlOrRd' | 'Bluered' | 'RdBu' |\n", + " #'Reds' | 'Blues' | 'Picnic' | 'Rainbow' | 'Portland' | 'Jet' |\n", + " #'Hot' | 'Blackbody' | 'Earth' | 'Electric' | 'Viridis' |\n", + " colorscale='YlGnBu',\n", + " reversescale=True,\n", + " color=[],\n", + " size=10,\n", + " colorbar=dict(\n", + " thickness=15,\n", + " title='Node Connections',\n", + " xanchor='left',\n", + " titleside='right'\n", + " ),\n", + " line_width=2))\n", + "\n", + "node_adjacencies = []\n", + "node_text = []\n", + "for node, adjacencies in enumerate(G.adjacency()):\n", + " node_adjacencies.append(len(adjacencies[1]))\n", + " node_text.append('# of connections: '+str(len(adjacencies[1])))\n", + "\n", + "node_trace.marker.color = node_adjacencies\n", + "node_trace.text = node_text\n", + "\n", + "\n", + "fig = go.Figure(data=[edge_trace, node_trace],\n", + " layout=go.Layout(\n", + " title='Network graph made with Python',\n", + " titlefont_size=16,\n", + " showlegend=False,\n", + " hovermode='closest',\n", + " margin=dict(b=20,l=5,r=5,t=40),\n", + " annotations=[ dict(\n", + " text=\"graphs\",\n", + " showarrow=True,\n", + " xref=\"paper\", yref=\"paper\",\n", + " x=0.005, y=-0.002 ) ],\n", + " xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),\n", + " yaxis=dict(showgrid=False, zeroline=False, showticklabels=False))\n", + " )\n", + "fig.show()" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "G = nx.Graph()\n", + "G.add_node(0)\n", + "nx.set_node_attributes(G, \"red\", name=\"color\")\n", + "nx.set_node_attributes(G, 2, name=\"size\")\n", + "G.add_node(1)\n", + "nx.set_node_attributes(G, np.nan, name='color')\n", + "G.nodes[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, "metadata": {}, "outputs": [ { - "ename": "KeyError", - "evalue": "'REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC'", + "ename": "NetworkXError", + "evalue": "Invalid edge_attr argument: ['donations', 'received']", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[8], line 7\u001b[0m\n\u001b[1;32m 4\u001b[0m node_color \u001b[38;5;241m=\u001b[39m [G\u001b[38;5;241m.\u001b[39mdegree(v) \u001b[38;5;28;01mfor\u001b[39;00m v \u001b[38;5;129;01min\u001b[39;00m G] \n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# node colour is a list of degrees of nodes \u001b[39;00m\n\u001b[0;32m----> 7\u001b[0m node_size \u001b[38;5;241m=\u001b[39m \u001b[43m[\u001b[49m\u001b[38;5;241;43m0.0005\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mnx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_node_attributes\u001b[49m\u001b[43m(\u001b[49m\u001b[43mG\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mpopulation\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[43mv\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mv\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mG\u001b[49m\u001b[43m]\u001b[49m \n\u001b[1;32m 8\u001b[0m \u001b[38;5;66;03m# size of node is a list of population of cities \u001b[39;00m\n\u001b[1;32m 10\u001b[0m edge_width \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0.0015\u001b[39m \u001b[38;5;241m*\u001b[39m G[u][v][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweight\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;28;01mfor\u001b[39;00m u, v \u001b[38;5;129;01min\u001b[39;00m G\u001b[38;5;241m.\u001b[39medges()] \n", - "Cell \u001b[0;32mIn[8], line 7\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 4\u001b[0m node_color \u001b[38;5;241m=\u001b[39m [G\u001b[38;5;241m.\u001b[39mdegree(v) \u001b[38;5;28;01mfor\u001b[39;00m v \u001b[38;5;129;01min\u001b[39;00m G] \n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# node colour is a list of degrees of nodes \u001b[39;00m\n\u001b[0;32m----> 7\u001b[0m node_size \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0.0005\u001b[39m \u001b[38;5;241m*\u001b[39m \u001b[43mnx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_node_attributes\u001b[49m\u001b[43m(\u001b[49m\u001b[43mG\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mpopulation\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[43mv\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m v \u001b[38;5;129;01min\u001b[39;00m G] \n\u001b[1;32m 8\u001b[0m \u001b[38;5;66;03m# size of node is a list of population of cities \u001b[39;00m\n\u001b[1;32m 10\u001b[0m edge_width \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0.0015\u001b[39m \u001b[38;5;241m*\u001b[39m G[u][v][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweight\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;28;01mfor\u001b[39;00m u, v \u001b[38;5;129;01min\u001b[39;00m G\u001b[38;5;241m.\u001b[39medges()] \n", - "\u001b[0;31mKeyError\u001b[0m: 'REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN PAC'" + "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/pandas/core/indexes/base.py:3653\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3652\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 3653\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcasted_key\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3654\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n", + "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/pandas/_libs/index.pyx:147\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/pandas/_libs/index.pyx:176\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:7080\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:7088\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: 'donations'", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/networkx/convert_matrix.py:455\u001b[0m, in \u001b[0;36mfrom_pandas_edgelist\u001b[0;34m(df, source, target, edge_attr, create_using, edge_key)\u001b[0m\n\u001b[1;32m 454\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 455\u001b[0m attribute_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mzip\u001b[39m(\u001b[38;5;241m*\u001b[39m\u001b[43m[\u001b[49m\u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[43mcol\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mcol\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mattr_col_headings\u001b[49m\u001b[43m]\u001b[49m)\n\u001b[1;32m 456\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mKeyError\u001b[39;00m, \u001b[38;5;167;01mTypeError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n", + "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/networkx/convert_matrix.py:455\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 454\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 455\u001b[0m attribute_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mzip\u001b[39m(\u001b[38;5;241m*\u001b[39m[\u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[43mcol\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m col \u001b[38;5;129;01min\u001b[39;00m attr_col_headings])\n\u001b[1;32m 456\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mKeyError\u001b[39;00m, \u001b[38;5;167;01mTypeError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n", + "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/pandas/core/frame.py:3761\u001b[0m, in \u001b[0;36mDataFrame.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3760\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_getitem_multilevel(key)\n\u001b[0;32m-> 3761\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3762\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_integer(indexer):\n", + "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/pandas/core/indexes/base.py:3655\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3654\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m-> 3655\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 3656\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 3657\u001b[0m \u001b[38;5;66;03m# If we have a listlike key, _check_indexing_error will raise\u001b[39;00m\n\u001b[1;32m 3658\u001b[0m \u001b[38;5;66;03m# InvalidIndexError. Otherwise we fall through and re-raise\u001b[39;00m\n\u001b[1;32m 3659\u001b[0m \u001b[38;5;66;03m# the TypeError.\u001b[39;00m\n", + "\u001b[0;31mKeyError\u001b[0m: 'donations'", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mNetworkXError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[16], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m G \u001b[38;5;241m=\u001b[39m \u001b[43mnx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfrom_pandas_edgelist\u001b[49m\u001b[43m(\u001b[49m\u001b[43msample_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43msource\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mname\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43mtarget\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdonations_to\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43medge_attr\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdonations\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mreceived\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m G\u001b[38;5;241m.\u001b[39mnodes()\n\u001b[1;32m 3\u001b[0m pos\u001b[38;5;241m=\u001b[39mnx\u001b[38;5;241m.\u001b[39mspring_layout(G)\n", + "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/networkx/utils/backends.py:412\u001b[0m, in \u001b[0;36m_dispatch.__call__\u001b[0;34m(self, backend, *args, **kwargs)\u001b[0m\n\u001b[1;32m 409\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m/\u001b[39m, \u001b[38;5;241m*\u001b[39margs, backend\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 410\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m backends:\n\u001b[1;32m 411\u001b[0m \u001b[38;5;66;03m# Fast path if no backends are installed\u001b[39;00m\n\u001b[0;32m--> 412\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43morig_func\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 414\u001b[0m \u001b[38;5;66;03m# Use `backend_name` in this function instead of `backend`\u001b[39;00m\n\u001b[1;32m 415\u001b[0m backend_name \u001b[38;5;241m=\u001b[39m backend\n", + "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/networkx/convert_matrix.py:458\u001b[0m, in \u001b[0;36mfrom_pandas_edgelist\u001b[0;34m(df, source, target, edge_attr, create_using, edge_key)\u001b[0m\n\u001b[1;32m 456\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mKeyError\u001b[39;00m, \u001b[38;5;167;01mTypeError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 457\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid edge_attr argument: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00medge_attr\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 458\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m nx\u001b[38;5;241m.\u001b[39mNetworkXError(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 460\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m g\u001b[38;5;241m.\u001b[39mis_multigraph():\n\u001b[1;32m 461\u001b[0m \u001b[38;5;66;03m# => append the edge keys from the df to the bundled data\u001b[39;00m\n\u001b[1;32m 462\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m edge_key \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "\u001b[0;31mNetworkXError\u001b[0m: Invalid edge_attr argument: ['donations', 'received']" ] - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], + "source": [ + "G = nx.from_pandas_edgelist(sample_df,source='name',target='donations_to',edge_attr=['donations','received'])\n", + "G.nodes()\n", + "pos=nx.spring_layout(G)\n", + "weights = list(nx.get_edge_attributes(G,'donations').values())\n", + "weights = [i/5000 for i in weights]\n", + "node_color = [G.degree(v) for v in G] \n", + "#node_size = [0.0005 * nx.get_node_attributes(G, 'donations')[v] for v in G] \n", + "nx.draw_networkx_nodes(G, pos, node_color=node_color)#, node_size=node_size) \n", + "nx.draw_networkx_edges(G, pos, width=weights)\n", + "nx.draw_networkx_labels(G, pos)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "\n", "# fixing the size of the figure \n", @@ -2414,20 +11439,9 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'color': 'white'}" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "G = nx.MultiDiGraph()\n", "G.add_node(0)\n", @@ -2440,20 +11454,9 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'color': 'white', 'age': 4}" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "G.add_node(2)\n", "nx.set_node_attributes(G, 4, name='age')\n", From b8da98e509ad572dc736228a49d0f067eed063e2 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 4 Mar 2024 17:26:11 +0000 Subject: [PATCH 173/214] updating splink function --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 5988a8e3..d7237037 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -683,7 +683,7 @@ def splink_dedupe( deduped_df = pd.merge( first_instance_df, - match_list_df[["cluster_id"]], + match_list_df[["cluster_id", "duplicated"]], on="cluster_id", how="left", ) From 0185093f0ca00189f9959399693d18127b530c0b Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 4 Mar 2024 17:26:27 +0000 Subject: [PATCH 174/214] pipeline updates --- utils/linkage_pipeline.py | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index 9baa5204..e80bd032 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -151,44 +151,40 @@ def main(): organizations = preprocess_organizations(organizations) transactions = preprocess_transactions(transactions) - # Deduplicates perfect matches and creates a new csv file - # in output titled "deduplicated_UUIDs.csv" + individuals, organizations = classify_wrapper(individuals, organizations) + individuals = deduplicate_perfect_matches(individuals) organizations = deduplicate_perfect_matches(organizations) - cleaned_individuals_output_path = ( - BASE_FILEPATH / "output" / "cleaned_individuals_table.csv" - ) - - cleaned_organizations_output_path = ( - BASE_FILEPATH / "output" / "cleaned_organizations_table.csv" - ) - - cleaned_transactions_output_path = ( - BASE_FILEPATH / "output" / "cleaned_transactions_table.csv" - ) - deduped = pd.read_csv(BASE_FILEPATH / "output" / "deduplicated_UUIDs.csv") - # Splink deduplication individuals["unique_id"] = individuals["id"] organizations["unique_id"] = organizations["id"] - individuals = splink_dedupe(individuals, individuals_settings, individuals_blocking) - organizations = splink_dedupe( organizations, organizations_settings, organizations_blocking ) - # Classifies individuals and organizations with a new 'classification' - # column containing 'neutral', 'f', or 'c' - individuals, organizations = classify_wrapper(individuals, organizations) + individuals = splink_dedupe( + individuals, individuals_settings, individuals_blocking + ) - # Update the transactions table with the deduplicated UUIDs transactions[["donor_id", "recipient_id"]] = transactions[ ["donor_id", "recipient_id"] ].replace(deduped) + cleaned_individuals_output_path = ( + BASE_FILEPATH / "output" / "cleaned_individuals_table.csv" + ) + + cleaned_organizations_output_path = ( + BASE_FILEPATH / "output" / "cleaned_organizations_table.csv" + ) + + cleaned_transactions_output_path = ( + BASE_FILEPATH / "output" / "cleaned_transactions_table.csv" + ) + individuals.to_csv(cleaned_individuals_output_path, index=False) organizations.to_csv(cleaned_organizations_output_path, index=False) transactions.to_csv(cleaned_transactions_output_path, index=False) From f05778b1171fe12f17d3d104311679b76f3a751d Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 4 Mar 2024 17:29:21 +0000 Subject: [PATCH 175/214] passing linter --- utils/linkage_pipeline.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index e80bd032..537e79d3 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -1,7 +1,7 @@ import pandas as pd -from classify import classify_wrapper from nameparser import HumanName +from utils.classify import classify_wrapper from utils.constants import ( BASE_FILEPATH, individuals_blocking, @@ -165,9 +165,7 @@ def main(): organizations, organizations_settings, organizations_blocking ) - individuals = splink_dedupe( - individuals, individuals_settings, individuals_blocking - ) + individuals = splink_dedupe(individuals, individuals_settings, individuals_blocking) transactions[["donor_id", "recipient_id"]] = transactions[ ["donor_id", "recipient_id"] From 6de450df8e8b91eb40b1803e4bbcd4f698dd9dea Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Mon, 4 Mar 2024 17:31:16 +0000 Subject: [PATCH 176/214] linter --- utils/linkage_pipeline.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index 537e79d3..ac911559 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -165,7 +165,9 @@ def main(): organizations, organizations_settings, organizations_blocking ) - individuals = splink_dedupe(individuals, individuals_settings, individuals_blocking) + individuals = splink_dedupe( + individuals, individuals_settings, individuals_blocking + ) transactions[["donor_id", "recipient_id"]] = transactions[ ["donor_id", "recipient_id"] From 96b8e0b33b6d7f9cd9b9ac70d5de1f1ededca7b8 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 4 Mar 2024 12:21:22 -0600 Subject: [PATCH 177/214] updated network graph work --- utils/network.py | 83 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 10 deletions(-) diff --git a/utils/network.py b/utils/network.py index 88572aff..d6222cc8 100644 --- a/utils/network.py +++ b/utils/network.py @@ -29,24 +29,77 @@ def name_identifier(uuid: str, dfs: list[pd.DataFrame]) -> str: return None +def combine_datasets_for_network_graph(dfs: list[pd.DataFrame]) -> pd.DataFrame: + """Combines the 3 dataframes into a single dataframe to create the graph + + Given the inds, orgs, and transactions dataframes, the func first finds the + recipient_id in the transaction dataframe in either the org or inds + dataframes and adds the name of the recipient to the transaction df. Then, + the inds and orgs dfs are merged with the transaction df and concatenated + with the contributions amount aggregated, making a final dataframe of the + merged transactions and entity dataframes. + + Args: + list of dataframes in the order: [inds_df, orgs_df, transactions_df] + Transactions dataframe with at least column: 'recipient_id' + Individuals dataframe with at least column: 'full_name' + Organizations dataframe with at least column: 'name' + + Returns + A merged dataframe with aggregate contribution amounts between entitites + """ + + inds_df, orgs_df, transactions_df = dfs + + # first update the transactions df to have a recipient name tied to id + transactions_df["recipient_name"] = transactions_df["recipient_id"].apply( + name_identifier, args=([orgs_df, inds_df],) + ) + + # next, merge the inds_df and orgs_df with the transactions_df + inds_trans_df = pd.merge( + inds_df, transactions_df, how="left", left_on="id", right_on="donor_id" + ) + inds_trans_df = inds_trans_df.dropna(subset=["amount"]) + orgs_trans_df = pd.merge( + orgs_df, transactions_df, how="left", left_on="id", right_on="donor_id" + ) + orgs_trans_df = orgs_trans_df.dropna(subset=["amount"]) + orgs_trans_df = orgs_trans_df.rename(columns={"name": "full_name"}) + + # concatenated the merged dfs + merged_df = pd.concat([orgs_trans_df, inds_trans_df]) + + # lastly, create the final dataframe with aggregated attributes + attribute_cols = merged_df.columns.difference( + ["donor_id", "recipient_id", "full_name", "recipient_name"] + ) + agg_functions = { + col: "sum" if col == "amount" else "first" for col in attribute_cols + } + aggreg_df = ( + merged_df.groupby( + ["donor_id", "recipient_id", "full_name", "recipient_name"] + ) + .agg(agg_functions) + .reset_index() + ) + + return aggreg_df + + def create_network_graph(df: pd.DataFrame) -> nx.MultiDiGraph: """Takes in a dataframe and generates a MultiDiGraph where the nodes are entity names, and the rest of the dataframe columns make the node attributes Args: - df: a pandas dataframe (complete_individuals_table / - complete_organizations_table) + df: a pandas dataframe with merged information from the inds, orgs, & + transactions dataframes Returns: A Networkx MultiDiGraph with nodes and edges """ G = nx.MultiDiGraph() - # first check if df is individuals or organizations dataset - if "name" in df.columns: - node_name = "name" - else: - node_name = "full_name" - edge_columns = [ "office_sought", "purpose", @@ -60,7 +113,7 @@ def create_network_graph(df: pd.DataFrame) -> nx.MultiDiGraph: for _, row in df.iterrows(): # add node attributes based on the columns relevant to the entity G.add_node( - row[node_name], + row["full_name"], **row[df.columns.difference(edge_columns)].dropna().to_dict(), ) # add the recipient as a node @@ -68,7 +121,7 @@ def create_network_graph(df: pd.DataFrame) -> nx.MultiDiGraph: # add the edge attributes between two nodes edge_attributes = row[edge_columns].dropna().to_dict() - G.add_edge(row[node_name], row["recipient_name"], **edge_attributes) + G.add_edge(row["full_name"], row["recipient_name"], **edge_attributes) return G @@ -102,11 +155,21 @@ def plot_network_graph(G: nx.MultiDiGraph): marker=dict(showscale=True, colorscale="YlGnBu", size=10), ) + node_trace["marker"]["color"] = [] for node in G.nodes(): node_info = f"Name: {node}
" for key, value in G.nodes[node].items(): node_info += f"{key}: {value}
" node_trace["text"] += tuple([node_info]) + classification = G.nodes[node].get("classification", "neutral") + # Assign a color based on the classification value + if classification == "c": + color = "blue" + elif classification == "f": + color = "red" + else: + color = "green" # Default color for unknown/neutral classification + node_trace["marker"]["color"] += tuple([color]) # Define layout settings layout = go.Layout( From 51cc9def6d793165c9022c21124e4a40e30a6c38 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Mon, 4 Mar 2024 14:57:36 -0600 Subject: [PATCH 178/214] updated classify test --- utils/tests/test_classifier.py | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 utils/tests/test_classifier.py diff --git a/utils/tests/test_classifier.py b/utils/tests/test_classifier.py new file mode 100644 index 00000000..602c52ac --- /dev/null +++ b/utils/tests/test_classifier.py @@ -0,0 +1,45 @@ +import numpy as np +import pandas as pd +import pytest + +from utils.classify import matcher + +d = { + "name": [ + "bob von rosevich", + "anantarya smith", + "bob j vonrosevich", + "missy elliot", + "mr johnson", + "quarantin directino", + "missy eliot", + "joseph johnson", + ], + "address": [ + "3 Blue Drive, Chicago", + "4 Blue Drive, Chicago", + "8 Fancy Way, Chicago", + "8 Fancy Way, Evanston", + "17 Regular Road, Chicago", + "42 Hollywood Boulevard, Chicago", + "8 Fancy Way, Evanston", + "17 Regular Road, Chicago", + ], +} + +test_df = pd.DataFrame(data=d) + +test_df["classification"] = "neutral" + + +@pytest.fixture +def matcher_scen_1(): + return test_df + + +def test_matcher_scen_1(matcher_scen_1): + res = matcher(matcher_scen_1, "Fancy", "address", "f") + + assert np.all( + res == np.array(["bob j vonrosevich", "missy elliot", "missy eliot"]) + ) From 4cc7ce4c8a7d8edc50a7f032a96a25b0c74db60f Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Mon, 4 Mar 2024 15:03:32 -0600 Subject: [PATCH 179/214] fix pytest --- utils/classify.py | 19 ++++++------------- utils/tests/test_classifier.py | 3 ++- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index 3c24f941..4061970a 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -3,7 +3,9 @@ from utils.constants import c_org_names, f_companies, f_org_names -def classify_wrapper(individuals_df, organizations_df): +def classify_wrapper( + individuals_df: pd.DataFrame, organizations_df: pd.DataFrame +): """Wrapper for classificaiton in linkage pipeline Initialize the classify column in both dataframes and @@ -25,7 +27,7 @@ def classify_wrapper(individuals_df, organizations_df): return classified_individuals, classified_orgs -def matcher(df, substring, column, category): +def matcher(df: pd.DataFrame, substring: str, column: str, category: str): """Applies a label to the classification column based on substrings We run through a given column containing strings in the dataframe. We @@ -42,7 +44,7 @@ def matcher(df, substring, column, category): return df -def classify_individuals(individuals_df): +def classify_individuals(individuals_df: pd.DataFrame): """Part of the classification pipeline We apply the matcher function to the individuals dataframe @@ -56,7 +58,7 @@ def classify_individuals(individuals_df): return individuals_df -def classify_orgs(organizations_df): +def classify_orgs(organizations_df: pd.DataFrame): """Part of the classification pipeline We apply the matcher function to the organizations dataframe @@ -73,11 +75,6 @@ def classify_orgs(organizations_df): return organizations_df -inds_list = [] - -# a list of individual names - - def similarity_calculator( df: pd.DataFrame, subject: str, n: int, comparison_func ) -> pd.DataFrame: @@ -133,7 +130,3 @@ def automated_classifier( ) return similarities_df - - # we can use the indices and/or select manually, just add a new - # column to the subjects table - # that marks fossil fuels, green energy, or neither diff --git a/utils/tests/test_classifier.py b/utils/tests/test_classifier.py index 602c52ac..b6bce883 100644 --- a/utils/tests/test_classifier.py +++ b/utils/tests/test_classifier.py @@ -38,7 +38,8 @@ def matcher_scen_1(): def test_matcher_scen_1(matcher_scen_1): - res = matcher(matcher_scen_1, "Fancy", "address", "f") + matcher(matcher_scen_1, "Fancy", "address", "f") + res = test_df[test_df["classification"] == "f"]["name"].values assert np.all( res == np.array(["bob j vonrosevich", "missy elliot", "missy eliot"]) From 7f3483cf4989799a50e4480d9d21594e0e66facc Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Mon, 4 Mar 2024 15:09:53 -0600 Subject: [PATCH 180/214] updated classify and test_classifier --- utils/classify.py | 76 +++------------------------------- utils/tests/test_classifier.py | 46 ++++++++++++++++++++ 2 files changed, 52 insertions(+), 70 deletions(-) create mode 100644 utils/tests/test_classifier.py diff --git a/utils/classify.py b/utils/classify.py index 3c24f941..31e371ef 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -3,7 +3,9 @@ from utils.constants import c_org_names, f_companies, f_org_names -def classify_wrapper(individuals_df, organizations_df): +def classify_wrapper( + individuals_df: pd.DataFrame, organizations_df: pd.DataFrame +): """Wrapper for classificaiton in linkage pipeline Initialize the classify column in both dataframes and @@ -25,7 +27,7 @@ def classify_wrapper(individuals_df, organizations_df): return classified_individuals, classified_orgs -def matcher(df, substring, column, category): +def matcher(df: pd.DataFrame, substring: str, column: str, category: str): """Applies a label to the classification column based on substrings We run through a given column containing strings in the dataframe. We @@ -42,7 +44,7 @@ def matcher(df, substring, column, category): return df -def classify_individuals(individuals_df): +def classify_individuals(individuals_df: pd.DataFrame): """Part of the classification pipeline We apply the matcher function to the individuals dataframe @@ -56,7 +58,7 @@ def classify_individuals(individuals_df): return individuals_df -def classify_orgs(organizations_df): +def classify_orgs(organizations_df: pd.DataFrame): """Part of the classification pipeline We apply the matcher function to the organizations dataframe @@ -71,69 +73,3 @@ def classify_orgs(organizations_df): organizations_df = matcher(organizations_df, i, "name", "c") return organizations_df - - -inds_list = [] - -# a list of individual names - - -def similarity_calculator( - df: pd.DataFrame, subject: str, n: int, comparison_func -) -> pd.DataFrame: - """Find best matches to a subject name in a pandas dataframe - - For a given individual or organization, the subject, we search through the - 'name'column of a dataframe, select the n highest matches according to a - selected comparison function, and return those as a dataframe. This is meant - to be used manually to search for matches. For quick automated processing, see - automated_classifier(). - - Note that the comparison function must take in two inputs, both strings, and - output a percentage match - """ - - similarities_df = df.copy() - - similarities = similarities_df["name"].apply( - lambda x: comparison_func(x, subject) - ) - - similarities_df["similarities"] = similarities - - top_n_matches = similarities_df.sort_values( - by=["similarities"], ascending=False - )[0:n] - - return top_n_matches - - -def automated_classifier( - df: pd.DataFrame, subjects_dict: dict, threshold: float, comparison_func -): - """Using similarity_calculator, classify entities automatically - - Feeding a dictionary of names and the associated statuses, we compare - the string matches and, if they exceed a certain threshold, classify - them as belonging to some group specified in the subjects dictionary. - """ - - similarities_df = df.copy() - - for subject in subjects_dict: - similarities = similarities_df["name"].apply( - lambda x, sub=subject: comparison_func(x, sub) - ) - matches = similarities >= threshold - - status = subjects_dict[subject] - - similarities_df["classification"] = pd.Series(matches).apply( - lambda x, stat=status: stat if x else "neutral" - ) - - return similarities_df - - # we can use the indices and/or select manually, just add a new - # column to the subjects table - # that marks fossil fuels, green energy, or neither diff --git a/utils/tests/test_classifier.py b/utils/tests/test_classifier.py new file mode 100644 index 00000000..b6bce883 --- /dev/null +++ b/utils/tests/test_classifier.py @@ -0,0 +1,46 @@ +import numpy as np +import pandas as pd +import pytest + +from utils.classify import matcher + +d = { + "name": [ + "bob von rosevich", + "anantarya smith", + "bob j vonrosevich", + "missy elliot", + "mr johnson", + "quarantin directino", + "missy eliot", + "joseph johnson", + ], + "address": [ + "3 Blue Drive, Chicago", + "4 Blue Drive, Chicago", + "8 Fancy Way, Chicago", + "8 Fancy Way, Evanston", + "17 Regular Road, Chicago", + "42 Hollywood Boulevard, Chicago", + "8 Fancy Way, Evanston", + "17 Regular Road, Chicago", + ], +} + +test_df = pd.DataFrame(data=d) + +test_df["classification"] = "neutral" + + +@pytest.fixture +def matcher_scen_1(): + return test_df + + +def test_matcher_scen_1(matcher_scen_1): + matcher(matcher_scen_1, "Fancy", "address", "f") + res = test_df[test_df["classification"] == "f"]["name"].values + + assert np.all( + res == np.array(["bob j vonrosevich", "missy elliot", "missy eliot"]) + ) From 94f807c1693a04039c6f7f95114da81897ce489f Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Mon, 4 Mar 2024 15:12:14 -0600 Subject: [PATCH 181/214] Revert "fix pytest" This reverts commit 4cc7ce4c8a7d8edc50a7f032a96a25b0c74db60f. i accidentally put this on the wrong branch --- utils/classify.py | 19 +++++++++++++------ utils/tests/test_classifier.py | 3 +-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index 4061970a..3c24f941 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -3,9 +3,7 @@ from utils.constants import c_org_names, f_companies, f_org_names -def classify_wrapper( - individuals_df: pd.DataFrame, organizations_df: pd.DataFrame -): +def classify_wrapper(individuals_df, organizations_df): """Wrapper for classificaiton in linkage pipeline Initialize the classify column in both dataframes and @@ -27,7 +25,7 @@ def classify_wrapper( return classified_individuals, classified_orgs -def matcher(df: pd.DataFrame, substring: str, column: str, category: str): +def matcher(df, substring, column, category): """Applies a label to the classification column based on substrings We run through a given column containing strings in the dataframe. We @@ -44,7 +42,7 @@ def matcher(df: pd.DataFrame, substring: str, column: str, category: str): return df -def classify_individuals(individuals_df: pd.DataFrame): +def classify_individuals(individuals_df): """Part of the classification pipeline We apply the matcher function to the individuals dataframe @@ -58,7 +56,7 @@ def classify_individuals(individuals_df: pd.DataFrame): return individuals_df -def classify_orgs(organizations_df: pd.DataFrame): +def classify_orgs(organizations_df): """Part of the classification pipeline We apply the matcher function to the organizations dataframe @@ -75,6 +73,11 @@ def classify_orgs(organizations_df: pd.DataFrame): return organizations_df +inds_list = [] + +# a list of individual names + + def similarity_calculator( df: pd.DataFrame, subject: str, n: int, comparison_func ) -> pd.DataFrame: @@ -130,3 +133,7 @@ def automated_classifier( ) return similarities_df + + # we can use the indices and/or select manually, just add a new + # column to the subjects table + # that marks fossil fuels, green energy, or neither diff --git a/utils/tests/test_classifier.py b/utils/tests/test_classifier.py index b6bce883..602c52ac 100644 --- a/utils/tests/test_classifier.py +++ b/utils/tests/test_classifier.py @@ -38,8 +38,7 @@ def matcher_scen_1(): def test_matcher_scen_1(matcher_scen_1): - matcher(matcher_scen_1, "Fancy", "address", "f") - res = test_df[test_df["classification"] == "f"]["name"].values + res = matcher(matcher_scen_1, "Fancy", "address", "f") assert np.all( res == np.array(["bob j vonrosevich", "missy elliot", "missy eliot"]) From d62f3b70049e55b6f26eaad2774d9bd7dca8c2e3 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Mon, 4 Mar 2024 15:14:07 -0600 Subject: [PATCH 182/214] Revert "updated classify test" This reverts commit 51cc9def6d793165c9022c21124e4a40e30a6c38. accidentally on wrong branch --- utils/tests/test_classifier.py | 45 ---------------------------------- 1 file changed, 45 deletions(-) delete mode 100644 utils/tests/test_classifier.py diff --git a/utils/tests/test_classifier.py b/utils/tests/test_classifier.py deleted file mode 100644 index 602c52ac..00000000 --- a/utils/tests/test_classifier.py +++ /dev/null @@ -1,45 +0,0 @@ -import numpy as np -import pandas as pd -import pytest - -from utils.classify import matcher - -d = { - "name": [ - "bob von rosevich", - "anantarya smith", - "bob j vonrosevich", - "missy elliot", - "mr johnson", - "quarantin directino", - "missy eliot", - "joseph johnson", - ], - "address": [ - "3 Blue Drive, Chicago", - "4 Blue Drive, Chicago", - "8 Fancy Way, Chicago", - "8 Fancy Way, Evanston", - "17 Regular Road, Chicago", - "42 Hollywood Boulevard, Chicago", - "8 Fancy Way, Evanston", - "17 Regular Road, Chicago", - ], -} - -test_df = pd.DataFrame(data=d) - -test_df["classification"] = "neutral" - - -@pytest.fixture -def matcher_scen_1(): - return test_df - - -def test_matcher_scen_1(matcher_scen_1): - res = matcher(matcher_scen_1, "Fancy", "address", "f") - - assert np.all( - res == np.array(["bob j vonrosevich", "missy elliot", "missy eliot"]) - ) From 621e35ae28f38cb523ffb4b3f07c21c5a19781ab Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Mon, 4 Mar 2024 15:21:56 -0600 Subject: [PATCH 183/214] expanded docstrings for classify --- utils/classify.py | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/utils/classify.py b/utils/classify.py index 31e371ef..915c30c3 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -11,11 +11,13 @@ def classify_wrapper( Initialize the classify column in both dataframes and call sub-functions classifying individuals and organizations - Args: individuals_df: cleaned and deduplicated dataframe of individuals - organizations_df: cleaned and deduplicated dataframe of organizations + Args: + individuals_df: cleaned and deduplicated dataframe of individuals + organizations_df: cleaned and deduplicated dataframe of organizations - Returns: individuals and organizations datfarames with a new - 'classification' column containing 'neutral', 'f', or 'c' + Returns: + individuals and organizations datfarames with a new + 'classification' column containing 'neutral', 'f', or 'c' """ individuals_df["classification"] = "neutral" @@ -35,6 +37,16 @@ def matcher(df: pd.DataFrame, substring: str, column: str, category: str): the classification column. We initialize using the 'neutral' label and use the 'f' and 'c' labels to denote fossil fuel and clean energy entities respectively. + + Args: + df: a pandas dataframe + substring: the string to search for + column: the column name in which to search + category: the category to assign the row, such as 'f' 'c' or 'neutral' + + Returns: + A pandas dataframe in which rows matching the substring conditions in + a certain column are marked with the appropriate category """ bool_series = df[column].str.contains(substring, na=False) @@ -50,6 +62,13 @@ def classify_individuals(individuals_df: pd.DataFrame): We apply the matcher function to the individuals dataframe repeatedly, using a variety of substrings to identify the employees of fossil fuel companies. + + Args: + individuals_df: a dataframe containing deduplicated + standardized individuals data + + Returns: + an individuals dataframe updated with the fossil fuels category """ for i in f_companies: @@ -64,6 +83,14 @@ def classify_orgs(organizations_df: pd.DataFrame): We apply the matcher function to the organizations dataframe repeatedly, using a variety of substrings to identify fossil fuel and clean energy companies. + + Args: + organizations_df: a dataframe containing deduplicated + standardized organizations data + + Returns: + an organizations dataframe updated with the fossil fuels + and clean energy category """ for i in f_org_names: From cdf035a93e0ebac357bf73e9d45842af7ffc6770 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 4 Mar 2024 16:15:40 -0600 Subject: [PATCH 184/214] updated visualizations for the graph --- utils/network.py | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/utils/network.py b/utils/network.py index d6222cc8..3fa86eaa 100644 --- a/utils/network.py +++ b/utils/network.py @@ -84,7 +84,7 @@ def combine_datasets_for_network_graph(dfs: list[pd.DataFrame]) -> pd.DataFrame: .agg(agg_functions) .reset_index() ) - + aggreg_df = aggreg_df.drop(["id"], axis=1) return aggreg_df @@ -136,16 +136,34 @@ def plot_network_graph(G: nx.MultiDiGraph): Returns: None. Creates a plotly graph """ edge_trace = go.Scatter( - x=[], y=[], line=dict(color="#888"), hoverinfo="text", mode="lines" + x=(), + y=(), + line=dict(color="#888", width=1.5), + hoverinfo="text", + mode="lines+markers", ) hovertext = [] + pos = nx.spring_layout(G) for edge in G.edges(data=True): - # donor = edge[0], recipient = edge[1] + source = edge[0] + target = edge[1] hovertext.append(f"Amount: {edge[2]['amount']:.2f}") + # Adding coordinates of source and target nodes to edge_trace + edge_trace["x"] += ( + pos[source][0], + pos[target][0], + None, + ) # None creates a gap between line segments + edge_trace["y"] += (pos[source][1], pos[target][1], None) edge_trace["hovertext"] = hovertext + # Define arrow symbol for edges + edge_trace["marker"] = dict( + symbol="arrow", color="#888", size=10, angleref="previous" + ) + node_trace = go.Scatter( x=[], y=[], @@ -154,13 +172,14 @@ def plot_network_graph(G: nx.MultiDiGraph): hoverinfo="text", marker=dict(showscale=True, colorscale="YlGnBu", size=10), ) - node_trace["marker"]["color"] = [] + for node in G.nodes(): node_info = f"Name: {node}
" for key, value in G.nodes[node].items(): node_info += f"{key}: {value}
" node_trace["text"] += tuple([node_info]) + # Get the classification value for the node classification = G.nodes[node].get("classification", "neutral") # Assign a color based on the classification value if classification == "c": @@ -168,18 +187,22 @@ def plot_network_graph(G: nx.MultiDiGraph): elif classification == "f": color = "red" else: - color = "green" # Default color for unknown/neutral classification + color = "green" # Default color for unknown classification node_trace["marker"]["color"] += tuple([color]) + # Add node positions to the trace + node_trace["x"] += tuple([pos[node][0]]) + node_trace["y"] += tuple([pos[node][1]]) + # Define layout settings layout = go.Layout( title="Network Graph Indicating Campaign Contributions from 2018-2022", titlefont=dict(size=16), - showlegend=False, + showlegend=True, hovermode="closest", margin=dict(b=20, l=5, r=5, t=40), - xaxis=dict(showgrid=False, zeroline=False, showticklabels=False), - yaxis=dict(showgrid=False, zeroline=False, showticklabels=False), + xaxis=dict(showgrid=True, zeroline=True, showticklabels=False), + yaxis=dict(showgrid=True, zeroline=True, showticklabels=False), ) fig = go.Figure(data=[edge_trace, node_trace], layout=layout) From 74996a56dc8e04007bef8986f139a9f658bdf7d5 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 4 Mar 2024 17:47:39 -0600 Subject: [PATCH 185/214] updates to the README files under the output and data directories --- data/README.md | 9 +++++++++ output/README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/data/README.md b/data/README.md index 5326bff8..9c154f71 100644 --- a/data/README.md +++ b/data/README.md @@ -160,3 +160,12 @@ contribution data and READMEs in a Google Drive for the duration of this project 3. The Finance Report states that a record must be kept for any contribution over \$10.00, but “Contributions and receipts of \$50.00 or less per contributor, during the reporting period, need not be itemized on the report” … this might mean that if 1,000 people for instance donate \$50 or less, there could be potentially thousands/tens of thousands of \$ not shown on the data, even though this information is recorded. This means that the total contributions that filers itemize does not necessarily reflect the total contributions they received. 4. Transparency USA has aggregated data on the contributions of individuals and committees. This could be a helpful source to cross-check the data and potentially help alleviate the debt-contribution issue. Pennsylvania' Dept. of State also offers a detailed website that shows all the aggregated contributions made and received, expenditures made, debts, and receipts. The catch is one must know which candidate they are looking for as it's a searchable database, but it can be very helpful for cross-matching and verification. Here's the link :https://www.campaignfinanceonline.pa.gov/Pages/CFReportSearch.aspx + +## classified_data +### Summary +- The classified_data subdirectory consists of 3 files: 'classified_individuals_v1', 'classified_organizations_v1' & 'transactions_v1'. These files are derived from the record_linkage pipeline, which mainly adds a classification column to the individuals and organizations entities that reflects the entity's affiliation with the fossil-fuel industry, clean-energy industry, or neutrality. These take the form of 'f' for fossil-fuel, 'c' for clean-energy, and 'neutral' for neutrality' + +### Format +- The 'classified_individuals_v1' dataset comprises of the following columns: ['id', 'first_name', 'last_name', 'full_name', 'entity_type', 'state','party', 'company', 'occupation', 'address', 'zip', 'city','classification']. As noted, the 'classification' column is the added column. + +- The 'classified_organization_v1' dataset comprises of the following columns: ['id', 'name', 'state', 'entity_type', 'classification']. As noted, the 'classification' column is the added column diff --git a/output/README.md b/output/README.md index 932298fd..5c511d5e 100644 --- a/output/README.md +++ b/output/README.md @@ -1,2 +1,3 @@ # Output README --- +'deduplicated_UUIDs.csv' : Following record linkage work in the record_linkage pipeline, this file stores all the original uuids, and indicates the uuids to which the deduplicated uuids have been matched to. From 0cebc4ce893ba8fea4bbcd1767ef987af2aa0d6a Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 4 Mar 2024 18:31:46 -0600 Subject: [PATCH 186/214] latest version of networkx work --- utils/network.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/utils/network.py b/utils/network.py index 3fa86eaa..5b95b2b4 100644 --- a/utils/network.py +++ b/utils/network.py @@ -207,3 +207,49 @@ def plot_network_graph(G: nx.MultiDiGraph): fig = go.Figure(data=[edge_trace, node_trace], layout=layout) fig.show() + + +# create pipeline + + +def construct_network_graph( + start_year: int, end_year: int, dfs: list[pd.DataFrame] +): + """Runs the network construction pipeline starting from 3 dataframes + + Args: + start_year & end_year: the range of the desired data + + Returns: + """ + inds_df, orgs_df, transactions_df = dfs + transactions_df = transactions_df.loc[ + (transactions_df.year >= start_year) + & (transactions_df.year <= end_year) + ] + + aggreg_df = combine_datasets_for_network_graph( + [inds_df, orgs_df, transactions_df] + ) + G = create_network_graph(aggreg_df) + plot_network_graph(G) + nx.write_adjlist(G, "Network Graph Node Data") + + +def main(): + """""" + text = input( + "Provide a range of desired years to extract data. Format is year1, \ + year2. Ex: 2018, 2023" + ) + + assert len(text == 2) + start_year, end_year = text.split(",") + construct_network_graph( + start_year, + end_year, + ) + + +if __name__ == "__main__": + construct_network_graph(1998, 2023) From 4625248cdffb6653a8f4401741daca8ef0f696a8 Mon Sep 17 00:00:00 2001 From: npashilkar Date: Mon, 4 Mar 2024 18:39:42 -0600 Subject: [PATCH 187/214] linkage.py clean up including additions to constants.py --- utils/constants.py | 28 +++++ utils/linkage.py | 268 +++++---------------------------------------- 2 files changed, 53 insertions(+), 243 deletions(-) diff --git a/utils/constants.py b/utils/constants.py index b4be2565..bc6d4cf6 100644 --- a/utils/constants.py +++ b/utils/constants.py @@ -727,3 +727,31 @@ "lcv victory", "league of conservation", ] + +suffixes = [ + "sr", + "jr", + "i", + "ii", + "iii", + "iv", + "v", + "vi", + "vii", + "viii", + "ix", + "x", +] + +titles = [ + "mr", + "ms", + "mrs", + "miss", + "prof", + "dr", + "doctor", + "sir", + "madam", + "professor", +] diff --git a/utils/linkage.py b/utils/linkage.py index 662d18ed..32a44dfc 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -1,15 +1,12 @@ -import math import os.path import re import numpy as np import pandas as pd -import textdistance as td import usaddress -from names_dataset import NameDataset from splink.duckdb.linker import DuckDBLinker -from utils.constants import COMPANY_TYPES, repo_root +from utils.constants import COMPANY_TYPES, repo_root, suffixes, titles """ Module for performing record linkage on state campaign finance dataset @@ -21,10 +18,14 @@ def get_address_line_1_from_full_address(address: str) -> str: Address line 1 usually includes street address or PO Box information. + Uses the usaddress libray which splits an address string into components, + and labels each component. + https://usaddress.readthedocs.io/en/latest/ + Args: address: raw string representing full address Returns: - address_line_1 + address_line_1 as a string Sample Usage: >>> get_address_line_1_from_full_address('6727 W. Corrine Dr. Peoria,AZ 85381') @@ -42,7 +43,7 @@ def get_address_line_1_from_full_address(address: str) -> str: address_tuples = usaddress.parse( address - ) # takes a string address and put them into value,key pairs as tuples + ) # takes a string address and put them into value, key pairs as tuples line1_components = [] for value, key in address_tuples: if key == "PlaceName": @@ -60,167 +61,6 @@ def get_address_line_1_from_full_address(address: str) -> str: return line1 -def calculate_string_similarity(string1: str, string2: str) -> float: - """Returns how similar two strings are on a scale of 0 to 1 - - This version utilizes Jaro-Winkler distance, which is a metric of - edit distance. Jaro-Winkler specially prioritizes the early - characters in a string. - - Since the ends of strings are often more valuable in matching names - and addresses, we reverse the strings before matching them. - - https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance - https://github.com/Yomguithereal/talisman/blob/master/src/metrics/jaro-winkler.js - - The exact meaning of the metric is open, but the following must hold true: - 1. equivalent strings must return 1 - 2. strings with no similar characters must return 0 - 3. strings with higher intuitive similarity must return higher scores - similarity score - - Args: - string1: any string - string2: any string - Returns: - similarity score - - Sample Usage: - >>> calculate_string_similarity("exact match", "exact match") - 1.0 - >>> calculate_string_similarity("aaaaaa", "bbbbbbbbbbb") - 0.0 - >>> similar_score = calculate_string_similarity("very similar", "vary similar") - >>> different_score = calculate_string_similarity("very similar", "very not close") - >>> similar_score > different_score - True - """ - - return float(td.jaro_winkler(string1.lower()[::-1], string2.lower()[::-1])) - - -def calculate_row_similarity( - row1: pd.DataFrame, row2: pd.DataFrame, weights: np.array, comparison_func -) -> float: - """Find weighted similarity of two rows in a dataframe - - The length of the weights vector must be the same as - the number of selected columns. - - This version is slow and not optimized, and will be - revised in order to make it more efficient. It - exists as to provide basic functionality. Once we have - the comparison function locked in, using .apply will - likely be easier and more efficient. - """ - - row_length = len(weights) - if not (row1.shape[1] == row2.shape[1] == row_length): - raise ValueError("Number of columns and weights must be the same") - - similarity = np.zeros(row_length) - - for i in range(row_length): - similarity[i] = comparison_func( - row1.reset_index().drop(columns="index").iloc[:, i][0], - row2.reset_index().drop(columns="index").iloc[:, i][0], - ) - - return sum(similarity * weights) - - -def row_matches( - df: pd.DataFrame, weights: np.array, threshold: float, comparison_func -) -> dict: - """Get weighted similarity score of two rows - - Run through the rows using indices: if two rows have a comparison score - greater than a threshold, we assign the later row to the former. Any - row which is matched to any other row is not examined again. Matches are - stored in a dictionary object, with each index appearing no more than once. - - This is not optimized. Not presently sure how to make a good test case - for this, will submit and ask in mentor session. - """ - - all_indices = np.array(list(df.index)) - - index_dict = {} - [index_dict.setdefault(x, []) for x in all_indices] - - discard_indices = [] - - end = max(all_indices) - for i in all_indices: - # Skip indices that have been stored in the discard_indices list - if i in discard_indices: - continue - - # Iterate through the remaining numbers - for j in range(i + 1, end): - if j in discard_indices: - continue - - # Our conditional - if ( - calculate_row_similarity( - df.iloc[[i]], df.iloc[[j]], weights, comparison_func - ) - > threshold - ): - # Store the other index and mark it for skipping in future iterations - discard_indices.append(j) - index_dict[i].append(j) - - return index_dict - - -def match_confidence( - confidences: np.array(float), weights: np.array(float), weights_toggle: bool -) -> float: - """Combine confidences for row matches into a final confidence - - This is a weighted log-odds based combination of row match confidences - originating from various record linkage methods. Weights will be applied - to the linkage methods in order and must be of the same length. - - weights_toggle allows one to turn weights on and off when calling the - function. False cancels the use of weights. - - Since log-odds have undesirable behaviors at 0 and 1, we truncate at - +-5, which corresponds to around half a percent probability or - 1 - the same. - >>> match_confidence(np.array([.6, .9, .0001]), np.array([2,5.7,8]), True) - 2.627759082143462e-12 - >>> match_confidence(np.array([.6, .9, .0001]), np.array([2,5.7,8]), False) - 0.08337802853594725 - """ - - if (min(confidences) < 0) or (max(confidences) > 1): - raise ValueError("Probabilities must be bounded on [0, 1]") - - log_odds = [] - - for c in confidences: - l_o = np.log(c / (1 - c)) - - if l_o > 5: - l_o = 5 - - elif l_o < -5: - l_o = -5 - - log_odds.append(l_o) - - if weights_toggle: - log_odds = log_odds * weights - - l_o_sum = np.sum(log_odds) - - conf_sum = math.e ** (l_o_sum) / (1 + math.e ** (l_o_sum)) - return conf_sum - - def determine_comma_role(name: str) -> str: """Given a string (someone's name), attempts to determine the role of the comma in the name and where it ought to belong. @@ -247,20 +87,7 @@ def determine_comma_role(name: str) -> str: >>> determine_comma_role("DOe, Jane") ' Jane Doe' """ - suffixes = [ - "sr", - "jr", - "i", - "ii", - "iii", - "iv", - "v", - "vi", - "vii", - "viii", - "ix", - "x", - ] + name_parts = name.lower().split(",") # if the comma is just in the end as a typo: if len(name_parts[1]) == 0: @@ -326,18 +153,6 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: # some names have titles or professions associated with the name. We need to # remove those from the name. - titles = [ - "mr", - "ms", - "mrs", - "miss", - "prof", - "dr", - "doctor", - "sir", - "madam", - "professor", - ] names = [first_name, last_name, full_name] for i in range(len(names)): @@ -363,10 +178,14 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: def get_street_from_address_line_1(address_line_1: str) -> str: """Given an address line 1, return the street name + Uses the usaddress libray which splits an address string into components, + and labels each component. + https://usaddress.readthedocs.io/en/latest/ + Args: - address_line_1: either street information or PO box + address_line_1: either street information or PO box as a string Returns: - street name + street name as a string Raises: ValueError: if string is malformed and no street can be reasonably found. @@ -405,54 +224,6 @@ def get_street_from_address_line_1(address_line_1: str) -> str: return " ".join(string) -def name_rank(first_name: str, last_name: str) -> list: - """Returns a score for the rank of a given first name and last name - https://github.com/philipperemy/name-dataset - Args: - first_name: any string - last_name: any string - Returns: - name rank for first name and last names - 1 is the most common name, only for names in the United States - First element in the list corresponds to the rank of the first name - Second element in the list corresponds to the rank of the last name - Empty or non string values will return None - Names that are not found in the dataset will return 0 - - >>> name_rank("John", "Smith") - [5, 7] - >>> name_rank("Adil", "Kassim") - [0, 7392] - >>> name_rank(None, 9) - [None, None] - """ - - # Initialize the NameDataset class - nd = NameDataset() - - first_name_rank = 0 - last_name_rank = 0 - if isinstance(first_name, str): - first_name_result = nd.search(first_name) - if first_name_result and isinstance(first_name_result, dict): - first_name_data = first_name_result.get("first_name") - if first_name_data and "rank" in first_name_data: - first_name_rank = first_name_data["rank"].get( - "United States", 0 - ) - else: - first_name_rank = None - if isinstance(last_name, str): - last_name_result = nd.search(last_name) - if last_name_result and isinstance(last_name_result, dict): - last_name_data = last_name_result.get("last_name") - if last_name_data and "rank" in last_name_data: - last_name_rank = last_name_data["rank"].get("United States", 0) - else: - last_name_rank = None - return [first_name_rank, last_name_rank] - - def convert_duplicates_to_dict(df: pd.DataFrame) -> None: """For each uuid, maps it to all other uuids for which it has been deemed a match. @@ -537,6 +308,7 @@ def cleaning_company_column(company_entry: str) -> str: standardized for retired, self employed, and unemployed, or original string if no match or empty string + Sample Usage: >>> cleaning_company_column("Retireed") 'Retired' >>> cleaning_company_column("self") @@ -592,6 +364,7 @@ def standardize_corp_names(company_name: str) -> str: Returns: standardized company name + Sample Usage: >>> standardize_corp_names('MI BEER WINE WHOLESALERS ASSOC') 'MI BEER WINE WHOLESALERS ASSOCIATION' @@ -617,6 +390,10 @@ def standardize_corp_names(company_name: str) -> str: def get_address_number_from_address_line_1(address_line_1: str) -> str: """Given an address line 1, return the building number or po box + Uses the usaddress libray which splits an address string into components, + and labels each component. + https://usaddress.readthedocs.io/en/latest/ + Args: address_line_1: either street information or PO box Returns: @@ -655,6 +432,11 @@ def splink_dedupe( individuals_settings, indivduals_blocking, organizations_settings, organizations_blocking + Uses the splink library which employs probabilistic matching for + record linkage + https://moj-analytical-services.github.io/splink/index.html + + Args: df: dataframe settings: configuration settings From 133dadcd22cb6dd28e6e968396574b8502f5bbc6 Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Mon, 4 Mar 2024 19:55:14 -0600 Subject: [PATCH 188/214] addressing comments on classify and test_classify --- utils/classify.py | 15 ++++++++---- utils/tests/test_classify.py | 46 ++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 utils/tests/test_classify.py diff --git a/utils/classify.py b/utils/classify.py index 915c30c3..5475894b 100644 --- a/utils/classify.py +++ b/utils/classify.py @@ -6,7 +6,7 @@ def classify_wrapper( individuals_df: pd.DataFrame, organizations_df: pd.DataFrame ): - """Wrapper for classificaiton in linkage pipeline + """Wrapper for classification in linkage pipeline Initialize the classify column in both dataframes and call sub-functions classifying individuals and organizations @@ -17,7 +17,13 @@ def classify_wrapper( Returns: individuals and organizations datfarames with a new - 'classification' column containing 'neutral', 'f', or 'c' + 'classification' column containing 'neutral', 'f', or 'c'. + 'neutral' status is the default for all entities, and those tagged + as 'neutral' are entities which we could not confidently identify as + either fossil fuel or clean energy organizations or affiliates. + Classification is very conservative, and we are very confident that + entities classified as one group or another are related to them. + """ individuals_df["classification"] = "neutral" @@ -59,9 +65,8 @@ def matcher(df: pd.DataFrame, substring: str, column: str, category: str): def classify_individuals(individuals_df: pd.DataFrame): """Part of the classification pipeline - We apply the matcher function to the individuals dataframe - repeatedly, using a variety of substrings to identify the - employees of fossil fuel companies. + We check if individuals work for a known fossil fuel company + and categorize them using the matcher() function. Args: individuals_df: a dataframe containing deduplicated diff --git a/utils/tests/test_classify.py b/utils/tests/test_classify.py new file mode 100644 index 00000000..b6bce883 --- /dev/null +++ b/utils/tests/test_classify.py @@ -0,0 +1,46 @@ +import numpy as np +import pandas as pd +import pytest + +from utils.classify import matcher + +d = { + "name": [ + "bob von rosevich", + "anantarya smith", + "bob j vonrosevich", + "missy elliot", + "mr johnson", + "quarantin directino", + "missy eliot", + "joseph johnson", + ], + "address": [ + "3 Blue Drive, Chicago", + "4 Blue Drive, Chicago", + "8 Fancy Way, Chicago", + "8 Fancy Way, Evanston", + "17 Regular Road, Chicago", + "42 Hollywood Boulevard, Chicago", + "8 Fancy Way, Evanston", + "17 Regular Road, Chicago", + ], +} + +test_df = pd.DataFrame(data=d) + +test_df["classification"] = "neutral" + + +@pytest.fixture +def matcher_scen_1(): + return test_df + + +def test_matcher_scen_1(matcher_scen_1): + matcher(matcher_scen_1, "Fancy", "address", "f") + res = test_df[test_df["classification"] == "f"]["name"].values + + assert np.all( + res == np.array(["bob j vonrosevich", "missy elliot", "missy eliot"]) + ) From feda102730544ce1c47c231ff0806d24abb20b3c Mon Sep 17 00:00:00 2001 From: Avery Schoen <33437601+averyschoen@users.noreply.github.com> Date: Mon, 4 Mar 2024 20:19:14 -0600 Subject: [PATCH 189/214] Delete utils/tests/test_classifier.py --- utils/tests/test_classifier.py | 46 ---------------------------------- 1 file changed, 46 deletions(-) delete mode 100644 utils/tests/test_classifier.py diff --git a/utils/tests/test_classifier.py b/utils/tests/test_classifier.py deleted file mode 100644 index b6bce883..00000000 --- a/utils/tests/test_classifier.py +++ /dev/null @@ -1,46 +0,0 @@ -import numpy as np -import pandas as pd -import pytest - -from utils.classify import matcher - -d = { - "name": [ - "bob von rosevich", - "anantarya smith", - "bob j vonrosevich", - "missy elliot", - "mr johnson", - "quarantin directino", - "missy eliot", - "joseph johnson", - ], - "address": [ - "3 Blue Drive, Chicago", - "4 Blue Drive, Chicago", - "8 Fancy Way, Chicago", - "8 Fancy Way, Evanston", - "17 Regular Road, Chicago", - "42 Hollywood Boulevard, Chicago", - "8 Fancy Way, Evanston", - "17 Regular Road, Chicago", - ], -} - -test_df = pd.DataFrame(data=d) - -test_df["classification"] = "neutral" - - -@pytest.fixture -def matcher_scen_1(): - return test_df - - -def test_matcher_scen_1(matcher_scen_1): - matcher(matcher_scen_1, "Fancy", "address", "f") - res = test_df[test_df["classification"] == "f"]["name"].values - - assert np.all( - res == np.array(["bob j vonrosevich", "missy elliot", "missy eliot"]) - ) From 9c5ff3cfebaef805ee700263579c9c54ec3280b2 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 4 Mar 2024 20:52:51 -0600 Subject: [PATCH 190/214] making revisions to data/README and network.py per Avery's feedback --- data/README.md | 9 --------- utils/network.py | 28 ++++++++++------------------ 2 files changed, 10 insertions(+), 27 deletions(-) diff --git a/data/README.md b/data/README.md index 9c154f71..5326bff8 100644 --- a/data/README.md +++ b/data/README.md @@ -160,12 +160,3 @@ contribution data and READMEs in a Google Drive for the duration of this project 3. The Finance Report states that a record must be kept for any contribution over \$10.00, but “Contributions and receipts of \$50.00 or less per contributor, during the reporting period, need not be itemized on the report” … this might mean that if 1,000 people for instance donate \$50 or less, there could be potentially thousands/tens of thousands of \$ not shown on the data, even though this information is recorded. This means that the total contributions that filers itemize does not necessarily reflect the total contributions they received. 4. Transparency USA has aggregated data on the contributions of individuals and committees. This could be a helpful source to cross-check the data and potentially help alleviate the debt-contribution issue. Pennsylvania' Dept. of State also offers a detailed website that shows all the aggregated contributions made and received, expenditures made, debts, and receipts. The catch is one must know which candidate they are looking for as it's a searchable database, but it can be very helpful for cross-matching and verification. Here's the link :https://www.campaignfinanceonline.pa.gov/Pages/CFReportSearch.aspx - -## classified_data -### Summary -- The classified_data subdirectory consists of 3 files: 'classified_individuals_v1', 'classified_organizations_v1' & 'transactions_v1'. These files are derived from the record_linkage pipeline, which mainly adds a classification column to the individuals and organizations entities that reflects the entity's affiliation with the fossil-fuel industry, clean-energy industry, or neutrality. These take the form of 'f' for fossil-fuel, 'c' for clean-energy, and 'neutral' for neutrality' - -### Format -- The 'classified_individuals_v1' dataset comprises of the following columns: ['id', 'first_name', 'last_name', 'full_name', 'entity_type', 'state','party', 'company', 'occupation', 'address', 'zip', 'city','classification']. As noted, the 'classification' column is the added column. - -- The 'classified_organization_v1' dataset comprises of the following columns: ['id', 'name', 'state', 'entity_type', 'classification']. As noted, the 'classification' column is the added column diff --git a/utils/network.py b/utils/network.py index 5b95b2b4..0dcc5a87 100644 --- a/utils/network.py +++ b/utils/network.py @@ -14,13 +14,10 @@ def name_identifier(uuid: str, dfs: list[pd.DataFrame]) -> str: The entity's name """ for df in dfs: - # first, check orgs df: if "name" in df.columns: name_in_org = df.loc[df["id"] == uuid] if len(name_in_org) > 0: return name_in_org.iloc[0]["name"] - # theoretically it must be in inds if not in orgs, but for the sample - # data this might not be the case if "full_name" in df.columns: name_in_ind = df.loc[df["id"] == uuid] @@ -30,20 +27,18 @@ def name_identifier(uuid: str, dfs: list[pd.DataFrame]) -> str: def combine_datasets_for_network_graph(dfs: list[pd.DataFrame]) -> pd.DataFrame: - """Combines the 3 dataframes into a single dataframe to create the graph + """Combines the 3 dataframes into a single dataframe to create a graph - Given the inds, orgs, and transactions dataframes, the func first finds the - recipient_id in the transaction dataframe in either the org or inds - dataframes and adds the name of the recipient to the transaction df. Then, - the inds and orgs dfs are merged with the transaction df and concatenated - with the contributions amount aggregated, making a final dataframe of the - merged transactions and entity dataframes. + Given 3 dataframes, the func adds a 'recipient_name' column in the + transactions df, merges the dfs together to record transaction info between + entities, then concatenates the dfs into a final df of the merged + transactions and entity dfs. Args: list of dataframes in the order: [inds_df, orgs_df, transactions_df] - Transactions dataframe with at least column: 'recipient_id' - Individuals dataframe with at least column: 'full_name' - Organizations dataframe with at least column: 'name' + Transactions dataframe with column: 'recipient_id' + Individuals dataframe with column: 'full_name' + Organizations dataframe with column: 'name' Returns A merged dataframe with aggregate contribution amounts between entitites @@ -56,7 +51,7 @@ def combine_datasets_for_network_graph(dfs: list[pd.DataFrame]) -> pd.DataFrame: name_identifier, args=([orgs_df, inds_df],) ) - # next, merge the inds_df and orgs_df with the transactions_df + # next, merge the inds_df and orgs_df ids with the transactions_df donor_id inds_trans_df = pd.merge( inds_df, transactions_df, how="left", left_on="id", right_on="donor_id" ) @@ -208,10 +203,6 @@ def plot_network_graph(G: nx.MultiDiGraph): fig = go.Figure(data=[edge_trace, node_trace], layout=layout) fig.show() - -# create pipeline - - def construct_network_graph( start_year: int, end_year: int, dfs: list[pd.DataFrame] ): @@ -219,6 +210,7 @@ def construct_network_graph( Args: start_year & end_year: the range of the desired data + dfs: dataframes in the order: inds_df, orgs_df, transactions_df Returns: """ From 18a52ff3acbb8f2819de6cb6c9eef7cc69fe35c9 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Mon, 4 Mar 2024 20:54:30 -0600 Subject: [PATCH 191/214] making revisions to data/README and network.py per Avery's feedback --- utils/network.py | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/network.py b/utils/network.py index 0dcc5a87..c3910034 100644 --- a/utils/network.py +++ b/utils/network.py @@ -203,6 +203,7 @@ def plot_network_graph(G: nx.MultiDiGraph): fig = go.Figure(data=[edge_trace, node_trace], layout=layout) fig.show() + def construct_network_graph( start_year: int, end_year: int, dfs: list[pd.DataFrame] ): From 743b30618689ec698101052c47c705e3476e85bc Mon Sep 17 00:00:00 2001 From: Nicolas Posner Date: Mon, 4 Mar 2024 20:59:25 -0600 Subject: [PATCH 192/214] updating readme and makefile as well as location of data for linkage_pipeline --- Makefile | 7 +++---- README.md | 9 +++++---- data/README.md | 6 ++++++ output/README.md | 4 ++++ utils/linkage_pipeline.py | 6 +++--- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 36577581..3de9758d 100644 --- a/Makefile +++ b/Makefile @@ -30,8 +30,7 @@ run-notebooks: --no-browser --allow-root -#running the linkage pipeline and creating the network graph -#still waiting on linkage_pipeline completion to get this into final shape +output_network_graph: + python linkage_pipeline.py -output network_graph: all_individuals.csv all_organizations.csv all_transactions.csv - python linkage_pipeline.py \ No newline at end of file +.PHONY: output_network_graph \ No newline at end of file diff --git a/README.md b/README.md index 879a41e0..4be8c9ba 100644 --- a/README.md +++ b/README.md @@ -44,9 +44,9 @@ If you prefer to develop inside a container with VS Code then do the following s 6. For future reference, the above pipeline also stores the information mapping given id to our database id (generated via uuid) in a csv file in the format of (state)IDMap.csv (example: ArizonaIDMap.csv) in the output folder ### Record Linkage and Network Pipeline -1. Save the standardized tables "complete_individuals_table.csv", "complete_organizations_table.csv", and "complete_transactions_table.csv" (collected from the above pipeline or data from the project's Google Drive) in the following format: repo_root / "output" / "file" -2. **UPDATE:** Run the pipeline by calling ```make run-linkage-pipeline```. This pipeline will perform conservative record linkage, attempt to classify entities as neutral, fossil fuels, or clean energy, and an interactive network visual -3. The pipeline will output the deduplicated tables saved as "cleaned_individuals_table.csv", "cleaned_organizations_table.csv", and "cleaned_transactions_table.csv". A mapping file, "deduplicated_UUIDs" tracks the UUIDs designated as duplicates. +1. Download the complete_data.zip file from the Climate Cabinet Data Clinic Google Drive using this link: https://drive.google.com/file/d/1zbjt7iBU0NAWSBcUyEsjvuumn3VgI4z9/view?usp=sharing. After downloading this .zip, unzip it to find three files: complete_individuals.csv, complete_organizations.csv, and complete_transactions.csv. Upload these files into the data folder and ensure that their names are correct. They must follow this format: repo_root / "output" / "file" +2. Run the pipeline by calling ```make run-linkage-pipeline```. This pipeline will perform conservative record linkage, attempt to classify entities as neutral, fossil fuels, or clean energy, and create a NetworkX Graph object. +3. The pipeline will output a NetworkX Graph object and a txt file containing graph metrics into the output folder. ## Repository Structure @@ -65,7 +65,8 @@ If the data is larger than 50MB than you should not add it to the repo and inste This [README.md file](/data/README.md) should be kept up to date. ### output -Should contain work product generated by the analysis. Keep in mind that results should (generally) be excluded from the git repository. +This folder is empty by default. The final outputs of the Makefile will be placed here, consisting of a NetworkX Graph object and a txt file containing graph metrics. + ## Team Member diff --git a/data/README.md b/data/README.md index 5326bff8..df9336b7 100644 --- a/data/README.md +++ b/data/README.md @@ -2,6 +2,12 @@ This directory contains information for use in this project. +## Makefile and Final Pipeline +- This folder is empty by default. In order to run the Makefile, download the complete_data.zip file from the Climate Cabinet Data Clinic Google Drive using this link: https://drive.google.com/file/d/1zbjt7iBU0NAWSBcUyEsjvuumn3VgI4z9/view?usp=sharing + + - After downloading this .zip, unzip it to find three files: complete_individuals.csv, complete_organizations.csv, and complete_transactions.csv. Upload these files into the data folder and ensure that their names are correct. Once they are in place, you may run the Makefile. + + ## Arizona Campaign Finance Data ### Summary diff --git a/output/README.md b/output/README.md index 932298fd..06e91212 100644 --- a/output/README.md +++ b/output/README.md @@ -1,2 +1,6 @@ # Output README --- + +## Makefile and Final Pipeline + +- This folder is empty by default. The output of the Makefile process will be output into this folder, consisting of a NetworkX Graph object and a txt file containing graph metrics. diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index ac911559..499726e9 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -136,15 +136,15 @@ def preprocess_transactions(transactions: pd.DataFrame) -> pd.DataFrame: def main(): organizations = pd.read_csv( - BASE_FILEPATH / "output" / "complete_organizations_table.csv" + BASE_FILEPATH / "data" / "complete_organizations_table.csv" ) individuals = pd.read_csv( - BASE_FILEPATH / "output" / "complete_individuals_table.csv" + BASE_FILEPATH / "data" / "complete_individuals_table.csv" ) transactions = pd.read_csv( - BASE_FILEPATH / "output" / "complete_transactions_table.csv" + BASE_FILEPATH / "data" / "complete_transactions_table.csv" ) individuals = preprocess_individuals(individuals) From 793b8afe50a8708b5510fd159f85e425f2781c0e Mon Sep 17 00:00:00 2001 From: npashilkar Date: Tue, 5 Mar 2024 00:07:18 -0600 Subject: [PATCH 193/214] removing unneccessary tests --- utils/tests/test_linkage.py | 104 +----------------------------------- 1 file changed, 1 insertion(+), 103 deletions(-) diff --git a/utils/tests/test_linkage.py b/utils/tests/test_linkage.py index 4a5f73f2..d96339d6 100644 --- a/utils/tests/test_linkage.py +++ b/utils/tests/test_linkage.py @@ -1,115 +1,13 @@ -import numpy as np import pandas as pd import pytest from utils.constants import BASE_FILEPATH -from utils.linkage import ( - calculate_row_similarity, - calculate_string_similarity, - deduplicate_perfect_matches, - row_matches, -) +from utils.linkage import deduplicate_perfect_matches """ Module for testing functions in linkage.py """ -# Creating a test for calculate_row_similarity and row_matches - -# to put in data: -d = { - "name": ["bob von rosevich", "anantarya smith", "bob j vonrosevich"], - "address": [ - "3 Blue Drive, Chicago", - "4 Blue Drive, Chicago", - "8 Fancy Way, Chicago", - ], -} - -test_df = pd.DataFrame(data=d) - - -@pytest.fixture -def row_similarity_scen_1(): - return test_df - - -@pytest.fixture -def row_similarity_scen_2(): - return test_df - - -def test_row_similarity_scen_1(row_similarity_scen_1): - wrong = calculate_row_similarity( - row_similarity_scen_1.iloc[[0]], - row_similarity_scen_1.iloc[[1]], - np.array([0.8, 0.2]), - calculate_string_similarity, - ) - right = calculate_row_similarity( - row_similarity_scen_1.iloc[[0]], - row_similarity_scen_1.iloc[[2]], - np.array([0.8, 0.2]), - calculate_string_similarity, - ) - - assert right > wrong - - -def test_row_similarity_scen_2(row_similarity_scen_2): - wrong = calculate_row_similarity( - row_similarity_scen_2.iloc[[0]], - row_similarity_scen_2.iloc[[1]], - np.array([0.2, 0.8]), - calculate_string_similarity, - ) - right = calculate_row_similarity( - row_similarity_scen_2.iloc[[0]], - row_similarity_scen_2.iloc[[2]], - np.array([0.2, 0.8]), - calculate_string_similarity, - ) - - assert right < wrong - - -d2 = { - "name": [ - "bob von rosevich", - "anantarya smith", - "bob j vonrosevich", - "missy elliot", - "mr johnson", - "quarantin directino", - "missy eliot", - "joseph johnson", - ], - "address": [ - "3 Blue Drive, Chicago", - "4 Blue Drive, Chicago", - "8 Fancy Way, Chicago", - "8 Fancy Way, Evanston", - "17 Regular Road, Chicago", - "42 Hollywood Boulevard, Chicago", - "8 Fancy Way, Evanston", - "17 Regular Road, Chicago", - ], -} -test_df2 = pd.DataFrame(data=d2) - - -@pytest.fixture -def row_match_scen1(): - return test_df2 - - -def test_row_matches(row_match_scen1): - res = row_matches( - row_match_scen1, np.array([0.8, 0.2]), 0.9, calculate_string_similarity - ) - - assert res == {0: [2], 1: [], 2: [], 3: [6], 4: [], 5: [], 6: [], 7: []} - # Test for dedupe function @pytest.fixture From a571d91cb5238089aca9fde1f27878828cc7a08a Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Tue, 5 Mar 2024 06:21:34 +0000 Subject: [PATCH 194/214] slight update to splink_dedupe function --- utils/linkage.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index d7237037..484c1060 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -341,9 +341,7 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: names[i] = determine_comma_role(names[i]) names[i] = names[i].replace(".", "").split(" ") - names[i] = [ - name_part for name_part in names[i] if name_part not in titles - ] + names[i] = [name_part for name_part in names[i] if name_part not in titles] names[i] = " ".join(names[i]) # one last check to remove any pieces that might add extra whitespace @@ -432,9 +430,7 @@ def name_rank(first_name: str, last_name: str) -> list: if first_name_result and isinstance(first_name_result, dict): first_name_data = first_name_result.get("first_name") if first_name_data and "rank" in first_name_data: - first_name_rank = first_name_data["rank"].get( - "United States", 0 - ) + first_name_rank = first_name_data["rank"].get("United States", 0) else: first_name_rank = None if isinstance(last_name, str): @@ -636,9 +632,7 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: raise ValueError("Can not find Address Number") -def splink_dedupe( - df: pd.DataFrame, settings: dict, blocking: list -) -> pd.DataFrame: +def splink_dedupe(df: pd.DataFrame, settings: dict, blocking: list) -> pd.DataFrame: """Given a dataframe and config settings, return a deduplicated dataframe @@ -689,6 +683,9 @@ def splink_dedupe( ) deduped_df.rename(columns={"cluster_id": "unique_id"}, inplace=True) + deduped_df["duplicated"] = deduped_df["duplicated"].apply( + lambda x: x if isinstance(x, list) else [x] + ) convert_duplicates_to_dict(deduped_df) deduped_df.drop(columns=["duplicated"]) From 1db28399005bb2c5ee38e9b4bfd3c6f2d3fb77c2 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Tue, 5 Mar 2024 06:22:21 +0000 Subject: [PATCH 195/214] pre-commit fixes --- utils/linkage.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 484c1060..43febf41 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -341,7 +341,9 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: names[i] = determine_comma_role(names[i]) names[i] = names[i].replace(".", "").split(" ") - names[i] = [name_part for name_part in names[i] if name_part not in titles] + names[i] = [ + name_part for name_part in names[i] if name_part not in titles + ] names[i] = " ".join(names[i]) # one last check to remove any pieces that might add extra whitespace @@ -430,7 +432,9 @@ def name_rank(first_name: str, last_name: str) -> list: if first_name_result and isinstance(first_name_result, dict): first_name_data = first_name_result.get("first_name") if first_name_data and "rank" in first_name_data: - first_name_rank = first_name_data["rank"].get("United States", 0) + first_name_rank = first_name_data["rank"].get( + "United States", 0 + ) else: first_name_rank = None if isinstance(last_name, str): @@ -632,7 +636,9 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: raise ValueError("Can not find Address Number") -def splink_dedupe(df: pd.DataFrame, settings: dict, blocking: list) -> pd.DataFrame: +def splink_dedupe( + df: pd.DataFrame, settings: dict, blocking: list +) -> pd.DataFrame: """Given a dataframe and config settings, return a deduplicated dataframe From 083f92f84554b5d60cbc5c7e38e4a8a1562f288a Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Tue, 5 Mar 2024 01:23:19 -0600 Subject: [PATCH 196/214] last minute modifications to network file. final version --- utils/network.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/utils/network.py b/utils/network.py index c3910034..5f1ada0a 100644 --- a/utils/network.py +++ b/utils/network.py @@ -2,6 +2,16 @@ import pandas as pd import plotly.graph_objects as go +from utils.constants import BASE_FILEPATH + +inds_path = BASE_FILEPATH / "output" / "cleaned_individuals_table.csv" +orgs_path = BASE_FILEPATH / "output" / "cleaned_organizations_table.csv" +transactions_path = BASE_FILEPATH / "output" / "cleaned_transactions_table" + +inds_df = pd.read_csv(inds_path, low_memory=False) +orgs_df = pd.read_csv(orgs_path, low_memory=False) +transactions_df = pd.read_csv(transactions_path, low_memory=False) + def name_identifier(uuid: str, dfs: list[pd.DataFrame]) -> str: """Returns the name of the entity given the entity's uuid @@ -112,7 +122,7 @@ def create_network_graph(df: pd.DataFrame) -> nx.MultiDiGraph: **row[df.columns.difference(edge_columns)].dropna().to_dict(), ) # add the recipient as a node - G.nodes[row["recipient_name"]]["classification"] = "neutral" + G.add_node(row["recipient_name"], classification = "neutral") # add the edge attributes between two nodes edge_attributes = row[edge_columns].dropna().to_dict() @@ -236,11 +246,14 @@ def main(): year2. Ex: 2018, 2023" ) - assert len(text == 2) + assert len(text == 2), ( + "Wrong input for range of years. Format should be" + + " year1, year2. Ex: 1998,2023" + ) + start_year, end_year = text.split(",") construct_network_graph( - start_year, - end_year, + start_year, end_year, [inds_df, orgs_df, transactions_path] ) From 09aca55f9d39d4b7707d00b53dd55bb083444a4c Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Tue, 5 Mar 2024 11:34:34 -0600 Subject: [PATCH 197/214] removing main() from file --- utils/network.py | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/utils/network.py b/utils/network.py index 5f1ada0a..39785122 100644 --- a/utils/network.py +++ b/utils/network.py @@ -122,7 +122,7 @@ def create_network_graph(df: pd.DataFrame) -> nx.MultiDiGraph: **row[df.columns.difference(edge_columns)].dropna().to_dict(), ) # add the recipient as a node - G.add_node(row["recipient_name"], classification = "neutral") + G.add_node(row["recipient_name"], classification="neutral") # add the edge attributes between two nodes edge_attributes = row[edge_columns].dropna().to_dict() @@ -237,25 +237,3 @@ def construct_network_graph( G = create_network_graph(aggreg_df) plot_network_graph(G) nx.write_adjlist(G, "Network Graph Node Data") - - -def main(): - """""" - text = input( - "Provide a range of desired years to extract data. Format is year1, \ - year2. Ex: 2018, 2023" - ) - - assert len(text == 2), ( - "Wrong input for range of years. Format should be" - + " year1, year2. Ex: 1998,2023" - ) - - start_year, end_year = text.split(",") - construct_network_graph( - start_year, end_year, [inds_df, orgs_df, transactions_path] - ) - - -if __name__ == "__main__": - construct_network_graph(1998, 2023) From 269998cf46a29cf362c8ae13f658542e308163e6 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Tue, 5 Mar 2024 11:36:44 -0600 Subject: [PATCH 198/214] removing main() from file --- utils/network.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/utils/network.py b/utils/network.py index 39785122..90f12a69 100644 --- a/utils/network.py +++ b/utils/network.py @@ -2,16 +2,6 @@ import pandas as pd import plotly.graph_objects as go -from utils.constants import BASE_FILEPATH - -inds_path = BASE_FILEPATH / "output" / "cleaned_individuals_table.csv" -orgs_path = BASE_FILEPATH / "output" / "cleaned_organizations_table.csv" -transactions_path = BASE_FILEPATH / "output" / "cleaned_transactions_table" - -inds_df = pd.read_csv(inds_path, low_memory=False) -orgs_df = pd.read_csv(orgs_path, low_memory=False) -transactions_df = pd.read_csv(transactions_path, low_memory=False) - def name_identifier(uuid: str, dfs: list[pd.DataFrame]) -> str: """Returns the name of the entity given the entity's uuid From d6167df68bd2e86a1f267807f044b6656ed88707 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Tue, 5 Mar 2024 12:03:07 -0600 Subject: [PATCH 199/214] updated README.md to show networkX portion of the pipeline --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 879a41e0..0a5fe1a0 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,8 @@ If you prefer to develop inside a container with VS Code then do the following s ### Record Linkage and Network Pipeline 1. Save the standardized tables "complete_individuals_table.csv", "complete_organizations_table.csv", and "complete_transactions_table.csv" (collected from the above pipeline or data from the project's Google Drive) in the following format: repo_root / "output" / "file" -2. **UPDATE:** Run the pipeline by calling ```make run-linkage-pipeline```. This pipeline will perform conservative record linkage, attempt to classify entities as neutral, fossil fuels, or clean energy, and an interactive network visual -3. The pipeline will output the deduplicated tables saved as "cleaned_individuals_table.csv", "cleaned_organizations_table.csv", and "cleaned_transactions_table.csv". A mapping file, "deduplicated_UUIDs" tracks the UUIDs designated as duplicates. +2. **UPDATE:** Run the pipeline by calling ```make run-linkage-pipeline```. This pipeline will perform conservative record linkage, attempt to classify entities as neutral, fossil fuels, or clean energy, convert the standardized tables into a NetworkX Graph, and show an interactive network visual. +3. The pipeline will output the deduplicated tables saved as "cleaned_individuals_table.csv", "cleaned_organizations_table.csv", and "cleaned_transactions_table.csv". A mapping file, "deduplicated_UUIDs" tracks the UUIDs designated as duplicates. The pipeline will also output "Network Graph Node Data", which is the NetworkX Graph object converted into an adjecency list. ## Repository Structure From 8d629397a260f9650d9b2cc23128bb7a53dd7ac3 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Tue, 5 Mar 2024 12:06:25 -0600 Subject: [PATCH 200/214] saving Test.ipynb work --- notebooks/Test.ipynb | 11490 +++++++---------------------------------- 1 file changed, 1935 insertions(+), 9555 deletions(-) diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb index b9ac1762..d242967e 100644 --- a/notebooks/Test.ipynb +++ b/notebooks/Test.ipynb @@ -10,8 +10,7 @@ "import numpy as np\n", "import networkx as nx\n", "import matplotlib.pyplot as plt\n", - "import plotly.express as px\n", - "import plotly.graph_objects as go\n" + "import plotly.graph_objects as go" ] }, { @@ -60,25 +59,17 @@ " \n", " \n", " \n", - " 63128\n", - " 422065cd-0262-4ac9-a2a4-74136ddb99e2\n", - " floyd workman\n", + " 35663\n", + " 7d7d4521-b765-4501-b2da-4220578a5ce2\n", + " lucas gutgsell\n", " MI\n", " corporation\n", " neutral\n", " \n", " \n", - " 98258\n", - " dfd160b5-9389-44ef-a632-c08dc1a1d201\n", - " front 43\n", - " MI\n", - " corporation\n", - " neutral\n", - " \n", - " \n", - " 1712\n", - " 858415ce-d53f-4843-aee0-85560117bdc6\n", - " arizona federation of democratic women\n", + " 6274\n", + " 155e6b64-cada-4046-8d7e-799e1d520e98\n", + " manna bbq\n", " NaN\n", " vendor\n", " neutral\n", @@ -89,19 +80,12 @@ ], "text/plain": [ " id \\\n", - "63128 422065cd-0262-4ac9-a2a4-74136ddb99e2 \n", - "98258 dfd160b5-9389-44ef-a632-c08dc1a1d201 \n", - "1712 858415ce-d53f-4843-aee0-85560117bdc6 \n", - "\n", - " name state entity_type \\\n", - "63128 floyd workman MI corporation \n", - "98258 front 43 MI corporation \n", - "1712 arizona federation of democratic women NaN vendor \n", + "35663 7d7d4521-b765-4501-b2da-4220578a5ce2 \n", + "6274 155e6b64-cada-4046-8d7e-799e1d520e98 \n", "\n", - " classification \n", - "63128 neutral \n", - "98258 neutral \n", - "1712 neutral " + " name state entity_type classification \n", + "35663 lucas gutgsell MI corporation neutral \n", + "6274 manna bbq NaN vendor neutral " ] }, "execution_count": 3, @@ -110,7 +94,7 @@ } ], "source": [ - "orgs_df.head(3)" + "orgs_df.head(2)" ] }, { @@ -121,7 +105,7 @@ { "data": { "text/plain": [ - "array(['neutral'], dtype=object)" + "array(['neutral', 'f'], dtype=object)" ] }, "execution_count": 4, @@ -137,59 +121,6 @@ "cell_type": "code", "execution_count": 5, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idnamestateentity_typeclassification
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [id, name, state, entity_type, classification]\n", - "Index: []" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "orgs_df.loc[orgs_df.classification == 'f']" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, "outputs": [ { "data": { @@ -276,7 +207,7 @@ "1 NaN NaN NaN " ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -287,36 +218,39 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array(['neutral', 'f'], dtype=object)" + "Index(['id', 'first_name', 'last_name', 'full_name', 'entity_type', 'state',\n", + " 'party', 'company', 'occupation', 'address', 'zip', 'city',\n", + " 'classification'],\n", + " dtype='object')" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "inds_df.classification.unique()" + "inds_df.columns" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(9926, 9919, 10000, 10000)" + "(9929, 9924, 10000, 10000)" ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -350,31 +284,17 @@ { "data": { "text/plain": [ - "['242d019c-e0ab-405e-8e77-abae7418b87f',\n", - " '8b2ad550-64a1-4975-8b77-5eb1f24a8871',\n", - " 'aee69307-194f-4c40-af3d-a55a34e1068e',\n", - " '55e5e946-6261-4f19-9752-fb58219b2e99',\n", - " '4faf251a-73d9-46ef-9e17-d3cf0a3052ae',\n", - " '3b5c0a9e-c6f2-44e9-ad05-fde071447564',\n", - " '3936bdf5-9a7a-462c-9e8c-9124f2bd7f57',\n", - " '13882059-3c74-4d9e-825d-a03a72b43b08',\n", - " '50c78f1a-3e9b-4996-a319-eef4fe01ccfb',\n", - " 'ae96f38f-68c8-47e3-95b3-c6f096d3c22e',\n", - " '74ba8a8a-7256-4eb3-b0f8-995f7a6319fb',\n", - " '12823a76-78e2-4b09-b606-859efaa5c8ef',\n", - " '9de9bf03-8c4a-4d2f-9a95-283b230ddfad',\n", - " '588593b9-9bba-4597-94d9-1b3a7fd5b402',\n", - " '5277b642-6bf0-4423-9350-3602ae51c6ac',\n", - " 'd98985b4-f55d-4ada-b279-0497e3176512',\n", - " 'c8586d36-f188-4684-aa99-193407d4d068',\n", - " '3798fda1-83cd-4e48-974a-e1a390060198',\n", - " 'a536b509-f052-4984-a35d-10397308daec',\n", - " '80996477-ce99-4f34-b5fc-bab4d676fc77',\n", - " 'cd1a740c-b1d7-4334-b335-925bd5708753',\n", - " '46af8908-f4e4-4041-9d1e-5b442d051921',\n", - " '2969075a-86d2-4b04-a991-a81832e096a0',\n", - " 'd0337f72-b701-4524-891b-c48ef6f771ec',\n", - " '591aa72b-511b-4dbb-a161-80458f257471']" + "['60387f5b-f134-4b11-a703-a8e49f5ddde2',\n", + " '3e212d00-396f-4e1c-9842-27a96083026c',\n", + " 'd3b9ee8e-e2e1-4946-b97b-173d6f79d578',\n", + " '8801a95f-4395-4702-98a5-d99229ffeb9b',\n", + " '93430d77-badf-4fb1-ad8d-09c551d8c4c2',\n", + " '2880f6d2-7ae1-4370-bb5d-7cacbbd0549f',\n", + " 'ad9ce7af-f69e-4e06-8a7e-11b48e95be16',\n", + " 'bf66ba56-d479-4ec3-bad7-c2279c9cd216',\n", + " 'f251ce50-480d-4449-99c3-f3ac6c37696b',\n", + " '61ee467f-437f-44cf-beea-3b3f05664484',\n", + " '4f65eea2-9923-4158-8354-4b81d3f4f549']" ] }, "execution_count": 9, @@ -392,9 +312,135 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnamestateentity_typedonationsdonations_toreceiveddonations_from
050c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee456Pa Fraternal Order Of Police Pac177MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC
150c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee4395Pa Fraternal Order Of Police Pac3983UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...
250c7d9a1-b448-46a5-8e2d-cd15b3097360REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...MIcommittee1638Paa Pac437Pabar Pac (Pa Bar Assn)
362ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee3232UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...3213MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC
462ea1e9c-ac12-400c-b3dc-519389c0f7d3UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL...MIcommittee1251COMMITTEE TO ELECT DR PATRICIA BERNARD5912REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN...
\n", + "
" + ], + "text/plain": [ + " id \\\n", + "0 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", + "1 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", + "2 50c7d9a1-b448-46a5-8e2d-cd15b3097360 \n", + "3 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", + "4 62ea1e9c-ac12-400c-b3dc-519389c0f7d3 \n", + "\n", + " name state entity_type \\\n", + "0 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", + "1 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", + "2 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... MI committee \n", + "3 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee \n", + "4 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... MI committee \n", + "\n", + " donations donations_to received \\\n", + "0 456 Pa Fraternal Order Of Police Pac 177 \n", + "1 4395 Pa Fraternal Order Of Police Pac 3983 \n", + "2 1638 Paa Pac 437 \n", + "3 3232 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... 3213 \n", + "4 1251 COMMITTEE TO ELECT DR PATRICIA BERNARD 5912 \n", + "\n", + " donations_from \n", + "0 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", + "1 UNITED FOOD AND COMMERCIAL WORKERS ACTIVE BALL... \n", + "2 Pabar Pac (Pa Bar Assn) \n", + "3 MICHIGAN ASSOCIATION OF NURSE ANESTHETISTS PAC \n", + "4 REPUBLICAN STATE LEADERSHIP COMMITTEE MICHIGAN... " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "data = {'id':['50c7d9a1-b448-46a5-8e2d-cd15b3097360','50c7d9a1-b448-46a5-8e2d-cd15b3097360','50c7d9a1-b448-46a5-8e2d-cd15b3097360',\n", " '62ea1e9c-ac12-400c-b3dc-519389c0f7d3','62ea1e9c-ac12-400c-b3dc-519389c0f7d3','62ea1e9c-ac12-400c-b3dc-519389c0f7d3',\n", @@ -482,7 +528,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -522,122 +568,122 @@ " \n", " \n", " \n", - " 0\n", - " 7773a71e-9f67-438e-8313-80b1b75deeb4\n", - " 4544b60d-da6b-4dd5-9efe-334152ccf1f1\n", + " 7\n", + " e6f510a6-9a99-49f7-a702-ea47396c9f6c\n", + " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", " 2018\n", " 1000.0\n", - " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " 015b3bd6-fa5d-445e-9ccb-d249d4ef5d18\n", " none\n", - " bob worsley for state senate\n", - " contribute to a candidate committee\n", + " NaN\n", + " contribution from individuals\n", " NaN\n", " NaN\n", " NaN\n", - " #1022 arizona committee of automotive retailers\n", + " joseph w fisher,ii\n", " \n", " \n", - " 1\n", - " 95f74915-a945-491f-8751-8c970a76fc24\n", - " 946d7561-42a3-4a4b-b410-3a10271c9f18\n", + " 246\n", + " 9db8f578-6b1a-4d2c-9b7d-44cb5999116c\n", + " 262e24f9-69e0-4da5-ac52-b7aeb16d29bb\n", " 2018\n", - " 1000.0\n", - " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " 10.0\n", + " 304dce88-03a4-4107-813a-72b32a2398a6\n", " none\n", - " drew john for state house\n", - " contribute to a candidate committee\n", " NaN\n", + " contribution from individuals\n", " NaN\n", " NaN\n", - " #1022 arizona committee of automotive retailers\n", + " NaN\n", + " janet wilson\n", " \n", " \n", - " 2\n", - " d05f1763-132d-4717-addc-8ff6239ad4d9\n", - " c8f98436-9562-48ed-b51f-45b2b217aad1\n", + " 271\n", + " 6f032c4b-5032-44b1-be31-10629dd8b30c\n", + " 262e24f9-69e0-4da5-ac52-b7aeb16d29bb\n", " 2018\n", - " 1000.0\n", - " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " 20.0\n", + " f31c772c-02e1-4b60-99fe-8a18195d04de\n", " none\n", - " elect karen fann ld1\n", - " contribute to a candidate committee\n", + " NaN\n", + " contribution from individuals\n", " NaN\n", " NaN\n", " NaN\n", - " #1022 arizona committee of automotive retailers\n", + " deanna melendez\n", " \n", " \n", - " 3\n", - " 3dc3da30-6562-4755-bfad-6a26f1baec15\n", - " b9965bc2-c94d-4f69-98d1-bc4f5ad701c5\n", + " 280\n", + " 8726a0a7-d293-4763-aefb-0afbd9b16ac6\n", + " 262e24f9-69e0-4da5-ac52-b7aeb16d29bb\n", " 2018\n", - " 1000.0\n", - " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " 15.0\n", + " f31c772c-02e1-4b60-99fe-8a18195d04de\n", " none\n", - " elect noel campbell for house\n", - " contribute to a candidate committee\n", " NaN\n", + " contribution from individuals\n", " NaN\n", " NaN\n", - " #1022 arizona committee of automotive retailers\n", + " NaN\n", + " deanna melendez\n", " \n", " \n", - " 4\n", - " a4340a2c-7b8a-4eeb-8290-746f0f436c83\n", - " 946d7561-42a3-4a4b-b410-3a10271c9f18\n", + " 588\n", + " d5ab6b6b-ad6f-4b9b-8b35-fd5f80475b40\n", + " 262e24f9-69e0-4da5-ac52-b7aeb16d29bb\n", " 2018\n", - " 1000.0\n", - " 981a0414-b738-4e20-91b8-a29ee2cc7edf\n", + " 20.0\n", + " 9cceeac2-3166-48e0-ae08-74e5a9d3c70c\n", " none\n", - " closed to new donations\n", - " refund from contrib to a cand committee\n", + " NaN\n", + " contribution from individuals\n", " NaN\n", " NaN\n", " NaN\n", - " #1022 arizona committee of automotive retailers\n", + " gail kamaras\n", " \n", " \n", "\n", "" ], "text/plain": [ - " transaction_id donor_id \\\n", - "0 7773a71e-9f67-438e-8313-80b1b75deeb4 4544b60d-da6b-4dd5-9efe-334152ccf1f1 \n", - "1 95f74915-a945-491f-8751-8c970a76fc24 946d7561-42a3-4a4b-b410-3a10271c9f18 \n", - "2 d05f1763-132d-4717-addc-8ff6239ad4d9 c8f98436-9562-48ed-b51f-45b2b217aad1 \n", - "3 3dc3da30-6562-4755-bfad-6a26f1baec15 b9965bc2-c94d-4f69-98d1-bc4f5ad701c5 \n", - "4 a4340a2c-7b8a-4eeb-8290-746f0f436c83 946d7561-42a3-4a4b-b410-3a10271c9f18 \n", + " transaction_id \\\n", + "7 e6f510a6-9a99-49f7-a702-ea47396c9f6c \n", + "246 9db8f578-6b1a-4d2c-9b7d-44cb5999116c \n", + "271 6f032c4b-5032-44b1-be31-10629dd8b30c \n", + "280 8726a0a7-d293-4763-aefb-0afbd9b16ac6 \n", + "588 d5ab6b6b-ad6f-4b9b-8b35-fd5f80475b40 \n", "\n", - " year amount recipient_id office_sought \\\n", - "0 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", - "1 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", - "2 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", - "3 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", - "4 2018 1000.0 981a0414-b738-4e20-91b8-a29ee2cc7edf none \n", + " donor_id year amount \\\n", + "7 981a0414-b738-4e20-91b8-a29ee2cc7edf 2018 1000.0 \n", + "246 262e24f9-69e0-4da5-ac52-b7aeb16d29bb 2018 10.0 \n", + "271 262e24f9-69e0-4da5-ac52-b7aeb16d29bb 2018 20.0 \n", + "280 262e24f9-69e0-4da5-ac52-b7aeb16d29bb 2018 15.0 \n", + "588 262e24f9-69e0-4da5-ac52-b7aeb16d29bb 2018 20.0 \n", "\n", - " purpose transaction_type \\\n", - "0 bob worsley for state senate contribute to a candidate committee \n", - "1 drew john for state house contribute to a candidate committee \n", - "2 elect karen fann ld1 contribute to a candidate committee \n", - "3 elect noel campbell for house contribute to a candidate committee \n", - "4 closed to new donations refund from contrib to a cand committee \n", + " recipient_id office_sought purpose \\\n", + "7 015b3bd6-fa5d-445e-9ccb-d249d4ef5d18 none NaN \n", + "246 304dce88-03a4-4107-813a-72b32a2398a6 none NaN \n", + "271 f31c772c-02e1-4b60-99fe-8a18195d04de none NaN \n", + "280 f31c772c-02e1-4b60-99fe-8a18195d04de none NaN \n", + "588 9cceeac2-3166-48e0-ae08-74e5a9d3c70c none NaN \n", "\n", - " donor_type recipient_type donor_office \\\n", - "0 NaN NaN NaN \n", - "1 NaN NaN NaN \n", - "2 NaN NaN NaN \n", - "3 NaN NaN NaN \n", - "4 NaN NaN NaN \n", + " transaction_type donor_type recipient_type donor_office \\\n", + "7 contribution from individuals NaN NaN NaN \n", + "246 contribution from individuals NaN NaN NaN \n", + "271 contribution from individuals NaN NaN NaN \n", + "280 contribution from individuals NaN NaN NaN \n", + "588 contribution from individuals NaN NaN NaN \n", "\n", - " recipient_name \n", - "0 #1022 arizona committee of automotive retailers \n", - "1 #1022 arizona committee of automotive retailers \n", - "2 #1022 arizona committee of automotive retailers \n", - "3 #1022 arizona committee of automotive retailers \n", - "4 #1022 arizona committee of automotive retailers " + " recipient_name \n", + "7 joseph w fisher,ii \n", + "246 janet wilson \n", + "271 deanna melendez \n", + "280 deanna melendez \n", + "588 gail kamaras " ] }, - "execution_count": 10, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -658,16 +704,16 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "87" + "105" ] }, - "execution_count": 13, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -679,7 +725,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -704,16 +750,12 @@ " \n", " \n", " id\n", - " first_name\n", - " last_name\n", " full_name\n", - " entity_type\n", " state\n", - " party\n", - " company\n", - " occupation\n", - " address\n", - " ...\n", + " entity_type\n", + " classification\n", + " transaction_id\n", + " donor_id\n", " year\n", " amount\n", " recipient_id\n", @@ -728,184 +770,161 @@ " \n", " \n", " \n", - " 55243\n", - " 0e24b503-b209-48b5-8edb-cca0cdaca78c\n", - " M.\n", - " TANG\n", - " m. tang ...\n", - " Individual\n", - " MD\n", - " NaN\n", - " NaN\n", + " 12011\n", + " 6c77a26b-7035-422f-bccb-4af4f400add8\n", + " mi act com for rural electrification\n", + " MI\n", + " corporation\n", + " neutral\n", " NaN\n", - " 6614 23RD PLACE\n", - " ...\n", + " 6c77a26b-7035-422f-bccb-4af4f400add8\n", " 2022.0\n", - " 2.0\n", - " 49a2d46f-5e75-433c-94fa-f910e66d1a1e\n", + " 2000.00\n", + " ed2344d4-6570-4093-9326-13ee37d99e6d\n", " NaN\n", " NaN\n", " direct\n", " NaN\n", " NaN\n", " NaN\n", - " None\n", + " cte dan lauwers for senate\n", " \n", " \n", - " 55244\n", - " 0e24b503-b209-48b5-8edb-cca0cdaca78c\n", - " M.\n", - " TANG\n", - " m. tang ...\n", - " Individual\n", - " MD\n", - " NaN\n", - " NaN\n", + " 12037\n", + " 563fb08b-8811-4d33-9fcf-450e3fcfc8a9\n", + " operating engineers local #324\n", + " MI\n", + " corporation\n", + " neutral\n", " NaN\n", - " 6614 23RD PLACE\n", - " ...\n", + " 563fb08b-8811-4d33-9fcf-450e3fcfc8a9\n", " 2022.0\n", - " 95.0\n", - " 49a2d46f-5e75-433c-94fa-f910e66d1a1e\n", + " 2500.00\n", + " 0b7514c0-c936-427c-8d0c-838534a1cb45\n", " NaN\n", " NaN\n", - " direct\n", + " direct/fund raiser\n", " NaN\n", " NaN\n", " NaN\n", - " None\n", + " committee to elect sara cambensy for 109th dis...\n", " \n", " \n", - " 55245\n", - " 0e24b503-b209-48b5-8edb-cca0cdaca78c\n", - " M.\n", - " TANG\n", - " m. tang ...\n", - " Individual\n", - " MD\n", - " NaN\n", - " NaN\n", + " 12039\n", + " cc7fcdbd-9fce-4aad-98ac-36441d4986fc\n", + " house republican camp committe\n", + " MI\n", + " corporation\n", + " neutral\n", " NaN\n", - " 6614 23RD PLACE\n", - " ...\n", + " cc7fcdbd-9fce-4aad-98ac-36441d4986fc\n", " 2022.0\n", - " 10.0\n", - " 49a2d46f-5e75-433c-94fa-f910e66d1a1e\n", + " 500.00\n", + " 76d1b93c-bd7f-4c90-9940-e9b843e45ee2\n", " NaN\n", + " direct contribution\n", " NaN\n", - " direct\n", " NaN\n", " NaN\n", " NaN\n", - " None\n", + " michigan motorcycle riders pac\n", " \n", " \n", - " 55246\n", - " a23037f6-741c-43a5-8a6d-0f1db4371e1d\n", - " OLIVIA N\n", - " DALMASSO\n", - " olivia n dalmasso ...\n", - " Individual\n", - " IL\n", - " NaN\n", - " NaN\n", + " 12057\n", + " 3941536a-03a8-4049-b35b-6a975e1bbbf4\n", + " van dessel kathleen\n", + " MI\n", + " corporation\n", + " neutral\n", " NaN\n", - " PO BOX 574\n", - " ...\n", + " 3941536a-03a8-4049-b35b-6a975e1bbbf4\n", " 2022.0\n", - " 12.6\n", - " 6b33721f-3f6a-47c0-bce2-284fc58e0d2a\n", + " 26.01\n", + " 501217db-524f-4534-848e-78b9afe68961\n", " NaN\n", " NaN\n", " direct\n", " NaN\n", " NaN\n", " NaN\n", - " None\n", + " voters action committee (superpac)\n", " \n", " \n", - " 55247\n", - " a23037f6-741c-43a5-8a6d-0f1db4371e1d\n", - " OLIVIA N\n", - " DALMASSO\n", - " olivia n dalmasso ...\n", - " Individual\n", - " IL\n", - " NaN\n", - " NaN\n", + " 12058\n", + " 3941536a-03a8-4049-b35b-6a975e1bbbf4\n", + " van dessel kathleen\n", + " MI\n", + " corporation\n", + " neutral\n", " NaN\n", - " PO BOX 574\n", - " ...\n", + " 3941536a-03a8-4049-b35b-6a975e1bbbf4\n", " 2022.0\n", - " 4.2\n", - " 6b33721f-3f6a-47c0-bce2-284fc58e0d2a\n", + " 26.55\n", + " 501217db-524f-4534-848e-78b9afe68961\n", " NaN\n", " NaN\n", " direct\n", " NaN\n", " NaN\n", " NaN\n", - " None\n", + " voters action committee (superpac)\n", " \n", " \n", "\n", - "

5 rows × 25 columns

\n", "" ], "text/plain": [ - " id first_name \\\n", - "55243 0e24b503-b209-48b5-8edb-cca0cdaca78c M. \n", - "55244 0e24b503-b209-48b5-8edb-cca0cdaca78c M. \n", - "55245 0e24b503-b209-48b5-8edb-cca0cdaca78c M. \n", - "55246 a23037f6-741c-43a5-8a6d-0f1db4371e1d OLIVIA N \n", - "55247 a23037f6-741c-43a5-8a6d-0f1db4371e1d OLIVIA N \n", - "\n", - " last_name \\\n", - "55243 TANG \n", - "55244 TANG \n", - "55245 TANG \n", - "55246 DALMASSO \n", - "55247 DALMASSO \n", + " id \\\n", + "12011 6c77a26b-7035-422f-bccb-4af4f400add8 \n", + "12037 563fb08b-8811-4d33-9fcf-450e3fcfc8a9 \n", + "12039 cc7fcdbd-9fce-4aad-98ac-36441d4986fc \n", + "12057 3941536a-03a8-4049-b35b-6a975e1bbbf4 \n", + "12058 3941536a-03a8-4049-b35b-6a975e1bbbf4 \n", "\n", - " full_name entity_type state \\\n", - "55243 m. tang ... Individual MD \n", - "55244 m. tang ... Individual MD \n", - "55245 m. tang ... Individual MD \n", - "55246 olivia n dalmasso ... Individual IL \n", - "55247 olivia n dalmasso ... Individual IL \n", + " full_name state entity_type \\\n", + "12011 mi act com for rural electrification MI corporation \n", + "12037 operating engineers local #324 MI corporation \n", + "12039 house republican camp committe MI corporation \n", + "12057 van dessel kathleen MI corporation \n", + "12058 van dessel kathleen MI corporation \n", "\n", - " party company occupation address ... year amount \\\n", - "55243 NaN NaN NaN 6614 23RD PLACE ... 2022.0 2.0 \n", - "55244 NaN NaN NaN 6614 23RD PLACE ... 2022.0 95.0 \n", - "55245 NaN NaN NaN 6614 23RD PLACE ... 2022.0 10.0 \n", - "55246 NaN NaN NaN PO BOX 574 ... 2022.0 12.6 \n", - "55247 NaN NaN NaN PO BOX 574 ... 2022.0 4.2 \n", + " classification transaction_id donor_id \\\n", + "12011 neutral NaN 6c77a26b-7035-422f-bccb-4af4f400add8 \n", + "12037 neutral NaN 563fb08b-8811-4d33-9fcf-450e3fcfc8a9 \n", + "12039 neutral NaN cc7fcdbd-9fce-4aad-98ac-36441d4986fc \n", + "12057 neutral NaN 3941536a-03a8-4049-b35b-6a975e1bbbf4 \n", + "12058 neutral NaN 3941536a-03a8-4049-b35b-6a975e1bbbf4 \n", "\n", - " recipient_id office_sought purpose \\\n", - "55243 49a2d46f-5e75-433c-94fa-f910e66d1a1e NaN NaN \n", - "55244 49a2d46f-5e75-433c-94fa-f910e66d1a1e NaN NaN \n", - "55245 49a2d46f-5e75-433c-94fa-f910e66d1a1e NaN NaN \n", - "55246 6b33721f-3f6a-47c0-bce2-284fc58e0d2a NaN NaN \n", - "55247 6b33721f-3f6a-47c0-bce2-284fc58e0d2a NaN NaN \n", + " year amount recipient_id office_sought \\\n", + "12011 2022.0 2000.00 ed2344d4-6570-4093-9326-13ee37d99e6d NaN \n", + "12037 2022.0 2500.00 0b7514c0-c936-427c-8d0c-838534a1cb45 NaN \n", + "12039 2022.0 500.00 76d1b93c-bd7f-4c90-9940-e9b843e45ee2 NaN \n", + "12057 2022.0 26.01 501217db-524f-4534-848e-78b9afe68961 NaN \n", + "12058 2022.0 26.55 501217db-524f-4534-848e-78b9afe68961 NaN \n", "\n", - " transaction_type donor_type recipient_type donor_office \\\n", - "55243 direct NaN NaN NaN \n", - "55244 direct NaN NaN NaN \n", - "55245 direct NaN NaN NaN \n", - "55246 direct NaN NaN NaN \n", - "55247 direct NaN NaN NaN \n", + " purpose transaction_type donor_type \\\n", + "12011 NaN direct NaN \n", + "12037 NaN direct/fund raiser NaN \n", + "12039 direct contribution NaN NaN \n", + "12057 NaN direct NaN \n", + "12058 NaN direct NaN \n", "\n", - " recipient_name \n", - "55243 None \n", - "55244 None \n", - "55245 None \n", - "55246 None \n", - "55247 None \n", + " recipient_type donor_office \\\n", + "12011 NaN NaN \n", + "12037 NaN NaN \n", + "12039 NaN NaN \n", + "12057 NaN NaN \n", + "12058 NaN NaN \n", "\n", - "[5 rows x 25 columns]" + " recipient_name \n", + "12011 cte dan lauwers for senate \n", + "12037 committee to elect sara cambensy for 109th dis... \n", + "12039 michigan motorcycle riders pac \n", + "12057 voters action committee (superpac) \n", + "12058 voters action committee (superpac) " ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -915,37 +934,16 @@ "# is lost\n", "merged_inds_sample = pd.merge(inds_df,transactions,how='left',left_on='id',right_on='donor_id')\n", "merged_inds_sample.dropna(subset = ['amount'], inplace=True)\n", - "merged_inds_sample.tail(5)" + "merged_orgs_sample = pd.merge(orgs_df,transactions,how='left',left_on='id',right_on='donor_id')\n", + "merged_orgs_sample.dropna(subset = ['amount'], inplace=True)\n", + "merged_orgs_sample = merged_orgs_sample.rename(columns={'name':'full_name'})\n", + "\n", + "merged_orgs_sample.tail(5)" ] }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['id', 'first_name', 'last_name', 'full_name', 'entity_type', 'state',\n", - " 'party', 'company', 'occupation', 'address', 'zip', 'city',\n", - " 'classification', 'transaction_id', 'donor_id', 'year', 'amount',\n", - " 'recipient_id', 'office_sought', 'purpose', 'transaction_type',\n", - " 'donor_type', 'recipient_type', 'donor_office', 'recipient_name'],\n", - " dtype='object')" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "merged_inds_sample.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -969,149 +967,149 @@ " \n", " \n", " \n", + " id\n", + " full_name\n", + " state\n", + " entity_type\n", + " classification\n", + " transaction_id\n", " donor_id\n", + " year\n", + " amount\n", " recipient_id\n", - " full_name\n", + " ...\n", + " donor_office\n", " recipient_name\n", - " address\n", - " amount\n", - " city\n", - " classification\n", + " first_name\n", + " last_name\n", + " party\n", " company\n", - " donor_office\n", - " ...\n", " occupation\n", - " office_sought\n", - " party\n", - " purpose\n", - " recipient_type\n", - " state\n", - " transaction_id\n", - " transaction_type\n", - " year\n", + " address\n", " zip\n", + " city\n", " \n", " \n", " \n", " \n", - " 0\n", - " 0007b184-4e1d-401a-ba51-99733d2e13e7\n", - " d461f2bd-9074-44b3-8948-e659bead3e58\n", - " graham filler ...\n", - " saginaw county republican committee\n", - " 12705 WARM CREEK\n", - " 500.00\n", - " DEWITT\n", - " neutral\n", - " None\n", - " None\n", - " ...\n", - " None\n", - " None\n", - " None\n", - " None\n", - " None\n", + " 4\n", + " 041ae77f-bc8f-42e4-88d9-3db7177106ce\n", + " gale stephen\n", " MI\n", - " None\n", - " direct\n", + " corporation\n", + " neutral\n", + " NaN\n", + " 041ae77f-bc8f-42e4-88d9-3db7177106ce\n", " 2022.0\n", - " 48820-0000\n", + " 50.0\n", + " 501217db-524f-4534-848e-78b9afe68961\n", + " ...\n", + " NaN\n", + " voters action committee (superpac)\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", " \n", " \n", - " 1\n", - " 00523627-46c7-4f76-ab42-fb2c1fbac1b1\n", - " 6126e78b-4e80-4361-a019-9d99aa1623ed\n", - " daniel millstone ...\n", - " rooted in community leadership pac\n", - " 10518 ROUNTREE RD\n", - " 0.77\n", - " LOS ANGELES\n", + " 22\n", + " a927c8d6-bfba-4a0c-97a6-72ab136a1dd5\n", + " connor loftus\n", + " MI\n", + " corporation\n", " neutral\n", - " None\n", - " None\n", - " ...\n", - " None\n", - " None\n", - " None\n", - " None\n", - " None\n", - " CA\n", - " None\n", - " direct\n", + " NaN\n", + " a927c8d6-bfba-4a0c-97a6-72ab136a1dd5\n", " 2022.0\n", - " 90064-0000\n", + " 500.0\n", + " 0b7514c0-c936-427c-8d0c-838534a1cb45\n", + " ...\n", + " NaN\n", + " committee to elect sara cambensy for 109th dis...\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", " \n", " \n", - " 2\n", - " 00934782-86e5-4941-94cf-0a700100a2c0\n", - " 2d1a0919-218e-4692-98ec-c4a73a126482\n", - " josie petersheim ...\n", - " mi greenstone pac\n", - " 7196 W. BRIGGS RD.\n", - " 25.00\n", - " STANTON\n", - " neutral\n", - " None\n", - " None\n", - " ...\n", - " None\n", - " None\n", - " None\n", - " None\n", - " None\n", + " 23\n", + " a927c8d6-bfba-4a0c-97a6-72ab136a1dd5\n", + " connor loftus\n", " MI\n", - " None\n", - " direct\n", + " corporation\n", + " neutral\n", + " NaN\n", + " a927c8d6-bfba-4a0c-97a6-72ab136a1dd5\n", " 2022.0\n", - " 48888-0000\n", + " 450.0\n", + " 0b7514c0-c936-427c-8d0c-838534a1cb45\n", + " ...\n", + " NaN\n", + " committee to elect sara cambensy for 109th dis...\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", " \n", " \n", - " 3\n", - " 00f22bdd-96bf-4074-9620-4737e8444958\n", - " af8417ee-5bca-49f5-91e9-d2de65d73631\n", - " robert doerfler ...\n", - " michigan senate democratic fund\n", - " 1534 NE 5TH AVE\n", - " 50.00\n", - " FORT LAUDERDALE\n", + " 55\n", + " 1d5af863-be97-4601-93a0-e0d623281538\n", + " williamsjason\n", + " MI\n", + " corporation\n", " neutral\n", - " None\n", - " None\n", - " ...\n", - " None\n", - " None\n", - " None\n", - " None\n", - " None\n", - " FL\n", - " None\n", - " direct\n", + " NaN\n", + " 1d5af863-be97-4601-93a0-e0d623281538\n", " 2022.0\n", - " 33304-1006\n", + " 7.0\n", + " 44751f04-3ce1-4288-979c-8a35b9d5e89c\n", + " ...\n", + " NaN\n", + " teamsters 243 political action committee\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", " \n", " \n", - " 4\n", - " 0138403b-b5b9-453a-a1d2-b6ed9fa5fe58\n", - " 6126e78b-4e80-4361-a019-9d99aa1623ed\n", - " joseph martinez ...\n", - " rooted in community leadership pac\n", - " 139 HURON AVE\n", - " 1.65\n", - " MOUNT CLEMENS\n", - " neutral\n", - " None\n", - " None\n", - " ...\n", - " None\n", - " None\n", - " None\n", - " None\n", - " None\n", + " 56\n", + " 1d5af863-be97-4601-93a0-e0d623281538\n", + " williamsjason\n", " MI\n", - " None\n", - " direct\n", + " corporation\n", + " neutral\n", + " NaN\n", + " 1d5af863-be97-4601-93a0-e0d623281538\n", " 2022.0\n", - " 48043-0000\n", + " 6.0\n", + " 44751f04-3ce1-4288-979c-8a35b9d5e89c\n", + " ...\n", + " NaN\n", + " teamsters 243 political action committee\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", " \n", " \n", " ...\n", @@ -1138,596 +1136,424 @@ " ...\n", " \n", " \n", - " 1120\n", - " fdccce6b-e55f-4f1d-bd95-1714f2a667ed\n", - " a3fe20e2-8019-448e-9b54-bfdce4d87f2f\n", - " michael olthoff ...\n", - " bumstead leadership fund\n", - " 1499 MIDDLEBROOK DR\n", - " 1000.00\n", - " NORTON SHORES\n", + " 34717\n", + " a79d898d-37a9-4dac-9434-4345c4491726\n", + " richard hill ...\n", + " MI\n", + " Individual\n", " neutral\n", - " nichols\n", - " None\n", + " NaN\n", + " a79d898d-37a9-4dac-9434-4345c4491726\n", + " 2022.0\n", + " 250.0\n", + " 666d21c4-f346-46e7-8949-1431dfeba9f6\n", " ...\n", - " ceo\n", - " None\n", - " None\n", - " None\n", - " None\n", - " MI\n", + " NaN\n", " None\n", - " direct\n", - " 2022.0\n", - " 49441-0000\n", + " RICHARD\n", + " HILL\n", + " NaN\n", + " NaN\n", + " NaN\n", + " 31853 EDWARDS ST\n", + " 49047-9324\n", + " DOWAGIAC\n", " \n", " \n", - " 1121\n", - " fe969829-b8a4-4d38-88e2-8314b340d567\n", - " 6126e78b-4e80-4361-a019-9d99aa1623ed\n", - " joanna simon ...\n", - " rooted in community leadership pac\n", - " 1546 POPLAR GROVE DR\n", - " 3.82\n", - " RESTON\n", + " 34718\n", + " bd535dbd-d8b7-4d42-bfaf-99fa4c91aabe\n", + " fern slotman ^ ...\n", + " MI\n", + " Individual\n", " neutral\n", - " None\n", - " None\n", + " NaN\n", + " bd535dbd-d8b7-4d42-bfaf-99fa4c91aabe\n", + " 2022.0\n", + " 20.0\n", + " 2170560a-af48-498f-9b55-01f5b74a3fcd\n", " ...\n", + " NaN\n", " None\n", - " None\n", - " None\n", - " None\n", - " None\n", - " VA\n", - " None\n", - " direct\n", - " 2022.0\n", - " 20194-1731\n", + " FERN\n", + " SLOTMAN ^\n", + " NaN\n", + " jackie's place restaurant\n", + " waitress\n", + " 4354 127TH AVE\n", + " 49010-0000\n", + " ALLEGAN\n", " \n", " \n", - " 1122\n", - " ff1423ba-ff5e-4bc1-b864-303a9dcc9b32\n", - " 6126e78b-4e80-4361-a019-9d99aa1623ed\n", - " adriana p{on ce ...\n", - " rooted in community leadership pac\n", - " 9 BIRCH CT\n", - " 3.82\n", - " NORMAL\n", + " 34719\n", + " 7d719953-640a-43b3-9d6c-91951ba89863\n", + " karen macdonell ...\n", + " MI\n", + " Individual\n", " neutral\n", - " None\n", - " None\n", + " NaN\n", + " 7d719953-640a-43b3-9d6c-91951ba89863\n", + " 2022.0\n", + " 10.0\n", + " 092ed0bf-ecbd-40a5-aa14-e81b534939a9\n", " ...\n", + " NaN\n", " None\n", - " None\n", - " None\n", - " None\n", - " None\n", - " IL\n", - " None\n", - " direct\n", - " 2022.0\n", - " 61761-3900\n", + " KAREN\n", + " MACDONELL\n", + " NaN\n", + " NaN\n", + " NaN\n", + " 21758 RATHLONE DR\n", + " 48167-2829\n", + " NORTHVILLE\n", " \n", " \n", - " 1123\n", - " ff24644e-d64a-4a8a-a87f-cdb53b86dd63\n", - " 6126e78b-4e80-4361-a019-9d99aa1623ed\n", - " david friedman ...\n", - " rooted in community leadership pac\n", - " 8823 MOUNTAIN PATH CIR\n", - " 0.15\n", - " AUSTIN\n", + " 34720\n", + " 628ddb92-06d8-4bf0-aa5c-0e3af4fa4c18\n", + " ellen trzaskowski ...\n", + " AZ\n", + " Individual\n", " neutral\n", - " None\n", - " None\n", + " NaN\n", + " 628ddb92-06d8-4bf0-aa5c-0e3af4fa4c18\n", + " 2022.0\n", + " 25.0\n", + " 49a2d46f-5e75-433c-94fa-f910e66d1a1e\n", " ...\n", + " NaN\n", " None\n", - " None\n", - " None\n", - " None\n", - " None\n", - " TX\n", - " None\n", - " direct\n", - " 2022.0\n", - " 78759-0000\n", + " ELLEN\n", + " TRZASKOWSKI\n", + " NaN\n", + " NaN\n", + " NaN\n", + " 1984 E BALBOA DR\n", + " 85282-0000\n", + " TEMPE\n", " \n", " \n", - " 1124\n", - " ffb25947-c03f-43b2-abb4-23531cdb7324\n", - " 7f272fe4-d592-453c-9ca1-315ea3fdcff1\n", - " dennis starner ...\n", - " bill g schuette for state representative\n", - " 4612 CONGRESS DRIVE\n", - " 525.00\n", - " MIDLAND\n", + " 34721\n", + " 628ddb92-06d8-4bf0-aa5c-0e3af4fa4c18\n", + " ellen trzaskowski ...\n", + " AZ\n", + " Individual\n", " neutral\n", - " retired\n", - " None\n", + " NaN\n", + " 628ddb92-06d8-4bf0-aa5c-0e3af4fa4c18\n", + " 2022.0\n", + " 15.0\n", + " 49a2d46f-5e75-433c-94fa-f910e66d1a1e\n", " ...\n", - " retired\n", - " None\n", - " None\n", - " None\n", - " None\n", - " MI\n", + " NaN\n", " None\n", - " direct/fund raiser\n", - " 2022.0\n", - " 48642-0000\n", + " ELLEN\n", + " TRZASKOWSKI\n", + " NaN\n", + " NaN\n", + " NaN\n", + " 1984 E BALBOA DR\n", + " 85282-0000\n", + " TEMPE\n", " \n", " \n", "\n", - "

1125 rows × 25 columns

\n", + "

36946 rows × 25 columns

\n", "" ], "text/plain": [ - " donor_id \\\n", - "0 0007b184-4e1d-401a-ba51-99733d2e13e7 \n", - "1 00523627-46c7-4f76-ab42-fb2c1fbac1b1 \n", - "2 00934782-86e5-4941-94cf-0a700100a2c0 \n", - "3 00f22bdd-96bf-4074-9620-4737e8444958 \n", - "4 0138403b-b5b9-453a-a1d2-b6ed9fa5fe58 \n", - "... ... \n", - "1120 fdccce6b-e55f-4f1d-bd95-1714f2a667ed \n", - "1121 fe969829-b8a4-4d38-88e2-8314b340d567 \n", - "1122 ff1423ba-ff5e-4bc1-b864-303a9dcc9b32 \n", - "1123 ff24644e-d64a-4a8a-a87f-cdb53b86dd63 \n", - "1124 ffb25947-c03f-43b2-abb4-23531cdb7324 \n", + " id \\\n", + "4 041ae77f-bc8f-42e4-88d9-3db7177106ce \n", + "22 a927c8d6-bfba-4a0c-97a6-72ab136a1dd5 \n", + "23 a927c8d6-bfba-4a0c-97a6-72ab136a1dd5 \n", + "55 1d5af863-be97-4601-93a0-e0d623281538 \n", + "56 1d5af863-be97-4601-93a0-e0d623281538 \n", + "... ... \n", + "34717 a79d898d-37a9-4dac-9434-4345c4491726 \n", + "34718 bd535dbd-d8b7-4d42-bfaf-99fa4c91aabe \n", + "34719 7d719953-640a-43b3-9d6c-91951ba89863 \n", + "34720 628ddb92-06d8-4bf0-aa5c-0e3af4fa4c18 \n", + "34721 628ddb92-06d8-4bf0-aa5c-0e3af4fa4c18 \n", + "\n", + " full_name state entity_type \\\n", + "4 gale stephen MI corporation \n", + "22 connor loftus MI corporation \n", + "23 connor loftus MI corporation \n", + "55 williamsjason MI corporation \n", + "56 williamsjason MI corporation \n", + "... ... ... ... \n", + "34717 richard hill ... MI Individual \n", + "34718 fern slotman ^ ... MI Individual \n", + "34719 karen macdonell ... MI Individual \n", + "34720 ellen trzaskowski ... AZ Individual \n", + "34721 ellen trzaskowski ... AZ Individual \n", "\n", - " recipient_id \\\n", - "0 d461f2bd-9074-44b3-8948-e659bead3e58 \n", - "1 6126e78b-4e80-4361-a019-9d99aa1623ed \n", - "2 2d1a0919-218e-4692-98ec-c4a73a126482 \n", - "3 af8417ee-5bca-49f5-91e9-d2de65d73631 \n", - "4 6126e78b-4e80-4361-a019-9d99aa1623ed \n", - "... ... \n", - "1120 a3fe20e2-8019-448e-9b54-bfdce4d87f2f \n", - "1121 6126e78b-4e80-4361-a019-9d99aa1623ed \n", - "1122 6126e78b-4e80-4361-a019-9d99aa1623ed \n", - "1123 6126e78b-4e80-4361-a019-9d99aa1623ed \n", - "1124 7f272fe4-d592-453c-9ca1-315ea3fdcff1 \n", + " classification transaction_id donor_id \\\n", + "4 neutral NaN 041ae77f-bc8f-42e4-88d9-3db7177106ce \n", + "22 neutral NaN a927c8d6-bfba-4a0c-97a6-72ab136a1dd5 \n", + "23 neutral NaN a927c8d6-bfba-4a0c-97a6-72ab136a1dd5 \n", + "55 neutral NaN 1d5af863-be97-4601-93a0-e0d623281538 \n", + "56 neutral NaN 1d5af863-be97-4601-93a0-e0d623281538 \n", + "... ... ... ... \n", + "34717 neutral NaN a79d898d-37a9-4dac-9434-4345c4491726 \n", + "34718 neutral NaN bd535dbd-d8b7-4d42-bfaf-99fa4c91aabe \n", + "34719 neutral NaN 7d719953-640a-43b3-9d6c-91951ba89863 \n", + "34720 neutral NaN 628ddb92-06d8-4bf0-aa5c-0e3af4fa4c18 \n", + "34721 neutral NaN 628ddb92-06d8-4bf0-aa5c-0e3af4fa4c18 \n", "\n", - " full_name \\\n", - "0 graham filler ... \n", - "1 daniel millstone ... \n", - "2 josie petersheim ... \n", - "3 robert doerfler ... \n", - "4 joseph martinez ... \n", - "... ... \n", - "1120 michael olthoff ... \n", - "1121 joanna simon ... \n", - "1122 adriana p{on ce ... \n", - "1123 david friedman ... \n", - "1124 dennis starner ... \n", + " year amount recipient_id ... donor_office \\\n", + "4 2022.0 50.0 501217db-524f-4534-848e-78b9afe68961 ... NaN \n", + "22 2022.0 500.0 0b7514c0-c936-427c-8d0c-838534a1cb45 ... NaN \n", + "23 2022.0 450.0 0b7514c0-c936-427c-8d0c-838534a1cb45 ... NaN \n", + "55 2022.0 7.0 44751f04-3ce1-4288-979c-8a35b9d5e89c ... NaN \n", + "56 2022.0 6.0 44751f04-3ce1-4288-979c-8a35b9d5e89c ... NaN \n", + "... ... ... ... ... ... \n", + "34717 2022.0 250.0 666d21c4-f346-46e7-8949-1431dfeba9f6 ... NaN \n", + "34718 2022.0 20.0 2170560a-af48-498f-9b55-01f5b74a3fcd ... NaN \n", + "34719 2022.0 10.0 092ed0bf-ecbd-40a5-aa14-e81b534939a9 ... NaN \n", + "34720 2022.0 25.0 49a2d46f-5e75-433c-94fa-f910e66d1a1e ... NaN \n", + "34721 2022.0 15.0 49a2d46f-5e75-433c-94fa-f910e66d1a1e ... NaN \n", "\n", - " recipient_name address \\\n", - "0 saginaw county republican committee 12705 WARM CREEK \n", - "1 rooted in community leadership pac 10518 ROUNTREE RD \n", - "2 mi greenstone pac 7196 W. BRIGGS RD. \n", - "3 michigan senate democratic fund 1534 NE 5TH AVE \n", - "4 rooted in community leadership pac 139 HURON AVE \n", - "... ... ... \n", - "1120 bumstead leadership fund 1499 MIDDLEBROOK DR \n", - "1121 rooted in community leadership pac 1546 POPLAR GROVE DR \n", - "1122 rooted in community leadership pac 9 BIRCH CT \n", - "1123 rooted in community leadership pac 8823 MOUNTAIN PATH CIR \n", - "1124 bill g schuette for state representative 4612 CONGRESS DRIVE \n", + " recipient_name \\\n", + "4 voters action committee (superpac) \n", + "22 committee to elect sara cambensy for 109th dis... \n", + "23 committee to elect sara cambensy for 109th dis... \n", + "55 teamsters 243 political action committee \n", + "56 teamsters 243 political action committee \n", + "... ... \n", + "34717 None \n", + "34718 None \n", + "34719 None \n", + "34720 None \n", + "34721 None \n", "\n", - " amount city classification company donor_office ... \\\n", - "0 500.00 DEWITT neutral None None ... \n", - "1 0.77 LOS ANGELES neutral None None ... \n", - "2 25.00 STANTON neutral None None ... \n", - "3 50.00 FORT LAUDERDALE neutral None None ... \n", - "4 1.65 MOUNT CLEMENS neutral None None ... \n", - "... ... ... ... ... ... ... \n", - "1120 1000.00 NORTON SHORES neutral nichols None ... \n", - "1121 3.82 RESTON neutral None None ... \n", - "1122 3.82 NORMAL neutral None None ... \n", - "1123 0.15 AUSTIN neutral None None ... \n", - "1124 525.00 MIDLAND neutral retired None ... \n", + " first_name last_name party \\\n", + "4 NaN NaN NaN \n", + "22 NaN NaN NaN \n", + "23 NaN NaN NaN \n", + "55 NaN NaN NaN \n", + "56 NaN NaN NaN \n", + "... ... ... ... \n", + "34717 RICHARD HILL NaN \n", + "34718 FERN SLOTMAN ^ NaN \n", + "34719 KAREN MACDONELL NaN \n", + "34720 ELLEN TRZASKOWSKI NaN \n", + "34721 ELLEN TRZASKOWSKI NaN \n", "\n", - " occupation office_sought party purpose recipient_type state \\\n", - "0 None None None None None MI \n", - "1 None None None None None CA \n", - "2 None None None None None MI \n", - "3 None None None None None FL \n", - "4 None None None None None MI \n", - "... ... ... ... ... ... ... \n", - "1120 ceo None None None None MI \n", - "1121 None None None None None VA \n", - "1122 None None None None None IL \n", - "1123 None None None None None TX \n", - "1124 retired None None None None MI \n", + " company occupation address zip \\\n", + "4 NaN NaN NaN NaN \n", + "22 NaN NaN NaN NaN \n", + "23 NaN NaN NaN NaN \n", + "55 NaN NaN NaN NaN \n", + "56 NaN NaN NaN NaN \n", + "... ... ... ... ... \n", + "34717 NaN NaN 31853 EDWARDS ST 49047-9324 \n", + "34718 jackie's place restaurant waitress 4354 127TH AVE 49010-0000 \n", + "34719 NaN NaN 21758 RATHLONE DR 48167-2829 \n", + "34720 NaN NaN 1984 E BALBOA DR 85282-0000 \n", + "34721 NaN NaN 1984 E BALBOA DR 85282-0000 \n", "\n", - " transaction_id transaction_type year zip \n", - "0 None direct 2022.0 48820-0000 \n", - "1 None direct 2022.0 90064-0000 \n", - "2 None direct 2022.0 48888-0000 \n", - "3 None direct 2022.0 33304-1006 \n", - "4 None direct 2022.0 48043-0000 \n", - "... ... ... ... ... \n", - "1120 None direct 2022.0 49441-0000 \n", - "1121 None direct 2022.0 20194-1731 \n", - "1122 None direct 2022.0 61761-3900 \n", - "1123 None direct 2022.0 78759-0000 \n", - "1124 None direct/fund raiser 2022.0 48642-0000 \n", + " city \n", + "4 NaN \n", + "22 NaN \n", + "23 NaN \n", + "55 NaN \n", + "56 NaN \n", + "... ... \n", + "34717 DOWAGIAC \n", + "34718 ALLEGAN \n", + "34719 NORTHVILLE \n", + "34720 TEMPE \n", + "34721 TEMPE \n", "\n", - "[1125 rows x 25 columns]" + "[36946 rows x 25 columns]" ] }, - "execution_count": 14, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "attribute_cols = merged_inds_sample.columns.difference(['donor_id','recipient_id','full_name','recipient_name'])\n", - "agg_functions = {col: 'sum' if col == 'amount' else 'first' for col in attribute_cols}\n", - "grouped_sample = merged_inds_sample.groupby(['donor_id','recipient_id','full_name','recipient_name']).agg(agg_functions).reset_index()\n", - "grouped_sample" + "merged_sample = pd.concat([merged_orgs_sample, merged_inds_sample])\n", + "merged_sample" ] }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph:\n", - " G = nx.MultiDiGraph()\n", - " # first check if df is individuals or organizations dataset\n", - " if \"name\" in df.columns:\n", - " node_name = \"name\"\n", - " else:\n", - " node_name = \"full_name\"\n", - " \n", - " transact_info = ['office_sought', 'purpose', 'transaction_type', 'year','transaction_id','donor_office','amount']\n", - " for _, row in df.iterrows(): \n", - " # add node attributes based on the columns relevant to the entity\n", - " G.add_node(row[node_name])\n", - " for column in df.columns.difference(transact_info):\n", - " if not pd.isnull(row[column]):\n", - " G.nodes[row[node_name]][column] = row[column]\n", - " \n", - " # link the donor node to the recipient node. add the attributes of the\n", - " # edge based on relevant nodes \n", - " edge_dictionary = {}\n", - " for column in transact_info:\n", - " if not pd.isnull(row[column]):\n", - " edge_dictionary[column] = row[column]\n", - " G.add_edge(row[node_name], row['recipient_name'], **edge_dictionary)\n", - "\n", - " # the added 'recipient_name' node has no attributes at this moment\n", - " # for the final code this line won't be necessary, as each recipient\n", - " # should ideally be referenced later on. For now, all added nodes for\n", - " # the recipient will only have one default attribute: classification\n", - " G.nodes[row['recipient_name']]['classification'] = 'neutral' \n", - " \n", - " edge_labels = {(u,v):d['amount'] for u,v,d in G.edges(data=True)}\n", - " entity_colors = {'neutral': 'green', 'c':'blue', 'f':'red'}\n", - " node_colors = [entity_colors[G.nodes[node]['classification']] for node in G.nodes()]\n", - "\n", - " nx.draw_planar(G, with_labels=False,node_color=node_colors)\n", - " plt.figure(3,figsize=(12,12)) \n", - " nx.draw_networkx_edge_labels(G, pos=nx.planar_layout(G),edge_labels=edge_labels, label_pos=0.5)\n", - "\n", - " #nx.draw_planar(G, with_labels=False)\n", - " plt.show()\n", - " return G" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 122, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#for u,v in G.nodes(data=True):\n", - " #print(u)#['classification'])\n", - " \n", - "G.nodes['michigan association of health plans political action committee']#['classification'])#['nancy davis ']['classification']" - ] - }, - { - "cell_type": "code", - "execution_count": 66, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array(['neutral', 'f'], dtype=object)" + "Index(['donor_id', 'recipient_id', 'full_name', 'recipient_name', 'address',\n", + " 'amount', 'city', 'classification', 'company', 'donor_office',\n", + " 'donor_type', 'entity_type', 'first_name', 'last_name', 'occupation',\n", + " 'office_sought', 'party', 'purpose', 'recipient_type', 'state',\n", + " 'transaction_id', 'transaction_type', 'year', 'zip'],\n", + " dtype='object')" ] }, - "execution_count": 66, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "grouped_sample.classification.unique()" + "attribute_cols = merged_sample.columns.difference(['donor_id','recipient_id','full_name','recipient_name'])\n", + "agg_functions = {col: 'sum' if col == 'amount' else 'first' for col in attribute_cols}\n", + "grouped_sample = merged_sample.groupby(['donor_id','recipient_id','full_name','recipient_name']).agg(agg_functions).reset_index()\n", + "grouped_sample = grouped_sample.drop(['id'], axis=1)\n", + "grouped_sample.columns" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 30, "metadata": {}, "outputs": [ { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAOwCAYAAAAKo+iFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKnElEQVR4nO3debTVdb3/8deZmA+HORUQTXFWBCk1KxWzLHCi1NSfWjmkZplD3fJmZlez69Rwy8xKUyu1LKXBMnM2tVJyJAQVNUANETggCIez9+8PF+deUoGDwOEDj8darjx7f/fe791a6nny+X4/35pqtVoNAAAAFKq2owcAAACAt0LYAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFq1+RgyqVSqZPn57GxsbU1NSs7pkAAABYz1Wr1cydOzcbbbRRamuXvSa7QmE7ffr0DB48eJUMBwAAACvqn//8ZwYNGrTMY1YobBsbG9vesGfPnm99MgAAAFiG5ubmDB48uK1Hl2WFwnbJ6cc9e/YUtgAAAKwxK3I5rM2jAAAAKFq7w7ZSqaS1tXV1zAIAAADt1u6wve6663LllVemWq2ujnkAAACgXdodtgsWLMh3v/vdPP/886tjHgAAAGiXdoVta2trBg4cmAkTJuQf//jH6poJAAAAVtgK7Yq8RJ8+fdK1a9fU1dWlpaVldc0EAAAAK6xdYXv99ddnyJAh6dKlSwYPHry6ZgIAAIAV1q6w3Xvvvd3HFgAAgLXKSt/HtlKprMo5AAAAYKW0K2ynTp2af/3rX5k7d25qa1e6iQEAAGCVaVedbrfddtlmm21y/PHH54knnlhdMwEAAMAKa1fY3nffffnhD3+Yf/zjHznuuOMyY8aM1TUXAAAArJB2he3WW2+dAw44IHfffXeee+65PPjgg6trLgAAAFghK3WhbGtra3r06JHp06ev6nkAAACgXdodtosWLcq5556bzp07Z+TIkatjJgAAAFhh7bqP7Sc+8Yk8/PDDmTFjRi644ILssMMOq2suAAAAWCHtCtvFixfnE5/4RA4++OBsttlmq2smAAAAWGHtCtsrr7wyTU1NbT9Xq9XU1NSs8qEAAABgRbUrbC+77LJ07tw5G264YYYOHZodd9xxNY0FAAAAK6ZdYfu9730vixYtyty5c9PY2Jhzzz03hx12WBoaGlbXfAAAALBM7doV+e67787UqVMzZ86cHHvssTn77LPdyxYAAIAO1a6wbWxsTLVaTZKcddZZGThwYO6///7VMhgAAACsiHaF7f/dLGrSpElZtGjRahkKAAAAVlS7wrampibVajUPPfRQTj311HTq1Cn777//6poNAAAAlqtdm0eNGDEis2bNyqxZszJy5Mh8/etfz6abbrq6ZgMAAIDlalfYHnTQQXn729+eESNGZKeddkriXrYAAAB0rJrqkt2glqG5uTlNTU2ZOXNm+vTp0/Z4pVJJbW27zmYGAACA5VrSoXPmzEnPnj2XeWy7qrS+fukFXlELAABAR2v3rsgAAACwNnlLS65CFwAAgI7W7tv9vNHPAhcAAICO0q5dkcePH5+XXnops2bNSkNDQ/r375/hw4dno402sjsyAAAAHaJdYfuBD3wgSdK1a9c0NDSktrY2O+64Y84777yMGDFitQwIAAAAy9KuU5H/+Mc/Zvbs2Zk9e3ZmzJiR3/72t+nUqVM++9nPrqbxAAAAYNnadR/bJfcPqlarqVQqqaurywsvvJAhQ4Zk/vz5qaurWxMzAwAAsI5bbfexbW1tbbuWdknE3nnnnXnb296WGTNmrPzEAAAAsJLadY1tXV1dampqsmjRorzwwgu5995788UvfjEf//jH07dv39U1IwAAALypdoXtu9/97jQ1NWXRokWZOXNm5s6dmzFjxuTEE09MQ0PD6poRAAAA3lS7wnbvvfdOa2trunfvniFDhuRd73pXtttuuyRxux8AAAA6RLs2j5o5c2Z69OiRTp06LfV8pVJJbW27LtcFAACAN7XaNo+qr69/XdQmEbUAAAB0GEUKAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtrAeWYHbVgMAQHGELaxHampq2v6+UqmkUqksFbuzZs3Kiy++2BGjAQDASqvv6AGANeNnP/tZXn311bznPe/J0KFDU1v7+j/X+ta3vpUuXbrkC1/4QgdMCAAAK0fYwnrixBNPTHNzc+rq6tK1a9dst9122W233bLHHntk5513Tr9+/XLdddflqKOO6uhRAQCgXYQtrAdeffXV9OvXL9/4xjey/fbb59FHH81f/vKX3H777fn+97+fefPmZaONNsr06dOz//77d/S4AADQLsIW1gP/+te/Mnz48NTV1WXkyJHZaaedctRRR+WVV17JzJkzM2XKlPz85z/PVVddla233rqjxwUAgHYRtrAe6NevX0444YQ0NTUleW0TqZqamjQ2NqaxsTGbbLJJ7rvvvvTr16+DJwUAgPYTtrAe6NatW0aNGrXMYxoaGnLcccetoYkAAGDVEbawHqhWq6lWq2+4E/ISRxxxRDp37rwGpwIAgFVD2MJ6YMmpx8uywQYbrKFpAABg1Xrz5RtgndDS0pLFixcv85gpU6bkD3/4wxqaCAAAVi0rtrCO++Y3v5k//vGPee9735t3vOMd2WabbTJgwIB06dKl7Zgf/ehHmThxYvbZZ58OnBQAAFaOsIV13I9//OO88sormT59es4555wkySabbJKddtopu+22W0aOHJmbbrope++9dwdPCgAAK0fYwjquR48e+exnP5tjjz02M2fOzKOPPpp7770399xzT84999zMnDkzLS0t+d73vtfRowIAwEoRtrAOa25uzgc+8IG2a2z79u2bPfbYI3vssUeSpFKp5A9/+EP222+/DB8+vAMnBQCAlSdsYR3W2NiYE044IYsWLXrD52trazN9+vR069YtnTp1WsPTAQDAqiFsYR1WU1OTDTfccJnHbL755vnWt761hiYCAIBVT9jCeu69731vdtttt44eAwAAVpqwhfVYtVpNbW1tamvd0hoAgHL5bRbWU6+++mouu+yy3HzzzR09CgAAvCXCFtYz1Wo1SfLUU0/lhBNOyH/913918EQAAPDWOBUZ1jM1NTVJkm233TaVSiUvv/xyB08EAABvjRVbWEedccYZS0Vra2trWlpaMnPmzLZV2yTp06dPR4wHAACrjLCFddDTTz+db3/72+nZs2eSZMKECfngBz+Yfv365R3veEc++clP5umnn+7gKQEAYNVwKjKsg2677bYMGjQo9fX1efjhh3PSSSeltbU1V155ZaZMmZJLL700EydOzF133dXRowIAwFsmbGEddMstt2SPPfZIkvzmN79J79698z//8z8ZMmRIkmSbbbbJZz/72fzmN7/Jvvvu24GTAgDAW+dUZFgHPfroo3nppZfy17/+Nb/61a/ynve8py1qk+T9739/Bg0alGnTpnXglAAAsGoIW1gHDRo0KE899VROOumkPPfcc+nbt2/bhlFL/vfxxx/Ptttu25FjAgDAKuFUZFgH/fGPf8yUKVPyyCOP5Iknnkjfvn1TU1OTarWaarWaG2+8MS0tLdl11107elQAAHjLhC2sY+bMmZOmpqZsuumm2XTTTZd6rqamJgsWLMhf//rXjB07NvX1/hUAAED5aqr/94aWb6K5uTlNTU2ZM2dO2+1DgLXTfvvtl3322ScnnnhikuSpp57KhAkT8uyzz2bgwIHZa6+90rlz5yxevDjdu3fv4GkBAOCNtadDLdfAOubuu+/Opz/96STJnXfemeOPPz7PPPNMNtlkkyxYsCAf+MAHcv7556epqamDJwUAgFXD5lGwDpk1a1bmzp2bkSNHpqWlJaeffnqGDx+eGTNm5M4778wFF1yQK6+8MjfffHNHjwoAAKuMsIV1yN13352+ffumd+/emTp1aubOnZuLLrooPXr0yIABA3LQQQflhBNOyE9/+tOOHhUAAFYZpyLDOmTSpEmZMWNGDj744Dz99NPZYIMN0qtXryRJpVJJbW1tNt9884wfP75jBwUAgFXIii2sQ/bee+987WtfS//+/dPY2JgRI0Zk3rx5SZLa2tf+cb/rrruyww47dOSYAACwSlmxhXXIsGHDMmzYsFQqlcybNy9z5sxpW7FNkl/+8pd56KGH8p3vfKfjhgQAgFVM2MI6qLa2Nj179nzdtugjR47M+eefn/e85z0dNBkAAKx6whbWI0OGDMmQIUM6egwAAFilXGMLAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7awDqpWqx09AgAArDH1HT0A8NbNnj07zz77bCqVSoYPH56ampqOHgkAANYYK7ZQuCeeeCInnHBChg8fnp122im77bZbHnvssaWOmTlzZmbMmNFBEwIAwOolbKFwX/nKV/Lyyy/nL3/5S55++un06NEjZ5xxRpqbm9uOOf/883PjjTd23JAAALAaCVso3B//+Mecc845ecc73pFNNtkk3/3udzN58uT86Ec/ajvmiiuuSM+ePTtwSgAAWH2ELRRs6tSp6dq1a/r379/22Oabb57zzjsvX/va1zJx4sTMnTs3s2fPzl577dWBkwIAwOojbKFgM2fOzJAhQ/LII48k+d/dkA844ICMHTs2xx57bB5++OF07tw5/fr168hRAQBgtRG2ULBNNtkkH/nIR9La2prktbCtVCpJkjPPPDNJ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3HHHZauttsrw4cOXOqZSqaS21tYdAHQM19gCAO22ePFipx0DsFq5xhYAWGVaWlry7W9/O4sXL85//Md/pLW1VdQCsFZxzhAAsEwNDQ357W9/m7vvvjvNzc2pq6vr6JEAYCn+uBUAWK4LL7wwPXr0SGNj4xs+v3Dhwrz88supqanJBhtssIanA2B9J2wBgGWqVqvZaaedXvf4woUL8/jjj+fxxx/PE088kQceeCAbbrhhrrjiig6YEoD1mVORAYBlqqmpySuvvJJLLrkkV199ddvjtbW1+fOf/5yPfexjufHGG1NTU5Mrr7yyAycFYH0lbAGA5erUqVN++MMfLnUqckNDQ3bfffcMGjQo9913X37/+9+nT58+eeCBBzpwUgDWR8IWAFiuhoaGzJ49OwsXLkzy2n1rK5VKhg4dmgEDBuSmm25Kkmy11Va59dZbO3JUANZDwhYAWCHveMc7cv/99yd57TTk2traPPPMM1m0aFFaW1uTJDvttFOuv/76jhwTgPWQsAUAVsjBBx+cW2+9Nd/61rfy4osv5tZbb82nPvWpLFy4MPvvv3+S5JRTTsk3v/nNjh0UgPWOXZEBgBUyevTovPTSSznhhBPy7W9/O3379k2PHj1y1VVXpXv37kmSTTbZJJtssknHDgrAeqemWq1Wl3dQc3NzmpqaMmfOnPTs2XNNzAUArKUmTpyYu+66K126dMk73vGObL311ks9X6lUUlvrpDAA3pr2dKgVWwCgXbbaaqtstdVWWbx4cebPn7/Uc62tramrq+ugyQBYX/njVABgpfzkJz/JiBEjctBBB+XOO+/MggUL2qJ2BU4IA4BVRtgCACultrY2Tz/9dA477LCcfPLJOeCAA3LJJZfk+eefT01NTUePB8B6xDW2AMBKeeihh7LLLrvk1VdfTUtLS26//fZcffXVqa+vz+DBg3Paaaelqampo8cEoFDt6VArtgBAu1QqlSTJjjvumMbGxjz66KNpaGjI8OHDc/zxx2fChAk555xz8pvf/KaDJwVgfWHzKABghVWr1dTW1qalpSWPPvpoevXqlcMOOyydO3fO888/n/r6+my33XY59NBD069fv44eF4D1hLAFAFZYTU1Nxo0bl0MOOSQDBw7M/PnzM2fOnJxyyinp169fNttss2y00Ubp169f+vTp09HjArCecI0tANAu06dPz5VXXplhw4Zl0qRJOeOMM1532x8AeKvcxxYAWG022mijfPGLX0ySjBo1KptssslSz1erVbsiA7BG2TwKAFhpXbp0yQEHHLDUY6IWgDVN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAO329NNPJ0kqlUoHTwIgbAEAaIc//elPGTRoUL74xS8mSWpr/ToJdDz/JgIAYLmam5uz7777ZvTo0fn4xz+e6667bqXe58UXX8y4ceNy7rnn5r777su0adNW8aTA+qi+owcAAGDtNnny5Bx44IGZOXNmZs+ena5du77umGq1mpqammW+z4IFC/Ke97wnXbt2zfz58/O1r30tY8aMydixY3PIIYesrvGB9YAVWwAAlql79+7ZZZddstlmm6Vr16656aab8qEPfShjx47N0UcfnRdeeGG5UZskxxxzTLbccsvcdtttmTx5cq6//vosWLAg3/rWt/KNb3wj1Wp1DXwbYF0kbAEAWKaNNtoohx12WBYvXpy+ffvms5/9bEaMGJGBAwfm5ptvzhFHHJF77733TV9frVazaNGivPDCC9lll13St2/fJMkHP/jBXHzxxdlmm21y/fXX55prrmk7fkW1trZm0aJFWbRoUVpaWtLa2vrWvixQJGELAMCbWhKZ7373u3PAAQfkgx/8YH7xi1/knHPOyf/8z//k1ltvzYsvvphf//rXWbRo0Ru+R01NTTp16pQNN9wwEyZMyOLFi1OpVFKtVrP55pvnvPPOS9++fXPRRRelUqms0Opvkjz++OP57Gc/m5133jmDBw/ORhttlO222y6HH3547r33XivAsB5xjS0AAEtdI1upVNp2O66pqUm1Wk2nTp3y0Y9+NK+88kq22WabttdsueWW2XnnnXPPPfekU6dOy/yMo48+Oh/60Iey3377tV1Tu3jx4vTv3z9XXnllBg4cmN/+9rfZb7/9ljvvXXfdlf322y+bbbZZDjzwwAwaNChJMnPmzNx+++1597vfncsvvzxHHXXUCocyUC5hCwCwHlu4cGHOOeeczJs3LxtssEFOOumkdO/efaljloThJptsstTjS+5hO2vWrPTq1SuLFy9Off2b/3q555575uSTT87hhx+e2bNn55Of/GTb8dVqNVtsscUK3z7oc5/7XI4++uhcdNFFb/jc9773vZx77rnZd9992059BtZdTkUGAFhPXXvttRk0aFD++te/5vnnn883v/nNjB07NsmKXedaV1eXP/zhD3niiSdyzDHHLDNqlzj77LNz1lln5cQTT8wxxxyTBx98MJMmTcoNN9yQKVOmZKuttlqh2Z988snsu+++b/r8QQcdlOnTp6elpWWF3g8omxVbAID10C233JILL7ww//Vf/5Xjjz8+ra2tmTx5crbZZpv8+c9/zm677dZ2evL/PTU5SSZMmJBf//rXGT9+fH73u9/lq1/9ag444IAV+tzOnTvnjDPOyIgRI3LSSSfljjvuSHNzc5qamvLDH/4wm2+++Qq9z7bbbpsbbrghO+20UxobG9seXzLzuHHjssEGG6Rz587t+v8FKJOwBQBYDzU1NWXw4ME56KCDkry2+tqnT59svfXWmTJlSnbbbbe2U5CXRO3cuXPT2NiYIUOG5MEHH0yPHj3y1FNPZYMNNmjXZ9fV1WX06NHZZ599ctddd6Vz587p06fPCq/WJsl5552XfffdNw8++GD22WefDBw4MHV1dZk1a1buueee/OpXv8r3v//99OrVq12zAWWqqa7AeSZL/hRtzpw56dmz55qYCwCAVejmm29O//79M2LEiLbHWltbU1dX1/bz/Pnzs+mmm+Y3v/lN3vnOdy71+osuuijPPfdcTj/99AwePDhz5sxJU1NTu+dY8pktLS1paGhY+S+UZNKkSfnmN7+Z2267LdOmTUtra2v69++fkSNH5tOf/nT22GOPt/T+QMdqT4e6xhYAYB32z3/+M/vuu28++MEP5hvf+EZmzZqV5LVTduvq6to2gEqSv/3tb2lqasqwYcNedz/YV155Jb/+9a8zZ86cJGl31C5ZS1kStb/+9a8zbdq0t/LVssUWW+SSSy7JxIkTM3fu3MyfPz/PPvtsfvnLX4paWM8IWwCAddQrr7ySSy+9NA0NDbnwwgtz3XXX5fbbb1/q1j61tbVtcXvPPfdko402SufOndtWcpubm5MkX/7yl/PAAw9ku+22W+HPf/7553PZZZdlwoQJS91y549//GMOOuigXH311avqqwLrOWELALCO6tatW975znfmuOOOy6mnnprRo0fnnHPOyXPPPbfUcUtWZ++5557ssssuSZL7778/W265ZX72s5+ltbU11Wp1hW+bs3Dhwnz605/Obrvtlv/+7//O9ttvn69+9attOxSPHj061113XT72sY+tui/7b7761a/m8MMPz6JFi1bbZwBrD2ELAFCQl156KWeffXZ++tOfZvz48cs8tqamJmPGjMk+++yTJLnsssvy2GOP5Sc/+UkWLlzYdlxDQ0MWLVqUGTNmZLfddsunPvWpvPe9783uu++e448/PnV1dUutuL6R1tbWtLS05KabbspWW22V/v3756abbsrkyZNzySWX5Ctf+UquvPLKtuMPOuigdm861R4vvPBCnnnmmdX2/sDaxeZRAABruSWnDl9xxRX51Kc+leHDh2f+/PmZMGFCrrjiihx44IHp2rXrUqcY/7slmzV9/etfz3//93/nD3/4Q3beeee25++4446MGjUqSTJy5Mhcc8012WyzzVZ4tkqlkq997Wu55JJLss8+++Q73/lOunXr1nbcRz/60cyYMSN/+tOfkmS5oQzQng51ux8AgLVcTU1NFixYkB/+8Ic599xzc8opp6RSqeTkk0/OhRdemFdffTWf+MQnlhmL9fWv/dr3hS98IT/60Y/yjW98I5deeml69eqVZ599Nptuumm23XbbnHPOOdl///3bNVvy2rW6X/rSlzJo0KD07t27LWqXhG/fvn3TpUuX1NTUZAXWVZZrwYIF6dq1a9vPc+bMyc9//vNMnjw5b3vb23L44Yev1hVhYO3iVGQAgAJMmjQpzz33XIYOHZrktZA899xzM3To0Fx33XWZPHlykrxpNNbU1GTx4sVJkh/84Af51a9+lauvvjpjx47N2LFjs3jx4jz66KPtitpqtZpKpZL777+/7dTmj33sYxk9evRSnzt37tw88MAD2WKLLdoee6u23nrrtl2Vp06dmmHDhuXzn/987r777px//vnZaqutMnHixLf8OUAZhC0AwFpm/Pjx+clPftK2I3GSdOnSJc3NzWlsbEySLF68OD179sxhhx2WOXPm5Je//GWSZUfjklXbPfbYIxtvvHFOPvnkTJs2Lddee+0Kn3b8fy35rB133DF333336z4nSf7+97/nyCOPTJKcccYZy/2MFTV16tS2Ta/+4z/+I4MHD85zzz2X++67L9OmTcu73/3unHnmmUvdzghYdwlbAIC1xLx583Lqqadm5MiROeaYYzJhwoS257bccstsueWW+dGPfpTkf6Ny3333zaBBg/Lwww8vdY/aNzNx4sRsvvnmmTVrVn75y1/mL3/5S9sq8PK80WnEtbW16dSpU3bZZZcsWLBgqZB84okncs4552Tq1Km54447Vugz2mNJQP/lL3/JmWee2Rb99fX1Ofvss3P//fevktOegbWfsAUAWEvcdttteeyxxzJu3LgMGTIk3/3udzNnzpy250855ZRcc801eeyxx1JXV5fW1tbU1tbmQx/6UO644462zVVqamraVjP/XV1dXY466qjMnDkzBx544HJnam1tzeLFi/PAAw+0vfe/q62tTZcuXdK5c+fU1v7vr5dbbLFFvvrVr+b3v//9UtfDrgqVSiXz589PS0tLFixYkP79+y/1/Nve9rbMmDHDJlWwnhC2AABriWHDhuUzn/lM9t1333zrW9/KNddck/vvv7/t+X322Se77bZbPvOZz2Tu3Lmpq6tL8tqOx926dcusWbPagnbJc/9u6NChOfPMM5c7y5KVzlmzZuUzn/lMvv71ry/1+L+rr69fKiL/9a9/Zd68edl2223Tr1+/Ffj27dO5c+eMGTMmI0aMyLx589quMV5iypQp6du371KhDay77IoMALCWGDJkSIYMGZLktYjdeeedc/HFF2f48OEZMGBAevfunUsuuSTvfOc7c/LJJ+cjH/lIhg4dmiuuuCJjx45dZQHZ2tqal156KY899lj22muv7L333jnxxBPz8ssvp3fv3m/6uiVhO3HixBx66KG56qqrsv3226+Smf7dRRddlEql0vbXv3/33/3ud9ljjz1Wy2cDax/3sQUAWMssuefsQw89lBEjRuSnP/1pDjnkkLbVx3HjxuV73/teJk+enNmzZ+e9731vfvSjH6VPnz5v6XOr1Wqq1WoeeuihdO3aNVtvvXWq1WouuOCC3HTTTSt8ney+++6bfv365YorrnhL8wDrt/Z0qLAFAFgLVSqV1NbW5qCDDsrTTz+dG2+8MYMHD84rr7yS7t27J0keeuihNDY2rtCOxsuy5F6zbzTDggULcsABB2TzzTfPd7/73RU6tffII4/MVVdd9ZZmAhC2AACFa21tTV1dXV588cUMHjw45513XqrVan7zm9/kK1/5Svbcc89V8jn/N2qX/H2lUsncuXNz33335YwzzkhdXV3uvffeNDQ0LPO9Wlpacs8996yy2YD1W3s61DW2AABrobq6ulSr1bztbW/LqFGj8rnPfS49evTIeeedt0rD8f+u1C65nU9tbW3q6+vz7LPPZo899sjFF1+83PepVCqZM2dORo4cucpmA1hRwhYAYC31z3/+MwcddFDGjx+fc889N1/84hdX+r3+/XTjNzv9eMlj3bt3z9FHH912r9jlWXLLnx49eqz0jAArS9gCAKylampq8v73vz833XRT+vbt+5bfK0mefPLJbLbZZit0f9cVjdolRC3QUVxjCwCwHnizFVqAtVV7OtQdqwEA1jGLFi3KvHnzlnpsyfWzAOsiYQsAsBaoVCqr5H2OPPLIfPjDH852222X//7v/87f/va3tudW5Yrtyy+/nMWLF6+y9wN4K4QtAEAHu+uuu3L11Ve/pbhtbW3NqFGjMnny5BxzzDH5xCc+keuuuy7/+Z//mYULF67CaZP7778/++67b04//fQ88sgjq/S9AVaGzaMAADpYly5d8s9//rPtdOGVWVkdN25c5s+fn5tvvjlNTU3Zf//9s8EGG2TYsGGpq6t709fNnDkzf/7zn/P4449njz32yMYbb5yBAwcu87N23nnn/OAHP8jJJ5+cz3/+8/nkJz+ZAw88sN0zA6wqNo8CAOhgra2tmTdvXpqamlb6Pb73ve/l0ksvze23357GxsY0NDRk1qxZaWpqSm3tG5+kt3jx4uywww6pr6/PggULMm3atIwZMyZjx47NRz/60eV+ZnNzc0488cRMnTo13/3ud7Ptttuu9PwA/87mUQAABamrq0tTU9NS16y2tLSkWq2u8IZPPXv2zNNPP50nn3yy7ZTm3r17v2nUJslxxx2XQYMG5dZbb83kyZNzww03ZOHChfn2t7+diy66aLmnRvfs2TOXX3555s6dm9NOO61d8wKsSsIWAGAtUV9f3xa37T0t+fDDD8/o0aOz99575+KLL17msdVqNYsWLcr06dPzrne9K/3790+SfOADH8jFF1+cbbfdNr/61a/ys5/9rO34N9OpU6dcffXVmT59el555RW3FAI6hLAFAFiL1NfXp1qtpr6+fpmrrW/k2muvzY9+9KN8/vOfX2aM1tTUpFOnTnnb296WiRMnpqWlJZVKJZVKJZtttlnOO++89O/fPxdddFFaW1uXG6ubbLJJ5syZk5kzZ7ZrXoBVRdgCAKxDPvKRj6Surm6FVk5HjRqVcePG5Re/+EVqa2tTW1ubxYsXp1+/frnqqqsyadKkjBs3brnv09ramr322itDhgxZFV8BoN3sigwAsJZ5syidNWtW7rjjjsydOzcHHnhgevTo8ZZO/T3qqKMyadKkHHnkkWlubs7xxx+f+vrXfj2sVCrZYostlrmjcvLaBlSTJ0/O5ZdfvtJzALxVwhYAoAATJ07MqFGjMmjQoDz22GP55je/mR/+8IcZPnz4SsXtkut3zzrrrHTt2jUnnXRS/va3v+Wkk05Kjx49ct999+XJJ5/MFltsscz3qa+vz3bbbbeyXwtglXC7HwCAtdy8efOy7777Zsstt8wFF1yQxYsX59JLL82vfvWrXH755dl+++3f0vu3trbmj3/8Y0488cTU1dW1/e735S9/OUccccRyX7+y994FWJb2dKgVWwCAtdy8efPy3HPP5dRTT01jY2OS5DOf+Uze/va359Zbb11u2E6YMCHbbLPNmz5fV1eXD37wg3nyySdzxx13pHPnzunVq9cyV2KXrI3U1NSIWqDDCVsAgLVcU1NTevXqlb///e/Zd999kyTdu3fPAQcckM6dOy/ztccee2wqlUouu+yyN7xetrW1NXV1dWlpaUlDQ0P22muv5c6zePHiPPnkkxk8eHC6d+++cl8KYBWyKzIAwFquoaEhO+64Y+6444488sgjbY937tx5mbf1+drXvparr746Z5xxxuuidsnr6urqsnjx4vzmN7/J1KlTV2ie2traPPPMM6IWWGsIWwCAtcz/jdUl97T90pe+lAkTJuTrX//6UgH6ZqcB33DDDTnzzDNz++23Z7PNNss//vGP3HTTTbn44ovz+OOPL/W6W265JR/5yEdy5ZVXrtB8tbW12WeffVby2wGsejaPAgBYyy05Xfiee+7JgQcemEceeSQbbLDBm0bt1KlTs/3222fPPffMr371qzz88MM55phj8vLLLydJpkyZkrPOOitf/OIX06lTpyTJz3/+8+y2224ZOHDgm85hkyhgTWpPh1qxBQBYS4waNSr/8z//87rH6+rqUqlU8u53vzsTJkzIgAEDlhmY3bp1y1577ZVZs2bl1FNPzYc+9KGMHj06v/3tbzN58uRceumlOfvss/PjH/+47TUHH3zwMqM2Se6+++6V/m4Aq5OwBQDoYIsWLcoOO+yQV155JR//+MeXem7JyXW1tbWpVqvp37//G24CtUSlUkmfPn1yzTXXZMSIEbn22mvz/ve/P5/73Oey9dZbp7a2Nscdd1w++tGP5pprrkm1Wl3mdbpLZvj1r3+dv//972/9ywKsBnZFBgDoQDNnzsyOO+6YkSNH5pe//GVqa2uzcOHCLF68ON27d29bmV1yOvLy1Na+tm7R0NCQiy66KMOGDUvPnj3bNnpacjpx3759U19fn5qamuWG7fTp03Psscdm8uTJb/HbAqweVmwBADrIokWL8qlPfSrPP/98rr/++tTW1uacc87J2LFjs/322+f4449vO/13eVH7s5/9LKeffnr22muv3HjjjXn11VeTJEceeWTGjBnTdlxNTU3mzZuXBx54IFtssUXbY2+kWq1m5syZ2WOPPXLxxRfbawVYawlbAIAO0qlTpxx11FHZbbfdcsQRR+SII47I9ddfnxEjRuS4447LHXfckXPPPTdTpkxZ5vt897vfzRe+8IVMnz493bt3z9ixY3PDDTe0PV9f/78n6T300EM56qij0tLSki996UvLfN9qtZrrrrsuhx9+eA4//PC39mUBViO7IgMAdLAbbrghZ5xxRjp16pRrrrkmW2+9dWpqavLYY4/lgAMOyI033pjtttvuDV973333ZcyYMbnqqqsyevToJMl//ud/5sYbb8xf//rXdO3ate305EmTJuWMM87IM888k7vuuivdunVbY98RoL3a06GusQUA6GAHHHBAFi9enE6dOmWLLbZITU1NKpVKtttuu+y5556ZOHFitt1229edMrx48eJcc801OfTQQ/P+978/lUoltbW1ed/73perrroqCxYsaLu2NkmGDh2as88+O/37919u1DY3N2fixIl5xzve4RY/wFrPqcgAAB2spqYmH/nIR7LPPvu0nTa8JG4XLFiQ55577g3jsr6+PmPGjEn//v3T0NDQtjK7zTbbpKGhoe062yR58cUXM2/evGy77bYZMGDAcmfafffdc/PNN4taoAjCFgBgLVBTU5POnTsv9fM111yTO+64o22Tpzfy/ve/P2edddZSjzU1NaWlpSUTJ05Mkjz22GPZZ5998swzzyxzhkqlkiT56le/mmnTpuXMM89cyW8DsGY5FRkAYC3zi1/8InfddVd+/OMf5/vf//5SuxovT2trazp16pSmpqYsXLgws2fPzpgxY7L77rtn++23f9PXVavV/P3vf8+rr76a//qv/8qf/vSnVfFVANYIK7YAAGuZ3XbbLc8991x+//vf57DDDmv362tra7PBBhtk1qxZ+chHPpKhQ4fmyiuvXOZrKpVKjj766LznPe/Jpz71qey+++4rOz7AGmfFFgBgLbPRRhvl+uuvT0NDwzKPq1arr7sGdsn9bnv16pUjjzwy22+/fR5++OEV+twBAwZk4403zje/+c2Vmhugo1ixBQBYCy0vahcvXpxl3bVx1KhRaWhoyF133bVCn1dXV5ebb74548ePb9ecAGsDYQsAUJhqtZrnnnsuf/3rX9/0mBNPPDEzZsxIU1PTCr9vTU1N+vTpsypGBFijhC0AQGGmTJmS4447LjvssMMyj+vZs+camgigY7nGFgCgENVqNY888kjGjh2bu+66K926devokQDWClZsAQAK8eKLL+bMM8/Mn/70pwwcOLCjxwFYa1ixBQAoxAYbbJDrr78+nTp16uhRANYqVmwBAAoiagFeT9gCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAADFWrx4cZKkUql08CRARxK2AAAUZ0nI1tXVJUlqa2uzYMGCLFiwoCPHAjpIfUcPAAAAK+qFF17I5Zdfnoceeii1tbVZuHBhnn/++Wy77bZ55JFH0tTUlBtuuCGNjY0dPSqwBglbAACKMX369HzpS1/Kpz71qeyzzz6pr69Pt27dUl9fn89+9rP529/+lh//+Mf59Kc/3dGjAmuQU5EBACjG8OHD87nPfS7jxo3L+973vnzgAx9IY2Njzj///HTr1i2f//znM3bs2I4eE1jDaqrVanV5BzU3N6epqSlz5sxJz54918RcAADwhubNm5cPf/jDaWlpyUknnZQLL7wwPXv2zOGHH55DDjkknTp1SrVaTU1NTUePCrwF7elQYQsAQDEqlUpqa2szadKkjBw5Mt27d8/YsWPz4Q9/OKNGjUoSUQvriPZ0qFORAQAoRm1tbSZOnJhzzjknAwcOzIsvvpihQ4eKWljP2TwKAIBiLFy4MKeeempmzpyZ0047LVOmTMlLL72U5H9Xc//d/Pnz061btzU9KrAGCVsAAIrRuXPnnHfeeXnqqadet0nUG0Xts88+m8svvzzDhg2zqRSsw4QtAABFGTZsWIYNG5Ykue222zJy5Mj07NlzqdOQW1tbM378+HznO9/JT37yk1Sr1dx///155zvf2ZGjA6uJa2wBACjSz3/+8xx66KG54oorkmSpqL3//vvzn//5n/nd736XJ598Ml//+tczZsyYtLS0dOTIwGoibAEAKNJ+++2Xj33sY9l1112Xeryuri69evXKgAEDMnDgwGy66ab5/Oc/nx133PF1xwLrBrf7AQCgWK2tramrq0tra2umTp2aIUOGtD03Z86cHH744RkwYEAuv/zyzJkzJx/84Afzi1/8IhtttJHdk2Et53Y/AACsF2pra/Pqq6/mrLPOyvXXX58lazbVajVNTU0ZPXp0nnrqqbz88stpamrKn//85wwcOFDUwjpG2AIAUKyampp06dIllUolN954YxYuXJhKpdIWrnPmzMnkyZPT0NDQdvwKnLAIFEbYAgBQvK997WuZNm1azjzzzMyaNStJctNNN+Xaa6/NoYcemsbGxrZjl0SvwIV1h9v9AACwTvj973+fAw44IPfdd1+am5tTqVSy8cYb56CDDlrquCW3BXI6Mqw7hC0AAOuELbfcMj//+c/zwAMP5M4778zIkSPzvve9L1tttVVmzJiRSZMmpWfPnpkxY0YWLVqU7t27Z8aMGdlkk00yYsSIjh4feAvsigwAwDrtBz/4QT7/+c9n1113zUsvvZS3ve1tmTVrVt7znvfkwgsvTF1dXaZMmZINN9ywo0cF/o/2dKgVWwAA1mnbbbddmpubc9xxx+WAAw5oe/ziiy/OFltskR133DEvvfSSsIWCCVsAANZpu+66a84///wcfvjheeGFF9LY2JgPf/jDeeCBB3Lsscfm4IMPzhZbbNHRYwJvgbAFAGCd1tramtNOOy1PPPFEdthhh/Tu3TudO3fO2Wefnf322y99+vRJ8r+bSgHlEbYAAKyzKpVK6urqkiRDhw7NlVdemWq1mnHjxmWbbbZpu79tElELBXMfWwAA1lm1tbWpVCo56KCDcumll+bQQw/N1KlTM3HixKWiFiibFVsAANZplUol8+fPz0knnZQjjzwyxx13XIYOHdrRYwGrkNv9AACwzps7d27q6+vTtWvXtscqlUpqa53ACGsrt/sBAID/o7GxMcnSG0SJWlh3+KcZAID1hg2iYN0kbAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAACiasAUAAKBowhYAAICiCVsAAACKJmwBAAAomrAFAACgaMIWAACAoglbAAAAiiZsAQAAKJqwBQAAoGjCFgAAgKIJWwAAAIombAEAYB1QqVTS3NyclpaWjh4F1jhhCwAAa5H58+fnueeey4MPPpg//OEPueaaazJr1qw3Pf6JJ57I6NGj07179wwdOjRnnXVW/vWvf63BiaHj1Xf0AAAAwGv+/Oc/Z7/99susWbPSp0+fdOnSJQMGDMjw4cPTu3fv1x2/aNGifPzjH0/v3r0zfvz4TJ06NQcffHBaW1tzzjnnpKGhoQO+Bax5VmwBAGAt0b179wwcODA333xzXnrppUydOjXjx4/PVltttdRx1Wo1STJu3LjMnTs3p5xySrbeeuvsvffe+cpXvpJbbrkl999//1LHwrpM2AIAwFqiR48eqa2tzRNPPJFp06blwQcfTHNz8+uOq1QqSZJHH300vXv3ztvf/va25971rneltrY2jz322BqbGzqasAUAgLVE165d071793z5y1/Onnvumf/3//5fTjvttDzxxBNJXr/6Wq1WM3/+/HTr1q3tsQEDBqRz58559tln3/A1sC5yjS0AAKwlevbsmdNOOy1vf/vb8/a3vz133HFHTjvttLzwwgu58cYbU1dXt9Txffr0ed1OyA0NDenRo8cbrvTCukrYAgDAWqKxsTFjx45N8tpK63777ZckOfXUU3PnnXdm1KhRaWlpSU1NTZJk4403Tmtra6ZPn57BgwcnSVpaWlKpVNKjR4+O+RLQAZyKDAAAa6ElpxAPHDgwtbW1eemll5K8tiJbX//a+tSWW26Z3r17509/+lPb6/75z39m8uTJede73pUkbREM6zIrtgAAsBapVCqpra1Nbe1ra1B33313ZsyYkZ133jnz5s3Lddddl0033TSjRo3KlltumY9+9KM566yzsvXWW2fDDTfM17/+9QwcOLBttVfYsj4QtgAAsJZobW3NKaeckg996ENJkgcffDBXXXVVjjnmmAwZMiTTp0/Pl7/85ey3334ZNWpUGhoacsIJJyRJTj755MyePTujRo3Kz372s7YwhvVBTXUFtklrbm5OU1NT5syZk549e66JuQAAYL1TrVYzduzYPPzww1m0aFG23HLLHHLIITnuuOOSvHb97E033ZRNN900O+yww1KvszLLuqY9HSpsAQAAWOu0p0OdnwAAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARRO2AAAAFE3YAgAAUDRhCwAAQNGELQAAAEUTtgAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0YQtAAAARatfkYOq1WqSpLm5ebUOAwAAAMn/9ueSHl2WFQrbuXPnJkkGDx78FsYCAACA9pk7d26ampqWeUxNdQXyt1KpZPr06WlsbExNTc0qGxAAAADeSLVazdy5c7PRRhultnbZV9GuUNgCAADA2srmUQAAABRN2AIAAFA0YQsAAEDRhC0AAABFE7YAAAAUTdgCAABQNGELAABA0f4/+Tz2ZgXKTbkAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "{'address': '3836 BRISTOL CT', 'city': 'CLARKSTON ', 'classification': 'neutral', 'donor_id': 'c7f7a9e5-2e9e-47d1-92f6-2238c7ce301a', 'entity_type': 'Individual', 'first_name': 'THERESA ', 'full_name': 'theresa fougnie ', 'id': 'c7f7a9e5-2e9e-47d1-92f6-2238c7ce301a', 'last_name': 'FOUGNIE ', 'recipient_id': '520c9ce3-c702-4926-8688-750984ee6c0d', 'recipient_name': 'friends of sarah may seward', 'state': 'MI', 'zip': '48348-3610'}\n", - "{'classification': 'neutral'}\n", - "{'address': '330 BROAD ST APT 1', 'city': 'SPRING CITY ', 'classification': 'neutral', 'donor_id': '318b9b37-369b-45ba-9802-27177198e694', 'entity_type': 'Individual', 'first_name': 'ERIC ', 'full_name': 'eric oconnor ', 'id': '318b9b37-369b-45ba-9802-27177198e694', 'last_name': 'OCONNOR ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'PA', 'zip': '19475-1763'}\n", - "{'classification': 'neutral'}\n", - "{'address': '15 W260 FILLMORE ST', 'city': 'ELMHURST ', 'classification': 'neutral', 'donor_id': '283c7a56-1298-4003-b4b3-e4519b6077b0', 'entity_type': 'Individual', 'first_name': 'EVELYN ', 'full_name': 'evelyn pape ', 'id': '283c7a56-1298-4003-b4b3-e4519b6077b0', 'last_name': 'PAPE ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'IL', 'zip': '60126-5349'}\n", - "{'classification': 'neutral'}\n", - "{'address': '16190 DOBBINS DR', 'city': 'ALBION ', 'classification': 'neutral', 'donor_id': '306d7309-ccc7-457e-a263-394b1143dacb', 'entity_type': 'Individual', 'first_name': 'STEPHANIE ', 'full_name': 'stephanie dobbins ', 'id': '306d7309-ccc7-457e-a263-394b1143dacb', 'last_name': 'DOBBINS ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'MI', 'zip': '49224-9689'}\n", - "{'address': '3685 CREEKSIDE DRIVE', 'city': 'DORR ', 'classification': 'neutral', 'donor_id': '57069727-fd76-4630-9d36-b786d0992b4a', 'entity_type': 'Individual', 'first_name': 'ANNETTE ', 'full_name': 'annette magyar ', 'id': '57069727-fd76-4630-9d36-b786d0992b4a', 'last_name': 'MAGYAR ', 'recipient_id': '097002ca-1bbd-417a-bad9-9fd54887ebab', 'recipient_name': 'movement voter pac mi', 'state': 'MI', 'zip': '49323-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '13330 CAMINITO MAR VILLA', 'city': 'DEL MAR ', 'classification': 'neutral', 'donor_id': 'a4a903b8-a178-4fcc-ae7b-cd6852b447a0', 'entity_type': 'Individual', 'first_name': 'MICHAEL ', 'full_name': 'michael finley ', 'id': 'a4a903b8-a178-4fcc-ae7b-cd6852b447a0', 'last_name': 'FINLEY ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'CA', 'zip': '92014-3614'}\n", - "{'address': '52 PINE HILL RD', 'city': 'ASHLAND ', 'classification': 'neutral', 'donor_id': 'fd303393-0697-48f6-b704-bce3a6b36e04', 'entity_type': 'Individual', 'first_name': 'JANE ', 'full_name': 'jane malick-nugent ', 'id': 'fd303393-0697-48f6-b704-bce3a6b36e04', 'last_name': 'MALICK-NUGENT ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'MA', 'zip': '01721-1169'}\n", - "{'address': '3708 OMAHA', 'city': 'GRANDVILLE ', 'classification': 'neutral', 'donor_id': '2ac954cd-d5a2-4d94-b087-adb400d05d25', 'entity_type': 'Individual', 'first_name': 'MARY ', 'full_name': 'mary bristol ', 'id': '2ac954cd-d5a2-4d94-b087-adb400d05d25', 'last_name': 'BRISTOL ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'MI', 'zip': '49418-0000'}\n", - "{'address': '817 VERDALE DR', 'city': 'SPEARFISH ', 'classification': 'neutral', 'donor_id': '243d42aa-2d89-4df0-81c8-30b0eb2bb514', 'entity_type': 'Individual', 'first_name': 'TIARA ', 'full_name': 'tiara heckenlaible ', 'id': '243d42aa-2d89-4df0-81c8-30b0eb2bb514', 'last_name': 'HECKENLAIBLE ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'SD', 'zip': '57783-1636'}\n", - "{'address': '2954 BAY VILLAGE CIR APT 1074', 'city': 'SANTA ROSA ', 'classification': 'neutral', 'donor_id': '5fce81ac-a80a-4153-9893-a4f117312808', 'entity_type': 'Individual', 'first_name': 'JENNIFER ', 'full_name': 'jennifer ellis ', 'id': '5fce81ac-a80a-4153-9893-a4f117312808', 'last_name': 'ELLIS ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'CA', 'zip': '95403-2288'}\n", - "{'address': '12606 CEDAR CROSSINGS DR', 'city': 'CHARLOTTE ', 'classification': 'neutral', 'donor_id': '0b7ab244-7d09-40f6-9da9-04492dca4c59', 'entity_type': 'Individual', 'first_name': 'MARGARET ', 'full_name': 'margaret johnson ', 'id': '0b7ab244-7d09-40f6-9da9-04492dca4c59', 'last_name': 'JOHNSON ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'NC', 'zip': '28273-8868'}\n", - "{'address': '7730 BOHM RD', 'city': 'IMLAY CITY ', 'classification': 'neutral', 'donor_id': '519dfef0-05c0-4759-851a-8caa7f56ff1d', 'entity_type': 'Individual', 'first_name': 'BETTY ', 'full_name': 'betty burton ', 'id': '519dfef0-05c0-4759-851a-8caa7f56ff1d', 'last_name': 'BURTON ', 'recipient_id': '7e56adfa-c5e4-459d-b280-92a2c67e8602', 'recipient_name': 'lapeer county democratic party', 'state': 'MI', 'zip': '48444-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '107 MEYERS AVE', 'city': 'JACKSON ', 'classification': 'neutral', 'donor_id': '67ef676e-27a0-40d5-8f5c-9bfae6f80a88', 'entity_type': 'Individual', 'first_name': 'TERRY ', 'full_name': 'terry applegate ', 'id': '67ef676e-27a0-40d5-8f5c-9bfae6f80a88', 'last_name': 'APPLEGATE ', 'recipient_id': 'a9c205c4-6e86-465d-b9f8-55400317be37', 'recipient_name': 'sheet metal workers local 7 pac', 'state': 'MI', 'zip': '49203-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '4890 GARDENER RD.', 'city': 'METAMORIA ', 'classification': 'neutral', 'company': 'retired', 'donor_id': '31c2546b-6967-4625-8266-2ca498d7b0e1', 'entity_type': 'Individual', 'first_name': 'DIANE ', 'full_name': 'diane scott ', 'id': '31c2546b-6967-4625-8266-2ca498d7b0e1', 'last_name': 'SCOTT ', 'occupation': 'homemaker', 'recipient_id': '4a4659c5-77ec-4e8e-a171-48d9266cd78f', 'recipient_name': 'teamsters 406 political action committee', 'state': 'MI', 'zip': '48455-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '1033 N. PAULINA ST UNIT 1R', 'city': 'CHICAGO ', 'classification': 'neutral', 'company': 'capital area housing pship', 'donor_id': 'f2afa0d1-b1f9-4278-9df4-c5bf2c01c65b', 'entity_type': 'Individual', 'first_name': 'CURTIS ', 'full_name': 'curtis audette ', 'id': 'f2afa0d1-b1f9-4278-9df4-c5bf2c01c65b', 'last_name': 'AUDETTE ', 'occupation': 'marketing director', 'recipient_id': '9187a1f9-7b89-47cc-b136-04b272161da1', 'recipient_name': 'will snyder majority fund', 'state': 'IL', 'zip': '60622-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '1490 7TH ST NW APT 210', 'city': 'WASHINGTON ', 'classification': 'neutral', 'donor_id': '7ca75427-170a-4b3b-8e26-1fdd95e7590f', 'entity_type': 'Individual', 'first_name': 'RITA ', 'full_name': 'rita collins ', 'id': '7ca75427-170a-4b3b-8e26-1fdd95e7590f', 'last_name': 'COLLINS ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'DC', 'zip': '20001-3389'}\n", - "{'address': '4358 FOXPOINTE DRIVE', 'city': 'WEST BLOOMFILED ', 'classification': 'neutral', 'donor_id': 'c2269438-d978-4732-a2c1-f2621514a1f1', 'entity_type': 'Individual', 'first_name': 'LAURA ', 'full_name': 'laura noveck ', 'id': 'c2269438-d978-4732-a2c1-f2621514a1f1', 'last_name': 'NOVECK ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'MI', 'zip': '48323-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '83 ANCHOR DR', 'city': 'INDIAN HARBOUR BEACH', 'classification': 'neutral', 'donor_id': '2800af86-a826-4ee1-a2b3-3b8d454b229d', 'entity_type': 'Individual', 'first_name': 'JAMES ', 'full_name': 'james bangerter ', 'id': '2800af86-a826-4ee1-a2b3-3b8d454b229d', 'last_name': 'BANGERTER ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'FL', 'zip': '32937-3563'}\n", - "{'address': '1978 EDGEWOOD BLVD', 'city': 'BERKLEY ', 'classification': 'neutral', 'donor_id': 'b61a2f45-5a13-401a-b0c2-470368e45a95', 'entity_type': 'Individual', 'first_name': 'LISA ', 'full_name': 'lisa turner ', 'id': 'b61a2f45-5a13-401a-b0c2-470368e45a95', 'last_name': 'TURNER ', 'recipient_id': '116b2364-8dc9-4ec5-83ad-0f43db55c764', 'recipient_name': 'committee to elect natalie price', 'state': 'MI', 'zip': '48072-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '1791 WALLACE ST', 'city': 'SIMI VALLEY ', 'classification': 'neutral', 'company': 'county of ventura', 'donor_id': '05fbf8f2-14e5-468f-ac3c-6d38cb79aea2', 'entity_type': 'Individual', 'first_name': 'REBECCA ', 'full_name': 'rebecca albarran ', 'id': '05fbf8f2-14e5-468f-ac3c-6d38cb79aea2', 'last_name': 'ALBARRAN ', 'occupation': 'hs client benefit spec iv', 'recipient_id': '0cf71bd1-086d-433d-bebc-02a1976da5fc', 'recipient_name': 'michigan corrections organization political action committee', 'state': 'CA', 'zip': '93065-0000'}\n", - "{'classification': 'neutral'}\n", - "{'classification': 'neutral'}\n", - "{'address': '4375 ELMWOOD DR', 'city': 'OKEMOS ', 'classification': 'neutral', 'donor_id': '2a66be20-50a9-4c95-a836-7dcdf6f85c53', 'entity_type': 'Individual', 'first_name': 'MARY ', 'full_name': 'mary hardy ', 'id': '2a66be20-50a9-4c95-a836-7dcdf6f85c53', 'last_name': 'HARDY ', 'recipient_id': '3933a18f-92b6-4fb9-8ed9-a289ae65c09d', 'recipient_name': 'emily busch for state representative', 'state': 'MI', 'zip': '48864-0000'}\n", - "{'address': '9732 NW HENRY CT', 'city': 'PORTLAND ', 'classification': 'neutral', 'donor_id': '135321c7-d5f3-4496-8593-e3d92dc01b4f', 'entity_type': 'Individual', 'first_name': 'DAVID ', 'full_name': 'david evans ', 'id': '135321c7-d5f3-4496-8593-e3d92dc01b4f', 'last_name': 'EVANS ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'OR', 'zip': '97229-8060'}\n", - "{'address': '6516 FOREST RIDGE DR', 'city': 'DURHAM ', 'classification': 'neutral', 'donor_id': '82f6e2a5-d1f6-40b1-ab48-b0ddd0d8b2ef', 'entity_type': 'Individual', 'first_name': 'VICTORIA ', 'full_name': 'victoria mathews ', 'id': '82f6e2a5-d1f6-40b1-ab48-b0ddd0d8b2ef', 'last_name': 'MATHEWS ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'NC', 'zip': '27713-6743'}\n", - "{'address': '434 FRANKLIN ST APT 2', 'city': 'CAMBRIDGE ', 'classification': 'neutral', 'donor_id': '983946cd-bd5f-49de-8d7d-5c7e5fc187df', 'entity_type': 'Individual', 'first_name': 'ALISON ', 'full_name': 'alison gassett ', 'id': '983946cd-bd5f-49de-8d7d-5c7e5fc187df', 'last_name': 'GASSETT ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'MA', 'zip': '02139-3261'}\n", - "{'address': '401 S LAKESHORE BLVD 314', 'city': 'MARQUETTE ', 'classification': 'neutral', 'donor_id': '59835b92-ae12-4c63-bcf5-bc4c15f49a1a', 'entity_type': 'Individual', 'first_name': 'LISA ', 'full_name': 'lisa stasiuk ', 'id': '59835b92-ae12-4c63-bcf5-bc4c15f49a1a', 'last_name': 'STASIUK ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'MI', 'zip': '49855-0000'}\n", - "{'address': '1398 PARKVIEW DR', 'city': 'NEW RICHMOND ', 'classification': 'neutral', 'donor_id': 'a20e56d4-b16a-48d9-a572-dd5c20afb4ed', 'entity_type': 'Individual', 'first_name': 'STEPHEN ', 'full_name': 'stephen tornio ', 'id': 'a20e56d4-b16a-48d9-a572-dd5c20afb4ed', 'last_name': 'TORNIO ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'WI', 'zip': '54017-2339'}\n", - "{'address': '17367 NORTHWOOD HWY', 'city': 'ARCADIA ', 'classification': 'neutral', 'donor_id': 'd228df64-4788-45fa-8fad-495f05058201', 'entity_type': 'Individual', 'first_name': 'MARY ', 'full_name': 'mary williams ', 'id': 'd228df64-4788-45fa-8fad-495f05058201', 'last_name': 'WILLIAMS ', 'recipient_id': '097002ca-1bbd-417a-bad9-9fd54887ebab', 'recipient_name': 'movement voter pac mi', 'state': 'MI', 'zip': '49613-0000'}\n", - "{'address': '2175 W 25TH ST', 'city': 'LOS ANGELES ', 'classification': 'neutral', 'donor_id': '16817b6c-6455-49e3-aec7-ae3a1100a96a', 'entity_type': 'Individual', 'first_name': 'JAMES ', 'full_name': 'james haley ', 'id': '16817b6c-6455-49e3-aec7-ae3a1100a96a', 'last_name': 'HALEY ', 'recipient_id': '0cf71bd1-086d-433d-bebc-02a1976da5fc', 'recipient_name': 'michigan corrections organization political action committee', 'state': 'CA', 'zip': '90018-0000'}\n", - "{'address': 'PO BOX 410', 'city': 'MENDOCINO ', 'classification': 'neutral', 'donor_id': 'f1e3260d-301f-4ea5-b503-e0455e3f0f10', 'entity_type': 'Individual', 'first_name': 'SUSAN ', 'full_name': 'susan keller ', 'id': 'f1e3260d-301f-4ea5-b503-e0455e3f0f10', 'last_name': 'KELLER ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'CA', 'zip': '95460-0410'}\n", - "{'address': '1460 E POND DR APT 14', 'city': 'OKEMOS ', 'classification': 'neutral', 'donor_id': 'a7d035e5-12cf-4e5a-8dc2-0d9552bc59d8', 'entity_type': 'Individual', 'first_name': 'RUSS ', 'full_name': 'russ kirkpatrick ', 'id': 'a7d035e5-12cf-4e5a-8dc2-0d9552bc59d8', 'last_name': 'KIRKPATRICK ', 'recipient_id': '520c9ce3-c702-4926-8688-750984ee6c0d', 'recipient_name': 'friends of sarah may seward', 'state': 'MI', 'zip': '48864-0000'}\n", - "{'address': '207 N. 5TH AVE. UNIT A', 'city': 'BARSTOW ', 'classification': 'neutral', 'donor_id': '7f16dd46-24ca-475c-9ee2-e5e49fe90048', 'entity_type': 'Individual', 'first_name': 'BRIDGET ', 'full_name': 'bridget breese ', 'id': '7f16dd46-24ca-475c-9ee2-e5e49fe90048', 'last_name': 'BREESE ', 'recipient_id': '0cf71bd1-086d-433d-bebc-02a1976da5fc', 'recipient_name': 'michigan corrections organization political action committee', 'state': 'CA', 'zip': '92311-0000'}\n", - "{'address': '1127 RANFIELD LANE', 'city': 'FLINT ', 'classification': 'neutral', 'donor_id': '4a2985a0-1033-49d7-bd6e-ff09983ed3b9', 'entity_type': 'Individual', 'first_name': 'DALE ', 'full_name': 'dale weighill ', 'id': '4a2985a0-1033-49d7-bd6e-ff09983ed3b9', 'last_name': 'WEIGHILL ', 'recipient_id': '7dbf96d7-7405-4f4e-8089-da6ecdf2197f', 'recipient_name': 'michigan community college association political action comm', 'state': 'MI', 'zip': '48532-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '2885 SLEEPING MEADOW LANE', 'city': 'MASON ', 'classification': 'neutral', 'company': 'consumers energy', 'donor_id': 'b8df5c77-6655-44d5-8efa-5a1cb02e0b7f', 'entity_type': 'Individual', 'first_name': 'BRIAN ', 'full_name': 'brian bushey ', 'id': 'b8df5c77-6655-44d5-8efa-5a1cb02e0b7f', 'last_name': 'BUSHEY ', 'occupation': 'dir egi analytics', 'recipient_id': '642c45b3-2610-4afe-a3b8-a611eaeb9e94', 'recipient_name': 'cms energy corp employees for better government', 'state': 'MI', 'zip': '48854-8709'}\n", - "{'classification': 'neutral'}\n", - "{'address': '1217 WHISPERING KNOLL LN', 'city': 'ROCHESTER HILLS ', 'classification': 'neutral', 'company': 'blue cross blue shield of mich', 'donor_id': 'c818757b-5305-45c8-b024-30244cc46d21', 'entity_type': 'Individual', 'first_name': 'KATHRYN ', 'full_name': 'kathryn antoski ^ ', 'id': 'c818757b-5305-45c8-b024-30244cc46d21', 'last_name': 'ANTOSKI ^ ', 'occupation': 'analyst - senior', 'recipient_id': '5a56136a-8ea1-4027-918f-be7d7a66c373', 'recipient_name': 'blue cross blue shield of michigan political action committee', 'state': 'MI', 'zip': '48306-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '4608 OAKRIDGE DR', 'city': 'MIDLAND ', 'classification': 'neutral', 'donor_id': '4c1803dc-2633-4432-9d19-005d82aedf68', 'entity_type': 'Individual', 'first_name': 'JAMES ', 'full_name': 'james allen ', 'id': '4c1803dc-2633-4432-9d19-005d82aedf68', 'last_name': 'ALLEN ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'MI', 'zip': '48640-1914'}\n", - "{'address': '1919 CURTIS ST', 'city': 'BERKELEY ', 'classification': 'neutral', 'donor_id': '514931c3-da83-44dd-bc30-4fece766d85e', 'entity_type': 'Individual', 'first_name': 'JOAQUIN ', 'full_name': 'joaquin carbonell ', 'id': '514931c3-da83-44dd-bc30-4fece766d85e', 'last_name': 'CARBONELL ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'CA', 'zip': '94702-1648'}\n", - "{'address': '39842 GOLFVIEW DR.', 'city': 'NORTHVILLE ', 'classification': 'neutral', 'donor_id': '739bc866-c9cc-4360-ae52-9b15c22ca6b6', 'entity_type': 'Individual', 'first_name': 'DONALD ', 'full_name': 'donald gates ', 'id': '739bc866-c9cc-4360-ae52-9b15c22ca6b6', 'last_name': 'GATES ', 'recipient_id': 'e9e8bf7f-2d34-42c9-b155-b95481ca238f', 'recipient_name': 'committee to elect dave staudt', 'state': 'MI', 'zip': '48167-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '7300 KRAENZLEIN ROAD', 'city': 'BAY CITY ', 'classification': 'neutral', 'donor_id': '4ae0900b-eac4-4e41-b4a2-6727561db273', 'entity_type': 'Individual', 'first_name': 'JOAN ', 'full_name': 'joan wilson ', 'id': '4ae0900b-eac4-4e41-b4a2-6727561db273', 'last_name': 'WILSON ', 'recipient_id': 'c5bc157e-1eff-4db0-b26a-eea376cc3fd0', 'recipient_name': 'tamara d carlone for state board of education', 'state': 'MI', 'zip': '48706-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '753 PATRICIA PLACE DR', 'city': 'WESTLAND ', 'classification': 'neutral', 'company': 'blue cross blue shield of mich', 'donor_id': '184e5f13-aba5-44da-be09-572ac083b3e9', 'entity_type': 'Individual', 'first_name': 'SHUNDA ', 'full_name': 'shunda jones ^ ', 'id': '184e5f13-aba5-44da-be09-572ac083b3e9', 'last_name': 'JONES ^ ', 'occupation': 'manager - administrative', 'recipient_id': '5a56136a-8ea1-4027-918f-be7d7a66c373', 'recipient_name': 'blue cross blue shield of michigan political action committee', 'state': 'MI', 'zip': '48185-0000'}\n", - "{'address': '3830 33RD AVE SW UNIT A', 'city': 'SEATTLE ', 'classification': 'neutral', 'donor_id': '9a5a86bb-a480-42ad-913a-17f80efbfb86', 'entity_type': 'Individual', 'first_name': 'JAMES ', 'full_name': 'james sims ', 'id': '9a5a86bb-a480-42ad-913a-17f80efbfb86', 'last_name': 'SIMS ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'WA', 'zip': '98126-2514'}\n", - "{'address': '204 HURON ST', 'city': 'BAY CITY ', 'classification': 'neutral', 'donor_id': '298c73fa-495f-4df0-a348-16a62d6464ee', 'entity_type': 'Individual', 'first_name': 'MATHEWS ', 'full_name': 'mathews gavin ', 'id': '298c73fa-495f-4df0-a348-16a62d6464ee', 'last_name': 'GAVIN ', 'recipient_id': 'a9c205c4-6e86-465d-b9f8-55400317be37', 'recipient_name': 'sheet metal workers local 7 pac', 'state': 'MI', 'zip': '48706-4931'}\n", - "{'address': '740 HEWITT LN', 'city': 'NEW WINDSOR ', 'classification': 'neutral', 'donor_id': 'a41724c3-f42d-42a0-bc7d-8973c2e3a0c8', 'entity_type': 'Individual', 'first_name': 'MARY ', 'full_name': 'mary washburn ', 'id': 'a41724c3-f42d-42a0-bc7d-8973c2e3a0c8', 'last_name': 'WASHBURN ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'NY', 'zip': '12553-5462'}\n", - "{'address': '100 ROCKVIEW ST', 'city': 'JAMAICA PLAIN ', 'classification': 'neutral', 'donor_id': '1755fe5d-6210-4ecd-8075-de785b4a8a73', 'entity_type': 'Individual', 'first_name': 'TIMOTHY ', 'full_name': 'timothy havel ', 'id': '1755fe5d-6210-4ecd-8075-de785b4a8a73', 'last_name': 'HAVEL ', 'recipient_id': '097002ca-1bbd-417a-bad9-9fd54887ebab', 'recipient_name': 'movement voter pac mi', 'state': 'MA', 'zip': '02130-4660'}\n", - "{'address': '2260 POLISH LINE RD.', 'city': 'CHEBOYGAN ', 'classification': 'neutral', 'donor_id': '46b3649a-e403-4bd0-8ee2-d65a34d191f9', 'entity_type': 'Individual', 'first_name': 'STEVE ', 'full_name': 'steve downing ', 'id': '46b3649a-e403-4bd0-8ee2-d65a34d191f9', 'last_name': 'DOWNING ', 'recipient_id': 'b92fe9af-a5f5-4f15-8f35-d5536eb946eb', 'recipient_name': 'friends of marie fielder', 'state': 'MI', 'zip': '49721-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '10698 BEAR LAKE TRL', 'city': 'PORTAGE ', 'classification': 'neutral', 'donor_id': 'b0dafcd3-4ba2-4aa1-ac43-2298edc705e4', 'entity_type': 'Individual', 'first_name': 'MICHAEL ', 'full_name': 'michael anderson ', 'id': 'b0dafcd3-4ba2-4aa1-ac43-2298edc705e4', 'last_name': 'ANDERSON ', 'recipient_id': 'af8417ee-5bca-49f5-91e9-d2de65d73631', 'recipient_name': 'michigan senate democratic fund', 'state': 'MI', 'zip': '49024-6206'}\n", - "{'address': '150 MARINE AVE', 'city': 'BROOKLYN ', 'classification': 'neutral', 'donor_id': '58988e4c-4376-4fd7-8c13-10bc9fc65335', 'entity_type': 'Individual', 'first_name': 'PAMELA L ', 'full_name': 'pamela l landberg ', 'id': '58988e4c-4376-4fd7-8c13-10bc9fc65335', 'last_name': 'LANDBERG ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'NY', 'zip': '11209-7744'}\n", - "{'address': '1701 PORTER SW SUITE 6', 'city': 'WYOMING ', 'classification': 'neutral', 'company': 'self emp;oyed', 'donor_id': '3dfd0b64-eb59-4475-9abc-8be958bd8182', 'entity_type': 'Individual', 'first_name': 'DANIEL ', 'full_name': 'daniel hibma ', 'id': '3dfd0b64-eb59-4475-9abc-8be958bd8182', 'last_name': 'HIBMA ', 'occupation': 'property management', 'recipient_id': 'b4b49f06-2c4d-42e4-83e8-fc63c95fad04', 'recipient_name': 'committee to protect voters rights', 'state': 'MI', 'zip': '49519-0000'}\n", - "{'classification': 'neutral'}\n", - "{'address': '1501 BRIDGEWATER DR', 'city': 'MELBOURNE ', 'classification': 'neutral', 'donor_id': 'd71d895c-b18c-45ed-9a13-ec025564fedb', 'entity_type': 'Individual', 'first_name': 'JUDITH ', 'full_name': 'judith behrendt ', 'id': 'd71d895c-b18c-45ed-9a13-ec025564fedb', 'last_name': 'BEHRENDT ', 'recipient_id': '6126e78b-4e80-4361-a019-9d99aa1623ed', 'recipient_name': 'rooted in community leadership pac', 'state': 'FL', 'zip': '32934-3215'}\n" + "/home/alankagiri/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/networkx/algorithms/assortativity/correlation.py:282: RuntimeWarning: invalid value encountered in scalar divide\n", + " r = (t - s) / (1 - s)\n" ] } ], "source": [ - "matplot_G = create_network_nodes(grouped_sample.sample(50))\n", - "for v,d in matplot_G.nodes(data=True):\n", - " #print(u)\n", - " #print(v)\n", - " print(d)" - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'red',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green',\n", - " 'green']" - ] - }, - "execution_count": 118, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#for a,b in G.nodes(data=True):\n", - " #print(G[node])#['classification'])\n", - "# print(b)#['classification'])\n", - "entity_colors = {'neutral': 'green', 'c':'blue', 'f':'red'}\n", - "node_colors = [entity_colors.get(G.nodes[node].get('classification', 'neutral'), 'green') for node in G.nodes()]\n", - "node_colors" + "import itertools\n", + "def create_network_graph(df: pd.DataFrame) -> nx.MultiDiGraph:\n", + " \"\"\"Takes in a dataframe and generates a MultiDiGraph where the nodes are\n", + " entity names, and the rest of the dataframe columns make the node attributes\n", + "\n", + " Args:\n", + " df: a pandas dataframe with merged information from the inds, orgs, &\n", + " transactions dataframes\n", + "\n", + " Returns:\n", + " A Networkx MultiDiGraph with nodes and edges\n", + " \"\"\"\n", + " G = nx.MultiDiGraph()\n", + " edge_columns = [\n", + " \"office_sought\",\n", + " \"purpose\",\n", + " \"transaction_type\",\n", + " \"year\",\n", + " \"transaction_id\",\n", + " \"donor_office\",\n", + " \"amount\",\n", + " ]\n", + "\n", + " for _, row in df.iterrows():\n", + " # add node attributes based on the columns relevant to the entity\n", + " G.add_node(\n", + " row[\"full_name\"],\n", + " **row[df.columns.difference(edge_columns)].dropna().to_dict(),\n", + " )\n", + " # add the recipient as a node\n", + " G.add_node(row[\"recipient_name\"], classification = \"neutral\")\n", + "\n", + " # add the edge attributes between two nodes\n", + " edge_attributes = row[edge_columns].dropna().to_dict()\n", + " G.add_edge(row[\"full_name\"], row[\"recipient_name\"], **edge_attributes)\n", + "\n", + " return G\n", + "\n", + "\n", + "sample = grouped_sample.sample(100)\n", + "G = create_network_graph(sample)\n", + "\n", + "def network_metrics(net_graph: nx.Graph) -> None:\n", + " \"\"\"Given a network graph, return a text files with list of nodes\n", + " with greatest calculated centrality\n", + " Args:\n", + " net_graph: network graph as defined by networkx\n", + " Returns:\n", + " a text file with list of nodes with greatest calculated\n", + " centrality for each metric: in degree, out degree,\n", + " eigenvector, and betweenness\n", + " \"\"\"\n", + " in_degree = nx.in_degree_centrality(net_graph) # calculates in degree centrality of nodes\n", + " out_degree = nx.out_degree_centrality(net_graph) # calculated out degree centrality of nodes\n", + " eigenvector = nx.eigenvector_centrality_numpy(net_graph, weight=\"amount\") # calculates eigenvector centrality of nodes\n", + " betweenness = nx.betweenness_centrality(net_graph, weight=\"amount\") # calculates betweenness centrality of nodes\n", + "\n", + " # sort + truncate dictionaries to 50 nodes with greatest centrality\n", + " in_degree = sorted(in_degree.items(), key=lambda x: x[1], reverse=True)[:50]\n", + " out_degree = sorted(out_degree.items(), key=lambda x: x[1], reverse=True)[:50]\n", + " eigenvector = sorted(eigenvector.items(), key=lambda x: x[1], reverse=True)[\n", + " :50\n", + " ]\n", + " betweenness = sorted(betweenness.items(), key=lambda x: x[1], reverse=True)[\n", + " :50\n", + " ]\n", + "\n", + " assortativity = nx.attribute_assortativity_coefficient(\n", + " net_graph, \"classification\"\n", + " ) # calculates assortativity of graph\n", + "\n", + " num_nodes = len(net_graph.nodes())\n", + " num_edges = len(net_graph.edges())\n", + " density = num_edges / (\n", + " num_nodes * (num_nodes - 1)\n", + " ) # calculates density of graph\n", + "\n", + " k = 5\n", + " comp = nx.community.girvan_newman(net_graph)\n", + " for communities in itertools.islice(comp, k):\n", + " communities = tuple(\n", + " sorted(c) for c in communities\n", + " ) # creates clusters of nodes with high interactions where granularity = 5\n", + "\n", + " with open(\"network_metrics.txt\", \"w\") as file:\n", + " file.write(f\"in degree centrality: {in_degree}\\n\")\n", + " file.write(f\"out degree centrality: {out_degree}\\n\")\n", + " file.write(f\"eigenvector centrality: {eigenvector}\\n\")\n", + " file.write(f\"betweenness centrality: {betweenness}\\n\\n\")\n", + "\n", + " file.write(f\"assortativity based on 'classification': {assortativity}\\n\")\n", + " file.write(f\"assortativity based on 'density': {density}\\n\")\n", + " file.write(f\"assortativity based on 'communities': {communities}\")\n", + "\n", + "\n", + "network_metrics(G)" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 31, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAHzCAYAAACe1o1DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABuN0lEQVR4nO3dd3zNZ//H8ddJIkMiZkitSHKsmCX2KqWK0mq1aCmtVW60N7qtGi29q4MqWkqrlGqrqN1apSi1aicRK7WDSIxIcv3+iJyfSJDIOBnv5+NxHpzruz7npOXt+n6v67IYYwwiIiIiIg/Iwd4FiIiIiEj2pkApIiIiImmiQCkiIiIiaaJAKSIiIiJpokApIiIiImmiQCkiIiIiaaJAKSIiIiJpokApIiIiImmiQCkiIiIiaaJAKSIiIiJpokApIiIiImmiQCkiIiIiaaJAKSIiIiJpokApIiIiImmiQCkiIiIiaaJAKSIiIiJpokApIiIiImmiQCkiIiIiaaJAKSIiIiJpokApIiIiImmiQCkiIiIiaaJAKSIiIiJpokApIiIiImmiQCkiIiIiaaJAKSIiIiJpokApIiIiImmiQCkiIiIiaaJAKSIiIiJpokApIiIiImmiQCkiIiIiaaJAKSIiIiJpokApIiIiImmiQCkiIiIiaaJAKSIiIiJpokApIiIiImmiQCkiIiIiaaJAKSIiIiJp4mTvAkREsqXISAgOhhs3wMUFrFbw8LB3VSIidqFAKSKSUvv3w9SpsGwZHDkCxvz/NosF/PygdWt45RUICLBfnSIimcxizO1/IoqISBKhodCnD6xeDU5OEBNz930TtrdoAdOmga9v5tUpImIneoZSRORepk+P721cuzb+/b3C5O3b166NP2769IytT0QkC1CgFBG5m7FjoVcvuH79/kHyTjEx8cf16hV/HhGRHEyBUkSyJYvFQv/+/TPuAtOnw9Ch6XOuoUNhxoyMr1lExE4UKEUkQ82aNQuLxZLoVbRoUZo2bcry5cvtUtPRo0exWCx89NFHidqNMfTp0weLxcLIV15J34sqSIpIDqZR3iKSKUaNGoWvry/GGM6cOcOsWbNo3bo1S5Ys4YknnrB3eRhj6NevH19++SXDfH0ZeeJE+l4gtbfMRUSyEQVKEckUrVq1IjAw0Pa+R48eFCtWjO+//z5LBMoBAwYwdepU3u3dm1Fffpn+F0gIlBcvpv+5RUTsTLe8RcQuChQogJubG05Oif9dGxUVxeDBgylVqhQuLi6UL1+ejz76iLvNcDZnzhzKly+Pq6srNWvWZMOGDamu5dVXX2Xy5Mm8/fbbjHFxiZ/6B5gFWICjd+y/7lb7utvagoBnAG/AFSgJdAIu33mxf/7hl19+oXLlyri4uFCpUiVWrFiRaJeRI0disVg4fPgwXbp0IX/+/Hh5eTFs2DCMMZw4cYInn3wST09PvL29mTBhQqLjo6OjGT58ODVr1iR//vy4u7vTqFEj1iaMVL/l9lv/X375Jf7+/ri4uFCrVi22bduWmq9QRHI59VCKSKa4fPky58+fxxjD2bNnmTRpEpGRkXTp0sW2jzGGdu3asXbtWnr06EH16tVZuXIlr7/+OmFhYXzyySeJzrl+/Xrmz5/PwIEDcXFx4YsvvuDxxx/nr7/+onLlyimq67///S8TJ07kzTff5P33349f8SaVt6ejgZbADWAA8aEyDPgVuATkv23fjYcO8XO/fvTr1498+fIxceJEnnnmGY4fP07hwoUTnbdjx45UrFiRcePGsXTpUsaMGUOhQoWYNm0azZo1Y/z48cyZM4chQ4ZQq1YtGjduDEBERATTp0+nc+fO9OrViytXrjBjxgxatmzJX3/9RfXq1RNdZ+7cuVy5csX2/OiHH37I008/zZEjR8iTJ0+qvgsRyaWMiEgGmjlzpgGSvFxcXMysWbMS7fvLL78YwIwZMyZRe4cOHYzFYjHBwcG2toTzbN++3dZ27Ngx4+rqatq3b59sLXFxcWbJkiXmzz//NIDx8fExgHn99dfjd4iIMMZiMSZ+DRwz89Y1Qm+9T3itvdW+9tb7nbfeL7hjvztfgHEGE7x7t62m3bt3G8BMmjTJ1jZixAgDmN69e9vaYmJiTMmSJY3FYjHjxo2ztV+8eNG4ubmZbt26Jdr3xo0biT77xYsXTbFixczLL79sawsNDTWAKVy4sAkPD7e1L1q0yABmyZIlyX6PIiJ30i1vEckUkydPZvXq1axevZrvvvuOpk2b0rNnT37++WfbPsuWLcPR0ZGBAwcmOnbw4MEYY5KMCq9Xrx41a9a0vS9dujRPPvkkK1euJDY2NkkNJ06coG3bttSvXx+Af//9F4By5crF7xASkng5xRRK6IFcCVy9z77NAf+4ONv7qlWr4unpyZEjR5Ls27NnT9vvHR0dCQwMxBhDjx49bO0FChSgfPnyiY53dHTE2dkZgLi4OMLDw4mJiSEwMJAdO3YkuU7Hjh0pWLCg7X2jRo0Akq1JRCQ5CpQikilq165N8+bNad68OS+88AJLly4lICCA/v37Ex0dDcCxY8coXrw4+fLlS3RsxYoVbdtvV7Zs2STXKVeuHFevXuXcuXNJtnl5eSV6f/PmTQB69epFw4YN+XrKlAf6bL7AIGA6UIT429+TSeb5SaA0wI0bidoKFizIxWQG65QuXTrR+/z58+Pq6kqRIkWStN95/DfffEPVqlVxdXWlcOHCeHl5sXTpUi5fTlrVnddJCJfJ1SQikhwFShGxCwcHB5o2bcqpU6cICgrKkGvExMTw999/M2XKFPr160fbtm1xcEj+j71NmzYxce7cRG2Wu5w3ad8nTAD2AO8A14CBQCXg5B37OQK4uCQ53iTTM+ro6JiitjuP/+677+jevTv+/v7MmDGDFStWsHr1apo1a0bcbb2jqTmniMi9aFCOiNhNzK3BL5GRkQD4+Pjw22+/ceXKlUS9lAcPHrRtv11QUBB79uxh69at7Nmzh8OHD7N582YASpUqZTt/goSJ1e/k6+vL9evXCY6IYDNQ71Z7wk3gS3fsf4zkVbn1Ggr8CTQApgJj7tzRar3LGdLHjz/+iJ+fHz///HOizztixIgMva6I5F7qoRQRu7h58yarVq3C2dnZdku7devWxMbG8vnnnwPxz//t27fP9kzlggULqFSpku3W9ebNm6lWrRq9e/fm888/Z9WqVVy5cgVXV1eqVavGM888w7Bhw/j5558JCwsjLi6O5557zlaDo6MjEyZMICgoiPXr1+Pu7k4bBwf+ubXd/9avt09EFAvcOUtlBHDnuPAqxP8Be+OOdvLnBw+P1H5dqZLQ43h7D+PWrVttYVtEJL2ph1JEMsXy5cttPY1nz55l7ty5BAUF0bt3bxYtWsSuXbs4ePAg7u7uvPPOOwwdOjTJ7dkNGzbg6upKgQIFAPD09OTmzZu0bdsWf39/5s6dy5kzZ9i6dStVq1ZNtg4/Pz/b7wcNGsSgQYOA+OcxV65cySN16tAyOpqNxN+yrgu8DYQDhYB5JA2Pa4D+wLNAuVvbZxN/e/uZOwu443nFjPDEE0/w888/0759e9q0aUNoaChTp04lICDA1hssIpKeFChFJMMYY2yDY4YPH55oW8Kt2C+//JIvb1uZxtnZmbx58xIdHY0xhgIFCtCqVSvGjBlDmTJlbMdZLBa6du1KvXr1eO+991i0aBEBAQHMmjXrrmESoF+/fnh7ezNw4ECKFi2aaFv16tX5dfp0HnvxRZoDG4E5QB9gHFAA6AE0BVrcdlw14gfiLCF+/sm8t9qWEx9Ib7fx8mVGjBiBm5sbrq6uuLm5ERUVRVRU1H2+zZTr3r07p0+fZtq0aaxcuZKAgAC+++47FixYwLp169LtOiIiCSxGT12LSBqcOHGCzZs3s2vXLg4cOMDRo0c5ffo0ly5d4vr160n2d3Fxsa3wUrp0aSpUqEC1atWoW7cu/v7+dx00k6keewzWrk3f9bednFjn4EDT6GgsFgsODg4YY2y9sAMGDGDixInpdz0RkUykQCki93Tq1Ck2b97Mzp07bYHx33//tQXGO/8IcXZ2xtPTk6JFi+Lj40P58uWpWrUqderUoUKFClkjMN5PaCgEBEAygfiBuboSsmQJFVq1Snaw0N69ewkICEi/64mIZCLd8hbJ5c6ePcuWLVvYuXMn+/btIzQ0lFOnTnHx4kWuXbuWJDDmyZMHT09PfHx8KF26NOXKlaNatWrUrl2bSpUq3XUKmmzF1xcmTYJevdLvnJ9/jn/z5nz22Wf85z//SbQpICCAYsWKpd+1REQymXooRXK48PBwtmzZwo4dO9i/fz9Hjhzh33//JTw8nKtXryYJjE5OTuTLlw8vLy9Kly5N2bJlqVq1KrVr16Zq1ao4OeWif4eOHQtDh6bPed55B4h/rrRly5asWbOG2NhYHB0dcXV1xcnJibfeeotXX30VNze3tF9TRCQTKVCKZHMRERFs3bqV7du3s2/fPo4cOUJYWJgtMN45UtrJyQkPDw+8vLwoWbIk5cqVo3LlytSqVYuHH37YtmSf3DJ9OgwYEP88ZWqeqXRyin99/jnctlQixD9GULFiRS5fvsxbb73FoEGDGD16NFOmTKFYsWKMGjWKbt265YzeXhHJFRQoRbK4qKgotm7dyt9//82+ffsIDg4mLCyMCxcuEBUVlSQwOjo64uHhQZEiRShZsiRWq5UqVaoQGBhIzZo1cXV1tdMnycZCQ6FPH1i9Oj4k3itYJmxv0QKmTYu/fZ6MX3/9lffff5/ly5eTP3/8auAhISG8++67zJ8/n0qVKjFu3DjatGmT7GTsIiJZiQKliJ1dv36d7du389dff7F3715CQkI4efIk58+fJyoqitjYxAv9OTo64u7uTuHChSlZsiT+/v5UrlyZwMBAatWqRd68ee30SXKB/fth6lRYvhxCQuD2Pz4tFvD3h1atoG9fuDVZ+4PYtm0bb775JmvXrqVx48Z8+OGH1KlTJx0+gIhIxlCgFMlg0dHR/P3332zfvp09e/YQHBzMyZMnOXfuHJGRkUkCo4ODA+7u7hQqVIgSJUrYAmPNmjWpXbt2oiUJxY4iIyE4GG7ciF+b22pN1xVwjDGsWLGCN998k3/++YcOHTrw/vvvU7Zs2XS7hohIelGgFEmjmJgYdu7cybZt2/jnn384fPgwJ06c4Pz581y5ciXJFDEODg64ublRuHBhihcvjp+fH5UqVaJmzZrUqVPHtgqMCEBsbCyzZ89m2LBhnD59mj59+jB8+PAkk7KLiNiTAqXIfcTExLB3717++usvdu/eTVBQECdOnODs2bNcuXKFmzdvJtrfYrGQN29eChYsaAuMFStWpEaNGtStW5ciRYrY6ZNIdnbt2jUmTZrE+++/T2xsLK+//jqDBg3CI4PXBRcRSQkFSsn14uLi2L9/P1u3bmXPnj0cOnSI48ePc/bsWSIiIpINjK6urhQqVAhvb298fX2pVKkSDz/8MHXq1MHb29tOn0Ryg/DwcN5//30mTZpEwYIFGTlyJD169CBPnjz2Lk1EcjEFSsnx4uLiCAoKYsuWLezevZtDhw5x7Ngxzp49y+XLl4mOjk60f0JgLFCgAN7e3pQpU8bWw1inTh1Klixpp08i8v+OHTvGsGHD+O677yhbtiwffPAB7du314hwEbELBUrJ9uLi4ggNDWXLli3s2rWLgwcPcuzYMc6cOcPly5e5ceNGkmMSAmOxYsVsgbF69erUrVsXHx8fO3wKkQeze/du3nzzTVauXEm9evX48MMPadiwob3LEpFcRoFSsoVjx47ZAmPCetJnzpyxrSd9JxcXF/Lnz0+xYsXw8fGhQoUKtsDo6+ubPdaTFkmF33//nTfeeIMdO3bQrl07xo0bR8U0TF0kIpIaCpSSJfz7779s3ryZHTt2cPDgQY4ePcqpU6dsgfHO/0ydnZ3Jnz8/RYsWxcfHh/Lly1OtWjXq1q1L2bJlFRglV4qLi2P+/Pm8++67HDt2jJdffpn33nuP4sWL27s0EcnhFCgzeC45iXfmzBm2bNnCzp072bdvH6GhoZw+fZqLFy9y7dq1JIExT548eHp6UrRoUUqXLk358uWpWrUqderUISAgQIFR5B5u3LjB1KlTGT16NFevXmXQoEG88cYbeHp62rs0EcmhcmegTFjtYtkyOHIk6WoXfn7QujW88goEBNivzmwkPDycP//8kx07dnDgwAGOHDnCv//+y8WLF7l69WqygTFfvnwULVqUUqVKUbZsWapVq0bt2rWpXLkyTk5OdvokIjnH5cuXGT9+PJ9++inu7u4MGzaMV155Reu1i0i6y12BMgPW480tLl26lGg96YTAeOHCBa5du5ZkPWknJyfy5ctHkSJFKFWqFOXKlaNKlSrUqlWL6tWra4oTkUwUFhbGiBEjmDlzJmXKlGHs2LE899xz6ukXkXSTewLl9OkwYEB8SLxXkLyTk1P8a9Ik6Nkz4+qzs8jISFtgTFhPOiwsjPDwcKKiopIERkdHRzw8PPDy8qJkyZJYrVaqVq1KYGAgDz/8MK6urnb6JCJyN/v27ePtt99myZIl1KxZkw8//JBmzZrZuywRyQFyR6AcOxaGDk37ecaMgXffTft57ODq1ats27aN7du32wLjyZMnuXDhAlFRUUnWk3Z0dMTd3Z0iRYpQsmRJ23rStWvXpkaNGuTNm9dOn0RE0uqPP/7g9ddfZ+vWrTz++OOMHz+eqlWr2rssEcnGcn6gnD4devVK3/P16JF+50sn169f5++//2b79u38888/BAcHc/LkSc6fP09kZGSSwOjg4IC7uzuFCxemRIkStsBYs2ZNateureXcRHI4Yww///wzb7/9NsHBwXTt2pXRo0dTunRpe5cmItmRSaGNGzfedduxY8dMnz59jI+Pj3F2djZeXl7mySefvOcxd3Px4kXj4uJiALN///5k9+nWrZsBTJUqVUxcXFyS7YD5z3/+Y8yRI8a4uppQMNzj9UH8sBxjwMSC+QZMbTAFwXiAKQumK5jNYIyrq/EpUeKe50t4zZw5M3E9yZg5c6YBzLZt22xtI0aMuOd5u3btapo2bWrKli1rPD09jcViSXY/d3d3U7p0aVOvXj3j5+dnnJ2dzapVq8ylS5ds14qLizPffvutadSokcmfP79xc3MzlStXNu+9956JjIxMUm+TJk1MpUqV7vtzPH/+vBkyZIgpV66ccXFxMQULFjSPPfaYWbJkyV2PuXz5shkzZoypWbOm8fT0NM7OzqZ06dLmueeeM7/++qsxxpgPPvjAAGbFihXJnqNVq1bG09PThIWF3fU6TZo0SfQ9FSxY0AQGBpoZM2aY2NjYJPuvXbvWtG/f3hQrVszkyZPHeHl5mSeeeML89NNP9/0eRLK66Oho88UXX5iiRYsaFxcX8/rrr5vw8HB7lyUi2UyKA6XFYjETJ05M0r5x40bj6elpPD09zaBBg8z06dPNmDFjjNVqvesx9/Lll18aV1dX4+3tbd59991k90kIlID58ccfk2y3BbgWLYxxcrIFys5gZifz2ntboPzPrX2fBPMZmMlgBt4KlSPAGCcns7BaNTN79mzbq3PnzgYwDz/8sKlZs6atPSQkJHE9yUgIlJs3bzZ///23mTJligkMDDSAKVq0qMmbN69xcHBIEhYtFovJmzevcXR0NI6OjqZ8+fLmySefNN26dTPPPPOMyZcvnwkNDU30nbm7uye6dkxMjHnuuecMYBo1amQ++eQTM23aNNOlSxfj4OBgKleubE6fPp3omJQEyoMHD5oSJUoYZ2dn06dPH/PVV1+Z//3vf6Z69eoGMEOGDElyTFBQkPHz8zOOjo6mQ4cO5rPPPjMzZswwI0eONLVr1zaA+fbbb010dLSpUqWK8fPzM1evXk10jh9++MEAZvLkyfesr0mTJqZkyZK2n9PHH39sq+3NN99MtO/w4cMNYMqWLWuGDx9uZsyYYT788EPzyCOPGMDMmTPnntcSyS4iIiLMyJEjjbu7uylYsKD53//+Z65du2bvskQkm0hxoGzUqJFxcHAwmzZtsrWFh4cbb29vU6xYMRMcHJxo/6tXryZ7zP00btzYPP300+a///2v8fX1TXafbt26GTc3N1OuXDlTtWrVJL2UgPlP5862kJgQKP93W3BM7nUajAVMr2S2xYE5c3vbbb2nL774oi3oOTs7J1tPv379zO7du81XX31l+vfvbx577DFToUIF4+7ufteeSDc3N1OiRAkTGBhonn32WTNy5EizaNEic+bMGWOMMR9++KEBkv1+L1++nOgvg+QC5fvvv3/XgLd48WLj4OBgHn/88UTt9wuU0dHRpnLlyiZv3rxmy5YtibbFxMSYjh07GsDMmzfP1n7z5k1TuXJl4+7uftde7ZUrV5ply5YZY4zZvHmzcXBwMG+//bZte0REhClevLipW7dusr2M9/sMUVFRpmTJksbd3d1ER0cbY4xZsGCBAUyHDh1sbbdbsWLFPXtcRbKj06dPm379+hlHR0dTqlQp880335iYmBh7lyUiWVyKA+WRI0eMo6Ojadmypa0t4fbjt99+m+Jj7uXYsWPGYrGYH374wWzduvWuYSkhHH377bcGSHLrETD/qVLFGCenVAXKzbf2m3Wf/YyTkzEDBpjz58+bTp06JQmCvXr1Mq1atTIBAQGmSJEiyYZFi8Vi3NzcTP78+Q1gmjVrZoYOHWp++uknM2jQIAOYc+fO3fP76tOnj3F0dLxvgLr9O0tw9epVU7BgQVOuXDlz8+bNZI956aWXbL2nCe4XKL///nsDmFGjRiW7/dKlS6ZAgQKmQoUKtra5c+cawIwbN+6+nyNBv379TJ48ecy+ffuMMcYMHDjQODk5mT179tz32Lt9hg4dOhjAdru8QoUKplChQiYiIiLFdYnkFIcOHTLPPPOMAUzVqlXN8uXLk33ESETEmFQESmPi/yLOkyeP7VZj/fr1jaurq7l+/XqKj7mXcePGGQ8PD9u+/v7+pl+/fkn2SwhHMTExpmzZsqZatWqJ/qADzH88PZP0UL4H5lwyr5u39vv31n5twETdJ1T+6+5uHB0d7/msY8Kte8D4+PiYV1991Xz11Vdm586d5ty5c+bcuXNm0qRJ5m7PUB46dMi2X8Lr4sWLtv0SehhnzZp13+/2zkC5atUqA5iRI0fe9Zi1a9caINGjB/cLlM8//7wBzNGjR+9ZC2CCgoKMMcb2yMDJkyfv+zkSXL582RQvXtw0bNjQbN++3Tg6Opq33norRcfe7TPUqFHDODo6mqioKHP48GEDmJdffjnFNYnkRJs3bzaNGjWy/cN3+/bt9i5JRLKgVM1qW61aNW7evElwcDAA+/fvp3z58ri4uKT4mHuZM2cOTz75JG5ubgB07NiRH374gZi7zBvp6OjI0KFD2b17N7/88kvijRERSfYfAXgl89p+a/tDwIvAUqAk8DQwATiYzLWLRUXhesfI6QSffvopsbGxXLt2jVOnTgFw7NgxPvvsM3r16sXDDz+Ml5cXXl5eDBgw4G5fB+XLl7ftl/CqW7eubfvLL7+Ml5cX3bt3p2LFivTt25fvv/+ey5cv3/WcCfbv3w/E/3zuJmHbgQMH7nu+28+bP39+fHx8UnzegwcPUqBAAUqUKJFov6ioKM6fP297Rdz2M/X09GTixIls3LiRxx57DB8fH4YPH57iOmNjY23nPXjwIK+++io7duygdevW5M2b11ZblSpVUnxOkZyobt26rF+/nsWLF3P69GkCAwPp3LkzR44csXdpIpKFpCpQ5suXD8D2F/uVK1dsbSk95m727NnDP//8Q+fOnW1tnTt35vz586xcufKux73wwguULVuWUaNGJVne7069gdXJvG5fXHEm8DngCywEhgAVgUeBsNv2cwCOrFzJhAkTeOihh+Lbbq06cfXq1SQrUDz55JOsXr06yev111+/a70//fRTkv1nzpxp216sWDF2797NK6+8wsWLF5k6dSrPP/88RYsWZfTo0ff8Pq5cuQJwz59fSn92d543tf9NREREJDtN0bvvvpsoTD///POJtj/zzDO0bt2a8PBwJk+ebPuHSEocPHjQdt6KFSsyadIk2rRpw9dff52otvt9FpHcwGKx0LZtW3bv3s306dPZsGEDFSpU4NVXX+XcuXP2Lk9EsoBULZh8ZwjJly+frS2lx9zNd999h7u7O35+frbeTFdXV8qUKcOcOXNo06ZNsscl9FJ269aNX375hfbt29/1GmWB5vesIj4o/ufW6wKwCZgKLAc6AX/ctm/R/PkZNGgQcXFxvP766wwYMIBVq1Yl6WkDKFmyJM2bJ736yZMn71pL48aNKVKkyD3rfeihh5gyZQpffPEFQUFBrFy5kvHjxzN8+HAeeughet5ldZ+En8e9fn4p/dnded7z58/fc5/k/ju6cOFCkv369evHE088AUCXLl2SPVetWrVYtmwZgYGBKa4RoEyZMnz11VdYLBZcXV0pW7YsRYsWtW339PRMVKuIxC+p2qNHDzp37sxnn33GuHHjmDlzJm+++Sb//e9/teCBSC6Wqh7KPXv2kCdPHsqWLQtAxYoVOXToEDdu3EjxMckxxvD9998TFRVFQEAAZcuWtb2OHj3KokWLiIyMvOvxL7zwAlarNUW9lKlRGGgHLAOaABuBY7fvcMet/tdee439+/fz4osvplsNKWWxWChXrhwDBgxgw4YNODg4MGfOnLvuX7FiRSD+53M3CdsCAgLuuk9y5718+TLHjx9P8XkrVKjApUuXCAsLS7RfuXLlaN68Oc2bN0/3pRzd3d1p3rw5jz76KA0aNEgUJhNqAvjnn3/S9boiOUHevHl5++23CQkJoUePHrz33ntYrVamT59+10eURCRnS3GgPHr0KH/88QfNmjWz3Vp84oknuH79OgsWLEjxMclZv349J0+eZNSoUSxYsCDR68svv+Tq1atJn5G8TUIv5a5du1i0aFFKP1KqJPR/nUposFjAas2Qa6WVn58fBQsWtD2/mZyGDRtSoEAB5s6dm2QVnQTffvstgK2XMCUS9k049k4REREsWrSIChUqYL31/SUcc68AnNnKlStH+fLl7/uPGZHcrEiRInzyySccPHiQpk2b0qtXL6pWrcrixYvT9R/3IpL1pThQvvTSSxhjEg186NOnD0WLFuX1119P8oD29evXkz0mOQm3u19//XU6dOiQ6NWrVy/Kli1737DRpUsXrFYr7733XnzDrVuWqXEa2J9MezTwO/Ffli1C+vuDnZcn3Lp1K1FRUUna//rrLy5cuED58uXvemzevHkZMmQIhw4d4t1k1idfunQps2bNomXLlokGAt1Phw4dCAgIYNy4cWzfvj3Rtri4OPr27cvFixcZMWKErf25554jICCA0aNHs2XLlmTPa4+/nN577z0uXLhAz549k+11WbVqFb/++mum1yWS1fj5+TFnzhz+/vtvihcvzpNPPknjxo3ZvHmzvUsTkUyS4mco169fz2effUb9+vVtbYULF+bHH3+kTZs21KhRg549exIQEMDp06eZNWsWwcHBSY65040bN/jpp59o0aLFXW9rtmvXjs8++4yzZ88muTWZwNHRkXfffZeXXnopvsHHBw4cgNuCwA7gu2SO9QfqASeB2kAz4gfheANnge+B3cBrQBEAJydo1equnym9/Pjjj8kOVmnRogXFihVj9uzZzJkzh/bt21OzZk2cnZ05cOAAX3/9Na6urrzzzjv3PP9bb73Fzp07GT9+PJs3b+aZZ57Bzc2NjRs38t1331GxYkW++eabJMedO3eOMWPGJGn39fXlhRde4Mcff+TRRx+lYcOGvPTSSwQGBnLp0iXmzp3Ljh07GDx4MJ06dbIdlydPHhYuXEjLli1p2LAhTz/9NI0aNcLd3Z2wsDAWL17M8ePH7/ocbUbp2LEj//zzD2PHjmXnzp107twZHx8fLly4wIoVK/j999+ZO3duptYkkpXVqFGD1atXs2rVKt58803q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GPLkyZOorXPnzsydO9dOFYmIiIjcm255ZzGHDh1K0vb999/TokULO1QjIiIicn8KlFnMnj17km3/7bffkg2bIiIiIvamQJnFHDhwIElbhQoV+PrrrylfvrwdKhIRERG5t3vPXyOZztHREYCCBQuSP39+jh49yq+//oq/v7+dKxMRERFJngblZEHh4eEUKlSIvXv3UqVKFZ599ll++OEHe5clIiIikiwFyizuoYceIiIigqioKHuXIiIiIpIsPUOZxb344otcvXqVhQsX2rsUERERkWSphzKLi4yMxNPTkxo1arB9+3Z7lyMiIiKShHooszgPDw+qVavGzp07uXr1qr3LEREREUlCgTIbeOutt4iLi2PcuHH2LkVEREQkCd3yzibc3NwoVKgQYWFh9i5FREREJBH1UGYTrVq14t9//9VqOSIiIpLlKFBmE2PHjgXg3XfftXMlIiIiIonplnc2Urx4cS5duqTBOSIiIpKlqIcyG+nevTvXrl3TqjkiIiKSpaiHMhu5evUqHh4ePPzww/z999/2LkdEREQEUA9ltpI3b14efvhhzUkpIiIiWYoCZTbz9ttvY4xhzJgx9i5FREREBNAt72wpb968FChQgH///dfepYiIiIiohzI7at26NadOneLAgQP2LkVEREREPZTZ0aFDh6hQoQJPPfUUCxcutHc5IiIiksspUGZTJUuW5MKFC1y7ds3epYiIiEgup1ve2dTLL7/M9evXmT9/vr1LERERkVxOPZTZ1NWrV8mXLx9VqlRh165d9i5HREREcjH1UGZTCXNS7tmzh8jISHuXIyIiIrmYAmU29u6772KMYfTo0fYuRURERHIx3fLO5tzd3cmXLx+nT5+2dykiIiKSS6mHMptr06YNZ86cYe/evfYuRURERHIp9VBmcyEhIVitVtq1a8eiRYvsXY6IiIjkQgqUOUCpUqU4d+4cV69excFBnc4iIiKSuZQ+coCePXty48YN5s6da+9SREREJBdSD2UOcP36ddzd3alUqRJ79uyxdzkiIiKSy6iHMgdwdXUlMDCQvXv3EhERYe9yREREJJdRoMwhEuakfO+99+xdioiIiOQyuuWdg3h4eODu7s6ZM2fsXYqIiIjkIuqhzEHatWvH2bNntba3iIiIZCr1UOYgoaGh+Pn50bp1a5YuXWrvckRERCSXUKDMYUqXLs3Zs2c1J6WIiIhkGiWOHKZPnz7cuHGD2bNn27sUERERySXUQ5nDREdH4+bmRsWKFbW+t4iIiGQK9VDmMM7OztSuXZv9+/dz6dIle5cjIiIiuYACZQ40fPhwzUkpIiIimUa3vHOofPny4ebmxtmzZ+1dioiIiORw6qHMoZ588knOnTvH9u3b7V2KiIiI5HDqocyhjh8/jo+PD48//jjLly+3dzkiIiKSgylQ5mBlypTh1KlTXLt2TXNSioiISIZRysjBXnnlFaKjo/n666/tXYqIiIjkYOqhzMGio6PJmzcv5cqVY//+/fYuR0RERHIo9VDmYM7OztStW5cDBw4QHh5u73JEREQkh1KgzOFGjBiR6FcRERGR9KZb3rmAp6cnzs7OnD9/3t6liIiISA6kHspcoH379ly4cIFt27bZuxQRERHJgdRDmQucPHmSUqVK8dhjj7Fy5Up7lyMiIiI5jAJlLuHn58fJkye5fv265qQUERGRdKVkkUv07duXmzdv8tVXX9m7FBEREclh1EOZS8TExODq6krZsmU5cOCAvcsRERGRHEQ9lLmEk5MT9evX5+DBgxrtLSIiIulKgTIXGTlyJADDhw+3byEiIiKSo+iWdy5ToEABHB0duXDhgr1LERERkRxCPZS5zNNPP014eDibN2+2dykiIiKSQ6iHMpf5999/KVGiBI8++ii//fabvcsRERGRHECBMheyWq0cO3aMGzduaE5KERERSTOliVyof//+xMTEMHXqVHuXIiIiIjmAeihzoZiYGNzc3PD19eXw4cP2LkdERESyOfVQ5kJOTk40bNiQoKAgzp49a+9yREREJJtToMyl3nvvPUBzUoqIiEja6ZZ3LlawYEEALl68aOdKREREJDtTD2Uu9uyzz3Lp0iU2btxo71JEREQkG1MPZS529uxZihUrRtOmTVmzZo29yxEREZFsSoEylytXrhyhoaFcu3YNJycne5cjIiIi2ZBueedyAwcOJCYmhsmTJ9u7FBEREcmm1EOZy8XFxeHi4kKZMmUICgqydzkiIiKSDamHMpdzcHCgcePGBAcHc/r0aXuXIyIiItmQAqUwZswYAIYOHWrnSkRERCQ70i1vAaBQoULExcVx6dIle5ciIiIi2Yx6KAWAjh07cvnyZdatW2fvUkRERCSbUQ+lAHD+/Hm8vLxo3Lgx69evt3c5IiIiko0oUIpNhQoVCA4O5vr165qTUkRERFJMt7zF5tVXXyU2NpaJEyfauxQRERHJRtRDKTZxcXG4urpSqlQpQkJC7F2OiIiIZBPqoRQbBwcHHnnkEY4cOcLJkyftXY6IiIhkEwqUksjo0aMBGDZsmJ0rERERkexCt7wlicKFCxMTE8Ply5ftXYqIiIhkA+qhlCSef/55IiIi+P333+1dioiIiGQD6qGUJMLDwylcuDANGzbkjz/+sHc5IiIiksUpUEqyKlasSFBQkOakFBERkfvSLW9J1uDBg4mNjeXjjz+2dykiIiKSxamHUpIVFxeHm5sbxYsXJzQ01N7liIiISBamHkpJloODA02bNuXo0aMcP37c3uWIiIhIFqZAKXc1ZswYAIYOHWrnSkRERCQr0y1vuScvLy9u3LhBRESEvUsRERGRLEo9lHJPzz//PFeuXGHlypX2LkVERESyKPVQyj1dunSJQoUKUa9ePTZt2mTvckRERCQLUqCU+6pcuTIHDhzg2rVrODs727scERERyWJ0y1vua/DgwcTFxTFhwgR7lyIiIiJZkHoo5b7i4uLImzcv3t7eHD161N7liIiISBajHkq5LwcHBx599FGOHTvGsWPH7F2OiIiIZDEKlJIiY8eOBeCdd96xcyUiIiKS1eiWt6RYsWLFuHr1KleuXLF3KSIiIpKFqIdSUqxLly5ERkby66+/2rsUERERyULUQykpFhERQYECBahduzZbtmyxdzkiIiKSRShQSqpUrVqVffv2aU5KERERsdEtb0mVN954g7i4OD788EN7lyIiIiJZhHooJVUS5qQsWrQox48ft3c5IiIikgWoh1JSxcHBgZYtW3LixAlCQ0PtXY6IiIhkAQqUkmqak1JERERup1ve8kC8vb2JjIwkMjLS3qWIiIiInamHUh5It27diIqKYtGiRfYuRUREROxMPZTyQCIjI/H09CQwMJC//voroRGCg+HGDXBxAasVPDzsW6iIiIhkOAVKeWDVq1cnZs8edvfti+PKlXDkCNz+n5PFAn5+0Lo1vPIKBATYr1gRERHJMAqU8mBCQwl/7jkKbd+OcXLCEhNz932dnCAmBlq0gGnTwNc38+oUERGRDKdnKCX1pk+HgAAK7doFcO8wCfFhEmDt2vheyunTM7Y+ERERyVQKlJI6Y8dCr15w/fr/B8WUiomJP65Xr/jziIiISI6g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", - "text/plain": [ - "
" + "text/html": [ + " \n", + " " ] }, "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "('William Stoner', 'KALAMAZOO ANESTHESIOLOGY PC', {'amount': 10.0, 'year': 2017})\n", - "('KALAMAZOO ANESTHESIOLOGY PC', 'Bob Kushman', {'amount': 1530})\n", - "('Bob Kushman', 'KALAMAZOO ANESTHESIOLOGY PC', {'amount': 530})\n", - "('James Engelson', 'Bob Kushman', {'amount': 90.0, 'year': 2019})\n", - "('Allen Wolf', 'William Stoner', {'amount': 111.5, 'year': 2018})\n", - "('Allen Wolf', 'William Stoner', {'amount': 11100.5, 'year': 2018})\n" - ] - } - ], - "source": [ - "G = nx.MultiDiGraph()\n", - " \n", - "G.add_node(\"William Stoner\", Age=10, Weight=110)\n", - "G.add_edge(\"William Stoner\",\"KALAMAZOO ANESTHESIOLOGY PC\",amount=10.00, year=2017)\n", - "G.add_node(\"KALAMAZOO ANESTHESIOLOGY PC\", Age=50, Weight=180)\n", - "G.add_edge(\"KALAMAZOO ANESTHESIOLOGY PC\",\"Bob Kushman\",amount=1530)\n", - "G.add_node(\"Bob Kushman\", Age=90, Weight=111)\n", - "G.add_edge(\"Bob Kushman\",\"KALAMAZOO ANESTHESIOLOGY PC\",amount=530)\n", - "G.add_node(\"James Engelson\", Age=40, Weight=10)\n", - "G.add_edge(\"James Engelson\",\"Bob Kushman\",amount=90.00, year=2019,)\n", - "G.add_node(\"Allen Wolf\", Age=30, Weight=1710)\n", - "G.add_edge(\"Allen Wolf\",\"William Stoner\",amount=111.50,year=2018)\n", - "G.add_edge(\"Allen Wolf\",\"William Stoner\",amount=11100.50,year=2018)\n", - "\n", - "\n", - "\n", - "edge_labels = {(u,v):d['amount'] for u,v,d in G.edges(data=True)}\n", - "nx.draw(G, with_labels=True,node_color='red')\n", - "pos = nx.planar_layout(G)\n", - "for edge, label in edge_labels.items():\n", - " nx.draw_networkx_edge_labels(G, pos=pos, edge_labels={edge: label}, label_pos=0.5, verticalalignment='center', horizontalalignment='center')\n", - "plt.show()\n", - "for edge in G.edges(data=True):\n", - " print(edge)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ { "data": { "application/vnd.plotly.v1+json": { @@ -1738,7782 +1564,721 @@ { "hoverinfo": "text", "hovertext": [ - "Amount: 10.00, Weight: 10.00", - "Amount: 1530.00, Weight: 1530.00", - "Amount: 530.00, Weight: 530.00", - "Amount: 90.00, Weight: 90.00", - "Amount: 111.50, Weight: 111.50" - ], - "line": { - "color": "#888" - }, - "mode": "lines", - "type": "scatter", - "x": [ - 10, - 50, - null, - 50, - 90, - null, - 90, - 50, - null, - 40, - 90, - null, - 30, - 10, - null - ], - "y": [ - 110, - 180, - null, - 180, - 111, - null, - 111, - 180, - null, - 10, - 111, - null, - 1710, - 110, - null - ] - }, - { - "hoverinfo": "text", - "marker": { - "colorscale": [ - [ - 0, - "rgb(255,255,217)" - ], - [ - 0.125, - "rgb(237,248,177)" - ], - [ - 0.25, - "rgb(199,233,180)" - ], - [ - 0.375, - "rgb(127,205,187)" - ], - [ - 0.5, - "rgb(65,182,196)" - ], - [ - 0.625, - "rgb(29,145,192)" - ], - [ - 0.75, - "rgb(34,94,168)" - ], - [ - 0.875, - "rgb(37,52,148)" - ], - [ - 1, - "rgb(8,29,88)" - ] - ], - "showscale": true, - "size": 10 - }, - "mode": "markers", - "text": [ - "William Stoner
Age: 10
Weight: 110", - "KALAMAZOO ANESTHESIOLOGY PC
Age: 50
Weight: 180", - "Bob Kushman
Age: 90
Weight: 111", - "James Engelson
Age: 40
Weight: 10", - "Allen Wolf
Age: 30
Weight: 1710" - ], - "type": "scatter", - "x": [ - 10, - 50, - 90, - 40, - 30 - ], - "y": [ - 110, - 180, - 111, - 10, - 1710 - ] - } - ], - "layout": { - "hovermode": "closest", - "margin": { - "b": 20, - "l": 5, - "r": 5, - "t": 40 - }, - "showlegend": false, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "font": { - "size": 16 - }, - "text": "
Network graph made with Plotly" - }, - "xaxis": { - "showgrid": false, - "showticklabels": false, - "zeroline": false - }, - "yaxis": { - "showgrid": false, - "showticklabels": false, - "zeroline": false - } - } - }, - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "G = nx.MultiDiGraph()\n", - "\n", - "G.add_node(\"William Stoner\", Age=10, Weight=110)\n", - "G.add_node(\"KALAMAZOO ANESTHESIOLOGY PC\", Age=50, Weight=180)\n", - "G.add_node(\"Bob Kushman\", Age=90, Weight=111)\n", - "G.add_node(\"James Engelson\", Age=40, Weight=10)\n", - "G.add_node(\"Allen Wolf\", Age=30, Weight=1710)\n", - "\n", - "G.add_edge(\"William Stoner\", \"KALAMAZOO ANESTHESIOLOGY PC\", weight=10.00, amount=10.00, year=2017)\n", - "G.add_edge(\"KALAMAZOO ANESTHESIOLOGY PC\", \"Bob Kushman\", weight=1530, amount=1530, year=2017)\n", - "G.add_edge(\"Bob Kushman\", \"KALAMAZOO ANESTHESIOLOGY PC\", weight=530, amount=530, year=2017)\n", - "G.add_edge(\"James Engelson\", \"Bob Kushman\", weight=90.00, amount=90.00, year=2017)\n", - "G.add_edge(\"Allen Wolf\", \"William Stoner\", weight=111.50, amount=111.50, year=2017)\n", - "\n", - "# Create Plotly graph\n", - "edge_trace = go.Scatter(x=[], y=[], line=dict(color='#888'), hoverinfo='text', mode='lines')\n", - "hovertext = []\n", - "\n", - "for edge in G.edges(data=True):\n", - " x0, y0 = G.nodes[edge[0]]['Age'], G.nodes[edge[0]]['Weight']\n", - " x1, y1 = G.nodes[edge[1]]['Age'], G.nodes[edge[1]]['Weight']\n", - " edge_trace['x'] += tuple([x0, x1, None])\n", - " edge_trace['y'] += tuple([y0, y1, None])\n", - " hovertext.append(f\"Amount: {edge[2]['amount']:.2f}, Weight: {edge[2]['weight']:.2f}\")\n", - "\n", - "edge_trace['hovertext'] = hovertext\n", - "\n", - "node_trace = go.Scatter(x=[], y=[], text=[], mode='markers', hoverinfo='text', marker=dict(showscale=True, colorscale='YlGnBu', size=10))\n", - "\n", - "for node in G.nodes():\n", - " x, y = G.nodes[node]['Age'], G.nodes[node]['Weight']\n", - " node_trace['x'] += tuple([x])\n", - " node_trace['y'] += tuple([y])\n", - " node_info = node + '
' + 'Age: ' + str(G.nodes[node]['Age']) + '
' + 'Weight: ' + str(G.nodes[node]['Weight'])\n", - " node_trace['text'] += tuple([node_info])\n", - "\n", - "fig = go.Figure(data=[edge_trace, node_trace],\n", - " layout=go.Layout(\n", - " title='
Network graph made with Plotly',\n", - " titlefont=dict(size=16),\n", - " showlegend=False,\n", - " hovermode='closest',\n", - " margin=dict(b=20,l=5,r=5,t=40),\n", - " xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),\n", - " yaxis=dict(showgrid=False, zeroline=False, showticklabels=False)))\n", - "\n", - "fig.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hoverinfo": "text", - "hovertext": [ - "Amount: 5.00", - "Amount: 100.00", - "Amount: 15.00", - "Amount: 151.76", - "Amount: 75.00", - "Amount: 11.12", - "Amount: 1.00", - "Amount: 1.00", - "Amount: 5.88", - "Amount: 250.00", - "Amount: 15.00", - "Amount: 273.00", - "Amount: 25.44", - "Amount: 100.00", - "Amount: 50.00", - "Amount: 400.00", - "Amount: 300.00", - "Amount: 1020.00", - "Amount: 100.00", - "Amount: 100.00", - "Amount: 5.00", - "Amount: 15.00", - "Amount: 100.00", - "Amount: 13.00", - "Amount: 750.00", - "Amount: 15.00", - "Amount: 500.00", - "Amount: 2.50", - "Amount: 1.00", - "Amount: 250.00", - "Amount: 35.00", - "Amount: 40.00", - "Amount: 9.29", - "Amount: 5.00", - "Amount: 19.00", - "Amount: 75.00", - "Amount: 25.15", - "Amount: 15.78", - "Amount: 1.00", - "Amount: 250.00", - "Amount: 1000.00", - "Amount: 2.87", - "Amount: 67.18", - "Amount: 150.00", - "Amount: 29.40", - "Amount: 1.00", - "Amount: 500.00", - "Amount: 60.00", - "Amount: 10.00", - "Amount: 76.32" - ], - "line": { - "color": "#888" - }, - "mode": "lines", - "type": "scatter", - "x": [], - "y": [] - }, - { - "hoverinfo": "text", - "marker": { - "color": [ - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green" - ], - "colorscale": [ - [ - 0, - "rgb(255,255,217)" - ], - [ - 0.125, - "rgb(237,248,177)" - ], - [ - 0.25, - "rgb(199,233,180)" - ], - [ - 0.375, - "rgb(127,205,187)" - ], - [ - 0.5, - "rgb(65,182,196)" - ], - [ - 0.625, - "rgb(29,145,192)" - ], - [ - 0.75, - "rgb(34,94,168)" - ], - [ - 0.875, - "rgb(37,52,148)" - ], - [ - 1, - "rgb(8,29,88)" - ] - ], - "showscale": true, - "size": 10 - }, - "mode": "markers", - "text": [ - "Name: rachel puthuff
donor_id: 639646bf-5176-474c-b800-1afb34c55b53
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: rachel puthuff
recipient_name: reproductive freedom for all
address: 3717 WHITAKER
city: SCHERTZ
classification: neutral
entity_type: Individual
first_name: RACHEL
id: 639646bf-5176-474c-b800-1afb34c55b53
last_name: PUTHUFF
state: TX
zip: 78154-0000
", - "Name: reproductive freedom for all
classification: neutral
", - "Name: james bennett
donor_id: 447b61fb-39cc-41a9-8dfc-2dbb4e2f3774
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: james bennett
recipient_name: reproductive freedom for all
address: 533 W OAK ST
city: MASON
classification: neutral
entity_type: Individual
first_name: JAMES
id: 447b61fb-39cc-41a9-8dfc-2dbb4e2f3774
last_name: BENNETT
state: MI
zip: 48854-0000
", - "Name: sonny mandouh mr.^
donor_id: 34d28c8d-c0fe-463d-9afe-73269a47389b
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: sonny mandouh mr.^
recipient_name: realtors political action committee of michigan
address: 23760 HOLLANDER ST
city: DEARBORN
classification: neutral
entity_type: Individual
first_name: SONNY
id: 34d28c8d-c0fe-463d-9afe-73269a47389b
last_name: MANDOUH MR.^
state: MI
zip: 48128-0000
", - "Name: realtors political action committee of michigan
classification: neutral
", - "Name: charles crider
donor_id: e765ba37-66d2-4b65-9f42-3902dca518b6
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: charles crider
recipient_name: reproductive freedom for all
address: 1403 WEST HIGHLAND BLVD.
city: BATTLE CREEK
classification: neutral
entity_type: Individual
first_name: CHARLES
id: e765ba37-66d2-4b65-9f42-3902dca518b6
last_name: CRIDER
state: MI
zip: 49015-0000
", - "Name: michelle zukowski-serlin
donor_id: 5c0fe744-23e3-4346-b112-0730c6d4b60c
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: michelle zukowski-serlin
recipient_name: reproductive freedom for all
address: 4853 LANDING WAY
city: KALAMAZOO
classification: neutral
company: choices for change counseling
entity_type: Individual
first_name: MICHELLE
id: 5c0fe744-23e3-4346-b112-0730c6d4b60c
last_name: ZUKOWSKI-SERLIN
occupation: business owners and clinical s
state: MI
zip: 49048-6153
", - "Name: diana gibson-lee
donor_id: df25775c-dad2-4f56-8fcd-b31171a7dcb0
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: diana gibson-lee
recipient_name: veronica klinefelt for state senate
address: 7450 W DYER RD
city: TWINING
classification: neutral
entity_type: Individual
first_name: DIANA
id: df25775c-dad2-4f56-8fcd-b31171a7dcb0
last_name: GIBSON-LEE
state: MI
zip: 48766-9773
", - "Name: veronica klinefelt for state senate
classification: neutral
", - "Name: edward kazala
donor_id: 74b522f4-6214-42cd-9d68-7abfe3e18a07
recipient_id: 707305ca-e572-4109-8429-00600edf3fb8
full_name: edward kazala
recipient_name: elect padma kuppa
address: 70 REVERE CT
city: LAFAYETTE
classification: neutral
entity_type: Individual
first_name: EDWARD
id: 74b522f4-6214-42cd-9d68-7abfe3e18a07
last_name: KAZALA
state: CA
zip: 94549-0000
", - "Name: andrea kovalsky
donor_id: 3dc1360d-e9e8-4e55-ac2e-f608f489ab94
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: andrea kovalsky
recipient_name: veronica klinefelt for state senate
address: 497 SAINT MARKS AVE APT 5P
city: BROOKLYN
classification: neutral
entity_type: Individual
first_name: ANDREA
id: 3dc1360d-e9e8-4e55-ac2e-f608f489ab94
last_name: KOVALSKY
state: NY
zip: 11238-5792
", - "Name: colin palmer
donor_id: ad440dcd-79ad-4323-8f19-c7a491f897f7
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: colin palmer
recipient_name: veronica klinefelt for state senate
address: 531 E 20TH ST APT 10D
city: NEW YORK
classification: neutral
company: not employed
entity_type: Individual
first_name: COLIN
id: ad440dcd-79ad-4323-8f19-c7a491f897f7
last_name: PALMER
occupation: not employed
state: NY
zip: 10010-7604
", - "Name: julie svinicki ms.^
donor_id: 4cb88517-6bc4-45a1-ae2f-be0b76688898
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: julie svinicki ms.^
recipient_name: realtors political action committee of michigan
address: 1608 KIRTLAND DRIVE
city: ANN ARBOR
classification: neutral
entity_type: Individual
first_name: JULIE
id: 4cb88517-6bc4-45a1-ae2f-be0b76688898
last_name: SVINICKI MS.^
state: MI
zip: 48103-0000
", - "Name: audrey lance
donor_id: e8ef0925-3f10-4ebf-b025-dea32e506a50
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: audrey lance
recipient_name: reproductive freedom for all
address: 3945 FORBES AVE APT 444
city: PITTSBURGH
classification: neutral
entity_type: Individual
first_name: AUDREY
id: e8ef0925-3f10-4ebf-b025-dea32e506a50
last_name: LANCE
occupation: physician
state: PA
zip: 15213-0000
", - "Name: walker c evans
donor_id: 9853cee2-ff37-41bd-a469-0e338a4fefc9
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: walker c evans
recipient_name: reproductive freedom for all
address: 2810 NORTHVILLE DR NE
city: GRAND RAPIDS
classification: neutral
entity_type: Individual
first_name: WALKER C
id: 9853cee2-ff37-41bd-a469-0e338a4fefc9
last_name: EVANS
state: MI
zip: 49525-0000
", - "Name: lori henderson
donor_id: 3042129c-b91e-4d6a-b723-74cd7ec55e75
recipient_id: 6b51e739-dd22-4556-8555-6e11264ef4ce
full_name: lori henderson
recipient_name: planned parenthood advocates of mi
address: 2401 HARDWOOD AVE
city: ROYAK OAK
classification: neutral
entity_type: Individual
first_name: LORI
id: 3042129c-b91e-4d6a-b723-74cd7ec55e75
last_name: HENDERSON
state: MI
zip: 48067-0000
", - "Name: planned parenthood advocates of mi
classification: neutral
", - "Name: brett lundie
donor_id: 932450e5-f8fc-4cb2-baac-acfad686561f
recipient_id: 2f221dfb-d552-4234-83f8-cd05d10f1266
full_name: brett lundie
recipient_name: citizens to support mi women and children
address: 7779 CIRCLE DR
city: LAINGSBURG
classification: neutral
entity_type: Individual
first_name: BRETT
id: 932450e5-f8fc-4cb2-baac-acfad686561f
last_name: LUNDIE
state: MI
zip: 48848-0000
", - "Name: citizens to support mi women and children
classification: neutral
", - "Name: ian robinson
donor_id: 757923ec-02e3-424e-81b9-4152f6dd165b
recipient_id: 06ebbb03-574c-445b-9416-7d2134a06d1f
full_name: ian robinson
recipient_name: committee to elect james e johnson jr
address: 3435 BRENTWOOD CT
city: ANN ARBOR
classification: neutral
company: university of michigan
entity_type: Individual
first_name: IAN
id: 757923ec-02e3-424e-81b9-4152f6dd165b
last_name: ROBINSON
occupation: faculty
state: MI
zip: 48108-1757
", - "Name: committee to elect james e johnson jr
classification: neutral
", - "Name: kelly bean
donor_id: 8521781f-6ca7-43dc-90a6-c1af13da9e2a
recipient_id: 00a76143-0f24-4683-9963-09f10803e957
full_name: kelly bean
recipient_name: friends of jerry neyer
address: 1405 E BATTLE RD
city: ROSEBUSH
classification: neutral
entity_type: Individual
first_name: KELLY
id: 8521781f-6ca7-43dc-90a6-c1af13da9e2a
last_name: BEAN
state: MI
zip: 48878-9732
", - "Name: friends of jerry neyer
classification: neutral
", - "Name: sandra johnson
donor_id: 49bcd93b-241b-4343-8bbf-bcf70d828c8e
recipient_id: 7ee2db24-b832-4f1b-af2e-e9c8eaf706bd
full_name: sandra johnson
recipient_name: committee to elect charise anderson
address: 424 N 21ST ST 0
city: MONTEBELLO
classification: neutral
entity_type: Individual
first_name: SANDRA
id: 49bcd93b-241b-4343-8bbf-bcf70d828c8e
last_name: JOHNSON
occupation: eligibility worker
state: CA
zip: 90640-0000
", - "Name: committee to elect charise anderson
classification: neutral
", - "Name: christopher mishler
donor_id: 7b8ee884-4471-493d-bf17-386d57bf3f6d
recipient_id: 2f221dfb-d552-4234-83f8-cd05d10f1266
full_name: christopher mishler
recipient_name: citizens to support mi women and children
address: 3690 VORHIES ROAD
city: ANN ARBOR
classification: neutral
entity_type: Individual
first_name: CHRISTOPHER
id: 7b8ee884-4471-493d-bf17-386d57bf3f6d
last_name: MISHLER
state: MI
zip: 48105-0000
", - "Name: stacy leroy daniels
donor_id: 5a40e7db-bb2a-47f4-ac92-5584988c8a5e
recipient_id: 7f272fe4-d592-453c-9ca1-315ea3fdcff1
full_name: stacy leroy daniels
recipient_name: bill g schuette for state representative
address: 3901 ORCHARD DRIVE
city: MIDLAND
classification: neutral
entity_type: Individual
first_name: STACY LEROY
id: 5a40e7db-bb2a-47f4-ac92-5584988c8a5e
last_name: DANIELS
state: MI
zip: 48640-0000
", - "Name: bill g schuette for state representative
classification: neutral
", - "Name: suzanne r weinheimer
donor_id: 029a23eb-d90f-405b-995c-c8dc266e255f
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: suzanne r weinheimer
recipient_name: reproductive freedom for all
address: 11045 8TH AVENUE NE APT 826
city: SEATTLE
classification: neutral
entity_type: Individual
first_name: SUZANNE R
id: 029a23eb-d90f-405b-995c-c8dc266e255f
last_name: WEINHEIMER
state: WA
zip: 98125-0000
", - "Name: dustin shaeffer mr.^
donor_id: fc041110-7c11-47af-b1bf-5daca974e4ee
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: dustin shaeffer mr.^
recipient_name: realtors political action committee of michigan
address: 60451 MOJAVE LANE
city: WASHINGTON
classification: neutral
entity_type: Individual
first_name: DUSTIN
id: fc041110-7c11-47af-b1bf-5daca974e4ee
last_name: SHAEFFER MR.^
state: MI
zip: 48094-0000
", - "Name: debra byl
donor_id: b8e9c951-5c8c-42d3-91e1-d6457b28f2ae
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: debra byl
recipient_name: reproductive freedom for all
address: 987 BRADFORD GREENS
city: GRAND RAPIDS
classification: neutral
entity_type: Individual
first_name: DEBRA
id: b8e9c951-5c8c-42d3-91e1-d6457b28f2ae
last_name: BYL
state: MI
zip: 49525-0000
", - "Name: pamela wimp
donor_id: 88ccb4d4-c756-4039-bac2-77a610d69bb0
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: pamela wimp
recipient_name: reproductive freedom for all
address: 8030 MERCER CT NE
city: LACEY
classification: neutral
entity_type: Individual
first_name: PAMELA
id: 88ccb4d4-c756-4039-bac2-77a610d69bb0
last_name: WIMP
state: WA
zip: 98516-6336
", - "Name: lori wortz
donor_id: 821a27dc-aa00-436e-80e2-655ce26bc830
recipient_id: 7f272fe4-d592-453c-9ca1-315ea3fdcff1
full_name: lori wortz
recipient_name: bill g schuette for state representative
address: 4144 MERIDIAN RD
city: OKEMOS
classification: neutral
company: braenaru consulting
entity_type: Individual
first_name: LORI
id: 821a27dc-aa00-436e-80e2-655ce26bc830
last_name: WORTZ
occupation: consultant
state: MI
zip: 48864-0000
", - "Name: janet reid
donor_id: 25f2cb86-6d01-4fc2-9aaf-d276ce634a47
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: janet reid
recipient_name: reproductive freedom for all
address: 2378 EATON GATE RD
city: LAKE ORION
classification: neutral
entity_type: Individual
first_name: JANET
id: 25f2cb86-6d01-4fc2-9aaf-d276ce634a47
last_name: REID
state: MI
zip: 48360-1869
", - "Name: gary henderson
donor_id: 05a6c5c3-4a3f-41e0-a9d5-e54f33703d2d
recipient_id: 7f272fe4-d592-453c-9ca1-315ea3fdcff1
full_name: gary henderson
recipient_name: bill g schuette for state representative
address: 1601 KINGSWOOD DRIVE
city: LANSING
classification: neutral
company: aircraft precision prod. inc.
entity_type: Individual
first_name: GARY
id: 05a6c5c3-4a3f-41e0-a9d5-e54f33703d2d
last_name: HENDERSON
occupation: sales purchasing manager
state: MI
zip: 48912-0000
", - "Name: claudette levesque
donor_id: 26d5e377-57c4-4f33-95ce-4209bff4242b
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: claudette levesque
recipient_name: reproductive freedom for all
address: 41 CATERPILLAR HILL RD
city: SARGENTVILLE
classification: neutral
entity_type: Individual
first_name: CLAUDETTE
id: 26d5e377-57c4-4f33-95ce-4209bff4242b
last_name: LEVESQUE
state: ME
zip: 04673-2464
", - "Name: graham chapman
donor_id: 8045638c-db65-4a13-9016-05e73766b5b1
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: graham chapman
recipient_name: reproductive freedom for all
address: 1914 CLINTON ST
city: LOS ANGELES
classification: neutral
entity_type: Individual
first_name: GRAHAM
id: 8045638c-db65-4a13-9016-05e73766b5b1
last_name: CHAPMAN
state: CA
zip: 90026-4137
", - "Name: john olson
donor_id: 1ff268c7-fbff-4f94-8810-48f31bb53681
recipient_id: 00a76143-0f24-4683-9963-09f10803e957
full_name: john olson
recipient_name: friends of jerry neyer
address: 6025 VERDE TRL S APT K217
city: BOCA RATON
classification: neutral
entity_type: Individual
first_name: JOHN
id: 1ff268c7-fbff-4f94-8810-48f31bb53681
last_name: OLSON
state: FL
zip: 33433-4442
", - "Name: christina ridalls ms.^
donor_id: 9bea8116-83a3-486a-a457-50c0f80af060
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: christina ridalls ms.^
recipient_name: realtors political action committee of michigan
address: 3083 BEATTIE RD
city: HOWELL
classification: neutral
entity_type: Individual
first_name: CHRISTINA
id: 9bea8116-83a3-486a-a457-50c0f80af060
last_name: RIDALLS MS.^
state: MI
zip: 48843-0000
", - "Name: dylynn mclean
donor_id: a1943974-4abe-4093-be0b-edcc56a97ffe
recipient_id: bbe89315-1939-46e3-a5c0-2d6e5b28bc95
full_name: dylynn mclean
recipient_name: 1st congressional dist rep comm
address: 1531 W 20 MILE RD
city: SAULT STE MARIE
classification: neutral
entity_type: Individual
first_name: DYLYNN
id: a1943974-4abe-4093-be0b-edcc56a97ffe
last_name: MCLEAN
state: MI
zip: 49783-0000
", - "Name: 1st congressional dist rep comm
classification: neutral
", - "Name: andrew morris
donor_id: 767c512a-9c5a-4230-90ab-3fd40d731f60
recipient_id: 707305ca-e572-4109-8429-00600edf3fb8
full_name: andrew morris
recipient_name: elect padma kuppa
address: 1118 MORNINGSIDE AVE
city: SCHENECTADY
classification: neutral
entity_type: Individual
first_name: ANDREW
id: 767c512a-9c5a-4230-90ab-3fd40d731f60
last_name: MORRIS
state: NY
zip: 12309-5630
", - "Name: elect padma kuppa
classification: neutral
", - "Name: martha scoppa
donor_id: 78fcc760-825f-404a-b058-a88a99992d98
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: martha scoppa
recipient_name: reproductive freedom for all
address: 32 COLD SPRING RD
city: LIBERTY
classification: neutral
entity_type: Individual
first_name: MARTHA
id: 78fcc760-825f-404a-b058-a88a99992d98
last_name: SCOPPA
state: NY
zip: 12754-0000
", - "Name: carol woodard
donor_id: d4ba0589-99d6-4455-a978-315395322208
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: carol woodard
recipient_name: reproductive freedom for all
address: 5143 SPRING MEADOWS
city: TROY
classification: neutral
entity_type: Individual
first_name: CAROL
id: d4ba0589-99d6-4455-a978-315395322208
last_name: WOODARD
state: MI
zip: 48098-0000
", - "Name: rochelle albright
donor_id: 87b3feed-01a5-4cc8-82cd-cf9c78977534
recipient_id: e3294ecb-f6df-48a0-b3b4-7048a9c650a7
full_name: rochelle albright
recipient_name: michael detmer for state senate
address: 1840 GRAY RD
city: HOWELL
classification: neutral
entity_type: Individual
first_name: ROCHELLE
id: 87b3feed-01a5-4cc8-82cd-cf9c78977534
last_name: ALBRIGHT
state: MI
zip: 48843-0000
", - "Name: michael detmer for state senate
classification: neutral
", - "Name: richard mayfield
donor_id: 80ec6920-a933-4c3e-9487-74cbfe6716f7
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: richard mayfield
recipient_name: veronica klinefelt for state senate
address: 3221 GRISCHY LN
city: CINCINNATI
classification: neutral
entity_type: Individual
first_name: RICHARD
id: 80ec6920-a933-4c3e-9487-74cbfe6716f7
last_name: MAYFIELD
state: OH
zip: 45208-3109
", - "Name: charles risch
donor_id: 6b4b51e8-f105-4cc1-96f7-cec2d931e58f
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: charles risch
recipient_name: reproductive freedom for all
address: 300 S WACKER DR
city: CHICAGO
classification: neutral
entity_type: Individual
first_name: CHARLES
id: 6b4b51e8-f105-4cc1-96f7-cec2d931e58f
last_name: RISCH
state: IL
zip: 60606-6680
", - "Name: barbara miller
donor_id: 47043446-3b77-4a34-9d0d-a21786400d9b
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: barbara miller
recipient_name: veronica klinefelt for state senate
address: 820 W END AVE APT 6A
city: NEW YORK
classification: neutral
entity_type: Individual
first_name: BARBARA
id: 47043446-3b77-4a34-9d0d-a21786400d9b
last_name: MILLER
state: NY
zip: 10025-5330
", - "Name: kevin korpi
donor_id: 10f51417-a0e9-4a2c-8bdb-e5d045fcab08
recipient_id: 5f7c53e3-d1be-47a9-acc4-70828a8c7a69
full_name: kevin korpi
recipient_name: committee to elect ed mcbroom
address: 220 MAC AVE APT 418
city: EAST LANSING
classification: neutral
company: acuitas
entity_type: Individual
first_name: KEVIN
id: 10f51417-a0e9-4a2c-8bdb-e5d045fcab08
last_name: KORPI
occupation: lobbyist
state: MI
zip: 48823-0000
", - "Name: committee to elect ed mcbroom
classification: neutral
", - "Name: wayne miller
donor_id: 14208b99-1ecb-4b33-becf-c30882e9b302
recipient_id: f88fdd05-e3e4-4d51-8511-1ffd35965c8e
full_name: wayne miller
recipient_name: committee to elect jack richert
address: 27301 SCENIC HWY
city: FRANKLIN
classification: neutral
company: miller & tischler pc
entity_type: Individual
first_name: WAYNE
id: 14208b99-1ecb-4b33-becf-c30882e9b302
last_name: MILLER
occupation: attorney
state: MI
zip: 48025-0000
", - "Name: committee to elect jack richert
classification: neutral
", - "Name: mary soens
donor_id: 664b4540-8b50-44d3-8570-cb797a4859fe
recipient_id: 707305ca-e572-4109-8429-00600edf3fb8
full_name: mary soens
recipient_name: elect padma kuppa
address: 55 N HANCOCK ST
city: LEXINGTON
classification: neutral
entity_type: Individual
first_name: MARY
id: 664b4540-8b50-44d3-8570-cb797a4859fe
last_name: SOENS
state: MA
zip: 02420-0000
", - "Name: rebecca baskin
donor_id: 9eb92629-9f8e-4bb5-8dc3-373b56a7db3a
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: rebecca baskin
recipient_name: reproductive freedom for all
address: 680 BERKSHIRE DR
city: SALINE
classification: neutral
entity_type: Individual
first_name: REBECCA
id: 9eb92629-9f8e-4bb5-8dc3-373b56a7db3a
last_name: BASKIN
state: MI
zip: 48176-1087
", - "Name: edward kaminski
donor_id: 5b4130f6-d8dd-4739-aa68-2fe81dd4532b
recipient_id: 76a600c1-7ead-437a-85ad-0cca7573393b
full_name: edward kaminski
recipient_name: friends of brian hosticka
address: 8765 LEHMAN RD
city: MONTAGUE
classification: neutral
entity_type: Individual
first_name: EDWARD
id: 5b4130f6-d8dd-4739-aa68-2fe81dd4532b
last_name: KAMINSKI
state: MI
zip: 49437-9326
", - "Name: friends of brian hosticka
classification: neutral
", - "Name: robert brown
donor_id: 766a34f7-1c8b-4635-a69c-0bff1bf155be
recipient_id: 2e8c9124-2258-45e3-a198-e8c1798c49f2
full_name: robert brown
recipient_name: monroe plumbers and pipe fitters local 671 pac fund
address: 1207 SANDHURST DR
city: TALLAHASSEE
classification: neutral
entity_type: Individual
first_name: ROBERT
id: 766a34f7-1c8b-4635-a69c-0bff1bf155be
last_name: BROWN
state: FL
zip: 32312-2527
", - "Name: monroe plumbers and pipe fitters local 671 pac fund
classification: neutral
", - "Name: sandra braddock
donor_id: e42e7230-02f0-4b28-ba39-7b68e796d510
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: sandra braddock
recipient_name: reproductive freedom for all
address: 20087 EDGEWATER DRIVE
city: CANYON COUNTRY
classification: neutral
entity_type: Individual
first_name: SANDRA
id: e42e7230-02f0-4b28-ba39-7b68e796d510
last_name: BRADDOCK
state: CA
zip: 91351-0000
", - "Name: dana fortier
donor_id: 74b93106-3c9f-4f36-b52e-36143e97e7ce
recipient_id: 159692de-135a-45bd-8889-1ab1882ed54c
full_name: dana fortier
recipient_name: committee to elect vicki barnett to state senate
address: 23861 W LEBOST
city: NOVI
classification: neutral
entity_type: Individual
first_name: DANA
id: 74b93106-3c9f-4f36-b52e-36143e97e7ce
last_name: FORTIER
state: MI
zip: 48375-0000
", - "Name: committee to elect vicki barnett to state senate
classification: neutral
", - "Name: rachel geiersbach
donor_id: 40d2d39f-f21b-4130-8d7b-47ca810c9aa9
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: rachel geiersbach
recipient_name: reproductive freedom for all
address: 3412 OLD KAWKAWLIN RD
city: BAY CITY
classification: neutral
entity_type: Individual
first_name: RACHEL
id: 40d2d39f-f21b-4130-8d7b-47ca810c9aa9
last_name: GEIERSBACH
state: MI
zip: 48706-0000
", - "Name: matthew burgess
donor_id: de98dec5-b8d3-4701-a9dd-a254aca2c4cf
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: matthew burgess
recipient_name: reproductive freedom for all
address: 8823 SPECTRUM CENTER BLVD 2313
city: SAN DIEGO
classification: neutral
entity_type: Individual
first_name: MATTHEW
id: de98dec5-b8d3-4701-a9dd-a254aca2c4cf
last_name: BURGESS
state: CA
zip: 92123-0000
", - "Name: teresa robertson
donor_id: dcf2b3a5-ddf4-4027-8a75-4477893854ff
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: teresa robertson
recipient_name: reproductive freedom for all
address: 7101 RIVER GLEN DR SE
city: CALEDONIA
classification: neutral
entity_type: Individual
first_name: TERESA
id: dcf2b3a5-ddf4-4027-8a75-4477893854ff
last_name: ROBERTSON
state: MI
zip: 49316-8136
" - ], - "type": "scatter", - "x": [], - "y": [] - } - ], - "layout": { - "hovermode": "closest", - "margin": { - "b": 20, - "l": 5, - "r": 5, - "t": 40 - }, - "showlegend": true, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "font": { - "size": 16 - }, - "text": "Network Graph Indicating Campaign Contributions from 2018-2022" - }, - "xaxis": { - "showgrid": true, - "showticklabels": false, - "zeroline": true - }, - "yaxis": { - "showgrid": true, - "showticklabels": false, - "zeroline": true - } - } - }, - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph:\n", - " G = nx.MultiDiGraph()\n", - " \n", - " # Define columns for edge attributes\n", - " edge_columns = ['amount', 'donor_office', 'office_sought', 'party', 'purpose', 'transaction_id', 'transaction_type', 'year']\n", - " # Define columns for node attributes\n", - " node_columns = ['donor_id', 'recipient_id', 'full_name', 'recipient_name', 'address', 'city', 'classification', 'company', 'donor_type', 'entity_type', 'first_name', 'id', 'last_name', 'occupation', 'recipient_type', 'state', 'zip']\n", - " \n", - " for _, row in df.iterrows(): \n", - " # Add nodes\n", - " G.add_node(row['full_name'], **row[node_columns].dropna().to_dict())\n", - " G.add_node(row['recipient_name'], classification='neutral') # Adding recipient nodes with default classification\n", - "\n", - " # Add edges\n", - " edge_attributes = row[edge_columns].dropna().to_dict()\n", - " G.add_edge(row['full_name'], row['recipient_name'], **edge_attributes)\n", - " \n", - " return G\n", - "\n", - "def plot_network_graph(G: nx.MultiDiGraph):\n", - " edge_trace = go.Scatter(x=[], y=[], line=dict(color='#888'), hoverinfo='text', mode='lines')\n", - " hovertext = []\n", - "\n", - " for edge in G.edges(data=True):\n", - " source = edge[0]\n", - " target = edge[1]\n", - " hovertext.append(f\"Amount: {edge[2]['amount']:.2f}\")\n", - "\n", - " edge_trace['hovertext'] = hovertext\n", - "\n", - " node_trace = go.Scatter(x=[], y=[], text=[], mode='markers', hoverinfo='text', marker=dict(showscale=True, colorscale='YlGnBu', size=10))\n", - " node_trace['marker']['color'] = []\n", - "\n", - " for node in G.nodes():\n", - " node_info = f\"Name: {node}
\"\n", - " for key, value in G.nodes[node].items():\n", - " node_info += f\"{key}: {value}
\"\n", - " node_trace['text'] += tuple([node_info])\n", - " # Get the classification value for the node\n", - " classification = G.nodes[node].get('classification', 'neutral')\n", - " # Assign a color based on the classification value\n", - " if classification == 'c':\n", - " color = 'blue'\n", - " elif classification == 'f':\n", - " color = 'red'\n", - " else:\n", - " color = 'green' # Default color for unknown classification\n", - " node_trace['marker']['color'] += tuple([color])\n", - "\n", - " # Define layout settings\n", - " layout = go.Layout(\n", - " title='Network Graph Indicating Campaign Contributions from 2018-2022',\n", - " titlefont=dict(size=16),\n", - " showlegend=True,\n", - " hovermode='closest',\n", - " margin=dict(b=20, l=5, r=5, t=40),\n", - " xaxis=dict(showgrid=True, zeroline=True, showticklabels=False),\n", - " yaxis=dict(showgrid=True, zeroline=True, showticklabels=False)\n", - " )\n", - "\n", - " fig = go.Figure(data=[edge_trace, node_trace], layout=layout)\n", - "\n", - " # Log information about the figure\n", - "\n", - " fig.show()\n", - "\n", - "sample = grouped_sample.sample(50)\n", - "plot_network_graph(create_network_nodes(sample))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hoverinfo": "none", - "line": { - "color": "#888", - "width": 0.5 - }, - "mode": "lines", - "type": "scatter", - "x": [ - 0.4182243125490408, - 0.3740122792611037, - null, - 0.4182243125490408, - 0.37848025459696877, - null, - 0.4182243125490408, - 0.3821391536049519, - null, - 0.4182243125490408, - 0.31305791514229697, - null, - 0.4182243125490408, - 0.3246624829381992, - null, - 0.4182243125490408, - 0.33203393677870674, - null, - 0.4182243125490408, - 0.4404718698088387, - null, - 0.4182243125490408, - 0.3393815448042514, - null, - 0.4182243125490408, - 0.32444561774289593, - null, - 0.4182243125490408, - 0.33721825060791266, - null, - 0.4182243125490408, - 0.5201251204037126, - null, - 0.12286879065958844, - 0.23992481624351925, - null, - 0.12286879065958844, - 0.09276814106220677, - null, - 0.12286879065958844, - 0.07426685281627932, - null, - 0.12286879065958844, - 0.09471702229050472, - null, - 0.12286879065958844, - 0.06879886671193436, - null, - 0.12286879065958844, - 0.1823584228427031, - null, - 0.12286879065958844, - 0.19852054651169693, - null, - 0.12286879065958844, - 0.13747604708068628, - null, - 0.12286879065958844, - 0.22007362873840486, - null, - 0.12286879065958844, - 0.13940667248499528, - null, - 0.12286879065958844, - 0.0201693226965588, - null, - 0.12286879065958844, - 0.16862303760247477, - null, - 0.12286879065958844, - 0.12355952994556385, - null, - 0.12286879065958844, - 0.04781523934390508, - null, - 0.6730431696885844, - 0.6013564651959642, - null, - 0.6730431696885844, - 0.662108954544855, - null, - 0.6730431696885844, - 0.7007214129943925, - null, - 0.6730431696885844, - 0.7188906153197968, - null, - 0.6730431696885844, - 0.7255980413609877, - null, - 0.6730431696885844, - 0.6802728591951641, - null, - 0.6730431696885844, - 0.7518492361353024, - null, - 0.38165116541180344, - 0.32578353530864457, - null, - 0.38165116541180344, - 0.413948124857326, - null, - 0.38165116541180344, - 0.44119458804978295, - null, - 0.38165116541180344, - 0.3328704753356456, - null, - 0.38165116541180344, - 0.3499260998923053, - null, - 0.38165116541180344, - 0.37301066653863624, - null, - 0.38165116541180344, - 0.4277213938753692, - null, - 0.38165116541180344, - 0.3247821296168134, - null, - 0.38165116541180344, - 0.3187675293980876, - null, - 0.38165116541180344, - 0.34114125407236195, - null, - 0.6084965344664286, - 0.5531504465254558, - null, - 0.6084965344664286, - 0.587704695878027, - null, - 0.6084965344664286, - 0.5593951498649633, - null, - 0.6084965344664286, - 0.5845953849421676, - null, - 0.6084965344664286, - 0.6058132814274794, - null, - 0.6084965344664286, - 0.6322124026692795, - null, - 0.6084965344664286, - 0.5201251204037126, - null, - 0.18155558675901884, - 0.2742000416622462, - null, - 0.18155558675901884, - 0.15570283642495664, - null, - 0.18155558675901884, - 0.19921682827804632, - null, - 0.18155558675901884, - 0.2955343345493908, - null, - 0.18155558675901884, - 0.298647499376007, - null, - 0.18155558675901884, - 0.0914406510425998, - null, - 0.18155558675901884, - 0.0875467755337247, - null, - 0.18155558675901884, - 0.08997327822205015, - null, - 0.18155558675901884, - 0.25656414507004344, - null, - 0.18155558675901884, - 0.20133087739958255, - null, - 0.7722862313192606, - 0.7408684543182315, - null, - 0.7722862313192606, - 0.8385234321105272, - null, - 0.7722862313192606, - 0.7333209824474588, - null, - 0.5368181409256901, - 0.595945044435614, - null, - 0.5368181409256901, - 0.6327007577432437, - null, - 0.5368181409256901, - 0.526779936668903, - null, - 0.5368181409256901, - 0.5433115547736789, - null, - 0.5368181409256901, - 0.5274116361492907, - null, - 0.5368181409256901, - 0.555788147264811, - null, - 0.5368181409256901, - 0.5805679633404117, - null, - 0.5368181409256901, - 0.5989925957177575, - null, - 0.5368181409256901, - 0.48218022499136737, - null, - 0.5368181409256901, - 0.6058132814274794, - null, - 0.5368181409256901, - 0.47443124751760235, - null, - 0.5368181409256901, - 0.5291812256005789, - null, - 0.5368181409256901, - 0.5621062195646831, - null, - 0.5368181409256901, - 0.5465171974419871, - null, - 0.8304626469521129, - 0.8266354543284289, - null, - 0.8304626469521129, - 0.7247552078664479, - null, - 0.8304626469521129, - 0.7827775151390383, - null, - 0.8304626469521129, - 0.9082570345357789, - null, - 0.8304626469521129, - 0.916634041055854, - null, - 0.8304626469521129, - 0.8613129225222332, - null, - 0.8304626469521129, - 0.7703024251104211, - null, - 0.8304626469521129, - 0.9005048863870916, - null, - 0.8304626469521129, - 0.9240127894624793, - null, - 0.7924139234898422, - 0.800297854626628, - null, - 0.7924139234898422, - 0.7364515013041172, - null, - 0.7924139234898422, - 0.8589937476561325, - null, - 0.7924139234898422, - 0.8247840830312709, - null, - 0.7924139234898422, - 0.7948577020793985, - null, - 0.7924139234898422, - 0.7059759544943667, - null, - 0.7924139234898422, - 0.8846357375826375, - null, - 0.7924139234898422, - 0.8323549266756429, - null, - 0.8266354543284289, - 0.7247552078664479, - null, - 0.8266354543284289, - 0.7827775151390383, - null, - 0.8266354543284289, - 0.9082570345357789, - null, - 0.8266354543284289, - 0.7042334738295596, - null, - 0.8266354543284289, - 0.8613129225222332, - null, - 0.8266354543284289, - 0.7703024251104211, - null, - 0.8266354543284289, - 0.9240127894624793, - null, - 0.8266354543284289, - 0.8680862155815134, - null, - 0.4023039585223629, - 0.4611021425875542, - null, - 0.4023039585223629, - 0.44175944307536974, - null, - 0.4023039585223629, - 0.3318561006769827, - null, - 0.4023039585223629, - 0.4349682989231034, - null, - 0.4023039585223629, - 0.29978148854693865, - null, - 0.4023039585223629, - 0.4442228752887084, - null, - 0.5084198498293618, - 0.5436816885151938, - null, - 0.5084198498293618, - 0.5229468203255856, - null, - 0.5084198498293618, - 0.4611021425875542, - null, - 0.5084198498293618, - 0.44175944307536974, - null, - 0.5084198498293618, - 0.6234379896430121, - null, - 0.5084198498293618, - 0.4442228752887084, - null, - 0.23992481624351925, - 0.27440213390552737, - null, - 0.23992481624351925, - 0.2728250610713022, - null, - 0.23992481624351925, - 0.1823584228427031, - null, - 0.23992481624351925, - 0.19852054651169693, - null, - 0.23992481624351925, - 0.22007362873840486, - null, - 0.23992481624351925, - 0.13940667248499528, - null, - 0.23992481624351925, - 0.16862303760247477, - null, - 0.23992481624351925, - 0.12355952994556385, - null, - 0.2742000416622462, - 0.15570283642495664, - null, - 0.2742000416622462, - 0.32578353530864457, - null, - 0.2742000416622462, - 0.3740122792611037, - null, - 0.2742000416622462, - 0.2955343345493908, - null, - 0.2742000416622462, - 0.31305791514229697, - null, - 0.2742000416622462, - 0.298647499376007, - null, - 0.2742000416622462, - 0.3328704753356456, - null, - 0.2742000416622462, - 0.3499260998923053, - null, - 0.2742000416622462, - 0.3181124346701171, - null, - 0.2742000416622462, - 0.3247821296168134, - null, - 0.2742000416622462, - 0.25656414507004344, - null, - 0.2742000416622462, - 0.3187675293980876, - null, - 0.2742000416622462, - 0.20133087739958255, - null, - 0.2742000416622462, - 0.34114125407236195, - null, - 0.15570283642495664, - 0.07513674080757637, - null, - 0.15570283642495664, - 0.05512117222879742, - null, - 0.15570283642495664, - 0.05194805532761382, - null, - 0.15570283642495664, - 0.06202421257916635, - null, - 0.15570283642495664, - 0.09053866681881584, - null, - 0.15570283642495664, - 0.1573630170264504, - null, - 0.15570283642495664, - 0.0852382135963593, - null, - 0.15570283642495664, - 0.0875467755337247, - null, - 0.15570283642495664, - 0.08997327822205015, - null, - 0.15570283642495664, - 0.20133087739958255, - null, - 0.15570283642495664, - 0.038579501382332126, - null, - 0.07513674080757637, - 0.1130639188502468, - null, - 0.07513674080757637, - 0.05512117222879742, - null, - 0.07513674080757637, - 0.07163295816605642, - null, - 0.07513674080757637, - 0.06202421257916635, - null, - 0.07513674080757637, - 0.09053866681881584, - null, - 0.07513674080757637, - 0.1573630170264504, - null, - 0.07513674080757637, - 0.0023771443647881974, - null, - 0.07513674080757637, - 0.0852382135963593, - null, - 0.07513674080757637, - 0.17086936775877049, - null, - 0.07513674080757637, - 0.0875467755337247, - null, - 0.07513674080757637, - 0.08997327822205015, - null, - 0.07513674080757637, - 0.020212382594376965, - null, - 0.07513674080757637, - 0.0897773631019545, - null, - 0.07513674080757637, - 0.038579501382332126, - null, - 0.7247552078664479, - 0.6327007577432437, - null, - 0.7247552078664479, - 0.662108954544855, - null, - 0.7247552078664479, - 0.7827775151390383, - null, - 0.7247552078664479, - 0.7007214129943925, - null, - 0.7247552078664479, - 0.7188906153197968, - null, - 0.7247552078664479, - 0.7042334738295596, - null, - 0.7247552078664479, - 0.7255980413609877, - null, - 0.7247552078664479, - 0.7703024251104211, - null, - 0.2586357176925591, - 0.3019474379086241, - null, - 0.2586357176925591, - 0.2121217358781844, - null, - 0.595945044435614, - 0.6327007577432437, - null, - 0.595945044435614, - 0.526779936668903, - null, - 0.595945044435614, - 0.662108954544855, - null, - 0.595945044435614, - 0.5433115547736789, - null, - 0.595945044435614, - 0.5274116361492907, - null, - 0.595945044435614, - 0.7042334738295596, - null, - 0.595945044435614, - 0.555788147264811, - null, - 0.595945044435614, - 0.5805679633404117, - null, - 0.595945044435614, - 0.5989925957177575, - null, - 0.595945044435614, - 0.6058132814274794, - null, - 0.595945044435614, - 0.5291812256005789, - null, - 0.595945044435614, - 0.5621062195646831, - null, - 0.9428542201780316, - 0.8511753697833563, - null, - 0.9428542201780316, - 0.89080246263295, - null, - 0.9428542201780316, - 0.9521646983336837, - null, - 0.9428542201780316, - 0.9663892923019699, - null, - 0.9428542201780316, - 0.9425745666137786, - null, - 0.9428542201780316, - 0.9851894520572745, - null, - 0.9428542201780316, - 0.9573079778783831, - null, - 0.9428542201780316, - 0.9473667691929577, - null, - 0.9428542201780316, - 0.838803404513024, - null, - 0.03304679952258993, - 0.05596958524873419, - null, - 0.03304679952258993, - 0.014269300880037306, - null, - 0.6013564651959642, - 0.662108954544855, - null, - 0.6013564651959642, - 0.7007214129943925, - null, - 0.6013564651959642, - 0.7188906153197968, - null, - 0.6013564651959642, - 0.555788147264811, - null, - 0.6013564651959642, - 0.5293212253918783, - null, - 0.6013564651959642, - 0.5291812256005789, - null, - 0.6013564651959642, - 0.5191285820034173, - null, - 0.6013564651959642, - 0.5465171974419871, - null, - 0.1130639188502468, - 0.07163295816605642, - null, - 0.1130639188502468, - 0.09053866681881584, - null, - 0.1130639188502468, - 0.1573630170264504, - null, - 0.1130639188502468, - 0.13747604708068628, - null, - 0.1130639188502468, - 0.2275256207367028, - null, - 0.1130639188502468, - 0.18507593174525072, - null, - 0.1130639188502468, - 0.17086936775877049, - null, - 0.1130639188502468, - 0.0897773631019545, - null, - 0.5531504465254558, - 0.47055154706870017, - null, - 0.5531504465254558, - 0.5274116361492907, - null, - 0.5531504465254558, - 0.587704695878027, - null, - 0.5531504465254558, - 0.5989925957177575, - null, - 0.5531504465254558, - 0.5845953849421676, - null, - 0.5531504465254558, - 0.6058132814274794, - null, - 0.5531504465254558, - 0.4564806171162211, - null, - 0.5531504465254558, - 0.5201251204037126, - null, - 0.1635981270944994, - 0.19921682827804632, - null, - 0.1635981270944994, - 0.10310287300704979, - null, - 0.1635981270944994, - 0.05973078995013337, - null, - 0.1635981270944994, - 0.0914406510425998, - null, - 0.1635981270944994, - 0.14711158829428328, - null, - 0.1635981270944994, - 0.21535391032155426, - null, - 0.05512117222879742, - 0.07163295816605642, - null, - 0.05512117222879742, - 0.05194805532761382, - null, - 0.05512117222879742, - 0.06202421257916635, - null, - 0.05512117222879742, - 0.09053866681881584, - null, - 0.05512117222879742, - 0.0023771443647881974, - null, - 0.05512117222879742, - 0.0852382135963593, - null, - 0.05512117222879742, - 0.0875467755337247, - null, - 0.05512117222879742, - 0.08997327822205015, - null, - 0.05512117222879742, - 0.020212382594376965, - null, - 0.05512117222879742, - 0.02312833765025224, - null, - 0.05512117222879742, - 0.04237200971819888, - null, - 0.05512117222879742, - 0.038579501382332126, - null, - 0.05512117222879742, - 0.01777064460825195, - null, - 0.32578353530864457, - 0.413948124857326, - null, - 0.32578353530864457, - 0.3328704753356456, - null, - 0.32578353530864457, - 0.3499260998923053, - null, - 0.32578353530864457, - 0.37301066653863624, - null, - 0.32578353530864457, - 0.2619562675328274, - null, - 0.32578353530864457, - 0.4277213938753692, - null, - 0.32578353530864457, - 0.3247821296168134, - null, - 0.32578353530864457, - 0.3187675293980876, - null, - 0.32578353530864457, - 0.34114125407236195, - null, - 0.27440213390552737, - 0.2728250610713022, - null, - 0.27440213390552737, - 0.1823584228427031, - null, - 0.27440213390552737, - 0.19852054651169693, - null, - 0.27440213390552737, - 0.22007362873840486, - null, - 0.27440213390552737, - 0.37301066653863624, - null, - 0.27440213390552737, - 0.2275256207367028, - null, - 0.27440213390552737, - 0.2619562675328274, - null, - 0.27440213390552737, - 0.3414075728554137, - null, - 0.2728250610713022, - 0.1823584228427031, - null, - 0.2728250610713022, - 0.37549158943196925, - null, - 0.2728250610713022, - 0.22007362873840486, - null, - 0.2728250610713022, - 0.16862303760247477, - null, - 0.6346565064837861, - 0.7364515013041172, - null, - 0.6346565064837861, - 0.5436816885151938, - null, - 0.6346565064837861, - 0.5461279353327784, - null, - 0.6346565064837861, - 0.7059759544943667, - null, - 0.6346565064837861, - 0.6149491168624189, - null, - 0.6346565064837861, - 0.5593069337955722, - null, - 0.6327007577432437, - 0.662108954544855, - null, - 0.6327007577432437, - 0.5433115547736789, - null, - 0.6327007577432437, - 0.5274116361492907, - null, - 0.6327007577432437, - 0.7042334738295596, - null, - 0.6327007577432437, - 0.555788147264811, - null, - 0.6327007577432437, - 0.5805679633404117, - null, - 0.6327007577432437, - 0.5989925957177575, - null, - 0.6327007577432437, - 0.5845953849421676, - null, - 0.6327007577432437, - 0.6058132814274794, - null, - 0.6327007577432437, - 0.5621062195646831, - null, - 0.800297854626628, - 0.7364515013041172, - null, - 0.800297854626628, - 0.6953901849658966, - null, - 0.800297854626628, - 0.8589937476561325, - null, - 0.800297854626628, - 0.7204214783753378, - null, - 0.800297854626628, - 0.8247840830312709, - null, - 0.800297854626628, - 0.7948577020793985, - null, - 0.800297854626628, - 0.7059759544943667, - null, - 0.800297854626628, - 0.8846357375826375, - null, - 0.800297854626628, - 0.8323549266756429, - null, - 0.800297854626628, - 0.8505181106970376, - null, - 0.800297854626628, - 0.7607451357487841, - null, - 0.800297854626628, - 0.9110645875753355, - null, - 0.526779936668903, - 0.5433115547736789, - null, - 0.526779936668903, - 0.5274116361492907, - null, - 0.526779936668903, - 0.555788147264811, - null, - 0.526779936668903, - 0.5805679633404117, - null, - 0.526779936668903, - 0.48218022499136737, - null, - 0.526779936668903, - 0.5293212253918783, - null, - 0.526779936668903, - 0.47443124751760235, - null, - 0.526779936668903, - 0.5291812256005789, - null, - 0.526779936668903, - 0.5621062195646831, - null, - 0.526779936668903, - 0.5465171974419871, - null, - 0.413948124857326, - 0.44119458804978295, - null, - 0.413948124857326, - 0.3328704753356456, - null, - 0.413948124857326, - 0.3499260998923053, - null, - 0.413948124857326, - 0.47055154706870017, - null, - 0.413948124857326, - 0.5274116361492907, - null, - 0.413948124857326, - 0.4277213938753692, - null, - 0.413948124857326, - 0.3247821296168134, - null, - 0.413948124857326, - 0.4564806171162211, - null, - 0.413948124857326, - 0.3187675293980876, - null, - 0.413948124857326, - 0.34114125407236195, - null, - 0.09276814106220677, - 0.03187584930858911, - null, - 0.09276814106220677, - 0.07426685281627932, - null, - 0.09276814106220677, - 0.03446402354654854, - null, - 0.09276814106220677, - 0.06879886671193436, - null, - 0.09276814106220677, - 0.1823584228427031, - null, - 0.09276814106220677, - 0.13940667248499528, - null, - 0.09276814106220677, - 0.0201693226965588, - null, - 0.09276814106220677, - 0.16862303760247477, - null, - 0.09276814106220677, - 0.12355952994556385, - null, - 0.662108954544855, - 0.7827775151390383, - null, - 0.662108954544855, - 0.7007214129943925, - null, - 0.662108954544855, - 0.7188906153197968, - null, - 0.662108954544855, - 0.7042334738295596, - null, - 0.662108954544855, - 0.555788147264811, - null, - 0.662108954544855, - 0.5805679633404117, - null, - 0.662108954544855, - 0.7255980413609877, - null, - 0.662108954544855, - 0.7518492361353024, - null, - 0.07163295816605642, - 0.06202421257916635, - null, - 0.07163295816605642, - 0.09053866681881584, - null, - 0.07163295816605642, - 0.1573630170264504, - null, - 0.07163295816605642, - 0.0023771443647881974, - null, - 0.07163295816605642, - 0.0852382135963593, - null, - 0.07163295816605642, - 0.17086936775877049, - null, - 0.07163295816605642, - 0.0875467755337247, - null, - 0.07163295816605642, - 0.08997327822205015, - null, - 0.07163295816605642, - 0.020212382594376965, - null, - 0.07163295816605642, - 0.0897773631019545, - null, - 0.07163295816605642, - 0.038579501382332126, - null, - 0.44119458804978295, - 0.3740122792611037, - null, - 0.44119458804978295, - 0.3328704753356456, - null, - 0.44119458804978295, - 0.3499260998923053, - null, - 0.44119458804978295, - 0.47055154706870017, - null, - 0.44119458804978295, - 0.5274116361492907, - null, - 0.44119458804978295, - 0.4277213938753692, - null, - 0.44119458804978295, - 0.4564806171162211, - null, - 0.44119458804978295, - 0.34114125407236195, - null, - 0.7364515013041172, - 0.8247840830312709, - null, - 0.7364515013041172, - 0.7948577020793985, - null, - 0.7364515013041172, - 0.7059759544943667, - null, - 0.7364515013041172, - 0.8323549266756429, - null, - 0.7827775151390383, - 0.7007214129943925, - null, - 0.7827775151390383, - 0.7188906153197968, - null, - 0.7827775151390383, - 0.7042334738295596, - null, - 0.7827775151390383, - 0.8613129225222332, - null, - 0.7827775151390383, - 0.7255980413609877, - null, - 0.7827775151390383, - 0.7703024251104211, - null, - 0.7827775151390383, - 0.9005048863870916, - null, - 0.7827775151390383, - 0.7518492361353024, - null, - 0.9600359726880752, - 0.9998698320754983, - null, - 0.9600359726880752, - 0.9082570345357789, - null, - 0.9600359726880752, - 0.9503884723051484, - null, - 0.9600359726880752, - 0.916634041055854, - null, - 0.9600359726880752, - 0.8613129225222332, - null, - 0.9600359726880752, - 0.9005048863870916, - null, - 0.9600359726880752, - 0.9240127894624793, - null, - 0.9600359726880752, - 0.9636590456207981, - null, - 0.8511753697833563, - 0.89080246263295, - null, - 0.8511753697833563, - 0.9521646983336837, - null, - 0.8511753697833563, - 0.9663892923019699, - null, - 0.8511753697833563, - 0.9573079778783831, - null, - 0.8511753697833563, - 0.9473667691929577, - null, - 0.8511753697833563, - 0.838803404513024, - null, - 0.8511753697833563, - 0.7518492361353024, - null, - 0.05194805532761382, - 0.06202421257916635, - null, - 0.05194805532761382, - 0.0852382135963593, - null, - 0.05194805532761382, - 0.0914406510425998, - null, - 0.05194805532761382, - 0.0875467755337247, - null, - 0.05194805532761382, - 0.08997327822205015, - null, - 0.05194805532761382, - 0.020212382594376965, - null, - 0.05194805532761382, - 0.02312833765025224, - null, - 0.05194805532761382, - 0.04237200971819888, - null, - 0.05194805532761382, - 0.038579501382332126, - null, - 0.05194805532761382, - 0.01777064460825195, - null, - 0.03187584930858911, - 0.07426685281627932, - null, - 0.03187584930858911, - 0.03446402354654854, - null, - 0.03187584930858911, - 0.06879886671193436, - null, - 0.03187584930858911, - 0.13940667248499528, - null, - 0.03187584930858911, - 0.0201693226965588, - null, - 0.03187584930858911, - 0.12355952994556385, - null, - 0.07426685281627932, - 0.09471702229050472, - null, - 0.07426685281627932, - 0.06879886671193436, - null, - 0.07426685281627932, - 0.1823584228427031, - null, - 0.07426685281627932, - 0.13940667248499528, - null, - 0.07426685281627932, - 0.0201693226965588, - null, - 0.07426685281627932, - 0.16862303760247477, - null, - 0.07426685281627932, - 0.12355952994556385, - null, - 0.07426685281627932, - 0.04781523934390508, - null, - 0.5257999712304688, - 0.5593951498649633, - null, - 0.5257999712304688, - 0.4404718698088387, - null, - 0.5257999712304688, - 0.5201251204037126, - null, - 0.9998698320754983, - 0.9082570345357789, - null, - 0.9998698320754983, - 0.9636084967560627, - null, - 0.9998698320754983, - 0.9503884723051484, - null, - 0.9998698320754983, - 0.9240127894624793, - null, - 0.9998698320754983, - 0.9636590456207981, - null, - 0.09471702229050472, - 0.06879886671193436, - null, - 0.09471702229050472, - 0.1823584228427031, - null, - 0.09471702229050472, - 0.19852054651169693, - null, - 0.09471702229050472, - 0.13747604708068628, - null, - 0.09471702229050472, - 0.13940667248499528, - null, - 0.09471702229050472, - 0.0201693226965588, - null, - 0.09471702229050472, - 0.12355952994556385, - null, - 0.09471702229050472, - 0.0897773631019545, - null, - 0.09471702229050472, - 0.04781523934390508, - null, - 0.6953901849658966, - 0.7204214783753378, - null, - 0.6953901849658966, - 0.7181048560087516, - null, - 0.6953901849658966, - 0.7948577020793985, - null, - 0.6953901849658966, - 0.7059759544943667, - null, - 0.6953901849658966, - 0.6370268640561303, - null, - 0.6953901849658966, - 0.6149491168624189, - null, - 0.6953901849658966, - 0.7607451357487841, - null, - 0.6953901849658966, - 0.6234379896430121, - null, - 0.03446402354654854, - 0.05596958524873419, - null, - 0.03446402354654854, - 0.014269300880037306, - null, - 0.9082570345357789, - 0.9503884723051484, - null, - 0.9082570345357789, - 0.916634041055854, - null, - 0.9082570345357789, - 0.8613129225222332, - null, - 0.9082570345357789, - 0.9005048863870916, - null, - 0.9082570345357789, - 0.9240127894624793, - null, - 0.9082570345357789, - 0.9636590456207981, - null, - 0.3740122792611037, - 0.37848025459696877, - null, - 0.3740122792611037, - 0.3821391536049519, - null, - 0.3740122792611037, - 0.2955343345493908, - null, - 0.3740122792611037, - 0.31305791514229697, - null, - 0.3740122792611037, - 0.298647499376007, - null, - 0.3740122792611037, - 0.3246624829381992, - null, - 0.3740122792611037, - 0.3328704753356456, - null, - 0.3740122792611037, - 0.33203393677870674, - null, - 0.3740122792611037, - 0.3499260998923053, - null, - 0.3740122792611037, - 0.3181124346701171, - null, - 0.3740122792611037, - 0.47055154706870017, - null, - 0.3740122792611037, - 0.4277213938753692, - null, - 0.3740122792611037, - 0.25656414507004344, - null, - 0.3740122792611037, - 0.4564806171162211, - null, - 0.977854801698089, - 0.9162463356603696, - null, - 0.5436816885151938, - 0.5461279353327784, - null, - 0.5436816885151938, - 0.5229468203255856, - null, - 0.5436816885151938, - 0.4611021425875542, - null, - 0.5436816885151938, - 0.6149491168624189, - null, - 0.5436816885151938, - 0.4349682989231034, - null, - 0.5436816885151938, - 0.6234379896430121, - null, - 0.5436816885151938, - 0.4442228752887084, - null, - 0.5436816885151938, - 0.5593069337955722, - null, - 0.06202421257916635, - 0.09053866681881584, - null, - 0.06202421257916635, - 0.1573630170264504, - null, - 0.06202421257916635, - 0.0023771443647881974, - null, - 0.06202421257916635, - 0.0852382135963593, - null, - 0.06202421257916635, - 0.0875467755337247, - null, - 0.06202421257916635, - 0.08997327822205015, - null, - 0.06202421257916635, - 0.020212382594376965, - null, - 0.06202421257916635, - 0.02312833765025224, - null, - 0.06202421257916635, - 0.04237200971819888, - null, - 0.06202421257916635, - 0.038579501382332126, - null, - 0.06202421257916635, - 0.01777064460825195, - null, - 0.8589937476561325, - 0.8247840830312709, - null, - 0.8589937476561325, - 0.7948577020793985, - null, - 0.8589937476561325, - 0.9210876029743161, - null, - 0.8589937476561325, - 0.9694266665187994, - null, - 0.8589937476561325, - 0.8846357375826375, - null, - 0.8589937476561325, - 0.8323549266756429, - null, - 0.8589937476561325, - 0.8505181106970376, - null, - 0.8589937476561325, - 0.9110645875753355, - null, - 0.06879886671193436, - 0.1823584228427031, - null, - 0.06879886671193436, - 0.13940667248499528, - null, - 0.06879886671193436, - 0.0201693226965588, - null, - 0.06879886671193436, - 0.12355952994556385, - null, - 0.06879886671193436, - 0.04781523934390508, - null, - 0.19921682827804632, - 0.10310287300704979, - null, - 0.19921682827804632, - 0.0914406510425998, - null, - 0.19921682827804632, - 0.14711158829428328, - null, - 0.19921682827804632, - 0.21535391032155426, - null, - 0.19921682827804632, - 0.25656414507004344, - null, - 0.1823584228427031, - 0.19852054651169693, - null, - 0.1823584228427031, - 0.22007362873840486, - null, - 0.1823584228427031, - 0.13940667248499528, - null, - 0.1823584228427031, - 0.16862303760247477, - null, - 0.1823584228427031, - 0.12355952994556385, - null, - 0.37549158943196925, - 0.41808707877840445, - null, - 0.37549158943196925, - 0.42926818011737133, - null, - 0.37549158943196925, - 0.4363707938884992, - null, - 0.37549158943196925, - 0.42077304608666055, - null, - 0.5433115547736789, - 0.5274116361492907, - null, - 0.5433115547736789, - 0.555788147264811, - null, - 0.5433115547736789, - 0.5805679633404117, - null, - 0.5433115547736789, - 0.5989925957177575, - null, - 0.5433115547736789, - 0.48218022499136737, - null, - 0.5433115547736789, - 0.47443124751760235, - null, - 0.5433115547736789, - 0.5291812256005789, - null, - 0.5433115547736789, - 0.5621062195646831, - null, - 0.5433115547736789, - 0.5465171974419871, - null, - 0.37848025459696877, - 0.3821391536049519, - null, - 0.37848025459696877, - 0.31305791514229697, - null, - 0.37848025459696877, - 0.3246624829381992, - null, - 0.37848025459696877, - 0.33203393677870674, - null, - 0.37848025459696877, - 0.4404718698088387, - null, - 0.37848025459696877, - 0.3393815448042514, - null, - 0.37848025459696877, - 0.32444561774289593, - null, - 0.37848025459696877, - 0.33721825060791266, - null, - 0.3821391536049519, - 0.2955343345493908, - null, - 0.3821391536049519, - 0.31305791514229697, - null, - 0.3821391536049519, - 0.298647499376007, - null, - 0.3821391536049519, - 0.3246624829381992, - null, - 0.3821391536049519, - 0.33203393677870674, - null, - 0.3821391536049519, - 0.3499260998923053, - null, - 0.3821391536049519, - 0.3181124346701171, - null, - 0.3821391536049519, - 0.47055154706870017, - null, - 0.3821391536049519, - 0.4404718698088387, - null, - 0.3821391536049519, - 0.3393815448042514, - null, - 0.3821391536049519, - 0.32444561774289593, - null, - 0.3821391536049519, - 0.4564806171162211, - null, - 0.3821391536049519, - 0.33721825060791266, - null, - 0.7204214783753378, - 0.7181048560087516, - null, - 0.7204214783753378, - 0.7948577020793985, - null, - 0.7204214783753378, - 0.7059759544943667, - null, - 0.7204214783753378, - 0.6370268640561303, - null, - 0.7204214783753378, - 0.7607451357487841, - null, - 0.7204214783753378, - 0.6234379896430121, - null, - 0.2955343345493908, - 0.31305791514229697, - null, - 0.2955343345493908, - 0.298647499376007, - null, - 0.2955343345493908, - 0.3246624829381992, - null, - 0.2955343345493908, - 0.3328704753356456, - null, - 0.2955343345493908, - 0.33203393677870674, - null, - 0.2955343345493908, - 0.3499260998923053, - null, - 0.2955343345493908, - 0.3181124346701171, - null, - 0.2955343345493908, - 0.25656414507004344, - null, - 0.2955343345493908, - 0.32444561774289593, - null, - 0.09053866681881584, - 0.1573630170264504, - null, - 0.09053866681881584, - 0.0023771443647881974, - null, - 0.09053866681881584, - 0.0852382135963593, - null, - 0.09053866681881584, - 0.17086936775877049, - null, - 0.09053866681881584, - 0.0875467755337247, - null, - 0.09053866681881584, - 0.08997327822205015, - null, - 0.09053866681881584, - 0.020212382594376965, - null, - 0.09053866681881584, - 0.0897773631019545, - null, - 0.09053866681881584, - 0.02312833765025224, - null, - 0.09053866681881584, - 0.20133087739958255, - null, - 0.09053866681881584, - 0.038579501382332126, - null, - 0.09053866681881584, - 0.01777064460825195, - null, - 0.7181048560087516, - 0.6776948411821848, - null, - 0.7181048560087516, - 0.834199864808296, - null, - 0.7181048560087516, - 0.6370268640561303, - null, - 0.7181048560087516, - 0.6802728591951641, - null, - 0.7181048560087516, - 0.7607451357487841, - null, - 0.7181048560087516, - 0.6314926226168458, - null, - 0.10310287300704979, - 0.05973078995013337, - null, - 0.10310287300704979, - 0.0914406510425998, - null, - 0.10310287300704979, - 0.14711158829428328, - null, - 0.10310287300704979, - 0.21535391032155426, - null, - 0.10310287300704979, - 0.04237200971819888, - null, - 0.8247840830312709, - 0.7948577020793985, - null, - 0.8247840830312709, - 0.9210876029743161, - null, - 0.8247840830312709, - 0.7059759544943667, - null, - 0.8247840830312709, - 0.9186278106648778, - null, - 0.8247840830312709, - 0.8846357375826375, - null, - 0.8247840830312709, - 0.8323549266756429, - null, - 0.8247840830312709, - 0.8505181106970376, - null, - 0.8247840830312709, - 0.9110645875753355, - null, - 0.1573630170264504, - 0.2275256207367028, - null, - 0.1573630170264504, - 0.0852382135963593, - null, - 0.1573630170264504, - 0.18507593174525072, - null, - 0.1573630170264504, - 0.17086936775877049, - null, - 0.1573630170264504, - 0.0875467755337247, - null, - 0.1573630170264504, - 0.08997327822205015, - null, - 0.1573630170264504, - 0.0897773631019545, - null, - 0.1573630170264504, - 0.20133087739958255, - null, - 0.31305791514229697, - 0.298647499376007, - null, - 0.31305791514229697, - 0.3246624829381992, - null, - 0.31305791514229697, - 0.33203393677870674, - null, - 0.31305791514229697, - 0.3499260998923053, - null, - 0.31305791514229697, - 0.3181124346701171, - null, - 0.31305791514229697, - 0.3393815448042514, - null, - 0.31305791514229697, - 0.21535391032155426, - null, - 0.31305791514229697, - 0.25656414507004344, - null, - 0.31305791514229697, - 0.32444561774289593, - null, - 0.31305791514229697, - 0.33721825060791266, - null, - 0.298647499376007, - 0.3328704753356456, - null, - 0.298647499376007, - 0.33203393677870674, - null, - 0.298647499376007, - 0.3499260998923053, - null, - 0.298647499376007, - 0.3181124346701171, - null, - 0.298647499376007, - 0.3247821296168134, - null, - 0.298647499376007, - 0.25656414507004344, - null, - 0.298647499376007, - 0.3187675293980876, - null, - 0.298647499376007, - 0.20133087739958255, - null, - 0.298647499376007, - 0.34114125407236195, - null, - 0.3246624829381992, - 0.33203393677870674, - null, - 0.3246624829381992, - 0.4404718698088387, - null, - 0.3246624829381992, - 0.3393815448042514, - null, - 0.3246624829381992, - 0.21535391032155426, - null, - 0.3246624829381992, - 0.25656414507004344, - null, - 0.3246624829381992, - 0.32444561774289593, - null, - 0.3246624829381992, - 0.33721825060791266, - null, - 0.19852054651169693, - 0.13747604708068628, - null, - 0.19852054651169693, - 0.22007362873840486, - null, - 0.19852054651169693, - 0.2275256207367028, - null, - 0.19852054651169693, - 0.2619562675328274, - null, - 0.19852054651169693, - 0.18507593174525072, - null, - 0.3328704753356456, - 0.3499260998923053, - null, - 0.3328704753356456, - 0.3181124346701171, - null, - 0.3328704753356456, - 0.4277213938753692, - null, - 0.3328704753356456, - 0.3247821296168134, - null, - 0.3328704753356456, - 0.3187675293980876, - null, - 0.3328704753356456, - 0.34114125407236195, - null, - 0.33203393677870674, - 0.3181124346701171, - null, - 0.33203393677870674, - 0.4404718698088387, - null, - 0.33203393677870674, - 0.3393815448042514, - null, - 0.33203393677870674, - 0.21535391032155426, - null, - 0.33203393677870674, - 0.25656414507004344, - null, - 0.33203393677870674, - 0.32444561774289593, - null, - 0.33203393677870674, - 0.33721825060791266, - null, - 0.5461279353327784, - 0.5229468203255856, - null, - 0.5461279353327784, - 0.4611021425875542, - null, - 0.5461279353327784, - 0.6149491168624189, - null, - 0.5461279353327784, - 0.4349682989231034, - null, - 0.5461279353327784, - 0.5593069337955722, - null, - 0.9636084967560627, - 0.9503884723051484, - null, - 0.9636084967560627, - 0.9162463356603696, - null, - 0.9636084967560627, - 0.8541827253649632, - null, - 0.9636084967560627, - 0.9636590456207981, - null, - 0.9636084967560627, - 0.8680862155815134, - null, - 0.9636084967560627, - 0.8668565351624634, - null, - 0.9503884723051484, - 0.9240127894624793, - null, - 0.9503884723051484, - 0.9636590456207981, - null, - 0.9503884723051484, - 0.8680862155815134, - null, - 0.13747604708068628, - 0.22007362873840486, - null, - 0.13747604708068628, - 0.2275256207367028, - null, - 0.13747604708068628, - 0.18507593174525072, - null, - 0.13747604708068628, - 0.17086936775877049, - null, - 0.13747604708068628, - 0.0897773631019545, - null, - 0.13747604708068628, - 0.04781523934390508, - null, - 0.3499260998923053, - 0.3181124346701171, - null, - 0.3499260998923053, - 0.4277213938753692, - null, - 0.3499260998923053, - 0.3247821296168134, - null, - 0.3499260998923053, - 0.4564806171162211, - null, - 0.3499260998923053, - 0.3187675293980876, - null, - 0.3499260998923053, - 0.34114125407236195, - null, - 0.3181124346701171, - 0.3247821296168134, - null, - 0.3181124346701171, - 0.25656414507004344, - null, - 0.3181124346701171, - 0.3187675293980876, - null, - 0.89080246263295, - 0.9521646983336837, - null, - 0.89080246263295, - 0.834199864808296, - null, - 0.89080246263295, - 0.9663892923019699, - null, - 0.89080246263295, - 0.9425745666137786, - null, - 0.89080246263295, - 0.9851894520572745, - null, - 0.89080246263295, - 0.9573079778783831, - null, - 0.89080246263295, - 0.9473667691929577, - null, - 0.89080246263295, - 0.838803404513024, - null, - 0.9521646983336837, - 0.916634041055854, - null, - 0.9521646983336837, - 0.9663892923019699, - null, - 0.9521646983336837, - 0.9573079778783831, - null, - 0.9521646983336837, - 0.9473667691929577, - null, - 0.9521646983336837, - 0.9005048863870916, - null, - 0.6776948411821848, - 0.6802728591951641, - null, - 0.6776948411821848, - 0.6314926226168458, - null, - 0.0023771443647881974, - 0.0852382135963593, - null, - 0.0023771443647881974, - 0.0875467755337247, - null, - 0.0023771443647881974, - 0.020212382594376965, - null, - 0.0023771443647881974, - 0.0897773631019545, - null, - 0.0023771443647881974, - 0.038579501382332126, - null, - 0.7007214129943925, - 0.7188906153197968, - null, - 0.7007214129943925, - 0.7255980413609877, - null, - 0.7007214129943925, - 0.7518492361353024, - null, - 0.7188906153197968, - 0.7255980413609877, - null, - 0.7188906153197968, - 0.7518492361353024, - null, - 0.47055154706870017, - 0.5274116361492907, - null, - 0.47055154706870017, - 0.4277213938753692, - null, - 0.47055154706870017, - 0.5845953849421676, - null, - 0.47055154706870017, - 0.4564806171162211, - null, - 0.47055154706870017, - 0.5201251204037126, - null, - 0.19043749918150743, - 0.2121217358781844, - null, - 0.19043749918150743, - 0.29978148854693865, - null, - 0.5274116361492907, - 0.555788147264811, - null, - 0.5274116361492907, - 0.5805679633404117, - null, - 0.5274116361492907, - 0.5989925957177575, - null, - 0.5274116361492907, - 0.4277213938753692, - null, - 0.5274116361492907, - 0.5845953849421676, - null, - 0.5274116361492907, - 0.6058132814274794, - null, - 0.5274116361492907, - 0.5291812256005789, - null, - 0.5274116361492907, - 0.5621062195646831, - null, - 0.5274116361492907, - 0.4564806171162211, - null, - 0.9162463356603696, - 0.8385234321105272, - null, - 0.9162463356603696, - 0.8668565351624634, - null, - 0.7042334738295596, - 0.5989925957177575, - null, - 0.7042334738295596, - 0.7255980413609877, - null, - 0.7042334738295596, - 0.6058132814274794, - null, - 0.7042334738295596, - 0.7703024251104211, - null, - 0.555788147264811, - 0.5805679633404117, - null, - 0.555788147264811, - 0.5989925957177575, - null, - 0.555788147264811, - 0.48218022499136737, - null, - 0.555788147264811, - 0.5293212253918783, - null, - 0.555788147264811, - 0.47443124751760235, - null, - 0.555788147264811, - 0.5291812256005789, - null, - 0.555788147264811, - 0.5621062195646831, - null, - 0.555788147264811, - 0.5465171974419871, - null, - 0.5805679633404117, - 0.5989925957177575, - null, - 0.5805679633404117, - 0.5845953849421676, - null, - 0.5805679633404117, - 0.6058132814274794, - null, - 0.5805679633404117, - 0.5291812256005789, - null, - 0.5805679633404117, - 0.5621062195646831, - null, - 0.587704695878027, - 0.5593951498649633, - null, - 0.587704695878027, - 0.5845953849421676, - null, - 0.587704695878027, - 0.6058132814274794, - null, - 0.587704695878027, - 0.6322124026692795, - null, - 0.587704695878027, - 0.5201251204037126, - null, - 0.916634041055854, - 0.8613129225222332, - null, - 0.916634041055854, - 0.9005048863870916, - null, - 0.916634041055854, - 0.9240127894624793, - null, - 0.7948577020793985, - 0.7059759544943667, - null, - 0.7948577020793985, - 0.8846357375826375, - null, - 0.7948577020793985, - 0.8323549266756429, - null, - 0.7948577020793985, - 0.8505181106970376, - null, - 0.7948577020793985, - 0.7607451357487841, - null, - 0.7948577020793985, - 0.9110645875753355, - null, - 0.9210876029743161, - 0.9694266665187994, - null, - 0.9210876029743161, - 0.9186278106648778, - null, - 0.9210876029743161, - 0.8846357375826375, - null, - 0.9210876029743161, - 0.8323549266756429, - null, - 0.9210876029743161, - 0.9110645875753355, - null, - 0.9210876029743161, - 0.992283435751248, - null, - 0.834199864808296, - 0.9425745666137786, - null, - 0.834199864808296, - 0.8505181106970376, - null, - 0.834199864808296, - 0.7607451357487841, - null, - 0.5989925957177575, - 0.5845953849421676, - null, - 0.5989925957177575, - 0.6058132814274794, - null, - 0.5989925957177575, - 0.5621062195646831, - null, - 0.05973078995013337, - 0.0914406510425998, - null, - 0.05973078995013337, - 0.14711158829428328, - null, - 0.05973078995013337, - 0.04237200971819888, - null, - 0.5593951498649633, - 0.4404718698088387, - null, - 0.5593951498649633, - 0.6322124026692795, - null, - 0.5593951498649633, - 0.5201251204037126, - null, - 0.5229468203255856, - 0.4611021425875542, - null, - 0.5229468203255856, - 0.44175944307536974, - null, - 0.5229468203255856, - 0.6149491168624189, - null, - 0.5229468203255856, - 0.6234379896430121, - null, - 0.5229468203255856, - 0.4442228752887084, - null, - 0.5229468203255856, - 0.5593069337955722, - null, - 0.22007362873840486, - 0.2275256207367028, - null, - 0.22007362873840486, - 0.2619562675328274, - null, - 0.22007362873840486, - 0.18507593174525072, - null, - 0.22007362873840486, - 0.3414075728554137, - null, - 0.37301066653863624, - 0.2619562675328274, - null, - 0.37301066653863624, - 0.48218022499136737, - null, - 0.37301066653863624, - 0.47443124751760235, - null, - 0.37301066653863624, - 0.3414075728554137, - null, - 0.37301066653863624, - 0.42077304608666055, - null, - 0.37301066653863624, - 0.4039327719907384, - null, - 0.8613129225222332, - 0.7703024251104211, - null, - 0.8613129225222332, - 0.9005048863870916, - null, - 0.9663892923019699, - 0.9851894520572745, - null, - 0.9663892923019699, - 0.9573079778783831, - null, - 0.9663892923019699, - 0.9473667691929577, - null, - 0.2275256207367028, - 0.2619562675328274, - null, - 0.2275256207367028, - 0.18507593174525072, - null, - 0.2275256207367028, - 0.17086936775877049, - null, - 0.0852382135963593, - 0.0875467755337247, - null, - 0.0852382135963593, - 0.08997327822205015, - null, - 0.0852382135963593, - 0.020212382594376965, - null, - 0.0852382135963593, - 0.02312833765025224, - null, - 0.0852382135963593, - 0.20133087739958255, - null, - 0.0852382135963593, - 0.038579501382332126, - null, - 0.0852382135963593, - 0.01777064460825195, - null, - 0.0914406510425998, - 0.14711158829428328, - null, - 0.0914406510425998, - 0.02312833765025224, - null, - 0.0914406510425998, - 0.04237200971819888, - null, - 0.0914406510425998, - 0.01777064460825195, - null, - 0.9425745666137786, - 0.9851894520572745, - null, - 0.9425745666137786, - 0.9473667691929577, - null, - 0.3019474379086241, - 0.2121217358781844, - null, - 0.3019474379086241, - 0.3318561006769827, - null, - 0.3019474379086241, - 0.29978148854693865, - null, - 0.2619562675328274, - 0.3247821296168134, - null, - 0.2619562675328274, - 0.18507593174525072, - null, - 0.2619562675328274, - 0.17086936775877049, - null, - 0.2619562675328274, - 0.3414075728554137, - null, - 0.2619562675328274, - 0.3187675293980876, - null, - 0.2619562675328274, - 0.34114125407236195, - null, - 0.48218022499136737, - 0.5293212253918783, - null, - 0.48218022499136737, - 0.47443124751760235, - null, - 0.48218022499136737, - 0.5291812256005789, - null, - 0.48218022499136737, - 0.5465171974419871, - null, - 0.5293212253918783, - 0.47443124751760235, - null, - 0.5293212253918783, - 0.5291812256005789, - null, - 0.5293212253918783, - 0.5191285820034173, - null, - 0.5293212253918783, - 0.42077304608666055, - null, - 0.5293212253918783, - 0.5465171974419871, - null, - 0.41808707877840445, - 0.42926818011737133, - null, - 0.41808707877840445, - 0.44175944307536974, - null, - 0.41808707877840445, - 0.4363707938884992, - null, - 0.14711158829428328, - 0.21535391032155426, - null, - 0.42926818011737133, - 0.4363707938884992, - null, - 0.9694266665187994, - 0.9186278106648778, - null, - 0.9694266665187994, - 0.8846357375826375, - null, - 0.9694266665187994, - 0.9110645875753355, - null, - 0.9694266665187994, - 0.992283435751248, - null, - 0.4404718698088387, - 0.3393815448042514, - null, - 0.4404718698088387, - 0.32444561774289593, - null, - 0.4404718698088387, - 0.33721825060791266, - null, - 0.4404718698088387, - 0.5201251204037126, - null, - 0.4277213938753692, - 0.3247821296168134, - null, - 0.4277213938753692, - 0.4564806171162211, - null, - 0.4277213938753692, - 0.3187675293980876, - null, - 0.4277213938753692, - 0.34114125407236195, - null, - 0.7059759544943667, - 0.6149491168624189, - null, - 0.7059759544943667, - 0.6234379896430121, - null, - 0.4611021425875542, - 0.44175944307536974, - null, - 0.4611021425875542, - 0.4349682989231034, - null, - 0.4611021425875542, - 0.4442228752887084, - null, - 0.4611021425875542, - 0.5593069337955722, - null, - 0.13940667248499528, - 0.0201693226965588, - null, - 0.13940667248499528, - 0.16862303760247477, - null, - 0.13940667248499528, - 0.12355952994556385, - null, - 0.3393815448042514, - 0.21535391032155426, - null, - 0.3393815448042514, - 0.25656414507004344, - null, - 0.3393815448042514, - 0.32444561774289593, - null, - 0.3393815448042514, - 0.33721825060791266, - null, - 0.6370268640561303, - 0.7607451357487841, - null, - 0.6370268640561303, - 0.6234379896430121, - null, - 0.6370268640561303, - 0.6314926226168458, - null, - 0.9851894520572745, - 0.9573079778783831, - null, - 0.9851894520572745, - 0.9473667691929577, - null, - 0.3247821296168134, - 0.3187675293980876, - null, - 0.3247821296168134, - 0.34114125407236195, - null, - 0.9186278106648778, - 0.8846357375826375, - null, - 0.9186278106648778, - 0.8323549266756429, - null, - 0.9186278106648778, - 0.9110645875753355, - null, - 0.9186278106648778, - 0.992283435751248, - null, - 0.18507593174525072, - 0.17086936775877049, - null, - 0.18507593174525072, - 0.0897773631019545, - null, - 0.18507593174525072, - 0.20133087739958255, - null, - 0.5845953849421676, - 0.6058132814274794, - null, - 0.5845953849421676, - 0.5621062195646831, - null, - 0.44175944307536974, - 0.4442228752887084, - null, - 0.7255980413609877, - 0.7703024251104211, - null, - 0.7255980413609877, - 0.7518492361353024, - null, - 0.6058132814274794, - 0.5621062195646831, - null, - 0.47443124751760235, - 0.5291812256005789, - null, - 0.47443124751760235, - 0.5465171974419871, - null, - 0.9573079778783831, - 0.9473667691929577, - null, - 0.9573079778783831, - 0.838803404513024, - null, - 0.0201693226965588, - 0.12355952994556385, - null, - 0.0201693226965588, - 0.04781523934390508, - null, - 0.17086936775877049, - 0.0897773631019545, - null, - 0.17086936775877049, - 0.20133087739958255, - null, - 0.5291812256005789, - 0.5621062195646831, - null, - 0.5291812256005789, - 0.5465171974419871, - null, - 0.16862303760247477, - 0.12355952994556385, - null, - 0.8846357375826375, - 0.8323549266756429, - null, - 0.8846357375826375, - 0.8505181106970376, - null, - 0.8846357375826375, - 0.9110645875753355, - null, - 0.8846357375826375, - 0.992283435751248, - null, - 0.0875467755337247, - 0.08997327822205015, - null, - 0.0875467755337247, - 0.020212382594376965, - null, - 0.0875467755337247, - 0.02312833765025224, - null, - 0.0875467755337247, - 0.20133087739958255, - null, - 0.0875467755337247, - 0.038579501382332126, - null, - 0.0875467755337247, - 0.01777064460825195, - null, - 0.9473667691929577, - 0.838803404513024, - null, - 0.8541827253649632, - 0.8680862155815134, - null, - 0.8541827253649632, - 0.8668565351624634, - null, - 0.3414075728554137, - 0.42077304608666055, - null, - 0.3414075728554137, - 0.4039327719907384, - null, - 0.3318561006769827, - 0.4349682989231034, - null, - 0.3318561006769827, - 0.29978148854693865, - null, - 0.7408684543182315, - 0.8385234321105272, - null, - 0.7408684543182315, - 0.6322124026692795, - null, - 0.7408684543182315, - 0.7333209824474588, - null, - 0.6149491168624189, - 0.6234379896430121, - null, - 0.6149491168624189, - 0.5593069337955722, - null, - 0.12355952994556385, - 0.04781523934390508, - null, - 0.08997327822205015, - 0.020212382594376965, - null, - 0.08997327822205015, - 0.02312833765025224, - null, - 0.08997327822205015, - 0.20133087739958255, - null, - 0.08997327822205015, - 0.04237200971819888, - null, - 0.08997327822205015, - 0.038579501382332126, - null, - 0.08997327822205015, - 0.01777064460825195, - null, - 0.21535391032155426, - 0.25656414507004344, - null, - 0.21535391032155426, - 0.32444561774289593, - null, - 0.21535391032155426, - 0.33721825060791266, - null, - 0.8323549266756429, - 0.9110645875753355, - null, - 0.8385234321105272, - 0.8668565351624634, - null, - 0.8385234321105272, - 0.7333209824474588, - null, - 0.9240127894624793, - 0.9636590456207981, - null, - 0.9240127894624793, - 0.8680862155815134, - null, - 0.6802728591951641, - 0.6314926226168458, - null, - 0.25656414507004344, - 0.32444561774289593, - null, - 0.25656414507004344, - 0.33721825060791266, - null, - 0.020212382594376965, - 0.02312833765025224, - null, - 0.020212382594376965, - 0.038579501382332126, - null, - 0.020212382594376965, - 0.01777064460825195, - null, - 0.32444561774289593, - 0.33721825060791266, - null, - 0.838803404513024, - 0.7518492361353024, - null, - 0.6322124026692795, - 0.5201251204037126, - null, - 0.6322124026692795, - 0.7333209824474588, - null, - 0.8505181106970376, - 0.7607451357487841, - null, - 0.8505181106970376, - 0.9110645875753355, - null, - 0.0897773631019545, - 0.04781523934390508, - null, - 0.02312833765025224, - 0.04237200971819888, - null, - 0.02312833765025224, - 0.038579501382332126, - null, - 0.02312833765025224, - 0.01777064460825195, - null, - 0.05596958524873419, - 0.014269300880037306, - null, - 0.3187675293980876, - 0.20133087739958255, - null, - 0.3187675293980876, - 0.34114125407236195, - null, - 0.5191285820034173, - 0.42077304608666055, - null, - 0.5191285820034173, - 0.5465171974419871, - null, - 0.4349682989231034, - 0.4442228752887084, - null, - 0.9636590456207981, - 0.8680862155815134, - null, - 0.8680862155815134, - 0.8668565351624634, - null, - 0.6234379896430121, - 0.5593069337955722, - null, - 0.04237200971819888, - 0.038579501382332126, - null, - 0.04237200971819888, - 0.01777064460825195, - null, - 0.038579501382332126, - 0.01777064460825195, - null, - 0.9110645875753355, - 0.992283435751248, - null, - 0.42077304608666055, - 0.4039327719907384, - null - ], - "y": [ - 0.09053726824382247, - 0.17542400609184483, - null, - 0.09053726824382247, - 0.055894273053114896, - null, - 0.09053726824382247, - 0.14933184162295132, - null, - 0.09053726824382247, - 0.1278305132468397, - null, - 0.09053726824382247, - 0.0731473655342364, - null, - 0.09053726824382247, - 0.09533319097359638, - null, - 0.09053726824382247, - 0.055897802218322856, - null, - 0.09053726824382247, - 0.04153202488293273, - null, - 0.09053726824382247, - 0.06013197669987258, - null, - 0.09053726824382247, - 0.040563128366188694, - null, - 0.09053726824382247, - 0.09959517902538939, - null, - 0.571085214777101, - 0.5944498275635773, - null, - 0.571085214777101, - 0.6773365837969099, - null, - 0.571085214777101, - 0.6160873747407943, - null, - 0.571085214777101, - 0.5186581897030644, - null, - 0.571085214777101, - 0.5634679987017406, - null, - 0.571085214777101, - 0.6012106694454529, - null, - 0.571085214777101, - 0.4898861106787329, - null, - 0.571085214777101, - 0.45431497833000367, - null, - 0.571085214777101, - 0.5204579980957379, - null, - 0.571085214777101, - 0.6352288779182178, - null, - 0.571085214777101, - 0.5981086798045652, - null, - 0.571085214777101, - 0.6648266103848882, - null, - 0.571085214777101, - 0.6072525121642058, - null, - 0.571085214777101, - 0.5260776190209286, - null, - 0.5199666766946885, - 0.5219101415039136, - null, - 0.5199666766946885, - 0.4307004647175262, - null, - 0.5199666766946885, - 0.4834545718278357, - null, - 0.5199666766946885, - 0.4847615611240751, - null, - 0.5199666766946885, - 0.4318165589087314, - null, - 0.5199666766946885, - 0.6217058876501556, - null, - 0.5199666766946885, - 0.5097617399826666, - null, - 0.33766327379542094, - 0.33811323660241943, - null, - 0.33766327379542094, - 0.31304614249644347, - null, - 0.33766327379542094, - 0.2697998035002954, - null, - 0.33766327379542094, - 0.2695720924906413, - null, - 0.33766327379542094, - 0.24454670425362057, - null, - 0.33766327379542094, - 0.4500538798110242, - null, - 0.33766327379542094, - 0.2880647319459674, - null, - 0.33766327379542094, - 0.3202314429055858, - null, - 0.33766327379542094, - 0.3169605131706372, - null, - 0.33766327379542094, - 0.32345881810688737, - null, - 0.17196466768963936, - 0.2009582712064717, - null, - 0.17196466768963936, - 0.15069304516745607, - null, - 0.17196466768963936, - 0.06016942899581168, - null, - 0.17196466768963936, - 0.24013807075121119, - null, - 0.17196466768963936, - 0.2693681584998491, - null, - 0.17196466768963936, - 0.10059463740220753, - null, - 0.17196466768963936, - 0.09959517902538939, - null, - 0.17708608014427518, - 0.2373268562908326, - null, - 0.17708608014427518, - 0.23741932367240448, - null, - 0.17708608014427518, - 0.05938145280899054, - null, - 0.17708608014427518, - 0.17619771419691865, - null, - 0.17708608014427518, - 0.21532966919867302, - null, - 0.17708608014427518, - 0.10782775946098799, - null, - 0.17708608014427518, - 0.249116699886752, - null, - 0.17708608014427518, - 0.23700988477155205, - null, - 0.17708608014427518, - 0.1341994714416056, - null, - 0.17708608014427518, - 0.29050814087118004, - null, - 0.04649454781195783, - 0.07011604000159166, - null, - 0.04649454781195783, - 0.019989772968585173, - null, - 0.04649454781195783, - 0.038844634468288675, - null, - 0.37080565676900146, - 0.3648985367210805, - null, - 0.37080565676900146, - 0.3343459796676115, - null, - 0.37080565676900146, - 0.4208812619135248, - null, - 0.37080565676900146, - 0.3900960314334032, - null, - 0.37080565676900146, - 0.3098874271134545, - null, - 0.37080565676900146, - 0.4295667428124167, - null, - 0.37080565676900146, - 0.35350564895305514, - null, - 0.37080565676900146, - 0.31541428705224306, - null, - 0.37080565676900146, - 0.4467311570808764, - null, - 0.37080565676900146, - 0.2693681584998491, - null, - 0.37080565676900146, - 0.4421375373865315, - null, - 0.37080565676900146, - 0.42641694849778966, - null, - 0.37080565676900146, - 0.3333136626479075, - null, - 0.37080565676900146, - 0.4868902788925622, - null, - 0.3602866247185619, - 0.3061539627540061, - null, - 0.3602866247185619, - 0.3661437355856225, - null, - 0.3602866247185619, - 0.40557198035837094, - null, - 0.3602866247185619, - 0.3192831323823997, - null, - 0.3602866247185619, - 0.41535454584101794, - null, - 0.3602866247185619, - 0.40395348439090084, - null, - 0.3602866247185619, - 0.3340702546567942, - null, - 0.3602866247185619, - 0.4248880785102581, - null, - 0.3602866247185619, - 0.29119156039108685, - null, - 0.9483925173875926, - 0.8957623407464501, - null, - 0.9483925173875926, - 0.9727770125665405, - null, - 0.9483925173875926, - 0.8791466031622056, - null, - 0.9483925173875926, - 0.922341377568881, - null, - 0.9483925173875926, - 0.8821215709600496, - null, - 0.9483925173875926, - 0.9328536520894143, - null, - 0.9483925173875926, - 0.9344432405222354, - null, - 0.9483925173875926, - 0.9642772106357639, - null, - 0.3061539627540061, - 0.3661437355856225, - null, - 0.3061539627540061, - 0.40557198035837094, - null, - 0.3061539627540061, - 0.3192831323823997, - null, - 0.3061539627540061, - 0.32266487999330984, - null, - 0.3061539627540061, - 0.40395348439090084, - null, - 0.3061539627540061, - 0.3340702546567942, - null, - 0.3061539627540061, - 0.29119156039108685, - null, - 0.3061539627540061, - 0.19048093242734687, - null, - 0.9643804220706982, - 0.9298960866412943, - null, - 0.9643804220706982, - 0.8599268392047722, - null, - 0.9643804220706982, - 0.9435179236599912, - null, - 0.9643804220706982, - 0.9958360522915445, - null, - 0.9643804220706982, - 0.9756800437762957, - null, - 0.9643804220706982, - 0.8842114977564064, - null, - 0.8336885167043149, - 0.938767234846119, - null, - 0.8336885167043149, - 0.8867112408398291, - null, - 0.8336885167043149, - 0.9298960866412943, - null, - 0.8336885167043149, - 0.8599268392047722, - null, - 0.8336885167043149, - 0.8508124987550889, - null, - 0.8336885167043149, - 0.8842114977564064, - null, - 0.5944498275635773, - 0.5216765314868881, - null, - 0.5944498275635773, - 0.6001026871900049, - null, - 0.5944498275635773, - 0.6012106694454529, - null, - 0.5944498275635773, - 0.4898861106787329, - null, - 0.5944498275635773, - 0.5204579980957379, - null, - 0.5944498275635773, - 0.6352288779182178, - null, - 0.5944498275635773, - 0.6648266103848882, - null, - 0.5944498275635773, - 0.6072525121642058, - null, - 0.2373268562908326, - 0.23741932367240448, - null, - 0.2373268562908326, - 0.33811323660241943, - null, - 0.2373268562908326, - 0.17542400609184483, - null, - 0.2373268562908326, - 0.17619771419691865, - null, - 0.2373268562908326, - 0.1278305132468397, - null, - 0.2373268562908326, - 0.21532966919867302, - null, - 0.2373268562908326, - 0.2695720924906413, - null, - 0.2373268562908326, - 0.24454670425362057, - null, - 0.2373268562908326, - 0.20002447568886628, - null, - 0.2373268562908326, - 0.3202314429055858, - null, - 0.2373268562908326, - 0.1341994714416056, - null, - 0.2373268562908326, - 0.3169605131706372, - null, - 0.2373268562908326, - 0.29050814087118004, - null, - 0.2373268562908326, - 0.32345881810688737, - null, - 0.23741932367240448, - 0.32127102230894566, - null, - 0.23741932367240448, - 0.2381682330796122, - null, - 0.23741932367240448, - 0.17296378957033465, - null, - 0.23741932367240448, - 0.24033413659841596, - null, - 0.23741932367240448, - 0.2981410655965283, - null, - 0.23741932367240448, - 0.3199684158322815, - null, - 0.23741932367240448, - 0.2660491488293679, - null, - 0.23741932367240448, - 0.249116699886752, - null, - 0.23741932367240448, - 0.23700988477155205, - null, - 0.23741932367240448, - 0.29050814087118004, - null, - 0.23741932367240448, - 0.2318219208408404, - null, - 0.32127102230894566, - 0.39453602200590676, - null, - 0.32127102230894566, - 0.2381682330796122, - null, - 0.32127102230894566, - 0.3309683982450944, - null, - 0.32127102230894566, - 0.24033413659841596, - null, - 0.32127102230894566, - 0.2981410655965283, - null, - 0.32127102230894566, - 0.3199684158322815, - null, - 0.32127102230894566, - 0.3355480553373167, - null, - 0.32127102230894566, - 0.2660491488293679, - null, - 0.32127102230894566, - 0.3635517670405215, - null, - 0.32127102230894566, - 0.249116699886752, - null, - 0.32127102230894566, - 0.23700988477155205, - null, - 0.32127102230894566, - 0.28871122138225125, - null, - 0.32127102230894566, - 0.42203254876563234, - null, - 0.32127102230894566, - 0.2318219208408404, - null, - 0.3661437355856225, - 0.3343459796676115, - null, - 0.3661437355856225, - 0.4307004647175262, - null, - 0.3661437355856225, - 0.40557198035837094, - null, - 0.3661437355856225, - 0.4834545718278357, - null, - 0.3661437355856225, - 0.4847615611240751, - null, - 0.3661437355856225, - 0.32266487999330984, - null, - 0.3661437355856225, - 0.4318165589087314, - null, - 0.3661437355856225, - 0.3340702546567942, - null, - 0.7791505090281524, - 0.8520196094107113, - null, - 0.7791505090281524, - 0.8848427298858184, - null, - 0.3648985367210805, - 0.3343459796676115, - null, - 0.3648985367210805, - 0.4208812619135248, - null, - 0.3648985367210805, - 0.4307004647175262, - null, - 0.3648985367210805, - 0.3900960314334032, - null, - 0.3648985367210805, - 0.3098874271134545, - null, - 0.3648985367210805, - 0.32266487999330984, - null, - 0.3648985367210805, - 0.4295667428124167, - null, - 0.3648985367210805, - 0.35350564895305514, - null, - 0.3648985367210805, - 0.31541428705224306, - null, - 0.3648985367210805, - 0.2693681584998491, - null, - 0.3648985367210805, - 0.42641694849778966, - null, - 0.3648985367210805, - 0.3333136626479075, - null, - 0.6244837238804738, - 0.5850986908522726, - null, - 0.6244837238804738, - 0.6267294109959968, - null, - 0.6244837238804738, - 0.5221172076712435, - null, - 0.6244837238804738, - 0.5717872069066212, - null, - 0.6244837238804738, - 0.7302384542961842, - null, - 0.6244837238804738, - 0.6710484758334021, - null, - 0.6244837238804738, - 0.5492873750243871, - null, - 0.6244837238804738, - 0.6201266549140614, - null, - 0.6244837238804738, - 0.5752985482362863, - null, - 0.9012137046519791, - 0.8622415881936324, - null, - 0.9012137046519791, - 0.8350595230795331, - null, - 0.5219101415039136, - 0.4307004647175262, - null, - 0.5219101415039136, - 0.4834545718278357, - null, - 0.5219101415039136, - 0.4847615611240751, - null, - 0.5219101415039136, - 0.4295667428124167, - null, - 0.5219101415039136, - 0.5144551437666581, - null, - 0.5219101415039136, - 0.42641694849778966, - null, - 0.5219101415039136, - 0.6014235590484225, - null, - 0.5219101415039136, - 0.4868902788925622, - null, - 0.39453602200590676, - 0.3309683982450944, - null, - 0.39453602200590676, - 0.2981410655965283, - null, - 0.39453602200590676, - 0.3199684158322815, - null, - 0.39453602200590676, - 0.45431497833000367, - null, - 0.39453602200590676, - 0.42052616285893474, - null, - 0.39453602200590676, - 0.4107398412471005, - null, - 0.39453602200590676, - 0.3635517670405215, - null, - 0.39453602200590676, - 0.42203254876563234, - null, - 0.2009582712064717, - 0.20619722773579274, - null, - 0.2009582712064717, - 0.3098874271134545, - null, - 0.2009582712064717, - 0.15069304516745607, - null, - 0.2009582712064717, - 0.31541428705224306, - null, - 0.2009582712064717, - 0.24013807075121119, - null, - 0.2009582712064717, - 0.2693681584998491, - null, - 0.2009582712064717, - 0.22993075379681738, - null, - 0.2009582712064717, - 0.09959517902538939, - null, - 0.04224314617430658, - 0.05938145280899054, - null, - 0.04224314617430658, - 0.04283815208078323, - null, - 0.04224314617430658, - 0.010366221042083845, - null, - 0.04224314617430658, - 0.10782775946098799, - null, - 0.04224314617430658, - 0.03395115206665145, - null, - 0.04224314617430658, - 0.05477321631284726, - null, - 0.2381682330796122, - 0.3309683982450944, - null, - 0.2381682330796122, - 0.17296378957033465, - null, - 0.2381682330796122, - 0.24033413659841596, - null, - 0.2381682330796122, - 0.2981410655965283, - null, - 0.2381682330796122, - 0.3355480553373167, - null, - 0.2381682330796122, - 0.2660491488293679, - null, - 0.2381682330796122, - 0.249116699886752, - null, - 0.2381682330796122, - 0.23700988477155205, - null, - 0.2381682330796122, - 0.28871122138225125, - null, - 0.2381682330796122, - 0.2002886163837997, - null, - 0.2381682330796122, - 0.13201947050262697, - null, - 0.2381682330796122, - 0.2318219208408404, - null, - 0.2381682330796122, - 0.20307680326083377, - null, - 0.33811323660241943, - 0.31304614249644347, - null, - 0.33811323660241943, - 0.2695720924906413, - null, - 0.33811323660241943, - 0.24454670425362057, - null, - 0.33811323660241943, - 0.4500538798110242, - null, - 0.33811323660241943, - 0.4140065537970282, - null, - 0.33811323660241943, - 0.2880647319459674, - null, - 0.33811323660241943, - 0.3202314429055858, - null, - 0.33811323660241943, - 0.3169605131706372, - null, - 0.33811323660241943, - 0.32345881810688737, - null, - 0.5216765314868881, - 0.6001026871900049, - null, - 0.5216765314868881, - 0.6012106694454529, - null, - 0.5216765314868881, - 0.4898861106787329, - null, - 0.5216765314868881, - 0.5204579980957379, - null, - 0.5216765314868881, - 0.4500538798110242, - null, - 0.5216765314868881, - 0.42052616285893474, - null, - 0.5216765314868881, - 0.4140065537970282, - null, - 0.5216765314868881, - 0.4937592635708411, - null, - 0.6001026871900049, - 0.6012106694454529, - null, - 0.6001026871900049, - 0.6705222836834548, - null, - 0.6001026871900049, - 0.5204579980957379, - null, - 0.6001026871900049, - 0.6648266103848882, - null, - 0.991844460003468, - 0.9727770125665405, - null, - 0.991844460003468, - 0.938767234846119, - null, - 0.991844460003468, - 0.9874110419208606, - null, - 0.991844460003468, - 0.9328536520894143, - null, - 0.991844460003468, - 0.9078978130468089, - null, - 0.991844460003468, - 0.9513646744432486, - null, - 0.3343459796676115, - 0.4307004647175262, - null, - 0.3343459796676115, - 0.3900960314334032, - null, - 0.3343459796676115, - 0.3098874271134545, - null, - 0.3343459796676115, - 0.32266487999330984, - null, - 0.3343459796676115, - 0.4295667428124167, - null, - 0.3343459796676115, - 0.35350564895305514, - null, - 0.3343459796676115, - 0.31541428705224306, - null, - 0.3343459796676115, - 0.24013807075121119, - null, - 0.3343459796676115, - 0.2693681584998491, - null, - 0.3343459796676115, - 0.3333136626479075, - null, - 0.8957623407464501, - 0.9727770125665405, - null, - 0.8957623407464501, - 0.8423383207045981, - null, - 0.8957623407464501, - 0.8791466031622056, - null, - 0.8957623407464501, - 0.8151159149468827, - null, - 0.8957623407464501, - 0.922341377568881, - null, - 0.8957623407464501, - 0.8821215709600496, - null, - 0.8957623407464501, - 0.9328536520894143, - null, - 0.8957623407464501, - 0.9344432405222354, - null, - 0.8957623407464501, - 0.9642772106357639, - null, - 0.8957623407464501, - 0.8157570218353161, - null, - 0.8957623407464501, - 0.7925454632595156, - null, - 0.8957623407464501, - 0.888980486534156, - null, - 0.4208812619135248, - 0.3900960314334032, - null, - 0.4208812619135248, - 0.3098874271134545, - null, - 0.4208812619135248, - 0.4295667428124167, - null, - 0.4208812619135248, - 0.35350564895305514, - null, - 0.4208812619135248, - 0.4467311570808764, - null, - 0.4208812619135248, - 0.5144551437666581, - null, - 0.4208812619135248, - 0.4421375373865315, - null, - 0.4208812619135248, - 0.42641694849778966, - null, - 0.4208812619135248, - 0.3333136626479075, - null, - 0.4208812619135248, - 0.4868902788925622, - null, - 0.31304614249644347, - 0.2697998035002954, - null, - 0.31304614249644347, - 0.2695720924906413, - null, - 0.31304614249644347, - 0.24454670425362057, - null, - 0.31304614249644347, - 0.20619722773579274, - null, - 0.31304614249644347, - 0.3098874271134545, - null, - 0.31304614249644347, - 0.2880647319459674, - null, - 0.31304614249644347, - 0.3202314429055858, - null, - 0.31304614249644347, - 0.22993075379681738, - null, - 0.31304614249644347, - 0.3169605131706372, - null, - 0.31304614249644347, - 0.32345881810688737, - null, - 0.6773365837969099, - 0.6628083689885368, - null, - 0.6773365837969099, - 0.6160873747407943, - null, - 0.6773365837969099, - 0.7537809293531343, - null, - 0.6773365837969099, - 0.5634679987017406, - null, - 0.6773365837969099, - 0.6012106694454529, - null, - 0.6773365837969099, - 0.6352288779182178, - null, - 0.6773365837969099, - 0.5981086798045652, - null, - 0.6773365837969099, - 0.6648266103848882, - null, - 0.6773365837969099, - 0.6072525121642058, - null, - 0.4307004647175262, - 0.40557198035837094, - null, - 0.4307004647175262, - 0.4834545718278357, - null, - 0.4307004647175262, - 0.4847615611240751, - null, - 0.4307004647175262, - 0.32266487999330984, - null, - 0.4307004647175262, - 0.4295667428124167, - null, - 0.4307004647175262, - 0.35350564895305514, - null, - 0.4307004647175262, - 0.4318165589087314, - null, - 0.4307004647175262, - 0.5097617399826666, - null, - 0.3309683982450944, - 0.24033413659841596, - null, - 0.3309683982450944, - 0.2981410655965283, - null, - 0.3309683982450944, - 0.3199684158322815, - null, - 0.3309683982450944, - 0.3355480553373167, - null, - 0.3309683982450944, - 0.2660491488293679, - null, - 0.3309683982450944, - 0.3635517670405215, - null, - 0.3309683982450944, - 0.249116699886752, - null, - 0.3309683982450944, - 0.23700988477155205, - null, - 0.3309683982450944, - 0.28871122138225125, - null, - 0.3309683982450944, - 0.42203254876563234, - null, - 0.3309683982450944, - 0.2318219208408404, - null, - 0.2697998035002954, - 0.17542400609184483, - null, - 0.2697998035002954, - 0.2695720924906413, - null, - 0.2697998035002954, - 0.24454670425362057, - null, - 0.2697998035002954, - 0.20619722773579274, - null, - 0.2697998035002954, - 0.3098874271134545, - null, - 0.2697998035002954, - 0.2880647319459674, - null, - 0.2697998035002954, - 0.22993075379681738, - null, - 0.2697998035002954, - 0.32345881810688737, - null, - 0.9727770125665405, - 0.922341377568881, - null, - 0.9727770125665405, - 0.8821215709600496, - null, - 0.9727770125665405, - 0.9328536520894143, - null, - 0.9727770125665405, - 0.9642772106357639, - null, - 0.40557198035837094, - 0.4834545718278357, - null, - 0.40557198035837094, - 0.4847615611240751, - null, - 0.40557198035837094, - 0.32266487999330984, - null, - 0.40557198035837094, - 0.40395348439090084, - null, - 0.40557198035837094, - 0.4318165589087314, - null, - 0.40557198035837094, - 0.3340702546567942, - null, - 0.40557198035837094, - 0.4248880785102581, - null, - 0.40557198035837094, - 0.5097617399826666, - null, - 0.35532572275494023, - 0.24028581536328997, - null, - 0.35532572275494023, - 0.3192831323823997, - null, - 0.35532572275494023, - 0.2529891644068947, - null, - 0.35532572275494023, - 0.41535454584101794, - null, - 0.35532572275494023, - 0.40395348439090084, - null, - 0.35532572275494023, - 0.4248880785102581, - null, - 0.35532572275494023, - 0.29119156039108685, - null, - 0.35532572275494023, - 0.24102842320743, - null, - 0.5850986908522726, - 0.6267294109959968, - null, - 0.5850986908522726, - 0.5221172076712435, - null, - 0.5850986908522726, - 0.5717872069066212, - null, - 0.5850986908522726, - 0.5492873750243871, - null, - 0.5850986908522726, - 0.6201266549140614, - null, - 0.5850986908522726, - 0.5752985482362863, - null, - 0.5850986908522726, - 0.5097617399826666, - null, - 0.17296378957033465, - 0.24033413659841596, - null, - 0.17296378957033465, - 0.2660491488293679, - null, - 0.17296378957033465, - 0.10782775946098799, - null, - 0.17296378957033465, - 0.249116699886752, - null, - 0.17296378957033465, - 0.23700988477155205, - null, - 0.17296378957033465, - 0.28871122138225125, - null, - 0.17296378957033465, - 0.2002886163837997, - null, - 0.17296378957033465, - 0.13201947050262697, - null, - 0.17296378957033465, - 0.2318219208408404, - null, - 0.17296378957033465, - 0.20307680326083377, - null, - 0.6628083689885368, - 0.6160873747407943, - null, - 0.6628083689885368, - 0.7537809293531343, - null, - 0.6628083689885368, - 0.5634679987017406, - null, - 0.6628083689885368, - 0.6352288779182178, - null, - 0.6628083689885368, - 0.5981086798045652, - null, - 0.6628083689885368, - 0.6072525121642058, - null, - 0.6160873747407943, - 0.5186581897030644, - null, - 0.6160873747407943, - 0.5634679987017406, - null, - 0.6160873747407943, - 0.6012106694454529, - null, - 0.6160873747407943, - 0.6352288779182178, - null, - 0.6160873747407943, - 0.5981086798045652, - null, - 0.6160873747407943, - 0.6648266103848882, - null, - 0.6160873747407943, - 0.6072525121642058, - null, - 0.6160873747407943, - 0.5260776190209286, - null, - 0.025297953521542405, - 0.06016942899581168, - null, - 0.025297953521542405, - 0.055897802218322856, - null, - 0.025297953521542405, - 0.09959517902538939, - null, - 0.24028581536328997, - 0.3192831323823997, - null, - 0.24028581536328997, - 0.1333966979371528, - null, - 0.24028581536328997, - 0.2529891644068947, - null, - 0.24028581536328997, - 0.29119156039108685, - null, - 0.24028581536328997, - 0.24102842320743, - null, - 0.5186581897030644, - 0.5634679987017406, - null, - 0.5186581897030644, - 0.6012106694454529, - null, - 0.5186581897030644, - 0.4898861106787329, - null, - 0.5186581897030644, - 0.45431497833000367, - null, - 0.5186581897030644, - 0.6352288779182178, - null, - 0.5186581897030644, - 0.5981086798045652, - null, - 0.5186581897030644, - 0.6072525121642058, - null, - 0.5186581897030644, - 0.42203254876563234, - null, - 0.5186581897030644, - 0.5260776190209286, - null, - 0.8423383207045981, - 0.8151159149468827, - null, - 0.8423383207045981, - 0.7334929583472656, - null, - 0.8423383207045981, - 0.8821215709600496, - null, - 0.8423383207045981, - 0.9328536520894143, - null, - 0.8423383207045981, - 0.7834166246251234, - null, - 0.8423383207045981, - 0.9078978130468089, - null, - 0.8423383207045981, - 0.7925454632595156, - null, - 0.8423383207045981, - 0.8508124987550889, - null, - 0.7537809293531343, - 0.8622415881936324, - null, - 0.7537809293531343, - 0.8350595230795331, - null, - 0.3192831323823997, - 0.2529891644068947, - null, - 0.3192831323823997, - 0.41535454584101794, - null, - 0.3192831323823997, - 0.40395348439090084, - null, - 0.3192831323823997, - 0.4248880785102581, - null, - 0.3192831323823997, - 0.29119156039108685, - null, - 0.3192831323823997, - 0.24102842320743, - null, - 0.17542400609184483, - 0.055894273053114896, - null, - 0.17542400609184483, - 0.14933184162295132, - null, - 0.17542400609184483, - 0.17619771419691865, - null, - 0.17542400609184483, - 0.1278305132468397, - null, - 0.17542400609184483, - 0.21532966919867302, - null, - 0.17542400609184483, - 0.0731473655342364, - null, - 0.17542400609184483, - 0.2695720924906413, - null, - 0.17542400609184483, - 0.09533319097359638, - null, - 0.17542400609184483, - 0.24454670425362057, - null, - 0.17542400609184483, - 0.20002447568886628, - null, - 0.17542400609184483, - 0.20619722773579274, - null, - 0.17542400609184483, - 0.2880647319459674, - null, - 0.17542400609184483, - 0.1341994714416056, - null, - 0.17542400609184483, - 0.22993075379681738, - null, - 0.008409380348177398, - 0.04149975738749545, - null, - 0.938767234846119, - 0.9874110419208606, - null, - 0.938767234846119, - 0.8867112408398291, - null, - 0.938767234846119, - 0.9298960866412943, - null, - 0.938767234846119, - 0.9078978130468089, - null, - 0.938767234846119, - 0.9958360522915445, - null, - 0.938767234846119, - 0.8508124987550889, - null, - 0.938767234846119, - 0.8842114977564064, - null, - 0.938767234846119, - 0.9513646744432486, - null, - 0.24033413659841596, - 0.2981410655965283, - null, - 0.24033413659841596, - 0.3199684158322815, - null, - 0.24033413659841596, - 0.3355480553373167, - null, - 0.24033413659841596, - 0.2660491488293679, - null, - 0.24033413659841596, - 0.249116699886752, - null, - 0.24033413659841596, - 0.23700988477155205, - null, - 0.24033413659841596, - 0.28871122138225125, - null, - 0.24033413659841596, - 0.2002886163837997, - null, - 0.24033413659841596, - 0.13201947050262697, - null, - 0.24033413659841596, - 0.2318219208408404, - null, - 0.24033413659841596, - 0.20307680326083377, - null, - 0.8791466031622056, - 0.922341377568881, - null, - 0.8791466031622056, - 0.8821215709600496, - null, - 0.8791466031622056, - 0.9542382277667263, - null, - 0.8791466031622056, - 0.9024846524956353, - null, - 0.8791466031622056, - 0.9344432405222354, - null, - 0.8791466031622056, - 0.9642772106357639, - null, - 0.8791466031622056, - 0.8157570218353161, - null, - 0.8791466031622056, - 0.888980486534156, - null, - 0.5634679987017406, - 0.6012106694454529, - null, - 0.5634679987017406, - 0.6352288779182178, - null, - 0.5634679987017406, - 0.5981086798045652, - null, - 0.5634679987017406, - 0.6072525121642058, - null, - 0.5634679987017406, - 0.5260776190209286, - null, - 0.05938145280899054, - 0.04283815208078323, - null, - 0.05938145280899054, - 0.10782775946098799, - null, - 0.05938145280899054, - 0.03395115206665145, - null, - 0.05938145280899054, - 0.05477321631284726, - null, - 0.05938145280899054, - 0.1341994714416056, - null, - 0.6012106694454529, - 0.4898861106787329, - null, - 0.6012106694454529, - 0.5204579980957379, - null, - 0.6012106694454529, - 0.6352288779182178, - null, - 0.6012106694454529, - 0.6648266103848882, - null, - 0.6012106694454529, - 0.6072525121642058, - null, - 0.6705222836834548, - 0.7454337953380579, - null, - 0.6705222836834548, - 0.7077207700167599, - null, - 0.6705222836834548, - 0.7005910562446783, - null, - 0.6705222836834548, - 0.5603277981830703, - null, - 0.3900960314334032, - 0.3098874271134545, - null, - 0.3900960314334032, - 0.4295667428124167, - null, - 0.3900960314334032, - 0.35350564895305514, - null, - 0.3900960314334032, - 0.31541428705224306, - null, - 0.3900960314334032, - 0.4467311570808764, - null, - 0.3900960314334032, - 0.4421375373865315, - null, - 0.3900960314334032, - 0.42641694849778966, - null, - 0.3900960314334032, - 0.3333136626479075, - null, - 0.3900960314334032, - 0.4868902788925622, - null, - 0.055894273053114896, - 0.14933184162295132, - null, - 0.055894273053114896, - 0.1278305132468397, - null, - 0.055894273053114896, - 0.0731473655342364, - null, - 0.055894273053114896, - 0.09533319097359638, - null, - 0.055894273053114896, - 0.055897802218322856, - null, - 0.055894273053114896, - 0.04153202488293273, - null, - 0.055894273053114896, - 0.06013197669987258, - null, - 0.055894273053114896, - 0.040563128366188694, - null, - 0.14933184162295132, - 0.17619771419691865, - null, - 0.14933184162295132, - 0.1278305132468397, - null, - 0.14933184162295132, - 0.21532966919867302, - null, - 0.14933184162295132, - 0.0731473655342364, - null, - 0.14933184162295132, - 0.09533319097359638, - null, - 0.14933184162295132, - 0.24454670425362057, - null, - 0.14933184162295132, - 0.20002447568886628, - null, - 0.14933184162295132, - 0.20619722773579274, - null, - 0.14933184162295132, - 0.055897802218322856, - null, - 0.14933184162295132, - 0.04153202488293273, - null, - 0.14933184162295132, - 0.06013197669987258, - null, - 0.14933184162295132, - 0.22993075379681738, - null, - 0.14933184162295132, - 0.040563128366188694, - null, - 0.8151159149468827, - 0.7334929583472656, - null, - 0.8151159149468827, - 0.8821215709600496, - null, - 0.8151159149468827, - 0.9328536520894143, - null, - 0.8151159149468827, - 0.7834166246251234, - null, - 0.8151159149468827, - 0.7925454632595156, - null, - 0.8151159149468827, - 0.8508124987550889, - null, - 0.17619771419691865, - 0.1278305132468397, - null, - 0.17619771419691865, - 0.21532966919867302, - null, - 0.17619771419691865, - 0.0731473655342364, - null, - 0.17619771419691865, - 0.2695720924906413, - null, - 0.17619771419691865, - 0.09533319097359638, - null, - 0.17619771419691865, - 0.24454670425362057, - null, - 0.17619771419691865, - 0.20002447568886628, - null, - 0.17619771419691865, - 0.1341994714416056, - null, - 0.17619771419691865, - 0.06013197669987258, - null, - 0.2981410655965283, - 0.3199684158322815, - null, - 0.2981410655965283, - 0.3355480553373167, - null, - 0.2981410655965283, - 0.2660491488293679, - null, - 0.2981410655965283, - 0.3635517670405215, - null, - 0.2981410655965283, - 0.249116699886752, - null, - 0.2981410655965283, - 0.23700988477155205, - null, - 0.2981410655965283, - 0.28871122138225125, - null, - 0.2981410655965283, - 0.42203254876563234, - null, - 0.2981410655965283, - 0.2002886163837997, - null, - 0.2981410655965283, - 0.29050814087118004, - null, - 0.2981410655965283, - 0.2318219208408404, - null, - 0.2981410655965283, - 0.20307680326083377, - null, - 0.7334929583472656, - 0.6512622326935055, - null, - 0.7334929583472656, - 0.7205270186163313, - null, - 0.7334929583472656, - 0.7834166246251234, - null, - 0.7334929583472656, - 0.6217058876501556, - null, - 0.7334929583472656, - 0.7925454632595156, - null, - 0.7334929583472656, - 0.6714278208298593, - null, - 0.04283815208078323, - 0.010366221042083845, - null, - 0.04283815208078323, - 0.10782775946098799, - null, - 0.04283815208078323, - 0.03395115206665145, - null, - 0.04283815208078323, - 0.05477321631284726, - null, - 0.04283815208078323, - 0.13201947050262697, - null, - 0.922341377568881, - 0.8821215709600496, - null, - 0.922341377568881, - 0.9542382277667263, - null, - 0.922341377568881, - 0.9328536520894143, - null, - 0.922341377568881, - 0.9961038345306213, - null, - 0.922341377568881, - 0.9344432405222354, - null, - 0.922341377568881, - 0.9642772106357639, - null, - 0.922341377568881, - 0.8157570218353161, - null, - 0.922341377568881, - 0.888980486534156, - null, - 0.3199684158322815, - 0.42052616285893474, - null, - 0.3199684158322815, - 0.2660491488293679, - null, - 0.3199684158322815, - 0.4107398412471005, - null, - 0.3199684158322815, - 0.3635517670405215, - null, - 0.3199684158322815, - 0.249116699886752, - null, - 0.3199684158322815, - 0.23700988477155205, - null, - 0.3199684158322815, - 0.42203254876563234, - null, - 0.3199684158322815, - 0.29050814087118004, - null, - 0.1278305132468397, - 0.21532966919867302, - null, - 0.1278305132468397, - 0.0731473655342364, - null, - 0.1278305132468397, - 0.09533319097359638, - null, - 0.1278305132468397, - 0.24454670425362057, - null, - 0.1278305132468397, - 0.20002447568886628, - null, - 0.1278305132468397, - 0.04153202488293273, - null, - 0.1278305132468397, - 0.05477321631284726, - null, - 0.1278305132468397, - 0.1341994714416056, - null, - 0.1278305132468397, - 0.06013197669987258, - null, - 0.1278305132468397, - 0.040563128366188694, - null, - 0.21532966919867302, - 0.2695720924906413, - null, - 0.21532966919867302, - 0.09533319097359638, - null, - 0.21532966919867302, - 0.24454670425362057, - null, - 0.21532966919867302, - 0.20002447568886628, - null, - 0.21532966919867302, - 0.3202314429055858, - null, - 0.21532966919867302, - 0.1341994714416056, - null, - 0.21532966919867302, - 0.3169605131706372, - null, - 0.21532966919867302, - 0.29050814087118004, - null, - 0.21532966919867302, - 0.32345881810688737, - null, - 0.0731473655342364, - 0.09533319097359638, - null, - 0.0731473655342364, - 0.055897802218322856, - null, - 0.0731473655342364, - 0.04153202488293273, - null, - 0.0731473655342364, - 0.05477321631284726, - null, - 0.0731473655342364, - 0.1341994714416056, - null, - 0.0731473655342364, - 0.06013197669987258, - null, - 0.0731473655342364, - 0.040563128366188694, - null, - 0.4898861106787329, - 0.45431497833000367, - null, - 0.4898861106787329, - 0.5204579980957379, - null, - 0.4898861106787329, - 0.42052616285893474, - null, - 0.4898861106787329, - 0.4140065537970282, - null, - 0.4898861106787329, - 0.4107398412471005, - null, - 0.2695720924906413, - 0.24454670425362057, - null, - 0.2695720924906413, - 0.20002447568886628, - null, - 0.2695720924906413, - 0.2880647319459674, - null, - 0.2695720924906413, - 0.3202314429055858, - null, - 0.2695720924906413, - 0.3169605131706372, - null, - 0.2695720924906413, - 0.32345881810688737, - null, - 0.09533319097359638, - 0.20002447568886628, - null, - 0.09533319097359638, - 0.055897802218322856, - null, - 0.09533319097359638, - 0.04153202488293273, - null, - 0.09533319097359638, - 0.05477321631284726, - null, - 0.09533319097359638, - 0.1341994714416056, - null, - 0.09533319097359638, - 0.06013197669987258, - null, - 0.09533319097359638, - 0.040563128366188694, - null, - 0.9874110419208606, - 0.8867112408398291, - null, - 0.9874110419208606, - 0.9298960866412943, - null, - 0.9874110419208606, - 0.9078978130468089, - null, - 0.9874110419208606, - 0.9958360522915445, - null, - 0.9874110419208606, - 0.9513646744432486, - null, - 0.1333966979371528, - 0.2529891644068947, - null, - 0.1333966979371528, - 0.04149975738749545, - null, - 0.1333966979371528, - 0.16781555203357146, - null, - 0.1333966979371528, - 0.24102842320743, - null, - 0.1333966979371528, - 0.19048093242734687, - null, - 0.1333966979371528, - 0.1294716874165911, - null, - 0.2529891644068947, - 0.29119156039108685, - null, - 0.2529891644068947, - 0.24102842320743, - null, - 0.2529891644068947, - 0.19048093242734687, - null, - 0.45431497833000367, - 0.5204579980957379, - null, - 0.45431497833000367, - 0.42052616285893474, - null, - 0.45431497833000367, - 0.4107398412471005, - null, - 0.45431497833000367, - 0.3635517670405215, - null, - 0.45431497833000367, - 0.42203254876563234, - null, - 0.45431497833000367, - 0.5260776190209286, - null, - 0.24454670425362057, - 0.20002447568886628, - null, - 0.24454670425362057, - 0.2880647319459674, - null, - 0.24454670425362057, - 0.3202314429055858, - null, - 0.24454670425362057, - 0.22993075379681738, - null, - 0.24454670425362057, - 0.3169605131706372, - null, - 0.24454670425362057, - 0.32345881810688737, - null, - 0.20002447568886628, - 0.3202314429055858, - null, - 0.20002447568886628, - 0.1341994714416056, - null, - 0.20002447568886628, - 0.3169605131706372, - null, - 0.6267294109959968, - 0.5221172076712435, - null, - 0.6267294109959968, - 0.7205270186163313, - null, - 0.6267294109959968, - 0.5717872069066212, - null, - 0.6267294109959968, - 0.7302384542961842, - null, - 0.6267294109959968, - 0.6710484758334021, - null, - 0.6267294109959968, - 0.5492873750243871, - null, - 0.6267294109959968, - 0.6201266549140614, - null, - 0.6267294109959968, - 0.5752985482362863, - null, - 0.5221172076712435, - 0.41535454584101794, - null, - 0.5221172076712435, - 0.5717872069066212, - null, - 0.5221172076712435, - 0.5492873750243871, - null, - 0.5221172076712435, - 0.6201266549140614, - null, - 0.5221172076712435, - 0.4248880785102581, - null, - 0.6512622326935055, - 0.6217058876501556, - null, - 0.6512622326935055, - 0.6714278208298593, - null, - 0.3355480553373167, - 0.2660491488293679, - null, - 0.3355480553373167, - 0.249116699886752, - null, - 0.3355480553373167, - 0.28871122138225125, - null, - 0.3355480553373167, - 0.42203254876563234, - null, - 0.3355480553373167, - 0.2318219208408404, - null, - 0.4834545718278357, - 0.4847615611240751, - null, - 0.4834545718278357, - 0.4318165589087314, - null, - 0.4834545718278357, - 0.5097617399826666, - null, - 0.4847615611240751, - 0.4318165589087314, - null, - 0.4847615611240751, - 0.5097617399826666, - null, - 0.20619722773579274, - 0.3098874271134545, - null, - 0.20619722773579274, - 0.2880647319459674, - null, - 0.20619722773579274, - 0.24013807075121119, - null, - 0.20619722773579274, - 0.22993075379681738, - null, - 0.20619722773579274, - 0.09959517902538939, - null, - 0.9419075807648644, - 0.8848427298858184, - null, - 0.9419075807648644, - 0.9756800437762957, - null, - 0.3098874271134545, - 0.4295667428124167, - null, - 0.3098874271134545, - 0.35350564895305514, - null, - 0.3098874271134545, - 0.31541428705224306, - null, - 0.3098874271134545, - 0.2880647319459674, - null, - 0.3098874271134545, - 0.24013807075121119, - null, - 0.3098874271134545, - 0.2693681584998491, - null, - 0.3098874271134545, - 0.42641694849778966, - null, - 0.3098874271134545, - 0.3333136626479075, - null, - 0.3098874271134545, - 0.22993075379681738, - null, - 0.04149975738749545, - 0.019989772968585173, - null, - 0.04149975738749545, - 0.1294716874165911, - null, - 0.32266487999330984, - 0.31541428705224306, - null, - 0.32266487999330984, - 0.4318165589087314, - null, - 0.32266487999330984, - 0.2693681584998491, - null, - 0.32266487999330984, - 0.3340702546567942, - null, - 0.4295667428124167, - 0.35350564895305514, - null, - 0.4295667428124167, - 0.31541428705224306, - null, - 0.4295667428124167, - 0.4467311570808764, - null, - 0.4295667428124167, - 0.5144551437666581, - null, - 0.4295667428124167, - 0.4421375373865315, - null, - 0.4295667428124167, - 0.42641694849778966, - null, - 0.4295667428124167, - 0.3333136626479075, - null, - 0.4295667428124167, - 0.4868902788925622, - null, - 0.35350564895305514, - 0.31541428705224306, - null, - 0.35350564895305514, - 0.24013807075121119, - null, - 0.35350564895305514, - 0.2693681584998491, - null, - 0.35350564895305514, - 0.42641694849778966, - null, - 0.35350564895305514, - 0.3333136626479075, - null, - 0.15069304516745607, - 0.06016942899581168, - null, - 0.15069304516745607, - 0.24013807075121119, - null, - 0.15069304516745607, - 0.2693681584998491, - null, - 0.15069304516745607, - 0.10059463740220753, - null, - 0.15069304516745607, - 0.09959517902538939, - null, - 0.41535454584101794, - 0.40395348439090084, - null, - 0.41535454584101794, - 0.4248880785102581, - null, - 0.41535454584101794, - 0.29119156039108685, - null, - 0.8821215709600496, - 0.9328536520894143, - null, - 0.8821215709600496, - 0.9344432405222354, - null, - 0.8821215709600496, - 0.9642772106357639, - null, - 0.8821215709600496, - 0.8157570218353161, - null, - 0.8821215709600496, - 0.7925454632595156, - null, - 0.8821215709600496, - 0.888980486534156, - null, - 0.9542382277667263, - 0.9024846524956353, - null, - 0.9542382277667263, - 0.9961038345306213, - null, - 0.9542382277667263, - 0.9344432405222354, + "Amount: 1000.00", + "Amount: 38.50", + "Amount: 100.00", + "Amount: 20.00", + "Amount: 10.00", + "Amount: 102.70", + "Amount: 9.52", + "Amount: 50.00", + "Amount: 14.00", + "Amount: 446.57", + "Amount: 350.00", + "Amount: 43.50", + "Amount: 50.00", + "Amount: 19410.37", + "Amount: 3.00", + "Amount: 2.00", + "Amount: 458.43", + "Amount: 100.00", + "Amount: 427.17", + "Amount: 50.00", + "Amount: 100.00", + "Amount: 5.00", + "Amount: 7150.00", + "Amount: 20.00", + "Amount: 2000.00", + "Amount: 8.00", + "Amount: 750.00", + "Amount: 18.00", + "Amount: 42.00", + "Amount: 5.00", + "Amount: 75.00", + "Amount: 5.00", + "Amount: 14.00", + "Amount: 10.00", + "Amount: 5.00", + "Amount: 500.00", + "Amount: 5.00", + "Amount: 5.00", + "Amount: 52.56", + "Amount: 10.00", + "Amount: 19.00", + "Amount: 5.00", + "Amount: 300.00", + "Amount: 100.00", + "Amount: 73.19", + "Amount: 243.68", + "Amount: 100.00", + "Amount: 125.00", + "Amount: 1.19", + "Amount: 14.00", + "Amount: 100.00", + "Amount: 45.00", + "Amount: 20.00", + "Amount: 500.00", + "Amount: 100.00", + "Amount: 127.86", + "Amount: 15.00", + "Amount: 150.00", + "Amount: 5.00", + "Amount: 5.00", + "Amount: 400.00", + "Amount: 22.00", + "Amount: 51.93", + "Amount: 5.00", + "Amount: 5.00", + "Amount: 5.00", + "Amount: 15.00", + "Amount: 30.00", + "Amount: 5.00", + "Amount: 122.00", + "Amount: 3.00", + "Amount: 300.00", + "Amount: 100.00", + "Amount: 162.00", + "Amount: 19.08", + "Amount: 20.00", + "Amount: 30.37", + "Amount: 1000.00", + "Amount: 5.00", + "Amount: 250.00", + "Amount: 8.00", + "Amount: 13772.85", + "Amount: 420000.00", + "Amount: 9.90", + "Amount: 107.00", + "Amount: 2.00", + "Amount: 22.00", + "Amount: 25.00", + "Amount: 1504.28", + "Amount: 5.00", + "Amount: 252.00", + "Amount: 2642.04", + "Amount: 252.00", + "Amount: 5.00", + "Amount: 15.00", + "Amount: 3.00", + "Amount: 35.00", + "Amount: 65.00", + "Amount: 5.00", + "Amount: 75.00" + ], + "line": { + "color": "#888", + "width": 1.5 + }, + "marker": { + "angleref": "previous", + "color": "#888", + "size": 10, + "symbol": "arrow" + }, + "mode": "lines+markers", + "type": "scatter", + "x": [ + -0.43213011477334773, + -0.4430121181061702, null, - 0.9542382277667263, - 0.9642772106357639, + 0.5112616608477374, + 0.5931128851827875, null, - 0.9542382277667263, - 0.888980486534156, + -0.5362524214379699, + -0.6830386686787555, null, - 0.9542382277667263, - 0.9810704436128125, + 0.8321531242995657, + 0.7947955540041922, null, - 0.7205270186163313, - 0.7302384542961842, + -0.015339979027039215, + -0.004598212759833403, null, - 0.7205270186163313, - 0.8157570218353161, + -0.5242232381582058, + -0.7859456498474336, null, - 0.7205270186163313, - 0.7925454632595156, + -0.010396805586450043, + -0.004598212759833403, null, - 0.31541428705224306, - 0.24013807075121119, + -0.5907762774639415, + -0.8824105534014709, null, - 0.31541428705224306, - 0.2693681584998491, + 0.37340208125254337, + 0.42289489293422566, null, - 0.31541428705224306, - 0.3333136626479075, + -0.06531798460926314, + -0.06282488255576262, null, - 0.010366221042083845, - 0.10782775946098799, + 0.4571954695717908, + 0.5782995282255566, null, - 0.010366221042083845, - 0.03395115206665145, + 0.7251331716127464, + 0.8930310568108012, null, - 0.010366221042083845, - 0.13201947050262697, + 0.3440714981019444, + 0.42289489293422566, null, - 0.06016942899581168, - 0.055897802218322856, + 0.6452743136225527, + 0.8930310568108012, null, - 0.06016942899581168, - 0.10059463740220753, + -0.6833691066109641, + -0.922556143412663, null, - 0.06016942899581168, - 0.09959517902538939, + -0.4578754972216337, + -0.5260075373652568, null, - 0.8867112408398291, - 0.9298960866412943, + -0.13576410630761374, + -0.19017196191254732, null, - 0.8867112408398291, - 0.8599268392047722, + -0.7794963369787193, + -0.8284631501006486, null, - 0.8867112408398291, - 0.9078978130468089, + 0.05049348978287421, + 0.04533793523578743, null, - 0.8867112408398291, - 0.8508124987550889, + 0.4307114594735427, + 0.6211510564756442, null, - 0.8867112408398291, - 0.8842114977564064, + -0.488645870104004, + -0.5159370768528078, null, - 0.8867112408398291, - 0.9513646744432486, + 0.8299385473651612, + 0.8835075264311746, null, - 0.5204579980957379, - 0.42052616285893474, + 0.21235561702753328, + 0.22007339811741142, null, - 0.5204579980957379, - 0.4140065537970282, + -0.7317074047395691, + -0.922556143412663, null, - 0.5204579980957379, - 0.4107398412471005, + -0.35898258388050897, + -0.5260075373652568, null, - 0.5204579980957379, - 0.4937592635708411, + 0.3513819881725677, + 0.42289489293422566, null, - 0.4500538798110242, - 0.4140065537970282, + 0.6251699386269727, + 0.5931128851827875, null, - 0.4500538798110242, - 0.4467311570808764, + 0.41070323859290586, + 0.42289489293422566, null, - 0.4500538798110242, - 0.4421375373865315, + 0.5885337748775, + 0.7476884190896049, null, - 0.4500538798110242, - 0.4937592635708411, + -0.7442157911045258, + -0.8182264745850724, null, - 0.4500538798110242, - 0.5603277981830703, + -0.4240986484371276, + -0.5260075373652568, null, - 0.4500538798110242, - 0.547451424618544, + -0.7884885800275052, + -0.8182264745850724, null, - 0.40395348439090084, - 0.3340702546567942, + 0.41998910604831713, + 0.42289489293422566, null, - 0.40395348439090084, - 0.4248880785102581, + -0.8304528603225746, + -0.922556143412663, null, - 0.5717872069066212, - 0.6710484758334021, + 0.9329149222041224, + 0.8835075264311746, null, - 0.5717872069066212, - 0.5492873750243871, + 0.12267587639275908, + 0.15152247306622144, null, - 0.5717872069066212, - 0.6201266549140614, + 0.7743223692717235, + 0.8835075264311746, null, - 0.42052616285893474, - 0.4140065537970282, + -0.020367479302382467, + -0.004598212759833403, null, - 0.42052616285893474, - 0.4107398412471005, + 0.5525550860920077, + 0.6211510564756442, null, - 0.42052616285893474, - 0.3635517670405215, + -0.7341525511916877, + -0.922556143412663, null, - 0.2660491488293679, - 0.249116699886752, + 0.3943452039362869, + 0.42289489293422566, null, - 0.2660491488293679, - 0.23700988477155205, + -0.697118996520046, + -0.922556143412663, null, - 0.2660491488293679, - 0.28871122138225125, + 0.3729152346875802, + 0.45108517908588003, null, - 0.2660491488293679, - 0.2002886163837997, + 0.44882023012427213, + 0.6211510564756442, null, - 0.2660491488293679, - 0.29050814087118004, + -0.522022411657337, + -0.5159370768528078, null, - 0.2660491488293679, - 0.2318219208408404, + -0.09362722072652985, + -0.12627985133706823, null, - 0.2660491488293679, - 0.20307680326083377, + 0.5297743915831321, + 0.6211510564756442, null, - 0.10782775946098799, - 0.03395115206665145, + 0.3733883300104818, + 0.42289489293422566, null, - 0.10782775946098799, - 0.2002886163837997, + 0.2098519168108027, + -0.004598212759833403, null, - 0.10782775946098799, - 0.13201947050262697, + 0.2098519168108027, + 0.42289489293422566, null, - 0.10782775946098799, - 0.20307680326083377, + -0.3787781527763615, + -0.41621756255078585, null, - 0.7302384542961842, - 0.6710484758334021, + 0.8894556041854287, + 0.9294865179016704, null, - 0.7302384542961842, - 0.6201266549140614, + -0.798347214605227, + -0.8824105534014709, null, - 0.8520196094107113, - 0.8848427298858184, + -0.18131224898913595, + -0.1595247701666436, null, - 0.8520196094107113, - 0.9435179236599912, + 0.6522974110153149, + 0.8567967077274671, null, - 0.8520196094107113, - 0.9756800437762957, + -0.7026192767091103, + -0.7884728651042877, null, - 0.4140065537970282, - 0.3202314429055858, + -0.8276350144938375, + -0.922556143412663, null, - 0.4140065537970282, - 0.4107398412471005, + -0.6098376430856963, + -0.5862824632127743, null, - 0.4140065537970282, - 0.3635517670405215, + 0.6554230284551037, + 0.8835075264311746, null, - 0.4140065537970282, - 0.4937592635708411, + 0.8922189766627708, + 0.8835075264311746, null, - 0.4140065537970282, - 0.3169605131706372, + 0.4295097745598557, + 0.45108517908588003, null, - 0.4140065537970282, - 0.32345881810688737, + 0.43460925643764853, + 0.42289489293422566, null, - 0.4467311570808764, - 0.5144551437666581, + -0.3980280117268984, + -0.5260075373652568, null, - 0.4467311570808764, - 0.4421375373865315, + 0.7024852559248044, + 0.8835075264311746, null, - 0.4467311570808764, - 0.42641694849778966, + 0.7717529582442381, + 0.8835075264311746, null, - 0.4467311570808764, - 0.4868902788925622, + -0.6806600992316747, + -0.922556143412663, null, - 0.5144551437666581, - 0.4421375373865315, + -0.926723528147117, + -0.922556143412663, null, - 0.5144551437666581, - 0.42641694849778966, + -0.6740662992025501, + -0.922556143412663, null, - 0.5144551437666581, - 0.6014235590484225, + -0.645856740142745, + -0.8182264745850724, null, - 0.5144551437666581, - 0.5603277981830703, + -0.5177228561621657, + -0.7617659088160793, null, - 0.5144551437666581, - 0.4868902788925622, + -0.7442137071319165, + -0.8824105534014709, null, - 0.7454337953380579, - 0.7077207700167599, + -0.4309900961374921, + -0.5260075373652568, null, - 0.7454337953380579, - 0.8599268392047722, + 0.7245290699084046, + 0.7866931209891337, null, - 0.7454337953380579, - 0.7005910562446783, + -0.46411496857079576, + -0.5260075373652568, null, - 0.03395115206665145, - 0.05477321631284726, + 0.3232896688907876, + 0.42289489293422566, null, - 0.7077207700167599, - 0.7005910562446783, + 0.37115926386562975, + 0.42289489293422566, null, - 0.9024846524956353, - 0.9961038345306213, + 0.8144104230201399, + 0.8482266969909324, null, - 0.9024846524956353, - 0.9344432405222354, + -0.6862355564324931, + -0.8824105534014709, null, - 0.9024846524956353, - 0.888980486534156, + 0.8143822305059775, + 0.8835075264311746, null, - 0.9024846524956353, - 0.9810704436128125, + 0.1952194444171441, + 0.2613197935543201, null, - 0.055897802218322856, - 0.04153202488293273, + -0.44116587580288175, + -0.5260075373652568, null, - 0.055897802218322856, - 0.06013197669987258, + 0.34219400777112563, + 0.42289489293422566, null, - 0.055897802218322856, - 0.040563128366188694, + 0.3482854537227453, + 0.3895535076931305, null, - 0.055897802218322856, - 0.09959517902538939, + -0.7845181509980911, + -0.8824105534014709, null, - 0.2880647319459674, - 0.3202314429055858, + -0.010628018143674797, + -0.004598212759833403, null, - 0.2880647319459674, - 0.22993075379681738, + -0.333303022046739, + -0.5159370768528078, null, - 0.2880647319459674, - 0.3169605131706372, + 0.391453184513052, + 0.42289489293422566, null, - 0.2880647319459674, - 0.32345881810688737, + -0.8187977817844195, + -0.8182264745850724, null, - 0.9328536520894143, - 0.9078978130468089, + 0.675110539921739, + 0.8930310568108012, null, - 0.9328536520894143, - 0.8508124987550889, + -0.3990251391372163, + -0.5260075373652568, null, - 0.9298960866412943, - 0.8599268392047722, + -0.30002656361791447, + -0.30032745656510185, null, - 0.9298960866412943, - 0.9958360522915445, + 0.32580390247949387, + 0.42289489293422566, null, - 0.9298960866412943, - 0.8842114977564064, + -0.41032900004231715, + -0.5260075373652568, null, - 0.9298960866412943, - 0.9513646744432486, + 0.7814157333397895, + 0.8835075264311746, null, - 0.6352288779182178, - 0.5981086798045652, + -0.6545012668193522, + -0.8182264745850724, null, - 0.6352288779182178, - 0.6648266103848882, + -0.8250766319170834, + -0.922556143412663, null, - 0.6352288779182178, - 0.6072525121642058, + 0.11642140741252306, + 0.15152247306622144, null, - 0.04153202488293273, - 0.05477321631284726, + 0.3584413729045867, + 0.42289489293422566, null, - 0.04153202488293273, - 0.1341994714416056, + 0.6893479879923822, + 0.8835075264311746, null, - 0.04153202488293273, - 0.06013197669987258, + -0.5817258086810362, + -0.6830386686787555, + null + ], + "y": [ + 0.7121785088398352, + 0.6637386367247285, null, - 0.04153202488293273, - 0.040563128366188694, + -0.598438979460561, + -0.6680444571236058, null, - 0.7834166246251234, - 0.7925454632595156, + 0.44361523531892444, + 0.5765261392732328, null, - 0.7834166246251234, - 0.8508124987550889, + 0.26080967071708444, + 0.24096872716900972, null, - 0.7834166246251234, - 0.6714278208298593, + -0.7089068308054137, + -0.9755872442336094, null, - 0.6710484758334021, - 0.5492873750243871, + -0.34274934403468454, + -0.5420785313722902, null, - 0.6710484758334021, - 0.6201266549140614, + -0.7621228818670577, + -0.9755872442336094, null, - 0.3202314429055858, - 0.3169605131706372, + 0.2648966145363047, + 0.403612631630065, null, - 0.3202314429055858, - 0.32345881810688737, + 0.6789811252229511, + 0.7959212776137778, null, - 0.9961038345306213, - 0.9344432405222354, + 0.7900197865139884, + 0.8310972903269801, null, - 0.9961038345306213, - 0.9642772106357639, + -0.6713224168822408, + -0.8317527771805896, null, - 0.9961038345306213, - 0.888980486534156, + -0.21408032557683887, + -0.28978736522770937, null, - 0.9961038345306213, - 0.9810704436128125, + 0.604772500031668, + 0.7959212776137778, null, - 0.4107398412471005, - 0.3635517670405215, + -0.1954793343876051, + -0.28978736522770937, null, - 0.4107398412471005, - 0.42203254876563234, + -0.1310109485870865, + -0.23208476462159833, null, - 0.4107398412471005, - 0.29050814087118004, + 0.6489829876156022, + 0.7932680240853172, null, - 0.24013807075121119, - 0.2693681584998491, + 0.6211459206982282, + 0.8677949363592646, null, - 0.24013807075121119, - 0.3333136626479075, + -0.2060018213633483, + -0.2001301912924086, null, - 0.8599268392047722, - 0.8842114977564064, + 0.6598165306544911, + 0.7693710498570913, null, - 0.4318165589087314, - 0.3340702546567942, + 0.5144371164893282, + 0.7073620048724625, null, - 0.4318165589087314, - 0.5097617399826666, + -0.8104899180559856, + -0.8622970096309992, null, - 0.2693681584998491, - 0.3333136626479075, + -0.06816718399097474, + -0.027959167306021424, null, - 0.4421375373865315, - 0.42641694849778966, + 0.7449128610002976, + 0.8604966990942203, null, - 0.4421375373865315, - 0.4868902788925622, + -0.1689229441285857, + -0.23208476462159833, null, - 0.5492873750243871, - 0.6201266549140614, + 0.5112080095793095, + 0.7932680240853172, null, - 0.5492873750243871, - 0.5752985482362863, + 0.5807404071548778, + 0.7959212776137778, null, - 0.5981086798045652, - 0.6072525121642058, + -0.6965363437404857, + -0.6680444571236058, null, - 0.5981086798045652, - 0.5260776190209286, + 0.6849817062815453, + 0.7959212776137778, null, - 0.3635517670405215, - 0.42203254876563234, + -0.35224437514754586, + -0.44360886803933014, null, - 0.3635517670405215, - 0.29050814087118004, + 0.09593694912577341, + 0.08889623846074263, null, - 0.42641694849778966, - 0.3333136626479075, + 0.6029760119136741, + 0.7932680240853172, null, - 0.42641694849778966, - 0.4868902788925622, + 0.0924254061247565, + 0.08889623846074263, null, - 0.6648266103848882, - 0.6072525121642058, + 0.7455745376985553, + 0.7959212776137778, null, - 0.9344432405222354, - 0.9642772106357639, + -0.21470076141573366, + -0.23208476462159833, null, - 0.9344432405222354, - 0.8157570218353161, + -0.02976484897864857, + -0.027959167306021424, null, - 0.9344432405222354, - 0.888980486534156, + -0.7796703040360509, + -0.9657058443610594, null, - 0.9344432405222354, - 0.9810704436128125, + -0.06769339318848107, + -0.027959167306021424, null, - 0.249116699886752, - 0.23700988477155205, + -0.7307241565679895, + -0.9755872442336094, null, - 0.249116699886752, - 0.28871122138225125, + 0.6450827404437204, + 0.7073620048724625, null, - 0.249116699886752, - 0.2002886163837997, + -0.15363835146843016, + -0.23208476462159833, null, - 0.249116699886752, - 0.29050814087118004, + 0.6724237806357076, + 0.7959212776137778, null, - 0.249116699886752, - 0.2318219208408404, + -0.15963946240330748, + -0.23208476462159833, null, - 0.249116699886752, - 0.20307680326083377, + -0.6981965728205204, + -0.8219907437087358, null, - 0.6201266549140614, - 0.5752985482362863, + 0.5099911479349106, + 0.7073620048724625, null, - 0.16781555203357146, - 0.19048093242734687, + -0.8213284146465071, + -0.8622970096309992, null, - 0.16781555203357146, - 0.1294716874165911, + -0.7638667955160672, + -1, null, - 0.4937592635708411, - 0.5603277981830703, + 0.6051504434721513, + 0.7073620048724625, null, - 0.4937592635708411, - 0.547451424618544, + 0.630517583672798, + 0.7959212776137778, null, - 0.9435179236599912, - 0.9958360522915445, + -0.08910955067197081, + -0.9755872442336094, null, - 0.9435179236599912, - 0.9756800437762957, + -0.08910955067197081, + 0.7959212776137778, null, - 0.07011604000159166, - 0.019989772968585173, + -0.7157507162452663, + -0.7993949320290974, null, - 0.07011604000159166, - 0.10059463740220753, + 0.21748807668373418, + 0.23472763490409848, null, - 0.07011604000159166, - 0.038844634468288675, + 0.3744351904237455, + 0.403612631630065, null, - 0.9078978130468089, - 0.8508124987550889, + -0.912907039528394, + -0.9377070802046585, null, - 0.9078978130468089, - 0.9513646744432486, + 0.2987504763255712, + 0.394186370625655, null, - 0.6072525121642058, - 0.5260776190209286, + -0.3919634530446739, + -0.44844761451575715, null, - 0.23700988477155205, - 0.28871122138225125, + -0.18103128274552913, + -0.23208476462159833, null, - 0.23700988477155205, - 0.2002886163837997, + -0.6480839567003398, + -0.6714013657386378, null, - 0.23700988477155205, - 0.29050814087118004, + -0.05639446704405653, + -0.027959167306021424, null, - 0.23700988477155205, - 0.13201947050262697, + -0.06884618548241157, + -0.027959167306021424, null, - 0.23700988477155205, - 0.2318219208408404, + -0.7884482829492515, + -0.8219907437087358, null, - 0.23700988477155205, - 0.20307680326083377, + 0.7254199795788893, + 0.7959212776137778, null, - 0.05477321631284726, - 0.1341994714416056, + 0.5991531652056148, + 0.7932680240853172, null, - 0.05477321631284726, - 0.06013197669987258, + -0.06419545984665424, + -0.027959167306021424, null, - 0.05477321631284726, - 0.040563128366188694, + -0.03388402641622064, + -0.027959167306021424, null, - 0.9642772106357639, - 0.888980486534156, + -0.1428808457598657, + -0.23208476462159833, null, - 0.019989772968585173, - 0.1294716874165911, + -0.19435412457565315, + -0.23208476462159833, null, - 0.019989772968585173, - 0.038844634468288675, + -0.1603371299138783, + -0.23208476462159833, null, - 0.29119156039108685, - 0.24102842320743, + 0.08169793780859752, + 0.08889623846074263, null, - 0.29119156039108685, - 0.19048093242734687, + 0.39067339539297724, + 0.5799030308386766, null, - 0.6217058876501556, - 0.6714278208298593, + 0.345012671198623, + 0.403612631630065, null, - 0.1341994714416056, - 0.06013197669987258, + 0.6678716426804834, + 0.7932680240853172, null, - 0.1341994714416056, - 0.040563128366188694, + -0.5318696248666036, + -0.5727295276261749, null, - 0.28871122138225125, - 0.2002886163837997, + 0.6775596287803459, + 0.7932680240853172, null, - 0.28871122138225125, - 0.2318219208408404, + 0.5304054329523671, + 0.7959212776137778, null, - 0.28871122138225125, - 0.20307680326083377, + 0.7125808229017521, + 0.7959212776137778, null, - 0.06013197669987258, - 0.040563128366188694, + 0.5152301783287565, + 0.5153009464739415, null, - 0.5752985482362863, - 0.5097617399826666, + 0.32033499347523814, + 0.403612631630065, null, - 0.10059463740220753, - 0.09959517902538939, + -0.04159208903692613, + -0.027959167306021424, null, - 0.10059463740220753, - 0.038844634468288675, + -0.7188816814442675, + -0.9964621174020154, null, - 0.8157570218353161, - 0.7925454632595156, + 0.6293531161898335, + 0.7932680240853172, null, - 0.8157570218353161, - 0.888980486534156, + 0.5575985531739881, + 0.7959212776137778, null, - 0.42203254876563234, - 0.5260776190209286, + -0.8363676412114709, + -0.9280481286500764, null, - 0.2002886163837997, - 0.13201947050262697, + 0.3550572121642179, + 0.403612631630065, null, - 0.2002886163837997, - 0.2318219208408404, + -0.8792824988230634, + -0.9755872442336094, null, - 0.2002886163837997, - 0.20307680326083377, + -0.5662007883069198, + -0.8622970096309992, null, - 0.8622415881936324, - 0.8350595230795331, + 0.7030652464929427, + 0.7959212776137778, null, - 0.3169605131706372, - 0.29050814087118004, + 0.12658592510635783, + 0.08889623846074263, null, - 0.3169605131706372, - 0.32345881810688737, + -0.20166127879656748, + -0.28978736522770937, null, - 0.6014235590484225, - 0.5603277981830703, + 0.5570923883380997, + 0.7932680240853172, null, - 0.6014235590484225, - 0.4868902788925622, + -0.8222108886920065, + -0.7885877762376592, null, - 0.9958360522915445, - 0.8842114977564064, + 0.5627700325736714, + 0.7959212776137778, null, - 0.24102842320743, - 0.19048093242734687, + 0.6028638927072018, + 0.7932680240853172, null, - 0.19048093242734687, - 0.1294716874165911, + -0.05023816831269756, + -0.027959167306021424, null, - 0.8508124987550889, - 0.9513646744432486, + 0.09509796558003482, + 0.08889623846074263, null, - 0.13201947050262697, - 0.2318219208408404, + -0.165232208286361, + -0.23208476462159833, null, - 0.13201947050262697, - 0.20307680326083377, + -0.7309343925864511, + -0.9657058443610594, null, - 0.2318219208408404, - 0.20307680326083377, + 0.621621947321043, + 0.7959212776137778, null, - 0.888980486534156, - 0.9810704436128125, + -0.052931911634106425, + -0.027959167306021424, null, - 0.5603277981830703, - 0.547451424618544, + 0.48262281712395333, + 0.5765261392732328, null ] }, @@ -9521,215 +2286,143 @@ "hoverinfo": "text", "marker": { "color": [ - 11, - 14, - 7, - 10, - 7, - 10, - 3, - 14, - 9, - 8, - 9, - 6, - 6, - 9, - 15, - 13, - 15, - 10, - 2, - 13, - 9, - 2, - 9, - 9, - 9, - 6, - 15, - 11, - 9, - 6, - 6, - 13, - 13, - 12, - 12, - 10, - 13, - 14, - 10, - 7, - 12, - 8, - 8, - 12, - 7, - 11, - 3, - 6, - 11, - 9, - 4, - 10, - 17, - 1, - 10, - 16, - 10, - 10, - 7, - 13, - 5, - 13, - 10, - 16, - 8, - 13, - 18, - 8, - 7, - 12, - 14, - 16, - 15, - 13, - 10, - 14, - 15, - 7, - 7, - 7, - 10, - 17, - 12, - 10, - 8, - 3, - 10, - 8, - 8, - 10, - 2, - 18, - 4, - 10, - 16, - 13, - 7, - 7, - 13, - 8, - 5, - 12, - 5, - 6, - 9, - 11, - 9, - 8, - 7, - 9, - 16, - 10, - 5, - 4, - 12, - 9, - 9, - 4, - 6, - 3, - 6, - 11, - 13, - 10, - 9, - 11, - 11, - 6, - 6, - 12, - 7, - 10, - 10, - 6, - 9, - 12, - 7, - 9, - 8, - 9, - 11, - 13, - 12, - 3, - 8, - 12, - 17, - 9, - 3, - 6, - 7, - 4, - 4, - 8, - 12, - 17, - 11, - 10, - 5, - 9, - 4, - 14, - 13, - 12, - 9, - 6, - 6, - 8, - 11, - 8, - 12, - 3, - 13, - 4, - 6, - 8, - 3, - 7, - 7, - 3, - 12, - 9, - 4, - 4, - 11, - 8, - 7, - 10, - 9, - 15, - 11, - 7, - 5, - 6, - 10, - 4, - 3, - 12, - 12, - 5 + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green", + "green" ], - "colorbar": { - "thickness": 15, - "title": { - "side": "right", - "text": "Node Connections" - }, - "xanchor": "left" - }, "colorscale": [ [ 0, @@ -9768,634 +2461,428 @@ "rgb(8,29,88)" ] ], - "line": { - "width": 2 - }, - "reversescale": true, "showscale": true, "size": 10 }, "mode": "markers", "text": [ - "# of connections: 11", - "# of connections: 14", - "# of connections: 7", - "# of connections: 10", - "# of connections: 7", - "# of connections: 10", - "# of connections: 3", - "# of connections: 14", - "# of connections: 9", - "# of connections: 8", - "# of connections: 9", - "# of connections: 6", - "# of connections: 6", - "# of connections: 9", - "# of connections: 15", - "# of connections: 13", - "# of connections: 15", - "# of connections: 10", - "# of connections: 2", - "# of connections: 13", - "# of connections: 9", - "# of connections: 2", - "# of connections: 9", - "# of connections: 9", - "# of connections: 9", - "# of connections: 6", - "# of connections: 15", - "# of connections: 11", - "# of connections: 9", - "# of connections: 6", - "# of connections: 6", - "# of connections: 13", - "# of connections: 13", - "# of connections: 12", - "# of connections: 12", - "# of connections: 10", - "# of connections: 13", - "# of connections: 14", - "# of connections: 10", - "# of connections: 7", - "# of connections: 12", - "# of connections: 8", - "# of connections: 8", - "# of connections: 12", - "# of connections: 7", - "# of connections: 11", - "# of connections: 3", - "# of connections: 6", - "# of connections: 11", - "# of connections: 9", - "# of connections: 4", - "# of connections: 10", - "# of connections: 17", - "# of connections: 1", - "# of connections: 10", - "# of connections: 16", - "# of connections: 10", - "# of connections: 10", - "# of connections: 7", - "# of connections: 13", - "# of connections: 5", - "# of connections: 13", - "# of connections: 10", - "# of connections: 16", - "# of connections: 8", - "# of connections: 13", - "# of connections: 18", - "# of connections: 8", - "# of connections: 7", - "# of connections: 12", - "# of connections: 14", - "# of connections: 16", - "# of connections: 15", - "# of connections: 13", - "# of connections: 10", - "# of connections: 14", - "# of connections: 15", - "# of connections: 7", - "# of connections: 7", - "# of connections: 7", - "# of connections: 10", - "# of connections: 17", - "# of connections: 12", - "# of connections: 10", - "# of connections: 8", - "# of connections: 3", - "# of connections: 10", - "# of connections: 8", - "# of connections: 8", - "# of connections: 10", - "# of connections: 2", - "# of connections: 18", - "# of connections: 4", - "# of connections: 10", - "# of connections: 16", - "# of connections: 13", - "# of connections: 7", - "# of connections: 7", - "# of connections: 13", - "# of connections: 8", - "# of connections: 5", - "# of connections: 12", - "# of connections: 5", - "# of connections: 6", - "# of connections: 9", - "# of connections: 11", - "# of connections: 9", - "# of connections: 8", - "# of connections: 7", - "# of connections: 9", - "# of connections: 16", - "# of connections: 10", - "# of connections: 5", - "# of connections: 4", - "# of connections: 12", - "# of connections: 9", - "# of connections: 9", - "# of connections: 4", - "# of connections: 6", - "# of connections: 3", - "# of connections: 6", - "# of connections: 11", - "# of connections: 13", - "# of connections: 10", - "# of connections: 9", - "# of connections: 11", - "# of connections: 11", - "# of connections: 6", - "# of connections: 6", - "# of connections: 12", - "# of connections: 7", - "# of connections: 10", - "# of connections: 10", - "# of connections: 6", - "# of connections: 9", - "# of connections: 12", - "# of connections: 7", - "# of connections: 9", - "# of connections: 8", - "# of connections: 9", - "# of connections: 11", - "# of connections: 13", - "# of connections: 12", - "# of connections: 3", - "# of connections: 8", - "# of connections: 12", - "# of connections: 17", - "# of connections: 9", - "# of connections: 3", - "# of connections: 6", - "# of connections: 7", - "# of connections: 4", - "# of connections: 4", - "# of connections: 8", - "# of connections: 12", - "# of connections: 17", - "# of connections: 11", - "# of connections: 10", - "# of connections: 5", - "# of connections: 9", - "# of connections: 4", - "# of connections: 14", - "# of connections: 13", - "# of connections: 12", - "# of connections: 9", - "# of connections: 6", - "# of connections: 6", - "# of connections: 8", - "# of connections: 11", - "# of connections: 8", - "# of connections: 12", - "# of connections: 3", - "# of connections: 13", - "# of connections: 4", - "# of connections: 6", - "# of connections: 8", - "# of connections: 3", - "# of connections: 7", - "# of connections: 7", - "# of connections: 3", - "# of connections: 12", - "# of connections: 9", - "# of connections: 4", - "# of connections: 4", - "# of connections: 11", - "# of connections: 8", - "# of connections: 7", - "# of connections: 10", - "# of connections: 9", - "# of connections: 15", - "# of connections: 11", - "# of connections: 7", - "# of connections: 5", - "# of connections: 6", - "# of connections: 10", - "# of connections: 4", - "# of connections: 3", - "# of connections: 12", - "# of connections: 12", - "# of connections: 5" + "Name: mike macdonald for senate
classification: neutral
donor_id: 76a5bf29-5b5c-4313-8d25-76d147183275
entity_type: corporation
full_name: mike macdonald for senate
recipient_id: 5982c37b-08f0-4bfe-84ef-fe8a5d163937
recipient_name: michigan petroleum association political action committee
state: MI
", + "Name: michigan petroleum association political action committee
classification: neutral
", + "Name: douglas harris
address: 12601 MINER ROAD
city: PARMA
classification: neutral
company: retired
donor_id: 2bed980b-c5df-4c3f-b242-bb5f6f5891d5
entity_type: Individual
first_name: DOUGLAS
full_name: douglas harris
last_name: HARRIS
occupation: not employed
recipient_id: 9f82ffff-0906-4554-a3c4-f23d22da925d
recipient_name: plumbers and steamfitters local 190 pac fund
state: MI
zip: 49269-9613
", + "Name: plumbers and steamfitters local 190 pac fund
classification: neutral
", + "Name: manny lentine
address: 230 NORTH WASHINGTON SQUARE SUITE 100
city: LANSING
classification: neutral
company: lentine & associates
donor_id: 091ac544-c755-4189-b6b4-690bbf3aab9c
entity_type: Individual
first_name: MANNY
full_name: manny lentine
last_name: LENTINE
occupation: self-employed
recipient_id: cf320278-7c53-4ae3-87d5-8b8382acda89
recipient_name: steve johnson for state rep
state: MI
zip: 48933-0000
", + "Name: steve johnson for state rep
classification: neutral
", + "Name: arizona secretary of state
classification: neutral
donor_id: 904ad1f0-8cf9-492d-b04c-08a2c749b147
entity_type: vendor
full_name: arizona secretary of state
recipient_id: 5b4de071-973d-4b43-97d4-598da37538ef
recipient_name: tucson firefighters local #479 fire pac
", + "Name: tucson firefighters local #479 fire pac
classification: neutral
", + "Name: erik schulwolf
address: 34 BONNY VIEW RD
city: WEST HARTFORD
classification: neutral
donor_id: 095db171-e7b9-4c63-9fec-e503a488eea6
entity_type: Individual
first_name: ERIK
full_name: erik schulwolf
last_name: SCHULWOLF
recipient_id: 4b5c27d8-f1bf-4ff6-b717-d67025ab2a1b
recipient_name: committee to elect maurice imhoff
state: CT
zip: 06107-3401
", + "Name: committee to elect maurice imhoff
classification: neutral
", + "Name: wonderwear/aveva
classification: neutral
donor_id: e8126d99-dd7a-4f36-99e0-bb2ed18f1ecd
entity_type: corporation
full_name: wonderwear/aveva
recipient_id: e3294ecb-f6df-48a0-b3b4-7048a9c650a7
recipient_name: michael detmer for state senate
state: MI
", + "Name: michael detmer for state senate
classification: neutral
", + "Name: mark lewis
address: 11 HIGHLAND AVE
city: REDDING
classification: neutral
donor_id: d64afe41-a308-4fc1-b88d-6e963b0f3e10
entity_type: Individual
first_name: MARK
full_name: mark lewis
last_name: LEWIS
recipient_id: 4b5c27d8-f1bf-4ff6-b717-d67025ab2a1b
recipient_name: committee to elect maurice imhoff
state: CT
zip: 06896-0000
", + "Name: edwin mcilvried
address: 3 FROG POND DR
city: GLEN ARBOR
classification: neutral
donor_id: 5b9e3f4e-cda1-49fb-99db-dac2fc050bd9
entity_type: Individual
first_name: EDWIN
full_name: edwin mcilvried
last_name: MCILVRIED
recipient_id: 9a96a76f-8b26-4db7-be95-b14987373991
recipient_name: committee to elect betsy coffia
state: MI
zip: 49636-0000
", + "Name: committee to elect betsy coffia
classification: neutral
", + "Name: jeanette roper
address: 315 W 70TH ST APT 5
city: NEW YORK
classification: neutral
donor_id: c20be49d-0bd3-4965-a2ba-cc73d147e566
entity_type: Individual
first_name: JEANETTE
full_name: jeanette roper
last_name: ROPER
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: NY
zip: 10023-3504
", + "Name: reproductive freedom for all
classification: neutral
", + "Name: scale to win
classification: neutral
donor_id: 4dc1a60d-c371-4699-adbd-6eaefad3301e
entity_type: corporation
full_name: scale to win
recipient_id: 89c7b2c1-abe8-4b59-98c2-c7b580b45a60
recipient_name: friends of james sklar
state: MI
", + "Name: friends of james sklar
classification: neutral
", + "Name: roberta cramer
address: 318 S.2ND ST
city: GRAND HAVEN
classification: neutral
donor_id: b4611504-1f85-4d50-ac6e-5f4ab87a5632
entity_type: Individual
first_name: ROBERTA
full_name: roberta cramer
last_name: CRAMER
recipient_id: 8072345f-9b00-47fc-be6c-66758ba6e5d5
recipient_name: christine baker
state: MI
zip: 49417-0000
", + "Name: christine baker
classification: neutral
", + "Name: la placita express
classification: neutral
donor_id: dc7b145f-e322-4f20-ac17-2a96a6ee5673
entity_type: vendor
full_name: la placita express
recipient_id: 349703c0-a6d9-45a1-8491-b7f9ba0d287d
recipient_name: unite here arizona
", + "Name: unite here arizona
classification: neutral
", + "Name: suzette sanders
address: 3632 WILLOWICK DRIVE
city: VENTURA
classification: neutral
donor_id: 8d0a34c2-fec8-443d-9bc1-267a653408aa
entity_type: Individual
first_name: SUZETTE
full_name: suzette sanders
last_name: SANDERS
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: CA
zip: 93003-0000
", + "Name: case action fund
classification: neutral
donor_id: abf0476c-1598-4290-8719-d36bfa4de87c
entity_type: vendor
full_name: case action fund
recipient_id: 349703c0-a6d9-45a1-8491-b7f9ba0d287d
recipient_name: unite here arizona
", + "Name: ronald smith
address: 4895 HELENA RD N
city: SAINT PAUL
classification: neutral
donor_id: 71f02d97-4f75-4b61-be52-43f42b6a205a
entity_type: Individual
first_name: RONALD
full_name: ronald smith
last_name: SMITH
recipient_id: c00726af-3b4b-46c6-88df-8c62dfbe4733
recipient_name: progressive turnout project
state: MN
zip: 55128-8202
", + "Name: progressive turnout project
classification: neutral
", + "Name: christopher johnson
address: 8604 DARBEE RD
city: REESE
classification: neutral
donor_id: d33ce2a8-fd78-4f08-add3-6526d858383c
entity_type: Individual
first_name: CHRISTOPHER
full_name: christopher johnson
last_name: JOHNSON
recipient_id: b3084657-ebf9-44db-8f15-1da48eaaa2d9
recipient_name: united food and commercial workers active ballot club
state: MI
zip: 48757-0000
", + "Name: united food and commercial workers active ballot club
classification: neutral
", + "Name: tmobile
classification: neutral
donor_id: f1a7362b-f009-4a4c-aba9-4ec1b107902d
entity_type: vendor
full_name: tmobile
recipient_id: 77a286de-0d6c-4e00-a293-b7357d82f3c5
recipient_name: cochise county democratic committee
", + "Name: cochise county democratic committee
classification: neutral
", + "Name: owosso knights of columbus
classification: neutral
donor_id: b70d0c69-9df1-43db-b48c-274c27ff43b7
entity_type: corporation
full_name: owosso knights of columbus
recipient_id: 154ba5d3-e21d-41af-9e8b-c8a81ed3b270
recipient_name: brian begole for state rep
state: MI
", + "Name: brian begole for state rep
classification: neutral
", + "Name: vibe ink
classification: neutral
donor_id: 9c3bd8ce-2032-4cac-b25d-d0e70982949f
entity_type: corporation
full_name: vibe ink
recipient_id: 4a1bcd84-e553-4e6a-afe6-ff386a1b0257
recipient_name: ernest little for state rep
state: MI
", + "Name: ernest little for state rep
classification: neutral
", + "Name: beutler frederick
classification: neutral
donor_id: 554ab63a-812c-4c61-8a28-21d795889b66
entity_type: corporation
full_name: beutler frederick
recipient_id: 501217db-524f-4534-848e-78b9afe68961
recipient_name: voters action committee (superpac)
state: MI
", + "Name: voters action committee (superpac)
classification: neutral
", + "Name: lorraine lerner
address: 7118 SUNCREST RD
city: WEST BLOOMFIELD
classification: neutral
donor_id: 135aac23-535d-44fd-ae45-e99493a37df9
entity_type: Individual
first_name: LORRAINE
full_name: lorraine lerner
last_name: LERNER
recipient_id: 97b5db6e-a1b8-4013-8304-df0009d1a1b0
recipient_name: noah arbit for michigan
state: MI
zip: 48322-4340
", + "Name: noah arbit for michigan
classification: neutral
", + "Name: michael kotts
address: PO BOX 995
city: ROSCOMMON
classification: neutral
donor_id: 076bcb51-e328-462e-b58c-690c742255c3
entity_type: Individual
first_name: MICHAEL
full_name: michael kotts
last_name: KOTTS
recipient_id: 9056a6ee-a211-425a-9ea4-4203d9ec8276
recipient_name: michigan farm bureau political action committee
state: MI
zip: 48653-0995
", + "Name: michigan farm bureau political action committee
classification: neutral
", + "Name: j.c. huizenga
address: 3755 36TH STREET SE SUITE 100
city: GRAND RAPIDS
classification: neutral
company: huzinga group
donor_id: 09edd2a7-3653-4c64-b967-f16dca6383c5
entity_type: Individual
first_name: J.C.
full_name: j.c. huizenga
last_name: HUIZENGA
occupation: executive
recipient_id: 6a18b3b8-b810-4a49-ac9b-db89ea23fa2a
recipient_name: tom leonard for michigan
state: MI
zip: 49512-0000
", + "Name: tom leonard for michigan
classification: neutral
", + "Name: bittermann laura
address: 127 HILLSWOOD DR
city: FOLSOM
classification: neutral
donor_id: 7e5a60a4-829b-4851-a17c-bde180321158
entity_type: Individual
first_name: BITTERMANN
full_name: bittermann laura
last_name: LAURA
recipient_id: c00726af-3b4b-46c6-88df-8c62dfbe4733
recipient_name: progressive turnout project
state: CA
zip: 95630-0000
", + "Name: jason morgan for state representativ
classification: neutral
donor_id: fb8c97ef-cbc2-4d9c-87b3-958f7a64bc0c
entity_type: corporation
full_name: jason morgan for state representativ
recipient_id: b3084657-ebf9-44db-8f15-1da48eaaa2d9
recipient_name: united food and commercial workers active ballot club
state: MI
", + "Name: marybeth webster
address: 727 SW ROGUE RIVER AVE. #74
city: GRANTS PASS
classification: neutral
donor_id: 0bd6955a-e95b-4af8-8ada-69fccd52ad11
entity_type: Individual
first_name: MARYBETH
full_name: marybeth webster
last_name: WEBSTER
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: OR
zip: 97526-0000
", + "Name: washtenaw cnty democratic part
classification: neutral
donor_id: db7f4263-c82a-4264-af7a-4a40db0f3083
entity_type: corporation
full_name: washtenaw cnty democratic part
recipient_id: 9f82ffff-0906-4554-a3c4-f23d22da925d
recipient_name: plumbers and steamfitters local 190 pac fund
state: MI
", + "Name: beth collins
address: 2013 EAST FRONT STREET
city: TRAVERSE CITY
classification: neutral
donor_id: 71b84806-a02b-4411-bc72-843ff882eb97
entity_type: Individual
first_name: BETH
full_name: beth collins
last_name: COLLINS
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: MI
zip: 49686-0000
", + "Name: popeadam
classification: neutral
donor_id: 1184bfa5-3fce-4248-aa8d-a89639ce04b8
entity_type: corporation
full_name: popeadam
recipient_id: 44751f04-3ce1-4288-979c-8a35b9d5e89c
recipient_name: teamsters 243 political action committee
state: MI
", + "Name: teamsters 243 political action committee
classification: neutral
", + "Name: robert lisowski
address: 6 REGAL RD
city: EDISON
classification: neutral
donor_id: 59c6e536-1832-4ac1-ad7d-78aedac0c3f9
entity_type: Individual
first_name: ROBERT
full_name: robert lisowski
last_name: LISOWSKI
recipient_id: fa79b50e-9eb3-4c65-a25b-968fa5059e75
recipient_name: ivote mi pac
state: NJ
zip: 08820-0000
", + "Name: ivote mi pac
classification: neutral
", + "Name: tiffany ross
address: 7250 POE AVENUE SUITE 400
city: DAYTON
classification: neutral
company: ufcw local no. 75
donor_id: ca4383cc-c8de-46e9-ab3b-f8faca955a2c
entity_type: Individual
first_name: TIFFANY
full_name: tiffany ross
last_name: ROSS
occupation: l/u representative
recipient_id: b3084657-ebf9-44db-8f15-1da48eaaa2d9
recipient_name: united food and commercial workers active ballot club
state: OH
zip: 45414-2698
", + "Name: kathleen pruzek
address: 113 HOMESTEAD A D
city: ALBANY
classification: neutral
donor_id: 0fabe1f0-0913-4079-bde8-1164b3f375b8
entity_type: Individual
first_name: KATHLEEN
full_name: kathleen pruzek
last_name: PRUZEK
recipient_id: fa79b50e-9eb3-4c65-a25b-968fa5059e75
recipient_name: ivote mi pac
state: NY
zip: 12203-0000
", + "Name: ariel martin-cone
address: 92 LOCUST ST
city: DANVERS
classification: neutral
donor_id: b4e159ad-9d78-4826-893d-71349f8f1008
entity_type: Individual
first_name: ARIEL
full_name: ariel martin-cone
last_name: MARTIN-CONE
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: MA
zip: 01923-0000
", + "Name: william hamilton
address: 1011 LAKE HEATHER RESERVE
city: BIRMINGHAM
classification: neutral
donor_id: c0417820-aec4-4e2e-900d-7c0d03cf703f
entity_type: Individual
first_name: WILLIAM
full_name: william hamilton
last_name: HAMILTON
recipient_id: c00726af-3b4b-46c6-88df-8c62dfbe4733
recipient_name: progressive turnout project
state: AL
zip: 35242-0000
", + "Name: matthew curtis
address: 7375 VILLAGE SQUARE DR
city: WEST BLOOMFIELD
classification: neutral
donor_id: 64a16a5d-05c5-452b-aa17-4129808d5604
entity_type: Individual
first_name: MATTHEW
full_name: matthew curtis
last_name: CURTIS
recipient_id: 9056a6ee-a211-425a-9ea4-4203d9ec8276
recipient_name: michigan farm bureau political action committee
state: MI
zip: 48322-0000
", + "Name: riverview lapeer llc
classification: neutral
donor_id: 238b5103-2978-494e-ade9-bcc61831b5f3
entity_type: corporation
full_name: riverview lapeer llc
recipient_id: 27759108-2ed1-4059-a134-6fd6f901201a
recipient_name: lapeer county republican party
state: MI
", + "Name: lapeer county republican party
classification: neutral
", + "Name: john cooper
address: 8224 FIVE POINT HWY
city: EATON RAPIDS
classification: neutral
company: cooper
donor_id: 183332c5-4ee5-4601-917e-6603aa451107
entity_type: Individual
first_name: JOHN
full_name: john cooper
last_name: COOPER
occupation: retired
recipient_id: 9056a6ee-a211-425a-9ea4-4203d9ec8276
recipient_name: michigan farm bureau political action committee
state: MI
zip: 48827-0000
", + "Name: amy ream
address: 8785 SW WHITE PINE LN
city: PORTLAND
classification: neutral
donor_id: cd5f97b5-fd79-4162-9d10-34253ee57c52
entity_type: Individual
first_name: AMY
full_name: amy ream
last_name: REAM
recipient_id: 4b5c27d8-f1bf-4ff6-b717-d67025ab2a1b
recipient_name: committee to elect maurice imhoff
state: OR
zip: 97225-2440
", + "Name: van dessel kathleen
classification: neutral
donor_id: 3941536a-03a8-4049-b35b-6a975e1bbbf4
entity_type: corporation
full_name: van dessel kathleen
recipient_id: 501217db-524f-4534-848e-78b9afe68961
recipient_name: voters action committee (superpac)
state: MI
", + "Name: knight kent
address: 257 POINT VIEW DR
city: WASHINGTON
classification: neutral
donor_id: 9eb8804b-fda1-4bb3-a083-d149252a0036
entity_type: Individual
first_name: KNIGHT
full_name: knight kent
last_name: KENT
recipient_id: c00726af-3b4b-46c6-88df-8c62dfbe4733
recipient_name: progressive turnout project
state: PA
zip: 15301-0000
", + "Name: carol wilson
address: 2501 N BELL AVE
city: DENTON
classification: neutral
donor_id: 87a28b81-0b11-48c4-aa97-a071f0947671
entity_type: Individual
first_name: CAROL
full_name: carol wilson
last_name: WILSON
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: TX
zip: 76209-1968
", + "Name: schwartz dorothy
address: 2101SE29THSTREET
city: OKEECHOBEE
classification: neutral
donor_id: 69c1e119-f836-44e7-aaa5-aa12b271c13f
entity_type: Individual
first_name: SCHWARTZ
full_name: schwartz dorothy
last_name: DOROTHY
recipient_id: c00726af-3b4b-46c6-88df-8c62dfbe4733
recipient_name: progressive turnout project
state: FL
zip: 34974-0000
", + "Name: i360 llc
classification: neutral
donor_id: 59083df1-2a4f-4ba8-8f50-f7bf04103787
entity_type: corporation
full_name: i360 llc
recipient_id: f331c69e-69f6-401d-bbfc-10cc94f622ab
recipient_name: committee to elect rachelle smit for state representative
state: MI
", + "Name: committee to elect rachelle smit for state representative
classification: neutral
", + "Name: alessi galen j
classification: neutral
donor_id: 8b1a42ae-6ef8-4747-aa2b-f7dc8a98bff0
entity_type: corporation
full_name: alessi galen j
recipient_id: 501217db-524f-4534-848e-78b9afe68961
recipient_name: voters action committee (superpac)
state: MI
", + "Name: scott bennett
address: 2301 WILTON DR APT R401
city: WILTON MANORS
classification: neutral
company: not employed
donor_id: d26a9a30-d0ec-4b3c-bb56-2fab2cb42b0e
entity_type: Individual
first_name: SCOTT
full_name: scott bennett
last_name: BENNETT
occupation: not employed
recipient_id: 97b5db6e-a1b8-4013-8304-df0009d1a1b0
recipient_name: noah arbit for michigan
state: FL
zip: 33305-1202
", + "Name: nypd pizza
classification: neutral
donor_id: 7e431e50-d013-46e7-bef4-c12d1609475e
entity_type: vendor
full_name: nypd pizza
recipient_id: 00c11cf0-1cb8-47a1-8298-1e869a623b7c
recipient_name: maricopa county democratic party
", + "Name: maricopa county democratic party
classification: neutral
", + "Name: novak thomas william
classification: neutral
donor_id: 8d52ad60-68d6-4368-920e-ef02da078457
entity_type: corporation
full_name: novak thomas william
recipient_id: 501217db-524f-4534-848e-78b9afe68961
recipient_name: voters action committee (superpac)
state: MI
", + "Name: shelby timmis
address: 291 EDMUND PLACE 2
city: DETROIT
classification: neutral
donor_id: 1b28baed-5bd4-4439-9233-9bd4c682cdef
entity_type: Individual
first_name: SHELBY
full_name: shelby timmis
last_name: TIMMIS
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: MI
zip: 48201-0000
", + "Name: karen bailey
address: 21727 GREGORY ST
city: DEARBORN
classification: neutral
donor_id: 66af7522-8ad3-4d94-9e7a-fdbcba0ecfac
entity_type: Individual
first_name: KAREN
full_name: karen bailey
last_name: BAILEY
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: MI
zip: 48124-0000
", + "Name: michigan agri biz pac
classification: neutral
donor_id: 50f3a121-008f-495b-8243-3a7b333eae2b
entity_type: corporation
full_name: michigan agri biz pac
recipient_id: a4a95b69-a472-427c-a028-368d3260f2b8
recipient_name: joseph fox for state representative
state: MI
", + "Name: joseph fox for state representative
classification: neutral
", + "Name: michelle revard
address: 10145 HORNBILL DR
city: FREELAND
classification: neutral
donor_id: 1f995e9b-a29a-4c2b-bca5-cb28c394124e
entity_type: Individual
first_name: MICHELLE
full_name: michelle revard
last_name: REVARD
recipient_id: 4e3e4aca-ae3a-420a-a51e-1c2933182098
recipient_name: bay city educators public affairs council-mi education association
state: MI
zip: 48623-0000
", + "Name: bay city educators public affairs council-mi education association
classification: neutral
", + "Name: mary lou melville
address: 100 TIMBERHILL PL
city: CHAPEL HILL
classification: neutral
donor_id: 84380abe-454a-415f-a1ed-21786288166f
entity_type: Individual
first_name: MARY LOU
full_name: mary lou melville
last_name: MELVILLE
recipient_id: 9a96a76f-8b26-4db7-be95-b14987373991
recipient_name: committee to elect betsy coffia
state: NC
zip: 27514-1961
", + "Name: st. joseph county republican party
classification: neutral
donor_id: 4e9cecb3-dbc7-4da5-a59a-22320d7e5b09
entity_type: corporation
full_name: st. joseph county republican party
recipient_id: a1de9252-2708-4c1a-8282-4ca0b3f7dcea
recipient_name: david morgan
state: MI
", + "Name: david morgan
classification: neutral
", + "Name: dharma akmon
address: 1156 GLEN LEVEN RD
city: ANN ARBOR
classification: neutral
company: university of michigan
donor_id: d37e5d58-741b-4689-9dc3-49c9d72127c6
entity_type: Individual
first_name: DHARMA
full_name: dharma akmon
last_name: AKMON
occupation: university of michigan
recipient_id: 7b008f64-c423-430d-a2dd-945d46f83f1e
recipient_name: jeff irwin for state senate
state: MI
zip: 48103-5712
", + "Name: jeff irwin for state senate
classification: neutral
", + "Name: mailchimp
classification: neutral
donor_id: 83e72f72-5955-4222-a98d-7c951cf83c97
entity_type: vendor
full_name: mailchimp
recipient_id: 5be80df7-54ea-4aeb-880f-99902334ef84
recipient_name: oak & wren society
", + "Name: oak & wren society
classification: neutral
", + "Name: martin robert
address: 244 SPENCER RD
city: TOWANDA
classification: neutral
donor_id: 679795de-5106-4b65-9361-164263dd9c51
entity_type: Individual
first_name: MARTIN
full_name: martin robert
last_name: ROBERT
recipient_id: c00726af-3b4b-46c6-88df-8c62dfbe4733
recipient_name: progressive turnout project
state: PA
zip: 18848-0000
", + "Name: gsci 21st century pac
classification: neutral
donor_id: a6f00fb6-eb32-4cf5-8acc-55e42c784609
entity_type: corporation
full_name: gsci 21st century pac
recipient_id: e54d2ae0-0c44-4bc8-bf1e-dcadc670d80d
recipient_name: bollin for michigan
state: MI
", + "Name: bollin for michigan
classification: neutral
", + "Name: kathryn johnson
address: N10290
city: IRONWOOD
classification: neutral
donor_id: 11724306-81a6-4416-86ef-33b011b83eaf
entity_type: Individual
first_name: KATHRYN
full_name: kathryn johnson
last_name: JOHNSON
recipient_id: 9056a6ee-a211-425a-9ea4-4203d9ec8276
recipient_name: michigan farm bureau political action committee
state: MI
zip: 49938-0000
", + "Name: roberta deroos-brockway
address: 759 WELLS ST NE
city: GRAND RAPIDS
classification: neutral
donor_id: d9ca981a-3384-4bf4-a50f-e921b7d1f354
entity_type: Individual
first_name: ROBERTA
full_name: roberta deroos-brockway
last_name: DEROOS-BROCKWAY
recipient_id: 9056a6ee-a211-425a-9ea4-4203d9ec8276
recipient_name: michigan farm bureau political action committee
state: MI
zip: 49525-2561
", + "Name: bryce doornbos
address: 8445 24TH AVE
city: JENISON
classification: neutral
company: ayers basement systems
donor_id: baee9837-26fe-4b49-99ab-16e48f54b6fc
entity_type: Individual
first_name: BRYCE
full_name: bryce doornbos
last_name: DOORNBOS
occupation: sales
recipient_id: f331c69e-69f6-401d-bbfc-10cc94f622ab
recipient_name: committee to elect rachelle smit for state representative
state: MI
zip: 49428-0000
", + "Name: jennifer anderson
address: 115 K PUGSLEY CTR
city: BROOKINGS
classification: neutral
donor_id: 02b5cf36-44dd-4176-9d11-e44b6d62a6fa
entity_type: Individual
first_name: JENNIFER
full_name: jennifer anderson
last_name: ANDERSON
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: SD
zip: 57007-0001
", + "Name: sarah sarahj
address: POST OFFICE BOX 23555
city: TIGARD
classification: neutral
company: ufcw local no. 555
donor_id: 6623e448-904a-4651-9e05-f80365c16e7c
entity_type: Individual
first_name: SARAH
full_name: sarah sarahj
last_name: SARAHJ
occupation: l/u representative
recipient_id: b3084657-ebf9-44db-8f15-1da48eaaa2d9
recipient_name: united food and commercial workers active ballot club
state: OR
zip: 97281-3555
", + "Name: lynn porter
address: 1715 ELLINCOURT DR APT 5
city: SOUTH PASADENA
classification: neutral
donor_id: c1faf71c-ba25-405f-8595-898b2dea440d
entity_type: Individual
first_name: LYNN
full_name: lynn porter
last_name: PORTER
recipient_id: 9056a6ee-a211-425a-9ea4-4203d9ec8276
recipient_name: michigan farm bureau political action committee
state: CA
zip: 91030-0000
", + "Name: nancy smith
address: 2420 PRINCESS LN SE
city: MARIETTA
classification: neutral
donor_id: 799eae4a-20b7-41e3-a357-a1e3617f0c48
entity_type: Individual
first_name: NANCY
full_name: nancy smith
last_name: SMITH
recipient_id: 9056a6ee-a211-425a-9ea4-4203d9ec8276
recipient_name: michigan farm bureau political action committee
state: GA
zip: 30067-6716
", + "Name: confer mary
address: 20503 TRUE RD
city: CALDWELL
classification: neutral
donor_id: 9e4563d2-d7a1-40c1-bc1e-37890a380e97
entity_type: Individual
first_name: CONFER
full_name: confer mary
last_name: MARY
recipient_id: c00726af-3b4b-46c6-88df-8c62dfbe4733
recipient_name: progressive turnout project
state: ID
zip: 83607-0000
", + "Name: wiseheart katherine
address: 529 1/2 4TH ST
city: BARABOO
classification: neutral
donor_id: 929938ff-d8e3-40b5-9fe0-5c8eb0c95537
entity_type: Individual
first_name: WISEHEART
full_name: wiseheart katherine
last_name: KATHERINE
recipient_id: c00726af-3b4b-46c6-88df-8c62dfbe4733
recipient_name: progressive turnout project
state: WI
zip: 53913-0000
", + "Name: riggin don
address: 1 BENT TREE DR
city: LITTLE ROCK
classification: neutral
donor_id: 16e32b84-4835-434c-a787-63967988cfa9
entity_type: Individual
first_name: RIGGIN
full_name: riggin don
last_name: DON
recipient_id: c00726af-3b4b-46c6-88df-8c62dfbe4733
recipient_name: progressive turnout project
state: AR
zip: 72212-0000
", + "Name: david peterson
address: 6325 OTTAWA LN
city: PENTWATER
classification: neutral
donor_id: 083a5988-c1ad-4b1d-9ced-cd0e6939f96e
entity_type: Individual
first_name: DAVID
full_name: david peterson
last_name: PETERSON
recipient_id: fa79b50e-9eb3-4c65-a25b-968fa5059e75
recipient_name: ivote mi pac
state: MI
zip: 49449-9485
", + "Name: mary krueger
address: 1095 COUNTRYAIR DR
city: WAYLAND
classification: neutral
donor_id: 4256e027-0aad-47d7-9508-9c8a0bb369c2
entity_type: Individual
first_name: MARY
full_name: mary krueger
last_name: KRUEGER
recipient_id: eac1a086-d8a6-4f51-80f9-d92f51ee7e1b
recipient_name: muskegon county democratic party
state: MI
zip: 49348-0000
", + "Name: muskegon county democratic party
classification: neutral
", + "Name: robert j courson
address: 3812 RIDGEWAY PLACE
city: TRAVERSE CITY
classification: neutral
donor_id: 158ba0b1-6f60-4e65-92d4-7b8639e77b8e
entity_type: Individual
first_name: ROBERT
full_name: robert j courson
last_name: J COURSON
recipient_id: 9a96a76f-8b26-4db7-be95-b14987373991
recipient_name: committee to elect betsy coffia
state: MI
zip: 49684-0000
", + "Name: david williams
address: 1455 FOSTER RD
city: NAPA
classification: neutral
donor_id: 435cdf80-ab5c-403c-8716-1a6f041b6791
entity_type: Individual
first_name: DAVID
full_name: david williams
last_name: WILLIAMS
recipient_id: b3084657-ebf9-44db-8f15-1da48eaaa2d9
recipient_name: united food and commercial workers active ballot club
state: CA
zip: 94558-6529
", + "Name: committee to elect yousef rabhi
classification: neutral
donor_id: 11fb01ed-12ca-4719-b8f0-3139fb49dff0
entity_type: corporation
full_name: committee to elect yousef rabhi
recipient_id: 543224af-e8b7-4a5f-9203-b30ead8253cc
recipient_name: people for dylan wegela
state: MI
", + "Name: people for dylan wegela
classification: neutral
", + "Name: dalene mathias
address: 523 MYRTLE STREET
city: MILTON
classification: neutral
company: ufcw local no. 38
donor_id: 60e3854e-ffe7-4ca3-824a-dfa4a4fc2ad5
entity_type: Individual
first_name: DALENE
full_name: dalene mathias
last_name: MATHIAS
occupation: l/u representative
recipient_id: b3084657-ebf9-44db-8f15-1da48eaaa2d9
recipient_name: united food and commercial workers active ballot club
state: PA
zip: 17847-2358
", + "Name: brittany mahalick
address: 36640 MILL LAKE RD
city: GOBLES
classification: neutral
donor_id: dd8fbc71-9d9e-4217-a435-833cc1c0f4d1
entity_type: Individual
first_name: BRITTANY
full_name: brittany mahalick
last_name: MAHALICK
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: MI
zip: 49055-0000
", + "Name: james porter
address: 220 RAILROAD S STREER
city: RUPERT
classification: neutral
donor_id: a3f6bba6-bcd6-4a1c-a052-c2acf0e4056e
entity_type: Individual
first_name: JAMES
full_name: james porter
last_name: PORTER
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: WV
zip: 25984-0000
", + "Name: jacob smith
address: 826 COUTANT ST.
city: FLUSHING
classification: neutral
donor_id: f2021f43-141f-49e1-9387-1a77bf3faeac
entity_type: Individual
first_name: JACOB
full_name: jacob smith
last_name: SMITH
recipient_id: 8de8f699-8855-4e6c-9039-0410c821802a
recipient_name: united association of plumbers and pipefitters local 370 pac
state: MI
zip: 48433-0000
", + "Name: united association of plumbers and pipefitters local 370 pac
classification: neutral
", + "Name: rebecca mang
address: 228 S SPRUCE ST
city: TRAVERSE CITY
classification: neutral
donor_id: 3f3bb07c-80f8-443b-a866-e69ac14c3ab9
entity_type: Individual
first_name: REBECCA
full_name: rebecca mang
last_name: MANG
occupation: not employed
recipient_id: 9a96a76f-8b26-4db7-be95-b14987373991
recipient_name: committee to elect betsy coffia
state: MI
zip: 49684-0000
", + "Name: ruth kingscott
address: 737 MASSACHUSETTS BLVD
city: ALMA
classification: neutral
donor_id: d48c8c7c-1eb9-4fa8-ba37-846b5d0686b9
entity_type: Individual
first_name: RUTH
full_name: ruth kingscott
last_name: KINGSCOTT
recipient_id: 9056a6ee-a211-425a-9ea4-4203d9ec8276
recipient_name: michigan farm bureau political action committee
state: MI
zip: 48801-2038
", + "Name: mike burns
classification: neutral
donor_id: 2018ef41-d2dc-49a7-86ee-93dd8777433b
entity_type: vendor
full_name: mike burns
recipient_id: 591aa72b-511b-4dbb-a161-80458f257471
recipient_name: hoffman, jake
", + "Name: hoffman, jake
classification: neutral
", + "Name: anthony king
address: 2024 ONTONAGON AVE SE
city: GRAND RAPIDS
classification: neutral
company: the wellness plan
donor_id: 632cc8c4-5539-45dd-bc79-bfbf12643c0d
entity_type: Individual
first_name: ANTHONY
full_name: anthony king
last_name: KING
occupation: healthcare
recipient_id: b3084657-ebf9-44db-8f15-1da48eaaa2d9
recipient_name: united food and commercial workers active ballot club
state: MI
zip: 49506-5364
", + "Name: michelle williams
address: 6142 ARROWCREST CT NE
city: ROCKFORD
classification: neutral
company: self
donor_id: 9f4d9e40-12d7-482f-b783-1cd037aec187
entity_type: Individual
first_name: MICHELLE
full_name: michelle williams
last_name: WILLIAMS
occupation: homemaker
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: MI
zip: 49341-7368
", + "Name: advanced micro targeting
classification: neutral
donor_id: bb81fa88-8a06-42a0-ad5f-7b23f7e5f371
entity_type: vendor
full_name: advanced micro targeting
recipient_id: 2ca0910b-5556-4007-94d1-d7485e9ff876
recipient_name: invest in education committee
", + "Name: invest in education committee
classification: neutral
", + "Name: john staropoli
address: 790 BOYLSTON STREET
city: BOSTON
classification: neutral
donor_id: 787e7792-c390-4d86-8fb3-53061f78273b
entity_type: Individual
first_name: JOHN
full_name: john staropoli
last_name: STAROPOLI
recipient_id: 9a96a76f-8b26-4db7-be95-b14987373991
recipient_name: committee to elect betsy coffia
state: MA
zip: 02199-0000
", + "Name: act blue
classification: neutral
donor_id: b906d3eb-3874-4789-b523-e2eaab415328
entity_type: corporation
full_name: act blue
recipient_id: 4b5c27d8-f1bf-4ff6-b717-d67025ab2a1b
recipient_name: committee to elect maurice imhoff
state: MI
", + "Name: nicole kowalski
address: 756 MONTECILLO RD
city: SAN RAFAEL
classification: neutral
donor_id: 6e929d04-28b6-4c31-b6ff-8d958fe6bb97
entity_type: Individual
first_name: NICOLE
full_name: nicole kowalski
last_name: KOWALSKI
recipient_id: 97b5db6e-a1b8-4013-8304-df0009d1a1b0
recipient_name: noah arbit for michigan
state: CA
zip: 94903-0000
", + "Name: jaime calderone
address: 4749 WILLIS RD
city: GRASS LAKE
classification: neutral
donor_id: 1dfefa19-bb9f-4254-a8d8-538f9f6b7870
entity_type: Individual
first_name: JAIME
full_name: jaime calderone
last_name: CALDERONE
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: MI
zip: 49240-9548
", + "Name: richard tully
address: 718 AFTON CT
city: REDLANDS
classification: neutral
company: loma linda physicians medical
donor_id: 67bed0cc-8d2a-4868-8879-dbfb5426914e
entity_type: Individual
first_name: RICHARD
full_name: richard tully
last_name: TULLY
occupation: physician
recipient_id: fa79b50e-9eb3-4c65-a25b-968fa5059e75
recipient_name: ivote mi pac
state: CA
zip: 92374-6343
", + "Name: best western
classification: neutral
donor_id: 2dc71e38-25c9-47df-8779-e02855fda9e0
entity_type: vendor
full_name: best western
recipient_id: 349703c0-a6d9-45a1-8491-b7f9ba0d287d
recipient_name: unite here arizona
", + "Name: brendan floyd
address: 5030 FIRST AVENUE SOUTH SUITE 200
city: SEATTLE
classification: neutral
company: l0021
donor_id: a8ceab02-2f26-4131-a053-4976c0170b1e
entity_type: Individual
first_name: BRENDAN
full_name: brendan floyd
last_name: FLOYD
occupation: l/u representative
recipient_id: b3084657-ebf9-44db-8f15-1da48eaaa2d9
recipient_name: united food and commercial workers active ballot club
state: WA
zip: 98134-2438
", + "Name: stephen brown
address: 1507 SHADFORD ROAD
city: ANN ARBOR
classification: neutral
company: secretorylga inc.
donor_id: 0e75f687-9a87-49bb-90d8-889c1d8b3755
entity_type: Individual
first_name: STEPHEN
full_name: stephen brown
last_name: BROWN
occupation: cso
recipient_id: 06ebbb03-574c-445b-9416-7d2134a06d1f
recipient_name: committee to elect james e johnson jr
state: MI
zip: 48104-0000
", + "Name: committee to elect james e johnson jr
classification: neutral
", + "Name: lori carpentier
address: 8033 IVY GLEN PARK
city: WHITE LAKE
classification: neutral
company: susan thompson buffett fund
donor_id: 9c905232-4d69-46d4-8517-8f21675bcfcf
entity_type: Individual
first_name: LORI
full_name: lori carpentier
last_name: CARPENTIER
occupation: director
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: MI
zip: 48386-0000
", + "Name: jose leon
address: 1305 EAST 27TH STREET
city: KANSAS CITY
classification: neutral
company: ufcw local no. 2
donor_id: bf408bc4-21cd-4e71-93d9-0acf9bee7aca
entity_type: Individual
first_name: JOSE
full_name: jose leon
last_name: LEON
occupation: l/u representative
recipient_id: b3084657-ebf9-44db-8f15-1da48eaaa2d9
recipient_name: united food and commercial workers active ballot club
state: MO
zip: 64108-2921
", + "Name: douglas martin
address: 1100 DEER TRACT RD
city: OPELIKA
classification: neutral
company: none
donor_id: be3b87b2-4131-4d71-86f7-da986c906aa4
entity_type: Individual
first_name: DOUGLAS
full_name: douglas martin
last_name: MARTIN
occupation: retired
recipient_id: 9056a6ee-a211-425a-9ea4-4203d9ec8276
recipient_name: michigan farm bureau political action committee
state: AL
zip: 36801-0000
", + "Name: gaile chiles
address: 5402 MAPLE ST
city: BELLAIRE
classification: neutral
donor_id: 1eb90df6-e4c6-4711-b05c-d94a633e7c16
entity_type: Individual
first_name: GAILE
full_name: gaile chiles
last_name: CHILES
recipient_id: fa79b50e-9eb3-4c65-a25b-968fa5059e75
recipient_name: ivote mi pac
state: TX
zip: 77401-4705
", + "Name: linda thompson
address: 111 BERNARD TER
city: CRIPPLE CREEK
classification: neutral
donor_id: 4c168995-73dd-4ac6-8ef0-8dab6fa6f828
entity_type: Individual
first_name: LINDA
full_name: linda thompson
last_name: THOMPSON
recipient_id: c00726af-3b4b-46c6-88df-8c62dfbe4733
recipient_name: progressive turnout project
state: CO
zip: 80813-9558
", + "Name: peter gavin
address: 2351 SPAULDING RD.
city: ATTICA
classification: neutral
donor_id: 5b3a5842-dad6-498d-b528-5d5f1b299da8
entity_type: Individual
first_name: PETER
full_name: peter gavin
last_name: GAVIN
recipient_id: 27759108-2ed1-4059-a134-6fd6f901201a
recipient_name: lapeer county republican party
state: MI
zip: 48412-0000
", + "Name: jennifer cox
address: 6145 LAKE ROAD
city: OSSEO
classification: neutral
donor_id: f23fe218-ef77-4e31-9058-01e336e82919
entity_type: Individual
first_name: JENNIFER
full_name: jennifer cox
last_name: COX
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
recipient_name: reproductive freedom for all
state: MI
zip: 49266-0000
", + "Name: duane maurer
address: 4213 KIPPER RD
city: BAD AXE
classification: neutral
donor_id: f435259a-2b8e-43b4-a148-826d18ab91a4
entity_type: Individual
first_name: DUANE
full_name: duane maurer
last_name: MAURER
recipient_id: 9056a6ee-a211-425a-9ea4-4203d9ec8276
recipient_name: michigan farm bureau political action committee
state: MI
zip: 48413-8851
", + "Name: michigan beer & wine wholesalers
classification: neutral
donor_id: be583d56-2245-460e-8633-8438c0d65a6e
entity_type: corporation
full_name: michigan beer & wine wholesalers
recipient_id: cf320278-7c53-4ae3-87d5-8b8382acda89
recipient_name: steve johnson for state rep
state: MI
" ], "type": "scatter", "x": [ - 0.4182243125490408, - 0.12286879065958844, - 0.6730431696885844, - 0.38165116541180344, - 0.6084965344664286, - 0.18155558675901884, - 0.7722862313192606, - 0.5368181409256901, - 0.8304626469521129, - 0.7924139234898422, - 0.8266354543284289, - 0.4023039585223629, - 0.5084198498293618, - 0.23992481624351925, - 0.2742000416622462, - 0.15570283642495664, - 0.07513674080757637, - 0.7247552078664479, - 0.2586357176925591, - 0.595945044435614, - 0.9428542201780316, - 0.03304679952258993, - 0.6013564651959642, - 0.1130639188502468, - 0.5531504465254558, - 0.1635981270944994, - 0.05512117222879742, - 0.32578353530864457, - 0.27440213390552737, - 0.2728250610713022, - 0.6346565064837861, - 0.6327007577432437, - 0.800297854626628, - 0.526779936668903, - 0.413948124857326, - 0.09276814106220677, - 0.662108954544855, - 0.07163295816605642, - 0.44119458804978295, - 0.7364515013041172, - 0.7827775151390383, - 0.9600359726880752, - 0.8511753697833563, - 0.05194805532761382, - 0.03187584930858911, - 0.07426685281627932, - 0.5257999712304688, - 0.9998698320754983, - 0.09471702229050472, - 0.6953901849658966, - 0.03446402354654854, - 0.9082570345357789, - 0.3740122792611037, - 0.977854801698089, - 0.5436816885151938, - 0.06202421257916635, - 0.8589937476561325, - 0.06879886671193436, - 0.19921682827804632, - 0.1823584228427031, - 0.37549158943196925, - 0.5433115547736789, - 0.37848025459696877, - 0.3821391536049519, - 0.7204214783753378, - 0.2955343345493908, - 0.09053866681881584, - 0.7181048560087516, - 0.10310287300704979, - 0.8247840830312709, - 0.1573630170264504, - 0.31305791514229697, - 0.298647499376007, - 0.3246624829381992, - 0.19852054651169693, - 0.3328704753356456, - 0.33203393677870674, - 0.5461279353327784, - 0.9636084967560627, - 0.9503884723051484, - 0.13747604708068628, - 0.3499260998923053, - 0.3181124346701171, - 0.89080246263295, - 0.9521646983336837, - 0.6776948411821848, - 0.0023771443647881974, - 0.7007214129943925, - 0.7188906153197968, - 0.47055154706870017, - 0.19043749918150743, - 0.5274116361492907, - 0.9162463356603696, - 0.7042334738295596, - 0.555788147264811, - 0.5805679633404117, - 0.587704695878027, - 0.916634041055854, - 0.7948577020793985, - 0.9210876029743161, - 0.834199864808296, - 0.5989925957177575, - 0.05973078995013337, - 0.5593951498649633, - 0.5229468203255856, - 0.22007362873840486, - 0.37301066653863624, - 0.8613129225222332, - 0.9663892923019699, - 0.2275256207367028, - 0.0852382135963593, - 0.0914406510425998, - 0.9425745666137786, - 0.3019474379086241, - 0.2619562675328274, - 0.48218022499136737, - 0.5293212253918783, - 0.41808707877840445, - 0.14711158829428328, - 0.42926818011737133, - 0.9694266665187994, - 0.4404718698088387, - 0.4277213938753692, - 0.7059759544943667, - 0.4611021425875542, - 0.13940667248499528, - 0.3393815448042514, - 0.6370268640561303, - 0.9851894520572745, - 0.3247821296168134, - 0.9186278106648778, - 0.18507593174525072, - 0.5845953849421676, - 0.44175944307536974, - 0.7255980413609877, - 0.6058132814274794, - 0.7703024251104211, - 0.47443124751760235, - 0.9573079778783831, - 0.0201693226965588, - 0.17086936775877049, - 0.5291812256005789, - 0.5621062195646831, - 0.2121217358781844, - 0.16862303760247477, - 0.8846357375826375, - 0.0875467755337247, - 0.9473667691929577, - 0.8541827253649632, - 0.3414075728554137, - 0.9005048863870916, - 0.3318561006769827, - 0.7408684543182315, - 0.6149491168624189, - 0.12355952994556385, - 0.08997327822205015, - 0.21535391032155426, - 0.8323549266756429, - 0.8385234321105272, - 0.9240127894624793, - 0.6802728591951641, - 0.25656414507004344, - 0.020212382594376965, - 0.32444561774289593, - 0.4564806171162211, - 0.838803404513024, - 0.6322124026692795, - 0.8505181106970376, - 0.0897773631019545, - 0.7607451357487841, - 0.02312833765025224, - 0.05596958524873419, - 0.3187675293980876, - 0.5191285820034173, - 0.4349682989231034, - 0.04781523934390508, - 0.014269300880037306, - 0.9636590456207981, - 0.8680862155815134, - 0.4363707938884992, - 0.20133087739958255, - 0.6234379896430121, - 0.6314926226168458, - 0.29978148854693865, - 0.33721825060791266, - 0.7518492361353024, - 0.4442228752887084, - 0.04237200971819888, - 0.5201251204037126, - 0.038579501382332126, - 0.9110645875753355, - 0.5593069337955722, - 0.8668565351624634, - 0.42077304608666055, - 0.5465171974419871, - 0.7333209824474588, - 0.4039327719907384, - 0.34114125407236195, - 0.01777064460825195, - 0.992283435751248 + -0.43213011477334773, + -0.4430121181061702, + 0.5112616608477374, + 0.5931128851827875, + -0.5362524214379699, + -0.6830386686787555, + 0.8321531242995657, + 0.7947955540041922, + -0.015339979027039215, + -0.004598212759833403, + -0.5242232381582058, + -0.7859456498474336, + -0.010396805586450043, + -0.5907762774639415, + -0.8824105534014709, + 0.37340208125254337, + 0.42289489293422566, + -0.06531798460926314, + -0.06282488255576262, + 0.4571954695717908, + 0.5782995282255566, + 0.7251331716127464, + 0.8930310568108012, + 0.3440714981019444, + 0.6452743136225527, + -0.6833691066109641, + -0.922556143412663, + -0.4578754972216337, + -0.5260075373652568, + -0.13576410630761374, + -0.19017196191254732, + -0.7794963369787193, + -0.8284631501006486, + 0.05049348978287421, + 0.04533793523578743, + 0.4307114594735427, + 0.6211510564756442, + -0.488645870104004, + -0.5159370768528078, + 0.8299385473651612, + 0.8835075264311746, + 0.21235561702753328, + 0.22007339811741142, + -0.7317074047395691, + -0.35898258388050897, + 0.3513819881725677, + 0.6251699386269727, + 0.41070323859290586, + 0.5885337748775, + 0.7476884190896049, + -0.7442157911045258, + -0.8182264745850724, + -0.4240986484371276, + -0.7884885800275052, + 0.41998910604831713, + -0.8304528603225746, + 0.9329149222041224, + 0.12267587639275908, + 0.15152247306622144, + 0.7743223692717235, + -0.020367479302382467, + 0.5525550860920077, + -0.7341525511916877, + 0.3943452039362869, + -0.697118996520046, + 0.3729152346875802, + 0.45108517908588003, + 0.44882023012427213, + -0.522022411657337, + -0.09362722072652985, + -0.12627985133706823, + 0.5297743915831321, + 0.3733883300104818, + 0.2098519168108027, + -0.3787781527763615, + -0.41621756255078585, + 0.8894556041854287, + 0.9294865179016704, + -0.798347214605227, + -0.18131224898913595, + -0.1595247701666436, + 0.6522974110153149, + 0.8567967077274671, + -0.7026192767091103, + -0.7884728651042877, + -0.8276350144938375, + -0.6098376430856963, + -0.5862824632127743, + 0.6554230284551037, + 0.8922189766627708, + 0.4295097745598557, + 0.43460925643764853, + -0.3980280117268984, + 0.7024852559248044, + 0.7717529582442381, + -0.6806600992316747, + -0.926723528147117, + -0.6740662992025501, + -0.645856740142745, + -0.5177228561621657, + -0.7617659088160793, + -0.7442137071319165, + -0.4309900961374921, + 0.7245290699084046, + 0.7866931209891337, + -0.46411496857079576, + 0.3232896688907876, + 0.37115926386562975, + 0.8144104230201399, + 0.8482266969909324, + -0.6862355564324931, + 0.8143822305059775, + 0.1952194444171441, + 0.2613197935543201, + -0.44116587580288175, + 0.34219400777112563, + 0.3482854537227453, + 0.3895535076931305, + -0.7845181509980911, + -0.010628018143674797, + -0.333303022046739, + 0.391453184513052, + -0.8187977817844195, + 0.675110539921739, + -0.3990251391372163, + -0.30002656361791447, + -0.30032745656510185, + 0.32580390247949387, + -0.41032900004231715, + 0.7814157333397895, + -0.6545012668193522, + -0.8250766319170834, + 0.11642140741252306, + 0.3584413729045867, + 0.6893479879923822, + -0.5817258086810362 ], "y": [ - 0.09053726824382247, - 0.571085214777101, - 0.5199666766946885, - 0.33766327379542094, - 0.17196466768963936, - 0.17708608014427518, - 0.04649454781195783, - 0.37080565676900146, - 0.3602866247185619, - 0.9483925173875926, - 0.3061539627540061, - 0.9643804220706982, - 0.8336885167043149, - 0.5944498275635773, - 0.2373268562908326, - 0.23741932367240448, - 0.32127102230894566, - 0.3661437355856225, - 0.7791505090281524, - 0.3648985367210805, - 0.6244837238804738, - 0.9012137046519791, - 0.5219101415039136, - 0.39453602200590676, - 0.2009582712064717, - 0.04224314617430658, - 0.2381682330796122, - 0.33811323660241943, - 0.5216765314868881, - 0.6001026871900049, - 0.991844460003468, - 0.3343459796676115, - 0.8957623407464501, - 0.4208812619135248, - 0.31304614249644347, - 0.6773365837969099, - 0.4307004647175262, - 0.3309683982450944, - 0.2697998035002954, - 0.9727770125665405, - 0.40557198035837094, - 0.35532572275494023, - 0.5850986908522726, - 0.17296378957033465, - 0.6628083689885368, - 0.6160873747407943, - 0.025297953521542405, - 0.24028581536328997, - 0.5186581897030644, - 0.8423383207045981, - 0.7537809293531343, - 0.3192831323823997, - 0.17542400609184483, - 0.008409380348177398, - 0.938767234846119, - 0.24033413659841596, - 0.8791466031622056, - 0.5634679987017406, - 0.05938145280899054, - 0.6012106694454529, - 0.6705222836834548, - 0.3900960314334032, - 0.055894273053114896, - 0.14933184162295132, - 0.8151159149468827, - 0.17619771419691865, - 0.2981410655965283, - 0.7334929583472656, - 0.04283815208078323, - 0.922341377568881, - 0.3199684158322815, - 0.1278305132468397, - 0.21532966919867302, - 0.0731473655342364, - 0.4898861106787329, - 0.2695720924906413, - 0.09533319097359638, - 0.9874110419208606, - 0.1333966979371528, - 0.2529891644068947, - 0.45431497833000367, - 0.24454670425362057, - 0.20002447568886628, - 0.6267294109959968, - 0.5221172076712435, - 0.6512622326935055, - 0.3355480553373167, - 0.4834545718278357, - 0.4847615611240751, - 0.20619722773579274, - 0.9419075807648644, - 0.3098874271134545, - 0.04149975738749545, - 0.32266487999330984, - 0.4295667428124167, - 0.35350564895305514, - 0.15069304516745607, - 0.41535454584101794, - 0.8821215709600496, - 0.9542382277667263, - 0.7205270186163313, - 0.31541428705224306, - 0.010366221042083845, - 0.06016942899581168, - 0.8867112408398291, - 0.5204579980957379, - 0.4500538798110242, - 0.40395348439090084, - 0.5717872069066212, - 0.42052616285893474, - 0.2660491488293679, - 0.10782775946098799, - 0.7302384542961842, - 0.8520196094107113, - 0.4140065537970282, - 0.4467311570808764, - 0.5144551437666581, - 0.7454337953380579, - 0.03395115206665145, - 0.7077207700167599, - 0.9024846524956353, - 0.055897802218322856, - 0.2880647319459674, - 0.9328536520894143, - 0.9298960866412943, - 0.6352288779182178, - 0.04153202488293273, - 0.7834166246251234, - 0.6710484758334021, - 0.3202314429055858, - 0.9961038345306213, - 0.4107398412471005, - 0.24013807075121119, - 0.8599268392047722, - 0.4318165589087314, - 0.2693681584998491, - 0.3340702546567942, - 0.4421375373865315, - 0.5492873750243871, - 0.5981086798045652, - 0.3635517670405215, - 0.42641694849778966, - 0.3333136626479075, - 0.8848427298858184, - 0.6648266103848882, - 0.9344432405222354, - 0.249116699886752, - 0.6201266549140614, - 0.16781555203357146, - 0.4937592635708411, - 0.4248880785102581, - 0.9435179236599912, - 0.07011604000159166, - 0.9078978130468089, - 0.6072525121642058, - 0.23700988477155205, - 0.05477321631284726, - 0.9642772106357639, - 0.019989772968585173, - 0.29119156039108685, - 0.6217058876501556, - 0.1341994714416056, - 0.28871122138225125, - 0.06013197669987258, - 0.22993075379681738, - 0.5752985482362863, - 0.10059463740220753, - 0.8157570218353161, - 0.42203254876563234, - 0.7925454632595156, - 0.2002886163837997, - 0.8622415881936324, - 0.3169605131706372, - 0.6014235590484225, - 0.9958360522915445, - 0.5260776190209286, - 0.8350595230795331, - 0.24102842320743, - 0.19048093242734687, - 0.7005910562446783, - 0.29050814087118004, - 0.8508124987550889, - 0.6714278208298593, - 0.9756800437762957, - 0.040563128366188694, - 0.5097617399826666, - 0.8842114977564064, - 0.13201947050262697, - 0.09959517902538939, - 0.2318219208408404, - 0.888980486534156, - 0.9513646744432486, - 0.1294716874165911, - 0.5603277981830703, - 0.4868902788925622, - 0.038844634468288675, - 0.547451424618544, - 0.32345881810688737, - 0.20307680326083377, - 0.9810704436128125 + 0.7121785088398352, + 0.6637386367247285, + -0.598438979460561, + -0.6680444571236058, + 0.44361523531892444, + 0.5765261392732328, + 0.26080967071708444, + 0.24096872716900972, + -0.7089068308054137, + -0.9755872442336094, + -0.34274934403468454, + -0.5420785313722902, + -0.7621228818670577, + 0.2648966145363047, + 0.403612631630065, + 0.6789811252229511, + 0.7959212776137778, + 0.7900197865139884, + 0.8310972903269801, + -0.6713224168822408, + -0.8317527771805896, + -0.21408032557683887, + -0.28978736522770937, + 0.604772500031668, + -0.1954793343876051, + -0.1310109485870865, + -0.23208476462159833, + 0.6489829876156022, + 0.7932680240853172, + 0.6211459206982282, + 0.8677949363592646, + -0.2060018213633483, + -0.2001301912924086, + 0.6598165306544911, + 0.7693710498570913, + 0.5144371164893282, + 0.7073620048724625, + -0.8104899180559856, + -0.8622970096309992, + -0.06816718399097474, + -0.027959167306021424, + 0.7449128610002976, + 0.8604966990942203, + -0.1689229441285857, + 0.5112080095793095, + 0.5807404071548778, + -0.6965363437404857, + 0.6849817062815453, + -0.35224437514754586, + -0.44360886803933014, + 0.09593694912577341, + 0.08889623846074263, + 0.6029760119136741, + 0.0924254061247565, + 0.7455745376985553, + -0.21470076141573366, + -0.02976484897864857, + -0.7796703040360509, + -0.9657058443610594, + -0.06769339318848107, + -0.7307241565679895, + 0.6450827404437204, + -0.15363835146843016, + 0.6724237806357076, + -0.15963946240330748, + -0.6981965728205204, + -0.8219907437087358, + 0.5099911479349106, + -0.8213284146465071, + -0.7638667955160672, + -1, + 0.6051504434721513, + 0.630517583672798, + -0.08910955067197081, + -0.7157507162452663, + -0.7993949320290974, + 0.21748807668373418, + 0.23472763490409848, + 0.3744351904237455, + -0.912907039528394, + -0.9377070802046585, + 0.2987504763255712, + 0.394186370625655, + -0.3919634530446739, + -0.44844761451575715, + -0.18103128274552913, + -0.6480839567003398, + -0.6714013657386378, + -0.05639446704405653, + -0.06884618548241157, + -0.7884482829492515, + 0.7254199795788893, + 0.5991531652056148, + -0.06419545984665424, + -0.03388402641622064, + -0.1428808457598657, + -0.19435412457565315, + -0.1603371299138783, + 0.08169793780859752, + 0.39067339539297724, + 0.5799030308386766, + 0.345012671198623, + 0.6678716426804834, + -0.5318696248666036, + -0.5727295276261749, + 0.6775596287803459, + 0.5304054329523671, + 0.7125808229017521, + 0.5152301783287565, + 0.5153009464739415, + 0.32033499347523814, + -0.04159208903692613, + -0.7188816814442675, + -0.9964621174020154, + 0.6293531161898335, + 0.5575985531739881, + -0.8363676412114709, + -0.9280481286500764, + 0.3550572121642179, + -0.8792824988230634, + -0.5662007883069198, + 0.7030652464929427, + 0.12658592510635783, + -0.20166127879656748, + 0.5570923883380997, + -0.8222108886920065, + -0.7885877762376592, + 0.5627700325736714, + 0.6028638927072018, + -0.05023816831269756, + 0.09509796558003482, + -0.165232208286361, + -0.7309343925864511, + 0.621621947321043, + -0.052931911634106425, + 0.48262281712395333 ] } ], "layout": { - "annotations": [ - { - "showarrow": true, - "text": "graphs", - "x": 0.005, - "xref": "paper", - "y": -0.002, - "yref": "paper" - } - ], "hovermode": "closest", "margin": { "b": 20, @@ -10403,7 +2890,7 @@ "r": 5, "t": 40 }, - "showlegend": false, + "showlegend": true, "template": { "data": { "bar": [ @@ -11224,24 +3711,24 @@ "font": { "size": 16 }, - "text": "Network graph made with Python" + "text": "Network Graph Indicating Campaign Contributions from 2018-2022" }, "xaxis": { - "showgrid": false, + "showgrid": true, "showticklabels": false, - "zeroline": false + "zeroline": true }, "yaxis": { - "showgrid": false, + "showgrid": true, "showticklabels": false, - "zeroline": false + "zeroline": true } } }, "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "G = nx.MultiDiGraph()\n", - "\n", - "G.add_node(\"William Stoner\", Age=10, Weight=110)\n", - "G.add_node(\"KALAMAZOO ANESTHESIOLOGY PC\", Age=50, Weight=180)\n", - "G.add_node(\"Bob Kushman\", Age=90, Weight=111)\n", - "G.add_node(\"James Engelson\", Age=40, Weight=10)\n", - "G.add_node(\"Allen Wolf\", Age=30, Weight=1710)\n", - "\n", - "G.add_edge(\"William Stoner\", \"KALAMAZOO ANESTHESIOLOGY PC\", weight=10.00, amount=10.00, year=2017)\n", - "G.add_edge(\"KALAMAZOO ANESTHESIOLOGY PC\", \"Bob Kushman\", weight=1530, amount=1530, year=2017)\n", - "G.add_edge(\"Bob Kushman\", \"KALAMAZOO ANESTHESIOLOGY PC\", weight=530, amount=530, year=2017)\n", - "G.add_edge(\"James Engelson\", \"Bob Kushman\", weight=90.00, amount=90.00, year=2017)\n", - "G.add_edge(\"Allen Wolf\", \"William Stoner\", weight=111.50, amount=111.50, year=2017)\n", - "\n", - "# Create Plotly graph\n", - "edge_trace = go.Scatter(x=[], y=[], line=dict(color='#888'), hoverinfo='text', mode='lines')\n", - "hovertext = []\n", - "\n", - "for edge in G.edges(data=True):\n", - " x0, y0 = G.nodes[edge[0]]['Age'], G.nodes[edge[0]]['Weight']\n", - " x1, y1 = G.nodes[edge[1]]['Age'], G.nodes[edge[1]]['Weight']\n", - " edge_trace['x'] += tuple([x0, x1, None])\n", - " edge_trace['y'] += tuple([y0, y1, None])\n", - " hovertext.append(f\"Amount: {edge[2]['amount']:.2f}, Weight: {edge[2]['weight']:.2f}\")\n", - "\n", - "edge_trace['hovertext'] = hovertext\n", - "\n", - "node_trace = go.Scatter(x=[], y=[], text=[], mode='markers', hoverinfo='text', marker=dict(showscale=True, colorscale='YlGnBu', size=10))\n", - "\n", - "for node in G.nodes():\n", - " x, y = G.nodes[node]['Age'], G.nodes[node]['Weight']\n", - " node_trace['x'] += tuple([x])\n", - " node_trace['y'] += tuple([y])\n", - " node_info = node + '
' + 'Age: ' + str(G.nodes[node]['Age']) + '
' + 'Weight: ' + str(G.nodes[node]['Weight'])\n", - " node_trace['text'] += tuple([node_info])\n", - "\n", - "fig = go.Figure(data=[edge_trace, node_trace],\n", - " layout=go.Layout(\n", - " title='
Network graph made with Plotly',\n", - " titlefont=dict(size=16),\n", - " showlegend=False,\n", - " hovermode='closest',\n", - " margin=dict(b=20,l=5,r=5,t=40),\n", - " xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),\n", - " yaxis=dict(showgrid=False, zeroline=False, showticklabels=False)))\n", - "\n", - "fig.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hoverinfo": "text", - "hovertext": [ - "Amount: 5.00", - "Amount: 100.00", - "Amount: 15.00", - "Amount: 151.76", - "Amount: 75.00", - "Amount: 11.12", - "Amount: 1.00", - "Amount: 1.00", - "Amount: 5.88", - "Amount: 250.00", - "Amount: 15.00", - "Amount: 273.00", - "Amount: 25.44", - "Amount: 100.00", - "Amount: 50.00", - "Amount: 400.00", - "Amount: 300.00", - "Amount: 1020.00", - "Amount: 100.00", - "Amount: 100.00", - "Amount: 5.00", - "Amount: 15.00", - "Amount: 100.00", - "Amount: 13.00", - "Amount: 750.00", - "Amount: 15.00", - "Amount: 500.00", - "Amount: 2.50", - "Amount: 1.00", - "Amount: 250.00", - "Amount: 35.00", - "Amount: 40.00", - "Amount: 9.29", - "Amount: 5.00", - "Amount: 19.00", - "Amount: 75.00", - "Amount: 25.15", - "Amount: 15.78", - "Amount: 1.00", - "Amount: 250.00", - "Amount: 1000.00", - "Amount: 2.87", - "Amount: 67.18", - "Amount: 150.00", - "Amount: 29.40", - "Amount: 1.00", - "Amount: 500.00", - "Amount: 60.00", - "Amount: 10.00", - "Amount: 76.32" - ], - "line": { - "color": "#888" - }, - "mode": "lines", - "type": "scatter", - "x": [], - "y": [] - }, - { - "hoverinfo": "text", - "marker": { - "color": [ - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green", - "green" - ], - "colorscale": [ - [ - 0, - "rgb(255,255,217)" - ], - [ - 0.125, - "rgb(237,248,177)" - ], - [ - 0.25, - "rgb(199,233,180)" - ], - [ - 0.375, - "rgb(127,205,187)" - ], - [ - 0.5, - "rgb(65,182,196)" - ], - [ - 0.625, - "rgb(29,145,192)" - ], - [ - 0.75, - "rgb(34,94,168)" - ], - [ - 0.875, - "rgb(37,52,148)" - ], - [ - 1, - "rgb(8,29,88)" - ] - ], - "showscale": true, - "size": 10 - }, - "mode": "markers", - "text": [ - "Name: rachel puthuff
donor_id: 639646bf-5176-474c-b800-1afb34c55b53
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: rachel puthuff
recipient_name: reproductive freedom for all
address: 3717 WHITAKER
city: SCHERTZ
classification: neutral
entity_type: Individual
first_name: RACHEL
id: 639646bf-5176-474c-b800-1afb34c55b53
last_name: PUTHUFF
state: TX
zip: 78154-0000
", - "Name: reproductive freedom for all
classification: neutral
", - "Name: james bennett
donor_id: 447b61fb-39cc-41a9-8dfc-2dbb4e2f3774
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: james bennett
recipient_name: reproductive freedom for all
address: 533 W OAK ST
city: MASON
classification: neutral
entity_type: Individual
first_name: JAMES
id: 447b61fb-39cc-41a9-8dfc-2dbb4e2f3774
last_name: BENNETT
state: MI
zip: 48854-0000
", - "Name: sonny mandouh mr.^
donor_id: 34d28c8d-c0fe-463d-9afe-73269a47389b
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: sonny mandouh mr.^
recipient_name: realtors political action committee of michigan
address: 23760 HOLLANDER ST
city: DEARBORN
classification: neutral
entity_type: Individual
first_name: SONNY
id: 34d28c8d-c0fe-463d-9afe-73269a47389b
last_name: MANDOUH MR.^
state: MI
zip: 48128-0000
", - "Name: realtors political action committee of michigan
classification: neutral
", - "Name: charles crider
donor_id: e765ba37-66d2-4b65-9f42-3902dca518b6
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: charles crider
recipient_name: reproductive freedom for all
address: 1403 WEST HIGHLAND BLVD.
city: BATTLE CREEK
classification: neutral
entity_type: Individual
first_name: CHARLES
id: e765ba37-66d2-4b65-9f42-3902dca518b6
last_name: CRIDER
state: MI
zip: 49015-0000
", - "Name: michelle zukowski-serlin
donor_id: 5c0fe744-23e3-4346-b112-0730c6d4b60c
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: michelle zukowski-serlin
recipient_name: reproductive freedom for all
address: 4853 LANDING WAY
city: KALAMAZOO
classification: neutral
company: choices for change counseling
entity_type: Individual
first_name: MICHELLE
id: 5c0fe744-23e3-4346-b112-0730c6d4b60c
last_name: ZUKOWSKI-SERLIN
occupation: business owners and clinical s
state: MI
zip: 49048-6153
", - "Name: diana gibson-lee
donor_id: df25775c-dad2-4f56-8fcd-b31171a7dcb0
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: diana gibson-lee
recipient_name: veronica klinefelt for state senate
address: 7450 W DYER RD
city: TWINING
classification: neutral
entity_type: Individual
first_name: DIANA
id: df25775c-dad2-4f56-8fcd-b31171a7dcb0
last_name: GIBSON-LEE
state: MI
zip: 48766-9773
", - "Name: veronica klinefelt for state senate
classification: neutral
", - "Name: edward kazala
donor_id: 74b522f4-6214-42cd-9d68-7abfe3e18a07
recipient_id: 707305ca-e572-4109-8429-00600edf3fb8
full_name: edward kazala
recipient_name: elect padma kuppa
address: 70 REVERE CT
city: LAFAYETTE
classification: neutral
entity_type: Individual
first_name: EDWARD
id: 74b522f4-6214-42cd-9d68-7abfe3e18a07
last_name: KAZALA
state: CA
zip: 94549-0000
", - "Name: andrea kovalsky
donor_id: 3dc1360d-e9e8-4e55-ac2e-f608f489ab94
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: andrea kovalsky
recipient_name: veronica klinefelt for state senate
address: 497 SAINT MARKS AVE APT 5P
city: BROOKLYN
classification: neutral
entity_type: Individual
first_name: ANDREA
id: 3dc1360d-e9e8-4e55-ac2e-f608f489ab94
last_name: KOVALSKY
state: NY
zip: 11238-5792
", - "Name: colin palmer
donor_id: ad440dcd-79ad-4323-8f19-c7a491f897f7
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: colin palmer
recipient_name: veronica klinefelt for state senate
address: 531 E 20TH ST APT 10D
city: NEW YORK
classification: neutral
company: not employed
entity_type: Individual
first_name: COLIN
id: ad440dcd-79ad-4323-8f19-c7a491f897f7
last_name: PALMER
occupation: not employed
state: NY
zip: 10010-7604
", - "Name: julie svinicki ms.^
donor_id: 4cb88517-6bc4-45a1-ae2f-be0b76688898
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: julie svinicki ms.^
recipient_name: realtors political action committee of michigan
address: 1608 KIRTLAND DRIVE
city: ANN ARBOR
classification: neutral
entity_type: Individual
first_name: JULIE
id: 4cb88517-6bc4-45a1-ae2f-be0b76688898
last_name: SVINICKI MS.^
state: MI
zip: 48103-0000
", - "Name: audrey lance
donor_id: e8ef0925-3f10-4ebf-b025-dea32e506a50
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: audrey lance
recipient_name: reproductive freedom for all
address: 3945 FORBES AVE APT 444
city: PITTSBURGH
classification: neutral
entity_type: Individual
first_name: AUDREY
id: e8ef0925-3f10-4ebf-b025-dea32e506a50
last_name: LANCE
occupation: physician
state: PA
zip: 15213-0000
", - "Name: walker c evans
donor_id: 9853cee2-ff37-41bd-a469-0e338a4fefc9
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: walker c evans
recipient_name: reproductive freedom for all
address: 2810 NORTHVILLE DR NE
city: GRAND RAPIDS
classification: neutral
entity_type: Individual
first_name: WALKER C
id: 9853cee2-ff37-41bd-a469-0e338a4fefc9
last_name: EVANS
state: MI
zip: 49525-0000
", - "Name: lori henderson
donor_id: 3042129c-b91e-4d6a-b723-74cd7ec55e75
recipient_id: 6b51e739-dd22-4556-8555-6e11264ef4ce
full_name: lori henderson
recipient_name: planned parenthood advocates of mi
address: 2401 HARDWOOD AVE
city: ROYAK OAK
classification: neutral
entity_type: Individual
first_name: LORI
id: 3042129c-b91e-4d6a-b723-74cd7ec55e75
last_name: HENDERSON
state: MI
zip: 48067-0000
", - "Name: planned parenthood advocates of mi
classification: neutral
", - "Name: brett lundie
donor_id: 932450e5-f8fc-4cb2-baac-acfad686561f
recipient_id: 2f221dfb-d552-4234-83f8-cd05d10f1266
full_name: brett lundie
recipient_name: citizens to support mi women and children
address: 7779 CIRCLE DR
city: LAINGSBURG
classification: neutral
entity_type: Individual
first_name: BRETT
id: 932450e5-f8fc-4cb2-baac-acfad686561f
last_name: LUNDIE
state: MI
zip: 48848-0000
", - "Name: citizens to support mi women and children
classification: neutral
", - "Name: ian robinson
donor_id: 757923ec-02e3-424e-81b9-4152f6dd165b
recipient_id: 06ebbb03-574c-445b-9416-7d2134a06d1f
full_name: ian robinson
recipient_name: committee to elect james e johnson jr
address: 3435 BRENTWOOD CT
city: ANN ARBOR
classification: neutral
company: university of michigan
entity_type: Individual
first_name: IAN
id: 757923ec-02e3-424e-81b9-4152f6dd165b
last_name: ROBINSON
occupation: faculty
state: MI
zip: 48108-1757
", - "Name: committee to elect james e johnson jr
classification: neutral
", - "Name: kelly bean
donor_id: 8521781f-6ca7-43dc-90a6-c1af13da9e2a
recipient_id: 00a76143-0f24-4683-9963-09f10803e957
full_name: kelly bean
recipient_name: friends of jerry neyer
address: 1405 E BATTLE RD
city: ROSEBUSH
classification: neutral
entity_type: Individual
first_name: KELLY
id: 8521781f-6ca7-43dc-90a6-c1af13da9e2a
last_name: BEAN
state: MI
zip: 48878-9732
", - "Name: friends of jerry neyer
classification: neutral
", - "Name: sandra johnson
donor_id: 49bcd93b-241b-4343-8bbf-bcf70d828c8e
recipient_id: 7ee2db24-b832-4f1b-af2e-e9c8eaf706bd
full_name: sandra johnson
recipient_name: committee to elect charise anderson
address: 424 N 21ST ST 0
city: MONTEBELLO
classification: neutral
entity_type: Individual
first_name: SANDRA
id: 49bcd93b-241b-4343-8bbf-bcf70d828c8e
last_name: JOHNSON
occupation: eligibility worker
state: CA
zip: 90640-0000
", - "Name: committee to elect charise anderson
classification: neutral
", - "Name: christopher mishler
donor_id: 7b8ee884-4471-493d-bf17-386d57bf3f6d
recipient_id: 2f221dfb-d552-4234-83f8-cd05d10f1266
full_name: christopher mishler
recipient_name: citizens to support mi women and children
address: 3690 VORHIES ROAD
city: ANN ARBOR
classification: neutral
entity_type: Individual
first_name: CHRISTOPHER
id: 7b8ee884-4471-493d-bf17-386d57bf3f6d
last_name: MISHLER
state: MI
zip: 48105-0000
", - "Name: stacy leroy daniels
donor_id: 5a40e7db-bb2a-47f4-ac92-5584988c8a5e
recipient_id: 7f272fe4-d592-453c-9ca1-315ea3fdcff1
full_name: stacy leroy daniels
recipient_name: bill g schuette for state representative
address: 3901 ORCHARD DRIVE
city: MIDLAND
classification: neutral
entity_type: Individual
first_name: STACY LEROY
id: 5a40e7db-bb2a-47f4-ac92-5584988c8a5e
last_name: DANIELS
state: MI
zip: 48640-0000
", - "Name: bill g schuette for state representative
classification: neutral
", - "Name: suzanne r weinheimer
donor_id: 029a23eb-d90f-405b-995c-c8dc266e255f
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: suzanne r weinheimer
recipient_name: reproductive freedom for all
address: 11045 8TH AVENUE NE APT 826
city: SEATTLE
classification: neutral
entity_type: Individual
first_name: SUZANNE R
id: 029a23eb-d90f-405b-995c-c8dc266e255f
last_name: WEINHEIMER
state: WA
zip: 98125-0000
", - "Name: dustin shaeffer mr.^
donor_id: fc041110-7c11-47af-b1bf-5daca974e4ee
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: dustin shaeffer mr.^
recipient_name: realtors political action committee of michigan
address: 60451 MOJAVE LANE
city: WASHINGTON
classification: neutral
entity_type: Individual
first_name: DUSTIN
id: fc041110-7c11-47af-b1bf-5daca974e4ee
last_name: SHAEFFER MR.^
state: MI
zip: 48094-0000
", - "Name: debra byl
donor_id: b8e9c951-5c8c-42d3-91e1-d6457b28f2ae
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: debra byl
recipient_name: reproductive freedom for all
address: 987 BRADFORD GREENS
city: GRAND RAPIDS
classification: neutral
entity_type: Individual
first_name: DEBRA
id: b8e9c951-5c8c-42d3-91e1-d6457b28f2ae
last_name: BYL
state: MI
zip: 49525-0000
", - "Name: pamela wimp
donor_id: 88ccb4d4-c756-4039-bac2-77a610d69bb0
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: pamela wimp
recipient_name: reproductive freedom for all
address: 8030 MERCER CT NE
city: LACEY
classification: neutral
entity_type: Individual
first_name: PAMELA
id: 88ccb4d4-c756-4039-bac2-77a610d69bb0
last_name: WIMP
state: WA
zip: 98516-6336
", - "Name: lori wortz
donor_id: 821a27dc-aa00-436e-80e2-655ce26bc830
recipient_id: 7f272fe4-d592-453c-9ca1-315ea3fdcff1
full_name: lori wortz
recipient_name: bill g schuette for state representative
address: 4144 MERIDIAN RD
city: OKEMOS
classification: neutral
company: braenaru consulting
entity_type: Individual
first_name: LORI
id: 821a27dc-aa00-436e-80e2-655ce26bc830
last_name: WORTZ
occupation: consultant
state: MI
zip: 48864-0000
", - "Name: janet reid
donor_id: 25f2cb86-6d01-4fc2-9aaf-d276ce634a47
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: janet reid
recipient_name: reproductive freedom for all
address: 2378 EATON GATE RD
city: LAKE ORION
classification: neutral
entity_type: Individual
first_name: JANET
id: 25f2cb86-6d01-4fc2-9aaf-d276ce634a47
last_name: REID
state: MI
zip: 48360-1869
", - "Name: gary henderson
donor_id: 05a6c5c3-4a3f-41e0-a9d5-e54f33703d2d
recipient_id: 7f272fe4-d592-453c-9ca1-315ea3fdcff1
full_name: gary henderson
recipient_name: bill g schuette for state representative
address: 1601 KINGSWOOD DRIVE
city: LANSING
classification: neutral
company: aircraft precision prod. inc.
entity_type: Individual
first_name: GARY
id: 05a6c5c3-4a3f-41e0-a9d5-e54f33703d2d
last_name: HENDERSON
occupation: sales purchasing manager
state: MI
zip: 48912-0000
", - "Name: claudette levesque
donor_id: 26d5e377-57c4-4f33-95ce-4209bff4242b
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: claudette levesque
recipient_name: reproductive freedom for all
address: 41 CATERPILLAR HILL RD
city: SARGENTVILLE
classification: neutral
entity_type: Individual
first_name: CLAUDETTE
id: 26d5e377-57c4-4f33-95ce-4209bff4242b
last_name: LEVESQUE
state: ME
zip: 04673-2464
", - "Name: graham chapman
donor_id: 8045638c-db65-4a13-9016-05e73766b5b1
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: graham chapman
recipient_name: reproductive freedom for all
address: 1914 CLINTON ST
city: LOS ANGELES
classification: neutral
entity_type: Individual
first_name: GRAHAM
id: 8045638c-db65-4a13-9016-05e73766b5b1
last_name: CHAPMAN
state: CA
zip: 90026-4137
", - "Name: john olson
donor_id: 1ff268c7-fbff-4f94-8810-48f31bb53681
recipient_id: 00a76143-0f24-4683-9963-09f10803e957
full_name: john olson
recipient_name: friends of jerry neyer
address: 6025 VERDE TRL S APT K217
city: BOCA RATON
classification: neutral
entity_type: Individual
first_name: JOHN
id: 1ff268c7-fbff-4f94-8810-48f31bb53681
last_name: OLSON
state: FL
zip: 33433-4442
", - "Name: christina ridalls ms.^
donor_id: 9bea8116-83a3-486a-a457-50c0f80af060
recipient_id: f4360141-0f69-41dc-bb51-facbf40ae4a4
full_name: christina ridalls ms.^
recipient_name: realtors political action committee of michigan
address: 3083 BEATTIE RD
city: HOWELL
classification: neutral
entity_type: Individual
first_name: CHRISTINA
id: 9bea8116-83a3-486a-a457-50c0f80af060
last_name: RIDALLS MS.^
state: MI
zip: 48843-0000
", - "Name: dylynn mclean
donor_id: a1943974-4abe-4093-be0b-edcc56a97ffe
recipient_id: bbe89315-1939-46e3-a5c0-2d6e5b28bc95
full_name: dylynn mclean
recipient_name: 1st congressional dist rep comm
address: 1531 W 20 MILE RD
city: SAULT STE MARIE
classification: neutral
entity_type: Individual
first_name: DYLYNN
id: a1943974-4abe-4093-be0b-edcc56a97ffe
last_name: MCLEAN
state: MI
zip: 49783-0000
", - "Name: 1st congressional dist rep comm
classification: neutral
", - "Name: andrew morris
donor_id: 767c512a-9c5a-4230-90ab-3fd40d731f60
recipient_id: 707305ca-e572-4109-8429-00600edf3fb8
full_name: andrew morris
recipient_name: elect padma kuppa
address: 1118 MORNINGSIDE AVE
city: SCHENECTADY
classification: neutral
entity_type: Individual
first_name: ANDREW
id: 767c512a-9c5a-4230-90ab-3fd40d731f60
last_name: MORRIS
state: NY
zip: 12309-5630
", - "Name: elect padma kuppa
classification: neutral
", - "Name: martha scoppa
donor_id: 78fcc760-825f-404a-b058-a88a99992d98
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: martha scoppa
recipient_name: reproductive freedom for all
address: 32 COLD SPRING RD
city: LIBERTY
classification: neutral
entity_type: Individual
first_name: MARTHA
id: 78fcc760-825f-404a-b058-a88a99992d98
last_name: SCOPPA
state: NY
zip: 12754-0000
", - "Name: carol woodard
donor_id: d4ba0589-99d6-4455-a978-315395322208
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: carol woodard
recipient_name: reproductive freedom for all
address: 5143 SPRING MEADOWS
city: TROY
classification: neutral
entity_type: Individual
first_name: CAROL
id: d4ba0589-99d6-4455-a978-315395322208
last_name: WOODARD
state: MI
zip: 48098-0000
", - "Name: rochelle albright
donor_id: 87b3feed-01a5-4cc8-82cd-cf9c78977534
recipient_id: e3294ecb-f6df-48a0-b3b4-7048a9c650a7
full_name: rochelle albright
recipient_name: michael detmer for state senate
address: 1840 GRAY RD
city: HOWELL
classification: neutral
entity_type: Individual
first_name: ROCHELLE
id: 87b3feed-01a5-4cc8-82cd-cf9c78977534
last_name: ALBRIGHT
state: MI
zip: 48843-0000
", - "Name: michael detmer for state senate
classification: neutral
", - "Name: richard mayfield
donor_id: 80ec6920-a933-4c3e-9487-74cbfe6716f7
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: richard mayfield
recipient_name: veronica klinefelt for state senate
address: 3221 GRISCHY LN
city: CINCINNATI
classification: neutral
entity_type: Individual
first_name: RICHARD
id: 80ec6920-a933-4c3e-9487-74cbfe6716f7
last_name: MAYFIELD
state: OH
zip: 45208-3109
", - "Name: charles risch
donor_id: 6b4b51e8-f105-4cc1-96f7-cec2d931e58f
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: charles risch
recipient_name: reproductive freedom for all
address: 300 S WACKER DR
city: CHICAGO
classification: neutral
entity_type: Individual
first_name: CHARLES
id: 6b4b51e8-f105-4cc1-96f7-cec2d931e58f
last_name: RISCH
state: IL
zip: 60606-6680
", - "Name: barbara miller
donor_id: 47043446-3b77-4a34-9d0d-a21786400d9b
recipient_id: 6b7da911-9835-4789-9635-f6ad2a71dd86
full_name: barbara miller
recipient_name: veronica klinefelt for state senate
address: 820 W END AVE APT 6A
city: NEW YORK
classification: neutral
entity_type: Individual
first_name: BARBARA
id: 47043446-3b77-4a34-9d0d-a21786400d9b
last_name: MILLER
state: NY
zip: 10025-5330
", - "Name: kevin korpi
donor_id: 10f51417-a0e9-4a2c-8bdb-e5d045fcab08
recipient_id: 5f7c53e3-d1be-47a9-acc4-70828a8c7a69
full_name: kevin korpi
recipient_name: committee to elect ed mcbroom
address: 220 MAC AVE APT 418
city: EAST LANSING
classification: neutral
company: acuitas
entity_type: Individual
first_name: KEVIN
id: 10f51417-a0e9-4a2c-8bdb-e5d045fcab08
last_name: KORPI
occupation: lobbyist
state: MI
zip: 48823-0000
", - "Name: committee to elect ed mcbroom
classification: neutral
", - "Name: wayne miller
donor_id: 14208b99-1ecb-4b33-becf-c30882e9b302
recipient_id: f88fdd05-e3e4-4d51-8511-1ffd35965c8e
full_name: wayne miller
recipient_name: committee to elect jack richert
address: 27301 SCENIC HWY
city: FRANKLIN
classification: neutral
company: miller & tischler pc
entity_type: Individual
first_name: WAYNE
id: 14208b99-1ecb-4b33-becf-c30882e9b302
last_name: MILLER
occupation: attorney
state: MI
zip: 48025-0000
", - "Name: committee to elect jack richert
classification: neutral
", - "Name: mary soens
donor_id: 664b4540-8b50-44d3-8570-cb797a4859fe
recipient_id: 707305ca-e572-4109-8429-00600edf3fb8
full_name: mary soens
recipient_name: elect padma kuppa
address: 55 N HANCOCK ST
city: LEXINGTON
classification: neutral
entity_type: Individual
first_name: MARY
id: 664b4540-8b50-44d3-8570-cb797a4859fe
last_name: SOENS
state: MA
zip: 02420-0000
", - "Name: rebecca baskin
donor_id: 9eb92629-9f8e-4bb5-8dc3-373b56a7db3a
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: rebecca baskin
recipient_name: reproductive freedom for all
address: 680 BERKSHIRE DR
city: SALINE
classification: neutral
entity_type: Individual
first_name: REBECCA
id: 9eb92629-9f8e-4bb5-8dc3-373b56a7db3a
last_name: BASKIN
state: MI
zip: 48176-1087
", - "Name: edward kaminski
donor_id: 5b4130f6-d8dd-4739-aa68-2fe81dd4532b
recipient_id: 76a600c1-7ead-437a-85ad-0cca7573393b
full_name: edward kaminski
recipient_name: friends of brian hosticka
address: 8765 LEHMAN RD
city: MONTAGUE
classification: neutral
entity_type: Individual
first_name: EDWARD
id: 5b4130f6-d8dd-4739-aa68-2fe81dd4532b
last_name: KAMINSKI
state: MI
zip: 49437-9326
", - "Name: friends of brian hosticka
classification: neutral
", - "Name: robert brown
donor_id: 766a34f7-1c8b-4635-a69c-0bff1bf155be
recipient_id: 2e8c9124-2258-45e3-a198-e8c1798c49f2
full_name: robert brown
recipient_name: monroe plumbers and pipe fitters local 671 pac fund
address: 1207 SANDHURST DR
city: TALLAHASSEE
classification: neutral
entity_type: Individual
first_name: ROBERT
id: 766a34f7-1c8b-4635-a69c-0bff1bf155be
last_name: BROWN
state: FL
zip: 32312-2527
", - "Name: monroe plumbers and pipe fitters local 671 pac fund
classification: neutral
", - "Name: sandra braddock
donor_id: e42e7230-02f0-4b28-ba39-7b68e796d510
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: sandra braddock
recipient_name: reproductive freedom for all
address: 20087 EDGEWATER DRIVE
city: CANYON COUNTRY
classification: neutral
entity_type: Individual
first_name: SANDRA
id: e42e7230-02f0-4b28-ba39-7b68e796d510
last_name: BRADDOCK
state: CA
zip: 91351-0000
", - "Name: dana fortier
donor_id: 74b93106-3c9f-4f36-b52e-36143e97e7ce
recipient_id: 159692de-135a-45bd-8889-1ab1882ed54c
full_name: dana fortier
recipient_name: committee to elect vicki barnett to state senate
address: 23861 W LEBOST
city: NOVI
classification: neutral
entity_type: Individual
first_name: DANA
id: 74b93106-3c9f-4f36-b52e-36143e97e7ce
last_name: FORTIER
state: MI
zip: 48375-0000
", - "Name: committee to elect vicki barnett to state senate
classification: neutral
", - "Name: rachel geiersbach
donor_id: 40d2d39f-f21b-4130-8d7b-47ca810c9aa9
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: rachel geiersbach
recipient_name: reproductive freedom for all
address: 3412 OLD KAWKAWLIN RD
city: BAY CITY
classification: neutral
entity_type: Individual
first_name: RACHEL
id: 40d2d39f-f21b-4130-8d7b-47ca810c9aa9
last_name: GEIERSBACH
state: MI
zip: 48706-0000
", - "Name: matthew burgess
donor_id: de98dec5-b8d3-4701-a9dd-a254aca2c4cf
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: matthew burgess
recipient_name: reproductive freedom for all
address: 8823 SPECTRUM CENTER BLVD 2313
city: SAN DIEGO
classification: neutral
entity_type: Individual
first_name: MATTHEW
id: de98dec5-b8d3-4701-a9dd-a254aca2c4cf
last_name: BURGESS
state: CA
zip: 92123-0000
", - "Name: teresa robertson
donor_id: dcf2b3a5-ddf4-4027-8a75-4477893854ff
recipient_id: 4844870e-39f8-41d7-8a41-a824d5dd9998
full_name: teresa robertson
recipient_name: reproductive freedom for all
address: 7101 RIVER GLEN DR SE
city: CALEDONIA
classification: neutral
entity_type: Individual
first_name: TERESA
id: dcf2b3a5-ddf4-4027-8a75-4477893854ff
last_name: ROBERTSON
state: MI
zip: 49316-8136
" - ], - "type": "scatter", - "x": [], - "y": [] - } - ], - "layout": { - "hovermode": "closest", - "margin": { - "b": 20, - "l": 5, - "r": 5, - "t": 40 - }, - "showlegend": true, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "font": { - "size": 16 - }, - "text": "Network Graph Indicating Campaign Contributions from 2018-2022" - }, - "xaxis": { - "showgrid": true, - "showticklabels": false, - "zeroline": true - }, - "yaxis": { - "showgrid": true, - "showticklabels": false, - "zeroline": true - } - } - }, - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "def create_network_nodes(df: pd.DataFrame) -> nx.MultiDiGraph:\n", - " G = nx.MultiDiGraph()\n", - " \n", - " # Define columns for edge attributes\n", - " edge_columns = ['amount', 'donor_office', 'office_sought', 'party', 'purpose', 'transaction_id', 'transaction_type', 'year']\n", - " # Define columns for node attributes\n", - " node_columns = ['donor_id', 'recipient_id', 'full_name', 'recipient_name', 'address', 'city', 'classification', 'company', 'donor_type', 'entity_type', 'first_name', 'id', 'last_name', 'occupation', 'recipient_type', 'state', 'zip']\n", - " \n", - " for _, row in df.iterrows(): \n", - " # Add nodes\n", - " G.add_node(row['full_name'], **row[node_columns].dropna().to_dict())\n", - " G.add_node(row['recipient_name'], classification='neutral') # Adding recipient nodes with default classification\n", - "\n", - " # Add edges\n", - " edge_attributes = row[edge_columns].dropna().to_dict()\n", - " G.add_edge(row['full_name'], row['recipient_name'], **edge_attributes)\n", - " \n", - " return G\n", - "\n", - "def plot_network_graph(G: nx.MultiDiGraph):\n", - " edge_trace = go.Scatter(x=[], y=[], line=dict(color='#888'), hoverinfo='text', mode='lines')\n", - " hovertext = []\n", - "\n", - " for edge in G.edges(data=True):\n", - " source = edge[0]\n", - " target = edge[1]\n", - " hovertext.append(f\"Amount: {edge[2]['amount']:.2f}\")\n", - "\n", - " edge_trace['hovertext'] = hovertext\n", - "\n", - " node_trace = go.Scatter(x=[], y=[], text=[], mode='markers', hoverinfo='text', marker=dict(showscale=True, colorscale='YlGnBu', size=10))\n", - " node_trace['marker']['color'] = []\n", - "\n", - " for node in G.nodes():\n", - " node_info = f\"Name: {node}
\"\n", - " for key, value in G.nodes[node].items():\n", - " node_info += f\"{key}: {value}
\"\n", - " node_trace['text'] += tuple([node_info])\n", - " # Get the classification value for the node\n", - " classification = G.nodes[node].get('classification', 'neutral')\n", - " # Assign a color based on the classification value\n", - " if classification == 'c':\n", - " color = 'blue'\n", - " elif classification == 'f':\n", - " color = 'red'\n", - " else:\n", - " color = 'green' # Default color for unknown classification\n", - " node_trace['marker']['color'] += tuple([color])\n", - "\n", - " # Define layout settings\n", - " layout = go.Layout(\n", - " title='Network Graph Indicating Campaign Contributions from 2018-2022',\n", - " titlefont=dict(size=16),\n", - " showlegend=True,\n", - " hovermode='closest',\n", - " margin=dict(b=20, l=5, r=5, t=40),\n", - " xaxis=dict(showgrid=True, zeroline=True, showticklabels=False),\n", - " yaxis=dict(showgrid=True, zeroline=True, showticklabels=False)\n", - " )\n", - "\n", - " fig = go.Figure(data=[edge_trace, node_trace], layout=layout)\n", - "\n", - " # Log information about the figure\n", - "\n", - " fig.show()\n", - "\n", - "sample = grouped_sample.sample(50)\n", - "plot_network_graph(create_network_nodes(sample))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hoverinfo": "none", - "line": { - "color": "#888", - "width": 0.5 - }, - "mode": "lines", - "type": "scatter", - "x": [ - 0.4182243125490408, - 0.3740122792611037, - null, - 0.4182243125490408, - 0.37848025459696877, - null, - 0.4182243125490408, - 0.3821391536049519, - null, - 0.4182243125490408, - 0.31305791514229697, - null, - 0.4182243125490408, - 0.3246624829381992, - null, - 0.4182243125490408, - 0.33203393677870674, - null, - 0.4182243125490408, - 0.4404718698088387, - null, - 0.4182243125490408, - 0.3393815448042514, - null, - 0.4182243125490408, - 0.32444561774289593, - null, - 0.4182243125490408, - 0.33721825060791266, - null, - 0.4182243125490408, - 0.5201251204037126, - null, - 0.12286879065958844, - 0.23992481624351925, - null, - 0.12286879065958844, - 0.09276814106220677, - null, - 0.12286879065958844, - 0.07426685281627932, - null, - 0.12286879065958844, - 0.09471702229050472, - null, - 0.12286879065958844, - 0.06879886671193436, - null, - 0.12286879065958844, - 0.1823584228427031, - null, - 0.12286879065958844, - 0.19852054651169693, - null, - 0.12286879065958844, - 0.13747604708068628, - null, - 0.12286879065958844, - 0.22007362873840486, - null, - 0.12286879065958844, - 0.13940667248499528, - null, - 0.12286879065958844, - 0.0201693226965588, - null, - 0.12286879065958844, - 0.16862303760247477, - null, - 0.12286879065958844, - 0.12355952994556385, - null, - 0.12286879065958844, - 0.04781523934390508, - null, - 0.6730431696885844, - 0.6013564651959642, - null, - 0.6730431696885844, - 0.662108954544855, - null, - 0.6730431696885844, - 0.7007214129943925, - null, - 0.6730431696885844, - 0.7188906153197968, - null, - 0.6730431696885844, - 0.7255980413609877, - null, - 0.6730431696885844, - 0.6802728591951641, - null, - 0.6730431696885844, - 0.7518492361353024, - null, - 0.38165116541180344, - 0.32578353530864457, - null, - 0.38165116541180344, - 0.413948124857326, - null, - 0.38165116541180344, - 0.44119458804978295, - null, - 0.38165116541180344, - 0.3328704753356456, - null, - 0.38165116541180344, - 0.3499260998923053, - null, - 0.38165116541180344, - 0.37301066653863624, - null, - 0.38165116541180344, - 0.4277213938753692, - null, - 0.38165116541180344, - 0.3247821296168134, - null, - 0.38165116541180344, - 0.3187675293980876, - null, - 0.38165116541180344, - 0.34114125407236195, - null, - 0.6084965344664286, - 0.5531504465254558, - null, - 0.6084965344664286, - 0.587704695878027, - null, - 0.6084965344664286, - 0.5593951498649633, - null, - 0.6084965344664286, - 0.5845953849421676, - null, - 0.6084965344664286, - 0.6058132814274794, - null, - 0.6084965344664286, - 0.6322124026692795, - null, - 0.6084965344664286, - 0.5201251204037126, - null, - 0.18155558675901884, - 0.2742000416622462, - null, - 0.18155558675901884, - 0.15570283642495664, - null, - 0.18155558675901884, - 0.19921682827804632, - null, - 0.18155558675901884, - 0.2955343345493908, - null, - 0.18155558675901884, - 0.298647499376007, - null, - 0.18155558675901884, - 0.0914406510425998, - null, - 0.18155558675901884, - 0.0875467755337247, - null, - 0.18155558675901884, - 0.08997327822205015, - null, - 0.18155558675901884, - 0.25656414507004344, - null, - 0.18155558675901884, - 0.20133087739958255, - null, - 0.7722862313192606, - 0.7408684543182315, - null, - 0.7722862313192606, - 0.8385234321105272, - null, - 0.7722862313192606, - 0.7333209824474588, - null, - 0.5368181409256901, - 0.595945044435614, - null, - 0.5368181409256901, - 0.6327007577432437, - null, - 0.5368181409256901, - 0.526779936668903, - null, - 0.5368181409256901, - 0.5433115547736789, - null, - 0.5368181409256901, - 0.5274116361492907, - null, - 0.5368181409256901, - 0.555788147264811, - null, - 0.5368181409256901, - 0.5805679633404117, - null, - 0.5368181409256901, - 0.5989925957177575, - null, - 0.5368181409256901, - 0.48218022499136737, - null, - 0.5368181409256901, - 0.6058132814274794, - null, - 0.5368181409256901, - 0.47443124751760235, - null, - 0.5368181409256901, - 0.5291812256005789, - null, - 0.5368181409256901, - 0.5621062195646831, - null, - 0.5368181409256901, - 0.5465171974419871, - null, - 0.8304626469521129, - 0.8266354543284289, - null, - 0.8304626469521129, - 0.7247552078664479, - null, - 0.8304626469521129, - 0.7827775151390383, - null, - 0.8304626469521129, - 0.9082570345357789, - null, - 0.8304626469521129, - 0.916634041055854, - null, - 0.8304626469521129, - 0.8613129225222332, - null, - 0.8304626469521129, - 0.7703024251104211, - null, - 0.8304626469521129, - 0.9005048863870916, - null, - 0.8304626469521129, - 0.9240127894624793, - null, - 0.7924139234898422, - 0.800297854626628, - null, - 0.7924139234898422, - 0.7364515013041172, - null, - 0.7924139234898422, - 0.8589937476561325, - null, - 0.7924139234898422, - 0.8247840830312709, - null, - 0.7924139234898422, - 0.7948577020793985, - null, - 0.7924139234898422, - 0.7059759544943667, - null, - 0.7924139234898422, - 0.8846357375826375, - null, - 0.7924139234898422, - 0.8323549266756429, - null, - 0.8266354543284289, - 0.7247552078664479, - null, - 0.8266354543284289, - 0.7827775151390383, - null, - 0.8266354543284289, - 0.9082570345357789, - null, - 0.8266354543284289, - 0.7042334738295596, - null, - 0.8266354543284289, - 0.8613129225222332, - null, - 0.8266354543284289, - 0.7703024251104211, - null, - 0.8266354543284289, - 0.9240127894624793, - null, - 0.8266354543284289, - 0.8680862155815134, - null, - 0.4023039585223629, - 0.4611021425875542, - null, - 0.4023039585223629, - 0.44175944307536974, - null, - 0.4023039585223629, - 0.3318561006769827, - null, - 0.4023039585223629, - 0.4349682989231034, - null, - 0.4023039585223629, - 0.29978148854693865, - null, - 0.4023039585223629, - 0.4442228752887084, - null, - 0.5084198498293618, - 0.5436816885151938, - null, - 0.5084198498293618, - 0.5229468203255856, - null, - 0.5084198498293618, - 0.4611021425875542, - null, - 0.5084198498293618, - 0.44175944307536974, - null, - 0.5084198498293618, - 0.6234379896430121, - null, - 0.5084198498293618, - 0.4442228752887084, - null, - 0.23992481624351925, - 0.27440213390552737, - null, - 0.23992481624351925, - 0.2728250610713022, - null, - 0.23992481624351925, - 0.1823584228427031, - null, - 0.23992481624351925, - 0.19852054651169693, - null, - 0.23992481624351925, - 0.22007362873840486, - null, - 0.23992481624351925, - 0.13940667248499528, - null, - 0.23992481624351925, - 0.16862303760247477, - null, - 0.23992481624351925, - 0.12355952994556385, - null, - 0.2742000416622462, - 0.15570283642495664, - null, - 0.2742000416622462, - 0.32578353530864457, - null, - 0.2742000416622462, - 0.3740122792611037, - null, - 0.2742000416622462, - 0.2955343345493908, - null, - 0.2742000416622462, - 0.31305791514229697, - null, - 0.2742000416622462, - 0.298647499376007, - null, - 0.2742000416622462, - 0.3328704753356456, - null, - 0.2742000416622462, - 0.3499260998923053, - null, - 0.2742000416622462, - 0.3181124346701171, - null, - 0.2742000416622462, - 0.3247821296168134, - null, - 0.2742000416622462, - 0.25656414507004344, - null, - 0.2742000416622462, - 0.3187675293980876, - null, - 0.2742000416622462, - 0.20133087739958255, - null, - 0.2742000416622462, - 0.34114125407236195, - null, - 0.15570283642495664, - 0.07513674080757637, - null, - 0.15570283642495664, - 0.05512117222879742, - null, - 0.15570283642495664, - 0.05194805532761382, - null, - 0.15570283642495664, - 0.06202421257916635, - null, - 0.15570283642495664, - 0.09053866681881584, - null, - 0.15570283642495664, - 0.1573630170264504, - null, - 0.15570283642495664, - 0.0852382135963593, - null, - 0.15570283642495664, - 0.0875467755337247, - null, - 0.15570283642495664, - 0.08997327822205015, - null, - 0.15570283642495664, - 0.20133087739958255, - null, - 0.15570283642495664, - 0.038579501382332126, - null, - 0.07513674080757637, - 0.1130639188502468, - null, - 0.07513674080757637, - 0.05512117222879742, - null, - 0.07513674080757637, - 0.07163295816605642, - null, - 0.07513674080757637, - 0.06202421257916635, - null, - 0.07513674080757637, - 0.09053866681881584, - null, - 0.07513674080757637, - 0.1573630170264504, - null, - 0.07513674080757637, - 0.0023771443647881974, - null, - 0.07513674080757637, - 0.0852382135963593, - null, - 0.07513674080757637, - 0.17086936775877049, - null, - 0.07513674080757637, - 0.0875467755337247, - null, - 0.07513674080757637, - 0.08997327822205015, - null, - 0.07513674080757637, - 0.020212382594376965, - null, - 0.07513674080757637, - 0.0897773631019545, - null, - 0.07513674080757637, - 0.038579501382332126, - null, - 0.7247552078664479, - 0.6327007577432437, - null, - 0.7247552078664479, - 0.662108954544855, - null, - 0.7247552078664479, - 0.7827775151390383, - null, - 0.7247552078664479, - 0.7007214129943925, - null, - 0.7247552078664479, - 0.7188906153197968, - null, - 0.7247552078664479, - 0.7042334738295596, - null, - 0.7247552078664479, - 0.7255980413609877, - null, - 0.7247552078664479, - 0.7703024251104211, - null, - 0.2586357176925591, - 0.3019474379086241, - null, - 0.2586357176925591, - 0.2121217358781844, - null, - 0.595945044435614, - 0.6327007577432437, - null, - 0.595945044435614, - 0.526779936668903, - null, - 0.595945044435614, - 0.662108954544855, - null, - 0.595945044435614, - 0.5433115547736789, - null, - 0.595945044435614, - 0.5274116361492907, - null, - 0.595945044435614, - 0.7042334738295596, - null, - 0.595945044435614, - 0.555788147264811, - null, - 0.595945044435614, - 0.5805679633404117, - null, - 0.595945044435614, - 0.5989925957177575, - null, - 0.595945044435614, - 0.6058132814274794, - null, - 0.595945044435614, - 0.5291812256005789, - null, - 0.595945044435614, - 0.5621062195646831, - null, - 0.9428542201780316, - 0.8511753697833563, - null, - 0.9428542201780316, - 0.89080246263295, - null, - 0.9428542201780316, - 0.9521646983336837, - null, - 0.9428542201780316, - 0.9663892923019699, - null, - 0.9428542201780316, - 0.9425745666137786, - null, - 0.9428542201780316, - 0.9851894520572745, - null, - 0.9428542201780316, - 0.9573079778783831, - null, - 0.9428542201780316, - 0.9473667691929577, - null, - 0.9428542201780316, - 0.838803404513024, - null, - 0.03304679952258993, - 0.05596958524873419, - null, - 0.03304679952258993, - 0.014269300880037306, - null, - 0.6013564651959642, - 0.662108954544855, - null, - 0.6013564651959642, - 0.7007214129943925, - null, - 0.6013564651959642, - 0.7188906153197968, - null, - 0.6013564651959642, - 0.555788147264811, - null, - 0.6013564651959642, - 0.5293212253918783, - null, - 0.6013564651959642, - 0.5291812256005789, - null, - 0.6013564651959642, - 0.5191285820034173, - null, - 0.6013564651959642, - 0.5465171974419871, - null, - 0.1130639188502468, - 0.07163295816605642, - null, - 0.1130639188502468, - 0.09053866681881584, - null, - 0.1130639188502468, - 0.1573630170264504, - null, - 0.1130639188502468, - 0.13747604708068628, - null, - 0.1130639188502468, - 0.2275256207367028, - null, - 0.1130639188502468, - 0.18507593174525072, - null, - 0.1130639188502468, - 0.17086936775877049, - null, - 0.1130639188502468, - 0.0897773631019545, - null, - 0.5531504465254558, - 0.47055154706870017, - null, - 0.5531504465254558, - 0.5274116361492907, - null, - 0.5531504465254558, - 0.587704695878027, - null, - 0.5531504465254558, - 0.5989925957177575, - null, - 0.5531504465254558, - 0.5845953849421676, - null, - 0.5531504465254558, - 0.6058132814274794, - null, - 0.5531504465254558, - 0.4564806171162211, - null, - 0.5531504465254558, - 0.5201251204037126, - null, - 0.1635981270944994, - 0.19921682827804632, - null, - 0.1635981270944994, - 0.10310287300704979, - null, - 0.1635981270944994, - 0.05973078995013337, - null, - 0.1635981270944994, - 0.0914406510425998, - null, - 0.1635981270944994, - 0.14711158829428328, - null, - 0.1635981270944994, - 0.21535391032155426, - null, - 0.05512117222879742, - 0.07163295816605642, - null, - 0.05512117222879742, - 0.05194805532761382, - null, - 0.05512117222879742, - 0.06202421257916635, - null, - 0.05512117222879742, - 0.09053866681881584, - null, - 0.05512117222879742, - 0.0023771443647881974, - null, - 0.05512117222879742, - 0.0852382135963593, - null, - 0.05512117222879742, - 0.0875467755337247, - null, - 0.05512117222879742, - 0.08997327822205015, - null, - 0.05512117222879742, - 0.020212382594376965, - null, - 0.05512117222879742, - 0.02312833765025224, - null, - 0.05512117222879742, - 0.04237200971819888, - null, - 0.05512117222879742, - 0.038579501382332126, - null, - 0.05512117222879742, - 0.01777064460825195, - null, - 0.32578353530864457, - 0.413948124857326, - null, - 0.32578353530864457, - 0.3328704753356456, - null, - 0.32578353530864457, - 0.3499260998923053, - null, - 0.32578353530864457, - 0.37301066653863624, - null, - 0.32578353530864457, - 0.2619562675328274, - null, - 0.32578353530864457, - 0.4277213938753692, - null, - 0.32578353530864457, - 0.3247821296168134, - null, - 0.32578353530864457, - 0.3187675293980876, - null, - 0.32578353530864457, - 0.34114125407236195, - null, - 0.27440213390552737, - 0.2728250610713022, - null, - 0.27440213390552737, - 0.1823584228427031, - null, - 0.27440213390552737, - 0.19852054651169693, - null, - 0.27440213390552737, - 0.22007362873840486, - null, - 0.27440213390552737, - 0.37301066653863624, - null, - 0.27440213390552737, - 0.2275256207367028, - null, - 0.27440213390552737, - 0.2619562675328274, - null, - 0.27440213390552737, - 0.3414075728554137, - null, - 0.2728250610713022, - 0.1823584228427031, - null, - 0.2728250610713022, - 0.37549158943196925, - null, - 0.2728250610713022, - 0.22007362873840486, - null, - 0.2728250610713022, - 0.16862303760247477, - null, - 0.6346565064837861, - 0.7364515013041172, - null, - 0.6346565064837861, - 0.5436816885151938, - null, - 0.6346565064837861, - 0.5461279353327784, - null, - 0.6346565064837861, - 0.7059759544943667, - null, - 0.6346565064837861, - 0.6149491168624189, - null, - 0.6346565064837861, - 0.5593069337955722, - null, - 0.6327007577432437, - 0.662108954544855, - null, - 0.6327007577432437, - 0.5433115547736789, - null, - 0.6327007577432437, - 0.5274116361492907, - null, - 0.6327007577432437, - 0.7042334738295596, - null, - 0.6327007577432437, - 0.555788147264811, - null, - 0.6327007577432437, - 0.5805679633404117, - null, - 0.6327007577432437, - 0.5989925957177575, - null, - 0.6327007577432437, - 0.5845953849421676, - null, - 0.6327007577432437, - 0.6058132814274794, - null, - 0.6327007577432437, - 0.5621062195646831, - null, - 0.800297854626628, - 0.7364515013041172, - null, - 0.800297854626628, - 0.6953901849658966, - null, - 0.800297854626628, - 0.8589937476561325, - null, - 0.800297854626628, - 0.7204214783753378, - null, - 0.800297854626628, - 0.8247840830312709, - null, - 0.800297854626628, - 0.7948577020793985, - null, - 0.800297854626628, - 0.7059759544943667, - null, - 0.800297854626628, - 0.8846357375826375, - null, - 0.800297854626628, - 0.8323549266756429, - null, - 0.800297854626628, - 0.8505181106970376, - null, - 0.800297854626628, - 0.7607451357487841, - null, - 0.800297854626628, - 0.9110645875753355, - null, - 0.526779936668903, - 0.5433115547736789, - null, - 0.526779936668903, - 0.5274116361492907, - null, - 0.526779936668903, - 0.555788147264811, - null, - 0.526779936668903, - 0.5805679633404117, - null, - 0.526779936668903, - 0.48218022499136737, - null, - 0.526779936668903, - 0.5293212253918783, - null, - 0.526779936668903, - 0.47443124751760235, - null, - 0.526779936668903, - 0.5291812256005789, - null, - 0.526779936668903, - 0.5621062195646831, - null, - 0.526779936668903, - 0.5465171974419871, - null, - 0.413948124857326, - 0.44119458804978295, - null, - 0.413948124857326, - 0.3328704753356456, - null, - 0.413948124857326, - 0.3499260998923053, - null, - 0.413948124857326, - 0.47055154706870017, - null, - 0.413948124857326, - 0.5274116361492907, - null, - 0.413948124857326, - 0.4277213938753692, - null, - 0.413948124857326, - 0.3247821296168134, - null, - 0.413948124857326, - 0.4564806171162211, - null, - 0.413948124857326, - 0.3187675293980876, - null, - 0.413948124857326, - 0.34114125407236195, - null, - 0.09276814106220677, - 0.03187584930858911, - null, - 0.09276814106220677, - 0.07426685281627932, - null, - 0.09276814106220677, - 0.03446402354654854, - null, - 0.09276814106220677, - 0.06879886671193436, - null, - 0.09276814106220677, - 0.1823584228427031, - null, - 0.09276814106220677, - 0.13940667248499528, - null, - 0.09276814106220677, - 0.0201693226965588, - null, - 0.09276814106220677, - 0.16862303760247477, - null, - 0.09276814106220677, - 0.12355952994556385, - null, - 0.662108954544855, - 0.7827775151390383, - null, - 0.662108954544855, - 0.7007214129943925, - null, - 0.662108954544855, - 0.7188906153197968, - null, - 0.662108954544855, - 0.7042334738295596, - null, - 0.662108954544855, - 0.555788147264811, - null, - 0.662108954544855, - 0.5805679633404117, - null, - 0.662108954544855, - 0.7255980413609877, - null, - 0.662108954544855, - 0.7518492361353024, - null, - 0.07163295816605642, - 0.06202421257916635, - null, - 0.07163295816605642, - 0.09053866681881584, - null, - 0.07163295816605642, - 0.1573630170264504, - null, - 0.07163295816605642, - 0.0023771443647881974, - null, - 0.07163295816605642, - 0.0852382135963593, - null, - 0.07163295816605642, - 0.17086936775877049, - null, - 0.07163295816605642, - 0.0875467755337247, - null, - 0.07163295816605642, - 0.08997327822205015, - null, - 0.07163295816605642, - 0.020212382594376965, - null, - 0.07163295816605642, - 0.0897773631019545, - null, - 0.07163295816605642, - 0.038579501382332126, - null, - 0.44119458804978295, - 0.3740122792611037, - null, - 0.44119458804978295, - 0.3328704753356456, - null, - 0.44119458804978295, - 0.3499260998923053, - null, - 0.44119458804978295, - 0.47055154706870017, - null, - 0.44119458804978295, - 0.5274116361492907, - null, - 0.44119458804978295, - 0.4277213938753692, - null, - 0.44119458804978295, - 0.4564806171162211, - null, - 0.44119458804978295, - 0.34114125407236195, - null, - 0.7364515013041172, - 0.8247840830312709, - null, - 0.7364515013041172, - 0.7948577020793985, - null, - 0.7364515013041172, - 0.7059759544943667, - null, - 0.7364515013041172, - 0.8323549266756429, - null, - 0.7827775151390383, - 0.7007214129943925, - null, - 0.7827775151390383, - 0.7188906153197968, - null, - 0.7827775151390383, - 0.7042334738295596, - null, - 0.7827775151390383, - 0.8613129225222332, - null, - 0.7827775151390383, - 0.7255980413609877, - null, - 0.7827775151390383, - 0.7703024251104211, - null, - 0.7827775151390383, - 0.9005048863870916, - null, - 0.7827775151390383, - 0.7518492361353024, - null, - 0.9600359726880752, - 0.9998698320754983, - null, - 0.9600359726880752, - 0.9082570345357789, - null, - 0.9600359726880752, - 0.9503884723051484, - null, - 0.9600359726880752, - 0.916634041055854, - null, - 0.9600359726880752, - 0.8613129225222332, - null, - 0.9600359726880752, - 0.9005048863870916, - null, - 0.9600359726880752, - 0.9240127894624793, - null, - 0.9600359726880752, - 0.9636590456207981, - null, - 0.8511753697833563, - 0.89080246263295, - null, - 0.8511753697833563, - 0.9521646983336837, - null, - 0.8511753697833563, - 0.9663892923019699, - null, - 0.8511753697833563, - 0.9573079778783831, - null, - 0.8511753697833563, - 0.9473667691929577, - null, - 0.8511753697833563, - 0.838803404513024, - null, - 0.8511753697833563, - 0.7518492361353024, - null, - 0.05194805532761382, - 0.06202421257916635, - null, - 0.05194805532761382, - 0.0852382135963593, - null, - 0.05194805532761382, - 0.0914406510425998, - null, - 0.05194805532761382, - 0.0875467755337247, - null, - 0.05194805532761382, - 0.08997327822205015, - null, - 0.05194805532761382, - 0.020212382594376965, - null, - 0.05194805532761382, - 0.02312833765025224, - null, - 0.05194805532761382, - 0.04237200971819888, - null, - 0.05194805532761382, - 0.038579501382332126, - null, - 0.05194805532761382, - 0.01777064460825195, - null, - 0.03187584930858911, - 0.07426685281627932, - null, - 0.03187584930858911, - 0.03446402354654854, - null, - 0.03187584930858911, - 0.06879886671193436, - null, - 0.03187584930858911, - 0.13940667248499528, - null, - 0.03187584930858911, - 0.0201693226965588, - null, - 0.03187584930858911, - 0.12355952994556385, - null, - 0.07426685281627932, - 0.09471702229050472, - null, - 0.07426685281627932, - 0.06879886671193436, - null, - 0.07426685281627932, - 0.1823584228427031, - null, - 0.07426685281627932, - 0.13940667248499528, - null, - 0.07426685281627932, - 0.0201693226965588, - null, - 0.07426685281627932, - 0.16862303760247477, - null, - 0.07426685281627932, - 0.12355952994556385, - null, - 0.07426685281627932, - 0.04781523934390508, - null, - 0.5257999712304688, - 0.5593951498649633, - null, - 0.5257999712304688, - 0.4404718698088387, - null, - 0.5257999712304688, - 0.5201251204037126, - null, - 0.9998698320754983, - 0.9082570345357789, - null, - 0.9998698320754983, - 0.9636084967560627, - null, - 0.9998698320754983, - 0.9503884723051484, - null, - 0.9998698320754983, - 0.9240127894624793, - null, - 0.9998698320754983, - 0.9636590456207981, - null, - 0.09471702229050472, - 0.06879886671193436, - null, - 0.09471702229050472, - 0.1823584228427031, - null, - 0.09471702229050472, - 0.19852054651169693, - null, - 0.09471702229050472, - 0.13747604708068628, - null, - 0.09471702229050472, - 0.13940667248499528, - null, - 0.09471702229050472, - 0.0201693226965588, - null, - 0.09471702229050472, - 0.12355952994556385, - null, - 0.09471702229050472, - 0.0897773631019545, - null, - 0.09471702229050472, - 0.04781523934390508, - null, - 0.6953901849658966, - 0.7204214783753378, - null, - 0.6953901849658966, - 0.7181048560087516, - null, - 0.6953901849658966, - 0.7948577020793985, - null, - 0.6953901849658966, - 0.7059759544943667, - null, - 0.6953901849658966, - 0.6370268640561303, - null, - 0.6953901849658966, - 0.6149491168624189, - null, - 0.6953901849658966, - 0.7607451357487841, - null, - 0.6953901849658966, - 0.6234379896430121, - null, - 0.03446402354654854, - 0.05596958524873419, - null, - 0.03446402354654854, - 0.014269300880037306, - null, - 0.9082570345357789, - 0.9503884723051484, - null, - 0.9082570345357789, - 0.916634041055854, - null, - 0.9082570345357789, - 0.8613129225222332, - null, - 0.9082570345357789, - 0.9005048863870916, - null, - 0.9082570345357789, - 0.9240127894624793, - null, - 0.9082570345357789, - 0.9636590456207981, - null, - 0.3740122792611037, - 0.37848025459696877, - null, - 0.3740122792611037, - 0.3821391536049519, - null, - 0.3740122792611037, - 0.2955343345493908, - null, - 0.3740122792611037, - 0.31305791514229697, - null, - 0.3740122792611037, - 0.298647499376007, - null, - 0.3740122792611037, - 0.3246624829381992, - null, - 0.3740122792611037, - 0.3328704753356456, - null, - 0.3740122792611037, - 0.33203393677870674, - null, - 0.3740122792611037, - 0.3499260998923053, - null, - 0.3740122792611037, - 0.3181124346701171, - null, - 0.3740122792611037, - 0.47055154706870017, - null, - 0.3740122792611037, - 0.4277213938753692, - null, - 0.3740122792611037, - 0.25656414507004344, - null, - 0.3740122792611037, - 0.4564806171162211, - null, - 0.977854801698089, - 0.9162463356603696, - null, - 0.5436816885151938, - 0.5461279353327784, - null, - 0.5436816885151938, - 0.5229468203255856, - null, - 0.5436816885151938, - 0.4611021425875542, - null, - 0.5436816885151938, - 0.6149491168624189, - null, - 0.5436816885151938, - 0.4349682989231034, - null, - 0.5436816885151938, - 0.6234379896430121, - null, - 0.5436816885151938, - 0.4442228752887084, - null, - 0.5436816885151938, - 0.5593069337955722, - null, - 0.06202421257916635, - 0.09053866681881584, - null, - 0.06202421257916635, - 0.1573630170264504, - null, - 0.06202421257916635, - 0.0023771443647881974, - null, - 0.06202421257916635, - 0.0852382135963593, - null, - 0.06202421257916635, - 0.0875467755337247, - null, - 0.06202421257916635, - 0.08997327822205015, - null, - 0.06202421257916635, - 0.020212382594376965, - null, - 0.06202421257916635, - 0.02312833765025224, - null, - 0.06202421257916635, - 0.04237200971819888, - null, - 0.06202421257916635, - 0.038579501382332126, - null, - 0.06202421257916635, - 0.01777064460825195, - null, - 0.8589937476561325, - 0.8247840830312709, - null, - 0.8589937476561325, - 0.7948577020793985, - null, - 0.8589937476561325, - 0.9210876029743161, - null, - 0.8589937476561325, - 0.9694266665187994, - null, - 0.8589937476561325, - 0.8846357375826375, - null, - 0.8589937476561325, - 0.8323549266756429, - null, - 0.8589937476561325, - 0.8505181106970376, - null, - 0.8589937476561325, - 0.9110645875753355, - null, - 0.06879886671193436, - 0.1823584228427031, - null, - 0.06879886671193436, - 0.13940667248499528, - null, - 0.06879886671193436, - 0.0201693226965588, - null, - 0.06879886671193436, - 0.12355952994556385, - null, - 0.06879886671193436, - 0.04781523934390508, - null, - 0.19921682827804632, - 0.10310287300704979, - null, - 0.19921682827804632, - 0.0914406510425998, - null, - 0.19921682827804632, - 0.14711158829428328, - null, - 0.19921682827804632, - 0.21535391032155426, - null, - 0.19921682827804632, - 0.25656414507004344, - null, - 0.1823584228427031, - 0.19852054651169693, - null, - 0.1823584228427031, - 0.22007362873840486, - null, - 0.1823584228427031, - 0.13940667248499528, - null, - 0.1823584228427031, - 0.16862303760247477, - null, - 0.1823584228427031, - 0.12355952994556385, - null, - 0.37549158943196925, - 0.41808707877840445, - null, - 0.37549158943196925, - 0.42926818011737133, - null, - 0.37549158943196925, - 0.4363707938884992, - null, - 0.37549158943196925, - 0.42077304608666055, - null, - 0.5433115547736789, - 0.5274116361492907, - null, - 0.5433115547736789, - 0.555788147264811, - null, - 0.5433115547736789, - 0.5805679633404117, - null, - 0.5433115547736789, - 0.5989925957177575, - null, - 0.5433115547736789, - 0.48218022499136737, - null, - 0.5433115547736789, - 0.47443124751760235, - null, - 0.5433115547736789, - 0.5291812256005789, - null, - 0.5433115547736789, - 0.5621062195646831, - null, - 0.5433115547736789, - 0.5465171974419871, - null, - 0.37848025459696877, - 0.3821391536049519, - null, - 0.37848025459696877, - 0.31305791514229697, - null, - 0.37848025459696877, - 0.3246624829381992, - null, - 0.37848025459696877, - 0.33203393677870674, - null, - 0.37848025459696877, - 0.4404718698088387, - null, - 0.37848025459696877, - 0.3393815448042514, - null, - 0.37848025459696877, - 0.32444561774289593, - null, - 0.37848025459696877, - 0.33721825060791266, - null, - 0.3821391536049519, - 0.2955343345493908, - null, - 0.3821391536049519, - 0.31305791514229697, - null, - 0.3821391536049519, - 0.298647499376007, - null, - 0.3821391536049519, - 0.3246624829381992, - null, - 0.3821391536049519, - 0.33203393677870674, - null, - 0.3821391536049519, - 0.3499260998923053, - null, - 0.3821391536049519, - 0.3181124346701171, - null, - 0.3821391536049519, - 0.47055154706870017, - null, - 0.3821391536049519, - 0.4404718698088387, - null, - 0.3821391536049519, - 0.3393815448042514, - null, - 0.3821391536049519, - 0.32444561774289593, - null, - 0.3821391536049519, - 0.4564806171162211, - null, - 0.3821391536049519, - 0.33721825060791266, - null, - 0.7204214783753378, - 0.7181048560087516, - null, - 0.7204214783753378, - 0.7948577020793985, - null, - 0.7204214783753378, - 0.7059759544943667, - null, - 0.7204214783753378, - 0.6370268640561303, - null, - 0.7204214783753378, - 0.7607451357487841, - null, - 0.7204214783753378, - 0.6234379896430121, - null, - 0.2955343345493908, - 0.31305791514229697, - null, - 0.2955343345493908, - 0.298647499376007, - null, - 0.2955343345493908, - 0.3246624829381992, - null, - 0.2955343345493908, - 0.3328704753356456, - null, - 0.2955343345493908, - 0.33203393677870674, - null, - 0.2955343345493908, - 0.3499260998923053, - null, - 0.2955343345493908, - 0.3181124346701171, - null, - 0.2955343345493908, - 0.25656414507004344, - null, - 0.2955343345493908, - 0.32444561774289593, - null, - 0.09053866681881584, - 0.1573630170264504, - null, - 0.09053866681881584, - 0.0023771443647881974, - null, - 0.09053866681881584, - 0.0852382135963593, - null, - 0.09053866681881584, - 0.17086936775877049, - null, - 0.09053866681881584, - 0.0875467755337247, - null, - 0.09053866681881584, - 0.08997327822205015, - null, - 0.09053866681881584, - 0.020212382594376965, - null, - 0.09053866681881584, - 0.0897773631019545, - null, - 0.09053866681881584, - 0.02312833765025224, - null, - 0.09053866681881584, - 0.20133087739958255, - null, - 0.09053866681881584, - 0.038579501382332126, - null, - 0.09053866681881584, - 0.01777064460825195, - null, - 0.7181048560087516, - 0.6776948411821848, - null, - 0.7181048560087516, - 0.834199864808296, - null, - 0.7181048560087516, - 0.6370268640561303, - null, - 0.7181048560087516, - 0.6802728591951641, - null, - 0.7181048560087516, - 0.7607451357487841, - null, - 0.7181048560087516, - 0.6314926226168458, - null, - 0.10310287300704979, - 0.05973078995013337, - null, - 0.10310287300704979, - 0.0914406510425998, - null, - 0.10310287300704979, - 0.14711158829428328, - null, - 0.10310287300704979, - 0.21535391032155426, - null, - 0.10310287300704979, - 0.04237200971819888, - null, - 0.8247840830312709, - 0.7948577020793985, - null, - 0.8247840830312709, - 0.9210876029743161, - null, - 0.8247840830312709, - 0.7059759544943667, - null, - 0.8247840830312709, - 0.9186278106648778, - null, - 0.8247840830312709, - 0.8846357375826375, - null, - 0.8247840830312709, - 0.8323549266756429, - null, - 0.8247840830312709, - 0.8505181106970376, - null, - 0.8247840830312709, - 0.9110645875753355, - null, - 0.1573630170264504, - 0.2275256207367028, - null, - 0.1573630170264504, - 0.0852382135963593, - null, - 0.1573630170264504, - 0.18507593174525072, - null, - 0.1573630170264504, - 0.17086936775877049, - null, - 0.1573630170264504, - 0.0875467755337247, - null, - 0.1573630170264504, - 0.08997327822205015, - null, - 0.1573630170264504, - 0.0897773631019545, - null, - 0.1573630170264504, - 0.20133087739958255, - null, - 0.31305791514229697, - 0.298647499376007, - null, - 0.31305791514229697, - 0.3246624829381992, - null, - 0.31305791514229697, - 0.33203393677870674, - null, - 0.31305791514229697, - 0.3499260998923053, - null, - 0.31305791514229697, - 0.3181124346701171, - null, - 0.31305791514229697, - 0.3393815448042514, - null, - 0.31305791514229697, - 0.21535391032155426, - null, - 0.31305791514229697, - 0.25656414507004344, - null, - 0.31305791514229697, - 0.32444561774289593, - null, - 0.31305791514229697, - 0.33721825060791266, - null, - 0.298647499376007, - 0.3328704753356456, - null, - 0.298647499376007, - 0.33203393677870674, - null, - 0.298647499376007, - 0.3499260998923053, - null, - 0.298647499376007, - 0.3181124346701171, - null, - 0.298647499376007, - 0.3247821296168134, - null, - 0.298647499376007, - 0.25656414507004344, - null, - 0.298647499376007, - 0.3187675293980876, - null, - 0.298647499376007, - 0.20133087739958255, - null, - 0.298647499376007, - 0.34114125407236195, - null, - 0.3246624829381992, - 0.33203393677870674, - null, - 0.3246624829381992, - 0.4404718698088387, - null, - 0.3246624829381992, - 0.3393815448042514, - null, - 0.3246624829381992, - 0.21535391032155426, - null, - 0.3246624829381992, - 0.25656414507004344, - null, - 0.3246624829381992, - 0.32444561774289593, - null, - 0.3246624829381992, - 0.33721825060791266, - null, - 0.19852054651169693, - 0.13747604708068628, - null, - 0.19852054651169693, - 0.22007362873840486, - null, - 0.19852054651169693, - 0.2275256207367028, - null, - 0.19852054651169693, - 0.2619562675328274, - null, - 0.19852054651169693, - 0.18507593174525072, - null, - 0.3328704753356456, - 0.3499260998923053, - null, - 0.3328704753356456, - 0.3181124346701171, - null, - 0.3328704753356456, - 0.4277213938753692, - null, - 0.3328704753356456, - 0.3247821296168134, - null, - 0.3328704753356456, - 0.3187675293980876, - null, - 0.3328704753356456, - 0.34114125407236195, - null, - 0.33203393677870674, - 0.3181124346701171, - null, - 0.33203393677870674, - 0.4404718698088387, - null, - 0.33203393677870674, - 0.3393815448042514, - null, - 0.33203393677870674, - 0.21535391032155426, - null, - 0.33203393677870674, - 0.25656414507004344, - null, - 0.33203393677870674, - 0.32444561774289593, - null, - 0.33203393677870674, - 0.33721825060791266, - null, - 0.5461279353327784, - 0.5229468203255856, - null, - 0.5461279353327784, - 0.4611021425875542, - null, - 0.5461279353327784, - 0.6149491168624189, - null, - 0.5461279353327784, - 0.4349682989231034, - null, - 0.5461279353327784, - 0.5593069337955722, - null, - 0.9636084967560627, - 0.9503884723051484, - null, - 0.9636084967560627, - 0.9162463356603696, - null, - 0.9636084967560627, - 0.8541827253649632, - null, - 0.9636084967560627, - 0.9636590456207981, - null, - 0.9636084967560627, - 0.8680862155815134, - null, - 0.9636084967560627, - 0.8668565351624634, - null, - 0.9503884723051484, - 0.9240127894624793, - null, - 0.9503884723051484, - 0.9636590456207981, - null, - 0.9503884723051484, - 0.8680862155815134, - null, - 0.13747604708068628, - 0.22007362873840486, - null, - 0.13747604708068628, - 0.2275256207367028, - null, - 0.13747604708068628, - 0.18507593174525072, - null, - 0.13747604708068628, - 0.17086936775877049, - null, - 0.13747604708068628, - 0.0897773631019545, - null, - 0.13747604708068628, - 0.04781523934390508, - null, - 0.3499260998923053, - 0.3181124346701171, - null, - 0.3499260998923053, - 0.4277213938753692, - null, - 0.3499260998923053, - 0.3247821296168134, - null, - 0.3499260998923053, - 0.4564806171162211, - null, - 0.3499260998923053, - 0.3187675293980876, - null, - 0.3499260998923053, - 0.34114125407236195, - null, - 0.3181124346701171, - 0.3247821296168134, - null, - 0.3181124346701171, - 0.25656414507004344, - null, - 0.3181124346701171, - 0.3187675293980876, - null, - 0.89080246263295, - 0.9521646983336837, - null, - 0.89080246263295, - 0.834199864808296, - null, - 0.89080246263295, - 0.9663892923019699, - null, - 0.89080246263295, - 0.9425745666137786, - null, - 0.89080246263295, - 0.9851894520572745, - null, - 0.89080246263295, - 0.9573079778783831, - null, - 0.89080246263295, - 0.9473667691929577, - null, - 0.89080246263295, - 0.838803404513024, - null, - 0.9521646983336837, - 0.916634041055854, - null, - 0.9521646983336837, - 0.9663892923019699, - null, - 0.9521646983336837, - 0.9573079778783831, - null, - 0.9521646983336837, - 0.9473667691929577, - null, - 0.9521646983336837, - 0.9005048863870916, - null, - 0.6776948411821848, - 0.6802728591951641, - null, - 0.6776948411821848, - 0.6314926226168458, - null, - 0.0023771443647881974, - 0.0852382135963593, - null, - 0.0023771443647881974, - 0.0875467755337247, - null, - 0.0023771443647881974, - 0.020212382594376965, - null, - 0.0023771443647881974, - 0.0897773631019545, - null, - 0.0023771443647881974, - 0.038579501382332126, - null, - 0.7007214129943925, - 0.7188906153197968, - null, - 0.7007214129943925, - 0.7255980413609877, - null, - 0.7007214129943925, - 0.7518492361353024, - null, - 0.7188906153197968, - 0.7255980413609877, - null, - 0.7188906153197968, - 0.7518492361353024, - null, - 0.47055154706870017, - 0.5274116361492907, - null, - 0.47055154706870017, - 0.4277213938753692, - null, - 0.47055154706870017, - 0.5845953849421676, - null, - 0.47055154706870017, - 0.4564806171162211, - null, - 0.47055154706870017, - 0.5201251204037126, - null, - 0.19043749918150743, - 0.2121217358781844, - null, - 0.19043749918150743, - 0.29978148854693865, - null, - 0.5274116361492907, - 0.555788147264811, - null, - 0.5274116361492907, - 0.5805679633404117, - null, - 0.5274116361492907, - 0.5989925957177575, - null, - 0.5274116361492907, - 0.4277213938753692, - null, - 0.5274116361492907, - 0.5845953849421676, - null, - 0.5274116361492907, - 0.6058132814274794, - null, - 0.5274116361492907, - 0.5291812256005789, - null, - 0.5274116361492907, - 0.5621062195646831, - null, - 0.5274116361492907, - 0.4564806171162211, - null, - 0.9162463356603696, - 0.8385234321105272, - null, - 0.9162463356603696, - 0.8668565351624634, - null, - 0.7042334738295596, - 0.5989925957177575, - null, - 0.7042334738295596, - 0.7255980413609877, - null, - 0.7042334738295596, - 0.6058132814274794, - null, - 0.7042334738295596, - 0.7703024251104211, - null, - 0.555788147264811, - 0.5805679633404117, - null, - 0.555788147264811, - 0.5989925957177575, - null, - 0.555788147264811, - 0.48218022499136737, - null, - 0.555788147264811, - 0.5293212253918783, - null, - 0.555788147264811, - 0.47443124751760235, - null, - 0.555788147264811, - 0.5291812256005789, - null, - 0.555788147264811, - 0.5621062195646831, - null, - 0.555788147264811, - 0.5465171974419871, - null, - 0.5805679633404117, - 0.5989925957177575, - null, - 0.5805679633404117, - 0.5845953849421676, - null, - 0.5805679633404117, - 0.6058132814274794, - null, - 0.5805679633404117, - 0.5291812256005789, - null, - 0.5805679633404117, - 0.5621062195646831, - null, - 0.587704695878027, - 0.5593951498649633, - null, - 0.587704695878027, - 0.5845953849421676, - null, - 0.587704695878027, - 0.6058132814274794, - null, - 0.587704695878027, - 0.6322124026692795, - null, - 0.587704695878027, - 0.5201251204037126, - null, - 0.916634041055854, - 0.8613129225222332, - null, - 0.916634041055854, - 0.9005048863870916, - null, - 0.916634041055854, - 0.9240127894624793, - null, - 0.7948577020793985, - 0.7059759544943667, - null, - 0.7948577020793985, - 0.8846357375826375, - null, - 0.7948577020793985, - 0.8323549266756429, - null, - 0.7948577020793985, - 0.8505181106970376, - null, - 0.7948577020793985, - 0.7607451357487841, - null, - 0.7948577020793985, - 0.9110645875753355, - null, - 0.9210876029743161, - 0.9694266665187994, - null, - 0.9210876029743161, - 0.9186278106648778, - null, - 0.9210876029743161, - 0.8846357375826375, - null, - 0.9210876029743161, - 0.8323549266756429, - null, - 0.9210876029743161, - 0.9110645875753355, - null, - 0.9210876029743161, - 0.992283435751248, - null, - 0.834199864808296, - 0.9425745666137786, - null, - 0.834199864808296, - 0.8505181106970376, - null, - 0.834199864808296, - 0.7607451357487841, - null, - 0.5989925957177575, - 0.5845953849421676, - null, - 0.5989925957177575, - 0.6058132814274794, - null, - 0.5989925957177575, - 0.5621062195646831, - null, - 0.05973078995013337, - 0.0914406510425998, - null, - 0.05973078995013337, - 0.14711158829428328, - null, - 0.05973078995013337, - 0.04237200971819888, - null, - 0.5593951498649633, - 0.4404718698088387, - null, - 0.5593951498649633, - 0.6322124026692795, - null, - 0.5593951498649633, - 0.5201251204037126, - null, - 0.5229468203255856, - 0.4611021425875542, - null, - 0.5229468203255856, - 0.44175944307536974, - null, - 0.5229468203255856, - 0.6149491168624189, - null, - 0.5229468203255856, - 0.6234379896430121, - null, - 0.5229468203255856, - 0.4442228752887084, - null, - 0.5229468203255856, - 0.5593069337955722, - null, - 0.22007362873840486, - 0.2275256207367028, - null, - 0.22007362873840486, - 0.2619562675328274, - null, - 0.22007362873840486, - 0.18507593174525072, - null, - 0.22007362873840486, - 0.3414075728554137, - null, - 0.37301066653863624, - 0.2619562675328274, - null, - 0.37301066653863624, - 0.48218022499136737, - null, - 0.37301066653863624, - 0.47443124751760235, - null, - 0.37301066653863624, - 0.3414075728554137, - null, - 0.37301066653863624, - 0.42077304608666055, - null, - 0.37301066653863624, - 0.4039327719907384, - null, - 0.8613129225222332, - 0.7703024251104211, - null, - 0.8613129225222332, - 0.9005048863870916, - null, - 0.9663892923019699, - 0.9851894520572745, - null, - 0.9663892923019699, - 0.9573079778783831, - null, - 0.9663892923019699, - 0.9473667691929577, - null, - 0.2275256207367028, - 0.2619562675328274, - null, - 0.2275256207367028, - 0.18507593174525072, - null, - 0.2275256207367028, - 0.17086936775877049, - null, - 0.0852382135963593, - 0.0875467755337247, - null, - 0.0852382135963593, - 0.08997327822205015, - null, - 0.0852382135963593, - 0.020212382594376965, - null, - 0.0852382135963593, - 0.02312833765025224, - null, - 0.0852382135963593, - 0.20133087739958255, - null, - 0.0852382135963593, - 0.038579501382332126, - null, - 0.0852382135963593, - 0.01777064460825195, - null, - 0.0914406510425998, - 0.14711158829428328, - null, - 0.0914406510425998, - 0.02312833765025224, - null, - 0.0914406510425998, - 0.04237200971819888, - null, - 0.0914406510425998, - 0.01777064460825195, - null, - 0.9425745666137786, - 0.9851894520572745, - null, - 0.9425745666137786, - 0.9473667691929577, - null, - 0.3019474379086241, - 0.2121217358781844, - null, - 0.3019474379086241, - 0.3318561006769827, - null, - 0.3019474379086241, - 0.29978148854693865, - null, - 0.2619562675328274, - 0.3247821296168134, - null, - 0.2619562675328274, - 0.18507593174525072, - null, - 0.2619562675328274, - 0.17086936775877049, - null, - 0.2619562675328274, - 0.3414075728554137, - null, - 0.2619562675328274, - 0.3187675293980876, - null, - 0.2619562675328274, - 0.34114125407236195, - null, - 0.48218022499136737, - 0.5293212253918783, - null, - 0.48218022499136737, - 0.47443124751760235, - null, - 0.48218022499136737, - 0.5291812256005789, - null, - 0.48218022499136737, - 0.5465171974419871, - null, - 0.5293212253918783, - 0.47443124751760235, - null, - 0.5293212253918783, - 0.5291812256005789, - null, - 0.5293212253918783, - 0.5191285820034173, - null, - 0.5293212253918783, - 0.42077304608666055, - null, - 0.5293212253918783, - 0.5465171974419871, - null, - 0.41808707877840445, - 0.42926818011737133, - null, - 0.41808707877840445, - 0.44175944307536974, - null, - 0.41808707877840445, - 0.4363707938884992, - null, - 0.14711158829428328, - 0.21535391032155426, - null, - 0.42926818011737133, - 0.4363707938884992, - null, - 0.9694266665187994, - 0.9186278106648778, - null, - 0.9694266665187994, - 0.8846357375826375, - null, - 0.9694266665187994, - 0.9110645875753355, - null, - 0.9694266665187994, - 0.992283435751248, - null, - 0.4404718698088387, - 0.3393815448042514, - null, - 0.4404718698088387, - 0.32444561774289593, - null, - 0.4404718698088387, - 0.33721825060791266, - null, - 0.4404718698088387, - 0.5201251204037126, - null, - 0.4277213938753692, - 0.3247821296168134, - null, - 0.4277213938753692, - 0.4564806171162211, - null, - 0.4277213938753692, - 0.3187675293980876, - null, - 0.4277213938753692, - 0.34114125407236195, - null, - 0.7059759544943667, - 0.6149491168624189, - null, - 0.7059759544943667, - 0.6234379896430121, - null, - 0.4611021425875542, - 0.44175944307536974, - null, - 0.4611021425875542, - 0.4349682989231034, - null, - 0.4611021425875542, - 0.4442228752887084, - null, - 0.4611021425875542, - 0.5593069337955722, - null, - 0.13940667248499528, - 0.0201693226965588, - null, - 0.13940667248499528, - 0.16862303760247477, - null, - 0.13940667248499528, - 0.12355952994556385, - null, - 0.3393815448042514, - 0.21535391032155426, - null, - 0.3393815448042514, - 0.25656414507004344, - null, - 0.3393815448042514, - 0.32444561774289593, - null, - 0.3393815448042514, - 0.33721825060791266, - null, - 0.6370268640561303, - 0.7607451357487841, - null, - 0.6370268640561303, - 0.6234379896430121, - null, - 0.6370268640561303, - 0.6314926226168458, - null, - 0.9851894520572745, - 0.9573079778783831, - null, - 0.9851894520572745, - 0.9473667691929577, - null, - 0.3247821296168134, - 0.3187675293980876, - null, - 0.3247821296168134, - 0.34114125407236195, - null, - 0.9186278106648778, - 0.8846357375826375, - null, - 0.9186278106648778, - 0.8323549266756429, - null, - 0.9186278106648778, - 0.9110645875753355, - null, - 0.9186278106648778, - 0.992283435751248, - null, - 0.18507593174525072, - 0.17086936775877049, - null, - 0.18507593174525072, - 0.0897773631019545, - null, - 0.18507593174525072, - 0.20133087739958255, - null, - 0.5845953849421676, - 0.6058132814274794, - null, - 0.5845953849421676, - 0.5621062195646831, - null, - 0.44175944307536974, - 0.4442228752887084, - null, - 0.7255980413609877, - 0.7703024251104211, - null, - 0.7255980413609877, - 0.7518492361353024, - null, - 0.6058132814274794, - 0.5621062195646831, - null, - 0.47443124751760235, - 0.5291812256005789, - null, - 0.47443124751760235, - 0.5465171974419871, - null, - 0.9573079778783831, - 0.9473667691929577, - null, - 0.9573079778783831, - 0.838803404513024, - null, - 0.0201693226965588, - 0.12355952994556385, - null, - 0.0201693226965588, - 0.04781523934390508, - null, - 0.17086936775877049, - 0.0897773631019545, - null, - 0.17086936775877049, - 0.20133087739958255, - null, - 0.5291812256005789, - 0.5621062195646831, - null, - 0.5291812256005789, - 0.5465171974419871, - null, - 0.16862303760247477, - 0.12355952994556385, - null, - 0.8846357375826375, - 0.8323549266756429, - null, - 0.8846357375826375, - 0.8505181106970376, - null, - 0.8846357375826375, - 0.9110645875753355, - null, - 0.8846357375826375, - 0.992283435751248, - null, - 0.0875467755337247, - 0.08997327822205015, - null, - 0.0875467755337247, - 0.020212382594376965, - null, - 0.0875467755337247, - 0.02312833765025224, - null, - 0.0875467755337247, - 0.20133087739958255, - null, - 0.0875467755337247, - 0.038579501382332126, - null, - 0.0875467755337247, - 0.01777064460825195, - null, - 0.9473667691929577, - 0.838803404513024, - null, - 0.8541827253649632, - 0.8680862155815134, - null, - 0.8541827253649632, - 0.8668565351624634, - null, - 0.3414075728554137, - 0.42077304608666055, - null, - 0.3414075728554137, - 0.4039327719907384, - null, - 0.3318561006769827, - 0.4349682989231034, - null, - 0.3318561006769827, - 0.29978148854693865, - null, - 0.7408684543182315, - 0.8385234321105272, - null, - 0.7408684543182315, - 0.6322124026692795, - null, - 0.7408684543182315, - 0.7333209824474588, - null, - 0.6149491168624189, - 0.6234379896430121, - null, - 0.6149491168624189, - 0.5593069337955722, - null, - 0.12355952994556385, - 0.04781523934390508, - null, - 0.08997327822205015, - 0.020212382594376965, - null, - 0.08997327822205015, - 0.02312833765025224, - null, - 0.08997327822205015, - 0.20133087739958255, - null, - 0.08997327822205015, - 0.04237200971819888, - null, - 0.08997327822205015, - 0.038579501382332126, - null, - 0.08997327822205015, - 0.01777064460825195, - null, - 0.21535391032155426, - 0.25656414507004344, - null, - 0.21535391032155426, - 0.32444561774289593, - null, - 0.21535391032155426, - 0.33721825060791266, - null, - 0.8323549266756429, - 0.9110645875753355, - null, - 0.8385234321105272, - 0.8668565351624634, - null, - 0.8385234321105272, - 0.7333209824474588, - null, - 0.9240127894624793, - 0.9636590456207981, - null, - 0.9240127894624793, - 0.8680862155815134, - null, - 0.6802728591951641, - 0.6314926226168458, - null, - 0.25656414507004344, - 0.32444561774289593, - null, - 0.25656414507004344, - 0.33721825060791266, - null, - 0.020212382594376965, - 0.02312833765025224, - null, - 0.020212382594376965, - 0.038579501382332126, - null, - 0.020212382594376965, - 0.01777064460825195, - null, - 0.32444561774289593, - 0.33721825060791266, - null, - 0.838803404513024, - 0.7518492361353024, - null, - 0.6322124026692795, - 0.5201251204037126, - null, - 0.6322124026692795, - 0.7333209824474588, - null, - 0.8505181106970376, - 0.7607451357487841, - null, - 0.8505181106970376, - 0.9110645875753355, - null, - 0.0897773631019545, - 0.04781523934390508, - null, - 0.02312833765025224, - 0.04237200971819888, - null, - 0.02312833765025224, - 0.038579501382332126, - null, - 0.02312833765025224, - 0.01777064460825195, - null, - 0.05596958524873419, - 0.014269300880037306, - null, - 0.3187675293980876, - 0.20133087739958255, - null, - 0.3187675293980876, - 0.34114125407236195, - null, - 0.5191285820034173, - 0.42077304608666055, - null, - 0.5191285820034173, - 0.5465171974419871, - null, - 0.4349682989231034, - 0.4442228752887084, - null, - 0.9636590456207981, - 0.8680862155815134, - null, - 0.8680862155815134, - 0.8668565351624634, - null, - 0.6234379896430121, - 0.5593069337955722, - null, - 0.04237200971819888, - 0.038579501382332126, - null, - 0.04237200971819888, - 0.01777064460825195, - null, - 0.038579501382332126, - 0.01777064460825195, - null, - 0.9110645875753355, - 0.992283435751248, - null, - 0.42077304608666055, - 0.4039327719907384, - null - ], - "y": [ - 0.09053726824382247, - 0.17542400609184483, - null, - 0.09053726824382247, - 0.055894273053114896, - null, - 0.09053726824382247, - 0.14933184162295132, - null, - 0.09053726824382247, - 0.1278305132468397, - null, - 0.09053726824382247, - 0.0731473655342364, - null, - 0.09053726824382247, - 0.09533319097359638, - null, - 0.09053726824382247, - 0.055897802218322856, - null, - 0.09053726824382247, - 0.04153202488293273, - null, - 0.09053726824382247, - 0.06013197669987258, - null, - 0.09053726824382247, - 0.040563128366188694, - null, - 0.09053726824382247, - 0.09959517902538939, - null, - 0.571085214777101, - 0.5944498275635773, - null, - 0.571085214777101, - 0.6773365837969099, - null, - 0.571085214777101, - 0.6160873747407943, - null, - 0.571085214777101, - 0.5186581897030644, - null, - 0.571085214777101, - 0.5634679987017406, - null, - 0.571085214777101, - 0.6012106694454529, - null, - 0.571085214777101, - 0.4898861106787329, - null, - 0.571085214777101, - 0.45431497833000367, - null, - 0.571085214777101, - 0.5204579980957379, - null, - 0.571085214777101, - 0.6352288779182178, - null, - 0.571085214777101, - 0.5981086798045652, - null, - 0.571085214777101, - 0.6648266103848882, - null, - 0.571085214777101, - 0.6072525121642058, - null, - 0.571085214777101, - 0.5260776190209286, - null, - 0.5199666766946885, - 0.5219101415039136, - null, - 0.5199666766946885, - 0.4307004647175262, - null, - 0.5199666766946885, - 0.4834545718278357, - null, - 0.5199666766946885, - 0.4847615611240751, - null, - 0.5199666766946885, - 0.4318165589087314, - null, - 0.5199666766946885, - 0.6217058876501556, - null, - 0.5199666766946885, - 0.5097617399826666, - null, - 0.33766327379542094, - 0.33811323660241943, - null, - 0.33766327379542094, - 0.31304614249644347, - null, - 0.33766327379542094, - 0.2697998035002954, - null, - 0.33766327379542094, - 0.2695720924906413, - null, - 0.33766327379542094, - 0.24454670425362057, - null, - 0.33766327379542094, - 0.4500538798110242, - null, - 0.33766327379542094, - 0.2880647319459674, - null, - 0.33766327379542094, - 0.3202314429055858, - null, - 0.33766327379542094, - 0.3169605131706372, - null, - 0.33766327379542094, - 0.32345881810688737, - null, - 0.17196466768963936, - 0.2009582712064717, - null, - 0.17196466768963936, - 0.15069304516745607, - null, - 0.17196466768963936, - 0.06016942899581168, - null, - 0.17196466768963936, - 0.24013807075121119, - null, - 0.17196466768963936, - 0.2693681584998491, - null, - 0.17196466768963936, - 0.10059463740220753, - null, - 0.17196466768963936, - 0.09959517902538939, - null, - 0.17708608014427518, - 0.2373268562908326, - null, - 0.17708608014427518, - 0.23741932367240448, - null, - 0.17708608014427518, - 0.05938145280899054, - null, - 0.17708608014427518, - 0.17619771419691865, - null, - 0.17708608014427518, - 0.21532966919867302, - null, - 0.17708608014427518, - 0.10782775946098799, - null, - 0.17708608014427518, - 0.249116699886752, - null, - 0.17708608014427518, - 0.23700988477155205, - null, - 0.17708608014427518, - 0.1341994714416056, - null, - 0.17708608014427518, - 0.29050814087118004, - null, - 0.04649454781195783, - 0.07011604000159166, - null, - 0.04649454781195783, - 0.019989772968585173, - null, - 0.04649454781195783, - 0.038844634468288675, - null, - 0.37080565676900146, - 0.3648985367210805, - null, - 0.37080565676900146, - 0.3343459796676115, - null, - 0.37080565676900146, - 0.4208812619135248, - null, - 0.37080565676900146, - 0.3900960314334032, - null, - 0.37080565676900146, - 0.3098874271134545, - null, - 0.37080565676900146, - 0.4295667428124167, - null, - 0.37080565676900146, - 0.35350564895305514, - null, - 0.37080565676900146, - 0.31541428705224306, - null, - 0.37080565676900146, - 0.4467311570808764, - null, - 0.37080565676900146, - 0.2693681584998491, - null, - 0.37080565676900146, - 0.4421375373865315, - null, - 0.37080565676900146, - 0.42641694849778966, - null, - 0.37080565676900146, - 0.3333136626479075, - null, - 0.37080565676900146, - 0.4868902788925622, - null, - 0.3602866247185619, - 0.3061539627540061, - null, - 0.3602866247185619, - 0.3661437355856225, - null, - 0.3602866247185619, - 0.40557198035837094, - null, - 0.3602866247185619, - 0.3192831323823997, - null, - 0.3602866247185619, - 0.41535454584101794, - null, - 0.3602866247185619, - 0.40395348439090084, - null, - 0.3602866247185619, - 0.3340702546567942, - null, - 0.3602866247185619, - 0.4248880785102581, - null, - 0.3602866247185619, - 0.29119156039108685, - null, - 0.9483925173875926, - 0.8957623407464501, - null, - 0.9483925173875926, - 0.9727770125665405, - null, - 0.9483925173875926, - 0.8791466031622056, - null, - 0.9483925173875926, - 0.922341377568881, - null, - 0.9483925173875926, - 0.8821215709600496, - null, - 0.9483925173875926, - 0.9328536520894143, - null, - 0.9483925173875926, - 0.9344432405222354, - null, - 0.9483925173875926, - 0.9642772106357639, - null, - 0.3061539627540061, - 0.3661437355856225, - null, - 0.3061539627540061, - 0.40557198035837094, - null, - 0.3061539627540061, - 0.3192831323823997, - null, - 0.3061539627540061, - 0.32266487999330984, - null, - 0.3061539627540061, - 0.40395348439090084, - null, - 0.3061539627540061, - 0.3340702546567942, - null, - 0.3061539627540061, - 0.29119156039108685, - null, - 0.3061539627540061, - 0.19048093242734687, - null, - 0.9643804220706982, - 0.9298960866412943, - null, - 0.9643804220706982, - 0.8599268392047722, - null, - 0.9643804220706982, - 0.9435179236599912, - null, - 0.9643804220706982, - 0.9958360522915445, - null, - 0.9643804220706982, - 0.9756800437762957, - null, - 0.9643804220706982, - 0.8842114977564064, - null, - 0.8336885167043149, - 0.938767234846119, - null, - 0.8336885167043149, - 0.8867112408398291, - null, - 0.8336885167043149, - 0.9298960866412943, - null, - 0.8336885167043149, - 0.8599268392047722, - null, - 0.8336885167043149, - 0.8508124987550889, - null, - 0.8336885167043149, - 0.8842114977564064, - null, - 0.5944498275635773, - 0.5216765314868881, - null, - 0.5944498275635773, - 0.6001026871900049, - null, - 0.5944498275635773, - 0.6012106694454529, - null, - 0.5944498275635773, - 0.4898861106787329, - null, - 0.5944498275635773, - 0.5204579980957379, - null, - 0.5944498275635773, - 0.6352288779182178, - null, - 0.5944498275635773, - 0.6648266103848882, - null, - 0.5944498275635773, - 0.6072525121642058, - null, - 0.2373268562908326, - 0.23741932367240448, - null, - 0.2373268562908326, - 0.33811323660241943, - null, - 0.2373268562908326, - 0.17542400609184483, - null, - 0.2373268562908326, - 0.17619771419691865, - null, - 0.2373268562908326, - 0.1278305132468397, - null, - 0.2373268562908326, - 0.21532966919867302, - null, - 0.2373268562908326, - 0.2695720924906413, - null, - 0.2373268562908326, - 0.24454670425362057, - null, - 0.2373268562908326, - 0.20002447568886628, - null, - 0.2373268562908326, - 0.3202314429055858, - null, - 0.2373268562908326, - 0.1341994714416056, - null, - 0.2373268562908326, - 0.3169605131706372, - null, - 0.2373268562908326, - 0.29050814087118004, - null, - 0.2373268562908326, - 0.32345881810688737, - null, - 0.23741932367240448, - 0.32127102230894566, - null, - 0.23741932367240448, - 0.2381682330796122, - null, - 0.23741932367240448, - 0.17296378957033465, - null, - 0.23741932367240448, - 0.24033413659841596, - null, - 0.23741932367240448, - 0.2981410655965283, - null, - 0.23741932367240448, - 0.3199684158322815, - null, - 0.23741932367240448, - 0.2660491488293679, - null, - 0.23741932367240448, - 0.249116699886752, - null, - 0.23741932367240448, - 0.23700988477155205, - null, - 0.23741932367240448, - 0.29050814087118004, - null, - 0.23741932367240448, - 0.2318219208408404, - null, - 0.32127102230894566, - 0.39453602200590676, - null, - 0.32127102230894566, - 0.2381682330796122, - null, - 0.32127102230894566, - 0.3309683982450944, - null, - 0.32127102230894566, - 0.24033413659841596, - null, - 0.32127102230894566, - 0.2981410655965283, - null, - 0.32127102230894566, - 0.3199684158322815, - null, - 0.32127102230894566, - 0.3355480553373167, - null, - 0.32127102230894566, - 0.2660491488293679, - null, - 0.32127102230894566, - 0.3635517670405215, - null, - 0.32127102230894566, - 0.249116699886752, - null, - 0.32127102230894566, - 0.23700988477155205, - null, - 0.32127102230894566, - 0.28871122138225125, - null, - 0.32127102230894566, - 0.42203254876563234, - null, - 0.32127102230894566, - 0.2318219208408404, - null, - 0.3661437355856225, - 0.3343459796676115, - null, - 0.3661437355856225, - 0.4307004647175262, - null, - 0.3661437355856225, - 0.40557198035837094, - null, - 0.3661437355856225, - 0.4834545718278357, - null, - 0.3661437355856225, - 0.4847615611240751, - null, - 0.3661437355856225, - 0.32266487999330984, - null, - 0.3661437355856225, - 0.4318165589087314, - null, - 0.3661437355856225, - 0.3340702546567942, - null, - 0.7791505090281524, - 0.8520196094107113, - null, - 0.7791505090281524, - 0.8848427298858184, - null, - 0.3648985367210805, - 0.3343459796676115, - null, - 0.3648985367210805, - 0.4208812619135248, - null, - 0.3648985367210805, - 0.4307004647175262, - null, - 0.3648985367210805, - 0.3900960314334032, - null, - 0.3648985367210805, - 0.3098874271134545, - null, - 0.3648985367210805, - 0.32266487999330984, - null, - 0.3648985367210805, - 0.4295667428124167, - null, - 0.3648985367210805, - 0.35350564895305514, - null, - 0.3648985367210805, - 0.31541428705224306, - null, - 0.3648985367210805, - 0.2693681584998491, - null, - 0.3648985367210805, - 0.42641694849778966, - null, - 0.3648985367210805, - 0.3333136626479075, - null, - 0.6244837238804738, - 0.5850986908522726, - null, - 0.6244837238804738, - 0.6267294109959968, - null, - 0.6244837238804738, - 0.5221172076712435, - null, - 0.6244837238804738, - 0.5717872069066212, - null, - 0.6244837238804738, - 0.7302384542961842, - null, - 0.6244837238804738, - 0.6710484758334021, - null, - 0.6244837238804738, - 0.5492873750243871, - null, - 0.6244837238804738, - 0.6201266549140614, - null, - 0.6244837238804738, - 0.5752985482362863, - null, - 0.9012137046519791, - 0.8622415881936324, - null, - 0.9012137046519791, - 0.8350595230795331, - null, - 0.5219101415039136, - 0.4307004647175262, - null, - 0.5219101415039136, - 0.4834545718278357, - null, - 0.5219101415039136, - 0.4847615611240751, - null, - 0.5219101415039136, - 0.4295667428124167, - null, - 0.5219101415039136, - 0.5144551437666581, - null, - 0.5219101415039136, - 0.42641694849778966, - null, - 0.5219101415039136, - 0.6014235590484225, - null, - 0.5219101415039136, - 0.4868902788925622, - null, - 0.39453602200590676, - 0.3309683982450944, - null, - 0.39453602200590676, - 0.2981410655965283, - null, - 0.39453602200590676, - 0.3199684158322815, - null, - 0.39453602200590676, - 0.45431497833000367, - null, - 0.39453602200590676, - 0.42052616285893474, - null, - 0.39453602200590676, - 0.4107398412471005, - null, - 0.39453602200590676, - 0.3635517670405215, - null, - 0.39453602200590676, - 0.42203254876563234, - null, - 0.2009582712064717, - 0.20619722773579274, - null, - 0.2009582712064717, - 0.3098874271134545, - null, - 0.2009582712064717, - 0.15069304516745607, - null, - 0.2009582712064717, - 0.31541428705224306, - null, - 0.2009582712064717, - 0.24013807075121119, - null, - 0.2009582712064717, - 0.2693681584998491, - null, - 0.2009582712064717, - 0.22993075379681738, - null, - 0.2009582712064717, - 0.09959517902538939, - null, - 0.04224314617430658, - 0.05938145280899054, - null, - 0.04224314617430658, - 0.04283815208078323, - null, - 0.04224314617430658, - 0.010366221042083845, - null, - 0.04224314617430658, - 0.10782775946098799, - null, - 0.04224314617430658, - 0.03395115206665145, - null, - 0.04224314617430658, - 0.05477321631284726, - null, - 0.2381682330796122, - 0.3309683982450944, - null, - 0.2381682330796122, - 0.17296378957033465, - null, - 0.2381682330796122, - 0.24033413659841596, - null, - 0.2381682330796122, - 0.2981410655965283, - null, - 0.2381682330796122, - 0.3355480553373167, - null, - 0.2381682330796122, - 0.2660491488293679, - null, - 0.2381682330796122, - 0.249116699886752, - null, - 0.2381682330796122, - 0.23700988477155205, - null, - 0.2381682330796122, - 0.28871122138225125, - null, - 0.2381682330796122, - 0.2002886163837997, - null, - 0.2381682330796122, - 0.13201947050262697, - null, - 0.2381682330796122, - 0.2318219208408404, - null, - 0.2381682330796122, - 0.20307680326083377, - null, - 0.33811323660241943, - 0.31304614249644347, - null, - 0.33811323660241943, - 0.2695720924906413, - null, - 0.33811323660241943, - 0.24454670425362057, - null, - 0.33811323660241943, - 0.4500538798110242, - null, - 0.33811323660241943, - 0.4140065537970282, - null, - 0.33811323660241943, - 0.2880647319459674, - null, - 0.33811323660241943, - 0.3202314429055858, - null, - 0.33811323660241943, - 0.3169605131706372, - null, - 0.33811323660241943, - 0.32345881810688737, - null, - 0.5216765314868881, - 0.6001026871900049, - null, - 0.5216765314868881, - 0.6012106694454529, - null, - 0.5216765314868881, - 0.4898861106787329, - null, - 0.5216765314868881, - 0.5204579980957379, - null, - 0.5216765314868881, - 0.4500538798110242, - null, - 0.5216765314868881, - 0.42052616285893474, - null, - 0.5216765314868881, - 0.4140065537970282, - null, - 0.5216765314868881, - 0.4937592635708411, - null, - 0.6001026871900049, - 0.6012106694454529, - null, - 0.6001026871900049, - 0.6705222836834548, - null, - 0.6001026871900049, - 0.5204579980957379, - null, - 0.6001026871900049, - 0.6648266103848882, - null, - 0.991844460003468, - 0.9727770125665405, - null, - 0.991844460003468, - 0.938767234846119, - null, - 0.991844460003468, - 0.9874110419208606, - null, - 0.991844460003468, - 0.9328536520894143, - null, - 0.991844460003468, - 0.9078978130468089, - null, - 0.991844460003468, - 0.9513646744432486, - null, - 0.3343459796676115, - 0.4307004647175262, - null, - 0.3343459796676115, - 0.3900960314334032, - null, - 0.3343459796676115, - 0.3098874271134545, - null, - 0.3343459796676115, - 0.32266487999330984, - null, - 0.3343459796676115, - 0.4295667428124167, - null, - 0.3343459796676115, - 0.35350564895305514, - null, - 0.3343459796676115, - 0.31541428705224306, - null, - 0.3343459796676115, - 0.24013807075121119, - null, - 0.3343459796676115, - 0.2693681584998491, - null, - 0.3343459796676115, - 0.3333136626479075, - null, - 0.8957623407464501, - 0.9727770125665405, - null, - 0.8957623407464501, - 0.8423383207045981, - null, - 0.8957623407464501, - 0.8791466031622056, - null, - 0.8957623407464501, - 0.8151159149468827, - null, - 0.8957623407464501, - 0.922341377568881, - null, - 0.8957623407464501, - 0.8821215709600496, - null, - 0.8957623407464501, - 0.9328536520894143, - null, - 0.8957623407464501, - 0.9344432405222354, - null, - 0.8957623407464501, - 0.9642772106357639, - null, - 0.8957623407464501, - 0.8157570218353161, - null, - 0.8957623407464501, - 0.7925454632595156, - null, - 0.8957623407464501, - 0.888980486534156, - null, - 0.4208812619135248, - 0.3900960314334032, - null, - 0.4208812619135248, - 0.3098874271134545, - null, - 0.4208812619135248, - 0.4295667428124167, - null, - 0.4208812619135248, - 0.35350564895305514, - null, - 0.4208812619135248, - 0.4467311570808764, - null, - 0.4208812619135248, - 0.5144551437666581, - null, - 0.4208812619135248, - 0.4421375373865315, - null, - 0.4208812619135248, - 0.42641694849778966, - null, - 0.4208812619135248, - 0.3333136626479075, - null, - 0.4208812619135248, - 0.4868902788925622, - null, - 0.31304614249644347, - 0.2697998035002954, - null, - 0.31304614249644347, - 0.2695720924906413, - null, - 0.31304614249644347, - 0.24454670425362057, - null, - 0.31304614249644347, - 0.20619722773579274, - null, - 0.31304614249644347, - 0.3098874271134545, - null, - 0.31304614249644347, - 0.2880647319459674, - null, - 0.31304614249644347, - 0.3202314429055858, - null, - 0.31304614249644347, - 0.22993075379681738, - null, - 0.31304614249644347, - 0.3169605131706372, - null, - 0.31304614249644347, - 0.32345881810688737, - null, - 0.6773365837969099, - 0.6628083689885368, - null, - 0.6773365837969099, - 0.6160873747407943, - null, - 0.6773365837969099, - 0.7537809293531343, - null, - 0.6773365837969099, - 0.5634679987017406, - null, - 0.6773365837969099, - 0.6012106694454529, - null, - 0.6773365837969099, - 0.6352288779182178, - null, - 0.6773365837969099, - 0.5981086798045652, - null, - 0.6773365837969099, - 0.6648266103848882, - null, - 0.6773365837969099, - 0.6072525121642058, - null, - 0.4307004647175262, - 0.40557198035837094, - null, - 0.4307004647175262, - 0.4834545718278357, - null, - 0.4307004647175262, - 0.4847615611240751, - null, - 0.4307004647175262, - 0.32266487999330984, - null, - 0.4307004647175262, - 0.4295667428124167, - null, - 0.4307004647175262, - 0.35350564895305514, - null, - 0.4307004647175262, - 0.4318165589087314, - null, - 0.4307004647175262, - 0.5097617399826666, - null, - 0.3309683982450944, - 0.24033413659841596, - null, - 0.3309683982450944, - 0.2981410655965283, - null, - 0.3309683982450944, - 0.3199684158322815, - null, - 0.3309683982450944, - 0.3355480553373167, - null, - 0.3309683982450944, - 0.2660491488293679, - null, - 0.3309683982450944, - 0.3635517670405215, - null, - 0.3309683982450944, - 0.249116699886752, - null, - 0.3309683982450944, - 0.23700988477155205, - null, - 0.3309683982450944, - 0.28871122138225125, - null, - 0.3309683982450944, - 0.42203254876563234, - null, - 0.3309683982450944, - 0.2318219208408404, - null, - 0.2697998035002954, - 0.17542400609184483, - null, - 0.2697998035002954, - 0.2695720924906413, - null, - 0.2697998035002954, - 0.24454670425362057, - null, - 0.2697998035002954, - 0.20619722773579274, - null, - 0.2697998035002954, - 0.3098874271134545, - null, - 0.2697998035002954, - 0.2880647319459674, - null, - 0.2697998035002954, - 0.22993075379681738, - null, - 0.2697998035002954, - 0.32345881810688737, - null, - 0.9727770125665405, - 0.922341377568881, - null, - 0.9727770125665405, - 0.8821215709600496, - null, - 0.9727770125665405, - 0.9328536520894143, - null, - 0.9727770125665405, - 0.9642772106357639, - null, - 0.40557198035837094, - 0.4834545718278357, - null, - 0.40557198035837094, - 0.4847615611240751, - null, - 0.40557198035837094, - 0.32266487999330984, - null, - 0.40557198035837094, - 0.40395348439090084, - null, - 0.40557198035837094, - 0.4318165589087314, - null, - 0.40557198035837094, - 0.3340702546567942, - null, - 0.40557198035837094, - 0.4248880785102581, - null, - 0.40557198035837094, - 0.5097617399826666, - null, - 0.35532572275494023, - 0.24028581536328997, - null, - 0.35532572275494023, - 0.3192831323823997, - null, - 0.35532572275494023, - 0.2529891644068947, - null, - 0.35532572275494023, - 0.41535454584101794, - null, - 0.35532572275494023, - 0.40395348439090084, - null, - 0.35532572275494023, - 0.4248880785102581, - null, - 0.35532572275494023, - 0.29119156039108685, - null, - 0.35532572275494023, - 0.24102842320743, - null, - 0.5850986908522726, - 0.6267294109959968, - null, - 0.5850986908522726, - 0.5221172076712435, - null, - 0.5850986908522726, - 0.5717872069066212, - null, - 0.5850986908522726, - 0.5492873750243871, - null, - 0.5850986908522726, - 0.6201266549140614, - null, - 0.5850986908522726, - 0.5752985482362863, - null, - 0.5850986908522726, - 0.5097617399826666, - null, - 0.17296378957033465, - 0.24033413659841596, - null, - 0.17296378957033465, - 0.2660491488293679, - null, - 0.17296378957033465, - 0.10782775946098799, - null, - 0.17296378957033465, - 0.249116699886752, - null, - 0.17296378957033465, - 0.23700988477155205, - null, - 0.17296378957033465, - 0.28871122138225125, - null, - 0.17296378957033465, - 0.2002886163837997, - null, - 0.17296378957033465, - 0.13201947050262697, - null, - 0.17296378957033465, - 0.2318219208408404, - null, - 0.17296378957033465, - 0.20307680326083377, - null, - 0.6628083689885368, - 0.6160873747407943, - null, - 0.6628083689885368, - 0.7537809293531343, - null, - 0.6628083689885368, - 0.5634679987017406, - null, - 0.6628083689885368, - 0.6352288779182178, - null, - 0.6628083689885368, - 0.5981086798045652, - null, - 0.6628083689885368, - 0.6072525121642058, - null, - 0.6160873747407943, - 0.5186581897030644, - null, - 0.6160873747407943, - 0.5634679987017406, - null, - 0.6160873747407943, - 0.6012106694454529, - null, - 0.6160873747407943, - 0.6352288779182178, - null, - 0.6160873747407943, - 0.5981086798045652, - null, - 0.6160873747407943, - 0.6648266103848882, - null, - 0.6160873747407943, - 0.6072525121642058, - null, - 0.6160873747407943, - 0.5260776190209286, - null, - 0.025297953521542405, - 0.06016942899581168, - null, - 0.025297953521542405, - 0.055897802218322856, - null, - 0.025297953521542405, - 0.09959517902538939, - null, - 0.24028581536328997, - 0.3192831323823997, - null, - 0.24028581536328997, - 0.1333966979371528, - null, - 0.24028581536328997, - 0.2529891644068947, - null, - 0.24028581536328997, - 0.29119156039108685, - null, - 0.24028581536328997, - 0.24102842320743, - null, - 0.5186581897030644, - 0.5634679987017406, - null, - 0.5186581897030644, - 0.6012106694454529, - null, - 0.5186581897030644, - 0.4898861106787329, - null, - 0.5186581897030644, - 0.45431497833000367, - null, - 0.5186581897030644, - 0.6352288779182178, - null, - 0.5186581897030644, - 0.5981086798045652, - null, - 0.5186581897030644, - 0.6072525121642058, - null, - 0.5186581897030644, - 0.42203254876563234, - null, - 0.5186581897030644, - 0.5260776190209286, - null, - 0.8423383207045981, - 0.8151159149468827, - null, - 0.8423383207045981, - 0.7334929583472656, - null, - 0.8423383207045981, - 0.8821215709600496, - null, - 0.8423383207045981, - 0.9328536520894143, - null, - 0.8423383207045981, - 0.7834166246251234, - null, - 0.8423383207045981, - 0.9078978130468089, - null, - 0.8423383207045981, - 0.7925454632595156, - null, - 0.8423383207045981, - 0.8508124987550889, - null, - 0.7537809293531343, - 0.8622415881936324, - null, - 0.7537809293531343, - 0.8350595230795331, - null, - 0.3192831323823997, - 0.2529891644068947, - null, - 0.3192831323823997, - 0.41535454584101794, - null, - 0.3192831323823997, - 0.40395348439090084, - null, - 0.3192831323823997, - 0.4248880785102581, - null, - 0.3192831323823997, - 0.29119156039108685, - null, - 0.3192831323823997, - 0.24102842320743, - null, - 0.17542400609184483, - 0.055894273053114896, - null, - 0.17542400609184483, - 0.14933184162295132, - null, - 0.17542400609184483, - 0.17619771419691865, - null, - 0.17542400609184483, - 0.1278305132468397, - null, - 0.17542400609184483, - 0.21532966919867302, - null, - 0.17542400609184483, - 0.0731473655342364, - null, - 0.17542400609184483, - 0.2695720924906413, - null, - 0.17542400609184483, - 0.09533319097359638, - null, - 0.17542400609184483, - 0.24454670425362057, - null, - 0.17542400609184483, - 0.20002447568886628, - null, - 0.17542400609184483, - 0.20619722773579274, - null, - 0.17542400609184483, - 0.2880647319459674, - null, - 0.17542400609184483, - 0.1341994714416056, - null, - 0.17542400609184483, - 0.22993075379681738, - null, - 0.008409380348177398, - 0.04149975738749545, - null, - 0.938767234846119, - 0.9874110419208606, - null, - 0.938767234846119, - 0.8867112408398291, - null, - 0.938767234846119, - 0.9298960866412943, - null, - 0.938767234846119, - 0.9078978130468089, - null, - 0.938767234846119, - 0.9958360522915445, - null, - 0.938767234846119, - 0.8508124987550889, - null, - 0.938767234846119, - 0.8842114977564064, - null, - 0.938767234846119, - 0.9513646744432486, - null, - 0.24033413659841596, - 0.2981410655965283, - null, - 0.24033413659841596, - 0.3199684158322815, - null, - 0.24033413659841596, - 0.3355480553373167, - null, - 0.24033413659841596, - 0.2660491488293679, - null, - 0.24033413659841596, - 0.249116699886752, - null, - 0.24033413659841596, - 0.23700988477155205, - null, - 0.24033413659841596, - 0.28871122138225125, - null, - 0.24033413659841596, - 0.2002886163837997, - null, - 0.24033413659841596, - 0.13201947050262697, - null, - 0.24033413659841596, - 0.2318219208408404, - null, - 0.24033413659841596, - 0.20307680326083377, - null, - 0.8791466031622056, - 0.922341377568881, - null, - 0.8791466031622056, - 0.8821215709600496, - null, - 0.8791466031622056, - 0.9542382277667263, - null, - 0.8791466031622056, - 0.9024846524956353, - null, - 0.8791466031622056, - 0.9344432405222354, - null, - 0.8791466031622056, - 0.9642772106357639, - null, - 0.8791466031622056, - 0.8157570218353161, - null, - 0.8791466031622056, - 0.888980486534156, - null, - 0.5634679987017406, - 0.6012106694454529, - null, - 0.5634679987017406, - 0.6352288779182178, - null, - 0.5634679987017406, - 0.5981086798045652, - null, - 0.5634679987017406, - 0.6072525121642058, - null, - 0.5634679987017406, - 0.5260776190209286, - null, - 0.05938145280899054, - 0.04283815208078323, - null, - 0.05938145280899054, - 0.10782775946098799, - null, - 0.05938145280899054, - 0.03395115206665145, - null, - 0.05938145280899054, - 0.05477321631284726, - null, - 0.05938145280899054, - 0.1341994714416056, - null, - 0.6012106694454529, - 0.4898861106787329, - null, - 0.6012106694454529, - 0.5204579980957379, - null, - 0.6012106694454529, - 0.6352288779182178, - null, - 0.6012106694454529, - 0.6648266103848882, - null, - 0.6012106694454529, - 0.6072525121642058, - null, - 0.6705222836834548, - 0.7454337953380579, - null, - 0.6705222836834548, - 0.7077207700167599, - null, - 0.6705222836834548, - 0.7005910562446783, - null, - 0.6705222836834548, - 0.5603277981830703, - null, - 0.3900960314334032, - 0.3098874271134545, - null, - 0.3900960314334032, - 0.4295667428124167, - null, - 0.3900960314334032, - 0.35350564895305514, - null, - 0.3900960314334032, - 0.31541428705224306, - null, - 0.3900960314334032, - 0.4467311570808764, - null, - 0.3900960314334032, - 0.4421375373865315, - null, - 0.3900960314334032, - 0.42641694849778966, - null, - 0.3900960314334032, - 0.3333136626479075, - null, - 0.3900960314334032, - 0.4868902788925622, - null, - 0.055894273053114896, - 0.14933184162295132, - null, - 0.055894273053114896, - 0.1278305132468397, - null, - 0.055894273053114896, - 0.0731473655342364, - null, - 0.055894273053114896, - 0.09533319097359638, - null, - 0.055894273053114896, - 0.055897802218322856, - null, - 0.055894273053114896, - 0.04153202488293273, - null, - 0.055894273053114896, - 0.06013197669987258, - null, - 0.055894273053114896, - 0.040563128366188694, - null, - 0.14933184162295132, - 0.17619771419691865, - null, - 0.14933184162295132, - 0.1278305132468397, - null, - 0.14933184162295132, - 0.21532966919867302, - null, - 0.14933184162295132, - 0.0731473655342364, - null, - 0.14933184162295132, - 0.09533319097359638, - null, - 0.14933184162295132, - 0.24454670425362057, - null, - 0.14933184162295132, - 0.20002447568886628, - null, - 0.14933184162295132, - 0.20619722773579274, - null, - 0.14933184162295132, - 0.055897802218322856, - null, - 0.14933184162295132, - 0.04153202488293273, - null, - 0.14933184162295132, - 0.06013197669987258, - null, - 0.14933184162295132, - 0.22993075379681738, - null, - 0.14933184162295132, - 0.040563128366188694, - null, - 0.8151159149468827, - 0.7334929583472656, - null, - 0.8151159149468827, - 0.8821215709600496, - null, - 0.8151159149468827, - 0.9328536520894143, - null, - 0.8151159149468827, - 0.7834166246251234, - null, - 0.8151159149468827, - 0.7925454632595156, - null, - 0.8151159149468827, - 0.8508124987550889, - null, - 0.17619771419691865, - 0.1278305132468397, - null, - 0.17619771419691865, - 0.21532966919867302, - null, - 0.17619771419691865, - 0.0731473655342364, - null, - 0.17619771419691865, - 0.2695720924906413, - null, - 0.17619771419691865, - 0.09533319097359638, - null, - 0.17619771419691865, - 0.24454670425362057, - null, - 0.17619771419691865, - 0.20002447568886628, - null, - 0.17619771419691865, - 0.1341994714416056, - null, - 0.17619771419691865, - 0.06013197669987258, - null, - 0.2981410655965283, - 0.3199684158322815, - null, - 0.2981410655965283, - 0.3355480553373167, - null, - 0.2981410655965283, - 0.2660491488293679, - null, - 0.2981410655965283, - 0.3635517670405215, - null, - 0.2981410655965283, - 0.249116699886752, - null, - 0.2981410655965283, - 0.23700988477155205, - null, - 0.2981410655965283, - 0.28871122138225125, - null, - 0.2981410655965283, - 0.42203254876563234, - null, - 0.2981410655965283, - 0.2002886163837997, - null, - 0.2981410655965283, - 0.29050814087118004, - null, - 0.2981410655965283, - 0.2318219208408404, - null, - 0.2981410655965283, - 0.20307680326083377, - null, - 0.7334929583472656, - 0.6512622326935055, - null, - 0.7334929583472656, - 0.7205270186163313, - null, - 0.7334929583472656, - 0.7834166246251234, - null, - 0.7334929583472656, - 0.6217058876501556, - null, - 0.7334929583472656, - 0.7925454632595156, - null, - 0.7334929583472656, - 0.6714278208298593, - null, - 0.04283815208078323, - 0.010366221042083845, - null, - 0.04283815208078323, - 0.10782775946098799, - null, - 0.04283815208078323, - 0.03395115206665145, - null, - 0.04283815208078323, - 0.05477321631284726, - null, - 0.04283815208078323, - 0.13201947050262697, - null, - 0.922341377568881, - 0.8821215709600496, - null, - 0.922341377568881, - 0.9542382277667263, - null, - 0.922341377568881, - 0.9328536520894143, - null, - 0.922341377568881, - 0.9961038345306213, - null, - 0.922341377568881, - 0.9344432405222354, - null, - 0.922341377568881, - 0.9642772106357639, - null, - 0.922341377568881, - 0.8157570218353161, - null, - 0.922341377568881, - 0.888980486534156, - null, - 0.3199684158322815, - 0.42052616285893474, - null, - 0.3199684158322815, - 0.2660491488293679, - null, - 0.3199684158322815, - 0.4107398412471005, - null, - 0.3199684158322815, - 0.3635517670405215, - null, - 0.3199684158322815, - 0.249116699886752, - null, - 0.3199684158322815, - 0.23700988477155205, - null, - 0.3199684158322815, - 0.42203254876563234, - null, - 0.3199684158322815, - 0.29050814087118004, - null, - 0.1278305132468397, - 0.21532966919867302, - null, - 0.1278305132468397, - 0.0731473655342364, - null, - 0.1278305132468397, - 0.09533319097359638, - null, - 0.1278305132468397, - 0.24454670425362057, - null, - 0.1278305132468397, - 0.20002447568886628, - null, - 0.1278305132468397, - 0.04153202488293273, - null, - 0.1278305132468397, - 0.05477321631284726, - null, - 0.1278305132468397, - 0.1341994714416056, - null, - 0.1278305132468397, - 0.06013197669987258, - null, - 0.1278305132468397, - 0.040563128366188694, - null, - 0.21532966919867302, - 0.2695720924906413, - null, - 0.21532966919867302, - 0.09533319097359638, - null, - 0.21532966919867302, - 0.24454670425362057, - null, - 0.21532966919867302, - 0.20002447568886628, - null, - 0.21532966919867302, - 0.3202314429055858, - null, - 0.21532966919867302, - 0.1341994714416056, - null, - 0.21532966919867302, - 0.3169605131706372, - null, - 0.21532966919867302, - 0.29050814087118004, - null, - 0.21532966919867302, - 0.32345881810688737, - null, - 0.0731473655342364, - 0.09533319097359638, - null, - 0.0731473655342364, - 0.055897802218322856, - null, - 0.0731473655342364, - 0.04153202488293273, - null, - 0.0731473655342364, - 0.05477321631284726, - null, - 0.0731473655342364, - 0.1341994714416056, - null, - 0.0731473655342364, - 0.06013197669987258, - null, - 0.0731473655342364, - 0.040563128366188694, - null, - 0.4898861106787329, - 0.45431497833000367, - null, - 0.4898861106787329, - 0.5204579980957379, - null, - 0.4898861106787329, - 0.42052616285893474, - null, - 0.4898861106787329, - 0.4140065537970282, - null, - 0.4898861106787329, - 0.4107398412471005, - null, - 0.2695720924906413, - 0.24454670425362057, - null, - 0.2695720924906413, - 0.20002447568886628, - null, - 0.2695720924906413, - 0.2880647319459674, - null, - 0.2695720924906413, - 0.3202314429055858, - null, - 0.2695720924906413, - 0.3169605131706372, - null, - 0.2695720924906413, - 0.32345881810688737, - null, - 0.09533319097359638, - 0.20002447568886628, - null, - 0.09533319097359638, - 0.055897802218322856, - null, - 0.09533319097359638, - 0.04153202488293273, - null, - 0.09533319097359638, - 0.05477321631284726, - null, - 0.09533319097359638, - 0.1341994714416056, - null, - 0.09533319097359638, - 0.06013197669987258, - null, - 0.09533319097359638, - 0.040563128366188694, - null, - 0.9874110419208606, - 0.8867112408398291, - null, - 0.9874110419208606, - 0.9298960866412943, - null, - 0.9874110419208606, - 0.9078978130468089, - null, - 0.9874110419208606, - 0.9958360522915445, - null, - 0.9874110419208606, - 0.9513646744432486, - null, - 0.1333966979371528, - 0.2529891644068947, - null, - 0.1333966979371528, - 0.04149975738749545, - null, - 0.1333966979371528, - 0.16781555203357146, - null, - 0.1333966979371528, - 0.24102842320743, - null, - 0.1333966979371528, - 0.19048093242734687, - null, - 0.1333966979371528, - 0.1294716874165911, - null, - 0.2529891644068947, - 0.29119156039108685, - null, - 0.2529891644068947, - 0.24102842320743, - null, - 0.2529891644068947, - 0.19048093242734687, - null, - 0.45431497833000367, - 0.5204579980957379, - null, - 0.45431497833000367, - 0.42052616285893474, - null, - 0.45431497833000367, - 0.4107398412471005, - null, - 0.45431497833000367, - 0.3635517670405215, - null, - 0.45431497833000367, - 0.42203254876563234, - null, - 0.45431497833000367, - 0.5260776190209286, - null, - 0.24454670425362057, - 0.20002447568886628, - null, - 0.24454670425362057, - 0.2880647319459674, - null, - 0.24454670425362057, - 0.3202314429055858, - null, - 0.24454670425362057, - 0.22993075379681738, - null, - 0.24454670425362057, - 0.3169605131706372, - null, - 0.24454670425362057, - 0.32345881810688737, - null, - 0.20002447568886628, - 0.3202314429055858, - null, - 0.20002447568886628, - 0.1341994714416056, - null, - 0.20002447568886628, - 0.3169605131706372, - null, - 0.6267294109959968, - 0.5221172076712435, - null, - 0.6267294109959968, - 0.7205270186163313, - null, - 0.6267294109959968, - 0.5717872069066212, - null, - 0.6267294109959968, - 0.7302384542961842, - null, - 0.6267294109959968, - 0.6710484758334021, - null, - 0.6267294109959968, - 0.5492873750243871, - null, - 0.6267294109959968, - 0.6201266549140614, - null, - 0.6267294109959968, - 0.5752985482362863, - null, - 0.5221172076712435, - 0.41535454584101794, - null, - 0.5221172076712435, - 0.5717872069066212, - null, - 0.5221172076712435, - 0.5492873750243871, - null, - 0.5221172076712435, - 0.6201266549140614, - null, - 0.5221172076712435, - 0.4248880785102581, - null, - 0.6512622326935055, - 0.6217058876501556, - null, - 0.6512622326935055, - 0.6714278208298593, - null, - 0.3355480553373167, - 0.2660491488293679, - null, - 0.3355480553373167, - 0.249116699886752, - null, - 0.3355480553373167, - 0.28871122138225125, - null, - 0.3355480553373167, - 0.42203254876563234, - null, - 0.3355480553373167, - 0.2318219208408404, - null, - 0.4834545718278357, - 0.4847615611240751, - null, - 0.4834545718278357, - 0.4318165589087314, - null, - 0.4834545718278357, - 0.5097617399826666, - null, - 0.4847615611240751, - 0.4318165589087314, - null, - 0.4847615611240751, - 0.5097617399826666, - null, - 0.20619722773579274, - 0.3098874271134545, - null, - 0.20619722773579274, - 0.2880647319459674, - null, - 0.20619722773579274, - 0.24013807075121119, - null, - 0.20619722773579274, - 0.22993075379681738, - null, - 0.20619722773579274, - 0.09959517902538939, - null, - 0.9419075807648644, - 0.8848427298858184, - null, - 0.9419075807648644, - 0.9756800437762957, - null, - 0.3098874271134545, - 0.4295667428124167, - null, - 0.3098874271134545, - 0.35350564895305514, - null, - 0.3098874271134545, - 0.31541428705224306, - null, - 0.3098874271134545, - 0.2880647319459674, - null, - 0.3098874271134545, - 0.24013807075121119, - null, - 0.3098874271134545, - 0.2693681584998491, - null, - 0.3098874271134545, - 0.42641694849778966, - null, - 0.3098874271134545, - 0.3333136626479075, - null, - 0.3098874271134545, - 0.22993075379681738, - null, - 0.04149975738749545, - 0.019989772968585173, - null, - 0.04149975738749545, - 0.1294716874165911, - null, - 0.32266487999330984, - 0.31541428705224306, - null, - 0.32266487999330984, - 0.4318165589087314, - null, - 0.32266487999330984, - 0.2693681584998491, - null, - 0.32266487999330984, - 0.3340702546567942, - null, - 0.4295667428124167, - 0.35350564895305514, - null, - 0.4295667428124167, - 0.31541428705224306, - null, - 0.4295667428124167, - 0.4467311570808764, - null, - 0.4295667428124167, - 0.5144551437666581, - null, - 0.4295667428124167, - 0.4421375373865315, - null, - 0.4295667428124167, - 0.42641694849778966, - null, - 0.4295667428124167, - 0.3333136626479075, - null, - 0.4295667428124167, - 0.4868902788925622, - null, - 0.35350564895305514, - 0.31541428705224306, - null, - 0.35350564895305514, - 0.24013807075121119, - null, - 0.35350564895305514, - 0.2693681584998491, - null, - 0.35350564895305514, - 0.42641694849778966, - null, - 0.35350564895305514, - 0.3333136626479075, - null, - 0.15069304516745607, - 0.06016942899581168, - null, - 0.15069304516745607, - 0.24013807075121119, - null, - 0.15069304516745607, - 0.2693681584998491, - null, - 0.15069304516745607, - 0.10059463740220753, - null, - 0.15069304516745607, - 0.09959517902538939, - null, - 0.41535454584101794, - 0.40395348439090084, - null, - 0.41535454584101794, - 0.4248880785102581, - null, - 0.41535454584101794, - 0.29119156039108685, - null, - 0.8821215709600496, - 0.9328536520894143, - null, - 0.8821215709600496, - 0.9344432405222354, - null, - 0.8821215709600496, - 0.9642772106357639, - null, - 0.8821215709600496, - 0.8157570218353161, - null, - 0.8821215709600496, - 0.7925454632595156, - null, - 0.8821215709600496, - 0.888980486534156, - null, - 0.9542382277667263, - 0.9024846524956353, - null, - 0.9542382277667263, - 0.9961038345306213, - null, - 0.9542382277667263, - 0.9344432405222354, - null, - 0.9542382277667263, - 0.9642772106357639, - null, - 0.9542382277667263, - 0.888980486534156, - null, - 0.9542382277667263, - 0.9810704436128125, - null, - 0.7205270186163313, - 0.7302384542961842, - null, - 0.7205270186163313, - 0.8157570218353161, - null, - 0.7205270186163313, - 0.7925454632595156, - null, - 0.31541428705224306, - 0.24013807075121119, - null, - 0.31541428705224306, - 0.2693681584998491, - null, - 0.31541428705224306, - 0.3333136626479075, - null, - 0.010366221042083845, - 0.10782775946098799, - null, - 0.010366221042083845, - 0.03395115206665145, - null, - 0.010366221042083845, - 0.13201947050262697, - null, - 0.06016942899581168, - 0.055897802218322856, - null, - 0.06016942899581168, - 0.10059463740220753, - null, - 0.06016942899581168, - 0.09959517902538939, - null, - 0.8867112408398291, - 0.9298960866412943, - null, - 0.8867112408398291, - 0.8599268392047722, - null, - 0.8867112408398291, - 0.9078978130468089, - null, - 0.8867112408398291, - 0.8508124987550889, - null, - 0.8867112408398291, - 0.8842114977564064, - null, - 0.8867112408398291, - 0.9513646744432486, - null, - 0.5204579980957379, - 0.42052616285893474, - null, - 0.5204579980957379, - 0.4140065537970282, - null, - 0.5204579980957379, - 0.4107398412471005, - null, - 0.5204579980957379, - 0.4937592635708411, - null, - 0.4500538798110242, - 0.4140065537970282, - null, - 0.4500538798110242, - 0.4467311570808764, - null, - 0.4500538798110242, - 0.4421375373865315, - null, - 0.4500538798110242, - 0.4937592635708411, - null, - 0.4500538798110242, - 0.5603277981830703, - null, - 0.4500538798110242, - 0.547451424618544, - null, - 0.40395348439090084, - 0.3340702546567942, - null, - 0.40395348439090084, - 0.4248880785102581, - null, - 0.5717872069066212, - 0.6710484758334021, - null, - 0.5717872069066212, - 0.5492873750243871, - null, - 0.5717872069066212, - 0.6201266549140614, - null, - 0.42052616285893474, - 0.4140065537970282, - null, - 0.42052616285893474, - 0.4107398412471005, - null, - 0.42052616285893474, - 0.3635517670405215, - null, - 0.2660491488293679, - 0.249116699886752, - null, - 0.2660491488293679, - 0.23700988477155205, - null, - 0.2660491488293679, - 0.28871122138225125, - null, - 0.2660491488293679, - 0.2002886163837997, - null, - 0.2660491488293679, - 0.29050814087118004, - null, - 0.2660491488293679, - 0.2318219208408404, - null, - 0.2660491488293679, - 0.20307680326083377, - null, - 0.10782775946098799, - 0.03395115206665145, - null, - 0.10782775946098799, - 0.2002886163837997, - null, - 0.10782775946098799, - 0.13201947050262697, - null, - 0.10782775946098799, - 0.20307680326083377, - null, - 0.7302384542961842, - 0.6710484758334021, - null, - 0.7302384542961842, - 0.6201266549140614, - null, - 0.8520196094107113, - 0.8848427298858184, - null, - 0.8520196094107113, - 0.9435179236599912, - null, - 0.8520196094107113, - 0.9756800437762957, - null, - 0.4140065537970282, - 0.3202314429055858, - null, - 0.4140065537970282, - 0.4107398412471005, - null, - 0.4140065537970282, - 0.3635517670405215, - null, - 0.4140065537970282, - 0.4937592635708411, - null, - 0.4140065537970282, - 0.3169605131706372, - null, - 0.4140065537970282, - 0.32345881810688737, - null, - 0.4467311570808764, - 0.5144551437666581, - null, - 0.4467311570808764, - 0.4421375373865315, - null, - 0.4467311570808764, - 0.42641694849778966, - null, - 0.4467311570808764, - 0.4868902788925622, - null, - 0.5144551437666581, - 0.4421375373865315, - null, - 0.5144551437666581, - 0.42641694849778966, - null, - 0.5144551437666581, - 0.6014235590484225, - null, - 0.5144551437666581, - 0.5603277981830703, - null, - 0.5144551437666581, - 0.4868902788925622, - null, - 0.7454337953380579, - 0.7077207700167599, - null, - 0.7454337953380579, - 0.8599268392047722, - null, - 0.7454337953380579, - 0.7005910562446783, - null, - 0.03395115206665145, - 0.05477321631284726, - null, - 0.7077207700167599, - 0.7005910562446783, - null, - 0.9024846524956353, - 0.9961038345306213, - null, - 0.9024846524956353, - 0.9344432405222354, - null, - 0.9024846524956353, - 0.888980486534156, - null, - 0.9024846524956353, - 0.9810704436128125, - null, - 0.055897802218322856, - 0.04153202488293273, - null, - 0.055897802218322856, - 0.06013197669987258, - null, - 0.055897802218322856, - 0.040563128366188694, - null, - 0.055897802218322856, - 0.09959517902538939, - null, - 0.2880647319459674, - 0.3202314429055858, - null, - 0.2880647319459674, - 0.22993075379681738, - null, - 0.2880647319459674, - 0.3169605131706372, - null, - 0.2880647319459674, - 0.32345881810688737, - null, - 0.9328536520894143, - 0.9078978130468089, - null, - 0.9328536520894143, - 0.8508124987550889, - null, - 0.9298960866412943, - 0.8599268392047722, - null, - 0.9298960866412943, - 0.9958360522915445, - null, - 0.9298960866412943, - 0.8842114977564064, - null, - 0.9298960866412943, - 0.9513646744432486, - null, - 0.6352288779182178, - 0.5981086798045652, - null, - 0.6352288779182178, - 0.6648266103848882, - null, - 0.6352288779182178, - 0.6072525121642058, - null, - 0.04153202488293273, - 0.05477321631284726, - null, - 0.04153202488293273, - 0.1341994714416056, - null, - 0.04153202488293273, - 0.06013197669987258, - null, - 0.04153202488293273, - 0.040563128366188694, - null, - 0.7834166246251234, - 0.7925454632595156, - null, - 0.7834166246251234, - 0.8508124987550889, - null, - 0.7834166246251234, - 0.6714278208298593, - null, - 0.6710484758334021, - 0.5492873750243871, - null, - 0.6710484758334021, - 0.6201266549140614, - null, - 0.3202314429055858, - 0.3169605131706372, - null, - 0.3202314429055858, - 0.32345881810688737, - null, - 0.9961038345306213, - 0.9344432405222354, - null, - 0.9961038345306213, - 0.9642772106357639, - null, - 0.9961038345306213, - 0.888980486534156, - null, - 0.9961038345306213, - 0.9810704436128125, - null, - 0.4107398412471005, - 0.3635517670405215, - null, - 0.4107398412471005, - 0.42203254876563234, - null, - 0.4107398412471005, - 0.29050814087118004, - null, - 0.24013807075121119, - 0.2693681584998491, - null, - 0.24013807075121119, - 0.3333136626479075, - null, - 0.8599268392047722, - 0.8842114977564064, - null, - 0.4318165589087314, - 0.3340702546567942, - null, - 0.4318165589087314, - 0.5097617399826666, - null, - 0.2693681584998491, - 0.3333136626479075, - null, - 0.4421375373865315, - 0.42641694849778966, - null, - 0.4421375373865315, - 0.4868902788925622, - null, - 0.5492873750243871, - 0.6201266549140614, - null, - 0.5492873750243871, - 0.5752985482362863, - null, - 0.5981086798045652, - 0.6072525121642058, - null, - 0.5981086798045652, - 0.5260776190209286, - null, - 0.3635517670405215, - 0.42203254876563234, - null, - 0.3635517670405215, - 0.29050814087118004, - null, - 0.42641694849778966, - 0.3333136626479075, - null, - 0.42641694849778966, - 0.4868902788925622, - null, - 0.6648266103848882, - 0.6072525121642058, - null, - 0.9344432405222354, - 0.9642772106357639, - null, - 0.9344432405222354, - 0.8157570218353161, - null, - 0.9344432405222354, - 0.888980486534156, - null, - 0.9344432405222354, - 0.9810704436128125, - null, - 0.249116699886752, - 0.23700988477155205, - null, - 0.249116699886752, - 0.28871122138225125, - null, - 0.249116699886752, - 0.2002886163837997, - null, - 0.249116699886752, - 0.29050814087118004, - null, - 0.249116699886752, - 0.2318219208408404, - null, - 0.249116699886752, - 0.20307680326083377, - null, - 0.6201266549140614, - 0.5752985482362863, - null, - 0.16781555203357146, - 0.19048093242734687, - null, - 0.16781555203357146, - 0.1294716874165911, - null, - 0.4937592635708411, - 0.5603277981830703, - null, - 0.4937592635708411, - 0.547451424618544, - null, - 0.9435179236599912, - 0.9958360522915445, - null, - 0.9435179236599912, - 0.9756800437762957, - null, - 0.07011604000159166, - 0.019989772968585173, - null, - 0.07011604000159166, - 0.10059463740220753, - null, - 0.07011604000159166, - 0.038844634468288675, - null, - 0.9078978130468089, - 0.8508124987550889, - null, - 0.9078978130468089, - 0.9513646744432486, - null, - 0.6072525121642058, - 0.5260776190209286, - null, - 0.23700988477155205, - 0.28871122138225125, - null, - 0.23700988477155205, - 0.2002886163837997, - null, - 0.23700988477155205, - 0.29050814087118004, - null, - 0.23700988477155205, - 0.13201947050262697, - null, - 0.23700988477155205, - 0.2318219208408404, - null, - 0.23700988477155205, - 0.20307680326083377, - null, - 0.05477321631284726, - 0.1341994714416056, - null, - 0.05477321631284726, - 0.06013197669987258, - null, - 0.05477321631284726, - 0.040563128366188694, - null, - 0.9642772106357639, - 0.888980486534156, - null, - 0.019989772968585173, - 0.1294716874165911, - null, - 0.019989772968585173, - 0.038844634468288675, - null, - 0.29119156039108685, - 0.24102842320743, - null, - 0.29119156039108685, - 0.19048093242734687, - null, - 0.6217058876501556, - 0.6714278208298593, - null, - 0.1341994714416056, - 0.06013197669987258, - null, - 0.1341994714416056, - 0.040563128366188694, - null, - 0.28871122138225125, - 0.2002886163837997, - null, - 0.28871122138225125, - 0.2318219208408404, - null, - 0.28871122138225125, - 0.20307680326083377, - null, - 0.06013197669987258, - 0.040563128366188694, - null, - 0.5752985482362863, - 0.5097617399826666, - null, - 0.10059463740220753, - 0.09959517902538939, - null, - 0.10059463740220753, - 0.038844634468288675, - null, - 0.8157570218353161, - 0.7925454632595156, - null, - 0.8157570218353161, - 0.888980486534156, - null, - 0.42203254876563234, - 0.5260776190209286, - null, - 0.2002886163837997, - 0.13201947050262697, - null, - 0.2002886163837997, - 0.2318219208408404, - null, - 0.2002886163837997, - 0.20307680326083377, - null, - 0.8622415881936324, - 0.8350595230795331, - null, - 0.3169605131706372, - 0.29050814087118004, - null, - 0.3169605131706372, - 0.32345881810688737, - null, - 0.6014235590484225, - 0.5603277981830703, - null, - 0.6014235590484225, - 0.4868902788925622, - null, - 0.9958360522915445, - 0.8842114977564064, - null, - 0.24102842320743, - 0.19048093242734687, - null, - 0.19048093242734687, - 0.1294716874165911, - null, - 0.8508124987550889, - 0.9513646744432486, - null, - 0.13201947050262697, - 0.2318219208408404, - null, - 0.13201947050262697, - 0.20307680326083377, - null, - 0.2318219208408404, - 0.20307680326083377, - null, - 0.888980486534156, - 0.9810704436128125, - null, - 0.5603277981830703, - 0.547451424618544, - null - ] - }, - { - "hoverinfo": "text", - "marker": { - "color": [ - 11, - 14, - 7, - 10, - 7, - 10, - 3, - 14, - 9, - 8, - 9, - 6, - 6, - 9, - 15, - 13, - 15, - 10, - 2, - 13, - 9, - 2, - 9, - 9, - 9, - 6, - 15, - 11, - 9, - 6, - 6, - 13, - 13, - 12, - 12, - 10, - 13, - 14, - 10, - 7, - 12, - 8, - 8, - 12, - 7, - 11, - 3, - 6, - 11, - 9, - 4, - 10, - 17, - 1, - 10, - 16, - 10, - 10, - 7, - 13, - 5, - 13, - 10, - 16, - 8, - 13, - 18, - 8, - 7, - 12, - 14, - 16, - 15, - 13, - 10, - 14, - 15, - 7, - 7, - 7, - 10, - 17, - 12, - 10, - 8, - 3, - 10, - 8, - 8, - 10, - 2, - 18, - 4, - 10, - 16, - 13, - 7, - 7, - 13, - 8, - 5, - 12, - 5, - 6, - 9, - 11, - 9, - 8, - 7, - 9, - 16, - 10, - 5, - 4, - 12, - 9, - 9, - 4, - 6, - 3, - 6, - 11, - 13, - 10, - 9, - 11, - 11, - 6, - 6, - 12, - 7, - 10, - 10, - 6, - 9, - 12, - 7, - 9, - 8, - 9, - 11, - 13, - 12, - 3, - 8, - 12, - 17, - 9, - 3, - 6, - 7, - 4, - 4, - 8, - 12, - 17, - 11, - 10, - 5, - 9, - 4, - 14, - 13, - 12, - 9, - 6, - 6, - 8, - 11, - 8, - 12, - 3, - 13, - 4, - 6, - 8, - 3, - 7, - 7, - 3, - 12, - 9, - 4, - 4, - 11, - 8, - 7, - 10, - 9, - 15, - 11, - 7, - 5, - 6, - 10, - 4, - 3, - 12, - 12, - 5 - ], - "colorbar": { - "thickness": 15, - "title": { - "side": "right", - "text": "Node Connections" - }, - "xanchor": "left" - }, - "colorscale": [ - [ - 0, - "rgb(255,255,217)" - ], - [ - 0.125, - "rgb(237,248,177)" - ], - [ - 0.25, - "rgb(199,233,180)" - ], - [ - 0.375, - "rgb(127,205,187)" - ], - [ - 0.5, - "rgb(65,182,196)" - ], - [ - 0.625, - "rgb(29,145,192)" - ], - [ - 0.75, - "rgb(34,94,168)" - ], - [ - 0.875, - "rgb(37,52,148)" - ], - [ - 1, - "rgb(8,29,88)" - ] - ], - "line": { - "width": 2 - }, - "reversescale": true, - "showscale": true, - "size": 10 - }, - "mode": "markers", - "text": [ - "# of connections: 11", - "# of connections: 14", - "# of connections: 7", - "# of connections: 10", - "# of connections: 7", - "# of connections: 10", - "# of connections: 3", - "# of connections: 14", - "# of connections: 9", - "# of connections: 8", - "# of connections: 9", - "# of connections: 6", - "# of connections: 6", - "# of connections: 9", - "# of connections: 15", - "# of connections: 13", - "# of connections: 15", - "# of connections: 10", - "# of connections: 2", - "# of connections: 13", - "# of connections: 9", - "# of connections: 2", - "# of connections: 9", - "# of connections: 9", - "# of connections: 9", - "# of connections: 6", - "# of connections: 15", - "# of connections: 11", - "# of connections: 9", - "# of connections: 6", - "# of connections: 6", - "# of connections: 13", - "# of connections: 13", - "# of connections: 12", - "# of connections: 12", - "# of connections: 10", - "# of connections: 13", - "# of connections: 14", - "# of connections: 10", - "# of connections: 7", - "# of connections: 12", - "# of connections: 8", - "# of connections: 8", - "# of connections: 12", - "# of connections: 7", - "# of connections: 11", - "# of connections: 3", - "# of connections: 6", - "# of connections: 11", - "# of connections: 9", - "# of connections: 4", - "# of connections: 10", - "# of connections: 17", - "# of connections: 1", - "# of connections: 10", - "# of connections: 16", - "# of connections: 10", - "# of connections: 10", - "# of connections: 7", - "# of connections: 13", - "# of connections: 5", - "# of connections: 13", - "# of connections: 10", - "# of connections: 16", - "# of connections: 8", - "# of connections: 13", - "# of connections: 18", - "# of connections: 8", - "# of connections: 7", - "# of connections: 12", - "# of connections: 14", - "# of connections: 16", - "# of connections: 15", - "# of connections: 13", - "# of connections: 10", - "# of connections: 14", - "# of connections: 15", - "# of connections: 7", - "# of connections: 7", - "# of connections: 7", - "# of connections: 10", - "# of connections: 17", - "# of connections: 12", - "# of connections: 10", - "# of connections: 8", - "# of connections: 3", - "# of connections: 10", - "# of connections: 8", - "# of connections: 8", - "# of connections: 10", - "# of connections: 2", - "# of connections: 18", - "# of connections: 4", - "# of connections: 10", - "# of connections: 16", - "# of connections: 13", - "# of connections: 7", - "# of connections: 7", - "# of connections: 13", - "# of connections: 8", - "# of connections: 5", - "# of connections: 12", - "# of connections: 5", - "# of connections: 6", - "# of connections: 9", - "# of connections: 11", - "# of connections: 9", - "# of connections: 8", - "# of connections: 7", - "# of connections: 9", - "# of connections: 16", - "# of connections: 10", - "# of connections: 5", - "# of connections: 4", - "# of connections: 12", - "# of connections: 9", - "# of connections: 9", - "# of connections: 4", - "# of connections: 6", - "# of connections: 3", - "# of connections: 6", - "# of connections: 11", - "# of connections: 13", - "# of connections: 10", - "# of connections: 9", - "# of connections: 11", - "# of connections: 11", - "# of connections: 6", - "# of connections: 6", - "# of connections: 12", - "# of connections: 7", - "# of connections: 10", - "# of connections: 10", - "# of connections: 6", - "# of connections: 9", - "# of connections: 12", - "# of connections: 7", - "# of connections: 9", - "# of connections: 8", - "# of connections: 9", - "# of connections: 11", - "# of connections: 13", - "# of connections: 12", - "# of connections: 3", - "# of connections: 8", - "# of connections: 12", - "# of connections: 17", - "# of connections: 9", - "# of connections: 3", - "# of connections: 6", - "# of connections: 7", - "# of connections: 4", - "# of connections: 4", - "# of connections: 8", - "# of connections: 12", - "# of connections: 17", - "# of connections: 11", - "# of connections: 10", - "# of connections: 5", - "# of connections: 9", - "# of connections: 4", - "# of connections: 14", - "# of connections: 13", - "# of connections: 12", - "# of connections: 9", - "# of connections: 6", - "# of connections: 6", - "# of connections: 8", - "# of connections: 11", - "# of connections: 8", - "# of connections: 12", - "# of connections: 3", - "# of connections: 13", - "# of connections: 4", - "# of connections: 6", - "# of connections: 8", - "# of connections: 3", - "# of connections: 7", - "# of connections: 7", - "# of connections: 3", - "# of connections: 12", - "# of connections: 9", - "# of connections: 4", - "# of connections: 4", - "# of connections: 11", - "# of connections: 8", - "# of connections: 7", - "# of connections: 10", - "# of connections: 9", - "# of connections: 15", - "# of connections: 11", - "# of connections: 7", - "# of connections: 5", - "# of connections: 6", - "# of connections: 10", - "# of connections: 4", - "# of connections: 3", - "# of connections: 12", - "# of connections: 12", - "# of connections: 5" - ], - "type": "scatter", - "x": [ - 0.4182243125490408, - 0.12286879065958844, - 0.6730431696885844, - 0.38165116541180344, - 0.6084965344664286, - 0.18155558675901884, - 0.7722862313192606, - 0.5368181409256901, - 0.8304626469521129, - 0.7924139234898422, - 0.8266354543284289, - 0.4023039585223629, - 0.5084198498293618, - 0.23992481624351925, - 0.2742000416622462, - 0.15570283642495664, - 0.07513674080757637, - 0.7247552078664479, - 0.2586357176925591, - 0.595945044435614, - 0.9428542201780316, - 0.03304679952258993, - 0.6013564651959642, - 0.1130639188502468, - 0.5531504465254558, - 0.1635981270944994, - 0.05512117222879742, - 0.32578353530864457, - 0.27440213390552737, - 0.2728250610713022, - 0.6346565064837861, - 0.6327007577432437, - 0.800297854626628, - 0.526779936668903, - 0.413948124857326, - 0.09276814106220677, - 0.662108954544855, - 0.07163295816605642, - 0.44119458804978295, - 0.7364515013041172, - 0.7827775151390383, - 0.9600359726880752, - 0.8511753697833563, - 0.05194805532761382, - 0.03187584930858911, - 0.07426685281627932, - 0.5257999712304688, - 0.9998698320754983, - 0.09471702229050472, - 0.6953901849658966, - 0.03446402354654854, - 0.9082570345357789, - 0.3740122792611037, - 0.977854801698089, - 0.5436816885151938, - 0.06202421257916635, - 0.8589937476561325, - 0.06879886671193436, - 0.19921682827804632, - 0.1823584228427031, - 0.37549158943196925, - 0.5433115547736789, - 0.37848025459696877, - 0.3821391536049519, - 0.7204214783753378, - 0.2955343345493908, - 0.09053866681881584, - 0.7181048560087516, - 0.10310287300704979, - 0.8247840830312709, - 0.1573630170264504, - 0.31305791514229697, - 0.298647499376007, - 0.3246624829381992, - 0.19852054651169693, - 0.3328704753356456, - 0.33203393677870674, - 0.5461279353327784, - 0.9636084967560627, - 0.9503884723051484, - 0.13747604708068628, - 0.3499260998923053, - 0.3181124346701171, - 0.89080246263295, - 0.9521646983336837, - 0.6776948411821848, - 0.0023771443647881974, - 0.7007214129943925, - 0.7188906153197968, - 0.47055154706870017, - 0.19043749918150743, - 0.5274116361492907, - 0.9162463356603696, - 0.7042334738295596, - 0.555788147264811, - 0.5805679633404117, - 0.587704695878027, - 0.916634041055854, - 0.7948577020793985, - 0.9210876029743161, - 0.834199864808296, - 0.5989925957177575, - 0.05973078995013337, - 0.5593951498649633, - 0.5229468203255856, - 0.22007362873840486, - 0.37301066653863624, - 0.8613129225222332, - 0.9663892923019699, - 0.2275256207367028, - 0.0852382135963593, - 0.0914406510425998, - 0.9425745666137786, - 0.3019474379086241, - 0.2619562675328274, - 0.48218022499136737, - 0.5293212253918783, - 0.41808707877840445, - 0.14711158829428328, - 0.42926818011737133, - 0.9694266665187994, - 0.4404718698088387, - 0.4277213938753692, - 0.7059759544943667, - 0.4611021425875542, - 0.13940667248499528, - 0.3393815448042514, - 0.6370268640561303, - 0.9851894520572745, - 0.3247821296168134, - 0.9186278106648778, - 0.18507593174525072, - 0.5845953849421676, - 0.44175944307536974, - 0.7255980413609877, - 0.6058132814274794, - 0.7703024251104211, - 0.47443124751760235, - 0.9573079778783831, - 0.0201693226965588, - 0.17086936775877049, - 0.5291812256005789, - 0.5621062195646831, - 0.2121217358781844, - 0.16862303760247477, - 0.8846357375826375, - 0.0875467755337247, - 0.9473667691929577, - 0.8541827253649632, - 0.3414075728554137, - 0.9005048863870916, - 0.3318561006769827, - 0.7408684543182315, - 0.6149491168624189, - 0.12355952994556385, - 0.08997327822205015, - 0.21535391032155426, - 0.8323549266756429, - 0.8385234321105272, - 0.9240127894624793, - 0.6802728591951641, - 0.25656414507004344, - 0.020212382594376965, - 0.32444561774289593, - 0.4564806171162211, - 0.838803404513024, - 0.6322124026692795, - 0.8505181106970376, - 0.0897773631019545, - 0.7607451357487841, - 0.02312833765025224, - 0.05596958524873419, - 0.3187675293980876, - 0.5191285820034173, - 0.4349682989231034, - 0.04781523934390508, - 0.014269300880037306, - 0.9636590456207981, - 0.8680862155815134, - 0.4363707938884992, - 0.20133087739958255, - 0.6234379896430121, - 0.6314926226168458, - 0.29978148854693865, - 0.33721825060791266, - 0.7518492361353024, - 0.4442228752887084, - 0.04237200971819888, - 0.5201251204037126, - 0.038579501382332126, - 0.9110645875753355, - 0.5593069337955722, - 0.8668565351624634, - 0.42077304608666055, - 0.5465171974419871, - 0.7333209824474588, - 0.4039327719907384, - 0.34114125407236195, - 0.01777064460825195, - 0.992283435751248 - ], - "y": [ - 0.09053726824382247, - 0.571085214777101, - 0.5199666766946885, - 0.33766327379542094, - 0.17196466768963936, - 0.17708608014427518, - 0.04649454781195783, - 0.37080565676900146, - 0.3602866247185619, - 0.9483925173875926, - 0.3061539627540061, - 0.9643804220706982, - 0.8336885167043149, - 0.5944498275635773, - 0.2373268562908326, - 0.23741932367240448, - 0.32127102230894566, - 0.3661437355856225, - 0.7791505090281524, - 0.3648985367210805, - 0.6244837238804738, - 0.9012137046519791, - 0.5219101415039136, - 0.39453602200590676, - 0.2009582712064717, - 0.04224314617430658, - 0.2381682330796122, - 0.33811323660241943, - 0.5216765314868881, - 0.6001026871900049, - 0.991844460003468, - 0.3343459796676115, - 0.8957623407464501, - 0.4208812619135248, - 0.31304614249644347, - 0.6773365837969099, - 0.4307004647175262, - 0.3309683982450944, - 0.2697998035002954, - 0.9727770125665405, - 0.40557198035837094, - 0.35532572275494023, - 0.5850986908522726, - 0.17296378957033465, - 0.6628083689885368, - 0.6160873747407943, - 0.025297953521542405, - 0.24028581536328997, - 0.5186581897030644, - 0.8423383207045981, - 0.7537809293531343, - 0.3192831323823997, - 0.17542400609184483, - 0.008409380348177398, - 0.938767234846119, - 0.24033413659841596, - 0.8791466031622056, - 0.5634679987017406, - 0.05938145280899054, - 0.6012106694454529, - 0.6705222836834548, - 0.3900960314334032, - 0.055894273053114896, - 0.14933184162295132, - 0.8151159149468827, - 0.17619771419691865, - 0.2981410655965283, - 0.7334929583472656, - 0.04283815208078323, - 0.922341377568881, - 0.3199684158322815, - 0.1278305132468397, - 0.21532966919867302, - 0.0731473655342364, - 0.4898861106787329, - 0.2695720924906413, - 0.09533319097359638, - 0.9874110419208606, - 0.1333966979371528, - 0.2529891644068947, - 0.45431497833000367, - 0.24454670425362057, - 0.20002447568886628, - 0.6267294109959968, - 0.5221172076712435, - 0.6512622326935055, - 0.3355480553373167, - 0.4834545718278357, - 0.4847615611240751, - 0.20619722773579274, - 0.9419075807648644, - 0.3098874271134545, - 0.04149975738749545, - 0.32266487999330984, - 0.4295667428124167, - 0.35350564895305514, - 0.15069304516745607, - 0.41535454584101794, - 0.8821215709600496, - 0.9542382277667263, - 0.7205270186163313, - 0.31541428705224306, - 0.010366221042083845, - 0.06016942899581168, - 0.8867112408398291, - 0.5204579980957379, - 0.4500538798110242, - 0.40395348439090084, - 0.5717872069066212, - 0.42052616285893474, - 0.2660491488293679, - 0.10782775946098799, - 0.7302384542961842, - 0.8520196094107113, - 0.4140065537970282, - 0.4467311570808764, - 0.5144551437666581, - 0.7454337953380579, - 0.03395115206665145, - 0.7077207700167599, - 0.9024846524956353, - 0.055897802218322856, - 0.2880647319459674, - 0.9328536520894143, - 0.9298960866412943, - 0.6352288779182178, - 0.04153202488293273, - 0.7834166246251234, - 0.6710484758334021, - 0.3202314429055858, - 0.9961038345306213, - 0.4107398412471005, - 0.24013807075121119, - 0.8599268392047722, - 0.4318165589087314, - 0.2693681584998491, - 0.3340702546567942, - 0.4421375373865315, - 0.5492873750243871, - 0.5981086798045652, - 0.3635517670405215, - 0.42641694849778966, - 0.3333136626479075, - 0.8848427298858184, - 0.6648266103848882, - 0.9344432405222354, - 0.249116699886752, - 0.6201266549140614, - 0.16781555203357146, - 0.4937592635708411, - 0.4248880785102581, - 0.9435179236599912, - 0.07011604000159166, - 0.9078978130468089, - 0.6072525121642058, - 0.23700988477155205, - 0.05477321631284726, - 0.9642772106357639, - 0.019989772968585173, - 0.29119156039108685, - 0.6217058876501556, - 0.1341994714416056, - 0.28871122138225125, - 0.06013197669987258, - 0.22993075379681738, - 0.5752985482362863, - 0.10059463740220753, - 0.8157570218353161, - 0.42203254876563234, - 0.7925454632595156, - 0.2002886163837997, - 0.8622415881936324, - 0.3169605131706372, - 0.6014235590484225, - 0.9958360522915445, - 0.5260776190209286, - 0.8350595230795331, - 0.24102842320743, - 0.19048093242734687, - 0.7005910562446783, - 0.29050814087118004, - 0.8508124987550889, - 0.6714278208298593, - 0.9756800437762957, - 0.040563128366188694, - 0.5097617399826666, - 0.8842114977564064, - 0.13201947050262697, - 0.09959517902538939, - 0.2318219208408404, - 0.888980486534156, - 0.9513646744432486, - 0.1294716874165911, - 0.5603277981830703, - 0.4868902788925622, - 0.038844634468288675, - 0.547451424618544, - 0.32345881810688737, - 0.20307680326083377, - 0.9810704436128125 - ] - } - ], - "layout": { - "annotations": [ - { - "showarrow": true, - "text": "graphs", - "x": 0.005, - "xref": "paper", - "y": -0.002, - "yref": "paper" - } - ], - "hovermode": "closest", - "margin": { - "b": 20, - "l": 5, - "r": 5, - "t": 40 - }, - "showlegend": false, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "font": { - "size": 16 - }, - "text": "Network graph made with Python" - }, - "xaxis": { - "showgrid": false, - "showticklabels": false, - "zeroline": false - }, - "yaxis": { - "showgrid": false, - "showticklabels": false, - "zeroline": false - } - } - }, - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "G = nx.random_geometric_graph(200, 0.125)\n", - "edge_x = []\n", - "edge_y = []\n", - "for edge in G.edges():\n", - " x0, y0 = G.nodes[edge[0]]['pos']\n", - " x1, y1 = G.nodes[edge[1]]['pos']\n", - " edge_x.append(x0)\n", - " edge_x.append(x1)\n", - " edge_x.append(None)\n", - " edge_y.append(y0)\n", - " edge_y.append(y1)\n", - " edge_y.append(None)\n", - "\n", - "edge_trace = go.Scatter(\n", - " x=edge_x, y=edge_y,\n", - " line=dict(width=0.5, color='#888'),\n", - " hoverinfo='none',\n", - " mode='lines')\n", - "\n", - "node_x = []\n", - "node_y = []\n", - "for node in G.nodes():\n", - " x, y = G.nodes[node]['pos']\n", - " node_x.append(x)\n", - " node_y.append(y)\n", - "\n", - "node_trace = go.Scatter(\n", - " x=node_x, y=node_y,\n", - " mode='markers',\n", - " hoverinfo='text',\n", - " marker=dict(\n", - " showscale=True,\n", - " # colorscale options\n", - " #'Greys' | 'YlGnBu' | 'Greens' | 'YlOrRd' | 'Bluered' | 'RdBu' |\n", - " #'Reds' | 'Blues' | 'Picnic' | 'Rainbow' | 'Portland' | 'Jet' |\n", - " #'Hot' | 'Blackbody' | 'Earth' | 'Electric' | 'Viridis' |\n", - " colorscale='YlGnBu',\n", - " reversescale=True,\n", - " color=[],\n", - " size=10,\n", - " colorbar=dict(\n", - " thickness=15,\n", - " title='Node Connections',\n", - " xanchor='left',\n", - " titleside='right'\n", - " ),\n", - " line_width=2))\n", - "\n", - "node_adjacencies = []\n", - "node_text = []\n", - "for node, adjacencies in enumerate(G.adjacency()):\n", - " node_adjacencies.append(len(adjacencies[1]))\n", - " node_text.append('# of connections: '+str(len(adjacencies[1])))\n", - "\n", - "node_trace.marker.color = node_adjacencies\n", - "node_trace.text = node_text\n", - "\n", - "\n", - "fig = go.Figure(data=[edge_trace, node_trace],\n", - " layout=go.Layout(\n", - " title='Network graph made with Python',\n", - " titlefont_size=16,\n", - " showlegend=False,\n", - " hovermode='closest',\n", - " margin=dict(b=20,l=5,r=5,t=40),\n", - " annotations=[ dict(\n", - " text=\"graphs\",\n", - " showarrow=True,\n", - " xref=\"paper\", yref=\"paper\",\n", - " x=0.005, y=-0.002 ) ],\n", - " xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),\n", - " yaxis=dict(showgrid=False, zeroline=False, showticklabels=False))\n", - " )\n", - "fig.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "G = nx.Graph()\n", - "G.add_node(0)\n", - "nx.set_node_attributes(G, \"red\", name=\"color\")\n", - "nx.set_node_attributes(G, 2, name=\"size\")\n", - "G.add_node(1)\n", - "nx.set_node_attributes(G, np.nan, name='color')\n", - "G.nodes[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "ename": "NetworkXError", - "evalue": "Invalid edge_attr argument: ['donations', 'received']", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/pandas/core/indexes/base.py:3653\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3652\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 3653\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcasted_key\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3654\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n", - "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/pandas/_libs/index.pyx:147\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/pandas/_libs/index.pyx:176\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:7080\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:7088\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: 'donations'", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/networkx/convert_matrix.py:455\u001b[0m, in \u001b[0;36mfrom_pandas_edgelist\u001b[0;34m(df, source, target, edge_attr, create_using, edge_key)\u001b[0m\n\u001b[1;32m 454\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 455\u001b[0m attribute_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mzip\u001b[39m(\u001b[38;5;241m*\u001b[39m\u001b[43m[\u001b[49m\u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[43mcol\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mcol\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mattr_col_headings\u001b[49m\u001b[43m]\u001b[49m)\n\u001b[1;32m 456\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mKeyError\u001b[39;00m, \u001b[38;5;167;01mTypeError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n", - "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/networkx/convert_matrix.py:455\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 454\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 455\u001b[0m attribute_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mzip\u001b[39m(\u001b[38;5;241m*\u001b[39m[\u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[43mcol\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m col \u001b[38;5;129;01min\u001b[39;00m attr_col_headings])\n\u001b[1;32m 456\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mKeyError\u001b[39;00m, \u001b[38;5;167;01mTypeError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n", - "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/pandas/core/frame.py:3761\u001b[0m, in \u001b[0;36mDataFrame.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3760\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_getitem_multilevel(key)\n\u001b[0;32m-> 3761\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3762\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_integer(indexer):\n", - "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/pandas/core/indexes/base.py:3655\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3654\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m-> 3655\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 3656\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 3657\u001b[0m \u001b[38;5;66;03m# If we have a listlike key, _check_indexing_error will raise\u001b[39;00m\n\u001b[1;32m 3658\u001b[0m \u001b[38;5;66;03m# InvalidIndexError. Otherwise we fall through and re-raise\u001b[39;00m\n\u001b[1;32m 3659\u001b[0m \u001b[38;5;66;03m# the TypeError.\u001b[39;00m\n", - "\u001b[0;31mKeyError\u001b[0m: 'donations'", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mNetworkXError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[16], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m G \u001b[38;5;241m=\u001b[39m \u001b[43mnx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfrom_pandas_edgelist\u001b[49m\u001b[43m(\u001b[49m\u001b[43msample_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43msource\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mname\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43mtarget\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdonations_to\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43medge_attr\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdonations\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mreceived\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m G\u001b[38;5;241m.\u001b[39mnodes()\n\u001b[1;32m 3\u001b[0m pos\u001b[38;5;241m=\u001b[39mnx\u001b[38;5;241m.\u001b[39mspring_layout(G)\n", - "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/networkx/utils/backends.py:412\u001b[0m, in \u001b[0;36m_dispatch.__call__\u001b[0;34m(self, backend, *args, **kwargs)\u001b[0m\n\u001b[1;32m 409\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m/\u001b[39m, \u001b[38;5;241m*\u001b[39margs, backend\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 410\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m backends:\n\u001b[1;32m 411\u001b[0m \u001b[38;5;66;03m# Fast path if no backends are installed\u001b[39;00m\n\u001b[0;32m--> 412\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43morig_func\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 414\u001b[0m \u001b[38;5;66;03m# Use `backend_name` in this function instead of `backend`\u001b[39;00m\n\u001b[1;32m 415\u001b[0m backend_name \u001b[38;5;241m=\u001b[39m backend\n", - "File \u001b[0;32m~/miniconda3/envs/climate_cabinet/lib/python3.11/site-packages/networkx/convert_matrix.py:458\u001b[0m, in \u001b[0;36mfrom_pandas_edgelist\u001b[0;34m(df, source, target, edge_attr, create_using, edge_key)\u001b[0m\n\u001b[1;32m 456\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mKeyError\u001b[39;00m, \u001b[38;5;167;01mTypeError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 457\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid edge_attr argument: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00medge_attr\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 458\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m nx\u001b[38;5;241m.\u001b[39mNetworkXError(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 460\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m g\u001b[38;5;241m.\u001b[39mis_multigraph():\n\u001b[1;32m 461\u001b[0m \u001b[38;5;66;03m# => append the edge keys from the df to the bundled data\u001b[39;00m\n\u001b[1;32m 462\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m edge_key \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", - "\u001b[0;31mNetworkXError\u001b[0m: Invalid edge_attr argument: ['donations', 'received']" - ] - } - ], - "source": [ - "G = nx.from_pandas_edgelist(sample_df,source='name',target='donations_to',edge_attr=['donations','received'])\n", - "G.nodes()\n", - "pos=nx.spring_layout(G)\n", - "weights = list(nx.get_edge_attributes(G,'donations').values())\n", - "weights = [i/5000 for i in weights]\n", - "node_color = [G.degree(v) for v in G] \n", - "#node_size = [0.0005 * nx.get_node_attributes(G, 'donations')[v] for v in G] \n", - "nx.draw_networkx_nodes(G, pos, node_color=node_color)#, node_size=node_size) \n", - "nx.draw_networkx_edges(G, pos, width=weights)\n", - "nx.draw_networkx_labels(G, pos)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# fixing the size of the figure \n", - "plt.figure(figsize =(10, 7)) \n", - "\n", - "node_color = [G.degree(v) for v in G] \n", - "# node colour is a list of degrees of nodes \n", - "\n", - "node_size = [0.0005 * nx.get_node_attributes(G, 'population')[v] for v in G] \n", - "# size of node is a list of population of cities \n", - "\n", - "edge_width = [0.0015 * G[u][v]['weight'] for u, v in G.edges()] \n", - "# width of edge is a list of weight of edges \n", - "\n", - "nx.draw_networkx(G, node_size = node_size, \n", - "\t\t\t\tnode_color = node_color, alpha = 0.7, \n", - "\t\t\t\twith_labels = True, width = edge_width, \n", - "\t\t\t\tedge_color ='.4', cmap = plt.cm.Blues) \n", - "\n", - "plt.axis('off') \n", - "plt.tight_layout(); " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "G = nx.MultiDiGraph()\n", - "G.add_node(0)\n", - "nx.set_node_attributes(G, \"red\", name=\"color\")\n", - "nx.set_node_attributes(G, 4, name = 'size')\n", - "G.add_node(2)\n", - "nx.set_node_attributes(G, \"white\", name='color')\n", - "G.nodes[2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "G.add_node(2)\n", - "nx.set_node_attributes(G, 4, name='age')\n", - "G.nodes[2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "climate_cabinet", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 0f7d07ef00da198d3aa9e28b0ddcbdb830270dba Mon Sep 17 00:00:00 2001 From: Avery Schoen <33437601+averyschoen@users.noreply.github.com> Date: Tue, 5 Mar 2024 12:07:31 -0600 Subject: [PATCH 202/214] Update Makefile --- Makefile | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 273bc9c0..07383c3c 100644 --- a/Makefile +++ b/Makefile @@ -19,11 +19,6 @@ project_dir := "$(current_abs_path)" build-only: docker build -t $(project_image_name) -f Dockerfile $(current_abs_path) - # these are called directives - # run-pipeline: - # docker build -t $(project_image_name) -f Dockerfile $(current_abs_path) - # docker run -e python pipeline.py - run-interactive: docker build -t $(project_image_name) -f Dockerfile $(current_abs_path) docker run -it -v $(current_abs_path):/project -t $(project_image_name) /bin/bash @@ -39,4 +34,4 @@ run-notebooks: #still waiting on linkage_pipeline completion to get this into final shape output network_graph: all_individuals.csv all_organizations.csv all_transactions.csv - python linkage_pipeline.py \ No newline at end of file + python linkage_pipeline.py From 0a3b4e78d72489494e15a2fc0bd0ebc98a9a60b7 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Tue, 5 Mar 2024 18:53:22 -0600 Subject: [PATCH 203/214] slight modifications to linkage.py for cleaning purposes --- utils/linkage.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 32a44dfc..964ba31e 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -39,7 +39,6 @@ def get_address_line_1_from_full_address(address: str) -> str: ... ) '1415 PARKER STREET' """ - pass address_tuples = usaddress.parse( address @@ -137,7 +136,7 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: >>> get_likely_name("Jane","","Doe, Jane, Elisabeth") 'Jane Elisabeth Doe' """ - # first, convert any Nans to empty strings '' + # first, convert any NaNs to empty strings '' first_name, last_name, full_name = [ "" if x is np.NAN else x for x in [first_name, last_name, full_name] ] @@ -151,8 +150,7 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: if first_name + " " + last_name == full_name: return full_name.title() - # some names have titles or professions associated with the name. We need to - # remove those from the name. + # remove titles or professions from the name names = [first_name, last_name, full_name] for i in range(len(names)): @@ -278,7 +276,7 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: # first remove all duplicate entries: new_df = df.drop_duplicates() - # now find the duplicates along all columns but the ID + # find the duplicates along all columns but the id new_df = ( new_df.groupby(df.columns.difference(["id"]).tolist(), dropna=False)[ "id" @@ -289,7 +287,7 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: ) new_df.index = new_df["duplicated"].str[0].tolist() - # now convert the duplicated column into a dictionary that can will be + # convert the duplicated column into a dictionary that can will be # an output by only feeding the entries with duplicates new_df = new_df.reset_index().rename(columns={"index": "id"}) convert_duplicates_to_dict(new_df[["id", "duplicated"]]) @@ -299,8 +297,8 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: def cleaning_company_column(company_entry: str) -> str: """ - Given a string, check if it contains a variation of self employed, unemployed, - or retired and return the standardized version. + Given a string, check if it contains a variation of self employed, + unemployed, or retired and return the standardized version. Args: company: string of inputted company names @@ -376,7 +374,7 @@ def standardize_corp_names(company_name: str) -> str: """ - company_name_split = company_name.upper().split(" ") + company_name_split = company_name.title().split(" ") for i in range(len(company_name_split)): if company_name_split[i] in list(COMPANY_TYPES.keys()): @@ -419,7 +417,7 @@ def get_address_number_from_address_line_1(address_line_1: str) -> str: return address_line_1_components[i][0] elif address_line_1_components[i][1] == "USPSBoxID": return address_line_1_components[i][0] - raise ValueError("Can not find Address Number") + raise ValueError("Cannot find Address Number") def splink_dedupe( @@ -478,10 +476,10 @@ def splink_dedupe( on="cluster_id", how="left", ) - deduped_df.rename(columns={"cluster_id": "unique_id"}, inplace=True) + deduped_df = deduped_df.rename(columns={"cluster_id": "unique_id"}) convert_duplicates_to_dict(deduped_df) - deduped_df.drop(columns=["duplicated"]) + deduped_df = deduped_df.drop(columns=["duplicated"]) return deduped_df From 9f980ff31bcd3b5d97e6c8e3b32290349f5b6114 Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Tue, 5 Mar 2024 18:58:12 -0600 Subject: [PATCH 204/214] slight modifications to linkage.py for cleaning purposes, now passing linter --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 964ba31e..5b63e7e3 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -297,7 +297,7 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: def cleaning_company_column(company_entry: str) -> str: """ - Given a string, check if it contains a variation of self employed, + Given a string, check if it contains a variation of self employed, unemployed, or retired and return the standardized version. Args: From 7ebe2a26e3f8c18ec3f9aebd8aeae9872cfa1050 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 6 Mar 2024 01:38:37 +0000 Subject: [PATCH 205/214] slight changes --- utils/linkage_pipeline.py | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/utils/linkage_pipeline.py b/utils/linkage_pipeline.py index 499726e9..b9a87fe8 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_pipeline.py @@ -19,6 +19,7 @@ splink_dedupe, standardize_corp_names, ) +from utils.network import construct_network_graph def preprocess_individuals(individuals: pd.DataFrame) -> pd.DataFrame: @@ -95,6 +96,18 @@ def preprocess_individuals(individuals: pd.DataFrame) -> pd.DataFrame: axis=1, ) + individuals["sort_priority"] = ( + ~individuals["first_name"].isna() + & ~individuals["last_name"].isna() + & ~individuals["company"].isna() + ) * 2 + (~individuals["party"].isna()) + + individuals = individuals.sort_values( + by="sort_priority", ascending=False + ).drop(columns=["sort_priority"]) + + individuals["unique_id"] = individuals["id"] + return individuals @@ -112,6 +125,8 @@ def preprocess_organizations(organizations: pd.DataFrame) -> pd.DataFrame: .apply(standardize_corp_names) ) + organizations["unique_id"] = organizations["id"] + return organizations @@ -131,6 +146,11 @@ def preprocess_transactions(transactions: pd.DataFrame) -> pd.DataFrame: transactions["purpose"] = transactions["purpose"].str.upper() + deduped = pd.read_csv(BASE_FILEPATH / "output" / "deduplicated_UUIDs.csv") + transactions[["donor_id", "recipient_id"]] = transactions[ + ["donor_id", "recipient_id"] + ].replace(deduped) + return transactions @@ -149,17 +169,13 @@ def main(): individuals = preprocess_individuals(individuals) organizations = preprocess_organizations(organizations) - transactions = preprocess_transactions(transactions) individuals, organizations = classify_wrapper(individuals, organizations) individuals = deduplicate_perfect_matches(individuals) organizations = deduplicate_perfect_matches(organizations) - deduped = pd.read_csv(BASE_FILEPATH / "output" / "deduplicated_UUIDs.csv") - - individuals["unique_id"] = individuals["id"] - organizations["unique_id"] = organizations["id"] + transactions = preprocess_transactions(transactions) organizations = splink_dedupe( organizations, organizations_settings, organizations_blocking @@ -169,10 +185,6 @@ def main(): individuals, individuals_settings, individuals_blocking ) - transactions[["donor_id", "recipient_id"]] = transactions[ - ["donor_id", "recipient_id"] - ].replace(deduped) - cleaned_individuals_output_path = ( BASE_FILEPATH / "output" / "cleaned_individuals_table.csv" ) @@ -189,6 +201,10 @@ def main(): organizations.to_csv(cleaned_organizations_output_path, index=False) transactions.to_csv(cleaned_transactions_output_path, index=False) + construct_network_graph( + 2018, 2024, [individuals, organizations, transactions] + ) + if __name__ == "__main__": main() From 51f82d436cd693744525d421fc6d3f038c41e7ad Mon Sep 17 00:00:00 2001 From: Alan Mburu Kagiri Date: Tue, 5 Mar 2024 19:40:36 -0600 Subject: [PATCH 206/214] revert changes to standardize_corp_names...the logic goes through many channels --- utils/linkage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/linkage.py b/utils/linkage.py index 5b63e7e3..c89b5818 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -374,7 +374,7 @@ def standardize_corp_names(company_name: str) -> str: """ - company_name_split = company_name.title().split(" ") + company_name_split = company_name.upper().split(" ") for i in range(len(company_name_split)): if company_name_split[i] in list(COMPANY_TYPES.keys()): From 9a0352151fb451ddf1846e89d2948921e3bee149 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 6 Mar 2024 01:44:30 +0000 Subject: [PATCH 207/214] renaming file --- utils/{linkage_pipeline.py => linkage_and_network_pipeline.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename utils/{linkage_pipeline.py => linkage_and_network_pipeline.py} (99%) diff --git a/utils/linkage_pipeline.py b/utils/linkage_and_network_pipeline.py similarity index 99% rename from utils/linkage_pipeline.py rename to utils/linkage_and_network_pipeline.py index b9a87fe8..134d5f2d 100644 --- a/utils/linkage_pipeline.py +++ b/utils/linkage_and_network_pipeline.py @@ -202,7 +202,7 @@ def main(): transactions.to_csv(cleaned_transactions_output_path, index=False) construct_network_graph( - 2018, 2024, [individuals, organizations, transactions] + 2018, 2023, [individuals, organizations, transactions] ) From d4161f61db0df0e24bc3bd002999ceca6b0f0c70 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 6 Mar 2024 02:07:32 +0000 Subject: [PATCH 208/214] updating functions to latest versions --- utils/linkage.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/utils/linkage.py b/utils/linkage.py index 28f12dd4..5791da59 100644 --- a/utils/linkage.py +++ b/utils/linkage.py @@ -137,7 +137,12 @@ def get_likely_name(first_name: str, last_name: str, full_name: str) -> str: >>> get_likely_name("Jane","","Doe, Jane, Elisabeth") 'Jane Elisabeth Doe' """ - # first ensure clean input by deleting spaces: + # first, convert any Nans to empty strings '' + first_name, last_name, full_name = [ + "" if x is np.NAN else x for x in [first_name, last_name, full_name] + ] + + # second, ensure clean input by deleting spaces: first_name, last_name, full_name = list( map(lambda x: x.lower().strip(), [first_name, last_name, full_name]) ) @@ -220,21 +225,23 @@ def get_street_from_address_line_1(address_line_1: str) -> str: def convert_duplicates_to_dict(df: pd.DataFrame) -> None: - """Saves to the "output" directory a file where each row represents a string - matching to another string + """For each uuid, maps it to all other uuids for which it has been deemed a + match. - Given a dataframe where each row contains one string in a column and a list - of strings in another column, the function maps each string in the list to - the single string. + Given a dataframe where the uuids of all rows deemed similar are stored in a + list and all but the first row of each paired uuid is dropped, this function + maps the matched uuids to a single uuid. Args: - A pandas dataframe + A pandas df containing a column called 'duplicated', where each row is a + list of all uuids deemed a match. In each list, all uuids but the first + have their rows already dropped. Returns None. However it outputs a file to the output directory, with 2 - columns. The first, which indicates the duplicated UUIDs, is labeled - 'duplicated_uuids', and the 2nd, which shows the uuids to which the - deduplicated entries match to, is labeled 'mapped_uuids'. + columns. The first lists all the uuids in df, and is labeled + 'original_uuids.' The 2nd shows the uuids to which each entry is mapped + to, and is labeled 'mapped_uuids'. """ deduped_dict = {} for i in range(len(df)): @@ -245,7 +252,7 @@ def convert_duplicates_to_dict(df: pd.DataFrame) -> None: # now convert dictionary into a csv file deduped_df = pd.DataFrame.from_dict(deduped_dict, "index") deduped_df = deduped_df.reset_index().rename( - columns={"index": "duplicated_uuids", 0: "mapped_uuids"} + columns={"index": "original_uuids", 0: "mapped_uuid"} ) deduped_df.to_csv( repo_root / "output" / "deduplicated_UUIDs.csv", @@ -273,7 +280,9 @@ def deduplicate_perfect_matches(df: pd.DataFrame) -> pd.DataFrame: # now find the duplicates along all columns but the ID new_df = ( - new_df.groupby(df.columns[1:].tolist(), dropna=False)["id"] + new_df.groupby(df.columns.difference(["id"]).tolist(), dropna=False)[ + "id" + ] .agg(list) .reset_index() .rename(columns={"id": "duplicated"}) From 45347e26a39b50a951a69e2c77c50d16b1fd0bfc Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 6 Mar 2024 02:09:14 +0000 Subject: [PATCH 209/214] slight changes to match function changes in linkage.py --- utils/linkage_and_network_pipeline.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/linkage_and_network_pipeline.py b/utils/linkage_and_network_pipeline.py index 134d5f2d..bd6bcfbd 100644 --- a/utils/linkage_and_network_pipeline.py +++ b/utils/linkage_and_network_pipeline.py @@ -89,13 +89,13 @@ def preprocess_individuals(individuals: pd.DataFrame) -> pd.DataFrame: individuals["full_name"] = individuals.apply( lambda row: get_likely_name( - row["first_name"] if pd.notnull(row["first_name"]) else "", - row["last_name"] if pd.notnull(row["last_name"]) else "", - row["full_name"] if pd.notnull(row["full_name"]) else "", + row["first_name"], row["last_name"], row["full_name"] ), axis=1, ) + # Ensure that columns with values are prioritized and appear first + # important for splink implementation individuals["sort_priority"] = ( ~individuals["first_name"].isna() & ~individuals["last_name"].isna() From ad2ed0f5e9a30bd5c246c01ab4e3d4550a8f3dc3 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 6 Mar 2024 18:36:38 +0000 Subject: [PATCH 210/214] slight changes --- Makefile | 5 ++-- notebooks/Test.ipynb | 39 --------------------------- setup.py | 2 +- utils/linkage_and_network_pipeline.py | 34 +++++++++++++---------- 4 files changed, 24 insertions(+), 56 deletions(-) delete mode 100644 notebooks/Test.ipynb diff --git a/Makefile b/Makefile index 07383c3c..48879489 100644 --- a/Makefile +++ b/Makefile @@ -33,5 +33,6 @@ run-notebooks: #running the linkage pipeline and creating the network graph #still waiting on linkage_pipeline completion to get this into final shape -output network_graph: all_individuals.csv all_organizations.csv all_transactions.csv - python linkage_pipeline.py +run-linkage-and-network-pipeline: + docker build -t $(project_image_name) -f Dockerfile $(current_abs_path) + docker run -v $(current_abs_path):/project -t $(project_image_name) python utils/linkage_pipeline.py \ No newline at end of file diff --git a/notebooks/Test.ipynb b/notebooks/Test.ipynb deleted file mode 100644 index 5df942e1..00000000 --- a/notebooks/Test.ipynb +++ /dev/null @@ -1,39 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Example Notebook file demonstrating how to use the file structure\n", - "from utils.preprocess_util_lib_example import save_random_dataframe\n", - "from pathlib import Path\n", - "\n", - "save_random_dataframe(Path(\"../output\"), Path(\"test.csv\"))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/setup.py b/setup.py index 63ef672a..07404acd 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages, setup setup( - name="2023-fall-clinic-climate-cabinet", + name="2024-winter-clinic-climate-cabinet", version="0.1.0", packages=find_packages( include=[ diff --git a/utils/linkage_and_network_pipeline.py b/utils/linkage_and_network_pipeline.py index bd6bcfbd..7e5f8cec 100644 --- a/utils/linkage_and_network_pipeline.py +++ b/utils/linkage_and_network_pipeline.py @@ -1,3 +1,4 @@ +import networkx as nx import pandas as pd from nameparser import HumanName @@ -19,7 +20,11 @@ splink_dedupe, standardize_corp_names, ) -from utils.network import construct_network_graph +from utils.network import ( + create_network_graph, + combine_datasets_for_network_graph, + construct_network_graph, +) def preprocess_individuals(individuals: pd.DataFrame) -> pd.DataFrame: @@ -102,9 +107,9 @@ def preprocess_individuals(individuals: pd.DataFrame) -> pd.DataFrame: & ~individuals["company"].isna() ) * 2 + (~individuals["party"].isna()) - individuals = individuals.sort_values( - by="sort_priority", ascending=False - ).drop(columns=["sort_priority"]) + individuals = individuals.sort_values(by="sort_priority", ascending=False).drop( + columns=["sort_priority"] + ) individuals["unique_id"] = individuals["id"] @@ -159,9 +164,7 @@ def main(): BASE_FILEPATH / "data" / "complete_organizations_table.csv" ) - individuals = pd.read_csv( - BASE_FILEPATH / "data" / "complete_individuals_table.csv" - ) + individuals = pd.read_csv(BASE_FILEPATH / "data" / "complete_individuals_table.csv") transactions = pd.read_csv( BASE_FILEPATH / "data" / "complete_transactions_table.csv" @@ -175,15 +178,13 @@ def main(): individuals = deduplicate_perfect_matches(individuals) organizations = deduplicate_perfect_matches(organizations) - transactions = preprocess_transactions(transactions) - organizations = splink_dedupe( organizations, organizations_settings, organizations_blocking ) - individuals = splink_dedupe( - individuals, individuals_settings, individuals_blocking - ) + individuals = splink_dedupe(individuals, individuals_settings, individuals_blocking) + + transactions = preprocess_transactions(transactions) cleaned_individuals_output_path = ( BASE_FILEPATH / "output" / "cleaned_individuals_table.csv" @@ -201,9 +202,14 @@ def main(): organizations.to_csv(cleaned_organizations_output_path, index=False) transactions.to_csv(cleaned_transactions_output_path, index=False) - construct_network_graph( - 2018, 2023, [individuals, organizations, transactions] + aggreg_df = combine_datasets_for_network_graph( + [individuals, organizations, transactions] ) + g = create_network_graph(aggreg_df) + g_output_path = BASE_FILEPATH / "output" / "g.gml" + nx.write_graphml(g, g_output_path) + + construct_network_graph(2018, 2023, [individuals, organizations, transactions]) if __name__ == "__main__": From 4b0de47ef040c04e6adc78409e272fb04e132129 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 6 Mar 2024 18:48:41 +0000 Subject: [PATCH 211/214] readme changes --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a610a4ec..da6bba26 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ If you prefer to develop inside a container with VS Code then do the following s ### Record Linkage and Network Pipeline 1. Save the standardized tables "complete_individuals_table.csv", "complete_organizations_table.csv", and "complete_transactions_table.csv" (collected from the above pipeline or data from the project's Google Drive) in the following format: repo_root / "output" / "file" -2. **UPDATE:** Run the pipeline by calling ```make run-linkage-pipeline```. This pipeline will perform conservative record linkage, attempt to classify entities as neutral, fossil fuels, or clean energy, convert the standardized tables into a NetworkX Graph, and show an interactive network visual. +2. **UPDATE:** Run the pipeline by calling ```make run-linkage-and-network-pipeline```. This pipeline will perform conservative record linkage, attempt to classify entities as neutral, fossil fuels, or clean energy, convert the standardized tables into a NetworkX Graph, and show an interactive network visual. 3. The pipeline will output the deduplicated tables saved as "cleaned_individuals_table.csv", "cleaned_organizations_table.csv", and "cleaned_transactions_table.csv". A mapping file, "deduplicated_UUIDs" tracks the UUIDs designated as duplicates. The pipeline will also output "Network Graph Node Data", which is the NetworkX Graph object converted into an adjecency list. ## Repository Structure From 0c7902394bce4864e984eab13305ba99855a86dd Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 6 Mar 2024 18:50:36 +0000 Subject: [PATCH 212/214] data/ readme changes --- data/README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/data/README.md b/data/README.md index df9336b7..5326bff8 100644 --- a/data/README.md +++ b/data/README.md @@ -2,12 +2,6 @@ This directory contains information for use in this project. -## Makefile and Final Pipeline -- This folder is empty by default. In order to run the Makefile, download the complete_data.zip file from the Climate Cabinet Data Clinic Google Drive using this link: https://drive.google.com/file/d/1zbjt7iBU0NAWSBcUyEsjvuumn3VgI4z9/view?usp=sharing - - - After downloading this .zip, unzip it to find three files: complete_individuals.csv, complete_organizations.csv, and complete_transactions.csv. Upload these files into the data folder and ensure that their names are correct. Once they are in place, you may run the Makefile. - - ## Arizona Campaign Finance Data ### Summary From 48470c21eb14ca164516f241ab5d2646f008a318 Mon Sep 17 00:00:00 2001 From: Adil Kassim Date: Wed, 6 Mar 2024 18:51:15 +0000 Subject: [PATCH 213/214] pre-commit formatting changes --- utils/linkage_and_network_pipeline.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/utils/linkage_and_network_pipeline.py b/utils/linkage_and_network_pipeline.py index 7e5f8cec..86e0ab62 100644 --- a/utils/linkage_and_network_pipeline.py +++ b/utils/linkage_and_network_pipeline.py @@ -21,9 +21,9 @@ standardize_corp_names, ) from utils.network import ( - create_network_graph, combine_datasets_for_network_graph, construct_network_graph, + create_network_graph, ) @@ -107,9 +107,9 @@ def preprocess_individuals(individuals: pd.DataFrame) -> pd.DataFrame: & ~individuals["company"].isna() ) * 2 + (~individuals["party"].isna()) - individuals = individuals.sort_values(by="sort_priority", ascending=False).drop( - columns=["sort_priority"] - ) + individuals = individuals.sort_values( + by="sort_priority", ascending=False + ).drop(columns=["sort_priority"]) individuals["unique_id"] = individuals["id"] @@ -164,7 +164,9 @@ def main(): BASE_FILEPATH / "data" / "complete_organizations_table.csv" ) - individuals = pd.read_csv(BASE_FILEPATH / "data" / "complete_individuals_table.csv") + individuals = pd.read_csv( + BASE_FILEPATH / "data" / "complete_individuals_table.csv" + ) transactions = pd.read_csv( BASE_FILEPATH / "data" / "complete_transactions_table.csv" @@ -182,7 +184,9 @@ def main(): organizations, organizations_settings, organizations_blocking ) - individuals = splink_dedupe(individuals, individuals_settings, individuals_blocking) + individuals = splink_dedupe( + individuals, individuals_settings, individuals_blocking + ) transactions = preprocess_transactions(transactions) @@ -209,7 +213,9 @@ def main(): g_output_path = BASE_FILEPATH / "output" / "g.gml" nx.write_graphml(g, g_output_path) - construct_network_graph(2018, 2023, [individuals, organizations, transactions]) + construct_network_graph( + 2018, 2023, [individuals, organizations, transactions] + ) if __name__ == "__main__": From bee198affb27f50a4c58a968d7691ade72332fd0 Mon Sep 17 00:00:00 2001 From: Adil Kassim <76892521+adilkassim@users.noreply.github.com> Date: Wed, 6 Mar 2024 13:41:18 -0600 Subject: [PATCH 214/214] Update Makefile updating filename in makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 48879489..c2553e2d 100644 --- a/Makefile +++ b/Makefile @@ -35,4 +35,4 @@ run-notebooks: run-linkage-and-network-pipeline: docker build -t $(project_image_name) -f Dockerfile $(current_abs_path) - docker run -v $(current_abs_path):/project -t $(project_image_name) python utils/linkage_pipeline.py \ No newline at end of file + docker run -v $(current_abs_path):/project -t $(project_image_name) python utils/linkage_and_network_pipeline.py