diff --git a/02_activities/assignments/a1_sampling_and_reproducibility.ipynb b/02_activities/assignments/a1_sampling_and_reproducibility.ipynb index 873f5985..4ac2a820 100644 --- a/02_activities/assignments/a1_sampling_and_reproducibility.ipynb +++ b/02_activities/assignments/a1_sampling_and_reproducibility.ipynb @@ -16,7 +16,23 @@ "cell_type": "markdown", "id": "4ea73db3", "metadata": {}, - "source": [] + "source": [ + " First, the code creates a group of 1000 people. There are 200 people at the wedding and 800 people at the brunch. This group of 1000 people is the sampling frame.\n", + "\n", + "The first random sample happens when the code chooses who gets infected:\n", + "\n", + "`np.random.choice(ppl.index, size=int(len(ppl) * ATTACK_RATE), replace=False)`\n", + "\n", + "Since `ATTACK_RATE = 0.10`, the code randomly chooses 100 people out of the 1000 people to be infected. The function uses `ppl.index` as the sampling frame. The argument `replace=False` means that one person cannot be selected more than once.\n", + "\n", + "The second random step happens during primary contact tracing:\n", + "\n", + "`np.random.rand(sum(ppl['infected'])) < TRACE_SUCCESS`\n", + "\n", + "This part randomly decides which infected people are successfully traced. Since `TRACE_SUCCESS = 0.20`, each infected person has a 20% chance of being traced. This is like a Bernoulli process because each infected person either gets traced or does not get traced.\n", + "\n", + "The third stage is secondary contact tracing. This step is depends on the random results from the earlier steps. The code counts how many traced infected people came from each event. If an event has at least 2 traced cases, then all infected people from that event are marked as traced." + ] }, { "cell_type": "markdown", @@ -30,7 +46,9 @@ "cell_type": "markdown", "id": "4cf5d993", "metadata": {}, - "source": [] + "source": [ + "When I changed the number of repetitions, the graphs changed in how stable they looked. With 10 repetitions, the graph was very rough and unstable. Since the simulation only ran 10 times, each random result had a big effect on the final graph. The traced cases from weddings were especially spread out. In some simulations, very few traced cases were connected to weddings, while in others the proportion was much higher. With 100 repetitions, the graph became more stable than the 10-repetition graph. The results were more clearly centered around 0.20, which makes sense because 200 out of the 1000 people were at the wedding. However, there was still some variation, especially for the traced cases. With 1000 repetitions, the graph was much smoother. This is because running the simulation many more times helps average out random variation. However, the results are still not fully reproducible unless a random seed is set. Without a seed, the script can still choose different infected and traced people each time it runs." + ] }, { "cell_type": "markdown", @@ -44,7 +62,13 @@ "cell_type": "markdown", "id": "77613cc3", "metadata": {}, - "source": [] + "source": [ + "I made the code reproducible by adding `np.random.seed(42)` before running the simulation.\n", + "\n", + "This is needed because the model uses random functions, such as `np.random.choice()` to choose infected people and `np.random.rand()` to decide which infected people are traced. Without setting a seed, these random choices change every time the code runs.\n", + "\n", + "After adding the seed, NumPy uses the same sequence of random numbers each time. This means that if I run the script multiple times with the same number of repetitions, I get the same output and the same graph." + ] }, { "cell_type": "markdown", @@ -56,10 +80,67 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, + "id": "837f4d27", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "114.41s - pydevd: Sending message related to process being replaced timed-out after 5 seconds\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: pandas in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (2.3.3)\n", + "Requirement already satisfied: numpy in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (2.0.2)\n", + "Requirement already satisfied: matplotlib in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (3.9.4)\n", + "Collecting seaborn\n", + " Using cached seaborn-0.13.2-py3-none-any.whl.metadata (5.4 kB)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from pandas) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from pandas) (2026.1.post1)\n", + "Requirement already satisfied: tzdata>=2022.7 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from pandas) (2026.1)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from matplotlib) (1.3.0)\n", + "Requirement already satisfied: cycler>=0.10 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from matplotlib) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from matplotlib) (4.60.2)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from matplotlib) (1.4.7)\n", + "Requirement already satisfied: packaging>=20.0 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from matplotlib) (26.0)\n", + "Requirement already satisfied: pillow>=8 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from matplotlib) (11.3.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from matplotlib) (3.3.2)\n", + "Requirement already satisfied: importlib-resources>=3.2.0 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from matplotlib) (6.5.2)\n", + "Requirement already satisfied: zipp>=3.1.0 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from importlib-resources>=3.2.0->matplotlib) (3.23.0)\n", + "Requirement already satisfied: six>=1.5 in /Users/eve/Downloads/LCR/lcr-env/lib/python3.9/site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n", + "Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)\n", + "Installing collected packages: seaborn\n", + "Successfully installed seaborn-0.13.2\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pandas numpy matplotlib seaborn" + ] + }, + { + "cell_type": "code", + "execution_count": 11, "id": "ab8587a0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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MWNS79698x1I6qvFB+4I20aHBQAAYE599tlnackll6z3/C0+cEfNdnnDLLDAAk1dHAAAAOYxo0ePzhW55XxZXy0+cJebkUfYFrgBAACYXQ3tpmzQNAAAACiAwA0AAAAFELgBAACgAC2+D3d9TZ06NU2ePLmpiwGtTocOHVK7du2auhgAANDoWn3gjvupjRw5Mn333XdNXRRotbp375569erV4EEoAACgOWv1gbscthdbbLHUtWtXJ/wwly94jR8/Pn355Zf5+eKLL97URQIAgEbTvrU3Iy+H7R49ejR1caBV6tKlS/4boTu+i5qXAwDQUrTqQdPKfbajZhtoOuXvoHEUAABoSVp14C7TjByalu8gAAAtkcANAAAABWjVfbhnZNiwYWnUqFFz7fMWWWSRtNRSSxU+ONwvf/nL9Oyzz+bbMBU1Kvv111+fjjjiiCYd9T0G4jrggAPSnXfemb799tv06quvprXWWiu1BvXZ/ieffHK655570muvvZaf77333nn+mAYAADQegbuOsN23b780YcL4ufaZnTt3TUOHVtU7dM9OQLrwwgvTiBEjcshacMEFU2NYZpllcriLR9luu+2Wtttuu9SUHnzwwRw8n3jiibTccsvlCxpN6bjjjsv76t13362eFv/u169fGjRoUC5rWfw7LhbE/i0PJla0iy++OF+kAAAAGpfAXUvUbEfY7tfvptS1a7/CP2/8+KpUVbVn/twia7k//PDD1L9//7TiiiumIkVInFtBcWbrGreX2nDDDWc4z6RJk1LHjh3nSnk222yzdM455+RWBnGv6fD444+nPn365IsClWL6BhtsMFe3YWNdgAEAAGrSh3sGImx367ZO4Y/GCPWbbrppOuyww9Kxxx6bFl544RzqotlwZU303//+93TjjTfmwamihjxELeqvf/3rtOiii6YFFlggbb755un111+vsez77rsv/eAHP0idO3fONcU777xz9Wd++umn6cgjj8zLLA96FTW03bt3r7GMK6+8Mi2//PI54Pbt2zf99a9/rfF6vPcvf/lLXnaMVh0XBe69997q16NZ+B577JHLGUE0Xr/uuuvq3BaxboceemhuqRDLjXUvl/eQQw7JtfGxHgMHDszTn3zyybTeeuulTp065ZAetdFTpkypsW1jefG+hRZaKPXs2TNdffXVady4cWmfffZJ3bp1SyussEJ64IEHZrh/Nt5449yMvzJcx78PPvjg9M0336RPPvmkxvQI6GHixInpmGOOSUsssUSab7750vrrrz9dQI/tHRdqYrvF9vv666+n+/yzzz47lzvKuu+++6YJEyZMt8122mmneh9P5Rr6WK84LlZZZZX06KOP5u1dbnURFzRie8c2jXmWXnrpdNZZZ81wGwEAQEskcLcQN9xwQw5lL7zwQjr33HPTqaeemh555JH82ksvvZS22Wab9LOf/Sw3K48mxOGnP/1pvvdxhMUhQ4akddZZJ22xxRY5BIZ//etfOcRFE/HoBz148OAcTsNdd92Vllxyyfw5scx41OXuu+9Ohx9+eDr66KPTW2+9lZtLR1CNmtxKp5xySi7fG2+8kT8vAna5HH/4wx/SO++8k8tZVVWVA/yMmonHukWZomxRplj3ym0Uof+ZZ55JV111VfrPf/6TPysuKMSFhljuNddck04//fTptm183osvvpjD94EHHpi3XdSgv/LKK2nrrbfO/ePHj6+7G0Lsl/iMynWO4BzbeqONNqqe/tFHH+ULBeXAHYH1ueeeS7feemveLvGZsR/ff//9/Hrs6wjQMV90FYj31S777bffnsPymWeemV5++eUcgK+44oo6y1nf4ynuXx8BPUJ+vP7nP/85nXDCCTXef8kll+SLJvH5Q4cOTTfffHP1xQ8AAGgtNClvIdZYY4100kkn5X9HDfBll12WA/JWW22Va4ajBjdqh8tNmp9++ukcICNwx2vhj3/8Y66hjMHG9t9//3TGGWekn//85zkMl6255pr5b9R8tmvXLtealpdZl1hm1KAedNBB+flRRx2Vnn/++Ty9HCxDzLP77rvnf0c4jMAW5YuAGSF07bXXTuuuu25+fWbBLZpHR5mibLXLFdslwmNZhMRo1h3bKmpnV1555TR8+PD0u9/9Lp144ompbdu21ev8+9//Pv/7+OOPzzXGEcD322+/PC3mjbAeoTiag9cl1vWOO+7I/46LB1HLHOu0ySab5PAdFyHib9QGxzJinaMWP/727t07vy9qu6N/ekyPbRQXF2L7RE10WGmllfKgeDFP2UUXXZRDeTxCBPKoja5dy92Q4ymCdzTbj/KWt3EcK/FaWZQ73he14LFto4YbAABaGzXcLUQEpEpRkxlhekaiRnfs2LGpR48eaf75569+fPzxxzlMhag1jVrY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/fTTPH/47LPP8rK7d++eFl544fyZn3zySfX8cbHiqKOOyq/36NEjHXvssfkiRqX6rHc0Ka9sVh/r+pe//CXtvPPOqWvXrmnFFVdM9957b433xPOY3rlz51zeG264Ib8vmrOHWI8ddtghLbTQQrn2fNVVV03333//TLc5AAAwdwncLVAEzbPPPjtVVVWlNdZYI40dOzZtt912afDgwenVV19N22yzTQ5rEWzLIjTecsst6ZJLLsnv+9Of/lRdWx4hb/PNN09rr712evnll9ODDz6YA3CE1bLf/va3OeT+4x//SA8//HAOuq+88soMy7jbbrulo48+OgfFqLWPR0ybNm1aDr7ffPNNXt4jjzySPvroo/zajGy00UapQ4cOuVY7vPPOO+m///1v2nfffdPXX3+dg3aI1yPADhgwIE2ePDkNHDgwX6CI5uXPPPNMXt/YNpMmTcrzR3iOiwDXXnttvnARZapdk97Q9S6Liw2x/d544428b/bYY4+8/BDl/clPfpJ22mmnfEHigAMOSCeccEKN9x988MH5IslTTz2V3nzzzXTOOefUaN0AAAA0vZbd1riVOvXUU9NWW21V/Txqb9dcc83q56eddloOjlGLesghh6T33nsv3X777Tncbrnllnme5ZZbrnr+yy67LIftM888s3pahNCoDY/39u7dO9eG33TTTWmLLbbIr0eN7JJLLjnDMnbp0iUHxGjuHrXzZVGGCJAROmP54cYbb8zBPPpCR+18bVHDu9566+Wwu/vuu+e/G2+8ca6p33DDDfPzZZddNv+NsB3To6wR7qOmudwvPvp7R212zLf11lvnWunjjz8+7bLLLtX9wh966KHqz40LGQ1d77Jo5h5lDbFd40LHiy++mAN/XOzo27dvOu+88/Lr8e9oYXDGGWdUvz8uluy6665p9dVXn25/AQAAzYMa7hZo3XXXrfE8guExxxyT+vXrlwNlBN2oxS7XcMegZe3atUs/+tGP6lxe1LJG7XC8r/xYeeWV82vRXD0eUSu8/vrr1wj5ERQbKsoVQbsctsMqq6ySyx2vzWxk8HLz8fgbz0OsU+X0cnPyWKcPPvgg13CX1ynKPGHChLw+33//fa51r1ynuDhQuW3nZL2j5UHlBYNoOv/ll1/m59E8vvaFhbigUOmwww5Lp59+eq7dj4HyoqYcAABoXgTuFqj2iNgRtqNGO2pSo/l0BOyoGS03nY7a5pmJwB5N0ON9lY/3338/bbLJJqk5iCAdte3/+c9/crAuXzwoB+4Ix9FnO5rGl9cp+rnXXqdYxi9+8YvCyxtN4CtFLXvUuNfXr3/969zUPvrSR4uAuBBw6aWXFlBSAABgdgncrUD0T44mzDFIVwTtaMJdOThYTIuwF32R67LOOuukt99+Ow/+FYOpVT4i3C+//PI5QL7wwgvV7/n2229zeJ2Zjh075oHJKkUtfATjeJRFn+zoRx413TMSTcdjeVdccUWupY4wHaKm+KuvvspN4MtNz8vrFBcMFltssenWKQaji0cMgla5TlOmTElDhgypfj676z0rUUMefeUrRXP62qIVwG9+85t011135f7wV1999Rx9LgAA0LgE7lYgRruOUBY1uNGUOmpwK2tTI0jHrbJ+9atf5ftiR//pqBWOft3lAbpiQK/ocxzBL2qLoy/zPvvskwNzNMeOAcpiALHHHnss9zeOgN+27cwPr/jc+KwoV4x4HoOARR/yuAAQg4jF4GPRrzkGdIua6tpN5StFLX3cjztqeaOZdTSRDxHCK6eXa5Zj+YssskgeoC1q/cvrHE21P//88zzP4Ycfngefi20SI8AfdNBB1aOEh9ld71mJQdLi82LU+HL/+vII7uX+5kcccUTeB1Hu2E7R5D8uVgAAAM2HQdNmcn/slvI5F1xwQQ7TUQscITOC3OjRo2vMc+WVV6b//d//zaEyRvaOe4LH8xCDokUtebwvBhOLYLz00kvnAb7K4TIG+Co3PY9+0VHjGv2gZyYG/YoLAdEcPIJsDFoWgTVG/D700ENzc/VYfnxOfZpLx3Ji1O5y/+2yCOsRSMv9t0PcjivmjXWKQdHGjBmTllhiiTz4WfSnDrEO0Y87LkZEOWIbRiuByvWanfWelRjg7c4778zLuvjii/NAbzFK+YEHHpgHfAtxoSMuhMTFgShvbKMLL7xwjj4XAABoXG1KtW8s3MJEsIzmwRGCykGqLJoeRw1hBJy4XVSIgcT69e2bxk+YMNfK2LVz51Q1dGgOuVCXGKE8RkmvbGrfktT1XQSg+YlWVdFta0j//mmdbt2mez0uYL88ZEjqNn//1K799K/TelRNGZP2GDsk9e8/JHXrtk4aM+aVNGRI/9w9L7r2QUvKlTOjhruWCL0RfqOJ89wStc7CNpWiL3r0P+/Ro0duXRA16XELNwAAYN4hcNchwq8ATFOKAd3itl/Rdz6OxWheHvcEBwAA5h0CNzRD0R9bn2wAAJi3GaUcAAAACiBwAwAAQAEE7pRq3JMamPt8BwEAaIladR/ujh075vsrDx8+PC266KL5eZs2bZq6WNBqxF0JJ02alL766qv8XYzvIAAAtBStOnDHCX7c93fEiBE5dANNo2vXrnk09vhOAgBAS9GqA3eIGrU40Z8yZUqaOnVqUxcHWp127dql9u3ba10CAECL0+oDd4gT/Q4dOuQHAAAANAbtNwEAAKAAAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACiBwAwAAQAEEbgAAACiAwA0AAAAFELgBAACgJQfus88+O7Vp0yYdccQR1dMmTJiQDj744NSjR480//zzp1133TV98cUXTVpOAAAAmGcC90svvZT+9Kc/pTXWWKPG9COPPDLdd9996Y477khPPvlkGj58eNpll12arJwAAAAwzwTusWPHpj322CNdffXVaaGFFqqe/v3336drrrkmXXDBBWnzzTdP/fv3T9ddd1169tln0/PPP9+kZQYAAIBmH7ijyfj222+fttxyyxrThwwZkiZPnlxj+sorr5yWWmqp9NxzzzVBSQEAAKD+2qcmdOutt6ZXXnklNymvbeTIkaljx46pe/fuNab37NkzvzYjEydOzI+y0aNHN3KpAQAAoBnXcH/22Wfp8MMPTzfffHPq3Llzoy33rLPOSgsuuGD1o0+fPo22bAAAAGj2gTuajH/55ZdpnXXWSe3bt8+PGBjtkksuyf+OmuxJkyal7777rsb7YpTyXr16zXC5xx9/fO7/XX5EsAcAAIBW06R8iy22SG+++WaNafvss0/up/273/0u10x36NAhDR48ON8OLAwdOjQNGzYsDRgwYIbL7dSpU34AAABAqwzc3bp1S6uttlqNafPNN1++53Z5+r777puOOuqotPDCC6cFFlggHXrooTlsb7DBBk1UagAAAJgHBk2blQsvvDC1bds213DHQGgDBw5MV1xxRVMXCwAAAOatwP3EE0/UeB6DqV1++eX5AQAAAPOSJr8PNwAAALREAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACiBwAwAAQAHaF7FQAKBlGzZsWBo1alRTF4O5rKqqKv8dN358GlPH6zEdgP9P4AYAGhy2+/btlyZMEK5aq3eqqtKUmbw+rVRK7eZieQCaK4EbAGiQqNmOsN2v302pa9d+TV0c5qLx46tSVdWeab4u/VK3dl2ne33ylG/ShAkfp1Kp1CTlA2huBG4AYLZE2O7WbZ2mLgZNoG27rqld+27TTZ86TasHgEoGTQMAAIACCNwAAABQAIEbAAAACiBwAwAAQAEEbgAAACiAwA0AAAAFELgBAACgAAI3AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAAUQuAEAAKAAAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACiBwAwAAQAEEbgAAACiAwA0AAAAFELgBAACgAAI3AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAAUQuAEAAKAAAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACiBwAwAAQAEEbgAAACiAwA0AAAAFELgBAACgAAI3AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAAUQuAEAAKAAAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoADti1goADBvGTZsWBo1alS95q2qqsp/x4//v7+0HvY5QMMI3ADQykXY7te3bxo/YUKD3ldVtWdhZaJ5K5UmNXURAOYJAjcAtHJRsx1h+6Z+/VK/rl1nOf+48ePTO1VVab4u/VLbdrOen5bjmSlfpysmfJJK06Y0dVEA5gkCNwCQRdhep1u3Wc43JqUUcatbu66pXftZz0/L8fHU8U1dBIB5ikHTAAAAoAACNwAAABRA4AYAAICWFrivvPLKtMYaa6QFFlggPwYMGJAeeOCB6tcnTJiQDj744NSjR480//zzp1133TV98cUXTVlkAAAAaP6Be8kll0xnn312GjJkSHr55ZfT5ptvnnbcccf09ttv59ePPPLIdN9996U77rgjPfnkk2n48OFpl112acoiAwAAQPMfpXyHHXao8fyMM87Itd7PP/98DuPXXHNN+tvf/paDeLjuuutSv3798usbbLBBE5UaAAAA5qE+3FOnTk233nprGjduXG5aHrXekydPTltuuWX1PCuvvHJaaqml0nPPPTfD5UycODGNHj26xgMAAABaXeB+8803c//sTp06pd/85jfp7rvvTqusskoaOXJk6tixY+revXuN+Xv27Jlfm5GzzjorLbjggtWPPn36zIW1AAAAgGYWuPv27Ztee+219MILL6QDDzwwDRo0KL3zzjuzvbzjjz8+ff/999WPzz77rFHLCwAAAM2+D3eIWuwVVlgh/7t///7ppZdeShdffHHabbfd0qRJk9J3331Xo5Y7Rinv1avXDJcXNeXxAAAAgFZdw13btGnTcj/sCN8dOnRIgwcPrn5t6NChadiwYbmPNwAAADRnTVrDHc2/t9122zwQ2pgxY/KI5E888UR66KGHcv/rfffdNx111FFp4YUXzvfpPvTQQ3PYNkI5AAAAzV2TBu4vv/wy7bXXXmnEiBE5YK+xxho5bG+11Vb59QsvvDC1bds27brrrrnWe+DAgemKK65oyiIDAABA8w/ccZ/tmencuXO6/PLL8wMAAADmJc2uDzcAAAC0BAI3AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAAUQuAEAAKAAAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACiBwAwAAQAEEbgAAACiAwA0AAAAFELgBAACgAAI3AAAAFEDgBgAAgAII3AAAANBcAvdHH33U+CUBAACA1h64V1hhhbTZZpulm266KU2YMKHxSwUAAACtMXC/8soraY011khHHXVU6tWrVzrggAPSiy++2PilAwAAgNYUuNdaa6108cUXp+HDh6drr702jRgxIm288cZptdVWSxdccEH66quvGr+kAAAA0FoGTWvfvn3aZZdd0h133JHOOeec9MEHH6Rjjjkm9enTJ+211145iAMAAEBrNEeB++WXX04HHXRQWnzxxXPNdoTtDz/8MD3yyCO59nvHHXdsvJICAADAPKT97LwpwvV1112Xhg4dmrbbbrt044035r9t2/5ffl922WXT9ddfn5ZZZpnGLi8AAAC03MB95ZVXpl/96ldp7733zrXbdVlsscXSNddcM6flAwAAgNYTuN9///1ZztOxY8c0aNCg2Vk8AAAAtM4+3NGcPAZKqy2m3XDDDY1RLgAAAGh9gfuss85KiyyySJ3NyM8888zGKBcAAAC0vsA9bNiwPDBabUsvvXR+DQAAAFq72QrcUZP9xhtvTDf99ddfTz169GiMcgEAAEDrC9y77757Ouyww9Ljjz+epk6dmh+PPfZYOvzww9PPf/7zxi8lAAAAtIZRyk877bT0ySefpC222CK1b/9/i5g2bVraa6+99OEGAACA2Q3cccuv2267LQfvaEbepUuXtPrqq+c+3AAAAMBsBu6ylVZaKT8AAACARgjc0Wf7+uuvT4MHD05ffvllbk5eKfpzAwAAQGs2W4E7BkeLwL399tun1VZbLbVp06bxSwYAAACtLXDfeuut6fbbb0/bbbdd45cIAAAAWuttwWLQtBVWWKHxSwMAAACtOXAfffTR6eKLL06lUqnxSwQAAACttUn5008/nR5//PH0wAMPpFVXXTV16NChxut33XVXY5UPAAAAWk/g7t69e9p5550bvzQAAADQmgP3dddd1/glAQAAgNbehztMmTIlPfroo+lPf/pTGjNmTJ42fPjwNHbs2MYsHwAAALSeGu5PP/00bbPNNmnYsGFp4sSJaauttkrdunVL55xzTn5+1VVXNX5JAQAAoKXXcB9++OFp3XXXTd9++23q0qVL9fTo1z148ODGLB8AAAC0nhruf//73+nZZ5/N9+OutMwyy6T//Oc/jVU2AAAAaF013NOmTUtTp06dbvrnn3+em5YDAABAazdbgXvrrbdOF110UfXzNm3a5MHSTjrppLTddts1ZvkAAACg9TQpP//889PAgQPTKquskiZMmJB+8YtfpPfffz8tssgi6ZZbbmn8UgIAAEBrCNxLLrlkev3119Ott96a3njjjVy7ve+++6Y99tijxiBqAAAA0Fq1n+03tm+f9txzz8YtDQAAALTmwH3jjTfO9PW99tprdssDAAAArTdwx324K02ePDmNHz8+3yasa9euAjcAAACt3myNUv7tt9/WeEQf7qFDh6aNN97YoGkAAAAwu4G7LiuuuGI6++yzp6v9BgAAgNao0QJ3eSC14cOHN+YiAQAAoPX04b733ntrPC+VSmnEiBHpsssuSxtttFFjlQ0AAABaV+Deaaedajxv06ZNWnTRRdPmm2+ezj///MYqGwAAALSuwD1t2rTGLwkAAAC0II3ahxsAAACYgxruo446qt7zXnDBBbPzEQAAAND6Averr76aH5MnT059+/bN0957773Url27tM4669To2w0AAACt0WwF7h122CF169Yt3XDDDWmhhRbK07799tu0zz77pB/+8Ifp6KOPbuxyAgAAQMvvwx0jkZ911lnVYTvEv08//XSjlAMAAMDsBu7Ro0enr776arrpMW3MmDGNUS4AAABofYF75513zs3H77rrrvT555/nx9///ve07777pl122aXxSwkAAACtoQ/3VVddlY455pj0i1/8Ig+clhfUvn0O3Oedd15jlxEAAABaR+Du2rVruuKKK3K4/vDDD/O05ZdfPs0333yNXT4AAABoPU3Ky0aMGJEfK664Yg7bpVKp8UoGAAAArS1wf/3112mLLbZIK620Utpuu+1y6A7RpNwtwQAAAGA2A/eRRx6ZOnTokIYNG5abl5fttttu6cEHH2zM8gEAAEDr6cP98MMPp4ceeigtueSSNaZH0/JPP/20scoGAAAArauGe9y4cTVqtsu++eab1KlTp8YoFwAAALS+wP3DH/4w3XjjjdXP27Rpk6ZNm5bOPffctNlmmzVm+QAAAKD1NCmPYB2Dpr388stp0qRJ6dhjj01vv/12ruF+5plnGr+UAAAA0BpquFdbbbX03nvvpY033jjtuOOOuYn5Lrvskl599dV8P24AAABo7Rpcwz158uS0zTbbpKuuuiqdcMIJxZQKAAAAWlsNd9wO7I033iimNAAAANCam5Tvueee6Zprrmn80gAAAEBrHjRtypQp6dprr02PPvpo6t+/f5pvvvlqvH7BBRc0VvkAAACg5Qfujz76KC2zzDLprbfeSuuss06eFoOnVYpbhAEAAEBr16DAveKKK6YRI0akxx9/PD/fbbfd0iWXXJJ69uxZVPkAAACg5ffhLpVKNZ4/8MAD+ZZgAAAAQCMMmjajAA4AAADMRuCO/tm1+2jrsw0AAABz2Ic7arT33nvv1KlTp/x8woQJ6Te/+c10o5Tfdddd9VreWWedled99913U5cuXdKGG26YzjnnnNS3b9/qeeIzjj766HTrrbemiRMnpoEDB6YrrrhCv3EAAABaTg33oEGD0mKLLZYWXHDB/Ij7cffu3bv6eflRX08++WQ6+OCD0/PPP58eeeSRNHny5LT11lvX6Bd+5JFHpvvuuy/dcccdef7hw4enXXbZpWFrCQAAAM25hvu6665r1A9/8MEHazy//vrrc6AfMmRI2mSTTdL333+frrnmmvS3v/0tbb755tVl6NevXw7pG2ywQaOWBwAAAJrFoGmNLQJ2WHjhhfPfCN5R673llltWz7PyyiunpZZaKj333HN1LiOanY8ePbrGAwAAAFpt4J42bVo64ogj0kYbbZRWW221PG3kyJGpY8eOqXv37jXmjf7b8dqM+oVXNm/v06fPXCk/AAAANMvAHX2533rrrTw42pw4/vjjc015+fHZZ581WhkBAACgkD7cRTnkkEPSP//5z/TUU0+lJZdcsnp6r1690qRJk9J3331Xo5b7iy++yK/VJUZQL4+iDgAAAK2yhjtuMxZh++67706PPfZYWnbZZWu83r9//9ShQ4c0ePDg6mlDhw5Nw4YNSwMGDGiCEgMAAMA8UMMdzchjBPJ//OMfqVu3btX9sqPvddyXO/7uu+++6aijjsoDqS2wwALp0EMPzWHbCOUAAAA0Z00auK+88sr8d9NNN60xPW79tffee+d/X3jhhalt27Zp1113zSOQDxw4MF1xxRVNUl4AAACYJwJ3NCmflc6dO6fLL788PwAAAGBe0WxGKQcAAICWROAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACiBwAwAAQAEEbgAAACiAwA0AAAAFELgBAACgAAI3AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAAUQuAEAAKAAAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACiBwAwAAQAEEbgAAACiAwA0AAAAFELgBAACgAAI3AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAAUQuAEAAKAAAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACiBwAwAAQAEEbgAAACiAwA0AAAAFELgBAACgAAI3AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAAUQuAEAAKAAAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACiBwAwAAQAEEbgAAACiAwA0AAAAFELgBAACgAAI3AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAC0tcD/11FNphx12SL17905t2rRJ99xzT43XS6VSOvHEE9Piiy+eunTpkrbccsv0/vvvN1l5AQAAYJ4I3OPGjUtrrrlmuvzyy+t8/dxzz02XXHJJuuqqq9ILL7yQ5ptvvjRw4MA0YcKEuV5WAAAAaIj2qQltu+22+VGXqN2+6KKL0u9///u044475mk33nhj6tmzZ64J//nPfz6XSwsAAAAtoA/3xx9/nEaOHJmbkZctuOCCaf3110/PPfdck5YNAAAAmnUN98xE2A5Ro10pnpdfq8vEiRPzo2z06NEFlhIAAJiR8eOravy9//77U1XV//0bypZbbrk0YMCA1BI128A9u84666x0yimnNHUxAACg1Ro1bVJuSltVtWeN6X/4wx+arEw0X21TSk8/+2yLDN3NNnD36tUr//3iiy/yKOVl8Xyttdaa4fuOP/74dNRRR9Wo4e7Tp0/BpQUAAMrGlKakaSmlUzstk5bv0CNNnvJ1mjDhk9Sp49KpfbuuTV08mpEPp36fTp40PH300UcC99y07LLL5tA9ePDg6oAd4TlGKz/wwANn+L5OnTrlBwAA0LSWbdsl9WvfLU2aNj6NTyl1bb9w6thxwaYuFs3JxPjP8NRSNWngHjt2bPrggw9qDJT22muvpYUXXjgttdRS6Ygjjkinn356WnHFFXMAjyYocc/unXbaqSmLDQAAAM07cL/88stps802q35ebgo+aNCgdP3116djjz0236t7//33T999913aeOON04MPPpg6d+7chKUGAACAZh64N91003y/7Rlp06ZNOvXUU/MDAAAA5iXN9j7cAAAAMC8TuAEAAKAAAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACtC+iIUye4YNG5ZGjRrV1MVgHrDIIoukpZZaqqmLAQAAzITA3YzCdr++fdP4CROauijMA7p27pyqhg4VugEAoBkTuJuJqNmOsH1Tv36pX9euTV0cmrGq8ePTnlVV+ZgRuAEAoPkSuJuZCNvrdOvW1MUAAABgDhk0DQAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACuA83ADM0bNiwNGrUqKYuBgWrqqrKf8eNH5/G1GP+mA8AmDWBG4AZhu2+ffulCROEq9binaqqNKUB808rlVK7AssDAPM6gRuAOkXNdoTtfv1uSl279mvq4lCg8eOrUlXVnmm+Lv1St3ZdZzn/5CnfpAkTPk6lUmmulA8A5lUCNwAzFWG7W7d1mroYzAVt23VN7dp3m+V8U6dp9QAA9WHQNAAAACiAwA0AAAAFELgBAACgAAI3AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAK4D7cAC3YsGHD0qhRo2brvVVVVfnv+PH/95eWyz4GgGII3AAtOGz369s3jZ8wYY6WU1W1Z6OVieatVJrU1EUAgBZF4AZooaJmO8L2Tf36pX5duzb4/ePGj0/vVFWl+br0S23bNfz9zDuemfJ1umLCJ6k0bUpTFwUAWhSBG6CFi7C9TrduDX7fmJRSxK9u7bqmdu0b/n7mHR9PHd/URQCAFsmgaQAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAAUQuAEAAKAAAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACiBwAwAAQAEEbgAAACiAwA0AAAAFELgBAACgAAI3AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAAUQuAEAAKAAAjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AQAAoAACNwAAABRA4AYAAIACCNwAAABQAIEbAAAACiBwAwAAQAEEbgAAACiAwA0AAAAFELgBAACgAAI3AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAAUQuAEAAKAAAjcAAAAUQOAGAACA1hq4L7/88rTMMsukzp07p/XXXz+9+OKLTV0kAAAAmLcD92233ZaOOuqodNJJJ6VXXnklrbnmmmngwIHpyy+/bOqiAQAAwLwbuC+44IK03377pX322Setssoq6aqrrkpdu3ZN1157bVMXDQAAAObNwD1p0qQ0ZMiQtOWWW1ZPa9u2bX7+3HPPNWnZAAAAYGbap2Zs1KhRaerUqalnz541psfzd999t873TJw4MT/Kvv/++/x39OjRqTkbO3Zs/jtkzJg0durUpi4OzdjQ8ePz37gYVT5uoC5Dhw6do9+V8ePHp/il7Tz5q9RuypgCSkhz8dGU//t/5dtTvk3/Lc36WJkydXSK/9N2mjwqtZ82bi6UkHnlWHFsMKNjxbHBjHw0dXT1eUdzzmzlspVKpQa9r02poe+Yi4YPH56WWGKJ9Oyzz6YBAwZUTz/22GPTk08+mV544YXp3nPyySenU045ZS6XFAAAgJbus88+S0suuWTLqOFeZJFFUrt27dIXX3xRY3o879WrV53vOf744/Mga2XTpk1L33zzTerRo0dq06bNdFcp+vTpkzfaAgssUNBa0No4rmhsjimK4LiiCI4riuC4ojkcV1FPPWbMmNS7d+8GfU6zDtwdO3ZM/fv3T4MHD0477bRTdYCO54ccckid7+nUqVN+VOrevftMPyc2sC8vjc1xRWNzTFEExxVFcFxRBMcVTX1cLbjggg1efrMO3CFqqwcNGpTWXXfdtN5666WLLroojRs3Lo9aDgAAAM1Vsw/cu+22W/rqq6/SiSeemEaOHJnWWmut9OCDD043kBoAAAA0J80+cIdoPj6jJuRzIpqen3TSSdM1QYc54biisTmmKILjiiI4riiC44p5+bhq1qOUAwAAwLyqbVMXAAAAAFoigRsAAAAKIHADAABAAVpU4L788svTMssskzp37pzWX3/99OKLL850/jvuuCOtvPLKef7VV1893X///TVej+7tMTr64osvnrp06ZK23HLL9P777xe8FrT042rvvfdObdq0qfHYZpttCl4L5uXj6u2330677rprnj+Ol7g94pwuk5apsY+rk08+ebrfq/h9o3VpyHF19dVXpx/+8IdpoYUWyo84d6o9v/MrijiunF9xeQOOqbvuuivfdrp79+5pvvnmy3fC+utf/1rIb1WLCdy33XZbvmd3jDT3yiuvpDXXXDMNHDgwffnll3XO/+yzz6bdd9897bvvvunVV19NO+20U3689dZb1fOce+656ZJLLklXXXVVeuGFF/LOiGVOmDBhLq4ZLe24CvE/gBEjRlQ/brnllrm0RsyLx9X48ePTcsstl84+++zUq1evRlkmLU8Rx1VYddVVa/xePf300wWuBfP6cfXEE0/k/w8+/vjj6bnnnkt9+vRJW2+9dfrPf/5TPY/zK4o4roLzq9brtgYeUwsvvHA64YQT8vH0xhtvpH322Sc/Hnroocb/rSq1EOutt17p4IMPrn4+derUUu/evUtnnXVWnfP/7Gc/K22//fY1pq2//vqlAw44IP972rRppV69epXOO++86te/++67UqdOnUq33HJLYetByz6uwqBBg0o77rhjgaWmpR1XlZZeeunShRde2KjLpGUo4rg66aSTSmuuuWajl5V5x5z+tkyZMqXUrVu30g033JCfO7+iiOMqOL9q3dZrhPOgtddeu/T73/++0X+rWkQN96RJk9KQIUNyNX9Z27Zt8/O4alGXmF45f4grFuX5P/744zRy5Mga8yy44IK5ecKMlknLUsRxVXmldrHFFkt9+/ZNBx54YPr6668LWgtawnHVFMtk3lLkMRDN53r37p1rw/fYY480bNiwRigxreW4ipYUkydPzrVJwfkVRRxXZc6vWqdJc3hMRdPxwYMHp6FDh6ZNNtmk0X+rWkTgHjVqVJo6dWrq2bNnjenxPDZUXWL6zOYv/23IMmlZijiuys2dbrzxxvzFPuecc9KTTz6Ztt122/xZtHyzc1w1xTKZtxR1DMSJxfXXX58efPDBdOWVV+YTkOhHOWbMmEYoNa3huPrd736XL9iUT1qdX1HEcRWcX7Veo2bzmPr+++/T/PPPnzp27Ji23377dOmll6atttqq0X+r2jdobmCO/fznP6/+dwyqtsYaa6Tll18+X5XdYostmrRsAJXiZLUsfqsigC+99NLp9ttvz2NVwMzE+AC33npr/v9bDGIERR5Xzq9oqG7duqXXXnstjR07Nl+oiT7g0Zpr0003TY2pRdRwL7LIIqldu3bpiy++qDE9ns9oIJiYPrP5y38bskxaliKOq7rEFzs+64MPPmikktPSjqumWCbzlrl1DMRoriuttJLfq1ZiTo6rP/7xjzkYPfzwwzn4lDm/oojjqi7Or1qPRWbzmIpm5yussEIeofzoo49OP/nJT9JZZ53V6L9VLSJwRzOA/v375ysTZdOmTcvPBwwYUOd7Ynrl/OGRRx6pnn/ZZZfNG7NyntGjR+cR6ma0TFqWIo6runz++ee5j1HccoCWb3aOq6ZYJvOWuXUMRC3Ahx9+6PeqlZjd4ypG9j3ttNNyV4S47U4l51cUcVzVxflV69Gxkf4fGO+ZOHFi4/9WlVqIW2+9NY8ad/3115feeeed0v7771/q3r17aeTIkfn1X/7yl6Xjjjuuev5nnnmm1L59+9If//jHUlVVVR6JtUOHDqU333yzep6zzz47L+Mf//hH6Y033sgjHy677LKl//73v02yjsz7x9WYMWNKxxxzTOm5554rffzxx6VHH320tM4665RWXHHF0oQJE5psPWnex9XEiRNLr776an4svvji+RiKf7///vv1XiYtXxHH1dFHH1164okn8u9V/L5tueWWpUUWWaT05ZdfNsk60vyPqzh36tixY+nOO+8sjRgxovoR//+rnMf5VevW2MeV8ytubeAxdeaZZ5Yefvjh0ocffpjnj3P3OIe/+uqrG/23qsUE7nDppZeWllpqqfyFjKHhn3/++erXfvSjH+XbBVS6/fbbSyuttFKef9VVVy3961//qvF6DAf/hz/8odSzZ8+8A7fYYovS0KFD59r60PKOq/Hjx5e23nrr0qKLLpqDeNyKZ7/99hOKWqGGHFdx8hDXR2s/Yr76LpPWobGPq9122y2H8VjeEksskZ9/8MEHc329mHeOq/j/Wl3HVVyALnN+RWMfV86vaOgxdcIJJ5RWWGGFUufOnUsLLbRQacCAATm0V2qs36o28Z+G1YkDAAAAraIPNwAAADQ3AjcAAAAUQOAGAACAAgjcAAAAUACBGwAAAAogcAMAAEABBG4AAAAogMANAAAABRC4AaCFaNOmTbrnnnuauhhp5MiRaauttkrzzTdf6t69e1MXBwCajMANQKu2995756Aaj44dO6YVVlghnXrqqWnKlCmpuTr55JPTWmutNd30ESNGpG233TY1tQsvvDCX5bXXXkvvvfdeUxcHAJpM+6b7aABoHrbZZpt03XXXpYkTJ6b7778/HXzwwalDhw7p+OOPn27eSZMm5WDeFEqlUpo6deoMX+/Vq1dqDj788MPUv3//tOKKKzZ1UQCgSanhBqDV69SpUw6rSy+9dDrwwAPTlltume69997qGvCddtopnXHGGal3796pb9++efqbb76ZNt9889SlS5fUo0ePtP/++6exY8dWL7P8vlNOOSUtuuiiaYEFFki/+c1vcmAvi4B/2GGHpcUWWyx17tw5bbzxxumll16qfv2JJ57INe8PPPBADrBRzptuuikv8/XXX6+umb/++uvrbFJe3zL+8Y9/TIsvvnieJy42TJ48eabb68orr0zLL798vvAQ2+Ovf/1r9WvLLLNM+vvf/55uvPHGXJ74jBm59tpr06qrrprXKz7/kEMOqX7tggsuSKuvvnpult6nT5900EEH1Sj7p59+mnbYYYe00EIL5XliOXGxpOytt97Ktf3zzz9/6tmzZ/rlL3+ZRo0aVf36nXfemZdf3jaxz8eNGzfT9QaAhhK4AaCWCGGVwXjw4MFp6NCh6ZFHHkn//Oc/czAbOHBgDnsRkO+444706KOP1giM5fdVVVXl4HzLLbeku+66K4flsmOPPTaH0xtuuCG98soruTl7LPebb76psZzjjjsunX322XlZ0Tf66KOPzgEzmm3HY7fddptuHepbxscffzzXSMffKEeE93KAr8vdd9+dDj/88FyGCLUHHHBA2mefffL7Q3xWtBj42c9+lst28cUXzzC0R7iPiwBxYSAucMT6l7Vt2zZdcskl6e23387leuyxx/L2Kov3xgWLp556Kr//nHPOyeE6fPfdd/lCw9prr51efvnl9OCDD6YvvvgilylEuXbffff0q1/9qnr/7LLLLrkFAQA0qhIAtGKDBg0q7bjjjvnf06ZNKz3yyCOlTp06lY455pjq13v27FmaOHFi9Xv+/Oc/lxZaaKHS2LFjq6f961//KrVt27Y0cuTI6vctvPDCpXHjxlXPc+WVV5bmn3/+0tSpU/N7O3ToULr55purX580aVKpd+/epXPPPTc/f/zxxyMBlu65554aZT7ppJNKa6655nTrEvPefffdDSrj0ksvXZoyZUr1PD/96U9Lu+222wy314Ybbljab7/9akyL92y33XbVz2N7xrJnJtbzhBNOKNXXHXfcUerRo0f189VXX7108skn1znvaaedVtp6661rTPvss8/y9hk6dGhpyJAh+d+ffPJJvT8fAGaHGm4AWr2otY7a0WjWHc2Qo8Y4BiYri6bHlf22o1Z0zTXXzE2ZyzbaaKM0bdq0XBNeFvN07dq1+vmAAQNys+jPPvss1ypH0+14X1n0G19vvfXy8iutu+66DV6n+pYxasrbtWtX/Tyadn/55ZczXW5lmcvLrV3mmYnlDx8+PG2xxRYznCdq4+P1JZZYInXr1i03Cf/666/T+PHj8+vRFP/000/Pn33SSSelN954o/q90dw+atxjn5YfK6+8cn4ttntsl1h27Nef/vSn6eqrr07ffvttvcsPAPUlcAPQ6m222WZ5RO33338//fe//81NmCuDauW/m0KRnx8hv1L0u45QXnST/Zn55JNP0o9//OO0xhpr5Cb3Q4YMSZdffnl+rdzU/9e//nX66KOPchCPJuVxUeLSSy/Nr8VFjejfHfu08hH7d5NNNskXGKJ7QPSNX2WVVfL7oi/6xx9/XOh6A9D6CNwAtHoRaKP/8FJLLZXat5/1DTz69euXa1ErB9l65plncr/j8qBqIeaJAF/2/PPP59rWGASsPOhYvK8saryjD3SEwJmJ981stPKGlLGhYrmVZS4vd1ZlrhQ11jG4WvRxr0sE7Aj9559/ftpggw3SSiutlGvEa4vtGAPRRd/46FMeNdVhnXXWyX2/4zNiv1Y+yhcv4sJC1I5Hn/pXX301b9Ponw4AjUngBoAG2mOPPXLz80GDBuWBw6L58qGHHpprW2NE7LKojd13333TO++8k0fQjqbPMWhZhN4IfjEi+m9/+9s8qFfMs99+++Um0/GemYkgGbWxUWsbI2/H4GGzW8aGivLGoGox6FnUGMdo4hF4jznmmAYtJ5rsR6COgdFiOTFoXLmGOoJxXHyI51GLHaOgX3XVVTXef8QRR6SHHnoob4d4b6xfXAwoD6gWA8/FwGhxASOakce8MbhbXKh44YUX0plnnpkHVBs2bFgu/1dffVX9fgBoLAI3ADRQ9MuOABeh7gc/+EH6yU9+kvsEX3bZZTXmi2lxL+poxhz9wv/nf/6nRt/wGHl81113zSE4amU/+OCDvNwYWXxm4j0xEng0hY9bjsUI6LNbxoaK24jFyONxK7Ho//2nP/0p38N80003bdBy4kLARRddlK644oq8nGhCHsE7RB/rCPIx8vhqq62Wbr755nTWWWfVeH8E5wjWEZJjW0QteCwrxO3botY95tl6661zX+0I6N27d88XO+IWbTG6+XbbbZff9/vf/z6H/+i/DwCNqU2MnNaoSwQA8v2n4/ZUlffFBgBaFzXcAAAAUACBGwAAAAqgSTkAAAAUQA03AAAAFEDgBgAAgAII3AAAAFAAgRsAAAAKIHADAABAAQRuAAAAKIDADQAAAAUQuAEAAKAAAjcAAACkxvf/AJNhd6WbCLjwAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Import necessary libraries\n", "import pandas as pd\n", @@ -75,6 +156,8 @@ "import warnings\n", "warnings.simplefilter(action='ignore', category=FutureWarning)\n", "\n", + "np.random.seed(42)\n", + "\n", "# Constants representing the parameters of the model\n", "ATTACK_RATE = 0.10\n", "TRACE_SUCCESS = 0.20\n", @@ -131,7 +214,7 @@ " return p_wedding_infections, p_wedding_traces\n", "\n", "# Run the simulation 1000 times\n", - "results = [simulate_event(m) for m in range(1000)]\n", + "results = [simulate_event(m) for m in range(100)]\n", "props_df = pd.DataFrame(results, columns=[\"Infections\", \"Traces\"])\n", "\n", "# Plotting the results\n", @@ -193,9 +276,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python (lcr-env)", "language": "python", - "name": "python3" + "name": "lcr-env" }, "language_info": { "codemirror_mode": { @@ -207,7 +290,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.0" + "version": "3.9.6" } }, "nbformat": 4, diff --git a/02_activities/assignments/a2_survey_design_and_evaluation.md b/02_activities/assignments/a2_survey_design_and_evaluation.md index b4f036f2..167d6f6a 100644 --- a/02_activities/assignments/a2_survey_design_and_evaluation.md +++ b/02_activities/assignments/a2_survey_design_and_evaluation.md @@ -44,26 +44,107 @@ The number of your chosen topic: `#` Describe the purpose of your survey: ``` -write your answer here... +The purpose of this survey is to examine how age is associated with music taste and perceptions of popular music. The survey will compare responses across different age groups while also asking individuals to reflect on how their own music preferences have changed over time. The results will be used to understand whether age influences genre preference, openness to current popular music, and evaluations of popular music. ``` Describe your target population, sampling frame, sampling units, and observational units: ``` -write your answer here... +The target population is adults aged 18 and older living in Canada. The sampling frame is a Canadian online survey panel containing adults who can be contacted for survey participation and whose age group is known. The sampling units are individual adult respondents. + +The sampling strategy will use stratified quota sampling by age group. This allows comparison across age groups, but the results will be interpreted as age-group or cohort differences rather than direct causal effects of age. Retrospective questions will also ask respondents to compare their current music taste with their mid-teen years, allowing the survey to capture perceived changes over the life course. ``` Your 5-10 question survey: ``` -1. write your question here... -2. write your question here... -3. write your question here... -4. write your question here... -5. write your question here... -6. write your question here... (optional) -7. write your question here... (optional) -8. write your question here... (optional) -9. write your question here... (optional) -10. write your question here... (optional) +Definition: In this survey, “popular music today” refers to mainstream music that has been widely listened to, streamed, shared on social media, or played on radio/music charts in the past 12 months. + +1. What is your age group? + + A 30–39 + B 40–49 + C 50–59 + D 60–69 + E 70 or older + +2. How often do you listen to popular music today, as defined above? + + A Daily + B Several times a week + C About once a week + D Less than once a week + E Rarely or never + +3. Which types of popular music do you currently listen to most often? Please select up to three. + + A Pop + B Hip-hop / rap + C R&B + D Rock + E Electronic / dance music + F Country + G Indie / alternative + H K-pop / J-pop / C-pop + I Latin music + J Other: ________ + +4. How much do you enjoy popular music today? + + A Not at all + B Slightly + C Moderately + D Very much + E Extremely + +5. How similar is popular music today to the music you personally prefer? + + A Not similar at all + B Slightly similar + C Moderately similar + D Very similar + E Extremely similar + +6. How open are you to listening to popular music made by artists from a younger generation than your own? + + A Not open at all + B Slightly open + C Moderately open + D Very open + E Extremely open + +7. Thinking back to your late teens or early adulthood, around ages 16–24, which types of popular music did you listen to most often at that time? Please select up to three. + + A Pop + B Hip-hop / rap + C R&B + D Rock + E Electronic / dance music + F Country + G Indie / alternative + H K-pop / J-pop / C-pop + I Latin music + J Other: ________ + +8. Compared with your late teens or early adulthood, how much has your personal taste in popular music changed? + + A. Not at all + B. Slightly + C. Moderately + D. A lot + E. Completely + +9. When you compare the popular music you liked in your late teens or early adulthood with popular music today, which statement best describes your view? + + A. My personal taste has changed more than popular music itself. + B. Popular music itself has changed more than my personal taste. + C. Both my personal taste and popular music have changed. + D. Neither my personal taste nor popular music has changed very much. + E. I am not sure. + +10. In one or two sentences, please describe how getting older has changed, or has not changed, the way you perceive popular music. + + + + ``` ## Part B - Survey Evaluation: @@ -71,7 +152,33 @@ Your 5-10 question survey: Identify and describe survey features: ``` -write your answer here +Sample type: This was a cross-sectional sample survey. It used a stratified probability sample. The sample was stratified by province and census metropolitan area. It also used a two-stage design: first, groups of telephone numbers were selected, and then one eligible person aged 15 or older was randomly selected from each household. + +Sample size: Statistics Canada used a field sample of about 50,000 units. Around 40,000 invitation letters were sent for the online questionnaire, and about 24,000 completed questionnaires were expected. + +Target population: The target population was people aged 15 and older living in the ten provinces of Canada. The survey did not include people living in the territories or full-time residents of institutions. + +Sampling frame: The sampling frame combined landline and cellphone numbers from the Census and administrative sources with Statistics Canada’s dwelling frame. This means the frame was based on groups of telephone numbers connected to household addresses. + +Survey mode(s):The survey was completed either online through an electronic questionnaire or by computer-assisted telephone interviewing. Respondents could answer in English or French. Proxy responses were not allowed. + +Timeline: Data collection took place from September 4, 2018 to December 28, 2018. The data were released on January 26, 2021. + +Response rate: The overall response rate was 41.9%. + +Weights: The data file includes a person-level weight called WGHT_PER. This weight helps make the survey results representative of the population aged 15 and older in the ten provinces. Bootstrap weights were also created so researchers can estimate sampling error. + +Data processing: Statistics Canada processed the data using automatic and manual checks. They checked for consistency, correct questionnaire flow, and possible errors. For example, they checked whether a respondent’s age matched their birth date. The telephone interview system also included built-in checks during the interview. + +Cleaning and imputation: Missing data were handled through imputation. In most cases, Statistics Canada used similar donor records to fill in missing answers. If donor imputation could not be used, mean imputation was used. Income information was partly obtained by linking survey responses to tax data for respondents who did not object to this linkage. + +Sources of error:The survey has both sampling error and non-sampling error. Sampling error happens because the survey is based on a sample rather than the whole population. Non-sampling errors may include coverage error, non-response error, response error, and processing error. + +Limitations and known biases:One limitation is that households without telephones were not covered by the survey frame. Another limitation is non-response, because not everyone selected for the survey answered it. Statistics Canada adjusted the weights to reduce this problem, but some bias may still remain. Another important limitation is that 2018 results should not be directly compared with earlier cycles because the 2018 survey added an Internet response option and changed some questions and definitions. + +Documentation and sources used:I used Statistics Canada’s survey record for the 2018 General Social Survey on Giving, Volunteering and Participating, the Public Use Microdata File Documentation and User Guide, and the Statistics Canada Summary of Changes page for this survey. + + ``` ## Rubric diff --git a/uv.lock b/uv.lock index 467e0b9c..7e717539 100644 --- a/uv.lock +++ b/uv.lock @@ -1,11 +1,29 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.12'", "python_full_version < '3.12'", ] +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + [[package]] name = "cffi" version = "2.0.0" @@ -103,6 +121,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + [[package]] name = "contourpy" version = "1.3.3" @@ -253,6 +280,49 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, ] +[[package]] +name = "debugpy" +version = "1.8.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/b7/cd8080344452e4874aae67c40d8940e2b4d47b01601a8fd9f44786c757c7/debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33", size = 1645207, upload-time = "2026-01-29T23:03:28.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/56/c3baf5cbe4dd77427fd9aef99fcdade259ad128feeb8a786c246adb838e5/debugpy-1.8.20-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:eada6042ad88fa1571b74bd5402ee8b86eded7a8f7b827849761700aff171f1b", size = 2208318, upload-time = "2026-01-29T23:03:36.481Z" }, + { url = "https://files.pythonhosted.org/packages/9a/7d/4fa79a57a8e69fe0d9763e98d1110320f9ecd7f1f362572e3aafd7417c9d/debugpy-1.8.20-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:7de0b7dfeedc504421032afba845ae2a7bcc32ddfb07dae2c3ca5442f821c344", size = 3171493, upload-time = "2026-01-29T23:03:37.775Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f2/1e8f8affe51e12a26f3a8a8a4277d6e60aa89d0a66512f63b1e799d424a4/debugpy-1.8.20-cp311-cp311-win32.whl", hash = "sha256:773e839380cf459caf73cc533ea45ec2737a5cc184cf1b3b796cd4fd98504fec", size = 5209240, upload-time = "2026-01-29T23:03:39.109Z" }, + { url = "https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl", hash = "sha256:1f7650546e0eded1902d0f6af28f787fa1f1dbdbc97ddabaf1cd963a405930cb", size = 5233481, upload-time = "2026-01-29T23:03:40.659Z" }, + { url = "https://files.pythonhosted.org/packages/14/57/7f34f4736bfb6e00f2e4c96351b07805d83c9a7b33d28580ae01374430f7/debugpy-1.8.20-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:4ae3135e2089905a916909ef31922b2d733d756f66d87345b3e5e52b7a55f13d", size = 2550686, upload-time = "2026-01-29T23:03:42.023Z" }, + { url = "https://files.pythonhosted.org/packages/ab/78/b193a3975ca34458f6f0e24aaf5c3e3da72f5401f6054c0dfd004b41726f/debugpy-1.8.20-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:88f47850a4284b88bd2bfee1f26132147d5d504e4e86c22485dfa44b97e19b4b", size = 4310588, upload-time = "2026-01-29T23:03:43.314Z" }, + { url = "https://files.pythonhosted.org/packages/c1/55/f14deb95eaf4f30f07ef4b90a8590fc05d9e04df85ee379712f6fb6736d7/debugpy-1.8.20-cp312-cp312-win32.whl", hash = "sha256:4057ac68f892064e5f98209ab582abfee3b543fb55d2e87610ddc133a954d390", size = 5331372, upload-time = "2026-01-29T23:03:45.526Z" }, + { url = "https://files.pythonhosted.org/packages/a1/39/2bef246368bd42f9bd7cba99844542b74b84dacbdbea0833e610f384fee8/debugpy-1.8.20-cp312-cp312-win_amd64.whl", hash = "sha256:a1a8f851e7cf171330679ef6997e9c579ef6dd33c9098458bd9986a0f4ca52e3", size = 5372835, upload-time = "2026-01-29T23:03:47.245Z" }, + { url = "https://files.pythonhosted.org/packages/15/e2/fc500524cc6f104a9d049abc85a0a8b3f0d14c0a39b9c140511c61e5b40b/debugpy-1.8.20-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:5dff4bb27027821fdfcc9e8f87309a28988231165147c31730128b1c983e282a", size = 2539560, upload-time = "2026-01-29T23:03:48.738Z" }, + { url = "https://files.pythonhosted.org/packages/90/83/fb33dcea789ed6018f8da20c5a9bc9d82adc65c0c990faed43f7c955da46/debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:84562982dd7cf5ebebfdea667ca20a064e096099997b175fe204e86817f64eaf", size = 4293272, upload-time = "2026-01-29T23:03:50.169Z" }, + { url = "https://files.pythonhosted.org/packages/a6/25/b1e4a01bfb824d79a6af24b99ef291e24189080c93576dfd9b1a2815cd0f/debugpy-1.8.20-cp313-cp313-win32.whl", hash = "sha256:da11dea6447b2cadbf8ce2bec59ecea87cc18d2c574980f643f2d2dfe4862393", size = 5331208, upload-time = "2026-01-29T23:03:51.547Z" }, + { url = "https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl", hash = "sha256:eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7", size = 5372930, upload-time = "2026-01-29T23:03:53.585Z" }, + { url = "https://files.pythonhosted.org/packages/33/2e/f6cb9a8a13f5058f0a20fe09711a7b726232cd5a78c6a7c05b2ec726cff9/debugpy-1.8.20-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9c74df62fc064cd5e5eaca1353a3ef5a5d50da5eb8058fcef63106f7bebe6173", size = 2538066, upload-time = "2026-01-29T23:03:54.999Z" }, + { url = "https://files.pythonhosted.org/packages/c5/56/6ddca50b53624e1ca3ce1d1e49ff22db46c47ea5fb4c0cc5c9b90a616364/debugpy-1.8.20-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:077a7447589ee9bc1ff0cdf443566d0ecf540ac8aa7333b775ebcb8ce9f4ecad", size = 4269425, upload-time = "2026-01-29T23:03:56.518Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d9/d64199c14a0d4c476df46c82470a3ce45c8d183a6796cfb5e66533b3663c/debugpy-1.8.20-cp314-cp314-win32.whl", hash = "sha256:352036a99dd35053b37b7803f748efc456076f929c6a895556932eaf2d23b07f", size = 5331407, upload-time = "2026-01-29T23:03:58.481Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl", hash = "sha256:a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be", size = 5372521, upload-time = "2026-01-29T23:03:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7", size = 5337658, upload-time = "2026-01-29T23:04:17.404Z" }, +] + +[[package]] +name = "decorator" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + [[package]] name = "fancyimpute" version = "0.7.0" @@ -325,6 +395,77 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] +[[package]] +name = "ipykernel" +version = "7.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/8d/b68b728e2d06b9e0051019640a40a9eb7a88fcd82c2e1b5ce70bef5ff044/ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e", size = 176046, upload-time = "2026-02-06T16:43:27.403Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/b9/e73d5d9f405cba7706c539aa8b311b49d4c2f3d698d9c12f815231169c71/ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661", size = 118788, upload-time = "2026-02-06T16:43:25.149Z" }, +] + +[[package]] +name = "ipython" +version = "9.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "psutil" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201", size = 627274, upload-time = "2026-04-24T12:24:53.038Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "jedi" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, +] + [[package]] name = "jinja2" version = "3.1.6" @@ -346,6 +487,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload-time = "2025-08-27T12:15:45.188Z" }, ] +[[package]] +name = "jupyter-client" +version = "8.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + [[package]] name = "kiwisolver" version = "1.4.9" @@ -558,6 +728,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/53/8d8fa0ea32a8c8239e04d022f6c059ee5e1b77517769feccd50f1df43d6d/matplotlib-3.10.6-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d6ca6ef03dfd269f4ead566ec6f3fb9becf8dab146fb999022ed85ee9f6b3eb", size = 8693933, upload-time = "2025-08-30T00:14:22.942Z" }, ] +[[package]] +name = "matplotlib-inline" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, +] + [[package]] name = "missingno" version = "0.5.2" @@ -573,6 +755,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/87/22/cd5cf999af21c2f97486622c551ac3d07361ced8125121e907f588ff5f24/missingno-0.5.2-py3-none-any.whl", hash = "sha256:55782621ce09ba0f0a1d08e5bd6d6fe1946469fb03951fadf7d209911ca5b072", size = 8704, upload-time = "2023-02-26T20:10:26.042Z" }, ] +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, +] + [[package]] name = "nose" version = "1.3.7" @@ -740,6 +931,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cd/d7/612123674d7b17cf345aad0a10289b2a384bff404e0463a83c4a3a59d205/pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370", size = 13186141, upload-time = "2025-08-21T10:28:05.377Z" }, ] +[[package]] +name = "parso" +version = "0.8.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, +] + [[package]] name = "patsy" version = "1.0.1" @@ -752,6 +952,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/87/2b/b50d3d08ea0fc419c183a84210571eba005328efa62b6b98bc28e9ead32a/patsy-1.0.1-py2.py3-none-any.whl", hash = "sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c", size = 232923, upload-time = "2024-11-12T14:10:52.85Z" }, ] +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + [[package]] name = "pillow" version = "11.3.0" @@ -836,6 +1048,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598, upload-time = "2025-07-01T09:16:27.732Z" }, ] +[[package]] +name = "platformdirs" +version = "4.9.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -845,6 +1066,64 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + [[package]] name = "pycparser" version = "2.23" @@ -909,12 +1188,71 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, ] +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86", size = 1333328, upload-time = "2025-09-08T23:07:45.946Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a0/fc7e78a23748ad5443ac3275943457e8452da67fda347e05260261108cbc/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581", size = 908803, upload-time = "2025-09-08T23:07:47.551Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/37d15eb05f3bdfa4abea6f6d96eb3bb58585fbd3e4e0ded4e743bc650c97/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f", size = 668836, upload-time = "2025-09-08T23:07:49.436Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e", size = 857038, upload-time = "2025-09-08T23:07:51.234Z" }, + { url = "https://files.pythonhosted.org/packages/cb/eb/bfdcb41d0db9cd233d6fb22dc131583774135505ada800ebf14dfb0a7c40/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e", size = 1657531, upload-time = "2025-09-08T23:07:52.795Z" }, + { url = "https://files.pythonhosted.org/packages/ab/21/e3180ca269ed4a0de5c34417dfe71a8ae80421198be83ee619a8a485b0c7/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2", size = 2034786, upload-time = "2025-09-08T23:07:55.047Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b1/5e21d0b517434b7f33588ff76c177c5a167858cc38ef740608898cd329f2/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394", size = 1894220, upload-time = "2025-09-08T23:07:57.172Z" }, + { url = "https://files.pythonhosted.org/packages/03/f2/44913a6ff6941905efc24a1acf3d3cb6146b636c546c7406c38c49c403d4/pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f", size = 567155, upload-time = "2025-09-08T23:07:59.05Z" }, + { url = "https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97", size = 633428, upload-time = "2025-09-08T23:08:00.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/14/01afebc96c5abbbd713ecfc7469cfb1bc801c819a74ed5c9fad9a48801cb/pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07", size = 559497, upload-time = "2025-09-08T23:08:02.15Z" }, + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c6/c4dcdecdbaa70969ee1fdced6d7b8f60cfabe64d25361f27ac4665a70620/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066", size = 836265, upload-time = "2025-09-08T23:09:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/3e/79/f38c92eeaeb03a2ccc2ba9866f0439593bb08c5e3b714ac1d553e5c96e25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604", size = 800208, upload-time = "2025-09-08T23:09:51.073Z" }, + { url = "https://files.pythonhosted.org/packages/49/0e/3f0d0d335c6b3abb9b7b723776d0b21fa7f3a6c819a0db6097059aada160/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c", size = 567747, upload-time = "2025-09-08T23:09:52.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cf/f2b3784d536250ffd4be70e049f3b60981235d70c6e8ce7e3ef21e1adb25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271", size = 747371, upload-time = "2025-09-08T23:09:54.563Z" }, + { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, +] + [[package]] name = "sampling-env" version = "0.1.0" source = { virtual = "." } dependencies = [ { name = "fancyimpute" }, + { name = "ipykernel" }, { name = "matplotlib" }, { name = "missingno" }, { name = "numpy" }, @@ -925,6 +1263,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "fancyimpute", specifier = ">=0.7.0" }, + { name = "ipykernel", specifier = ">=6.30.1" }, { name = "matplotlib", specifier = ">=3.10.6" }, { name = "missingno", specifier = ">=0.5.2" }, { name = "numpy", specifier = ">=2.3.3" }, @@ -1116,6 +1455,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + [[package]] name = "statsmodels" version = "0.14.5" @@ -1147,6 +1500,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/48/973da1ee8bc0743519759e74c3615b39acdc3faf00e0a0710f8c856d8c9d/statsmodels-0.14.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a085d47c8ef5387279a991633883d0e700de2b0acc812d7032d165888627bef", size = 10453538, upload-time = "2025-07-07T14:24:06.959Z" }, { url = "https://files.pythonhosted.org/packages/c7/d6/18903fb707afd31cf1edaec5201964dbdacb2bfae9a22558274647a7c88f/statsmodels-0.14.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f866b2ebb2904b47c342d00def83c526ef2eb1df6a9a3c94ba5fe63d0005aec", size = 10681584, upload-time = "2025-07-07T14:24:21.038Z" }, { url = "https://files.pythonhosted.org/packages/44/d6/80df1bbbfcdc50bff4152f43274420fa9856d56e234d160d6206eb1f5827/statsmodels-0.14.5-cp313-cp313-win_amd64.whl", hash = "sha256:2a06bca03b7a492f88c8106103ab75f1a5ced25de90103a89f3a287518017939", size = 9604641, upload-time = "2025-07-07T12:08:36.23Z" }, + { url = "https://files.pythonhosted.org/packages/fd/6c/0fb40a89d715412160097c6f3387049ed88c9bd866c8838a8852c705ae2f/statsmodels-0.14.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:07c4dad25bbb15864a31b4917a820f6d104bdc24e5ddadcda59027390c3bed9e", size = 10211256, upload-time = "2025-10-30T13:46:58.591Z" }, + { url = "https://files.pythonhosted.org/packages/88/4a/e36fe8b19270ab3e80df357da924c6c029cab0fb9a0fbd28aaf49341707d/statsmodels-0.14.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:babb067c852e966c2c933b79dbb5d0240919d861941a2ef6c0e13321c255528d", size = 10110933, upload-time = "2025-10-30T13:47:11.774Z" }, + { url = "https://files.pythonhosted.org/packages/8a/bf/1b7e7b1a6c09a88a9c5c9e60622c050dfd08af11c2e6d4a42dbc71b32ee1/statsmodels-0.14.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:110194b137286173cc676d7bad0119a197778de6478fc6cbdc3b33571165ac1e", size = 10253981, upload-time = "2025-10-30T16:32:22.399Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d0/f95da95524bdd99613923ca61a3036d1308cee1290e5e8acb89f51736a8c/statsmodels-0.14.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c8a9c384a60c80731b278e7fd18764364c8817f4995b13a175d636f967823d1", size = 10460450, upload-time = "2025-10-30T16:32:44.985Z" }, + { url = "https://files.pythonhosted.org/packages/28/bb/59e7be0271be264b7b541baf3973f97747740950bfd5115de731f63da8ab/statsmodels-0.14.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:557df3a870a57248df744fdfcc444ecbc5bdbf1c042b8a8b5d8e3e797830dc2a", size = 10694060, upload-time = "2025-10-30T16:33:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c0/b28d0fd0347ea38d3610052f479e4b922eb33bb8790817f93cd89e6e08ba/statsmodels-0.14.5-cp314-cp314-win_amd64.whl", hash = "sha256:95af7a9c4689d514f4341478b891f867766f3da297f514b8c4adf08f4fa61d03", size = 9648961, upload-time = "2025-10-30T13:47:24.303Z" }, ] [[package]] @@ -1158,6 +1517,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, ] +[[package]] +name = "tornado" +version = "6.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" }, + { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" }, + { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" }, + { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" }, + { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" }, + { url = "https://files.pythonhosted.org/packages/5a/76/4921c00511f88af86a33de770d64141170f1cfd9c00311aea689949e274e/tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7", size = 448582, upload-time = "2026-03-10T21:30:57.142Z" }, + { url = "https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b", size = 448990, upload-time = "2026-03-10T21:30:58.857Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c8/876602cbc96469911f0939f703453c1157b0c826ecb05bdd32e023397d4e/tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6", size = 448016, upload-time = "2026-03-10T21:31:00.43Z" }, +] + +[[package]] +name = "traitlets" +version = "5.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/22/40f55b26baeab80c2d7b3f1db0682f8954e4617fee7d90ce634022ef05c6/traitlets-5.15.0.tar.gz", hash = "sha256:4fead733f81cf1c4c938e06f8ca4633896833c9d89eff878159457f4d4392971", size = 163197, upload-time = "2026-05-06T08:05:58.016Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl", hash = "sha256:fb36a18867a6803deab09f3c5e0fa81bb7b26a5c9e82501c9933f759166eff40", size = 85877, upload-time = "2026-05-06T08:05:55.853Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + [[package]] name = "tzdata" version = "2025.2" @@ -1166,3 +1560,12 @@ sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be76 wheels = [ { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, ] + +[[package]] +name = "wcwidth" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/ee/afaf0f85a9a18fe47a67f1e4422ed6cf1fe642f0ae0a2f81166231303c52/wcwidth-0.7.0.tar.gz", hash = "sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0", size = 182132, upload-time = "2026-05-02T16:04:12.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl", hash = "sha256:5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2", size = 110825, upload-time = "2026-05-02T16:04:11.033Z" }, +]