{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lab\n",
    "\n",
    "- Use this assignment to practice the chapter's concepts and coding skills in runnable Python code.\n",
    "- Sign in from the account menu before you start working on the assignment.\n",
    "- Write and run your code directly in the coding cells.\n",
    "- Multiple submissions are allowed. The highest score is kept.\n",
    "\n",
    "Write the interpretation responses below as Python comments in the same answer cells. They are for reflection and class discussion; the automatic score checks the existing coding tasks, not the written explanations. Keep the specified printed output and plots unchanged.\n",
    "\n",
    "You are preparing a short retail operations review. The questions use separate small datasets from sales, marketing, finance, operations, and regional management. For each chart, connect the observed pattern to the department's question and explain what the data cannot establish.\n",
    "\n",
    "<div data-lab-answers-release-at=\"2099-12-31T23:59:00-06:00\"></div>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-10T18:42:49.477463Z",
     "iopub.status.busy": "2026-10-10T18:42:49.477288Z",
     "iopub.status.idle": "2026-10-10T18:42:50.542775Z",
     "shell.execute_reply": "2026-10-10T18:42:50.542366Z"
    },
    "tags": [
     "thebe-interactive"
    ]
   },
   "outputs": [],
   "source": [
    "### Question 1: Order Value Distribution\n",
    "# The online store manager wants to see how order values are spread out.\n",
    "#   1. Create a figure and axes with plt.subplots().\n",
    "#   2. Use sns.histplot() to draw a histogram of the order_value column\n",
    "#      of orders with bins=6 on that axes (ax=ax).\n",
    "#   3. Set the title \"Order Values\".\n",
    "# Reflection (answer in comments): Describe where order values are concentrated. Can this chart compare sales channels?\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "orders = pd.DataFrame({\n",
    "    \"order_value\": [45, 52, 38, 61, 75, 49, 58, 66, 40, 55, 70, 48],\n",
    "})\n",
    "### Your code starts here.\n",
    "\n",
    "\n",
    "\n",
    "### Your code ends here.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-10T18:42:50.544255Z",
     "iopub.status.busy": "2026-10-10T18:42:50.544151Z",
     "iopub.status.idle": "2026-10-10T18:42:50.620802Z",
     "shell.execute_reply": "2026-10-10T18:42:50.620422Z"
    },
    "tags": [
     "hide-input",
     "lab-answer"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "### Solution\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "orders = pd.DataFrame({\n",
    "    \"order_value\": [45, 52, 38, 61, 75, 49, 58, 66, 40, 55, 70, 48],\n",
    "})\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "sns.histplot(data=orders, x='order_value', bins=6, ax=ax)\n",
    "ax.set_title(\"Order Values\")\n",
    "plt.show()\n",
    "# Sample reflection: Most order values fall between 40 and 61; the full sample ranges from 38 to 75. The chart combines all orders and has no channel column.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-10T18:42:50.621853Z",
     "iopub.status.busy": "2026-10-10T18:42:50.621788Z",
     "iopub.status.idle": "2026-10-10T18:42:50.623938Z",
     "shell.execute_reply": "2026-10-10T18:42:50.623662Z"
    },
    "tags": [
     "thebe-interactive"
    ]
   },
   "outputs": [],
   "source": [
    "### Question 2: Ad Spend and Revenue by Region\n",
    "# Marketing wants to know whether ad spend pays off the same way in both regions.\n",
    "#   1. Create a figure and axes with plt.subplots().\n",
    "#   2. Use sns.scatterplot() to plot ad_spend (x) vs revenue (y) from campaigns,\n",
    "#      with the points colored by region (hue='region').\n",
    "#   3. Set the title \"Ad Spend vs Revenue\".\n",
    "# Reflection (answer in comments): Describe the relationship between ad spend and revenue. Does the chart show that spending caused the revenue?\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "campaigns = pd.DataFrame({\n",
    "    \"ad_spend\": [5, 10, 15, 20, 25, 30, 35, 40],\n",
    "    \"revenue\": [60, 70, 110, 105, 150, 140, 190, 170],\n",
    "    \"region\": [\"North\", \"South\", \"North\", \"South\", \"North\", \"South\", \"North\", \"South\"],\n",
    "})\n",
    "### Your code starts here.\n",
    "\n",
    "\n",
    "\n",
    "### Your code ends here.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-10T18:42:50.624791Z",
     "iopub.status.busy": "2026-10-10T18:42:50.624737Z",
     "iopub.status.idle": "2026-10-10T18:42:50.667512Z",
     "shell.execute_reply": "2026-10-10T18:42:50.667133Z"
    },
    "tags": [
     "hide-input",
     "lab-answer"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAHGCAYAAABw7lF4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAASupJREFUeJzt3Qd4U3Xbx/G7u7SlpeyNoGyVLbKUqSyRB3xcIAqiooLgFsGBiIDIcCMOXKiACMgUAWXIlD1lD9mzQIFSynmv+8+bPEmbYitJmp5+P9eVq805JycnJ2nPL/8ZZFmWJQAAADYWnNUHAAAA4GsEHgAAYHsEHgAAYHsEHgAAYHsEHgAAYHsEHgAAYHsEHgAAYHsEHgAAYHsEHiCb27Bhg4wYMUISEhLE7nLSawXgXaFe3h+AfyE5OVk++ugj8/sTTzwhYWFhGX7s4sWL5emnn5bWrVtLXFzcP26/efNmWb9+vRw/flyuueYaqVmzpuTNmzdbvG+Zfa2+smrVKpk3b57zfmhoqBQsWFDq1asnxYoVy7LjApA+SniAAPDzzz9Lr169zG3KlCk+eY5jx45JmzZt5MYbb5TRo0fLypUrpV+/fuYC/dBDD/nkOe1Kw44Gr0WLFsmuXbtMgBw4cKCUKlVKXn/99aw+PAAeUMIDBIDPPvtMqlSp4vy9Xbt2Xn8OLTmaNWuWKSWpUaOGc/n06dOlc+fOXn++nOCpp56S+vXrm991WsL777/fhMgmTZpIgwYNsvrwALgg8ABZbM+ePSaIfPzxx+aiqcFEl5UsWdLj9r///ruplipRooQ0b948w88zc+ZMqVWrllvYUS1btpTffvstTQnGunXrpHv37rJv3z759ddfzfJmzZqlW2Xz999/y/z58+XkyZNSunRpc9EPDw/3uM/Dhw/LjBkz5NKlS2Y7b75WLXVZtmyZPPLIIxIdHZ3mGH/88Udp0aKFlC9f3iw7cOCA/PHHH6YErEyZMqZaKioqSjIrKChIHnzwQfnhhx9kzpw5aQLPqVOnzHnW85k/f35p2rSpsypR3++ffvrJ7bgc9Bx9+OGHUqlSJXOuMrI/tX37dlNaeO+990p8fLxMmzbNnHdPn4E1a9aYfXXt2lViYmKcy0+cOCFfffWV3Hbbbeb5M/p6gICks6UDyDqvvvqqFRcXZ505c8bcYmNjrddeey3NdrquWbNmVlRUlNW+fXtza9SokTVs2DBL/5S3bt16xee55pprrOuuu866ePHiPx5Tz549rYiICGvq1KlW1apVrc6dO1s1atSwIiMjra+//tpt20uXLlnPPfecFRoaajVp0sR6+OGHrXLlylllypSxNm3alGafc+fOtWrWrGn2Wa1aNbNsxowZXnutv//+u9lm9OjRada98MIL5jgPHjxo7n/44YfmNd12221Wt27drObNm5tjX7hw4RXPz/Dhw81zLFiwwG35rFmzzPK+ffu6Lf/+++/Ne1ylShVzfurXr2/FxMRYP/74o/P15s6d23rwwQfTPNf06dPNPidMmJDh/amJEyeax+myevXqWR06dLBatGhhlulnztX7779vlu/du9dtub5/ns5lRp4fCDQEHiALpaSkWCVKlLB69OjhXNa9e3erZMmSZp0rDQxhYWHWn3/+6Vymv+u2GQk8b7/9ttmuadOm1vjx4619+/alu60+lwaDjh07WklJSc5goxe38PBwa/Pmzc5tBw8ebParF1iH8+fPW40bN7YqVqzofB2Ofeo+HPtMTk62br75ZrOdN19r2bJlrQYNGrgt0+cqUqSI1bZtW3P/woULJuy8/PLLbtsdOHDAWrVq1b8KPE888YRZPnPmTOeyRYsWWSEhIdYzzzxjzqFDnz59zPPv2LHD3O/atasVHR1tnTp1ym2fd911l1WgQAFzvJnZnyPw1K1b19q/f79zu2effdac2z179vyrwJPR5wcCDYEHyELTpk0zF5SNGzc6l+nvuky/2bterLUE4N57702zD/3mnpEQoL777jvr1ltvNaFFH1O0aFFzod21a1eawKHrlyxZ4rb80KFDVlBQkCkpUXrB04uxloykNmfOHLMPLXFx3WfqMPHuu++a5Y5SF2+81oEDB5rttmzZ4lw2efJks2zKlCnm/smTJ819vXBnliPwPPXUU+Z3fb42bdqYIKCBwpWWTmmpnSPkOZw7d868D6+//rq5v3jxYrPPUaNGObc5cuSI2cZ1nxndnyPw6PG5WrNmjVn+ww8//KvAk9HnBwINbXiALPTpp59KoUKF5JdffjE3B12m67RNh6ONx+nTp50Nm13psjFjxmTo+e677z5z027wf/31l2mwPHjwYNPuZMWKFVKuXDm37bVHlyvtel2kSBHTK8lxXEeOHJGUlBT54IMPTBskpT+127vS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tttMZx5/tOEh8AAAANujDQ8AALA9Ag8AALA9Ag8AALA9Ag8AALA9Ag8AALA9Ag8AALA9Ag8AALA9Ag+AgKSziesAbdmdXV4HkN0ReAAEJJ1rrW/fvpLd2eV1ANkdgQcAANgek4cC8KmtW7eaObSUzqukE8qWKlXK4xx0CxYsMJMqVq1aNdPPo/NzrVmzxkxQqJO2OmYgX7VqlZw5c8Ys0991Diedw8zTpK1a/aRzvekkkDrPm04C6eDYj87/tHr1ajPDs/7uOhu2N14HAN8g8ADwqZ07dzon1tQJBTUM6IzpAwYMcG5z7Ngxady4sRw/ftwEonXr1pnJFzPqvffekz59+piZqpOSksxs3ToLue7rq6++klmzZpnJGnUm8yNHjsj+/fvNDPaOmcx1skedzPWPP/4wy/SYdTbnKVOmmIlele5HJwTW5RqINDht377dLNMw5Y3XAcCHLADwo82bN1u5cuWyVq1a5VzWo0cPq0qVKtbp06fN/W3btlnR0dFW7dq1M7TP+Ph4a9y4cc77u3btsv7880/ze8+ePS39Vzdx4kRz/9KlS1bHjh2tGjVqOLd/4YUXrPr161tnz551btO5c2erVatWzm10P6Ghodby5cudy/7zn/9Y7dq189rrAOA7tOEB4HOJiYmmZGf8+PGmaqhgwYKyfPly5/px48bJ448/LjExMea+loq0b98+w/vX6qsNGzZISkqKua9VZo5SF3XddddJ27Ztze9aQvPCCy+YajYtoVGjR4+WG264QaZNm2aOUW+FCxeW33//Xb8UOvejVViOUiF16623miowb70OAL5DlRYAn/rll1/k/vvvN9VJWj2k4UTbwmi1k9IqqEOHDjmrjhxKly7tFiau5Ouvv5bu3bubqq1bbrlF/vvf/5rn1HCjPO1b7d69W4oUKWKquTZu3Giqoly1bt1aLly4IBEREeZ+3rx53dbrcq0O89brAOA7BB4APvX0009Lr1695JVXXnErcXGUnGho0MbM2ibGVer7V9K0aVPZvHmzaXujbXP0OTVkvPHGGx735bifP39+E8DCw8NNQHr00Uf/9ev0xusA4DtUaQHwqYMHD0r58uWd97VKa8eOHW7baGNjR8NmR08nbTCcEbqto7RIS1O0Sum+++6TJUuWOLfRXlW7du1y3v/pp5+kQIECUq5cOQkODpZmzZrJp59+6qwSc+35lRlX8zoA+BYlPAB8StvOvPTSS6YH0+nTp2X48OHONi4O/fv3l/r160vnzp2lTp068sMPP5htta3PP9FQUbduXWnRooXpBq7VU9qjasiQIc5tYmNjpXnz5qbaS6uddN2IESOcXdf1d22Po8egJT3apXzevHnmOLW6LKOu5nUA8C0CDwCfGjlypHzyySeybNkyM/aNlq5Mnz5dKleu7NxGGwJricxnn31mxtJ55JFHJCoqSv78889/3L9upyU4X375pSxevNiEm4kTJ0qjRo2c22ggevHFF82ox1rFpI2S77jjDrcqtvXr15t9rFy5UvLkySMPPfSQtGnTxrlN9erVTXd0V/o4befjjdcBwLeCtKuWj58DALKMth/atm2bTJ06lXcByMEo4QEQ8LREJnX7GgcdNblYsWJ+PyYA2QuBB0DA04a/2j3cE61WulLg8VQVBSDnoUoLAADYHt3SAQCA7RF4AACA7RF4AACA7RF4AACA7RF4AACA7RF4AACA7RF4AACA7RF4AACA7RF4AACA2N3/AepmqF2qgRJNAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "### Solution\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "campaigns = pd.DataFrame({\n",
    "    \"ad_spend\": [5, 10, 15, 20, 25, 30, 35, 40],\n",
    "    \"revenue\": [60, 70, 110, 105, 150, 140, 190, 170],\n",
    "    \"region\": [\"North\", \"South\", \"North\", \"South\", \"North\", \"South\", \"North\", \"South\"],\n",
    "})\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "sns.scatterplot(data=campaigns, x='ad_spend', y='revenue', hue='region', ax=ax)\n",
    "ax.set_title(\"Ad Spend vs Revenue\")\n",
    "plt.show()\n",
    "# Sample reflection: Revenue generally rises with ad spend in both regions. These observations do not establish causation.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-10T18:42:50.668491Z",
     "iopub.status.busy": "2026-10-10T18:42:50.668430Z",
     "iopub.status.idle": "2026-10-10T18:42:50.670526Z",
     "shell.execute_reply": "2026-10-10T18:42:50.670144Z"
    },
    "tags": [
     "thebe-interactive"
    ]
   },
   "outputs": [],
   "source": [
    "### Question 3: From Wide to Tidy\n",
    "# Finance keeps quarterly revenue in wide format: one column per region.\n",
    "# Seaborn needs tidy (long) data to color bars by region.\n",
    "#   1. Reshape sales with sales.melt(id_vars='quarter', var_name='region',\n",
    "#      value_name='revenue') and store the result in tidy.\n",
    "#   2. Print the number of rows in tidy. Print exactly:\n",
    "#      Tidy rows: 8\n",
    "#   3. Create a figure and axes, then use sns.barplot() to draw revenue (y)\n",
    "#      by quarter (x) with the bars colored by region (hue='region').\n",
    "# Reflection (answer in comments): Which region has higher revenue in Q4? Do these quarterly totals show variation among individual orders?\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "sales = pd.DataFrame({\n",
    "    \"quarter\": [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n",
    "    \"North\": [150, 165, 158, 180],\n",
    "    \"South\": [120, 118, 135, 142],\n",
    "})\n",
    "### Your code starts here.\n",
    "\n",
    "\n",
    "\n",
    "### Your code ends here.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-10T18:42:50.671411Z",
     "iopub.status.busy": "2026-10-10T18:42:50.671352Z",
     "iopub.status.idle": "2026-10-10T18:42:50.710631Z",
     "shell.execute_reply": "2026-10-10T18:42:50.710311Z"
    },
    "tags": [
     "hide-input",
     "lab-answer"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tidy rows: 8\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAGwCAYAAACtlb+kAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAMUtJREFUeJzt3Qd0VNW+x/F/aKEnVCGABngg1UBAwAtEmnhBQEBEOgoPlKaiSFHgKkvhermiqBCaijS9IohIU7qgItVQpHelB0giSCCQt/77rZk7k0aQJDOz5/tZ66xkzjlzcpJjzI+9/3vvgMTExEQBAACwWDZP3wAAAEBmI/AAAADrEXgAAID1CDwAAMB6BB4AAGA9Ag8AALAegQcAAFgvh6dvwBvcunVLTp06JQUKFJCAgABP3w4AAEgHnUowLi5OQkJCJFu2tNtwCDwiJuyUKVMmPT9bAADgZU6ePCmlS5dO8xwCj4hp2XH8wAoWLJg1TwcAANyV2NhY02Dh+DueFgKPiLMbS8MOgQcAAN+SnnIUipYBAID1CDwAAMB6BB4AAGA9anjuwM2bN+XGjRuZ9zT8WM6cOSV79uyevg0AgKUIPOkc53/mzBm5fPly5j8RPxYcHCwlSpRgLiQAQIYj8KSDI+wUL15c8ubNyx/kTAiUV69elXPnzpnXJUuWzOgvAQDwcwSedHRjOcJOkSJFsuap+KE8efKYjxp69GdN9xYAICNRtHwbjpodbdlB5nL8jKmTAgBkNAJPOrHGVubjZwwAyCwEHsv9+eefsm/fPlMnAwCAvyLwWG7btm1SuXJliY+P9/StAADgMQQeP6iLuf/++yVbNh41AMB/8VfQCxw4cECuXLliRoQdO3ZMLly44Hb8t99+k4sXL6b6fn2vnqPdVtqSo11Yt27dMse0dWfRokVmYj9XCQkJ5muldF293v79+83nek96bf0IAICvIvB4gQceeECGDh1qlrhv0qSJzJ071+xfvny5lC1bVmrVqiUVKlSQmjVrys6dO93e++9//1uKFi0qDz74oPk4fPhwE3JiY2NT7dL6+OOP5Z577pG6deuaOW8ee+wxiY6Odh7fsGGDVK1aVUaOHGnOq127thQrVkyWLVuWZT8TAAAyEoHHS2i4+fHHH+XIkSPywgsvyJ49e6Rjx47ywQcfyNmzZ02rT+vWraV9+/bO8LJlyxYTlP7zn//I6dOnZdeuXbJ06dI0v44Gpj59+siHH35orvv777/LqVOnzNd0pS06ul+vqxMv9u3b17wPAABfxMSDXmLQoEESGhrqfD158mTTAlOpUiU5ePCg6a568skn5a233jKhRVt0PvroI9Mi1KZNG/OekJAQeeWVV0w4Sc2UKVPkb3/7m3Tu3Nm81lahMWPGyOOPPy6TJk2SoKAg57njxo1zdoV169ZN3n77bROStNUHAGxS65VZ4uu2je/h6VvwagQeL1GuXDm319rCoy02rVq1ctuvXVuONb0OHz4sVapUcTuuXVFpOXTokFSvXj1Zl5oGKr1eeHi42aczHbsGm/z585uPcXFxBB4AgM8h8HiJpEspaMvKo48+KvPmzUtzOYZr164lm3cnLfqepOc4XjObNADAVtTweKkGDRrIypUrJSYmJtnoKsckgmFhYabA2HVSQX2dFi18/v77752juNTq1aulYMGCyVqZAACwBYHHSz3//POmnkZbeXR0lBYoT58+3QQWx1pTAwcONIXFzz77rPz8888yY8YMee+999JcpkGvqyO4evToIZs2bZLZs2eb0VijRo2SXLlyZen3CACAXwQe/SP99NNPm24WHfqcUoGt/uFOaTt+/Lg5548//kjx+MyZM8VX6MSAjhoZh0KFCpmfT6NGjUxRsYYbHWK+YMECZzDRGpu1a9eakVT9+/eX9evXy8SJE82x3LlzpzjxYOHChc1oMH2tQUlDkhYjDxkyxPm19V60WDppF5teh1AEAPBFAYkeWmRJh1ZHREQ4Wyf0j/nWrVtv+76WLVuaIdqbN292Bp4CBQrITz/9JPXq1ftL96ItHtqaot1H2rXjSmtkjh49aubDcYQIb6LDx13rf/71r3/J1KlTTQGyr/H2nzUAezFKyzel9ffba4qWAwMDTdBRSSfTS43OGfPdd99JZGRkJt+d7+jSpYu0a9fOjN7SLqo333zTtAgBAAAfreH55JNPTPeXYw4ZVzpbsB6rVq2amazPtSjXZq+//rqZbFDn3lmxYoWp83nxxRc9fVsAAHgVnxmWrj1vGng6derkVu+i9Tr6x37w4MFmmQSdsVhnBL506ZKMHj061e4016UWHMsw+CJdNkILjwEAgAUtPFqcq8suJF3eIF++fKZmRYtstR9PA9GwYcPMGlOp0RmE9VzHpmtYAQAAe/lM4NFl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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "### Solution\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "sales = pd.DataFrame({\n",
    "    \"quarter\": [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n",
    "    \"North\": [150, 165, 158, 180],\n",
    "    \"South\": [120, 118, 135, 142],\n",
    "})\n",
    "\n",
    "tidy = sales.melt(id_vars='quarter', var_name='region', value_name='revenue')\n",
    "print(\"Tidy rows:\", len(tidy))\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "sns.barplot(data=tidy, x='quarter', y='revenue', hue='region', ax=ax)\n",
    "plt.show()\n",
    "# Sample reflection: North has higher Q4 revenue (180 versus 142). Quarterly totals do not show individual order variability.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-10T18:42:50.711561Z",
     "iopub.status.busy": "2026-10-10T18:42:50.711491Z",
     "iopub.status.idle": "2026-10-10T18:42:50.713505Z",
     "shell.execute_reply": "2026-10-10T18:42:50.713207Z"
    },
    "tags": [
     "thebe-interactive"
    ]
   },
   "outputs": [],
   "source": [
    "### Question 4: Delivery Days by Shipping Method\n",
    "# Operations wants to compare how long each shipping method takes.\n",
    "#   1. Create a figure and axes with plt.subplots().\n",
    "#   2. Use sns.boxplot() to draw days (y) by method (x) from deliveries.\n",
    "#   3. Set the title \"Delivery Days by Method\".\n",
    "#   4. Find the method with the lowest median delivery days using\n",
    "#      groupby() and median(), then print it. Print exactly:\n",
    "#      Fastest median: Overnight\n",
    "# Reflection (answer in comments): Does the method with the fastest median also have the smallest IQR? Explain using the boxes, and state one limitation.\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "deliveries = pd.DataFrame({\n",
    "    \"method\": [\"Standard\"] * 5 + [\"Express\"] * 5 + [\"Overnight\"] * 5,\n",
    "    \"days\": [5, 6, 5, 7, 6, 2, 4, 3, 5, 2, 1, 1, 2, 1, 1],\n",
    "})\n",
    "### Your code starts here.\n",
    "\n",
    "\n",
    "\n",
    "### Your code ends here.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-10T18:42:50.714309Z",
     "iopub.status.busy": "2026-10-10T18:42:50.714252Z",
     "iopub.status.idle": "2026-10-10T18:42:50.747754Z",
     "shell.execute_reply": "2026-10-10T18:42:50.747406Z"
    },
    "tags": [
     "hide-input",
     "lab-answer"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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hG3YJzNGcjUpLjrTAgAAaxFUAACAtQgqMMLDw+XZZ581PwFbsF/CNuyTmS/Ld6YFAADZFzUqAADAWgQVAABgLYIKUrRt2zY5cODANdtS3377rZw+fZq/BIBsY8OGDXL06NE0vWf9+vVy4sSJa1amrIo+KhbSbkM68Noff/whFStWNIPZ+fvpp5/k+uuvz7TxY26//XZp1KiRPP/889dk+WFhYbJ06VKzHmQNa9askX//+9+Jvvbmm2/Kddddl+llQnA5dOiQGeyzcOHC5jhpGy3TU089JX//+99T/Z7ixYvLSy+9JL169Upynh9//NEMzlmsWDEJFll+wLfsRhN1//795dixY1K6dGnZt2+ftGzZUv71r39J+fLlzTwDBgyQbt26yT/+8Q+vi4sgtX//flm0aJHMnz8/wYiSefLk8axcCI5j5COPPCJ79uyRm266yQSW3Llzy5QpU6Rjx45ii/r160uJEiUyfLndunWTUaNGycCBAyVYEFQsux1A586d5a677pLp06ebmgb1ySefmP+UGlS2b98u0dHR5kSxdu1a83rjxo3l559/NjUwehuBokWLSrly5Xzvd23atMmkcH388ssvkjNnTrPM+LceuHz5smzdulVuuOGGRO+htHPnzlSvS2t+duzYIXnz5pXKlSv7hqDW9ev79NsQsq4uXbok+Nu7tYJDhw41f+MhQ4b4pusBVveFESNGyMcffyzr1q0zB96FCxeaavI777wz4NukO0/37t1l9uzZJsC///77Jhxpk+Tbb79t3lehQgV56KGHAk4MOu/rr79u9jUN/f369fN9807uNdhLj0v6xe2BBx4wTcZ6qbDua3q8vOeee8z+cvfdd8vhw4fl999/N2HBn9bAaLC55ZZbfNO0qUWPp7of6PHM3+7duyVHjhxmP961a5dcvHhR6tSpY8KSTtOaQz325s+fX8qUKRPw3qefflpuvPHGgGmxsbFmv9X9VIeN37x5s1mn/u7v0qVLiS73p59+Msv49ddfzfFfj8FNmzaVbE8vT4Yd9u3bp5eKO8uXL09ynmHDhjn58+d3ypQp4zRt2tQ8zp4960RFRfme62uRkZHO2rVrA95bvXp155577nHKlSvn3HzzzU5ERITTunVrJzY21jfP9u3bzfuLFSvm3HTTTU7Dhg2dmjVrOiNHjvTNk9p1de7c2SldurRTt25d59lnnzXT58+fb8qvy9Z1PPDAA06OHDmS/cywz9y5c82+eunSpSTnWbFihRMWFmZ+qrffftvJmzevs3PnTvN8woQJToECBcz+OHXqVOeFF15wChYs6NtX/OepWrWqM23aNGfhwoVOXFycs2TJEqdw4cJmX9TlDho0yClUqJCzd+9e874LFy445cuXN/vgnDlznIkTJ5p9/uDBg8m+Bru1a9fOqVSpknP58uUEr3Xp0sXsS7p/rF692gkNDXWOHDkSME+PHj2cTp06md91P+jbt6/Z5+rUqWP2H12GHk9d3bt3d5o3b+7UqFHDPHr37m2m67FLl6XHPt138uXLZ96r63ZVqFDBmT59uu+5HiOLFi3qlCpVyux/euzV8k6ePNk3T0rLHTBggBMeHu5UrFjRHH9btGjhBAOCikU0MOh/lvbt2zu7d+9Ocr569eqZA3hyxo8fb/4zXLlyJSA8lCxZ0tm/f795fuzYMbO+WbNm+eZp3Lix061bN98J6OWXXzYnJP+gktp1XX/99c6vv/7qm3by5Elz0pkyZYp5ruvQ4JRSOIO9QUUPol27dvU9Hn744YD5hg8fbg7MP/zwg/nb+x+4dR/WZfz444++aQsWLHDy5MnjHD9+3DePhh03gLj7TYkSJUwZ/OkBXg/katOmTWbZ58+f972uv0dHRyf7GuwVExPj5MyZ0xkzZkyir3/88cfm77p161ZzYtcvUZMmTfK9rgFEg7KGXTVkyBBzoj916pTv9WbNmjlPPvlkQFDRwLNq1aqAdWmg0MB09OhR81z3z9y5czuLFy9ONKhosNJwoYHaDR2jRo0y5Y0fVFJabpkyZZw33njDCSZc9WORXLlymarL3377zTSTaPWgVot/+OGHqXp/TEyMqZ7UKtEaNWrI3r17TTWnv759+5oqTqVVjtpJVqtT3WpOrWYfM2aMrzr/8ccfT1Admtp1aRW+Vsm7PvjgA1Pt/+ijj5rnuo7/+7//S/N2gj20SaZHjx6+h1a7+3vuuedMB8EmTZrIbbfdlqBjoXYIr1evnu95p06dzL61ceNG3zStYteHa8uWLaZaf8GCBWadWoa//e1vpkrd3Zd1/kKFCpl9TavptTlT+87ky5cv2ddgL22u0yYR/33BnztdL0TQJpH7779f5s2b53v9o48+Ms3duo/qcrTTd4cOHUxTth73dL9q1qyZfPbZZwHL1aam5s2bJ1ifNjW6HVp13TVr1vTtf/Hp8rW5Rv8/uE3t2vypx8OrWW6woI+KZfQ/hPZD0bbz7777TpYsWWLCiu7UyV1188Ybb8gzzzxjDsAaLNwOjtp+7wYTFT906H+U8+fPm981bKhKlSr5Xtf22fht96ldl//v7vJ1WbpMl/+6kH36qLj0xFC9enVzpUKbNm0SvB7/6iAN67pP/vnnn75p8e/mferUKV+oiX/nVfe5/tSTg3aw7Nmzp+mHoMH55ZdfTvY1biFhL+0w6/ZxS4w7xIE7n/5NJ0yYYL6A6Rc/DS16LNW/sV6koMe9d99913w59Be/r0n841hqjqXx6fp0v/N/j4bjxK7cTMtygwVBxVLam10fvXv3Nj3ctbNYUkFFD7QPP/ywqXlxe71r7YZ2hNUOuqnlnhDOnTsXcAI5e/ZsutYV/2oQXb52BPYX/zmyF91PtPPrE088Ya5Sa9u2bUAtm3771RoNN+wcP37c7H9JnRyU28Fb57njjjuSnE9PTvr/Rmn412/GGoy1c29yr8FObqdTHZ8kMVoLp8ec2rVrm+fVqlWTm2++2QSUwYMHy1dffWUe/lemjRs3Ttq1a5fseuMfx9JDh5jQsKHHSP/lcfxLHZp+LKI9yrXaOz49wes3U5f+J9OqS5cOxnblyhVzsHV98cUXaV6/fvPV9P7ll18GnEi0ajQj1tWgQQNzBZD2yHctW7YszeVE1qBXWDz44IMyfvx4mTx5srRu3drUYGgw8f8WPGPGDN9z/Qas1d3+V2XEpwH+1ltvlZEjR8pff/0V8K3V3Z90P1u9erXvNQ0meoWZniySew120y9JGjy0lsSf1rLo+CPaFOh/JaHubzq/hmUNOS1atDDTtTmySpUq8s477yRYx7UID3qlkIaUVatW+abpfqhNmGmVJ97xPxhQo2IRveRXLzXWttW6deuagKLNP1pFPXr0aN982ma5ePFiM69Wc+o3CO3Pom2bepmlttXrySGttBblySefNDU4WouiTTvapuofkqpWrZrudemlpw0bNjRtxPp59PPqHZuRdWn/kPiXt2vY0CY+7Q+lB2jdp5T2CahVq5bZp8aOHeurFdHLhLUK/sKFC6YdX2th/Pe5xLz33numX4quRy9BPXnypAkabi2JfoPVb9F6ItBgo2Fbq9517AldT1KvwW5aK6f9irS/U1RUlDkW6pcnHWdKa1xeeeWVgPn1WDp8+HBTc6LjU/nvq9OmTTPHIj2Ode3a1ew/y5cvN/ueux9lFG1O0vXo/wn9/6FNnNoXUH/G//+Tkpo1a5rL+TVgazNWMFyeTFCxiAYAbcufNWuWGUhLvyVoG6Z2AvOvntSDvDYDvfDCC+agq6O6fv311+b5xIkTpWzZsqZD2LBhwwLa9zX8xL+uX4OHfzu/dm7V//C6fh1H5Z///Kf59um222qNS3rXpbTPjZb91VdfNe/9/PPPTYddRjLNen2p9GCZGB07R/uRaJjV+dwDse5PWvWu40O4N20vUqSI/Pe//zWdBbWPk3bu1ve7dGyMxGpXdN/SjtwalLUmRf+f6AHcbULS5qEVK1aYdWn40f9bGppcyb0Ge+nfV8eV0o752rdEH/qF6rHHHjNBIH4fI61F0Vo93U/69OkT8JqOhK3NSHos0lGW9binX6a0ud2ltS6JDWCoX7ji9yXR/c+/f0v8Ad90PVrr89Zbb5kaHa1l1M7l/h1qU7PcSZMmmeClD63dXrlypWR3DKEPwBMadPWEo+EcyO60Wd/t6OteXKD9onTgNg3oSBo1KgAAXGMzZ840NXhak6NXtWmTuV4OTUhJGTUqADyhHSK1Y3WrVq34CyDb02Ya7fuizZ86RIP2MdSrzLSfCpJHUAEAANbi8mQAAGAtggoAALAWQQUAAFiLoAIAAKxFUAFgve+//96M0nwt6F1z/Yc2B2AXxlEBYBUdAC42NjZgaHC9rFPvEXQtxpzQ4fs3b97suw8MALsQVABYRe8JpPfuCYZ7mABIGUEFQLqaYvR+PTVq1DC1EXoXZL2vj94MUG9oqffh0YGsmjRpEjBsuEvv7bNnzx5zT56bb77ZDIDlP12XoXe8Vf536tYbx23atMnc4VbvixL/HlE6qJaW7dixY+aGg1q++LS2Ru9fpevkHj+A/QgqANJMm2I2btxobpxZrVo1Ey40rLz44ovmjth6s0u96Z/ecE2Dg3tjNw0getdjvUmchgSdR8ON3qxSb9SmdzLWmwxqmNAbzik3bGzfvl3q1atnbtCmNzDUux9r3xK9cZzScNK2bVtzV+7q1aubPi133HGHudOyG4R0JFwNPtqMpPdZ0WVqWPK/oSYAyzgAkEZ9+/Z18uTJ4+zevds8j42NdUqXLu0UKFDA2bt3r5l27tw5p2jRos7MmTN97xs0aJDTrl07M7+6cuWK06VLF6dnz56+eR566CGna9euia5vx44d5nlcXJzTqlUrp3///r55+vXr59SrV8+Jjo42z7UcBQsWdGbMmOGbp3fv3k7Tpk2dCxcumOdbtmxxcubM6bRp04Z9ALAUNSoA0kVrJrRWQmkzT926dSU0NFTKlStnpmltSq1atUytidJajHfeeUceeeQRWbx4sWk60kepUqXMXZRTctttt5maGhUSEmKampYvX+5+4ZIFCxbIa6+9Jvny5TPTtBz333+/aUIaNGiQmUfXM3v2bF9zVM2aNaVdu3amBgeAnQgqANKlUKFCAc/Dw8Mlf/78Cabp7e3V8ePHTR8T7dNy8ODBBCEkJYULF05y2SdOnDDLLl++fMA8FSpUkC+//NI3z4ULF6Rs2bIB82ig2bVrVyo+MQAvEFQAZArti6I1IQ8++KDpp5LRoUn7ofz5558B0/X5DTfcYH7Xjrda4/PXX38FzBP/OQC7MOAbgEwLKnoV0IwZM0wzjD/t5OrSWhm3piS1cubMKbfccot8+OGHAVcAffTRR9KsWTNf85TO43bSVVoLs3Tp0qv4VACuNWpUAGSaV199VVq3bi2tWrWSe++91wSSr7/+2jTZTJs2zcxTv359M5aKzqvNPf6XJyfn5ZdfNsvVmhUNJNpnRa8yioqK8s0zfvx4ufPOO03NSu3ateWtt96SuLi4a/Z5AVw9ggqANNMxTOKf4BMbM0U7vOplxy7tXKuXBGtAWL9+vWmWGTJkiLRp08Y3jzYLaV+SdevWmcuf9fLkxNanl0X7v69x48ayYcMGs+y1a9eafi96abLb9KM09KxZs0befvttU46nn37adKTdv38/ewFgqRC99MfrQgAAACSGPioAAMBaBBUAAGAtggoAALAWQQUAAFiLoAIAAKxFUAEAANYiqAAAAGsRVAAAgLUIKgAAwFoEFQAAYC2CCgAAsBZBBQAAiK3+H/KD5RfJjhLrAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fastest median: Overnight\n"
     ]
    }
   ],
   "source": [
    "### Solution\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "deliveries = pd.DataFrame({\n",
    "    \"method\": [\"Standard\"] * 5 + [\"Express\"] * 5 + [\"Overnight\"] * 5,\n",
    "    \"days\": [5, 6, 5, 7, 6, 2, 4, 3, 5, 2, 1, 1, 2, 1, 1],\n",
    "})\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "sns.boxplot(data=deliveries, x='method', y='days', ax=ax)\n",
    "ax.set_title(\"Delivery Days by Method\")\n",
    "plt.show()\n",
    "\n",
    "medians = deliveries.groupby('method')['days'].median()\n",
    "print(\"Fastest median:\", medians.idxmin())\n",
    "# Sample reflection: Overnight has the lowest median (1 day) and smallest IQR (0 days) in this sample. Each method has only five observations; future deliveries may differ.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-10T18:42:50.748756Z",
     "iopub.status.busy": "2026-10-10T18:42:50.748688Z",
     "iopub.status.idle": "2026-10-10T18:42:50.750607Z",
     "shell.execute_reply": "2026-10-10T18:42:50.750314Z"
    },
    "tags": [
     "thebe-interactive"
    ]
   },
   "outputs": [],
   "source": [
    "### Question 5: Discount Response by Region\n",
    "# A regional director wants one panel per region showing how discount\n",
    "# relates to units sold.\n",
    "#   1. Use the figure-level function sns.relplot() to draw a scatter plot\n",
    "#      of discount (x) vs units (y) from promo.\n",
    "#   2. Put each region in its own column (col='region') and use height=3.\n",
    "# Reflection (answer in comments): Which region shows the smallest change in units as discount increases? Does this comparison justify a discount policy by itself?\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "promo = pd.DataFrame({\n",
    "    \"discount\": [5, 10, 15, 20] * 3,\n",
    "    \"units\": [40, 52, 61, 75, 38, 41, 45, 47, 30, 45, 58, 70],\n",
    "    \"region\": [\"East\"] * 4 + [\"West\"] * 4 + [\"North\"] * 4,\n",
    "})\n",
    "### Your code starts here.\n",
    "\n",
    "\n",
    "\n",
    "### Your code ends here.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-10T18:42:50.751415Z",
     "iopub.status.busy": "2026-10-10T18:42:50.751350Z",
     "iopub.status.idle": "2026-10-10T18:42:50.843402Z",
     "shell.execute_reply": "2026-10-10T18:42:50.842996Z"
    },
    "tags": [
     "hide-input",
     "lab-answer"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3oAAAEiCAYAAACvEaDLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQhNJREFUeJzt3Qd0VNX2x/ENmNATShRBQJAiiERAEQUBwY4iCKigUlTsPlFRgWevgOWJYBdULFijICpiFxARVATFFlApIpFQEpAu81+/83933mRIIXVm7nw/a2Ulc+9k5mYyd8/Z5+xzbrlAIBAwAAAAAIBvlI/0AQAAAAAAShaJHgAAAAD4DIkeAAAAAPgMiR4AAAAA+AyJHgAAAAD4DIkeAAAAAPgMiR4AAAAA+AyJHgAAAAD4DIkeos6bb75pn3zySaQPA4DPPPbYY/bjjz9G+jAA+Mi3335rzzzzTKQPI2rNnz/fXnjhhUgfRtzaJ9IHAISbNGmSNW3a1Lp16xbVL867775rP/zwwx7b99tvPxs0aFCJPEdaWpqlpKRY165dS+TxgHh2++23W/Xq1a1ly5YWraZOneq+9+7dO7gtKyvLnnrqKTvyyCOtS5cuwe2//fabixGXXHKJ+7uK47XXXrP999/fOnfuXKzHAeLNnDlz7OGHH7bzzz/fopk6ud555x079NBD7eSTT86xb9y4cXbSSScVOzZ+8803tnjxYhsyZEhw28cff2yvv/66nXfeecV6bBQNI3qIOn369LHu3btbtJsyZYpNmDDB1qxZk+Nr3bp1JfYcatxNnz69xB4PiGeXX365HXLIIRbN1FAaNmxYjm0fffSR3XDDDXb33Xfn2P7SSy/Z2LFjrVq1asV+3ieeeMI1AgEUTtu2be2CCy6I+pft66+/tuuvv9769++/Rztl5MiRbn9xzZo1y+6///5iPw5KDiN6KHKPzRlnnOEaBkpu/vWvf1lCQoJt3brV3nvvPVu9erUddNBBdvzxx7vtoVasWGEzZsywpKQk1zu9cOFCq1Spkruv1KxZc4/eaQUl/c7GjRstNTU1R6+2vPLKK1a/fn2rV6+eff7557Z7927XO1WnTp1S/Q83a9Ys36D2/vvvu9dKNDKnHvnwhmYgEHClqj///LMdcMAB7nWoUqWKGzH8/fffbdu2bcHnGDp0qNWoUaNU/yYgUvSeL1++vLVq1cqdO/rZ6yXPzMx0sWXz5s2uR/qYY47JtYRK57/OI3UWaZRK51zr1q3d/n333dcqV66c43c0Kvbhhx/arl27XFzRc4caP3689ejRwz3vV199ZcnJyXbaaaft8TglRZUMd955p/36668uhorig0b49Jrs3LkzGFO1/dhjj7Vy5cq524q/ipOKv02aNLETTjjB9tlnnxyxRknjL7/8Yg0aNHCxRn/H22+/7eKy4qYXay6++GIXo4FYt379env66afde1qjb+np6XbKKadY8+bN3f7Zs2e7z2nFB51/+h7q77//tmnTptmWLVusffv27pyaO3euXXTRRW5/1apV9/gdxROdi4ovapsohqidE1rOqPOwZ8+e7jzOyMiwjh07BmNVaalQoYKLj+o0+s9//pPn/fb2+E899VQXt3X8GiXU36L2mhdHvHadV5lQln8r/h+JHorUY3PPPffYmDFj7PDDD7e6deu6BoROeiVXDRs2dA2xZ5991vUSffrppy55E/2sgNGpUycXPLQ/MTHRjjvuuGBACC/dXLBggZ144okuwdN2lV+pcaNGXOjcmw0bNrhGkBprS5YssWuvvdYlpTqe3Ci4f/nll/n+rQMGDHBBsagU2JQIe43Qq666ym677TZ3bKLXTYFeJRV67dTgvOWWW1yDVr+7fft29yHjPcY///xT5GMBYmGUXMmUGhk6x72G2MyZM10vtEqYFW/uvfde14uuciAvyVHplM4rdUCJRsCUHOq+XoMivHTz+eefd50naqwo4dHv6/wbNWpU8Jj+/e9/u/klOlePOOIIF8Puuusud5zhnVgexably5fn+7dec801rtEV7uijj3YNKjWIQhM9xVzFMzWwFD937NjhGpv33Xefu89PP/3kYoh+R51JmjN04403urIpdQ7p+NW4Xbp0aY5Yo9eWWAM/++uvv9xIljqE1VGjtoQ+W/WleKFzQh1Df/75p11xxRX2xhtvBEuYFUN0TupcV+eSEhgldkpmvEQvvHQzOzvbxa9Nmza5dsyTTz7p2jpqO6k8WnRePvTQQ+68VvKo81ntA8Wks846K9e/Y+XKle5vyI+OVfEhP3pOPYeer1GjRnvsL8zx33HHHa4zTduVCOt31A7z2ixqv8gff/zhjm1v/1aUHBI9FMnatWvdSaoGg0fz0s4555xgeZEaFtqvxpXqv3VbJUm63+OPP+7uo4aLGk9K9PJy6aWXumToueeec7fVG6dEUo2pM888M3g/BZjvvvvOBWE9lxqCKkcKL3cKvb8XjPKigJUf9YKHj+i1adMmmLTq+EKPUR8I6mXXB4KSX/Xaa1R01apVwYRSPWhqvCrJnDx5svtbKYVAvFBjRkmLRpy8RofOBfXIe0mczl0lMy+++KKb96FGl5KzRx991CVuMnHixGBDLK9efjU2lCjpu6iBd/bZZ1vfvn2DSaY371Yl1DovVVWgTiqNgnnHE06dTgXFFsWo3CjJU4NICeWFF17oYq1eD3VgKdHVdjXklPCpYeWVuet10LwYxVvv8RVXlZQqfqgjTkmdjsurdFi2bJn7m84991yXGCoWqwMP8CMlb6GjWOp0VRxQx7DXaaNzRXFD55yoNFr7VNaoziCN7OszPj86h9R5os5ddSypKkcjWOp4UUd2aAKquKLzTkaMGOGeL6/kRwlSQXFFsbEgvXr1cgnXTTfdlOsiKXt7/DqWl19+OccaAqeffrr7u0LbLOpUL+zfipJDoociUcMnNMlTiaFGx9QY8ZI6fVWsWNH1OouSGZVHaKTP065dOxdw8qJeICWDasCFlkuqZ1pBIzSJUjmVkjxR40WjjUqa8qKRRX0Vh3oEwwOvAmQojdZpVFI9gyqNUrDWh4gac+pp14imFlTQh4s+SBo3blysYwJimXqSvSRPVK6oxotiTGhsqV27tostSnDU06xOmdAFAPTzlVdemefzqPGhRpsWMgmdH6wkSCPqoYmeGiPeyKHOWZVF5hdbVCJWHOpFVyeVKLHTCISeVw0qjXqqwaVRPo1utmjRwo1IqCGqDqbQ10hJoxd/1bGkBqtGQZVAap/+DiBeDBw4MMdtJSk6zx955JHgOaPPc02jUAJYq1YtV5ao3/NKtTUfVh0j6oTNi9om6tD2pqDoXFNM0Ah6KJ1/XuIj+lnz8vOi+5dUp6+SLLXXrrvuuj0S1709flVL7e1CcYX9W1FySPRQJOH16ErIvN53JTOegw8+OFhGoHkjEl4KqXl1eVFyKOpBD6WGoHrhQoXPJ1GjJjzpKunSzYLm6KnsS0mqSk/VKNMxqcGoDxFRY1Ujk+qFV2lEhw4dbPDgwe7La1gC8R5b1GHkxRiPkhqN2nuxRZ1PofPR9HP4Y4XHFs2b1WOHxxYv7uQXW9Rhk5filG56iZ4aVape8ObhiRpVSl713NrulbeHxl+VvXo06qnXRfT91VdfdfP/VNaqWKNkuKRWCAZiMbaodDH8fB8+fHhwxF2xpTBtFtHj5dZm0ei8Ooe9mFPYuFJSpZui+6hSSiNrGukvyvHnF1/DFfZvRckh0UOJUMIi6unKa3lur1xIQ/he40MUPPJaNEXJkfc7ocFWvW7evqIqidLN/KjRpRIINci8Xi+VfT3wwAM5yrZU6qAvlZ+pHMwbhQgdnQDiObZokRF1hngj9uEUPzRirvPK6yBRh1N+K+Aqfmi/5r2GJlwlEVuKU7opSsK0IJNih77U++71imuUQaN8X3zxhZsXFBp/NfKghl5etKCLvvR3v/XWW3bZZZe5BW9Y9hzxSOeNKn/ymt7hxRa1P0KpzZIfxY/w31E80Lkb3rFUGCVVuukZPXq0m7+s+bplcfyIDBI9lAiN3KmESEmMeorUeBD1LmtuiHqWNcyvxVRUeqTJwN4cEY2qaR5abtSLpMdVmYTXe68Vm7QalC5tUBwlUbpZUMBVY07B0aN5RuHBUw1TfZjoQ0cjeZr47M0PUC+YN5kZiEcaDVfjQiPnt956a3C7RuuVUKlHXvNHlNi9+eabrvxS9LMSxLzod9SrrEsUeInOZ5995kbiint5l+KWbuq4FEd1bIqfoasMq9NIDTTNm/FG9LRSqFddELpAjTqqNCqo+KuFJrxRTsUazRPWXGliDeKVOj30maxFmLzOElm0aJEddthh7mfFAo2ieSPwatNoZDw/moevc1dlkTqXFZu0xkDoCpRFUZKlm6JFqRQHNKpXUsdPmyX6kOihRKhhoUm9mjunHmXN31MjTCszKUCqoaHkT4mgFjrwSgMUQLVak5cY5va4qp/XqnhKirxEUfP6lBRFWm6LsaieXaNyGoHUYgj9+vVzi9RoHo1ej9DRAzVWNbdQr5nmCmg+n+YxahVRUQNPIxl6jTSaweUVEG80+q/GmEa4tdKl5naohElJmeb7KtFTKZVKnzWipfl6XqKnOSZ5xRadU+pw0jml0THNwdECLldffXWwkRdJamBqgRl1cIVeUkWJnuYVHnjggcFVORUntTCNOq6UwKqhpvJwxRutNqj4q3isRRi0X0mhSt+V5HmdT4o1ej1UzqpYw+UV4HdaMVIdzTrftQiT5ssrFmhES4mOaD6sRv1UPq1z8oMPPnCdr3nFFbn55pvdPDet0qlLDihWad5f6PoE0ULtC7WrVJJZEsevDirFZy1wpc794ia3KD4SPRSagl5uy/xru3qPtbCIRurUW6Qkz2uMiEoUtVqcrkmjnh+VD+kafFry2KMeeTU2PAquapTocVX6qHJIJYuhgVZBOnwREzV2SnM0TMmnGovhpRSh19fSippqgCnJO+qoo9xCCUoMvUUQNBKqla202p9eOwVJrQrmlbLqAs9qxOo+eh4urwA/0zmVWwNKl1ZQgjJ16lRXUqTzRJdNCB0t1wp6Ose0sq06WdRgUwwKjS3hF0zXKsB6XC2+op56nYfho3m6jxKjUEootUBKaVIcVDmqyjhDqTNNc4jCn1+dX1781Wq+GuXT/by4qL9b1yz1Yo1K7LU8uldGr4aZKig0mkGsgZ9otE7nQvj1edUG0XU39TmtTiR1cGiV2tBrdCqW6JxQR7YqBFRVoNteIpjbBdPVftF9tNiLFm3SonGa7x8ar3Reh1+LU3FG8aa0KAbodQil9oU6uLTonRcbi3r8Xptm3rx5bt6fqq/UBovE34r/KRfIb6IAUMJUPqQg4i1lrBExlWYqoCgJBICiUMmlRrk8St6UOGq1ztBVPAFgb6lzVe0Wb3ESlTGqAkcd26GrgQPRihE9lCmVbKpHWuUA6kFXL5l60NUgA4Ci0oICmsurEiv1JOs6nyp9JMkDUFQaC1H7RCP/mt+qyy1opD18XhsQrRjRQ5nT4gIqldDFfnX9FpI8ACVB5ZpakVIVAypNDC97BIDC0lx6lUSrAklTUVRWrevpAbGARA8AAAAAfCbvZYMAAAAAADGJRA8AAAAAfIZEDwAAAAB8pny8rJqUnZ3tvgMAMQZArKANA6Co4iLR27Rpk7torr4DADEGQKygDQOgqOIi0QMAAACAeEKiBwAAAAA+Q6IHAAAAAD5DogcAAAAAPrNPpA8AAIoja8sOy9y8w7K37bSkygmWUjXRkqsk8qICAIC4RqIHIGat3rjVRqQtttnpmcFtXZql2Ji+qVavRuWIHhsAAEAkUboJIGZH8sKTPJmVnmkj0xa7/QAAAPGKRA9ATFK5ZniSF5rsaT8AAEC8ItEDEJM0Jy8/mwrYDwAA4GckegBiUlKlhHz3Vy9gPwAAgJ+R6AGISSnVEt3CK7nRdu0HAACIVyR6AGKSLqGg1TXDkz3dHts3lUssAACAuMblFQDELF1CYcKAtm7hFc3JU7mmRvK4jh4AAIh3JHoAYpqSOhI7AACAnCjdBAAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACf2SeST/7oo4/ajh079th+6KGH2vHHHx+8vXXrVnvvvfcsIyPDWrdubZ06dSrjIwUAAACA2BHRRG/58uW2ffv24O2NGzfa5MmTbezYscFEb82aNda1a1dLTEy0Nm3a2E033WSnnXaaPfvssxE8cgAAAAAonqwtOyxz8w7L3rbTkionWErVREuukmgxn+gpoQs1YcIEe/HFF23w4MHBbSNHjrTKlSvbvHnzrFKlSrZ48WJr27atnXHGGdarV68IHDUAAAAAFM/qjVttRNpim52eGdzWpVmKjembavVqVPbXHL1JkybZ6aefbnXq1HG3d+/ebWlpaTZkyBCX5Elqaqor3Xz11VcjfLQAAAAAULSRvPAkT2alZ9rItMVuf0yP6IX6+uuvbdGiRTZmzJjgthUrVtjmzZutRYsWOe6r2wsWLMjzsVQOGloSmp2dXUpHDSAeEWMAEF8AFIfKNcOTvNBkT/uLW8JZPppG8xo2bGgnnnhicNumTZvc9xo1auS4b82aNYP7cjN69GhLTk4OfjVo0KAUjxxAvCHGACC+ACgOzcnLz6YC9sdMoqdVNadMmWIXXnihlS//v0OqUqWK+x6e1GmEztuXm1GjRllWVlbwa+XKlaV49ADiDTEGAPEFQHEkVUrId3/1AvbHTOnm66+/7ko0L7jgghzbNcJXsWJFW7ZsmZ1wwgnB7brdrFmzPB9Pv6MvACgNxBgApYX4AsSHlGqJbuEVlWmG03bt98WInso2TznlFKtfv36O7QkJCdajRw832qeFWbx5e59++qn17t07QkcLAAAAAEWn+XdaXVNJXSjdHts3tUQusVAuEAgELIKWLl1qzZs3t6lTp7oVN8Olp6dbx44drV27dtahQweX9DVq1MhmzpxpFSpU2KvnUKmn5uqpjDMpKakU/goA8YwYA4D4AqA419HTnDyVa2okzxfX0ZM//vjDrr32WjdylxuVaH7//ffu+noZGRl22223Wf/+/fc6yQMAAACAaKSkrqQSu6gb0SsL9LYDIMYAiEW0YQDE9Bw9AAAAAEDJIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAn9kn0gcAwCxryw7L3LzDsrfttKTKCZZSNdGSqyTy0gAAAKBISPSACFu9cauNSFtss9Mzg9u6NEuxMX1TrV6NyhE9NgAAAMQmSjeBCI/khSd5Mis900amLXb7AQAAgJgc0fv+++/t008/tSpVqlivXr2sdu3aOfZv2rTJpk6dahkZGda6dWs76aSTInasQElSuWZ4khea7Gk/JZwAAACIuRG9a665xjp27GgLFy50X8cee6wtXbo0uH/VqlUuuZswYYItW7bMzj//fDvzzDMtEAhE9LiBkqA5efnZVMB+AAAAIOpG9CZNmmSPPfaYffnll3bYYYe5bWvXrrUdO/5XrjZixAjbd9997fPPP7eEhAS7+uqrrVWrVpaWlmb9+vWL4NEDxZdUKSHf/dUL2A8AAABE3YjeuHHjrH///sEkT5TUHXDAAe7nf/75x5VsDho0yCV5cvDBB1vnzp3t9ddfj9hxAyUlpVqiW3glN9qu/QAAAEDMjOht3rzZzc0bPny4m5/39ddfW7169axHjx6WnJzs7rNixQrbsmWLNW/ePMfv6rZGAfOyfft29+XJzs4uxb8EKDrNv9Pqmlp4RXPyQpO8sX1TmZ8XpYgxAIgvAKJdxBK9jRs3uu9PPfWUG7nTPL033njDhg0bZh9++KGlpqa6ZFC8xM9To0aN4L7cjB492m6//fZS/guAkqFLKEwY0NYtvKI5eSrX1Egei7BEL2IMAOILgGhXLhChVU02bNhgtWrVcgnenDlzrFy5cm579+7dLTEx0d577z379ddfrUmTJjZz5kw78cQTg7976aWX2hdffGGLFi3a6972Bg0aWFZWliUlJZXBXwfAz4gxAIgvAKJdxEb0atasafvtt5916tQpmOTJMcccY88995z7uWHDhla5cmW3Cmdoopeenu7m6uWlYsWK7gsASgMxBkBpIb4A8MViLLpMwrx583Js00hdy5Yt3c/77LOP9ezZ055//nnbtWuX26ZLLMyaNcv69OkTkWMGAAAAgGgXsdJNyczMdCtoeiN7WmDlu+++s08++cRdQkF+//13t++ggw6y9u3bu9U2tUrntGnTrHz5vctTVbqpeX6UbgIoDcQYAKWF+AIgJhM92bp1q0veli9f7ko1e/XqtcfiK5rP99prr1lGRoa7ePrpp5++10meECQBlCZiDADiC+JV1pYdbkG57G07LalygqVUZUG5aBHxRK8s0AgDQIwBEItowyCard641UakLbbZYZeI0qWjtKo44niOHgAAAIDYHMkLT/JE1wXW9YG1H5FFogcAAACgUFSuGZ7khSZ72o/IItEDAAAAUCiak5efTQXsR+kj0QMAAABQKEmVEvLdX72A/Sh9JHoAAAAACiWlWqJbeCU32q79iCwSPQAAAACFklwl0a2uGZ7s6fbYvqluPyJrnwg/PwAAAIAYpEsoTBjQ1i28ojl5KtfUSB5JXnQg0QMAAABQJErqSOx8VLr5119/2cMPPxy8/eSTT1rTpk3tpJNOsj///LMkjw8AAAAAUBaJ3nXXXWe1a9d2PyuxGzZsmJ1//vmWmJho1157bVEeEgAAAAAQydLN9957z8aPHx/8+bjjjrMbb7zRVq9ebW3atCmpYwMAAAAAlNWI3o4dO2z79u3u5w8//NCOP/5493PVqlXdPgAAAABAjCV6nTt3tssuu8yN6r355pvWs2dPt33evHl29NFHl/QxAgAAAABKO9F75JFHbOfOnTZx4kR78MEHrUmTJm77o48+ajfffHNRHhIAAAAAEMk5elOmTLHp06fvsX3atGk2ZswY69ixY0kcGwAAAACgCMoFAoFAoX+pXDnL69fy2xcp2dnZlpycbFlZWZaUlBTpwwHgM8QYAMQXAL4o3cxLenq6paSklORDAgAAAABKs3SzUaNGuf4su3fvtoyMDBs8eHBhjwEAAAAAEKlE76abbnLfL7roouDPnoSEBJf8denSpSSPDwAAAABQmone0KFD3XeVZ/bu3buwzwUAAAAAiNY5eiR5AAAAAOCDEb369eu776tWrQr+nBfdBwAAAAAQ5YneXXfdlevPAAAAAAAfXEcv1nCNq7KRtWWHZW7eYdnbdlpS5QRLqZpoyVUSy+jZgcghxgAgvgCI6cVYgLys3rjVRqQtttnpmcFtXZql2Ji+qVavRmVeOAAAACDaF2P5/fffrWfPnlarVi0rV67cHl+Iv5G88CRPZqVn2si0xW4/AAAAgCgf0bvwwgvdBdKfeOIJq1mzZskfFWKKyjXDk7zQZE/7KeEEAAAAojzR+/LLL23ZsmVWp06dkj8ixBzNycvPpgL2AwAAAIiC0s26deuW8GEgliVVSsh3f/UC9gMAAACIgkTvoosuslGjRtn27dtL+HAQi1KqJbqFV3Kj7doPAAAAIMovr9C8eXNLT0+3KlWquIunhy/A8tNPP+3V46SlpdkXX3yxx2jh8OHDc2xbu3atvfzyy5aRkWGtW7e2fv36WYUKFfb6eFn6vGxW3dTCK5qTF5rkje2banVZdRM+R4wBQHwB4Is5eldddVWJPPkHH3xgc+fOtUGDBgW31a5dO8d9NBewU6dO1qpVKzvyyCPdSOLTTz9t7777bqGSPZQuXUJhwoC2buEVzclTuaZG8liEBQAAAIizC6ZfeumllpmZaa+//nqe99Ho3Zo1a2zWrFlWvnx5d2kHjSg+88wzdu655+7V89DbDqA0EWMAEF8A+GKOXkn69ddf7ZZbbrEHHnjA5s+fn2Pfrl277J133nEJnZI8adSokXXt2tWmTp0aoSMGAAAAAB+Wbqak5L7whkejdHtDc/uqV6/ufv7hhx/sxhtvdKN848aNc9uWL19u27ZtsyZNmuT4Pd0On9sXSovEhC4Uo952ACgpxBgApYX4AiCiid7DDz+c47Yunq7FWR566CG7+uqr9/pxbrjhBmvcuHHw9oABA+yEE06w008/3bp3725btmxx25OSknL8XnJysv399995Pu7o0aPt9ttvL8RfBAB7jxgDoLQQXwBE5Ry99957z43G6XtRNWjQwIYOHWq33nqr/fbbb3bQQQfZjBkz7OSTTw7e55JLLnFlngsXLtzr3jA9blZW1h5JIwAUFjEGQGkhvgCI6IheXjp37mz9+/cv1mNoXp6XpDVs2NCqVq1qP//8c45ET5dvaNmyZZ6PUbFiRfcFAKWBGAOgtBBfAETlYiy65MHejpgpoZszZ06Oba+++qpbYVPlm6LLJ/Tp08cmT54cTP6+//5793tnnnlmSR46AAAAAMT3iN4xxxyzx7YNGzbYjz/+6Obp7e1CLCrP3Llzp7tG3ooVK+yjjz5y27p16xa839ixY91IYYcOHaxdu3b29ttvu7l8Z5xxRlEOHQAAAAB8r0hz9G677bY9ttWsWdMlgIcffnihHsuba6ffVzJ34IEH7nEfLcqiBC8jI8Nat25txx57bKGeg2tcAShNxBgAxBcA0SaiF0wvKzTCABBjAMQi2jAAYvaC6QAAAACAkkWiBwAAAAA+U6KXVwAAAPCTrC07LHPzDsvettOSKidYStVES66SGOnDAoACkegBAADkYvXGrTYibbHNTs8MbuvSLMXG9E21ejUq85oBiGqUbgIAAOQykhee5Mms9EwbmbbY7QeAaEaiBwAAEEblmuFJXmiyp/0AEM1I9AAAAMJoTl5+NhWwHwAijUQPAAAgTFKlhHxfk+oF7AeASCPRAwAACJNSLdEtvJIbbdd+AIhmJHoAAABhdAkFra4Znuzp9ti+qVxiAUDU4/IKAAD4HNeCKxpdQmHCgLZu4RXNyVO5pkbyuI6e/3COwI9I9AAA8DGuBVc8SupI7PyNcwR+RekmAAA+xbXgAM4RxC8SPQAAfIprwQGcI4hfJHoAAPgU14IDOEcQv0j0AADwKa4FB3COIH6R6AEA4FNcCw7gHEH8ItEDAMCnuBYcwDmC+FUuEAgEzOeys7MtOTnZsrKyLCkpKdKHA8BniDGIlWuEcS242EN8KRucI/AjrqMHAIDPcS04gHME8YfSTQAAAADwGRI9AAAAAPAZEj0AAAAA8BkSPQAAAADwGRI9AAAAAPAZEj0AAAAA8BkSPQAAAADwGa6jBwCImYsZZ2/baUmVEyylaqK7NhwAAMgdiR4AIKqt3rjVRqQtttnpmcFtXZql2Ji+qVavRuWIHhsAANGK0k0AQFSP5IUneTIrPdNGpi12+wEAQBSP6M2ePdsmT55sJ5xwgp199tk59q1YscLty8jIsNatW9uQIUOsYsWKETtWAEDZULlmeJIXmuxpPyWcAABE6Yje2rVrbeDAgTZ16lT74osvcuz74Ycf7LDDDrNvvvnGGjRoYOPHj7fu3bvbzp07S/w41DO87K/NtnDFBlu2djM9xQAQYZqTl59NBewHACBeRXxELxAI2ODBg+3KK6+0F154YY/9I0aMsHbt2tkbb7xh5cqVs0GDBlnjxo3t+eeftwsuuKDEjoM5IAAQfZIqJeS7v3oB+wEAiFcRH9F74IEHbNu2bTZ8+PA99u3YscNmzpxp/fv3d0me1K1b17p162bTp08vsWNgDggARKeUaolu4ZXcaLv2AwCAKBvRW7Bggd1///321VdfBRO58Ll5KtFs1KhRju0a0dOcvrxs377dfXmys7PzPQ7mgAAojMLGGBSd5t9pdU0tvKI5eaFJ3ti+qczPg+8QXwDEfKKnhtGAAQNswoQJVr9+/Vzvs3XrVve9evXqObbrtrcvN6NHj7bbb79974+FOSAACqGwMQbFo0soTBjQ1nXKaU6eyjU1ksciLPAj4guAmC/dnDJliq1bt86VZg4dOtR9rVy50j788EP38+7duy0pKcndd8OGDTl+d/369cF9uRk1apRlZWUFv/S4+WEOCIDCKGyMQfEpqWuyXzVr07Cm+06SB78ivgCI+RG9Ll262H333Zdj2/vvv+/m4B111FGulFOrbCqh08qbp5xySvB+S5YssUMPPTTPx9alFwpz+QVvDkhoWVDwOJkDAqCYMQYA9hbxBUBJKRfQspdRok2bNnbsscfauHHjgtsuvvhi+/zzz23+/PlWtWpVN6+vQ4cO9s477+RI/goqE01OTnY973mNBGrVzbzmgNStUbkE/joAfrU3MQYAiC8A4uryCgW555577LjjjnPX0ktNTbWPPvrILrvssr1O8vYWc0AAAAAA+EVUJXq33nqrK90MlZKS4lbl/OSTTywjI8NuueUWN/JXGjTng3kfAEqLLuWiBUW0AFRS5QRLqUrMAQAAcZDonXHGGbluT0hIsBNPPLHMjwcASorKw0ekLbbZYeXhunSAKgoAAAB8dcF0AIiHkbzwJE80J1hzg7UfAACgJJHoAUApU7lmeJIXmuxpPwAAQEki0QOAUqY5efnRRcABAABKEokeAJSypEoJ+e6vXsB+AACAwiLRA4BSllIt0S28khtt134AAICSRKIHAKVMl23R6prhyZ5uj+2bymVdAACAvy+vAAB+pUsoTBjQ1i28ojl5KtfUSB7X7gQAAKWBRA8AyoiSOhI7AABQFijdBAAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACfIdEDAAAAAJ8h0QMAAAAAnyHRAwAAAACf2SfSB/D+++/bzJkzbfPmzdaqVSsbPHiwJScn57hPenq6TZw40TIyMqx169Z26aWXWtWqVSN2zAAAAAAQzSI6ojd06FB79NFHrVGjRtamTRubMmWKtW3b1jIzM4P3+fbbb9221atXW/v27e3FF1+0Ll262I4dOyJ56AAAAFEla8sOW/bXZlu4YoMtW7vZ3QYQv8oFAoFApJ78zz//tLp16wZva1SvRo0a9swzz9jAgQPdtpNPPtnKlStnM2bMcLeVBDZs2NAefPBBu+SSS/bqebKzs90oYVZWliUlJZXSXwMgXhFjAEQ6vqzeuNVGpC222en/6yzv0izFxvRNtXo1KvMPAuJQREf0QpM8Wblypf3zzz8ukZPt27fbRx99ZGeeeWbwPikpKda9e3d75513yvx4AQAAoo1G7sKTPJmVnmkj0xYzsgfEqYjP0Vu0aJGNHj3a9VgtXrzYJk2aZF27dnX7VqxYYbt27Qomfp4DDzzQPvvsszwfUwmivjx6bAAoKcQYANEUXzI379gjyQtN9rQ/uUpiiR4ngOgX8VU369SpY71797YePXpYvXr17LHHHrN169a5fdu2bXPfq1WrluN3dNvblxsljipz8L4aNGhQyn8FgHhCjAEQTfEle9vOfPdvKmA/AH+KeKK3//77W//+/e3KK690o3Rr1qxx8+/EW31z/fr1OX5HiaDm8uVl1KhRrpbd+1JJKACUFGIMgGiKL0mVEvLdX72A/QD8KeKlm6EqV65sjRs3tuXLl7vb6sVSQvf999+7ET/Pd9995y6zkJeKFSu6LwAoDcQYANEUX1KqJbqFV1SmGU7btR9A/InYiJ7qz9PS0nJsW7hwoX311Vd2zDHHuNtabfOcc85x8/a8GvU5c+bY/Pnz7bzzzovIcQMAAEQTzb/T6ppK6kLp9ti+qczPA+JUxC6voEVWhgwZ4pK2Fi1a2MaNG12Sp2vrqXSzQoUK7n7arkssrFq1yg455BCbO3euXXHFFTZ27Ni9fi6WPgdQmogxAKIhvmj1TS28ojl5KtfUSB6LsADxK6LX0RMlcFp5s2rVqtaqVSvbd99997jP7t27bd68eZaRkeFKNps2bVqo56ARBqA0EWMAEF8ARJuIz9GrX7+++8pP+fLlrWPHjmV2TAAAAAAQyyK+6iYAAAAAwGcjemXBq07lwukAQlWvXt0t+kSMARCtMYY2DICixpe4SPQ2bdrkvnPhdACh9mZxA2IMgEjGGNowAIoaXyK+GEtZ0GIuq1ev3qvMV6N+Sgh1gdKSaADGG14/XrtYet+V1IgeMaZsEF94/eIxxhQmvhTnWMFrVxy878r+9WNEL2Qxl4IWfAmnF5kAWXS8frx28fS+I8aULeILr188vfeKEl+E86ToeO147fzy3mMxFgAAAADwGRI9AAAAAPAZEr0wFStWtFtvvdV9R+Hx+hUdr118vHaxdKzRhteO14/3HucJMSY6EZ+j8/WLi8VYAAAAACCeMKIHAAAAAD5DogcAAAAAPkOiBwAAAAA+s0+kDyBarFixwn2FSkhIsA4dOkTsmKLd999/b5s3b7ajjjoqz4u8/vDDD/bPP//YoYceahUqVCjzY4xW6enplpGRYR07dnTXSAq1aNEi27RpU45tderUsWbNmlm827lzp/38889WtWpVO/DAA/d47TzLli2zjRs3WsuWLa1KlSoWDZYuXWpr1qzJsa1atWrWpk2biB1TtFu4cKFpGnm7du1y3b9r1y5bsmSJ7bPPPnbIIYcU+8LU8RKf58+fbzt27MixrWHDhu4r3m3fvt3FmBo1ariLF+f1ntJ9/v77b/fZlpiYaNFAn7fr16/Psa1mzZrWqlWriB1TNFMb5euvv7bKlSu7/2Nutm3b5l5XxermzZuX+THGanyeM2fOHtuaNGlidevWtXj3999/uzbgfvvtZ/Xq1Sv99rMWY0EgcOuttwaSkpICnTp1Cn6deuqpvDS5mDx5cqBdu3aBmjVrBpKTk3N9jZYsWRJo2rRpYP/99w8ccMABgYYNGwYWLFgQ96/ntGnTAp07d3avnU6/TZs27fGaHH744YEDDzwwx3vx7rvvjuvXbuvWrYEbbrghUKtWrcChhx4aqFevXqB58+aBzz//PMf91q9fH+jatWugevXqgWbNmrlz+uWXXw5EgwsvvDCQkpKS4/86ZMiQSB9WVBo/fnygZcuWgRo1agQOPvjgXO8zd+5cF1saNGgQ2G+//QItWrQI/Pzzz4F4tzfxuU6dOu78CX0vPvnkk4F4tmHDhsDll1/u3nOpqamBfffdN9CmTZvAd999l+N+q1atCrRt29bFosaNG7tzeubMmYFooDaLYmPo/3X48OGRPqyos3379sA999zj/n86R4477rhc7zd9+nT3f27SpIl7Xxx55JGBNWvWBOLd3sRntW/0WR36XkxLSwvEsz/++CMwcOBA955TbNHrp/bg8uXLS7X9TKIXkujpjYiC/fvf/w589dVXgQkTJuTakPjnn38CrVq1CvTr1y+we/dut23w4MEueVGAjWf6cPn0008Db775Zr6J3ujRoyNyfNFKH65jx44Nvl67du0KXHzxxa6RtW3btuD9zjvvPPfhkpWV5W7rPZqYmBj47bffInbsoYne2WefHenDiAnXXHON+7C78cYbc21IbNmyxTVo1TD33g89evRwCU68Kyg+e4ne888/X+bHFs1++umnwCOPPBKMJ/rep08f12EU6vjjj3eNM+9+eo/qdV63bl0gGhK9YcOGRfowop46BEeOHOk+F9Q2yS3R02dOtWrV3Ge2F3Pat28f6NmzZyDeFRSfRe2bDz74oMyPLZrNnTvXxV19Xkl2drbLO7p161aq7WcSvZBET701CxcudL3CO3fuLP5/1efyakjozayT/Ntvvw1uW7p0qds2Y8aMMj7K6FRQoqcPofnz57seIOROjVm9hosWLXK39VoqqZs4cWLwPgqoSgbvvPPOqEj0evXq5Y572bJlLqAjf3k1JN54441AuXLlAqtXrw5umzNnjns/KIYj7/jsJXr/+c9/XC9xRkYGL1ce3n77bfee8l6jFStWuNva7lGnUsWKFQNPPfVUVCR6ijP6v2qUwGsoIm95JXoatVKip2oSj6pDypcvzznzXwUles8995z7vIuGTpBo9fjjj7v44Z2rpdF+ZjGWEF999ZWde+651q1bN1dHPGXKlKLXxMZ53bbmzKSmpuaoza5Vq5bbh4KNHz/eLrroImvRooUdfvjhbr4NclqwYIGrW2/UqJG7rXp2zTvS6+XRfs0fiJb33bvvvmvnn3++mzfVuHFjmzlzZqQPKSbp/6m5DaHzPY488sjgPhTstttus6FDh7r3Yffu3W358uW8bLnEmOTkZEtJScnx3gqNMUlJSXbwwQdHzfvuhRdecP9Xzf3VHOUvvvgi0ocUk/T/1NzGSpUq5YgxmjulefQo2DXXXGMXXHCBi9W9e/e2tWvX8rLlEmMOOuig4Fzg0mg/k+j9lxZd+e2339zE/lWrVtmIESNs0KBB7p+A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SqIHRLmOHTtapUqVLNY8+OCDLjaS6AHRLRaTPLnpppvstNNOI9GLcSR6iKgdO3bYrFmzrFy5ci6pC9eqVSurX79+jm0rV650ZRG1atWydu3auV7tUD/99JP9/PPPdtBBB1nr1q1z7Nu9e7fNnz/fVq9ebU2aNLHDDjuswF7y7777ztauXRscZfzqq69s+/bt7rlVWpqVlWVHHnmkOx754Ycf7JdffrE1a9bYyy+/7LZ16dLF9YwBKFtbtmxxpVRVqlTJNcZoJG+ffXJ+FKqT5scff7S6deu6nvnw/Trvly9f7hpAzZo1y7Fv586drhx03bp1Ln41b968wF7yL7/80gKBQHCUcfbs2W6UsWnTpq46QHFS+7TNi0GrVq1ysceLMSeffLLVqFGj2K8XgMLZuHGjO2dr166da4xRZU+dOnVybFuyZIktW7bMDjzwQDfypzZQaDtF57jaEIo/DRs2zPG7W7dutblz59qmTZvc8+kxQr311luu7dO4cePgNlVKqY3ijTLOnDnTGjVqZPvuu6+LMYpxijFee0p/j2KY2j9ejOnTp48lJiby9ogxJHqImIyMDOvWrZv9/fffrtGjgKLAVKFCheB9wks377vvPrvzzjutU6dOLtitX7/eXn31VWvRooV7nHPOOcc16hSw/vzzT2vZsmUwSCloqTGk7QqCalwpAXvttdcsISEhz17yV155xebMmRNM9CZOnOiC7K5du1wA/uuvv2zFihX2ySefuMdVkqkArtLNqVOnut85+OCDSfSAMpaenu7OWyV5agypA0bnt+KFJ7x085prrrFnnnnGNc4yMzNdo0vnsZI+dfiosaNzXDFC57l6vB944AH3u7///rudeOKJ9s8//7gEUB1HAwYMsCeffDLfXvLHHnvMxRMv0Rs7dqyLV3p+JYq//vqri2+KO+r4WrRokf3xxx+uUebFmKOPPppEDyhjakeccsop1qBBA5fo6bxU0qYEzRNauqkOHcUErUWgc1YdNuqgmTZtmotDOtd79+7t2jbqiFbH9eWXX27Dhw93j6Wk7NRTT7WaNWu6NoVizA033GC33XZb8Pl0/7vuuitHoqfbilleojdixAiX+KnDSu0kJZ6Kk5q/XL16dddZtWHDBtfh5SWhel4SvdhDooeIufnmm11gU8+VAowCmnqnOnTokOv91eC6/fbb7aWXXrKePXu6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",
      "text/plain": [
       "<Figure size 900x300 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "### Solution\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "promo = pd.DataFrame({\n",
    "    \"discount\": [5, 10, 15, 20] * 3,\n",
    "    \"units\": [40, 52, 61, 75, 38, 41, 45, 47, 30, 45, 58, 70],\n",
    "    \"region\": [\"East\"] * 4 + [\"West\"] * 4 + [\"North\"] * 4,\n",
    "})\n",
    "\n",
    "sns.relplot(data=promo, x='discount', y='units', col='region', height=3)\n",
    "plt.show()\n",
    "# Sample reflection: West changes least (38 to 47 units). The chart omits profit margins and other influences, so it is insufficient to choose a discount policy.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<style>\n",
    ".ch07-lab-grader { max-width: 900px; margin-top: 1rem; }\n",
    ".ch07-lab-feedback-list { display: grid; gap: 0.45rem; margin: 0 0 1rem; }\n",
    ".ch07-lab-feedback-list[hidden] { display: none; }\n",
    ".ch07-lab-feedback-row { border: 1px solid #d8dee4; border-radius: 6px; padding: 0.55rem 0.65rem; }\n",
    ".ch07-lab-feedback-row strong { margin-right: 0.35rem; }\n",
    ".ch07-lab-feedback-row.correct { border-color: #aceebb; background: #dafbe1; color: #116329; }\n",
    ".ch07-lab-feedback-row.incorrect { border-color: #ffcecb; background: #ffebe9; color: #cf222e; }\n",
    ".ch07-lab-actions { display: flex; gap: 0.75rem; align-items: center; margin: 1rem 0 0; flex-wrap: wrap; }\n",
    ".ch07-lab-actions button { border: 1px solid #176de8; border-radius: 6px; background: #176de8; color: white; padding: 0.55rem 0.9rem; cursor: pointer; font-weight: 600; }\n",
    ".ch07-lab-actions button.secondary { background: white; color: #176de8; }\n",
    ".ch07-lab-actions.is-locked { opacity: 0.55; }\n",
    ".ch07-lab-actions button:disabled { cursor: not-allowed; opacity: 0.65; }\n",
    ".ch07-lab-result { font-weight: 700; }\n",
    "</style>\n",
    "\n",
    "<div class='ch07-lab-grader' id='ch07-lab-grader'>\n",
    "  <div class='ch07-lab-feedback-list' aria-live='polite' hidden>\n",
    "    <div class='ch07-lab-feedback-row' data-question='q1'><strong>Question 1</strong><span></span></div>\n",
    "    <div class='ch07-lab-feedback-row' data-question='q2'><strong>Question 2</strong><span></span></div>\n",
    "    <div class='ch07-lab-feedback-row' data-question='q3'><strong>Question 3</strong><span></span></div>\n",
    "    <div class='ch07-lab-feedback-row' data-question='q4'><strong>Question 4</strong><span></span></div>\n",
    "    <div class='ch07-lab-feedback-row' data-question='q5'><strong>Question 5</strong><span></span></div>\n",
    "  </div>\n",
    "  <div class='ch07-lab-actions'>\n",
    "    <button type='button' id='ch07-lab-submit' disabled>Submit</button>\n",
    "    <button type='button' class='secondary' id='ch07-lab-reset'>Clear Results</button>\n",
    "    <span class='ch07-lab-result' id='ch07-lab-result' aria-live='polite'></span>\n",
    "  </div>\n",
    "</div>\n",
    "\n",
    "<script>\n",
    "(function () {\n",
    "  var labId = 'ch07-lab';\n",
    "\n",
    "  function getParams() {\n",
    "    var params = new URLSearchParams(window.location.search);\n",
    "    return {\n",
    "      canvas_course_id: params.get('canvas_course_id') || params.get('course_id') || '',\n",
    "      canvas_assignment_id: params.get('canvas_assignment_id') || params.get('assignment_id') || '',\n",
    "      canvas_user_id: params.get('canvas_user_id') || params.get('user_id') || ''\n",
    "    };\n",
    "  }\n",
    "\n",
    "  function loadSessionIdentity(identity, actions, submit, result) {\n",
    "    submit.disabled = true;\n",
    "    actions.classList.add('is-locked');\n",
    "    result.textContent = 'Sign in from the account menu to submit this assignment.';\n",
    "\n",
    "    return fetch('/api/v1/session.php', { credentials: 'same-origin' })\n",
    "      .then(function (response) { return response.ok ? response.json() : null; })\n",
    "      .then(function (payload) {\n",
    "        if (!payload || !payload.authenticated || !payload.identity) return identity;\n",
    "        identity.canvas_user_id = payload.identity.canvas_user_id || identity.canvas_user_id || '';\n",
    "        identity.student_identifier = payload.identity.student_identifier || '';\n",
    "        submit.disabled = false;\n",
    "        actions.classList.remove('is-locked');\n",
    "        result.textContent = payload.identity.display_name ? 'Signed in as ' + payload.identity.display_name + '.' : 'Signed in.';\n",
    "        return identity;\n",
    "      })\n",
    "      .catch(function () { return identity; });\n",
    "  }\n",
    "\n",
    "  function codeFromCell(cell) {\n",
    "    var cm = cell.querySelector('.CodeMirror');\n",
    "    if (cm && cm.CodeMirror && typeof cm.CodeMirror.getValue === 'function') return cm.CodeMirror.getValue();\n",
    "    var cmContent = cell.querySelector('.cm-content');\n",
    "    if (cmContent && cmContent.cmView && cmContent.cmView.view) return cmContent.cmView.view.state.doc.toString();\n",
    "    var textarea = cell.querySelector('textarea');\n",
    "    if (textarea) return textarea.value;\n",
    "    var pre = cell.querySelector('.cell_input pre');\n",
    "    return pre ? pre.textContent : '';\n",
    "  }\n",
    "\n",
    "  function collectCodeCells() {\n",
    "    var cells = Array.prototype.slice.call(document.querySelectorAll('div.cell.tag_thebe-interactive')).slice(0, 5);\n",
    "    var code = {};\n",
    "    cells.forEach(function (cell, index) {\n",
    "      code['q' + (index + 1)] = codeFromCell(cell);\n",
    "    });\n",
    "    return code;\n",
    "  }\n",
    "\n",
    "  function applyFeedback(grader, feedback) {\n",
    "    var list = grader.querySelector('.ch07-lab-feedback-list');\n",
    "    list.hidden = false;\n",
    "    ['q1', 'q2', 'q3', 'q4', 'q5'].forEach(function (question) {\n",
    "      var row = grader.querySelector('[data-question=' + question + ']');\n",
    "      var message = row.querySelector('span');\n",
    "      var item = feedback[question];\n",
    "      row.className = 'ch07-lab-feedback-row';\n",
    "      if (!item) return;\n",
    "      message.textContent = item.message + ' (' + item.score + ' / ' + item.max_score + ')';\n",
    "      row.classList.add(item.correct ? 'correct' : 'incorrect');\n",
    "    });\n",
    "  }\n",
    "\n",
    "  function clearFeedback(grader) {\n",
    "    var list = grader.querySelector('.ch07-lab-feedback-list');\n",
    "    list.hidden = true;\n",
    "    grader.querySelectorAll('.ch07-lab-feedback-row').forEach(function (row) {\n",
    "      row.className = 'ch07-lab-feedback-row';\n",
    "      var message = row.querySelector('span');\n",
    "      if (message) message.textContent = '';\n",
    "    });\n",
    "  }\n",
    "\n",
    "  function saveAttempt(payload) {\n",
    "    return fetch('/api/v1/lab-attempts.php', {\n",
    "      method: 'POST',\n",
    "      headers: { 'Content-Type': 'application/json' },\n",
    "      credentials: 'same-origin',\n",
    "      body: JSON.stringify(payload)\n",
    "    }).then(function (response) {\n",
    "      return response.text().then(function (text) {\n",
    "        var payload = text ? JSON.parse(text) : null;\n",
    "        if (!payload || !response.ok || !payload.ok) {\n",
    "          throw new Error((payload && (payload.message || payload.error)) || 'Submission API is unavailable.');\n",
    "        }\n",
    "        return payload;\n",
    "      });\n",
    "    });\n",
    "  }\n",
    "\n",
    "  function initLabGrader() {\n",
    "    var grader = document.getElementById('ch07-lab-grader');\n",
    "    if (!grader || grader.dataset.ready === 'true') return;\n",
    "    grader.dataset.ready = 'true';\n",
    "\n",
    "    var identity = getParams();\n",
    "    var actions = grader.querySelector('.ch07-lab-actions');\n",
    "    var result = document.getElementById('ch07-lab-result');\n",
    "    var submit = document.getElementById('ch07-lab-submit');\n",
    "    var reset = document.getElementById('ch07-lab-reset');\n",
    "\n",
    "    loadSessionIdentity(identity, actions, submit, result);\n",
    "\n",
    "    submit.addEventListener('click', function () {\n",
    "      clearFeedback(grader);\n",
    "      submit.disabled = true;\n",
    "      result.textContent = 'Submitting code.';\n",
    "\n",
    "      saveAttempt({\n",
    "        lab_id: labId,\n",
    "        code: collectCodeCells(),\n",
    "        canvas_course_id: identity.canvas_course_id,\n",
    "        canvas_assignment_id: identity.canvas_assignment_id,\n",
    "        canvas_user_id: identity.canvas_user_id\n",
    "      })\n",
    "        .then(function (payload) {\n",
    "          var best = (payload.best_score === null || typeof payload.best_score === 'undefined') ? payload.score : payload.best_score;\n",
    "          var attempt = (payload.attempt_count === null || typeof payload.attempt_count === 'undefined') ? '' : ' Attempt ' + payload.attempt_count + '.';\n",
    "          applyFeedback(grader, payload.feedback || {});\n",
    "          result.textContent = 'Submission saved.' + attempt + ' Score: ' + payload.score + ' / ' + payload.max_score + '. Best score: ' + best + ' / ' + payload.max_score + '. Canvas sync: ' + payload.canvas_sync_status + '.';\n",
    "        })\n",
    "        .catch(function (error) {\n",
    "          result.textContent = 'Could not save this attempt: ' + error.message;\n",
    "        })\n",
    "        .finally(function () {\n",
    "          submit.disabled = false;\n",
    "        });\n",
    "    });\n",
    "\n",
    "    reset.addEventListener('click', function () {\n",
    "      clearFeedback(grader);\n",
    "      result.textContent = '';\n",
    "    });\n",
    "  }\n",
    "\n",
    "  if (document.readyState === 'loading') {\n",
    "    document.addEventListener('DOMContentLoaded', initLabGrader);\n",
    "  } else {\n",
    "    initLabGrader();\n",
    "  }\n",
    "})();\n",
    "</script>\n"
   ]
  }
 ],
 "metadata": {
  "jupytext": {
   "cell_metadata_filter": "-all",
   "main_language": "python",
   "notebook_metadata_filter": "-all"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
