{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# checking which cohort users have no mentor on record\n", "\n", "wikipedia has a feature where new users can get assigned a mentor (an experienced editor) at sign-up. the assignment happens server-side and is stored in a database table called `growthexperiments_mentor_mentee`. importantly, the backend assigns a mentor **regardless of whether the user has the mentor ui module turned on** \u2014 `mentorshipState` controls only whether the ui shows, not whether the backend writes the row. so every user in the cohort should have a row in the table.\n", "\n", "for some users there's no row at all. i want to figure out who they are, why the records are missing, and whether the rate of missing records changes over time.\n", "\n", "three sources of truth used below:\n", "\n", "1. **`inputs/z_mentorship_state.tsv`** \u2014 for every user, what value their `mentorshipState` user property carries. this is the **updated** version (2026-06-08+) of wikipedia's official released file (`dataset.tsv` from `https://analytics.wikimedia.org/published/datasets/one-off/growth/growthexperiments-mentorship-enabled-T420387/`), renamed locally. columns: `userId`, `mentorshipState`. the column now carries three raw values instead of the original two-way enabled/disabled split:\n", " - `unset` \u2014 the property was never written for this user (ui defaults to on if everything else is in place)\n", " - `'0'` \u2014 the user explicitly opted out\n", " - `'50'` \u2014 proactive-assignment flag (a 2024-era addition; backend kicks an async job to assign a mentor)\n", "\n", "2. **`inputs/cov_mentor_mentee_assignment_20260530.sql.gz`** \u2014 a snapshot of the actual mentor\u2194mentee database table, taken on 2026-05-30. downloaded from `https://dumps.wikimedia.org/other/growthmentorship/`. each row is a (mentee_id, mentor_role, mentor_id, mentee_is_active) tuple. the `mentor_role` column can take two values:\n", " - `primary` \u2014 the mentor formally assigned to this mentee. by default, questions get routed here.\n", " - `backup` \u2014 a fill-in mentor written by the system when the primary mentor sets themselves \"away\" temporarily. a mentee can have both rows simultaneously, only one, or neither.\n", "\n", "3. **`inputs/excl_mentor_claim_log_raw.jsonl`** \u2014 every public log entry on `Special:Log/growthexperiments`, fetched directly from the mediawiki api. these record every time a mentor was reassigned (`action='setmentor'`) or proactively claimed by a new mentor (`action='claimmentee'`). using this log, the snapshot can be \"played backward\" in time to figure out who the mentor was at any earlier point.\n", "\n", "the mentorship module was rolled out gradually: 10% of new users initially, then 25%, 50%, 75%, then 100%. the boundary dates of each step come from the wikipedia mediawiki-config commit history and are listed in the next cell. the relevant identifying window is **2019-09-20 to 2025-02-16**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup\n", "\n", "This notebook performs a data-quality audit of the mentorship-assignment data used in the 2SLS analysis. The audit answers a single question: for every user in Martin's mentorship-state table who does not have a corresponding row in the server-side mentor-assignment snapshot, what is the reason that row is absent?\n", "\n", "The next cell imports libraries, defines absolute paths to the three input files, and declares the rollout phase table. The inputs are:\n", "\n", "- `DATASET` (`inputs/z_mentorship_state.tsv`) \u2014 Martin's per-user file with two columns: `userId` and `mentorshipState`.\n", "- `SNAPSHOT` (`inputs/cov_mentor_mentee_assignment_*.sql.gz`) \u2014 a MariaDB dump of the GrowthExperiments `cov_mentor_mentee` table. Each row records that a particular mentee was assigned a particular mentor server-side.\n", "- `REG_FILE` (`build/registrations.jsonl`) \u2014 local en.wiki registration metadata parsed from the public dump: registration timestamp (`reg_ts`) and whether the account was self-created (`is_self`).\n", "\n", "The `ROLLOUT` table records the production rollout phases of the mentorship feature. Phases are defined by gerrit commit dates and are used in later cells to assign each user a phase based on their registration date.\n" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "execution": { "iopub.execute_input": "2026-06-08T20:07:51.396055Z", "iopub.status.busy": "2026-06-08T20:07:51.395777Z", "iopub.status.idle": "2026-06-08T20:08:00.914510Z", "shell.execute_reply": "2026-06-08T20:08:00.914086Z" } }, "outputs": [], "source": [ "import os, re, gzip, json, pickle\n", "from pathlib import Path\n", "import pandas as pd\n", "import numpy as np\n", "\n", "# ---- paths ----\n", "ROOT = Path(\"/home/yubozhou/2026_summer/wikipedia_2sls/2sls_pipeline\")\n", "DATASET = ROOT / \"inputs/z_mentorship_state.tsv\" # Martin's 4.98M list (userId, mentorshipState)\n", "SNAPSHOT = ROOT / \"inputs/cov_mentor_mentee_assignment_20260530.sql.gz\" # mentor-mentee snapshot dump\n", "REG_FILE = ROOT / \"build/registrations.jsonl\" # 11.87M registration timestamps\n", "CLAIMLOG = ROOT / \"inputs/excl_mentor_claim_log_raw.jsonl\" # 1.59M claim/set mentor events\n", "\n", "# ---- cache dir ----\n", "CACHE = ROOT / \"analysis/diagnose_missing_mentors/cache\"\n", "CACHE.mkdir(parents=True, exist_ok=True)\n", "\n", "# ---- rollout phases (a user's reg date decides their phase) ----\n", "# Dates = gerrit committer dates = production effective dates.\n", "# Early phases are NESTED inside the Newcomer Homepage rollout (homepage < 100%),\n", "# so they are NOT clean treatment periods. The per-user mentorship rollout only\n", "# becomes identifying once Homepage = 100% on 2022-03-07.\n", "# Columns: (label, start, end, mentorship_pct, homepage_pct, identifying)\n", "ROLLOUT = [\n", " (\"pre_anything\", \"2021-01-01\", \"2021-06-07\", None, 0.00, False),\n", " (\"homepage_2pct\", \"2021-06-08\", \"2021-09-19\", None, 0.02, False),\n", " (\"homepage_25pct_mentor_20pct\", \"2021-09-20\", \"2022-03-06\", 0.20, 0.25, False),\n", " (\"p10\", \"2022-03-07\", \"2023-07-10\", 0.10, 1.00, True),\n", " (\"p25\", \"2023-07-11\", \"2023-10-04\", 0.25, 1.00, True),\n", " (\"p50\", \"2023-10-05\", \"2025-02-02\", 0.50, 1.00, True),\n", " (\"p75\", \"2025-02-03\", \"2025-02-16\", 0.75, 1.00, True),\n", " (\"p100\", \"2025-02-17\", \"2026-6-8\", 1.00, 1.00, False), # no control arm\n", "]\n", "\n", "def helper_cache(name):\n", " return CACHE / name" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 1 \u2014 Load the mentorship-state table and compute the `no_row` count per state\n", "\n", "This cell reads `z_mentorship_state.tsv` into a DataFrame called `ds`, loads the mentor-assignment snapshot from a cached pickle (or rebuilds it from the SQL dump on first run), and computes \u2014 for each value of `mentorshipState` \u2014 how many users do and do not have at least one row in the snapshot.\n", "\n", "Three values of `mentorshipState` appear in this file:\n", "\n", "- `0` \u2014 the user was placed in the disabled arm of the mentorship A/B test (UI not shown).\n", "- `unset` \u2014 no value was written to `user_properties` for this preference. Per Martin's release script (`notebooks/generate_dataset_for_release.ipynb`, function `convert_up_property`), `unset` is mapped to the enabled bucket. The reason `unset` dominates the early period is that the A/B-assignment code only runs when the user is also shown the Newcomer Homepage; users not shown the homepage have no value written and remain `unset`.\n", "- `50` \u2014 present for only a handful of users. The precise meaning of `50` is not documented in this repository. Martin's release script maps it to the same enabled bucket as `1` and `NaN`. This notebook reports counts for `50` separately throughout, in case its semantics turn out to differ.\n", "\n", "The printed totals are:\n", "\n", "- Dataset size: **4,981,433** users.\n", "- Per-state counts: `0` 2,457,315; `unset` 2,524,086; `50` 32.\n", "- The snapshot covers **5,758,864** mentees with at least one assignment row.\n", "- Crosstab `mentorshipState \u00d7 has_snapshot_row` gives the `no_row` count per state: state `0` \u2192 11,600 (0.47%); state `50` \u2192 4 (12.50%); state `unset` \u2192 540,773 (21.42%). The total `no_row` count across all states is **552,377**. All subsequent cells refer to these 552,377 users as the `no_row` population.\n" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4981433 users in dataset\n", "mentorshipState\n", "unset 2524086\n", "0 2457315\n", "50 32\n", "Name: count, dtype: Int64 \n", "\n", "5758864 mentees have at least one snapshot row\n", "\n", " n in_snap no_row no_row_pct\n", "mentorshipState \n", "0 2457315 2445715 11600 0.4721\n", "50 32 28 4 12.5000\n", "unset 2524086 1983313 540773 21.4245\n" ] } ], "source": [ "\n", "# load dataset\n", "ds = pd.read_csv(DATASET, sep=\"\\t\", dtype={\"userId\": \"int64\", \"mentorshipState\": \"string\"})\n", "print(len(ds), \"users in dataset\")\n", "print(ds[\"mentorshipState\"].value_counts(dropna=False), \"\\n\")\n", "\n", "# parse snapshot (cached): mentee_id -> set of roles\n", "snap_pkl = helper_cache(\"snap.pkl\")\n", "if snap_pkl.exists():\n", " snap = pickle.load(open(snap_pkl, \"rb\"))\n", "else:\n", " pat = re.compile(rb\"\\((\\d+),'([^']+)',(\\d+),(\\d+)\\)\")\n", " snap = {}\n", " with gzip.open(SNAPSHOT, \"rb\") as f:\n", " for line in f:\n", " if not line.startswith(b\"INSERT\"):\n", " continue\n", " for m in pat.finditer(line):\n", " snap.setdefault(int(m.group(1)), set()).add(m.group(2).decode())\n", " pickle.dump(snap, open(snap_pkl, \"wb\"))\n", "print(len(snap), \"mentees have at least one snapshot row\\n\")\n", "\n", "# mismatch: per mentorshipState, how many users have NO row in snapshot\n", "ds[\"has_snapshot_row\"] = ds[\"userId\"].map(lambda u: u in snap)\n", "g = ds.groupby(\"mentorshipState\")[\"has_snapshot_row\"].agg(n=\"size\", in_snap=\"sum\")\n", "g[\"no_row\"] = g[\"n\"] - g[\"in_snap\"]\n", "g[\"no_row_pct\"] = (g[\"no_row\"] / g[\"n\"] * 100).round(4)\n", "print(g[[\"n\", \"in_snap\", \"no_row\", \"no_row_pct\"]])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 2 \u2014 When does each `mentorshipState` value appear in time, and where is `no_row` concentrated?\n", "\n", "Before assigning causal reasons to the 552,377 `no_row` users, this cell describes the temporal distribution of `mentorshipState` values and of `no_row` users. It loads `build/registrations.jsonl` (cached), attaches each user's local en.wiki registration timestamp (`reg_ts`) and registration month (`reg_month`) to `ds`, and prints three monthly tables:\n", "\n", "1. **Counts per month**, broken down by `mentorshipState`. This shows when each state value first appears.\n", "2. **`no_row` count per month**, broken down by `mentorshipState`. This shows the absolute volume of missing-row users month by month.\n", "3. **`no_row` count per month as a percentage of that month's total registrants**. This shows the rate at which `no_row` occurs over time.\n", "\n", "Two facts read from the output are used later:\n", "\n", "- State `0` does not appear until **2021-09** (first non-zero count 7,521). State `50` first appears in 2021-04 with a single row. Before 2021-09 every registrant in `ds` is `unset`. This is consistent with state `0` only being written after the mentorship A/B was activated.\n", "- The monthly `no_row` rate is highest in the pre-rollout months and decays after 2021-06. Months from 2025-03 onward have very small total registrant counts because the dataset's right edge is the date Martin produced the file.\n", "\n", "The remainder of the notebook decomposes the 552,377 `no_row` users into mutually exclusive reasons.\n" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== counts per month ===\n", "mentorshipState 0 50 unset total\n", "reg_month \n", "2021-01 0 0 144367 144367\n", "2021-02 0 0 123955 123955\n", "2021-03 0 0 128316 128316\n", "2021-04 0 1 113255 113256\n", "2021-05 0 0 114201 114201\n", "2021-06 0 0 105091 105091\n", "2021-07 0 0 96899 96899\n", "2021-08 0 0 98437 98437\n", "2021-09 7521 0 98131 105652\n", "2021-10 20744 0 85426 106170\n", "2021-11 19849 0 80337 100186\n", "2021-12 20404 0 81906 102310\n", "2022-01 21752 0 90340 112092\n", "2022-02 20343 0 82828 103171\n", "2022-03 77733 0 27184 104917\n", "2022-04 82665 0 11043 93708\n", "2022-05 83378 0 11146 94524\n", "2022-06 99563 0 12471 112034\n", "2022-07 75959 1 9345 85305\n", "2022-08 75999 0 11077 87076\n", "2022-09 83747 0 12978 96725\n", "2022-10 89413 0 11971 101384\n", "2022-11 87836 0 11506 99342\n", "2022-12 85440 0 10957 96397\n", "2023-01 108096 3 17324 125423\n", "2023-02 90925 0 13150 104075\n", "2023-03 99392 1 12059 111452\n", "2023-04 93025 0 10949 103974\n", "2023-05 87331 0 10320 97651\n", "2023-06 79192 0 9053 88245\n", "2023-07 70964 1 18019 88984\n", "2023-08 68605 0 24410 93015\n", "2023-09 71452 0 26195 97647\n", "2023-10 51557 1 45472 97030\n", "2023-11 50337 1 50845 101183\n", "2023-12 43299 2 43362 86663\n", "2024-01 48400 2 51687 100089\n", "2024-02 43336 2 44829 88167\n", "2024-03 44125 1 45206 89332\n", "2024-04 43522 0 44507 88029\n", "2024-05 43515 0 44782 88297\n", "2024-06 39784 2 39745 79531\n", "2024-07 42842 2 42976 85820\n", "2024-08 46381 2 48200 94583\n", "2024-09 44081 2 46140 90223\n", "2024-10 44586 2 45672 90260\n", "2024-11 43692 1 44057 87750\n", "2024-12 44204 1 44113 88318\n", "2025-01 47178 1 49680 96859\n", "2025-02 14226 1 71066 85293\n", "2025-03 54 0 57 111\n", "2025-04 15 0 9 24\n", "2025-05 28 0 25 53\n", "2025-06 22 0 20 42\n", "2025-07 20 0 20 40\n", "2025-08 21 0 19 40\n", "2025-09 20 0 26 46\n", "2025-10 23 0 16 39\n", "2025-11 17 0 20 37\n", "2025-12 43 0 43 86\n", "2026-01 14 0 18 32\n", "2026-02 12 2 19 33\n", "2026-03 13 0 25 38\n", "2026-04 13 0 13 26\n", "\n", "=== no_row count per month ===\n", "mentorshipState 0 50 unset\n", "reg_month \n", "2021-01 0 0 144279\n", "2021-02 0 0 123853\n", "2021-03 0 0 128193\n", "2021-04 0 0 113150\n", "2021-05 0 0 14848\n", "2021-06 0 0 110\n", "2021-07 0 0 102\n", "2021-08 0 0 103\n", "2021-09 18 0 95\n", "2021-10 64 0 154\n", "2021-11 58 0 201\n", "2021-12 58 0 197\n", "2022-01 61 0 221\n", "2022-02 60 0 165\n", "2022-03 221 0 72\n", "2022-04 208 0 32\n", "2022-05 232 0 34\n", "2022-06 333 0 61\n", "2022-07 311 1 37\n", "2022-08 325 0 46\n", "2022-09 312 0 47\n", "2022-10 262 0 42\n", "2022-11 280 0 45\n", "2022-12 332 0 42\n", "2023-01 442 0 65\n", "2023-02 304 0 47\n", "2023-03 321 0 45\n", "2023-04 339 0 48\n", "2023-05 360 0 50\n", "2023-06 305 0 46\n", "2023-07 299 0 85\n", "2023-08 279 0 93\n", "2023-09 286 0 101\n", "2023-10 264 0 226\n", "2023-11 231 0 228\n", "2023-12 227 1 254\n", "2024-01 274 0 277\n", "2024-02 248 0 294\n", "2024-03 244 0 256\n", "2024-04 250 0 230\n", "2024-05 310 0 300\n", "2024-06 282 0 282\n", "2024-07 408 0 407\n", "2024-08 324 0 360\n", "2024-09 341 1 341\n", "2024-10 380 0 375\n", "2024-11 390 0 419\n", "2024-12 420 0 409\n", "2025-01 649 1 630\n", "2025-02 247 0 2317\n", "2025-03 5 0 6\n", "2025-04 3 0 4\n", "2025-05 5 0 3\n", "2025-06 0 0 1\n", "2025-07 0 0 5\n", "2025-08 0 0 2\n", "2025-09 0 0 2\n", "2025-10 0 0 2\n", "2025-11 1 0 3\n", "2025-12 0 0 1\n", "2026-01 1 0 1\n", "2026-02 0 0 2\n", "2026-03 0 0 2\n", "2026-04 0 0 0\n", "\n", "=== no_row count as pct of monthly total ===\n", "mentorshipState 0 50 unset\n", "reg_month \n", "2021-01 0.0000 0.0000 99.9390\n", "2021-02 0.0000 0.0000 99.9177\n", "2021-03 0.0000 0.0000 99.9041\n", "2021-04 0.0000 0.0000 99.9064\n", "2021-05 0.0000 0.0000 13.0016\n", "2021-06 0.0000 0.0000 0.1047\n", "2021-07 0.0000 0.0000 0.1053\n", "2021-08 0.0000 0.0000 0.1046\n", "2021-09 0.0170 0.0000 0.0899\n", "2021-10 0.0603 0.0000 0.1451\n", "2021-11 0.0579 0.0000 0.2006\n", "2021-12 0.0567 0.0000 0.1926\n", "2022-01 0.0544 0.0000 0.1972\n", "2022-02 0.0582 0.0000 0.1599\n", "2022-03 0.2106 0.0000 0.0686\n", "2022-04 0.2220 0.0000 0.0341\n", "2022-05 0.2454 0.0000 0.0360\n", "2022-06 0.2972 0.0000 0.0544\n", "2022-07 0.3646 0.0012 0.0434\n", "2022-08 0.3732 0.0000 0.0528\n", "2022-09 0.3226 0.0000 0.0486\n", "2022-10 0.2584 0.0000 0.0414\n", "2022-11 0.2819 0.0000 0.0453\n", "2022-12 0.3444 0.0000 0.0436\n", "2023-01 0.3524 0.0000 0.0518\n", "2023-02 0.2921 0.0000 0.0452\n", "2023-03 0.2880 0.0000 0.0404\n", "2023-04 0.3260 0.0000 0.0462\n", "2023-05 0.3687 0.0000 0.0512\n", "2023-06 0.3456 0.0000 0.0521\n", "2023-07 0.3360 0.0000 0.0955\n", "2023-08 0.3000 0.0000 0.1000\n", "2023-09 0.2929 0.0000 0.1034\n", "2023-10 0.2721 0.0000 0.2329\n", "2023-11 0.2283 0.0000 0.2253\n", "2023-12 0.2619 0.0012 0.2931\n", "2024-01 0.2738 0.0000 0.2768\n", "2024-02 0.2813 0.0000 0.3335\n", "2024-03 0.2731 0.0000 0.2866\n", "2024-04 0.2840 0.0000 0.2613\n", "2024-05 0.3511 0.0000 0.3398\n", "2024-06 0.3546 0.0000 0.3546\n", "2024-07 0.4754 0.0000 0.4742\n", "2024-08 0.3426 0.0000 0.3806\n", "2024-09 0.3780 0.0011 0.3780\n", "2024-10 0.4210 0.0000 0.4155\n", "2024-11 0.4444 0.0000 0.4775\n", "2024-12 0.4756 0.0000 0.4631\n", "2025-01 0.6700 0.0010 0.6504\n", "2025-02 0.2896 0.0000 2.7165\n", "2025-03 4.5045 0.0000 5.4054\n", "2025-04 12.5000 0.0000 16.6667\n", "2025-05 9.4340 0.0000 5.6604\n", "2025-06 0.0000 0.0000 2.3810\n", "2025-07 0.0000 0.0000 12.5000\n", "2025-08 0.0000 0.0000 5.0000\n", "2025-09 0.0000 0.0000 4.3478\n", "2025-10 0.0000 0.0000 5.1282\n", "2025-11 2.7027 0.0000 8.1081\n", "2025-12 0.0000 0.0000 1.1628\n", "2026-01 3.1250 0.0000 3.1250\n", "2026-02 0.0000 0.0000 6.0606\n", "2026-03 0.0000 0.0000 5.2632\n", "2026-04 0.0000 0.0000 0.0000\n" ] } ], "source": [ "# snapshot (cached)\n", "snap_pkl = helper_cache(\"snap.pkl\")\n", "if snap_pkl.exists():\n", " snap = pickle.load(open(snap_pkl, \"rb\"))\n", "else:\n", " pat = re.compile(rb\"\\((\\d+),'([^']+)',(\\d+),(\\d+)\\)\")\n", " snap = {}\n", " with gzip.open(SNAPSHOT, \"rb\") as f:\n", " for line in f:\n", " if not line.startswith(b\"INSERT\"):\n", " continue\n", " for m in pat.finditer(line):\n", " snap.setdefault(int(m.group(1)), set()).add(m.group(2).decode())\n", " pickle.dump(snap, open(snap_pkl, \"wb\"))\n", "\n", "# registration timestamps (cached)\n", "reg_pkl = helper_cache(\"reg_ts.pkl\")\n", "if reg_pkl.exists():\n", " reg = pickle.load(open(reg_pkl, \"rb\"))\n", "else:\n", " reg = {}\n", " with open(REG_FILE) as f:\n", " for line in f:\n", " o = json.loads(line)\n", " reg[o[\"uid\"]] = o[\"reg_ts\"]\n", " pickle.dump(reg, open(reg_pkl, \"wb\"))\n", "\n", "# attach month + no_row flag\n", "ds[\"reg_ts\"] = pd.to_datetime(ds[\"userId\"].map(reg), format=\"mixed\", errors=\"coerce\")\n", "ds[\"reg_month\"] = ds[\"reg_ts\"].dt.to_period(\"M\").astype(\"string\")\n", "ds[\"no_row\"] = ~ds[\"userId\"].map(lambda u: u in snap)\n", "\n", "# table 1: counts of each state per month\n", "counts = ds.pivot_table(index=\"reg_month\", columns=\"mentorshipState\",\n", " aggfunc=\"size\", fill_value=0)\n", "counts[\"total\"] = counts.sum(axis=1)\n", "print(\"=== counts per month ===\")\n", "print(counts.to_string())\n", "\n", "# table 2: per month, no_row count of each state\n", "norow = (ds[ds[\"no_row\"]]\n", " .pivot_table(index=\"reg_month\", columns=\"mentorshipState\",\n", " aggfunc=\"size\", fill_value=0)\n", " .reindex(counts.index, fill_value=0))\n", "print(\"\\n=== no_row count per month ===\")\n", "print(norow.to_string())\n", "\n", "# table 3: per month, no_row count of each state / that month's total registered users (%)\n", "norow = (ds[ds[\"no_row\"]]\n", " .pivot_table(index=\"reg_month\", columns=\"mentorshipState\",\n", " aggfunc=\"size\", fill_value=0)\n", " .reindex(counts.index, fill_value=0))\n", "pct = norow.div(counts[\"total\"], axis=0).mul(100).round(4)\n", "print(\"\\n=== no_row count as pct of monthly total ===\")\n", "print(pct.to_string())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 3 \u2014 Enumerate the candidate reasons a user can be `no_row`, and resolve those answerable from existing fields\n", "\n", "The mentor-assignment snapshot writes a row only when the server-side assignment hook fires for a user. There are five candidate reasons for a user to be in `ds` but absent from the snapshot:\n", "\n", "1. **Pre-rollout** \u2014 the user registered before mentorship was active on en.wiki (effective date **2021-06-01**). The assignment hook never ran for them.\n", "2. **Auto-created** \u2014 the local en.wiki account was created by CentralAuth or by another user (not self-registration). The `onLocalUserCreated` code path is not the same as `onAccountCreated`, and auto-created accounts can miss the assignment.\n", "3. **Indefinitely blocked at registration** \u2014 when a registration is blocked, the GrowthExperiments code drops the assignment row entirely.\n", "4. **No mentor available** \u2014 the auto-assign mentor pool was empty at the moment of registration.\n", "5. **Deleted account** \u2014 the local user row was deleted after registration, so neither the snapshot nor `build/registrations.jsonl` records the user.\n", "\n", "Reasons 1 and 2 can be answered directly from fields already present in `ds` (`reg_ts`, `is_self`). Reasons 3 and 4 require an external API call to determine block status (cell 7). Reason 5 is detectable as `reg_ts` being missing.\n", "\n", "This cell tags every `no_row` user with three boolean flags \u2014 `cause_pre_rollout` (`reg_ts < 2021-06-01`), `is_self == False` (auto-created), and `reg_ts_missing` (no local registration row) \u2014 and prints the counts for each.\n", "\n", "Output among the 552,377 `no_row` users:\n", "\n", "- Reason 1, pre-rollout: **524,323** (94.92%).\n", "- Reason 2, auto-created (`is_self == False`): **0** (0.00%).\n", "- Aside, `reg_ts` missing (preliminarily labelled \"deleted\"): **6,451** (1.17%).\n", "- Remainder after excluding reasons 1 and 2: **28,054** (5.08%).\n", "\n", "The label \"deleted\" attached to the 6,451 is preliminary; cell 13 re-checks it against CentralAuth and finds it misleading. The 28,054 remainder is the group that needs block-status information to be classified between reasons 3 and 4.\n" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "total no_row users: 552,377\n", "\n", "reason 1 pre-rollout (reg_ts < 2021-06-01): 524,323 (94.92%)\n", "reason 2 autocreated (is_self == False) : 0 (0.00%)\n", "(aside) reg_ts unknown (deleted account) : 6,451 (1.17%)\n", "\n", "overlap (a user may match both):\n", "autocreated False\n", "pre_rollout \n", "False 28054\n", "True 524323\n", "\n", "remaining no_row after excluding reasons 1 & 2: 28,054(5.08%)\n", "this remainder needs block data (reason 3) and elimination (reason 4).\n" ] } ], "source": [ "# =============================================================================\n", "# WHY A USER CAN BE \"no_row\" (in Martin's list but has NO mentor row in snapshot)\n", "#\n", "# Scope: this runs on ALL no_row users across every mentorshipState\n", "# (0 / 50 / unset), not just state=0. `nr = ds[ds[\"no_row\"]]` has no\n", "# state filter, so the totals below are the 0 + 50 + unset combined.\n", "#\n", "# Assignment mechanism differs by state:\n", "# - unset / 0 : a mentor is assigned synchronously at registration\n", "# (MentorHooks::onLocalUserCreated). state=0 (DISABLED) only\n", "# hides the UI; it does NOT block the backend assignment.\n", "# - 50 : proactive-assignment flag (2024-era). Assignment is done by an\n", "# async backend job, NOT onLocalUserCreated. So a no_row state=50\n", "# user can simply mean that async job never ran / failed \u2014 a\n", "# different mechanism from the reasons below.\n", "#\n", "# A user ends up with no mentor row for one of FIVE reasons. These are NOT\n", "# mutually exclusive (e.g. a user can be both pre-rollout and autocreated); the\n", "# final per-user classification in the later cell resolves overlaps by priority.\n", "#\n", "# 1. pre-rollout : registered before en.wiki turned mentorship on (~2021-06).\n", "# The feature wasn't live yet, so nobody was assigned.\n", "# -> detectable from reg_ts. [we HAVE this]\n", "# 2. autocreated : the en.wiki local account was auto-created (CentralAuth) or\n", "# created by someone else, not self-registered. onLocalUserCreated\n", "# returns early for these.\n", "# -> detectable from is_self == False. [we HAVE this]\n", "# 3. blocked : user was indefinitely blocked, which DROPS the mentor row.\n", "# -> from block_status.jsonl (fetched in a later cell).\n", "# [we NOW HAVE this]\n", "# 4. no mentor available at registration : the auto-assign mentor pool was empty\n", "# / everyone excluded at that moment. (There may be other\n", "# causes I cannot enumerate.)\n", "# -> no direct evidence; only by elimination. [residual]\n", "# 5. deleted : the account was deleted, so its registration record is gone\n", "# and reg_ts is missing.\n", "# -> detectable from reg_ts being NaN. [we HAVE this]\n", "#\n", "# This cell quantifies reasons 1, 2 and 5 among the no_row users (the ones we can\n", "# cleanly identify here), and reports how many remain for reasons 3 and 4 (which\n", "# the block-fetch cell resolves later).\n", "# =============================================================================\n", "\n", "# ---- load dataset ----\n", "if \"ds\" not in globals():\n", " ds = pd.read_csv(DATASET, sep=\"\\t\", dtype={\"userId\": \"int64\", \"mentorshipState\": \"string\"})\n", "\n", "# ---- snapshot (cached): used to flag no_row ----\n", "snap_pkl = helper_cache(\"snap.pkl\")\n", "if snap_pkl.exists():\n", " snap = pickle.load(open(snap_pkl, \"rb\"))\n", "else:\n", " pat = re.compile(rb\"\\((\\d+),'([^']+)',(\\d+),(\\d+)\\)\")\n", " snap = {}\n", " with gzip.open(SNAPSHOT, \"rb\") as f:\n", " for line in f:\n", " if not line.startswith(b\"INSERT\"):\n", " continue\n", " for m in pat.finditer(line):\n", " snap.setdefault(int(m.group(1)), set()).add(m.group(2).decode())\n", " pickle.dump(snap, open(snap_pkl, \"wb\"))\n", "\n", "# ---- registration info (cached): reg_ts + is_self in one pass ----\n", "reginfo_pkl = helper_cache(\"reg_info.pkl\")\n", "if reginfo_pkl.exists():\n", " reg_ts_map, is_self_map = pickle.load(open(reginfo_pkl, \"rb\"))\n", "else:\n", " reg_ts_map, is_self_map = {}, {}\n", " with open(REG_FILE) as f:\n", " for line in f:\n", " o = json.loads(line)\n", " reg_ts_map[o[\"uid\"]] = o[\"reg_ts\"]\n", " is_self_map[o[\"uid\"]] = bool(o.get(\"is_self\"))\n", " pickle.dump((reg_ts_map, is_self_map), open(reginfo_pkl, \"wb\"))\n", "\n", "# ---- tag every user with no_row / reg_ts / is_self ----\n", "ds[\"no_row\"] = ~ds[\"userId\"].map(lambda u: u in snap)\n", "ds[\"reg_ts\"] = pd.to_datetime(ds[\"userId\"].map(reg_ts_map), format=\"mixed\", errors=\"coerce\")\n", "ds[\"is_self\"] = ds[\"userId\"].map(is_self_map) # True=self-registered, False=autocreated/created-by-other, NaN=unknown (deleted account)\n", "\n", "# ---- restrict to no_row users ----\n", "ROLLOUT_LIVE = pd.Timestamp(\"2021-06-01\") # en.wiki mentorship becomes effective ~here\n", "nr = ds[ds[\"no_row\"]].copy()\n", "\n", "nr[\"cause_pre_rollout\"] = nr[\"reg_ts\"] < ROLLOUT_LIVE # reason 1\n", "nr[\"cause_autocreated\"] = nr[\"is_self\"] == False # reason 2\n", "nr[\"reg_ts_missing\"] = nr[\"reg_ts\"].isna() # deleted accounts (no reg_ts)\n", "\n", "total = len(nr)\n", "print(f\"total no_row users: {total:,}\\n\")\n", "\n", "n1 = nr['cause_pre_rollout'].sum()\n", "n2 = nr['cause_autocreated'].sum()\n", "n3 = nr['reg_ts_missing'].sum()\n", "print(f\"reason 1 pre-rollout (reg_ts < {ROLLOUT_LIVE.date()}): {n1:,} ({n1/total*100:.2f}%)\")\n", "print(f\"reason 2 autocreated (is_self == False) : {n2:,} ({n2/total*100:.2f}%)\")\n", "print(f\"(aside) reg_ts unknown (deleted account) : {n3:,} ({n3/total*100:.2f}%)\")\n", "\n", "print(\"\\noverlap (a user may match both):\")\n", "print(pd.crosstab(nr[\"cause_pre_rollout\"], nr[\"cause_autocreated\"],\n", " rownames=[\"pre_rollout\"], colnames=[\"autocreated\"]))\n", "\n", "rest = nr[~nr[\"cause_pre_rollout\"] & ~nr[\"cause_autocreated\"]]\n", "print(f\"\\nremaining no_row after excluding reasons 1 & 2: {len(rest):,}({len(rest)/total*100:.2f}%)\")\n", "print(\"this remainder needs block data (reason 3) and elimination (reason 4).\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 3b \u2014 Export the post-rollout self-registered remainder for the block-status API query\n", "\n", "The previous cell left 28,054 `no_row` users unexplained after removing pre-rollout and auto-created. Of those, 6,451 have no `reg_ts` (preliminary \"deleted\"). The remaining **21,603** users are post-rollout, self-registered, and have a known `reg_ts`. These are the users for whom the block-status check is meaningful.\n", "\n", "This cell collects their userIds, resolves each to a username from `build/registrations.jsonl` (the MediaWiki blocks API takes usernames, not userIds), and writes the (uid, name) pairs to `analysis/diagnose_missing_mentors/remainder_to_block.tsv`. The next cell consumes that file.\n", "\n", "Printed output confirms: remainder **21,603**; names resolved **21,603**; output file written.\n" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "remainder: 21603\n", "names resolved: 21603\n", "written: /home/yubozhou/2026_summer/wikipedia_2sls/2sls_pipeline/analysis/diagnose_missing_mentors/remainder_to_block.tsv\n" ] } ], "source": [ "# export the remainder (post-rollout, self-registered, no_row) with usernames\n", "need = set(ds.loc[ds[\"no_row\"] & (ds[\"reg_ts\"] >= ROLLOUT_LIVE) & (ds[\"is_self\"] != False),\n", " \"userId\"].astype(int))\n", "print(\"remainder:\", len(need))\n", "\n", "uid2name = {}\n", "with open(REG_FILE) as f:\n", " for line in f:\n", " o = json.loads(line)\n", " if o[\"uid\"] in need:\n", " uid2name[o[\"uid\"]] = o[\"name\"]\n", "print(\"names resolved:\", len(uid2name))\n", "\n", "out = ROOT / \"analysis/diagnose_missing_mentors/remainder_to_block.tsv\"\n", "with open(out, \"w\") as fo:\n", " for u, n in uid2name.items():\n", " fo.write(f\"{u}\\t{n}\\n\")\n", "print(\"written:\", out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Of the 552,377 no_row users (all states: 0 + 50 + unset), this cell has so far identified:\n", "- pre-rollout: 524,323\n", "- deleted account (reg_ts missing): 6,451\n", "\n", "The remaining **21,603** (post-rollout, self-registered) still need block lookup \u2014 exported next and resolved into reason 3 (indefinitely blocked) vs reason 4 (residual)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 4 \u2014 Fetch block status from the en.wiki API and split the remainder into reason 3 vs reason 4\n", "\n", "This cell queries the public en.wiki MediaWiki API (`action=query&list=blocks`) for each of the 21,603 users exported above, asking whether the username is currently indefinitely blocked. The results are written one record per line to `analysis/diagnose_missing_mentors/block_status.jsonl`. The fetch is resume-safe: usernames already present in the output file are skipped.\n", "\n", "A user is classified as **reason 3 (indefinitely blocked)** if the API returns a block record whose `expiry == \"infinite\"`. The other users in the 21,603 are classified as **reason 4 (no mentor available, or unknown residual)** by elimination \u2014 they are post-rollout, self-registered, not deleted, and not currently indefinitely blocked, so the assignment hook should have fired. The most likely explanation is that the mentor pool was empty at their registration moment; other unknown failure modes remain possible.\n", "\n", "Printed counts of the 21,603 remainder:\n", "\n", "- Reason 3, indefinitely blocked: **20,974** (97.09%).\n", "- Reason 4, no mentor available or unknown residual: **629** (2.91%).\n", "\n", "Combined with reasons 1, 2 and the preliminary 6,451 \"deleted\" count, the five reasons sum to 524,323 + 0 + 20,974 + 629 + 6,451 = 552,377, which matches the `no_row` total exactly.\n" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "to fetch: 0 (already done 21,603)\n", "fetch done.\n", "remainder (reasons 3 & 4): 21,603\n", "reason 3 indefinitely blocked (row dropped): 20,974 (97.09%)\n", "reason 4 no mentor avail / unknown residual: 629(2.91%)\n" ] } ], "source": [ "import time\n", "from urllib.parse import urlencode\n", "from urllib.request import Request, urlopen\n", "from urllib.error import HTTPError, URLError\n", "\n", "API = \"https://en.wikipedia.org/w/api.php\"\n", "UA = \"WikiMentorResearch/1.0 (academic; contact: yubozhou@umich.edu)\"\n", "INP = ROOT / \"analysis/diagnose_missing_mentors/remainder_to_block.tsv\"\n", "OUT = ROOT / \"analysis/diagnose_missing_mentors/block_status.jsonl\"\n", "\n", "def api_get(params):\n", " url = API + \"?\" + urlencode(dict(params, format=\"json\"))\n", " for attempt in range(6):\n", " try:\n", " req = Request(url, headers={\"User-Agent\": UA})\n", " with urlopen(req, timeout=60) as r:\n", " return json.loads(r.read().decode())\n", " except (HTTPError, URLError, TimeoutError) as e:\n", " time.sleep(0.4 * (2 ** attempt))\n", " raise RuntimeError(\"API failed: \" + url)\n", "\n", "# load the list of (uid, name)\n", "todo = []\n", "with open(INP) as f:\n", " for line in f:\n", " uid, name = line.rstrip(\"\\n\").split(\"\\t\", 1)\n", " todo.append((int(uid), name))\n", "\n", "# resume: skip uids already fetched\n", "done = set()\n", "if OUT.exists():\n", " with open(OUT) as f:\n", " for line in f:\n", " try: done.add(json.loads(line)[\"uid\"])\n", " except Exception: pass\n", "todo = [(u, n) for u, n in todo if u not in done]\n", "print(f\"to fetch: {len(todo):,} (already done {len(done):,})\")\n", "\n", "# fetch in batches of 50\n", "name2uid = {n: u for u, n in todo}\n", "with open(OUT, \"a\") as fout:\n", " for i in range(0, len(todo), 50):\n", " names = [n for _, n in todo[i:i+50]]\n", " data = api_get({\"action\": \"query\", \"list\": \"users\",\n", " \"ususers\": \"|\".join(names), \"usprop\": \"blockinfo\"})\n", " seen = set()\n", " for u in data.get(\"query\", {}).get(\"users\", []):\n", " name = u.get(\"name\"); uid = name2uid.get(name)\n", " if uid is None: continue\n", " blocked = \"blockid\" in u\n", " expiry = u.get(\"blockexpiry\")\n", " indef = blocked and expiry in (\"infinity\",\"infinite\",\"indefinite\",\"never\")\n", " fout.write(json.dumps({\"uid\": uid, \"name\": name, \"blocked\": blocked,\n", " \"indefinite\": bool(indef), \"expiry\": expiry,\n", " \"reason\": u.get(\"blockreason\")}) + \"\\n\")\n", " seen.add(name)\n", " for name in names:\n", " if name not in seen:\n", " fout.write(json.dumps({\"uid\": name2uid[name], \"name\": name, \"blocked\": False,\n", " \"indefinite\": False, \"expiry\": None,\n", " \"reason\": \"api_no_return\"}) + \"\\n\")\n", " fout.flush()\n", " if (i // 50) % 20 == 0: print(f\" {i+len(names):,}/{len(todo):,}\")\n", " time.sleep(0.4)\n", "print(\"fetch done.\")\n", "\n", "# ---- results: reason 3 vs reason 4 ----\n", "blk = pd.read_json(OUT, lines=True)\n", "indef_uids = set(blk.loc[blk[\"indefinite\"], \"uid\"])\n", "\n", "rest = ds[ds[\"no_row\"] & (ds[\"reg_ts\"] >= ROLLOUT_LIVE) & (ds[\"is_self\"] != False)].copy()\n", "rest[\"cause_blocked\"] = rest[\"userId\"].isin(indef_uids)\n", "n_rest = len(rest)\n", "n_blk = int(rest[\"cause_blocked\"].sum())\n", "print(f\"remainder (reasons 3 & 4): {n_rest:,}\")\n", "print(f\"reason 3 indefinitely blocked (row dropped): {n_blk:,} ({n_blk/n_rest*100:.2f}%)\")\n", "print(f\"reason 4 no mentor avail / unknown residual: {n_rest-n_blk:,}({(n_rest-n_blk)/n_rest*100:.2f}%)\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Why no_row \u2014 final breakdown (ALL states: 0 + 50 + unset)\n", "\n", "This covers every no_row user, not just state=0. Of the 552,377 total:\n", "\n", "- reason 1 pre-rollout (registered before ~2021-06): **524,323**\n", "- reason 2 autocreated (is_self == False): **0**\n", "- reason 3 indefinitely blocked (mentor row dropped): **20,974**\n", "- reason 4 no mentor available / unknown residual: **629**\n", "- reason 5 account deleted (reg_ts missing): **6,451**\n", "\n", "Sum = 552,377 \u2713. The per-state split (how each reason distributes over 0 / 50 / unset) is computed in the reason\u00d7state cell below." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 5 \u2014 Did any `no_row` users actually post a mentor question?\n", "\n", "The cells above classify every `no_row` user by reason without distinguishing between users who would have used the mentorship feature and users who would not. This cell narrows the focus: among the 552,377 `no_row` users, how many actually posted a question through the GrowthExperiments mentor-questions interface? Question-askers who did not have a mentor row are the cohort whose treatment status is most likely to be misclassified in the 2SLS analysis.\n", "\n", "This cell:\n", "\n", "- Loads the `growthexperiments-mentor-questions` event table (one row per question event).\n", "- Resolves the asker's username to a `userId` via `build/registrations.jsonl`.\n", "- Intersects the askers with the `no_row` users in `ds`.\n", "- Saves the intersection to `analysis/diagnose_missing_mentors/asked_but_no_row.tsv`.\n", "\n", "Printed counts:\n", "\n", "- Unique mentees who asked at least one question: **36,430**.\n", "- Resolved to userId: **35,102** of 36,430.\n", "- Askers who appear in `ds`: **18,593**.\n", "- Askers in `ds` who are `no_row`: **385**. Of these, 380 are `unset`, 4 are `50`, and 1 is `0`.\n", "\n", "The 385 question-asking `no_row` users are the population analyzed in the next two cells.\n" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "unique mentees who asked a question: 36,430\n", "resolved to userId: 35,102 / 36,430\n", "\n", "askers present in dataset: 18,593\n", "\n", ">>> asked a question BUT currently no mentor row (no_row): 385\n", "mentorshipState\n", "0 1\n", "50 4\n", "unset 380\n", "\n", "saved -> analysis/diagnose_missing_mentors/asked_but_no_row.tsv\n" ] } ], "source": [ "# See if any of those who didn't have a mentor row (no_row) had actually ASKED A QUESTION (and thus were more likely to be impacted by missing mentorship, if they were in the treatment group).\n", "\n", "# ---- 1. all mentee usernames who asked a question ----\n", "QFILE = ROOT / \"inputs/d_mentor_questions.jsonl\"\n", "askers = set()\n", "with open(QFILE) as f:\n", " for line in f:\n", " o = json.loads(line)\n", " m = o.get(\"mentee\")\n", " if m:\n", " askers.add(m)\n", "print(f\"unique mentees who asked a question: {len(askers):,}\")\n", "\n", "# ---- 2. map those usernames -> userId (stream registrations.jsonl) ----\n", "name2uid = {}\n", "with open(REG_FILE) as f:\n", " for line in f:\n", " o = json.loads(line)\n", " if o[\"name\"] in askers:\n", " name2uid[o[\"name\"]] = o[\"uid\"]\n", "print(f\"resolved to userId: {len(name2uid):,} / {len(askers):,}\")\n", "\n", "# ---- 3. look up their state + no_row status in the dataset ----\n", "uid2state = dict(zip(ds[\"userId\"].astype(int), ds[\"mentorshipState\"]))\n", "\n", "rows = []\n", "for name, uid in name2uid.items():\n", " if uid not in uid2state:\n", " continue # not in Martin's list\n", " state = uid2state[uid]\n", " no_row = uid not in snap # no mentor row in the current snapshot\n", " rows.append((uid, name, state, no_row))\n", "\n", "q = pd.DataFrame(rows, columns=[\"uid\", \"name\", \"mentorshipState\", \"no_row\"])\n", "print(f\"\\naskers present in dataset: {len(q):,}\")\n", "\n", "# ---- 4. key result: asked a question BUT currently no_row, split by state ----\n", "hit = q[q[\"no_row\"]]\n", "print(f\"\\n>>> asked a question BUT currently no mentor row (no_row): {len(hit):,}\")\n", "print(hit.groupby(\"mentorshipState\").size().to_string())\n", "\n", "# save for inspection\n", "hit.to_csv(ROOT / \"analysis/diagnose_missing_mentors/asked_but_no_row.tsv\",\n", " sep=\"\\t\", index=False)\n", "print(\"\\nsaved -> analysis/diagnose_missing_mentors/asked_but_no_row.tsv\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 6 \u2014 Classify the 385 question-asking `no_row` users by reason\n", "\n", "This cell takes the 385 question-asking `no_row` users and assigns each one a reason from the five-reason classification. It joins the askers with `reg_ts`, `is_self`, and the block-status output produced in cell 7, then applies the same rules used in cell 4 and cell 7. The output is written to `asked_but_no_row_classified.tsv`.\n", "\n", "Printed counts among the 385:\n", "\n", "- Reason 1, pre-rollout: **6**.\n", "- Reason 3, indefinitely blocked: **373**.\n", "- Reason 4, residual: **6**.\n", "\n", "Cross-tabulated by `mentorshipState`:\n", "\n", "- Reason 1 \u00d7 state: 6 in `unset`, 0 in `0` or `50`.\n", "- Reason 3 \u00d7 state: 368 in `unset`, 4 in `50`, 1 in `0`.\n", "- Reason 4 \u00d7 state: 6 in `unset`, 0 in `0` or `50`.\n", "\n", "The dominant reason among question-asking `no_row` users is indefinite block (373 of 385, 96.9%). The next cell drills into the textual block reasons for these 373 users.\n" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "asked a question but currently no_row: 385\n", "\n", "by reason:\n", "reason\n", "1_pre_rollout 6\n", "3_indef_blocked 373\n", "4_residual 6\n", "\n", "by reason x state:\n", "mentorshipState 0 50 unset\n", "reason \n", "1_pre_rollout 0 0 6\n", "3_indef_blocked 1 4 368\n", "4_residual 0 0 6\n", "\n", "saved -> asked_but_no_row_classified.tsv\n" ] } ], "source": [ "# See why are those people missing mentor rows, and how many of them are indefinitely blocked (reason 3) vs potentially having no mentor available (reason 4, by elimination).\n", "\n", "\n", "# indefinitely-blocked uids from the block fetch\n", "OUT = ROOT / \"analysis/diagnose_missing_mentors/block_status.jsonl\"\n", "blk = pd.read_json(OUT, lines=True)\n", "indef_uids = set(blk.loc[blk[\"indefinite\"], \"uid\"])\n", "\n", "# bring reg_ts / is_self onto the 385 askers-without-row\n", "h = hit.merge(ds[[\"userId\", \"reg_ts\", \"is_self\"]],\n", " left_on=\"uid\", right_on=\"userId\", how=\"left\")\n", "\n", "def classify(r):\n", " if pd.isna(r[\"reg_ts\"]): return \"5_deleted\"\n", " if r[\"is_self\"] == False: return \"2_autocreated\"\n", " if r[\"reg_ts\"] < pd.Timestamp(ROLLOUT_LIVE): return \"1_pre_rollout\"\n", " if r[\"uid\"] in indef_uids: return \"3_indef_blocked\"\n", " return \"4_residual\"\n", "\n", "h[\"reason\"] = h.apply(classify, axis=1)\n", "\n", "print(f\"asked a question but currently no_row: {len(h):,}\\n\")\n", "print(\"by reason:\")\n", "print(h.groupby(\"reason\").size().to_string())\n", "print(\"\\nby reason x state:\")\n", "print(pd.crosstab(h[\"reason\"], h[\"mentorshipState\"]))\n", "\n", "h.to_csv(ROOT / \"analysis/diagnose_missing_mentors/asked_but_no_row_classified.tsv\",\n", " sep=\"\\t\", index=False)\n", "print(\"\\nsaved -> asked_but_no_row_classified.tsv\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 7 \u2014 First look at indefinite-block reasons (restricted to the 373 question-asker subset)\n", "\n", "This cell plots the indefinite-block reasons for the 373 question-asking indefinitely-blocked users identified above, split by `mentorshipState`. The block reason text is read from `block_status.jsonl` and bucketed into categories (such as `spam/promo`, `checkuser`, `sockpuppet`, `vandalism`, `not-here`, `username`, `disruption`, `harassment`, `block-evasion`, `other`) using string matching on the reason field.\n", "\n", "The output is saved to `blocked_reason_by_state.png` and printed as a count table. The largest categories within the 373 are `spam/promo` (111 in `unset`), `checkuser` (63 in `unset`, plus 3 in `50` and 1 in `0`), and `sockpuppet` (59 in `unset`).\n", "\n", "This view covers only the 373 question-asker subset of indefinitely-blocked users, which is small. Cell 14 produces the same breakdown for the full 20,974 indefinitely-blocked `no_row` population and is the authoritative version. This cell is retained to show the block-reason composition specifically among users who actually engaged with the mentor-question interface.\n" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "indefinitely blocked: 373\n", "\n", "category x state:\n", "mentorshipState 0 50 unset\n", "cat \n", "spam/promo 0 0 111\n", "checkuser 1 3 63\n", "sockpuppet 0 0 59\n", "not-here 0 0 42\n", "other 0 0 41\n", "disruption 0 1 23\n", "vandalism 0 0 13\n", "username 0 0 9\n", "harassment 0 0 5\n", "block-evasion 0 0 2\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABEEAAAJOCAYAAABY5xk7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC7AklEQVR4nOzdeZxO9f//8edljJnBGPuMfWuyjiUkg5AtuyiFjyWUaLMmfDBkL+LTQkqZFtEiZckWUsiakqTFYApNDRlhBjOv3x9+c74uY5nhGjNcj/vtNjeuc51zrtd1znXOuc7zep/3cZmZCQAAAAAA4BaXJaMLAAAAAAAAuBEIQQAAAAAAgFcgBAEAAAAAAF6BEAQAAAAAAHgFQhAAAAAAAOAVCEEAAAAAAIBXIAQBAAAAAABegRAEAAAAAAB4BUIQAAAAAADgFQhBgFSaO3euXC6Xtm3b5rF57t+/Xy6XS3Pnzr2m6b/44gvVqFFDOXLkkMvl0qJFi5w69+/f75F6Nm7cqIiICP3zzz/XVKMkRUREyOVyXfP0F0uu84UXXrjquNezPFIj+b39/fff6TJ/6fo/J7h5jR07VhUqVFBSUpLH552W7eh6NGjQQA0aNEjX18jsrrQfvRHLZ86cOSpSpIhOnjyZrq9zNQ0aNFClSpVSNa7L5VJERES61HGjPvu3khtxrMus5s2bp+nTp2fY66fl++f17k82b96s++67T8WLF5efn5+Cg4NVu3ZtDRo0yG28V1999bq/k0yYMEGLFi26rnkA14oQBLhJmZk6duwoX19fffbZZ9q0aZPq16+vli1batOmTSpUqFCa51moUCFt2rRJLVu2dIZt3LhRY8aMua4QBEDaHTp0SFOmTNHYsWOVJQuH65vZlfajr776ql599dV0ff3u3bsrR44cmjJlSrq+DnAryugQJC2uZ3+ydOlShYeHKy4uTlOmTNHKlSs1Y8YM1alTRwsWLEjxOoQguJllzegCAFybQ4cO6ejRo7rvvvvUqFEjt+cKFChwTfP08/PTXXfd5Yny4MVOnz4tf39/j7b+udl4YhnMmDFDuXPnVvv27T1YGTKbChUqpPtrZM2aVX369NFzzz2noUOHKnv27On+mt4kMTFR586dk5+fX0aXgpuEmSk+Pl4BAQEene/17E+mTJmiUqVKacWKFcqa9f9OER966CECVNxy+GkJuA49evRQzpw59euvv6pFixbKmTOnihUrpkGDBikhIcFt3EOHDqljx44KDAxUUFCQHnzwQR05cuSS8922bZvatGmjvHnzyt/fX9WqVdMHH3zgPB8REaGiRYtKkoYOHSqXy6WSJUtKuvTlH8lNkLdu3ap69eope/bsKl26tCZNmuTWzP7iyy4iIiI0ZMgQSVKpUqXkcrnkcrm0bt06Z5oFCxaodu3aypEjh3LmzKlmzZrp22+/veJy69Wrl/LmzatTp06leO6ee+5RxYoVrzh9sqSkJI0fP17FixeXv7+/atSooS+++CJV07755puqUqWK/P39lTdvXt13333as2dPivE2b96s1q1bK1++fPL391eZMmXUv3//K877p59+UunSpVWrVi3FxMRIko4cOaI+ffqoaNGiypYtm0qVKqUxY8bo3LlzbtOm5XNyseR1v3btWvXt21f58+dXvnz51L59ex06dMht3KSkJE2ZMkXlypWTn5+fChYsqG7duun3339P1Wtd/JorV65Uz549VaBAAWXPnl0JCQmpeo1XXnlFWbJkcZaTJE2dOlUul0uPP/64W7158uRJ0ST3YpdrQl+yZEn16NHDeXzq1CkNHjxYpUqVcj4DNWrU0Pvvv+823dW2xastg7/++kuPPvqoihUrJj8/PxUoUEB16tTR6tWrr/g+zpw5ozlz5qhz584pWoGMGTNGtWrVUt68eZUrVy7dcccdmjNnjszMbbw1a9aoQYMGypcvnwICAlS8eHF16NDhkttdsrNnz6p79+7KmTOnlixZIun8l/VXX31VVatWVUBAgPLkyaP7779f+/btc5vWzDRlyhSVKFFC/v7+uuOOO/T5559f8X1e6JVXXtHdd9+tggULKkeOHAoLC9OUKVN09uzZVE2/dOlSVa1aVX5+fipVqpReeOGFFJfiXenSskt9dn755Rd17txZBQsWlJ+fn8qXL69XXnnFbZykpCSNGzdOZcuWVUBAgHLnzq3KlStrxowZkq6+H71U8/WjR4+qX79+KlKkiLJly6bSpUtrxIgRKY4rLpdLTzzxhN555x2VL19e2bNnV5UqVZx1d6EuXbooLi5O8+fPT83iTFdfffWV7rrrLgUEBKhIkSIaOXKkEhMTrzrdDz/8oLZt2ypPnjzy9/dX1apVFRkZmWK8f/75R4MGDVLp0qWdfU+LFi30008/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/d911sl/F98ho3379vL393ceBwYGqnXr1lq/fv1lm1Zv2rRJp0+fdrs0QpKKFSume+65x2ke+vPPP+u3335Tr1693F7jcsaPH68ePXpo0qRJmjFjhlvT0SVLlqhhw4YqXLiw2/tp3ry5JOnLL7+UlPrPydVcPH3lypUlyVnXyc22L14Gd955p8qXL5/qS4ou1KFDB7fHaXmNRo0aOZeHbNy4UadOndLAgQOVP39+rVq1SpK0evVq57IrT7jzzjv1+eef69lnn9W6det0+vRpt+evZVu8eBkkv87cuXM1btw4ffPNN6m+tOPQoUNyuVzKnz9/iufWrFmjxo0bKygoSD4+PvL19dWoUaMUGxvrXFZUtWpVZcuWTY8++qgiIyNTXLpyoR07duiuu+5ScHCwNmzYoBIlSjjPLVmyRC6XS//5z3/clkFISIiqVKnibOebNm1SfHy8s7yShYeHu83vSr799lu1adNG+fLlc95Xt27dlJiYqJ9//vmy0508eVJbt2697P7gWsTHx+uLL77Qfffdp+zZs6dY//Hx8frmm28knV/H3333nfr166cVK1YoLi7uml4z2Zo1a5QjRw7df//9bsOTt6WLt8+GDRsqMDDQeRwcHKyCBQtect9esGBBxcTEXLFJuZm5vd+0/KXmLkaX28clJSVp/fr1l51uzZo1atSokYoVK+Y2vEePHjp16pQ2bdokSfr88891++23q3Hjxlet5Uqf/atp06aNfH19ncdp3WfMmjVLd9xxh/z9/ZU1a1b5+vrqiy++cLss884779Q///yjTp066dNPP73knVlSu1wurPtCFx8frubibbxjx47KmjWrs8+XUnd8v5JChQqpevXqzuO8efOqYMGCqlq1qgoXLuwML1++vFvtadluk13P8kjrtnrPPfcoT548bsNSs449UWtqvi/ly5dPX331lbZu3apJkyapbdu2+vnnnzVs2DCFhYWl+s5AH374oerUqaOcOXM6n+05c+Zc8pLjS0ntdybgehCCANcpe/bsKU6S/fz8FB8f7zyOjY1VcHBwimlDQkLcHv/555+SpMGDB8vX19ftr1+/fpJ0zbeny5cvX4phfn5+KU7+Uiu51po1a6aodcGCBVets23btipZsqRzne7cuXN18uRJt34gypQp4zbfsWPHus3j4uWXPOzMmTP6999/L/m6sbGxknTJu+cULlzYeT75Gufkvleu5t1331WRIkX00EMPpXjuzz//1OLFi1Msp+Rro5OXVWo/J1dz8bpO7qwveV2ndhmkxcXzSstrNG7cWAcPHtQvv/yi1atXq1q1as418qtXr9bp06e1cePGVJ3UpNb//vc/DR06VIsWLVLDhg2VN29etWvXTr/88ouka9sWL/VeFyxYoO7du+uNN95Q7dq1lTdvXnXr1u2q/bycPn1avr6+8vHxcRu+ZcsWNW3aVJL0+uuva8OGDdq6datGjBjhTCed33ZWr16tggUL6vHHH1eZMmVUpkwZp5+KC61atUp//vmnevfurdy5c7s99+eff8rMFBwcnGI5fPPNN26fXeny2+TVHDx4UPXq1dMff/yhGTNmOF/Ek/cPV9pPHTt2TElJSdf82pcSGxurc+fO6aWXXkrxvlu0aCHp/9b/sGHD9MILL+ibb75R8+bNlS9fPjVq1Oiab6ceGxurkJCQFJ3qFixYUFmzZk2xfaZl3+7v7+90yHg5kZGRKd5zav969ux51fd3pX3clfY9sbGxl92fXDjtX3/9ler99pU++1dzcS1p2WdMmzZNffv2Va1atfTxxx/rm2++0datW3Xvvfe6rbeuXbvqzTff1IEDB9ShQwcVLFhQtWrVcsLh5PedmuWS7GrHh6u5eJvKmjWr8uXL5/Y6qTm+X0nevHlTDMuWLVuK4dmyZZMk5/Oclu022fUsj7Ruq5daT6lZx56oNS3fl2rUqKGhQ4fqww8/1KFDhzRgwADt378/VZ2jLly4UB07dlSRIkX07rvvatOmTdq6dat69ux5xf3OhVL7nQm4HtwdBrgB8uXLpy1btqQYfvGJUPKvvsOGDbvsHSHKli3r+QKvQXKtH330UZp+PUuWJUsWPf744xo+fLimTp2qV199VY0aNXJ7f4sXL3brXOzCX4CklMsveVi2bNku+2tT8peIw4cPp3ju0KFDzvtKvsNOajsKXb58uR588EHVq1dPX3zxhdsyyZ8/vypXrqzx48dfctrk95Xaz8n1unAZXHyycOEySIuLvwSm5TWS7260evVqrVq1Sk2aNHGG//e//9X69euVkJCQqhDEz88vRYd0UsoTgRw5cmjMmDEaM2aM/vzzT6dVSOvWrfXTTz9d07Z4qTvB5M+fX9OnT9f06dN18OBBffbZZ3r22WcVExNzyQ79LpzuzJkzOnnypFvrl/nz58vX11dLlixxC18vdZvBevXqqV69ekpMTNS2bdv00ksvqX///goODnYL64YMGaLffvvNadXVrVs3tzpcLpe++uqrS975InlY8vq+3DaZ3Gne5SxatEgnT57UwoUL3badnTt3XnE6ScqTJ49cLtdlX/tCycvs4s/IxZ+PPHnyyMfHR127dr3siVupUqUknT8JHDhwoAYOHKh//vlHq1ev1vDhw9WsWTNFR0en+U4s+fLl0+bNm2Vmbp+p5BYc17J9Jjt69Kj8/Pyu+Gt869attXXr1muaf2pqSw4LLpS8ni4V6CTLly/fZffbF752gQIFUr3fvtJn/2ou3t7Tss9499131aBBA82cOdPt+RMnTqSY5uGHH9bDDz+skydPav369Ro9erRatWqln3/+WSVKlEj1cvGUI0eOqEiRIs7jc+fOKTY21m3dpeb4nh7Sst16Qlq31cvdLexq69gTruX7kiT5+vpq9OjRevHFF/XDDz9c9XXeffddlSpVSgsWLHB7v5c6Ll9Oar8zAdeDEAS4ARo2bKgPPvhAn332mVtzxnnz5rmNV7ZsWYWGhuq7777ThAkTbnSZl3S5XxqaNWumrFmz6rfffrvkZQCp0bt3b0VERKhLly7au3evJk+e7PZ8WFjYFadfuHChnn/+eefE5sSJE1q8eLHq1auX4hf0ZLVr11ZAQIDeffddPfDAA87w33//XWvWrHGatd5+++0qU6aM3nzzTQ0cOPCqtz4sUaKEvvrqKzVu3NgJQkJDQyVJrVq10rJly1SmTJkUTWEvlNrPyfW65557JJ3/slKzZk1n+NatW7Vnzx6nVcGNeo1ChQqpQoUK+vjjj7V9+3bns9+kSRP16dNH06ZNU65cudzmczklS5bU999/7zZszZo1l20ZJJ3/ZbpHjx767rvvNH36dJ06dSpdtsXixYvriSee0BdffOE0E7+ccuXKSZJ+++03p8mzdP5LdNasWd0+36dPn9Y777xz2Xn5+PioVq1aKleunN577z3t2LHDLQTJkiWLXnvtNeXMmVM9evTQyZMn1bdvX0nnP7uTJk3SH3/8oY4dO172Ne666y75+/vrvffec9sfbNy4UQcOHLhqCJL8ZfnC7czM9Prrr19xOul8oHXnnXdedn9woeDgYPn7+6f4jFx854Ls2bOrYcOG+vbbb1W5cmXnF+eryZ07t+6//3798ccf6t+/v/bv368KFSqk6RfbRo0a6YMPPtCiRYt03333OcPffvtt5/lrtW/fvqveQjNfvnxXDCOu14kTJy65j8uSJYvuvvvuy07XqFEjffLJJzp06JDbSdDbb7+t7NmzO7d3b968uUaNGqU1a9Y4+6HLudJnP63Sss9wuVwpjinff/+9Nm3alOKylmQ5cuRQ8+bNdebMGbVr1067d+9WiRIlUr1cPOW9995zu1Tlgw8+0Llz51Lc4ehqx/f0cK3b7dVcrmWVp7fVy61jT0jN96XDhw9fsrVK8mUsF36+LrdMXC6XsmXL5haAHDlyJMU+9krzSO13JuB6EIIAN0C3bt304osvqlu3bho/frxCQ0O1bNkyrVixIsW4r732mpo3b65mzZqpR48eKlKkiI4ePao9e/Zox44d+vDDD29o7clBxIwZM9S9e3f5+vqqbNmyKlmypMaOHasRI0Zo3759uvfee5UnTx79+eef2rJli/NL+5Xkzp1b3bp108yZM1WiRIk0X7/v4+OjJk2aaODAgUpKStLkyZMVFxd3xdfNnTu3Ro4cqeHDh6tbt27q1KmTYmNjNWbMGPn7+2v06NHOuK+88opat26tu+66SwMGDFDx4sV18OBBrVixQu+9916KeRcqVEhffvmlmjVrprvvvlurVq1SpUqVNHbsWK1atUrh4eF66qmnVLZsWcXHx2v//v1atmyZZs2apaJFi6bpc3I9ypYtq0cffVQvvfSSsmTJoubNm2v//v0aOXKkihUrpgEDBtzw12jUqJFeeuklBQQEqE6dOpLO/2JXqlQprVy5Um3atLnkbfsu1rVrV40cOVKjRo1S/fr19eOPP+rll19WUFCQ23i1atVSq1atVLlyZeXJk0d79uzRO++8o9q1azu/3F/vtnj8+HE1bNhQnTt3Vrly5RQYGKitW7dq+fLll/2lOFnyCcU333zjFoK0bNlS06ZNU+fOnfXoo48qNjZWL7zwQooTqlmzZmnNmjVq2bKlihcvrvj4eL355puSdNkWNVOnTlVgYKD69eunf//9V0OGDFGdOnX06KOP6uGHH9a2bdt09913K0eOHDp8+LC+/vprhYWFqW/fvsqTJ48GDx6scePGqXfv3nrggQcUHR2tiIiIVF2S0qRJE2XLlk2dOnXSM888o/j4eM2cOVPHjh276rSS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W5fO79gzCEEAAAAAALgFjRkzRh07dtT333+vFi1aqEuXLjp69KgkaeTIkfrxxx/1+eefa8+ePZo5c6by588vSTp16pQaNmyonDlzav369fr666+VM2dO3XvvvTpz5owGDx6sjh076t5779Xhw4d1+PBhhYeHZ+RbTTX6BAEAAAAA4BbUo0cPderUSZI0YcIEvfTSS9qyZYvuvfdeHTx4UNWqVVONGjUknW9Zkmz+/PnKkiWL3njjDblcLknSW2+9pdy5c2vdunVq2rSpAgIClJCQoJCQkBv+vq4HIQgAAAAAALegypUrO//PkSOHAgMDFRMTI0nq27evOnTooB07dqhp06Zq166d05pj+/bt+vXXXxUYGOg2v/j4eP3222837g2kA0IQAAAAAABuMlmyZJGZuQ07e/as22NfX1+3xy6XS0lJSZKk5s2b68CBA1q6dKlWr16tRo0a6fHHH9cLL7ygpKQkVa9eXe+9916K1y1QoICH38mNRQgCAAAAAMBNpkCBAjp8+LDzOC4uTlFRUWmeR48ePdSjRw/Vq1dPQ4YM0QsvvKA77rhDCxYsUMGCBZUrV65LTpstWzYlJiZe13vICHSMCgAAAADATeaee+7RO++8o6+++ko//PCDunfvLh8fn1RPP2rUKH366af69ddftXv3bi1ZskTly5eXJHXp0kX58+dX27Zt9dVXXykqKkpffvmlnn76af3++++Szvch8v3332vv3r36+++/U7RCyawIQQAAAAAAuMkMGzZMd999t1q1aqUWLVqoXbt2KlOmTKqnz5Ytm4YNG6bKlSvr7rvvlo+Pj+bPny9Jyp49u9avX6/ixYurffv2Kl++vHr27KnTp087LUMeeeQRlS1bVjVq1FCBAgW0YcOGdHmfnuayiy8i8kJxcXEKCgrS8ePHL9vUxxPCIsPSbd432q7uuzK6BAAAAABeKD4+XlFRUSpVqpT8/f0zuhzcQFda96k9r6clCAAAAAAA8AqEIAAAAAAAwCsQggAAAAAAAK9ACAIAAAAAALwCIQgAAAAA4KbDPT68jyfWOSEIAAAAAOCm4evrK0k6depUBleCGy15nSd/Bq5FVk8VAwAAAABAevPx8VHu3LkVExMjScqePbtcLlcGV4X0ZGY6deqUYmJilDt3bvn4+FzzvAhBAAAAAAA3lZCQEElyghB4h9y5czvr/loR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9eurUKFCcrlcqlGjhnx8fC457r59+zxaIAAAAAAAgCekKgSZPXu22rdvr19//VVPPfWUHnnkEQUGBqZ3bZKkP/74Q0OHDtXnn3+u06dP6/bbb9ecOXNUvXp1SZKZacyYMZo9e7aOHTumWrVq6ZVXXlHFihVvSH0AAAAAAODmkKoQRJLuvfdeSdL27dv19NNP35AQ5NixY6pTp44aNmyozz//XAULFtRvv/2m3LlzO+NMmTJF06ZN09y5c3X77bdr3LhxatKkifbu3XvDghoAAAAAAJD5pToESfbWW285///999/lcrlUpEgRjxaVbPLkySpWrJjba5YsWdL5v5lp+vTpGjFihNq3by9JioyMVHBwsObNm6c+ffqkS10AAAAAAODmk6qOUS+UlJSksWPHKigoSCVKlFDx4sWVO3duPffccx7vMPWzzz5TjRo19MADD6hgwYKqVq2aXn/9def5qKgoHTlyRE2bNnWG+fn5qX79+tq4caNHawEAAAAAADe3NLcEGTFihObMmaNJkyapTp06MjNt2LBBERERio+P1/jx4z1W3L59+zRz5kwNHDhQw4cP15YtW/TUU0/Jz89P3bp105EjRyRJwcHBbtMFBwfrwIEDl51vQkKCEhISnMdxcXEeqxkAAAAAAGROaQ5BIiMj9cYbb6hNmzbOsCpVqqhIkSLq16+fR0OQpKQk1ahRQxMmTJAkVatWTbt379bMmTPVrVs3ZzyXy+U2nZmlGHahiRMnasyYMR6rEwAAAAAAZH5pvhzm6NGjKleuXIrh5cqV09GjRz1SVLJChQqpQoUKbsPKly+vgwcPSpJCQkIkyWkRkiwmJiZF65ALDRs2TMePH3f+oqOjPVo3AAAAAADIfNIcglSpUkUvv/xyiuEvv/yyqlSp4pGiktWpU0d79+51G/bzzz+rRIkSkqRSpUopJCREq1atcp4/c+aMvvzyS4WHh192vn5+fsqVK5fbHwAAAAAAuLWl+XKYKVOmqGXLllq9erVq164tl8uljRs3Kjo6WsuWLfNocQMGDFB4eLgmTJigjh07asuWLZo9e7Zmz54t6fxlMP3799eECRMUGhqq0NBQTZgwQdmzZ1fnzp09WgsAAAAAALi5pTkEqV+/vn7++We98sor+umnn2Rmat++vfr166fChQt7tLiaNWvqk08+0bBhwzR27FiVKlVK06dP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MpGLf4UzM50+fVq//vqr8uTJ4wwvX768HnroIZ06dcr5lYhWCOkjeUefJUsWRUVFafPmzTp06JASEhLUokUL9evXTytWrNDevXszulSv4+Pjo7/++kv/+c9/1L17d3Xv3l3//vuvatasqW7duikmJkYjR46UxPZxIyR/EXK5XIqKipKZacuWLcqXL5+GDRumo0ePql27djpz5owiIiKUN2/ejC7ZKyQ323/sscfUpEkT1a9fX82aNdP27dtVu3ZtDRgwQNHR0XrxxRczuFLv9cknnygyMlLLli1TrVq1JEmVK1d2WhiOGzdOkmg9lU6Sw6XkfVeZMmU0cOBAdezYUZMmTXJr9TF27FiFhobqv//9r6KjozOqZK+VlJSkb7/9VsOGDVO5cuX04Ycfaty4cWrXrp06duzIsf4GMDPnuPLKK69o+PDhWrJkiXx9fVWyZEm98847mj9/vj788EPu1JeBhg4dqooVK+q7775Tu3btVKBAAXXo0EHDhw/X9OnT9dVXX3l9aMgRNZO4sAOumJgYSf/XnDwxMVEJCQk6d+6cc7Bu1aqVzp49qyNHjmRYzd4geZ2MHDlS4eHhevTRR9WiRQsNGzZMkjR16lQVKlRIzz77LM1jb7DVq1erfPnyOnXqlGrUqKEDBw6obdu2Wr58uVq1aqUOHTpo8eLFWrx4sXO96tKlS71+p58eLvxV6Pnnn1fTpk21fft2JSYmqkiRIlqwYIHKly8vf39/bdy4UR06dNCff/6p33//XRKddKUXM9OJEyd03333aceOHZozZ46WLl2qhIQE9e7dWz/88IPatm2rFi1a6I033tC2bducYw4873LL9eGHH9b999+vuLg4bd682RneokULtW7dWrt27dLMmTNvVJleJzlc2rhxo15//XV17txZ3333nRYsWKCcOXNqxYoVzvcy6XxotW3bNk2fPl0nT57MqLK9jsvlUmxsrHbv3q3Q0FA98cQTeuyxxzRy5Eh98MEHKlCggPbt26d///03o0u9pblcLv37779q3769Jk2apK1bt+o///mPpk+frqNHj6pBgwYaMGCAIiIitGPHDknSsWPHtG7duowt/BZ2qWPL5MmTVbFiRf3+++86e/asM3zUqFEKDQ3V1KlT+QHXkGn88MMPVrNmTatUqZL17t3bduzYYWZmr7zyivn7+9vGjRvdxm/QoIFFRERkRKleISkpyczMJk6caKGhobZ69Wo7e/asvfXWW+ZyuezFF180M7MtW7aYr6+vvfTSSxlYrffp0aOHDRgwwHk8YsQIy5Ytm33wwQdmZvbTTz9Zt27dLE+ePHbfffeZy+WyxYsXZ1S5t7xjx47ZihUrrFWrVrZy5UozM3vjjTescOHCFhQUZK+88orb+FOmTLHhw4dnRKleZf/+/VajRg375ZdfzMxs3bp1FhgYaD179rTY2FgzM9u6dau1adPG7rrrLjt37lxGlnvLSkxMdP6/aNEi++9//2uRkZG2a9cuMzPbvXu3tWzZ0tq0aWMHDx50xj106JB1797dQkNDLSoq6kaXfcu6cH2YmX344YdWtGhRK168uK1du9YZPmPGDCtVqpRFRka6TTN16lS7/fbb7dixYzeoYu+0dOlSe/fdd+3QoUPOvqlVq1bmcrmsXr169vPPPzvj7ty50x577DFnX4f0sX79eps8ebI99thj9tdff5mZ2fjx461WrVo2ZcoUZ7xq1apZ1apV7YknnrCcOXNa7969M6rkW9aF+6SYmBjbsmWL7d+/386cOWNmZl9//bW5XC576aWXLD4+3hl3//79ljdvXnv00Uftn3/+ueF1ZxaEIBnowi+bJ0+etKZNm9qQIUNs0qRJVr9+fatataolJCSYmVmTJk2sfPny9uqrr9pPP/1kzz//vBUoUMDWrVuXUeXfki4+ATh79qw1bNjQ3nzzTTMz27x5s5UqVcoaN25se/bsccabOHGiuVwu27Jlyw2t1xtc/GX13LlzdujQIStbtqwdPHjQDh06ZDVr1rTbbrvNOflOduDAAXv++eftiSeesOjo6BtZtlc5ffq0hYWFWfHixa1Lly7O8LNnz1rdunWtfv36tm3bNjM7vz5ff/11u/322+2NN97IqJJvOclfei729ttv2x133GFmZt26dbO8efO6BbbJJ3FvvvmmtWjRwvbv3+8EwLh2J06cSHE8SUpKsk6dOlmePHmsadOmdtttt1n+/Pntm2++MTOzBQsWWO3atW3gwIFu03399dduJ+a4PmfPnnX+/+OPPzr/79u3rwUFBdm7777rNv59991ndevWTfFDFNtJ+jl37px16dLFcufObcWLF7eyZcvaokWLzMzsnXfesdKlSzs/AiYmJtrff/9tDz74oN1zzz22f//+jCz9lnLxZ/z48eNWo0YNy5Url/Xr188ZHh8fbw8//LA1bNjQli5dambnT7SfeOIJu/fee1NsU7g+Fx9bXn31VcuTJ4+FhYVZnjx5bMCAAfb777+bmdnAgQMtb968tmHDBjP7v3X60ksv2dNPP31D685sCEEy2LFjx+zbb7+1DRs2WPfu3Z0P9oYNG6xixYrWuXNnMzNLSEiwLl26WIkSJax8+fJWpEgRftX2oMTERGfHcObMGTt58qSZmR05csQaNmxomzZtshEjRljOnDlt1KhRzgnHL7/84pykt2zZklDKwy4OCi902223WYcOHSx//vzWtWtX+/vvv83MLDY21t555x07fPhwivld+OUX1+bCbeVCH330keXIkcNatWrltt6++eYbq1u3rhUqVMiaN29ujRo1sly5ctl77713I8u+Jc2dO9eWLFniNmz79u22e/duZx3t3bvXgoKCLE+ePNawYUP77rvvnHEXL15s06ZNM7PzQRauX1JSkq1atcqKFi1qBw4ccHvu448/ttDQUPvpp5/M7Py+6r777rMyZco4Ie3w4cOtTp069tZbb112/rg2Fy67U6dOWceOHe2OO+5wjttRUVFWt25d69Spk1trgsOHD1vZsmXtwQcfdE4skL4OHjxoDzzwgEVHR9uff/5pLVq0sEaNGtmGDRssPj7exo0bZ1mzZrWGDRta9+7drXjx4la3bl2ndRuu3+W+L61cudJCQ0OtTZs2bq0Ldu7caY0aNbKuXbs6rdbi4+P53uUh+/bts/vvvz/F8Pnz51uhQoXsnXfesX379tkLL7xgd911l7Vs2dIZp1KlStasWTP2XxchBLnBLtwZzJs3z3LlymXFixe3ChUqWMeOHZ3n4uPjLTIy0oKCgiwyMtLMzOLi4uzIkSO2adMmp4VIUlISX4qu04XLb/HixVa5cmUbN26cM6xChQoWEBBglStXtq+++soZHhUVZYMHD3Z+xWM9eM6Fy3LXrl3WtGlTu/fee238+PG2c+dOMzt/+Uv27Nlt0qRJbtMuWbLEGjVqZN9++63b8ItblCDtLgw3tm7daosXL3Zbzo8//rjddtttzi9ByQ4ePGhvvPGGTZgwwUaNGuU0ocW1i46OtrJly1rnzp3tjz/+MDOzZs2aWdGiRS0oKMgGDRpkP//8syUkJFiPHj2sUKFCbl+A/v77b2vXrp317NnTjh8/nlFv45a1fPnyFMP69Oljd999t5n937Z09uxZCwkJcVp//Pbbb9a8eXNr2LChE+zi2r3zzjspWghu2bLFChUqZC1btrT169e7XVLx7rvvWrVq1SwiIsKtddXcuXOte/fubid98LxRo0bZoEGDbPTo0TZ06FBn+O7duy08PNy6d+/u/MCxePFie+aZZ6x///60KvSwC78vTZ482caMGWP/+9//nHOYcePGWbVq1WzOnDlu082dO9dCQ0Nt1KhRN7Reb/D555/biBEjzMx9/fTu3dtatWrlNu5HH31kt912m02fPt3MzH799VdzuVw2ePBg5/wRhCAZIjEx0X777Tdr3bq1vf/++7ZkyRLr0qWLBQYGOl9mzc5f3/X0009boUKF7NChQynmw7XbntW/f38LDAy0SZMm2RdffOG0PFi6dKm5XC57/fXXnXFPnz5tffr0sfr169vevXszquRb3ldffWWlSpWy7t2725NPPmlhYWFWpUoV+/HHH23v3r3OZWPbtm2zHTt22LRp0yxPnjw2evTojC79lta7d28rUqSIValSxSpWrOgEuAkJCXbHHXdYx44dnV+74XnJIeG8efPsjjvusPHjx9uUKVPsgQcesD179tiMGTOsatWq1rdvXzt16pRt3LjRatSoYZUqVbKIiAh78cUXrWjRonbPPffY0aNHM/jd3Pwu/EJ64UnyTz/9ZO+9955zLJkwYYLddtttKcZ94YUXrFy5ck4Y9dVXX9m+fftuROm3tH379lnLli2dflfMzodO/fv3t0ceeeSy0w0cONDCw8NtwYIFN6JM2Pkf+erXr2/ly5e3OnXqmMvlsjZt2riN8+abb1rVqlVt0qRJbt9/+QEqfezevdvKlCljd955p3Xs2NGqVq1qtWvXtj///NPi4+OtXbt21rx5c+cyi2RTp07l8uN0cOFxJvmSr4SEBOvTp4/bj+hm53/k6Nq1qz388MN26tQpMzvfv9Hs2bNvXME3AUKQGywpKclatGhhOXPmtPvvv9/5UEdHR1v16tWtWbNmbuPv3LnTQkND7dlnn82Icm9ZyQfQ5IPnzp07rUaNGikuZ0n+kvrEE09YcHCw1a9f30aMGGEVKlSwChUqEICkk3///deGDx9ujz32mP33v/91hm/bts3atm1r9erVM7PznQnffffdFhwcbGFhYXbbbbfZp59+6ozPlyPPGz16tFWtWtW5ln7VqlVuIeG6deusSJEiNmHCBKfDLdaDZ114ot2/f3+rV6+ehYeH2+rVq53hU6dOtZo1a9r//vc/MzvfP85DDz1kTZs2tSZNmtjUqVNveN23sku1ppkwYYK5XC5bv369mZktW7bMqlevbpMnT3Ybb8iQIdagQYMU/brQeu3abNmyxWltlvyr559//ukc9xs3buw0FX/ppZesf//+Vq5cOevWrZv9/fffdvToUbvnnnusfv36bq1EkD7effddGzhwoPXv39/OnTtnZ86csaFDh1rVqlVT9CXxxBNPWFhYmNMBOtJPnz59rFu3bs7jyMhIc7lcTji4efNmq1Wrlj3xxBOXvPwYnnFh4HfmzBkbMGCA5c2b1xk2aNAgq1KlitNKOlmXLl2sfv36N6rMmxIhSDpKSkq65JeYbdu2Wf78+a1ly5Zul7WsW7fO/P39bcaMGc64iYmJ9uuvv96wmr1N8helTz75xFwul/3zzz+2efNmmz59uj300ENWv35958Tigw8+sN69e1vfvn1t7NixGVn2Lefi7eT06dNWokQJc7lcNnHiRGd4UlKSLVmyxMqVK+dcJpaUlGQHDx607du3u21PnEB43smTJ61WrVr22Wefmdn5jhwLFy5s7dq1c2vFNnLkSCtYsCC/pHrYhAkT7IcffjCz8yd6n332mZ04ccKaNWtmAQEBbiFuQkKCPfzww1a/fn3n0ozkbeLff/+98cXfwr7//nurXLmyrVy50hITE61Fixa2bNkyMzMLDw+3OnXqWExMjJ08edIGDBhgFStWtPfff9+OHTtmhw8ftrp169pTTz1FWOgBX3/9tZUvX96GDBniDFuxYoXVqlXLOaH+4IMPLCQkxHLkyGGNGze23r1728yZM83Pz8/Gjx9vZucvq5w5c2aGvAdvcuTIEevUqZPlzJnTnnjiCWd4VFSUPfjgg9akSRPbvXu3M/zgwYPWuXNnfoDyoEt9Vzp06JAVLVrU+bHjoYcesvz586e4y9u0adOsaNGizs0D4FkXBiBxcXFmZrZ27VorV66cc7edEydOWJEiRaxnz55OX0ZnzpyxDh06OJfP4NIIQdLJhTuVw4cP2759+9x+KXrhhRfM39/f6U/C7PyHdtKkSebj4+PWfDMZl794TvIvDU2bNnVOmCtXrmyFCxe2kJAQ69y5sz3++OPWqFEjq1KlilsfBnTy5DlXCis2bNhgefPmtR49erg12T9+/LhVrlzZCQsv3i7YTq5d8rq43DKMj4+3+vXr2/z5861v376WJ08ety9F27dvd/7/0EMPuX15xfU5duyY3X333VapUiUbPny4uVwue/nll83MbM2aNVahQgV76qmn3G53991331mzZs2sdevWKTrphOfs27fPevbsaaGhoRYQEGAdOnRw9lm///67ZcuWzenfYN++fTZo0CBzuVwWFhZmBQoUsHvvvZe+JjwkISHBBgwYYHXr1rVPPvnEzM6fONerV88efPBB5+T5+++/t/Xr19vff/9tJ06cMDOztm3b2jPPPJNRpXutdevW2V133WXh4eFuw5cuXWoNGjSwxx57jON6Ornw++yFIWx8fLw1aNDAhg8fbmXLlrW6des6x/NTp065/cAxZ84cAtx0dODAAWvdurWNGzfOYmNj7cyZMzZ79mzLlSuXffjhh2Z2PrQtW7aslS1b1vr27Wvh4eFWrFixS55L4v8QgqSzCRMmWHBwsJUvX965JWTyr9X33HOP1ahRw+0E76+//rI6derYiy++mEEV35oudQCdMmWK1ahRw55//nkzMzt69KhFRkba7t277eDBg2Z2/kS8ePHi9KicDi48aK5atco6dOhgDz/8sH300UfONfTDhw+32267ze1OIsmBVfJ6g2dMmDDBBg4c6LZePv30U/vggw+cWz8fPXrU7r33XgsMDLSaNWu69VsQFRVl999/v23atOmG134ru3g7cblclj9/fre7vJiZRUREWM2aNd36LjIze+WVV6xdu3aEIOmsU6dO5nK5nI5Pzf7vsqXXX3/dsmbN6nZHtw0bNtjSpUvt888/d4Zxond9kkPcPXv2WLt27axly5bOL6OffvqpVatWzYYOHer8omr2f7eWfvPNN6148eIpOnWGZ8XHx9vcuXPt008/dbs98RtvvGHlypWzF154wW38yZMnW+nSpe2111670aV6jVOnTtljjz1mQ4YMcS4z+ueff+zBBx+0gIAA69u3r9v4mzdvtnr16tmOHTsyolyv8vbbb1tgYKB16tTJVq5c6ZwvHjp0yB555BErXLiwc0ekLVu22Lhx46xXr17Wv39/WkOnAiGIByV/4JK/tD733HNWrFgx++ijj2zTpk328MMPW9WqVZ1OG/fv32+5c+dO0d9H8q8S8KwzZ864XbcYGxtrTz/9tFWvXt3WrFmTYvx//vnH7rvvPnvggQfcvjTh+l14Yjd//nzLlSuX9enTx8LDw61ChQpuHaLdfffddvvtt9v48eNtw4YNNnjwYAsKCrKNGzdmROm3rFmzZpnL5bIVK1aYmdkDDzxggYGBVrFiRfP19XV+cViwYIHly5fPnnvuOWfa2NhYe/DBB+2ee+7h8j0PurjV2Zw5c6xq1armcrmczuiSQ/XkjupatGiRoqM6fqXzrIvXy4kTJ2zhwoX23HPPWcWKFW3WrFkpxmvVqpVVrlz5sq2jCECuXfLn+8LP+Ycffmh169a1J5980hk2fPhwu/POO52m+zExMTZz5kxr1qyZ5c2b1955550bW7iXWbZsmYWEhNhdd91lhQsXtrvvvts++ugjMzt/Ujd48GArX768bd682ZkmJibGZsyYwXcwD7qwT7zff//dqlatarVq1bKWLVuay+VyAqfkuyX26NHDYmNjLSYmxpYtW2a33XabPfroo9xWPZ0dOnTIatas6dzh5WLff/+9Va1a1dq1a+c2/OK+pXB5hCAecmHi9ueff5qZWcOGDW3YsGHO8FOnTtmoUaPcOuB85513zOVyuXXmeKl5Iu0u/FJ59OhRa9eunXXq1MltnC1btlibNm2sRYsWbtfbDRkyxMqUKWN169blNoXp5Pfff7fnn3/eOnbsaHPnzjWz8yd0n376qQUGBjrXZn///fdWuHBh8/f3t06dOtm9997rdhkZPKdr165Wrlw5W79+vXXu3NkOHz5s0dHRNmTIEMuVK5dt27bNzMyeeuopq1ixooWGhlqvXr2sePHiVrduXW5960HJJ3Tx8fE2ffp0i4yMtO+//96SkpKsX79+FhIS4vT6nhyEbNmyxWrVqmWdOnVyjkPwrIsD3A0bNjgtBY8cOWJ9+/a1SpUqOX23JLdqO336tLlcLuvRowe3KPSgyzXnNzt/u9VatWo5raP+/fdfa926tbVs2dLpQ+rNN9+0wYMHc5xPZx9//LGVLVvW6ZA5OjraGjZsaMWLF3f6k9q0aZO1bdvWmjZtyolcOrnwvCIhIcF+++03e+aZZ5zh48aNs+zZszvnKDNnzrTq1atbzpw5rVatWpY3b16bMGFChtR+K7v4R3Sz83cJK1asmG3ZssWOHDli77zzjo0cOdK6dOninDN+/PHH5u/vT0fn14gQ5DolJSW5/QrRtm1b69Onj+3Zs8fCw8NTNNn/7rvvrEaNGm7X0ffs2fOSIQjS5p9//nEOnBfuSKZOnWqxsbE2cuRIq1OnjvMrXbI5c+ZY6dKlnc5Ot23bZr169aJTNA+7ONR7++23rWDBgpY7d263Xq1Pnz5tEyZMsPz58ztN+F977TUrVaqU0xmq2fm0m1+4PSs2NtZKlSplgYGBNnjwYLfnateubeHh4Xbq1ClLSEiwHTt22KBBg2zUqFEpLsGAZ6xZs8by5s1rVapUsbJly1quXLls9OjR9s0331jVqlXtgQceSDHNSy+9ZP369eNXOg+7cP914MABK1OmjIWEhFiRIkUsJCTEuYxi69at1rhxY7df55JP8r755hv7/vvvb2zht7AL18mkSZNs6NChFhkZ6Vymd+DAAevcubM1atTItm7dambnTyxq1aplXbt2tdjYWI4hN8gHH3zgfMc6fvy4tWrVygoVKmRlypSxRo0aOeO9++67VqRIEXvppZcyqtRb0oXbytatW61mzZrWuHFjK1u2rI0ZM8Zt3Lp161rNmjXtyJEjZna+pdvnn39uixYt4tbdHnZxv3gX32WsePHiVr16dcufP7+1adPGWrVqZU2bNrXKlSvbjh07LC4uzp599lmbM2fOjS79lkAI4iF//PGHffTRR9aoUSOLiooyM7MGDRpYy5YtU/TEX7FiRbcmmrh+J0+etKpVqzq3vUv+YjN79myrWLGimZ3/la5bt27WoEEDt+aWJ0+etFKlSlnRokWd6yE5gUgfcXFxTmeOZud/qcuZM2eKPnA2bdpkZcuWtS+++MIZ1q5dO6tbty59TqSztWvXmo+Pj3Nr4uQD9L59+ywgIMBGjRrFr3Q3QExMjNWuXdtteY8ZM8bCw8Ptueees+XLl5u/v7+9+uqrdurUKYuIiHC7RAnpY926dfb+++/bk08+af/884/t3bvXevbsacWKFbOVK1ea2fkWnuXLl7devXrZK6+8YoGBgc7dYsxo5XmtLtU3165du+z222+3qlWr2v3332/VqlWz9u3bO8HTsmXLrGHDhtajRw/nuD569Gjr0qWLWyfC8LyLjxN///23/fbbb1a5cmVr3769HTx40GbPnm0ul8teffVVMzvfavdSlyfDM7Zs2WJ169a1Rx55xEaNGmUul8vatWtnhw4dcsb5888/LUeOHDZkyBA7duz/tXfncTXl/x/A37dNSRsSKiRKaaOFRIuShEkZSyI09i3EYCyDIUORGsswBjMxlV2WURgaRJF1lD2qQUhktN/7+v3R755vV5nvfEcL9X4+Hh4Pfe7nnj7n3s45n/M+n8/7k1t7ja3jygdgL168iD59+sDZ2RnTpk3DqVOnAAC3b9/Gpk2bcOTIESGHzqVLl2BgYCAkPeX+2L/HQZAqcO3aNYhEIpiZmQnD+gHgypUrkJOTQ3h4uDAk9vnz57C3t6+w9jn7cNJhYb/88otQNmnSJIwcOVL4+fTp03Bzc8OwYcOEE8etW7fg6emJAQMGcDS1mkmXU5POOc3JyYGHhwf69esnM8Xl2rVraNy4sUyw6smTJzAwMMCQIUOEJxTsn3l3znxlN2Hlh5UHBQWhadOmuHPnjsz7fvjhB4hEImHJVVZ97t69ixYtWsgkaiwqKhJWrUpJScGKFSvQoEEDGBkZySxnyKrGu8dJXFyckJhWuvKIVLdu3dC3b1+IxWK8evUKW7ZsgaWlJSwtLXmp6CoQHR0NRUVFIdEpUBaY7dGjh8yotfnz50NVVRWjR48WykJDQ9GtWzde2r6GZGZmYuTIkRgzZgwOHToks/JRSEgI+vXrJ0zXi4qKgqKiIkQiEa9kUcXKX+/fvn2LmTNnwsvLC0FBQUIdaULgrVu3yvQBfvrpJ4hEIiGwy6pPREQE1NTUMH36dISGhsLf3x8mJiZCIPddS5YsQdeuXTnZeRXgIMj/6H3Jy6ZOnQqRSIR9+/YB+E/nadWqVWjcuDF69uyJ4OBgdO7cGWZmZrzaSBUqP3c+KCgI6urqwsmjR48eFYbqb9y4EXZ2dujduzeOHj0KNzc3BAUF8Y11FatsmPGjR48wduxY2Nvb48qVKwCAY8eOwcLCAt27d0d8fDyuXbuGoUOHwszMTDjJS4+7HTt28KowH0C66hFQNtrp74IilpaW8PT0rDAqauzYsZwVvgakpKRAQ0NDCA5Kg7Y3b96Eurq6MLw/Li5OSC7Iqof0hu3hw4cIDAyEkpKSsDqPdKRnSkoK5OTkZKb2SZczBGSnzrL/3V9//QUzMzN4e3vL3FQvXbpUSHg+duxYaGpqYvDgwWjbtq0w9TUnJweDBg3C4MGD8erVK/4eqlFycjIMDAzg4eGB3r17Q1VVFREREcJxMnz4cNjY2Aj1v/nmGyxYsADbt2/nEVJV6N3kzQAwZMgQKCkpYfLkyTLlQ4cORdeuXfH777/LlG/cuJGPlSr27ud5+fJluLm5ITY2Vijz9vaGSCSCu7u7UHbhwgWsXLkSrq6uaN68Oc6cOVNjba7LOAjyPygfALl+/brM3Ljc3FwYGhri888/r5D0LCYmBmPGjEH//v0xffp0oZxPLh/u3RP9s2fPYG1tjV69eqG4uBgdOnQQOqvSC2xhYSH27NkDKysrmJqawsfHhzPzV5Pr169j5cqVMmUnT56Em5sbBg8eLHwnK1euhLKyMgwNDeHj4wNXV1c8fPiwNppcJ0kkEoSEhAhTwzZs2IABAwbIBEXOnj2Lhg0bCnOxU1JS0KBBg/dmJmfVz97eHp6enjJl2dnZ0NbWxt69e2upVfXL9u3b0ahRIyFx5qVLl9CxY0f07t1bqCORSHD//n20aNFCpjMrxdeXDyMNJCUnJ0NJSQkRERHCtSM/Px8SiQR+fn5wcHDA3bt3kZubi44dO8LU1FQISt27d4/7XNWouLgYYWFhmD17NlatWiWUz5gxA9bW1sJU419++QXNmzcXVrLS09PjKa5VqHywtaCgAHPmzBFyDmZlZcHJyQk9e/aUGTX44sULmJmZISAggFd3qyHll0bfsmULxGIxkpKSYGJigm7dumHt2rXQ1NQUEp7euXMH/fr1w9SpUzlYWIU4CPIPiMVi4aSSk5ODbt26QU9PDxoaGpgyZYoQPY2Pj4ecnJyQvPHdC2753CCVRWnZP/fuiT4iIgJnz54FUJb4TFlZGX369EGHDh0wbNgwHD16FBkZGTLzG/Pz83k4WTWbPn06TExMhA6Q1Pr162FpaSl0loqLizFo0CB4eXnJ1OWbh6oTFxcHW1tbGBoaQk1NTWb0QGhoqJDvo/xT1tDQUIhEIh75UUsSExOhoqKChQsXCp3TtWvXwsTEhIOE1aCy801WVhYMDQ0xbNgwAGXX7piYGCgrKyMkJEQ4XqKjo6Gnp4fbt2/XaJvrOul1Pj8/H2fOnMGIESPQokULYSQhUJYXxNDQUOiL/fXXX+jevTuaNWsGb2/v2mh2vZKYmIi7d+9CU1MTIpFIZvRtfn4+evbsic8++wy3bt1CUVERfv75ZwwcOBB+fn48AreaHDp0CM2aNYObmxvWrVsnTMnft28fOnXqhIULF8qM8ty7dy8UFRV5kYYacOfOHSgqKgrTJMViMfLy8uDi4oLAwEBIJBLk5ubC2NgYqqqqwmhQXn2v6nEQ5G8UFxfLXGifPXuGcePGwdfXFykpKfjhhx/g4OAAJycnpKWlAQBmzpyJJk2ayHSE3g2G8NOIqnP06FE0bdoUHh4eiIyMxNu3b1FcXIzw8HCIRCJ4eXnBz88PhoaGaNOmDVq2bIkOHToISYdY1XhfsCItLQ1DhgxB7969ZY6JvLw8ODk5oWPHjsKwvqSkJHTp0gXjxo0ThjfzsfLhpE8N0tLSoKGhgQYNGgjDxEtLSyGRSBAeHo7ExMRK379gwYIKGctZzZE+OdXV1YW9vT1UVVVl8h6xqpeZmQngP+ef+Ph4yMvLY9u2bQDKHobMmjULcnJy6NixI6ZNmwZ5eXlhWW9WtU6ePAltbW189tlncHV1hZycHJydnYXEpsnJyWjdurWQa23Pnj0YOnQojhw5gry8vNpsep23YsUKiEQipKWl4cCBA9DQ0Khwg52YmAhTU1PMmTMHz549A8DJ56tTcnIy2rVrJ0wdfrd/Nnv2bNjZ2WHnzp0y5e9Oh2EfrrK+cWZmJpydnWVWoDxx4gS0tLRw//59oU6vXr1gZmaGiRMn1lh76xsOgrxHYWEhFixYgC+++ALFxcUIDQ1Fs2bN4OzsLJO8KS4uDh4eHggICABQdsNha2sLW1tb5Ofn11bz64ULFy7AyMgIISEhKCoqkhld8+zZM/j4+MDKygpA2Yno7t27+PXXXzlJXTVav349pk6dirCwMCGQceTIEXTv3r3CiXzIkCHQ0tKCo6OjcKxs3rwZpqamWLx4cY23vS55d9k1oCyJ4M6dOzF+/Hh06tRJuNhK67OP19WrV7F3715EREQINxGsapQ/Tt68eYPg4GA0bNiwQud13rx50NDQEKbB3rx5E97e3tDV1cXFixf/9sEH+/eKi4vh7u4u9LFycnIQFxeHRo0aYf78+QDKbhiGDRuGxo0bw8nJCQoKCti6dWttNrvOu3XrFtauXYuFCxfK5CcYP348rKysKiTUDA4Ohra2Ng4cOACAj5GqUtlN9pYtW9C+fXsAZcGm5ORk7N+/X0j8n5eXh/79+6Nv3748FamGvJsmYciQIejVq5fw89WrV6Gvr481a9bg5cuXCAwMxJAhQ3i0ejXjIMjf+Pbbb4XENK9evYKOjg6UlZUrZLBeunQpunbtKsyvly519O7SuOzfq+yC+f3338PExETmpqB8h/batWvQ0dHBlClTaqSN9VlpaSk+//xztGjRAn369IGBgQEMDAyQnJwMoOxYsrW1RWhoKICyG/KRI0ciIiJCJpEgAAQEBFRYeYH9c+WPgVu3biEmJgYXLlwQjqFTp07B0dERgwcPrvQ9jNUX5f/uQ0JCMH78eCGx44QJE2TqPn/+HObm5ujXrx+AsmvSkSNHoKurKwRti4qK+ObuA7x7HpJIJMjKyoKWllaFHDjr16+HoqIiTpw4AaBsNaVt27Zh9uzZvEpSNSsqKsI333wDkUiEDh064MWLF8JDqIKCAlhZWWHIkCHC6mJS7448YB+mfABk+/btiIyMBACcO3cOKioqGDt2LBwdHYU+mZKSEsaPHw+gLCG9iYmJzNLdrGqUvwYUFhbCxsYGY8eOlQk4HTt2DK1atRLuJ58+fYp58+ZBVVUVrVu3Rrt27SocP6zqcRCkEtI/4NevX0NDQ0OIXB86dAgikQgbN26UGcp36tQpiEQiTihUTd431WLMmDFwcXEBULHzJH3P+vXrIRKJZJLYsqp1+PBhrFmzBpMnT8bz588hkUhQXFwMOzs7ODs7IysrCy9fvsTcuXOhoqICFxcXqKurY9y4cTLfrbQTxflyqsbixYvRqFEjmJiYoGnTpnBychLySGzevBkmJiZCElSgLImtdN4wY/VFcXExtm3bho4dOyI+Ph6FhYWIiYmBSCQSrv1Sw4cPh0gkwpIlSwCUjRxZtWoVtLS0kJCQAICfcP9b5a8Fb968kXmtY8eO+OqrrwD85/N9+vQpWrduDUdHx/cuJcmqz61bt+Dr6wsdHR2hTJof57fffkPr1q2xfPlyYcoSqx5ZWVmwsbGBqakpli1bhufPnyMvLw+//PILnJ2dsXz5ciHQsXHjRmhpaQm58XiVyqpX2f1KZGQkBgwYAD09PRw/fhylpaW4efMmLCwsZEZMFRUV4fLlyzh8+HBNNrle4yDI/3u34yK9qZ4xYwZmz54tZCcfPXo0dHV1cfz4caFuZGQkrKyshHnE726D/Tvlv5MnT55g48aNOHz4sJCkMTo6GiKRCHfv3pWpn5eXh6ioKLx69QolJSUcTa0i0r/n8t9LSUkJRo8eDZFIBCcnJ5lpSenp6dDQ0MCaNWsAlA1jPnz4MObPn4+oqChhG3zTUPViYmKgp6eH33//HU+fPkVqairatGkDb29vPHnyBC9fvsTs2bOho6ODjRs3wtHRET169EBOTk5tN52xaiU930gkEqSkpKBXr17o27evkO8DKHuaPWnSJDRt2lTmmJg6dSpGjhyJ4cOHC9tJT0+Hi4sLBg0aVKP7UVeUP/9nZmaif//+6NevHxYvXoyXL19CIpFgzpw5sLe3F5KfS+taWFhAJBJh7ty5tdH0eiU6OhrffvstVq5cKdxEJyYmQkdHR1hytXzC+lmzZqFZs2acVLsaPXr0CLa2thgxYgTy8vIq3IC/27dauHAh/Pz8eJR6NSj/WWdlZSE8PBw//vijMEMgJycHkydPRsuWLYV7SkdHRwQGBgLg+8XawkEQ/P0KFCtWrMCgQYNk/kANDAzQpEkTfPHFF/j666+hoqKCL7/8siaaWi9t2bIFGhoacHJygpWVFVq2bImEhARkZ2fD2dkZVlZWKCoqEr7HDRs2oHfv3jwktorExcUJT3ikn3FiYiLmzp2L0tJSXLp0Ca6urrCwsBDeI53/GBgYiM6dO8tsr/zFgld/+XCVfYYzZ85Er169UFJSIrx+8eJFqKurY/PmzQDKEqXOnj0bZmZmGDZsmBDoZawuEovFFTqaBQUFMDc3h0gkkgnMAsCff/4JW1tbmJiYIDQ0FKNGjYK1tTWys7MrbJtX6vlwN2/ehLW1Nby9vREUFAQlJSVMmjQJOTk5uHbtGjw9PdG1a1fcuXMHOTk5+PHHHzF+/HhcvXqVbyCqUUlJCby9vaGtrY1x48bB0NAQffv2FZIzr1u3Durq6sJog/Kri3GizapT2cOi5ORktGrVSkj+m5qaiosXLyIqKkq47j948ADx8fHw9fWFlpYWT3+pZlu3boW6ujp69+4NY2NjODg4YOXKlcLr69evR5cuXeDg4IBRo0ahU6dO/PCpFnEQ5P+9ePECq1atwokTJ2RGdGRmZkJZWVlYoggArly5ApFIBHd3dyxevFhmVAirWlevXkXHjh2FhE7FxcXQ1dWFra0tXr58iatXr8LAwABmZmbo168f+vXrBzU1NURHR9dyy+uGCxcuoE2bNpg6dapM+YABAzBnzhwAZTfh+/fvh6qqqpCNXGrKlCnw9PSs9AaEfThpx6i4uBhJSUnCKi4TJkyAvb29UE8a4Bg/fjxsbGxktsFLFLK6rvy558yZM5gyZQpSUlIAlK1Kpa2tjcDAwAqd0ezsbPTt2xcODg5wdHSUSVLHAdwPJ5FIUFpaivnz52PGjBnCNQUAdu3aJSQ+B8q+N2dnZygrK6Ndu3ZQU1PjJOc1YN26dejWrZtwnUhMTISioiImTJgAsViMrKwsjBo1Cu3atROmU3JAvWq9b4rwxYsXYWhoiICAAPj6+sLLywv6+vrQ0NCAt7c3CgoKsG3bNvTo0QN9+/atNIDLqs7ly5dhbm4urFIFAMbGxujcubOwgqhEIkF2djY8PDwgEolgamrKfbBaVG+DIOWjqgkJCdDS0oKJiQn09fXh7u4uMyd1/PjxmDFjhsz7FixYAB0dHZnhmZzL4MNUFuletWoVevbsCaBsDqq1tTXMzc1x8uRJoU5WVhZWrFiByZMnY9q0aXyir0Jv3rzB8uXLYWpqKsyPf/XqFVq1aoUjR44I9V6/fo0FCxZAXl4eu3fvxo0bN3D79m0YGhoiKCiotppfZ5W/AYuPj0fz5s1haGgIExMTxMbGIjY2Frq6ukKCWWmndNGiRejatSvevn3L5ytWZxUUFFQ6333atGlQVVXF9OnTcfToUSE4snjxYrRv314m+ab0+CgqKhKG/wMc/PhQlV3nu3XrBpFIhFmzZsmUT548GdbW1jLXmhMnTmDHjh14/vx5tbeVASNHjkRwcDAAIDQ0FJqamhg3bpxMro/Lly+jZcuWGDJkSG01s84qH8Bdu3YtNm/ejNjYWABAfn4+oqOjYWtri9GjR+OXX35BWloazpw5I+QpfPnyJa5fv15bza9XoqKi0L17dwDAH3/8ga5du8LExATnzp2rUDc3NxcxMTF4+fJlTTeTlVPvgiCVLR25bt06Yb3mPXv2oEuXLvDx8RFeX7FiBUaOHImCggKZG4fOnTvDzc0N6enpNdL2uqb804L3dSzXr18Pf39/rF27VkimKb343rt3T8gHwqqe9Du5c+cOhg8fDltbWzx9+hS5ubkwNDSskAPn3r176NOnD0QiETw9PWFnZ4dhw4bVRtPrjfPnz+Pzzz/HmjVrcOXKFXh4eKBXr15YtWoVpk+fjvbt2yMrK0v4Lj08PCqM6mGsLsnJyYGBgYEwSkAsFkMikSA0NBRmZma4ePFipe9zcXGBu7s7rly58t5tcwDk36us7yX16NEjGBoaYujQoTJJTl+/fo0ePXpgyJAhuHTpUk01tV67c+eOTGLGbt26Yc6cORg8eDBatmyJ3bt3C6+dP38eaWlpEIvFOHbsGC8OUE2uXbsGY2NjmJiYwMXFBQoKCggODhZGrr2b42PHjh1wcXHhQGENW7p0KVxdXbFz506oqanJ3K88fvxYZkYB+zjUqyBI+ScQv/32G4YMGYKQkBBYW1vj9OnTAMqe/kRHR6Nx48bYsGEDgLLpL2pqasIJXjrnMT09HSKRCGFhYZzc8X908+ZNGBoa4ubNm0LZlStXsHTpUvz8889CTolNmzahadOmaNasmczFVywWY/HixVi4cKFQxt9B1SjfUZX+Pz4+Hvb29pgwYQISExPRr18/mRWSpJ+9dNm1MWPGyGyTbx6qllgsxsiRI2Fvbw8/Pz8hoJiVlYX+/ftj0KBB2L59OwYOHAg1NTW4urrC1NQURkZGvFISq7OioqJQUlJS6ZPP4cOHC0HZO3fu4NSpUwgPDxeCJWlpaTA0NMTkyZN5eHIVe3fp+sWLFyMkJASPHj0Szl1btmyBvr4+fvjhB5kHJMePH4eWlhY2btzI1/hqtmjRIujo6GDMmDFCTrUtW7ZAJBLBzc1NZvWwzMxM+Pv7V1hBiX248v2l1NRU2NnZYfr06ULZhAkT0LJlS5ljJScnB5cvX8ayZcugpqYmjN5hVaeyIG75qd6pqalQV1dHw4YNhXtKoKx/vGzZMqxcuVKm38xqX70JgpS/eO7cuROamprw9PRE586d0aBBA5kM1jk5OZgzZw6aNm0qjDTw8fERsvgC/xkq+9tvv3Gug3+hoKAA7du3R79+/VBcXIzNmzdDVVUVdnZ2aNy4MXr06IH8/HyIxWI4OTnByckJiYmJAMqGAAYHB6Nt27Y8J7iKlf9b3rNnD+bOnYv79+9DLBYjPDwcpqamaNKkCVq3bg1fX1989913SE5Oxp9//omCggKUlpYiLCwMampqQlI0PulXj4SEBGhra6N3794y5QcOHECPHj0wffp05Ofn46effsKSJUsQGhpaSy1lrPrFxMSgRYsWWLVqFYCy887XX38tjPxYsmQJDAwM4O3tjW7dusHR0RGmpqZQVFQU5nCvWLECNjY2ePz4ca3tR10WHByMRo0aoW/fvjA2Noa1tbXM/HlfX1/Y2trK3EAAkJn+yqpeUVERAgICYGBggOPHj8tMdbl16xZcXV3RsWNHZGdn48mTJ7h37x7c3Nxgb2/Po3GrUPn7lEePHuHevXu4f/8+1q1bJ/SjRo8ejSZNmsDKygodO3YU+lm//PILvLy8hKW+WdUpv+oR8J/E/+VnBty4cQPp6ekICgpCw4YNce/ePeTm5qKwsBArVqxAq1atEBkZWeNtZ3+v3gRBgLLI9dSpU7Fo0SIhep2amoru3bujW7duMnXT0tLg7OwMY2NjAGUX7y+//FJIPCjFTyb+d9Io95UrV9CgQQOEh4djzpw5iIuLQ0lJCdLS0qCtrY0vvvhCqNezZ080btwYTk5OsLOzQ/PmzXHixIna3I06SyKRYOjQoWjSpAnmz58vJBDMyMjA1KlT0bp1a4wYMQKzZ89Gp06doKenBx0dHVhaWuLFixd49OgRRowYgaZNm3LeiWq2ePFiWFlZ4dChQzLlS5cuhY2NDdavX19LLWOs5o0bNw7Ozs6Ii4vDw4cPoaioiLlz5yI/Px9//vknVq9eDR8fH0RFReH8+fMAAE9PT3h5eQnb4KSOVU8sFuOnn36CiYmJTEBDT08Pzs7O+PXXXwEAL1++hIWFBfz9/Xlp+xry9u1bvH79GmZmZkKOu5ycHOTm5uLGjRsAyvrDFhYWaNmyJTp37gxdXV14eXnx9b0KlX8AdfbsWYhEInz77bfIy8vD8+fP8ebNGwwYMACOjo64d+8eioqKoKysjICAAGRlZeHNmzc4c+YMP5StIpcuXcLOnTuFkf8SiQRv3rxBz5498dtvv8nU9fX1RfPmzfHw4UNkZGSgf//+aNasGczNzdGtWze+X/mI1asgyK1btyASiSAvL48zZ84I5RcuXICamhqWLVsmUz82NhaLFi0CUBbl27t3L5/0P1D5z6+4uBgbNmyASCSCkZGRTG6VQ4cOQSQSCU+JXrx4gejoaHz//fcICwvj76EahYSEwNLSstJpE6dPn0bfvn0xaNAgoezFixc4f/68zNPT06dPo1evXrhz5w4HCqtRUVERevbsieHDh8vMx3758iX69OmD1atX12LrGKt+EolEeDL38OFDuLm5wdfXF2/fvsWPP/4IfX197Nixo9Kbg9evX6Nnz574/vvvZcp5+l7ViYuLw4YNG5CYmCis2nbmzBmYmJjAzMwMHTt2xPDhw4Xr/549e6CiooK4uLhabHX98OWXX2LSpEm4ePEiOnXqhOnTp+OHH37A6NGjYWlpiYYNG2Lw4MEAyhI5Hj9+HHv27MGpU6dqt+F1VHFxMUJCQrBp0yZhOr7UhQsXYGZmJoyIfvDgAXR1daGkpISIiAgOflQxX19ftGvXTibgkZKSAktLS+Hn7OxsWFlZoWvXrrh27ZrM+/ft24dt27Zh06ZNfD35iNXJIMjfnQx27NgBkUgk8+S0pKQE4eHhaNCggUzSND6pVC3pzXBBQQHGjx+PmTNnIisrC/7+/tDR0UFGRoZMvYkTJ0JPT0+Ym8qql1gsRklJCVxdXTFlyhShDJANXm3fvh0WFhYyyxlKSZ+i8km/5qSlpaFTp05YunSpzFPsFy9e1GKrGKtZJ06cwIoVK+Du7g4dHR3hocbgwYPh4OAg3DwAZUtL/vzzzzA2Nkb37t05gWA1KSwshKOjIyZNmoSCggIUFRUhISEBRkZGwvUjPDwc6urqWL58uXD+unr1am02u96YP38+rKyshMUBOnToAGNjYyxZsgSRkZFITEyESCTip9g15MiRI1BUVISqqqowzUVqw4YNaNu2rZDvaNeuXVi6dCk2bNggM32JfRhpn/fNmzfo3Lkz/Pz8cOvWLQBl5ypHR0eh7pMnTxAXFycE4cu/n30a5KiOEYvFJCdXtltxcXG0efNmOnDggPC6n58fDRgwgObMmUPPnz8nIiIFBQUaOXIkubi4UJ8+fYS60u0AqLkdqMNEIhGdO3eO2rRpQ/fv3yd7e3siIvrmm2+opKSEvvvuO6EeEdH69etJXl6eJk2aRG/fvq21dtdFYrG4QpmcnBwpKCjQ06dPSVVVVeY1BQUFIiIqKSkhb29v6tatG6WmplJBQYFMPUVFRSIikpeXr6aWs3d16NCBxo0bRwcOHKCdO3cK5U2aNKnFVjFWczZu3EgeHh5UVFREtra2pKenRxs3bqT4+HjauHEjZWdn088//0xPnjyh7OxsOnjwIIWFhdGwYcPozJkz1LRpU5JIJLW9G5806ecn7S+VlpZSgwYNaODAgRQbG0vKysqkpKREsbGxZGxsTEuWLCGismuLnJwcxcTEUGJiIhERWVpa1s5O1AMvXrwQ/r9s2TJq3bo1HT16lKysrCg5OZlu3bpFX331FQ0fPpyaNm1KNjY21Lhx41pscd0DoNLzjY2NDS1atIgKCwtJRUWFiIiKioqIiGjo0KGUl5dH/v7+5ObmRn5+fmRsbEwTJ04kDQ2NGm1/XSb9bho1akTBwcF0+vRp2rdvH5WWllJycjLZ2NgI9Zo3b07u7u6kpKQkvF963yitwz5ytRmBqS7SnAY6Ojqwt7dHs2bN8PnnnwtPRp8+fQodHR1MnDhRJmqXmpqKvXv31laz67y3b9/C29sbM2bMqPDajh07IC8vL8wNlo4GSU5Oxrp162q0nXVd+b/56OhoREZG4tSpU8Joj2nTpsHa2loYgVM+h8v+/fsBgBMHfmTEYjEGDBiAo0eP1nZTGKtx7u7uMonL37x5A0dHR3h4eODZs2eIjY2Fvr4+1q9fD7FYjKysLJmlWHnkWtWR5pWQunjxIiwsLHDo0CGUlJTAx8cHI0aMEEbfTJ48GeHh4TLLsrKqV1paCnd3d8ydO1cmt92tW7dgYWGB8ePHC6siZWZm4vz587CysoKHhwfy8vJqq9l1Tvlzzb179xAXF4e7d+8K/bK0tDS4uLigU6dOQj1pXorExEQEBwcjICAAf/zxR802vI57dwlv6ai0WbNmoWPHjti3bx/c3d0rJG1mn7Y6FwR5/fo1Ro0aBUdHR2F6hTTJ0NKlS4VhY/v370eDBg2wa9eu2mxuvfLo0SM0b95cyPMhDXRITzzDhw9H+/bthc4p55KoPq9evYKjoyOaN2+Orl27QkFBAf7+/nj06BEuXLgAJycneHl5QSKRoKCgANnZ2XB1dcXYsWORn58vbIdvHj4enCeH1TcSiQTPnz9H586dhfw30nPSr7/+CjU1NSHoHhAQgDZt2sisZvFu1n/270kkEqxbtw4ikQghISFCjo/MzEyYmJhg8+bNAICwsDC0bt0aXbp0QYcOHWBqaopnz57VYsvrj/3798PU1FR4mCG1efNmaGpqIiIiAocOHcK0adOgra2NyZMn105D64HFixejZcuWaN++PczMzDBx4kThtWPHjkFPTw/z5s0DwP2s6lb+GpCSkgJ3d3d88803QpmDgwOMjIwgEonQsmVL9O/fH9988w2ioqJw6dIlYboM+/R88kGQdzsw2dnZWL16tfBHuXnzZmhra6Nz585QVFTE/v37hZsFX19faGtrV1jxhVWPa9euQUtLCwkJCQBkRyTk5+cjOzsbzZo1w6BBg7hjWsWkF1GxWIzS0lIEBQXB1dUV2dnZkEgk2LVrF5ycnDBkyBAAZUmdOnTogGbNmsHJyQk6Ojrw9PSUCYAwxtjHoHv37vDx8QEge8Nga2sLAwMDbN68GSUlJbhw4UJtNbFeKCkpwdatW2FhYYFevXoJT6unTJkCGxsboV50dDQWLlyI5cuX11ZT663Ro0fDw8OjQt6Vtm3bwtXVFREREYiNjcWlS5dqqYV1W0FBAaZOnQpjY2OcOHECeXl52LNnD0QiEX788UcAZQ9zV69eLdNf5kBI9QsLC4OysjJmzpyJyMhI4d7wxo0b0NXVha+vL77//nssXLgQgwcPRocOHaCsrIydO3fWcsvZv/XJBkHKnxDKJ6UBIKySsGzZMhgaGgonlu7du6N79+5CFt+CggLcvn27hlrMAKBLly7o27dvhfKff/4ZR44cQVJSkszKPezDiMVimWCT9LhxcHDAtGnTZOpu3boVnTp1Ek7oubm5WL9+PUJCQrB79+4K22CMsY/Bb7/9BgUFBcTExAhlz549g5ubG6ysrPDtt98K5Rxgr36nTp3CwIEDoa2tje3bt2Pbtm1wc3OTSTzPakdBQQEMDQ0xe/ZsYQTO3bt34ezsjFatWmHbtm2128A6RPrQqbzMzExMnjwZly9fBlA2XczIyAjNmjVDgwYNhGnI6enp8PLygra2Np+zakBGRga6du2KrVu3ypRL+8+rV6+GoaEh9u7dK3wfEokEWVlZNd5WVnU+ySBI+RNCeHg4fHx88PXXX+PYsWNC+V9//QVHR0dEREQAKBtp4ObmBpFIJCyfJ8XZfGtOQkICVFRUMGfOHPzxxx94/fo1tm3bBgMDA774VrHyx8np06fRtWtXRERE4PXr1+jevTuWLFkiU+/t27fo0qULgoOD37tNDoAwxj42YrEYc+fORYMGDTB//nzExsYiICAAfn5+MtNfWM2aPHkyevXqBX19fejq6iI5Obm2m8QAXL58GSYmJggICMCZM2cwYsQILFmyRJjCxP69zMxMRERE4OXLl0JZcXExkpKShJEFqampKC0txebNm9GyZUvMnz8fDx48gJWVFZydnYX3nT9/npeKrgaVBZUOHDgAJSUlPHz4UKjz7kPEAQMGoHPnzhVW7mGfrk9ydRiRSETFxcU0a9YsCg4OJm1tbTp8+DANHDiQYmJiiIjo3r17lJSURB06dCCisozY5ubmtGvXLgoICKCGDRsK2yufzZdVL0dHR/rpp58oOjqanJycyM3NjaZPn06LFi2iUaNG1Xbz6hTpKjtfffUV9e3bl3r27Elt27YldXV1sra2ph9//JEePXok1GvYsCEpKipSenr6e7fJq74wxj42cnJytGLFCpozZw6dPn2aAgMD6ebNmxQcHEzt2rUjIuLVX2oQ/n9VhNWrV9OCBQtIU1OTHj9+XOmqZKzmderUiRYtWkQ3btwgX19fSk9Pp4kTJ1KbNm1qu2mfvOTkZFq7di3t37+fiIhOnjxJrVq1omHDhpG9vT0dPHiQTExMSCwWU0xMDM2YMYOWLVtGenp6pKWlRQkJCTRlyhQiIuratSu5u7vX5u7UKRKJhAAIfd7yxGIxtWvXjnJzc4morP8sJydHcnJy9OzZMyIiWrNmDYnFYlJTU6vRdrPqIwI+jTV8xGKxcAN2/vx5io6OpsePH9OSJUvI1NSUXr16RaGhoRQeHk4pKSlkZGRErq6udOPGDXJzc6MTJ05Qnz596KeffiIieu+BwGrG3bt3KSMjg549e0bu7u68nGc1SUlJobFjx1JISAi5urqSRCIhOTk5KioqIgsLCzI3N6d58+ZR586d6fLly+Tn50fLly+ngQMH1nbTGWPsfyYWi+nBgwfUvn174WcO3ta88n2s169fEwDS1NSs3UYxGYWFhXT37l0yNzev7abUKRMnTqT09HQaM2YMRUdHk4ODA7m4uNC8efMoPz+fAgMDydbWllq3bk0XL14ka2trys7Opnnz5pGpqSmpqKjQ5MmTa3s36pTy56P4+HjavXs36enpUadOneizzz6jBw8ekJWVFX311VfCssMAqKCggBYsWEDjx48nY2NjKi4ullkSl33aPvogiPTpjXS0RklJCc2ZM4eioqKoefPmdOXKFaFuUVERubi4kJaWFh05coQKCwvp66+/psePH5OTkxONGTOmVvaBsdoSExNDo0aNovz8fPrjjz8oKSmJkpKSSF5eniwtLSkiIoLy8vLIyMiIUlJSaPDgwbRly5babjZjjH0wDoDUPmkXkx86sfoiLy+PPDw8SFNTkxo3bkzbt28nBQUFevz4MU2YMIGIiObPn0/ffPMN3bp1iwIDA2nLli1kYGBAO3fuJFVV1Vreg09fQUEBFRYWkpaWlkwAZNasWbRx40by8vKiR48eUVJSEgUHB9OXX35Ja9asoVWrVtGsWbPI29ublJWVae3atbRnzx6KjIyk7t271/Jesar2UQdByv/hJiQk0OzZs2nKlCnk4uJCQUFBFB8fT4mJiWRqaip0drZs2UJr166lI0eOUOvWrYlItiPEnSJWn7x69YqsrKxISUmJ8vPzqWvXrqSsrEw3btygDh06UFBQEGVnZ9O9e/fIysqKXFxciIiEESOMMcYYY+yfO3/+PPXr149sbGwoLi5OKI+NjaVVq1aRtbU1DRs2jFavXk0ZGRlkZ2dHERERtdjiugEAZWVlUZ8+fWjMmDE0adIkYeRGamoqeXl50caNG8nNzY2IiMLCwig4OJi+//57GjhwIAUFBdGJEycoMzOTdHR0iIhoz5491LFjx1rbJ1Z9FGq7AX+nfE6DiIgICgwMpMaNG5O+vj4FBARQZmYmhYaG0tatW4XAxrNnz6hBgwakp6cnbEdeXl4IqHAAhNUnmpqa9Pvvv9P+/fupS5cu1LRpU2rXrh0dPXqUJkyYQK1atSI7OzuhPsqSJXMAhDHGGGPsX7C3t6dp06bRgQMH6PDhw9SvXz8iIvrss8/o6tWr9Ouvv5KxsTHt2rWLcnNzSUtLq5ZbXDeIRCLS19cnExMTiomJISsrK3J2diaisnwthYWFZG1tLTzomzFjBp08eZJCQ0Np4MCB9O2331JOTg798ccfVFxcTJ6enrW7Q6xafdRBEKKynAbHjh2jgwcPkqurqzC00sPDg1JTU2njxo00ceJEGj16NCkoKNAvv/xCtra2JBaLSU5OTgik8FBMVl+1atWKAgMDhZ8LCwtpx44d1K1btwrDLkUiER8rjDHGGGMfYN68efT7779TTEwMmZiYkKGhIRERTZ06lS5cuEAFBQVERBwAqUKlpaWkoKBAW7dupW7dutGPP/5Iurq61L59ezIwMKCnT59STk4OaWlpUUFBAamoqNCKFSvIzs6OUlNTydTUlJo3b07Nmzev7V1hNeCjng5D9P6cBhKJhAYMGED79++nqKgo6tixI+np6VGjRo1ox44dtd1sxj46586do5MnT1J0dDQ1bNiQDh48SLq6urXdLMYYY4yxOufWrVs0bNgw8vb2prlz55KioiIREeXk5PCCAFVIuvKLvLy8kPbgyJEjNG7cOJoxYwZNnDiR8vPzaejQoaSmpkYHDhwQ3nvgwAGaPXs2nTp1SmYWAav7Pvox77179yYdHR0yNjamPn360LFjx6igoIBSUlJo69atNGDAAHJ0dCRjY2NatWqVEADhpdgY+w8AJJFIKDU1lQICAujSpUukq6vLy0YyxhhjjFWDDh060Lhx4+jAgQO0c+dOoZwDIB8uKyuLvvvuO8rNzSU5OTmSl5enkpISSk5OppycHOrbty+NHTuWNm3aRAkJCaStrU1jx46l69ev07Rp0+j27dv09OlTioyMpLZt2worwrD646OfDvN3OQ0mTpxIkZGR9OTJE9q+fTvt27eP5s6dS0TEuT8YK0ckElH37t2pU6dO1KhRIyLiJMGMMcYYY9Vp3LhxFBcXJyTaZFUjOTmZ1q5dS6qqqhQQEEAnTpwgX19fUlNTI5FIRL6+vrRs2TI6d+4cfffdd2RkZESDBg0iIqJp06ZRbGwslZaWkp6eHh06dIjU1NRqeY9YTfvop8NUprCwkAICAqikpISio6OpqKiIvvrqKzp58iQFBwdT//79a7uJjH3Uyq+8xBhjjDHGqoc0VwWrWhMnTqT09HQaNWoURUZGkqurK/Xq1YsOHjxIW7ZsIR8fH5o1axbZ2trSqFGjaNasWaSlpUWPHj2ily9fUk5OjrBSDKt/PqkgyN/lNLh8+TJt2LCBgoKCyMTEpJZbyhhjjDHGGGOsOuTl5ZGHhwdpamqSvLw87d69m5SVlQkAHTx4kAYOHEhnz56lu3fv0pIlS2jJkiU0bNgwXgGREdEnFAQBQGfPnqX169eTjY0NzZo1i4h4SD9jjDHGGGOM1Tfnz5+nvn37Uvv27SkpKUkoz8vLo6lTp1Jubi7FxsaSs7MzFRYW0p49ezgBKiOiTyAniBTnNGCMMcYYY4wxRkRkb29PM2bMoMjISNq/fz95e3sTEZG6ujqpqanR/fv3iYgoMjKSsrOzOQDCBJ/UeCCRSCQEQKRLITHGGGOMMcYYq3/mzJlD+vr69PPPP9OdO3eE8rdv35Kuri6JxWLS19cnGxubWmwl+9h8MtNhGGOMMcYYY4yx8m7fvk29e/cmBQUF6t+/P7148YJ27dpFhw4dInd399puHvsIfVIjQRhjjDHGGGOMMSljY2NavHgxZWdn0+PHj8nS0pIyMzM5AMLei0eCMMYYY4wxxhj7ZEkkEvLx8aGZM2eSo6NjbTeHfeQ4CMIYY4wxxhhj7JNWWlpKCgqfzLofrBZxEIQxxhhjjDHGGGP1AucEYYwxxhhjjDHGWL3AQRDGGGOMMcYYY4zVCxwEYYwxxhhjjDHGWL3AQRDGGGOMMcYYY4zVCxwEYYwxxhhjjDHGWL3AQRDGGGOMMcYYY4zVCxwEYYwxxj5Rzs7ONH369L+t06ZNG1q7dm2V/c6q3h5jjDHGWE3iIAhjjDHGWA35J4ErxhhjjFUfDoIwxhhjrMaIxWKSSCS13QxG/F0wxhirnzgIwhhjjH3CSktLacqUKaSpqUlNmjShBQsWEID31s/IyCAvLy9q1KgRqaur0+DBgyk7O1umTmxsLNnY2JCysjI1bdqUfHx83ru9bdu2kYaGBh0/frzS17dv306ampp0+PBhMjU1pQYNGtCjR4+ouLiYvvzyS9LV1SVVVVXq0qULnT59WnhfTk4O+fr6kp6eHjVs2JDMzc0pKipKZtt79uwhc3NzUlFRoSZNmpCbmxu9ffuWiIgkEgktXbqU9PT0qEGDBmRlZUXHjh0T3vvw4UMSiUS0b98+cnFxoYYNG5KlpSWdP3/+vftKRPTq1SsaN24c6ejokLKyMpmZmdHhw4f/UZtHjRpFCQkJFB4eTiKRiEQiET18+JCIiFJTU8nT05MaNWpEOjo6NGLECHrx4oXw3jdv3pCfnx+pqqpSixYtKCwsrMKoktzcXPL39yctLS1q2LAh9enTh+7evfu338WZM2dIUVGRnj59KrOfQUFB5Ojo+LefBWOMMfYp4iAIY4wx9gn76aefSEFBgZKSkigiIoLCwsJoy5YtldYFQAMGDKCXL19SQkICHT9+nO7fv09DhgwR6hw5coR8fHyob9++dOXKFTp58iTZ2NhUur3Q0FCaNWsWxcXFUa9evd7bxvz8fFqxYgVt2bKFbt68Sc2aNaPRo0fTuXPnKDo6mq5fv06DBg0iDw8P4aa9sLCQrK2t6fDhw/THH3/QuHHjaMSIEZSUlERERE+ePCFfX18KCAigtLQ0On36NPn4+AgBoPDwcFq9ejWFhobS9evXqXfv3vTZZ5/JBAWIiObPn0+zZs2iq1evkpGREfn6+lJpaWml+yGRSKhPnz6UmJhIO3bsoNTUVPr2229JXl7+H7U5PDyc7O3taezYsfTkyRN68uQJ6evr05MnT8jJyYmsrKzo0qVLdOzYMcrOzqbBgwcLv3vmzJl07tw5io2NpePHj9OZM2fo8uXLMu0bNWoUXbp0iWJjY+n8+fMEgDw9PamkpOS934WNjQ21bduWIiMjhTqlpaW0Y8cOGj169Hu/U8YYY+yTBcYYY4x9kpycnGBiYgKJRCKUzZkzByYmJsLPrVu3RlhYGAAgPj4e8vLyyMjIEF6/efMmiAjJyckAAHt7e/j5+b33d0q3N3fuXLRo0QLXr1//2zZu27YNRISrV68KZffu3YNIJMKff/4pU9fV1RXz5s1777Y8PT0RFBQEAEhJSQER4eHDh5XWbdmyJZYvXy5TZmtri0mTJgEA0tPTQUTYsmWL8Lr0s0hLS6t0m3FxcZCTk8Pt27f/Zo/f32ag7DsLDAyUqbNw4UK4u7vLlGVmZoKIcPv2beTl5UFRURG7d+8WXn/16hUaNmwobOvOnTsgIpw7d06o8+LFC6ioqGDXrl0AKv8uAGDlypUyfzMHDhxAo0aN8Ndff/3j/WSMMcY+FTwShDHGGPuEde3alUQikfCzvb093b17l8RicYW6aWlppK+vT/r6+kKZqakpaWpqUlpaGhERXb16lVxdXf/2d65evZo2bdpEZ8+eJXNz8//aRiUlJbKwsBB+vnz5MgEgIyMjatSokfAvISGB7t+/T0Rl+SqWL19OFhYW1KRJE2rUqBHFx8dTRkYGERFZWlqSq6srmZub06BBg+iHH36g3NxcIiLKy8ujx48fk4ODg0w7HBwchP2UKt+uFi1aEBHRs2fPKt2Pq1evkp6eHhkZGVX6+n9r8/ukpKTQqVOnZD6LDh06EBHR/fv36cGDB1RSUkJ2dnbCezQ0NMjY2Fj4OS0tjRQUFKhLly5CWZMmTcjY2Fhmn9/9LojKRpDcu3ePLly4QEREW7dupcGDB5Oqqurftpsxxhj7FCnUdgMYY4wxVjMAyARMKitXUVH5r9vp0aMHHTlyhHbt2kVz5879r/VVVFRkfq9EIiF5eXlKSUkRppJINWrUiIjKAi1hYWG0du1aMjc3J1VVVZo+fToVFxcTEZG8vDwdP36cEhMTKT4+nr777juaP38+JSUlUZMmTYiIKuxrZfuvqKgo/F/62vuShf63z+a/tfl9JBIJ9e/fn1auXFnhtRYtWghTeCrbn8r+/26d8u9797sgImrWrBn179+ftm3bRm3btqWjR4/K5GdhjDHG6hIeCcIYY4x9wqRP78v/3L59+wrBBaKyUR8ZGRmUmZkplKWmptLr16/JxMSEiMpGRpw8efJvf6ednR0dO3aMgoODKSQk5H9uc6dOnUgsFtOzZ8+oXbt2Mv+aN29ORERnzpwhLy8vGj58OFlaWlLbtm0r5PMQiUTk4OBAS5YsoStXrpCSkhLt37+f1NXVqWXLlnT27FmZ+omJicJ+/hsWFhaUlZVFd+7cqfT1f9JmJSWlCqN0OnfuTDdv3qQ2bdpU+DxUVVXJ0NCQFBUVKTk5WXhPXl6ezLZNTU2ptLRUyD9CVJao9c6dO/9on8eMGUPR0dG0adMmMjQ0rDCKhjHGGKsrOAjCGGOMfcIyMzNp5syZdPv2bYqKiqLvvvuOAgMDK63r5uZGFhYW5OfnR5cvX6bk5GTy9/cnJycnIfnp119/TVFRUfT1119TWloa3bhxg1atWlVhW/b29vTrr7/S0qVLKSws7H9qs5GREfn5+ZG/vz/t27eP0tPT6eLFi7Ry5Uo6evQoERG1a9dOGOmRlpZG48ePl1nBJCkpiYKDg+nSpUuUkZFB+/bto+fPnws3/LNnz6aVK1dSTEwM3b59m+bOnUtXr15972fzTzg5OZGjoyMNHDiQjh8/Tunp6fTrr78Kq878tzYTEbVp04aSkpLo4cOH9OLFC5JIJDR58mR6+fIl+fr6UnJyMj148IDi4+MpICCAxGIxqamp0ciRI2n27Nl06tQpunnzJgUEBJCcnJwwqqN9+/bk5eVFY8eOpbNnz9K1a9do+PDhpKurS15eXv9133r37k0aGhq0bNkyTojKGGOsTuMgCGOMMfYJ8/f3p4KCArKzs6PJkyfT1KlTady4cZXWFYlEdODAAdLS0iJHR0dyc3Ojtm3bUkxMjFDH2dmZdu/eTbGxsWRlZUU9e/aUGV1QnoODAx05coQWLlxIERER/1O7t23bRv7+/hQUFETGxsb02WefUVJSkpCvZOHChdS5c2fq3bs3OTs7U/PmzWnAgAHC+9XV1en3338nT09PMjIyogULFtDq1aupT58+REQ0bdo0CgoKoqCgIDI3N6djx45RbGwstW/f/n9q57v27t1Ltra25OvrS6ampvTll18KIzv+W5uJiGbNmkXy8vJkampK2tralJGRQS1btqRz586RWCym3r17k5mZGQUGBpKGhgbJyZV11dasWUP29vbUr18/cnNzIwcHBzIxMSFlZWWZz9Ta2pr69etH9vb2BICOHj0qM+XnfeTk5GjUqFEkFovJ39//gz4jxhhj7GMmwvsmkTLGGGOMsY/S27dvSVdXl1avXk1ffPFFlWxz7NixlJ2dTbGxsVWyPcYYY+xjxIlRGWOMMcY+cleuXKFbt26RnZ0dvX79mpYuXUpE9I+muvw3r1+/posXL9LOnTvp4MGDH7w9xhhj7GPGQRDGGGOMsU9AaGgo3b59m5SUlMja2prOnDlDTZs2/eDtenl5UXJyMo0fP5569epVBS1ljDHGPl48HYYxxhhjjDHGGGP1AidGZYwxxhhjjDHGWL3AQRDGGGOMMcYYY4zVCxwEYYwxxhhjjDHGWL3AQRDGGGOMMcYYY4zVCxwEYYwxxhhjjDHGWL3AQRDGGGOMMcYYY4zVCxwEYYwxxhhjjDHGWL3AQRDGGGOMMcYYY4zVCxwEYYwxxhhjjDHGWL3wfx2lWFe386VnAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "saved -> blocked_reason_by_state.png\n" ] } ], "source": [ "\n", "import matplotlib.pyplot as plt\n", "\n", "# block reasons for the indefinitely-blocked subset\n", "blk = pd.read_json(ROOT / \"analysis/diagnose_missing_mentors/block_status.jsonl\", lines=True)\n", "ib = h[h[\"reason\"] == \"3_indef_blocked\"].merge(\n", " blk[[\"uid\", \"reason\"]].rename(columns={\"reason\": \"block_reason\"}),\n", " on=\"uid\", how=\"left\")\n", "print(f\"indefinitely blocked: {len(ib)}\")\n", "\n", "# ---- bucket the messy free-text / template block reasons ----\n", "def bucket(text):\n", " t = (text or \"\").lower()\n", " if \"checkuser\" in t: return \"checkuser\"\n", " if \"sock\" in t: return \"sockpuppet\"\n", " if \"spam\" in t or \"advertis\" in t or \"promot\" in t or \"paid\" in t: return \"spam/promo\"\n", " if \"username\" in t or \"ublock\" in t: return \"username\"\n", " if \"vandal\" in t or \"voa\" in t: return \"vandalism\"\n", " if \"nothere\" in t or \"not here\" in t: return \"not-here\"\n", " if \"disrupt\" in t: return \"disruption\"\n", " if \"harass\" in t or \"personal attack\" in t or \"npa\" in t: return \"harassment\"\n", " if \"lta\" in t or \"long-term abuse\" in t: return \"LTA\"\n", " if \"block evasion\" in t or \"evasion\" in t: return \"block-evasion\"\n", " if t.strip() == \"\": return \"(empty)\"\n", " return \"other\"\n", "\n", "ib[\"cat\"] = ib[\"block_reason\"].map(bucket)\n", "\n", "# ---- count: category x state ----\n", "tab = ib.pivot_table(index=\"cat\", columns=\"mentorshipState\",\n", " aggfunc=\"size\", fill_value=0)\n", "tab = tab.loc[tab.sum(axis=1).sort_values(ascending=False).index] # sort by total\n", "print(\"\\ncategory x state:\")\n", "print(tab.to_string())\n", "\n", "# ---- stacked bar plot ----\n", "ax = tab.plot(kind=\"bar\", stacked=True, figsize=(11, 6))\n", "ax.set_xlabel(\"block reason category\")\n", "ax.set_ylabel(\"number of users\")\n", "ax.set_title(\"Indefinitely-blocked no_row users (asked a question) \u2014 block reason by mentorshipState\")\n", "ax.legend(title=\"mentorshipState\")\n", "plt.xticks(rotation=35, ha=\"right\")\n", "plt.tight_layout()\n", "plt.savefig(ROOT / \"analysis/diagnose_missing_mentors/blocked_reason_by_state.png\", dpi=130)\n", "plt.show()\n", "print(\"\\nsaved -> blocked_reason_by_state.png\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 8 \u2014 Authoritative five-reason \u00d7 `mentorshipState` classification of all 552,377 `no_row` users\n", "\n", "This cell produces the authoritative reason-by-state table for the entire `no_row` population. Each user is assigned exactly one of the five reasons, in this precedence order: `5_deleted` if `reg_ts` is missing; otherwise `1_pre_rollout` if `reg_ts < 2021-06-01`; otherwise `2_autocreated` if `is_self == False`; otherwise `3_indef_blocked` if the user is in the indef-blocked set from cell 7; otherwise `4_residual`. The result is cross-tabulated against `mentorshipState`.\n", "\n", "Printed reason \u00d7 `mentorshipState` totals:\n", "\n", "| reason | 0 | 50 | unset | total |\n", "|---|---|---|---|---|\n", "| 1_pre_rollout | 0 | 0 | 524,323 | 524,323 |\n", "| 2_autocreated | 0 | 0 | 0 | 0 |\n", "| 3_indef_blocked | 11,409 | 4 | 9,561 | 20,974 |\n", "| 4_residual | 165 | 0 | 464 | 629 |\n", "| 5_deleted | 26 | 0 | 6,425 | 6,451 |\n", "\n", "A sum check inside the cell confirms the column sums match `no_row` per state (0: 11,600; 50: 4; unset: 540,773; total 552,377). The figure is saved to `no_row_reason_by_state.png` and the table to `no_row_reason_by_state.tsv`.\n", "\n", "Two observations from this table are used downstream: reason 1 (pre-rollout) is entirely within `unset`, consistent with state `0` not appearing in the data before 2021-09; indefinitely-blocked users are concentrated in state `0` (11,409) and state `unset` (9,561), with only 4 in state `50`.\n" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "indefinitely-blocked uids in block_status: 20,974\n", "total no_row users: 552,377\n", "mentorshipState\n", "0 11600\n", "50 4\n", "unset 540773 \n", "\n", "=== reason x mentorshipState ===\n", "mentorshipState 0 50 unset total\n", "reason \n", "1_pre_rollout 0 0 524323 524323\n", "2_autocreated 0 0 0 0\n", "3_indef_blocked 11409 4 9561 20974\n", "4_residual 165 0 464 629\n", "5_deleted 26 0 6425 6451\n", "\n", "sum check: 552,377 (should equal total no_row above)\n" ] }, { "data": { "image/png": "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fSi/nJTndu/e3aV9+PDhJsni4uLMzGzTpk2XXS8l2L766qtpeVlc9tm+fXuXdnf2UbhwYevUqZOZXfignTVrVnvllVdMkv39999mdiGA+fv724kTJ9JcW3oqWrSo+fr62ubNm13an376acuWLZuzzhQjR440SS7h8GJJSUl2/vx5Gzx4sOXJk8eSk5PNzOzrr782SbZ27dor1jJ27FiTZNOmTXNpf/vtt02SSyBO63l3JVu3brUcOXLY/fffb/PnzzcfHx97/fXXr/m8lNBYqVIlS0pKcraPHj3aJNm9997rsn7Pnj1Nkh07dszMLvwe+fn52XPPPeey3vHjxy1//vz28MMPO9s6dOhw2dejefPmVrp0aefjQ4cOmSQbMGBAqnpr1qxp+fLls+PHjzvbEhMTrUKFCla4cGHnz+dK57uZWbZs2axnz55XfV3q1atnkmzlypUu7eXKlbOmTZs6H18tdPfq1cvluVOmTDFJ9vnnnzvbZs+ebXnz5jVJJsny5MljDz30kH3//fcuz42NjU21nytJTEy0EydOWNasWe29995ztn/11VcmyRYsWOCy/smTJy137typvkxJSkqySpUqWfXq1a+6v5T3iou/tLic5ORkO3/+vC1atMgk2R9//OFcdr2hOy2/h1c7ny6VmJho586ds1KlSrn8/K72+pcpU8aqVKli58+fd2lv2bKlFShQwPl7VaFCBbv//vuvWYOZWe3ata1GjRppWhdAxsTwcgAZVq5cuVSpUiXndd2LFi2Sr6+vateuLUmqV6+ec8je1a7nbtCggbJnz+58HBYWpnz58rkM12zbtq3y5cunmJgYZ9v777+v0NBQPfLII2mq995773V5HBERIUnO/aTUePHQWkmqXr26ypYtm+ahnxdr3bq1y2N39tGoUSPnENzly5fr1KlTeuGFF5Q3b17NmzdP0oUhqinDjK8kOTlZiYmJ1/UvLde5RkRE6M4773RpmzVrlho0aKCCBQu6bK9Zs2aSLpwrKX755RfdfffdCgkJka+vr/z9/dW/f3/Fx8c7h1ZXrlxZAQEB6tq1qyZPnqwdO3akquOXX35R1qxZ1aZNG5f2lNf60p9fWs67K7njjjv08ccfa8aMGWrZsqXq1KnjMvz1Wpo3b+4czixJZcuWlaRUE4SltO/evVuS9OOPPyoxMVHt27d3eV2DgoJUr169VHMsOBwOtWrVyqUtIiIiTcd48uRJrVy5Um3atFG2bNmc7b6+vmrXrp327t2rzZs3uzzn0vNdunBuT5o0SUOGDNGvv/6q8+fPX3Z/+fPnV/Xq1a+rVkl6/PHHXR4//PDD8vPzcxk23Lx5c+3evVvffvutevfurfLly2vGjBm6995703wXhRMnTuiVV17RHXfcIT8/P/n5+Slbtmw6efKkNm3adM3nL1++XEeOHFGHDh1S/a7dc889io2Nvepw8JRLYvLly5dq2Y4dO/TYY48pf/78zt+levXqSVKaaruWtPweXk1iYqKGDh2qcuXKKSAgQH5+fgoICNDWrVvTVN+2bdv0119/OX/WF79+zZs3V1xcnPOcrF69un744Qf16dNHCxcu1OnTp6+43Xz58mnfvn1uHQuAjIXQDSBDa9CggbZs2aL9+/drwYIFioyMdH5Ar1evntasWaNjx45pwYIF8vPz03/+859U28iTJ0+qtsDAQJcPSYGBgXr66af1xRdf6N9//9WhQ4c0bdo0PfXUUwoMDExTrZfuJ+V5Kfu52jWfBQsWdC53x6Xbcmcfd999t3bv3q2tW7dq/vz5qlKlivLly6eGDRtq/vz5On36tJYvX6677777qjUMHjxY/v7+1/Vv8ODBbh+jJP3zzz+aOXNmqu2VL19eknT48GFJ0qpVq9SkSRNJ0scff6xly5YpNjZWr732mqT/+9mULFlS8+fPV758+RQdHa2SJUuqZMmSeu+991xe2/z586eaDClfvnzy8/NL9fNLy3l3NS1atFBYWJjOnDmjF154Qb6+vml6niTlzp3b5XFAQMBV28+cOSPpwusqSdWqVUv12k6dOtX5uqYIDg5WUFCQS1tgYKBze1dz9OhRmdkVz1VJqV7Ty607depUdejQQePHj1etWrWUO3dutW/fXgcOHHBZ70Z/Hvnz53d57Ofnpzx58qSqMUuWLLr//vs1YsQILVq0SNu2bVO5cuUUExOjDRs2XHM/jz32mD744AM99dRT+vHHH7Vq1SrFxsYqNDQ0TbWm/AzbtGmT6mf49ttvy8x05MiRKz4/ZR+X/lxPnDihOnXqaOXKlRoyZIgWLlyo2NhYTZ8+3eV5NyItv4dX88ILL6hfv366//77NXPmTK1cuVKxsbGqVKmSW69d7969U7123bt3l/R/7y3//e9/9corr2jGjBlq0KCBcufOrfvvv19bt25Ntd2goKB0eX0A3LqYvRxAhtagQQONGjVKCxcu1MKFC9W8eXPnspSAvXjxYufkOBf3mLnrmWee0VtvvaVPPvlEZ86cUWJiorp163bDx5Ai5UN/XFycChcu7LJs//79yps3r9vbvDQAurOPRo0aSbrQmz1v3jw1btzY2f76669r8eLFOnv27DVDd9euXdWyZUu3a5f+L1xdzeVm/M2bN68iIiL05ptvXnW7X375pfz9/TVr1iyXEDFjxoxUz6lTp47q1KmjpKQk/fbbb3r//ffVs2dPhYWF6dFHH1WePHm0cuVKmZlLTQcPHlRiYuJ1/fyuplu3bjp+/LjKly+vHj16qE6dOsqVK1e67uNSKcfw9ddfe/xWUbly5ZKPj89lJ4ZL6W299DW90rkwevRojR49Wrt379b333+vPn366ODBg5o7d2661XvgwAEVKlTI+TgxMVHx8fGXDfMXK1KkiLp27aqePXtqw4YNzi+GLufYsWOaNWuWBgwYoD59+jjbz549e9WgfLGU1+z999+/4kzsYWFh13z+pfv75ZdftH//fi1cuNDZuy1J//77b5rqSqtr/R5ezeeff6727dtr6NChLu2HDx9Wzpw5r7nvlGPv27evHnzwwcuukzK5XNasWTVo0CANGjRI//zzj7PXu1WrVvrrr79cnnPkyJF0f38AcGshdAPI0OrWrStfX199/fXX2rBhg4YPH+5cFhISosqVK2vy5MnatWuXHnvssRvaV4ECBfTQQw/pww8/1Llz59SqVSsVKVLkRg/BqWHDhpIufDBMmT1XujCj8qZNm5y9rzdrHwUKFFC5cuX0zTffaPXq1c4Pqo0bN9bTTz+tUaNGKUeOHC7buZyCBQumKTynp5YtW2rOnDkqWbLkVYOow+GQn5+fSy/x6dOn9dlnn13xOb6+vqpRo4bKlCmjKVOm6Pfff9ejjz6qRo0aadq0aZoxY4YeeOAB5/qffvqppP/7EiM9jB8/Xp9//rk++eQT1atXT3fddZeefPLJy35ZkJ6aNm0qPz8/bd++/bJDua/HpSM+UmTNmlU1atTQ9OnTNXLkSOdt4JKTk/X555+rcOHCqS4ruJYiRYro2Wef1c8//6xly5alS/0ppkyZosjISOfjadOmKTExUfXr15ckHT9+XA6H47Jf/KUMbU75PbnSa+JwOGRmqUbXjB8/XklJSS5tV9pG7dq1lTNnTm3cuDHNQ9ovlnLJwfbt21PVdvF+U3z00Udu7yMtrvR7eKXjTqnx0vpmz56tffv26Y477nC2XWkbpUuXVqlSpfTHH3+kCu5XExYWpo4dO+qPP/7Q6NGjderUKQUHBzuX79ixQxUqVEjz9gBkPIRuABlayi2eZsyYIR8fH+f13Cnq1aun0aNHS0qf+3M///zzqlGjhiRp4sSJN7y9i5UuXVpdu3bV+++/Lx8fHzVr1ky7du1Sv379FB4erl69et30fTRq1Ejvv/++smTJ4nxtixcvruLFi+unn37SvffeKz+/W+9PyeDBgzVv3jxFRUWpR48eKl26tM6cOaNdu3Zpzpw5Gjt2rAoXLqwWLVpo1KhReuyxx9S1a1fFx8dr5MiRqT6Yjx07Vr/88otatGihIkWK6MyZM/rkk08kydnT3759e8XExKhDhw7atWuXKlasqKVLl2ro0KFq3rz5NUcEpNW6devUo0cPdejQQU8++aQkacKECWrTpo1Gjx6tnj17pst+LqdYsWIaPHiwXnvtNe3YsUP33HOPcuXKpX/++UerVq1y9u65I3v27CpatKi+++47NWrUSLlz51bevHlVrFgxDRs2TI0bN1aDBg3Uu3dvBQQE6MMPP9T69ev1v//975r3NT527JgaNGigxx57TGXKlFH27NkVGxuruXPnXrGn8npNnz5dfn5+aty4sTZs2KB+/fqpUqVKevjhhyVJmzdvVtOmTfXoo4+qXr16KlCggI4eParZs2dr3Lhxql+/vqKioiRdGEadJUsWTZkyRWXLllW2bNmcX17VrVtXI0aMcL5GixYt0oQJE1L11KaEuHHjxil79uwKCgpS8eLFlSdPHr3//vvq0KGDjhw5ojZt2ihfvnw6dOiQ/vjjDx06dEhjxoy54nEWLlxYJUqU0K+//qoePXo426OiopQrVy5169ZNAwYMkL+/v6ZMmaI//vgj3V7jtPweXu18atmypSZNmqQyZcooIiJCq1ev1ogRI1KN+rna6//RRx+pWbNmatq0qTp27KhChQrpyJEj2rRpk37//Xd99dVXkqQaNWqoZcuWioiIUK5cubRp0yZ99tlnqlWrlkvgjo+P19atW/Xcc8+l2+sE4Bbk3XncAODGvfzyyybJqlatmmrZjBkzTJIFBATYyZMnUy2XZNHR0anaixYtah06dLjs/ooVK2Zly5ZNc30pMyvHxsa6tC9YsCDV7MJJSUn29ttv25133mn+/v6WN29ee+KJJ5y3q7nRfbq7j++++84kWePGjV3au3TpYpLsv//9r1t1pbeiRYtaixYtLrvs0KFD1qNHDytevLj5+/tb7ty5LTIy0l577TWX2dY/+eQTK126tAUGBlqJEiVs2LBhNmHCBJPkvK3TihUr7IEHHrCiRYtaYGCg5cmTx+rVq5dq1un4+Hjr1q2bFShQwPz8/Kxo0aLWt29fO3PmjMt613PemV247VSZMmWsXLlyqc7n6Oho8/f3TzUD98VSZt8eMWKES3vKufjVV1+5tF/pPJoxY4Y1aNDAcuTIYYGBgVa0aFFr06aNy+2mOnToYFmzZk1Vw+Vmrp4/f75VqVLFAgMDTZLLa7BkyRJr2LChZc2a1bJkyWI1a9a0mTNnpqnOM2fOWLdu3SwiIsJy5MhhWbJksdKlS9uAAQNcXr969epZ+fLlU9XaoUMHK1q0aKrX73Kzl69evdpatWpl2bJls+zZs1vbtm3tn3/+ca539OhRGzJkiDVs2NAKFSpkAQEBljVrVqtcubINGTLETp065bLv//3vf1amTBnz9/d3mY1779691rp1a8uVK5dlz57d7rnnHlu/fv1lz53Ro0db8eLFzdfXN1XdixYtshYtWlju3LnN39/fChUqZC1atEh1DlxOv379LFeuXKnO6+XLl1utWrUsODjYQkND7amnnrLff//9iq/ZxdIye3lafw+vdD4dPXrUOnfubPny5bPg4GD7z3/+Y0uWLLnsvq/0+puZ/fHHH/bwww9bvnz5zN/f3/Lnz28NGza0sWPHOtfp06ePVa1a1XLlyuV8b+nVq5cdPnzYZT8TJkwwf39/O3DgwFWPHUDG5jAzu3kRHwAytj///FOVKlVSTEyMc+IcALevgQMHatCgQTp06NBtc13u/v37Vbx4cX366adpvnsDLq9OnToqUqSIpkyZ4u1SAHgQs5cDQBps375dv/zyi7p27aoCBQqkuuUWANwuChYsqJ49e+rNN99M0239cHmLFy9WbGys3njjDW+XAsDDbr0L8QDgFvTGG2/os88+U9myZfXVV1+5XJN3M5lZqgmTLuXr63vNa10B4Ea8/vrrCg4O1r59+xQeHu7tcjKk+Ph4ffrppypRooS3SwHgYQwvB4AMZNKkSc7Js65kwYIFzhmTAQAA4F2EbgDIQOLj47Vz586rrlO6dGllz579JlUEAACAqyF0AwAAAADgIUykBgAAAACAh9z2E6klJydr//79yp49OxMPAQAAAADSxMx0/PhxFSxYUD4+V+7Pvu1D9/79+5l1EwAAAABwXfbs2aPChQtfcfltH7pTJhvas2ePcuTI4eVqAAAAAAAZQUJCgsLDw685ge1tH7pThpTnyJGD0A0AAAAAcMu1LlNmIjUAAAAAADzktg3dMTExKleunKpVq+btUgAAAAAAmdRtf5/uhIQEhYSE6NixYwwvBwAAAACkSVqz5G1/TTcAAAAApFVSUpLOnz/v7TJwE/j7+8vX1/eGt0PoBgAAAIBrMDMdOHBA//77r7dLwU2UM2dO5c+f/5qTpV0NoRsAAAAAriElcOfLl0/BwcE3FMJw6zMznTp1SgcPHpQkFShQ4Lq3dduG7piYGMXExCgpKcnbpQAAAAC4hSUlJTkDd548ebxdDm6SLFmySJIOHjyofPnyXfdQ89t29vLo6Ght3LhRsbGx3i4FAAAAwC0s5Rru4OBgL1eCmy3lZ34j1/HftqEbAAAAANzBkPLbT3r8zAndAAAAAAB4CKEbAAAAAHBFu3btksPh0Nq1a6+4zqRJk5QzZ86bVlNGQugGAAAAgAzI4XBoxowZ3i5DkvTII49oy5Ytbj3n5MmTeuWVV1SiRAkFBQUpNDRU9evX16xZs5zrFCtWTKNHj3a7nvr166tnz55uP88TbtvZywEAAAAAFyYJ8/f3v6FtZMmSxTnbd1p169ZNq1at0gcffKBy5copPj5ey5cvV3x8/A3Vcqu5bXu6Y2JiVK5cOVWrVs3bpQAAAADIwOrXr6/nnntOPXv2VK5cuRQWFqZx48bp5MmTevLJJ5U9e3aVLFlSP/zwg/M5GzduVPPmzZUtWzaFhYWpXbt2Onz4sMs2e/TooZdfflm5c+dW/vz5NXDgQOfyYsWKSZIeeOABORwO52NJGjNmjEqWLKmAgACVLl1an332mUu9DodDY8eO1X333aesWbNqyJAhOnr0qB5//HGFhoYqS5YsKlWqlCZOnOjyvB07dqhBgwYKDg5WpUqVtGLFCueyS4eXDxw4UJUrV9ZHH32k8PBwBQcH66GHHtK///7rXGfmzJl69dVX1bx5cxUrVkyRkZF67rnn1KFDB+dr8Pfff6tXr15yOBzOSc3i4+PVtm1bFS5cWMHBwapYsaL+97//ObfbsWNHLVq0SO+9957zebt27UrT6+4Jt23o5pZhAAAAANLL5MmTlTdvXq1atUrPPfecnnnmGT300EOKiorS77//rqZNm6pdu3Y6deqU4uLiVK9ePVWuXFm//fab5s6dq3/++UcPP/xwqm1mzZpVK1eu1PDhwzV48GDNmzdPkpw5ZuLEiYqLi3M+/vbbb/X888/rxRdf1Pr16/X000/rySef1IIFC1y2PWDAAN13331at26dOnXqpH79+mnjxo364YcftGnTJo0ZM0Z58+Z1ec5rr72m3r17a+3atbrzzjvVtm1bJSYmXvE12bZtm6ZNm6aZM2dq7ty5Wrt2raKjo53L8+fPrzlz5uj48eOXff706dNVuHBhDR48WHFxcYqLi5MknTlzRpGRkZo1a5bWr1+vrl27ql27dlq5cqUk6b333lOtWrXUpUsX5/PCw8PT/LqnO7vNHTt2zCTZsWPHvF0KAAAAgFvQ6dOnbePGjXb69OnLLq9Xr5795z//cT5OTEy0rFmzWrt27ZxtcXFxJslWrFhh/fr1syZNmrhsY8+ePSbJNm/efNltmplVq1bNXnnlFedjSfbtt9+6rBMVFWVdunRxaXvooYesefPmLs/r2bOnyzqtWrWyJ5988rLHt3PnTpNk48ePd7Zt2LDBJNmmTZvMzGzixIkWEhLiXD5gwADz9fW1PXv2ONt++OEH8/Hxsbi4ODMzW7RokRUuXNj8/f2tatWq1rNnT1u6dKnLvosWLWrvvvvuZeu6WPPmze3FF190Pq5Xr549//zzLuuk5XW/1NV+9mnNkrdtTzcAAAAApJeIiAjn/319fZUnTx5VrFjR2RYWFiZJOnjwoFavXq0FCxYoW7Zszn9lypSRJG3fvv2y25SkAgUK6ODBg1etY9OmTapdu7ZLW+3atbVp0yaXtqpVq7o8fuaZZ/Tll1+qcuXKevnll7V8+fKrHmOBAgWcx3MlRYoUUeHChZ2Pa9WqpeTkZG3evFmSVLduXe3YsUM///yzWrdurQ0bNqhOnTp64403rnqMSUlJevPNNxUREaE8efIoW7Zs+umnn7R79+6rPi+tr3t6YyI1AAAAALhBl05E5nA4XNpSrkdOTk5WcnKyWrVqpbfffjvVdlLC7JW2mZycfM1aUvaVwsxStWXNmtXlcbNmzfT3339r9uzZmj9/vho1aqTo6GiNHDnysvVcfDxplfKci2vx9/dXnTp1VKdOHfXp00dDhgzR4MGD9corryggIOCy23nnnXf07rvvavTo0apYsaKyZs2qnj176ty5c1fdf1pf9/RG6AYAAACAm+iuu+7SN998o2LFisnP7/ojmb+/v5KSklzaypYtq6VLl6p9+/bOtuXLl6ts2bLX3F5oaKg6duyojh07qk6dOnrppZdcQre7du/erf3796tgwYKSpBUrVsjHx0d33nnnFZ9Trlw5JSYm6syZMwoICFBAQECqY1yyZInuu+8+PfHEE5IuhOmtW7e6HOPlnpder7u7CN0ZWMXJFa+9EtLFug7rvF0CAAAAMono6Gh9/PHHatu2rV566SXlzZtX27Zt05dffqmPP/5Yvr6+adpOsWLF9PPPP6t27doKDAxUrly59NJLL+nhhx/WXXfdpUaNGmnmzJmaPn265s+ff9Vt9e/fX5GRkSpfvrzOnj2rWbNmpSmoX01QUJA6dOigkSNHKiEhQT169NDDDz+s/PnzS7owO3nbtm1VtWpV5cmTRxs3btSrr76qBg0aKEeOHM5jXLx4sR599FEFBgYqb968uuOOO/TNN99o+fLlypUrl0aNGqUDBw641FusWDGtXLlSu3btUrZs2ZQ7d+50e93dxTXdAAAAAHATFSxYUMuWLVNSUpKaNm2qChUq6Pnnn1dISIh8fNIe0d555x3NmzdP4eHhqlKliiTp/vvv13vvvacRI0aofPny+uijjzRx4kTVr1//qtsKCAhQ3759FRERobp168rX11dffvnljRym7rjjDj344INq3ry5mjRpogoVKujDDz90Lm/atKkmT56sJk2aqGzZsnruuefUtGlTTZs2zbnO4MGDtWvXLpUsWVKhoaGSpH79+umuu+5S06ZNVb9+feXPn1/333+/y7579+4tX19flStXTqGhodq9e3e6ve7ucpiZeWzrt7CYmBjFxMQoKSlJW7Zs0bFjx5zfpmQU9HTfPPR0AwAA3L7OnDmjnTt3qnjx4goKCvJ2ORnCwIEDNWPGDK1du9bbpdyQq/3sExISFBIScs0sedv2dHOfbgAAAACAp922oRsAAAAAAE8jdAMAAAAA0tXAgQMz/NDy9ELoBgAAAADAQwjdAAAAAAB4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ffddnT17VkFBQfrll1+4thsZVsroupT35pQv/Bs1aqQyZcpo0aJF2rt3L+/dyLD8/PzkcDi0atUqtWrVSgkJCZoxY4a3y4IbCN24bg6Hw/kh7YsvvlBoaKhKlCihadOmqXbt2nxwQ4a3aNEilStXTm3atNHnn38uSXrvvfckcekEMq7ly5erRIkSmjJlihYvXqyTJ09qxowZWr16tSR6u5HxpIzcWL58uebOnav4+HiZmQICAtS4cWOdOHFC33zzjSS+VELG9Ntvv6lChQpq3bq13nvvPZ0+fVqffPKJ/v33X2+XhjQidCNNLjc52uzZsxUVFaVvv/1Wb7zxhv766y9t375d3333nZKSkvjghgzhSpP/nThxQiNGjFDlypW1ePFi9ejRQ48//rgmTpyoHTt2cOkEbmlJSUmpwkViYqIkac6cOSpQoICWL1+uYcOGad26dcqePbu+/fZb53BFggluVZc7N2fNmqXy5cvrwQcfVO/evdW0aVNnL2DTpk1VsmRJzZs3T0eOHOGzCW5ZycnJqT6PmJnMTJ988ony58+vP//8UwMGDNB7772n3377TbNnz/ZStXAXnxqRJinfIh89etTZ1rBhQ+XPn1+LFi3SoUOHlC1bNj3wwAMaN26cDh48KIneQNzakpOTnZP/pfxhS/HPP/9ozpw5evbZZ5U3b17VqlVLgwcPVrly5TR06FBJBBPcunx9feVwOLRlyxatXLlSSUlJ8vPzkyT98MMPuvvuuxUQEKDz588rV65c6tu3r3766SetWbNGEr3duHVdem7++uuvGjx4sNq3b69t27bp119/Vc2aNTVixAj9/fffypkzpxo2bKjDhw/r22+/lcRnE9x6kpOT5ePjI19fXyUmJur48eOSLpzvSUlJmjJlih599FHlypVL4eHhevbZZ/XII4/o3Xff1enTp71cPdKC0I1UzMz5ByklVJw7d04NGjTQW2+95fzlzpIli1q3bq2lS5cqNjZWkjRkyBCtXLlSsbGxMjOX3kACCrzharew8/Hx0ZEjR9SjRw81bNhQTz/9tJYvX66kpCSdOnVKJUqUUEJCgqQL52/hwoXVvn17TZkyRYcPHyaY4JZxaYiIjY1VVFSUGjZsqE6dOql58+aaP3++JCk8PNw5lDzled26ddOJEyc0a9YshivilpacnKyPPvpI+/btkyRVrlxZnTp10iuvvKKsWbPqiy++0LRp07RhwwZ99NFHkqR77rlHhQsX1ty5c3X69GlGKsErrvV5JD4+Xt27d1eVKlX0yCOPaOzYsfrnn38kSUWLFnX+PzExUQ6HQ08//bR+//13LViw4KbUjxvDuw5cpAwL9/HxcZkoLSAgQKVKldLSpUv1119/Odfv3Lmzzp8/r0WLFikhIUFly5ZVo0aNNGLECK1evVo//fSTXn/9dUn0nMA7Lr6FXcrw2hS///676tevr/Xr1+vJJ5/U4cOH1b9/f3366acqVKiQ8ufPr2XLlkm6cP76+/srX758Onv2rCZMmCCJL5Nw86ScawsWLHAG45S2i0PEqVOnNHToUFWsWFFr1qxxDr1t27atEhIS1KZNGy1atEi7d+9WYGCgJGnfvn0KCQnR4sWL9euvv97cAwP+v0OHDmnKlCnOcHG5kHLy5Ek988wzmjZtmpKTkxUUFKRu3bpp5cqVioiI0NixYzVw4EA9+uijmjlzpg4dOqSCBQuqfv362rhxo6ZNm3azDwuQdOHzyLlz53T27NlUnx327t2rNm3aaMuWLXrrrbcUFRWl7777Tq+//rr8/PxUtWpV/frrrzp+/Lhz1FJAQIB8fX312Wef6cyZM944JLiB0H2bOn78uAYOHOgyXFy68IYQHx+v5557Tq1atdLgwYP1+++/S5L69Omj3bt3a8GCBc5bKeXNm1dNmjTRzJkztXbtWknS8OHDlZSUpAceeECPPvqoAgICbuqxARdbtmyZwsLCJF2Y/fOvv/5y9pBMnTpVJUuW1C+//KL27durf//++uuvvzRmzBjlzp1b1atX188//+xyf+4dO3aocOHC6tu3r86dO8eXSbhpHA6H1q5dq0aNGmnJkiUuyz7//HMNGDBAkjRz5kz99ttv+uijjxQaGuqcXCo5OVn79+9Xw4YNFRkZqc6dOzuHk8+fP18NGzbU8ePHne/vwM02c+ZMdevWzTl6ztfXV7t27XJ+vkhOTlb27Nn1/PPPa8KECTp8+LCkC+F82LBhqlevnn766Sd1795dRYoU0datW533M27cuLHq1aunkiVLeuXYgN27dytnzpyKjY2Vw+HQ6tWrnaOOvv/+ex07dkzz589XixYt1KZNGx04cECff/65EhIS1LhxY+3Zs8c5ekOSNmzYoBo1amjq1KkuHWK4RRluK6dPnzYzs/3795vD4bCPPvrIZfmvv/5qhQsXtrvvvtsGDRpkpUuXtmLFitmGDRvMzKx9+/ZWv359W7dunfM5ixYtsixZstigQYOc29+7d68tW7bsJh0VcGUnTpywQoUKWbt27SwiIsIKFy5sixcvtoSEBIuKirLFixdbbGysNWrUyLJnz26PP/64/fbbb2Zmtm7dOnv88cctMDDQ+vTpYx06dLDKlStbbGyscx3gZklKSjIzs5o1a9rDDz9s//77r5mZ/fvvv1a1alWbPn26mZmNGTPGHn30URs5cqQVK1bMihUrZiNGjLBDhw45t7VhwwarWLGihYeH25133mnZsmWzlStXOt/DgZspOTnZ+f8qVarYs88+a4cPHzYzs5YtW1qZMmXs7NmzznX2799vfn5+9umnn5qZ2e7du61MmTI2cuRIMzM7e/asde7c2YoXL24lS5a0U6dO3cSjAa6sefPmVrNmTStfvrxly5bNPv/8c0tKSrLOnTvbqFGjbMWKFdawYUPLnj27tW/f3latWmVmZkeOHLERI0aYw+Gw++67zx566CErXLiwrVq1yv766y8vHxXSgtB9G3niiSesW7duduLECTMz6969u1WsWNH5ODk52Z566ilr2bKlnTlzxszM9uzZYw0bNrQGDRqYmdmaNWusaNGiNmrUKEtMTDQzs5dfftnCwsKsRo0aLmE8xfnz513+oAKekpyc7DwvUwLKpk2bzOFwWEBAgL3yyit29OhR5/qVK1e27NmzW758+ezpp5+2zZs3O5cdOnTIed4OHDjQmjVrZi1atLA1a9bctOMBzMwSExOd57OZ2Zw5c8zf398WLVpkZmaff/65lSlTxo4dO2ZmZmPHjrWgoCArWbKkTZw40RISEpzPXbx4se3Zs8fMzOLi4mzGjBk2duxYl0CT8jsE3AwXn9tmZu+8845VqFDBfvrpJzMzW7VqlQUGBtrPP/9sZv8X0B9//HGrVq2anTx50v755x9r06aNlS9f3r766it78skn7cEHH7TZs2c7Ow1S9nPp/gBPuPjzSMrjo0ePWlBQkPn6+lqnTp2c79lmZk8++aQ5HA7Lly+fRUdH29atW53L9u7d6/ysPnXqVHv22WftkUcesd9///3mHRBuGKH7NpDySz9s2DDLkyePMxhv3brV/Pz87Ouvv3auW7t2bevRo4eZ/d8ftqVLl5qPj4/zD9dz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sM8//9zMLnzOOXfunG3fvt1l2Djn9e2J0J1BpQSIlNk9v/jiC5dr+J588km76667rH///rZv3z775JNPrEKFCi7hPGVdrh+BN23ZssWeeOIJq169ui1dutTM/m8CnYtHcJhdGJ3Rtm1b5x9Bswu9JY8//rh98MEHl90+YRuelPL+uX37ditSpIiNGjXKzMy+/vprK1eunDVs2NAGDx7snEF/6dKl5nA4nPfMHjJkiEVGRrqE6enTp1t4eHiq67QvxnmNm+nikBAXF2djx46106dP24cffmiNGzd2no/Hjx+3ihUrWpEiRVJ94ZSibNmy1rdvXzO78Blm6tSpnj8AIA22bNlirVu3tpEjR1pERITVqVPH+UXqyJEjLSAgwHLkyGF169a17777zvl7cfr0aUtOTrZ9+/ZZixYtrFq1apfd/pVue4rbAxfF3EKSkpKUnJzs0mYXXR91MV9fXyUnJysiIkK1atXSl19+qYSEBOe1IG+//bYeeeQRTZgwQQ0aNNBLL72kzp07q3Hjxs5tpKzL9SPwlgkTJqhGjRpKTk5W9+7ddfbsWUnSE088oRIlSmjr1q06duyYc/3evXtrx44dqlatmkaMGKEePXqoevXqOn78uMu5LUnJyckyM+e1hoAnOBwOJScnq0SJEmrYsKHmzZuncePGafTo0Wrbtq3q1KmjsWPHqlu3bjp69Khq166tSpUqaezYsTIzPfTQQwoPD9dDDz2ksWPHatasWXrnnXcUFRWlChUqpNpfyt8EzmvcTD4+PkpISNDMmTNVq1YtLV68WP/++682bNigatWq6fTp0+rUqZMKFSqkPHny6IMPPlBISIgk6dy5c9q7d6/i4+PVr18/ZcmSRW3atJEkRURE6OGHH/bmoQGSpN9//10NGjSQv7+/ChUqpCJFimjp0qVasGCBzExlypRRkSJF9PTTT2vRokW699575ePjowMHDmjYsGFau3atChYsqGeeeUajRo267D58fX35zH0782rkx2Xt27cv1fXYl5PyzfL8+fPN19fXFixYkGqdXbt22YoVK9K7RCDNLr3WNOVb3n/++cciIyOd9xi+dHn//v2tUqVKqYbTbt261bp3726tW7e25s2b2/z58z1YPXDB0aNHXS5puFhKb8fatWutQIECVrp0aeestmYX7rcdERHhvFziu+++Mz8/P+fIjlOnTtnj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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "saved -> no_row_reason_by_state.png + no_row_reason_by_state.tsv\n" ] } ], "source": [ "\n", "# =============================================================================\n", "# Classify ALL no_row users (state 0 + 50 + unset) into the 5 reasons, by state.\n", "# Reuses what earlier cells already built:\n", "# - ds[\"no_row\"], ds[\"reg_ts\"], ds[\"is_self\"] (from cell-6)\n", "# - block_status.jsonl -> indef_uids (from cell-9; covers all states,\n", "# since the remainder was NOT\n", "# filtered by state)\n", "# Priority (high -> low): 5_deleted > 2_autocreated > 1_pre_rollout\n", "# > 3_indef_blocked > 4_residual\n", "# =============================================================================\n", "import matplotlib.pyplot as plt\n", "\n", "ROLLOUT_LIVE = pd.Timestamp(\"2021-06-01\")\n", "\n", "# ---- indefinitely-blocked uids (covers the 50 & unset remainders too) ----\n", "blk = pd.read_json(ROOT / \"analysis/diagnose_missing_mentors/block_status.jsonl\",\n", " lines=True)\n", "indef_uids = set(blk.loc[blk[\"indefinite\"], \"uid\"])\n", "print(f\"indefinitely-blocked uids in block_status: {len(indef_uids):,}\")\n", "\n", "# ---- all no_row users (should be 11,600 + 4 + 540,773 = 552,377) ----\n", "nr = ds[ds[\"no_row\"]].copy()\n", "print(f\"total no_row users: {len(nr):,}\")\n", "print(nr.groupby(\"mentorshipState\").size().to_string(), \"\\n\")\n", "\n", "# ---- vectorized classification (assign low priority first, overwrite upward) ----\n", "reason = pd.Series(\"4_residual\", index=nr.index, dtype=\"object\")\n", "reason[nr[\"userId\"].astype(int).isin(indef_uids)] = \"3_indef_blocked\"\n", "reason[nr[\"reg_ts\"] < ROLLOUT_LIVE] = \"1_pre_rollout\"\n", "reason[nr[\"is_self\"] == False] = \"2_autocreated\"\n", "reason[nr[\"reg_ts\"].isna()] = \"5_deleted\"\n", "nr[\"reason\"] = reason\n", "\n", "REASON_ORDER = [\"1_pre_rollout\", \"2_autocreated\", \"3_indef_blocked\",\n", " \"4_residual\", \"5_deleted\"]\n", "\n", "# ---- reason x state table ----\n", "tab = (nr.pivot_table(index=\"reason\", columns=\"mentorshipState\",\n", " aggfunc=\"size\", fill_value=0)\n", " .reindex(REASON_ORDER, fill_value=0))\n", "tab[\"total\"] = tab.sum(axis=1)\n", "print(\"=== reason x mentorshipState ===\")\n", "print(tab.to_string())\n", "print(f\"\\nsum check: {tab['total'].sum():,} (should equal total no_row above)\")\n", "\n", "tab.to_csv(ROOT / \"analysis/diagnose_missing_mentors/no_row_reason_by_state.tsv\",\n", " sep=\"\\t\")\n", "\n", "# ---- plot (state 0 included; mostly so we see 50 & unset clearly) ----\n", "plot_tab = tab.drop(columns=\"total\")\n", "ax = plot_tab.plot(kind=\"bar\", stacked=True, figsize=(10, 6), logy=True)\n", "ax.set_xlabel(\"reason\")\n", "ax.set_ylabel(\"number of no_row users (log scale)\")\n", "ax.set_title(\"Why no_row \u2014 reason x mentorshipState (all states)\")\n", "ax.legend(title=\"mentorshipState\")\n", "plt.xticks(rotation=25, ha=\"right\")\n", "plt.tight_layout()\n", "plt.savefig(ROOT / \"analysis/diagnose_missing_mentors/no_row_reason_by_state.png\",\n", " dpi=130)\n", "plt.show()\n", "print(\"saved -> no_row_reason_by_state.png + no_row_reason_by_state.tsv\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 9 \u2014 Re-check the \"5_deleted\" bucket against the CentralAuth API\n", "\n", "The label `5_deleted` was assigned in cell 4 to the 6,451 `no_row` users whose `reg_ts` is missing. \"Missing local registration timestamp\" is not the same as \"account deleted\": a user can have no local en.wiki user row but still have a live global (CentralAuth) account whose home wiki is another project. This cell tests that hypothesis by querying Meta's CentralAuth API (`action=query&meta=globaluserinfo`) for each of the 6,451 userIds, one at a time (`guiid` is not batchable), with a 0.4 s pacing between requests. The fetch is resume-safe and writes one JSON record per line to `analysis/diagnose_missing_mentors/deleted_global_info.jsonl`.\n", "\n", "Printed results:\n", "\n", "- Total records: **6,451**.\n", "- Accounts that do not exist globally (`missing == True`): **0**.\n", "- Accounts that exist but are globally locked: **55**.\n", "- Hidden accounts: **0**.\n", "- API errors or records without a registration timestamp: **11**.\n", "\n", "Registration date distribution among the 6,440 records with a known global registration timestamp:\n", "\n", "- Pre-rollout (`reg < 2021-06-01`): **6,440** (100%).\n", "- In the identifying window (2022-03-07 to 2025-02-16): **0**.\n", "\n", "Top home wikis (out of all 6,451): `enwiki` 3,154 (48.9%), `eswiki` 464 (7.2%), `frwiki` 252 (3.9%), `ruwiki` 213 (3.3%), `ptwiki` 204 (3.2%), `dewiki` 178 (2.8%), with the remainder spread across many other projects.\n", "\n", "Conclusion printed at the bottom of the cell: none of the 6,451 users are actually deleted. They all have a queryable global account; all 6,440 with a known registration date registered before 2021-06-01; zero fall in the identifying window. The `5_deleted` label is therefore misleading and should be read as \"pre-rollout global accounts with no local en.wiki user row\" \u2014 many because their home wiki is not en.wiki. This misclassification has no effect on the cohort used for 2SLS estimation, because none of these users fall in the identifying window.\n" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cohort window (from ROLLOUT identifying phases): 2022-03-07 .. 2025-02-16\n", "total=6,451 already_fetched=6,451 to_fetch=0\n", "\n", "total records: 6,451\n", " globaluserinfo MISSING (account never existed globally): 0\n", " locked (account exists but globally locked) : 55\n", " hidden : 0\n", " API errors / no registration timestamp : 11 / 11\n", "\n", "--- registration vs cohort window ---\n", " pre-rollout (reg < 2021-06-01) : 6,440\n", " rollout..cohort (2021-06-01..2022-03-07) : 0\n", " IN cohort window (2022-03-07..2025-02-16) : 0\n", " after cohort end (> 2025-02-16) : 0\n", "\n", "--- registration year distribution ---\n", " 2015: 1,440\n", " 2016: 4,971\n", " 2017: 29\n", "\n", "--- top 10 home wikis ---\n", " enwiki: 3,154 (48.9%)\n", " eswiki: 464 (7.2%)\n", " frwiki: 252 (3.9%)\n", " ruwiki: 213 (3.3%)\n", " ptwiki: 204 (3.2%)\n", " dewiki: 178 (2.8%)\n", " arwiki: 167 (2.6%)\n", " commonswiki: 159 (2.5%)\n", " zhwiki: 148 (2.3%)\n", " jawiki: 127 (2.0%)\n", "\n", "=== conclusion ===\n", "None of the 6,451 'deleted' uids are actually deleted; all are queryable\n", "on CentralAuth. All 6,440 with a known registration date registered BEFORE the\n", "mentorship rollout (2021-06-01), and 0 fall inside the identifying window\n", "(2022-03-07..2025-02-16). They were tagged '5_deleted' only because the local\n", "en.wiki user table does not have their registration row \u2014 many are global accounts\n", "whose home wiki is not en.wiki (48.9% are enwiki-home,\n", "the rest are eswiki/frwiki/etc). The '5_deleted' label is misleading \u2014 these are\n", "pre-rollout global accounts without a local enwiki user row.\n" ] } ], "source": [ "# =============================================================================\n", "# Re-checking the \"5_deleted\" bucket \u2014 are those 6,451 users actually deleted?\n", "#\n", "# Context: in the reason-by-state cell above we labelled 6,451 no_row users as\n", "# \"5_deleted\" because their reg_ts is missing from build/registrations.jsonl\n", "# (which is built from en.wiki's LOCAL user table). \"Missing local reg\" is not\n", "# the same as \"account deleted\" \u2014 the account may simply be a global\n", "# (CentralAuth) account whose home wiki is not en.wiki, in which case it has\n", "# no local enwiki user row but the global account is alive and queryable on\n", "# Meta.\n", "#\n", "# This cell:\n", "# 1. Queries Meta's CentralAuth API (one uid at a time \u2014 guiid is not\n", "# batchable) and writes deleted_global_info.jsonl. Resume-safe.\n", "# API reference: https://www.mediawiki.org/wiki/API:Globaluserinfo\n", "# 2. Summarises: where they registered, when, and whether any fall inside\n", "# the 2SLS identifying window (derived from the ROLLOUT table).\n", "#\n", "# NOTE: this cell reads the deleted_uids set from a cache pkl produced in an\n", "# earlier ad-hoc step. If the pkl is missing, recompute it inline:\n", "# deleted = sorted(set(ds.loc[ds[\"no_row\"] & ds[\"reg_ts\"].isna(),\n", "# \"userId\"].astype(int)))\n", "# =============================================================================\n", "import pickle, time\n", "from urllib.parse import urlencode\n", "from urllib.request import Request, urlopen\n", "from urllib.error import HTTPError, URLError\n", "from collections import Counter\n", "\n", "DEL = ROOT / \"analysis/diagnose_missing_mentors/cache/deleted_uids.pkl\"\n", "OUT = ROOT / \"analysis/diagnose_missing_mentors/deleted_global_info.jsonl\"\n", "META = \"https://meta.wikimedia.org/w/api.php\"\n", "UA = \"WikiMentorResearch/1.0 (academic; contact: yubozhou@umich.edu)\"\n", "SLEEP = 0.4 # match cell-7's pacing\n", "\n", "# cohort window derived from the ROLLOUT table (identifying phases only)\n", "_ident = [(s, e) for label, s, e, mp, hp, ident in ROLLOUT if ident]\n", "COHORT_START = min(s for s, _ in _ident)\n", "COHORT_END = max(e for _, e in _ident)\n", "ROLLOUT_LIVE = \"2021-06-01\" # en.wiki mentorship effective date (same as cell-4)\n", "print(f\"cohort window (from ROLLOUT identifying phases): {COHORT_START} .. {COHORT_END}\")\n", "\n", "# ---- 1) fetch (resume-safe; skips uids already in OUT) -----------------------\n", "def fetch_one(uid):\n", " p = {\"action\":\"query\", \"meta\":\"globaluserinfo\", \"guiid\":uid, \"format\":\"json\"}\n", " url = META + \"?\" + urlencode(p)\n", " for k in range(5):\n", " try:\n", " req = Request(url, headers={\"User-Agent\": UA})\n", " with urlopen(req, timeout=30) as r:\n", " return json.loads(r.read().decode())\n", " except (HTTPError, URLError, TimeoutError):\n", " time.sleep(0.5 * (2**k))\n", " return {\"error\": \"fail\"}\n", "\n", "deleted = sorted(pickle.load(open(DEL, \"rb\")))\n", "done = set()\n", "if OUT.exists():\n", " with open(OUT) as f:\n", " for line in f:\n", " try: done.add(json.loads(line)[\"uid\"])\n", " except: pass\n", "todo = [u for u in deleted if u not in done]\n", "print(f\"total={len(deleted):,} already_fetched={len(done):,} to_fetch={len(todo):,}\")\n", "\n", "if todo:\n", " with open(OUT, \"a\") as fout:\n", " for i, uid in enumerate(todo):\n", " d = fetch_one(uid)\n", " gu = d.get(\"query\", {}).get(\"globaluserinfo\", d)\n", " rec = {\"uid\": uid, \"name\": gu.get(\"name\"), \"home\": gu.get(\"home\"),\n", " \"registration\": gu.get(\"registration\"),\n", " \"missing\": \"missing\" in gu, \"locked\": \"locked\" in gu,\n", " \"hidden\": \"hidden\" in gu,\n", " \"err\": d.get(\"error\") or gu.get(\"error\")}\n", " fout.write(json.dumps(rec) + \"\\n\")\n", " if i % 200 == 0:\n", " fout.flush()\n", " print(f\" {i:,}/{len(todo):,}\")\n", " time.sleep(SLEEP)\n", " print(\"fetch done.\")\n", "\n", "# ---- 2) summarise ------------------------------------------------------------\n", "rows = [json.loads(l) for l in open(OUT)]\n", "print(f\"\\ntotal records: {len(rows):,}\")\n", "\n", "n_missing = sum(1 for r in rows if r.get(\"missing\"))\n", "n_locked = sum(1 for r in rows if r.get(\"locked\"))\n", "n_hidden = sum(1 for r in rows if r.get(\"hidden\"))\n", "n_err = sum(1 for r in rows if r.get(\"err\"))\n", "n_no_reg = sum(1 for r in rows if not r.get(\"registration\"))\n", "print(f\" globaluserinfo MISSING (account never existed globally): {n_missing:,}\")\n", "print(f\" locked (account exists but globally locked) : {n_locked:,}\")\n", "print(f\" hidden : {n_hidden:,}\")\n", "print(f\" API errors / no registration timestamp : {n_err:,} / {n_no_reg:,}\")\n", "\n", "# robust date parsing (MediaWiki returns ISO 8601; coerce defensively)\n", "reg_dt = pd.to_datetime(\n", " pd.Series([r.get(\"registration\") for r in rows]),\n", " errors=\"coerce\", utc=True,\n", ").dt.tz_localize(None)\n", "reg_date = reg_dt.dt.date.astype(\"string\")\n", "\n", "cs, ce, rl = pd.Timestamp(COHORT_START).date(), pd.Timestamp(COHORT_END).date(),pd.Timestamp(ROLLOUT_LIVE).date()\n", "valid = reg_dt.notna()\n", "n_pre = int(((reg_dt.dt.date < rl) & valid).sum())\n", "n_btw = int(((reg_dt.dt.date >= rl) & (reg_dt.dt.date < cs) & valid).sum())\n", "n_in = int(((reg_dt.dt.date >= cs) & (reg_dt.dt.date <= ce) & valid).sum())\n", "n_post = int(((reg_dt.dt.date > ce) & valid).sum())\n", "\n", "print(\"\\n--- registration vs cohort window ---\")\n", "print(f\" pre-rollout (reg < {ROLLOUT_LIVE}) : {n_pre:,}\")\n", "print(f\" rollout..cohort ({ROLLOUT_LIVE}..{COHORT_START}) : {n_btw:,}\")\n", "print(f\" IN cohort window ({COHORT_START}..{COHORT_END}) : {n_in:,}\")\n", "print(f\" after cohort end (> {COHORT_END}) : {n_post:,}\")\n", "\n", "yrs = Counter(d.year for d in reg_dt.dropna().dt.date)\n", "print(\"\\n--- registration year distribution ---\")\n", "for y in sorted(yrs):\n", " print(f\" {y}: {yrs[y]:,}\")\n", "\n", "homes = Counter(r.get(\"home\") for r in rows if r.get(\"home\"))\n", "print(\"\\n--- top 10 home wikis ---\")\n", "for w, c in homes.most_common(10):\n", " print(f\" {w}: {c:,} ({c/len(rows)*100:.1f}%)\")\n", "\n", "print(\"\\n=== conclusion ===\")\n", "print(f\"None of the {len(rows):,} 'deleted' uids are actually deleted; all are queryable\")\n", "print(f\"on CentralAuth. All {n_pre:,} with a known registration date registered BEFORE the\")\n", "print(f\"mentorship rollout ({ROLLOUT_LIVE}), and 0 fall inside the identifying window\")\n", "print(f\"({COHORT_START}..{COHORT_END}). They were tagged '5_deleted' only because the local\")\n", "print(f\"en.wiki user table does not have their registration row \u2014 many are global accounts\")\n", "print(f\"whose home wiki is not en.wiki ({homes.get('enwiki',0)/len(rows)*100:.1f}% are enwiki-home,\")\n", "print(f\"the rest are eswiki/frwiki/etc). The '5_deleted' label is misleading \u2014 these are\")\n", "print(f\"pre-rollout global accounts without a local enwiki user row.\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 10 \u2014 Block-reason breakdown for all 20,974 indefinitely-blocked `no_row` users, split by state\n", "\n", "This cell repeats the block-reason analysis from cell 11 on the full population of 20,974 indefinitely-blocked `no_row` users (rather than the 373 question-askers). Block-reason text is read from `block_status.jsonl` and bucketed using the same string-matching rules as cell 11. The outputs are saved to `block_reason_by_state_all.png`, `block_reason_by_state_all.tsv`, and `block_reason_share_by_state.tsv`.\n", "\n", "Printed totals (top categories, absolute counts by `mentorshipState`):\n", "\n", "| category | 0 | 50 | unset | total |\n", "|---|---|---|---|---|\n", "| spam/promo | 4,614 | 0 | 3,643 | 8,257 |\n", "| checkuser | 1,672 | 3 | 1,626 | 3,301 |\n", "| sockpuppet | 1,249 | 0 | 1,108 | 2,357 |\n", "| vandalism | 1,251 | 0 | 1,104 | 2,355 |\n", "| not-here | 891 | 0 | 666 | 1,557 |\n", "| other | 603 | 0 | 474 | 1,077 |\n", "| username | 519 | 0 | 357 | 876 |\n", "| disruption | 452 | 1 | 388 | 841 |\n", "\n", "Within-state shares are also printed. The composition is similar in state `0` and state `unset`: in both, the top three categories (spam/promo, checkuser, sockpuppet) account for roughly two-thirds of indefinite blocks. State `50` has only 4 indefinitely-blocked users and is too small to interpret.\n", "\n", "This cell concludes the analysis of the 552,377 `no_row` users. The remaining cells are a separate completeness audit of registration timestamps, prompted by a finding made while building the for-Martin output file.\n" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "indefinitely-blocked uids: 20,974\n", "by state:\n", "mentorshipState\n", "0 11409\n", "50 4\n", "unset 9561\n", "\n", "=== block reason category x mentorshipState (absolute counts) ===\n", "mentorshipState 0 50 unset total\n", "cat \n", "spam/promo 4614 0 3643 8257\n", "checkuser 1672 3 1626 3301\n", "sockpuppet 1249 0 1108 2357\n", "vandalism 1251 0 1104 2355\n", "not-here 891 0 666 1557\n", "other 603 0 474 1077\n", "username 519 0 357 876\n", "disruption 452 1 388 841\n", "LTA 54 0 76 130\n", "block-evasion 59 0 61 120\n", "harassment 37 0 45 82\n", "(empty) 8 0 13 21\n", "\n", "=== same table, as within-state share (%) ===\n", "mentorshipState 0 50 unset\n", "cat \n", "spam/promo 40.44 0.0 38.10\n", "checkuser 14.66 75.0 17.01\n", "sockpuppet 10.95 0.0 11.59\n", "vandalism 10.97 0.0 11.55\n", "not-here 7.81 0.0 6.97\n", "other 5.29 0.0 4.96\n", "username 4.55 0.0 3.73\n", "disruption 3.96 25.0 4.06\n", "LTA 0.47 0.0 0.79\n", "block-evasion 0.52 0.0 0.64\n", "harassment 0.32 0.0 0.47\n", "(empty) 0.07 0.0 0.14\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABEEAAAJOCAYAAABY5xk7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAADP5UlEQVR4nOzdeXxMZ///8ffISkKCxE7sS4g1WksRVbFTS/VWJbTaqqjauihKlVJq6V2xdVHdtdXq3VKEWlrUrpZYqsRSIRU01iC5fn/0l/kaCZ1hJiPyej4eeTDXOXPOe645M5n55DrXsRhjjAAAAAAAAO5xudwdAAAAAAAAICtQBAEAAAAAADkCRRAAAAAAAJAjUAQBAAAAAAA5AkUQAAAAAACQI1AEAQAAAAAAOQJFEAAAAAAAkCNQBAEAAAAAADkCRRAAAAAAAJAjUAQB4DIffvihLBaLzU9wcLAiIiL0ww8/ZFjfYrFo9OjRLskSHx8vi8Wit956yyXbz8lGjBihUqVKydPTU4GBgVm238GDB8tisaht27aZLrf3OS9duvRNt3Er6cd3fHy8w/e9mVWrVslisWjVqlW3df/58+eratWqyp07tywWi7Zv357peunZN2/e/K/b7NWrl0qXLn1beewRERGhatWquWz7kmueK2Q/jhz395rFixe77PerPdLf277++ut/XfdO33P27NmjHj16qGzZsvL19VVQUJBq166t/v37Kzk52breZ599pmnTpt32fiRpxowZ+vDDD+9oGwCyHkUQAC43d+5crV+/XuvWrdOcOXPk4eGhdu3a6fvvv3d3NNyh7777TuPGjVPPnj21evVqLV++PEv2e/XqVX3yySeSpCVLlujPP//Mkv1er02bNlq/fr2KFi2a5fvOzF9//aUePXqoXLlyWrJkidavX6+KFSu6OxaAu8DixYv12muvuTuGXUaOHKlvv/32tu67bds21alTR3FxcXr11Ve1ZMkSzZo1S23atNHSpUt1+vRp67oUQYCcy9PdAQDc+6pVq6bw8HDr7ZYtWyp//vz6/PPP1a5dOzcmu32pqam6du2afHx83B3FrXbt2iVJGjBggAoVKuSUbV68eFF58uS55Trfffed/vrrL7Vp00aLFi3SvHnz9Morrzhl//YKDg5WcHBwlu7zVvbv36+rV6/q8ccfV5MmTdwdB3fAntfAvY4+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sWPHWttu/EKyZMkSI8lMnDjR5r7z5883ksycOXOMMf88Lx4eHqZ79+63zJJeBElNTTX9+/c33t7e5pNPPrFZx97X2aOPPmpy585tTpw4YV3n2rVrpnLlynYXQSSZL7/80qa9devWplKlStbb6YWHG9d78803jSSzbNmyW+4ns31+8MEHNu327uPAgQNGkvnoo4+MMcb88ssvRpJ58cUXTZkyZaz3a968uWnQoMEts9hbBDl16pSRZKZNm3bTbR05csR4enqa5557zqb93LlzpkiRIqZr167/2gd38t6UGUeP+0KFCpmUlBRr25tvvmly5cpl93G0YMECa9vVq1dNcHCwkWT9omzMP4UVDw8PM3jwYGvbM888Y/z9/c3hw4dttvvWW28ZSdYCUvrzEhYWZlNE2Lhxo5FkPv/8c2tbdHS0yexvn/a+no35573Sw8PD7Nu3L9Nc6b97MmPv7yNjbl4Eudlru3z58ta2y5cvm4cfftj6ecPDw8PUqlXLDB8+3CQmJtpss02bNhn2k5nU1FRz9epVM2bMGFOwYEGbAkbVqlVNkyZNMtxn/PjxJleuXGbTpk027V9//bWRZBYvXvyv+wXgOpwOA8DlPvroI23atEmbNm3Sjz/+qKioKEVHR2v69Om3vN9PP/2kZs2aqWTJkjbtvXr10sWLF7V+/XpJ0o8//qiKFSvqoYce+tcsW7duVb169VS4cGGtXbtWISEhdj+O9u3b25zCc+DAAe3du1fdu3eXJF27ds3607p1ayUkJNgM8501a5Zq164tX19feXp6ysvLSytWrNCePXus69x33306e/asunXrpu+++06nTp267X65Pvf1qlevLkk6fPiwJKl8+fLKnz+/XnrpJc2aNUtxcXF290lm0k8T6tWrl037fffdpypVqticxiFJ+fPn14MPPmjXto0x1lNgmjdvLkkqU6aMIiIitGDBApuZ/92lSJEiuu+++2zaqlevbu1v6Z8+qlq1qmrUqGGz3mOPPWZze926dTp9+rSioqJsjq+0tDS1bNlSmzZtuuXQ6uvvc+3atQynDKUfu+kaNGigkJAQ63OYmZ9++klSxuf3kUcekZ+fn/X5jY2NVWpqqqKjo2+6rXSXL1/Www8/rE8//VTLli2zyeXI62zlypVq1qyZChcubL2/h4eHHn300X/NkM5isWSYq+jG5++nn36Sn5+funTpYrNeep/ceIzbo3Pnzja37d1HuXLlVLp0aeukxLGxsQoLC9Pjjz+uQ4cO6Y8//lBKSop++eUXu94j7VGgQAGVK1dOkyZN0pQpU7Rt27YMp3stXbpU165dU8+ePW2eM19fXzVp0iTTKyDd2AfOfm9KZ89x//zzzysxMdF6SlFaWppmzpypNm3a2HXlEovFotatW1tve3p6qnz58ipatKhq1aplbS9QoIAKFSpkc3z98MMPatq0qYoVK2bTd61atZIkrV692mZfbdq0kYeHh/X2je/xt2Lv6/n6bd844XLdunUlSV27dtWXX355y4mq/+330a3c7LV94MAB6+lRPj4++vbbbxUXF6epU6fqP//5j/766y+NGzdOVapUyXDqzc389NNPeuihhxQQECAPDw95eXnp1VdfVVJSkhITE//1/j/88IOqVaummjVr2jyHLVq0uKMrgAFwDoogAFyuSpUqCg8PV3h4uFq2bKnZs2crMjJSL774YqZzCKRLSkrK9MobxYoVsy6X/plvo0SJEnZliY2N1cmTJ9WnTx+HL+d6Y5aTJ09KkoYOHSovLy+bn379+kmStYgxZcoUPfvss7r//vu1YMEC/frrr9q0aZNatmypS5cuWbfZo0cPffDBBzp8+LA6d+6sQoUK6f7771dsbKx1HXv7JV3BggVtbqdP5pq+34CAAK1evVo1a9bUK6+8oqpVq6pYsWIaNWqU3XMpXC99/zfLeGM+R66u8tNPP+nQoUN65JFHlJycrLNnz+rs2bPq2rWrLl68qM8//9zhvM52Y39L//T59c9zUlKSihQpkmG9G9vSj7EuXbpkOMbefPNNGWNsrnZwvfj4+Az3ufHL080y3PgcXS8pKUmenp4ZJoW1WCw29/3rr78kya7XZmJiopYuXar69eurQYMGNssceZ3Z26+3kidPHvn6+tq0+fj42MwBkb6f6+cQkKRChQrJ09Pzlv13s33my5fPps2RfTRr1sz6ZXX58uVq3ry5wsLCVLhwYS1fvlxr167VpUuXnFYEsVgsWrFihVq0aKGJEyeqdu3aCg4O1oABA6zz2qQ/b3Xr1s3wvM2fPz9DgTezPnD2e1M6e477WrVqqVGjRta5NH744QfFx8erf//+du0js+PI29tbBQoUyLCut7e3zfF18uRJff/99xn6LX3ulxv77t/e42/F3tdzuszerxs3bqyFCxdai14lSpRQtWrVMn0/vpOst3pt35izSpUqGjhwoD755BMdOXJEU6ZMUVJSkkaOHPmv+9m4caMiIyMlSe+++67Wrl2rTZs2afjw4XZnPXnypHbs2JHhOcybN6+MMZn+gQNA1uHqMADconr16lq6dKn279+f4a/m6QoWLKiEhIQM7cePH5ckBQUFSfrnKh32TpL3wgsv6I8//rD+dbJnz552Z77xy0j6/ocNG6ZOnTplep9KlSpJkj755BNFRERo5syZNsszmwizd+/e6t27ty5cuKA1a9Zo1KhRatu2rfbv36+QkBC7+8URYWFh+uKLL2SM0Y4dO/Thhx9qzJgxyp07t15++WWHtpX+ITchISHDF+Djx49nyHdjv95K+oSaU6ZM0ZQpUzJd/swzzziU1x0KFiyoEydOZGi/sS29r9555x3Vq1cv021d/5fR6xUrVkybNm2yaUs/Hm+2v/S28uXL3zL7tWvX9Ndff9l8cTLG6MSJE9a/CqcvO3bsWIZRSzcqVaqUpkyZoo4dO6pTp0766quvrF8gHXmd2duvd6pgwYLasGGDjDE2x29iYqKuXbvm8Gsws9eAI/to1qyZ3n//fW3cuFEbNmywTlj84IMPKjY2VocPH5a/v/9Nj6F06X1+4+SumX1hCwkJsb4e9+/fry+//FKjR4/WlStXNGvWLGu+r7/+2q4Rdzd7H3Dme1M6e4/7AQMG6JFHHtHWrVs1ffp0VaxY0ToCzZWCgoJUvXp1jRs3LtPl6QVvZ7D39ZzuZs9Thw4d1KFDB6WkpOjXX3/V+PHj9dhjj6l06dKqX7++U7Le6rWdWfH5+syDBg3SmDFjrFc0u5UvvvhCXl5e+uGHH2wKWQsXLrQ7a1BQkHLnzq0PPvjgpssBuA8jQQC4RfoVBG51idFmzZrpp59+sn65T/fRRx8pT5481g/0rVq10v79+63Dem8lV65cmj17tp5//nn16tUrQ1HCEZUqVVKFChX022+/WUe63PiTfok+i8WS4XK6O3bsyHDqyvX8/PzUqlUrDR8+XFeuXNHu3bsl2d8vt8NisahGjRqaOnWqAgMDtXXrVoe3kX5qyyeffGLTvmnTJu3Zs8d61QdHnTlzRt9++60aNmyolStXZvjp3r27Nm3aZNeHXHdr2rSpdu/erd9++82m/bPPPrO53bBhQwUGBiouLu6mx5i3t3em+/D29r7p8Zju008/tbm9bt06HT58+JZXlkl//m58fhcsWKALFy5Yl0dGRsrDw8Pu11hkZKSWLl2qNWvWqG3bttbTfBx5nTVt2lQrVqywjkKQ/rmc9fz58+3KYK9mzZrp/PnzGb4UffTRR9blWbmPZs2ayWKxaOTIkcqVK5caN24sSXrooYe0cuVKxcbGqnHjxv96Ra700zx27Nhh0/6///3vlverWLGiRowYobCwMOt7RosWLeTp6ak//vjjps+bI5zx3pTO3uO+Y8eOKlWqlIYMGaLly5erX79+DhVtb1fbtm21a9culStXLtN+u50iyM1GXNj7enZkP02aNNGbb74pSRmuBHQnbvbaLleunLXgntkfCKR/CvDJyck2fXfjCL10FotFnp6eNqcYXbp0SR9//HGGdW+2jbZt2+qPP/5QwYIFM30O7TmlCoDrMBIEgMvt2rXLelm/pKQkffPNN4qNjVXHjh1VpkyZm95v1KhR1nOjX331VRUoUECffvqpFi1apIkTJyogIECSNHDgQM2fP18dOnTQyy+/rPvuu0+XLl3S6tWr1bZtWzVt2jTDtidPnqy8efOqX79+On/+vF544YXbemyzZ89Wq1at1KJFC/Xq1UvFixfX6dOntWfPHm3dutV6Pnnbtm31+uuva9SoUWrSpIn27dunMWPGqEyZMjaXPHzqqaeUO3duNWzYUEWLFtWJEyc0fvx4BQQEWP8iZ2+/2OuHH37QjBkz9PDDD6ts2bIyxuibb77R2bNnb+uvnpUqVdLTTz+td955R7ly5VKrVq0UHx+vkSNHqmTJkho0aJDD25T++eJy+fJlDRgwINMv6QULFtSnn36q999/X1OnTrW279y5U19//XWG9evWrWv9C/WJEycyXad06dIOf1mzx8CBA/XBBx+oTZs2Gjt2rAoXLqxPP/00wyWd/f399c477ygqKkqnT59Wly5dVKhQIf3111/67bff9Ndff91RIW/z5s3q06ePHnnkER09elTDhw9X8eLFraeZZKZ58+Zq0aKFXnrpJSUnJ6thw4basWOHRo0apVq1aqlHjx6S/um7V155Ra+//rouXbqkbt26KSAgQHFxcTp16pT10prXe+CBB7RixQq1bNlSkZGRWrx4sQICAux+nY0YMUL/+9//9OCDD+rVV19Vnjx5FBMT4/RLUvbs2VMxMTGKiopSfHy8wsLC9Msvv+iNN95Q69atnXLaiSP7KFSokKpVq6Zly5apadOmypMnj6R/iiCnT5/W6dOnMx05daMiRYrooYce0vjx45U/f36FhIRoxYoV+uabb2zW27Fjh/r3769HHnlEFSpUkLe3t3766Sft2LHDOjqjdOnSGjNmjIYPH66DBw+qZcuWyp8/v06ePKmNGzfKz88v02Pgeva+N40ePVqvvfaaVq5cadeloe097j08PBQdHa2XXnpJfn5+GebNcJUxY8YoNjZWDRo00IABA1SpUiVdvnxZ8fHxWrx4sWbNmmX3KaDpwsLCJElvvvmmWrVqJQ8PD1WvXt3u1/OtvPrqqzp27JiaNWumEiVK6OzZs3r77bfl5eWlJk2a3FYfZCYoKEgPPvigRo4cKT8/P82YMUN79+61uUzu008/rbNnz6pz586qVq2aPDw8tHfvXk2dOlW5cuXSSy+9ZNMn33zzjWbOnKk6deooV65cCg8PV5s2bTRlyhQ99thjevrpp5WUlKS33norwx8y0rfxxRdfaP78+Spbtqx8fX0VFhamgQMHasGCBWrcuLEGDRqk6tWrKy0tTUeOHNGyZcs0ZMgQ3X///U7rGwAOcs98rABygsyuDhMQEGBq1qxppkyZYnPpPWMyXh3GGGN27txp2rVrZwICAoy3t7epUaOGzWUa0505c8Y8//zzplSpUsbLy8sUKlTItGnTxuzdu9cYc/MrhUyaNMlIMq+++upNH8e/XWXkt99+M127djWFChUyXl5epkiRIubBBx80s2bNsq6TkpJihg4daooXL258fX1N7dq1zcKFCzPMgj9v3jzTtGlTU7hwYePt7W2KFStmunbtanbs2OFwv9zsaiE3Xulh7969plu3bqZcuXImd+7cJiAgwNx3333mww8/vGmfpMvs6jDG/DOb/ptvvmkqVqxovLy8TFBQkHn88cetl9BNd+PlUW+lZs2aGa7WcKN69eqZoKAgk5KSYn2cN/tJf/whISE3XScqKuqm+7rZ1WEyezyZXe0gLi7ONG/e3Pj6+poCBQqYJ5980nz33XeZXp1j9erVpk2bNqZAgQLGy8vLFC9e3LRp08bmub2dq8MsW7bM9OjRwwQGBprcuXOb1q1bm99///1fs1+6dMm89NJLJiQkxHh5eZmiRYuaZ5991ubSuuk++ugjU7du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HtNvv/2m+fPny9/fX0uXLrW+H0jSt99+q82bN2vatGm6cOGCu2Lf1VJTU63DsidNmqTIyEht2bJFqampKl68uObPn68qVarI19dX69atU+fOnXXy5EkdO3ZMEpPRZcYYo3Pnzqljx47aunWr3n//fS1atEgpKSnq06ePdu3apQ4dOqh169Z67733tHnzZuvvLvw7i8WipKQk7d69WxUqVFD//v3Vt29fjRw5Ul9++aWCg4N18OBBnT9/3t1R70o3O8569+6tLl26KDk5WRs2bLC2t27dWu3atdPOnTs1c+bMrIqZbRw8eFANGzbUu+++q99//11jxoyR9M/Q+MKFC6tTp05at26dJGn48OGKiYnR448/ritXrqhly5aaPXu2ze8t/COz4/TNN99U1apVdezYMetEs5L06quvqkKFCpo8ebL27duXlTGzFYvFovPnz6tTp06aMGGCNm3apMcff1zTpk3T6dOnFRERoUGDBmn06NHaunWrJOnMmTPWU7hg6/rPPxaLRZ6envrtt9+0adMma5sk9erVS5GRkXr99ddt2u9Z7q3B5Ay7du0ydevWNdWqVTN9+vQxW7duNcb889cMX19fs27dOpv1IyIizOjRo90RNVtIr0yOHz/eVKhQwSxfvtxcvXrVzJ0711gsFjN16lRjjDEbN240Xl5e5p133nFj2uylV69eZtCgQdbbw4cPN97e3ubLL780xhizd+9e07NnT5M/f37TsWNHY7FYzPfff++uuHeVG4def/XVV6ZEiRKmVKlSZuXKldb2t99+25QpU8bMmzfP5j6TJ082FStWNGfOnMmixNnPmTNnzNKlS03btm3NsmXLjDHGvPfee6ZYsWImICDAxMTE2Kw/ceJE88orr7gjarYRHx9vwsPDze+//26MMWbVqlUmb9685oknnrD+1W3Tpk2mffv2pl69epmeMof/s2jRIvPJJ5+Y48ePW/uqbdu2xmKxmEaNGpn9+/db192+fbvp27evte/xf65/b1y4cKEZMWKEmTdvntm5c6cx5p/T4Nq0aWPat29vM4Lu+PHjJioqylSoUMEcOnQoq2PftSZPnmw8PDxM2bJlTbVq1cyuXbuMMcZcvXrVus4rr7xiWrZsaapUqWJKlChhHbGYlpZm+vTpY5o0aWLi4+Pdkv9udP0xmpiYaDZu3Gji4+Otpwz/8ssvxmKx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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "saved -> block_reason_by_state_all.{png,tsv} + block_reason_share_by_state.tsv\n" ] } ], "source": [ "# =============================================================================\n", "# Block reasons for ALL 20,974 indef-blocked no_row users, split by\n", "# mentorshipState (0 / 50 / unset).\n", "#\n", "# cell-11 only bucketed the 373 indef-blocked who had also asked a question \u2014\n", "# too small to generalise from. This cell runs the same bucket function over\n", "# the full block_status.jsonl set, so we can see whether state=0 vs unset have\n", "# different abuse-reason mixes.\n", "# =============================================================================\n", "import matplotlib.pyplot as plt\n", "\n", "blk = pd.read_json(ROOT / \"analysis/diagnose_missing_mentors/block_status.jsonl\",\n", " lines=True)\n", "blk = blk[blk[\"indefinite\"]].copy()\n", "print(f\"indefinitely-blocked uids: {len(blk):,}\")\n", "\n", "# attach mentorshipState\n", "uid2state = dict(zip(ds[\"userId\"].astype(int), ds[\"mentorshipState\"]))\n", "blk[\"mentorshipState\"] = blk[\"uid\"].map(uid2state)\n", "print(\"by state:\")\n", "print(blk.groupby(\"mentorshipState\").size().to_string())\n", "\n", "# same bucket function as cell-11\n", "def bucket(text):\n", " t = (text or \"\").lower()\n", " if \"checkuser\" in t: return \"checkuser\"\n", " if \"sock\" in t: return \"sockpuppet\"\n", " if \"spam\" in t or \"advertis\" in t or \"promot\" in t or \"paid\" in t: return \"spam/promo\"\n", " if \"username\" in t or \"ublock\" in t: return \"username\"\n", " if \"vandal\" in t or \"voa\" in t: return \"vandalism\"\n", " if \"nothere\" in t or \"not here\" in t: return \"not-here\"\n", " if \"disrupt\" in t: return \"disruption\"\n", " if \"harass\" in t or \"personal attack\" in t or \"npa\" in t: return \"harassment\"\n", " if \"lta\" in t or \"long-term abuse\" in t: return \"LTA\"\n", " if \"block evasion\" in t or \"evasion\" in t: return \"block-evasion\"\n", " if t.strip() == \"\": return \"(empty)\"\n", " return \"other\"\n", "\n", "blk[\"cat\"] = blk[\"reason\"].map(bucket)\n", "\n", "# absolute counts: category x state\n", "tab = blk.pivot_table(index=\"cat\", columns=\"mentorshipState\",\n", " aggfunc=\"size\", fill_value=0)\n", "tab[\"total\"] = tab.sum(axis=1)\n", "tab = tab.sort_values(\"total\", ascending=False)\n", "print(\"\\n=== block reason category x mentorshipState (absolute counts) ===\")\n", "print(tab.to_string())\n", "\n", "# within-state shares (column-wise %): lets you compare state-0 vs unset mixes\n", "share = (tab.drop(columns=\"total\")\n", " .div(tab.drop(columns=\"total\").sum(axis=0), axis=1)\n", " .mul(100).round(2))\n", "print(\"\\n=== same table, as within-state share (%) ===\")\n", "print(share.to_string())\n", "\n", "# save\n", "tab.to_csv(ROOT / \"analysis/diagnose_missing_mentors/block_reason_by_state_all.tsv\", sep=\"\\t\")\n", "share.to_csv(ROOT / \"analysis/diagnose_missing_mentors/block_reason_share_by_state.tsv\",sep=\"\\t\")\n", "\n", "# stacked bar (absolute, log scale so state=50's tiny count doesn't disappear)\n", "plot_tab = tab.drop(columns=\"total\")\n", "ax = plot_tab.plot(kind=\"bar\", stacked=True, figsize=(11, 6), logy=True)\n", "ax.set_xlabel(\"block reason category\")\n", "ax.set_ylabel(\"number of indef-blocked no_row users (log scale)\")\n", "ax.set_title(\"Block reasons for ALL indef-blocked no_row users, by mentorshipState\")\n", "ax.legend(title=\"mentorshipState\")\n", "plt.xticks(rotation=35, ha=\"right\")\n", "plt.tight_layout()\n", "plt.savefig(ROOT / \"analysis/diagnose_missing_mentors/block_reason_by_state_all.png\",dpi=130)\n", "plt.show()\n", "print(\"\\nsaved -> block_reason_by_state_all.{png,tsv} + block_reason_share_by_state.tsv\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Where the `reg_ts MISSING` number comes from\n", "\n", "The next cell will print `users with reg_ts MISSING : 7,378`. That count is **every uid in `z_mentorship_state.tsv` whose lookup in `build/registrations.jsonl` returned NaN**, regardless of whether the uid is in the snapshot. It splits into:\n", "\n", "- **no_row & reg_ts NaN** \u2014 the 6,451 \"deleted\"-tagged group from the 5-reason no_row breakdown above.\n", "- **has_row & reg_ts NaN** \u2014 927 users with a real mentor row but no local enwiki reg_ts (audited in the new cell below).\n", "\n", "The pre-check cell below prints both sub-counts so the 7,378 doesn't appear out of nowhere." ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "reg_ts NaN total : 7,378\n", " group A: no_row & NaN : 6,451 # the 5-reason 'deleted' bucket\n", " group B: has_row & NaN : 927 # has mentor row but no local enwiki reg_ts\n" ] } ], "source": [ "# Pre-check: decompose `reg_ts.isna()` BEFORE the realized-rollout cell prints 7,378.\n", "# 7,378 = (no_row & reg_ts NaN) + (has_row & reg_ts NaN)\n", "in_snap_mask = ds[\"userId\"].map(lambda u: u in snap)\n", "n_total = int(ds[\"reg_ts\"].isna().sum())\n", "n_A = int((~in_snap_mask & ds[\"reg_ts\"].isna()).sum())\n", "n_B = int(( in_snap_mask & ds[\"reg_ts\"].isna()).sum())\n", "print(f\"reg_ts NaN total : {n_total:,}\")\n", "print(f\" group A: no_row & NaN : {n_A:,} # the 5-reason 'deleted' bucket\")\n", "print(f\" group B: has_row & NaN : {n_B:,} # has mentor row but no local enwiki reg_ts\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 11 \u2014 Realized rollout share per phase, with bounds for users whose `reg_ts` is missing\n", "\n", "This cell measures how the realized Z=1 share in `ds` compares to the share implied by each rollout phase's `mentorship_pct` and `homepage_pct`. The Z mapping used here is `Z=1` if `mentorshipState \u2208 {unset, 50}`, else `Z=0`.\n", "\n", "For each phase, the cell computes:\n", "\n", "- **`n_known`**: number of users with a known `reg_ts` whose registration falls in that phase.\n", "- **`realized_baseline_%`**: realized Z=1 share among `n_known`.\n", "- **`nominal_Z1_all_users`**: expected Z=1 share under the rollout configuration. For phases with `homepage_pct == 1.0`, this equals `mentorship_pct`. For the early phase `homepage_25pct_mentor_20pct`, the expected share is `(1 \u2212 homepage_pct) \u00d7 1 + homepage_pct \u00d7 mentorship_pct` = 0.75 \u00d7 1 + 0.25 \u00d7 0.20 = 0.80, because users not shown the Newcomer Homepage never have the A/B-assignment code run and remain `unset` (Z=1 under this mapping).\n", "- **Bounds (`lower_all_miss_as_Z0`, `upper_all_miss_as_Z1`)**: realized share recomputed under the two extreme assumptions about users whose `reg_ts` is missing (all assumed Z=0 vs all assumed Z=1).\n", "\n", "The cell first prints the count of users with `reg_ts` missing \u2014 **7,378** (Z=1: 6,771; Z=0: 607). The two previous cells decomposed this 7,378 into 6,451 (`no_row & reg_ts NaN`) plus 927 (`has_row & reg_ts NaN`).\n", "\n", "Per-phase realized vs nominal (identifying phases only):\n", "\n", "| phase | window | nominal Z1 | realized baseline | diff (pp) |\n", "|---|---|---|---|---|\n", "| p10 | 2022-03-07 to 2023-07-10 | 10.0% | 11.753% | +1.75 |\n", "| p25 | 2023-07-11 to 2023-10-04 | 25.0% | 26.145% | +1.14 |\n", "| p50 | 2023-10-05 to 2025-02-02 | 50.0% | 50.574% | +0.57 |\n", "| p75 | 2025-02-03 to 2025-02-16 | 75.0% | 73.899% | -1.10 |\n", "\n", "Realized shares match the nominal targets to within 1.75 percentage points across all identifying phases. The bounds for missing-`reg_ts` users are narrow (less than 0.5 pp for p10, p25, p50), which shows that the missing-`reg_ts` cohort is too small to move the realized share appreciably.\n", "\n", "The output table is saved to `rollout_realized_with_bounds.tsv`.\n" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "users with reg_ts known : 4,974,055\n", "users with reg_ts MISSING : 7,378 (Z=1: 6,771, Z=0: 607)\n", "\n", "=== realized vs nominal-under-our-Z-mapping, per phase ===\n", " phase start end homepage_pct mentor_pct_of_hp nominal_Z1_all_users n_known realized_baseline_% if_all_miss_here_actual_Z lower_all_miss_as_Z0 upper_all_miss_as_Z1 diff_baseline_vs_nominal_pp identifying\n", "homepage_25pct_mentor_20pct 2021-09-20 2022-03-06 25.0 20.0 80.0 583837 80.386 80.528 79.383 80.631 0.39 False\n", " p10 2022-03-07 2023-07-10 100.0 10.0 10.0 1610204 11.753 12.118 11.700 12.156 1.75 True\n", " p25 2023-07-11 2023-10-04 100.0 25.0 25.0 264563 26.145 27.926 25.436 28.149 1.14 True\n", " p50 2023-10-05 2025-02-02 100.0 50.0 50.0 1444626 50.574 50.784 50.317 50.825 0.57 True\n", " p75 2025-02-03 2025-02-16 100.0 75.0 75.0 42810 73.899 76.526 63.035 77.736 -1.10 True\n", " p100 2025-02-17 2026-6-8 100.0 100.0 100.0 37638 98.257 97.194 82.153 98.543 -1.74 False\n", "\n", "saved -> rollout_realized_with_bounds.tsv\n" ] } ], "source": [ "# =============================================================================\n", "# Realized rollout % per phase, with bounds for missing-reg users.\n", "#\n", "# What \"Z=1\" means in OUR mapping (per Martin's release doc):\n", "# Z=1 (UI enabled by rollout) = mentorshipState \u2208 {unset, 50}\n", "# Z=0 (A/B disabled) = mentorshipState == 0\n", "#\n", "# Why \"nominal\" needs two columns for the nested early phase:\n", "# -----------------------------------------------------------\n", "# In the late phases (p10/p25/p50/p75/p100), Newcomer Homepage rollout is\n", "# already 100%, so EVERY new user is evaluated by the mentorship A/B code.\n", "# In that case, nominal = mentorship_pct directly.\n", "#\n", "# But in the early phase `homepage_25pct_mentor_20pct`, only 25% of new users\n", "# saw the Newcomer Homepage, and only those 25% went through the mentorship\n", "# A/B evaluation. The other 75% never had the A/B code touch their property,\n", "# so their mentorshipState stays `unset` -> they get tagged Z=1 in OUR mapping.\n", "#\n", "# So among ALL new registrants in this phase, the EXPECTED Z=1 share is:\n", "#\n", "# expected_Z1_share\n", "# = (1 - homepage_pct) * 1.0 # never saw homepage -> unset -> Z=1\n", "# + homepage_pct * mentorship_pct # saw homepage, A/B picked them -> Z=1\n", "#\n", "# For the early phase that's 0.75*1 + 0.25*0.20 = 0.80 = 80%. That 80% does\n", "# NOT mean \"80% were really shown the mentor UI\" \u2014 it means \"80% would carry\n", "# Z=1 under our `unset\u222a50` mapping\", because 3/4 of them never had the A/B\n", "# code run at all. This phase is therefore identifying=False; we only use it\n", "# as a sanity check.\n", "#\n", "# For the late phases (homepage_pct=1.0), the formula collapses to\n", "# `mentorship_pct`, which is the actual rollout target.\n", "# =============================================================================\n", "ds[\"Z\"] = ds[\"mentorshipState\"].isin([\"unset\", \"50\"]).astype(int)\n", "\n", "known = ds[ds[\"reg_ts\"].notna()].copy()\n", "miss = ds[ds[\"reg_ts\"].isna()].copy()\n", "M_total = len(miss); M_z1 = int(miss[\"Z\"].sum()); M_z0 = M_total - M_z1\n", "print(f\"users with reg_ts known : {len(known):,}\")\n", "print(f\"users with reg_ts MISSING : {M_total:,} (Z=1: {M_z1:,}, Z=0: {M_z0:,})\")\n", "\n", "def phase_of(ts):\n", " if pd.isna(ts): return None\n", " d = ts.date().isoformat()\n", " for label, start, end, *_ in ROLLOUT:\n", " if start <= d <= end: return label\n", " return None\n", "known[\"phase\"] = known[\"reg_ts\"].apply(phase_of)\n", "\n", "def pct(z1, n): return round(100*z1/n, 3) if n else float(\"nan\")\n", "\n", "rows = []\n", "for label, start, end, mentor_pct, hp_pct, ident in ROLLOUT:\n", " if mentor_pct is None: continue\n", " expected_z1 = (1 - hp_pct) * 1.0 + hp_pct * mentor_pct # effective nominal under our Z mapping\n", " sub = known[known[\"phase\"] == label]\n", " n = len(sub); z1 = int(sub[\"Z\"].sum())\n", " rows.append({\n", " \"phase\": label,\n", " \"start\": start,\n", " \"end\": end,\n", " \"homepage_pct\": round(hp_pct*100, 1),\n", " \"mentor_pct_of_hp\": round(mentor_pct*100, 1), # 'rollout target' AMONG homepage viewers\n", " \"nominal_Z1_all_users\": round(expected_z1*100, 2), # what we should see in OUR mapping\n", " \"n_known\": n,\n", " \"realized_baseline_%\": pct(z1, n),\n", " \"if_all_miss_here_actual_Z\": pct(z1 + M_z1, n + M_total),\n", " \"lower_all_miss_as_Z0\": pct(z1, n + M_total),\n", " \"upper_all_miss_as_Z1\": pct(z1 + M_total, n + M_total),\n", " \"diff_baseline_vs_nominal_pp\": round(pct(z1, n) - expected_z1*100, 2),\n", " \"identifying\": ident,\n", " })\n", "\n", "res = pd.DataFrame(rows)\n", "print(\"\\n=== realized vs nominal-under-our-Z-mapping, per phase ===\")\n", "print(res.to_string(index=False))\n", "res.to_csv(ROOT/\"analysis/diagnose_missing_mentors/rollout_realized_with_bounds.tsv\",\n", " sep=\"\\t\", index=False)\n", "print(\"\\nsaved -> rollout_realized_with_bounds.tsv\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Audit: `reg_ts MISSING` is two different groups\n", "\n", "The 7,378 `reg_ts.isna()` users above are **not** all \"deleted accounts.\" They split into:\n", "\n", "| group | in snapshot? | meaning | count |\n", "|---|---|---|---|\n", "| A | no_row & reg_ts NaN | originally tagged `5_deleted` in the no_row breakdown; later found to be pre-rollout **global** CentralAuth accounts whose enwiki local registration log is missing | 6,451 |\n", "| B | has_row & reg_ts NaN | has a real mentor row, but `build/registrations.jsonl` has no local enwiki reg_ts for them | **927** |\n", "\n", "Group A is the one analyzed throughout this notebook (5 no_row reasons).\n", "Group B was **not** broken out anywhere; it was surfaced only when building the for-Martin file (`analysis/for_martin/users_name_state_regts.tsv`).\n", "\n", "The next cell audits group B: by state, by snapshot's `mentor_assigned_ts` month (a proxy for when they entered), and exports the list." ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "group B size (has_row & reg_ts NaN): 927\n", "\n", "--- by mentorshipState ---\n", "mentorshipState\n", "0 581\n", "unset 346\n", "\n", "--- by Z (unset|50 vs 0) ---\n", "mentorshipState\n", "Z=0 581\n", "Z=1 346\n", "\n", "--- by assigned_month ---\n", "assigned_month\n", " 927\n", "\n", "written -> /home/yubozhou/2026_summer/wikipedia_2sls/2sls_pipeline/analysis/diagnose_missing_mentors/group_B_has_row_no_reg.tsv\n", "\n", "sanity: reg_ts NaN total=7,378 = A(no_row & NaN)=6,451 + B(in_snap & NaN)=927\n" ] } ], "source": [ "# =============================================================================\n", "# Audit group B: users WITH a mentor row in snapshot but NO local enwiki reg_ts.\n", "# Expected: 927 (= 7,378 reg_ts MISSING - 6,451 no_row deleted).\n", "# =============================================================================\n", "in_snap = ds[\"userId\"].map(lambda u: u in snap)\n", "groupB = ds[in_snap & ds[\"reg_ts\"].isna()].copy()\n", "print(f\"group B size (has_row & reg_ts NaN): {len(groupB):,}\")\n", "\n", "print(\"\\n--- by mentorshipState ---\")\n", "print(groupB[\"mentorshipState\"].value_counts(dropna=False).to_string())\n", "\n", "print(\"\\n--- by Z (unset|50 vs 0) ---\")\n", "print(groupB[\"mentorshipState\"].isin([\"unset\",\"50\"]).value_counts().rename({True:\"Z=1\",False:\"Z=0\"}).to_string())\n", "\n", "def assigned_ts(uid):\n", " v = snap.get(uid)\n", " if v is None: return None\n", " for x in (v if isinstance(v,(list,tuple)) else [v]):\n", " if isinstance(x,str) and len(x)>=8 and x[:4].isdigit():\n", " return x\n", " return None\n", "groupB[\"assigned_ts\"] = groupB[\"userId\"].map(assigned_ts)\n", "groupB[\"assigned_month\"] = pd.to_datetime(groupB[\"assigned_ts\"], errors=\"coerce\").dt.to_period(\"M\").astype(\"string\")\n", "\n", "print(\"\\n--- by assigned_month ---\")\n", "print(groupB[\"assigned_month\"].value_counts(dropna=False).sort_index().to_string())\n", "\n", "OUT = ROOT / \"analysis/diagnose_missing_mentors/group_B_has_row_no_reg.tsv\"\n", "groupB[[\"userId\",\"mentorshipState\",\"assigned_ts\"]].to_csv(OUT, sep=\"\\t\", index=False)\n", "print(f\"\\nwritten -> {OUT}\")\n", "\n", "n_missing = int(ds[\"reg_ts\"].isna().sum())\n", "n_groupA = int((~in_snap & ds[\"reg_ts\"].isna()).sum())\n", "print(f\"\\nsanity: reg_ts NaN total={n_missing:,} = A(no_row & NaN)={n_groupA:,} + B(in_snap & NaN)={len(groupB):,}\")" ] } ], "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.11.7" } }, "nbformat": 4, "nbformat_minor": 4 }